UNPKG

unplugin-transform-we-class

Version:
96 lines (93 loc) 2.71 kB
// 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 };