From 8ea537123d1cef38f25f9fbe92e3a9c0f89de55a Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 13 Dec 2022 20:08:43 +0300 Subject: move af_readability out of master tree --- .../masterminds/html5/src/HTML5/Elements.php | 619 ------ .../masterminds/html5/src/HTML5/Entities.php | 2236 -------------------- .../masterminds/html5/src/HTML5/Exception.php | 10 - .../html5/src/HTML5/InstructionProcessor.php | 41 - .../html5/src/HTML5/Parser/CharacterReference.php | 61 - .../html5/src/HTML5/Parser/DOMTreeBuilder.php | 705 ------ .../html5/src/HTML5/Parser/EventHandler.php | 114 - .../html5/src/HTML5/Parser/FileInputStream.php | 33 - .../html5/src/HTML5/Parser/InputStream.php | 87 - .../html5/src/HTML5/Parser/ParseError.php | 10 - .../masterminds/html5/src/HTML5/Parser/README.md | 53 - .../masterminds/html5/src/HTML5/Parser/Scanner.php | 416 ---- .../html5/src/HTML5/Parser/StringInputStream.php | 336 --- .../html5/src/HTML5/Parser/Tokenizer.php | 1191 ----------- .../html5/src/HTML5/Parser/TreeBuildingRules.php | 127 -- .../html5/src/HTML5/Parser/UTF8Utils.php | 183 -- .../html5/src/HTML5/Serializer/HTML5Entities.php | 1533 -------------- .../html5/src/HTML5/Serializer/OutputRules.php | 553 ----- .../html5/src/HTML5/Serializer/README.md | 33 - .../html5/src/HTML5/Serializer/RulesInterface.php | 99 - .../html5/src/HTML5/Serializer/Traverser.php | 142 -- 21 files changed, 8582 deletions(-) delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Elements.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Entities.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Exception.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/InstructionProcessor.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/CharacterReference.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/DOMTreeBuilder.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/InputStream.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/ParseError.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/README.md delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/Scanner.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/README.md delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php delete mode 100644 plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/Traverser.php (limited to 'plugins/af_readability/vendor/masterminds/html5/src/HTML5') diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Elements.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Elements.php deleted file mode 100644 index 8fe798789..000000000 --- a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Elements.php +++ /dev/null @@ -1,619 +0,0 @@ - 1, - 'abbr' => 1, - 'address' => 65, // NORMAL | BLOCK_TAG - 'area' => 9, // NORMAL | VOID_TAG - 'article' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'aside' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'audio' => 1, // NORMAL - 'b' => 1, - 'base' => 9, // NORMAL | VOID_TAG - 'bdi' => 1, - 'bdo' => 1, - 'blockquote' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'body' => 1, - 'br' => 9, // NORMAL | VOID_TAG - 'button' => 1, - 'canvas' => 65, // NORMAL | BLOCK_TAG - 'caption' => 1, - 'cite' => 1, - 'code' => 1, - 'col' => 9, // NORMAL | VOID_TAG - 'colgroup' => 1, - 'command' => 9, // NORMAL | VOID_TAG - // "data" => 1, // This is highly experimental and only part of the whatwg spec (not w3c). See https://developer.mozilla.org/en-US/docs/HTML/Element/data - 'datalist' => 1, - 'dd' => 65, // NORMAL | BLOCK_TAG - 'del' => 1, - 'details' => 17, // NORMAL | AUTOCLOSE_P, - 'dfn' => 1, - 'dialog' => 17, // NORMAL | AUTOCLOSE_P, - 'div' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'dl' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'dt' => 1, - 'em' => 1, - 'embed' => 9, // NORMAL | VOID_TAG - 'fieldset' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'figcaption' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'figure' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'footer' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'form' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'h1' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'h2' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'h3' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'h4' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'h5' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'h6' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'head' => 1, - 'header' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'hgroup' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'hr' => 73, // NORMAL | VOID_TAG - 'html' => 1, - 'i' => 1, - 'iframe' => 3, // NORMAL | TEXT_RAW - 'img' => 9, // NORMAL | VOID_TAG - 'input' => 9, // NORMAL | VOID_TAG - 'kbd' => 1, - 'ins' => 1, - 'keygen' => 9, // NORMAL | VOID_TAG - 'label' => 1, - 'legend' => 1, - 'li' => 1, - 'link' => 9, // NORMAL | VOID_TAG - 'map' => 1, - 'mark' => 1, - 'menu' => 17, // NORMAL | AUTOCLOSE_P, - 'meta' => 9, // NORMAL | VOID_TAG - 'meter' => 1, - 'nav' => 17, // NORMAL | AUTOCLOSE_P, - 'noscript' => 65, // NORMAL | BLOCK_TAG - 'object' => 1, - 'ol' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'optgroup' => 1, - 'option' => 1, - 'output' => 65, // NORMAL | BLOCK_TAG - 'p' => 209, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | BLOCK_ONLY_INLINE - 'param' => 9, // NORMAL | VOID_TAG - 'pre' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'progress' => 1, - 'q' => 1, - 'rp' => 1, - 'rt' => 1, - 'ruby' => 1, - 's' => 1, - 'samp' => 1, - 'script' => 3, // NORMAL | TEXT_RAW - 'section' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'select' => 1, - 'small' => 1, - 'source' => 9, // NORMAL | VOID_TAG - 'span' => 1, - 'strong' => 1, - 'style' => 3, // NORMAL | TEXT_RAW - 'sub' => 1, - 'summary' => 17, // NORMAL | AUTOCLOSE_P, - 'sup' => 1, - 'table' => 65, // NORMAL | BLOCK_TAG - 'tbody' => 1, - 'td' => 1, - 'textarea' => 5, // NORMAL | TEXT_RCDATA - 'tfoot' => 65, // NORMAL | BLOCK_TAG - 'th' => 1, - 'thead' => 1, - 'time' => 1, - 'title' => 5, // NORMAL | TEXT_RCDATA - 'tr' => 1, - 'track' => 9, // NORMAL | VOID_TAG - 'u' => 1, - 'ul' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG - 'var' => 1, - 'video' => 65, // NORMAL | BLOCK_TAG - 'wbr' => 9, // NORMAL | VOID_TAG - - // Legacy? - 'basefont' => 8, // VOID_TAG - 'bgsound' => 8, // VOID_TAG - 'noframes' => 2, // RAW_TEXT - 'frame' => 9, // NORMAL | VOID_TAG - 'frameset' => 1, - 'center' => 16, - 'dir' => 16, - 'listing' => 16, // AUTOCLOSE_P - 'plaintext' => 48, // AUTOCLOSE_P | TEXT_PLAINTEXT - 'applet' => 0, - 'marquee' => 0, - 'isindex' => 8, // VOID_TAG - 'xmp' => 20, // AUTOCLOSE_P | VOID_TAG | RAW_TEXT - 'noembed' => 2, // RAW_TEXT - ); - - /** - * The MathML elements. - * See http://www.w3.org/wiki/MathML/Elements. - * - * In our case we are only concerned with presentation MathML and not content - * MathML. There is a nice list of this subset at https://developer.mozilla.org/en-US/docs/MathML/Element. - * - * @var array - */ - public static $mathml = array( - 'maction' => 1, - 'maligngroup' => 1, - 'malignmark' => 1, - 'math' => 1, - 'menclose' => 1, - 'merror' => 1, - 'mfenced' => 1, - 'mfrac' => 1, - 'mglyph' => 1, - 'mi' => 1, - 'mlabeledtr' => 1, - 'mlongdiv' => 1, - 'mmultiscripts' => 1, - 'mn' => 1, - 'mo' => 1, - 'mover' => 1, - 'mpadded' => 1, - 'mphantom' => 1, - 'mroot' => 1, - 'mrow' => 1, - 'ms' => 1, - 'mscarries' => 1, - 'mscarry' => 1, - 'msgroup' => 1, - 'msline' => 1, - 'mspace' => 1, - 'msqrt' => 1, - 'msrow' => 1, - 'mstack' => 1, - 'mstyle' => 1, - 'msub' => 1, - 'msup' => 1, - 'msubsup' => 1, - 'mtable' => 1, - 'mtd' => 1, - 'mtext' => 1, - 'mtr' => 1, - 'munder' => 1, - 'munderover' => 1, - ); - - /** - * The svg elements. - * - * The Mozilla documentation has a good list at https://developer.mozilla.org/en-US/docs/SVG/Element. - * The w3c list appears to be lacking in some areas like filter effect elements. - * That list can be found at http://www.w3.org/wiki/SVG/Elements. - * - * Note, FireFox appears to do a better job rendering filter effects than chrome. - * While they are in the spec I'm not sure how widely implemented they are. - * - * @var array - */ - public static $svg = array( - 'a' => 1, - 'altGlyph' => 1, - 'altGlyphDef' => 1, - 'altGlyphItem' => 1, - 'animate' => 1, - 'animateColor' => 1, - 'animateMotion' => 1, - 'animateTransform' => 1, - 'circle' => 1, - 'clipPath' => 1, - 'color-profile' => 1, - 'cursor' => 1, - 'defs' => 1, - 'desc' => 1, - 'ellipse' => 1, - 'feBlend' => 1, - 'feColorMatrix' => 1, - 'feComponentTransfer' => 1, - 'feComposite' => 1, - 'feConvolveMatrix' => 1, - 'feDiffuseLighting' => 1, - 'feDisplacementMap' => 1, - 'feDistantLight' => 1, - 'feFlood' => 1, - 'feFuncA' => 1, - 'feFuncB' => 1, - 'feFuncG' => 1, - 'feFuncR' => 1, - 'feGaussianBlur' => 1, - 'feImage' => 1, - 'feMerge' => 1, - 'feMergeNode' => 1, - 'feMorphology' => 1, - 'feOffset' => 1, - 'fePointLight' => 1, - 'feSpecularLighting' => 1, - 'feSpotLight' => 1, - 'feTile' => 1, - 'feTurbulence' => 1, - 'filter' => 1, - 'font' => 1, - 'font-face' => 1, - 'font-face-format' => 1, - 'font-face-name' => 1, - 'font-face-src' => 1, - 'font-face-uri' => 1, - 'foreignObject' => 1, - 'g' => 1, - 'glyph' => 1, - 'glyphRef' => 1, - 'hkern' => 1, - 'image' => 1, - 'line' => 1, - 'linearGradient' => 1, - 'marker' => 1, - 'mask' => 1, - 'metadata' => 1, - 'missing-glyph' => 1, - 'mpath' => 1, - 'path' => 1, - 'pattern' => 1, - 'polygon' => 1, - 'polyline' => 1, - 'radialGradient' => 1, - 'rect' => 1, - 'script' => 3, // NORMAL | RAW_TEXT - 'set' => 1, - 'stop' => 1, - 'style' => 3, // NORMAL | RAW_TEXT - 'svg' => 1, - 'switch' => 1, - 'symbol' => 1, - 'text' => 1, - 'textPath' => 1, - 'title' => 1, - 'tref' => 1, - 'tspan' => 1, - 'use' => 1, - 'view' => 1, - 'vkern' => 1, - ); - - /** - * Some attributes in SVG are case sensitive. - * - * This map contains key/value pairs with the key as the lowercase attribute - * name and the value with the correct casing. - */ - public static $svgCaseSensitiveAttributeMap = array( - 'attributename' => 'attributeName', - 'attributetype' => 'attributeType', - 'basefrequency' => 'baseFrequency', - 'baseprofile' => 'baseProfile', - 'calcmode' => 'calcMode', - 'clippathunits' => 'clipPathUnits', - 'contentscripttype' => 'contentScriptType', - 'contentstyletype' => 'contentStyleType', - 'diffuseconstant' => 'diffuseConstant', - 'edgemode' => 'edgeMode', - 'externalresourcesrequired' => 'externalResourcesRequired', - 'filterres' => 'filterRes', - 'filterunits' => 'filterUnits', - 'glyphref' => 'glyphRef', - 'gradienttransform' => 'gradientTransform', - 'gradientunits' => 'gradientUnits', - 'kernelmatrix' => 'kernelMatrix', - 'kernelunitlength' => 'kernelUnitLength', - 'keypoints' => 'keyPoints', - 'keysplines' => 'keySplines', - 'keytimes' => 'keyTimes', - 'lengthadjust' => 'lengthAdjust', - 'limitingconeangle' => 'limitingConeAngle', - 'markerheight' => 'markerHeight', - 'markerunits' => 'markerUnits', - 'markerwidth' => 'markerWidth', - 'maskcontentunits' => 'maskContentUnits', - 'maskunits' => 'maskUnits', - 'numoctaves' => 'numOctaves', - 'pathlength' => 'pathLength', - 'patterncontentunits' => 'patternContentUnits', - 'patterntransform' => 'patternTransform', - 'patternunits' => 'patternUnits', - 'pointsatx' => 'pointsAtX', - 'pointsaty' => 'pointsAtY', - 'pointsatz' => 'pointsAtZ', - 'preservealpha' => 'preserveAlpha', - 'preserveaspectratio' => 'preserveAspectRatio', - 'primitiveunits' => 'primitiveUnits', - 'refx' => 'refX', - 'refy' => 'refY', - 'repeatcount' => 'repeatCount', - 'repeatdur' => 'repeatDur', - 'requiredextensions' => 'requiredExtensions', - 'requiredfeatures' => 'requiredFeatures', - 'specularconstant' => 'specularConstant', - 'specularexponent' => 'specularExponent', - 'spreadmethod' => 'spreadMethod', - 'startoffset' => 'startOffset', - 'stddeviation' => 'stdDeviation', - 'stitchtiles' => 'stitchTiles', - 'surfacescale' => 'surfaceScale', - 'systemlanguage' => 'systemLanguage', - 'tablevalues' => 'tableValues', - 'targetx' => 'targetX', - 'targety' => 'targetY', - 'textlength' => 'textLength', - 'viewbox' => 'viewBox', - 'viewtarget' => 'viewTarget', - 'xchannelselector' => 'xChannelSelector', - 'ychannelselector' => 'yChannelSelector', - 'zoomandpan' => 'zoomAndPan', - ); - - /** - * Some SVG elements are case sensitive. - * This map contains these. - * - * The map contains key/value store of the name is lowercase as the keys and - * the correct casing as the value. - */ - public static $svgCaseSensitiveElementMap = array( - 'altglyph' => 'altGlyph', - 'altglyphdef' => 'altGlyphDef', - 'altglyphitem' => 'altGlyphItem', - 'animatecolor' => 'animateColor', - 'animatemotion' => 'animateMotion', - 'animatetransform' => 'animateTransform', - 'clippath' => 'clipPath', - 'feblend' => 'feBlend', - 'fecolormatrix' => 'feColorMatrix', - 'fecomponenttransfer' => 'feComponentTransfer', - 'fecomposite' => 'feComposite', - 'feconvolvematrix' => 'feConvolveMatrix', - 'fediffuselighting' => 'feDiffuseLighting', - 'fedisplacementmap' => 'feDisplacementMap', - 'fedistantlight' => 'feDistantLight', - 'feflood' => 'feFlood', - 'fefunca' => 'feFuncA', - 'fefuncb' => 'feFuncB', - 'fefuncg' => 'feFuncG', - 'fefuncr' => 'feFuncR', - 'fegaussianblur' => 'feGaussianBlur', - 'feimage' => 'feImage', - 'femerge' => 'feMerge', - 'femergenode' => 'feMergeNode', - 'femorphology' => 'feMorphology', - 'feoffset' => 'feOffset', - 'fepointlight' => 'fePointLight', - 'fespecularlighting' => 'feSpecularLighting', - 'fespotlight' => 'feSpotLight', - 'fetile' => 'feTile', - 'feturbulence' => 'feTurbulence', - 'foreignobject' => 'foreignObject', - 'glyphref' => 'glyphRef', - 'lineargradient' => 'linearGradient', - 'radialgradient' => 'radialGradient', - 'textpath' => 'textPath', - ); - - /** - * Check whether the given element meets the given criterion. - * - * Example: - * - * Elements::isA('script', Elements::TEXT_RAW); // Returns true. - * - * Elements::isA('script', Elements::TEXT_RCDATA); // Returns false. - * - * @param string $name The element name. - * @param int $mask One of the constants on this class. - * - * @return bool true if the element matches the mask, false otherwise. - */ - public static function isA($name, $mask) - { - return (static::element($name) & $mask) === $mask; - } - - /** - * Test if an element is a valid html5 element. - * - * @param string $name The name of the element. - * - * @return bool true if a html5 element and false otherwise. - */ - public static function isHtml5Element($name) - { - // html5 element names are case insensitive. Forcing lowercase for the check. - // Do we need this check or will all data passed here already be lowercase? - return isset(static::$html5[strtolower($name)]); - } - - /** - * Test if an element name is a valid MathML presentation element. - * - * @param string $name The name of the element. - * - * @return bool true if a MathML name and false otherwise. - */ - public static function isMathMLElement($name) - { - // MathML is case-sensitive unlike html5 elements. - return isset(static::$mathml[$name]); - } - - /** - * Test if an element is a valid SVG element. - * - * @param string $name The name of the element. - * - * @return bool true if a SVG element and false otherise. - */ - public static function isSvgElement($name) - { - // SVG is case-sensitive unlike html5 elements. - return isset(static::$svg[$name]); - } - - /** - * Is an element name valid in an html5 document. - * This includes html5 elements along with other allowed embedded content - * such as svg and mathml. - * - * @param string $name The name of the element. - * - * @return bool true if valid and false otherwise. - */ - public static function isElement($name) - { - return static::isHtml5Element($name) || static::isMathMLElement($name) || static::isSvgElement($name); - } - - /** - * Get the element mask for the given element name. - * - * @param string $name The name of the element. - * - * @return int the element mask. - */ - public static function element($name) - { - if (isset(static::$html5[$name])) { - return static::$html5[$name]; - } - if (isset(static::$svg[$name])) { - return static::$svg[$name]; - } - if (isset(static::$mathml[$name])) { - return static::$mathml[$name]; - } - - return 0; - } - - /** - * Normalize a SVG element name to its proper case and form. - * - * @param string $name The name of the element. - * - * @return string the normalized form of the element name. - */ - public static function normalizeSvgElement($name) - { - $name = strtolower($name); - if (isset(static::$svgCaseSensitiveElementMap[$name])) { - $name = static::$svgCaseSensitiveElementMap[$name]; - } - - return $name; - } - - /** - * Normalize a SVG attribute name to its proper case and form. - * - * @param string $name The name of the attribute. - * - * @return string The normalized form of the attribute name. - */ - public static function normalizeSvgAttribute($name) - { - $name = strtolower($name); - if (isset(static::$svgCaseSensitiveAttributeMap[$name])) { - $name = static::$svgCaseSensitiveAttributeMap[$name]; - } - - return $name; - } - - /** - * Normalize a MathML attribute name to its proper case and form. - * Note, all MathML element names are lowercase. - * - * @param string $name The name of the attribute. - * - * @return string The normalized form of the attribute name. - */ - public static function normalizeMathMlAttribute($name) - { - $name = strtolower($name); - - // Only one attribute has a mixed case form for MathML. - if ('definitionurl' === $name) { - $name = 'definitionURL'; - } - - return $name; - } -} diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Entities.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Entities.php deleted file mode 100644 index 0e7227dc1..000000000 --- a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Entities.php +++ /dev/null @@ -1,2236 +0,0 @@ - 'Á', - 'Aacut' => 'Á', - 'aacute' => 'á', - 'aacut' => 'á', - 'Abreve' => 'Ă', - 'abreve' => 'ă', - 'ac' => '∾', - 'acd' => '∿', - 'acE' => '∾̳', - 'Acirc' => 'Â', - 'Acir' => 'Â', - 'acirc' => 'â', - 'acir' => 'â', - 'acute' => '´', - 'acut' => '´', - 'Acy' => 'А', - 'acy' => 'а', - 'AElig' => 'Æ', - 'AEli' => 'Æ', - 'aelig' => 'æ', - 'aeli' => 'æ', - 'af' => '⁡', - 'Afr' => '𝔄', - 'afr' => '𝔞', - 'Agrave' => 'À', - 'Agrav' => 'À', - 'agrave' => 'à', - 'agrav' => 'à', - 'alefsym' => 'ℵ', - 'aleph' => 'ℵ', - 'Alpha' => 'Α', - 'alpha' => 'α', - 'Amacr' => 'Ā', - 'amacr' => 'ā', - 'amalg' => '⨿', - 'AMP' => '&', - 'AM' => '&', - 'amp' => '&', - 'am' => '&', - 'And' => '⩓', - 'and' => '∧', - 'andand' => '⩕', - 'andd' => '⩜', - 'andslope' => '⩘', - 'andv' => '⩚', - 'ang' => '∠', - 'ange' => '⦤', - 'angle' => '∠', - 'angmsd' => '∡', - 'angmsdaa' => '⦨', - 'angmsdab' => '⦩', - 'angmsdac' => '⦪', - 'angmsdad' => '⦫', - 'angmsdae' => '⦬', - 'angmsdaf' => '⦭', - 'angmsdag' => '⦮', - 'angmsdah' => '⦯', - 'angrt' => '∟', - 'angrtvb' => '⊾', - 'angrtvbd' => '⦝', - 'angsph' => '∢', - 'angst' => 'Å', - 'angzarr' => '⍼', - 'Aogon' => 'Ą', - 'aogon' => 'ą', - 'Aopf' => '𝔸', - 'aopf' => '𝕒', - 'ap' => '≈', - 'apacir' => '⩯', - 'apE' => '⩰', - 'ape' => '≊', - 'apid' => '≋', - 'apos' => '\'', - 'ApplyFunction' => '⁡', - 'approx' => '≈', - 'approxeq' => '≊', - 'Aring' => 'Å', - 'Arin' => 'Å', - 'aring' => 'å', - 'arin' => 'å', - 'Ascr' => '𝒜', - 'ascr' => '𝒶', - 'Assign' => '≔', - 'ast' => '*', - 'asymp' => '≈', - 'asympeq' => '≍', - 'Atilde' => 'Ã', - 'Atild' => 'Ã', - 'atilde' => 'ã', - 'atild' => 'ã', - 'Auml' => 'Ä', - 'Aum' => 'Ä', - 'auml' => 'ä', - 'aum' => 'ä', - 'awconint' => '∳', - 'awint' => '⨑', - 'backcong' => '≌', - 'backepsilon' => '϶', - 'backprime' => '‵', - 'backsim' => '∽', - 'backsimeq' => '⋍', - 'Backslash' => '∖', - 'Barv' => '⫧', - 'barvee' => '⊽', - 'Barwed' => '⌆', - 'barwed' => '⌅', - 'barwedge' => '⌅', - 'bbrk' => '⎵', - 'bbrktbrk' => '⎶', - 'bcong' => '≌', - 'Bcy' => 'Б', - 'bcy' => 'б', - 'bdquo' => '„', - 'becaus' => '∵', - 'Because' => '∵', - 'because' => '∵', - 'bemptyv' => '⦰', - 'bepsi' => '϶', - 'bernou' => 'ℬ', - 'Bernoullis' => 'ℬ', - 'Beta' => 'Β', - 'beta' => 'β', - 'beth' => 'ℶ', - 'between' => '≬', - 'Bfr' => '𝔅', - 'bfr' => '𝔟', - 'bigcap' => '⋂', - 'bigcirc' => '◯', - 'bigcup' => '⋃', - 'bigodot' => '⨀', - 'bigoplus' => '⨁', - 'bigotimes' => '⨂', - 'bigsqcup' => '⨆', - 'bigstar' => '★', - 'bigtriangledown' => '▽', - 'bigtriangleup' => '△', - 'biguplus' => '⨄', - 'bigvee' => '⋁', - 'bigwedge' => '⋀', - 'bkarow' => '⤍', - 'blacklozenge' => '⧫', - 'blacksquare' => '▪', - 'blacktriangle' => '▴', - 'blacktriangledown' => '▾', - 'blacktriangleleft' => '◂', - 'blacktriangleright' => '▸', - 'blank' => '␣', - 'blk12' => '▒', - 'blk14' => '░', - 'blk34' => '▓', - 'block' => '█', - 'bne' => '=⃥', - 'bnequiv' => '≡⃥', - 'bNot' => '⫭', - 'bnot' => '⌐', - 'Bopf' => '𝔹', - 'bopf' => '𝕓', - 'bot' => '⊥', - 'bottom' => '⊥', - 'bowtie' => '⋈', - 'boxbox' => '⧉', - 'boxDL' => '╗', - 'boxDl' => '╖', - 'boxdL' => '╕', - 'boxdl' => '┐', - 'boxDR' => '╔', - 'boxDr' => '╓', - 'boxdR' => '╒', - 'boxdr' => '┌', - 'boxH' => '═', - 'boxh' => '─', - 'boxHD' => '╦', - 'boxHd' => '╤', - 'boxhD' => '╥', - 'boxhd' => '┬', - 'boxHU' => '╩', - 'boxHu' => '╧', - 'boxhU' => '╨', - 'boxhu' => '┴', - 'boxminus' => '⊟', - 'boxplus' => '⊞', - 'boxtimes' => '⊠', - 'boxUL' => '╝', - 'boxUl' => '╜', - 'boxuL' => '╛', - 'boxul' => '┘', - 'boxUR' => '╚', - 'boxUr' => '╙', - 'boxuR' => '╘', - 'boxur' => '└', - 'boxV' => '║', - 'boxv' => '│', - 'boxVH' => '╬', - 'boxVh' => '╫', - 'boxvH' => '╪', - 'boxvh' => '┼', - 'boxVL' => '╣', - 'boxVl' => '╢', - 'boxvL' => '╡', - 'boxvl' => '┤', - 'boxVR' => '╠', - 'boxVr' => '╟', - 'boxvR' => '╞', - 'boxvr' => '├', - 'bprime' => '‵', - 'Breve' => '˘', - 'breve' => '˘', - 'brvbar' => '¦', - 'brvba' => '¦', - 'Bscr' => 'ℬ', - 'bscr' => '𝒷', - 'bsemi' => '⁏', - 'bsim' => '∽', - 'bsime' => '⋍', - 'bsol' => '\\', - 'bsolb' => '⧅', - 'bsolhsub' => '⟈', - 'bull' => '•', - 'bullet' => '•', - 'bump' => '≎', - 'bumpE' => '⪮', - 'bumpe' => '≏', - 'Bumpeq' => '≎', - 'bumpeq' => '≏', - 'Cacute' => 'Ć', - 'cacute' => 'ć', - 'Cap' => '⋒', - 'cap' => '∩', - 'capand' => '⩄', - 'capbrcup' => '⩉', - 'capcap' => '⩋', - 'capcup' => '⩇', - 'capdot' => '⩀', - 'CapitalDifferentialD' => 'ⅅ', - 'caps' => '∩︀', - 'caret' => '⁁', - 'caron' => 'ˇ', - 'Cayleys' => 'ℭ', - 'ccaps' => '⩍', - 'Ccaron' => 'Č', - 'ccaron' => 'č', - 'Ccedil' => 'Ç', - 'Ccedi' => 'Ç', - 'ccedil' => 'ç', - 'ccedi' => 'ç', - 'Ccirc' => 'Ĉ', - 'ccirc' => 'ĉ', - 'Cconint' => '∰', - 'ccups' => '⩌', - 'ccupssm' => '⩐', - 'Cdot' => 'Ċ', - 'cdot' => 'ċ', - 'cedil' => '¸', - 'cedi' => '¸', - 'Cedilla' => '¸', - 'cemptyv' => '⦲', - 'cent' => '¢', - 'cen' => '¢', - 'CenterDot' => '·', - 'centerdot' => '·', - 'Cfr' => 'ℭ', - 'cfr' => '𝔠', - 'CHcy' => 'Ч', - 'chcy' => 'ч', - 'check' => '✓', - 'checkmark' => '✓', - 'Chi' => 'Χ', - 'chi' => 'χ', - 'cir' => '○', - 'circ' => 'ˆ', - 'circeq' => '≗', - 'circlearrowleft' => '↺', - 'circlearrowright' => '↻', - 'circledast' => '⊛', - 'circledcirc' => '⊚', - 'circleddash' => '⊝', - 'CircleDot' => '⊙', - 'circledR' => '®', - 'circledS' => 'Ⓢ', - 'CircleMinus' => '⊖', - 'CirclePlus' => '⊕', - 'CircleTimes' => '⊗', - 'cirE' => '⧃', - 'cire' => '≗', - 'cirfnint' => '⨐', - 'cirmid' => '⫯', - 'cirscir' => '⧂', - 'ClockwiseContourIntegral' => '∲', - 'CloseCurlyDoubleQuote' => '”', - 'CloseCurlyQuote' => '’', - 'clubs' => '♣', - 'clubsuit' => '♣', - 'Colon' => '∷', - 'colon' => ':', - 'Colone' => '⩴', - 'colone' => '≔', - 'coloneq' => '≔', - 'comma' => ',', - 'commat' => '@', - 'comp' => '∁', - 'compfn' => '∘', - 'complement' => '∁', - 'complexes' => 'ℂ', - 'cong' => '≅', - 'congdot' => '⩭', - 'Congruent' => '≡', - 'Conint' => '∯', - 'conint' => '∮', - 'ContourIntegral' => '∮', - 'Copf' => 'ℂ', - 'copf' => '𝕔', - 'coprod' => '∐', - 'Coproduct' => '∐', - 'COPY' => '©', - 'COP' => '©', - 'copy' => '©', - 'cop' => '©', - 'copysr' => '℗', - 'CounterClockwiseContourIntegral' => '∳', - 'crarr' => '↵', - 'Cross' => '⨯', - 'cross' => '✗', - 'Cscr' => '𝒞', - 'cscr' => '𝒸', - 'csub' => '⫏', - 'csube' => '⫑', - 'csup' => '⫐', - 'csupe' => '⫒', - 'ctdot' => '⋯', - 'cudarrl' => '⤸', - 'cudarrr' => '⤵', - 'cuepr' => '⋞', - 'cuesc' => '⋟', - 'cularr' => '↶', - 'cularrp' => '⤽', - 'Cup' => '⋓', - 'cup' => '∪', - 'cupbrcap' => '⩈', - 'CupCap' => '≍', - 'cupcap' => '⩆', - 'cupcup' => '⩊', - 'cupdot' => '⊍', - 'cupor' => '⩅', - 'cups' => '∪︀', - 'curarr' => '↷', - 'curarrm' => '⤼', - 'curlyeqprec' => '⋞', - 'curlyeqsucc' => '⋟', - 'curlyvee' => '⋎', - 'curlywedge' => '⋏', - 'curren' => '¤', - 'curre' => '¤', - 'curvearrowleft' => '↶', - 'curvearrowright' => '↷', - 'cuvee' => '⋎', - 'cuwed' => '⋏', - 'cwconint' => '∲', - 'cwint' => '∱', - 'cylcty' => '⌭', - 'Dagger' => '‡', - 'dagger' => '†', - 'daleth' => 'ℸ', - 'Darr' => '↡', - 'dArr' => '⇓', - 'darr' => '↓', - 'dash' => '‐', - 'Dashv' => '⫤', - 'dashv' => '⊣', - 'dbkarow' => '⤏', - 'dblac' => '˝', - 'Dcaron' => 'Ď', - 'dcaron' => 'ď', - 'Dcy' => 'Д', - 'dcy' => 'д', - 'DD' => 'ⅅ', - 'dd' => 'ⅆ', - 'ddagger' => '‡', - 'ddarr' => '⇊', - 'DDotrahd' => '⤑', - 'ddotseq' => '⩷', - 'deg' => '°', - 'de' => '°', - 'Del' => '∇', - 'Delta' => 'Δ', - 'delta' => 'δ', - 'demptyv' => '⦱', - 'dfisht' => '⥿', - 'Dfr' => '𝔇', - 'dfr' => '𝔡', - 'dHar' => '⥥', - 'dharl' => '⇃', - 'dharr' => '⇂', - 'DiacriticalAcute' => '´', - 'DiacriticalDot' => '˙', - 'DiacriticalDoubleAcute' => '˝', - 'DiacriticalGrave' => '`', - 'DiacriticalTilde' => '˜', - 'diam' => '⋄', - 'Diamond' => '⋄', - 'diamond' => '⋄', - 'diamondsuit' => '♦', - 'diams' => '♦', - 'die' => '¨', - 'DifferentialD' => 'ⅆ', - 'digamma' => 'ϝ', - 'disin' => '⋲', - 'div' => '÷', - 'divide' => '÷', - 'divid' => '÷', - 'divideontimes' => '⋇', - 'divonx' => '⋇', - 'DJcy' => 'Ђ', - 'djcy' => 'ђ', - 'dlcorn' => '⌞', - 'dlcrop' => '⌍', - 'dollar' => '$', - 'Dopf' => '𝔻', - 'dopf' => '𝕕', - 'Dot' => '¨', - 'dot' => '˙', - 'DotDot' => '⃜', - 'doteq' => '≐', - 'doteqdot' => '≑', - 'DotEqual' => '≐', - 'dotminus' => '∸', - 'dotplus' => '∔', - 'dotsquare' => '⊡', - 'doublebarwedge' => '⌆', - 'DoubleContourIntegral' => '∯', - 'DoubleDot' => '¨', - 'DoubleDownArrow' => '⇓', - 'DoubleLeftArrow' => '⇐', - 'DoubleLeftRightArrow' => '⇔', - 'DoubleLeftTee' => '⫤', - 'DoubleLongLeftArrow' => '⟸', - 'DoubleLongLeftRightArrow' => '⟺', - 'DoubleLongRightArrow' => '⟹', - 'DoubleRightArrow' => '⇒', - 'DoubleRightTee' => '⊨', - 'DoubleUpArrow' => '⇑', - 'DoubleUpDownArrow' => '⇕', - 'DoubleVerticalBar' => '∥', - 'DownArrow' => '↓', - 'Downarrow' => '⇓', - 'downarrow' => '↓', - 'DownArrowBar' => '⤓', - 'DownArrowUpArrow' => '⇵', - 'DownBreve' => '̑', - 'downdownarrows' => '⇊', - 'downharpoonleft' => '⇃', - 'downharpoonright' => '⇂', - 'DownLeftRightVector' => '⥐', - 'DownLeftTeeVector' => '⥞', - 'DownLeftVector' => '↽', - 'DownLeftVectorBar' => '⥖', - 'DownRightTeeVector' => '⥟', - 'DownRightVector' => '⇁', - 'DownRightVectorBar' => '⥗', - 'DownTee' => '⊤', - 'DownTeeArrow' => '↧', - 'drbkarow' => '⤐', - 'drcorn' => '⌟', - 'drcrop' => '⌌', - 'Dscr' => '𝒟', - 'dscr' => '𝒹', - 'DScy' => 'Ѕ', - 'dscy' => 'ѕ', - 'dsol' => '⧶', - 'Dstrok' => 'Đ', - 'dstrok' => 'đ', - 'dtdot' => '⋱', - 'dtri' => '▿', - 'dtrif' => '▾', - 'duarr' => '⇵', - 'duhar' => '⥯', - 'dwangle' => '⦦', - 'DZcy' => 'Џ', - 'dzcy' => 'џ', - 'dzigrarr' => '⟿', - 'Eacute' => 'É', - 'Eacut' => 'É', - 'eacute' => 'é', - 'eacut' => 'é', - 'easter' => '⩮', - 'Ecaron' => 'Ě', - 'ecaron' => 'ě', - 'ecir' => 'ê', - 'Ecirc' => 'Ê', - 'Ecir' => 'Ê', - 'ecirc' => 'ê', - 'ecolon' => '≕', - 'Ecy' => 'Э', - 'ecy' => 'э', - 'eDDot' => '⩷', - 'Edot' => 'Ė', - 'eDot' => '≑', - 'edot' => 'ė', - 'ee' => 'ⅇ', - 'efDot' => '≒', - 'Efr' => '𝔈', - 'efr' => '𝔢', - 'eg' => '⪚', - 'Egrave' => 'È', - 'Egrav' => 'È', - 'egrave' => 'è', - 'egrav' => 'è', - 'egs' => '⪖', - 'egsdot' => '⪘', - 'el' => '⪙', - 'Element' => '∈', - 'elinters' => '⏧', - 'ell' => 'ℓ', - 'els' => '⪕', - 'elsdot' => '⪗', - 'Emacr' => 'Ē', - 'emacr' => 'ē', - 'empty' => '∅', - 'emptyset' => '∅', - 'EmptySmallSquare' => '◻', - 'emptyv' => '∅', - 'EmptyVerySmallSquare' => '▫', - 'emsp' => ' ', - 'emsp13' => ' ', - 'emsp14' => ' ', - 'ENG' => 'Ŋ', - 'eng' => 'ŋ', - 'ensp' => ' ', - 'Eogon' => 'Ę', - 'eogon' => 'ę', - 'Eopf' => '𝔼', - 'eopf' => '𝕖', - 'epar' => '⋕', - 'eparsl' => '⧣', - 'eplus' => '⩱', - 'epsi' => 'ε', - 'Epsilon' => 'Ε', - 'epsilon' => 'ε', - 'epsiv' => 'ϵ', - 'eqcirc' => '≖', - 'eqcolon' => '≕', - 'eqsim' => '≂', - 'eqslantgtr' => '⪖', - 'eqslantless' => '⪕', - 'Equal' => '⩵', - 'equals' => '=', - 'EqualTilde' => '≂', - 'equest' => '≟', - 'Equilibrium' => '⇌', - 'equiv' => '≡', - 'equivDD' => '⩸', - 'eqvparsl' => '⧥', - 'erarr' => '⥱', - 'erDot' => '≓', - 'Escr' => 'ℰ', - 'escr' => 'ℯ', - 'esdot' => '≐', - 'Esim' => '⩳', - 'esim' => '≂', - 'Eta' => 'Η', - 'eta' => 'η', - 'ETH' => 'Ð', - 'ET' => 'Ð', - 'eth' => 'ð', - 'et' => 'ð', - 'Euml' => 'Ë', - 'Eum' => 'Ë', - 'euml' => 'ë', - 'eum' => 'ë', - 'euro' => '€', - 'excl' => '!', - 'exist' => '∃', - 'Exists' => '∃', - 'expectation' => 'ℰ', - 'ExponentialE' => 'ⅇ', - 'exponentiale' => 'ⅇ', - 'fallingdotseq' => '≒', - 'Fcy' => 'Ф', - 'fcy' => 'ф', - 'female' => '♀', - 'ffilig' => 'ffi', - 'fflig' => 'ff', - 'ffllig' => 'ffl', - 'Ffr' => '𝔉', - 'ffr' => '𝔣', - 'filig' => 'fi', - 'FilledSmallSquare' => '◼', - 'FilledVerySmallSquare' => '▪', - 'fjlig' => 'fj', - 'flat' => '♭', - 'fllig' => 'fl', - 'fltns' => '▱', - 'fnof' => 'ƒ', - 'Fopf' => '𝔽', - 'fopf' => '𝕗', - 'ForAll' => '∀', - 'forall' => '∀', - 'fork' => '⋔', - 'forkv' => '⫙', - 'Fouriertrf' => 'ℱ', - 'fpartint' => '⨍', - 'frac12' => '½', - 'frac1' => '¼', - 'frac13' => '⅓', - 'frac14' => '¼', - 'frac15' => '⅕', - 'frac16' => '⅙', - 'frac18' => '⅛', - 'frac23' => '⅔', - 'frac25' => '⅖', - 'frac34' => '¾', - 'frac3' => '¾', - 'frac35' => '⅗', - 'frac38' => '⅜', - 'frac45' => '⅘', - 'frac56' => '⅚', - 'frac58' => '⅝', - 'frac78' => '⅞', - 'frasl' => '⁄', - 'frown' => '⌢', - 'Fscr' => 'ℱ', - 'fscr' => '𝒻', - 'gacute' => 'ǵ', - 'Gamma' => 'Γ', - 'gamma' => 'γ', - 'Gammad' => 'Ϝ', - 'gammad' => 'ϝ', - 'gap' => '⪆', - 'Gbreve' => 'Ğ', - 'gbreve' => 'ğ', - 'Gcedil' => 'Ģ', - 'Gcirc' => 'Ĝ', - 'gcirc' => 'ĝ', - 'Gcy' => 'Г', - 'gcy' => 'г', - 'Gdot' => 'Ġ', - 'gdot' => 'ġ', - 'gE' => '≧', - 'ge' => '≥', - 'gEl' => '⪌', - 'gel' => '⋛', - 'geq' => '≥', - 'geqq' => '≧', - 'geqslant' => '⩾', - 'ges' => '⩾', - 'gescc' => '⪩', - 'gesdot' => '⪀', - 'gesdoto' => '⪂', - 'gesdotol' => '⪄', - 'gesl' => '⋛︀', - 'gesles' => '⪔', - 'Gfr' => '𝔊', - 'gfr' => '𝔤', - 'Gg' => '⋙', - 'gg' => '≫', - 'ggg' => '⋙', - 'gimel' => 'ℷ', - 'GJcy' => 'Ѓ', - 'gjcy' => 'ѓ', - 'gl' => '≷', - 'gla' => '⪥', - 'glE' => '⪒', - 'glj' => '⪤', - 'gnap' => '⪊', - 'gnapprox' => '⪊', - 'gnE' => '≩', - 'gne' => '⪈', - 'gneq' => '⪈', - 'gneqq' => '≩', - 'gnsim' => '⋧', - 'Gopf' => '𝔾', - 'gopf' => '𝕘', - 'grave' => '`', - 'GreaterEqual' => '≥', - 'GreaterEqualLess' => '⋛', - 'GreaterFullEqual' => '≧', - 'GreaterGreater' => '⪢', - 'GreaterLess' => '≷', - 'GreaterSlantEqual' => '⩾', - 'GreaterTilde' => '≳', - 'Gscr' => '𝒢', - 'gscr' => 'ℊ', - 'gsim' => '≳', - 'gsime' => '⪎', - 'gsiml' => '⪐', - 'GT' => '>', - 'G' => '>', - 'Gt' => '≫', - 'gt' => '>', - 'g' => '>', - 'gtcc' => '⪧', - 'gtcir' => '⩺', - 'gtdot' => '⋗', - 'gtlPar' => '⦕', - 'gtquest' => '⩼', - 'gtrapprox' => '⪆', - 'gtrarr' => '⥸', - 'gtrdot' => '⋗', - 'gtreqless' => '⋛', - 'gtreqqless' => '⪌', - 'gtrless' => '≷', - 'gtrsim' => '≳', - 'gvertneqq' => '≩︀', - 'gvnE' => '≩︀', - 'Hacek' => 'ˇ', - 'hairsp' => ' ', - 'half' => '½', - 'hamilt' => 'ℋ', - 'HARDcy' => 'Ъ', - 'hardcy' => 'ъ', - 'hArr' => '⇔', - 'harr' => '↔', - 'harrcir' => '⥈', - 'harrw' => '↭', - 'Hat' => '^', - 'hbar' => 'ℏ', - 'Hcirc' => 'Ĥ', - 'hcirc' => 'ĥ', - 'hearts' => '♥', - 'heartsuit' => '♥', - 'hellip' => '…', - 'hercon' => '⊹', - 'Hfr' => 'ℌ', - 'hfr' => '𝔥', - 'HilbertSpace' => 'ℋ', - 'hksearow' => '⤥', - 'hkswarow' => '⤦', - 'hoarr' => '⇿', - 'homtht' => '∻', - 'hookleftarrow' => '↩', - 'hookrightarrow' => '↪', - 'Hopf' => 'ℍ', - 'hopf' => '𝕙', - 'horbar' => '―', - 'HorizontalLine' => '─', - 'Hscr' => 'ℋ', - 'hscr' => '𝒽', - 'hslash' => 'ℏ', - 'Hstrok' => 'Ħ', - 'hstrok' => 'ħ', - 'HumpDownHump' => '≎', - 'HumpEqual' => '≏', - 'hybull' => '⁃', - 'hyphen' => '‐', - 'Iacute' => 'Í', - 'Iacut' => 'Í', - 'iacute' => 'í', - 'iacut' => 'í', - 'ic' => '⁣', - 'Icirc' => 'Î', - 'Icir' => 'Î', - 'icirc' => 'î', - 'icir' => 'î', - 'Icy' => 'И', - 'icy' => 'и', - 'Idot' => 'İ', - 'IEcy' => 'Е', - 'iecy' => 'е', - 'iexcl' => '¡', - 'iexc' => '¡', - 'iff' => '⇔', - 'Ifr' => 'ℑ', - 'ifr' => '𝔦', - 'Igrave' => 'Ì', - 'Igrav' => 'Ì', - 'igrave' => 'ì', - 'igrav' => 'ì', - 'ii' => 'ⅈ', - 'iiiint' => '⨌', - 'iiint' => '∭', - 'iinfin' => '⧜', - 'iiota' => '℩', - 'IJlig' => 'IJ', - 'ijlig' => 'ij', - 'Im' => 'ℑ', - 'Imacr' => 'Ī', - 'imacr' => 'ī', - 'image' => 'ℑ', - 'ImaginaryI' => 'ⅈ', - 'imagline' => 'ℐ', - 'imagpart' => 'ℑ', - 'imath' => 'ı', - 'imof' => '⊷', - 'imped' => 'Ƶ', - 'Implies' => '⇒', - 'in' => '∈', - 'incare' => '℅', - 'infin' => '∞', - 'infintie' => '⧝', - 'inodot' => 'ı', - 'Int' => '∬', - 'int' => '∫', - 'intcal' => '⊺', - 'integers' => 'ℤ', - 'Integral' => '∫', - 'intercal' => '⊺', - 'Intersection' => '⋂', - 'intlarhk' => '⨗', - 'intprod' => '⨼', - 'InvisibleComma' => '⁣', - 'InvisibleTimes' => '⁢', - 'IOcy' => 'Ё', - 'iocy' => 'ё', - 'Iogon' => 'Į', - 'iogon' => 'į', - 'Iopf' => '𝕀', - 'iopf' => '𝕚', - 'Iota' => 'Ι', - 'iota' => 'ι', - 'iprod' => '⨼', - 'iquest' => '¿', - 'iques' => '¿', - 'Iscr' => 'ℐ', - 'iscr' => '𝒾', - 'isin' => '∈', - 'isindot' => '⋵', - 'isinE' => '⋹', - 'isins' => '⋴', - 'isinsv' => '⋳', - 'isinv' => '∈', - 'it' => '⁢', - 'Itilde' => 'Ĩ', - 'itilde' => 'ĩ', - 'Iukcy' => 'І', - 'iukcy' => 'і', - 'Iuml' => 'Ï', - 'Ium' => 'Ï', - 'iuml' => 'ï', - 'ium' => 'ï', - 'Jcirc' => 'Ĵ', - 'jcirc' => 'ĵ', - 'Jcy' => 'Й', - 'jcy' => 'й', - 'Jfr' => '𝔍', - 'jfr' => '𝔧', - 'jmath' => 'ȷ', - 'Jopf' => '𝕁', - 'jopf' => '𝕛', - 'Jscr' => '𝒥', - 'jscr' => '𝒿', - 'Jsercy' => 'Ј', - 'jsercy' => 'ј', - 'Jukcy' => 'Є', - 'jukcy' => 'є', - 'Kappa' => 'Κ', - 'kappa' => 'κ', - 'kappav' => 'ϰ', - 'Kcedil' => 'Ķ', - 'kcedil' => 'ķ', - 'Kcy' => 'К', - 'kcy' => 'к', - 'Kfr' => '𝔎', - 'kfr' => '𝔨', - 'kgreen' => 'ĸ', - 'KHcy' => 'Х', - 'khcy' => 'х', - 'KJcy' => 'Ќ', - 'kjcy' => 'ќ', - 'Kopf' => '𝕂', - 'kopf' => '𝕜', - 'Kscr' => '𝒦', - 'kscr' => '𝓀', - 'lAarr' => '⇚', - 'Lacute' => 'Ĺ', - 'lacute' => 'ĺ', - 'laemptyv' => '⦴', - 'lagran' => 'ℒ', - 'Lambda' => 'Λ', - 'lambda' => 'λ', - 'Lang' => '⟪', - 'lang' => '⟨', - 'langd' => '⦑', - 'langle' => '⟨', - 'lap' => '⪅', - 'Laplacetrf' => 'ℒ', - 'laquo' => '«', - 'laqu' => '«', - 'Larr' => '↞', - 'lArr' => '⇐', - 'larr' => '←', - 'larrb' => '⇤', - 'larrbfs' => '⤟', - 'larrfs' => '⤝', - 'larrhk' => '↩', - 'larrlp' => '↫', - 'larrpl' => '⤹', - 'larrsim' => '⥳', - 'larrtl' => '↢', - 'lat' => '⪫', - 'lAtail' => '⤛', - 'latail' => '⤙', - 'late' => '⪭', - 'lates' => '⪭︀', - 'lBarr' => '⤎', - 'lbarr' => '⤌', - 'lbbrk' => '❲', - 'lbrace' => '{', - 'lbrack' => '[', - 'lbrke' => '⦋', - 'lbrksld' => '⦏', - 'lbrkslu' => '⦍', - 'Lcaron' => 'Ľ', - 'lcaron' => 'ľ', - 'Lcedil' => 'Ļ', - 'lcedil' => 'ļ', - 'lceil' => '⌈', - 'lcub' => '{', - 'Lcy' => 'Л', - 'lcy' => 'л', - 'ldca' => '⤶', - 'ldquo' => '“', - 'ldquor' => '„', - 'ldrdhar' => '⥧', - 'ldrushar' => '⥋', - 'ldsh' => '↲', - 'lE' => '≦', - 'le' => '≤', - 'LeftAngleBracket' => '⟨', - 'LeftArrow' => '←', - 'Leftarrow' => '⇐', - 'leftarrow' => '←', - 'LeftArrowBar' => '⇤', - 'LeftArrowRightArrow' => '⇆', - 'leftarrowtail' => '↢', - 'LeftCeiling' => '⌈', - 'LeftDoubleBracket' => '⟦', - 'LeftDownTeeVector' => '⥡', - 'LeftDownVector' => '⇃', - 'LeftDownVectorBar' => '⥙', - 'LeftFloor' => '⌊', - 'leftharpoondown' => '↽', - 'leftharpoonup' => '↼', - 'leftleftarrows' => '⇇', - 'LeftRightArrow' => '↔', - 'Leftrightarrow' => '⇔', - 'leftrightarrow' => '↔', - 'leftrightarrows' => '⇆', - 'leftrightharpoons' => '⇋', - 'leftrightsquigarrow' => '↭', - 'LeftRightVector' => '⥎', - 'LeftTee' => '⊣', - 'LeftTeeArrow' => '↤', - 'LeftTeeVector' => '⥚', - 'leftthreetimes' => '⋋', - 'LeftTriangle' => '⊲', - 'LeftTriangleBar' => '⧏', - 'LeftTriangleEqual' => '⊴', - 'LeftUpDownVector' => '⥑', - 'LeftUpTeeVector' => '⥠', - 'LeftUpVector' => '↿', - 'LeftUpVectorBar' => '⥘', - 'LeftVector' => '↼', - 'LeftVectorBar' => '⥒', - 'lEg' => '⪋', - 'leg' => '⋚', - 'leq' => '≤', - 'leqq' => '≦', - 'leqslant' => '⩽', - 'les' => '⩽', - 'lescc' => '⪨', - 'lesdot' => '⩿', - 'lesdoto' => '⪁', - 'lesdotor' => '⪃', - 'lesg' => '⋚︀', - 'lesges' => '⪓', - 'lessapprox' => '⪅', - 'lessdot' => '⋖', - 'lesseqgtr' => '⋚', - 'lesseqqgtr' => '⪋', - 'LessEqualGreater' => '⋚', - 'LessFullEqual' => '≦', - 'LessGreater' => '≶', - 'lessgtr' => '≶', - 'LessLess' => '⪡', - 'lesssim' => '≲', - 'LessSlantEqual' => '⩽', - 'LessTilde' => '≲', - 'lfisht' => '⥼', - 'lfloor' => '⌊', - 'Lfr' => '𝔏', - 'lfr' => '𝔩', - 'lg' => '≶', - 'lgE' => '⪑', - 'lHar' => '⥢', - 'lhard' => '↽', - 'lharu' => '↼', - 'lharul' => '⥪', - 'lhblk' => '▄', - 'LJcy' => 'Љ', - 'ljcy' => 'љ', - 'Ll' => '⋘', - 'll' => '≪', - 'llarr' => '⇇', - 'llcorner' => '⌞', - 'Lleftarrow' => '⇚', - 'llhard' => '⥫', - 'lltri' => '◺', - 'Lmidot' => 'Ŀ', - 'lmidot' => 'ŀ', - 'lmoust' => '⎰', - 'lmoustache' => '⎰', - 'lnap' => '⪉', - 'lnapprox' => '⪉', - 'lnE' => '≨', - 'lne' => '⪇', - 'lneq' => '⪇', - 'lneqq' => '≨', - 'lnsim' => '⋦', - 'loang' => '⟬', - 'loarr' => '⇽', - 'lobrk' => '⟦', - 'LongLeftArrow' => '⟵', - 'Longleftarrow' => '⟸', - 'longleftarrow' => '⟵', - 'LongLeftRightArrow' => '⟷', - 'Longleftrightarrow' => '⟺', - 'longleftrightarrow' => '⟷', - 'longmapsto' => '⟼', - 'LongRightArrow' => '⟶', - 'Longrightarrow' => '⟹', - 'longrightarrow' => '⟶', - 'looparrowleft' => '↫', - 'looparrowright' => '↬', - 'lopar' => '⦅', - 'Lopf' => '𝕃', - 'lopf' => '𝕝', - 'loplus' => '⨭', - 'lotimes' => '⨴', - 'lowast' => '∗', - 'lowbar' => '_', - 'LowerLeftArrow' => '↙', - 'LowerRightArrow' => '↘', - 'loz' => '◊', - 'lozenge' => '◊', - 'lozf' => '⧫', - 'lpar' => '(', - 'lparlt' => '⦓', - 'lrarr' => '⇆', - 'lrcorner' => '⌟', - 'lrhar' => '⇋', - 'lrhard' => '⥭', - 'lrm' => '‎', - 'lrtri' => '⊿', - 'lsaquo' => '‹', - 'Lscr' => 'ℒ', - 'lscr' => '𝓁', - 'Lsh' => '↰', - 'lsh' => '↰', - 'lsim' => '≲', - 'lsime' => '⪍', - 'lsimg' => '⪏', - 'lsqb' => '[', - 'lsquo' => '‘', - 'lsquor' => '‚', - 'Lstrok' => 'Ł', - 'lstrok' => 'ł', - 'LT' => '<', - 'L' => '<', - 'Lt' => '≪', - 'lt' => '<', - 'l' => '<', - 'ltcc' => '⪦', - 'ltcir' => '⩹', - 'ltdot' => '⋖', - 'lthree' => '⋋', - 'ltimes' => '⋉', - 'ltlarr' => '⥶', - 'ltquest' => '⩻', - 'ltri' => '◃', - 'ltrie' => '⊴', - 'ltrif' => '◂', - 'ltrPar' => '⦖', - 'lurdshar' => '⥊', - 'luruhar' => '⥦', - 'lvertneqq' => '≨︀', - 'lvnE' => '≨︀', - 'macr' => '¯', - 'mac' => '¯', - 'male' => '♂', - 'malt' => '✠', - 'maltese' => '✠', - 'Map' => '⤅', - 'map' => '↦', - 'mapsto' => '↦', - 'mapstodown' => '↧', - 'mapstoleft' => '↤', - 'mapstoup' => '↥', - 'marker' => '▮', - 'mcomma' => '⨩', - 'Mcy' => 'М', - 'mcy' => 'м', - 'mdash' => '—', - 'mDDot' => '∺', - 'measuredangle' => '∡', - 'MediumSpace' => ' ', - 'Mellintrf' => 'ℳ', - 'Mfr' => '𝔐', - 'mfr' => '𝔪', - 'mho' => '℧', - 'micro' => 'µ', - 'micr' => 'µ', - 'mid' => '∣', - 'midast' => '*', - 'midcir' => '⫰', - 'middot' => '·', - 'middo' => '·', - 'minus' => '−', - 'minusb' => '⊟', - 'minusd' => '∸', - 'minusdu' => '⨪', - 'MinusPlus' => '∓', - 'mlcp' => '⫛', - 'mldr' => '…', - 'mnplus' => '∓', - 'models' => '⊧', - 'Mopf' => '𝕄', - 'mopf' => '𝕞', - 'mp' => '∓', - 'Mscr' => 'ℳ', - 'mscr' => '𝓂', - 'mstpos' => '∾', - 'Mu' => 'Μ', - 'mu' => 'μ', - 'multimap' => '⊸', - 'mumap' => '⊸', - 'nabla' => '∇', - 'Nacute' => 'Ń', - 'nacute' => 'ń', - 'nang' => '∠⃒', - 'nap' => '≉', - 'napE' => '⩰̸', - 'napid' => '≋̸', - 'napos' => 'ʼn', - 'napprox' => '≉', - 'natur' => '♮', - 'natural' => '♮', - 'naturals' => 'ℕ', - 'nbsp' => ' ', - 'nbs' => ' ', - 'nbump' => '≎̸', - 'nbumpe' => '≏̸', - 'ncap' => '⩃', - 'Ncaron' => 'Ň', - 'ncaron' => 'ň', - 'Ncedil' => 'Ņ', - 'ncedil' => 'ņ', - 'ncong' => '≇', - 'ncongdot' => '⩭̸', - 'ncup' => '⩂', - 'Ncy' => 'Н', - 'ncy' => 'н', - 'ndash' => '–', - 'ne' => '≠', - 'nearhk' => '⤤', - 'neArr' => '⇗', - 'nearr' => '↗', - 'nearrow' => '↗', - 'nedot' => '≐̸', - 'NegativeMediumSpace' => '​', - 'NegativeThickSpace' => '​', - 'NegativeThinSpace' => '​', - 'NegativeVeryThinSpace' => '​', - 'nequiv' => '≢', - 'nesear' => '⤨', - 'nesim' => '≂̸', - 'NestedGreaterGreater' => '≫', - 'NestedLessLess' => '≪', - 'NewLine' => ' -', - 'nexist' => '∄', - 'nexists' => '∄', - 'Nfr' => '𝔑', - 'nfr' => '𝔫', - 'ngE' => '≧̸', - 'nge' => '≱', - 'ngeq' => '≱', - 'ngeqq' => '≧̸', - 'ngeqslant' => '⩾̸', - 'nges' => '⩾̸', - 'nGg' => '⋙̸', - 'ngsim' => '≵', - 'nGt' => '≫⃒', - 'ngt' => '≯', - 'ngtr' => '≯', - 'nGtv' => '≫̸', - 'nhArr' => '⇎', - 'nharr' => '↮', - 'nhpar' => '⫲', - 'ni' => '∋', - 'nis' => '⋼', - 'nisd' => '⋺', - 'niv' => '∋', - 'NJcy' => 'Њ', - 'njcy' => 'њ', - 'nlArr' => '⇍', - 'nlarr' => '↚', - 'nldr' => '‥', - 'nlE' => '≦̸', - 'nle' => '≰', - 'nLeftarrow' => '⇍', - 'nleftarrow' => '↚', - 'nLeftrightarrow' => '⇎', - 'nleftrightarrow' => '↮', - 'nleq' => '≰', - 'nleqq' => '≦̸', - 'nleqslant' => '⩽̸', - 'nles' => '⩽̸', - 'nless' => '≮', - 'nLl' => '⋘̸', - 'nlsim' => '≴', - 'nLt' => '≪⃒', - 'nlt' => '≮', - 'nltri' => '⋪', - 'nltrie' => '⋬', - 'nLtv' => '≪̸', - 'nmid' => '∤', - 'NoBreak' => '⁠', - 'NonBreakingSpace' => ' ', - 'Nopf' => 'ℕ', - 'nopf' => '𝕟', - 'Not' => '⫬', - 'not' => '¬', - 'no' => '¬', - 'NotCongruent' => '≢', - 'NotCupCap' => '≭', - 'NotDoubleVerticalBar' => '∦', - 'NotElement' => '∉', - 'NotEqual' => '≠', - 'NotEqualTilde' => '≂̸', - 'NotExists' => '∄', - 'NotGreater' => '≯', - 'NotGreaterEqual' => '≱', - 'NotGreaterFullEqual' => '≧̸', - 'NotGreaterGreater' => '≫̸', - 'NotGreaterLess' => '≹', - 'NotGreaterSlantEqual' => '⩾̸', - 'NotGreaterTilde' => '≵', - 'NotHumpDownHump' => '≎̸', - 'NotHumpEqual' => '≏̸', - 'notin' => '∉', - 'notindot' => '⋵̸', - 'notinE' => '⋹̸', - 'notinva' => '∉', - 'notinvb' => '⋷', - 'notinvc' => '⋶', - 'NotLeftTriangle' => '⋪', - 'NotLeftTriangleBar' => '⧏̸', - 'NotLeftTriangleEqual' => '⋬', - 'NotLess' => '≮', - 'NotLessEqual' => '≰', - 'NotLessGreater' => '≸', - 'NotLessLess' => '≪̸', - 'NotLessSlantEqual' => '⩽̸', - 'NotLessTilde' => '≴', - 'NotNestedGreaterGreater' => '⪢̸', - 'NotNestedLessLess' => '⪡̸', - 'notni' => '∌', - 'notniva' => '∌', - 'notnivb' => '⋾', - 'notnivc' => '⋽', - 'NotPrecedes' => '⊀', - 'NotPrecedesEqual' => '⪯̸', - 'NotPrecedesSlantEqual' => '⋠', - 'NotReverseElement' => '∌', - 'NotRightTriangle' => '⋫', - 'NotRightTriangleBar' => '⧐̸', - 'NotRightTriangleEqual' => '⋭', - 'NotSquareSubset' => '⊏̸', - 'NotSquareSubsetEqual' => '⋢', - 'NotSquareSuperset' => '⊐̸', - 'NotSquareSupersetEqual' => '⋣', - 'NotSubset' => '⊂⃒', - 'NotSubsetEqual' => '⊈', - 'NotSucceeds' => '⊁', - 'NotSucceedsEqual' => '⪰̸', - 'NotSucceedsSlantEqual' => '⋡', - 'NotSucceedsTilde' => '≿̸', - 'NotSuperset' => '⊃⃒', - 'NotSupersetEqual' => '⊉', - 'NotTilde' => '≁', - 'NotTildeEqual' => '≄', - 'NotTildeFullEqual' => '≇', - 'NotTildeTilde' => '≉', - 'NotVerticalBar' => '∤', - 'npar' => '∦', - 'nparallel' => '∦', - 'nparsl' => '⫽⃥', - 'npart' => '∂̸', - 'npolint' => '⨔', - 'npr' => '⊀', - 'nprcue' => '⋠', - 'npre' => '⪯̸', - 'nprec' => '⊀', - 'npreceq' => '⪯̸', - 'nrArr' => '⇏', - 'nrarr' => '↛', - 'nrarrc' => '⤳̸', - 'nrarrw' => '↝̸', - 'nRightarrow' => '⇏', - 'nrightarrow' => '↛', - 'nrtri' => '⋫', - 'nrtrie' => '⋭', - 'nsc' => '⊁', - 'nsccue' => '⋡', - 'nsce' => '⪰̸', - 'Nscr' => '𝒩', - 'nscr' => '𝓃', - 'nshortmid' => '∤', - 'nshortparallel' => '∦', - 'nsim' => '≁', - 'nsime' => '≄', - 'nsimeq' => '≄', - 'nsmid' => '∤', - 'nspar' => '∦', - 'nsqsube' => '⋢', - 'nsqsupe' => '⋣', - 'nsub' => '⊄', - 'nsubE' => '⫅̸', - 'nsube' => '⊈', - 'nsubset' => '⊂⃒', - 'nsubseteq' => '⊈', - 'nsubseteqq' => '⫅̸', - 'nsucc' => '⊁', - 'nsucceq' => '⪰̸', - 'nsup' => '⊅', - 'nsupE' => '⫆̸', - 'nsupe' => '⊉', - 'nsupset' => '⊃⃒', - 'nsupseteq' => '⊉', - 'nsupseteqq' => '⫆̸', - 'ntgl' => '≹', - 'Ntilde' => 'Ñ', - 'Ntild' => 'Ñ', - 'ntilde' => 'ñ', - 'ntild' => 'ñ', - 'ntlg' => '≸', - 'ntriangleleft' => '⋪', - 'ntrianglelefteq' => '⋬', - 'ntriangleright' => '⋫', - 'ntrianglerighteq' => '⋭', - 'Nu' => 'Ν', - 'nu' => 'ν', - 'num' => '#', - 'numero' => '№', - 'numsp' => ' ', - 'nvap' => '≍⃒', - 'nVDash' => '⊯', - 'nVdash' => '⊮', - 'nvDash' => '⊭', - 'nvdash' => '⊬', - 'nvge' => '≥⃒', - 'nvgt' => '>⃒', - 'nvHarr' => '⤄', - 'nvinfin' => '⧞', - 'nvlArr' => '⤂', - 'nvle' => '≤⃒', - 'nvlt' => '<⃒', - 'nvltrie' => '⊴⃒', - 'nvrArr' => '⤃', - 'nvrtrie' => '⊵⃒', - 'nvsim' => '∼⃒', - 'nwarhk' => '⤣', - 'nwArr' => '⇖', - 'nwarr' => '↖', - 'nwarrow' => '↖', - 'nwnear' => '⤧', - 'Oacute' => 'Ó', - 'Oacut' => 'Ó', - 'oacute' => 'ó', - 'oacut' => 'ó', - 'oast' => '⊛', - 'ocir' => 'ô', - 'Ocirc' => 'Ô', - 'Ocir' => 'Ô', - 'ocirc' => 'ô', - 'Ocy' => 'О', - 'ocy' => 'о', - 'odash' => '⊝', - 'Odblac' => 'Ő', - 'odblac' => 'ő', - 'odiv' => '⨸', - 'odot' => '⊙', - 'odsold' => '⦼', - 'OElig' => 'Œ', - 'oelig' => 'œ', - 'ofcir' => '⦿', - 'Ofr' => '𝔒', - 'ofr' => '𝔬', - 'ogon' => '˛', - 'Ograve' => 'Ò', - 'Ograv' => 'Ò', - 'ograve' => 'ò', - 'ograv' => 'ò', - 'ogt' => '⧁', - 'ohbar' => '⦵', - 'ohm' => 'Ω', - 'oint' => '∮', - 'olarr' => '↺', - 'olcir' => '⦾', - 'olcross' => '⦻', - 'oline' => '‾', - 'olt' => '⧀', - 'Omacr' => 'Ō', - 'omacr' => 'ō', - 'Omega' => 'Ω', - 'omega' => 'ω', - 'Omicron' => 'Ο', - 'omicron' => 'ο', - 'omid' => '⦶', - 'ominus' => '⊖', - 'Oopf' => '𝕆', - 'oopf' => '𝕠', - 'opar' => '⦷', - 'OpenCurlyDoubleQuote' => '“', - 'OpenCurlyQuote' => '‘', - 'operp' => '⦹', - 'oplus' => '⊕', - 'Or' => '⩔', - 'or' => '∨', - 'orarr' => '↻', - 'ord' => 'º', - 'order' => 'ℴ', - 'orderof' => 'ℴ', - 'ordf' => 'ª', - 'ordm' => 'º', - 'origof' => '⊶', - 'oror' => '⩖', - 'orslope' => '⩗', - 'orv' => '⩛', - 'oS' => 'Ⓢ', - 'Oscr' => '𝒪', - 'oscr' => 'ℴ', - 'Oslash' => 'Ø', - 'Oslas' => 'Ø', - 'oslash' => 'ø', - 'oslas' => 'ø', - 'osol' => '⊘', - 'Otilde' => 'Õ', - 'Otild' => 'Õ', - 'otilde' => 'õ', - 'otild' => 'õ', - 'Otimes' => '⨷', - 'otimes' => '⊗', - 'otimesas' => '⨶', - 'Ouml' => 'Ö', - 'Oum' => 'Ö', - 'ouml' => 'ö', - 'oum' => 'ö', - 'ovbar' => '⌽', - 'OverBar' => '‾', - 'OverBrace' => '⏞', - 'OverBracket' => '⎴', - 'OverParenthesis' => '⏜', - 'par' => '¶', - 'para' => '¶', - 'parallel' => '∥', - 'parsim' => '⫳', - 'parsl' => '⫽', - 'part' => '∂', - 'PartialD' => '∂', - 'Pcy' => 'П', - 'pcy' => 'п', - 'percnt' => '%', - 'period' => '.', - 'permil' => '‰', - 'perp' => '⊥', - 'pertenk' => '‱', - 'Pfr' => '𝔓', - 'pfr' => '𝔭', - 'Phi' => 'Φ', - 'phi' => 'φ', - 'phiv' => 'ϕ', - 'phmmat' => 'ℳ', - 'phone' => '☎', - 'Pi' => 'Π', - 'pi' => 'π', - 'pitchfork' => '⋔', - 'piv' => 'ϖ', - 'planck' => 'ℏ', - 'planckh' => 'ℎ', - 'plankv' => 'ℏ', - 'plus' => '+', - 'plusacir' => '⨣', - 'plusb' => '⊞', - 'pluscir' => '⨢', - 'plusdo' => '∔', - 'plusdu' => '⨥', - 'pluse' => '⩲', - 'PlusMinus' => '±', - 'plusmn' => '±', - 'plusm' => '±', - 'plussim' => '⨦', - 'plustwo' => '⨧', - 'pm' => '±', - 'Poincareplane' => 'ℌ', - 'pointint' => '⨕', - 'Popf' => 'ℙ', - 'popf' => '𝕡', - 'pound' => '£', - 'poun' => '£', - 'Pr' => '⪻', - 'pr' => '≺', - 'prap' => '⪷', - 'prcue' => '≼', - 'prE' => '⪳', - 'pre' => '⪯', - 'prec' => '≺', - 'precapprox' => '⪷', - 'preccurlyeq' => '≼', - 'Precedes' => '≺', - 'PrecedesEqual' => '⪯', - 'PrecedesSlantEqual' => '≼', - 'PrecedesTilde' => '≾', - 'preceq' => '⪯', - 'precnapprox' => '⪹', - 'precneqq' => '⪵', - 'precnsim' => '⋨', - 'precsim' => '≾', - 'Prime' => '″', - 'prime' => '′', - 'primes' => 'ℙ', - 'prnap' => '⪹', - 'prnE' => '⪵', - 'prnsim' => '⋨', - 'prod' => '∏', - 'Product' => '∏', - 'profalar' => '⌮', - 'profline' => '⌒', - 'profsurf' => '⌓', - 'prop' => '∝', - 'Proportion' => '∷', - 'Proportional' => '∝', - 'propto' => '∝', - 'prsim' => '≾', - 'prurel' => '⊰', - 'Pscr' => '𝒫', - 'pscr' => '𝓅', - 'Psi' => 'Ψ', - 'psi' => 'ψ', - 'puncsp' => ' ', - 'Qfr' => '𝔔', - 'qfr' => '𝔮', - 'qint' => '⨌', - 'Qopf' => 'ℚ', - 'qopf' => '𝕢', - 'qprime' => '⁗', - 'Qscr' => '𝒬', - 'qscr' => '𝓆', - 'quaternions' => 'ℍ', - 'quatint' => '⨖', - 'quest' => '?', - 'questeq' => '≟', - 'QUOT' => '"', - 'QUO' => '"', - 'quot' => '"', - 'quo' => '"', - 'rAarr' => '⇛', - 'race' => '∽̱', - 'Racute' => 'Ŕ', - 'racute' => 'ŕ', - 'radic' => '√', - 'raemptyv' => '⦳', - 'Rang' => '⟫', - 'rang' => '⟩', - 'rangd' => '⦒', - 'range' => '⦥', - 'rangle' => '⟩', - 'raquo' => '»', - 'raqu' => '»', - 'Rarr' => '↠', - 'rArr' => '⇒', - 'rarr' => '→', - 'rarrap' => '⥵', - 'rarrb' => '⇥', - 'rarrbfs' => '⤠', - 'rarrc' => '⤳', - 'rarrfs' => '⤞', - 'rarrhk' => '↪', - 'rarrlp' => '↬', - 'rarrpl' => '⥅', - 'rarrsim' => '⥴', - 'Rarrtl' => '⤖', - 'rarrtl' => '↣', - 'rarrw' => '↝', - 'rAtail' => '⤜', - 'ratail' => '⤚', - 'ratio' => '∶', - 'rationals' => 'ℚ', - 'RBarr' => '⤐', - 'rBarr' => '⤏', - 'rbarr' => '⤍', - 'rbbrk' => '❳', - 'rbrace' => '}', - 'rbrack' => ']', - 'rbrke' => '⦌', - 'rbrksld' => '⦎', - 'rbrkslu' => '⦐', - 'Rcaron' => 'Ř', - 'rcaron' => 'ř', - 'Rcedil' => 'Ŗ', - 'rcedil' => 'ŗ', - 'rceil' => '⌉', - 'rcub' => '}', - 'Rcy' => 'Р', - 'rcy' => 'р', - 'rdca' => '⤷', - 'rdldhar' => '⥩', - 'rdquo' => '”', - 'rdquor' => '”', - 'rdsh' => '↳', - 'Re' => 'ℜ', - 'real' => 'ℜ', - 'realine' => 'ℛ', - 'realpart' => 'ℜ', - 'reals' => 'ℝ', - 'rect' => '▭', - 'REG' => '®', - 'RE' => '®', - 'reg' => '®', - 're' => '®', - 'ReverseElement' => '∋', - 'ReverseEquilibrium' => '⇋', - 'ReverseUpEquilibrium' => '⥯', - 'rfisht' => '⥽', - 'rfloor' => '⌋', - 'Rfr' => 'ℜ', - 'rfr' => '𝔯', - 'rHar' => '⥤', - 'rhard' => '⇁', - 'rharu' => '⇀', - 'rharul' => '⥬', - 'Rho' => 'Ρ', - 'rho' => 'ρ', - 'rhov' => 'ϱ', - 'RightAngleBracket' => '⟩', - 'RightArrow' => '→', - 'Rightarrow' => '⇒', - 'rightarrow' => '→', - 'RightArrowBar' => '⇥', - 'RightArrowLeftArrow' => '⇄', - 'rightarrowtail' => '↣', - 'RightCeiling' => '⌉', - 'RightDoubleBracket' => '⟧', - 'RightDownTeeVector' => '⥝', - 'RightDownVector' => '⇂', - 'RightDownVectorBar' => '⥕', - 'RightFloor' => '⌋', - 'rightharpoondown' => '⇁', - 'rightharpoonup' => '⇀', - 'rightleftarrows' => '⇄', - 'rightleftharpoons' => '⇌', - 'rightrightarrows' => '⇉', - 'rightsquigarrow' => '↝', - 'RightTee' => '⊢', - 'RightTeeArrow' => '↦', - 'RightTeeVector' => '⥛', - 'rightthreetimes' => '⋌', - 'RightTriangle' => '⊳', - 'RightTriangleBar' => '⧐', - 'RightTriangleEqual' => '⊵', - 'RightUpDownVector' => '⥏', - 'RightUpTeeVector' => '⥜', - 'RightUpVector' => '↾', - 'RightUpVectorBar' => '⥔', - 'RightVector' => '⇀', - 'RightVectorBar' => '⥓', - 'ring' => '˚', - 'risingdotseq' => '≓', - 'rlarr' => '⇄', - 'rlhar' => '⇌', - 'rlm' => '‏', - 'rmoust' => '⎱', - 'rmoustache' => '⎱', - 'rnmid' => '⫮', - 'roang' => '⟭', - 'roarr' => '⇾', - 'robrk' => '⟧', - 'ropar' => '⦆', - 'Ropf' => 'ℝ', - 'ropf' => '𝕣', - 'roplus' => '⨮', - 'rotimes' => '⨵', - 'RoundImplies' => '⥰', - 'rpar' => ')', - 'rpargt' => '⦔', - 'rppolint' => '⨒', - 'rrarr' => '⇉', - 'Rrightarrow' => '⇛', - 'rsaquo' => '›', - 'Rscr' => 'ℛ', - 'rscr' => '𝓇', - 'Rsh' => '↱', - 'rsh' => '↱', - 'rsqb' => ']', - 'rsquo' => '’', - 'rsquor' => '’', - 'rthree' => '⋌', - 'rtimes' => '⋊', - 'rtri' => '▹', - 'rtrie' => '⊵', - 'rtrif' => '▸', - 'rtriltri' => '⧎', - 'RuleDelayed' => '⧴', - 'ruluhar' => '⥨', - 'rx' => '℞', - 'Sacute' => 'Ś', - 'sacute' => 'ś', - 'sbquo' => '‚', - 'Sc' => '⪼', - 'sc' => '≻', - 'scap' => '⪸', - 'Scaron' => 'Š', - 'scaron' => 'š', - 'sccue' => '≽', - 'scE' => '⪴', - 'sce' => '⪰', - 'Scedil' => 'Ş', - 'scedil' => 'ş', - 'Scirc' => 'Ŝ', - 'scirc' => 'ŝ', - 'scnap' => '⪺', - 'scnE' => '⪶', - 'scnsim' => '⋩', - 'scpolint' => '⨓', - 'scsim' => '≿', - 'Scy' => 'С', - 'scy' => 'с', - 'sdot' => '⋅', - 'sdotb' => '⊡', - 'sdote' => '⩦', - 'searhk' => '⤥', - 'seArr' => '⇘', - 'searr' => '↘', - 'searrow' => '↘', - 'sect' => '§', - 'sec' => '§', - 'semi' => ';', - 'seswar' => '⤩', - 'setminus' => '∖', - 'setmn' => '∖', - 'sext' => '✶', - 'Sfr' => '𝔖', - 'sfr' => '𝔰', - 'sfrown' => '⌢', - 'sharp' => '♯', - 'SHCHcy' => 'Щ', - 'shchcy' => 'щ', - 'SHcy' => 'Ш', - 'shcy' => 'ш', - 'ShortDownArrow' => '↓', - 'ShortLeftArrow' => '←', - 'shortmid' => '∣', - 'shortparallel' => '∥', - 'ShortRightArrow' => '→', - 'ShortUpArrow' => '↑', - 'shy' => '­', - 'sh' => '­', - 'Sigma' => 'Σ', - 'sigma' => 'σ', - 'sigmaf' => 'ς', - 'sigmav' => 'ς', - 'sim' => '∼', - 'simdot' => '⩪', - 'sime' => '≃', - 'simeq' => '≃', - 'simg' => '⪞', - 'simgE' => '⪠', - 'siml' => '⪝', - 'simlE' => '⪟', - 'simne' => '≆', - 'simplus' => '⨤', - 'simrarr' => '⥲', - 'slarr' => '←', - 'SmallCircle' => '∘', - 'smallsetminus' => '∖', - 'smashp' => '⨳', - 'smeparsl' => '⧤', - 'smid' => '∣', - 'smile' => '⌣', - 'smt' => '⪪', - 'smte' => '⪬', - 'smtes' => '⪬︀', - 'SOFTcy' => 'Ь', - 'softcy' => 'ь', - 'sol' => '/', - 'solb' => '⧄', - 'solbar' => '⌿', - 'Sopf' => '𝕊', - 'sopf' => '𝕤', - 'spades' => '♠', - 'spadesuit' => '♠', - 'spar' => '∥', - 'sqcap' => '⊓', - 'sqcaps' => '⊓︀', - 'sqcup' => '⊔', - 'sqcups' => '⊔︀', - 'Sqrt' => '√', - 'sqsub' => '⊏', - 'sqsube' => '⊑', - 'sqsubset' => '⊏', - 'sqsubseteq' => '⊑', - 'sqsup' => '⊐', - 'sqsupe' => '⊒', - 'sqsupset' => '⊐', - 'sqsupseteq' => '⊒', - 'squ' => '□', - 'Square' => '□', - 'square' => '□', - 'SquareIntersection' => '⊓', - 'SquareSubset' => '⊏', - 'SquareSubsetEqual' => '⊑', - 'SquareSuperset' => '⊐', - 'SquareSupersetEqual' => '⊒', - 'SquareUnion' => '⊔', - 'squarf' => '▪', - 'squf' => '▪', - 'srarr' => '→', - 'Sscr' => '𝒮', - 'sscr' => '𝓈', - 'ssetmn' => '∖', - 'ssmile' => '⌣', - 'sstarf' => '⋆', - 'Star' => '⋆', - 'star' => '☆', - 'starf' => '★', - 'straightepsilon' => 'ϵ', - 'straightphi' => 'ϕ', - 'strns' => '¯', - 'Sub' => '⋐', - 'sub' => '⊂', - 'subdot' => '⪽', - 'subE' => '⫅', - 'sube' => '⊆', - 'subedot' => '⫃', - 'submult' => '⫁', - 'subnE' => '⫋', - 'subne' => '⊊', - 'subplus' => '⪿', - 'subrarr' => '⥹', - 'Subset' => '⋐', - 'subset' => '⊂', - 'subseteq' => '⊆', - 'subseteqq' => '⫅', - 'SubsetEqual' => '⊆', - 'subsetneq' => '⊊', - 'subsetneqq' => '⫋', - 'subsim' => '⫇', - 'subsub' => '⫕', - 'subsup' => '⫓', - 'succ' => '≻', - 'succapprox' => '⪸', - 'succcurlyeq' => '≽', - 'Succeeds' => '≻', - 'SucceedsEqual' => '⪰', - 'SucceedsSlantEqual' => '≽', - 'SucceedsTilde' => '≿', - 'succeq' => '⪰', - 'succnapprox' => '⪺', - 'succneqq' => '⪶', - 'succnsim' => '⋩', - 'succsim' => '≿', - 'SuchThat' => '∋', - 'Sum' => '∑', - 'sum' => '∑', - 'sung' => '♪', - 'Sup' => '⋑', - 'sup' => '³', - 'sup1' => '¹', - 'sup2' => '²', - 'sup3' => '³', - 'supdot' => '⪾', - 'supdsub' => '⫘', - 'supE' => '⫆', - 'supe' => '⊇', - 'supedot' => '⫄', - 'Superset' => '⊃', - 'SupersetEqual' => '⊇', - 'suphsol' => '⟉', - 'suphsub' => '⫗', - 'suplarr' => '⥻', - 'supmult' => '⫂', - 'supnE' => '⫌', - 'supne' => '⊋', - 'supplus' => '⫀', - 'Supset' => '⋑', - 'supset' => '⊃', - 'supseteq' => '⊇', - 'supseteqq' => '⫆', - 'supsetneq' => '⊋', - 'supsetneqq' => '⫌', - 'supsim' => '⫈', - 'supsub' => '⫔', - 'supsup' => '⫖', - 'swarhk' => '⤦', - 'swArr' => '⇙', - 'swarr' => '↙', - 'swarrow' => '↙', - 'swnwar' => '⤪', - 'szlig' => 'ß', - 'szli' => 'ß', - 'Tab' => ' ', - 'target' => '⌖', - 'Tau' => 'Τ', - 'tau' => 'τ', - 'tbrk' => '⎴', - 'Tcaron' => 'Ť', - 'tcaron' => 'ť', - 'Tcedil' => 'Ţ', - 'tcedil' => 'ţ', - 'Tcy' => 'Т', - 'tcy' => 'т', - 'tdot' => '⃛', - 'telrec' => '⌕', - 'Tfr' => '𝔗', - 'tfr' => '𝔱', - 'there4' => '∴', - 'Therefore' => '∴', - 'therefore' => '∴', - 'Theta' => 'Θ', - 'theta' => 'θ', - 'thetasym' => 'ϑ', - 'thetav' => 'ϑ', - 'thickapprox' => '≈', - 'thicksim' => '∼', - 'ThickSpace' => '  ', - 'thinsp' => ' ', - 'ThinSpace' => ' ', - 'thkap' => '≈', - 'thksim' => '∼', - 'THORN' => 'Þ', - 'THOR' => 'Þ', - 'thorn' => 'þ', - 'thor' => 'þ', - 'Tilde' => '∼', - 'tilde' => '˜', - 'TildeEqual' => '≃', - 'TildeFullEqual' => '≅', - 'TildeTilde' => '≈', - 'times' => '×', - 'time' => '×', - 'timesb' => '⊠', - 'timesbar' => '⨱', - 'timesd' => '⨰', - 'tint' => '∭', - 'toea' => '⤨', - 'top' => '⊤', - 'topbot' => '⌶', - 'topcir' => '⫱', - 'Topf' => '𝕋', - 'topf' => '𝕥', - 'topfork' => '⫚', - 'tosa' => '⤩', - 'tprime' => '‴', - 'TRADE' => '™', - 'trade' => '™', - 'triangle' => '▵', - 'triangledown' => '▿', - 'triangleleft' => '◃', - 'trianglelefteq' => '⊴', - 'triangleq' => '≜', - 'triangleright' => '▹', - 'trianglerighteq' => '⊵', - 'tridot' => '◬', - 'trie' => '≜', - 'triminus' => '⨺', - 'TripleDot' => '⃛', - 'triplus' => '⨹', - 'trisb' => '⧍', - 'tritime' => '⨻', - 'trpezium' => '⏢', - 'Tscr' => '𝒯', - 'tscr' => '𝓉', - 'TScy' => 'Ц', - 'tscy' => 'ц', - 'TSHcy' => 'Ћ', - 'tshcy' => 'ћ', - 'Tstrok' => 'Ŧ', - 'tstrok' => 'ŧ', - 'twixt' => '≬', - 'twoheadleftarrow' => '↞', - 'twoheadrightarrow' => '↠', - 'Uacute' => 'Ú', - 'Uacut' => 'Ú', - 'uacute' => 'ú', - 'uacut' => 'ú', - 'Uarr' => '↟', - 'uArr' => '⇑', - 'uarr' => '↑', - 'Uarrocir' => '⥉', - 'Ubrcy' => 'Ў', - 'ubrcy' => 'ў', - 'Ubreve' => 'Ŭ', - 'ubreve' => 'ŭ', - 'Ucirc' => 'Û', - 'Ucir' => 'Û', - 'ucirc' => 'û', - 'ucir' => 'û', - 'Ucy' => 'У', - 'ucy' => 'у', - 'udarr' => '⇅', - 'Udblac' => 'Ű', - 'udblac' => 'ű', - 'udhar' => '⥮', - 'ufisht' => '⥾', - 'Ufr' => '𝔘', - 'ufr' => '𝔲', - 'Ugrave' => 'Ù', - 'Ugrav' => 'Ù', - 'ugrave' => 'ù', - 'ugrav' => 'ù', - 'uHar' => '⥣', - 'uharl' => '↿', - 'uharr' => '↾', - 'uhblk' => '▀', - 'ulcorn' => '⌜', - 'ulcorner' => '⌜', - 'ulcrop' => '⌏', - 'ultri' => '◸', - 'Umacr' => 'Ū', - 'umacr' => 'ū', - 'uml' => '¨', - 'um' => '¨', - 'UnderBar' => '_', - 'UnderBrace' => '⏟', - 'UnderBracket' => '⎵', - 'UnderParenthesis' => '⏝', - 'Union' => '⋃', - 'UnionPlus' => '⊎', - 'Uogon' => 'Ų', - 'uogon' => 'ų', - 'Uopf' => '𝕌', - 'uopf' => '𝕦', - 'UpArrow' => '↑', - 'Uparrow' => '⇑', - 'uparrow' => '↑', - 'UpArrowBar' => '⤒', - 'UpArrowDownArrow' => '⇅', - 'UpDownArrow' => '↕', - 'Updownarrow' => '⇕', - 'updownarrow' => '↕', - 'UpEquilibrium' => '⥮', - 'upharpoonleft' => '↿', - 'upharpoonright' => '↾', - 'uplus' => '⊎', - 'UpperLeftArrow' => '↖', - 'UpperRightArrow' => '↗', - 'Upsi' => 'ϒ', - 'upsi' => 'υ', - 'upsih' => 'ϒ', - 'Upsilon' => 'Υ', - 'upsilon' => 'υ', - 'UpTee' => '⊥', - 'UpTeeArrow' => '↥', - 'upuparrows' => '⇈', - 'urcorn' => '⌝', - 'urcorner' => '⌝', - 'urcrop' => '⌎', - 'Uring' => 'Ů', - 'uring' => 'ů', - 'urtri' => '◹', - 'Uscr' => '𝒰', - 'uscr' => '𝓊', - 'utdot' => '⋰', - 'Utilde' => 'Ũ', - 'utilde' => 'ũ', - 'utri' => '▵', - 'utrif' => '▴', - 'uuarr' => '⇈', - 'Uuml' => 'Ü', - 'Uum' => 'Ü', - 'uuml' => 'ü', - 'uum' => 'ü', - 'uwangle' => '⦧', - 'vangrt' => '⦜', - 'varepsilon' => 'ϵ', - 'varkappa' => 'ϰ', - 'varnothing' => '∅', - 'varphi' => 'ϕ', - 'varpi' => 'ϖ', - 'varpropto' => '∝', - 'vArr' => '⇕', - 'varr' => '↕', - 'varrho' => 'ϱ', - 'varsigma' => 'ς', - 'varsubsetneq' => '⊊︀', - 'varsubsetneqq' => '⫋︀', - 'varsupsetneq' => '⊋︀', - 'varsupsetneqq' => '⫌︀', - 'vartheta' => 'ϑ', - 'vartriangleleft' => '⊲', - 'vartriangleright' => '⊳', - 'Vbar' => '⫫', - 'vBar' => '⫨', - 'vBarv' => '⫩', - 'Vcy' => 'В', - 'vcy' => 'в', - 'VDash' => '⊫', - 'Vdash' => '⊩', - 'vDash' => '⊨', - 'vdash' => '⊢', - 'Vdashl' => '⫦', - 'Vee' => '⋁', - 'vee' => '∨', - 'veebar' => '⊻', - 'veeeq' => '≚', - 'vellip' => '⋮', - 'Verbar' => '‖', - 'verbar' => '|', - 'Vert' => '‖', - 'vert' => '|', - 'VerticalBar' => '∣', - 'VerticalLine' => '|', - 'VerticalSeparator' => '❘', - 'VerticalTilde' => '≀', - 'VeryThinSpace' => ' ', - 'Vfr' => '𝔙', - 'vfr' => '𝔳', - 'vltri' => '⊲', - 'vnsub' => '⊂⃒', - 'vnsup' => '⊃⃒', - 'Vopf' => '𝕍', - 'vopf' => '𝕧', - 'vprop' => '∝', - 'vrtri' => '⊳', - 'Vscr' => '𝒱', - 'vscr' => '𝓋', - 'vsubnE' => '⫋︀', - 'vsubne' => '⊊︀', - 'vsupnE' => '⫌︀', - 'vsupne' => '⊋︀', - 'Vvdash' => '⊪', - 'vzigzag' => '⦚', - 'Wcirc' => 'Ŵ', - 'wcirc' => 'ŵ', - 'wedbar' => '⩟', - 'Wedge' => '⋀', - 'wedge' => '∧', - 'wedgeq' => '≙', - 'weierp' => '℘', - 'Wfr' => '𝔚', - 'wfr' => '𝔴', - 'Wopf' => '𝕎', - 'wopf' => '𝕨', - 'wp' => '℘', - 'wr' => '≀', - 'wreath' => '≀', - 'Wscr' => '𝒲', - 'wscr' => '𝓌', - 'xcap' => '⋂', - 'xcirc' => '◯', - 'xcup' => '⋃', - 'xdtri' => '▽', - 'Xfr' => '𝔛', - 'xfr' => '𝔵', - 'xhArr' => '⟺', - 'xharr' => '⟷', - 'Xi' => 'Ξ', - 'xi' => 'ξ', - 'xlArr' => '⟸', - 'xlarr' => '⟵', - 'xmap' => '⟼', - 'xnis' => '⋻', - 'xodot' => '⨀', - 'Xopf' => '𝕏', - 'xopf' => '𝕩', - 'xoplus' => '⨁', - 'xotime' => '⨂', - 'xrArr' => '⟹', - 'xrarr' => '⟶', - 'Xscr' => '𝒳', - 'xscr' => '𝓍', - 'xsqcup' => '⨆', - 'xuplus' => '⨄', - 'xutri' => '△', - 'xvee' => '⋁', - 'xwedge' => '⋀', - 'Yacute' => 'Ý', - 'Yacut' => 'Ý', - 'yacute' => 'ý', - 'yacut' => 'ý', - 'YAcy' => 'Я', - 'yacy' => 'я', - 'Ycirc' => 'Ŷ', - 'ycirc' => 'ŷ', - 'Ycy' => 'Ы', - 'ycy' => 'ы', - 'yen' => '¥', - 'ye' => '¥', - 'Yfr' => '𝔜', - 'yfr' => '𝔶', - 'YIcy' => 'Ї', - 'yicy' => 'ї', - 'Yopf' => '𝕐', - 'yopf' => '𝕪', - 'Yscr' => '𝒴', - 'yscr' => '𝓎', - 'YUcy' => 'Ю', - 'yucy' => 'ю', - 'Yuml' => 'Ÿ', - 'yuml' => 'ÿ', - 'yum' => 'ÿ', - 'Zacute' => 'Ź', - 'zacute' => 'ź', - 'Zcaron' => 'Ž', - 'zcaron' => 'ž', - 'Zcy' => 'З', - 'zcy' => 'з', - 'Zdot' => 'Ż', - 'zdot' => 'ż', - 'zeetrf' => 'ℨ', - 'ZeroWidthSpace' => '​', - 'Zeta' => 'Ζ', - 'zeta' => 'ζ', - 'Zfr' => 'ℨ', - 'zfr' => '𝔷', - 'ZHcy' => 'Ж', - 'zhcy' => 'ж', - 'zigrarr' => '⇝', - 'Zopf' => 'ℤ', - 'zopf' => '𝕫', - 'Zscr' => '𝒵', - 'zscr' => '𝓏', - 'zwj' => '‍', - 'zwnj' => '‌', - ); -} diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Exception.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Exception.php deleted file mode 100644 index 64e97e6ff..000000000 --- a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Exception.php +++ /dev/null @@ -1,10 +0,0 @@ - self::NAMESPACE_HTML, - 'svg' => self::NAMESPACE_SVG, - 'math' => self::NAMESPACE_MATHML, - ); - - /** - * Holds the always available namespaces (which does not require the XMLNS declaration). - * - * @var array - */ - protected $implicitNamespaces = array( - 'xml' => self::NAMESPACE_XML, - 'xmlns' => self::NAMESPACE_XMLNS, - 'xlink' => self::NAMESPACE_XLINK, - ); - - /** - * Holds a stack of currently active namespaces. - * - * @var array - */ - protected $nsStack = array(); - - /** - * Holds the number of namespaces declared by a node. - * - * @var array - */ - protected $pushes = array(); - - /** - * Defined in 8.2.5. - */ - const IM_INITIAL = 0; - - const IM_BEFORE_HTML = 1; - - const IM_BEFORE_HEAD = 2; - - const IM_IN_HEAD = 3; - - const IM_IN_HEAD_NOSCRIPT = 4; - - const IM_AFTER_HEAD = 5; - - const IM_IN_BODY = 6; - - const IM_TEXT = 7; - - const IM_IN_TABLE = 8; - - const IM_IN_TABLE_TEXT = 9; - - const IM_IN_CAPTION = 10; - - const IM_IN_COLUMN_GROUP = 11; - - const IM_IN_TABLE_BODY = 12; - - const IM_IN_ROW = 13; - - const IM_IN_CELL = 14; - - const IM_IN_SELECT = 15; - - const IM_IN_SELECT_IN_TABLE = 16; - - const IM_AFTER_BODY = 17; - - const IM_IN_FRAMESET = 18; - - const IM_AFTER_FRAMESET = 19; - - const IM_AFTER_AFTER_BODY = 20; - - const IM_AFTER_AFTER_FRAMESET = 21; - - const IM_IN_SVG = 22; - - const IM_IN_MATHML = 23; - - protected $options = array(); - - protected $stack = array(); - - protected $current; // Pointer in the tag hierarchy. - protected $rules; - protected $doc; - - protected $frag; - - protected $processor; - - protected $insertMode = 0; - - /** - * Track if we are in an element that allows only inline child nodes. - * - * @var string|null - */ - protected $onlyInline; - - /** - * Quirks mode is enabled by default. - * Any document that is missing the DT will be considered to be in quirks mode. - */ - protected $quirks = true; - - protected $errors = array(); - - public function __construct($isFragment = false, array $options = array()) - { - $this->options = $options; - - if (isset($options[self::OPT_TARGET_DOC])) { - $this->doc = $options[self::OPT_TARGET_DOC]; - } else { - $impl = new \DOMImplementation(); - // XXX: - // Create the doctype. For now, we are always creating HTML5 - // documents, and attempting to up-convert any older DTDs to HTML5. - $dt = $impl->createDocumentType('html'); - // $this->doc = \DOMImplementation::createDocument(NULL, 'html', $dt); - $this->doc = $impl->createDocument(null, '', $dt); - $this->doc->encoding = !empty($options['encoding']) ? $options['encoding'] : 'UTF-8'; - } - - $this->errors = array(); - - $this->current = $this->doc; // ->documentElement; - - // Create a rules engine for tags. - $this->rules = new TreeBuildingRules(); - - $implicitNS = array(); - if (isset($this->options[self::OPT_IMPLICIT_NS])) { - $implicitNS = $this->options[self::OPT_IMPLICIT_NS]; - } elseif (isset($this->options['implicitNamespaces'])) { - $implicitNS = $this->options['implicitNamespaces']; - } - - // Fill $nsStack with the defalut HTML5 namespaces, plus the "implicitNamespaces" array taken form $options - array_unshift($this->nsStack, $implicitNS + array('' => self::NAMESPACE_HTML) + $this->implicitNamespaces); - - if ($isFragment) { - $this->insertMode = static::IM_IN_BODY; - $this->frag = $this->doc->createDocumentFragment(); - $this->current = $this->frag; - } - } - - /** - * Get the document. - */ - public function document() - { - return $this->doc; - } - - /** - * Get the DOM fragment for the body. - * - * This returns a DOMNodeList because a fragment may have zero or more - * DOMNodes at its root. - * - * @see http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#concept-frag-parse-context - * - * @return \DOMDocumentFragment - */ - public function fragment() - { - return $this->frag; - } - - /** - * Provide an instruction processor. - * - * This is used for handling Processor Instructions as they are - * inserted. If omitted, PI's are inserted directly into the DOM tree. - * - * @param InstructionProcessor $proc - */ - public function setInstructionProcessor(InstructionProcessor $proc) - { - $this->processor = $proc; - } - - public function doctype($name, $idType = 0, $id = null, $quirks = false) - { - // This is used solely for setting quirks mode. Currently we don't - // try to preserve the inbound DT. We convert it to HTML5. - $this->quirks = $quirks; - - if ($this->insertMode > static::IM_INITIAL) { - $this->parseError('Illegal placement of DOCTYPE tag. Ignoring: ' . $name); - - return; - } - - $this->insertMode = static::IM_BEFORE_HTML; - } - - /** - * Process the start tag. - * - * @todo - XMLNS namespace handling (we need to parse, even if it's not valid) - * - XLink, MathML and SVG namespace handling - * - Omission rules: 8.1.2.4 Optional tags - * - * @param string $name - * @param array $attributes - * @param bool $selfClosing - * - * @return int - */ - public function startTag($name, $attributes = array(), $selfClosing = false) - { - $lname = $this->normalizeTagName($name); - - // Make sure we have an html element. - if (!$this->doc->documentElement && 'html' !== $name && !$this->frag) { - $this->startTag('html'); - } - - // Set quirks mode if we're at IM_INITIAL with no doctype. - if ($this->insertMode === static::IM_INITIAL) { - $this->quirks = true; - $this->parseError('No DOCTYPE specified.'); - } - - // SPECIAL TAG HANDLING: - // Spec says do this, and "don't ask." - // find the spec where this is defined... looks problematic - if ('image' === $name && !($this->insertMode === static::IM_IN_SVG || $this->insertMode === static::IM_IN_MATHML)) { - $name = 'img'; - } - - // Autoclose p tags where appropriate. - if ($this->insertMode >= static::IM_IN_BODY && Elements::isA($name, Elements::AUTOCLOSE_P)) { - $this->autoclose('p'); - } - - // Set insert mode: - switch ($name) { - case 'html': - $this->insertMode = static::IM_BEFORE_HEAD; - break; - case 'head': - if ($this->insertMode > static::IM_BEFORE_HEAD) { - $this->parseError('Unexpected head tag outside of head context.'); - } else { - $this->insertMode = static::IM_IN_HEAD; - } - break; - case 'body': - $this->insertMode = static::IM_IN_BODY; - break; - case 'svg': - $this->insertMode = static::IM_IN_SVG; - break; - case 'math': - $this->insertMode = static::IM_IN_MATHML; - break; - case 'noscript': - if ($this->insertMode === static::IM_IN_HEAD) { - $this->insertMode = static::IM_IN_HEAD_NOSCRIPT; - } - break; - } - - // Special case handling for SVG. - if ($this->insertMode === static::IM_IN_SVG) { - $lname = Elements::normalizeSvgElement($lname); - } - - $pushes = 0; - // when we found a tag thats appears inside $nsRoots, we have to switch the defalut namespace - if (isset($this->nsRoots[$lname]) && $this->nsStack[0][''] !== $this->nsRoots[$lname]) { - array_unshift($this->nsStack, array( - '' => $this->nsRoots[$lname], - ) + $this->nsStack[0]); - ++$pushes; - } - $needsWorkaround = false; - if (isset($this->options['xmlNamespaces']) && $this->options['xmlNamespaces']) { - // when xmlNamespaces is true a and we found a 'xmlns' or 'xmlns:*' attribute, we should add a new item to the $nsStack - foreach ($attributes as $aName => $aVal) { - if ('xmlns' === $aName) { - $needsWorkaround = $aVal; - array_unshift($this->nsStack, array( - '' => $aVal, - ) + $this->nsStack[0]); - ++$pushes; - } elseif ('xmlns' === (($pos = strpos($aName, ':')) ? substr($aName, 0, $pos) : '')) { - array_unshift($this->nsStack, array( - substr($aName, $pos + 1) => $aVal, - ) + $this->nsStack[0]); - ++$pushes; - } - } - } - - if ($this->onlyInline && Elements::isA($lname, Elements::BLOCK_TAG)) { - $this->autoclose($this->onlyInline); - $this->onlyInline = null; - } - - try { - $prefix = ($pos = strpos($lname, ':')) ? substr($lname, 0, $pos) : ''; - - if (false !== $needsWorkaround) { - $xml = "<$lname xmlns=\"$needsWorkaround\" " . (strlen($prefix) && isset($this->nsStack[0][$prefix]) ? ("xmlns:$prefix=\"" . $this->nsStack[0][$prefix] . '"') : '') . '/>'; - - $frag = new \DOMDocument('1.0', 'UTF-8'); - $frag->loadXML($xml); - - $ele = $this->doc->importNode($frag->documentElement, true); - } else { - if (!isset($this->nsStack[0][$prefix]) || ('' === $prefix && isset($this->options[self::OPT_DISABLE_HTML_NS]) && $this->options[self::OPT_DISABLE_HTML_NS])) { - $ele = $this->doc->createElement($lname); - } else { - $ele = $this->doc->createElementNS($this->nsStack[0][$prefix], $lname); - } - } - } catch (\DOMException $e) { - $this->parseError("Illegal tag name: <$lname>. Replaced with ."); - $ele = $this->doc->createElement('invalid'); - } - - if (Elements::isA($lname, Elements::BLOCK_ONLY_INLINE)) { - $this->onlyInline = $lname; - } - - // When we add some namespacess, we have to track them. Later, when "endElement" is invoked, we have to remove them. - // When we are on a void tag, we do not need to care about namesapce nesting. - if ($pushes > 0 && !Elements::isA($name, Elements::VOID_TAG)) { - // PHP tends to free the memory used by DOM, - // to avoid spl_object_hash collisions whe have to avoid garbage collection of $ele storing it into $pushes - // see https://bugs.php.net/bug.php?id=67459 - $this->pushes[spl_object_hash($ele)] = array($pushes, $ele); - } - - foreach ($attributes as $aName => $aVal) { - // xmlns attributes can't be set - if ('xmlns' === $aName) { - continue; - } - - if ($this->insertMode === static::IM_IN_SVG) { - $aName = Elements::normalizeSvgAttribute($aName); - } elseif ($this->insertMode === static::IM_IN_MATHML) { - $aName = Elements::normalizeMathMlAttribute($aName); - } - - $aVal = (string) $aVal; - - try { - $prefix = ($pos = strpos($aName, ':')) ? substr($aName, 0, $pos) : false; - - if ('xmlns' === $prefix) { - $ele->setAttributeNS(self::NAMESPACE_XMLNS, $aName, $aVal); - } elseif (false !== $prefix && isset($this->nsStack[0][$prefix])) { - $ele->setAttributeNS($this->nsStack[0][$prefix], $aName, $aVal); - } else { - $ele->setAttribute($aName, $aVal); - } - } catch (\DOMException $e) { - $this->parseError("Illegal attribute name for tag $name. Ignoring: $aName"); - continue; - } - - // This is necessary on a non-DTD schema, like HTML5. - if ('id' === $aName) { - $ele->setIdAttribute('id', true); - } - } - - if ($this->frag !== $this->current && $this->rules->hasRules($name)) { - // Some elements have special processing rules. Handle those separately. - $this->current = $this->rules->evaluate($ele, $this->current); - } else { - // Otherwise, it's a standard element. - $this->current->appendChild($ele); - - if (!Elements::isA($name, Elements::VOID_TAG)) { - $this->current = $ele; - } - - // Self-closing tags should only be respected on foreign elements - // (and are implied on void elements) - // See: https://www.w3.org/TR/html5/syntax.html#start-tags - if (Elements::isHtml5Element($name)) { - $selfClosing = false; - } - } - - // This is sort of a last-ditch attempt to correct for cases where no head/body - // elements are provided. - if ($this->insertMode <= static::IM_BEFORE_HEAD && 'head' !== $name && 'html' !== $name) { - $this->insertMode = static::IM_IN_BODY; - } - - // When we are on a void tag, we do not need to care about namesapce nesting, - // but we have to remove the namespaces pushed to $nsStack. - if ($pushes > 0 && Elements::isA($name, Elements::VOID_TAG)) { - // remove the namespaced definded by current node - for ($i = 0; $i < $pushes; ++$i) { - array_shift($this->nsStack); - } - } - - if ($selfClosing) { - $this->endTag($name); - } - - // Return the element mask, which the tokenizer can then use to set - // various processing rules. - return Elements::element($name); - } - - public function endTag($name) - { - $lname = $this->normalizeTagName($name); - - // Special case within 12.2.6.4.7: An end tag whose tag name is "br" should be treated as an opening tag - if ('br' === $name) { - $this->parseError('Closing tag encountered for void element br.'); - - $this->startTag('br'); - } - // Ignore closing tags for other unary elements. - elseif (Elements::isA($name, Elements::VOID_TAG)) { - return; - } - - if ($this->insertMode <= static::IM_BEFORE_HTML) { - // 8.2.5.4.2 - if (in_array($name, array( - 'html', - 'br', - 'head', - 'title', - ))) { - $this->startTag('html'); - $this->endTag($name); - $this->insertMode = static::IM_BEFORE_HEAD; - - return; - } - - // Ignore the tag. - $this->parseError('Illegal closing tag at global scope.'); - - return; - } - - // Special case handling for SVG. - if ($this->insertMode === static::IM_IN_SVG) { - $lname = Elements::normalizeSvgElement($lname); - } - - $cid = spl_object_hash($this->current); - - // XXX: HTML has no parent. What do we do, though, - // if this element appears in the wrong place? - if ('html' === $lname) { - return; - } - - // remove the namespaced definded by current node - if (isset($this->pushes[$cid])) { - for ($i = 0; $i < $this->pushes[$cid][0]; ++$i) { - array_shift($this->nsStack); - } - unset($this->pushes[$cid]); - } - - if (!$this->autoclose($lname)) { - $this->parseError('Could not find closing tag for ' . $lname); - } - - switch ($lname) { - case 'head': - $this->insertMode = static::IM_AFTER_HEAD; - break; - case 'body': - $this->insertMode = static::IM_AFTER_BODY; - break; - case 'svg': - case 'mathml': - $this->insertMode = static::IM_IN_BODY; - break; - } - } - - public function comment($cdata) - { - // TODO: Need to handle case where comment appears outside of the HTML tag. - $node = $this->doc->createComment($cdata); - $this->current->appendChild($node); - } - - public function text($data) - { - // XXX: Hmmm.... should we really be this strict? - if ($this->insertMode < static::IM_IN_HEAD) { - // Per '8.2.5.4.3 The "before head" insertion mode' the characters - // " \t\n\r\f" should be ignored but no mention of a parse error. This is - // practical as most documents contain these characters. Other text is not - // expected here so recording a parse error is necessary. - $dataTmp = trim($data, " \t\n\r\f"); - if (!empty($dataTmp)) { - // fprintf(STDOUT, "Unexpected insert mode: %d", $this->insertMode); - $this->parseError('Unexpected text. Ignoring: ' . $dataTmp); - } - - return; - } - // fprintf(STDOUT, "Appending text %s.", $data); - $node = $this->doc->createTextNode($data); - $this->current->appendChild($node); - } - - public function eof() - { - // If the $current isn't the $root, do we need to do anything? - } - - public function parseError($msg, $line = 0, $col = 0) - { - $this->errors[] = sprintf('Line %d, Col %d: %s', $line, $col, $msg); - } - - public function getErrors() - { - return $this->errors; - } - - public function cdata($data) - { - $node = $this->doc->createCDATASection($data); - $this->current->appendChild($node); - } - - public function processingInstruction($name, $data = null) - { - // XXX: Ignore initial XML declaration, per the spec. - if ($this->insertMode === static::IM_INITIAL && 'xml' === strtolower($name)) { - return; - } - - // Important: The processor may modify the current DOM tree however it sees fit. - if ($this->processor instanceof InstructionProcessor) { - $res = $this->processor->process($this->current, $name, $data); - if (!empty($res)) { - $this->current = $res; - } - - return; - } - - // Otherwise, this is just a dumb PI element. - $node = $this->doc->createProcessingInstruction($name, $data); - - $this->current->appendChild($node); - } - - // ========================================================================== - // UTILITIES - // ========================================================================== - - /** - * Apply normalization rules to a tag name. - * See sections 2.9 and 8.1.2. - * - * @param string $tagName - * - * @return string The normalized tag name. - */ - protected function normalizeTagName($tagName) - { - /* - * Section 2.9 suggests that we should not do this. if (strpos($name, ':') !== false) { // We know from the grammar that there must be at least one other // char besides :, since : is not a legal tag start. $parts = explode(':', $name); return array_pop($parts); } - */ - return $tagName; - } - - protected function quirksTreeResolver($name) - { - throw new \Exception('Not implemented.'); - } - - /** - * Automatically climb the tree and close the closest node with the matching $tag. - * - * @param string $tagName - * - * @return bool - */ - protected function autoclose($tagName) - { - $working = $this->current; - do { - if (XML_ELEMENT_NODE !== $working->nodeType) { - return false; - } - if ($working->tagName === $tagName) { - $this->current = $working->parentNode; - - return true; - } - } while ($working = $working->parentNode); - - return false; - } - - /** - * Checks if the given tagname is an ancestor of the present candidate. - * - * If $this->current or anything above $this->current matches the given tag - * name, this returns true. - * - * @param string $tagName - * - * @return bool - */ - protected function isAncestor($tagName) - { - $candidate = $this->current; - while (XML_ELEMENT_NODE === $candidate->nodeType) { - if ($candidate->tagName === $tagName) { - return true; - } - $candidate = $candidate->parentNode; - } - - return false; - } - - /** - * Returns true if the immediate parent element is of the given tagname. - * - * @param string $tagName - * - * @return bool - */ - protected function isParent($tagName) - { - return $this->current->tagName === $tagName; - } -} diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php deleted file mode 100644 index 9893a718b..000000000 --- a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php +++ /dev/null @@ -1,114 +0,0 @@ -). - * - * @return int one of the Tokenizer::TEXTMODE_* constants - */ - public function startTag($name, $attributes = array(), $selfClosing = false); - - /** - * An end-tag. - */ - public function endTag($name); - - /** - * A comment section (unparsed character data). - */ - public function comment($cdata); - - /** - * A unit of parsed character data. - * - * Entities in this text are *already decoded*. - */ - public function text($cdata); - - /** - * Indicates that the document has been entirely processed. - */ - public function eof(); - - /** - * Emitted when the parser encounters an error condition. - */ - public function parseError($msg, $line, $col); - - /** - * A CDATA section. - * - * @param string $data - * The unparsed character data - */ - public function cdata($data); - - /** - * This is a holdover from the XML spec. - * - * While user agents don't get PIs, server-side does. - * - * @param string $name The name of the processor (e.g. 'php'). - * @param string $data The unparsed data. - */ - public function processingInstruction($name, $data = null); -} diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php deleted file mode 100644 index b081ed96b..000000000 --- a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php +++ /dev/null @@ -1,33 +0,0 @@ -errors = UTF8Utils::checkForIllegalCodepoints($data); - - $data = $this->replaceLinefeeds($data); - - $this->data = $data; - $this->char = 0; - $this->EOF = strlen($data); - } - - /** - * Check if upcomming chars match the given sequence. - * - * This will read the stream for the $sequence. If it's - * found, this will return true. If not, return false. - * Since this unconsumes any chars it reads, the caller - * will still need to read the next sequence, even if - * this returns true. - * - * Example: $this->scanner->sequenceMatches('') will - * see if the input stream is at the start of a - * '' string. - * - * @param string $sequence - * @param bool $caseSensitive - * - * @return bool - */ - public function sequenceMatches($sequence, $caseSensitive = true) - { - $portion = substr($this->data, $this->char, strlen($sequence)); - - return $caseSensitive ? $portion === $sequence : 0 === strcasecmp($portion, $sequence); - } - - /** - * Get the current position. - * - * @return int The current intiger byte position. - */ - public function position() - { - return $this->char; - } - - /** - * Take a peek at the next character in the data. - * - * @return string The next character. - */ - public function peek() - { - if (($this->char + 1) <= $this->EOF) { - return $this->data[$this->char + 1]; - } - - return false; - } - - /** - * Get the next character. - * Note: This advances the pointer. - * - * @return string The next character. - */ - public function next() - { - ++$this->char; - - if ($this->char < $this->EOF) { - return $this->data[$this->char]; - } - - return false; - } - - /** - * Get the current character. - * Note, this does not advance the pointer. - * - * @return string The current character. - */ - public function current() - { - if ($this->char < $this->EOF) { - return $this->data[$this->char]; - } - - return false; - } - - /** - * Silently consume N chars. - * - * @param int $count - */ - public function consume($count = 1) - { - $this->char += $count; - } - - /** - * Unconsume some of the data. - * This moves the data pointer backwards. - * - * @param int $howMany The number of characters to move the pointer back. - */ - public function unconsume($howMany = 1) - { - if (($this->char - $howMany) >= 0) { - $this->char -= $howMany; - } - } - - /** - * Get the next group of that contains hex characters. - * Note, along with getting the characters the pointer in the data will be - * moved as well. - * - * @return string The next group that is hex characters. - */ - public function getHex() - { - return $this->doCharsWhile(static::CHARS_HEX); - } - - /** - * Get the next group of characters that are ASCII Alpha characters. - * Note, along with getting the characters the pointer in the data will be - * moved as well. - * - * @return string The next group of ASCII alpha characters. - */ - public function getAsciiAlpha() - { - return $this->doCharsWhile(static::CHARS_ALPHA); - } - - /** - * Get the next group of characters that are ASCII Alpha characters and numbers. - * Note, along with getting the characters the pointer in the data will be - * moved as well. - * - * @return string The next group of ASCII alpha characters and numbers. - */ - public function getAsciiAlphaNum() - { - return $this->doCharsWhile(static::CHARS_ALNUM); - } - - /** - * Get the next group of numbers. - * Note, along with getting the characters the pointer in the data will be - * moved as well. - * - * @return string The next group of numbers. - */ - public function getNumeric() - { - return $this->doCharsWhile('0123456789'); - } - - /** - * Consume whitespace. - * Whitespace in HTML5 is: formfeed, tab, newline, space. - * - * @return int The length of the matched whitespaces. - */ - public function whitespace() - { - if ($this->char >= $this->EOF) { - return false; - } - - $len = strspn($this->data, "\n\t\f ", $this->char); - - $this->char += $len; - - return $len; - } - - /** - * Returns the current line that is being consumed. - * - * @return int The current line number. - */ - public function currentLine() - { - if (empty($this->EOF) || 0 === $this->char) { - return 1; - } - - // Add one to $this->char because we want the number for the next - // byte to be processed. - return substr_count($this->data, "\n", 0, min($this->char, $this->EOF)) + 1; - } - - /** - * Read chars until something in the mask is encountered. - * - * @param string $mask - * - * @return mixed - */ - public function charsUntil($mask) - { - return $this->doCharsUntil($mask); - } - - /** - * Read chars as long as the mask matches. - * - * @param string $mask - * - * @return int - */ - public function charsWhile($mask) - { - return $this->doCharsWhile($mask); - } - - /** - * Returns the current column of the current line that the tokenizer is at. - * - * Newlines are column 0. The first char after a newline is column 1. - * - * @return int The column number. - */ - public function columnOffset() - { - // Short circuit for the first char. - if (0 === $this->char) { - return 0; - } - - // strrpos is weird, and the offset needs to be negative for what we - // want (i.e., the last \n before $this->char). This needs to not have - // one (to make it point to the next character, the one we want the - // position of) added to it because strrpos's behaviour includes the - // final offset byte. - $backwardFrom = $this->char - 1 - strlen($this->data); - $lastLine = strrpos($this->data, "\n", $backwardFrom); - - // However, for here we want the length up until the next byte to be - // processed, so add one to the current byte ($this->char). - if (false !== $lastLine) { - $findLengthOf = substr($this->data, $lastLine + 1, $this->char - 1 - $lastLine); - } else { - // After a newline. - $findLengthOf = substr($this->data, 0, $this->char); - } - - return UTF8Utils::countChars($findLengthOf); - } - - /** - * Get all characters until EOF. - * - * This consumes characters until the EOF. - * - * @return int The number of characters remaining. - */ - public function remainingChars() - { - if ($this->char < $this->EOF) { - $data = substr($this->data, $this->char); - $this->char = $this->EOF; - - return $data; - } - - return ''; // false; - } - - /** - * Replace linefeed characters according to the spec. - * - * @param $data - * - * @return string - */ - private function replaceLinefeeds($data) - { - /* - * U+000D CARRIAGE RETURN (CR) characters and U+000A LINE FEED (LF) characters are treated specially. - * Any CR characters that are followed by LF characters must be removed, and any CR characters not - * followed by LF characters must be converted to LF characters. Thus, newlines in HTML DOMs are - * represented by LF characters, and there are never any CR characters in the input to the tokenization - * stage. - */ - $crlfTable = array( - "\0" => "\xEF\xBF\xBD", - "\r\n" => "\n", - "\r" => "\n", - ); - - return strtr($data, $crlfTable); - } - - /** - * Read to a particular match (or until $max bytes are consumed). - * - * This operates on byte sequences, not characters. - * - * Matches as far as possible until we reach a certain set of bytes - * and returns the matched substring. - * - * @param string $bytes Bytes to match. - * @param int $max Maximum number of bytes to scan. - * - * @return mixed Index or false if no match is found. You should use strong - * equality when checking the result, since index could be 0. - */ - private function doCharsUntil($bytes, $max = null) - { - if ($this->char >= $this->EOF) { - return false; - } - - if (0 === $max || $max) { - $len = strcspn($this->data, $bytes, $this->char, $max); - } else { - $len = strcspn($this->data, $bytes, $this->char); - } - - $string = (string) substr($this->data, $this->char, $len); - $this->char += $len; - - return $string; - } - - /** - * Returns the string so long as $bytes matches. - * - * Matches as far as possible with a certain set of bytes - * and returns the matched substring. - * - * @param string $bytes A mask of bytes to match. If ANY byte in this mask matches the - * current char, the pointer advances and the char is part of the - * substring. - * @param int $max The max number of chars to read. - * - * @return string - */ - private function doCharsWhile($bytes, $max = null) - { - if ($this->char >= $this->EOF) { - return false; - } - - if (0 === $max || $max) { - $len = strspn($this->data, $bytes, $this->char, $max); - } else { - $len = strspn($this->data, $bytes, $this->char); - } - - $string = (string) substr($this->data, $this->char, $len); - $this->char += $len; - - return $string; - } -} diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php deleted file mode 100644 index 75b088610..000000000 --- a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php +++ /dev/null @@ -1,336 +0,0 @@ - - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -*/ - -// Some conventions: -// - /* */ indicates verbatim text from the HTML 5 specification -// MPB: Not sure which version of the spec. Moving from HTML5lib to -// HTML5-PHP, I have been using this version: -// http://www.w3.org/TR/2012/CR-html5-20121217/Overview.html#contents -// -// - // indicates regular comments - -/** - * @deprecated since 2.4, to remove in 3.0. Use a string in the scanner instead. - */ -class StringInputStream implements InputStream -{ - /** - * The string data we're parsing. - */ - private $data; - - /** - * The current integer byte position we are in $data. - */ - private $char; - - /** - * Length of $data; when $char === $data, we are at the end-of-file. - */ - private $EOF; - - /** - * Parse errors. - */ - public $errors = array(); - - /** - * Create a new InputStream wrapper. - * - * @param string $data Data to parse. - * @param string $encoding The encoding to use for the data. - * @param string $debug A fprintf format to use to echo the data on stdout. - */ - public function __construct($data, $encoding = 'UTF-8', $debug = '') - { - $data = UTF8Utils::convertToUTF8($data, $encoding); - if ($debug) { - fprintf(STDOUT, $debug, $data, strlen($data)); - } - - // There is good reason to question whether it makes sense to - // do this here, since most of these checks are done during - // parsing, and since this check doesn't actually *do* anything. - $this->errors = UTF8Utils::checkForIllegalCodepoints($data); - - $data = $this->replaceLinefeeds($data); - - $this->data = $data; - $this->char = 0; - $this->EOF = strlen($data); - } - - public function __toString() - { - return $this->data; - } - - /** - * Replace linefeed characters according to the spec. - */ - protected function replaceLinefeeds($data) - { - /* - * U+000D CARRIAGE RETURN (CR) characters and U+000A LINE FEED (LF) characters are treated specially. - * Any CR characters that are followed by LF characters must be removed, and any CR characters not - * followed by LF characters must be converted to LF characters. Thus, newlines in HTML DOMs are - * represented by LF characters, and there are never any CR characters in the input to the tokenization - * stage. - */ - $crlfTable = array( - "\0" => "\xEF\xBF\xBD", - "\r\n" => "\n", - "\r" => "\n", - ); - - return strtr($data, $crlfTable); - } - - /** - * Returns the current line that the tokenizer is at. - */ - public function currentLine() - { - if (empty($this->EOF) || 0 === $this->char) { - return 1; - } - // Add one to $this->char because we want the number for the next - // byte to be processed. - return substr_count($this->data, "\n", 0, min($this->char, $this->EOF)) + 1; - } - - /** - * @deprecated - */ - public function getCurrentLine() - { - return $this->currentLine(); - } - - /** - * Returns the current column of the current line that the tokenizer is at. - * Newlines are column 0. The first char after a newline is column 1. - * - * @return int The column number. - */ - public function columnOffset() - { - // Short circuit for the first char. - if (0 === $this->char) { - return 0; - } - // strrpos is weird, and the offset needs to be negative for what we - // want (i.e., the last \n before $this->char). This needs to not have - // one (to make it point to the next character, the one we want the - // position of) added to it because strrpos's behaviour includes the - // final offset byte. - $backwardFrom = $this->char - 1 - strlen($this->data); - $lastLine = strrpos($this->data, "\n", $backwardFrom); - - // However, for here we want the length up until the next byte to be - // processed, so add one to the current byte ($this->char). - if (false !== $lastLine) { - $findLengthOf = substr($this->data, $lastLine + 1, $this->char - 1 - $lastLine); - } else { - // After a newline. - $findLengthOf = substr($this->data, 0, $this->char); - } - - return UTF8Utils::countChars($findLengthOf); - } - - /** - * @deprecated - */ - public function getColumnOffset() - { - return $this->columnOffset(); - } - - /** - * Get the current character. - * - * @return string The current character. - */ - #[\ReturnTypeWillChange] - public function current() - { - return $this->data[$this->char]; - } - - /** - * Advance the pointer. - * This is part of the Iterator interface. - */ - #[\ReturnTypeWillChange] - public function next() - { - ++$this->char; - } - - /** - * Rewind to the start of the string. - */ - #[\ReturnTypeWillChange] - public function rewind() - { - $this->char = 0; - } - - /** - * Is the current pointer location valid. - * - * @return bool Whether the current pointer location is valid. - */ - #[\ReturnTypeWillChange] - public function valid() - { - return $this->char < $this->EOF; - } - - /** - * Get all characters until EOF. - * - * This reads to the end of the file, and sets the read marker at the - * end of the file. - * - * Note this performs bounds checking. - * - * @return string Returns the remaining text. If called when the InputStream is - * already exhausted, it returns an empty string. - */ - public function remainingChars() - { - if ($this->char < $this->EOF) { - $data = substr($this->data, $this->char); - $this->char = $this->EOF; - - return $data; - } - - return ''; // false; - } - - /** - * Read to a particular match (or until $max bytes are consumed). - * - * This operates on byte sequences, not characters. - * - * Matches as far as possible until we reach a certain set of bytes - * and returns the matched substring. - * - * @param string $bytes Bytes to match. - * @param int $max Maximum number of bytes to scan. - * - * @return mixed Index or false if no match is found. You should use strong - * equality when checking the result, since index could be 0. - */ - public function charsUntil($bytes, $max = null) - { - if ($this->char >= $this->EOF) { - return false; - } - - if (0 === $max || $max) { - $len = strcspn($this->data, $bytes, $this->char, $max); - } else { - $len = strcspn($this->data, $bytes, $this->char); - } - - $string = (string) substr($this->data, $this->char, $len); - $this->char += $len; - - return $string; - } - - /** - * Returns the string so long as $bytes matches. - * - * Matches as far as possible with a certain set of bytes - * and returns the matched substring. - * - * @param string $bytes A mask of bytes to match. If ANY byte in this mask matches the - * current char, the pointer advances and the char is part of the - * substring. - * @param int $max The max number of chars to read. - * - * @return string - */ - public function charsWhile($bytes, $max = null) - { - if ($this->char >= $this->EOF) { - return false; - } - - if (0 === $max || $max) { - $len = strspn($this->data, $bytes, $this->char, $max); - } else { - $len = strspn($this->data, $bytes, $this->char); - } - $string = (string) substr($this->data, $this->char, $len); - $this->char += $len; - - return $string; - } - - /** - * Unconsume characters. - * - * @param int $howMany The number of characters to unconsume. - */ - public function unconsume($howMany = 1) - { - if (($this->char - $howMany) >= 0) { - $this->char -= $howMany; - } - } - - /** - * Look ahead without moving cursor. - */ - public function peek() - { - if (($this->char + 1) <= $this->EOF) { - return $this->data[$this->char + 1]; - } - - return false; - } - - #[\ReturnTypeWillChange] - public function key() - { - return $this->char; - } -} diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php deleted file mode 100644 index 300a44626..000000000 --- a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php +++ /dev/null @@ -1,1191 +0,0 @@ -scanner = $scanner; - $this->events = $eventHandler; - $this->mode = $mode; - } - - /** - * Begin parsing. - * - * This will begin scanning the document, tokenizing as it goes. - * Tokens are emitted into the event handler. - * - * Tokenizing will continue until the document is completely - * read. Errors are emitted into the event handler, but - * the parser will attempt to continue parsing until the - * entire input stream is read. - */ - public function parse() - { - do { - $this->consumeData(); - // FIXME: Add infinite loop protection. - } while ($this->carryOn); - } - - /** - * Set the text mode for the character data reader. - * - * HTML5 defines three different modes for reading text: - * - Normal: Read until a tag is encountered. - * - RCDATA: Read until a tag is encountered, but skip a few otherwise- - * special characters. - * - Raw: Read until a special closing tag is encountered (viz. pre, script) - * - * This allows those modes to be set. - * - * Normally, setting is done by the event handler via a special return code on - * startTag(), but it can also be set manually using this function. - * - * @param int $textmode One of Elements::TEXT_*. - * @param string $untilTag The tag that should stop RAW or RCDATA mode. Normal mode does not - * use this indicator. - */ - public function setTextMode($textmode, $untilTag = null) - { - $this->textMode = $textmode & (Elements::TEXT_RAW | Elements::TEXT_RCDATA); - $this->untilTag = $untilTag; - } - - /** - * Consume a character and make a move. - * HTML5 8.2.4.1. - */ - protected function consumeData() - { - $tok = $this->scanner->current(); - - if ('&' === $tok) { - // Character reference - $ref = $this->decodeCharacterReference(); - $this->buffer($ref); - - $tok = $this->scanner->current(); - } - - // Parse tag - if ('<' === $tok) { - // Any buffered text data can go out now. - $this->flushBuffer(); - - $tok = $this->scanner->next(); - - if ('!' === $tok) { - $this->markupDeclaration(); - } elseif ('/' === $tok) { - $this->endTag(); - } elseif ('?' === $tok) { - $this->processingInstruction(); - } elseif (ctype_alpha($tok)) { - $this->tagName(); - } else { - $this->parseError('Illegal tag opening'); - // TODO is this necessary ? - $this->characterData(); - } - - $tok = $this->scanner->current(); - } - - if (false === $tok) { - // Handle end of document - $this->eof(); - } else { - // Parse character - switch ($this->textMode) { - case Elements::TEXT_RAW: - $this->rawText($tok); - break; - - case Elements::TEXT_RCDATA: - $this->rcdata($tok); - break; - - default: - if ('<' === $tok || '&' === $tok) { - break; - } - - // NULL character - if ("\00" === $tok) { - $this->parseError('Received null character.'); - - $this->text .= $tok; - $this->scanner->consume(); - - break; - } - - $this->text .= $this->scanner->charsUntil("<&\0"); - } - } - - return $this->carryOn; - } - - /** - * Parse anything that looks like character data. - * - * Different rules apply based on the current text mode. - * - * @see Elements::TEXT_RAW Elements::TEXT_RCDATA. - */ - protected function characterData() - { - $tok = $this->scanner->current(); - if (false === $tok) { - return false; - } - switch ($this->textMode) { - case Elements::TEXT_RAW: - return $this->rawText($tok); - case Elements::TEXT_RCDATA: - return $this->rcdata($tok); - default: - if ('<' === $tok || '&' === $tok) { - return false; - } - - return $this->text($tok); - } - } - - /** - * This buffers the current token as character data. - * - * @param string $tok The current token. - * - * @return bool - */ - protected function text($tok) - { - // This should never happen... - if (false === $tok) { - return false; - } - - // NULL character - if ("\00" === $tok) { - $this->parseError('Received null character.'); - } - - $this->buffer($tok); - $this->scanner->consume(); - - return true; - } - - /** - * Read text in RAW mode. - * - * @param string $tok The current token. - * - * @return bool - */ - protected function rawText($tok) - { - if (is_null($this->untilTag)) { - return $this->text($tok); - } - - $sequence = 'untilTag . '>'; - $txt = $this->readUntilSequence($sequence); - $this->events->text($txt); - $this->setTextMode(0); - - return $this->endTag(); - } - - /** - * Read text in RCDATA mode. - * - * @param string $tok The current token. - * - * @return bool - */ - protected function rcdata($tok) - { - if (is_null($this->untilTag)) { - return $this->text($tok); - } - - $sequence = 'untilTag; - $txt = ''; - - $caseSensitive = !Elements::isHtml5Element($this->untilTag); - while (false !== $tok && !('<' == $tok && ($this->scanner->sequenceMatches($sequence, $caseSensitive)))) { - if ('&' == $tok) { - $txt .= $this->decodeCharacterReference(); - $tok = $this->scanner->current(); - } else { - $txt .= $tok; - $tok = $this->scanner->next(); - } - } - $len = strlen($sequence); - $this->scanner->consume($len); - $len += $this->scanner->whitespace(); - if ('>' !== $this->scanner->current()) { - $this->parseError('Unclosed RCDATA end tag'); - } - - $this->scanner->unconsume($len); - $this->events->text($txt); - $this->setTextMode(0); - - return $this->endTag(); - } - - /** - * If the document is read, emit an EOF event. - */ - protected function eof() - { - // fprintf(STDOUT, "EOF"); - $this->flushBuffer(); - $this->events->eof(); - $this->carryOn = false; - } - - /** - * Look for markup. - */ - protected function markupDeclaration() - { - $tok = $this->scanner->next(); - - // Comment: - if ('-' == $tok && '-' == $this->scanner->peek()) { - $this->scanner->consume(2); - - return $this->comment(); - } elseif ('D' == $tok || 'd' == $tok) { // Doctype - return $this->doctype(); - } elseif ('[' == $tok) { // CDATA section - return $this->cdataSection(); - } - - // FINISH - $this->parseError('Expected . Emit an empty comment because 8.2.4.46 says to. - if ('>' == $tok) { - // Parse error. Emit the comment token. - $this->parseError("Expected comment data, got '>'"); - $this->events->comment(''); - $this->scanner->consume(); - - return true; - } - - // Replace NULL with the replacement char. - if ("\0" == $tok) { - $tok = UTF8Utils::FFFD; - } - while (!$this->isCommentEnd()) { - $comment .= $tok; - $tok = $this->scanner->next(); - } - - $this->events->comment($comment); - $this->scanner->consume(); - - return true; - } - - /** - * Check if the scanner has reached the end of a comment. - * - * @return bool - */ - protected function isCommentEnd() - { - $tok = $this->scanner->current(); - - // EOF - if (false === $tok) { - // Hit the end. - $this->parseError('Unexpected EOF in a comment.'); - - return true; - } - - // If it doesn't start with -, not the end. - if ('-' != $tok) { - return false; - } - - // Advance one, and test for '->' - if ('-' == $this->scanner->next() && '>' == $this->scanner->peek()) { - $this->scanner->consume(); // Consume the last '>' - return true; - } - // Unread '-'; - $this->scanner->unconsume(1); - - return false; - } - - /** - * Parse a DOCTYPE. - * - * Parse a DOCTYPE declaration. This method has strong bearing on whether or - * not Quirksmode is enabled on the event handler. - * - * @todo This method is a little long. Should probably refactor. - * - * @return bool - */ - protected function doctype() - { - // Check that string is DOCTYPE. - if ($this->scanner->sequenceMatches('DOCTYPE', false)) { - $this->scanner->consume(7); - } else { - $chars = $this->scanner->charsWhile('DOCTYPEdoctype'); - $this->parseError('Expected DOCTYPE, got %s', $chars); - - return $this->bogusComment('scanner->whitespace(); - $tok = $this->scanner->current(); - - // EOF: die. - if (false === $tok) { - $this->events->doctype('html5', EventHandler::DOCTYPE_NONE, '', true); - $this->eof(); - - return true; - } - - // NULL char: convert. - if ("\0" === $tok) { - $this->parseError('Unexpected null character in DOCTYPE.'); - } - - $stop = " \n\f>"; - $doctypeName = $this->scanner->charsUntil($stop); - // Lowercase ASCII, replace \0 with FFFD - $doctypeName = strtolower(strtr($doctypeName, "\0", UTF8Utils::FFFD)); - - $tok = $this->scanner->current(); - - // If false, emit a parse error, DOCTYPE, and return. - if (false === $tok) { - $this->parseError('Unexpected EOF in DOCTYPE declaration.'); - $this->events->doctype($doctypeName, EventHandler::DOCTYPE_NONE, null, true); - - return true; - } - - // Short DOCTYPE, like - if ('>' == $tok) { - // DOCTYPE without a name. - if (0 == strlen($doctypeName)) { - $this->parseError('Expected a DOCTYPE name. Got nothing.'); - $this->events->doctype($doctypeName, 0, null, true); - $this->scanner->consume(); - - return true; - } - $this->events->doctype($doctypeName); - $this->scanner->consume(); - - return true; - } - $this->scanner->whitespace(); - - $pub = strtoupper($this->scanner->getAsciiAlpha()); - $white = $this->scanner->whitespace(); - - // Get ID, and flag it as pub or system. - if (('PUBLIC' == $pub || 'SYSTEM' == $pub) && $white > 0) { - // Get the sys ID. - $type = 'PUBLIC' == $pub ? EventHandler::DOCTYPE_PUBLIC : EventHandler::DOCTYPE_SYSTEM; - $id = $this->quotedString("\0>"); - if (false === $id) { - $this->events->doctype($doctypeName, $type, $pub, false); - - return true; - } - - // Premature EOF. - if (false === $this->scanner->current()) { - $this->parseError('Unexpected EOF in DOCTYPE'); - $this->events->doctype($doctypeName, $type, $id, true); - - return true; - } - - // Well-formed complete DOCTYPE. - $this->scanner->whitespace(); - if ('>' == $this->scanner->current()) { - $this->events->doctype($doctypeName, $type, $id, false); - $this->scanner->consume(); - - return true; - } - - // If we get here, we have scanner->charsUntil('>'); - $this->parseError('Malformed DOCTYPE.'); - $this->events->doctype($doctypeName, $type, $id, true); - $this->scanner->consume(); - - return true; - } - - // Else it's a bogus DOCTYPE. - // Consume to > and trash. - $this->scanner->charsUntil('>'); - - $this->parseError('Expected PUBLIC or SYSTEM. Got %s.', $pub); - $this->events->doctype($doctypeName, 0, null, true); - $this->scanner->consume(); - - return true; - } - - /** - * Utility for reading a quoted string. - * - * @param string $stopchars Characters (in addition to a close-quote) that should stop the string. - * E.g. sometimes '>' is higher precedence than '"' or "'". - * - * @return mixed String if one is found (quotations omitted). - */ - protected function quotedString($stopchars) - { - $tok = $this->scanner->current(); - if ('"' == $tok || "'" == $tok) { - $this->scanner->consume(); - $ret = $this->scanner->charsUntil($tok . $stopchars); - if ($this->scanner->current() == $tok) { - $this->scanner->consume(); - } else { - // Parse error because no close quote. - $this->parseError('Expected %s, got %s', $tok, $this->scanner->current()); - } - - return $ret; - } - - return false; - } - - /** - * Handle a CDATA section. - * - * @return bool - */ - protected function cdataSection() - { - $cdata = ''; - $this->scanner->consume(); - - $chars = $this->scanner->charsWhile('CDAT'); - if ('CDATA' != $chars || '[' != $this->scanner->current()) { - $this->parseError('Expected [CDATA[, got %s', $chars); - - return $this->bogusComment('scanner->next(); - do { - if (false === $tok) { - $this->parseError('Unexpected EOF inside CDATA.'); - $this->bogusComment('scanner->next(); - } while (!$this->scanner->sequenceMatches(']]>')); - - // Consume ]]> - $this->scanner->consume(3); - - $this->events->cdata($cdata); - - return true; - } - - // ================================================================ - // Non-HTML5 - // ================================================================ - - /** - * Handle a processing instruction. - * - * XML processing instructions are supposed to be ignored in HTML5, - * treated as "bogus comments". However, since we're not a user - * agent, we allow them. We consume until ?> and then issue a - * EventListener::processingInstruction() event. - * - * @return bool - */ - protected function processingInstruction() - { - if ('?' != $this->scanner->current()) { - return false; - } - - $tok = $this->scanner->next(); - $procName = $this->scanner->getAsciiAlpha(); - $white = $this->scanner->whitespace(); - - // If not a PI, send to bogusComment. - if (0 == strlen($procName) || 0 == $white || false == $this->scanner->current()) { - $this->parseError("Expected processing instruction name, got $tok"); - $this->bogusComment('. - while (!('?' == $this->scanner->current() && '>' == $this->scanner->peek())) { - $data .= $this->scanner->current(); - - $tok = $this->scanner->next(); - if (false === $tok) { - $this->parseError('Unexpected EOF in processing instruction.'); - $this->events->processingInstruction($procName, $data); - - return true; - } - } - - $this->scanner->consume(2); // Consume the closing tag - $this->events->processingInstruction($procName, $data); - - return true; - } - - // ================================================================ - // UTILITY FUNCTIONS - // ================================================================ - - /** - * Read from the input stream until we get to the desired sequene - * or hit the end of the input stream. - * - * @param string $sequence - * - * @return string - */ - protected function readUntilSequence($sequence) - { - $buffer = ''; - - // Optimization for reading larger blocks faster. - $first = substr($sequence, 0, 1); - while (false !== $this->scanner->current()) { - $buffer .= $this->scanner->charsUntil($first); - - // Stop as soon as we hit the stopping condition. - if ($this->scanner->sequenceMatches($sequence, false)) { - return $buffer; - } - $buffer .= $this->scanner->current(); - $this->scanner->consume(); - } - - // If we get here, we hit the EOF. - $this->parseError('Unexpected EOF during text read.'); - - return $buffer; - } - - /** - * Check if upcomming chars match the given sequence. - * - * This will read the stream for the $sequence. If it's - * found, this will return true. If not, return false. - * Since this unconsumes any chars it reads, the caller - * will still need to read the next sequence, even if - * this returns true. - * - * Example: $this->scanner->sequenceMatches('') will - * see if the input stream is at the start of a - * '' string. - * - * @param string $sequence - * @param bool $caseSensitive - * - * @return bool - */ - protected function sequenceMatches($sequence, $caseSensitive = true) - { - @trigger_error(__METHOD__ . ' method is deprecated since version 2.4 and will be removed in 3.0. Use Scanner::sequenceMatches() instead.', E_USER_DEPRECATED); - - return $this->scanner->sequenceMatches($sequence, $caseSensitive); - } - - /** - * Send a TEXT event with the contents of the text buffer. - * - * This emits an EventHandler::text() event with the current contents of the - * temporary text buffer. (The buffer is used to group as much PCDATA - * as we can instead of emitting lots and lots of TEXT events.) - */ - protected function flushBuffer() - { - if ('' === $this->text) { - return; - } - $this->events->text($this->text); - $this->text = ''; - } - - /** - * Add text to the temporary buffer. - * - * @see flushBuffer() - * - * @param string $str - */ - protected function buffer($str) - { - $this->text .= $str; - } - - /** - * Emit a parse error. - * - * A parse error always returns false because it never consumes any - * characters. - * - * @param string $msg - * - * @return string - */ - protected function parseError($msg) - { - $args = func_get_args(); - - if (count($args) > 1) { - array_shift($args); - $msg = vsprintf($msg, $args); - } - - $line = $this->scanner->currentLine(); - $col = $this->scanner->columnOffset(); - $this->events->parseError($msg, $line, $col); - - return false; - } - - /** - * Decode a character reference and return the string. - * - * If $inAttribute is set to true, a bare & will be returned as-is. - * - * @param bool $inAttribute Set to true if the text is inside of an attribute value. - * false otherwise. - * - * @return string - */ - protected function decodeCharacterReference($inAttribute = false) - { - // Next char after &. - $tok = $this->scanner->next(); - $start = $this->scanner->position(); - - if (false === $tok) { - return '&'; - } - - // These indicate not an entity. We return just - // the &. - if ("\t" === $tok || "\n" === $tok || "\f" === $tok || ' ' === $tok || '&' === $tok || '<' === $tok) { - // $this->scanner->next(); - return '&'; - } - - // Numeric entity - if ('#' === $tok) { - $tok = $this->scanner->next(); - - if (false === $tok) { - $this->parseError('Expected &#DEC; &#HEX;, got EOF'); - $this->scanner->unconsume(1); - - return '&'; - } - - // Hexidecimal encoding. - // X[0-9a-fA-F]+; - // x[0-9a-fA-F]+; - if ('x' === $tok || 'X' === $tok) { - $tok = $this->scanner->next(); // Consume x - - // Convert from hex code to char. - $hex = $this->scanner->getHex(); - if (empty($hex)) { - $this->parseError('Expected &#xHEX;, got &#x%s', $tok); - // We unconsume because we don't know what parser rules might - // be in effect for the remaining chars. For example. '&#>' - // might result in a specific parsing rule inside of tag - // contexts, while not inside of pcdata context. - $this->scanner->unconsume(2); - - return '&'; - } - $entity = CharacterReference::lookupHex($hex); - } // Decimal encoding. - // [0-9]+; - else { - // Convert from decimal to char. - $numeric = $this->scanner->getNumeric(); - if (false === $numeric) { - $this->parseError('Expected &#DIGITS;, got &#%s', $tok); - $this->scanner->unconsume(2); - - return '&'; - } - $entity = CharacterReference::lookupDecimal($numeric); - } - } elseif ('=' === $tok && $inAttribute) { - return '&'; - } else { // String entity. - // Attempt to consume a string up to a ';'. - // [a-zA-Z0-9]+; - $cname = $this->scanner->getAsciiAlphaNum(); - $entity = CharacterReference::lookupName($cname); - - // When no entity is found provide the name of the unmatched string - // and continue on as the & is not part of an entity. The & will - // be converted to & elsewhere. - if (null === $entity) { - if (!$inAttribute || '' === $cname) { - $this->parseError("No match in entity table for '%s'", $cname); - } - $this->scanner->unconsume($this->scanner->position() - $start); - - return '&'; - } - } - - // The scanner has advanced the cursor for us. - $tok = $this->scanner->current(); - - // We have an entity. We're done here. - if (';' === $tok) { - $this->scanner->consume(); - - return $entity; - } - - // Failing to match ; means unconsume the entire string. - $this->scanner->unconsume($this->scanner->position() - $start); - - $this->parseError('Expected &ENTITY;, got &ENTITY%s (no trailing ;) ', $tok); - - return '&'; - } -} diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php deleted file mode 100644 index 00d3951fd..000000000 --- a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php +++ /dev/null @@ -1,127 +0,0 @@ - 1, - 'dd' => 1, - 'dt' => 1, - 'rt' => 1, - 'rp' => 1, - 'tr' => 1, - 'th' => 1, - 'td' => 1, - 'thead' => 1, - 'tfoot' => 1, - 'tbody' => 1, - 'table' => 1, - 'optgroup' => 1, - 'option' => 1, - ); - - /** - * Returns true if the given tagname has special processing rules. - */ - public function hasRules($tagname) - { - return isset(static::$tags[$tagname]); - } - - /** - * Evaluate the rule for the current tag name. - * - * This may modify the existing DOM. - * - * @return \DOMElement The new Current DOM element. - */ - public function evaluate($new, $current) - { - switch ($new->tagName) { - case 'li': - return $this->handleLI($new, $current); - case 'dt': - case 'dd': - return $this->handleDT($new, $current); - case 'rt': - case 'rp': - return $this->handleRT($new, $current); - case 'optgroup': - return $this->closeIfCurrentMatches($new, $current, array( - 'optgroup', - )); - case 'option': - return $this->closeIfCurrentMatches($new, $current, array( - 'option', - )); - case 'tr': - return $this->closeIfCurrentMatches($new, $current, array( - 'tr', - )); - case 'td': - case 'th': - return $this->closeIfCurrentMatches($new, $current, array( - 'th', - 'td', - )); - case 'tbody': - case 'thead': - case 'tfoot': - case 'table': // Spec isn't explicit about this, but it's necessary. - - return $this->closeIfCurrentMatches($new, $current, array( - 'thead', - 'tfoot', - 'tbody', - )); - } - - return $current; - } - - protected function handleLI($ele, $current) - { - return $this->closeIfCurrentMatches($ele, $current, array( - 'li', - )); - } - - protected function handleDT($ele, $current) - { - return $this->closeIfCurrentMatches($ele, $current, array( - 'dt', - 'dd', - )); - } - - protected function handleRT($ele, $current) - { - return $this->closeIfCurrentMatches($ele, $current, array( - 'rt', - 'rp', - )); - } - - protected function closeIfCurrentMatches($ele, $current, $match) - { - if (in_array($current->tagName, $match, true)) { - $current->parentNode->appendChild($ele); - } else { - $current->appendChild($ele); - } - - return $ele; - } -} diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php deleted file mode 100644 index f6a70bfac..000000000 --- a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php +++ /dev/null @@ -1,183 +0,0 @@ - - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -use Masterminds\HTML5\Exception; - -class UTF8Utils -{ - /** - * The Unicode replacement character. - */ - const FFFD = "\xEF\xBF\xBD"; - - /** - * Count the number of characters in a string. - * UTF-8 aware. This will try (in order) iconv, MB, libxml, and finally a custom counter. - * - * @param string $string - * - * @return int - */ - public static function countChars($string) - { - // Get the length for the string we need. - if (function_exists('mb_strlen')) { - return mb_strlen($string, 'utf-8'); - } - - if (function_exists('iconv_strlen')) { - return iconv_strlen($string, 'utf-8'); - } - - if (function_exists('utf8_decode')) { - // MPB: Will this work? Won't certain decodes lead to two chars - // extrapolated out of 2-byte chars? - return strlen(utf8_decode($string)); - } - - $count = count_chars($string); - - // 0x80 = 0x7F - 0 + 1 (one added to get inclusive range) - // 0x33 = 0xF4 - 0x2C + 1 (one added to get inclusive range) - return array_sum(array_slice($count, 0, 0x80)) + array_sum(array_slice($count, 0xC2, 0x33)); - } - - /** - * Convert data from the given encoding to UTF-8. - * - * This has not yet been tested with charactersets other than UTF-8. - * It should work with ISO-8859-1/-13 and standard Latin Win charsets. - * - * @param string $data The data to convert - * @param string $encoding A valid encoding. Examples: http://www.php.net/manual/en/mbstring.supported-encodings.php - * - * @return string - */ - public static function convertToUTF8($data, $encoding = 'UTF-8') - { - /* - * From the HTML5 spec: Given an encoding, the bytes in the input stream must be converted - * to Unicode characters for the tokeniser, as described by the rules for that encoding, - * except that the leading U+FEFF BYTE ORDER MARK character, if any, must not be stripped - * by the encoding layer (it is stripped by the rule below). Bytes or sequences of bytes - * in the original byte stream that could not be converted to Unicode characters must be - * converted to U+FFFD REPLACEMENT CHARACTER code points. - */ - - // mb_convert_encoding is chosen over iconv because of a bug. The best - // details for the bug are on http://us1.php.net/manual/en/function.iconv.php#108643 - // which contains links to the actual but reports as well as work around - // details. - if (function_exists('mb_convert_encoding')) { - // mb library has the following behaviors: - // - UTF-16 surrogates result in false. - // - Overlongs and outside Plane 16 result in empty strings. - - // Before we run mb_convert_encoding we need to tell it what to do with - // characters it does not know. This could be different than the parent - // application executing this library so we store the value, change it - // to our needs, and then change it back when we are done. This feels - // a little excessive and it would be great if there was a better way. - $save = mb_substitute_character(); - mb_substitute_character('none'); - $data = mb_convert_encoding($data, 'UTF-8', $encoding); - mb_substitute_character($save); - } - // @todo Get iconv running in at least some environments if that is possible. - elseif (function_exists('iconv') && 'auto' !== $encoding) { - // fprintf(STDOUT, "iconv found\n"); - // iconv has the following behaviors: - // - Overlong representations are ignored. - // - Beyond Plane 16 is replaced with a lower char. - // - Incomplete sequences generate a warning. - $data = @iconv($encoding, 'UTF-8//IGNORE', $data); - } else { - throw new Exception('Not implemented, please install mbstring or iconv'); - } - - /* - * One leading U+FEFF BYTE ORDER MARK character must be ignored if any are present. - */ - if ("\xEF\xBB\xBF" === substr($data, 0, 3)) { - $data = substr($data, 3); - } - - return $data; - } - - /** - * Checks for Unicode code points that are not valid in a document. - * - * @param string $data A string to analyze - * - * @return array An array of (string) error messages produced by the scanning - */ - public static function checkForIllegalCodepoints($data) - { - // Vestigal error handling. - $errors = array(); - - /* - * All U+0000 null characters in the input must be replaced by U+FFFD REPLACEMENT CHARACTERs. - * Any occurrences of such characters is a parse error. - */ - for ($i = 0, $count = substr_count($data, "\0"); $i < $count; ++$i) { - $errors[] = 'null-character'; - } - - /* - * Any occurrences of any characters in the ranges U+0001 to U+0008, U+000B, U+000E to U+001F, U+007F - * to U+009F, U+D800 to U+DFFF , U+FDD0 to U+FDEF, and characters U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, - * U+2FFFE, U+2FFFF, U+3FFFE, U+3FFFF, U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE, U+6FFFF, U+7FFFE, - * U+7FFFF, U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF, U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF, U+CFFFE, U+CFFFF, - * U+DFFFE, U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF, U+10FFFE, and U+10FFFF are parse errors. - * (These are all control characters or permanently undefined Unicode characters.) - */ - // Check PCRE is loaded. - $count = preg_match_all( - '/(?: - [\x01-\x08\x0B\x0E-\x1F\x7F] # U+0001 to U+0008, U+000B, U+000E to U+001F and U+007F - | - \xC2[\x80-\x9F] # U+0080 to U+009F - | - \xED(?:\xA0[\x80-\xFF]|[\xA1-\xBE][\x00-\xFF]|\xBF[\x00-\xBF]) # U+D800 to U+DFFFF - | - \xEF\xB7[\x90-\xAF] # U+FDD0 to U+FDEF - | - \xEF\xBF[\xBE\xBF] # U+FFFE and U+FFFF - | - [\xF0-\xF4][\x8F-\xBF]\xBF[\xBE\xBF] # U+nFFFE and U+nFFFF (1 <= n <= 10_{16}) - )/x', $data, $matches); - for ($i = 0; $i < $count; ++$i) { - $errors[] = 'invalid-codepoint'; - } - - return $errors; - } -} diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php deleted file mode 100644 index e9421a12d..000000000 --- a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php +++ /dev/null @@ -1,1533 +0,0 @@ - ' ', - "\n" => ' ', - '!' => '!', - '"' => '"', - '#' => '#', - '$' => '$', - '%' => '%', - '&' => '&', - '\'' => ''', - '(' => '(', - ')' => ')', - '*' => '*', - '+' => '+', - ',' => ',', - '.' => '.', - '/' => '/', - ':' => ':', - ';' => ';', - '<' => '<', - '<⃒' => '&nvlt', - '=' => '=', - '=⃥' => '&bne', - '>' => '>', - '>⃒' => '&nvgt', - '?' => '?', - '@' => '@', - '[' => '[', - '\\' => '\', - ']' => ']', - '^' => '^', - '_' => '_', - '`' => '`', - 'fj' => '&fjlig', - '{' => '{', - '|' => '|', - '}' => '}', - ' ' => ' ', - '¡' => '¡', - '¢' => '¢', - '£' => '£', - '¤' => '¤', - '¥' => '¥', - '¦' => '¦', - '§' => '§', - '¨' => '¨', - '©' => '©', - 'ª' => 'ª', - '«' => '«', - '¬' => '¬', - '­' => '­', - '®' => '®', - '¯' => '¯', - '°' => '°', - '±' => '±', - '²' => '²', - '³' => '³', - '´' => '´', - 'µ' => 'µ', - '¶' => '¶', - '·' => '·', - '¸' => '¸', - '¹' => '¹', - 'º' => 'º', - '»' => '»', - '¼' => '¼', - '½' => '½', - '¾' => '¾', - '¿' => '¿', - 'À' => 'À', - 'Á' => 'Á', - 'Â' => 'Â', - 'Ã' => 'Ã', - 'Ä' => 'Ä', - 'Å' => 'Å', - 'Æ' => 'Æ', - 'Ç' => 'Ç', - 'È' => 'È', - 'É' => 'É', - 'Ê' => 'Ê', - 'Ë' => 'Ë', - 'Ì' => 'Ì', - 'Í' => 'Í', - 'Î' => 'Î', - 'Ï' => 'Ï', - 'Ð' => 'Ð', - 'Ñ' => 'Ñ', - 'Ò' => 'Ò', - 'Ó' => 'Ó', - 'Ô' => 'Ô', - 'Õ' => 'Õ', - 'Ö' => 'Ö', - '×' => '×', - 'Ø' => 'Ø', - 'Ù' => 'Ù', - 'Ú' => 'Ú', - 'Û' => 'Û', - 'Ü' => 'Ü', - 'Ý' => 'Ý', - 'Þ' => 'Þ', - 'ß' => 'ß', - 'à' => 'à', - 'á' => 'á', - 'â' => 'â', - 'ã' => 'ã', - 'ä' => 'ä', - 'å' => 'å', - 'æ' => 'æ', - 'ç' => 'ç', - 'è' => 'è', - 'é' => 'é', - 'ê' => 'ê', - 'ë' => 'ë', - 'ì' => 'ì', - 'í' => 'í', - 'î' => 'î', - 'ï' => 'ï', - 'ð' => 'ð', - 'ñ' => 'ñ', - 'ò' => 'ò', - 'ó' => 'ó', - 'ô' => 'ô', - 'õ' => 'õ', - 'ö' => 'ö', - '÷' => '÷', - 'ø' => 'ø', - 'ù' => 'ù', - 'ú' => 'ú', - 'û' => 'û', - 'ü' => 'ü', - 'ý' => 'ý', - 'þ' => 'þ', - 'ÿ' => 'ÿ', - 'Ā' => 'Ā', - 'ā' => 'ā', - 'Ă' => 'Ă', - 'ă' => 'ă', - 'Ą' => 'Ą', - 'ą' => 'ą', - 'Ć' => 'Ć', - 'ć' => 'ć', - 'Ĉ' => 'Ĉ', - 'ĉ' => 'ĉ', - 'Ċ' => 'Ċ', - 'ċ' => 'ċ', - 'Č' => 'Č', - 'č' => 'č', - 'Ď' => 'Ď', - 'ď' => 'ď', - 'Đ' => 'Đ', - 'đ' => 'đ', - 'Ē' => 'Ē', - 'ē' => 'ē', - 'Ė' => 'Ė', - 'ė' => 'ė', - 'Ę' => 'Ę', - 'ę' => 'ę', - 'Ě' => 'Ě', - 'ě' => 'ě', - 'Ĝ' => 'Ĝ', - 'ĝ' => 'ĝ', - 'Ğ' => 'Ğ', - 'ğ' => 'ğ', - 'Ġ' => 'Ġ', - 'ġ' => 'ġ', - 'Ģ' => 'Ģ', - 'Ĥ' => 'Ĥ', - 'ĥ' => 'ĥ', - 'Ħ' => 'Ħ', - 'ħ' => 'ħ', - 'Ĩ' => 'Ĩ', - 'ĩ' => 'ĩ', - 'Ī' => 'Ī', - 'ī' => 'ī', - 'Į' => 'Į', - 'į' => 'į', - 'İ' => 'İ', - 'ı' => 'ı', - 'IJ' => 'IJ', - 'ij' => 'ij', - 'Ĵ' => 'Ĵ', - 'ĵ' => 'ĵ', - 'Ķ' => 'Ķ', - 'ķ' => 'ķ', - 'ĸ' => 'ĸ', - 'Ĺ' => 'Ĺ', - 'ĺ' => 'ĺ', - 'Ļ' => 'Ļ', - 'ļ' => 'ļ', - 'Ľ' => 'Ľ', - 'ľ' => 'ľ', - 'Ŀ' => 'Ŀ', - 'ŀ' => 'ŀ', - 'Ł' => 'Ł', - 'ł' => 'ł', - 'Ń' => 'Ń', - 'ń' => 'ń', - 'Ņ' => 'Ņ', - 'ņ' => 'ņ', - 'Ň' => 'Ň', - 'ň' => 'ň', - 'ʼn' => 'ʼn', - 'Ŋ' => 'Ŋ', - 'ŋ' => 'ŋ', - 'Ō' => 'Ō', - 'ō' => 'ō', - 'Ő' => 'Ő', - 'ő' => 'ő', - 'Œ' => 'Œ', - 'œ' => 'œ', - 'Ŕ' => 'Ŕ', - 'ŕ' => 'ŕ', - 'Ŗ' => 'Ŗ', - 'ŗ' => 'ŗ', - 'Ř' => 'Ř', - 'ř' => 'ř', - 'Ś' => 'Ś', - 'ś' => 'ś', - 'Ŝ' => 'Ŝ', - 'ŝ' => 'ŝ', - 'Ş' => 'Ş', - 'ş' => 'ş', - 'Š' => 'Š', - 'š' => 'š', - 'Ţ' => 'Ţ', - 'ţ' => 'ţ', - 'Ť' => 'Ť', - 'ť' => 'ť', - 'Ŧ' => 'Ŧ', - 'ŧ' => 'ŧ', - 'Ũ' => 'Ũ', - 'ũ' => 'ũ', - 'Ū' => 'Ū', - 'ū' => 'ū', - 'Ŭ' => 'Ŭ', - 'ŭ' => 'ŭ', - 'Ů' => 'Ů', - 'ů' => 'ů', - 'Ű' => 'Ű', - 'ű' => 'ű', - 'Ų' => 'Ų', - 'ų' => 'ų', - 'Ŵ' => 'Ŵ', - 'ŵ' => 'ŵ', - 'Ŷ' => 'Ŷ', - 'ŷ' => 'ŷ', - 'Ÿ' => 'Ÿ', - 'Ź' => 'Ź', - 'ź' => 'ź', - 'Ż' => 'Ż', - 'ż' => 'ż', - 'Ž' => 'Ž', - 'ž' => 'ž', - 'ƒ' => 'ƒ', - 'Ƶ' => 'Ƶ', - 'ǵ' => 'ǵ', - 'ȷ' => 'ȷ', - 'ˆ' => 'ˆ', - 'ˇ' => 'ˇ', - '˘' => '˘', - '˙' => '˙', - '˚' => '˚', - '˛' => '˛', - '˜' => '˜', - '˝' => '˝', - '̑' => '̑', - 'Α' => 'Α', - 'Β' => 'Β', - 'Γ' => 'Γ', - 'Δ' => 'Δ', - 'Ε' => 'Ε', - 'Ζ' => 'Ζ', - 'Η' => 'Η', - 'Θ' => 'Θ', - 'Ι' => 'Ι', - 'Κ' => 'Κ', - 'Λ' => 'Λ', - 'Μ' => 'Μ', - 'Ν' => 'Ν', - 'Ξ' => 'Ξ', - 'Ο' => 'Ο', - 'Π' => 'Π', - 'Ρ' => 'Ρ', - 'Σ' => 'Σ', - 'Τ' => 'Τ', - 'Υ' => 'Υ', - 'Φ' => 'Φ', - 'Χ' => 'Χ', - 'Ψ' => 'Ψ', - 'Ω' => 'Ω', - 'α' => 'α', - 'β' => 'β', - 'γ' => 'γ', - 'δ' => 'δ', - 'ε' => 'ε', - 'ζ' => 'ζ', - 'η' => 'η', - 'θ' => 'θ', - 'ι' => 'ι', - 'κ' => 'κ', - 'λ' => 'λ', - 'μ' => 'μ', - 'ν' => 'ν', - 'ξ' => 'ξ', - 'ο' => 'ο', - 'π' => 'π', - 'ρ' => 'ρ', - 'ς' => 'ς', - 'σ' => 'σ', - 'τ' => 'τ', - 'υ' => 'υ', - 'φ' => 'φ', - 'χ' => 'χ', - 'ψ' => 'ψ', - 'ω' => 'ω', - 'ϑ' => 'ϑ', - 'ϒ' => 'ϒ', - 'ϕ' => 'ϕ', - 'ϖ' => 'ϖ', - 'Ϝ' => 'Ϝ', - 'ϝ' => 'ϝ', - 'ϰ' => 'ϰ', - 'ϱ' => 'ϱ', - 'ϵ' => 'ϵ', - '϶' => '϶', - 'Ё' => 'Ё', - 'Ђ' => 'Ђ', - 'Ѓ' => 'Ѓ', - 'Є' => 'Є', - 'Ѕ' => 'Ѕ', - 'І' => 'І', - 'Ї' => 'Ї', - 'Ј' => 'Ј', - 'Љ' => 'Љ', - 'Њ' => 'Њ', - 'Ћ' => 'Ћ', - 'Ќ' => 'Ќ', - 'Ў' => 'Ў', - 'Џ' => 'Џ', - 'А' => 'А', - 'Б' => 'Б', - 'В' => 'В', - 'Г' => 'Г', - 'Д' => 'Д', - 'Е' => 'Е', - 'Ж' => 'Ж', - 'З' => 'З', - 'И' => 'И', - 'Й' => 'Й', - 'К' => 'К', - 'Л' => 'Л', - 'М' => 'М', - 'Н' => 'Н', - 'О' => 'О', - 'П' => 'П', - 'Р' => 'Р', - 'С' => 'С', - 'Т' => 'Т', - 'У' => 'У', - 'Ф' => 'Ф', - 'Х' => 'Х', - 'Ц' => 'Ц', - 'Ч' => 'Ч', - 'Ш' => 'Ш', - 'Щ' => 'Щ', - 'Ъ' => 'Ъ', - 'Ы' => 'Ы', - 'Ь' => 'Ь', - 'Э' => 'Э', - 'Ю' => 'Ю', - 'Я' => 'Я', - 'а' => 'а', - 'б' => 'б', - 'в' => 'в', - 'г' => 'г', - 'д' => 'д', - 'е' => 'е', - 'ж' => 'ж', - 'з' => 'з', - 'и' => 'и', - 'й' => 'й', - 'к' => 'к', - 'л' => 'л', - 'м' => 'м', - 'н' => 'н', - 'о' => 'о', - 'п' => 'п', - 'р' => 'р', - 'с' => 'с', - 'т' => 'т', - 'у' => 'у', - 'ф' => 'ф', - 'х' => 'х', - 'ц' => 'ц', - 'ч' => 'ч', - 'ш' => 'ш', - 'щ' => 'щ', - 'ъ' => 'ъ', - 'ы' => 'ы', - 'ь' => 'ь', - 'э' => 'э', - 'ю' => 'ю', - 'я' => 'я', - 'ё' => 'ё', - 'ђ' => 'ђ', - 'ѓ' => 'ѓ', - 'є' => 'є', - 'ѕ' => 'ѕ', - 'і' => 'і', - 'ї' => 'ї', - 'ј' => 'ј', - 'љ' => 'љ', - 'њ' => 'њ', - 'ћ' => 'ћ', - 'ќ' => 'ќ', - 'ў' => 'ў', - 'џ' => 'џ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - ' ' => ' ', - '​' => '​', - '‌' => '‌', - '‍' => '‍', - '‎' => '‎', - '‏' => '‏', - '‐' => '‐', - '–' => '–', - '—' => '—', - '―' => '―', - '‖' => '‖', - '‘' => '‘', - '’' => '’', - '‚' => '‚', - '“' => '“', - '”' => '”', - '„' => '„', - '†' => '†', - '‡' => '‡', - '•' => '•', - '‥' => '‥', - '…' => '…', - '‰' => '‰', - '‱' => '‱', - '′' => '′', - '″' => '″', - '‴' => '‴', - '‵' => '‵', - '‹' => '‹', - '›' => '›', - '‾' => '‾', - '⁁' => '⁁', - '⁃' => '⁃', - '⁄' => '⁄', - '⁏' => '⁏', - '⁗' => '⁗', - ' ' => ' ', - '  ' => '&ThickSpace', - '⁠' => '⁠', - '⁡' => '⁡', - '⁢' => '⁢', - '⁣' => '⁣', - '€' => '€', - '⃛' => '⃛', - '⃜' => '⃜', - 'ℂ' => 'ℂ', - '℅' => '℅', - 'ℊ' => 'ℊ', - 'ℋ' => 'ℋ', - 'ℌ' => 'ℌ', - 'ℍ' => 'ℍ', - 'ℎ' => 'ℎ', - 'ℏ' => 'ℏ', - 'ℐ' => 'ℐ', - 'ℑ' => 'ℑ', - 'ℒ' => 'ℒ', - 'ℓ' => 'ℓ', - 'ℕ' => 'ℕ', - '№' => '№', - '℗' => '℗', - '℘' => '℘', - 'ℙ' => 'ℙ', - 'ℚ' => 'ℚ', - 'ℛ' => 'ℛ', - 'ℜ' => 'ℜ', - 'ℝ' => 'ℝ', - '℞' => '℞', - '™' => '™', - 'ℤ' => 'ℤ', - '℧' => '℧', - 'ℨ' => 'ℨ', - '℩' => '℩', - 'ℬ' => 'ℬ', - 'ℭ' => 'ℭ', - 'ℯ' => 'ℯ', - 'ℰ' => 'ℰ', - 'ℱ' => 'ℱ', - 'ℳ' => 'ℳ', - 'ℴ' => 'ℴ', - 'ℵ' => 'ℵ', - 'ℶ' => 'ℶ', - 'ℷ' => 'ℷ', - 'ℸ' => 'ℸ', - 'ⅅ' => 'ⅅ', - 'ⅆ' => 'ⅆ', - 'ⅇ' => 'ⅇ', - 'ⅈ' => 'ⅈ', - '⅓' => '⅓', - '⅔' => '⅔', - '⅕' => '⅕', - '⅖' => '⅖', - '⅗' => '⅗', - '⅘' => '⅘', - '⅙' => '⅙', - '⅚' => '⅚', - '⅛' => '⅛', - '⅜' => '⅜', - '⅝' => '⅝', - '⅞' => '⅞', - '←' => '←', - '↑' => '↑', - '→' => '→', - '↓' => '↓', - '↔' => '↔', - '↕' => '↕', - '↖' => '↖', - '↗' => '↗', - '↘' => '↘', - '↙' => '↙', - '↚' => '↚', - '↛' => '↛', - '↝' => '↝', - '↝̸' => '&nrarrw', - '↞' => '↞', - '↟' => '↟', - '↠' => '↠', - '↡' => '↡', - '↢' => '↢', - '↣' => '↣', - '↤' => '↤', - '↥' => '↥', - '↦' => '↦', - '↧' => '↧', - '↩' => '↩', - '↪' => '↪', - '↫' => '↫', - '↬' => '↬', - '↭' => '↭', - '↮' => '↮', - '↰' => '↰', - '↱' => '↱', - '↲' => '↲', - '↳' => '↳', - '↵' => '↵', - '↶' => '↶', - '↷' => '↷', - '↺' => '↺', - '↻' => '↻', - '↼' => '↼', - '↽' => '↽', - '↾' => '↾', - '↿' => '↿', - '⇀' => '⇀', - '⇁' => '⇁', - '⇂' => '⇂', - '⇃' => '⇃', - '⇄' => '⇄', - '⇅' => '⇅', - '⇆' => '⇆', - '⇇' => '⇇', - '⇈' => '⇈', - '⇉' => '⇉', - '⇊' => '⇊', - '⇋' => '⇋', - '⇌' => '⇌', - '⇍' => '⇍', - '⇎' => '⇎', - '⇏' => '⇏', - '⇐' => '⇐', - '⇑' => '⇑', - '⇒' => '⇒', - '⇓' => '⇓', - '⇔' => '⇔', - '⇕' => '⇕', - '⇖' => '⇖', - '⇗' => '⇗', - '⇘' => '⇘', - '⇙' => '⇙', - '⇚' => '⇚', - '⇛' => '⇛', - '⇝' => '⇝', - '⇤' => '⇤', - '⇥' => '⇥', - '⇵' => '⇵', - '⇽' => '⇽', - '⇾' => '⇾', - '⇿' => '⇿', - '∀' => '∀', - '∁' => '∁', - '∂' => '∂', - '∂̸' => '&npart', - '∃' => '∃', - '∄' => '∄', - '∅' => '∅', - '∇' => '∇', - '∈' => '∈', - '∉' => '∉', - '∋' => '∋', - '∌' => '∌', - '∏' => '∏', - '∐' => '∐', - '∑' => '∑', - '−' => '−', - '∓' => '∓', - '∔' => '∔', - '∖' => '∖', - '∗' => '∗', - '∘' => '∘', - '√' => '√', - '∝' => '∝', - '∞' => '∞', - '∟' => '∟', - '∠' => '∠', - '∠⃒' => '&nang', - '∡' => '∡', - '∢' => '∢', - '∣' => '∣', - '∤' => '∤', - '∥' => '∥', - '∦' => '∦', - '∧' => '∧', - '∨' => '∨', - '∩' => '∩', - '∩︀' => '&caps', - '∪' => '∪', - '∪︀' => '&cups', - '∫' => '∫', - '∬' => '∬', - '∭' => '∭', - '∮' => '∮', - '∯' => '∯', - '∰' => '∰', - '∱' => '∱', - '∲' => '∲', - '∳' => '∳', - '∴' => '∴', - '∵' => '∵', - '∶' => '∶', - '∷' => '∷', - '∸' => '∸', - '∺' => '∺', - '∻' => '∻', - '∼' => '∼', - '∼⃒' => '&nvsim', - '∽' => '∽', - '∽̱' => '&race', - '∾' => '∾', - '∾̳' => '&acE', - '∿' => '∿', - '≀' => '≀', - '≁' => '≁', - '≂' => '≂', - '≂̸' => '&nesim', - '≃' => '≃', - '≄' => '≄', - '≅' => '≅', - '≆' => '≆', - '≇' => '≇', - '≈' => '≈', - '≉' => '≉', - '≊' => '≊', - '≋' => '≋', - '≋̸' => '&napid', - '≌' => '≌', - '≍' => '≍', - '≍⃒' => '&nvap', - '≎' => '≎', - '≎̸' => '&nbump', - '≏' => '≏', - '≏̸' => '&nbumpe', - '≐' => '≐', - '≐̸' => '&nedot', - '≑' => '≑', - '≒' => '≒', - '≓' => '≓', - '≔' => '≔', - '≕' => '≕', - '≖' => '≖', - '≗' => '≗', - '≙' => '≙', - '≚' => '≚', - '≜' => '≜', - '≟' => '≟', - '≠' => '≠', - '≡' => '≡', - '≡⃥' => '&bnequiv', - '≢' => '≢', - '≤' => '≤', - '≤⃒' => '&nvle', - '≥' => '≥', - '≥⃒' => '&nvge', - '≦' => '≦', - '≦̸' => '&nlE', - '≧' => '≧', - '≧̸' => '&NotGreaterFullEqual', - '≨' => '≨', - '≨︀' => '&lvertneqq', - '≩' => '≩', - '≩︀' => '&gvertneqq', - '≪' => '≪', - '≪̸' => '&nLtv', - '≪⃒' => '&nLt', - '≫' => '≫', - '≫̸' => '&NotGreaterGreater', - '≫⃒' => '&nGt', - '≬' => '≬', - '≭' => '≭', - '≮' => '≮', - '≯' => '≯', - '≰' => '≰', - '≱' => '≱', - '≲' => '≲', - '≳' => '≳', - '≴' => '≴', - '≵' => '≵', - '≶' => '≶', - '≷' => '≷', - '≸' => '≸', - '≹' => '≹', - '≺' => '≺', - '≻' => '≻', - '≼' => '≼', - '≽' => '≽', - '≾' => '≾', - '≿' => '≿', - '≿̸' => '&NotSucceedsTilde', - '⊀' => '⊀', - '⊁' => '⊁', - '⊂' => '⊂', - '⊂⃒' => '&vnsub', - '⊃' => '⊃', - '⊃⃒' => '&nsupset', - '⊄' => '⊄', - '⊅' => '⊅', - '⊆' => '⊆', - '⊇' => '⊇', - '⊈' => '⊈', - '⊉' => '⊉', - '⊊' => '⊊', - '⊊︀' => '&vsubne', - '⊋' => '⊋', - '⊋︀' => '&vsupne', - '⊍' => '⊍', - '⊎' => '⊎', - '⊏' => '⊏', - '⊏̸' => '&NotSquareSubset', - '⊐' => '⊐', - '⊐̸' => '&NotSquareSuperset', - '⊑' => '⊑', - '⊒' => '⊒', - '⊓' => '⊓', - '⊓︀' => '&sqcaps', - '⊔' => '⊔', - '⊔︀' => '&sqcups', - '⊕' => '⊕', - '⊖' => '⊖', - '⊗' => '⊗', - '⊘' => '⊘', - '⊙' => '⊙', - '⊚' => '⊚', - '⊛' => '⊛', - '⊝' => '⊝', - '⊞' => '⊞', - '⊟' => '⊟', - '⊠' => '⊠', - '⊡' => '⊡', - '⊢' => '⊢', - '⊣' => '⊣', - '⊤' => '⊤', - '⊥' => '⊥', - '⊧' => '⊧', - '⊨' => '⊨', - '⊩' => '⊩', - '⊪' => '⊪', - '⊫' => '⊫', - '⊬' => '⊬', - '⊭' => '⊭', - '⊮' => '⊮', - '⊯' => '⊯', - '⊰' => '⊰', - '⊲' => '⊲', - '⊳' => '⊳', - '⊴' => '⊴', - '⊴⃒' => '&nvltrie', - '⊵' => '⊵', - '⊵⃒' => '&nvrtrie', - '⊶' => '⊶', - '⊷' => '⊷', - '⊸' => '⊸', - '⊹' => '⊹', - '⊺' => '⊺', - '⊻' => '⊻', - '⊽' => '⊽', - '⊾' => '⊾', - '⊿' => '⊿', - '⋀' => '⋀', - '⋁' => '⋁', - '⋂' => '⋂', - '⋃' => '⋃', - '⋄' => '⋄', - '⋅' => '⋅', - '⋆' => '⋆', - '⋇' => '⋇', - '⋈' => '⋈', - '⋉' => '⋉', - '⋊' => '⋊', - '⋋' => '⋋', - '⋌' => '⋌', - '⋍' => '⋍', - '⋎' => '⋎', - '⋏' => '⋏', - '⋐' => '⋐', - '⋑' => '⋑', - '⋒' => '⋒', - '⋓' => '⋓', - '⋔' => '⋔', - '⋕' => '⋕', - '⋖' => '⋖', - '⋗' => '⋗', - '⋘' => '⋘', - '⋘̸' => '&nLl', - '⋙' => '⋙', - '⋙̸' => '&nGg', - '⋚' => '⋚', - '⋚︀' => '&lesg', - '⋛' => '⋛', - '⋛︀' => '&gesl', - '⋞' => '⋞', - '⋟' => '⋟', - '⋠' => '⋠', - '⋡' => '⋡', - '⋢' => '⋢', - '⋣' => '⋣', - '⋦' => '⋦', - '⋧' => '⋧', - '⋨' => '⋨', - '⋩' => '⋩', - '⋪' => '⋪', - '⋫' => '⋫', - '⋬' => '⋬', - '⋭' => '⋭', - '⋮' => '⋮', - '⋯' => '⋯', - '⋰' => '⋰', - '⋱' => '⋱', - '⋲' => '⋲', - '⋳' => '⋳', - '⋴' => '⋴', - '⋵' => '⋵', - '⋵̸' => '¬indot', - '⋶' => '⋶', - '⋷' => '⋷', - '⋹' => '⋹', - '⋹̸' => '¬inE', - '⋺' => '⋺', - '⋻' => '⋻', - '⋼' => '⋼', - '⋽' => '⋽', - '⋾' => '⋾', - '⌅' => '⌅', - '⌆' => '⌆', - '⌈' => '⌈', - '⌉' => '⌉', - '⌊' => '⌊', - '⌋' => '⌋', - '⌌' => '⌌', - '⌍' => '⌍', - '⌎' => '⌎', - '⌏' => '⌏', - '⌐' => '⌐', - '⌒' => '⌒', - '⌓' => '⌓', - '⌕' => '⌕', - '⌖' => '⌖', - '⌜' => '⌜', - '⌝' => '⌝', - '⌞' => '⌞', - '⌟' => '⌟', - '⌢' => '⌢', - '⌣' => '⌣', - '⌭' => '⌭', - '⌮' => '⌮', - '⌶' => '⌶', - '⌽' => '⌽', - '⌿' => '⌿', - '⍼' => '⍼', - '⎰' => '⎰', - '⎱' => '⎱', - '⎴' => '⎴', - '⎵' => '⎵', - '⎶' => '⎶', - '⏜' => '⏜', - '⏝' => '⏝', - '⏞' => '⏞', - '⏟' => '⏟', - '⏢' => '⏢', - '⏧' => '⏧', - '␣' => '␣', - 'Ⓢ' => 'Ⓢ', - '─' => '─', - '│' => '│', - '┌' => '┌', - '┐' => '┐', - '└' => '└', - '┘' => '┘', - '├' => '├', - '┤' => '┤', - '┬' => '┬', - '┴' => '┴', - '┼' => '┼', - '═' => '═', - '║' => '║', - '╒' => '╒', - '╓' => '╓', - '╔' => '╔', - '╕' => '╕', - '╖' => '╖', - '╗' => '╗', - '╘' => '╘', - '╙' => '╙', - '╚' => '╚', - '╛' => '╛', - '╜' => '╜', - '╝' => '╝', - '╞' => '╞', - '╟' => '╟', - '╠' => '╠', - '╡' => '╡', - '╢' => '╢', - '╣' => '╣', - '╤' => '╤', - '╥' => '╥', - '╦' => '╦', - '╧' => '╧', - '╨' => '╨', - '╩' => '╩', - '╪' => '╪', - '╫' => '╫', - '╬' => '╬', - '▀' => '▀', - '▄' => '▄', - '█' => '█', - '░' => '░', - '▒' => '▒', - '▓' => '▓', - '□' => '□', - '▪' => '▪', - '▫' => '▫', - '▭' => '▭', - '▮' => '▮', - '▱' => '▱', - '△' => '△', - '▴' => '▴', - '▵' => '▵', - '▸' => '▸', - '▹' => '▹', - '▽' => '▽', - '▾' => '▾', - '▿' => '▿', - '◂' => '◂', - '◃' => '◃', - '◊' => '◊', - '○' => '○', - '◬' => '◬', - '◯' => '◯', - '◸' => '◸', - '◹' => '◹', - '◺' => '◺', - '◻' => '◻', - '◼' => '◼', - '★' => '★', - '☆' => '☆', - '☎' => '☎', - '♀' => '♀', - '♂' => '♂', - '♠' => '♠', - '♣' => '♣', - '♥' => '♥', - '♦' => '♦', - '♪' => '♪', - '♭' => '♭', - '♮' => '♮', - '♯' => '♯', - '✓' => '✓', - '✗' => '✗', - '✠' => '✠', - '✶' => '✶', - '❘' => '❘', - '❲' => '❲', - '❳' => '❳', - '⟈' => '⟈', - '⟉' => '⟉', - '⟦' => '⟦', - '⟧' => '⟧', - '⟨' => '⟨', - '⟩' => '⟩', - '⟪' => '⟪', - '⟫' => '⟫', - '⟬' => '⟬', - '⟭' => '⟭', - '⟵' => '⟵', - '⟶' => '⟶', - '⟷' => '⟷', - '⟸' => '⟸', - '⟹' => '⟹', - '⟺' => '⟺', - '⟼' => '⟼', - '⟿' => '⟿', - '⤂' => '⤂', - '⤃' => '⤃', - '⤄' => '⤄', - '⤅' => '⤅', - '⤌' => '⤌', - '⤍' => '⤍', - '⤎' => '⤎', - '⤏' => '⤏', - '⤐' => '⤐', - '⤑' => '⤑', - '⤒' => '⤒', - '⤓' => '⤓', - '⤖' => '⤖', - '⤙' => '⤙', - '⤚' => '⤚', - '⤛' => '⤛', - '⤜' => '⤜', - '⤝' => '⤝', - '⤞' => '⤞', - '⤟' => '⤟', - '⤠' => '⤠', - '⤣' => '⤣', - '⤤' => '⤤', - '⤥' => '⤥', - '⤦' => '⤦', - '⤧' => '⤧', - '⤨' => '⤨', - '⤩' => '⤩', - '⤪' => '⤪', - '⤳' => '⤳', - '⤳̸' => '&nrarrc', - '⤵' => '⤵', - '⤶' => '⤶', - '⤷' => '⤷', - '⤸' => '⤸', - '⤹' => '⤹', - '⤼' => '⤼', - '⤽' => '⤽', - '⥅' => '⥅', - '⥈' => '⥈', - '⥉' => '⥉', - '⥊' => '⥊', - '⥋' => '⥋', - '⥎' => '⥎', - '⥏' => '⥏', - '⥐' => '⥐', - '⥑' => '⥑', - '⥒' => '⥒', - '⥓' => '⥓', - '⥔' => '⥔', - '⥕' => '⥕', - '⥖' => '⥖', - '⥗' => '⥗', - '⥘' => '⥘', - '⥙' => '⥙', - '⥚' => '⥚', - '⥛' => '⥛', - '⥜' => '⥜', - '⥝' => '⥝', - '⥞' => '⥞', - '⥟' => '⥟', - '⥠' => '⥠', - '⥡' => '⥡', - '⥢' => '⥢', - '⥣' => '⥣', - '⥤' => '⥤', - '⥥' => '⥥', - '⥦' => '⥦', - '⥧' => '⥧', - '⥨' => '⥨', - '⥩' => '⥩', - '⥪' => '⥪', - '⥫' => '⥫', - '⥬' => '⥬', - '⥭' => '⥭', - '⥮' => '⥮', - '⥯' => '⥯', - '⥰' => '⥰', - '⥱' => '⥱', - '⥲' => '⥲', - '⥳' => '⥳', - '⥴' => '⥴', - '⥵' => '⥵', - '⥶' => '⥶', - '⥸' => '⥸', - '⥹' => '⥹', - '⥻' => '⥻', - '⥼' => '⥼', - '⥽' => '⥽', - '⥾' => '⥾', - '⥿' => '⥿', - '⦅' => '⦅', - '⦆' => '⦆', - '⦋' => '⦋', - '⦌' => '⦌', - '⦍' => '⦍', - '⦎' => '⦎', - '⦏' => '⦏', - '⦐' => '⦐', - '⦑' => '⦑', - '⦒' => '⦒', - '⦓' => '⦓', - '⦔' => '⦔', - '⦕' => '⦕', - '⦖' => '⦖', - '⦚' => '⦚', - '⦜' => '⦜', - '⦝' => '⦝', - '⦤' => '⦤', - '⦥' => '⦥', - '⦦' => '⦦', - '⦧' => '⦧', - '⦨' => '⦨', - '⦩' => '⦩', - '⦪' => '⦪', - '⦫' => '⦫', - '⦬' => '⦬', - '⦭' => '⦭', - '⦮' => '⦮', - '⦯' => '⦯', - '⦰' => '⦰', - '⦱' => '⦱', - '⦲' => '⦲', - '⦳' => '⦳', - '⦴' => '⦴', - '⦵' => '⦵', - '⦶' => '⦶', - '⦷' => '⦷', - '⦹' => '⦹', - '⦻' => '⦻', - '⦼' => '⦼', - '⦾' => '⦾', - '⦿' => '⦿', - '⧀' => '⧀', - '⧁' => '⧁', - '⧂' => '⧂', - '⧃' => '⧃', - '⧄' => '⧄', - '⧅' => '⧅', - '⧉' => '⧉', - '⧍' => '⧍', - '⧎' => '⧎', - '⧏' => '⧏', - '⧏̸' => '&NotLeftTriangleBar', - '⧐' => '⧐', - '⧐̸' => '&NotRightTriangleBar', - '⧜' => '⧜', - '⧝' => '⧝', - '⧞' => '⧞', - '⧣' => '⧣', - '⧤' => '⧤', - '⧥' => '⧥', - '⧫' => '⧫', - '⧴' => '⧴', - '⧶' => '⧶', - '⨀' => '⨀', - '⨁' => '⨁', - '⨂' => '⨂', - '⨄' => '⨄', - '⨆' => '⨆', - '⨌' => '⨌', - '⨍' => '⨍', - '⨐' => '⨐', - '⨑' => '⨑', - '⨒' => '⨒', - '⨓' => '⨓', - '⨔' => '⨔', - '⨕' => '⨕', - '⨖' => '⨖', - '⨗' => '⨗', - '⨢' => '⨢', - '⨣' => '⨣', - '⨤' => '⨤', - '⨥' => '⨥', - '⨦' => '⨦', - '⨧' => '⨧', - '⨩' => '⨩', - '⨪' => '⨪', - '⨭' => '⨭', - '⨮' => '⨮', - '⨯' => '⨯', - '⨰' => '⨰', - '⨱' => '⨱', - '⨳' => '⨳', - '⨴' => '⨴', - '⨵' => '⨵', - '⨶' => '⨶', - '⨷' => '⨷', - '⨸' => '⨸', - '⨹' => '⨹', - '⨺' => '⨺', - '⨻' => '⨻', - '⨼' => '⨼', - '⨿' => '⨿', - '⩀' => '⩀', - '⩂' => '⩂', - '⩃' => '⩃', - '⩄' => '⩄', - '⩅' => '⩅', - '⩆' => '⩆', - '⩇' => '⩇', - '⩈' => '⩈', - '⩉' => '⩉', - '⩊' => '⩊', - '⩋' => '⩋', - '⩌' => '⩌', - '⩍' => '⩍', - '⩐' => '⩐', - '⩓' => '⩓', - '⩔' => '⩔', - '⩕' => '⩕', - '⩖' => '⩖', - '⩗' => '⩗', - '⩘' => '⩘', - '⩚' => '⩚', - '⩛' => '⩛', - '⩜' => '⩜', - '⩝' => '⩝', - '⩟' => '⩟', - '⩦' => '⩦', - '⩪' => '⩪', - '⩭' => '⩭', - '⩭̸' => '&ncongdot', - '⩮' => '⩮', - '⩯' => '⩯', - '⩰' => '⩰', - '⩰̸' => '&napE', - '⩱' => '⩱', - '⩲' => '⩲', - '⩳' => '⩳', - '⩴' => '⩴', - '⩵' => '⩵', - '⩷' => '⩷', - '⩸' => '⩸', - '⩹' => '⩹', - '⩺' => '⩺', - '⩻' => '⩻', - '⩼' => '⩼', - '⩽' => '⩽', - '⩽̸' => '&nles', - '⩾' => '⩾', - '⩾̸' => '&nges', - '⩿' => '⩿', - '⪀' => '⪀', - '⪁' => '⪁', - '⪂' => '⪂', - '⪃' => '⪃', - '⪄' => '⪄', - '⪅' => '⪅', - '⪆' => '⪆', - '⪇' => '⪇', - '⪈' => '⪈', - '⪉' => '⪉', - '⪊' => '⪊', - '⪋' => '⪋', - '⪌' => '⪌', - '⪍' => '⪍', - '⪎' => '⪎', - '⪏' => '⪏', - '⪐' => '⪐', - '⪑' => '⪑', - '⪒' => '⪒', - '⪓' => '⪓', - '⪔' => '⪔', - '⪕' => '⪕', - '⪖' => '⪖', - '⪗' => '⪗', - '⪘' => '⪘', - '⪙' => '⪙', - '⪚' => '⪚', - '⪝' => '⪝', - '⪞' => '⪞', - '⪟' => '⪟', - '⪠' => '⪠', - '⪡' => '⪡', - '⪡̸' => '&NotNestedLessLess', - '⪢' => '⪢', - '⪢̸' => '&NotNestedGreaterGreater', - '⪤' => '⪤', - '⪥' => '⪥', - '⪦' => '⪦', - '⪧' => '⪧', - '⪨' => '⪨', - '⪩' => '⪩', - '⪪' => '⪪', - '⪫' => '⪫', - '⪬' => '⪬', - '⪬︀' => '&smtes', - '⪭' => '⪭', - '⪭︀' => '&lates', - '⪮' => '⪮', - '⪯' => '⪯', - '⪯̸' => '&NotPrecedesEqual', - '⪰' => '⪰', - '⪰̸' => '&NotSucceedsEqual', - '⪳' => '⪳', - '⪴' => '⪴', - '⪵' => '⪵', - '⪶' => '⪶', - '⪷' => '⪷', - '⪸' => '⪸', - '⪹' => '⪹', - '⪺' => '⪺', - '⪻' => '⪻', - '⪼' => '⪼', - '⪽' => '⪽', - '⪾' => '⪾', - '⪿' => '⪿', - '⫀' => '⫀', - '⫁' => '⫁', - '⫂' => '⫂', - '⫃' => '⫃', - '⫄' => '⫄', - '⫅' => '⫅', - '⫅̸' => '&nsubE', - '⫆' => '⫆', - '⫆̸' => '&nsupseteqq', - '⫇' => '⫇', - '⫈' => '⫈', - '⫋' => '⫋', - '⫋︀' => '&vsubnE', - '⫌' => '⫌', - '⫌︀' => '&varsupsetneqq', - '⫏' => '⫏', - '⫐' => '⫐', - '⫑' => '⫑', - '⫒' => '⫒', - '⫓' => '⫓', - '⫔' => '⫔', - '⫕' => '⫕', - '⫖' => '⫖', - '⫗' => '⫗', - '⫘' => '⫘', - '⫙' => '⫙', - '⫚' => '⫚', - '⫛' => '⫛', - '⫤' => '⫤', - '⫦' => '⫦', - '⫧' => '⫧', - '⫨' => '⫨', - '⫩' => '⫩', - '⫫' => '⫫', - '⫬' => '⫬', - '⫭' => '⫭', - '⫮' => '⫮', - '⫯' => '⫯', - '⫰' => '⫰', - '⫱' => '⫱', - '⫲' => '⫲', - '⫳' => '⫳', - '⫽︀' => '&varsupsetneqq', - 'ff' => 'ff', - 'fi' => 'fi', - 'fl' => 'fl', - 'ffi' => 'ffi', - 'ffl' => 'ffl', - '𝒜' => '𝒜', - '𝒞' => '𝒞', - '𝒟' => '𝒟', - '𝒢' => '𝒢', - '𝒥' => '𝒥', - '𝒦' => '𝒦', - '𝒩' => '𝒩', - '𝒪' => '𝒪', - '𝒫' => '𝒫', - '𝒬' => '𝒬', - '𝒮' => '𝒮', - '𝒯' => '𝒯', - '𝒰' => '𝒰', - '𝒱' => '𝒱', - '𝒲' => '𝒲', - '𝒳' => '𝒳', - '𝒴' => '𝒴', - '𝒵' => '𝒵', - '𝒶' => '𝒶', - '𝒷' => '𝒷', - '𝒸' => '𝒸', - '𝒹' => '𝒹', - '𝒻' => '𝒻', - '𝒽' => '𝒽', - '𝒾' => '𝒾', - '𝒿' => '𝒿', - '𝓀' => '𝓀', - '𝓁' => '𝓁', - '𝓂' => '𝓂', - '𝓃' => '𝓃', - '𝓅' => '𝓅', - '𝓆' => '𝓆', - '𝓇' => '𝓇', - '𝓈' => '𝓈', - '𝓉' => '𝓉', - '𝓊' => '𝓊', - '𝓋' => '𝓋', - '𝓌' => '𝓌', - '𝓍' => '𝓍', - '𝓎' => '𝓎', - '𝓏' => '𝓏', - '𝔄' => '𝔄', - '𝔅' => '𝔅', - '𝔇' => '𝔇', - '𝔈' => '𝔈', - '𝔉' => '𝔉', - '𝔊' => '𝔊', - '𝔍' => '𝔍', - '𝔎' => '𝔎', - '𝔏' => '𝔏', - '𝔐' => '𝔐', - '𝔑' => '𝔑', - '𝔒' => '𝔒', - '𝔓' => '𝔓', - '𝔔' => '𝔔', - '𝔖' => '𝔖', - '𝔗' => '𝔗', - '𝔘' => '𝔘', - '𝔙' => '𝔙', - '𝔚' => '𝔚', - '𝔛' => '𝔛', - '𝔜' => '𝔜', - '𝔞' => '𝔞', - '𝔟' => '𝔟', - '𝔠' => '𝔠', - '𝔡' => '𝔡', - '𝔢' => '𝔢', - '𝔣' => '𝔣', - '𝔤' => '𝔤', - '𝔥' => '𝔥', - '𝔦' => '𝔦', - '𝔧' => '𝔧', - '𝔨' => '𝔨', - '𝔩' => '𝔩', - '𝔪' => '𝔪', - '𝔫' => '𝔫', - '𝔬' => '𝔬', - '𝔭' => '𝔭', - '𝔮' => '𝔮', - '𝔯' => '𝔯', - '𝔰' => '𝔰', - '𝔱' => '𝔱', - '𝔲' => '𝔲', - '𝔳' => '𝔳', - '𝔴' => '𝔴', - '𝔵' => '𝔵', - '𝔶' => '𝔶', - '𝔷' => '𝔷', - '𝔸' => '𝔸', - '𝔹' => '𝔹', - '𝔻' => '𝔻', - '𝔼' => '𝔼', - '𝔽' => '𝔽', - '𝔾' => '𝔾', - '𝕀' => '𝕀', - '𝕁' => '𝕁', - '𝕂' => '𝕂', - '𝕃' => '𝕃', - '𝕄' => '𝕄', - '𝕆' => '𝕆', - '𝕊' => '𝕊', - '𝕋' => '𝕋', - '𝕌' => '𝕌', - '𝕍' => '𝕍', - '𝕎' => '𝕎', - '𝕏' => '𝕏', - '𝕐' => '𝕐', - '𝕒' => '𝕒', - '𝕓' => '𝕓', - '𝕔' => '𝕔', - '𝕕' => '𝕕', - '𝕖' => '𝕖', - '𝕗' => '𝕗', - '𝕘' => '𝕘', - '𝕙' => '𝕙', - '𝕚' => '𝕚', - '𝕛' => '𝕛', - '𝕜' => '𝕜', - '𝕝' => '𝕝', - '𝕞' => '𝕞', - '𝕟' => '𝕟', - '𝕠' => '𝕠', - '𝕡' => '𝕡', - '𝕢' => '𝕢', - '𝕣' => '𝕣', - '𝕤' => '𝕤', - '𝕥' => '𝕥', - '𝕦' => '𝕦', - '𝕧' => '𝕧', - '𝕨' => '𝕨', - '𝕩' => '𝕩', - '𝕪' => '𝕪', - '𝕫' => '𝕫', - ); -} diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php deleted file mode 100644 index ec467f22c..000000000 --- a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php +++ /dev/null @@ -1,553 +0,0 @@ -'http://www.w3.org/1999/xhtml', - 'attrNamespace'=>'http://www.w3.org/1999/xhtml', - - 'nodeName'=>'img', 'nodeName'=>array('img', 'a'), - 'attrName'=>'alt', 'attrName'=>array('title', 'alt'), - ), - */ - array( - 'nodeNamespace' => 'http://www.w3.org/1999/xhtml', - 'attrName' => array('href', - 'hreflang', - 'http-equiv', - 'icon', - 'id', - 'keytype', - 'kind', - 'label', - 'lang', - 'language', - 'list', - 'maxlength', - 'media', - 'method', - 'name', - 'placeholder', - 'rel', - 'rows', - 'rowspan', - 'sandbox', - 'spellcheck', - 'scope', - 'seamless', - 'shape', - 'size', - 'sizes', - 'span', - 'src', - 'srcdoc', - 'srclang', - 'srcset', - 'start', - 'step', - 'style', - 'summary', - 'tabindex', - 'target', - 'title', - 'type', - 'value', - 'width', - 'border', - 'charset', - 'cite', - 'class', - 'code', - 'codebase', - 'color', - 'cols', - 'colspan', - 'content', - 'coords', - 'data', - 'datetime', - 'default', - 'dir', - 'dirname', - 'enctype', - 'for', - 'form', - 'formaction', - 'headers', - 'height', - 'accept', - 'accept-charset', - 'accesskey', - 'action', - 'align', - 'alt', - 'bgcolor', - ), - ), - array( - 'nodeNamespace' => 'http://www.w3.org/1999/xhtml', - 'xpath' => 'starts-with(local-name(), \'data-\')', - ), - ); - - const DOCTYPE = ''; - - public function __construct($output, $options = array()) - { - if (isset($options['encode_entities'])) { - $this->encode = $options['encode_entities']; - } - - $this->outputMode = static::IM_IN_HTML; - $this->out = $output; - $this->hasHTML5 = defined('ENT_HTML5'); - } - - public function addRule(array $rule) - { - $this->nonBooleanAttributes[] = $rule; - } - - public function setTraverser(Traverser $traverser) - { - $this->traverser = $traverser; - - return $this; - } - - public function unsetTraverser() - { - $this->traverser = null; - - return $this; - } - - public function document($dom) - { - $this->doctype(); - if ($dom->documentElement) { - foreach ($dom->childNodes as $node) { - $this->traverser->node($node); - } - $this->nl(); - } - } - - protected function doctype() - { - $this->wr(static::DOCTYPE); - $this->nl(); - } - - public function element($ele) - { - $name = $ele->tagName; - - // Per spec: - // If the element has a declared namespace in the HTML, MathML or - // SVG namespaces, we use the lname instead of the tagName. - if ($this->traverser->isLocalElement($ele)) { - $name = $ele->localName; - } - - // If we are in SVG or MathML there is special handling. - // Using if/elseif instead of switch because it's faster in PHP. - if ('svg' == $name) { - $this->outputMode = static::IM_IN_SVG; - $name = Elements::normalizeSvgElement($name); - } elseif ('math' == $name) { - $this->outputMode = static::IM_IN_MATHML; - } - - $this->openTag($ele); - if (Elements::isA($name, Elements::TEXT_RAW)) { - foreach ($ele->childNodes as $child) { - if ($child instanceof \DOMCharacterData) { - $this->wr($child->data); - } elseif ($child instanceof \DOMElement) { - $this->element($child); - } - } - } else { - // Handle children. - if ($ele->hasChildNodes()) { - $this->traverser->children($ele->childNodes); - } - - // Close out the SVG or MathML special handling. - if ('svg' == $name || 'math' == $name) { - $this->outputMode = static::IM_IN_HTML; - } - } - - // If not unary, add a closing tag. - if (!Elements::isA($name, Elements::VOID_TAG)) { - $this->closeTag($ele); - } - } - - /** - * Write a text node. - * - * @param \DOMText $ele The text node to write. - */ - public function text($ele) - { - if (isset($ele->parentNode) && isset($ele->parentNode->tagName) && Elements::isA($ele->parentNode->localName, Elements::TEXT_RAW)) { - $this->wr($ele->data); - - return; - } - - // FIXME: This probably needs some flags set. - $this->wr($this->enc($ele->data)); - } - - public function cdata($ele) - { - // This encodes CDATA. - $this->wr($ele->ownerDocument->saveXML($ele)); - } - - public function comment($ele) - { - // These produce identical output. - // $this->wr(''); - $this->wr($ele->ownerDocument->saveXML($ele)); - } - - public function processorInstruction($ele) - { - $this->wr('wr($ele->target) - ->wr(' ') - ->wr($ele->data) - ->wr('?>'); - } - - /** - * Write the namespace attributes. - * - * @param \DOMNode $ele The element being written. - */ - protected function namespaceAttrs($ele) - { - if (!$this->xpath || $this->xpath->document !== $ele->ownerDocument) { - $this->xpath = new \DOMXPath($ele->ownerDocument); - } - - foreach ($this->xpath->query('namespace::*[not(.=../../namespace::*)]', $ele) as $nsNode) { - if (!in_array($nsNode->nodeValue, $this->implicitNamespaces)) { - $this->wr(' ')->wr($nsNode->nodeName)->wr('="')->wr($nsNode->nodeValue)->wr('"'); - } - } - } - - /** - * Write the opening tag. - * - * Tags for HTML, MathML, and SVG are in the local name. Otherwise, use the - * qualified name (8.3). - * - * @param \DOMNode $ele The element being written. - */ - protected function openTag($ele) - { - $this->wr('<')->wr($this->traverser->isLocalElement($ele) ? $ele->localName : $ele->tagName); - - $this->attrs($ele); - $this->namespaceAttrs($ele); - - if ($this->outputMode == static::IM_IN_HTML) { - $this->wr('>'); - } // If we are not in html mode we are in SVG, MathML, or XML embedded content. - else { - if ($ele->hasChildNodes()) { - $this->wr('>'); - } // If there are no children this is self closing. - else { - $this->wr(' />'); - } - } - } - - protected function attrs($ele) - { - // FIXME: Needs support for xml, xmlns, xlink, and namespaced elements. - if (!$ele->hasAttributes()) { - return $this; - } - - // TODO: Currently, this always writes name="value", and does not do - // value-less attributes. - $map = $ele->attributes; - $len = $map->length; - for ($i = 0; $i < $len; ++$i) { - $node = $map->item($i); - $val = $this->enc($node->value, true); - - // XXX: The spec says that we need to ensure that anything in - // the XML, XMLNS, or XLink NS's should use the canonical - // prefix. It seems that DOM does this for us already, but there - // may be exceptions. - $name = $node->nodeName; - - // Special handling for attributes in SVG and MathML. - // Using if/elseif instead of switch because it's faster in PHP. - if ($this->outputMode == static::IM_IN_SVG) { - $name = Elements::normalizeSvgAttribute($name); - } elseif ($this->outputMode == static::IM_IN_MATHML) { - $name = Elements::normalizeMathMlAttribute($name); - } - - $this->wr(' ')->wr($name); - - if ((isset($val) && '' !== $val) || $this->nonBooleanAttribute($node)) { - $this->wr('="')->wr($val)->wr('"'); - } - } - } - - protected function nonBooleanAttribute(\DOMAttr $attr) - { - $ele = $attr->ownerElement; - foreach ($this->nonBooleanAttributes as $rule) { - if (isset($rule['nodeNamespace']) && $rule['nodeNamespace'] !== $ele->namespaceURI) { - continue; - } - if (isset($rule['attNamespace']) && $rule['attNamespace'] !== $attr->namespaceURI) { - continue; - } - if (isset($rule['nodeName']) && !is_array($rule['nodeName']) && $rule['nodeName'] !== $ele->localName) { - continue; - } - if (isset($rule['nodeName']) && is_array($rule['nodeName']) && !in_array($ele->localName, $rule['nodeName'], true)) { - continue; - } - if (isset($rule['attrName']) && !is_array($rule['attrName']) && $rule['attrName'] !== $attr->localName) { - continue; - } - if (isset($rule['attrName']) && is_array($rule['attrName']) && !in_array($attr->localName, $rule['attrName'], true)) { - continue; - } - if (isset($rule['xpath'])) { - $xp = $this->getXPath($attr); - if (isset($rule['prefixes'])) { - foreach ($rule['prefixes'] as $nsPrefix => $ns) { - $xp->registerNamespace($nsPrefix, $ns); - } - } - if (!$xp->evaluate($rule['xpath'], $attr)) { - continue; - } - } - - return true; - } - - return false; - } - - private function getXPath(\DOMNode $node) - { - if (!$this->xpath) { - $this->xpath = new \DOMXPath($node->ownerDocument); - } - - return $this->xpath; - } - - /** - * Write the closing tag. - * - * Tags for HTML, MathML, and SVG are in the local name. Otherwise, use the - * qualified name (8.3). - * - * @param \DOMNode $ele The element being written. - */ - protected function closeTag($ele) - { - if ($this->outputMode == static::IM_IN_HTML || $ele->hasChildNodes()) { - $this->wr('wr($this->traverser->isLocalElement($ele) ? $ele->localName : $ele->tagName)->wr('>'); - } - } - - /** - * Write to the output. - * - * @param string $text The string to put into the output - * - * @return $this - */ - protected function wr($text) - { - fwrite($this->out, $text); - - return $this; - } - - /** - * Write a new line character. - * - * @return $this - */ - protected function nl() - { - fwrite($this->out, PHP_EOL); - - return $this; - } - - /** - * Encode text. - * - * When encode is set to false, the default value, the text passed in is - * escaped per section 8.3 of the html5 spec. For details on how text is - * escaped see the escape() method. - * - * When encoding is set to true the text is converted to named character - * references where appropriate. Section 8.1.4 Character references of the - * html5 spec refers to using named character references. This is useful for - * characters that can't otherwise legally be used in the text. - * - * The named character references are listed in section 8.5. - * - * @see http://www.w3.org/TR/2013/CR-html5-20130806/syntax.html#named-character-references True encoding will turn all named character references into their entities. - * This includes such characters as +.# and many other common ones. By default - * encoding here will just escape &'<>". - * - * Note, PHP 5.4+ has better html5 encoding. - * - * @todo Use the Entities class in php 5.3 to have html5 entities. - * - * @param string $text Text to encode. - * @param bool $attribute True if we are encoding an attrubute, false otherwise. - * - * @return string The encoded text. - */ - protected function enc($text, $attribute = false) - { - // Escape the text rather than convert to named character references. - if (!$this->encode) { - return $this->escape($text, $attribute); - } - - // If we are in PHP 5.4+ we can use the native html5 entity functionality to - // convert the named character references. - - if ($this->hasHTML5) { - return htmlentities($text, ENT_HTML5 | ENT_SUBSTITUTE | ENT_QUOTES, 'UTF-8', false); - } // If a version earlier than 5.4 html5 entities are not entirely handled. - // This manually handles them. - else { - return strtr($text, HTML5Entities::$map); - } - } - - /** - * Escape test. - * - * According to the html5 spec section 8.3 Serializing HTML fragments, text - * within tags that are not style, script, xmp, iframe, noembed, and noframes - * need to be properly escaped. - * - * The & should be converted to &, no breaking space unicode characters - * converted to  , when in attribute mode the " should be converted to - * ", and when not in attribute mode the < and > should be converted to - * < and >. - * - * @see http://www.w3.org/TR/2013/CR-html5-20130806/syntax.html#escapingString - * - * @param string $text Text to escape. - * @param bool $attribute True if we are escaping an attrubute, false otherwise. - */ - protected function escape($text, $attribute = false) - { - // Not using htmlspecialchars because, while it does escaping, it doesn't - // match the requirements of section 8.5. For example, it doesn't handle - // non-breaking spaces. - if ($attribute) { - $replace = array( - '"' => '"', - '&' => '&', - "\xc2\xa0" => ' ', - ); - } else { - $replace = array( - '<' => '<', - '>' => '>', - '&' => '&', - "\xc2\xa0" => ' ', - ); - } - - return strtr($text, $replace); - } -} diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/README.md b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/README.md deleted file mode 100644 index 849a47f3a..000000000 --- a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# The Serializer (Writer) Model - -The serializer roughly follows sections _8.1 Writing HTML documents_ and section -_8.3 Serializing HTML fragments_ by converting DOMDocument, DOMDocumentFragment, -and DOMNodeList into HTML5. - - [ HTML5 ] // Interface for saving. - || - [ Traverser ] // Walk the DOM - || - [ Rules ] // Convert DOM elements into strings. - || - [ HTML5 ] // HTML5 document or fragment in text. - - -## HTML5 Class - -Provides the top level interface for saving. - -## The Traverser - -Walks the DOM finding each element and passing it off to the output rules to -convert to HTML5. - -## Output Rules - -The output rules are defined in the RulesInterface which can have multiple -implementations. Currently, the OutputRules is the default implementation that -converts a DOM as is into HTML5. - -## HTML5 String - -The output of the process it HTML5 as a string or saved to a file. \ No newline at end of file diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php deleted file mode 100644 index 69a6ecdad..000000000 --- a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php +++ /dev/null @@ -1,99 +0,0 @@ - 'html', - 'http://www.w3.org/1998/Math/MathML' => 'math', - 'http://www.w3.org/2000/svg' => 'svg', - ); - - protected $dom; - - protected $options; - - protected $encode = false; - - protected $rules; - - protected $out; - - /** - * Create a traverser. - * - * @param \DOMNode|\DOMNodeList $dom The document or node to traverse. - * @param resource $out A stream that allows writing. The traverser will output into this - * stream. - * @param array $options An array of options for the traverser as key/value pairs. These include: - * - encode_entities: A bool to specify if full encding should happen for all named - * charachter references. Defaults to false which escapes &'<>". - * - output_rules: The path to the class handling the output rules. - */ - public function __construct($dom, $out, RulesInterface $rules, $options = array()) - { - $this->dom = $dom; - $this->out = $out; - $this->rules = $rules; - $this->options = $options; - - $this->rules->setTraverser($this); - } - - /** - * Tell the traverser to walk the DOM. - * - * @return resource $out Returns the output stream. - */ - public function walk() - { - if ($this->dom instanceof \DOMDocument) { - $this->rules->document($this->dom); - } elseif ($this->dom instanceof \DOMDocumentFragment) { - // Document fragments are a special case. Only the children need to - // be serialized. - if ($this->dom->hasChildNodes()) { - $this->children($this->dom->childNodes); - } - } // If NodeList, loop - elseif ($this->dom instanceof \DOMNodeList) { - // If this is a NodeList of DOMDocuments this will not work. - $this->children($this->dom); - } // Else assume this is a DOMNode-like datastructure. - else { - $this->node($this->dom); - } - - return $this->out; - } - - /** - * Process a node in the DOM. - * - * @param mixed $node A node implementing \DOMNode. - */ - public function node($node) - { - // A listing of types is at http://php.net/manual/en/dom.constants.php - switch ($node->nodeType) { - case XML_ELEMENT_NODE: - $this->rules->element($node); - break; - case XML_TEXT_NODE: - $this->rules->text($node); - break; - case XML_CDATA_SECTION_NODE: - $this->rules->cdata($node); - break; - case XML_PI_NODE: - $this->rules->processorInstruction($node); - break; - case XML_COMMENT_NODE: - $this->rules->comment($node); - break; - // Currently we don't support embedding DTDs. - default: - //print ''; - break; - } - } - - /** - * Walk through all the nodes on a node list. - * - * @param \DOMNodeList $nl A list of child elements to walk through. - */ - public function children($nl) - { - foreach ($nl as $node) { - $this->node($node); - } - } - - /** - * Is an element local? - * - * @param mixed $ele An element that implement \DOMNode. - * - * @return bool true if local and false otherwise. - */ - public function isLocalElement($ele) - { - $uri = $ele->namespaceURI; - if (empty($uri)) { - return false; - } - - return isset(static::$local_ns[$uri]); - } -} -- cgit v1.2.3