rsuite-theme
Version:
The suite theme for pagurian
89 lines (78 loc) • 2.01 kB
JavaScript
;
const Input = require("postcss/lib/input");
const Root = require("postcss/lib/root");
const htmlParser = require("./html-parser");
const mdParser = require("./markdown-parser");
const BlockFixer = require("./block-fixer");
function parser (source, opts) {
// Skip known style sheet files.
if (opts.from && /\.(?:(?:p(?:ost)?)?css|(?:wx|le|sa|sc|s)ss|styl(?:us)?)(?:\?.+)?$/i.test(opts.from)) {
return;
}
source = source && source.toString();
const styleTag = htmlParser(source, opts);
const stylesMd = mdParser(source, opts);
if (!styleTag && !stylesMd) {
return;
}
const document = new Root();
const documentLocalFixer = new BlockFixer(source);
let index = 0;
[].concat(styleTag).concat(stylesMd).filter(Boolean).sort(function (a, b) {
return a.startIndex - b.startIndex;
}).forEach(style => {
const localFixer = documentLocalFixer.block(style);
const root = localFixer.parse(opts);
root.raws.beforeStart = source.slice(index, style.startIndex);
index = style.startIndex + style.content.length;
document.nodes.push(root);
});
document.raws.afterEnd = source.slice(index);
document.source = {
input: new Input(source, opts),
start: {
line: 1,
column: 1,
},
};
document.each = function (callback) {
let wasBreak, lastResult;
this.nodes.forEach(node => {
const result = node.each(callback);
if (result === false) {
wasBreak = true;
} else {
lastResult = result;
}
});
if (wasBreak) {
return false;
} else {
return lastResult;
}
};
document.append = function () {
this.last.append.apply(
this.last,
Array.from(arguments)
);
return this;
};
document.prepend = function () {
this.first.prepend.apply(
this.first,
Array.from(arguments)
);
return this;
};
document.insertBefore = function (exist, add) {
exist.prepend(add);
return this;
};
document.insertAfter = function (exist, add) {
exist.append(add);
return this;
};
return document;
}
module.exports = parser;