<?php
/**
 * Class AMP_HTML_Utils
 *
 * @package AMP
 */

/**
 * Class with static HTML utility methods.
 */
class AMP_HTML_Utils {

	/**
	 * Generates HTML markup for a given tag, attributes and content.
	 *
	 * @param string $tag_name   Tag name.
	 * @param array  $attributes Associative array of $attribute => $value pairs.
	 * @param string $content    Inner content for the generated node.
	 * @return string HTML markup.
	 */
	public static function build_tag( $tag_name, $attributes = array(), $content = '' ) {
		$attr_string = self::build_attributes_string( $attributes );
		return sprintf( '<%1$s %2$s>%3$s</%1$s>', sanitize_key( $tag_name ), $attr_string, $content );
	}

	/**
	 * Generates a HTML attributes string from given attributes.
	 *
	 * @param array $attributes Associative array of $attribute => $value pairs.
	 * @return string HTML attributes string.
	 */
	public static function build_attributes_string( $attributes ) {
		$string = array();
		foreach ( $attributes as $name => $value ) {
			if ( '' === $value ) {
				$string[] = sprintf( '%s', sanitize_key( $name ) );
			} else {
				$string[] = sprintf( '%s="%s"', sanitize_key( $name ), esc_attr( $value ) );
			}
		}
		return implode( ' ', $string );
	}

	/**
	 * Checks whether the given string is valid JSON.
	 *
	 * @param string $data String hopefully containing JSON.
	 * @return bool True if the string is valid JSON, false otherwise.
	 */
	public static function is_valid_json( $data ) {
		if ( ! empty( $data ) ) {
			$decoded = json_decode( $data );
			if ( function_exists( 'json_last_error' ) ) {
				return ( json_last_error() === JSON_ERROR_NONE );
			} else {
				// For PHP 5.2 back-compatibility.
				return null !== $decoded;
			}
		}
		return false;
	}
}