@intentic/fileq 1.317.0 → 1.319.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/NOTICE +208 -0
- package/README.md +39 -12
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +19 -7
- package/dist/app.js.map +1 -1
- package/dist/commands/check.command.d.ts +3 -0
- package/dist/commands/check.command.d.ts.map +1 -0
- package/dist/commands/check.command.js +80 -0
- package/dist/commands/check.command.js.map +1 -0
- package/dist/commands/derive.command.js +1 -1
- package/dist/commands/derive.command.js.map +1 -1
- package/dist/commands/read.command.d.ts.map +1 -1
- package/dist/commands/read.command.js +26 -45
- package/dist/commands/read.command.js.map +1 -1
- package/dist/commands/render.command.d.ts +3 -0
- package/dist/commands/render.command.d.ts.map +1 -0
- package/dist/commands/render.command.js +67 -0
- package/dist/commands/render.command.js.map +1 -0
- package/dist/lib/check/check.d.ts +15 -0
- package/dist/lib/check/check.d.ts.map +1 -0
- package/dist/lib/check/check.js +35 -0
- package/dist/lib/check/check.js.map +1 -0
- package/dist/lib/check/docx.d.ts +3 -0
- package/dist/lib/check/docx.d.ts.map +1 -0
- package/dist/lib/check/docx.js +329 -0
- package/dist/lib/check/docx.js.map +1 -0
- package/dist/lib/check/finding.d.ts +20 -0
- package/dist/lib/check/finding.d.ts.map +1 -0
- package/dist/lib/check/finding.js +27 -0
- package/dist/lib/check/finding.js.map +1 -0
- package/dist/lib/check/package.d.ts +25 -0
- package/dist/lib/check/package.d.ts.map +1 -0
- package/dist/lib/check/package.js +139 -0
- package/dist/lib/check/package.js.map +1 -0
- package/dist/lib/check/pdf.d.ts +3 -0
- package/dist/lib/check/pdf.d.ts.map +1 -0
- package/dist/lib/check/pdf.js +160 -0
- package/dist/lib/check/pdf.js.map +1 -0
- package/dist/lib/check/pptx.d.ts +3 -0
- package/dist/lib/check/pptx.d.ts.map +1 -0
- package/dist/lib/check/pptx.js +497 -0
- package/dist/lib/check/pptx.js.map +1 -0
- package/dist/lib/check/text-fit.d.ts +18 -0
- package/dist/lib/check/text-fit.d.ts.map +1 -0
- package/dist/lib/check/text-fit.js +69 -0
- package/dist/lib/check/text-fit.js.map +1 -0
- package/dist/lib/check/xlsx.d.ts +3 -0
- package/dist/lib/check/xlsx.d.ts.map +1 -0
- package/dist/lib/check/xlsx.js +131 -0
- package/dist/lib/check/xlsx.js.map +1 -0
- package/dist/lib/check/xml-tree.d.ts +15 -0
- package/dist/lib/check/xml-tree.d.ts.map +1 -0
- package/dist/lib/check/xml-tree.js +131 -0
- package/dist/lib/check/xml-tree.js.map +1 -0
- package/dist/lib/content-cache.d.ts +12 -0
- package/dist/lib/content-cache.d.ts.map +1 -0
- package/dist/lib/content-cache.js +33 -0
- package/dist/lib/content-cache.js.map +1 -0
- package/dist/lib/derive.d.ts +10 -0
- package/dist/lib/derive.d.ts.map +1 -1
- package/dist/lib/derive.js +37 -4
- package/dist/lib/derive.js.map +1 -1
- package/dist/lib/derivers/image.d.ts.map +1 -1
- package/dist/lib/derivers/image.js.map +1 -1
- package/dist/lib/formats.d.ts +1 -0
- package/dist/lib/formats.d.ts.map +1 -1
- package/dist/lib/formats.js +1 -0
- package/dist/lib/formats.js.map +1 -1
- package/dist/lib/render/convert.d.ts +11 -0
- package/dist/lib/render/convert.d.ts.map +1 -0
- package/dist/lib/render/convert.js +107 -0
- package/dist/lib/render/convert.js.map +1 -0
- package/dist/lib/render/pages.d.ts +11 -0
- package/dist/lib/render/pages.d.ts.map +1 -0
- package/dist/lib/render/pages.js +43 -0
- package/dist/lib/render/pages.js.map +1 -0
- package/dist/lib/render/render.d.ts +29 -0
- package/dist/lib/render/render.d.ts.map +1 -0
- package/dist/lib/render/render.js +142 -0
- package/dist/lib/render/render.js.map +1 -0
- package/dist/lib/sidecar.d.ts +11 -2
- package/dist/lib/sidecar.d.ts.map +1 -1
- package/dist/lib/sidecar.js +28 -16
- package/dist/lib/sidecar.js.map +1 -1
- package/dist/skill-authoring.d.ts +2 -0
- package/dist/skill-authoring.d.ts.map +1 -0
- package/dist/skill-authoring.js +20 -0
- package/dist/skill-authoring.js.map +1 -0
- package/dist/skill.d.ts.map +1 -1
- package/dist/skill.js +32 -8
- package/dist/skill.js.map +1 -1
- package/dist/testing.d.ts +67 -0
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +151 -0
- package/dist/testing.js.map +1 -1
- package/package.json +21 -8
- package/src/app.ts +19 -7
- package/src/cli.integration.test.ts +115 -30
- package/src/commands/check.command.ts +97 -0
- package/src/commands/derive.command.ts +1 -1
- package/src/commands/read.command.ts +30 -52
- package/src/commands/render.command.ts +80 -0
- package/src/lib/archives.ts +1 -1
- package/src/lib/check/check.test.ts +446 -0
- package/src/lib/check/check.ts +49 -0
- package/src/lib/check/docx.ts +434 -0
- package/src/lib/check/finding.ts +63 -0
- package/src/lib/check/package.ts +199 -0
- package/src/lib/check/pdf.ts +228 -0
- package/src/lib/check/pptx.ts +641 -0
- package/src/lib/check/text-fit.ts +105 -0
- package/src/lib/check/xlsx.ts +163 -0
- package/src/lib/check/xml-tree.ts +186 -0
- package/src/lib/content-cache.ts +58 -0
- package/src/lib/derive.integration.test.ts +198 -0
- package/src/lib/derive.ts +66 -7
- package/src/lib/derivers/archive.ts +1 -1
- package/src/lib/derivers/image.ts +2 -1
- package/src/lib/derivers/load-cost.test.ts +1 -1
- package/src/lib/derivers/pdf.ts +1 -1
- package/src/lib/derivers/xlsx.ts +1 -1
- package/src/lib/formats.ts +6 -0
- package/src/lib/render/convert.ts +133 -0
- package/src/lib/render/pages.test.ts +38 -0
- package/src/lib/render/pages.ts +58 -0
- package/src/lib/render/render.ts +198 -0
- package/src/lib/sidecar.ts +42 -22
- package/src/render.integration.test.ts +217 -0
- package/src/skill-authoring.ts +27 -0
- package/src/skill.ts +36 -8
- package/src/testing.ts +287 -0
- package/dist/commands/sweep.command.d.ts +0 -3
- package/dist/commands/sweep.command.d.ts.map +0 -1
- package/dist/commands/sweep.command.js +0 -41
- package/dist/commands/sweep.command.js.map +0 -1
- package/dist/lib/flags.d.ts +0 -2
- package/dist/lib/flags.d.ts.map +0 -1
- package/dist/lib/flags.js +0 -8
- package/dist/lib/flags.js.map +0 -1
- package/dist/lib/sweep.d.ts +0 -7
- package/dist/lib/sweep.d.ts.map +0 -1
- package/dist/lib/sweep.js +0 -56
- package/dist/lib/sweep.js.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -3
- package/dist/version.js.map +0 -1
- package/src/commands/sweep.command.ts +0 -48
- package/src/lib/sweep.ts +0 -72
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.command.js","sourceRoot":"","sources":["../../src/commands/read.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"read.command.js","sourceRoot":"","sources":["../../src/commands/read.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.command.d.ts","sourceRoot":"","sources":["../../src/commands/render.command.ts"],"names":[],"mappings":"AAKA,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAqClE,eAAO,MAAM,aAAa,iDAqCxB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { basename, resolve } from "node:path";
|
|
2
|
+
import { countParser } from "@intentic/agent-cli/flags";
|
|
3
|
+
import { capsule } from "@intentic/agent-cli/output";
|
|
4
|
+
import { errorMessage } from "@intentic/base/errors";
|
|
5
|
+
import { buildCommand } from "@stricli/core";
|
|
6
|
+
import { workspaceRoot } from "../lib/env.js";
|
|
7
|
+
import { ConvertFailed, ToolMissing } from "../lib/render/convert.js";
|
|
8
|
+
import { BadPages, describePages, parsePages } from "../lib/render/pages.js";
|
|
9
|
+
import { DEFAULT_SIZE, NotRenderable, renderDocument } from "../lib/render/render.js";
|
|
10
|
+
const failure = (cause) => {
|
|
11
|
+
if (cause instanceof ToolMissing || cause instanceof BadPages) {
|
|
12
|
+
return { code: 2, message: cause.message };
|
|
13
|
+
}
|
|
14
|
+
if (cause instanceof NotRenderable || cause instanceof ConvertFailed) {
|
|
15
|
+
return { code: 1, message: cause.message };
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
};
|
|
19
|
+
const summary = (file, result) => {
|
|
20
|
+
const drawn = result.images.map((image) => image.page);
|
|
21
|
+
const fields = [
|
|
22
|
+
basename(file),
|
|
23
|
+
result.format,
|
|
24
|
+
`${result.total} ${result.unit}${result.total === 1 ? "" : "s"}`,
|
|
25
|
+
drawn.length === 0 ? "nothing drawn" : `drew ${result.unit}${drawn.length === 1 ? "" : "s"} ${describePages(drawn)}`,
|
|
26
|
+
result.reused ? "unchanged since the last render" : "rendered",
|
|
27
|
+
];
|
|
28
|
+
return capsule("fileq", fields, result.notes);
|
|
29
|
+
};
|
|
30
|
+
export const renderCommand = buildCommand({
|
|
31
|
+
docs: { brief: "Draw a document's pages or slides as PNG files and print their paths, to look at with an image reader" },
|
|
32
|
+
parameters: {
|
|
33
|
+
flags: {
|
|
34
|
+
pages: { kind: "parsed", parse: String, optional: true, brief: "Which pages or slides: 3, 1-3, 2,5,7-9, 7- (default: the first 20)" },
|
|
35
|
+
out: { kind: "parsed", parse: String, optional: true, brief: "Folder for the PNGs (default: .intentic/local/cache/rendered/<path>/ in the workspace)" },
|
|
36
|
+
size: { kind: "parsed", parse: countParser, default: String(DEFAULT_SIZE), brief: "Longest side of each image, in pixels" },
|
|
37
|
+
json: { kind: "boolean", default: false, brief: "Machine-readable result on stdout" },
|
|
38
|
+
},
|
|
39
|
+
positional: {
|
|
40
|
+
kind: "tuple",
|
|
41
|
+
parameters: [{ parse: String, brief: "The document to draw (relative paths resolve against the cwd)", placeholder: "file" }],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
async func(flags, file) {
|
|
45
|
+
const absPath = resolve(file);
|
|
46
|
+
let result;
|
|
47
|
+
try {
|
|
48
|
+
const pages = flags.pages === undefined ? undefined : parsePages(flags.pages);
|
|
49
|
+
const size = Math.max(64, Math.round(flags.size));
|
|
50
|
+
result = await renderDocument({ absPath, pages, outDir: flags.out === undefined ? undefined : resolve(flags.out), size }, workspaceRoot());
|
|
51
|
+
}
|
|
52
|
+
catch (cause) {
|
|
53
|
+
const known = failure(cause);
|
|
54
|
+
this.process.stdout.write(`fileq: cannot render ${absPath}: ${known?.message ?? errorMessage(cause)}\n`);
|
|
55
|
+
process.exitCode = known?.code ?? 2;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
process.exitCode = result.images.length > 0 ? 0 : 1;
|
|
59
|
+
if (flags.json) {
|
|
60
|
+
this.process.stdout.write(`${JSON.stringify({ file: absPath, format: result.format, unit: result.unit, total: result.total, images: result.images, reused: result.reused, notes: result.notes })}\n`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
this.process.stdout.write(summary(absPath, result));
|
|
64
|
+
this.process.stdout.write(result.images.map((image) => `${image.path}\n`).join(""));
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=render.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.command.js","sourceRoot":"","sources":["../../src/commands/render.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Format } from "../formats.js";
|
|
2
|
+
import type { CheckReport } from "./finding.js";
|
|
3
|
+
export declare const CHECKABLE: readonly Format[];
|
|
4
|
+
export type CheckOutcome = {
|
|
5
|
+
readonly kind: "checked";
|
|
6
|
+
readonly report: CheckReport;
|
|
7
|
+
} | {
|
|
8
|
+
readonly kind: "unsupported";
|
|
9
|
+
readonly format: Format | undefined;
|
|
10
|
+
} | {
|
|
11
|
+
readonly kind: "unreadable";
|
|
12
|
+
readonly reason: string;
|
|
13
|
+
};
|
|
14
|
+
export declare const checkFile: (absPath: string) => Promise<CheckOutcome>;
|
|
15
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/lib/check/check.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAE3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAgBhD,eAAO,MAAM,SAAS,EAAE,SAAS,MAAM,EAAyB,CAAC;AAKjE,MAAM,MAAM,YAAY,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACrE;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAG/D,eAAO,MAAM,SAAS,YAAmB,MAAM,KAAG,OAAO,CAAC,YAAY,CAiBrE,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { readFile, stat } from "node:fs/promises";
|
|
2
|
+
import { errorMessage, isMissing } from "@intentic/base/errors";
|
|
3
|
+
import { claimedFormat } from "../formats.js";
|
|
4
|
+
import { checkDocx } from "./docx.js";
|
|
5
|
+
import { checkPdf } from "./pdf.js";
|
|
6
|
+
import { checkPptx } from "./pptx.js";
|
|
7
|
+
import { checkXlsx } from "./xlsx.js";
|
|
8
|
+
const CHECKERS = new Map([
|
|
9
|
+
["docx", checkDocx],
|
|
10
|
+
["pptx", checkPptx],
|
|
11
|
+
["xlsx", checkXlsx],
|
|
12
|
+
["pdf", checkPdf],
|
|
13
|
+
]);
|
|
14
|
+
export const CHECKABLE = [...CHECKERS.keys()];
|
|
15
|
+
const MAX_CHECK_BYTES = 200 * 1024 * 1024;
|
|
16
|
+
export const checkFile = async (absPath) => {
|
|
17
|
+
let size;
|
|
18
|
+
try {
|
|
19
|
+
size = (await stat(absPath)).size;
|
|
20
|
+
}
|
|
21
|
+
catch (cause) {
|
|
22
|
+
return { kind: "unreadable", reason: isMissing(cause) ? "no such file" : errorMessage(cause) };
|
|
23
|
+
}
|
|
24
|
+
if (size > MAX_CHECK_BYTES) {
|
|
25
|
+
return { kind: "unreadable", reason: `${Math.round(size / 1024 / 1024)} MB is over the ${MAX_CHECK_BYTES / 1024 / 1024} MB a check reads` };
|
|
26
|
+
}
|
|
27
|
+
const format = await claimedFormat(absPath);
|
|
28
|
+
const checker = format === undefined ? undefined : CHECKERS.get(format);
|
|
29
|
+
if (checker === undefined) {
|
|
30
|
+
return { kind: "unsupported", format };
|
|
31
|
+
}
|
|
32
|
+
const report = await checker(new Uint8Array(await readFile(absPath)));
|
|
33
|
+
return { kind: "checked", report };
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/lib/check/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAe,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAMtC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAkB;IACtC,CAAC,MAAM,EAAE,SAAS,CAAC;IACnB,CAAC,MAAM,EAAE,SAAS,CAAC;IACnB,CAAC,MAAM,EAAE,SAAS,CAAC;IACnB,CAAC,KAAK,EAAE,QAAQ,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAsB,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAGjE,MAAM,eAAe,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAQ1C,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,OAAe,EAAyB,EAAE;IACtE,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;IACnG,CAAC;IACD,IAAI,IAAI,GAAG,eAAe,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,mBAAmB,eAAe,GAAG,IAAI,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAChJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;IAC3C,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AACvC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docx.d.ts","sourceRoot":"","sources":["../../../src/lib/check/docx.ts"],"names":[],"mappings":"AAQA,OAAO,EAAyD,KAAK,WAAW,EAAgB,MAAM,cAAc,CAAC;AAgXrH,eAAO,MAAM,SAAS,UAAW,UAAU,KAAG,WAyD7C,CAAC"}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { error, excerpt, inches, leftoverText, plural, warning } from "./finding.js";
|
|
2
|
+
import { mainPartOf, missingTargetFindings, NotAPackage, openPackage, packageFindings } from "./package.js";
|
|
3
|
+
import { childAt, childNamed, childrenNamed, descendantsNamed, everyElement, intAttr, isElement, textIn } from "./xml-tree.js";
|
|
4
|
+
const DEFAULT_MAIN = "word/document.xml";
|
|
5
|
+
const EMU_PER_TWIP = 635;
|
|
6
|
+
const BUILT_IN_ANCHORS = new Set(["_top"]);
|
|
7
|
+
const COMPUTED_FIELDS = new Set(["PAGE", "NUMPAGES", "SECTIONPAGES", "DATE", "TIME", "PRINTDATE", "SAVEDATE", "CREATEDATE"]);
|
|
8
|
+
const CROSS_REFERENCES = new Set(["REF", "PAGEREF", "NOTEREF"]);
|
|
9
|
+
const TYPED_BULLET = /^\s*[•◦▪‣∙·]\s/;
|
|
10
|
+
const headingLevels = (styles) => {
|
|
11
|
+
const byId = new Map();
|
|
12
|
+
for (const style of styles === undefined ? [] : childrenNamed(styles, "w:style")) {
|
|
13
|
+
const id = style.attrs["w:styleId"];
|
|
14
|
+
if (id !== undefined && style.attrs["w:type"] === "paragraph") {
|
|
15
|
+
byId.set(id, style);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const levelOf = (id, depth) => {
|
|
19
|
+
const style = byId.get(id);
|
|
20
|
+
if (style === undefined || depth > 8) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const name = (childNamed(style, "w:name")?.attrs["w:val"] ?? "").toLowerCase();
|
|
24
|
+
const numbered = /^heading (\d)$/.exec(name);
|
|
25
|
+
if (numbered !== null) {
|
|
26
|
+
return Number(numbered[1]);
|
|
27
|
+
}
|
|
28
|
+
if (name === "title") {
|
|
29
|
+
return 0;
|
|
30
|
+
}
|
|
31
|
+
const outline = intAttr(childAt(style, "w:pPr", "w:outlineLvl"), "w:val");
|
|
32
|
+
if (outline !== undefined && outline < 9) {
|
|
33
|
+
return outline + 1;
|
|
34
|
+
}
|
|
35
|
+
const basedOn = childNamed(style, "w:basedOn")?.attrs["w:val"];
|
|
36
|
+
return basedOn === undefined ? undefined : levelOf(basedOn, depth + 1);
|
|
37
|
+
};
|
|
38
|
+
return new Map([...byId.keys()].flatMap((id) => {
|
|
39
|
+
const level = levelOf(id, 0);
|
|
40
|
+
return level === undefined ? [] : [[id, level]];
|
|
41
|
+
}));
|
|
42
|
+
};
|
|
43
|
+
const headingOf = (paragraph, levels) => {
|
|
44
|
+
const pPr = childNamed(paragraph, "w:pPr");
|
|
45
|
+
const outline = intAttr(childAt(pPr, "w:outlineLvl"), "w:val");
|
|
46
|
+
if (outline !== undefined && outline < 9) {
|
|
47
|
+
return outline + 1;
|
|
48
|
+
}
|
|
49
|
+
const style = childAt(pPr, "w:pStyle")?.attrs["w:val"];
|
|
50
|
+
return style === undefined ? undefined : levels.get(style);
|
|
51
|
+
};
|
|
52
|
+
const paragraphText = (paragraph) => textIn(paragraph, "w:t");
|
|
53
|
+
const locate = (paragraphs, levels) => {
|
|
54
|
+
const located = [];
|
|
55
|
+
const whereOf = new Map();
|
|
56
|
+
let lastHeading;
|
|
57
|
+
paragraphs.forEach((paragraph, index) => {
|
|
58
|
+
const text = paragraphText(paragraph);
|
|
59
|
+
const heading = headingOf(paragraph, levels);
|
|
60
|
+
const number = index + 1;
|
|
61
|
+
const label = text.trim() !== "" ? `paragraph ${number} · ${excerpt(text, 40)}` : lastHeading === undefined ? `paragraph ${number}` : `paragraph ${number} · under ${lastHeading}`;
|
|
62
|
+
located.push({ paragraph, number, text, heading });
|
|
63
|
+
whereOf.set(paragraph, label);
|
|
64
|
+
if (heading !== undefined && text.trim() !== "") {
|
|
65
|
+
lastHeading = excerpt(text, 40);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
return { located, whereOf };
|
|
69
|
+
};
|
|
70
|
+
const paragraphIndex = (paragraphs) => {
|
|
71
|
+
const owner = new Map();
|
|
72
|
+
for (const paragraph of paragraphs) {
|
|
73
|
+
for (const node of everyElement(paragraph)) {
|
|
74
|
+
owner.set(node, paragraph);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return owner;
|
|
78
|
+
};
|
|
79
|
+
const stepField = (node, open, fields, where) => {
|
|
80
|
+
const type = node.attrs["w:fldCharType"];
|
|
81
|
+
const current = open.at(-1);
|
|
82
|
+
if (type === "begin") {
|
|
83
|
+
open.push({ instruction: "", result: "", separated: false, where });
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (current === undefined) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (type === "separate") {
|
|
90
|
+
current.separated = true;
|
|
91
|
+
}
|
|
92
|
+
else if (type === "end") {
|
|
93
|
+
open.pop();
|
|
94
|
+
fields.push({ instruction: current.instruction.trim(), result: current.result, hasResult: current.separated && current.result.trim() !== "", where: current.where });
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const fieldsIn = (body, whereOfNode) => {
|
|
98
|
+
const fields = [];
|
|
99
|
+
const open = [];
|
|
100
|
+
for (const node of everyElement(body)) {
|
|
101
|
+
if (node.name === "w:fldSimple") {
|
|
102
|
+
const result = textIn(node, "w:t");
|
|
103
|
+
fields.push({ instruction: (node.attrs["w:instr"] ?? "").trim(), result, hasResult: result.trim() !== "", where: whereOfNode(node) });
|
|
104
|
+
}
|
|
105
|
+
else if (node.name === "w:fldChar") {
|
|
106
|
+
stepField(node, open, fields, whereOfNode(node));
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
const current = open.at(-1);
|
|
110
|
+
const text = node.children.filter((child) => !isElement(child)).join("");
|
|
111
|
+
if (current !== undefined && node.name === "w:instrText" && !current.separated) {
|
|
112
|
+
current.instruction += text;
|
|
113
|
+
}
|
|
114
|
+
else if (current !== undefined && node.name === "w:t" && current.separated) {
|
|
115
|
+
current.result += text;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return fields;
|
|
120
|
+
};
|
|
121
|
+
const bookmarkArgument = (instruction) => {
|
|
122
|
+
const tokens = [...instruction.matchAll(/"[^"]*"|\S+/g)].map((match) => match[0]);
|
|
123
|
+
const keyword = (tokens[0] ?? "").toUpperCase();
|
|
124
|
+
if (CROSS_REFERENCES.has(keyword)) {
|
|
125
|
+
return tokens[1]?.replaceAll('"', "");
|
|
126
|
+
}
|
|
127
|
+
if (keyword === "HYPERLINK") {
|
|
128
|
+
const at = tokens.indexOf("\\l");
|
|
129
|
+
return at === -1 ? undefined : tokens[at + 1]?.replaceAll('"', "");
|
|
130
|
+
}
|
|
131
|
+
return undefined;
|
|
132
|
+
};
|
|
133
|
+
const fieldFindings = (fields, bookmarks, updatesOnOpen) => fields.flatMap((field) => {
|
|
134
|
+
const keyword = (field.instruction.split(/\s+/)[0] ?? "").toUpperCase();
|
|
135
|
+
if (field.result.trim().startsWith('Error!')) {
|
|
136
|
+
return [error("field-error", field.where, `the ${keyword} field shows ${excerpt(field.result)}: fix what it points at, then update fields`)];
|
|
137
|
+
}
|
|
138
|
+
const bookmark = bookmarkArgument(field.instruction);
|
|
139
|
+
if (bookmark !== undefined && !bookmarks.has(bookmark) && !BUILT_IN_ANCHORS.has(bookmark)) {
|
|
140
|
+
return [error("broken-reference", field.where, `the ${keyword} field points to bookmark "${bookmark}", which is not in the document: Word shows "Error! Reference source not found."`)];
|
|
141
|
+
}
|
|
142
|
+
if (keyword === "MERGEFIELD") {
|
|
143
|
+
return [warning("merge-field", field.where, `a mail-merge field is left in (${field.instruction}): it prints its placeholder, not a value`)];
|
|
144
|
+
}
|
|
145
|
+
if (keyword === "TOC" && !field.hasResult) {
|
|
146
|
+
const when = updatesOnOpen ? "Word offers to update fields when the file opens" : "nothing fills it until someone updates fields (F9 in Word)";
|
|
147
|
+
return [warning("empty-toc", field.where, `the table of contents has no entries saved: ${when}, and previews and LibreOffice show it empty`)];
|
|
148
|
+
}
|
|
149
|
+
if (!field.hasResult && keyword !== "" && !COMPUTED_FIELDS.has(keyword) && keyword !== "TOC") {
|
|
150
|
+
return [warning("empty-field", field.where, `the ${keyword} field has no saved result, so it shows blank until fields are updated`)];
|
|
151
|
+
}
|
|
152
|
+
return [];
|
|
153
|
+
});
|
|
154
|
+
const referenceFindings = (context, part, tree, whereOfNode, referenced) => {
|
|
155
|
+
const rels = context.pkg.rels(part);
|
|
156
|
+
const findings = [];
|
|
157
|
+
for (const node of everyElement(tree)) {
|
|
158
|
+
for (const [attribute, id] of Object.entries(node.attrs)) {
|
|
159
|
+
if (!attribute.startsWith("r:") || id === "") {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
referenced.add(id);
|
|
163
|
+
const finding = referenceFinding(context.pkg, node, rels.get(id), id, whereOfNode(node));
|
|
164
|
+
if (finding !== undefined) {
|
|
165
|
+
findings.push(finding);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return findings;
|
|
170
|
+
};
|
|
171
|
+
const referenceFinding = (pkg, node, relationship, id, where) => {
|
|
172
|
+
const isImage = node.name === "a:blip" || node.name === "v:imagedata";
|
|
173
|
+
if (relationship === undefined) {
|
|
174
|
+
return error(isImage ? "missing-image" : "missing-part", where, `${isImage ? "an image" : node.name} refers to ${id}, which the document does not define: it shows as missing`);
|
|
175
|
+
}
|
|
176
|
+
if (relationship.external) {
|
|
177
|
+
return isImage ? warning("linked-image", where, `an image is linked from outside the file (${relationship.target}), so it will not show on anyone else's machine; embed it`) : undefined;
|
|
178
|
+
}
|
|
179
|
+
if (pkg.has(relationship.target)) {
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
return isImage
|
|
183
|
+
? error("missing-image", where, `image ${relationship.target} is not in the file, so it shows as a broken picture`)
|
|
184
|
+
: error("missing-part", where, `${relationship.kind} ${relationship.target} is not in the file`);
|
|
185
|
+
};
|
|
186
|
+
const textWidths = (paragraphs, body) => {
|
|
187
|
+
const widthOf = (sectPr) => {
|
|
188
|
+
const page = intAttr(childAt(sectPr, "w:pgSz"), "w:w");
|
|
189
|
+
const margins = childAt(sectPr, "w:pgMar");
|
|
190
|
+
if (page === undefined) {
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
const columns = Math.max(1, intAttr(childAt(sectPr, "w:cols"), "w:num") ?? 1);
|
|
194
|
+
const text = page - (intAttr(margins, "w:left") ?? 0) - (intAttr(margins, "w:right") ?? 0) - (intAttr(margins, "w:gutter") ?? 0);
|
|
195
|
+
return (text / columns) * EMU_PER_TWIP;
|
|
196
|
+
};
|
|
197
|
+
const sections = paragraphs.flatMap((paragraph, index) => {
|
|
198
|
+
const sectPr = childAt(paragraph, "w:pPr", "w:sectPr");
|
|
199
|
+
return sectPr === undefined ? [] : [{ endsAt: index, width: widthOf(sectPr) }];
|
|
200
|
+
});
|
|
201
|
+
sections.push({ endsAt: paragraphs.length, width: widthOf(childNamed(body, "w:sectPr")) });
|
|
202
|
+
return sections;
|
|
203
|
+
};
|
|
204
|
+
const wideImageFindings = (context, body, owner) => {
|
|
205
|
+
const all = context.paragraphs.map((located) => located.paragraph);
|
|
206
|
+
const order = new Map(all.map((paragraph, index) => [paragraph, index]));
|
|
207
|
+
const sections = textWidths(all, body);
|
|
208
|
+
return descendantsNamed(body, "wp:inline").flatMap((inline) => {
|
|
209
|
+
const cx = intAttr(childNamed(inline, "wp:extent"), "cx");
|
|
210
|
+
const paragraph = owner.get(inline);
|
|
211
|
+
const index = paragraph === undefined ? undefined : order.get(paragraph);
|
|
212
|
+
const width = index === undefined ? undefined : sections.find((section) => section.endsAt >= index)?.width;
|
|
213
|
+
if (cx === undefined || width === undefined || width <= 0 || cx <= width * 1.02) {
|
|
214
|
+
return [];
|
|
215
|
+
}
|
|
216
|
+
const where = paragraph === undefined ? "" : (context.whereOf.get(paragraph) ?? "");
|
|
217
|
+
return [warning("wide-image", where, `a picture is ${inches(cx)} wide in a ${inches(width)} text column, so it runs into the margin or is cut off; scale it to fit`)];
|
|
218
|
+
});
|
|
219
|
+
};
|
|
220
|
+
const draftFindings = (context, body) => {
|
|
221
|
+
const findings = [];
|
|
222
|
+
const changes = everyElement(body).filter((node) => ["w:ins", "w:del", "w:moveFrom", "w:moveTo"].includes(node.name) && node.children.some(isElement)).length;
|
|
223
|
+
if (changes > 0) {
|
|
224
|
+
findings.push(warning("tracked-changes", "", `${plural(changes, "tracked change")} still in the document: accept or reject them before it goes out`));
|
|
225
|
+
}
|
|
226
|
+
const commentsPart = [...context.pkg.rels(context.main).values()].find((relationship) => relationship.kind === "comments" && !relationship.external);
|
|
227
|
+
const comments = commentsPart === undefined ? undefined : context.pkg.xml(commentsPart.target);
|
|
228
|
+
const count = comments === undefined ? 0 : childrenNamed(comments, "w:comment").length;
|
|
229
|
+
if (count > 0) {
|
|
230
|
+
findings.push(warning("comments", "", `${plural(count, "comment")} still in the document: resolve or delete them before it goes out`));
|
|
231
|
+
}
|
|
232
|
+
return findings;
|
|
233
|
+
};
|
|
234
|
+
const paragraphFindings = (context) => {
|
|
235
|
+
const findings = [];
|
|
236
|
+
let typedBullets = 0;
|
|
237
|
+
let firstBullet;
|
|
238
|
+
for (const located of context.paragraphs) {
|
|
239
|
+
const where = context.whereOf.get(located.paragraph) ?? `paragraph ${located.number}`;
|
|
240
|
+
findings.push(...leftoverText(located.text, where));
|
|
241
|
+
const hasPicture = descendantsNamed(located.paragraph, "w:drawing").length > 0 || descendantsNamed(located.paragraph, "w:pict").length > 0;
|
|
242
|
+
if (located.heading !== undefined && located.text.trim() === "" && !hasPicture) {
|
|
243
|
+
const level = located.heading === 0 ? "title" : `heading ${located.heading}`;
|
|
244
|
+
findings.push(warning("empty-heading", where, `empty ${level}: a blank line in the text and an empty entry in the navigation pane and any table of contents; delete it`));
|
|
245
|
+
}
|
|
246
|
+
if (TYPED_BULLET.test(located.text) && childAt(located.paragraph, "w:pPr", "w:numPr") === undefined) {
|
|
247
|
+
typedBullets += 1;
|
|
248
|
+
firstBullet ??= where;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (firstBullet !== undefined) {
|
|
252
|
+
findings.push(warning("typed-bullets", firstBullet, `${plural(typedBullets, "paragraph")} ${typedBullets === 1 ? "starts" : "start"} with a typed bullet character instead of a list style, so the list will not indent or renumber; use a list style`));
|
|
253
|
+
}
|
|
254
|
+
return findings;
|
|
255
|
+
};
|
|
256
|
+
const controlFindings = (body, whereOfNode) => descendantsNamed(body, "w:sdt")
|
|
257
|
+
.filter((control) => childAt(control, "w:sdtPr", "w:showingPlcHdr") !== undefined)
|
|
258
|
+
.map((control) => {
|
|
259
|
+
const prompt = textIn(childNamed(control, "w:sdtContent") ?? control, "w:t");
|
|
260
|
+
const where = whereOfNode(descendantsNamed(control, "w:p")[0] ?? control);
|
|
261
|
+
return error("placeholder-control", where, `a content control still shows its prompt ${excerpt(prompt)}: enter the value or remove the control`);
|
|
262
|
+
});
|
|
263
|
+
const linkFindings = (body, bookmarks, whereOfNode) => descendantsNamed(body, "w:hyperlink").flatMap((link) => {
|
|
264
|
+
const anchor = link.attrs["w:anchor"];
|
|
265
|
+
if (anchor === undefined || bookmarks.has(anchor) || BUILT_IN_ANCHORS.has(anchor)) {
|
|
266
|
+
return [];
|
|
267
|
+
}
|
|
268
|
+
return [error("broken-link", whereOfNode(link), `the link ${excerpt(textIn(link, "w:t"))} points to bookmark "${anchor}", which is not in the document, so clicking it goes nowhere`)];
|
|
269
|
+
});
|
|
270
|
+
const storyFindings = (context, stories) => stories.flatMap((story) => {
|
|
271
|
+
const label = story.part.replace(/^word\//, "").replace(/\.xml$/, "");
|
|
272
|
+
const referenced = new Set();
|
|
273
|
+
return [...referenceFindings(context, story.part, story.tree, () => label, referenced), ...missingTargetFindings(context.pkg, story.part, label, referenced)];
|
|
274
|
+
});
|
|
275
|
+
const openDocx = (bytes) => {
|
|
276
|
+
try {
|
|
277
|
+
return openPackage(bytes);
|
|
278
|
+
}
|
|
279
|
+
catch (cause) {
|
|
280
|
+
if (cause instanceof NotAPackage) {
|
|
281
|
+
return { format: "docx", findings: [error("unreadable", "", `${cause.message}: this is not a Word file (or it is password-protected)`)], notes: [] };
|
|
282
|
+
}
|
|
283
|
+
throw cause;
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
export const checkDocx = (bytes) => {
|
|
287
|
+
const pkg = openDocx(bytes);
|
|
288
|
+
if ("findings" in pkg) {
|
|
289
|
+
return pkg;
|
|
290
|
+
}
|
|
291
|
+
const main = mainPartOf(pkg, DEFAULT_MAIN);
|
|
292
|
+
const findings = packageFindings(pkg, main);
|
|
293
|
+
const notes = pkg.skipped.map((part) => `not checked: ${part} is too large to read`);
|
|
294
|
+
const body = childAt(pkg.xml(main), "w:body");
|
|
295
|
+
if (body === undefined) {
|
|
296
|
+
return { format: "docx", findings, notes };
|
|
297
|
+
}
|
|
298
|
+
const mainRels = [...pkg.rels(main).values()].filter((relationship) => !relationship.external);
|
|
299
|
+
const partOfKind = (kind) => {
|
|
300
|
+
const relationship = mainRels.find((candidate) => candidate.kind === kind);
|
|
301
|
+
return relationship === undefined ? undefined : pkg.xml(relationship.target);
|
|
302
|
+
};
|
|
303
|
+
const all = descendantsNamed(body, "w:p");
|
|
304
|
+
const { located, whereOf } = locate(all, headingLevels(partOfKind("styles")));
|
|
305
|
+
const owner = paragraphIndex(all);
|
|
306
|
+
const whereOfNode = (node) => whereOf.get(owner.get(node) ?? node) ?? "";
|
|
307
|
+
const stories = mainRels
|
|
308
|
+
.filter((relationship) => ["header", "footer", "footnotes", "endnotes"].includes(relationship.kind))
|
|
309
|
+
.flatMap((relationship) => {
|
|
310
|
+
const tree = pkg.xml(relationship.target);
|
|
311
|
+
return tree === undefined ? [] : [{ part: relationship.target, tree }];
|
|
312
|
+
});
|
|
313
|
+
const bookmarks = new Set([body, ...stories.map((story) => story.tree)].flatMap((tree) => descendantsNamed(tree, "w:bookmarkStart").flatMap((mark) => mark.attrs["w:name"] ?? [])));
|
|
314
|
+
const context = { pkg, main, paragraphs: located, whereOf, bookmarks };
|
|
315
|
+
if (located.every((item) => item.text.trim() === "") && descendantsNamed(body, "w:drawing").length === 0) {
|
|
316
|
+
findings.push(warning("no-text", "", "the document has no text"));
|
|
317
|
+
}
|
|
318
|
+
const updateFields = childAt(partOfKind("settings"), "w:updateFields");
|
|
319
|
+
const referenced = new Set();
|
|
320
|
+
findings.push(...linkFindings(body, bookmarks, whereOfNode), ...fieldFindings(fieldsIn(body, whereOfNode), bookmarks, updateFields !== undefined && updateFields.attrs["w:val"] !== "false"), ...referenceFindings(context, main, body, whereOfNode, referenced), ...storyFindings(context, stories), ...missingTargetFindings(pkg, main, "", referenced), ...controlFindings(body, whereOfNode), ...paragraphFindings(context), ...wideImageFindings(context, body, owner), ...draftFindings(context, body));
|
|
321
|
+
const explained = new Set(findings.filter((finding) => finding.rule === "field-error" || finding.rule === "placeholder-control").map((finding) => finding.where));
|
|
322
|
+
return {
|
|
323
|
+
format: "docx",
|
|
324
|
+
extent: plural(located.length, "paragraph"),
|
|
325
|
+
findings: findings.filter((finding) => finding.rule !== "leftover-text" || !explained.has(finding.where)),
|
|
326
|
+
notes,
|
|
327
|
+
};
|
|
328
|
+
};
|
|
329
|
+
//# sourceMappingURL=docx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docx.js","sourceRoot":"","sources":["../../../src/lib/check/docx.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAkC,MAAM,cAAc,CAAC;AACrH,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAwC,MAAM,cAAc,CAAC;AAClJ,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAmB,MAAM,eAAe,CAAC;AAEhJ,MAAM,YAAY,GAAG,mBAAmB,CAAC;AACzC,MAAM,YAAY,GAAG,GAAG,CAAC;AAEzB,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAE3C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;AAC7H,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAChE,MAAM,YAAY,GAAG,gBAAgB,CAAC;AA4BtC,MAAM,aAAa,GAAG,CAAC,MAA8B,EAA+B,EAAE;IAClF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;QAC/E,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACpC,IAAI,EAAE,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,WAAW,EAAE,CAAC;YAC5D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;IACL,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,KAAa,EAAsB,EAAE;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/E,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,CAAC;QACb,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1E,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,OAAO,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/D,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC;IACF,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAU,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC,CAAC;AACR,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,SAAqB,EAAE,MAAmC,EAAsB,EAAE;IACjG,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/D,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,OAAO,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACvD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC,CAAC;AAIF,MAAM,aAAa,GAAG,CAAC,SAAqB,EAAU,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAOlF,MAAM,MAAM,GAAG,CAAC,UAAiC,EAAE,MAAmC,EAAa,EAAE;IACjG,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC9C,IAAI,WAA+B,CAAC;IACpC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;QACpC,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,aAAa,MAAM,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC,CAAC,aAAa,MAAM,YAAY,WAAW,EAAE,CAAC;QACnL,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9B,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9C,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC,CAAC;AAGF,MAAM,cAAc,GAAG,CAAC,UAAiC,EAA+B,EAAE;IACtF,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAChD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAYF,MAAM,SAAS,GAAG,CAAC,IAAgB,EAAE,IAAiB,EAAE,MAAe,EAAE,KAAa,EAAQ,EAAE;IAC5F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,OAAO;IACX,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;IACX,CAAC;IACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAC7B,CAAC;SAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACzK,CAAC;AACL,CAAC,CAAC;AAIF,MAAM,QAAQ,GAAG,CAAC,IAAgB,EAAE,WAAyC,EAAW,EAAE;IACtF,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1I,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACnC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACJ,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1F,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC7E,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;YAChC,CAAC;iBAAM,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC3E,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;YAC3B,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,WAAmB,EAAsB,EAAE;IACjE,MAAM,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAChD,IAAI,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,MAAwB,EAAE,SAA8B,EAAE,aAAsB,EAAa,EAAE,CAClH,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAa,EAAE;IAChC,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACxE,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,OAAO,gBAAgB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,CAAC;IACjJ,CAAC;IACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACrD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxF,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,OAAO,8BAA8B,QAAQ,kFAAkF,CAAC,CAAC,CAAC;IAC5L,CAAC;IACD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC3B,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,EAAE,kCAAkC,KAAK,CAAC,WAAW,2CAA2C,CAAC,CAAC,CAAC;IACjJ,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,4DAA4D,CAAC;QAC/I,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,+CAA+C,IAAI,8CAA8C,CAAC,CAAC,CAAC;IAClJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QAC3F,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,OAAO,wEAAwE,CAAC,CAAC,CAAC;IACzI,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC,CAAC,CAAC;AAIP,MAAM,iBAAiB,GAAG,CAAC,OAAmB,EAAE,IAAY,EAAE,IAAgB,EAAE,WAAyC,EAAE,UAAuB,EAAa,EAAE;IAC7J,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,KAAK,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC3C,SAAS;YACb,CAAC;YACD,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnB,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YACzF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CACrB,GAAiB,EACjB,IAAgB,EAChB,YAAsC,EACtC,EAAU,EACV,KAAa,EACM,EAAE;IACrB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC;IACtE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,cAAc,EAAE,2DAA2D,CAAC,CAAC;IACpL,CAAC;IACD,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,EAAE,6CAA6C,YAAY,CAAC,MAAM,2DAA2D,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7L,CAAC;IACD,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,OAAO;QACV,CAAC,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,YAAY,CAAC,MAAM,sDAAsD,CAAC;QACnH,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,MAAM,qBAAqB,CAAC,CAAC;AACzG,CAAC,CAAC;AAGF,MAAM,UAAU,GAAG,CAAC,UAAiC,EAAE,IAAgB,EAAmD,EAAE;IACxH,MAAM,OAAO,GAAG,CAAC,MAA8B,EAAsB,EAAE;QACnE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC3C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACjI,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,YAAY,CAAC;IAC3C,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;QACrD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACvD,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3F,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,OAAmB,EAAE,IAAgB,EAAE,KAA0C,EAAa,EAAE;IACvH,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvC,OAAO,gBAAgB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAa,EAAE;QACrE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,KAAK,CAAC;QAC3G,IAAI,EAAE,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC;YAC9E,OAAO,EAAE,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QACpF,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,gBAAgB,MAAM,CAAC,EAAE,CAAC,cAAc,MAAM,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC,CAAC;IAC1K,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAIF,MAAM,aAAa,GAAG,CAAC,OAAmB,EAAE,IAAgB,EAAa,EAAE;IACvE,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9J,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACd,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,gBAAgB,CAAC,kEAAkE,CAAC,CAAC,CAAC;IAC1J,CAAC;IACD,MAAM,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrJ,MAAM,QAAQ,GAAG,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC/F,MAAM,KAAK,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC;IACvF,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACZ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,mEAAmE,CAAC,CAAC,CAAC;IAC3I,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,OAAmB,EAAa,EAAE;IACzD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAA+B,CAAC;IACpC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,aAAa,OAAO,CAAC,MAAM,EAAE,CAAC;QACtF,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3I,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7E,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,OAAO,EAAE,CAAC;YAC7E,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,KAAK,2GAA2G,CAAC,CAAC,CAAC;QAC9K,CAAC;QACD,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;YAClG,YAAY,IAAI,CAAC,CAAC;YAClB,WAAW,KAAK,KAAK,CAAC;QAC1B,CAAC;IACL,CAAC;IACD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC5B,QAAQ,CAAC,IAAI,CACT,OAAO,CAAC,eAAe,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,IAAI,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,mHAAmH,CAAC,CAC5O,CAAC;IACN,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,IAAgB,EAAE,WAAyC,EAAa,EAAE,CAC/F,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC;KAC1B,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,iBAAiB,CAAC,KAAK,SAAS,CAAC;KACjF,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;IACb,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,OAAO,EAAE,KAAK,CAAC,CAAC;IAE7E,MAAM,KAAK,GAAG,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC,qBAAqB,EAAE,KAAK,EAAE,4CAA4C,OAAO,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC;AACrJ,CAAC,CAAC,CAAC;AAEX,MAAM,YAAY,GAAG,CAAC,IAAgB,EAAE,SAA8B,EAAE,WAAyC,EAAa,EAAE,CAC5H,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACtC,IAAI,MAAM,KAAK,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAChF,OAAO,EAAE,CAAC;IACd,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,YAAY,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,wBAAwB,MAAM,8DAA8D,CAAC,CAAC,CAAC;AAC3L,CAAC,CAAC,CAAC;AAGP,MAAM,aAAa,GAAG,CAAC,OAAmB,EAAE,OAAsD,EAAa,EAAE,CAC7G,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;IACtB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,OAAO,CAAC,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;AAClK,CAAC,CAAC,CAAC;AAEP,MAAM,QAAQ,GAAG,CAAC,KAAiB,EAA8B,EAAE;IAC/D,IAAI,CAAC;QACD,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,yDAAyD,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACzJ,CAAC;QACD,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAiB,EAAe,EAAE;IACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,IAAI,uBAAuB,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC9C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC/C,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC/F,MAAM,UAAU,GAAG,CAAC,IAAY,EAA0B,EAAE;QACxD,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC3E,OAAO,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACjF,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,CAAC,IAAgB,EAAU,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAE7F,MAAM,OAAO,GAAG,QAAQ;SACnB,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;SACnG,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IACP,MAAM,SAAS,GAAG,IAAI,GAAG,CACrB,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAC3J,CAAC;IACF,MAAM,OAAO,GAAe,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACnF,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,IAAI,gBAAgB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,EAAE,0BAA0B,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,QAAQ,CAAC,IAAI,CACT,GAAG,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,EAC7C,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,EAC/H,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,EAClE,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,EAClC,GAAG,qBAAqB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC,EACnD,GAAG,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,EACrC,GAAG,iBAAiB,CAAC,OAAO,CAAC,EAC7B,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,EAC1C,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAClC,CAAC;IAGF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAClK,OAAO;QACH,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC;QAC3C,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzG,KAAK;KACR,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type Severity = "error" | "warning";
|
|
2
|
+
export interface Finding {
|
|
3
|
+
readonly severity: Severity;
|
|
4
|
+
readonly rule: string;
|
|
5
|
+
readonly where: string;
|
|
6
|
+
readonly message: string;
|
|
7
|
+
}
|
|
8
|
+
export interface CheckReport {
|
|
9
|
+
readonly format: string;
|
|
10
|
+
readonly extent?: string | undefined;
|
|
11
|
+
readonly findings: Finding[];
|
|
12
|
+
readonly notes: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare const error: (rule: string, where: string, message: string) => Finding;
|
|
15
|
+
export declare const warning: (rule: string, where: string, message: string) => Finding;
|
|
16
|
+
export declare const plural: (count: number, noun: string, nouns?: string) => string;
|
|
17
|
+
export declare const excerpt: (text: string, max?: number) => string;
|
|
18
|
+
export declare const leftoverText: (text: string, where: string) => Finding[];
|
|
19
|
+
export declare const inches: (emu: number) => string;
|
|
20
|
+
//# sourceMappingURL=finding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding.d.ts","sourceRoot":"","sources":["../../../src/lib/check/finding.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAE3C,MAAM,WAAW,OAAO;IACpB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAE5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;IAE7B,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,eAAO,MAAM,KAAK,SAAU,MAAM,SAAS,MAAM,WAAW,MAAM,KAAG,OAAwD,CAAC;AAC9H,eAAO,MAAM,OAAO,SAAU,MAAM,SAAS,MAAM,WAAW,MAAM,KAAG,OAA0D,CAAC;AAElI,eAAO,MAAM,MAAM,UAAW,MAAM,QAAQ,MAAM,qBAAuB,MAAkD,CAAC;AAG5H,eAAO,MAAM,OAAO,SAAU,MAAM,mBAAa,MAGhD,CAAC;AAYF,eAAO,MAAM,YAAY,SAAU,MAAM,SAAS,MAAM,KAAG,OAAO,EAUjE,CAAC;AAKF,eAAO,MAAM,MAAM,QAAS,MAAM,KAAG,MAAyD,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const error = (rule, where, message) => ({ severity: "error", rule, where, message });
|
|
2
|
+
export const warning = (rule, where, message) => ({ severity: "warning", rule, where, message });
|
|
3
|
+
export const plural = (count, noun, nouns = `${noun}s`) => `${count} ${count === 1 ? noun : nouns}`;
|
|
4
|
+
export const excerpt = (text, max = 60) => {
|
|
5
|
+
const line = text.replaceAll(/\s+/g, " ").trim();
|
|
6
|
+
return `"${line.length > max ? `${line.slice(0, max - 1)}…` : line}"`;
|
|
7
|
+
};
|
|
8
|
+
const LEFTOVER_CERTAIN = [
|
|
9
|
+
/\bClick (?:or tap )?(?:here )?(?:to|icon to) (?:add|edit|enter|insert)\b[^.\n]*/i,
|
|
10
|
+
/\bLorem ipsum\b/i,
|
|
11
|
+
/\bError! (?:Reference source not found|Bookmark not defined|No table of contents entries found|Not a valid)[^.\n]*/,
|
|
12
|
+
];
|
|
13
|
+
const LEFTOVER_LIKELY = [/\b(?:TODO|FIXME|TBD|XXX)\b/, /\{\{[^{}\n]{1,40}\}\}/, /\[(?:insert|add|your|placeholder)\b[^\]\n]{0,40}\]/i];
|
|
14
|
+
export const leftoverText = (text, where) => {
|
|
15
|
+
const certain = LEFTOVER_CERTAIN.map((pattern) => pattern.exec(text)?.[0]).find((match) => match !== undefined);
|
|
16
|
+
if (certain !== undefined) {
|
|
17
|
+
return [error("leftover-text", where, `leftover template text ${excerpt(certain)}: replace it with the real content or delete it`)];
|
|
18
|
+
}
|
|
19
|
+
const likely = LEFTOVER_LIKELY.map((pattern) => pattern.exec(text)?.[0]).find((match) => match !== undefined);
|
|
20
|
+
if (likely !== undefined) {
|
|
21
|
+
return [warning("leftover-text", where, `looks like a note left for later: ${excerpt(likely)}`)];
|
|
22
|
+
}
|
|
23
|
+
return [];
|
|
24
|
+
};
|
|
25
|
+
const EMU_PER_INCH = 914_400;
|
|
26
|
+
export const inches = (emu) => `${Number((emu / EMU_PER_INCH).toFixed(2))} in`;
|
|
27
|
+
//# sourceMappingURL=finding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding.js","sourceRoot":"","sources":["../../../src/lib/check/finding.ts"],"names":[],"mappings":"AA0BA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,OAAe,EAAW,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAC9H,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,OAAe,EAAW,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAElI,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,KAAK,GAAG,GAAG,IAAI,GAAG,EAAU,EAAE,CAAC,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AAG5H,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,GAAG,GAAG,EAAE,EAAU,EAAE;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,OAAO,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AAC1E,CAAC,CAAC;AAIF,MAAM,gBAAgB,GAAsB;IACxC,kFAAkF;IAClF,kBAAkB;IAClB,oHAAoH;CACvH,CAAC;AACF,MAAM,eAAe,GAAsB,CAAC,4BAA4B,EAAE,uBAAuB,EAAE,qDAAqD,CAAC,CAAC;AAG1J,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,KAAa,EAAa,EAAE;IACnE,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAChH,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,EAAE,0BAA0B,OAAO,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,CAAC;IACxI,CAAC;IACD,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAC9G,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,EAAE,qCAAqC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,OAAO,CAAC;AAG7B,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC"}
|