⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 directlex.php

📁 很棒的在线教学系统
💻 PHP
📖 第 1 页 / 共 2 页
字号:
<?phprequire_once 'HTMLPurifier/Lexer.php';HTMLPurifier_ConfigSchema::define(    'Core', 'DirectLexLineNumberSyncInterval', 0, 'int', '<p>  Specifies the number of tokens the DirectLex line number tracking  implementations should process before attempting to resyncronize the  current line count by manually counting all previous new-lines. When  at 0, this functionality is disabled. Lower values will decrease  performance, and this is only strictly necessary if the counting  algorithm is buggy (in which case you should report it as a bug).  This has no effect when %Core.MaintainLineNumbers is disabled or DirectLex is  not being used. This directive has been available since 2.0.0.</p>');/** * Our in-house implementation of a parser. *  * A pure PHP parser, DirectLex has absolutely no dependencies, making * it a reasonably good default for PHP4.  Written with efficiency in mind, * it can be four times faster than HTMLPurifier_Lexer_PEARSax3, although it * pales in comparison to HTMLPurifier_Lexer_DOMLex. *  * @todo Reread XML spec and document differences. */class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer{        /**     * Whitespace characters for str(c)spn.     * @protected     */    var $_whitespace = "\x20\x09\x0D\x0A";        /**     * Callback function for script CDATA fudge     * @param $matches, in form of array(opening tag, contents, closing tag)     * @static     */    function scriptCallback($matches) {        return $matches[1] . htmlspecialchars($matches[2], ENT_COMPAT, 'UTF-8') . $matches[3];    }        function tokenizeHTML($html, $config, &$context) {                // special normalization for script tags without any armor        // our "armor" heurstic is a < sign any number of whitespaces after        // the first script tag        if ($config->get('HTML', 'Trusted')) {            $html = preg_replace_callback('#(<script[^>]*>)(\s*[^<].+?)(</script>)#si',                array('HTMLPurifier_Lexer_DirectLex', 'scriptCallback'), $html);        }                $html = $this->normalize($html, $config, $context);                $cursor = 0; // our location in the text        $inside_tag = false; // whether or not we're parsing the inside of a tag        $array = array(); // result array                $maintain_line_numbers = $config->get('Core', 'MaintainLineNumbers');                if ($maintain_line_numbers === null) {            // automatically determine line numbering by checking            // if error collection is on            $maintain_line_numbers = $config->get('Core', 'CollectErrors');        }                if ($maintain_line_numbers) $current_line = 1;        else $current_line = false;        $context->register('CurrentLine', $current_line);        $nl = "\n";        // how often to manually recalculate. This will ALWAYS be right,        // but it's pretty wasteful. Set to 0 to turn off        $synchronize_interval = $config->get('Core', 'DirectLexLineNumberSyncInterval');                 $e = false;        if ($config->get('Core', 'CollectErrors')) {            $e =& $context->get('ErrorCollector');        }                // infinite loop protection        // has to be pretty big, since html docs can be big        // we're allow two hundred thousand tags... more than enough?        // NOTE: this is also used for synchronization, so watch out        $loops = 0;                while(true) {                        // infinite loop protection            if (++$loops > 200000) return array();                        // recalculate lines            if (                $maintain_line_numbers && // line number tracking is on                $synchronize_interval &&  // synchronization is on                $cursor > 0 &&            // cursor is further than zero                $loops % $synchronize_interval === 0 // time to synchronize!            ) {                $current_line = 1 + $this->substrCount($html, $nl, 0, $cursor);            }                        $position_next_lt = strpos($html, '<', $cursor);            $position_next_gt = strpos($html, '>', $cursor);                        // triggers on "<b>asdf</b>" but not "asdf <b></b>"            // special case to set up context            if ($position_next_lt === $cursor) {                $inside_tag = true;                $cursor++;            }                        if (!$inside_tag && $position_next_lt !== false) {                // We are not inside tag and there still is another tag to parse                $token = new                    HTMLPurifier_Token_Text(                        $this->parseData(                            substr(                                $html, $cursor, $position_next_lt - $cursor                            )                        )                    );                if ($maintain_line_numbers) {                    $token->line = $current_line;                    $current_line += $this->substrCount($html, $nl, $cursor, $position_next_lt - $cursor);                }                $array[] = $token;                $cursor  = $position_next_lt + 1;                $inside_tag = true;                continue;            } elseif (!$inside_tag) {                // We are not inside tag but there are no more tags                // If we're already at the end, break                if ($cursor === strlen($html)) break;                // Create Text of rest of string                $token = new                    HTMLPurifier_Token_Text(                        $this->parseData(                            substr(                                $html, $cursor                            )                        )                    );                if ($maintain_line_numbers) $token->line = $current_line;                $array[] = $token;                break;            } elseif ($inside_tag && $position_next_gt !== false) {                // We are in tag and it is well formed                // Grab the internals of the tag                $strlen_segment = $position_next_gt - $cursor;                                if ($strlen_segment < 1) {                    // there's nothing to process!                    $token = new HTMLPurifier_Token_Text('<');                    $cursor++;                    continue;                }                                $segment = substr($html, $cursor, $strlen_segment);                                if ($segment === false) {                    // somehow, we attempted to access beyond the end of                    // the string, defense-in-depth, reported by Nate Abele                    break;                }                                // Check if it's a comment                if (                    strncmp('!--', $segment, 3) === 0                ) {                    // re-determine segment length, looking for -->                    $position_comment_end = strpos($html, '-->', $cursor);                    if ($position_comment_end === false) {                        // uh oh, we have a comment that extends to                        // infinity. Can't be helped: set comment                        // end position to end of string                        if ($e) $e->send(E_WARNING, 'Lexer: Unclosed comment');                        $position_comment_end = strlen($html);                        $end = true;                    } else {                        $end = false;                    }                    $strlen_segment = $position_comment_end - $cursor;                    $segment = substr($html, $cursor, $strlen_segment);                    $token = new HTMLPurifier_Token_Comment(substr($segment, 3));                    if ($maintain_line_numbers) {                        $token->line = $current_line;                        $current_line += $this->substrCount($html, $nl, $cursor, $strlen_segment);                    }                    $array[] = $token;                    $cursor = $end ? $position_comment_end : $position_comment_end + 3;                    $inside_tag = false;                    continue;                }                                // Check if it's an end tag                $is_end_tag = (strpos($segment,'/') === 0);                if ($is_end_tag) {                    $type = substr($segment, 1);                    $token = new HTMLPurifier_Token_End($type);                    if ($maintain_line_numbers) {                        $token->line = $current_line;                        $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);                    }                    $array[] = $token;                    $inside_tag = false;                    $cursor = $position_next_gt + 1;                    continue;                }                                // Check leading character is alnum, if not, we may                // have accidently grabbed an emoticon. Translate into                // text and go our merry way                if (!ctype_alpha($segment[0])) {                    // XML:  $segment[0] !== '_' && $segment[0] !== ':'                    if ($e) $e->send(E_NOTICE, 'Lexer: Unescaped lt');                    $token = new                        HTMLPurifier_Token_Text(                            '<' .                            $this->parseData(                                $segment                            ) .                             '>'                        );                    if ($maintain_line_numbers) {                        $token->line = $current_line;                        $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);                    }                    $array[] = $token;                    $cursor = $position_next_gt + 1;                    $inside_tag = false;                    continue;                }                                // Check if it is explicitly self closing, if so, remove                // trailing slash. Remember, we could have a tag like <br>, so                // any later token processing scripts must convert improperly                // classified EmptyTags from StartTags.                $is_self_closing = (strrpos($segment,'/') === $strlen_segment-1);                if ($is_self_closing) {                    $strlen_segment--;                    $segment = substr($segment, 0, $strlen_segment);                }                                // Check if there are any attributes                $position_first_space = strcspn($segment, $this->_whitespace);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -