UNPKG

@anireact/d

Version:

Dedent templates, autoindent interpolations, and more.

1 lines 7.33 kB
{"version":3,"file":"private.mjs","sourceRoot":"","sources":["../impl/private.mts"],"names":[],"mappings":"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","sourcesContent":["import { d } from './dedent.mjs';\n\n/**\n * Match the first non-whitespace and the rest of line.\n */\nconst PAT: RegExp = /\\S.*\\s*$/gm;\n\n/**\n * Getter for the `raw` property.\n */\nexport const getRaw = (s: TemplateStringsArray): readonly string[] => s.raw;\n\n/**\n * Template arguments tokenizer.\n *\n * @param s Literals array; must be non-empty.\n * @param q Quasis array; must be one item shorted than {@linkcode s}.\n * @returns Interleaved sequence of literal and quasi tokens, with literals\n * properly dedented and trimmed, and quasis with inferred autoindent\n * strings.\n */\nexport const scan = <t extends unknown>(s: readonly string[], q: t[]): d.Token<t>[] => {\n // ================================================================== //\n // Reduce the string: //\n // 1. Replace quasis with `!`. //\n // 2. In each line, drop everything after the first non-WS char. //\n // 3. Transform non-WS substrings to `!`. //\n // 4. Drop trailing WS. //\n // 5. Collapse blank lines. //\n // ================================================================== //\n\n /** Shape string. */\n let shape = s.join('!');\n\n // 1. Don’t process completely blank literals:\n if (shape.trim() === '') {\n return [\n {\n lit: true,\n value: shape,\n },\n ];\n }\n\n // 2. Use a single regexp to:\n // 1. In each line, replace the first non-WS and the rest\n // with the `!` char.\n // 2. In each line, trim trailing WS.\n // 3. Collapse blank lines.\n // 4. Trim trailing WS and blanks.\n shape = shape.replace(PAT, '!');\n\n /** Line vector. */ let lines = shape.split('\\n');\n /** Least padding. */ let shift = Infinity;\n\n // ======================== //\n // Detect the dedent width: //\n // ======================== //\n\n // 1. For each line except the first one:\n for (let line of lines.slice(1)) {\n // Get the minimum of:\n // a) The current least padding.\n // b) The current line padding.\n shift = Math.min(shift, line.length - 1);\n }\n\n // 2. Use zero padding for a single-line template:\n if (shift === Infinity) shift = 0;\n\n // ============================== //\n // Actually process the template: //\n // ============================== //\n\n // 1. Clear temporaries:\n shape = lines = null!;\n\n /** Output buffer. */ let v: d.Token<t>[] = [];\n\n /** Current literal index. */ let i = 0;\n /** Last literal index. */ let z = q.length;\n\n /** Quasi autoindent string. */ let pad = '';\n\n // 2. For each quasi (and preceding literal):\n for (let value of q) {\n // 1. Consume and push the preceding literal\n // and infer the padding for the current quasi:\n lit();\n\n // 2. Push the token with the value and inferred padding:\n v.push({\n lit: false,\n value,\n pad,\n });\n }\n\n // 3. Consume and push the final literal:\n lit();\n\n // 4. Return the result:\n return v;\n\n /**\n * Consume a literal chunk and push a corresponding token.\n *\n * @returns The chunk’s line vector.\n */\n function lit() {\n /** Current chunk’s line vector. */ let lv = s[i]!.split('\\n');\n /** Current chunk’s line count. */ let lc = lv.length;\n\n // 1. Dedent the tail lines of the chunk:\n for (let i = 1; i < lc; i++) {\n lv[i] = lv[i]!.slice(shift);\n }\n\n // 2. Drop the first line of the first chunk unless it’s\n // a) non-blank, OR\n // b) the only line of the chunk.\n if (i === 0 && lv[0]!.trim() === '' && lc > 1) {\n lv.shift();\n }\n\n // 3. Trim the very final newline of the final chunk:\n if (i === z && lv.at(-1)! === '') {\n lv.pop();\n }\n\n // 4. Push the token:\n v.push({\n lit: true,\n value: lv.join('\\n'),\n });\n\n // 5. Update the quasi padding:\n if (lc > 1) {\n pad = lv.at(-1)!.replace(PAT, '');\n }\n\n // 6. Increment the literal index:\n i++;\n }\n};\n"]}