diff --git a/src/block/node/IconNode.ts b/src/block/node/IconNode.ts index 2c219c73..865c281f 100644 --- a/src/block/node/IconNode.ts +++ b/src/block/node/IconNode.ts @@ -1,44 +1,25 @@ -import { createPlainNode } from "./PlainNode.ts"; import { createNodeParser } from "./creator.ts"; - import type { NodeCreator } from "./creator.ts"; -import type { IconNode, PlainNode, StrongIconNode } from "./type.ts"; +import type { IconNode } from "./type.ts"; const iconRegExp = /\[[^[\]]*\.icon(?:\*[1-9]\d*)?\]/; -export function generateIconNodeCreator( - type: IconNode["type"], -): NodeCreator; -export function generateIconNodeCreator( - type: StrongIconNode["type"], -): NodeCreator; -export function generateIconNodeCreator( - type: (IconNode | StrongIconNode)["type"], -): NodeCreator { - return (raw, opts) => { - if (type === "strongIcon" && opts.context === "table") { - return createPlainNode(raw, opts); - } - - const target = - type === "icon" - ? raw.substring(1, raw.length - 1) - : raw.substring(2, raw.length - 2); - const index = target.lastIndexOf(".icon"); - const path = target.substring(0, index); - const pathType = path.startsWith("/") ? "root" : "relative"; - const numStr = target.substring(index + 5, target.length); - const num = numStr.startsWith("*") - ? Number.parseInt(numStr.substring(1), 10) - : 1; - return new Array(num).fill({}).map(() => ({ path, pathType, type, raw })); - }; -} - -const createIconNode = generateIconNodeCreator("icon"); +const createIconNode: NodeCreator = (raw) => { + const target = raw.substring(1, raw.length - 1); + const index = target.lastIndexOf(".icon"); + const path = target.substring(0, index); + const pathType = path.startsWith("/") ? "root" : "relative"; + const numStr = target.substring(index + 5, target.length); + const num = numStr.startsWith("*") + ? Number.parseInt(numStr.substring(1), 10) + : 1; + return new Array(num) + .fill({}) + .map(() => ({ path, pathType, type: "icon", raw })); +}; export const IconNodeParser = createNodeParser(createIconNode, { - parseOnNested: true, - parseOnQuoted: true, - patterns: [iconRegExp], + parseOnNested: true, + parseOnQuoted: true, + patterns: [iconRegExp], }); diff --git a/src/block/node/StrongIconNode.ts b/src/block/node/StrongIconNode.ts index 7864cf31..cedec5de 100644 --- a/src/block/node/StrongIconNode.ts +++ b/src/block/node/StrongIconNode.ts @@ -1,12 +1,30 @@ -import { generateIconNodeCreator } from "./IconNode.ts"; -import { createNodeParser } from "./creator.ts"; +import { createNodeParser, type NodeCreator } from "./creator.ts"; +import { createPlainNode } from "./PlainNode.ts"; +import type { PlainNode, StrongIconNode } from "./type.ts"; const strongIconRegExp = /\[\[[^[\]]*\.icon(?:\*\d+)?\]\]/; -const createStrongIconNode = generateIconNodeCreator("strongIcon"); +const createStrongIconNode: NodeCreator = ( + raw, + opts +) => { + if (opts.context === "table") return createPlainNode(raw, opts); + + const target = raw.substring(2, raw.length - 2); + const index = target.lastIndexOf(".icon"); + const path = target.substring(0, index); + const pathType = path.startsWith("/") ? "root" : "relative"; + const numStr = target.substring(index + 5, target.length); + const num = numStr.startsWith("*") + ? Number.parseInt(numStr.substring(1), 10) + : 1; + return new Array(num) + .fill({}) + .map(() => ({ path, pathType, type: "strongIcon", raw })); +}; export const StrongIconNodeParser = createNodeParser(createStrongIconNode, { - parseOnNested: false, - parseOnQuoted: true, - patterns: [strongIconRegExp], + parseOnNested: false, + parseOnQuoted: true, + patterns: [strongIconRegExp], });