256 lines
12 KiB
PHP
256 lines
12 KiB
PHP
|
<?php
|
||
|
|
||
|
/**
|
||
|
* Html
|
||
|
*
|
||
|
* Html builder for the most common elements
|
||
|
*
|
||
|
* @package Kirby Toolkit
|
||
|
* @author Bastian Allgeier <bastian@getkirby.com>
|
||
|
* @link http://getkirby.com
|
||
|
* @copyright Bastian Allgeier
|
||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||
|
*/
|
||
|
class Html {
|
||
|
|
||
|
/**
|
||
|
* An internal store for a html entities translation table
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static $entities = array(
|
||
|
' ' => ' ', '¡' => '¡', '¢' => '¢', '£' => '£', '¤' => '¤', '¥' => '¥', '¦' => '¦', '§' => '§',
|
||
|
'¨' => '¨', '©' => '©', 'ª' => 'ª', '«' => '«', '¬' => '¬', '­' => '­', '®' => '®', '¯' => '¯',
|
||
|
'°' => '°', '±' => '±', '²' => '²', '³' => '³', '´' => '´', 'µ' => 'µ', '¶' => '¶', '·' => '·',
|
||
|
'¸' => '¸', '¹' => '¹', 'º' => 'º', '»' => '»', '¼' => '¼', '½' => '½', '¾' => '¾', '¿' => '¿',
|
||
|
'À' => 'À', 'Á' => 'Á', 'Â' => 'Â', 'Ã' => 'Ã', 'Ä' => 'Ä', 'Å' => 'Å', 'Æ' => 'Æ', 'Ç' => 'Ç',
|
||
|
'È' => 'È', 'É' => 'É', 'Ê' => 'Ê', 'Ë' => 'Ë', 'Ì' => 'Ì', 'Í' => 'Í', 'Î' => 'Î', 'Ï' => 'Ï',
|
||
|
'Ð' => 'Ð', 'Ñ' => 'Ñ', 'Ò' => 'Ò', 'Ó' => 'Ó', 'Ô' => 'Ô', 'Õ' => 'Õ', 'Ö' => 'Ö', '×' => '×',
|
||
|
'Ø' => 'Ø', 'Ù' => 'Ù', 'Ú' => 'Ú', 'Û' => 'Û', 'Ü' => 'Ü', 'Ý' => 'Ý', 'Þ' => 'Þ', 'ß' => 'ß',
|
||
|
'à' => 'à', 'á' => 'á', 'â' => 'â', 'ã' => 'ã', 'ä' => 'ä', 'å' => 'å', 'æ' => 'æ', 'ç' => 'ç',
|
||
|
'è' => 'è', 'é' => 'é', 'ê' => 'ê', 'ë' => 'ë', 'ì' => 'ì', 'í' => 'í', 'î' => 'î', 'ï' => 'ï',
|
||
|
'ð' => 'ð', 'ñ' => 'ñ', 'ò' => 'ò', 'ó' => 'ó', 'ô' => 'ô', 'õ' => 'õ', 'ö' => 'ö', '÷' => '÷',
|
||
|
'ø' => 'ø', 'ù' => 'ù', 'ú' => 'ú', 'û' => 'û', 'ü' => 'ü', 'ý' => 'ý', 'þ' => 'þ', 'ÿ' => 'ÿ',
|
||
|
'ƒ' => 'ƒ', 'Α' => 'Α', 'Β' => 'Β', 'Γ' => 'Γ', 'Δ' => 'Δ', 'Ε' => 'Ε', 'Ζ' => 'Ζ', 'Η' => 'Η',
|
||
|
'Θ' => 'Θ', 'Ι' => 'Ι', 'Κ' => 'Κ', 'Λ' => 'Λ', 'Μ' => 'Μ', 'Ν' => 'Ν', 'Ξ' => 'Ξ', 'Ο' => 'Ο',
|
||
|
'Π' => 'Π', 'Ρ' => 'Ρ', 'Σ' => 'Σ', 'Τ' => 'Τ', 'Υ' => 'Υ', 'Φ' => 'Φ', 'Χ' => 'Χ', 'Ψ' => 'Ψ',
|
||
|
'Ω' => 'Ω', 'α' => 'α', 'β' => 'β', 'γ' => 'γ', 'δ' => 'δ', 'ε' => 'ε', 'ζ' => 'ζ', 'η' => 'η',
|
||
|
'θ' => 'θ', 'ι' => 'ι', 'κ' => 'κ', 'λ' => 'λ', 'μ' => 'μ', 'ν' => 'ν', 'ξ' => 'ξ', 'ο' => 'ο',
|
||
|
'π' => 'π', 'ρ' => 'ρ', 'ς' => 'ς', 'σ' => 'σ', 'τ' => 'τ', 'υ' => 'υ', 'φ' => 'φ', 'χ' => 'χ',
|
||
|
'ψ' => 'ψ', 'ω' => 'ω', 'ϑ' => 'ϑ', 'ϒ' => 'ϒ', 'ϖ' => 'ϖ', '•' => '•', '…' => '…', '′' => '′',
|
||
|
'″' => '″', '‾' => '‾', '⁄' => '⁄', '℘' => '℘', 'ℑ' => 'ℑ', 'ℜ' => 'ℜ', '™' => '™', 'ℵ' => 'ℵ',
|
||
|
'←' => '←', '↑' => '↑', '→' => '→', '↓' => '↓', '↔' => '↔', '↵' => '↵', '⇐' => '⇐', '⇑' => '⇑',
|
||
|
'⇒' => '⇒', '⇓' => '⇓', '⇔' => '⇔', '∀' => '∀', '∂' => '∂', '∃' => '∃', '∅' => '∅', '∇' => '∇',
|
||
|
'∈' => '∈', '∉' => '∉', '∋' => '∋', '∏' => '∏', '∑' => '∑', '−' => '−', '∗' => '∗', '√' => '√',
|
||
|
'∝' => '∝', '∞' => '∞', '∠' => '∠', '∧' => '∧', '∨' => '∨', '∩' => '∩', '∪' => '∪', '∫' => '∫',
|
||
|
'∴' => '∴', '∼' => '∼', '≅' => '≅', '≈' => '≈', '≠' => '≠', '≡' => '≡', '≤' => '≤', '≥' => '≥',
|
||
|
'⊂' => '⊂', '⊃' => '⊃', '⊄' => '⊄', '⊆' => '⊆', '⊇' => '⊇', '⊕' => '⊕', '⊗' => '⊗', '⊥' => '⊥',
|
||
|
'⋅' => '⋅', '⌈' => '⌈', '⌉' => '⌉', '⌊' => '⌊', '⌋' => '⌋', '⟨' => '〈', '⟩' => '〉', '◊' => '◊',
|
||
|
'♠' => '♠', '♣' => '♣', '♥' => '♥', '♦' => '♦', '"' => '"', '&' => '&', '<' => '<', '>' => '>', 'Œ' => 'Œ',
|
||
|
'œ' => 'œ', 'Š' => 'Š', 'š' => 'š', 'Ÿ' => 'Ÿ', 'ˆ' => 'ˆ', '˜' => '˜', ' ' => ' ', ' ' => ' ',
|
||
|
' ' => ' ', '‌' => '‌', '‍' => '‍', '‎' => '‎', '‏' => '‏', '–' => '–', '—' => '—', '‘' => '‘',
|
||
|
'’' => '’', '‚' => '‚', '“' => '“', '”' => '”', '„' => '„', '†' => '†', '‡' => '‡', '‰' => '‰',
|
||
|
'‹' => '‹', '›' => '›', '€' => '€'
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
* Checks if a tag is self-closing
|
||
|
*
|
||
|
* @param string $tag
|
||
|
* @return param
|
||
|
*/
|
||
|
public static function isVoid($tag) {
|
||
|
|
||
|
$void = array(
|
||
|
'area',
|
||
|
'base',
|
||
|
'br',
|
||
|
'col',
|
||
|
'command',
|
||
|
'embed',
|
||
|
'hr',
|
||
|
'img',
|
||
|
'input',
|
||
|
'keygen',
|
||
|
'link',
|
||
|
'meta',
|
||
|
'param',
|
||
|
'source',
|
||
|
'track',
|
||
|
'wbr',
|
||
|
);
|
||
|
|
||
|
return in_array(strtolower($tag), $void);
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the full array with all HTML entities
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function entities() {
|
||
|
return static::$entities;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts a string to a html-safe string
|
||
|
*
|
||
|
* @param string $string
|
||
|
* @param boolean $keepTags True: lets stuff inside html tags untouched.
|
||
|
* @return string The html string
|
||
|
*/
|
||
|
public static function encode($string, $keepTags = true) {
|
||
|
if($keepTags) {
|
||
|
return stripslashes(implode('', preg_replace_callback('/^([^<].+[^>])$/', function($match) {
|
||
|
return htmlentities($match[1], ENT_COMPAT, 'utf-8');
|
||
|
}, preg_split('/(<.+?>)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE))));
|
||
|
} else {
|
||
|
return htmlentities($string, ENT_COMPAT, 'utf-8');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes all html tags and encoded chars from a string
|
||
|
*
|
||
|
* <code>
|
||
|
*
|
||
|
* echo html::decode('some <em>crazy</em> stuff');
|
||
|
* // output: some uber crazy stuff
|
||
|
*
|
||
|
* </code>
|
||
|
*
|
||
|
* @param string $string
|
||
|
* @return string The html string
|
||
|
*/
|
||
|
public static function decode($string) {
|
||
|
$string = strip_tags($string);
|
||
|
return html_entity_decode($string, ENT_COMPAT, 'utf-8');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts lines in a string into html breaks
|
||
|
*
|
||
|
* @param string $string
|
||
|
* @return string
|
||
|
*/
|
||
|
public static function breaks($string) {
|
||
|
return nl2br($string);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Generates an Html tag with optional content and attributes
|
||
|
*
|
||
|
* @param string $name The name of the tag, i.e. "a"
|
||
|
* @param mixed $content The content if availble. Pass null to generate a self-closing tag, Pass an empty string to generate empty content
|
||
|
* @param array $attr An associative array with additional attributes for the tag
|
||
|
* @return string The generated Html
|
||
|
*/
|
||
|
public static function tag($name, $content = null, $attr = array()) {
|
||
|
|
||
|
if(is_array($content)) {
|
||
|
$attr = $content;
|
||
|
$content = null;
|
||
|
}
|
||
|
|
||
|
$html = '<' . $name;
|
||
|
$attr = static::attr($attr);
|
||
|
|
||
|
if(!empty($attr)) $html .= ' ' . $attr;
|
||
|
|
||
|
if(static::isVoid($name)) {
|
||
|
$html .= '>';
|
||
|
} else {
|
||
|
$html .= '>' . $content . '</' . $name . '>';
|
||
|
}
|
||
|
|
||
|
return $html;
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Generates a single attribute or a list of attributes
|
||
|
*
|
||
|
* @param string $name mixed string: a single attribute with that name will be generated. array: a list of attributes will be generated. Don't pass a second argument in that case.
|
||
|
* @param string $value if used for a single attribute, pass the content for the attribute here
|
||
|
* @return string the generated html
|
||
|
*/
|
||
|
public static function attr($name, $value = null) {
|
||
|
if(is_array($name)) {
|
||
|
$attributes = array();
|
||
|
foreach($name as $key => $val) {
|
||
|
$a = static::attr($key, $val);
|
||
|
if($a) $attributes[] = $a;
|
||
|
}
|
||
|
return implode(' ', $attributes);
|
||
|
}
|
||
|
|
||
|
if(empty($value) && $value !== '0' && $value !== 0) {
|
||
|
return false;
|
||
|
} else if($value === ' ') {
|
||
|
return strtolower($name) . '=""';
|
||
|
} else if(is_bool($value)) {
|
||
|
return $value === true ? strtolower($name) : '';
|
||
|
} else {
|
||
|
return strtolower($name) . '="' . ( is_array($value) ? implode(' ', $value) : $value ) . '"';
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Generates an a tag
|
||
|
*
|
||
|
* @param string $href The url for the a tag
|
||
|
* @param mixed $text The optional text. If null, the url will be used as text
|
||
|
* @param array $attr Additional attributes for the tag
|
||
|
* @return string the generated html
|
||
|
*/
|
||
|
public static function a($href, $text = null, $attr = array()) {
|
||
|
$attr = array_merge(array('href' => $href), $attr);
|
||
|
if(empty($text)) $text = $href;
|
||
|
return static::tag('a', $text, $attr);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Generates an "a mailto" tag
|
||
|
*
|
||
|
* @param string $email The url for the a tag
|
||
|
* @param mixed $text The optional text. If null, the url will be used as text
|
||
|
* @param array $attr Additional attributes for the tag
|
||
|
* @return string the generated html
|
||
|
*/
|
||
|
public static function email($email, $text = null, $attr = array()) {
|
||
|
if(empty($text)) {
|
||
|
// show only the eMail address without additional parameters (if the 'text' argument is empty)
|
||
|
$text = str::encode(a::first(str::split($email, '?')));
|
||
|
}
|
||
|
$email = str::encode($email);
|
||
|
$attr = array_merge(array('href' => 'mailto:' . $email), $attr);
|
||
|
return static::tag('a', $text, $attr);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Generates an img tag
|
||
|
*
|
||
|
* @param string $src The url of the image
|
||
|
* @param array $attr Additional attributes for the image tag
|
||
|
* @return string the generated html
|
||
|
*/
|
||
|
public static function img($src, $attr = array()) {
|
||
|
$attr = array_merge(array('src' => $src, 'alt' => pathinfo($src, PATHINFO_FILENAME)), $attr);
|
||
|
return static::tag('img', null, $attr);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Generates a HTML5 shiv script tag with additional comments for older IEs
|
||
|
*
|
||
|
* @return string the generated html
|
||
|
*/
|
||
|
public static function shiv() {
|
||
|
return '<!--[if lt IE 9]>' . PHP_EOL .
|
||
|
'<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>' . PHP_EOL .
|
||
|
'<![endif]-->' . PHP_EOL;
|
||
|
}
|
||
|
|
||
|
}
|