rsuite-theme
Version:
The suite theme for pagurian
91 lines (83 loc) • 1.93 kB
JavaScript
;
const reNewLine = /(?:\r?\n|\r)/gm;
const getSyntax = require("./get-syntax");
function DocumentFixer (source) {
let match;
const lines = [];
reNewLine.lastIndex = 0;
while ((match = reNewLine.exec(source))) {
lines.push(match.index);
}
this.lines = lines;
}
DocumentFixer.prototype = {
block: function (style) {
return new LocalFixer(this.lines, style);
},
};
function LocalFixer (lines, style) {
let line = 0;
let column = style.startIndex;
lines.some((lineEndIndex, lineNumber) => {
if (lineEndIndex >= style.startIndex) {
line = lineNumber--;
if (lineNumber in lines) {
column = style.startIndex - lines[lineNumber] - 1;
}
return true;
}
});
this.line = line;
this.column = column;
this.style = style;
}
LocalFixer.prototype = {
object: function (object) {
if (object) {
if (object.line === 1) {
object.column += this.column;
}
object.line += this.line;
}
},
node: function (node) {
this.object(node.source.start);
this.object(node.source.end);
},
root: function (root) {
this.object(root.source.start);
root.walk(node => {
this.node(node);
});
},
error: function (error) {
if (error && error.name === "CssSyntaxError") {
this.object(error);
this.object(error.input);
error.message = error.message.replace(/:\d+:\d+:/, ":" + error.line + ":" + error.column + ":");
}
return error;
},
parse: function (opts) {
const style = this.style;
const syntax = getSyntax(opts, style.lang);
let root;
try {
root = syntax.parse(style.content, Object.assign({}, opts, {
map: false,
}));
} catch (error) {
throw this.error(error);
}
this.root(root);
Object.assign(root.source, {
isHTMLAttribute: !!style.isHTMLAttribute,
isMarkdown: !!style.isMarkdown,
isHTMLTag: !!style.isHTMLTag,
lang: style.lang || "css",
syntax,
});
return root;
},
};
module.exports = DocumentFixer;