UNPKG

2.81 kBJavaScriptView Raw
1var SlJsInfra = require('sl-js-infra').SlJsInfra;
2var ValidationUtils = SlJsInfra.Utils.ValidationUtils;
3var regex = /<script[\s\S]*?>[\s\S]*?<\/script>/gi;
4
5/*
6 This class used for handling markup files (i.e: html, ftl).
7 This class can find all script tags in file and return them as one piece of code or as array.
8*/
9
10function MarkupFileParser(fileContent, filename, logger) {
11 ValidationUtils.verifyNotNullOrEmpty(fileContent, "fileContent");
12 ValidationUtils.verifyNotNullOrEmpty(filename, "filename");
13 ValidationUtils.verifyNotNullOrEmpty(logger, "logger");
14 this.fileContent = fileContent;
15 this.filename = filename;
16 this.logger = logger;
17 this.scriptTags = [];
18 this.extractScriptTags = function () {
19 var tagsArray = this.fileContent.match(regex) || [];
20 if (tagsArray.length === 0) {
21 this.logger.info("no script tags found in '%s'", this.filename)
22 }
23 for (var i = 0; i < tagsArray.length; i++) {
24 var currentTag = tagsArray[i];
25 var jsCode = extractJsCodeFromTag(currentTag);
26 var linesToAdd = calculateLinesToAdd(jsCode);
27 this.scriptTags.push(new ScriptTag(jsCode, linesToAdd));
28 }
29 };
30
31 this.getPaddedTags = function () {
32 var paddedTags = [];
33 for (var i = 0; i < this.scriptTags.length; i++) {
34 var scriptTag = this.scriptTags[i];
35 paddedTags.push(scriptTag.padContent());
36 }
37 return paddedTags;
38 };
39 this.getAllJsInFile = function () {
40 var tags = this.scriptTags;
41 var allJsCode = "";
42 for (var i = 0; i < tags.length; i++) {
43 var currentTag = tags[i];
44 var linesSoFar = allJsCode.match(/\n/g) || [];
45 var linesToRemove = Array(linesSoFar.length).fill("\n").join("");
46 allJsCode += currentTag.padContent().replace(linesToRemove, "");
47 }
48 return allJsCode;
49 };
50
51 function calculateLinesToAdd(jsCode) {
52 var contentUntilTag = fileContent.substring(0, fileContent.indexOf(jsCode));
53 var count = contentUntilTag.match(/\n/g) || [];
54 return count.length
55 }
56
57 function extractJsCodeFromTag(tagAsString) {
58 var codeStartIndex = tagAsString.indexOf(">") + 1;
59 var codeEndIndex = tagAsString.lastIndexOf("<");
60 return tagAsString.substring(codeStartIndex, codeEndIndex);
61
62 }
63
64}
65
66
67function ScriptTag(content, offset) {
68 this.content = content;
69 this.offset = offset;
70 this.getPadding = function () {
71 var padding = "";
72 for (var i = 0; i < this.offset; i++) {
73 padding += '\n';
74 }
75 return padding;
76 };
77 this.padContent = function () {
78 return this.getPadding() + this.content;
79 };
80}
81
82module.exports = MarkupFileParser;
\No newline at end of file