htmlpurifier 4.15.0 버전으로 수정
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@ -1,15 +1,15 @@
|
||||
AutoFormat.RemoveEmpty.RemoveNbsp
|
||||
TYPE: bool
|
||||
VERSION: 4.0.0
|
||||
DEFAULT: false
|
||||
--DESCRIPTION--
|
||||
<p>
|
||||
When enabled, HTML Purifier will treat any elements that contain only
|
||||
non-breaking spaces as well as regular whitespace as empty, and remove
|
||||
them when %AutoFormat.RemoveEmpty is enabled.
|
||||
</p>
|
||||
<p>
|
||||
See %AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions for a list of elements
|
||||
that don't have this behavior applied to them.
|
||||
</p>
|
||||
--# vim: et sw=4 sts=4
|
||||
AutoFormat.RemoveEmpty.RemoveNbsp
|
||||
TYPE: bool
|
||||
VERSION: 4.0.0
|
||||
DEFAULT: false
|
||||
--DESCRIPTION--
|
||||
<p>
|
||||
When enabled, HTML Purifier will treat any elements that contain only
|
||||
non-breaking spaces as well as regular whitespace as empty, and remove
|
||||
them when %AutoFormat.RemoveEmpty is enabled.
|
||||
</p>
|
||||
<p>
|
||||
See %AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions for a list of elements
|
||||
that don't have this behavior applied to them.
|
||||
</p>
|
||||
--# vim: et sw=4 sts=4
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
Core.AllowParseManyTags
|
||||
TYPE: bool
|
||||
DEFAULT: false
|
||||
VERSION: 4.10.1
|
||||
--DESCRIPTION--
|
||||
<p>
|
||||
This directive allows parsing of many nested tags.
|
||||
If you set true, relaxes any hardcoded limit from the parser.
|
||||
However, in that case it may cause a Dos attack.
|
||||
Be careful when enabling it.
|
||||
</p>
|
||||
--# vim: et sw=4 sts=4
|
||||
Core.AllowParseManyTags
|
||||
TYPE: bool
|
||||
DEFAULT: false
|
||||
VERSION: 4.10.1
|
||||
--DESCRIPTION--
|
||||
<p>
|
||||
This directive allows parsing of many nested tags.
|
||||
If you set true, relaxes any hardcoded limit from the parser.
|
||||
However, in that case it may cause a Dos attack.
|
||||
Be careful when enabling it.
|
||||
</p>
|
||||
--# vim: et sw=4 sts=4
|
||||
|
||||
@ -1,160 +1,160 @@
|
||||
Core.ColorKeywords
|
||||
TYPE: hash
|
||||
VERSION: 2.0.0
|
||||
--DEFAULT--
|
||||
array (
|
||||
'aliceblue' => '#F0F8FF',
|
||||
'antiquewhite' => '#FAEBD7',
|
||||
'aqua' => '#00FFFF',
|
||||
'aquamarine' => '#7FFFD4',
|
||||
'azure' => '#F0FFFF',
|
||||
'beige' => '#F5F5DC',
|
||||
'bisque' => '#FFE4C4',
|
||||
'black' => '#000000',
|
||||
'blanchedalmond' => '#FFEBCD',
|
||||
'blue' => '#0000FF',
|
||||
'blueviolet' => '#8A2BE2',
|
||||
'brown' => '#A52A2A',
|
||||
'burlywood' => '#DEB887',
|
||||
'cadetblue' => '#5F9EA0',
|
||||
'chartreuse' => '#7FFF00',
|
||||
'chocolate' => '#D2691E',
|
||||
'coral' => '#FF7F50',
|
||||
'cornflowerblue' => '#6495ED',
|
||||
'cornsilk' => '#FFF8DC',
|
||||
'crimson' => '#DC143C',
|
||||
'cyan' => '#00FFFF',
|
||||
'darkblue' => '#00008B',
|
||||
'darkcyan' => '#008B8B',
|
||||
'darkgoldenrod' => '#B8860B',
|
||||
'darkgray' => '#A9A9A9',
|
||||
'darkgrey' => '#A9A9A9',
|
||||
'darkgreen' => '#006400',
|
||||
'darkkhaki' => '#BDB76B',
|
||||
'darkmagenta' => '#8B008B',
|
||||
'darkolivegreen' => '#556B2F',
|
||||
'darkorange' => '#FF8C00',
|
||||
'darkorchid' => '#9932CC',
|
||||
'darkred' => '#8B0000',
|
||||
'darksalmon' => '#E9967A',
|
||||
'darkseagreen' => '#8FBC8F',
|
||||
'darkslateblue' => '#483D8B',
|
||||
'darkslategray' => '#2F4F4F',
|
||||
'darkslategrey' => '#2F4F4F',
|
||||
'darkturquoise' => '#00CED1',
|
||||
'darkviolet' => '#9400D3',
|
||||
'deeppink' => '#FF1493',
|
||||
'deepskyblue' => '#00BFFF',
|
||||
'dimgray' => '#696969',
|
||||
'dimgrey' => '#696969',
|
||||
'dodgerblue' => '#1E90FF',
|
||||
'firebrick' => '#B22222',
|
||||
'floralwhite' => '#FFFAF0',
|
||||
'forestgreen' => '#228B22',
|
||||
'fuchsia' => '#FF00FF',
|
||||
'gainsboro' => '#DCDCDC',
|
||||
'ghostwhite' => '#F8F8FF',
|
||||
'gold' => '#FFD700',
|
||||
'goldenrod' => '#DAA520',
|
||||
'gray' => '#808080',
|
||||
'grey' => '#808080',
|
||||
'green' => '#008000',
|
||||
'greenyellow' => '#ADFF2F',
|
||||
'honeydew' => '#F0FFF0',
|
||||
'hotpink' => '#FF69B4',
|
||||
'indianred' => '#CD5C5C',
|
||||
'indigo' => '#4B0082',
|
||||
'ivory' => '#FFFFF0',
|
||||
'khaki' => '#F0E68C',
|
||||
'lavender' => '#E6E6FA',
|
||||
'lavenderblush' => '#FFF0F5',
|
||||
'lawngreen' => '#7CFC00',
|
||||
'lemonchiffon' => '#FFFACD',
|
||||
'lightblue' => '#ADD8E6',
|
||||
'lightcoral' => '#F08080',
|
||||
'lightcyan' => '#E0FFFF',
|
||||
'lightgoldenrodyellow' => '#FAFAD2',
|
||||
'lightgray' => '#D3D3D3',
|
||||
'lightgrey' => '#D3D3D3',
|
||||
'lightgreen' => '#90EE90',
|
||||
'lightpink' => '#FFB6C1',
|
||||
'lightsalmon' => '#FFA07A',
|
||||
'lightseagreen' => '#20B2AA',
|
||||
'lightskyblue' => '#87CEFA',
|
||||
'lightslategray' => '#778899',
|
||||
'lightslategrey' => '#778899',
|
||||
'lightsteelblue' => '#B0C4DE',
|
||||
'lightyellow' => '#FFFFE0',
|
||||
'lime' => '#00FF00',
|
||||
'limegreen' => '#32CD32',
|
||||
'linen' => '#FAF0E6',
|
||||
'magenta' => '#FF00FF',
|
||||
'maroon' => '#800000',
|
||||
'mediumaquamarine' => '#66CDAA',
|
||||
'mediumblue' => '#0000CD',
|
||||
'mediumorchid' => '#BA55D3',
|
||||
'mediumpurple' => '#9370DB',
|
||||
'mediumseagreen' => '#3CB371',
|
||||
'mediumslateblue' => '#7B68EE',
|
||||
'mediumspringgreen' => '#00FA9A',
|
||||
'mediumturquoise' => '#48D1CC',
|
||||
'mediumvioletred' => '#C71585',
|
||||
'midnightblue' => '#191970',
|
||||
'mintcream' => '#F5FFFA',
|
||||
'mistyrose' => '#FFE4E1',
|
||||
'moccasin' => '#FFE4B5',
|
||||
'navajowhite' => '#FFDEAD',
|
||||
'navy' => '#000080',
|
||||
'oldlace' => '#FDF5E6',
|
||||
'olive' => '#808000',
|
||||
'olivedrab' => '#6B8E23',
|
||||
'orange' => '#FFA500',
|
||||
'orangered' => '#FF4500',
|
||||
'orchid' => '#DA70D6',
|
||||
'palegoldenrod' => '#EEE8AA',
|
||||
'palegreen' => '#98FB98',
|
||||
'paleturquoise' => '#AFEEEE',
|
||||
'palevioletred' => '#DB7093',
|
||||
'papayawhip' => '#FFEFD5',
|
||||
'peachpuff' => '#FFDAB9',
|
||||
'peru' => '#CD853F',
|
||||
'pink' => '#FFC0CB',
|
||||
'plum' => '#DDA0DD',
|
||||
'powderblue' => '#B0E0E6',
|
||||
'purple' => '#800080',
|
||||
'rebeccapurple' => '#663399',
|
||||
'red' => '#FF0000',
|
||||
'rosybrown' => '#BC8F8F',
|
||||
'royalblue' => '#4169E1',
|
||||
'saddlebrown' => '#8B4513',
|
||||
'salmon' => '#FA8072',
|
||||
'sandybrown' => '#F4A460',
|
||||
'seagreen' => '#2E8B57',
|
||||
'seashell' => '#FFF5EE',
|
||||
'sienna' => '#A0522D',
|
||||
'silver' => '#C0C0C0',
|
||||
'skyblue' => '#87CEEB',
|
||||
'slateblue' => '#6A5ACD',
|
||||
'slategray' => '#708090',
|
||||
'slategrey' => '#708090',
|
||||
'snow' => '#FFFAFA',
|
||||
'springgreen' => '#00FF7F',
|
||||
'steelblue' => '#4682B4',
|
||||
'tan' => '#D2B48C',
|
||||
'teal' => '#008080',
|
||||
'thistle' => '#D8BFD8',
|
||||
'tomato' => '#FF6347',
|
||||
'turquoise' => '#40E0D0',
|
||||
'violet' => '#EE82EE',
|
||||
'wheat' => '#F5DEB3',
|
||||
'white' => '#FFFFFF',
|
||||
'whitesmoke' => '#F5F5F5',
|
||||
'yellow' => '#FFFF00',
|
||||
'yellowgreen' => '#9ACD32'
|
||||
)
|
||||
--DESCRIPTION--
|
||||
|
||||
Lookup array of color names to six digit hexadecimal number corresponding
|
||||
to color, with preceding hash mark. Used when parsing colors. The lookup
|
||||
is done in a case-insensitive manner.
|
||||
--# vim: et sw=4 sts=4
|
||||
Core.ColorKeywords
|
||||
TYPE: hash
|
||||
VERSION: 2.0.0
|
||||
--DEFAULT--
|
||||
array (
|
||||
'aliceblue' => '#F0F8FF',
|
||||
'antiquewhite' => '#FAEBD7',
|
||||
'aqua' => '#00FFFF',
|
||||
'aquamarine' => '#7FFFD4',
|
||||
'azure' => '#F0FFFF',
|
||||
'beige' => '#F5F5DC',
|
||||
'bisque' => '#FFE4C4',
|
||||
'black' => '#000000',
|
||||
'blanchedalmond' => '#FFEBCD',
|
||||
'blue' => '#0000FF',
|
||||
'blueviolet' => '#8A2BE2',
|
||||
'brown' => '#A52A2A',
|
||||
'burlywood' => '#DEB887',
|
||||
'cadetblue' => '#5F9EA0',
|
||||
'chartreuse' => '#7FFF00',
|
||||
'chocolate' => '#D2691E',
|
||||
'coral' => '#FF7F50',
|
||||
'cornflowerblue' => '#6495ED',
|
||||
'cornsilk' => '#FFF8DC',
|
||||
'crimson' => '#DC143C',
|
||||
'cyan' => '#00FFFF',
|
||||
'darkblue' => '#00008B',
|
||||
'darkcyan' => '#008B8B',
|
||||
'darkgoldenrod' => '#B8860B',
|
||||
'darkgray' => '#A9A9A9',
|
||||
'darkgrey' => '#A9A9A9',
|
||||
'darkgreen' => '#006400',
|
||||
'darkkhaki' => '#BDB76B',
|
||||
'darkmagenta' => '#8B008B',
|
||||
'darkolivegreen' => '#556B2F',
|
||||
'darkorange' => '#FF8C00',
|
||||
'darkorchid' => '#9932CC',
|
||||
'darkred' => '#8B0000',
|
||||
'darksalmon' => '#E9967A',
|
||||
'darkseagreen' => '#8FBC8F',
|
||||
'darkslateblue' => '#483D8B',
|
||||
'darkslategray' => '#2F4F4F',
|
||||
'darkslategrey' => '#2F4F4F',
|
||||
'darkturquoise' => '#00CED1',
|
||||
'darkviolet' => '#9400D3',
|
||||
'deeppink' => '#FF1493',
|
||||
'deepskyblue' => '#00BFFF',
|
||||
'dimgray' => '#696969',
|
||||
'dimgrey' => '#696969',
|
||||
'dodgerblue' => '#1E90FF',
|
||||
'firebrick' => '#B22222',
|
||||
'floralwhite' => '#FFFAF0',
|
||||
'forestgreen' => '#228B22',
|
||||
'fuchsia' => '#FF00FF',
|
||||
'gainsboro' => '#DCDCDC',
|
||||
'ghostwhite' => '#F8F8FF',
|
||||
'gold' => '#FFD700',
|
||||
'goldenrod' => '#DAA520',
|
||||
'gray' => '#808080',
|
||||
'grey' => '#808080',
|
||||
'green' => '#008000',
|
||||
'greenyellow' => '#ADFF2F',
|
||||
'honeydew' => '#F0FFF0',
|
||||
'hotpink' => '#FF69B4',
|
||||
'indianred' => '#CD5C5C',
|
||||
'indigo' => '#4B0082',
|
||||
'ivory' => '#FFFFF0',
|
||||
'khaki' => '#F0E68C',
|
||||
'lavender' => '#E6E6FA',
|
||||
'lavenderblush' => '#FFF0F5',
|
||||
'lawngreen' => '#7CFC00',
|
||||
'lemonchiffon' => '#FFFACD',
|
||||
'lightblue' => '#ADD8E6',
|
||||
'lightcoral' => '#F08080',
|
||||
'lightcyan' => '#E0FFFF',
|
||||
'lightgoldenrodyellow' => '#FAFAD2',
|
||||
'lightgray' => '#D3D3D3',
|
||||
'lightgrey' => '#D3D3D3',
|
||||
'lightgreen' => '#90EE90',
|
||||
'lightpink' => '#FFB6C1',
|
||||
'lightsalmon' => '#FFA07A',
|
||||
'lightseagreen' => '#20B2AA',
|
||||
'lightskyblue' => '#87CEFA',
|
||||
'lightslategray' => '#778899',
|
||||
'lightslategrey' => '#778899',
|
||||
'lightsteelblue' => '#B0C4DE',
|
||||
'lightyellow' => '#FFFFE0',
|
||||
'lime' => '#00FF00',
|
||||
'limegreen' => '#32CD32',
|
||||
'linen' => '#FAF0E6',
|
||||
'magenta' => '#FF00FF',
|
||||
'maroon' => '#800000',
|
||||
'mediumaquamarine' => '#66CDAA',
|
||||
'mediumblue' => '#0000CD',
|
||||
'mediumorchid' => '#BA55D3',
|
||||
'mediumpurple' => '#9370DB',
|
||||
'mediumseagreen' => '#3CB371',
|
||||
'mediumslateblue' => '#7B68EE',
|
||||
'mediumspringgreen' => '#00FA9A',
|
||||
'mediumturquoise' => '#48D1CC',
|
||||
'mediumvioletred' => '#C71585',
|
||||
'midnightblue' => '#191970',
|
||||
'mintcream' => '#F5FFFA',
|
||||
'mistyrose' => '#FFE4E1',
|
||||
'moccasin' => '#FFE4B5',
|
||||
'navajowhite' => '#FFDEAD',
|
||||
'navy' => '#000080',
|
||||
'oldlace' => '#FDF5E6',
|
||||
'olive' => '#808000',
|
||||
'olivedrab' => '#6B8E23',
|
||||
'orange' => '#FFA500',
|
||||
'orangered' => '#FF4500',
|
||||
'orchid' => '#DA70D6',
|
||||
'palegoldenrod' => '#EEE8AA',
|
||||
'palegreen' => '#98FB98',
|
||||
'paleturquoise' => '#AFEEEE',
|
||||
'palevioletred' => '#DB7093',
|
||||
'papayawhip' => '#FFEFD5',
|
||||
'peachpuff' => '#FFDAB9',
|
||||
'peru' => '#CD853F',
|
||||
'pink' => '#FFC0CB',
|
||||
'plum' => '#DDA0DD',
|
||||
'powderblue' => '#B0E0E6',
|
||||
'purple' => '#800080',
|
||||
'rebeccapurple' => '#663399',
|
||||
'red' => '#FF0000',
|
||||
'rosybrown' => '#BC8F8F',
|
||||
'royalblue' => '#4169E1',
|
||||
'saddlebrown' => '#8B4513',
|
||||
'salmon' => '#FA8072',
|
||||
'sandybrown' => '#F4A460',
|
||||
'seagreen' => '#2E8B57',
|
||||
'seashell' => '#FFF5EE',
|
||||
'sienna' => '#A0522D',
|
||||
'silver' => '#C0C0C0',
|
||||
'skyblue' => '#87CEEB',
|
||||
'slateblue' => '#6A5ACD',
|
||||
'slategray' => '#708090',
|
||||
'slategrey' => '#708090',
|
||||
'snow' => '#FFFAFA',
|
||||
'springgreen' => '#00FF7F',
|
||||
'steelblue' => '#4682B4',
|
||||
'tan' => '#D2B48C',
|
||||
'teal' => '#008080',
|
||||
'thistle' => '#D8BFD8',
|
||||
'tomato' => '#FF6347',
|
||||
'turquoise' => '#40E0D0',
|
||||
'violet' => '#EE82EE',
|
||||
'wheat' => '#F5DEB3',
|
||||
'white' => '#FFFFFF',
|
||||
'whitesmoke' => '#F5F5F5',
|
||||
'yellow' => '#FFFF00',
|
||||
'yellowgreen' => '#9ACD32'
|
||||
)
|
||||
--DESCRIPTION--
|
||||
|
||||
Lookup array of color names to six digit hexadecimal number corresponding
|
||||
to color, with preceding hash mark. Used when parsing colors. The lookup
|
||||
is done in a case-insensitive manner.
|
||||
--# vim: et sw=4 sts=4
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
HTML.Forms
|
||||
TYPE: bool
|
||||
VERSION: 4.13.0
|
||||
DEFAULT: false
|
||||
--DESCRIPTION--
|
||||
<p>
|
||||
Whether or not to permit form elements in the user input, regardless of
|
||||
%HTML.Trusted value. Please be very careful when using this functionality, as
|
||||
enabling forms in untrusted documents may allow for phishing attacks.
|
||||
</p>
|
||||
--# vim: et sw=4 sts=4
|
||||
HTML.Forms
|
||||
TYPE: bool
|
||||
VERSION: 4.13.0
|
||||
DEFAULT: false
|
||||
--DESCRIPTION--
|
||||
<p>
|
||||
Whether or not to permit form elements in the user input, regardless of
|
||||
%HTML.Trusted value. Please be very careful when using this functionality, as
|
||||
enabling forms in untrusted documents may allow for phishing attacks.
|
||||
</p>
|
||||
--# vim: et sw=4 sts=4
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,451 +1,451 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @todo Rewrite to use Interchange objects
|
||||
*/
|
||||
class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer
|
||||
{
|
||||
|
||||
/**
|
||||
* Printers for specific fields.
|
||||
* @type HTMLPurifier_Printer[]
|
||||
*/
|
||||
protected $fields = array();
|
||||
|
||||
/**
|
||||
* Documentation URL, can have fragment tagged on end.
|
||||
* @type string
|
||||
*/
|
||||
protected $docURL;
|
||||
|
||||
/**
|
||||
* Name of form element to stuff config in.
|
||||
* @type string
|
||||
*/
|
||||
protected $name;
|
||||
|
||||
/**
|
||||
* Whether or not to compress directive names, clipping them off
|
||||
* after a certain amount of letters. False to disable or integer letters
|
||||
* before clipping.
|
||||
* @type bool
|
||||
*/
|
||||
protected $compress = false;
|
||||
|
||||
/**
|
||||
* @param string $name Form element name for directives to be stuffed into
|
||||
* @param string $doc_url String documentation URL, will have fragment tagged on
|
||||
* @param bool $compress Integer max length before compressing a directive name, set to false to turn off
|
||||
*/
|
||||
public function __construct(
|
||||
$name,
|
||||
$doc_url = null,
|
||||
$compress = false
|
||||
) {
|
||||
parent::__construct();
|
||||
$this->docURL = $doc_url;
|
||||
$this->name = $name;
|
||||
$this->compress = $compress;
|
||||
// initialize sub-printers
|
||||
$this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default();
|
||||
$this->fields[HTMLPurifier_VarParser::C_BOOL] = new HTMLPurifier_Printer_ConfigForm_bool();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets default column and row size for textareas in sub-printers
|
||||
* @param $cols Integer columns of textarea, null to use default
|
||||
* @param $rows Integer rows of textarea, null to use default
|
||||
*/
|
||||
public function setTextareaDimensions($cols = null, $rows = null)
|
||||
{
|
||||
if ($cols) {
|
||||
$this->fields['default']->cols = $cols;
|
||||
}
|
||||
if ($rows) {
|
||||
$this->fields['default']->rows = $rows;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves styling, in case it is not accessible by webserver
|
||||
*/
|
||||
public static function getCSS()
|
||||
{
|
||||
return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css');
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves JavaScript, in case it is not accessible by webserver
|
||||
*/
|
||||
public static function getJavaScript()
|
||||
{
|
||||
return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns HTML output for a configuration form
|
||||
* @param HTMLPurifier_Config|array $config Configuration object of current form state, or an array
|
||||
* where [0] has an HTML namespace and [1] is being rendered.
|
||||
* @param array|bool $allowed Optional namespace(s) and directives to restrict form to.
|
||||
* @param bool $render_controls
|
||||
* @return string
|
||||
*/
|
||||
public function render($config, $allowed = true, $render_controls = true)
|
||||
{
|
||||
if (is_array($config) && isset($config[0])) {
|
||||
$gen_config = $config[0];
|
||||
$config = $config[1];
|
||||
} else {
|
||||
$gen_config = $config;
|
||||
}
|
||||
|
||||
$this->config = $config;
|
||||
$this->genConfig = $gen_config;
|
||||
$this->prepareGenerator($gen_config);
|
||||
|
||||
$allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def);
|
||||
$all = array();
|
||||
foreach ($allowed as $key) {
|
||||
list($ns, $directive) = $key;
|
||||
$all[$ns][$directive] = $config->get($ns . '.' . $directive);
|
||||
}
|
||||
|
||||
$ret = '';
|
||||
$ret .= $this->start('table', array('class' => 'hp-config'));
|
||||
$ret .= $this->start('thead');
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Directive', array('class' => 'hp-directive'));
|
||||
$ret .= $this->element('th', 'Value', array('class' => 'hp-value'));
|
||||
$ret .= $this->end('tr');
|
||||
$ret .= $this->end('thead');
|
||||
foreach ($all as $ns => $directives) {
|
||||
$ret .= $this->renderNamespace($ns, $directives);
|
||||
}
|
||||
if ($render_controls) {
|
||||
$ret .= $this->start('tbody');
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls'));
|
||||
$ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit'));
|
||||
$ret .= '[<a href="?">Reset</a>]';
|
||||
$ret .= $this->end('td');
|
||||
$ret .= $this->end('tr');
|
||||
$ret .= $this->end('tbody');
|
||||
}
|
||||
$ret .= $this->end('table');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders a single namespace
|
||||
* @param $ns String namespace name
|
||||
* @param array $directives array of directives to values
|
||||
* @return string
|
||||
*/
|
||||
protected function renderNamespace($ns, $directives)
|
||||
{
|
||||
$ret = '';
|
||||
$ret .= $this->start('tbody', array('class' => 'namespace'));
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', $ns, array('colspan' => 2));
|
||||
$ret .= $this->end('tr');
|
||||
$ret .= $this->end('tbody');
|
||||
$ret .= $this->start('tbody');
|
||||
foreach ($directives as $directive => $value) {
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->start('th');
|
||||
if ($this->docURL) {
|
||||
$url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL);
|
||||
$ret .= $this->start('a', array('href' => $url));
|
||||
}
|
||||
$attr = array('for' => "{$this->name}:$ns.$directive");
|
||||
|
||||
// crop directive name if it's too long
|
||||
if (!$this->compress || (strlen($directive) < $this->compress)) {
|
||||
$directive_disp = $directive;
|
||||
} else {
|
||||
$directive_disp = substr($directive, 0, $this->compress - 2) . '...';
|
||||
$attr['title'] = $directive;
|
||||
}
|
||||
|
||||
$ret .= $this->element(
|
||||
'label',
|
||||
$directive_disp,
|
||||
// component printers must create an element with this id
|
||||
$attr
|
||||
);
|
||||
if ($this->docURL) {
|
||||
$ret .= $this->end('a');
|
||||
}
|
||||
$ret .= $this->end('th');
|
||||
|
||||
$ret .= $this->start('td');
|
||||
$def = $this->config->def->info["$ns.$directive"];
|
||||
if (is_int($def)) {
|
||||
$allow_null = $def < 0;
|
||||
$type = abs($def);
|
||||
} else {
|
||||
$type = $def->type;
|
||||
$allow_null = isset($def->allow_null);
|
||||
}
|
||||
if (!isset($this->fields[$type])) {
|
||||
$type = 0;
|
||||
} // default
|
||||
$type_obj = $this->fields[$type];
|
||||
if ($allow_null) {
|
||||
$type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj);
|
||||
}
|
||||
$ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config));
|
||||
$ret .= $this->end('td');
|
||||
$ret .= $this->end('tr');
|
||||
}
|
||||
$ret .= $this->end('tbody');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Printer decorator for directives that accept null
|
||||
*/
|
||||
class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer
|
||||
{
|
||||
/**
|
||||
* Printer being decorated
|
||||
* @type HTMLPurifier_Printer
|
||||
*/
|
||||
protected $obj;
|
||||
|
||||
/**
|
||||
* @param HTMLPurifier_Printer $obj Printer to decorate
|
||||
*/
|
||||
public function __construct($obj)
|
||||
{
|
||||
parent::__construct();
|
||||
$this->obj = $obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $ns
|
||||
* @param string $directive
|
||||
* @param string $value
|
||||
* @param string $name
|
||||
* @param HTMLPurifier_Config|array $config
|
||||
* @return string
|
||||
*/
|
||||
public function render($ns, $directive, $value, $name, $config)
|
||||
{
|
||||
if (is_array($config) && isset($config[0])) {
|
||||
$gen_config = $config[0];
|
||||
$config = $config[1];
|
||||
} else {
|
||||
$gen_config = $config;
|
||||
}
|
||||
$this->prepareGenerator($gen_config);
|
||||
|
||||
$ret = '';
|
||||
$ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive"));
|
||||
$ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
|
||||
$ret .= $this->text(' Null/Disabled');
|
||||
$ret .= $this->end('label');
|
||||
$attr = array(
|
||||
'type' => 'checkbox',
|
||||
'value' => '1',
|
||||
'class' => 'null-toggle',
|
||||
'name' => "$name" . "[Null_$ns.$directive]",
|
||||
'id' => "$name:Null_$ns.$directive",
|
||||
'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!!
|
||||
);
|
||||
if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) {
|
||||
// modify inline javascript slightly
|
||||
$attr['onclick'] =
|
||||
"toggleWriteability('$name:Yes_$ns.$directive',checked);" .
|
||||
"toggleWriteability('$name:No_$ns.$directive',checked)";
|
||||
}
|
||||
if ($value === null) {
|
||||
$attr['checked'] = 'checked';
|
||||
}
|
||||
$ret .= $this->elementEmpty('input', $attr);
|
||||
$ret .= $this->text(' or ');
|
||||
$ret .= $this->elementEmpty('br');
|
||||
$ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config));
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Swiss-army knife configuration form field printer
|
||||
*/
|
||||
class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer
|
||||
{
|
||||
/**
|
||||
* @type int
|
||||
*/
|
||||
public $cols = 18;
|
||||
|
||||
/**
|
||||
* @type int
|
||||
*/
|
||||
public $rows = 5;
|
||||
|
||||
/**
|
||||
* @param string $ns
|
||||
* @param string $directive
|
||||
* @param string $value
|
||||
* @param string $name
|
||||
* @param HTMLPurifier_Config|array $config
|
||||
* @return string
|
||||
*/
|
||||
public function render($ns, $directive, $value, $name, $config)
|
||||
{
|
||||
if (is_array($config) && isset($config[0])) {
|
||||
$gen_config = $config[0];
|
||||
$config = $config[1];
|
||||
} else {
|
||||
$gen_config = $config;
|
||||
}
|
||||
$this->prepareGenerator($gen_config);
|
||||
// this should probably be split up a little
|
||||
$ret = '';
|
||||
$def = $config->def->info["$ns.$directive"];
|
||||
if (is_int($def)) {
|
||||
$type = abs($def);
|
||||
} else {
|
||||
$type = $def->type;
|
||||
}
|
||||
if (is_array($value)) {
|
||||
switch ($type) {
|
||||
case HTMLPurifier_VarParser::LOOKUP:
|
||||
$array = $value;
|
||||
$value = array();
|
||||
foreach ($array as $val => $b) {
|
||||
$value[] = $val;
|
||||
}
|
||||
//TODO does this need a break?
|
||||
case HTMLPurifier_VarParser::ALIST:
|
||||
$value = implode(PHP_EOL, $value);
|
||||
break;
|
||||
case HTMLPurifier_VarParser::HASH:
|
||||
$nvalue = '';
|
||||
foreach ($value as $i => $v) {
|
||||
if (is_array($v)) {
|
||||
// HACK
|
||||
$v = implode(";", $v);
|
||||
}
|
||||
$nvalue .= "$i:$v" . PHP_EOL;
|
||||
}
|
||||
$value = $nvalue;
|
||||
break;
|
||||
default:
|
||||
$value = '';
|
||||
}
|
||||
}
|
||||
if ($type === HTMLPurifier_VarParser::C_MIXED) {
|
||||
return 'Not supported';
|
||||
$value = serialize($value);
|
||||
}
|
||||
$attr = array(
|
||||
'name' => "$name" . "[$ns.$directive]",
|
||||
'id' => "$name:$ns.$directive"
|
||||
);
|
||||
if ($value === null) {
|
||||
$attr['disabled'] = 'disabled';
|
||||
}
|
||||
if (isset($def->allowed)) {
|
||||
$ret .= $this->start('select', $attr);
|
||||
foreach ($def->allowed as $val => $b) {
|
||||
$attr = array();
|
||||
if ($value == $val) {
|
||||
$attr['selected'] = 'selected';
|
||||
}
|
||||
$ret .= $this->element('option', $val, $attr);
|
||||
}
|
||||
$ret .= $this->end('select');
|
||||
} elseif ($type === HTMLPurifier_VarParser::TEXT ||
|
||||
$type === HTMLPurifier_VarParser::ITEXT ||
|
||||
$type === HTMLPurifier_VarParser::ALIST ||
|
||||
$type === HTMLPurifier_VarParser::HASH ||
|
||||
$type === HTMLPurifier_VarParser::LOOKUP) {
|
||||
$attr['cols'] = $this->cols;
|
||||
$attr['rows'] = $this->rows;
|
||||
$ret .= $this->start('textarea', $attr);
|
||||
$ret .= $this->text($value);
|
||||
$ret .= $this->end('textarea');
|
||||
} else {
|
||||
$attr['value'] = $value;
|
||||
$attr['type'] = 'text';
|
||||
$ret .= $this->elementEmpty('input', $attr);
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Bool form field printer
|
||||
*/
|
||||
class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer
|
||||
{
|
||||
/**
|
||||
* @param string $ns
|
||||
* @param string $directive
|
||||
* @param string $value
|
||||
* @param string $name
|
||||
* @param HTMLPurifier_Config|array $config
|
||||
* @return string
|
||||
*/
|
||||
public function render($ns, $directive, $value, $name, $config)
|
||||
{
|
||||
if (is_array($config) && isset($config[0])) {
|
||||
$gen_config = $config[0];
|
||||
$config = $config[1];
|
||||
} else {
|
||||
$gen_config = $config;
|
||||
}
|
||||
$this->prepareGenerator($gen_config);
|
||||
$ret = '';
|
||||
$ret .= $this->start('div', array('id' => "$name:$ns.$directive"));
|
||||
|
||||
$ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive"));
|
||||
$ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
|
||||
$ret .= $this->text(' Yes');
|
||||
$ret .= $this->end('label');
|
||||
|
||||
$attr = array(
|
||||
'type' => 'radio',
|
||||
'name' => "$name" . "[$ns.$directive]",
|
||||
'id' => "$name:Yes_$ns.$directive",
|
||||
'value' => '1'
|
||||
);
|
||||
if ($value === true) {
|
||||
$attr['checked'] = 'checked';
|
||||
}
|
||||
if ($value === null) {
|
||||
$attr['disabled'] = 'disabled';
|
||||
}
|
||||
$ret .= $this->elementEmpty('input', $attr);
|
||||
|
||||
$ret .= $this->start('label', array('for' => "$name:No_$ns.$directive"));
|
||||
$ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
|
||||
$ret .= $this->text(' No');
|
||||
$ret .= $this->end('label');
|
||||
|
||||
$attr = array(
|
||||
'type' => 'radio',
|
||||
'name' => "$name" . "[$ns.$directive]",
|
||||
'id' => "$name:No_$ns.$directive",
|
||||
'value' => '0'
|
||||
);
|
||||
if ($value === false) {
|
||||
$attr['checked'] = 'checked';
|
||||
}
|
||||
if ($value === null) {
|
||||
$attr['disabled'] = 'disabled';
|
||||
}
|
||||
$ret .= $this->elementEmpty('input', $attr);
|
||||
|
||||
$ret .= $this->end('div');
|
||||
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @todo Rewrite to use Interchange objects
|
||||
*/
|
||||
class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer
|
||||
{
|
||||
|
||||
/**
|
||||
* Printers for specific fields.
|
||||
* @type HTMLPurifier_Printer[]
|
||||
*/
|
||||
protected $fields = array();
|
||||
|
||||
/**
|
||||
* Documentation URL, can have fragment tagged on end.
|
||||
* @type string
|
||||
*/
|
||||
protected $docURL;
|
||||
|
||||
/**
|
||||
* Name of form element to stuff config in.
|
||||
* @type string
|
||||
*/
|
||||
protected $name;
|
||||
|
||||
/**
|
||||
* Whether or not to compress directive names, clipping them off
|
||||
* after a certain amount of letters. False to disable or integer letters
|
||||
* before clipping.
|
||||
* @type bool
|
||||
*/
|
||||
protected $compress = false;
|
||||
|
||||
/**
|
||||
* @param string $name Form element name for directives to be stuffed into
|
||||
* @param string $doc_url String documentation URL, will have fragment tagged on
|
||||
* @param bool $compress Integer max length before compressing a directive name, set to false to turn off
|
||||
*/
|
||||
public function __construct(
|
||||
$name,
|
||||
$doc_url = null,
|
||||
$compress = false
|
||||
) {
|
||||
parent::__construct();
|
||||
$this->docURL = $doc_url;
|
||||
$this->name = $name;
|
||||
$this->compress = $compress;
|
||||
// initialize sub-printers
|
||||
$this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default();
|
||||
$this->fields[HTMLPurifier_VarParser::C_BOOL] = new HTMLPurifier_Printer_ConfigForm_bool();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets default column and row size for textareas in sub-printers
|
||||
* @param $cols Integer columns of textarea, null to use default
|
||||
* @param $rows Integer rows of textarea, null to use default
|
||||
*/
|
||||
public function setTextareaDimensions($cols = null, $rows = null)
|
||||
{
|
||||
if ($cols) {
|
||||
$this->fields['default']->cols = $cols;
|
||||
}
|
||||
if ($rows) {
|
||||
$this->fields['default']->rows = $rows;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves styling, in case it is not accessible by webserver
|
||||
*/
|
||||
public static function getCSS()
|
||||
{
|
||||
return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css');
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves JavaScript, in case it is not accessible by webserver
|
||||
*/
|
||||
public static function getJavaScript()
|
||||
{
|
||||
return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns HTML output for a configuration form
|
||||
* @param HTMLPurifier_Config|array $config Configuration object of current form state, or an array
|
||||
* where [0] has an HTML namespace and [1] is being rendered.
|
||||
* @param array|bool $allowed Optional namespace(s) and directives to restrict form to.
|
||||
* @param bool $render_controls
|
||||
* @return string
|
||||
*/
|
||||
public function render($config, $allowed = true, $render_controls = true)
|
||||
{
|
||||
if (is_array($config) && isset($config[0])) {
|
||||
$gen_config = $config[0];
|
||||
$config = $config[1];
|
||||
} else {
|
||||
$gen_config = $config;
|
||||
}
|
||||
|
||||
$this->config = $config;
|
||||
$this->genConfig = $gen_config;
|
||||
$this->prepareGenerator($gen_config);
|
||||
|
||||
$allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def);
|
||||
$all = array();
|
||||
foreach ($allowed as $key) {
|
||||
list($ns, $directive) = $key;
|
||||
$all[$ns][$directive] = $config->get($ns . '.' . $directive);
|
||||
}
|
||||
|
||||
$ret = '';
|
||||
$ret .= $this->start('table', array('class' => 'hp-config'));
|
||||
$ret .= $this->start('thead');
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Directive', array('class' => 'hp-directive'));
|
||||
$ret .= $this->element('th', 'Value', array('class' => 'hp-value'));
|
||||
$ret .= $this->end('tr');
|
||||
$ret .= $this->end('thead');
|
||||
foreach ($all as $ns => $directives) {
|
||||
$ret .= $this->renderNamespace($ns, $directives);
|
||||
}
|
||||
if ($render_controls) {
|
||||
$ret .= $this->start('tbody');
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls'));
|
||||
$ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit'));
|
||||
$ret .= '[<a href="?">Reset</a>]';
|
||||
$ret .= $this->end('td');
|
||||
$ret .= $this->end('tr');
|
||||
$ret .= $this->end('tbody');
|
||||
}
|
||||
$ret .= $this->end('table');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders a single namespace
|
||||
* @param $ns String namespace name
|
||||
* @param array $directives array of directives to values
|
||||
* @return string
|
||||
*/
|
||||
protected function renderNamespace($ns, $directives)
|
||||
{
|
||||
$ret = '';
|
||||
$ret .= $this->start('tbody', array('class' => 'namespace'));
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', $ns, array('colspan' => 2));
|
||||
$ret .= $this->end('tr');
|
||||
$ret .= $this->end('tbody');
|
||||
$ret .= $this->start('tbody');
|
||||
foreach ($directives as $directive => $value) {
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->start('th');
|
||||
if ($this->docURL) {
|
||||
$url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL);
|
||||
$ret .= $this->start('a', array('href' => $url));
|
||||
}
|
||||
$attr = array('for' => "{$this->name}:$ns.$directive");
|
||||
|
||||
// crop directive name if it's too long
|
||||
if (!$this->compress || (strlen($directive) < $this->compress)) {
|
||||
$directive_disp = $directive;
|
||||
} else {
|
||||
$directive_disp = substr($directive, 0, $this->compress - 2) . '...';
|
||||
$attr['title'] = $directive;
|
||||
}
|
||||
|
||||
$ret .= $this->element(
|
||||
'label',
|
||||
$directive_disp,
|
||||
// component printers must create an element with this id
|
||||
$attr
|
||||
);
|
||||
if ($this->docURL) {
|
||||
$ret .= $this->end('a');
|
||||
}
|
||||
$ret .= $this->end('th');
|
||||
|
||||
$ret .= $this->start('td');
|
||||
$def = $this->config->def->info["$ns.$directive"];
|
||||
if (is_int($def)) {
|
||||
$allow_null = $def < 0;
|
||||
$type = abs($def);
|
||||
} else {
|
||||
$type = $def->type;
|
||||
$allow_null = isset($def->allow_null);
|
||||
}
|
||||
if (!isset($this->fields[$type])) {
|
||||
$type = 0;
|
||||
} // default
|
||||
$type_obj = $this->fields[$type];
|
||||
if ($allow_null) {
|
||||
$type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj);
|
||||
}
|
||||
$ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config));
|
||||
$ret .= $this->end('td');
|
||||
$ret .= $this->end('tr');
|
||||
}
|
||||
$ret .= $this->end('tbody');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Printer decorator for directives that accept null
|
||||
*/
|
||||
class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer
|
||||
{
|
||||
/**
|
||||
* Printer being decorated
|
||||
* @type HTMLPurifier_Printer
|
||||
*/
|
||||
protected $obj;
|
||||
|
||||
/**
|
||||
* @param HTMLPurifier_Printer $obj Printer to decorate
|
||||
*/
|
||||
public function __construct($obj)
|
||||
{
|
||||
parent::__construct();
|
||||
$this->obj = $obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $ns
|
||||
* @param string $directive
|
||||
* @param string $value
|
||||
* @param string $name
|
||||
* @param HTMLPurifier_Config|array $config
|
||||
* @return string
|
||||
*/
|
||||
public function render($ns, $directive, $value, $name, $config)
|
||||
{
|
||||
if (is_array($config) && isset($config[0])) {
|
||||
$gen_config = $config[0];
|
||||
$config = $config[1];
|
||||
} else {
|
||||
$gen_config = $config;
|
||||
}
|
||||
$this->prepareGenerator($gen_config);
|
||||
|
||||
$ret = '';
|
||||
$ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive"));
|
||||
$ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
|
||||
$ret .= $this->text(' Null/Disabled');
|
||||
$ret .= $this->end('label');
|
||||
$attr = array(
|
||||
'type' => 'checkbox',
|
||||
'value' => '1',
|
||||
'class' => 'null-toggle',
|
||||
'name' => "$name" . "[Null_$ns.$directive]",
|
||||
'id' => "$name:Null_$ns.$directive",
|
||||
'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!!
|
||||
);
|
||||
if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) {
|
||||
// modify inline javascript slightly
|
||||
$attr['onclick'] =
|
||||
"toggleWriteability('$name:Yes_$ns.$directive',checked);" .
|
||||
"toggleWriteability('$name:No_$ns.$directive',checked)";
|
||||
}
|
||||
if ($value === null) {
|
||||
$attr['checked'] = 'checked';
|
||||
}
|
||||
$ret .= $this->elementEmpty('input', $attr);
|
||||
$ret .= $this->text(' or ');
|
||||
$ret .= $this->elementEmpty('br');
|
||||
$ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config));
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Swiss-army knife configuration form field printer
|
||||
*/
|
||||
class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer
|
||||
{
|
||||
/**
|
||||
* @type int
|
||||
*/
|
||||
public $cols = 18;
|
||||
|
||||
/**
|
||||
* @type int
|
||||
*/
|
||||
public $rows = 5;
|
||||
|
||||
/**
|
||||
* @param string $ns
|
||||
* @param string $directive
|
||||
* @param string $value
|
||||
* @param string $name
|
||||
* @param HTMLPurifier_Config|array $config
|
||||
* @return string
|
||||
*/
|
||||
public function render($ns, $directive, $value, $name, $config)
|
||||
{
|
||||
if (is_array($config) && isset($config[0])) {
|
||||
$gen_config = $config[0];
|
||||
$config = $config[1];
|
||||
} else {
|
||||
$gen_config = $config;
|
||||
}
|
||||
$this->prepareGenerator($gen_config);
|
||||
// this should probably be split up a little
|
||||
$ret = '';
|
||||
$def = $config->def->info["$ns.$directive"];
|
||||
if (is_int($def)) {
|
||||
$type = abs($def);
|
||||
} else {
|
||||
$type = $def->type;
|
||||
}
|
||||
if (is_array($value)) {
|
||||
switch ($type) {
|
||||
case HTMLPurifier_VarParser::LOOKUP:
|
||||
$array = $value;
|
||||
$value = array();
|
||||
foreach ($array as $val => $b) {
|
||||
$value[] = $val;
|
||||
}
|
||||
//TODO does this need a break?
|
||||
case HTMLPurifier_VarParser::ALIST:
|
||||
$value = implode(PHP_EOL, $value);
|
||||
break;
|
||||
case HTMLPurifier_VarParser::HASH:
|
||||
$nvalue = '';
|
||||
foreach ($value as $i => $v) {
|
||||
if (is_array($v)) {
|
||||
// HACK
|
||||
$v = implode(";", $v);
|
||||
}
|
||||
$nvalue .= "$i:$v" . PHP_EOL;
|
||||
}
|
||||
$value = $nvalue;
|
||||
break;
|
||||
default:
|
||||
$value = '';
|
||||
}
|
||||
}
|
||||
if ($type === HTMLPurifier_VarParser::C_MIXED) {
|
||||
return 'Not supported';
|
||||
$value = serialize($value);
|
||||
}
|
||||
$attr = array(
|
||||
'name' => "$name" . "[$ns.$directive]",
|
||||
'id' => "$name:$ns.$directive"
|
||||
);
|
||||
if ($value === null) {
|
||||
$attr['disabled'] = 'disabled';
|
||||
}
|
||||
if (isset($def->allowed)) {
|
||||
$ret .= $this->start('select', $attr);
|
||||
foreach ($def->allowed as $val => $b) {
|
||||
$attr = array();
|
||||
if ($value == $val) {
|
||||
$attr['selected'] = 'selected';
|
||||
}
|
||||
$ret .= $this->element('option', $val, $attr);
|
||||
}
|
||||
$ret .= $this->end('select');
|
||||
} elseif ($type === HTMLPurifier_VarParser::TEXT ||
|
||||
$type === HTMLPurifier_VarParser::ITEXT ||
|
||||
$type === HTMLPurifier_VarParser::ALIST ||
|
||||
$type === HTMLPurifier_VarParser::HASH ||
|
||||
$type === HTMLPurifier_VarParser::LOOKUP) {
|
||||
$attr['cols'] = $this->cols;
|
||||
$attr['rows'] = $this->rows;
|
||||
$ret .= $this->start('textarea', $attr);
|
||||
$ret .= $this->text($value);
|
||||
$ret .= $this->end('textarea');
|
||||
} else {
|
||||
$attr['value'] = $value;
|
||||
$attr['type'] = 'text';
|
||||
$ret .= $this->elementEmpty('input', $attr);
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Bool form field printer
|
||||
*/
|
||||
class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer
|
||||
{
|
||||
/**
|
||||
* @param string $ns
|
||||
* @param string $directive
|
||||
* @param string $value
|
||||
* @param string $name
|
||||
* @param HTMLPurifier_Config|array $config
|
||||
* @return string
|
||||
*/
|
||||
public function render($ns, $directive, $value, $name, $config)
|
||||
{
|
||||
if (is_array($config) && isset($config[0])) {
|
||||
$gen_config = $config[0];
|
||||
$config = $config[1];
|
||||
} else {
|
||||
$gen_config = $config;
|
||||
}
|
||||
$this->prepareGenerator($gen_config);
|
||||
$ret = '';
|
||||
$ret .= $this->start('div', array('id' => "$name:$ns.$directive"));
|
||||
|
||||
$ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive"));
|
||||
$ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
|
||||
$ret .= $this->text(' Yes');
|
||||
$ret .= $this->end('label');
|
||||
|
||||
$attr = array(
|
||||
'type' => 'radio',
|
||||
'name' => "$name" . "[$ns.$directive]",
|
||||
'id' => "$name:Yes_$ns.$directive",
|
||||
'value' => '1'
|
||||
);
|
||||
if ($value === true) {
|
||||
$attr['checked'] = 'checked';
|
||||
}
|
||||
if ($value === null) {
|
||||
$attr['disabled'] = 'disabled';
|
||||
}
|
||||
$ret .= $this->elementEmpty('input', $attr);
|
||||
|
||||
$ret .= $this->start('label', array('for' => "$name:No_$ns.$directive"));
|
||||
$ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
|
||||
$ret .= $this->text(' No');
|
||||
$ret .= $this->end('label');
|
||||
|
||||
$attr = array(
|
||||
'type' => 'radio',
|
||||
'name' => "$name" . "[$ns.$directive]",
|
||||
'id' => "$name:No_$ns.$directive",
|
||||
'value' => '0'
|
||||
);
|
||||
if ($value === false) {
|
||||
$attr['checked'] = 'checked';
|
||||
}
|
||||
if ($value === null) {
|
||||
$attr['disabled'] = 'disabled';
|
||||
}
|
||||
$ret .= $this->elementEmpty('input', $attr);
|
||||
|
||||
$ret .= $this->end('div');
|
||||
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
|
||||
@ -1,324 +1,324 @@
|
||||
<?php
|
||||
|
||||
class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer
|
||||
{
|
||||
|
||||
/**
|
||||
* @type HTMLPurifier_HTMLDefinition, for easy access
|
||||
*/
|
||||
protected $def;
|
||||
|
||||
/**
|
||||
* @param HTMLPurifier_Config $config
|
||||
* @return string
|
||||
*/
|
||||
public function render($config)
|
||||
{
|
||||
$ret = '';
|
||||
$this->config =& $config;
|
||||
|
||||
$this->def = $config->getHTMLDefinition();
|
||||
|
||||
$ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer'));
|
||||
|
||||
$ret .= $this->renderDoctype();
|
||||
$ret .= $this->renderEnvironment();
|
||||
$ret .= $this->renderContentSets();
|
||||
$ret .= $this->renderInfo();
|
||||
|
||||
$ret .= $this->end('div');
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the Doctype table
|
||||
* @return string
|
||||
*/
|
||||
protected function renderDoctype()
|
||||
{
|
||||
$doctype = $this->def->doctype;
|
||||
$ret = '';
|
||||
$ret .= $this->start('table');
|
||||
$ret .= $this->element('caption', 'Doctype');
|
||||
$ret .= $this->row('Name', $doctype->name);
|
||||
$ret .= $this->row('XML', $doctype->xml ? 'Yes' : 'No');
|
||||
$ret .= $this->row('Default Modules', implode(', ', $doctype->modules));
|
||||
$ret .= $this->row('Default Tidy Modules', implode(', ', $doctype->tidyModules));
|
||||
$ret .= $this->end('table');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Renders environment table, which is miscellaneous info
|
||||
* @return string
|
||||
*/
|
||||
protected function renderEnvironment()
|
||||
{
|
||||
$def = $this->def;
|
||||
|
||||
$ret = '';
|
||||
|
||||
$ret .= $this->start('table');
|
||||
$ret .= $this->element('caption', 'Environment');
|
||||
|
||||
$ret .= $this->row('Parent of fragment', $def->info_parent);
|
||||
$ret .= $this->renderChildren($def->info_parent_def->child);
|
||||
$ret .= $this->row('Block wrap name', $def->info_block_wrapper);
|
||||
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Global attributes');
|
||||
$ret .= $this->element('td', $this->listifyAttr($def->info_global_attr), null, 0);
|
||||
$ret .= $this->end('tr');
|
||||
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Tag transforms');
|
||||
$list = array();
|
||||
foreach ($def->info_tag_transform as $old => $new) {
|
||||
$new = $this->getClass($new, 'TagTransform_');
|
||||
$list[] = "<$old> with $new";
|
||||
}
|
||||
$ret .= $this->element('td', $this->listify($list));
|
||||
$ret .= $this->end('tr');
|
||||
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Pre-AttrTransform');
|
||||
$ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_pre));
|
||||
$ret .= $this->end('tr');
|
||||
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Post-AttrTransform');
|
||||
$ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_post));
|
||||
$ret .= $this->end('tr');
|
||||
|
||||
$ret .= $this->end('table');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the Content Sets table
|
||||
* @return string
|
||||
*/
|
||||
protected function renderContentSets()
|
||||
{
|
||||
$ret = '';
|
||||
$ret .= $this->start('table');
|
||||
$ret .= $this->element('caption', 'Content Sets');
|
||||
foreach ($this->def->info_content_sets as $name => $lookup) {
|
||||
$ret .= $this->heavyHeader($name);
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('td', $this->listifyTagLookup($lookup));
|
||||
$ret .= $this->end('tr');
|
||||
}
|
||||
$ret .= $this->end('table');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the Elements ($info) table
|
||||
* @return string
|
||||
*/
|
||||
protected function renderInfo()
|
||||
{
|
||||
$ret = '';
|
||||
$ret .= $this->start('table');
|
||||
$ret .= $this->element('caption', 'Elements ($info)');
|
||||
ksort($this->def->info);
|
||||
$ret .= $this->heavyHeader('Allowed tags', 2);
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('td', $this->listifyTagLookup($this->def->info), array('colspan' => 2));
|
||||
$ret .= $this->end('tr');
|
||||
foreach ($this->def->info as $name => $def) {
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', "<$name>", array('class' => 'heavy', 'colspan' => 2));
|
||||
$ret .= $this->end('tr');
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Inline content');
|
||||
$ret .= $this->element('td', $def->descendants_are_inline ? 'Yes' : 'No');
|
||||
$ret .= $this->end('tr');
|
||||
if (!empty($def->excludes)) {
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Excludes');
|
||||
$ret .= $this->element('td', $this->listifyTagLookup($def->excludes));
|
||||
$ret .= $this->end('tr');
|
||||
}
|
||||
if (!empty($def->attr_transform_pre)) {
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Pre-AttrTransform');
|
||||
$ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_pre));
|
||||
$ret .= $this->end('tr');
|
||||
}
|
||||
if (!empty($def->attr_transform_post)) {
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Post-AttrTransform');
|
||||
$ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_post));
|
||||
$ret .= $this->end('tr');
|
||||
}
|
||||
if (!empty($def->auto_close)) {
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Auto closed by');
|
||||
$ret .= $this->element('td', $this->listifyTagLookup($def->auto_close));
|
||||
$ret .= $this->end('tr');
|
||||
}
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Allowed attributes');
|
||||
$ret .= $this->element('td', $this->listifyAttr($def->attr), array(), 0);
|
||||
$ret .= $this->end('tr');
|
||||
|
||||
if (!empty($def->required_attr)) {
|
||||
$ret .= $this->row('Required attributes', $this->listify($def->required_attr));
|
||||
}
|
||||
|
||||
$ret .= $this->renderChildren($def->child);
|
||||
}
|
||||
$ret .= $this->end('table');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders a row describing the allowed children of an element
|
||||
* @param HTMLPurifier_ChildDef $def HTMLPurifier_ChildDef of pertinent element
|
||||
* @return string
|
||||
*/
|
||||
protected function renderChildren($def)
|
||||
{
|
||||
$context = new HTMLPurifier_Context();
|
||||
$ret = '';
|
||||
$ret .= $this->start('tr');
|
||||
$elements = array();
|
||||
$attr = array();
|
||||
if (isset($def->elements)) {
|
||||
if ($def->type == 'strictblockquote') {
|
||||
$def->validateChildren(array(), $this->config, $context);
|
||||
}
|
||||
$elements = $def->elements;
|
||||
}
|
||||
if ($def->type == 'chameleon') {
|
||||
$attr['rowspan'] = 2;
|
||||
} elseif ($def->type == 'empty') {
|
||||
$elements = array();
|
||||
} elseif ($def->type == 'table') {
|
||||
$elements = array_flip(
|
||||
array(
|
||||
'col',
|
||||
'caption',
|
||||
'colgroup',
|
||||
'thead',
|
||||
'tfoot',
|
||||
'tbody',
|
||||
'tr'
|
||||
)
|
||||
);
|
||||
}
|
||||
$ret .= $this->element('th', 'Allowed children', $attr);
|
||||
|
||||
if ($def->type == 'chameleon') {
|
||||
|
||||
$ret .= $this->element(
|
||||
'td',
|
||||
'<em>Block</em>: ' .
|
||||
$this->escape($this->listifyTagLookup($def->block->elements)),
|
||||
null,
|
||||
0
|
||||
);
|
||||
$ret .= $this->end('tr');
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element(
|
||||
'td',
|
||||
'<em>Inline</em>: ' .
|
||||
$this->escape($this->listifyTagLookup($def->inline->elements)),
|
||||
null,
|
||||
0
|
||||
);
|
||||
|
||||
} elseif ($def->type == 'custom') {
|
||||
|
||||
$ret .= $this->element(
|
||||
'td',
|
||||
'<em>' . ucfirst($def->type) . '</em>: ' .
|
||||
$def->dtd_regex
|
||||
);
|
||||
|
||||
} else {
|
||||
$ret .= $this->element(
|
||||
'td',
|
||||
'<em>' . ucfirst($def->type) . '</em>: ' .
|
||||
$this->escape($this->listifyTagLookup($elements)),
|
||||
null,
|
||||
0
|
||||
);
|
||||
}
|
||||
$ret .= $this->end('tr');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Listifies a tag lookup table.
|
||||
* @param array $array Tag lookup array in form of array('tagname' => true)
|
||||
* @return string
|
||||
*/
|
||||
protected function listifyTagLookup($array)
|
||||
{
|
||||
ksort($array);
|
||||
$list = array();
|
||||
foreach ($array as $name => $discard) {
|
||||
if ($name !== '#PCDATA' && !isset($this->def->info[$name])) {
|
||||
continue;
|
||||
}
|
||||
$list[] = $name;
|
||||
}
|
||||
return $this->listify($list);
|
||||
}
|
||||
|
||||
/**
|
||||
* Listifies a list of objects by retrieving class names and internal state
|
||||
* @param array $array List of objects
|
||||
* @return string
|
||||
* @todo Also add information about internal state
|
||||
*/
|
||||
protected function listifyObjectList($array)
|
||||
{
|
||||
ksort($array);
|
||||
$list = array();
|
||||
foreach ($array as $obj) {
|
||||
$list[] = $this->getClass($obj, 'AttrTransform_');
|
||||
}
|
||||
return $this->listify($list);
|
||||
}
|
||||
|
||||
/**
|
||||
* Listifies a hash of attributes to AttrDef classes
|
||||
* @param array $array Array hash in form of array('attrname' => HTMLPurifier_AttrDef)
|
||||
* @return string
|
||||
*/
|
||||
protected function listifyAttr($array)
|
||||
{
|
||||
ksort($array);
|
||||
$list = array();
|
||||
foreach ($array as $name => $obj) {
|
||||
if ($obj === false) {
|
||||
continue;
|
||||
}
|
||||
$list[] = "$name = <i>" . $this->getClass($obj, 'AttrDef_') . '</i>';
|
||||
}
|
||||
return $this->listify($list);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a heavy header row
|
||||
* @param string $text
|
||||
* @param int $num
|
||||
* @return string
|
||||
*/
|
||||
protected function heavyHeader($text, $num = 1)
|
||||
{
|
||||
$ret = '';
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', $text, array('colspan' => $num, 'class' => 'heavy'));
|
||||
$ret .= $this->end('tr');
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
<?php
|
||||
|
||||
class HTMLPurifier_Printer_HTMLDefinition extends HTMLPurifier_Printer
|
||||
{
|
||||
|
||||
/**
|
||||
* @type HTMLPurifier_HTMLDefinition, for easy access
|
||||
*/
|
||||
protected $def;
|
||||
|
||||
/**
|
||||
* @param HTMLPurifier_Config $config
|
||||
* @return string
|
||||
*/
|
||||
public function render($config)
|
||||
{
|
||||
$ret = '';
|
||||
$this->config =& $config;
|
||||
|
||||
$this->def = $config->getHTMLDefinition();
|
||||
|
||||
$ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer'));
|
||||
|
||||
$ret .= $this->renderDoctype();
|
||||
$ret .= $this->renderEnvironment();
|
||||
$ret .= $this->renderContentSets();
|
||||
$ret .= $this->renderInfo();
|
||||
|
||||
$ret .= $this->end('div');
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the Doctype table
|
||||
* @return string
|
||||
*/
|
||||
protected function renderDoctype()
|
||||
{
|
||||
$doctype = $this->def->doctype;
|
||||
$ret = '';
|
||||
$ret .= $this->start('table');
|
||||
$ret .= $this->element('caption', 'Doctype');
|
||||
$ret .= $this->row('Name', $doctype->name);
|
||||
$ret .= $this->row('XML', $doctype->xml ? 'Yes' : 'No');
|
||||
$ret .= $this->row('Default Modules', implode(', ', $doctype->modules));
|
||||
$ret .= $this->row('Default Tidy Modules', implode(', ', $doctype->tidyModules));
|
||||
$ret .= $this->end('table');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Renders environment table, which is miscellaneous info
|
||||
* @return string
|
||||
*/
|
||||
protected function renderEnvironment()
|
||||
{
|
||||
$def = $this->def;
|
||||
|
||||
$ret = '';
|
||||
|
||||
$ret .= $this->start('table');
|
||||
$ret .= $this->element('caption', 'Environment');
|
||||
|
||||
$ret .= $this->row('Parent of fragment', $def->info_parent);
|
||||
$ret .= $this->renderChildren($def->info_parent_def->child);
|
||||
$ret .= $this->row('Block wrap name', $def->info_block_wrapper);
|
||||
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Global attributes');
|
||||
$ret .= $this->element('td', $this->listifyAttr($def->info_global_attr), null, 0);
|
||||
$ret .= $this->end('tr');
|
||||
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Tag transforms');
|
||||
$list = array();
|
||||
foreach ($def->info_tag_transform as $old => $new) {
|
||||
$new = $this->getClass($new, 'TagTransform_');
|
||||
$list[] = "<$old> with $new";
|
||||
}
|
||||
$ret .= $this->element('td', $this->listify($list));
|
||||
$ret .= $this->end('tr');
|
||||
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Pre-AttrTransform');
|
||||
$ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_pre));
|
||||
$ret .= $this->end('tr');
|
||||
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Post-AttrTransform');
|
||||
$ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_post));
|
||||
$ret .= $this->end('tr');
|
||||
|
||||
$ret .= $this->end('table');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the Content Sets table
|
||||
* @return string
|
||||
*/
|
||||
protected function renderContentSets()
|
||||
{
|
||||
$ret = '';
|
||||
$ret .= $this->start('table');
|
||||
$ret .= $this->element('caption', 'Content Sets');
|
||||
foreach ($this->def->info_content_sets as $name => $lookup) {
|
||||
$ret .= $this->heavyHeader($name);
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('td', $this->listifyTagLookup($lookup));
|
||||
$ret .= $this->end('tr');
|
||||
}
|
||||
$ret .= $this->end('table');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the Elements ($info) table
|
||||
* @return string
|
||||
*/
|
||||
protected function renderInfo()
|
||||
{
|
||||
$ret = '';
|
||||
$ret .= $this->start('table');
|
||||
$ret .= $this->element('caption', 'Elements ($info)');
|
||||
ksort($this->def->info);
|
||||
$ret .= $this->heavyHeader('Allowed tags', 2);
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('td', $this->listifyTagLookup($this->def->info), array('colspan' => 2));
|
||||
$ret .= $this->end('tr');
|
||||
foreach ($this->def->info as $name => $def) {
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', "<$name>", array('class' => 'heavy', 'colspan' => 2));
|
||||
$ret .= $this->end('tr');
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Inline content');
|
||||
$ret .= $this->element('td', $def->descendants_are_inline ? 'Yes' : 'No');
|
||||
$ret .= $this->end('tr');
|
||||
if (!empty($def->excludes)) {
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Excludes');
|
||||
$ret .= $this->element('td', $this->listifyTagLookup($def->excludes));
|
||||
$ret .= $this->end('tr');
|
||||
}
|
||||
if (!empty($def->attr_transform_pre)) {
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Pre-AttrTransform');
|
||||
$ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_pre));
|
||||
$ret .= $this->end('tr');
|
||||
}
|
||||
if (!empty($def->attr_transform_post)) {
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Post-AttrTransform');
|
||||
$ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_post));
|
||||
$ret .= $this->end('tr');
|
||||
}
|
||||
if (!empty($def->auto_close)) {
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Auto closed by');
|
||||
$ret .= $this->element('td', $this->listifyTagLookup($def->auto_close));
|
||||
$ret .= $this->end('tr');
|
||||
}
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', 'Allowed attributes');
|
||||
$ret .= $this->element('td', $this->listifyAttr($def->attr), array(), 0);
|
||||
$ret .= $this->end('tr');
|
||||
|
||||
if (!empty($def->required_attr)) {
|
||||
$ret .= $this->row('Required attributes', $this->listify($def->required_attr));
|
||||
}
|
||||
|
||||
$ret .= $this->renderChildren($def->child);
|
||||
}
|
||||
$ret .= $this->end('table');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders a row describing the allowed children of an element
|
||||
* @param HTMLPurifier_ChildDef $def HTMLPurifier_ChildDef of pertinent element
|
||||
* @return string
|
||||
*/
|
||||
protected function renderChildren($def)
|
||||
{
|
||||
$context = new HTMLPurifier_Context();
|
||||
$ret = '';
|
||||
$ret .= $this->start('tr');
|
||||
$elements = array();
|
||||
$attr = array();
|
||||
if (isset($def->elements)) {
|
||||
if ($def->type == 'strictblockquote') {
|
||||
$def->validateChildren(array(), $this->config, $context);
|
||||
}
|
||||
$elements = $def->elements;
|
||||
}
|
||||
if ($def->type == 'chameleon') {
|
||||
$attr['rowspan'] = 2;
|
||||
} elseif ($def->type == 'empty') {
|
||||
$elements = array();
|
||||
} elseif ($def->type == 'table') {
|
||||
$elements = array_flip(
|
||||
array(
|
||||
'col',
|
||||
'caption',
|
||||
'colgroup',
|
||||
'thead',
|
||||
'tfoot',
|
||||
'tbody',
|
||||
'tr'
|
||||
)
|
||||
);
|
||||
}
|
||||
$ret .= $this->element('th', 'Allowed children', $attr);
|
||||
|
||||
if ($def->type == 'chameleon') {
|
||||
|
||||
$ret .= $this->element(
|
||||
'td',
|
||||
'<em>Block</em>: ' .
|
||||
$this->escape($this->listifyTagLookup($def->block->elements)),
|
||||
null,
|
||||
0
|
||||
);
|
||||
$ret .= $this->end('tr');
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element(
|
||||
'td',
|
||||
'<em>Inline</em>: ' .
|
||||
$this->escape($this->listifyTagLookup($def->inline->elements)),
|
||||
null,
|
||||
0
|
||||
);
|
||||
|
||||
} elseif ($def->type == 'custom') {
|
||||
|
||||
$ret .= $this->element(
|
||||
'td',
|
||||
'<em>' . ucfirst($def->type) . '</em>: ' .
|
||||
$def->dtd_regex
|
||||
);
|
||||
|
||||
} else {
|
||||
$ret .= $this->element(
|
||||
'td',
|
||||
'<em>' . ucfirst($def->type) . '</em>: ' .
|
||||
$this->escape($this->listifyTagLookup($elements)),
|
||||
null,
|
||||
0
|
||||
);
|
||||
}
|
||||
$ret .= $this->end('tr');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Listifies a tag lookup table.
|
||||
* @param array $array Tag lookup array in form of array('tagname' => true)
|
||||
* @return string
|
||||
*/
|
||||
protected function listifyTagLookup($array)
|
||||
{
|
||||
ksort($array);
|
||||
$list = array();
|
||||
foreach ($array as $name => $discard) {
|
||||
if ($name !== '#PCDATA' && !isset($this->def->info[$name])) {
|
||||
continue;
|
||||
}
|
||||
$list[] = $name;
|
||||
}
|
||||
return $this->listify($list);
|
||||
}
|
||||
|
||||
/**
|
||||
* Listifies a list of objects by retrieving class names and internal state
|
||||
* @param array $array List of objects
|
||||
* @return string
|
||||
* @todo Also add information about internal state
|
||||
*/
|
||||
protected function listifyObjectList($array)
|
||||
{
|
||||
ksort($array);
|
||||
$list = array();
|
||||
foreach ($array as $obj) {
|
||||
$list[] = $this->getClass($obj, 'AttrTransform_');
|
||||
}
|
||||
return $this->listify($list);
|
||||
}
|
||||
|
||||
/**
|
||||
* Listifies a hash of attributes to AttrDef classes
|
||||
* @param array $array Array hash in form of array('attrname' => HTMLPurifier_AttrDef)
|
||||
* @return string
|
||||
*/
|
||||
protected function listifyAttr($array)
|
||||
{
|
||||
ksort($array);
|
||||
$list = array();
|
||||
foreach ($array as $name => $obj) {
|
||||
if ($obj === false) {
|
||||
continue;
|
||||
}
|
||||
$list[] = "$name = <i>" . $this->getClass($obj, 'AttrDef_') . '</i>';
|
||||
}
|
||||
return $this->listify($list);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a heavy header row
|
||||
* @param string $text
|
||||
* @param int $num
|
||||
* @return string
|
||||
*/
|
||||
protected function heavyHeader($text, $num = 1)
|
||||
{
|
||||
$ret = '';
|
||||
$ret .= $this->start('tr');
|
||||
$ret .= $this->element('th', $text, array('colspan' => $num, 'class' => 'heavy'));
|
||||
$ret .= $this->end('tr');
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
|
||||
Reference in New Issue
Block a user