@monimesl/dot-dml-parser 0.1.0-alpha.16 → 0.1.0-alpha.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -20,7 +20,7 @@ export declare function isElementNode(node: DmlNode): node is DmlElementNode;
20
20
  interface ParseDmlOptions {
21
21
  file?: string;
22
22
  locations?: boolean;
23
- whitespace?: 'trim' | 'collapse' | 'preserve';
23
+ whitespace?: 'trim' | 'collapse' | 'inline' | 'preserve';
24
24
  }
25
25
  /** Parses .dml markup into an IR tree, leaving `{{ }}` bindings as raw strings. */
26
26
  declare function parseDmlToIR(dmlString: string, options?: ParseDmlOptions): DmlNode[];
package/dist/index.js CHANGED
@@ -120,9 +120,14 @@ function normalizeText(raw, mode) {
120
120
  switch (mode) {
121
121
  case "preserve": return raw.trim().length === 0 ? "" : raw;
122
122
  case "collapse": return raw.replace(/\s+/g, " ").trim();
123
+ case "inline": return inlineText(raw);
123
124
  case "trim": return raw.trim();
124
125
  }
125
126
  }
127
+ function inlineText(raw) {
128
+ if (raw.trim() === "") return raw.includes("\n") ? "" : " ";
129
+ return raw.replace(/^\s*\n\s*/, "").replace(/\s*\n\s*$/, "").replace(/\s+/g, " ");
130
+ }
126
131
  //#endregion
127
132
  //#region src/ast.ts
128
133
  function isElementNode(node) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/errors.ts","../src/parse.ts","../src/ast.ts"],"sourcesContent":["import { SourceError } from '@monimesl/dot-core';\n\nexport class DmlParseError extends SourceError {\n override readonly name = 'DmlParseError';\n}\n","import { Parser } from 'htmlparser2';\nimport { createLocator, isEventProp } from '@monimesl/dot-core';\n\nimport { DmlParseError } from './errors';\nimport type { DmlElementNode, DmlNode } from './ast';\n\nexport interface ParseDmlOptions {\n file?: string;\n locations?: boolean;\n whitespace?: 'trim' | 'collapse' | 'preserve';\n}\n\nconst CLOSE_TAG = /<\\/([^\\s>]+)\\s*>/g;\nconst OPAQUE_REGION = /<!--[\\s\\S]*?-->|<!\\[CDATA\\[[\\s\\S]*?]]>/g;\n\ninterface OpenTag {\n node: DmlElementNode;\n start: number;\n}\n\n/** Parses .dml markup into an IR tree, leaving `{{ }}` bindings as raw strings. */\nfunction parseDmlToIR(dmlString: string, options: ParseDmlOptions = {}): DmlNode[] {\n const { file, locations = false, whitespace = 'trim' } = options;\n const roots: DmlNode[] = [];\n const stack: OpenTag[] = [];\n let textBuffer = '';\n let textStart = -1;\n const closedAt = new Set<number>();\n const locate = createLocator(dmlString);\n const errorAt = (message: string, offset: number) => {\n return new DmlParseError(message, file, locate(offset));\n };\n const currentChildren = (): DmlNode[] => {\n return stack.at(-1)?.node.children ?? roots;\n };\n const flushText = (): void => {\n if (textStart < 0) {\n return;\n }\n const content = normalizeText(textBuffer, whitespace);\n if (content.length > 0) {\n let node: DmlNode;\n if (locations) {\n const leading =\n whitespace === 'preserve' ? 0 : textBuffer.length - textBuffer.trimStart().length;\n node = { type: 'Text', content, loc: locate(textStart + leading) };\n } else {\n node = { type: 'Text', content };\n }\n currentChildren().push(node);\n }\n textBuffer = '';\n textStart = -1;\n };\n // A tag whose name has been read but not its closing `>`.\n let unfinishedTag: { name: string; start: number } | undefined;\n const parser = new Parser(\n {\n onopentagname(name) {\n unfinishedTag = { name, start: parser.startIndex };\n },\n onopentag(name, attribs) {\n unfinishedTag = undefined;\n flushText();\n const events: Record<string, string> = {};\n const attributes: Record<string, string> = {};\n for (const [attributeName, value] of Object.entries(attribs)) {\n if (isEventProp(attributeName)) {\n events[attributeName] = value;\n } else {\n attributes[attributeName] = value;\n }\n }\n const node: DmlElementNode = locations\n ? {\n type: 'Element',\n tag: name,\n attributes,\n events,\n children: [],\n loc: locate(parser.startIndex),\n }\n : { type: 'Element', tag: name, attributes, events, children: [] };\n currentChildren().push(node);\n stack.push({ node, start: parser.startIndex });\n },\n onclosetag(name, isImplied) {\n flushText();\n if (unfinishedTag) {\n throw errorAt(\n `<${unfinishedTag.name}> isn't finished: add \\`>\\` or \\`/>\\``,\n unfinishedTag.start,\n );\n }\n // htmlparser2 only reports closing tags it has seen open.\n const tag = stack.pop()!;\n const selfClosing = parser.startIndex === tag.start;\n if (isImplied && !selfClosing) {\n const found =\n parser.startIndex >= dmlString.length\n ? 'end of input'\n : `\\`${dmlString.slice(parser.startIndex, parser.endIndex + 1)}\\``;\n throw errorAt(\n `<${tag.node.tag}> isn't closed: expected </${tag.node.tag}>, found ${found}`,\n tag.start,\n );\n }\n if (name !== tag.node.tag) {\n throw errorAt(\n `</${name}> doesn't match <${tag.node.tag}>: expected </${tag.node.tag}>`,\n parser.startIndex,\n );\n }\n if (!selfClosing) {\n closedAt.add(parser.startIndex);\n }\n },\n ontext(data) {\n // htmlparser2 splits text around entities; buffer until the next tag.\n if (textStart < 0) {\n textStart = parser.startIndex;\n }\n textBuffer += data;\n },\n oncomment() {\n flushText();\n },\n onprocessinginstruction() {\n flushText();\n },\n onerror(error) {\n throw errorAt(error.message, parser.startIndex);\n },\n },\n {\n xmlMode: true,\n decodeEntities: true,\n recognizeCDATA: true,\n },\n );\n\n parser.write(dmlString);\n parser.end();\n flushText();\n\n // htmlparser2 ignores unmatched closing tags instead of throwing, so we catch them here.\n // Comments and CDATA are blanked with spaces, not removed, so offsets still match the source.\n const stripped = dmlString.replace(OPAQUE_REGION, (region) => ' '.repeat(region.length));\n for (const closeTag of stripped.matchAll(CLOSE_TAG)) {\n if (!closedAt.has(closeTag.index)) {\n throw errorAt(`</${closeTag[1]!}> has no matching opening tag`, closeTag.index);\n }\n }\n return roots;\n}\n\nexport default parseDmlToIR;\n\nfunction normalizeText(raw: string, mode: NonNullable<ParseDmlOptions['whitespace']>): string {\n switch (mode) {\n case 'preserve':\n return raw.trim().length === 0 ? '' : raw;\n case 'collapse':\n return raw.replace(/\\s+/g, ' ').trim();\n case 'trim':\n return raw.trim();\n }\n}\n","import type { SourceLocation } from '@monimesl/dot-core';\n\nexport interface DmlElementNode {\n readonly type: 'Element';\n readonly tag: string;\n readonly events: Record<string, string>;\n readonly attributes: Record<string, string>;\n readonly children: DmlNode[];\n readonly loc?: SourceLocation;\n}\n\nexport interface DmlTextNode {\n readonly type: 'Text';\n readonly content: string;\n readonly loc?: SourceLocation;\n}\n\nexport type DmlNode = DmlElementNode | DmlTextNode;\n\nexport function isElementNode(node: DmlNode): node is DmlElementNode {\n return node.type === 'Element';\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/errors.ts","../src/parse.ts","../src/ast.ts"],"sourcesContent":["import { SourceError } from '@monimesl/dot-core';\n\nexport class DmlParseError extends SourceError {\n override readonly name = 'DmlParseError';\n}\n","import { Parser } from 'htmlparser2';\nimport { createLocator, isEventProp } from '@monimesl/dot-core';\n\nimport { DmlParseError } from './errors';\nimport type { DmlElementNode, DmlNode } from './ast';\n\nexport interface ParseDmlOptions {\n file?: string;\n locations?: boolean;\n whitespace?: 'trim' | 'collapse' | 'inline' | 'preserve';\n}\n\nconst CLOSE_TAG = /<\\/([^\\s>]+)\\s*>/g;\nconst OPAQUE_REGION = /<!--[\\s\\S]*?-->|<!\\[CDATA\\[[\\s\\S]*?]]>/g;\n\ninterface OpenTag {\n node: DmlElementNode;\n start: number;\n}\n\n/** Parses .dml markup into an IR tree, leaving `{{ }}` bindings as raw strings. */\nfunction parseDmlToIR(dmlString: string, options: ParseDmlOptions = {}): DmlNode[] {\n const { file, locations = false, whitespace = 'trim' } = options;\n const roots: DmlNode[] = [];\n const stack: OpenTag[] = [];\n let textBuffer = '';\n let textStart = -1;\n const closedAt = new Set<number>();\n const locate = createLocator(dmlString);\n const errorAt = (message: string, offset: number) => {\n return new DmlParseError(message, file, locate(offset));\n };\n const currentChildren = (): DmlNode[] => {\n return stack.at(-1)?.node.children ?? roots;\n };\n const flushText = (): void => {\n if (textStart < 0) {\n return;\n }\n const content = normalizeText(textBuffer, whitespace);\n if (content.length > 0) {\n let node: DmlNode;\n if (locations) {\n const leading =\n whitespace === 'preserve' ? 0 : textBuffer.length - textBuffer.trimStart().length;\n node = { type: 'Text', content, loc: locate(textStart + leading) };\n } else {\n node = { type: 'Text', content };\n }\n currentChildren().push(node);\n }\n textBuffer = '';\n textStart = -1;\n };\n // A tag whose name has been read but not its closing `>`.\n let unfinishedTag: { name: string; start: number } | undefined;\n const parser = new Parser(\n {\n onopentagname(name) {\n unfinishedTag = { name, start: parser.startIndex };\n },\n onopentag(name, attribs) {\n unfinishedTag = undefined;\n flushText();\n const events: Record<string, string> = {};\n const attributes: Record<string, string> = {};\n for (const [attributeName, value] of Object.entries(attribs)) {\n if (isEventProp(attributeName)) {\n events[attributeName] = value;\n } else {\n attributes[attributeName] = value;\n }\n }\n const node: DmlElementNode = locations\n ? {\n type: 'Element',\n tag: name,\n attributes,\n events,\n children: [],\n loc: locate(parser.startIndex),\n }\n : { type: 'Element', tag: name, attributes, events, children: [] };\n currentChildren().push(node);\n stack.push({ node, start: parser.startIndex });\n },\n onclosetag(name, isImplied) {\n flushText();\n if (unfinishedTag) {\n throw errorAt(\n `<${unfinishedTag.name}> isn't finished: add \\`>\\` or \\`/>\\``,\n unfinishedTag.start,\n );\n }\n // htmlparser2 only reports closing tags it has seen open.\n const tag = stack.pop()!;\n const selfClosing = parser.startIndex === tag.start;\n if (isImplied && !selfClosing) {\n const found =\n parser.startIndex >= dmlString.length\n ? 'end of input'\n : `\\`${dmlString.slice(parser.startIndex, parser.endIndex + 1)}\\``;\n throw errorAt(\n `<${tag.node.tag}> isn't closed: expected </${tag.node.tag}>, found ${found}`,\n tag.start,\n );\n }\n if (name !== tag.node.tag) {\n throw errorAt(\n `</${name}> doesn't match <${tag.node.tag}>: expected </${tag.node.tag}>`,\n parser.startIndex,\n );\n }\n if (!selfClosing) {\n closedAt.add(parser.startIndex);\n }\n },\n ontext(data) {\n // htmlparser2 splits text around entities; buffer until the next tag.\n if (textStart < 0) {\n textStart = parser.startIndex;\n }\n textBuffer += data;\n },\n oncomment() {\n flushText();\n },\n onprocessinginstruction() {\n flushText();\n },\n onerror(error) {\n throw errorAt(error.message, parser.startIndex);\n },\n },\n {\n xmlMode: true,\n decodeEntities: true,\n recognizeCDATA: true,\n },\n );\n\n parser.write(dmlString);\n parser.end();\n flushText();\n\n // htmlparser2 ignores unmatched closing tags instead of throwing, so we catch them here.\n // Comments and CDATA are blanked with spaces, not removed, so offsets still match the source.\n const stripped = dmlString.replace(OPAQUE_REGION, (region) => ' '.repeat(region.length));\n for (const closeTag of stripped.matchAll(CLOSE_TAG)) {\n if (!closedAt.has(closeTag.index)) {\n throw errorAt(`</${closeTag[1]!}> has no matching opening tag`, closeTag.index);\n }\n }\n return roots;\n}\n\nexport default parseDmlToIR;\n\nfunction normalizeText(raw: string, mode: NonNullable<ParseDmlOptions['whitespace']>): string {\n switch (mode) {\n case 'preserve':\n return raw.trim().length === 0 ? '' : raw;\n case 'collapse':\n return raw.replace(/\\s+/g, ' ').trim();\n case 'inline':\n return inlineText(raw);\n case 'trim':\n return raw.trim();\n }\n}\n\n// As text flows around inline elements: whitespace with a line break in it only lays out the markup,\n// so it goes, but a space on the same line as an element stays, as in `paid <Text>SLE 50</Text> today`.\nfunction inlineText(raw: string): string {\n if (raw.trim() === '') {\n return raw.includes('\\n') ? '' : ' ';\n }\n return raw\n .replace(/^\\s*\\n\\s*/, '')\n .replace(/\\s*\\n\\s*$/, '')\n .replace(/\\s+/g, ' ');\n}\n","import type { SourceLocation } from '@monimesl/dot-core';\n\nexport interface DmlElementNode {\n readonly type: 'Element';\n readonly tag: string;\n readonly events: Record<string, string>;\n readonly attributes: Record<string, string>;\n readonly children: DmlNode[];\n readonly loc?: SourceLocation;\n}\n\nexport interface DmlTextNode {\n readonly type: 'Text';\n readonly content: string;\n readonly loc?: SourceLocation;\n}\n\nexport type DmlNode = DmlElementNode | DmlTextNode;\n\nexport function isElementNode(node: DmlNode): node is DmlElementNode {\n return node.type === 'Element';\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@monimesl/dot-dml-parser",
3
- "version": "0.1.0-alpha.16",
3
+ "version": "0.1.0-alpha.19",
4
4
  "description": "Dot .dml template parser: markup -> intermediary representation",
5
5
  "type": "module",
6
6
  "repository": {
@@ -32,7 +32,7 @@
32
32
  },
33
33
  "dependencies": {
34
34
  "htmlparser2": "^12.0.0",
35
- "@monimesl/dot-core": "0.1.0-alpha.16"
35
+ "@monimesl/dot-core": "0.1.0-alpha.19"
36
36
  },
37
37
  "publishConfig": {
38
38
  "access": "public"