abstract-sheet 0.0.30 → 1.0.0
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/CHANGELOG.md +4 -0
- package/lib/abstract-sheet-xml/abstract-sheet-xml.d.ts +1 -1
- package/lib/abstract-sheet-xml/abstract-sheet-xml.d.ts.map +1 -1
- package/lib/abstract-sheet-xml/abstract-sheet-xml.js +2 -2
- package/lib/abstract-sheet-xml/abstract-sheet-xml.js.map +1 -1
- package/lib/abstract-sheet-xml/handlebars-xml/index.d.ts +3 -0
- package/lib/abstract-sheet-xml/handlebars-xml/index.d.ts.map +1 -0
- package/lib/abstract-sheet-xml/handlebars-xml/index.js +3 -0
- package/lib/abstract-sheet-xml/handlebars-xml/index.js.map +1 -0
- package/lib/abstract-sheet-xml/handlebars-xml/parse-handlebars-xml.d.ts +15 -0
- package/lib/abstract-sheet-xml/handlebars-xml/parse-handlebars-xml.d.ts.map +1 -0
- package/lib/abstract-sheet-xml/handlebars-xml/parse-handlebars-xml.js +117 -0
- package/lib/abstract-sheet-xml/handlebars-xml/parse-handlebars-xml.js.map +1 -0
- package/lib/abstract-sheet-xml/handlebars-xml/validate-handlebars-xml.d.ts +21 -0
- package/lib/abstract-sheet-xml/handlebars-xml/validate-handlebars-xml.d.ts.map +1 -0
- package/lib/abstract-sheet-xml/handlebars-xml/validate-handlebars-xml.js +191 -0
- package/lib/abstract-sheet-xml/handlebars-xml/validate-handlebars-xml.js.map +1 -0
- package/lib/abstract-sheet-xml/index.d.ts +1 -1
- package/lib/abstract-sheet-xml/index.d.ts.map +1 -1
- package/lib/abstract-sheet-xml/index.js +1 -1
- package/lib/abstract-sheet-xml/index.js.map +1 -1
- package/package.json +3 -4
- package/src/abstract-sheet-xml/abstract-sheet-xml.ts +2 -2
- package/src/abstract-sheet-xml/handlebars-xml/index.ts +2 -0
- package/src/abstract-sheet-xml/{mustache-xml/parse-mustache-xml.ts → handlebars-xml/parse-handlebars-xml.ts} +9 -4
- package/src/abstract-sheet-xml/{mustache-xml/validate-mustache-xml.ts → handlebars-xml/validate-handlebars-xml.ts} +4 -4
- package/src/abstract-sheet-xml/index.ts +1 -1
- package/src/abstract-sheet-xml/mustache-xml/index.ts +0 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/).
|
|
4
4
|
|
|
5
|
+
## [1.0.0] - 2025-04-29
|
|
6
|
+
|
|
7
|
+
- Replaced Mustache with Handlebars
|
|
8
|
+
|
|
5
9
|
## v0.1.0 - 2024-11-22
|
|
6
10
|
|
|
7
11
|
- Start of changelog.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AbstractSheet } from "../abstract-sheet/abstract-sheet.js";
|
|
2
|
-
import { XmlElement } from "./
|
|
2
|
+
import { XmlElement } from "./handlebars-xml/index.js";
|
|
3
3
|
export declare const abstractSheetXml: (template: string, data: any, partials: Record<string, string>) => AbstractSheet;
|
|
4
4
|
export declare function abstractSheetOfXml(el: XmlElement): unknown;
|
|
5
5
|
export declare const parsedXsd: readonly XmlElement[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-sheet-xml.d.ts","sourceRoot":"","sources":["../../src/abstract-sheet-xml/abstract-sheet-xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAWL,aAAa,EACd,MAAM,qCAAqC,CAAC;AAE7C,OAAO,
|
|
1
|
+
{"version":3,"file":"abstract-sheet-xml.d.ts","sourceRoot":"","sources":["../../src/abstract-sheet-xml/abstract-sheet-xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAWL,aAAa,EACd,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAgC,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAErF,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,EAAE,MAAM,GAAG,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,aACV,CAAC;AAExF,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAmH1D;AAED,eAAO,MAAM,SAAS,uBAAgB,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { borderStyleRecord, } from "../abstract-sheet/abstract-sheet.js";
|
|
2
2
|
import { xsd } from "../abstract-sheet/abstract-sheet-xsd.js";
|
|
3
|
-
import {
|
|
4
|
-
export const abstractSheetXml = (template, data, partials) => abstractSheetOfXml(
|
|
3
|
+
import { parseHandlebarsXml, parseXsd } from "./handlebars-xml/index.js";
|
|
4
|
+
export const abstractSheetXml = (template, data, partials) => abstractSheetOfXml(parseHandlebarsXml(template, data, partials)[0]);
|
|
5
5
|
export function abstractSheetOfXml(el) {
|
|
6
6
|
const children = Array();
|
|
7
7
|
const childElements = Array();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-sheet-xml.js","sourceRoot":"","sources":["../../src/abstract-sheet-xml/abstract-sheet-xml.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAWlB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,yCAAyC,CAAC;AAC9D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"abstract-sheet-xml.js","sourceRoot":"","sources":["../../src/abstract-sheet-xml/abstract-sheet-xml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/abstract-sheet-xml/handlebars-xml/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/abstract-sheet-xml/handlebars-xml/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { X2jOptions } from "fast-xml-parser";
|
|
2
|
+
export type XmlElement = {
|
|
3
|
+
readonly tagName: string;
|
|
4
|
+
readonly attributes: Record<string, string>;
|
|
5
|
+
readonly children: ReadonlyArray<XmlElement>;
|
|
6
|
+
readonly textContent?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const parseHandlebarsXml: (template: string, data: any, partials: Record<string, string>) => ReadonlyArray<XmlElement>;
|
|
9
|
+
export declare const render: (template: string, data: any, partials: Record<string, string>) => string;
|
|
10
|
+
export declare function parseXmlCustom(text: string, options: Partial<X2jOptions>): ReadonlyArray<XmlElement>;
|
|
11
|
+
export declare const parseXml: (text: string) => ReadonlyArray<XmlElement>;
|
|
12
|
+
export declare const parseXsd: (text: string) => ReadonlyArray<XmlElement>;
|
|
13
|
+
export declare function findElement(elements: ReadonlyArray<XmlElement>, elementName: string | undefined): XmlElement | undefined;
|
|
14
|
+
export declare function getChildren(elements: ReadonlyArray<XmlElement>): ReadonlyArray<XmlElement>;
|
|
15
|
+
//# sourceMappingURL=parse-handlebars-xml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-handlebars-xml.d.ts","sourceRoot":"","sources":["../../../src/abstract-sheet-xml/handlebars-xml/parse-handlebars-xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,iBAAiB,CAAC;AAGxD,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,UAAU,MAAM,EAChB,MAAM,GAAG,EACT,UAAU,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC/B,aAAa,CAAC,UAAU,CAE1B,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,UAAU,MAAM,EAAE,MAAM,GAAG,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,MAGtF,CAAC;AAEF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,CAKpG;AACD,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,KAAG,aAAa,CAAC,UAAU,CAAwC,CAAC;AACzG,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,KAAG,aAAa,CAAC,UAAU,CACP,CAAC;AAgC1D,wBAAgB,WAAW,CACzB,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,EACnC,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,UAAU,GAAG,SAAS,CAqBxB;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,CAc1F"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { XMLParser } from "fast-xml-parser";
|
|
2
|
+
import Handlebars from "handlebars";
|
|
3
|
+
export const parseHandlebarsXml = (template, data, partials) => {
|
|
4
|
+
return parseXml(render(template, data, partials));
|
|
5
|
+
};
|
|
6
|
+
export const render = (template, data, partials) => {
|
|
7
|
+
Object.entries(partials).forEach(([name, partial]) => Handlebars.registerPartial(name, partial));
|
|
8
|
+
return Handlebars.compile(template)(data);
|
|
9
|
+
};
|
|
10
|
+
export function parseXmlCustom(text, options) {
|
|
11
|
+
const parser = new XMLParser(options);
|
|
12
|
+
parser.addEntity("#x2F", "/");
|
|
13
|
+
parser.addEntity("#x3D", "=");
|
|
14
|
+
return transformFXP(parser.parse(text));
|
|
15
|
+
}
|
|
16
|
+
export const parseXml = (text) => transformFXP(xmlParser.parse(text));
|
|
17
|
+
export const parseXsd = (text) => transformFXP(xsdParser.parse(text.replace(/xs:/g, "")));
|
|
18
|
+
// Transforms fast-xml-parser format to a format that is much easier to work with
|
|
19
|
+
function transformFXP(parsedXml) {
|
|
20
|
+
return parsedXml.flatMap((element) => {
|
|
21
|
+
const key = Object.keys(element).find((k) => k !== ":@" && k !== "#text");
|
|
22
|
+
if (key === "?xml") {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
const children = (element[key] || []).filter((c) => {
|
|
26
|
+
const key = Object.keys(c)[0];
|
|
27
|
+
return key !== "#text" && key !== ":@";
|
|
28
|
+
});
|
|
29
|
+
const attributes = element[":@"] || {};
|
|
30
|
+
const textChilds = (element[key] || [])
|
|
31
|
+
.filter((c) => {
|
|
32
|
+
const key = Object.keys(c)[0];
|
|
33
|
+
return key === "#text";
|
|
34
|
+
})
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
36
|
+
.flatMap((t) => t["#text"]);
|
|
37
|
+
const textContents = textChilds.flatMap((text) => {
|
|
38
|
+
const cleaned = text.replace(/\n/g, "").replace(/\t/g, "").trim();
|
|
39
|
+
return cleaned ? [text] : [];
|
|
40
|
+
});
|
|
41
|
+
const textContent = textContents.join("\n");
|
|
42
|
+
return { tagName: key, attributes: attributes, children: transformFXP(children), textContent: textContent };
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
export function findElement(elements, elementName) {
|
|
46
|
+
if (!elementName) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
for (const elem of elements) {
|
|
50
|
+
if (elem.tagName === "annotation" || elem.tagName === "attribute") {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (shouldSkipLevel(elem)) {
|
|
54
|
+
const childElement = findElement(Array.from(elem.children), elementName);
|
|
55
|
+
if (childElement) {
|
|
56
|
+
return shouldSkipLevel(childElement)
|
|
57
|
+
? findElement(Array.from(childElement.children), elementName)
|
|
58
|
+
: childElement;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (elem.attributes.name === elementName) {
|
|
62
|
+
return elem;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
export function getChildren(elements) {
|
|
68
|
+
for (const elem of elements) {
|
|
69
|
+
if (elem.tagName === "annotation" || elem.tagName === "attribute") {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (shouldSkipLevel(elem)) {
|
|
73
|
+
const child = getChildren(Array.from(elem.children));
|
|
74
|
+
if (child.length > 0) {
|
|
75
|
+
return child.flatMap((c) => (shouldSkipLevel(c) ? getChildren(Array.from(c.children)) : c));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return elements;
|
|
79
|
+
}
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
function shouldSkipLevel(tag) {
|
|
83
|
+
return (tag.tagName === "all" || tag.tagName === "sequence" || tag.tagName === "choice" || tag.attributes.name === undefined);
|
|
84
|
+
}
|
|
85
|
+
const xmlParser = new XMLParser({
|
|
86
|
+
preserveOrder: true,
|
|
87
|
+
ignoreAttributes: false,
|
|
88
|
+
attributeNamePrefix: "",
|
|
89
|
+
allowBooleanAttributes: true,
|
|
90
|
+
trimValues: false,
|
|
91
|
+
ignoreDeclaration: true,
|
|
92
|
+
processEntities: true,
|
|
93
|
+
htmlEntities: true,
|
|
94
|
+
attributeValueProcessor: (_name, value) => {
|
|
95
|
+
if (!value?.trim()) {
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
const nValue = Number(value);
|
|
99
|
+
if (!Number.isNaN(nValue)) {
|
|
100
|
+
return nValue;
|
|
101
|
+
}
|
|
102
|
+
return value;
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
xmlParser.addEntity("#x2F", "/");
|
|
106
|
+
xmlParser.addEntity("#x3D", "=");
|
|
107
|
+
const xsdParser = new XMLParser({
|
|
108
|
+
preserveOrder: true,
|
|
109
|
+
ignoreAttributes: false,
|
|
110
|
+
attributeNamePrefix: "",
|
|
111
|
+
allowBooleanAttributes: true,
|
|
112
|
+
trimValues: false,
|
|
113
|
+
ignoreDeclaration: true,
|
|
114
|
+
});
|
|
115
|
+
xsdParser.addEntity("#x2F", "/");
|
|
116
|
+
xsdParser.addEntity("#x3D", "=");
|
|
117
|
+
//# sourceMappingURL=parse-handlebars-xml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-handlebars-xml.js","sourceRoot":"","sources":["../../../src/abstract-sheet-xml/handlebars-xml/parse-handlebars-xml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { XmlElement } from "./parse-handlebars-xml.js";
|
|
2
|
+
type Range = {
|
|
3
|
+
readonly startLineNumber: number;
|
|
4
|
+
readonly startColumn: number;
|
|
5
|
+
readonly endLineNumber: number;
|
|
6
|
+
readonly endColumn: number;
|
|
7
|
+
};
|
|
8
|
+
type ErrorObject = {
|
|
9
|
+
readonly range: Range;
|
|
10
|
+
readonly options: ErrorOptions;
|
|
11
|
+
};
|
|
12
|
+
type ErrorOptions = {
|
|
13
|
+
readonly className: string;
|
|
14
|
+
readonly hoverMessage: Array<{
|
|
15
|
+
readonly value: string;
|
|
16
|
+
}>;
|
|
17
|
+
};
|
|
18
|
+
export declare function validateXml(fullXml: string, xsdSchema: ReadonlyArray<XmlElement>): Array<ErrorObject>;
|
|
19
|
+
export declare function errorToReadableText(errors: ReadonlyArray<ErrorObject>, templateName?: string): string;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=validate-handlebars-xml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-handlebars-xml.d.ts","sourceRoot":"","sources":["../../../src/abstract-sheet-xml/handlebars-xml/validate-handlebars-xml.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAyB,MAAM,2BAA2B,CAAC;AAO9E,KAAK,KAAK,GAAG;IACX,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAMF,KAAK,WAAW,GAAG;IACjB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;CAChC,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;CACJ,CAAC;AASF,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAgErG;AAoJD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,YAAY,GAAE,MAAW,GAAG,MAAM,CAYzG"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { XMLValidator } from "fast-xml-parser";
|
|
2
|
+
import { parseXml, findElement } from "./parse-handlebars-xml.js";
|
|
3
|
+
var ErrorType;
|
|
4
|
+
(function (ErrorType) {
|
|
5
|
+
ErrorType[ErrorType["warning"] = 0] = "warning";
|
|
6
|
+
ErrorType[ErrorType["error"] = 1] = "error";
|
|
7
|
+
})(ErrorType || (ErrorType = {}));
|
|
8
|
+
// eslint-disable-next-line functional/prefer-readonly-type
|
|
9
|
+
export function validateXml(fullXml, xsdSchema) {
|
|
10
|
+
const errors = [];
|
|
11
|
+
// ignore all handlebars brackets
|
|
12
|
+
const matchHandlebarsBrackets = /{{.*}}(?!([\S]))/g;
|
|
13
|
+
// Ignore xml comments
|
|
14
|
+
const xmlComments = /<!--[^>]*-->/g;
|
|
15
|
+
// Replace matches with spaces of same length
|
|
16
|
+
let cleanedXml = fullXml.replace(matchHandlebarsBrackets, (m) => " ".repeat(m.length));
|
|
17
|
+
cleanedXml = cleanedXml.replace(xmlComments, (m) => {
|
|
18
|
+
const x = (m.match(/^.*$/gm) || []).map((m2) => " ".repeat(m2.length));
|
|
19
|
+
return x.join("\n");
|
|
20
|
+
});
|
|
21
|
+
const xml = `<xml>\n${cleanedXml}\n</xml>`;
|
|
22
|
+
if (xml) {
|
|
23
|
+
try {
|
|
24
|
+
const result = XMLValidator.validate(xml, {
|
|
25
|
+
allowBooleanAttributes: true,
|
|
26
|
+
});
|
|
27
|
+
if (result !== true) {
|
|
28
|
+
errors.push(getErrorFromException(result, xml));
|
|
29
|
+
}
|
|
30
|
+
const entryPointXml = parseXml(xml)[0];
|
|
31
|
+
const entryPointSchema = xsdSchema[0];
|
|
32
|
+
let pos = 0;
|
|
33
|
+
const lines = cleanedXml.split("\n");
|
|
34
|
+
const getRangeOfElement = (text, incrementPosition = true) => {
|
|
35
|
+
if (text === undefined) {
|
|
36
|
+
const monacoPosition = getPositionFromIndex(lines, pos);
|
|
37
|
+
return toRange(monacoPosition.lineNumber, monacoPosition.column, monacoPosition.lineNumber, monacoPosition.column + 5);
|
|
38
|
+
}
|
|
39
|
+
const position = cleanedXml.indexOf(text, pos);
|
|
40
|
+
if (incrementPosition) {
|
|
41
|
+
pos = position >= pos ? position + text.length : pos;
|
|
42
|
+
}
|
|
43
|
+
const monacoPosition = getPositionFromIndex(lines, position);
|
|
44
|
+
return toRange(monacoPosition.lineNumber, monacoPosition.column, monacoPosition.lineNumber, monacoPosition.column + text.length);
|
|
45
|
+
};
|
|
46
|
+
const validationErrors = entryPointXml.children.flatMap((child) => validateElements(child, undefined, entryPointSchema, getRangeOfElement));
|
|
47
|
+
errors.push(...validationErrors);
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
errors.push(createError(e.message, ErrorType.error, toRange(1, 1, 1, 100)));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return errors.map((e) => getDecorationsFromError(e));
|
|
54
|
+
}
|
|
55
|
+
function validateElements(element, schemaElement, completeSchema, getRangeOfElement) {
|
|
56
|
+
const errors = [];
|
|
57
|
+
// Validate element name
|
|
58
|
+
const tagName = element.tagName;
|
|
59
|
+
const range = getRangeOfElement(tagName);
|
|
60
|
+
const slashPosition = getRangeOfElement("/", false);
|
|
61
|
+
const closingTagPosition = getRangeOfElement(">", false);
|
|
62
|
+
const isClosed = rangeLessThan(slashPosition, closingTagPosition);
|
|
63
|
+
const validElements = Object.values(completeSchema.children);
|
|
64
|
+
const schemaName = schemaElement?.attributes.type || tagName;
|
|
65
|
+
const foundSchemaElement = findElement(validElements, schemaName);
|
|
66
|
+
if (!foundSchemaElement) {
|
|
67
|
+
return [createError(`"${tagName}" is not a valid element`, ErrorType.error, range)];
|
|
68
|
+
}
|
|
69
|
+
const possibleAttributes = Array.from(foundSchemaElement.children).flatMap((c) => c.tagName === "attribute" ? c : []);
|
|
70
|
+
// Validate required attributes
|
|
71
|
+
for (const possibleAttribute of possibleAttributes) {
|
|
72
|
+
const attributeName = possibleAttribute.attributes.name;
|
|
73
|
+
const isRequired = possibleAttribute.attributes.use;
|
|
74
|
+
if (attributeName && isRequired && isRequired === "required") {
|
|
75
|
+
if (element.attributes[attributeName] === undefined) {
|
|
76
|
+
errors.push(createError(`"${attributeName}" is a required attribute on "${tagName}"`, ErrorType.error, range));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Validate existing attributes
|
|
81
|
+
for (const [attrKey, attrVal] of Object.entries(element.attributes)) {
|
|
82
|
+
const possibleAttrNames = possibleAttributes.flatMap((p) => p.attributes.name || []);
|
|
83
|
+
const attrText = typeof attrVal === "string" ? `${attrKey}="${attrVal}"` : attrKey;
|
|
84
|
+
const attrRange = getRangeOfElement(attrText, false);
|
|
85
|
+
if (!possibleAttrNames.includes(attrKey)) {
|
|
86
|
+
errors.push(createError(`"${attrKey}" is a not a valid attribute on "${tagName}"`, ErrorType.error, attrRange));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Validate that the children are allowed as a child of current element
|
|
90
|
+
// and then validate the children themselves
|
|
91
|
+
const schemaChildren = Object.values(foundSchemaElement.children);
|
|
92
|
+
for (const child of element.children) {
|
|
93
|
+
const childName = child.tagName;
|
|
94
|
+
if (!childName) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const foundChild = findElement(schemaChildren, childName);
|
|
98
|
+
if (!foundChild) {
|
|
99
|
+
const childRange = getRangeOfElement(childName, false);
|
|
100
|
+
if (childRange) {
|
|
101
|
+
errors.push(createError(`"${childName}" is not a valid child of "${tagName}"`, ErrorType.error, childRange));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const elementErrors = validateElements(child, foundChild, completeSchema, getRangeOfElement);
|
|
105
|
+
errors.push(...elementErrors);
|
|
106
|
+
}
|
|
107
|
+
if (!isClosed) {
|
|
108
|
+
// Increment position to after closing tag
|
|
109
|
+
getRangeOfElement(`</${tagName}`, true);
|
|
110
|
+
}
|
|
111
|
+
return errors;
|
|
112
|
+
}
|
|
113
|
+
function getDecorationsFromError(error) {
|
|
114
|
+
return {
|
|
115
|
+
range: error.range,
|
|
116
|
+
options: {
|
|
117
|
+
className: getErrorClassNames(error),
|
|
118
|
+
hoverMessage: [{ value: getErrorType(error) }, { value: getErrorMessage(error) }],
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function getErrorFromException(result, xml) {
|
|
123
|
+
const { col, line, msg } = result.err;
|
|
124
|
+
const startLine = line - 1;
|
|
125
|
+
const lines = xml.split("\n");
|
|
126
|
+
const rowText = lines[startLine] || "";
|
|
127
|
+
const length = rowText.indexOf(">") - rowText.indexOf("<") || 4;
|
|
128
|
+
const range = toRange(startLine, col, startLine, col + length);
|
|
129
|
+
return createError(msg, ErrorType.error, range);
|
|
130
|
+
}
|
|
131
|
+
function getErrorClassNames(error) {
|
|
132
|
+
switch (error.type) {
|
|
133
|
+
case ErrorType.warning:
|
|
134
|
+
return "xml-lint xml-lint--warning";
|
|
135
|
+
case ErrorType.error:
|
|
136
|
+
return "xml-lint xml-lint--error";
|
|
137
|
+
default:
|
|
138
|
+
return "";
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function getErrorType(error) {
|
|
142
|
+
switch (error.type) {
|
|
143
|
+
case ErrorType.warning:
|
|
144
|
+
return "**Warning**";
|
|
145
|
+
case ErrorType.error:
|
|
146
|
+
return "**Error**";
|
|
147
|
+
default:
|
|
148
|
+
return "";
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const getErrorMessage = (error) => error.message.split(/[\t\n]/g)[1] ?? error.message;
|
|
152
|
+
const createError = (message, type, range) => ({ message, type, range });
|
|
153
|
+
function getPositionFromIndex(lines, index) {
|
|
154
|
+
let totalLength = 0;
|
|
155
|
+
for (const [lineNumber, line] of lines.entries()) {
|
|
156
|
+
totalLength += line.length;
|
|
157
|
+
if (totalLength >= index - lineNumber) {
|
|
158
|
+
return {
|
|
159
|
+
lineNumber: lineNumber + 1,
|
|
160
|
+
column: 1 + index - (totalLength - line.length) - lineNumber || 1, // "- lineNumber" because of \n characters
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return { lineNumber: lines.length, column: 1 };
|
|
165
|
+
}
|
|
166
|
+
const toRange = (startLineNumber, startColumn, endLineNumber, endColumn) => ({
|
|
167
|
+
startLineNumber,
|
|
168
|
+
startColumn,
|
|
169
|
+
endLineNumber,
|
|
170
|
+
endColumn,
|
|
171
|
+
});
|
|
172
|
+
export function errorToReadableText(errors, templateName = "") {
|
|
173
|
+
const errorLines = [];
|
|
174
|
+
if (templateName) {
|
|
175
|
+
errorLines.push(`Error in template ${templateName} \n`);
|
|
176
|
+
}
|
|
177
|
+
for (const error of errors) {
|
|
178
|
+
const hoverErrors = error.options.hoverMessage.map((e) => e.value.replace(/\*/g, ""));
|
|
179
|
+
errorLines.push(`${hoverErrors.join("\n")}`);
|
|
180
|
+
errorLines.push(`On line ${error.range.startLineNumber}, column ${error.range.startColumn}\n`);
|
|
181
|
+
}
|
|
182
|
+
return errorLines.join("\n");
|
|
183
|
+
}
|
|
184
|
+
function rangeLessThan(range1, range2) {
|
|
185
|
+
return range1.startLineNumber < range2.startLineNumber
|
|
186
|
+
? true
|
|
187
|
+
: range1.startLineNumber > range2.startLineNumber
|
|
188
|
+
? false
|
|
189
|
+
: range1.startColumn < range2.startColumn;
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=validate-handlebars-xml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-handlebars-xml.js","sourceRoot":"","sources":["../../../src/abstract-sheet-xml/handlebars-xml/validate-handlebars-xml.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/abstract-sheet-xml/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/abstract-sheet-xml/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/abstract-sheet-xml/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/abstract-sheet-xml/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "abstract-sheet",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Abstract sheet",
|
|
5
5
|
"author": "Divid AB <info@divid.se>",
|
|
6
6
|
"repository": "https://github.com/dividab/abstract-visuals/tree/master/packages/abstract-sheet",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"fast-xml-parser": "^4.5.0",
|
|
23
|
-
"
|
|
23
|
+
"handlebars": "4.7.8",
|
|
24
24
|
"ts-exhaustive-check": "^1.0.0",
|
|
25
25
|
"xlsx-js-style": "^1.2.0"
|
|
26
26
|
},
|
|
@@ -28,10 +28,9 @@
|
|
|
28
28
|
"react": ">=17.0.0 <^19.0.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@types/mustache": "^4.2.5",
|
|
32
31
|
"@types/node": "^22.10.1",
|
|
33
32
|
"@types/react": "^19.0.10",
|
|
34
33
|
"@types/xml": "^1.0.11"
|
|
35
34
|
},
|
|
36
|
-
"gitHead": "
|
|
35
|
+
"gitHead": "ac623c9c8e677d16c6031c0e1db4a00aadb92453"
|
|
37
36
|
}
|
|
@@ -12,10 +12,10 @@ import {
|
|
|
12
12
|
AbstractSheet,
|
|
13
13
|
} from "../abstract-sheet/abstract-sheet.js";
|
|
14
14
|
import { xsd } from "../abstract-sheet/abstract-sheet-xsd.js";
|
|
15
|
-
import {
|
|
15
|
+
import { parseHandlebarsXml, parseXsd, XmlElement } from "./handlebars-xml/index.js";
|
|
16
16
|
|
|
17
17
|
export const abstractSheetXml = (template: string, data: any, partials: Record<string, string>): AbstractSheet =>
|
|
18
|
-
abstractSheetOfXml(
|
|
18
|
+
abstractSheetOfXml(parseHandlebarsXml(template, data, partials)[0]!) as AbstractSheet;
|
|
19
19
|
|
|
20
20
|
export function abstractSheetOfXml(el: XmlElement): unknown {
|
|
21
21
|
const children = Array<unknown>();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { X2jOptions, XMLParser } from "fast-xml-parser";
|
|
2
|
-
import
|
|
2
|
+
import Handlebars from "handlebars";
|
|
3
3
|
|
|
4
4
|
export type XmlElement = {
|
|
5
5
|
readonly tagName: string;
|
|
@@ -8,13 +8,18 @@ export type XmlElement = {
|
|
|
8
8
|
readonly textContent?: string;
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
export const
|
|
11
|
+
export const parseHandlebarsXml = (
|
|
12
12
|
template: string,
|
|
13
13
|
data: any,
|
|
14
14
|
partials: Record<string, string>
|
|
15
|
-
): ReadonlyArray<XmlElement> =>
|
|
15
|
+
): ReadonlyArray<XmlElement> => {
|
|
16
|
+
return parseXml(render(template, data, partials));
|
|
17
|
+
};
|
|
16
18
|
|
|
17
|
-
export const render =
|
|
19
|
+
export const render = (template: string, data: any, partials: Record<string, string>): string => {
|
|
20
|
+
Object.entries(partials).forEach(([name, partial]) => Handlebars.registerPartial(name, partial));
|
|
21
|
+
return Handlebars.compile(template)(data);
|
|
22
|
+
};
|
|
18
23
|
|
|
19
24
|
export function parseXmlCustom(text: string, options: Partial<X2jOptions>): ReadonlyArray<XmlElement> {
|
|
20
25
|
const parser = new XMLParser(options);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { XMLValidator, ValidationError } from "fast-xml-parser";
|
|
2
|
-
import { XmlElement, parseXml, findElement } from "./parse-
|
|
2
|
+
import { XmlElement, parseXml, findElement } from "./parse-handlebars-xml.js";
|
|
3
3
|
|
|
4
4
|
enum ErrorType {
|
|
5
5
|
warning = 0,
|
|
@@ -40,13 +40,13 @@ type XmlError = {
|
|
|
40
40
|
export function validateXml(fullXml: string, xsdSchema: ReadonlyArray<XmlElement>): Array<ErrorObject> {
|
|
41
41
|
const errors: Array<XmlError> = [];
|
|
42
42
|
|
|
43
|
-
// ignore all
|
|
44
|
-
const
|
|
43
|
+
// ignore all handlebars brackets
|
|
44
|
+
const matchHandlebarsBrackets = /{{.*}}(?!([\S]))/g;
|
|
45
45
|
// Ignore xml comments
|
|
46
46
|
const xmlComments = /<!--[^>]*-->/g;
|
|
47
47
|
|
|
48
48
|
// Replace matches with spaces of same length
|
|
49
|
-
let cleanedXml = fullXml.replace(
|
|
49
|
+
let cleanedXml = fullXml.replace(matchHandlebarsBrackets, (m) => " ".repeat(m.length));
|
|
50
50
|
cleanedXml = cleanedXml.replace(xmlComments, (m) => {
|
|
51
51
|
const x = (m.match(/^.*$/gm) || []).map((m2) => " ".repeat(m2.length));
|
|
52
52
|
return x.join("\n");
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export * from "./abstract-sheet-xml.js";
|
|
2
|
-
export * from "./
|
|
2
|
+
export * from "./handlebars-xml/index.js";
|