webpack-preprocessor-loader
Version:
A code preprocessor for Webpack
70 lines (69 loc) • 2.68 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.print = exports.COMMENT_TAG_PLACEHOLDER = void 0;
const filter_1 = require("./filter");
const parser_1 = require("./parser");
const reader_1 = require("./reader");
exports.COMMENT_TAG_PLACEHOLDER = "@@";
/**
* The main entrance to dealt with code processing.
*
* @param code raw text input
* @param directives the collection of user-defined directives
* @param params the collection of user-defined params
* @param verbose should output omitted lines
* @returns the processed code
*/
function print(code, directives, params, verbose) {
let result = "";
let lastCommentOpen = "";
let lastCommentClose = "";
let filter = new filter_1.PlainTextFilter();
for (const block of (0, reader_1.reader)(code)) {
const blockInfo = (0, parser_1.parse)(block);
const { preserve, filter: nextFilter } = filter.next(blockInfo, directives, params);
filter = nextFilter;
const { raw, isComment, isDirective } = blockInfo;
let segment = "";
if (preserve) {
segment = raw;
}
else if (verbose) {
const { c_open, c_close } = block;
if (isDirective) {
lastCommentOpen = c_open || lastCommentOpen;
lastCommentClose = c_close || lastCommentClose;
segment = raw;
}
else if (isComment) {
const escapeComments = !!verbose.escapeComments;
if (escapeComments) {
const comment = raw
.replace(c_open, exports.COMMENT_TAG_PLACEHOLDER)
.replace(c_close, exports.COMMENT_TAG_PLACEHOLDER);
segment = transformComment(comment, (line) => verbosePrint(lastCommentOpen, lastCommentClose, line));
}
else {
const padding = Array.from({ length: lastCommentOpen.length + 1 })
.fill(" ")
.join("");
segment = transformComment(raw, (line) => padding + line + "\n");
}
}
else {
segment = verbosePrint(lastCommentOpen, lastCommentClose, raw);
}
}
result += segment;
}
return result;
}
exports.print = print;
function transformComment(comment, lineTransformer) {
// Comment may contain multiple lines
const lines = comment.trimRight().split("\n");
return lines.map(lineTransformer).join("");
}
function verbosePrint(open, close, content) {
return `${open} ${content.trimRight()}${close.trim()}\n`;
}