pangu
Version:
Paranoid text spacing for good readability, to automatically insert whitespace between CJK (Chinese, Japanese, Korean) and half-width characters (alphabetical letters, numerical digits and symbols).
373 lines (372 loc) • 18.5 kB
JavaScript
//#region \0rolldown/runtime.js
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __esmMin = (fn, res, err) => () => {
if (err) throw err[0];
try {
return fn && (res = fn(fn = 0)), res;
} catch (e) {
throw err = [e], e;
}
};
var __exportAll = (all, no_symbols) => {
let target = {};
for (var name in all) __defProp(target, name, {
get: all[name],
enumerable: true
});
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
return target;
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
key = keys[i];
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: ((k) => from[k]).bind(null, key),
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
//#endregion
let node_fs = require("node:fs");
let node_fs_promises = require("node:fs/promises");
//#region src/shared/index.ts
var CJK_RADICALS_SUPPLEMENT, KANGXI_RADICALS, HIRAGANA, KATAKANA_NO_MIDDLE_DOT, BOPOMOFO, ENCLOSED_CJK_LETTERS_AND_MONTHS, CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A, CJK_UNIFIED_IDEOGRAPHS, CJK_COMPATIBILITY_IDEOGRAPHS, GREEK_AND_COPTIC, LATIN_1_SUPPLEMENT_AFTER_NBSP, NUMBER_FORMS, DINGBATS, CJK, AN, A, UPPER_AN, OPERATORS_BASE, OPERATORS_WITH_HYPHEN, OPERATORS_NO_PLUS, GRADE_OPERATORS, QUOTES, LEFT_BRACKETS_BASIC, RIGHT_BRACKETS_BASIC, LEFT_BRACKETS_EXTENDED, RIGHT_BRACKETS_EXTENDED, ANS_CJK_AFTER, ANS_BEFORE_CJK, FILE_PATH_DIRS, FILE_PATH_CHARS, UNIX_ABSOLUTE_FILE_PATH, UNIX_RELATIVE_FILE_PATH, WINDOWS_FILE_PATH, ANY_CJK, CJK_PUNCTUATION, PUNCTUATION_CJK, CJK_TILDE, CJK_TILDE_EQUALS, CJK_PERIOD, AN_PERIOD_CJK, AN_COLON_CJK, DOTS_CJK, FIX_CJK_COLON_ANS, CJK_QUOTE, QUOTE_CJK, FIX_QUOTE_ANY_QUOTE, QUOTE_AN, CJK_QUOTE_AN, CJK_SINGLE_QUOTE_BUT_POSSESSIVE, SINGLE_QUOTE_CJK, FIX_POSSESSIVE_SINGLE_QUOTE, SINGLE_QUOTE_PURE_CJK, HASH_ANS_CJK_HASH, CJK_HASH, HASH_CJK, CJK_FINAL_HASHTAG, CJK_OPERATOR_ANS, ANS_OPERATOR_CJK, CJK_SLASH_CJK, CJK_SLASH_ANS, ANS_SLASH_CJK, PIPE_CJK_CONTACT, PIPE_SEPARATOR, PLUS_CJK_CONTACT, PLUS_SEPARATOR, SINGLE_LETTER_GRADE_CJK, CJK_SIGN_DIGIT, CJK_HYPHEN_FLAG, AN_PLUS_CJK, CJK_LESS_THAN, LESS_THAN_CJK, CJK_GREATER_THAN, GREATER_THAN_CJK, CJK_LEFT_BRACKET, RIGHT_BRACKET_CJK, ANS_CJK_LEFT_BRACKET_ANY_RIGHT_BRACKET, LEFT_BRACKET_ANY_RIGHT_BRACKET_ANS_CJK, ANS_CJK_RIGHT_QUOTE_ANY_RIGHT_QUOTE, AN_LEFT_BRACKET, RIGHT_BRACKET_AN, CJK_UNIX_ABSOLUTE_FILE_PATH, CJK_UNIX_RELATIVE_FILE_PATH, CJK_WINDOWS_PATH, UNIX_ABSOLUTE_FILE_PATH_SLASH_CJK, UNIX_RELATIVE_FILE_PATH_SLASH_CJK, CJK_ANS, ANS_CJK, S_A, MIDDLE_DOT, VOID_HTML_TAGS, BARE_HTML_TAG, CLOSING_HTML_TAG, CJK_HTML_TAG_MENTION, HTML_TAG_MENTION_CJK, BRACKET_PATTERNS, PlaceholderReplacer, Pangu;
var init_shared = __esmMin((() => {
CJK_RADICALS_SUPPLEMENT = "⺀-";
KANGXI_RADICALS = "⼀-";
HIRAGANA = "-ゟ";
KATAKANA_NO_MIDDLE_DOT = "゠-ヺー-ヿ";
BOPOMOFO = "-ㄯ";
ENCLOSED_CJK_LETTERS_AND_MONTHS = "㈀-㋿";
CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A = "㐀-䶿";
CJK_UNIFIED_IDEOGRAPHS = "一-鿿";
CJK_COMPATIBILITY_IDEOGRAPHS = "豈-";
GREEK_AND_COPTIC = "Ͱ-Ͽ";
LATIN_1_SUPPLEMENT_AFTER_NBSP = "¡-ÿ";
NUMBER_FORMS = "⅐-";
DINGBATS = "✀-➿";
CJK = `${CJK_RADICALS_SUPPLEMENT}${KANGXI_RADICALS}${HIRAGANA}${KATAKANA_NO_MIDDLE_DOT}${BOPOMOFO}${ENCLOSED_CJK_LETTERS_AND_MONTHS}${CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A}${CJK_UNIFIED_IDEOGRAPHS}${CJK_COMPATIBILITY_IDEOGRAPHS}`;
AN = "A-Za-z0-9";
A = "A-Za-z";
UPPER_AN = "A-Z0-9";
OPERATORS_BASE = "\\+\\*=&";
OPERATORS_WITH_HYPHEN = `${OPERATORS_BASE}\\-`;
OPERATORS_NO_PLUS = "\\*=&\\-";
GRADE_OPERATORS = "\\+\\-\\*";
QUOTES = "`\"״";
LEFT_BRACKETS_BASIC = "\\(\\[\\{";
RIGHT_BRACKETS_BASIC = "\\)\\]\\}";
LEFT_BRACKETS_EXTENDED = "\\(\\[\\{<>“";
RIGHT_BRACKETS_EXTENDED = "\\)\\]\\}<>”";
ANS_CJK_AFTER = `${A}${GREEK_AND_COPTIC}0-9@\\$%\\^&\\*\\-\\+\\\\=${LATIN_1_SUPPLEMENT_AFTER_NBSP}${NUMBER_FORMS}${DINGBATS}`;
ANS_BEFORE_CJK = `${A}${GREEK_AND_COPTIC}0-9\\$%\\^&\\*\\-\\+\\\\=${LATIN_1_SUPPLEMENT_AFTER_NBSP}${NUMBER_FORMS}${DINGBATS}`;
FILE_PATH_DIRS = "home|root|usr|etc|var|opt|tmp|dev|mnt|proc|sys|bin|boot|lib|media|run|sbin|srv|node_modules|path|project|src|dist|test|tests|docs|templates|assets|public|static|config|scripts|tools|build|out|target|your|\\.claude|\\.git|\\.vscode";
FILE_PATH_CHARS = "[A-Za-z0-9_\\-\\.@\\+\\*]+";
UNIX_ABSOLUTE_FILE_PATH = new RegExp(`/(?:\\.?(?:${FILE_PATH_DIRS})|\\.(?:[A-Za-z0-9_\\-]+))(?:/${FILE_PATH_CHARS})*`);
UNIX_RELATIVE_FILE_PATH = new RegExp(`(?:\\./)?(?:${FILE_PATH_DIRS})(?:/${FILE_PATH_CHARS})+`);
WINDOWS_FILE_PATH = /[A-Z]:\\(?:[A-Za-z0-9_\-\. ]+\\?)+/;
ANY_CJK = new RegExp(`[${CJK}]`);
CJK_PUNCTUATION = new RegExp(`([${CJK}])([!;,\\?:]+)(?=[${CJK}${AN}])`, "g");
PUNCTUATION_CJK = new RegExp(`([!;,\\?]+)(?=[${CJK}])`, "g");
CJK_TILDE = new RegExp(`([${CJK}])(~+)(?!=)(?=[${CJK}${AN}])`, "g");
CJK_TILDE_EQUALS = new RegExp(`([${CJK}])(~=)`, "g");
CJK_PERIOD = new RegExp(`([${CJK}])(\\.)(?![${AN}\\./])(?=[${CJK}${AN}])`, "g");
AN_PERIOD_CJK = new RegExp(`([${AN}])(\\.)([${CJK}])`, "g");
AN_COLON_CJK = new RegExp(`([${AN}])(:)([${CJK}])`, "g");
DOTS_CJK = new RegExp(`([\\.]{2,}|\u2026)([${CJK}])`, "g");
FIX_CJK_COLON_ANS = new RegExp(`([${CJK}])\\:([${UPPER_AN}\\(\\)])`, "g");
CJK_QUOTE = new RegExp(`([${CJK}])([${QUOTES}])`, "g");
QUOTE_CJK = new RegExp(`([${QUOTES}])([${CJK}])`, "g");
FIX_QUOTE_ANY_QUOTE = new RegExp(`([${QUOTES}]+)[ ]*([\\s\\S]+?)[ ]*([${QUOTES}]+)`, "g");
QUOTE_AN = new RegExp(`([\u201d])([${AN}])`, "g");
CJK_QUOTE_AN = new RegExp(`([${CJK}])(")([${AN}])`, "g");
CJK_SINGLE_QUOTE_BUT_POSSESSIVE = new RegExp(`([${CJK}])('[^s])`, "g");
SINGLE_QUOTE_CJK = new RegExp(`(')([${CJK}])`, "g");
FIX_POSSESSIVE_SINGLE_QUOTE = new RegExp(`([${AN}${CJK}])( )('s)`, "g");
SINGLE_QUOTE_PURE_CJK = new RegExp(`(')([${CJK}]+)(')`, "g");
HASH_ANS_CJK_HASH = new RegExp(`([${CJK}])(#)([${CJK}]+)(#)([${CJK}])`, "g");
CJK_HASH = new RegExp(`([${CJK}])(#([^ \\u00a0]))`, "g");
HASH_CJK = new RegExp(`(([^ \\u00a0])#)([${CJK}])`, "g");
CJK_FINAL_HASHTAG = new RegExp(`([^/])([${CJK}])(#[A-Za-z0-9]+)$`);
CJK_OPERATOR_ANS = new RegExp(`([${CJK}])([${OPERATORS_WITH_HYPHEN}])([${AN}])`, "g");
ANS_OPERATOR_CJK = new RegExp(`([${AN}])([${OPERATORS_NO_PLUS}])([${CJK}])`, "g");
CJK_SLASH_CJK = new RegExp(`([${CJK}])([/])([${CJK}])`, "g");
CJK_SLASH_ANS = new RegExp(`([${CJK}])([/])([${AN}])`, "g");
ANS_SLASH_CJK = new RegExp(`([${AN}])([/])([${CJK}])`, "g");
PIPE_CJK_CONTACT = new RegExp(`[${CJK}]\\||\\|[${CJK}]`);
PIPE_SEPARATOR = /([^\s|])[ ]*(\|+)[ ]*(?=[^\s|])/g;
PLUS_CJK_CONTACT = new RegExp(`[${CJK}]\\+|\\+[${CJK}]`);
PLUS_SEPARATOR = /(?<=[^\s+])\+(?=[^\s+])/g;
SINGLE_LETTER_GRADE_CJK = new RegExp(`\\b([${A}])([${GRADE_OPERATORS}])([${CJK}])`, "g");
CJK_SIGN_DIGIT = new RegExp(`([${CJK}])([\\+\\-])([0-9])`, "g");
CJK_HYPHEN_FLAG = new RegExp(`([${CJK}])(\\-)([a-z])\\b`, "g");
AN_PLUS_CJK = new RegExp(`([${AN}])(\\+)([${CJK}])`, "g");
CJK_LESS_THAN = new RegExp(`([${CJK}])(<)([${AN}])`, "g");
LESS_THAN_CJK = new RegExp(`([${AN}])(<)([${CJK}])`, "g");
CJK_GREATER_THAN = new RegExp(`([${CJK}])(>)([${AN}])`, "g");
GREATER_THAN_CJK = new RegExp(`([${AN}])(>)([${CJK}])`, "g");
CJK_LEFT_BRACKET = new RegExp(`([${CJK}])([${LEFT_BRACKETS_EXTENDED}])`, "g");
RIGHT_BRACKET_CJK = new RegExp(`([${RIGHT_BRACKETS_EXTENDED}])([${CJK}])`, "g");
ANS_CJK_LEFT_BRACKET_ANY_RIGHT_BRACKET = new RegExp(`([${AN}${CJK}])[ ]*([\u201c])([${AN}${CJK}\\-_ ]+)([\u201d])`, "g");
LEFT_BRACKET_ANY_RIGHT_BRACKET_ANS_CJK = new RegExp(`([\u201c])([${AN}${CJK}\\-_ ]+)([\u201d])[ ]*([${AN}${CJK}])`, "g");
ANS_CJK_RIGHT_QUOTE_ANY_RIGHT_QUOTE = new RegExp(`([${AN}${CJK}])[ ]*(?<![\u201c][^\u201c\u201d\n]*)([\u201d])[ ]*([${AN}${CJK}\\-_ ]+?)[ ]*([\u201d])`, "g");
AN_LEFT_BRACKET = new RegExp(`([${AN}])(?<!\\.[${AN}]*)([${LEFT_BRACKETS_BASIC}])`, "g");
RIGHT_BRACKET_AN = new RegExp(`([${RIGHT_BRACKETS_BASIC}])([${AN}])`, "g");
CJK_UNIX_ABSOLUTE_FILE_PATH = new RegExp(`([${CJK}])(${UNIX_ABSOLUTE_FILE_PATH.source})`, "g");
CJK_UNIX_RELATIVE_FILE_PATH = new RegExp(`([${CJK}])(${UNIX_RELATIVE_FILE_PATH.source})`, "g");
CJK_WINDOWS_PATH = new RegExp(`([${CJK}])(${WINDOWS_FILE_PATH.source})`, "g");
UNIX_ABSOLUTE_FILE_PATH_SLASH_CJK = new RegExp(`(${UNIX_ABSOLUTE_FILE_PATH.source}/)([${CJK}])`, "g");
UNIX_RELATIVE_FILE_PATH_SLASH_CJK = new RegExp(`(${UNIX_RELATIVE_FILE_PATH.source}/)([${CJK}])`, "g");
CJK_ANS = new RegExp(`([${CJK}])([${ANS_CJK_AFTER}])`, "g");
ANS_CJK = new RegExp(`([${ANS_BEFORE_CJK}])([${CJK}])`, "g");
S_A = new RegExp(`(%)([${A}])`, "g");
MIDDLE_DOT = /([ ]*)([\u00b7\u2022\u2027])([ ]*)/g;
VOID_HTML_TAGS = /* @__PURE__ */ new Set([
"area",
"base",
"br",
"col",
"embed",
"hr",
"img",
"input",
"link",
"meta",
"param",
"source",
"track",
"wbr"
]);
BARE_HTML_TAG = /^<([a-zA-Z][a-zA-Z0-9]*)\s*\/?>$/;
CLOSING_HTML_TAG = /<\/([a-zA-Z][a-zA-Z0-9]*)/g;
CJK_HTML_TAG_MENTION = new RegExp(`([${CJK}])(?=\uE002)`, "g");
HTML_TAG_MENTION_CJK = new RegExp(`(?<=\uE003)([${CJK}])`, "g");
BRACKET_PATTERNS = [
{
pattern: /<([^<>]*)>/g,
open: "<",
close: ">"
},
{
pattern: /\(([^()]*)\)/g,
open: "(",
close: ")"
},
{
pattern: /\[([^\[\]]*)\]/g,
open: "[",
close: "]"
},
{
pattern: /\{([^{}]*)\}/g,
open: "{",
close: "}"
}
];
PlaceholderReplacer = class PlaceholderReplacer {
placeholder;
startDelimiter;
endDelimiter;
static patternCache = /* @__PURE__ */ new Map();
items = [];
index = 0;
pattern;
constructor(placeholder, startDelimiter, endDelimiter) {
this.placeholder = placeholder;
this.startDelimiter = startDelimiter;
this.endDelimiter = endDelimiter;
const cacheKey = `${startDelimiter}${placeholder}${endDelimiter}`;
let pattern = PlaceholderReplacer.patternCache.get(cacheKey);
if (!pattern) {
const escapedStart = this.startDelimiter.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
const escapedEnd = this.endDelimiter.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
pattern = new RegExp(`${escapedStart}${this.placeholder}(\\d+)${escapedEnd}`, "g");
PlaceholderReplacer.patternCache.set(cacheKey, pattern);
}
this.pattern = pattern;
}
store(item) {
this.items[this.index] = item;
return `${this.startDelimiter}${this.placeholder}${this.index++}${this.endDelimiter}`;
}
restore(text) {
if (this.index === 0) return text;
return text.replace(this.pattern, (_match, index) => {
return this.items[parseInt(index, 10)] || "";
});
}
};
Pangu = class {
version;
constructor() {
this.version = "9.1.0";
}
spacingText(text) {
if (typeof text !== "string") {
console.warn(`spacingText(text) only accepts string but got ${typeof text}`);
return text;
}
if (text.length <= 1 || !ANY_CJK.test(text)) return text;
let newText = text;
const backtickManager = new PlaceholderReplacer("BACKTICK_CONTENT_", "", "");
newText = newText.replace(/`([^`]+)`/g, (_match, content) => {
return `\`${backtickManager.store(content)}\``;
});
const htmlTagManager = new PlaceholderReplacer("HTML_TAG_PLACEHOLDER_", "", "");
const mentionedTagManager = new PlaceholderReplacer("HTML_TAG_MENTION_", "", "");
let hasHtmlTags = false;
if (newText.includes("<")) {
hasHtmlTags = true;
const HTML_TAG_PATTERN = /<\/?[a-zA-Z][a-zA-Z0-9]*(?:\s+[^>]*)?>/g;
const closedTagNames = /* @__PURE__ */ new Set();
for (const closingTag of newText.matchAll(CLOSING_HTML_TAG)) closedTagNames.add(closingTag[1].toLowerCase());
newText = newText.replace(HTML_TAG_PATTERN, (match) => {
const bareTag = match.match(BARE_HTML_TAG);
if (bareTag) {
const tagName = bareTag[1].toLowerCase();
if (!VOID_HTML_TAGS.has(tagName) && !closedTagNames.has(tagName)) return mentionedTagManager.store(match);
}
const processedTag = match.replace(/(\w+)="([^"]*)"/g, (_attrMatch, attrName, attrValue) => {
return `${attrName}="${this.spacingText(attrValue)}"`;
});
return htmlTagManager.store(processedTag);
});
}
newText = newText.replace(DOTS_CJK, "$1 $2");
newText = newText.replace(CJK_PUNCTUATION, "$1$2 ");
newText = newText.replace(PUNCTUATION_CJK, "$1 ");
newText = newText.replace(CJK_TILDE, "$1$2 ");
newText = newText.replace(CJK_TILDE_EQUALS, "$1 $2 ");
newText = newText.replace(CJK_PERIOD, "$1$2 ");
newText = newText.replace(AN_PERIOD_CJK, "$1$2 $3");
newText = newText.replace(AN_COLON_CJK, "$1$2 $3");
newText = newText.replace(FIX_CJK_COLON_ANS, "$1:$2");
newText = newText.replace(CJK_QUOTE, "$1 $2");
newText = newText.replace(QUOTE_CJK, "$1 $2");
newText = newText.replace(FIX_QUOTE_ANY_QUOTE, "$1$2$3");
newText = newText.replace(QUOTE_AN, "$1 $2");
newText = newText.replace(CJK_QUOTE_AN, "$1$2 $3");
newText = newText.replace(FIX_POSSESSIVE_SINGLE_QUOTE, "$1's");
const singleQuoteCJKManager = new PlaceholderReplacer("SINGLE_QUOTE_CJK_PLACEHOLDER_", "", "");
newText = newText.replace(SINGLE_QUOTE_PURE_CJK, (match) => {
return singleQuoteCJKManager.store(match);
});
newText = newText.replace(CJK_SINGLE_QUOTE_BUT_POSSESSIVE, "$1 $2");
newText = newText.replace(SINGLE_QUOTE_CJK, "$1 $2");
newText = singleQuoteCJKManager.restore(newText);
if (newText.length >= 5) newText = newText.replace(HASH_ANS_CJK_HASH, "$1 $2$3$4 $5");
newText = newText.split("\n").map((line) => {
if ((line.match(/\//g) || []).length <= 1) {
line = line.replace(CJK_HASH, "$1 $2");
line = line.replace(HASH_CJK, "$1 $3");
} else line = line.replace(CJK_FINAL_HASHTAG, "$1$2 $3");
return line;
}).join("\n");
const compoundWordManager = new PlaceholderReplacer("COMPOUND_WORD_PLACEHOLDER_", "", "");
newText = newText.replace(/\b(?:[A-Za-z0-9]*[a-z][A-Za-z0-9]*-[A-Za-z0-9]+|[A-Za-z0-9]+-[A-Za-z0-9]*[a-z][A-Za-z0-9]*|[A-Za-z]+-[0-9]+|[A-Za-z]+[0-9]+-[A-Za-z0-9]+)(?:-[A-Za-z0-9]+)*\b/g, (match) => {
return compoundWordManager.store(match);
});
newText = newText.replace(SINGLE_LETTER_GRADE_CJK, "$1$2 $3");
newText = newText.replace(CJK_SIGN_DIGIT, "$1 $2$3");
newText = newText.replace(CJK_HYPHEN_FLAG, "$1 $2$3");
newText = newText.replace(AN_PLUS_CJK, "$1$2 $3");
newText = newText.replace(CJK_OPERATOR_ANS, "$1 $2 $3");
newText = newText.replace(ANS_OPERATOR_CJK, "$1 $2 $3");
newText = newText.replace(CJK_LESS_THAN, "$1 $2 $3");
newText = newText.replace(LESS_THAN_CJK, "$1 $2 $3");
newText = newText.replace(CJK_GREATER_THAN, "$1 $2 $3");
newText = newText.replace(GREATER_THAN_CJK, "$1 $2 $3");
newText = newText.replace(CJK_UNIX_ABSOLUTE_FILE_PATH, "$1 $2");
newText = newText.replace(CJK_UNIX_RELATIVE_FILE_PATH, "$1 $2");
newText = newText.replace(CJK_WINDOWS_PATH, "$1 $2");
newText = newText.replace(UNIX_ABSOLUTE_FILE_PATH_SLASH_CJK, "$1 $2");
newText = newText.replace(UNIX_RELATIVE_FILE_PATH_SLASH_CJK, "$1 $2");
newText = newText.split("\n").map((line) => {
if ((line.match(/\//g) || []).length !== 1) return line;
line = line.replace(CJK_SLASH_CJK, "$1 $2 $3");
line = line.replace(CJK_SLASH_ANS, "$1 $2 $3");
line = line.replace(ANS_SLASH_CJK, "$1 $2 $3");
return line;
}).join("\n");
newText = newText.split("\n").map((line) => {
if (!PIPE_CJK_CONTACT.test(line)) return line;
return line.replace(PIPE_SEPARATOR, "$1 $2 ");
}).join("\n");
newText = newText.split("\n").map((line) => {
if (!PLUS_CJK_CONTACT.test(line)) return line;
return line.replace(PLUS_SEPARATOR, " + ");
}).join("\n");
newText = newText.replace(FIX_QUOTE_ANY_QUOTE, "$1$2$3");
newText = compoundWordManager.restore(newText);
newText = newText.replace(CJK_LEFT_BRACKET, "$1 $2");
newText = newText.replace(RIGHT_BRACKET_CJK, "$1 $2");
newText = newText.replace(ANS_CJK_LEFT_BRACKET_ANY_RIGHT_BRACKET, "$1 $2$3$4");
newText = newText.replace(LEFT_BRACKET_ANY_RIGHT_BRACKET_ANS_CJK, "$1$2$3 $4");
newText = newText.replace(ANS_CJK_RIGHT_QUOTE_ANY_RIGHT_QUOTE, "$1 $2$3$4");
newText = newText.replace(AN_LEFT_BRACKET, "$1 $2");
newText = newText.replace(RIGHT_BRACKET_AN, "$1 $2");
newText = newText.replace(CJK_ANS, "$1 $2");
newText = newText.replace(ANS_CJK, "$1 $2");
newText = newText.replace(S_A, "$1 $2");
newText = newText.replace(MIDDLE_DOT, "・");
newText = this.fixBracketSpacing(newText);
if (hasHtmlTags) {
newText = newText.replace(CJK_HTML_TAG_MENTION, "$1 ");
newText = newText.replace(HTML_TAG_MENTION_CJK, " $1");
newText = mentionedTagManager.restore(newText);
newText = htmlTagManager.restore(newText);
}
newText = backtickManager.restore(newText);
return newText;
}
hasProperSpacing(text) {
return this.spacingText(text) === text;
}
fixBracketSpacing(text) {
for (const { pattern, open, close } of BRACKET_PATTERNS) text = text.replace(pattern, (_match, innerContent) => {
if (!innerContent) return `${open}${close}`;
const trimmedContent = innerContent.replace(/^ +| +$/g, "");
return `${open}${trimmedContent}${close}`;
});
return text;
}
};
new Pangu();
}));
//#endregion
//#region src/node/index.ts
var node_exports = /* @__PURE__ */ __exportAll({
NodePangu: () => NodePangu,
default: () => pangu$1,
pangu: () => pangu$1
});
var NodePangu, pangu$1;
//#endregion
//#region src/node/index.cts
var index = (__esmMin((() => {
init_shared();
NodePangu = class extends Pangu {
async spacingFile(path) {
const data = await (0, node_fs_promises.readFile)(path, "utf8");
return this.spacingText(data);
}
spacingFileSync(path) {
return this.spacingText((0, node_fs.readFileSync)(path, "utf8"));
}
};
pangu$1 = new NodePangu();
}))(), __toCommonJS(node_exports));
var PanguModule = class extends index.NodePangu {
NodePangu = index.NodePangu;
pangu = this;
default = this;
};
var pangu = new PanguModule();
module.exports = pangu;
//#endregion
//# sourceMappingURL=index.cjs.map