-
Notifications
You must be signed in to change notification settings - Fork 26
/
injector.js
79 lines (61 loc) · 2.24 KB
/
injector.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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
var startRegExp = /<!--\s*<\s*(\w+)\s*>\s*-->/gi;
var endRegExp = /<!--\s*<\/\s*(\w+)\s*>\s*-->/g;
function Injector(pageHtml, keepMarkers) {
this.keepMarkers = keepMarkers === true;
this.parts = [];
this.injectIndexes = {};
this.findSlots(pageHtml);
}
Injector.prototype = {
findSlots: function(pageHtml) {
var injectIndexes = this.injectIndexes,
parts = this.parts,
startMatches,
endMatch,
begin = 0;
startRegExp.lastIndex = 0;
while ((startMatches = startRegExp.exec(pageHtml))) {
var slotName = startMatches[1];
slotName = slotName.toLowerCase();
parts.push(pageHtml.substring(begin, startMatches.index));
injectIndexes[slotName] = parts.length;
parts.push('');
endRegExp.lastIndex = startRegExp.lastIndex;
endMatch = endRegExp.exec(pageHtml);
if (endMatch) {
begin = endRegExp.lastIndex;
startRegExp.lastIndex = endRegExp.lastIndex;
}
else {
begin = startRegExp.lastIndex;
}
}
if (begin < pageHtml.length) {
parts.push(pageHtml.substring(begin));
}
},
inject: function(slot, injectText) {
slot = slot.toLowerCase();
var injectIndex = this.injectIndexes[slot];
var finalMarkup = this.keepMarkers ? ('<!-- <' + slot + '> -->\n```\n' + injectText.replace(/\s\s*$/,'') + '\n```\n<!-- </' + slot + '> -->') : injectText;
if (injectIndex === undefined) {
this.parts.push(finalMarkup);
} else {
this.parts[injectIndex] = finalMarkup;
}
},
getMarkup: function() {
return this.parts.join('');
}
};
exports.inject = function(target, values, options) {
options = options || {};
var keepMarkers = options.keepMarkers !== false;
var injector = new Injector(target, keepMarkers);
for (var slotName in values) {
if (values.hasOwnProperty(slotName)) {
injector.inject(slotName, values[slotName]);
}
}
return injector.getMarkup();
};