Skip to content

Commit b62e282

Browse files
Markup-templating improvements (#1653)
This makes minor improvements to markup-templating.
1 parent 6c9fe25 commit b62e282

File tree

2 files changed

+107
-73
lines changed

2 files changed

+107
-73
lines changed
Lines changed: 106 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,123 @@
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));

components/prism-markup-templating.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)