1- Prism . languages [ 'markup-templating' ] = { } ;
2-
3- Object . defineProperties ( Prism . languages [ 'markup-templating' ] , {
4- buildPlaceholders : {
5- // Tokenize all inline templating expressions matching placeholderPattern
6- // If the replaceFilter function is provided, it will be called with every match.
7- // If it returns false, the match will not be replaced.
8- value : function ( env , language , placeholderPattern , replaceFilter ) {
9- if ( env . language !== language ) {
10- return ;
11- }
1+ ( function ( Prism ) {
122
13- env . tokenStack = [ ] ;
3+ /**
4+ * Returns the placeholder for the given language id and index.
5+ *
6+ * @param {string } language
7+ * @param {string|number } index
8+ * @returns {string }
9+ */
10+ function getPlaceholder ( language , index ) {
11+ return '___' + language . toUpperCase ( ) + index + '___' ;
12+ }
1413
15- env . code = env . code . replace ( placeholderPattern , function ( match ) {
16- if ( typeof replaceFilter === 'function' && ! replaceFilter ( match ) ) {
17- return match ;
14+ Object . defineProperties ( Prism . languages [ 'markup-templating' ] = { } , {
15+ buildPlaceholders : {
16+ /**
17+ * Tokenize all inline templating expressions matching `placeholderPattern`.
18+ *
19+ * If `replaceFilter` is provided, only matches of `placeholderPattern` for which `replaceFilter` returns
20+ * `true` will be replaced.
21+ *
22+ * @param {object } env The environment of the `before-tokenize` hook.
23+ * @param {string } language The language id.
24+ * @param {RegExp } placeholderPattern The matches of this pattern will be replaced by placeholders.
25+ * @param {(match: string) => boolean } [replaceFilter]
26+ */
27+ value : function ( env , language , placeholderPattern , replaceFilter ) {
28+ if ( env . language !== language ) {
29+ return ;
1830 }
19- var i = env . tokenStack . length ;
20- // Check for existing strings
21- while ( env . code . indexOf ( '___' + language . toUpperCase ( ) + i + '___' ) !== - 1 )
22- ++ i ;
2331
24- // Create a sparse array
25- env . tokenStack [ i ] = match ;
32+ var tokenStack = env . tokenStack = [ ] ;
2633
27- return '___' + language . toUpperCase ( ) + i + '___' ;
28- } ) ;
34+ env . code = env . code . replace ( placeholderPattern , function ( match ) {
35+ if ( typeof replaceFilter === 'function' && ! replaceFilter ( match ) ) {
36+ return match ;
37+ }
38+ var i = tokenStack . length ;
39+ var placeholder ;
2940
30- // Switch the grammar to markup
31- env . grammar = Prism . languages . markup ;
32- }
33- } ,
34- tokenizePlaceholders : {
35- // Replace placeholders with proper tokens after tokenizing
36- value : function ( env , language ) {
37- if ( env . language !== language || ! env . tokenStack ) {
38- return ;
39- }
41+ // Check for existing strings
42+ while ( env . code . indexOf ( placeholder = getPlaceholder ( language , i ) ) !== - 1 )
43+ ++ i ;
4044
41- // Switch the grammar back
42- env . grammar = Prism . languages [ language ] ;
45+ // Create a sparse array
46+ tokenStack [ i ] = match ;
4347
44- var j = 0 ;
45- var keys = Object . keys ( env . tokenStack ) ;
46- var walkTokens = function ( tokens ) {
47- if ( j >= keys . length ) {
48+ return placeholder ;
49+ } ) ;
50+
51+ // Switch the grammar to markup
52+ env . grammar = Prism . languages . markup ;
53+ }
54+ } ,
55+ tokenizePlaceholders : {
56+ /**
57+ * Replace placeholders with proper tokens after tokenizing.
58+ *
59+ * @param {object } env The environment of the `after-tokenize` hook.
60+ * @param {string } language The language id.
61+ */
62+ value : function ( env , language ) {
63+ if ( env . language !== language || ! env . tokenStack ) {
4864 return ;
4965 }
50- for ( var i = 0 ; i < tokens . length ; i ++ ) {
51- var token = tokens [ i ] ;
52- if ( typeof token === 'string' || ( token . content && typeof token . content === 'string' ) ) {
53- var k = keys [ j ] ;
54- var t = env . tokenStack [ k ] ;
55- var s = typeof token === 'string' ? token : token . content ;
56-
57- var index = s . indexOf ( '___' + language . toUpperCase ( ) + k + '___' ) ;
58- if ( index > - 1 ) {
59- ++ j ;
60- var before = s . substring ( 0 , index ) ;
61- var middle = new Prism . Token ( language , Prism . tokenize ( t , env . grammar , language ) , 'language-' + language , t ) ;
62- var after = s . substring ( index + ( '___' + language . toUpperCase ( ) + k + '___' ) . length ) ;
63- var replacement ;
64- if ( before || after ) {
65- replacement = [ before , middle , after ] . filter ( function ( v ) { return ! ! v ; } ) ;
66- walkTokens ( replacement ) ;
67- } else {
68- replacement = middle ;
69- }
70- if ( typeof token === 'string' ) {
71- Array . prototype . splice . apply ( tokens , [ i , 1 ] . concat ( replacement ) ) ;
72- } else {
73- token . content = replacement ;
74- }
7566
76- if ( j >= keys . length ) {
77- break ;
67+ // Switch the grammar back
68+ env . grammar = Prism . languages [ language ] ;
69+
70+ var j = 0 ;
71+ var keys = Object . keys ( env . tokenStack ) ;
72+
73+ function walkTokens ( tokens ) {
74+ for ( var i = 0 ; i < tokens . length ; i ++ ) {
75+ // all placeholders are replaced already
76+ if ( j >= keys . length ) {
77+ break ;
78+ }
79+
80+ var token = tokens [ i ] ;
81+ if ( typeof token === 'string' || ( token . content && typeof token . content === 'string' ) ) {
82+ var k = keys [ j ] ;
83+ var t = env . tokenStack [ k ] ;
84+ var s = typeof token === 'string' ? token : token . content ;
85+ var placeholder = getPlaceholder ( language , k ) ;
86+
87+ var index = s . indexOf ( placeholder ) ;
88+ if ( index > - 1 ) {
89+ ++ j ;
90+
91+ var before = s . substring ( 0 , index ) ;
92+ var middle = new Prism . Token ( language , Prism . tokenize ( t , env . grammar ) , 'language-' + language , t ) ;
93+ var after = s . substring ( index + placeholder . length ) ;
94+
95+ var replacement = [ ] ;
96+ if ( before ) {
97+ replacement . push . apply ( replacement , walkTokens ( [ before ] ) ) ;
98+ }
99+ replacement . push ( middle ) ;
100+ if ( after ) {
101+ replacement . push . apply ( replacement , walkTokens ( [ after ] ) ) ;
102+ }
103+
104+ if ( typeof token === 'string' ) {
105+ tokens . splice . apply ( tokens , [ i , 1 ] . concat ( replacement ) ) ;
106+ } else {
107+ token . content = replacement ;
108+ }
78109 }
110+ } else if ( token . content /* && typeof token.content !== 'string' */ ) {
111+ walkTokens ( token . content ) ;
79112 }
80- } else if ( token . content && typeof token . content !== 'string' ) {
81- walkTokens ( token . content ) ;
82113 }
114+
115+ return tokens ;
83116 }
84- } ;
85117
86- walkTokens ( env . tokens ) ;
118+ walkTokens ( env . tokens ) ;
119+ }
87120 }
88- }
89- } ) ;
121+ } ) ;
122+
123+ } ( Prism ) ) ;
0 commit comments