Blame view

bower_components/prism/components/prism-php.js 3.32 KB
73bcce88   luigser   COMPONENTS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  /**
   * Original by Aaron Harun: http://aahacreative.com/2012/07/31/php-syntax-highlighting-prism/
   * Modified by Miles Johnson: http://milesj.me
   *
   * Supports the following:
   * 		- Extends clike syntax
   * 		- Support for PHP 5.3+ (namespaces, traits, generators, etc)
   * 		- Smarter constant and function matching
   *
   * Adds the following new token classes:
   * 		constant, delimiter, variable, function, package
   */
  
  Prism.languages.php = Prism.languages.extend('clike', {
  	'keyword': /\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/i,
  	'constant': /\b[A-Z0-9_]{2,}\b/,
  	'comment': {
eb240478   Luigi Serra   public room cards...
18
  		pattern: /(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/,
73bcce88   luigser   COMPONENTS
19
20
21
22
23
24
25
26
  		lookbehind: true
  	}
  });
  
  // Shell-like comments are matched after strings, because they are less
  // common than strings containing hashes...
  Prism.languages.insertBefore('php', 'class-name', {
  	'shell-comment': {
eb240478   Luigi Serra   public room cards...
27
  		pattern: /(^|[^\\])#.*/,
73bcce88   luigser   COMPONENTS
28
29
30
31
32
33
  		lookbehind: true,
  		alias: 'comment'
  	}
  });
  
  Prism.languages.insertBefore('php', 'keyword', {
eb240478   Luigi Serra   public room cards...
34
35
  	'delimiter': /\?>|<\?(?:php)?/i,
  	'variable': /\$\w+\b/i,
73bcce88   luigser   COMPONENTS
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  	'package': {
  		pattern: /(\\|namespace\s+|use\s+)[\w\\]+/,
  		lookbehind: true,
  		inside: {
  			punctuation: /\\/
  		}
  	}
  });
  
  // Must be defined after the function pattern
  Prism.languages.insertBefore('php', 'operator', {
  	'property': {
  		pattern: /(->)[\w]+/,
  		lookbehind: true
  	}
  });
  
  // Add HTML support of the markup language exists
  if (Prism.languages.markup) {
  
  	// Tokenize all inline PHP blocks that are wrapped in <?php ?>
  	// This allows for easy PHP + markup highlighting
  	Prism.hooks.add('before-highlight', function(env) {
  		if (env.language !== 'php') {
  			return;
  		}
  
  		env.tokenStack = [];
  
  		env.backupCode = env.code;
  		env.code = env.code.replace(/(?:<\?php|<\?)[\w\W]*?(?:\?>)/ig, function(match) {
  			env.tokenStack.push(match);
  
  			return '{{{PHP' + env.tokenStack.length + '}}}';
  		});
  	});
  
  	// Restore env.code for other plugins (e.g. line-numbers)
  	Prism.hooks.add('before-insert', function(env) {
  		if (env.language === 'php') {
  			env.code = env.backupCode;
  			delete env.backupCode;
  		}
  	});
  
  	// Re-insert the tokens after highlighting
  	Prism.hooks.add('after-highlight', function(env) {
  		if (env.language !== 'php') {
  			return;
  		}
  
  		for (var i = 0, t; t = env.tokenStack[i]; i++) {
eb240478   Luigi Serra   public room cards...
88
89
  			// The replace prevents $$, $&, $`, $', $n, $nn from being interpreted as special patterns
  			env.highlightedCode = env.highlightedCode.replace('{{{PHP' + (i + 1) + '}}}', Prism.highlight(t, env.grammar, 'php').replace(/\$/g, '$$$$'));
73bcce88   luigser   COMPONENTS
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
  		}
  
  		env.element.innerHTML = env.highlightedCode;
  	});
  
  	// Wrap tokens in classes that are missing them
  	Prism.hooks.add('wrap', function(env) {
  		if (env.language === 'php' && env.type === 'markup') {
  			env.content = env.content.replace(/(\{\{\{PHP[0-9]+\}\}\})/g, "<span class=\"token php\">$1</span>");
  		}
  	});
  
  	// Add the rules before all others
  	Prism.languages.insertBefore('php', 'comment', {
  		'markup': {
  			pattern: /<[^?]\/?(.*?)>/,
  			inside: Prism.languages.markup
  		},
  		'php': /\{\{\{PHP[0-9]+\}\}\}/
  	});
  }