@@ -16,8 +16,7 @@ Prism.languages.php = Prism.languages.extend('clike', {
16
16
'constant' : / \b [ A - Z 0 - 9 _ ] { 2 , } \b / ,
17
17
'comment' : {
18
18
pattern : / ( ^ | [ ^ \\ ] ) (?: \/ \* [ \s \S ] * ?\* \/ | \/ \/ .* ) / ,
19
- lookbehind : true ,
20
- greedy : true
19
+ lookbehind : true
21
20
}
22
21
} ) ;
23
22
@@ -32,7 +31,10 @@ Prism.languages.insertBefore('php', 'class-name', {
32
31
} ) ;
33
32
34
33
Prism . languages . insertBefore ( 'php' , 'keyword' , {
35
- 'delimiter' : / \? > | < \? (?: p h p ) ? / i,
34
+ 'delimiter' : {
35
+ pattern : / \? > | < \? (?: p h p | = ) ? / i,
36
+ alias : 'important'
37
+ } ,
36
38
'variable' : / \$ \w + \b / i,
37
39
'package' : {
38
40
pattern : / ( \\ | n a m e s p a c e \s + | u s e \s + ) [ \w \\ ] + / ,
@@ -51,61 +53,54 @@ Prism.languages.insertBefore('php', 'operator', {
51
53
}
52
54
} ) ;
53
55
54
- // Add HTML support of the markup language exists
56
+ // Add HTML support if the markup language exists
55
57
if ( Prism . languages . markup ) {
56
58
57
59
// Tokenize all inline PHP blocks that are wrapped in <?php ?>
58
60
// This allows for easy PHP + markup highlighting
59
61
Prism . hooks . add ( 'before-highlight' , function ( env ) {
60
- if ( env . language !== 'php' ) {
62
+ if ( env . language !== 'php' || ! / (?: < \? p h p | < \? ) / ig . test ( env . code ) ) {
61
63
return ;
62
64
}
63
65
64
66
env . tokenStack = [ ] ;
65
67
66
68
env . backupCode = env . code ;
67
- env . code = env . code . replace ( / (?: < \? p h p | < \? ) [ \s \S ] * ?(?: \? > ) / ig, function ( match ) {
69
+ env . code = env . code . replace ( / (?: < \? p h p | < \? ) [ \s \S ] * ?(?: \? > | $ ) / ig, function ( match ) {
68
70
env . tokenStack . push ( match ) ;
69
71
70
- return '{{{PHP ' + env . tokenStack . length + '}}} ' ;
72
+ return '___PHP ' + env . tokenStack . length + '___ ' ;
71
73
} ) ;
74
+
75
+ // Switch the grammar to markup
76
+ env . grammar = Prism . languages . markup ;
72
77
} ) ;
73
78
74
79
// Restore env.code for other plugins (e.g. line-numbers)
75
80
Prism . hooks . add ( 'before-insert' , function ( env ) {
76
- if ( env . language === 'php' ) {
81
+ if ( env . language === 'php' && env . backupCode ) {
77
82
env . code = env . backupCode ;
78
83
delete env . backupCode ;
79
84
}
80
85
} ) ;
81
86
82
87
// Re-insert the tokens after highlighting
83
88
Prism . hooks . add ( 'after-highlight' , function ( env ) {
84
- if ( env . language !== 'php' ) {
89
+ if ( env . language !== 'php' || ! env . tokenStack ) {
85
90
return ;
86
91
}
87
92
93
+ // Switch the grammar back
94
+ env . grammar = Prism . languages . php ;
95
+
88
96
for ( var i = 0 , t ; t = env . tokenStack [ i ] ; i ++ ) {
89
97
// The replace prevents $$, $&, $`, $', $n, $nn from being interpreted as special patterns
90
- env . highlightedCode = env . highlightedCode . replace ( '{{{PHP' + ( i + 1 ) + '}}}' , Prism . highlight ( t , env . grammar , 'php' ) . replace ( / \$ / g, '$$$$' ) ) ;
98
+ env . highlightedCode = env . highlightedCode . replace ( '___PHP' + ( i + 1 ) + '___' ,
99
+ "<span class=\"token php language-php\">" +
100
+ Prism . highlight ( t , env . grammar , 'php' ) . replace ( / \$ / g, '$$$$' ) +
101
+ "</span>" ) ;
91
102
}
92
103
93
104
env . element . innerHTML = env . highlightedCode ;
94
105
} ) ;
95
-
96
- // Wrap tokens in classes that are missing them
97
- Prism . hooks . add ( 'wrap' , function ( env ) {
98
- if ( env . language === 'php' && env . type === 'markup' ) {
99
- env . content = env . content . replace ( / ( \{ \{ \{ P H P \d + \} \} \} ) / g, "<span class=\"token php\">$1</span>" ) ;
100
- }
101
- } ) ;
102
-
103
- // Add the rules before all others
104
- Prism . languages . insertBefore ( 'php' , 'comment' , {
105
- 'markup' : {
106
- pattern : / < [ ^ ? ] \/ ? ( .* ?) > / ,
107
- inside : Prism . languages . markup
108
- } ,
109
- 'php' : / \{ \{ \{ P H P \d + \} \} \} /
110
- } ) ;
111
106
}
0 commit comments