unplugin-transform-we-class
Version:
96 lines (93 loc) • 2.71 kB
JavaScript
// src/core/index.ts
import { trim } from "@meoc/utils";
function getClass(code) {
const matchs = [];
Array.from(code.matchAll(/\s:?class="((?:\n|.)*?)"/g)).forEach((m) => {
const classStr = m[1];
const sourceStr = trim(m[0]);
let classArr = [sourceStr];
if (sourceStr.startsWith(":")) {
if (classStr.startsWith("{"))
classArr = classArr.concat(getObjClass(classStr));
else if (classStr.startsWith("["))
classArr = classArr.concat(getArrClass(classStr));
} else {
classArr.push(classStr);
}
matchs.push(classArr);
});
Array.from(code.matchAll(/className=["']((?:\n|.)+?)["']/g)).forEach((m) => {
matchs.push([m[0], m[1]]);
});
return matchs;
}
function getObjClass(className) {
return Array.from(className.matchAll(/'([^,]+?)'\s*:/g)).map((v) => v[1]);
}
function getArrClass(className) {
return Array.from(className.matchAll(/(?<=[\?\:])\s*'(.*?)'/g)).map((v) => v[1]);
}
function transformCode(code, rules = defaultRules) {
const classNames = getClass(code);
classNames.forEach((c) => {
let currentClass = c[0];
c.slice(1).forEach((selector) => {
currentClass = currentClass.replace(selector, transformSelector(selector, rules));
});
code = code.replace(c[0], currentClass);
});
return code;
}
// src/utils.ts
var defaultRules = {
".": "-d-",
"/": "-s-",
":": "-c-",
"%": "-p-",
"!": "-e-",
"#": "-w-",
"(": "-bl-",
")": "-br-",
"[": "-fl-",
"]": "-fr-",
"$": "-r-",
",": "-co-"
};
var transformRegExp = /[,\.\/:%!#\(\)\[\]$]/;
var escapePrefix = "\\";
function escapeRegExp(str) {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function transformSelector(selector, rules = defaultRules) {
if (transformRegExp.test(selector)) {
for (const transformRule in rules) {
const replaceReg = new RegExp(`${escapePrefix}${transformRule}`, "g");
selector = selector.replace(replaceReg, rules[transformRule]);
}
}
return selector;
}
function transformEscapESelector(selector, rules = defaultRules) {
if (transformRegExp.test(selector)) {
for (const transformRule in rules) {
const replaceReg = new RegExp(escapeRegExp(`${escapePrefix}${transformRule}`), "g");
selector = selector.replace(replaceReg, rules[transformRule]);
}
}
return selector;
}
function restoreSelector(selector, rules = defaultRules) {
for (const transformRule in rules) {
const replaceReg = new RegExp(rules[transformRule], "g");
selector = selector.replace(replaceReg, transformRule);
}
return selector;
}
export {
defaultRules,
escapeRegExp,
transformSelector,
transformEscapESelector,
restoreSelector,
transformCode
};