php.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. ===============================================================================
  3. Chili is the jQuery code highlighter plugin
  4. ...............................................................................
  5. LICENSE: http://www.opensource.org/licenses/mit-license.php
  6. WEBSITE: http://noteslog.com/chili/
  7. Copyright 2008 / Andrea Ercolino
  8. ===============================================================================
  9. */
  10. /* ----------------------------------------------------------------------------
  11. * this recipe uses a little trick for highlighting php code
  12. * 1: replace each php snippet with a placeholder
  13. * 2: highlight html without php and php snippets apart
  14. * 3: replace each placeholder with its highlighted php snippet
  15. *
  16. * the trick is not perfect only if the html without php is broken
  17. * however, in such a case many highlighters get fooled but Chili does not
  18. *
  19. * ---
  20. * this recipe has been adapted for working with Safari
  21. * in fact, Safari cannot match more than 101236 characters with a lazy star
  22. * --------------------------------------------------------------------------*/
  23. {
  24. _name: "php"
  25. , _case: true
  26. , _main: {
  27. all: {
  28. _match: /[\w\W]*/
  29. , _replace: function( all ) {
  30. var placeholder = String.fromCharCode(0);
  31. var blocks = [];
  32. var that = this;
  33. var no_php_1 = all.replace( /<\?[^?]*\?+(?:[^>][^?]*\?+)*>/g, function( block ) {
  34. blocks.push( that.x( block, '/block/php_1' ) );
  35. return placeholder;
  36. } );
  37. var no_php_2 = no_php_1.replace( /^[^?]*\?+(?:[^>][^?]*\?+)*>|<\?[\w\W]*$/g, function( block ) {
  38. blocks.push( that.x( block, '/block/php_2' ) );
  39. return placeholder;
  40. } );
  41. if( blocks.length ) {
  42. var html = this.x( no_php_2, 'html' );
  43. var count = 0;
  44. return html.replace( new RegExp( placeholder, "g" ), function() {
  45. return blocks[ count++ ];
  46. } );
  47. }
  48. else {
  49. return this.x( all, '/php' );
  50. }
  51. }
  52. }
  53. }
  54. , block: {
  55. php_1: { // --- <? +++ ?> ---
  56. _match: /(<\?(?:php\b)?)([^?]*\?+(?:[^>][^?]*\?+)*>)/
  57. , _replace: function( all, open, content ) {
  58. return "<span class='start'>" + this.x( open ) + "</span>"
  59. + this.x( content.replace( /\?>$/, '' ), '/php' )
  60. + "<span class='end'>" + this.x( '?>' ) + "</span>";
  61. }
  62. , _style: {
  63. start: "color: red; font-weight: bold"
  64. , end: "color: red;"
  65. }
  66. }
  67. , php_2: { // +++ ?> --- <? +++
  68. _match: /([^?]*\?+(?:[^>][^?]*\?+)*>)|(<\?(?:php\b)?)([\w\W]*)/
  69. , _replace: function( all, content, open2, content2 ) {
  70. if( open2 ) {
  71. return "<span class='start'>" + this.x( open2 ) + "</span>"
  72. + this.x( content2, '/php' );
  73. }
  74. else {
  75. return this.x( content.replace( /\?>$/, '' ), '/php' )
  76. + "<span class='end'>" + this.x( '?>' ) + "</span>";
  77. }
  78. }
  79. , _style: {
  80. start: "color: red; font-weight: bold"
  81. , end: "color: red;"
  82. }
  83. }
  84. }
  85. , php: {
  86. mlcom: {
  87. _match: /\/\*[^*]*\*+([^\/][^*]*\*+)*\//
  88. , _style: "color: gray;"
  89. }
  90. , com: {
  91. _match: /(?:\/\/.*)|(?:[^\\]\#.*)/
  92. , _style: "color: green;"
  93. }
  94. , string1: {
  95. _match: /\'[^\'\\]*(?:\\.[^\'\\]*)*\'/
  96. , _style: "color: purple;"
  97. }
  98. , string2: {
  99. _match: /\"[^\"\\]*(?:\\.[^\"\\]*)*\"/
  100. , _style: "color: fuchsia;"
  101. }
  102. , value: {
  103. _match: /\b(?:[Nn][Uu][Ll][Ll]|[Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])\b/
  104. , _style: "color: gray; font-weight: bold;"
  105. }
  106. , number: {
  107. _match: /\b[+-]?(\d*\.?\d+|\d+\.?\d*)([eE][+-]?\d+)?\b/
  108. , _style: "color: red;"
  109. }
  110. , const1: {
  111. _match: /\b(?:DEFAULT_INCLUDE_PATH|E_(?:ALL|CO(?:MPILE_(?:ERROR|WARNING)|RE_(?:ERROR|WARNING))|ERROR|NOTICE|PARSE|STRICT|USER_(?:ERROR|NOTICE|WARNING)|WARNING)|P(?:EAR_(?:EXTENSION_DIR|INSTALL_DIR)|HP_(?:BINDIR|CONFIG_FILE_(?:PATH|SCAN_DIR)|DATADIR|E(?:OL|XTENSION_DIR)|INT_(?:MAX|SIZE)|L(?:IBDIR|OCALSTATEDIR)|O(?:S|UTPUT_HANDLER_(?:CONT|END|START))|PREFIX|S(?:API|HLIB_SUFFIX|YSCONFDIR)|VERSION))|__COMPILER_HALT_OFFSET__)\b/
  112. , _style: "color: red;"
  113. }
  114. , const2: {
  115. _match: /\b(?:A(?:B(?:DAY_(?:1|2|3|4|5|6|7)|MON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9))|LT_DIGITS|M_STR|SSERT_(?:ACTIVE|BAIL|CALLBACK|QUIET_EVAL|WARNING))|C(?:ASE_(?:LOWER|UPPER)|HAR_MAX|O(?:DESET|NNECTION_(?:ABORTED|NORMAL|TIMEOUT)|UNT_(?:NORMAL|RECURSIVE))|R(?:EDITS_(?:ALL|DOCS|FULLPAGE|G(?:ENERAL|ROUP)|MODULES|QA|SAPI)|NCYSTR|YPT_(?:BLOWFISH|EXT_DES|MD5|S(?:ALT_LENGTH|TD_DES)))|URRENCY_SYMBOL)|D(?:AY_(?:1|2|3|4|5|6|7)|ECIMAL_POINT|IRECTORY_SEPARATOR|_(?:FMT|T_FMT))|E(?:NT_(?:COMPAT|NOQUOTES|QUOTES)|RA(?:_(?:D_(?:FMT|T_FMT)|T_FMT|YEAR)|)|XTR_(?:IF_EXISTS|OVERWRITE|PREFIX_(?:ALL|I(?:F_EXISTS|NVALID)|SAME)|SKIP))|FRAC_DIGITS|GROUPING|HTML_(?:ENTITIES|SPECIALCHARS)|IN(?:FO_(?:ALL|C(?:ONFIGURATION|REDITS)|ENVIRONMENT|GENERAL|LICENSE|MODULES|VARIABLES)|I_(?:ALL|PERDIR|SYSTEM|USER)|T_(?:CURR_SYMBOL|FRAC_DIGITS))|L(?:C_(?:ALL|C(?:OLLATE|TYPE)|M(?:ESSAGES|ONETARY)|NUMERIC|TIME)|O(?:CK_(?:EX|NB|SH|UN)|G_(?:A(?:LERT|UTH(?:PRIV|))|C(?:ONS|R(?:IT|ON))|D(?:AEMON|EBUG)|E(?:MERG|RR)|INFO|KERN|L(?:OCAL(?:0|1|2|3|4|5|6|7)|PR)|MAIL|N(?:DELAY|EWS|O(?:TICE|WAIT))|ODELAY|P(?:ERROR|ID)|SYSLOG|U(?:SER|UCP)|WARNING)))|M(?:ON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9|DECIMAL_POINT|GROUPING|THOUSANDS_SEP)|_(?:1_PI|2_(?:PI|SQRTPI)|E|L(?:N(?:10|2)|OG(?:10E|2E))|PI(?:_(?:2|4)|)|SQRT(?:1_2|2)))|N(?:EGATIVE_SIGN|O(?:EXPR|STR)|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|P(?:ATH(?:INFO_(?:BASENAME|DIRNAME|EXTENSION)|_SEPARATOR)|M_STR|OSITIVE_SIGN|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|RADIXCHAR|S(?:EEK_(?:CUR|END|SET)|ORT_(?:ASC|DESC|NUMERIC|REGULAR|STRING)|TR_PAD_(?:BOTH|LEFT|RIGHT))|T(?:HOUS(?:ANDS_SEP|EP)|_FMT(?:_AMPM|))|YES(?:EXPR|STR))\b/
  116. , _style: "color: red;"
  117. }
  118. , global: {
  119. _match: /(?:\$GLOBALS|\$_COOKIE|\$_ENV|\$_FILES|\$_GET|\$_POST|\$_REQUEST|\$_SERVER|\$_SESSION|\$php_errormsg)\b/
  120. , _style: "color: red;"
  121. }
  122. , keyword: {
  123. _match: /\b(?:__CLASS__|__FILE__|__FUNCTION__|__LINE__|__METHOD__|abstract|and|array|as|break|case|catch|cfunction|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exception|exit|extends|extends|final|for|foreach|function|global|if|implements|include|include_once|interface|isset|list|new|old_function|or|php_user_filter|print|private|protected|public|require|require_once|return|static|switch|this|throw|try|unset|use|var|while|xor)\b/
  124. , _style: "color: navy; font-weight: bold;"
  125. }
  126. , variable: {
  127. _match: /\$(\w+)/
  128. , _replace: '<span class="keyword">$</span><span class="variable">$1</span>'
  129. , _style: "color: #4040c2;"
  130. }
  131. , heredoc: {
  132. _match: /(\<\<\<\s*)(\w+)((?:(?!\2).*\n)+)(\2)\b/
  133. , _replace: '<span class="keyword">$1</span><span class="string1">$2</span><span class="string2">$3</span><span class="string1">$4</span>'
  134. }
  135. }
  136. }