mirror of
https://github.com/moodle/moodle.git
synced 2025-07-25 00:02:18 +02:00
Prior to this change, all the line endings in the imported HTMLPurifier library were using CRLF (\r\n aka Windows style), but the HTMLPurifier source and also the downloadable artefacts use LF (\n aka Linux style) as line endings. This has been the case since510d190382
when with the commit "MDL-38672 import HTML Purifier 4.5.0" all line endings were changed from LF to CRLF. There was no comment in the commit on why this change was done. As the original source uses LF, this commit partly reverts510d190382
and goes back to LF as line endings. Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
149 lines
4.7 KiB
PHP
149 lines
4.7 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Defines common attribute collections that modules reference
|
|
*/
|
|
|
|
class HTMLPurifier_AttrCollections
|
|
{
|
|
|
|
/**
|
|
* Associative array of attribute collections, indexed by name.
|
|
* @type array
|
|
*/
|
|
public $info = array();
|
|
|
|
/**
|
|
* Performs all expansions on internal data for use by other inclusions
|
|
* It also collects all attribute collection extensions from
|
|
* modules
|
|
* @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
|
|
* @param HTMLPurifier_HTMLModule[] $modules Hash array of HTMLPurifier_HTMLModule members
|
|
*/
|
|
public function __construct($attr_types, $modules)
|
|
{
|
|
$this->doConstruct($attr_types, $modules);
|
|
}
|
|
|
|
public function doConstruct($attr_types, $modules)
|
|
{
|
|
// load extensions from the modules
|
|
foreach ($modules as $module) {
|
|
foreach ($module->attr_collections as $coll_i => $coll) {
|
|
if (!isset($this->info[$coll_i])) {
|
|
$this->info[$coll_i] = array();
|
|
}
|
|
foreach ($coll as $attr_i => $attr) {
|
|
if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) {
|
|
// merge in includes
|
|
$this->info[$coll_i][$attr_i] = array_merge(
|
|
$this->info[$coll_i][$attr_i],
|
|
$attr
|
|
);
|
|
continue;
|
|
}
|
|
$this->info[$coll_i][$attr_i] = $attr;
|
|
}
|
|
}
|
|
}
|
|
// perform internal expansions and inclusions
|
|
foreach ($this->info as $name => $attr) {
|
|
// merge attribute collections that include others
|
|
$this->performInclusions($this->info[$name]);
|
|
// replace string identifiers with actual attribute objects
|
|
$this->expandIdentifiers($this->info[$name], $attr_types);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Takes a reference to an attribute associative array and performs
|
|
* all inclusions specified by the zero index.
|
|
* @param array &$attr Reference to attribute array
|
|
*/
|
|
public function performInclusions(&$attr)
|
|
{
|
|
if (!isset($attr[0])) {
|
|
return;
|
|
}
|
|
$merge = $attr[0];
|
|
$seen = array(); // recursion guard
|
|
// loop through all the inclusions
|
|
for ($i = 0; isset($merge[$i]); $i++) {
|
|
if (isset($seen[$merge[$i]])) {
|
|
continue;
|
|
}
|
|
$seen[$merge[$i]] = true;
|
|
// foreach attribute of the inclusion, copy it over
|
|
if (!isset($this->info[$merge[$i]])) {
|
|
continue;
|
|
}
|
|
foreach ($this->info[$merge[$i]] as $key => $value) {
|
|
if (isset($attr[$key])) {
|
|
continue;
|
|
} // also catches more inclusions
|
|
$attr[$key] = $value;
|
|
}
|
|
if (isset($this->info[$merge[$i]][0])) {
|
|
// recursion
|
|
$merge = array_merge($merge, $this->info[$merge[$i]][0]);
|
|
}
|
|
}
|
|
unset($attr[0]);
|
|
}
|
|
|
|
/**
|
|
* Expands all string identifiers in an attribute array by replacing
|
|
* them with the appropriate values inside HTMLPurifier_AttrTypes
|
|
* @param array &$attr Reference to attribute array
|
|
* @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
|
|
*/
|
|
public function expandIdentifiers(&$attr, $attr_types)
|
|
{
|
|
// because foreach will process new elements we add, make sure we
|
|
// skip duplicates
|
|
$processed = array();
|
|
|
|
foreach ($attr as $def_i => $def) {
|
|
// skip inclusions
|
|
if ($def_i === 0) {
|
|
continue;
|
|
}
|
|
|
|
if (isset($processed[$def_i])) {
|
|
continue;
|
|
}
|
|
|
|
// determine whether or not attribute is required
|
|
if ($required = (strpos($def_i, '*') !== false)) {
|
|
// rename the definition
|
|
unset($attr[$def_i]);
|
|
$def_i = trim($def_i, '*');
|
|
$attr[$def_i] = $def;
|
|
}
|
|
|
|
$processed[$def_i] = true;
|
|
|
|
// if we've already got a literal object, move on
|
|
if (is_object($def)) {
|
|
// preserve previous required
|
|
$attr[$def_i]->required = ($required || $attr[$def_i]->required);
|
|
continue;
|
|
}
|
|
|
|
if ($def === false) {
|
|
unset($attr[$def_i]);
|
|
continue;
|
|
}
|
|
|
|
if ($t = $attr_types->get($def)) {
|
|
$attr[$def_i] = $t;
|
|
$attr[$def_i]->required = $required;
|
|
} else {
|
|
unset($attr[$def_i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// vim: et sw=4 sts=4
|