| <? | |
| class EpsilonSyntaxHighlight { | |
| public static function process( $s, $language ) { | |
| $s = htmlspecialchars( $s ); | |
| // Workaround for escaped backslashes | |
| $s = str_replace( '\\\\','\\\\<e>', $s ); | |
| $regexp = array( | |
| // Comments/Strings | |
| '/( | |
| \/\*.*?\*\/| | |
| --.*?\n| | |
| ".*?"| | |
| \'(.*?)\' | |
| )/isex' | |
| => 'self::replaceId($tokens,\'$1\')', | |
| //EGL regions | |
| '/(\[%.*?%\])/' | |
| => '<span class="B">$1</span>', | |
| // Numbers (also look for Hex) | |
| '/(?<!\w)( | |
| 0x[\da-f]+| | |
| \d+ | |
| )(?!\w)/ix' | |
| => '<span class="N">$1</span>', | |
| // Make the bold assumption that an all uppercase word has a | |
| // special meaning | |
| '/(?<!\w|>)( | |
| [A-Z_0-9]{2,} | |
| )(?!\w)/x' | |
| => '<span class="D">$1</span>', | |
| // Keywords | |
| '/(?<!\w|\$|\%|\@|>)('.self::getKeywords($language).')(?!\w|=")/' | |
| => '<span style="color:#7F0055;font-weight:bold">$1</span>', | |
| // Keywords | |
| '/(?<!\w|\$|\%|\@|>)(self)(?!\w|=")/' | |
| => '<span style="color:#2A00FF">$1</span>', | |
| // PHP/Perl-Style Vars: $var, %var, @var | |
| '/(?<!\w)( | |
| (\$|\%|\@)(\->|\w)+ | |
| )(?!\w)/ix' | |
| => '<span class="V">$1</span>' | |
| ); | |
| $tokens = array(); // This array will be filled from the regexp-callback | |
| $s = preg_replace( array_keys($regexp), array_values($regexp), $s ); | |
| // Paste the comments and strings back in again | |
| $s = str_replace( array_keys($tokens), array_values($tokens), $s ); | |
| // Delete the "Escaped Backslash Workaround Token" (TM) and replace | |
| // tabs with four spaces. | |
| $s = str_replace( array( '<e>', "\t" ), array( '', ' ' ), $s ); | |
| return '<pre>'.$s.'</pre>'; | |
| } | |
| private static function getKeywords($language) { | |
| $keywords = "delete|import|for|while|in|and|or|operation|return|def|var|throw|if|new|else|transaction|abort|break|continue|assert|assertError|not"; | |
| if ($language == "etl" || $language == "eml") { | |
| $keywords .= "|rule|transform|to|pre|post|extends"; | |
| } | |
| if ($language == "evl") { | |
| $keywords .= "|context|constraint|critique|guard|check|message|fix|title|do|pre|post"; | |
| } | |
| if ($language == "ecl") { | |
| $keywords .= "|rule|match|with|compare|do|guard|pre|post"; | |
| } | |
| if ($language == "eml") { | |
| $keywords .= "|rule|merge|with|into|guard"; | |
| } | |
| if ($language == "ewl") { | |
| $keywords .= "|wizard|title|guard|pre|post|do"; | |
| } | |
| if ($language == "mig") { | |
| $keywords .= "|original|migrated|migrate|when|to"; | |
| } | |
| if ($language == "epl") { | |
| $keywords .= "|pattern"; | |
| } | |
| return $keywords; | |
| } | |
| // Regexp-Callback to replace every comment or string with a uniqid and save | |
| // the matched text in an array | |
| // This way, strings and comments will be stripped out and wont be processed | |
| // by the other expressions searching for keywords etc. | |
| private static function replaceId( &$a, $match ) { | |
| $id = "##r".uniqid()."##"; | |
| // String or Comment? | |
| if( $match{0} == '-') { | |
| $a[$id] = '<span style="color:#3F7F5F">'.$match.'</span>'; | |
| } else { | |
| $a[$id] = '<span style="color:#2A00FF">'.$match.'</span>'; | |
| } | |
| return $id; | |
| } | |
| } | |
| ?> |