123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- <?php
- /**
- * HTML helper class. Provides generic methods for generating various HTML
- * tags and making output HTML safe.
- *
- * @package Kohana
- * @category Helpers
- * @author Kohana Team
- * @copyright (c) Kohana Team
- * @license https://koseven.ga/LICENSE.md
- */
- class Kohana_HTML {
- /**
- * @var array preferred order of attributes
- */
- public static $attribute_order = [
- 'action',
- 'method',
- 'type',
- 'id',
- 'name',
- 'value',
- 'href',
- 'src',
- 'width',
- 'height',
- 'cols',
- 'rows',
- 'size',
- 'maxlength',
- 'rel',
- 'media',
- 'accept-charset',
- 'accept',
- 'tabindex',
- 'accesskey',
- 'alt',
- 'title',
- 'class',
- 'style',
- 'selected',
- 'checked',
- 'readonly',
- 'disabled',
- ];
- /**
- * @var boolean use strict XHTML mode?
- */
- public static $strict = TRUE;
- /**
- * @var boolean automatically target external URLs to a new window?
- */
- public static $windowed_urls = FALSE;
- /**
- * Convert special characters to HTML entities. All untrusted content
- * should be passed through this method to prevent XSS injections.
- *
- * echo HTML::chars($username);
- *
- * @param string $value string to convert
- * @param boolean $double_encode encode existing entities
- * @return string
- */
- public static function chars($value, $double_encode = TRUE)
- {
- return htmlspecialchars( (string) $value, ENT_QUOTES, Kohana::$charset, $double_encode);
- }
- /**
- * Convert all applicable characters to HTML entities. All characters
- * that cannot be represented in HTML with the current character set
- * will be converted to entities.
- *
- * echo HTML::entities($username);
- *
- * @param string $value string to convert
- * @param boolean $double_encode encode existing entities
- * @return string
- */
- public static function entities($value, $double_encode = TRUE)
- {
- return htmlentities( (string) $value, ENT_QUOTES, Kohana::$charset, $double_encode);
- }
- /**
- * Create HTML link anchors. Note that the title is not escaped, to allow
- * HTML elements within links (images, etc).
- *
- * echo HTML::anchor('/user/profile', 'My Profile');
- *
- * @param string $uri URL or URI string
- * @param string $title link text
- * @param array $attributes HTML anchor attributes
- * @param mixed $protocol protocol to pass to URL::base()
- * @param boolean $index include the index page
- * @return string
- * @uses URL::base
- * @uses URL::site
- * @uses HTML::attributes
- */
- public static function anchor($uri, $title = NULL, array $attributes = NULL, $protocol = NULL, $index = TRUE)
- {
- if ($title === NULL)
- {
- // Use the URI as the title
- $title = $uri;
- }
- if ($uri === '')
- {
- // Only use the base URL
- $uri = URL::base($protocol, $index);
- }
- else
- {
- if (strpos($uri, '://') !== FALSE OR strncmp($uri, '//', 2) == 0)
- {
- if (HTML::$windowed_urls === TRUE AND empty($attributes['target']))
- {
- // Make the link open in a new window
- $attributes['target'] = '_blank';
- }
- }
- elseif ($uri[0] !== '#' AND $uri[0] !== '?')
- {
- // Make the URI absolute for non-fragment and non-query anchors
- $uri = URL::site($uri, $protocol, $index);
- }
- }
- // Add the sanitized link to the attributes
- $attributes['href'] = $uri;
- return '<a'.HTML::attributes($attributes).'>'.$title.'</a>';
- }
- /**
- * Creates an HTML anchor to a file. Note that the title is not escaped,
- * to allow HTML elements within links (images, etc).
- *
- * echo HTML::file_anchor('media/doc/user_guide.pdf', 'User Guide');
- *
- * @param string $file name of file to link to
- * @param string $title link text
- * @param array $attributes HTML anchor attributes
- * @param mixed $protocol protocol to pass to URL::base()
- * @param boolean $index include the index page
- * @return string
- * @uses URL::base
- * @uses HTML::attributes
- */
- public static function file_anchor($file, $title = NULL, array $attributes = NULL, $protocol = NULL, $index = FALSE)
- {
- if ($title === NULL)
- {
- // Use the file name as the title
- $title = basename($file);
- }
- // Add the file link to the attributes
- $attributes['href'] = URL::site($file, $protocol, $index);
- return '<a'.HTML::attributes($attributes).'>'.$title.'</a>';
- }
- /**
- * Creates an email (mailto:) anchor. Note that the title is not escaped,
- * to allow HTML elements within links (images, etc).
- *
- * echo HTML::mailto($address);
- *
- * @param string $email email address to send to
- * @param string $title link text
- * @param array $attributes HTML anchor attributes
- * @return string
- * @uses HTML::attributes
- */
- public static function mailto($email, $title = NULL, array $attributes = NULL)
- {
- if ($title === NULL)
- {
- // Use the email address as the title
- $title = $email;
- }
- return '<a href="mailto:'.$email.'"'.HTML::attributes($attributes).'>'.$title.'</a>';
- }
- /**
- * Creates a style sheet link element.
- *
- * echo HTML::style('media/css/screen.css');
- *
- * @param string $file file name
- * @param array $attributes default attributes
- * @param mixed $protocol protocol to pass to URL::base()
- * @param boolean $index include the index page
- * @return string
- * @uses URL::base
- * @uses HTML::attributes
- */
- public static function style($file, array $attributes = NULL, $protocol = NULL, $index = FALSE)
- {
- if (strpos($file, '://') === FALSE AND strncmp($file, '//', 2))
- {
- // Add the base URL
- $file = URL::site($file, $protocol, $index);
- }
- // Set the stylesheet link
- $attributes['href'] = $file;
- // Set the stylesheet rel
- $attributes['rel'] = empty($attributes['rel']) ? 'stylesheet' : $attributes['rel'];
- // Set the stylesheet type
- $attributes['type'] = 'text/css';
- return '<link'.HTML::attributes($attributes).' />';
- }
- /**
- * Creates a script link.
- *
- * echo HTML::script('media/js/jquery.min.js');
- *
- * @param string $file file name
- * @param array $attributes default attributes
- * @param mixed $protocol protocol to pass to URL::base()
- * @param boolean $index include the index page
- * @return string
- * @uses URL::base
- * @uses HTML::attributes
- */
- public static function script($file, array $attributes = NULL, $protocol = NULL, $index = FALSE)
- {
- if (strpos($file, '://') === FALSE AND strncmp($file, '//', 2))
- {
- // Add the base URL
- $file = URL::site($file, $protocol, $index);
- }
- // Set the script link
- $attributes['src'] = $file;
- // Set the script type
- $attributes['type'] = 'text/javascript';
- return '<script'.HTML::attributes($attributes).'></script>';
- }
- /**
- * Creates a image link.
- *
- * echo HTML::image('media/img/logo.png', array('alt' => 'My Company'));
- *
- * @param string $file file name
- * @param array $attributes default attributes
- * @param mixed $protocol protocol to pass to URL::base()
- * @param boolean $index include the index page
- * @return string
- * @uses URL::base
- * @uses HTML::attributes
- */
- public static function image($file, array $attributes = NULL, $protocol = NULL, $index = FALSE)
- {
- if (strpos($file, '://') === FALSE AND strncmp($file, '//', 2) AND strncmp($file, 'data:', 5))
- {
- // Add the base URL
- $file = URL::site($file, $protocol, $index);
- }
- // Add the image link
- $attributes['src'] = $file;
- return '<img'.HTML::attributes($attributes).' />';
- }
- /**
- * Compiles an array of HTML attributes into an attribute string.
- * Attributes will be sorted using HTML::$attribute_order for consistency.
- *
- * echo '<div'.HTML::attributes($attrs).'>'.$content.'</div>';
- *
- * @param array $attributes attribute list
- * @return string
- */
- public static function attributes(array $attributes = NULL)
- {
- if (empty($attributes))
- return '';
- $sorted = [];
- foreach (HTML::$attribute_order as $key)
- {
- if (isset($attributes[$key]))
- {
- // Add the attribute to the sorted list
- $sorted[$key] = $attributes[$key];
- }
- }
- // Combine the sorted attributes
- $attributes = $sorted + $attributes;
- $compiled = '';
- foreach ($attributes as $key => $value)
- {
- if ($value === NULL)
- {
- // Skip attributes that have NULL values
- continue;
- }
- if (is_int($key))
- {
- // Assume non-associative keys are mirrored attributes
- $key = $value;
- if ( ! HTML::$strict)
- {
- // Just use a key
- $value = FALSE;
- }
- }
- // Add the attribute key
- $compiled .= ' '.$key;
- if ($value OR HTML::$strict)
- {
- // Add the attribute value
- $compiled .= '="'.HTML::chars($value).'"';
- }
- }
- return $compiled;
- }
- }
|