function _test_escape_token($token) { $escaped = LuminousUtils::escape_token($token); // name should be unchanged assert($token[0] === $escaped[0]); $expected = $token[2] ? $token[1] : LuminousUtils::escape_string($token[1]); assert($escaped[1] === $expected); assert($escaped[2]); }
static function str_filter($token) { if (strpos($token[1], '~') == false) { return $token; } $token = LuminousUtils::escape_token($token); $token[1] = preg_replace('/~(?:\\d+|.)/', '<INTERPOLATION>$0</INTERPOLATION>', $token[1]); return $token; }
static function comment_filter($token) { $token = LuminousUtils::escape_token($token); $str =& $token[1]; // It pays to run the strpos checks first. if (strpos(substr($str, 1), '"') !== false) { $str = preg_replace('/(?<!^)"(?>[^"]*)"/', "<STRING>\$0</STRING>", $str); } if (strpos($str, ':') !== false) { $str = preg_replace('/(?<=^")((?>\\W*))((?>[A-Z]\\w+(?>(?>\\s+\\w+)*)))(:\\s*)(.*)/', '$1<DOCTAG>$2</DOCTAG>$3<DOCSTR>$4</DOCSTR>', $str); } return $token; }
static function str_filter($token) { if ($token[1][0] !== '"' && $token[0] !== 'HEREDOC') { return $token; } elseif (strpos($token[1], '$') === false) { return $token; } $token = LuminousUtils::escape_token($token); // matches $var, ${var} and {$var} syntax $token[1] = preg_replace('/ (?: \\$\\{ | \\{\\$ ) [^}]++ \\} | \\$\\$?[a-zA-Z_]\\w* /x', '<VARIABLE>$0</VARIABLE>', $token[1]); return $token; }
public static function string_filter($token) { $token = LuminousUtils::escape_token($token); $token[1] = preg_replace("/\\\$(?:\\w+|\\{[^}\n]+\\})/", '<VARIABLE>$0</VARIABLE>', $token[1]); return $token; }
/** * @brief Tries to highlight PCRE style regular expression syntax */ static function pcre($token, $delimited = true) { $token = self::string($token); $token = LuminousUtils::escape_token($token); $str =& $token[1]; $flags = array(); if ($delimited) { $str = preg_replace('/^[^[:alnum:]<>\\s]/', '<DELIMITER>$0</DELIMITER>', $str); if (preg_match("/[[:alpha:]]+\$/", $str, $matches)) { $m = $matches[0]; $flags = str_split($m); $str = preg_replace("/((?<!\\A)[^[:alnum:]\\s<>])([[:alpha:]]+)\$/", "<DELIMITER>\$1</DELIMITER><KEYWORD>\$2</KEYWORD>", $str); } else { $str = preg_replace('/[^[:alnum:]<>]$/', '<DELIMITER>$0</DELIMITER>', $str); } } $str = preg_replace("/((?<!\\\\)[\\*\\+\\.|])|((?<![\\(\\\\])\\?)/", "<REGEX_OPERATOR>\$0</REGEX_OPERATOR>", $str); $str = preg_replace("/(?<=\\()\\?(?:(?:[a-zA-Z:!|=])|(?:(?:<)[=!]))/", "<REGEX_SUBPATTERN>\$0</REGEX_SUBPATTERN>", $str); $str = preg_replace("/(?<!\\\\)[\\(\\)]/", "<REGEX_SUBPATTERN_MARKER>\$0</REGEX_SUBPATTERN_MARKER>", $str); $str = preg_replace("/(?<!\\\\)[\\[\\]]/", "<REGEX_CLASS_MARKER>\$0</REGEX_CLASS_MARKER>", $str); $str = preg_replace("/(?<!\\\\)\n \\{\n (\n ((?>\\d+)(,(?>\\d+)?)?)\n |\n (,(?>\\d+))\n )\n \\}/x", "<REGEX_REPEAT_MARKER>\$0</REGEX_REPEAT_MARKER>", $str); // extended regex: # signifies a comment if (in_array('x', $flags)) { $str = preg_replace('/(?<!\\\\)#.*$/m', '<COMMENT>$0</COMMENT>', $str); } return $token; }
static function preprocessor_filter($token) { $token = LuminousUtils::escape_token($token); $token[1] = preg_replace_callback("@\n (?P<STR> \" (?> [^\\\\\n\"]+ | \\\\. )* (?: \"|\$) | (?<=<) .*? (?=>))\n | // .*\n | /\\* (?s:.*?) (\\*/ | \$)\n @x", array('LuminousCppScanner', 'preprocessor_filter_cb'), $token[1]); return $token; }