From 24f23b5b12239f2922f4cef960cb009b5e75f22e Mon Sep 17 00:00:00 2001 From: gjulivan Date: Wed, 2 Apr 2025 00:38:10 +0200 Subject: [PATCH 1/8] feat(docviewer): add docx support --- .../components/DocxViewer.tsx | 74 ++++++ .../components/ErrorViewer.tsx | 17 ++ .../components/PDFViewer.tsx | 57 +++++ .../components/documentRenderer.ts | 6 + .../document-viewer-web/components/index.ts | 4 + .../document-viewer-web/package.json | 2 + .../src/DocumentViewer.tsx | 49 +--- .../document-viewer-web/store/index.ts | 6 + .../utils/useRendererSelector.ts | 43 ++++ pnpm-lock.yaml | 222 ++++++++++++++++++ 10 files changed, 438 insertions(+), 42 deletions(-) create mode 100644 packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx create mode 100644 packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx create mode 100644 packages/pluggableWidgets/document-viewer-web/components/PDFViewer.tsx create mode 100644 packages/pluggableWidgets/document-viewer-web/components/documentRenderer.ts create mode 100644 packages/pluggableWidgets/document-viewer-web/components/index.ts create mode 100644 packages/pluggableWidgets/document-viewer-web/store/index.ts create mode 100644 packages/pluggableWidgets/document-viewer-web/utils/useRendererSelector.ts diff --git a/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx new file mode 100644 index 0000000000..8732ca31c9 --- /dev/null +++ b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx @@ -0,0 +1,74 @@ +import { createElement, Fragment, useCallback, useEffect, useState } from "react"; +import mammoth from "mammoth"; +import { DocumentViewerContainerProps } from "typings/DocumentViewerProps"; +import { DocRendererElement } from "./documentRenderer"; + +const DocxViewer: DocRendererElement = (props: DocumentViewerContainerProps) => { + const { file } = props; + const [docxHtml, setDocxHtml] = useState(null); + + const loadContent = useCallback(async (arrayBuffer: any) => { + try { + mammoth + .convertToHtml( + { arrayBuffer: arrayBuffer }, + { + includeDefaultStyleMap: true + } + ) + .then(result => { + if (result) { + setDocxHtml(result.value); + } + }); + } catch (error) {} + }, []); + + useEffect(() => { + const controller = new AbortController(); + const { signal } = controller; + if (file.status === "available" && file.value.uri) { + fetch(file.value.uri, { method: "GET", signal }) + .then(res => res.arrayBuffer()) + .then(response => { + loadContent(response); + }); + } + + return () => { + controller.abort(); + }; + }, [file, file?.status, file?.value?.uri]); + + return ( + + {docxHtml && ( +
+ {/* {docHtmlStr} */} +
+ )} +
+ ); +}; + +DocxViewer.contentTypes = [ + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/msword", + "application/vnd.ms-word", + "application/vnd.ms-word.document.macroEnabled.12", + "application/vnd.openxmlformats-officedocument.wordprocessingml.template", + "application/vnd.ms-word.template.macroEnabled.12", + "application/vnd.ms-word.document.12", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/octet-stream" +]; + +export default DocxViewer; diff --git a/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx b/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx new file mode 100644 index 0000000000..f35a4dfbc2 --- /dev/null +++ b/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx @@ -0,0 +1,17 @@ +import { createElement, Fragment, useContext } from "react"; +import { DocumentContext } from "store"; +import { DocRendererElement } from "./documentRenderer"; + +const ErrorViewer: DocRendererElement = () => { + const props = useContext(DocumentContext); + console.log("ErrorViewer", props); + return ( + +
No document selected
+
+ ); +}; + +ErrorViewer.contentTypes = []; + +export default ErrorViewer; diff --git a/packages/pluggableWidgets/document-viewer-web/components/PDFViewer.tsx b/packages/pluggableWidgets/document-viewer-web/components/PDFViewer.tsx new file mode 100644 index 0000000000..253fa4432f --- /dev/null +++ b/packages/pluggableWidgets/document-viewer-web/components/PDFViewer.tsx @@ -0,0 +1,57 @@ +import { createElement, Fragment, useEffect, useState } from "react"; +import { Document, Page, pdfjs } from "react-pdf"; +import "react-pdf/dist/Page/AnnotationLayer.css"; +import "react-pdf/dist/Page/TextLayer.css"; +import { DocumentViewerContainerProps } from "../typings/DocumentViewerProps"; +import { DocRendererElement } from "./documentRenderer"; +pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`; +const options = { + cMapUrl: `https://unpkg.com/pdfjs-dist@${pdfjs.version}/cmaps/`, + standardFontDataUrl: `https://unpkg.com/pdfjs-dist@${pdfjs.version}/standard_fonts` +}; + +const PDFViewer: DocRendererElement = (props: DocumentViewerContainerProps) => { + const { file } = props; + const [numberOfPages, setNumberOfPages] = useState(1); + const [currentPage, setCurrentPage] = useState(1); + const [pdfUrl, setPdfUrl] = useState(null); + + if (!file.value?.uri) { + return
No document selected
; + } + + useEffect(() => { + if (file.status === "available" && file.value.uri) { + setPdfUrl(file.value.uri); + } + }, [file, file.status, file.value.uri]); + + function onDocumentLoadSuccess({ numPages }: { numPages: number }): void { + setNumberOfPages(numPages); + } + + return ( + +
+ + + Page {currentPage} of {numberOfPages} + + +
+
+ {pdfUrl && ( + + + + )} +
+
+ ); +}; + +PDFViewer.contentTypes = ["application/pdf", "application/x-pdf", "application/acrobat", "text/pdf"]; + +export default PDFViewer; diff --git a/packages/pluggableWidgets/document-viewer-web/components/documentRenderer.ts b/packages/pluggableWidgets/document-viewer-web/components/documentRenderer.ts new file mode 100644 index 0000000000..ac35499b51 --- /dev/null +++ b/packages/pluggableWidgets/document-viewer-web/components/documentRenderer.ts @@ -0,0 +1,6 @@ +import { FC } from "react"; +import { DocumentViewerContainerProps } from "typings/DocumentViewerProps"; + +export interface DocRendererElement extends FC { + contentTypes: string[]; +} diff --git a/packages/pluggableWidgets/document-viewer-web/components/index.ts b/packages/pluggableWidgets/document-viewer-web/components/index.ts new file mode 100644 index 0000000000..8aa1d61991 --- /dev/null +++ b/packages/pluggableWidgets/document-viewer-web/components/index.ts @@ -0,0 +1,4 @@ +import Docxviewer from "./Docxviewer"; +import PDFViewer from "./PDFViewer"; + +export const DocumentRenderers = [Docxviewer, PDFViewer]; diff --git a/packages/pluggableWidgets/document-viewer-web/package.json b/packages/pluggableWidgets/document-viewer-web/package.json index 1acf035d1d..aae4ffefcc 100644 --- a/packages/pluggableWidgets/document-viewer-web/package.json +++ b/packages/pluggableWidgets/document-viewer-web/package.json @@ -35,6 +35,8 @@ }, "dependencies": { "classnames": "^2.3.2", + "mammoth": "^1.9.0", + "pdfjs-dist": "^5.0.375", "react-pdf": "^9.2.1" }, "devDependencies": { diff --git a/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.tsx b/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.tsx index c76903d720..192df34aff 100644 --- a/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.tsx +++ b/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.tsx @@ -1,49 +1,14 @@ -import { createElement, ReactElement, useState } from "react"; +import { createElement, ReactElement } from "react"; +import { DocumentContext } from "../store"; import { DocumentViewerContainerProps } from "../typings/DocumentViewerProps"; -import { Document, Page, pdfjs } from "react-pdf"; -import "react-pdf/dist/Page/AnnotationLayer.css"; -import "react-pdf/dist/Page/TextLayer.css"; - -pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`; -const options = { - cMapUrl: `https://unpkg.com/pdfjs-dist@${pdfjs.version}/cmaps/`, - standardFontDataUrl: `https://unpkg.com/pdfjs-dist@${pdfjs.version}/standard_fonts` -}; +import { useRendererSelector } from "../utils/useRendererSelector"; export default function DocumentViewer(props: DocumentViewerContainerProps): ReactElement { - const [numberOfPages, setNumberOfPages] = useState(1); - const [currentPage, setCurrentPage] = useState(1); - const [pdfUrl, setPdfUrl] = useState(null); - - // Load PDF when URL changes - if (props.file.value?.uri && !pdfUrl) { - setPdfUrl(props.file.value.uri); - } - - if (!props.file.value?.uri) { - return
No document selected
; - } - - function onDocumentLoadSuccess({ numPages }: { numPages: number }): void { - setNumberOfPages(numPages); - } + const { CurrentRenderer } = useRendererSelector(props); return ( -
-
- - - Page {currentPage} of {numberOfPages} - - -
-
- - - -
-
+ +
{CurrentRenderer && }
+
); } diff --git a/packages/pluggableWidgets/document-viewer-web/store/index.ts b/packages/pluggableWidgets/document-viewer-web/store/index.ts new file mode 100644 index 0000000000..00434bf02f --- /dev/null +++ b/packages/pluggableWidgets/document-viewer-web/store/index.ts @@ -0,0 +1,6 @@ +import { createContext } from "react"; +import { DocumentViewerContainerProps } from "typings/DocumentViewerProps"; + +const DocumentContext = createContext({} as DocumentViewerContainerProps); + +export { DocumentContext }; diff --git a/packages/pluggableWidgets/document-viewer-web/utils/useRendererSelector.ts b/packages/pluggableWidgets/document-viewer-web/utils/useRendererSelector.ts new file mode 100644 index 0000000000..d83645a415 --- /dev/null +++ b/packages/pluggableWidgets/document-viewer-web/utils/useRendererSelector.ts @@ -0,0 +1,43 @@ +import { useEffect, useState } from "react"; + +import { DocumentRenderers } from "../components"; +import { DocRendererElement } from "../components/documentRenderer"; +import ErrorViewer from "../components/ErrorViewer"; +import { DocumentViewerContainerProps } from "../typings/DocumentViewerProps"; + +interface DocumentRenderer { + CurrentRenderer: DocRendererElement; +} + +export function useRendererSelector(props: DocumentViewerContainerProps): DocumentRenderer { + const { file } = props; + const [component, setComponent] = useState(() => ErrorViewer); + useEffect(() => { + const controller = new AbortController(); + const { signal } = controller; + if (file.status === "available" && file.value.uri) { + fetch(file.value.uri, { method: "HEAD", signal }).then(response => { + const contentTypeRaw = response.headers.get("content-type"); + const contentTypes = contentTypeRaw?.split(";") || []; + const contentType = contentTypes.length ? contentTypes[0] : undefined; + + if (contentType) { + const selectedRenderer: DocRendererElement[] = []; + DocumentRenderers.forEach(renderer => { + if (renderer.contentTypes.includes(contentType)) { + selectedRenderer.push(renderer); + } + }); + if (selectedRenderer.length > 0) { + setComponent(() => selectedRenderer[0]); + } + } + }); + } + + return () => { + controller.abort(); + }; + }, [file, file?.status, file?.value?.uri]); + return { CurrentRenderer: component }; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5fccda91aa..7491f21f4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1293,6 +1293,12 @@ importers: classnames: specifier: ^2.3.2 version: 2.3.2 + mammoth: + specifier: ^1.9.0 + version: 1.9.0 + pdfjs-dist: + specifier: ^5.0.375 + version: 5.1.91 react-pdf: specifier: ^9.2.1 version: 9.2.1(@types/react@18.2.36)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -4019,6 +4025,70 @@ packages: engines: {node: '>=20'} hasBin: true + '@napi-rs/canvas-android-arm64@0.1.68': + resolution: {integrity: sha512-h1KcSR4LKLfRfzeBH65xMxbWOGa1OtMFQbCMVlxPCkN1Zr+2gK+70pXO5ktojIYcUrP6KDcOwoc8clho5ccM/w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/canvas-darwin-arm64@0.1.68': + resolution: {integrity: sha512-/VURlrAD4gDoxW1GT/b0nP3fRz/fhxmHI/xznTq2FTwkQLPOlLkDLCvTmQ7v6LtGKdc2Ed6rvYpRan+JXThInQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/canvas-darwin-x64@0.1.68': + resolution: {integrity: sha512-tEpvGR6vCLTo1Tx9wmDnoOKROpw57wiCWwCpDOuVlj/7rqEJOUYr9ixW4aRJgmeGBrZHgevI0EURys2ER6whmg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.68': + resolution: {integrity: sha512-U9xbJsumPOiAYeAFZMlHf62b9dGs2HJ6Q5xt7xTB0uEyPeurwhgYBWGgabdsEidyj38YuzI/c3LGBbSQB3vagw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/canvas-linux-arm64-gnu@0.1.68': + resolution: {integrity: sha512-KFkn8wEm3mPnWD4l8+OUUkxylSJuN5q9PnJRZJgv15RtCA1bgxIwTkBhI/+xuyVMcHqON9sXq7cDkEJtHm35dg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-arm64-musl@0.1.68': + resolution: {integrity: sha512-IQzts91rCdOALXBWQxLZRCEDrfFTGDtNRJMNu+2SKZ1uT8cmPQkPwVk5rycvFpvgAcmiFiOSCp1aRrlfU8KPpQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.68': + resolution: {integrity: sha512-e9AS5UttoIKqXSmBzKZdd3NErSVyOEYzJfNOCGtafGk1//gibTwQXGlSXmAKuErqMp09pyk9aqQRSYzm1AQfBw==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/canvas-linux-x64-gnu@0.1.68': + resolution: {integrity: sha512-Pa/I36VE3j57I3Obhrr+J48KGFfkZk2cJN/2NmW/vCgmoF7kCP6aTVq5n+cGdGWLd/cN9CJ9JvNwEoMRDghu0g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-linux-x64-musl@0.1.68': + resolution: {integrity: sha512-9c6rkc5195wNxuUHJdf4/mmnq433OQey9TNvQ9LspJazvHbfSkTij8wtKjASVQsJyPDva4fkWOeV/OQ7cLw0GQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-win32-x64-msvc@0.1.68': + resolution: {integrity: sha512-Fc5Dez23u0FoSATurT6/w1oMytiRnKWEinHivdMvXpge6nG4YvhrASrtqMk8dGJMVQpHr8QJYF45rOrx2YU2Aw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/canvas@0.1.68': + resolution: {integrity: sha512-LQESrePLEBLvhuFkXx9jjBXRC2ClYsO5mqQ1m/puth5z9SOuM3N/B3vDuqnC3RJFktDktyK9khGvo7dTkqO9uQ==} + engines: {node: '>= 10'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -5053,6 +5123,10 @@ packages: '@xml-tools/parser@1.0.11': resolution: {integrity: sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==} + '@xmldom/xmldom@0.8.10': + resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} + engines: {node: '>=10.0.0'} + '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -5479,6 +5553,9 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bluebird@3.4.7: + resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -6294,6 +6371,9 @@ packages: resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} engines: {node: '>=0.3.1'} + dingbat-to-unicode@1.0.1: + resolution: {integrity: sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -6383,6 +6463,8 @@ packages: dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + duck@0.1.12: + resolution: {integrity: sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==} dup@1.0.0: resolution: {integrity: sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA==} @@ -7500,6 +7582,9 @@ packages: engines: {node: '>=16.x'} hasBin: true + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + immutable@4.3.0: resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} @@ -8206,6 +8291,9 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + junk@1.0.3: resolution: {integrity: sha512-3KF80UaaSSxo8jVnRYtMKNGFOoVPBdkkVPsw+Ad0y4oxKXPduS6G6iHkrf69yJVff/VAaYXkV42rtZ7daJxU3w==} engines: {node: '>=0.10.0'} @@ -8254,6 +8342,9 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lighthouse-logger@1.4.2: resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} @@ -8396,6 +8487,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lop@0.4.2: + resolution: {integrity: sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -8440,6 +8534,11 @@ packages: makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + mammoth@1.9.0: + resolution: {integrity: sha512-F+0NxzankQV9XSUAuVKvkdQK0GbtGGuqVnND9aVf9VSeUA82LQa29GjLqYU6Eez8LHqSJG3eGiDW3224OKdpZg==} + engines: {node: '>=12.0.0'} + hasBin: true + map-limit@0.0.1: resolution: {integrity: sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==} @@ -8966,6 +9065,9 @@ packages: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} + option@0.2.4: + resolution: {integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==} + optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} @@ -9038,6 +9140,9 @@ packages: resolution: {integrity: sha512-gFL35q7kbE/zBaPA3UKhp2vSzcPYx2ecbYuwv1ucE9Il6IIgBDweBlH8D68UFGZic2MkllKa2KHCfC1IQBQUYA==} engines: {node: '>=12'} + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + parchment@3.0.0: resolution: {integrity: sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==} @@ -9121,6 +9226,10 @@ packages: resolution: {integrity: sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ==} engines: {node: '>=18'} + pdfjs-dist@5.1.91: + resolution: {integrity: sha512-qSIADdagooJB4wWCBnrBJjRvASevmxL0BwafvOuKJG5uTQdYoFBrhrRYnucKNiSc9qS6JIk0hC5y1yktFljXkA==} + engines: {node: '>=20'} + peggy@1.2.0: resolution: {integrity: sha512-PQ+NKpAobImfMprYQtc4Egmyi29bidRGEX0kKjCU5uuW09s0Cthwqhfy7mLkwcB4VcgacE5L/ZjruD/kOPCUUw==} engines: {node: '>=10'} @@ -10241,6 +10350,9 @@ packages: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -10991,6 +11103,11 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + underscore@1.13.7: + resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} @@ -11358,6 +11475,10 @@ packages: xml@1.0.1: resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + xmlbuilder@10.1.1: + resolution: {integrity: sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==} + engines: {node: '>=4.0'} + xmlbuilder@11.0.1: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} @@ -14307,6 +14428,50 @@ snapshots: - tslib - utf-8-validate + '@napi-rs/canvas-android-arm64@0.1.68': + optional: true + + '@napi-rs/canvas-darwin-arm64@0.1.68': + optional: true + + '@napi-rs/canvas-darwin-x64@0.1.68': + optional: true + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.68': + optional: true + + '@napi-rs/canvas-linux-arm64-gnu@0.1.68': + optional: true + + '@napi-rs/canvas-linux-arm64-musl@0.1.68': + optional: true + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.68': + optional: true + + '@napi-rs/canvas-linux-x64-gnu@0.1.68': + optional: true + + '@napi-rs/canvas-linux-x64-musl@0.1.68': + optional: true + + '@napi-rs/canvas-win32-x64-msvc@0.1.68': + optional: true + + '@napi-rs/canvas@0.1.68': + optionalDependencies: + '@napi-rs/canvas-android-arm64': 0.1.68 + '@napi-rs/canvas-darwin-arm64': 0.1.68 + '@napi-rs/canvas-darwin-x64': 0.1.68 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.68 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.68 + '@napi-rs/canvas-linux-arm64-musl': 0.1.68 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.68 + '@napi-rs/canvas-linux-x64-gnu': 0.1.68 + '@napi-rs/canvas-linux-x64-musl': 0.1.68 + '@napi-rs/canvas-win32-x64-msvc': 0.1.68 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -15984,6 +16149,8 @@ snapshots: dependencies: chevrotain: 7.1.1 + '@xmldom/xmldom@0.8.10': {} + '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} @@ -16514,6 +16681,8 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + bluebird@3.4.7: {} + boolbase@1.0.0: {} brace-expansion@1.1.11: @@ -17550,6 +17719,8 @@ snapshots: diff@5.0.0: {} + dingbat-to-unicode@1.0.1: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -17659,6 +17830,9 @@ snapshots: call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 + duck@0.1.12: + dependencies: + underscore: 1.13.7 dup@1.0.0: {} @@ -19137,6 +19311,8 @@ snapshots: dependencies: queue: 6.0.2 + immediate@3.0.6: {} + immutable@4.3.0: {} import-cwd@3.0.0: @@ -20223,6 +20399,13 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.1 + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + junk@1.0.3: {} katex@0.16.11: @@ -20261,6 +20444,10 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lie@3.3.0: + dependencies: + immediate: 3.0.6 + lighthouse-logger@1.4.2: dependencies: debug: 2.6.9 @@ -20386,6 +20573,12 @@ snapshots: dependencies: js-tokens: 4.0.0 + lop@0.4.2: + dependencies: + duck: 0.1.12 + option: 0.2.4 + underscore: 1.13.7 + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -20429,6 +20622,19 @@ snapshots: dependencies: tmpl: 1.0.5 + mammoth@1.9.0: + dependencies: + '@xmldom/xmldom': 0.8.10 + argparse: 1.0.10 + base64-js: 1.5.1 + bluebird: 3.4.7 + dingbat-to-unicode: 1.0.1 + jszip: 3.10.1 + lop: 0.4.2 + path-is-absolute: 1.0.1 + underscore: 1.13.7 + xmlbuilder: 10.1.1 + map-limit@0.0.1: dependencies: once: 1.3.3 @@ -21149,6 +21355,8 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 + option@0.2.4: {} + optionator@0.8.3: dependencies: deep-is: 0.1.4 @@ -21234,6 +21442,8 @@ snapshots: package-name-regex@2.0.6: {} + pako@1.0.11: {} + parchment@3.0.0: {} parent-module@1.0.1: @@ -21306,6 +21516,10 @@ snapshots: canvas: 3.1.0 path2d: 0.2.2 + pdfjs-dist@5.1.91: + optionalDependencies: + '@napi-rs/canvas': 0.1.68 + peggy@1.2.0: {} performance-now@2.1.0: {} @@ -23143,6 +23357,8 @@ snapshots: is-plain-object: 2.0.4 split-string: 3.1.0 + setimmediate@1.0.5: {} + setprototypeof@1.2.0: {} shallow-clone@3.0.1: @@ -24046,6 +24262,10 @@ snapshots: react-lifecycles-compat: 3.0.4 undici-types@6.21.0: {} + + underscore@1.13.7: {} + + undici-types@5.26.5: {} unicode-canonical-property-names-ecmascript@2.0.0: {} @@ -24482,6 +24702,8 @@ snapshots: xml@1.0.1: {} + xmlbuilder@10.1.1: {} + xmlbuilder@11.0.1: {} xmlchars@2.2.0: {} From 1a9c3ef7d9f9a298cbe311dcc3807df80c0ffff9 Mon Sep 17 00:00:00 2001 From: gjulivan Date: Wed, 2 Apr 2025 15:46:11 +0200 Subject: [PATCH 2/8] chore: refactoring and initial styling --- .../components/DocxViewer.tsx | 10 +------- .../components/ErrorViewer.tsx | 2 +- .../src/DocumentViewer.tsx | 6 ++++- .../ui/documentViewer.scss | 24 +++++++++++++++++++ 4 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 packages/pluggableWidgets/document-viewer-web/ui/documentViewer.scss diff --git a/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx index 8732ca31c9..cdd9f91ee7 100644 --- a/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx +++ b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx @@ -43,15 +43,7 @@ const DocxViewer: DocRendererElement = (props: DocumentViewerContainerProps) => return ( {docxHtml && ( -
+
{/* {docHtmlStr} */}
)} diff --git a/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx b/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx index f35a4dfbc2..9b2b27927b 100644 --- a/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx +++ b/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx @@ -7,7 +7,7 @@ const ErrorViewer: DocRendererElement = () => { console.log("ErrorViewer", props); return ( -
No document selected
+
No document selected
); }; diff --git a/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.tsx b/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.tsx index 192df34aff..2da95eeca4 100644 --- a/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.tsx +++ b/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.tsx @@ -2,13 +2,17 @@ import { createElement, ReactElement } from "react"; import { DocumentContext } from "../store"; import { DocumentViewerContainerProps } from "../typings/DocumentViewerProps"; import { useRendererSelector } from "../utils/useRendererSelector"; +import "../ui/DocumentViewer.scss"; +import classNames from "classnames"; export default function DocumentViewer(props: DocumentViewerContainerProps): ReactElement { const { CurrentRenderer } = useRendererSelector(props); return ( -
{CurrentRenderer && }
+
+ {CurrentRenderer && } +
); } diff --git a/packages/pluggableWidgets/document-viewer-web/ui/documentViewer.scss b/packages/pluggableWidgets/document-viewer-web/ui/documentViewer.scss new file mode 100644 index 0000000000..c31e9aca54 --- /dev/null +++ b/packages/pluggableWidgets/document-viewer-web/ui/documentViewer.scss @@ -0,0 +1,24 @@ +$root: widget-document-viewer; + +:root { + --document-viewer-negative-margin: calc(-1 * var(--form-input-padding-x)); +} + +.widget-document-viewer { + display: flex; + flex-direction: column; + + &-controls { + margin: calc(-1 * var(--form-input-padding-y)) calc(-1 * var(--form-input-padding-x)); + margin-bottom: 0; + padding: var(--form-input-padding-y) var(--form-input-padding-x); + background-color: var(--gray-lighter); + } + + &-content { + margin: var(--spacing-large); + padding: var(--spacing-medium); + border: 1px solid var(--gray-darker); + border-radius: var(--border-radius-default); + } +} From 471a346db581ab5e10099dba329f6d5963b25099 Mon Sep 17 00:00:00 2001 From: gjulivan Date: Mon, 7 Apr 2025 16:01:06 +0200 Subject: [PATCH 3/8] chore(docviewer): cleanup mammoth js --- .../components/DocxViewer.tsx | 53 +------- .../components/ErrorViewer.tsx | 2 +- .../components/documentRenderer.ts | 2 +- .../document-viewer-web/package.json | 1 - .../document-viewer-web/rollup.config.js | 27 +++- pnpm-lock.yaml | 118 ++---------------- 6 files changed, 41 insertions(+), 162 deletions(-) diff --git a/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx index cdd9f91ee7..5fc7eba2fd 100644 --- a/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx +++ b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx @@ -1,54 +1,9 @@ -import { createElement, Fragment, useCallback, useEffect, useState } from "react"; -import mammoth from "mammoth"; -import { DocumentViewerContainerProps } from "typings/DocumentViewerProps"; +import { createElement, Fragment } from "react"; +import { DocumentViewerContainerProps } from "../typings/DocumentViewerProps"; import { DocRendererElement } from "./documentRenderer"; -const DocxViewer: DocRendererElement = (props: DocumentViewerContainerProps) => { - const { file } = props; - const [docxHtml, setDocxHtml] = useState(null); - - const loadContent = useCallback(async (arrayBuffer: any) => { - try { - mammoth - .convertToHtml( - { arrayBuffer: arrayBuffer }, - { - includeDefaultStyleMap: true - } - ) - .then(result => { - if (result) { - setDocxHtml(result.value); - } - }); - } catch (error) {} - }, []); - - useEffect(() => { - const controller = new AbortController(); - const { signal } = controller; - if (file.status === "available" && file.value.uri) { - fetch(file.value.uri, { method: "GET", signal }) - .then(res => res.arrayBuffer()) - .then(response => { - loadContent(response); - }); - } - - return () => { - controller.abort(); - }; - }, [file, file?.status, file?.value?.uri]); - - return ( - - {docxHtml && ( -
- {/* {docHtmlStr} */} -
- )} -
- ); +const DocxViewer: DocRendererElement = (_props: DocumentViewerContainerProps) => { + return DOCX; }; DocxViewer.contentTypes = [ diff --git a/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx b/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx index 9b2b27927b..87a53c92d8 100644 --- a/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx +++ b/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx @@ -1,5 +1,5 @@ import { createElement, Fragment, useContext } from "react"; -import { DocumentContext } from "store"; +import { DocumentContext } from "../store"; import { DocRendererElement } from "./documentRenderer"; const ErrorViewer: DocRendererElement = () => { diff --git a/packages/pluggableWidgets/document-viewer-web/components/documentRenderer.ts b/packages/pluggableWidgets/document-viewer-web/components/documentRenderer.ts index ac35499b51..25458f76da 100644 --- a/packages/pluggableWidgets/document-viewer-web/components/documentRenderer.ts +++ b/packages/pluggableWidgets/document-viewer-web/components/documentRenderer.ts @@ -1,5 +1,5 @@ import { FC } from "react"; -import { DocumentViewerContainerProps } from "typings/DocumentViewerProps"; +import { DocumentViewerContainerProps } from "../typings/DocumentViewerProps"; export interface DocRendererElement extends FC { contentTypes: string[]; diff --git a/packages/pluggableWidgets/document-viewer-web/package.json b/packages/pluggableWidgets/document-viewer-web/package.json index aae4ffefcc..e3cc00fa80 100644 --- a/packages/pluggableWidgets/document-viewer-web/package.json +++ b/packages/pluggableWidgets/document-viewer-web/package.json @@ -35,7 +35,6 @@ }, "dependencies": { "classnames": "^2.3.2", - "mammoth": "^1.9.0", "pdfjs-dist": "^5.0.375", "react-pdf": "^9.2.1" }, diff --git a/packages/pluggableWidgets/document-viewer-web/rollup.config.js b/packages/pluggableWidgets/document-viewer-web/rollup.config.js index 9cb6e7e959..184fbac87d 100644 --- a/packages/pluggableWidgets/document-viewer-web/rollup.config.js +++ b/packages/pluggableWidgets/document-viewer-web/rollup.config.js @@ -1,6 +1,29 @@ +import commonjs from "@rollup/plugin-commonjs"; + export default args => { - return args.configDefaultConfig.map((config, _index) => { + const result = args.configDefaultConfig; + return result.map((config, _index) => { config.output.inlineDynamicImports = true; - return config; + if (config.output.format !== "es") { + return config; + } + return { + ...config, + plugins: config.plugins.map(plugin => { + if (plugin && plugin.name === "commonjs") { + // replace common js plugin that transforms + // external requires to imports + // this is needed in order to work with modern client + return commonjs({ + extensions: [".js", ".jsx", ".tsx", ".ts"], + transformMixedEsModules: true, + requireReturnsDefault: "auto", + esmExternals: true + }); + } + + return plugin; + }) + }; }); }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7491f21f4f..83430dc71e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1293,9 +1293,6 @@ importers: classnames: specifier: ^2.3.2 version: 2.3.2 - mammoth: - specifier: ^1.9.0 - version: 1.9.0 pdfjs-dist: specifier: ^5.0.375 version: 5.1.91 @@ -5123,10 +5120,6 @@ packages: '@xml-tools/parser@1.0.11': resolution: {integrity: sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==} - '@xmldom/xmldom@0.8.10': - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} - engines: {node: '>=10.0.0'} - '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -5553,9 +5546,6 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - bluebird@3.4.7: - resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -6371,9 +6361,6 @@ packages: resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} engines: {node: '>=0.3.1'} - dingbat-to-unicode@1.0.1: - resolution: {integrity: sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -7582,9 +7569,6 @@ packages: engines: {node: '>=16.x'} hasBin: true - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - immutable@4.3.0: resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} @@ -8291,9 +8275,6 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - junk@1.0.3: resolution: {integrity: sha512-3KF80UaaSSxo8jVnRYtMKNGFOoVPBdkkVPsw+Ad0y4oxKXPduS6G6iHkrf69yJVff/VAaYXkV42rtZ7daJxU3w==} engines: {node: '>=0.10.0'} @@ -8342,9 +8323,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - lighthouse-logger@1.4.2: resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} @@ -8487,9 +8465,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lop@0.4.2: - resolution: {integrity: sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==} - lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -8534,11 +8509,6 @@ packages: makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - mammoth@1.9.0: - resolution: {integrity: sha512-F+0NxzankQV9XSUAuVKvkdQK0GbtGGuqVnND9aVf9VSeUA82LQa29GjLqYU6Eez8LHqSJG3eGiDW3224OKdpZg==} - engines: {node: '>=12.0.0'} - hasBin: true - map-limit@0.0.1: resolution: {integrity: sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==} @@ -9065,9 +9035,6 @@ packages: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} - option@0.2.4: - resolution: {integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==} - optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} @@ -9140,9 +9107,6 @@ packages: resolution: {integrity: sha512-gFL35q7kbE/zBaPA3UKhp2vSzcPYx2ecbYuwv1ucE9Il6IIgBDweBlH8D68UFGZic2MkllKa2KHCfC1IQBQUYA==} engines: {node: '>=12'} - pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - parchment@3.0.0: resolution: {integrity: sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==} @@ -10350,9 +10314,6 @@ packages: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} - setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -11103,11 +11064,6 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - underscore@1.13.7: - resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} @@ -11475,10 +11431,6 @@ packages: xml@1.0.1: resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} - xmlbuilder@10.1.1: - resolution: {integrity: sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==} - engines: {node: '>=4.0'} - xmlbuilder@11.0.1: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} @@ -14084,8 +14036,8 @@ snapshots: semver: 7.7.1 shelljs: 0.8.5 shx: 0.3.4 - ts-jest: 29.2.6(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.21.0))(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2)))(typescript@5.8.2) - ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.1.6) + ts-jest: 29.2.6(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2)))(typescript@5.8.2) + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2) typescript: 5.8.2 xml2js: 0.6.2 zip-a-folder: 0.0.12 @@ -14138,7 +14090,7 @@ snapshots: '@types/react-dom': 18.2.14 '@types/react-native': 0.72.8(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.1.6)) '@types/testing-library__jest-dom': 5.14.9 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.8.2))(eslint@7.32.0)(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.1.6))(eslint@7.32.0)(typescript@5.1.6) '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@5.8.2) ansi-colors: 4.1.1 babel-eslint: 10.1.0(eslint@7.32.0) @@ -16149,8 +16101,6 @@ snapshots: dependencies: chevrotain: 7.1.1 - '@xmldom/xmldom@0.8.10': {} - '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} @@ -16681,8 +16631,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - bluebird@3.4.7: {} - boolbase@1.0.0: {} brace-expansion@1.1.11: @@ -17147,7 +17095,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.1 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) copy-webpack-plugin@11.0.0(webpack@5.96.1): dependencies: @@ -17340,7 +17288,7 @@ snapshots: postcss-modules-values: 4.0.0(postcss@8.4.21) postcss-value-parser: 4.2.0 semver: 7.5.1 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) css-loader@6.7.3(webpack@5.96.1): dependencies: @@ -17719,8 +17667,6 @@ snapshots: diff@5.0.0: {} - dingbat-to-unicode@1.0.1: {} - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -19311,8 +19257,6 @@ snapshots: dependencies: queue: 6.0.2 - immediate@3.0.6: {} - immutable@4.3.0: {} import-cwd@3.0.0: @@ -19900,7 +19844,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.14.0 - ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.1.6) + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -20399,13 +20343,6 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.1 - jszip@3.10.1: - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - junk@1.0.3: {} katex@0.16.11: @@ -20444,10 +20381,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lie@3.3.0: - dependencies: - immediate: 3.0.6 - lighthouse-logger@1.4.2: dependencies: debug: 2.6.9 @@ -20573,12 +20506,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - lop@0.4.2: - dependencies: - duck: 0.1.12 - option: 0.2.4 - underscore: 1.13.7 - lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -20622,19 +20549,6 @@ snapshots: dependencies: tmpl: 1.0.5 - mammoth@1.9.0: - dependencies: - '@xmldom/xmldom': 0.8.10 - argparse: 1.0.10 - base64-js: 1.5.1 - bluebird: 3.4.7 - dingbat-to-unicode: 1.0.1 - jszip: 3.10.1 - lop: 0.4.2 - path-is-absolute: 1.0.1 - underscore: 1.13.7 - xmlbuilder: 10.1.1 - map-limit@0.0.1: dependencies: once: 1.3.3 @@ -21355,8 +21269,6 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - option@0.2.4: {} - optionator@0.8.3: dependencies: deep-is: 0.1.4 @@ -21442,8 +21354,6 @@ snapshots: package-name-regex@2.0.6: {} - pako@1.0.11: {} - parchment@3.0.0: {} parent-module@1.0.1: @@ -21740,7 +21650,7 @@ snapshots: yaml: 1.10.2 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.1.6) + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2) postcss-merge-longhand@5.1.7(postcss@8.4.31): dependencies: @@ -23200,7 +23110,7 @@ snapshots: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) optionalDependencies: sass: 1.58.3 @@ -23357,8 +23267,6 @@ snapshots: is-plain-object: 2.0.4 split-string: 3.1.0 - setimmediate@1.0.5: {} - setprototypeof@1.2.0: {} shallow-clone@3.0.1: @@ -23847,7 +23755,7 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) optionalDependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.15) @@ -24026,7 +23934,7 @@ snapshots: micromatch: 4.0.5 semver: 7.5.1 typescript: 5.1.6 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) ts-loader@9.4.2(typescript@5.1.6)(webpack@5.96.1): dependencies: @@ -24262,10 +24170,6 @@ snapshots: react-lifecycles-compat: 3.0.4 undici-types@6.21.0: {} - - underscore@1.13.7: {} - - undici-types@5.26.5: {} unicode-canonical-property-names-ecmascript@2.0.0: {} @@ -24702,8 +24606,6 @@ snapshots: xml@1.0.1: {} - xmlbuilder@10.1.1: {} - xmlbuilder@11.0.1: {} xmlchars@2.2.0: {} From d199f09bb3ce3b864ad110f55f4a710939721c89 Mon Sep 17 00:00:00 2001 From: gjulivan Date: Tue, 8 Apr 2025 11:02:17 +0200 Subject: [PATCH 4/8] chore(doc-viewer): reintroduce mammoth --- .../components/DocxViewer.tsx | 53 +++++++++++++++++-- .../components/ErrorViewer.tsx | 1 - .../document-viewer-web/package.json | 3 +- .../document-viewer-web/rollup.config.js | 47 +++++++++++----- 4 files changed, 84 insertions(+), 20 deletions(-) diff --git a/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx index 5fc7eba2fd..cdd9f91ee7 100644 --- a/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx +++ b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx @@ -1,9 +1,54 @@ -import { createElement, Fragment } from "react"; -import { DocumentViewerContainerProps } from "../typings/DocumentViewerProps"; +import { createElement, Fragment, useCallback, useEffect, useState } from "react"; +import mammoth from "mammoth"; +import { DocumentViewerContainerProps } from "typings/DocumentViewerProps"; import { DocRendererElement } from "./documentRenderer"; -const DocxViewer: DocRendererElement = (_props: DocumentViewerContainerProps) => { - return DOCX; +const DocxViewer: DocRendererElement = (props: DocumentViewerContainerProps) => { + const { file } = props; + const [docxHtml, setDocxHtml] = useState(null); + + const loadContent = useCallback(async (arrayBuffer: any) => { + try { + mammoth + .convertToHtml( + { arrayBuffer: arrayBuffer }, + { + includeDefaultStyleMap: true + } + ) + .then(result => { + if (result) { + setDocxHtml(result.value); + } + }); + } catch (error) {} + }, []); + + useEffect(() => { + const controller = new AbortController(); + const { signal } = controller; + if (file.status === "available" && file.value.uri) { + fetch(file.value.uri, { method: "GET", signal }) + .then(res => res.arrayBuffer()) + .then(response => { + loadContent(response); + }); + } + + return () => { + controller.abort(); + }; + }, [file, file?.status, file?.value?.uri]); + + return ( + + {docxHtml && ( +
+ {/* {docHtmlStr} */} +
+ )} +
+ ); }; DocxViewer.contentTypes = [ diff --git a/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx b/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx index 87a53c92d8..881623c0b2 100644 --- a/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx +++ b/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx @@ -4,7 +4,6 @@ import { DocRendererElement } from "./documentRenderer"; const ErrorViewer: DocRendererElement = () => { const props = useContext(DocumentContext); - console.log("ErrorViewer", props); return (
No document selected
diff --git a/packages/pluggableWidgets/document-viewer-web/package.json b/packages/pluggableWidgets/document-viewer-web/package.json index e3cc00fa80..831cbba7bc 100644 --- a/packages/pluggableWidgets/document-viewer-web/package.json +++ b/packages/pluggableWidgets/document-viewer-web/package.json @@ -42,6 +42,7 @@ "@babel/plugin-transform-class-properties": "^7.23.3", "@babel/plugin-transform-private-methods": "^7.23.3", "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@mendix/pluggable-widgets-tools": "^10.0.0" + "@mendix/pluggable-widgets-tools": "^10.0.0", + "@rollup/plugin-replace": "^6.0.2" } } diff --git a/packages/pluggableWidgets/document-viewer-web/rollup.config.js b/packages/pluggableWidgets/document-viewer-web/rollup.config.js index 184fbac87d..126825bde1 100644 --- a/packages/pluggableWidgets/document-viewer-web/rollup.config.js +++ b/packages/pluggableWidgets/document-viewer-web/rollup.config.js @@ -1,4 +1,5 @@ import commonjs from "@rollup/plugin-commonjs"; +import replace from "@rollup/plugin-replace"; export default args => { const result = args.configDefaultConfig; @@ -9,21 +10,39 @@ export default args => { } return { ...config, - plugins: config.plugins.map(plugin => { - if (plugin && plugin.name === "commonjs") { - // replace common js plugin that transforms - // external requires to imports - // this is needed in order to work with modern client - return commonjs({ - extensions: [".js", ".jsx", ".tsx", ".ts"], - transformMixedEsModules: true, - requireReturnsDefault: "auto", - esmExternals: true - }); - } + plugins: [ + ...config.plugins.map(plugin => { + if (plugin && plugin.name === "commonjs") { + // replace common js plugin that transforms + // external requires to imports + // this is needed in order to work with modern client + return commonjs({ + extensions: [".js", ".jsx", ".tsx", ".ts"], + transformMixedEsModules: true, + requireReturnsDefault: "auto", + esmExternals: true + }); + } - return plugin; - }) + return plugin; + }), + // rollup config for pdfjs-dist copying from https://github.com/unjs/unpdf/blob/main/pdfjs.rollup.config.ts + replace({ + delimiters: ["", ""], + preventAssignment: true, + values: { + // Disable the `window` check (for requestAnimationFrame). + "typeof window": '"undefined"', + // Imitate the Node.js environment for all serverless environments, unenv will + // take care of the remaining Node.js polyfills. Keep support for browsers. + "const isNodeJS = typeof": 'const isNodeJS = typeof document === "undefined" // typeof', + // Force inlining the PDF.js worker. + "await import(/*webpackIgnore: true*/this.workerSrc)": "__pdfjsWorker__", + // Tree-shake client worker initialization logic. + "!PDFWorkerUtil.isWorkerDisabled && !PDFWorker.#mainThreadWorkerMessageHandler": "false" + } + }) + ] }; }); }; From 4d60bd03aa3da65980ab613f68a474f14bf8553d Mon Sep 17 00:00:00 2001 From: gjulivan Date: Tue, 8 Apr 2025 20:30:34 +0200 Subject: [PATCH 5/8] chore(doc-viewer): include mammoth build internally --- .../components/DocxViewer.tsx | 7 +- .../components/ErrorViewer.tsx | 4 +- .../utils/mammoth.browser.js | 30354 ++++++++++++++++ .../rich-text-web/.eslintignore | 2 + pnpm-lock.yaml | 23 +- 5 files changed, 30374 insertions(+), 16 deletions(-) create mode 100644 packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.js create mode 100644 packages/pluggableWidgets/rich-text-web/.eslintignore diff --git a/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx index cdd9f91ee7..1d13e9a7b3 100644 --- a/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx +++ b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx @@ -1,6 +1,7 @@ import { createElement, Fragment, useCallback, useEffect, useState } from "react"; -import mammoth from "mammoth"; -import { DocumentViewerContainerProps } from "typings/DocumentViewerProps"; +// @ts-ignore implicit any +import mammoth from "../utils/mammoth.browser"; +import { DocumentViewerContainerProps } from "../typings/DocumentViewerProps"; import { DocRendererElement } from "./documentRenderer"; const DocxViewer: DocRendererElement = (props: DocumentViewerContainerProps) => { @@ -16,7 +17,7 @@ const DocxViewer: DocRendererElement = (props: DocumentViewerContainerProps) => includeDefaultStyleMap: true } ) - .then(result => { + .then((result: any) => { if (result) { setDocxHtml(result.value); } diff --git a/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx b/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx index 881623c0b2..eed24bb113 100644 --- a/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx +++ b/packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx @@ -1,9 +1,7 @@ -import { createElement, Fragment, useContext } from "react"; -import { DocumentContext } from "../store"; +import { createElement, Fragment } from "react"; import { DocRendererElement } from "./documentRenderer"; const ErrorViewer: DocRendererElement = () => { - const props = useContext(DocumentContext); return (
No document selected
diff --git a/packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.js b/packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.js new file mode 100644 index 0000000000..9bec5a13a5 --- /dev/null +++ b/packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.js @@ -0,0 +1,30354 @@ +// Module: @xmldom/xmldom@0.8.6 +// License: MIT +// +// Module: base64-js@1.5.1 +// License: MIT +// +// Module: buffer@4.9.1 +// License: MIT +// +// Module: dingbat-to-unicode@1.0.1 +// License: BSD-2-Clause +// +// Module: ieee754@1.1.8 +// License: BSD-3-Clause +// +// Module: isarray@1.0.0 +// License: MIT +// +// Module: jszip@3.7.1 +// License: (MIT OR GPL-3.0-or-later) +// +// Module: lop@0.4.2 +// License: BSD-2-Clause +// +// Module: mammoth@1.9.0 +// License: BSD-2-Clause +// +// Module: option@0.2.4 +// License: BSD-2-Clause +// +// Module: process@0.11.9 +// License: MIT +// +// Module: underscore@1.13.1 +// License: MIT +// +// Module: xmlbuilder@10.0.0 +// License: MIT +// +(function (f) { + if (typeof exports === "object" && typeof module !== "undefined") { + module.exports = f(); + } else if (typeof define === "function" && define.amd) { + define([], f); + } else { + var g; + if (typeof window !== "undefined") { + g = window; + } else if (typeof global !== "undefined") { + g = global; + } else if (typeof self !== "undefined") { + g = self; + } else { + g = this; + } + g.mammoth = f(); + } +})(function () { + var define, module, exports; + return (function e(t, n, r) { + function s(o, u) { + if (!n[o]) { + if (!t[o]) { + var a = typeof require == "function" && require; + if (!u && a) return a(o, !0); + if (i) return i(o, !0); + var f = new Error("Cannot find module '" + o + "'"); + throw ((f.code = "MODULE_NOT_FOUND"), f); + } + var l = (n[o] = { exports: {} }); + t[o][0].call( + l.exports, + function (e) { + var n = t[o][1][e]; + return s(n ? n : e); + }, + l, + l.exports, + e, + t, + n, + r + ); + } + return n[o].exports; + } + var i = typeof require == "function" && require; + for (var o = 0; o < r.length; o++) s(r[o]); + return s; + })( + { + 1: [ + function (require, module, exports) { + var promises = require("../../lib/promises"); + + exports.Files = Files; + + function Files() { + function read(uri) { + return promises.reject( + new Error( + "could not open external image: '" + + uri + + "'\ncannot open linked files from a web browser" + ) + ); + } + + return { + read: read + }; + } + }, + { "../../lib/promises": 23 } + ], + 2: [ + function (require, module, exports) { + var promises = require("../lib/promises"); + var zipfile = require("../lib/zipfile"); + + exports.openZip = openZip; + + function openZip(options) { + if (options.arrayBuffer) { + return promises.resolve(zipfile.openArrayBuffer(options.arrayBuffer)); + } else { + return promises.reject(new Error("Could not find file in options")); + } + } + }, + { "../lib/promises": 23, "../lib/zipfile": 40 } + ], + 3: [ + function (require, module, exports) { + var _ = require("underscore"); + + var promises = require("./promises"); + var documents = require("./documents"); + var htmlPaths = require("./styles/html-paths"); + var results = require("./results"); + var images = require("./images"); + var Html = require("./html"); + var writers = require("./writers"); + + exports.DocumentConverter = DocumentConverter; + + function DocumentConverter(options) { + return { + convertToHtml: function (element) { + var comments = _.indexBy( + element.type === documents.types.document ? element.comments : [], + "commentId" + ); + var conversion = new DocumentConversion(options, comments); + return conversion.convertToHtml(element); + } + }; + } + + function DocumentConversion(options, comments) { + var noteNumber = 1; + + var noteReferences = []; + + var referencedComments = []; + + options = _.extend({ ignoreEmptyParagraphs: true }, options); + var idPrefix = options.idPrefix === undefined ? "" : options.idPrefix; + var ignoreEmptyParagraphs = options.ignoreEmptyParagraphs; + + var defaultParagraphStyle = htmlPaths.topLevelElement("p"); + + var styleMap = options.styleMap || []; + + function convertToHtml(document) { + var messages = []; + + var html = elementToHtml(document, messages, {}); + + var deferredNodes = []; + walkHtml(html, function (node) { + if (node.type === "deferred") { + deferredNodes.push(node); + } + }); + var deferredValues = {}; + return promises + .mapSeries(deferredNodes, function (deferred) { + return deferred.value().then(function (value) { + deferredValues[deferred.id] = value; + }); + }) + .then(function () { + function replaceDeferred(nodes) { + return flatMap(nodes, function (node) { + if (node.type === "deferred") { + return deferredValues[node.id]; + } else if (node.children) { + return [ + _.extend({}, node, { + children: replaceDeferred(node.children) + }) + ]; + } else { + return [node]; + } + }); + } + var writer = writers.writer({ + prettyPrint: options.prettyPrint, + outputFormat: options.outputFormat + }); + Html.write(writer, Html.simplify(replaceDeferred(html))); + return new results.Result(writer.asString(), messages); + }); + } + + function convertElements(elements, messages, options) { + return flatMap(elements, function (element) { + return elementToHtml(element, messages, options); + }); + } + + function elementToHtml(element, messages, options) { + if (!options) { + throw new Error("options not set"); + } + var handler = elementConverters[element.type]; + if (handler) { + return handler(element, messages, options); + } else { + return []; + } + } + + function convertParagraph(element, messages, options) { + return htmlPathForParagraph(element, messages).wrap(function () { + var content = convertElements(element.children, messages, options); + if (ignoreEmptyParagraphs) { + return content; + } else { + return [Html.forceWrite].concat(content); + } + }); + } + + function htmlPathForParagraph(element, messages) { + var style = findStyle(element); + + if (style) { + return style.to; + } else { + if (element.styleId) { + messages.push(unrecognisedStyleWarning("paragraph", element)); + } + return defaultParagraphStyle; + } + } + + function convertRun(run, messages, options) { + var nodes = function () { + return convertElements(run.children, messages, options); + }; + var paths = []; + if (run.highlight !== null) { + var path = findHtmlPath({ type: "highlight", color: run.highlight }); + if (path) { + paths.push(path); + } + } + if (run.isSmallCaps) { + paths.push(findHtmlPathForRunProperty("smallCaps")); + } + if (run.isAllCaps) { + paths.push(findHtmlPathForRunProperty("allCaps")); + } + if (run.isStrikethrough) { + paths.push(findHtmlPathForRunProperty("strikethrough", "s")); + } + if (run.isUnderline) { + paths.push(findHtmlPathForRunProperty("underline")); + } + if (run.verticalAlignment === documents.verticalAlignment.subscript) { + paths.push(htmlPaths.element("sub", {}, { fresh: false })); + } + if (run.verticalAlignment === documents.verticalAlignment.superscript) { + paths.push(htmlPaths.element("sup", {}, { fresh: false })); + } + if (run.isItalic) { + paths.push(findHtmlPathForRunProperty("italic", "em")); + } + if (run.isBold) { + paths.push(findHtmlPathForRunProperty("bold", "strong")); + } + var stylePath = htmlPaths.empty; + var style = findStyle(run); + if (style) { + stylePath = style.to; + } else if (run.styleId) { + messages.push(unrecognisedStyleWarning("run", run)); + } + paths.push(stylePath); + + paths.forEach(function (path) { + nodes = path.wrap.bind(path, nodes); + }); + + return nodes(); + } + + function findHtmlPathForRunProperty(elementType, defaultTagName) { + var path = findHtmlPath({ type: elementType }); + if (path) { + return path; + } else if (defaultTagName) { + return htmlPaths.element(defaultTagName, {}, { fresh: false }); + } else { + return htmlPaths.empty; + } + } + + function findHtmlPath(element, defaultPath) { + var style = findStyle(element); + return style ? style.to : defaultPath; + } + + function findStyle(element) { + for (var i = 0; i < styleMap.length; i++) { + if (styleMap[i].from.matches(element)) { + return styleMap[i]; + } + } + } + + function recoveringConvertImage(convertImage) { + return function (image, messages) { + return promises + .attempt(function () { + return convertImage(image, messages); + }) + .caught(function (error) { + messages.push(results.error(error)); + return []; + }); + }; + } + + function noteHtmlId(note) { + return referentHtmlId(note.noteType, note.noteId); + } + + function noteRefHtmlId(note) { + return referenceHtmlId(note.noteType, note.noteId); + } + + function referentHtmlId(referenceType, referenceId) { + return htmlId(referenceType + "-" + referenceId); + } + + function referenceHtmlId(referenceType, referenceId) { + return htmlId(referenceType + "-ref-" + referenceId); + } + + function htmlId(suffix) { + return idPrefix + suffix; + } + + var defaultTablePath = htmlPaths.elements([htmlPaths.element("table", {}, { fresh: true })]); + + function convertTable(element, messages, options) { + return findHtmlPath(element, defaultTablePath).wrap(function () { + return convertTableChildren(element, messages, options); + }); + } + + function convertTableChildren(element, messages, options) { + var bodyIndex = _.findIndex(element.children, function (child) { + return !child.type === documents.types.tableRow || !child.isHeader; + }); + if (bodyIndex === -1) { + bodyIndex = element.children.length; + } + var children; + if (bodyIndex === 0) { + children = convertElements( + element.children, + messages, + _.extend({}, options, { isTableHeader: false }) + ); + } else { + var headRows = convertElements( + element.children.slice(0, bodyIndex), + messages, + _.extend({}, options, { isTableHeader: true }) + ); + var bodyRows = convertElements( + element.children.slice(bodyIndex), + messages, + _.extend({}, options, { isTableHeader: false }) + ); + children = [ + Html.freshElement("thead", {}, headRows), + Html.freshElement("tbody", {}, bodyRows) + ]; + } + return [Html.forceWrite].concat(children); + } + + function convertTableRow(element, messages, options) { + var children = convertElements(element.children, messages, options); + return [Html.freshElement("tr", {}, [Html.forceWrite].concat(children))]; + } + + function convertTableCell(element, messages, options) { + var tagName = options.isTableHeader ? "th" : "td"; + var children = convertElements(element.children, messages, options); + var attributes = {}; + if (element.colSpan !== 1) { + attributes.colspan = element.colSpan.toString(); + } + if (element.rowSpan !== 1) { + attributes.rowspan = element.rowSpan.toString(); + } + + return [Html.freshElement(tagName, attributes, [Html.forceWrite].concat(children))]; + } + + function convertCommentReference(reference, messages, options) { + return findHtmlPath(reference, htmlPaths.ignore).wrap(function () { + var comment = comments[reference.commentId]; + var count = referencedComments.length + 1; + var label = "[" + commentAuthorLabel(comment) + count + "]"; + referencedComments.push({ label: label, comment: comment }); + // TODO: remove duplication with note references + return [ + Html.freshElement( + "a", + { + href: "#" + referentHtmlId("comment", reference.commentId), + id: referenceHtmlId("comment", reference.commentId) + }, + [Html.text(label)] + ) + ]; + }); + } + + function convertComment(referencedComment, messages, options) { + // TODO: remove duplication with note references + + var label = referencedComment.label; + var comment = referencedComment.comment; + var body = convertElements(comment.body, messages, options).concat([ + Html.nonFreshElement("p", {}, [ + Html.text(" "), + Html.freshElement( + "a", + { href: "#" + referenceHtmlId("comment", comment.commentId) }, + [Html.text("↑")] + ) + ]) + ]); + + return [ + Html.freshElement("dt", { id: referentHtmlId("comment", comment.commentId) }, [ + Html.text("Comment " + label) + ]), + Html.freshElement("dd", {}, body) + ]; + } + + function convertBreak(element, messages, options) { + return htmlPathForBreak(element).wrap(function () { + return []; + }); + } + + function htmlPathForBreak(element) { + var style = findStyle(element); + if (style) { + return style.to; + } else if (element.breakType === "line") { + return htmlPaths.topLevelElement("br"); + } else { + return htmlPaths.empty; + } + } + + var elementConverters = { + document: function (document, messages, options) { + var children = convertElements(document.children, messages, options); + var notes = noteReferences.map(function (noteReference) { + return document.notes.resolve(noteReference); + }); + var notesNodes = convertElements(notes, messages, options); + return children.concat([ + Html.freshElement("ol", {}, notesNodes), + Html.freshElement( + "dl", + {}, + flatMap(referencedComments, function (referencedComment) { + return convertComment(referencedComment, messages, options); + }) + ) + ]); + }, + paragraph: convertParagraph, + run: convertRun, + text: function (element, messages, options) { + return [Html.text(element.value)]; + }, + tab: function (element, messages, options) { + return [Html.text("\t")]; + }, + hyperlink: function (element, messages, options) { + var href = element.anchor ? "#" + htmlId(element.anchor) : element.href; + var attributes = { href: href }; + if (element.targetFrame != null) { + attributes.target = element.targetFrame; + } + + var children = convertElements(element.children, messages, options); + return [Html.nonFreshElement("a", attributes, children)]; + }, + checkbox: function (element) { + var attributes = { type: "checkbox" }; + if (element.checked) { + attributes["checked"] = "checked"; + } + return [Html.freshElement("input", attributes)]; + }, + bookmarkStart: function (element, messages, options) { + var anchor = Html.freshElement( + "a", + { + id: htmlId(element.name) + }, + [Html.forceWrite] + ); + return [anchor]; + }, + noteReference: function (element, messages, options) { + noteReferences.push(element); + var anchor = Html.freshElement( + "a", + { + href: "#" + noteHtmlId(element), + id: noteRefHtmlId(element) + }, + [Html.text("[" + noteNumber++ + "]")] + ); + + return [Html.freshElement("sup", {}, [anchor])]; + }, + note: function (element, messages, options) { + var children = convertElements(element.body, messages, options); + var backLink = Html.elementWithTag(htmlPaths.element("p", {}, { fresh: false }), [ + Html.text(" "), + Html.freshElement("a", { href: "#" + noteRefHtmlId(element) }, [Html.text("↑")]) + ]); + var body = children.concat([backLink]); + + return Html.freshElement("li", { id: noteHtmlId(element) }, body); + }, + commentReference: convertCommentReference, + comment: convertComment, + image: deferredConversion(recoveringConvertImage(options.convertImage || images.dataUri)), + table: convertTable, + tableRow: convertTableRow, + tableCell: convertTableCell, + break: convertBreak + }; + return { + convertToHtml: convertToHtml + }; + } + + var deferredId = 1; + + function deferredConversion(func) { + return function (element, messages, options) { + return [ + { + type: "deferred", + id: deferredId++, + value: function () { + return func(element, messages, options); + } + } + ]; + }; + } + + function unrecognisedStyleWarning(type, element) { + return results.warning( + "Unrecognised " + + type + + " style: '" + + element.styleName + + "'" + + " (Style ID: " + + element.styleId + + ")" + ); + } + + function flatMap(values, func) { + return _.flatten(values.map(func), true); + } + + function walkHtml(nodes, callback) { + nodes.forEach(function (node) { + callback(node); + if (node.children) { + walkHtml(node.children, callback); + } + }); + } + + var commentAuthorLabel = (exports.commentAuthorLabel = function commentAuthorLabel(comment) { + return comment.authorInitials || ""; + }); + }, + { + "./documents": 4, + "./html": 18, + "./images": 20, + "./promises": 23, + "./results": 25, + "./styles/html-paths": 28, + "./writers": 33, + underscore: 67 + } + ], + 4: [ + function (require, module, exports) { + (function (Buffer) { + var _ = require("underscore"); + + var types = (exports.types = { + document: "document", + paragraph: "paragraph", + run: "run", + text: "text", + tab: "tab", + checkbox: "checkbox", + hyperlink: "hyperlink", + noteReference: "noteReference", + image: "image", + note: "note", + commentReference: "commentReference", + comment: "comment", + table: "table", + tableRow: "tableRow", + tableCell: "tableCell", + break: "break", + bookmarkStart: "bookmarkStart" + }); + + function Document(children, options) { + options = options || {}; + return { + type: types.document, + children: children, + notes: options.notes || new Notes({}), + comments: options.comments || [] + }; + } + + function Paragraph(children, properties) { + properties = properties || {}; + var indent = properties.indent || {}; + return { + type: types.paragraph, + children: children, + styleId: properties.styleId || null, + styleName: properties.styleName || null, + numbering: properties.numbering || null, + alignment: properties.alignment || null, + indent: { + start: indent.start || null, + end: indent.end || null, + firstLine: indent.firstLine || null, + hanging: indent.hanging || null + } + }; + } + + function Run(children, properties) { + properties = properties || {}; + return { + type: types.run, + children: children, + styleId: properties.styleId || null, + styleName: properties.styleName || null, + isBold: !!properties.isBold, + isUnderline: !!properties.isUnderline, + isItalic: !!properties.isItalic, + isStrikethrough: !!properties.isStrikethrough, + isAllCaps: !!properties.isAllCaps, + isSmallCaps: !!properties.isSmallCaps, + verticalAlignment: properties.verticalAlignment || verticalAlignment.baseline, + font: properties.font || null, + fontSize: properties.fontSize || null, + highlight: properties.highlight || null + }; + } + + var verticalAlignment = { + baseline: "baseline", + superscript: "superscript", + subscript: "subscript" + }; + + function Text(value) { + return { + type: types.text, + value: value + }; + } + + function Tab() { + return { + type: types.tab + }; + } + + function Checkbox(options) { + return { + type: types.checkbox, + checked: options.checked + }; + } + + function Hyperlink(children, options) { + return { + type: types.hyperlink, + children: children, + href: options.href, + anchor: options.anchor, + targetFrame: options.targetFrame + }; + } + + function NoteReference(options) { + return { + type: types.noteReference, + noteType: options.noteType, + noteId: options.noteId + }; + } + + function Notes(notes) { + this._notes = _.indexBy(notes, function (note) { + return noteKey(note.noteType, note.noteId); + }); + } + + Notes.prototype.resolve = function (reference) { + return this.findNoteByKey(noteKey(reference.noteType, reference.noteId)); + }; + + Notes.prototype.findNoteByKey = function (key) { + return this._notes[key] || null; + }; + + function Note(options) { + return { + type: types.note, + noteType: options.noteType, + noteId: options.noteId, + body: options.body + }; + } + + function commentReference(options) { + return { + type: types.commentReference, + commentId: options.commentId + }; + } + + function comment(options) { + return { + type: types.comment, + commentId: options.commentId, + body: options.body, + authorName: options.authorName, + authorInitials: options.authorInitials + }; + } + + function noteKey(noteType, id) { + return noteType + "-" + id; + } + + function Image(options) { + return { + type: types.image, + // `read` is retained for backwards compatibility, but other read + // methods should be preferred. + read: function (encoding) { + if (encoding) { + return options.readImage(encoding); + } else { + return options.readImage().then(function (arrayBuffer) { + return Buffer.from(arrayBuffer); + }); + } + }, + readAsArrayBuffer: function () { + return options.readImage(); + }, + readAsBase64String: function () { + return options.readImage("base64"); + }, + readAsBuffer: function () { + return options.readImage().then(function (arrayBuffer) { + return Buffer.from(arrayBuffer); + }); + }, + altText: options.altText, + contentType: options.contentType + }; + } + + function Table(children, properties) { + properties = properties || {}; + return { + type: types.table, + children: children, + styleId: properties.styleId || null, + styleName: properties.styleName || null + }; + } + + function TableRow(children, options) { + options = options || {}; + return { + type: types.tableRow, + children: children, + isHeader: options.isHeader || false + }; + } + + function TableCell(children, options) { + options = options || {}; + return { + type: types.tableCell, + children: children, + colSpan: options.colSpan == null ? 1 : options.colSpan, + rowSpan: options.rowSpan == null ? 1 : options.rowSpan + }; + } + + function Break(breakType) { + return { + type: types["break"], + breakType: breakType + }; + } + + function BookmarkStart(options) { + return { + type: types.bookmarkStart, + name: options.name + }; + } + + exports.document = exports.Document = Document; + exports.paragraph = exports.Paragraph = Paragraph; + exports.run = exports.Run = Run; + exports.text = exports.Text = Text; + exports.tab = exports.Tab = Tab; + exports.checkbox = exports.Checkbox = Checkbox; + exports.Hyperlink = Hyperlink; + exports.noteReference = exports.NoteReference = NoteReference; + exports.Notes = Notes; + exports.Note = Note; + exports.commentReference = commentReference; + exports.comment = comment; + exports.Image = Image; + exports.Table = Table; + exports.TableRow = TableRow; + exports.TableCell = TableCell; + exports.lineBreak = Break("line"); + exports.pageBreak = Break("page"); + exports.columnBreak = Break("column"); + exports.BookmarkStart = BookmarkStart; + + exports.verticalAlignment = verticalAlignment; + }).call(this, require("buffer").Buffer); + }, + { buffer: 48, underscore: 67 } + ], + 5: [ + function (require, module, exports) { + exports.createBodyReader = createBodyReader; + exports._readNumberingProperties = readNumberingProperties; + + var dingbatToUnicode = require("dingbat-to-unicode"); + var _ = require("underscore"); + + var documents = require("../documents"); + var Result = require("../results").Result; + var warning = require("../results").warning; + var xml = require("../xml"); + var uris = require("./uris"); + + function createBodyReader(options) { + return { + readXmlElement: function (element) { + return new BodyReader(options).readXmlElement(element); + }, + readXmlElements: function (elements) { + return new BodyReader(options).readXmlElements(elements); + } + }; + } + + function BodyReader(options) { + var complexFieldStack = []; + var currentInstrText = []; + + // When a paragraph is marked as deleted, its contents should be combined + // with the following paragraph. See 17.13.5.15 del (Deleted Paragraph) of + // ECMA-376 4th edition Part 1. + var deletedParagraphContents = []; + + var relationships = options.relationships; + var contentTypes = options.contentTypes; + var docxFile = options.docxFile; + var files = options.files; + var numbering = options.numbering; + var styles = options.styles; + + function readXmlElements(elements) { + var results = elements.map(readXmlElement); + return combineResults(results); + } + + function readXmlElement(element) { + if (element.type === "element") { + var handler = xmlElementReaders[element.name]; + if (handler) { + return handler(element); + } else if (!Object.prototype.hasOwnProperty.call(ignoreElements, element.name)) { + var message = warning("An unrecognised element was ignored: " + element.name); + return emptyResultWithMessages([message]); + } + } + return emptyResult(); + } + + function readParagraphProperties(element) { + return readParagraphStyle(element).map(function (style) { + return { + type: "paragraphProperties", + styleId: style.styleId, + styleName: style.name, + alignment: element.firstOrEmpty("w:jc").attributes["w:val"], + numbering: readNumberingProperties( + style.styleId, + element.firstOrEmpty("w:numPr"), + numbering + ), + indent: readParagraphIndent(element.firstOrEmpty("w:ind")) + }; + }); + } + + function readParagraphIndent(element) { + return { + start: element.attributes["w:start"] || element.attributes["w:left"], + end: element.attributes["w:end"] || element.attributes["w:right"], + firstLine: element.attributes["w:firstLine"], + hanging: element.attributes["w:hanging"] + }; + } + + function readRunProperties(element) { + return readRunStyle(element).map(function (style) { + var fontSizeString = element.firstOrEmpty("w:sz").attributes["w:val"]; + // w:sz gives the font size in half points, so halve the value to get the size in points + var fontSize = /^[0-9]+$/.test(fontSizeString) + ? parseInt(fontSizeString, 10) / 2 + : null; + + return { + type: "runProperties", + styleId: style.styleId, + styleName: style.name, + verticalAlignment: element.firstOrEmpty("w:vertAlign").attributes["w:val"], + font: element.firstOrEmpty("w:rFonts").attributes["w:ascii"], + fontSize: fontSize, + isBold: readBooleanElement(element.first("w:b")), + isUnderline: readUnderline(element.first("w:u")), + isItalic: readBooleanElement(element.first("w:i")), + isStrikethrough: readBooleanElement(element.first("w:strike")), + isAllCaps: readBooleanElement(element.first("w:caps")), + isSmallCaps: readBooleanElement(element.first("w:smallCaps")), + highlight: readHighlightValue( + element.firstOrEmpty("w:highlight").attributes["w:val"] + ) + }; + }); + } + + function readUnderline(element) { + if (element) { + var value = element.attributes["w:val"]; + return value !== undefined && value !== "false" && value !== "0" && value !== "none"; + } else { + return false; + } + } + + function readBooleanElement(element) { + if (element) { + var value = element.attributes["w:val"]; + return value !== "false" && value !== "0"; + } else { + return false; + } + } + + function readBooleanAttributeValue(value) { + return value !== "false" && value !== "0"; + } + + function readHighlightValue(value) { + if (!value || value === "none") { + return null; + } else { + return value; + } + } + + function readParagraphStyle(element) { + return readStyle(element, "w:pStyle", "Paragraph", styles.findParagraphStyleById); + } + + function readRunStyle(element) { + return readStyle(element, "w:rStyle", "Run", styles.findCharacterStyleById); + } + + function readTableStyle(element) { + return readStyle(element, "w:tblStyle", "Table", styles.findTableStyleById); + } + + function readStyle(element, styleTagName, styleType, findStyleById) { + var messages = []; + var styleElement = element.first(styleTagName); + var styleId = null; + var name = null; + if (styleElement) { + styleId = styleElement.attributes["w:val"]; + if (styleId) { + var style = findStyleById(styleId); + if (style) { + name = style.name; + } else { + messages.push(undefinedStyleWarning(styleType, styleId)); + } + } + } + return elementResultWithMessages({ styleId: styleId, name: name }, messages); + } + + function readFldChar(element) { + var type = element.attributes["w:fldCharType"]; + if (type === "begin") { + complexFieldStack.push({ type: "begin", fldChar: element }); + currentInstrText = []; + } else if (type === "end") { + var complexFieldEnd = complexFieldStack.pop(); + if (complexFieldEnd.type === "begin") { + complexFieldEnd = parseCurrentInstrText(complexFieldEnd); + } + if (complexFieldEnd.type === "checkbox") { + return elementResult( + documents.checkbox({ + checked: complexFieldEnd.checked + }) + ); + } + } else if (type === "separate") { + var complexFieldSeparate = complexFieldStack.pop(); + var complexField = parseCurrentInstrText(complexFieldSeparate); + complexFieldStack.push(complexField); + } + return emptyResult(); + } + + function currentHyperlinkOptions() { + var topHyperlink = _.last( + complexFieldStack.filter(function (complexField) { + return complexField.type === "hyperlink"; + }) + ); + return topHyperlink ? topHyperlink.options : null; + } + + function parseCurrentInstrText(complexField) { + return parseInstrText( + currentInstrText.join(""), + complexField.type === "begin" ? complexField.fldChar : xml.emptyElement + ); + } + + function parseInstrText(instrText, fldChar) { + var externalLinkResult = /\s*HYPERLINK "(.*)"/.exec(instrText); + if (externalLinkResult) { + return { type: "hyperlink", options: { href: externalLinkResult[1] } }; + } + + var internalLinkResult = /\s*HYPERLINK\s+\\l\s+"(.*)"/.exec(instrText); + if (internalLinkResult) { + return { type: "hyperlink", options: { anchor: internalLinkResult[1] } }; + } + + var checkboxResult = /\s*FORMCHECKBOX\s*/.exec(instrText); + if (checkboxResult) { + var checkboxElement = fldChar.firstOrEmpty("w:ffData").firstOrEmpty("w:checkBox"); + var checkedElement = checkboxElement.first("w:checked"); + var checked = + checkedElement == null + ? readBooleanElement(checkboxElement.first("w:default")) + : readBooleanElement(checkedElement); + return { type: "checkbox", checked: checked }; + } + + return { type: "unknown" }; + } + + function readInstrText(element) { + currentInstrText.push(element.text()); + return emptyResult(); + } + + function readSymbol(element) { + // See 17.3.3.30 sym (Symbol Character) of ECMA-376 4th edition Part 1 + var font = element.attributes["w:font"]; + var char = element.attributes["w:char"]; + var unicodeCharacter = dingbatToUnicode.hex(font, char); + if (unicodeCharacter == null && /^F0..$/.test(char)) { + unicodeCharacter = dingbatToUnicode.hex(font, char.substring(2)); + } + + if (unicodeCharacter == null) { + return emptyResultWithMessages([ + warning( + "A w:sym element with an unsupported character was ignored: char " + + char + + " in font " + + font + ) + ]); + } else { + return elementResult(new documents.Text(unicodeCharacter.string)); + } + } + + function noteReferenceReader(noteType) { + return function (element) { + var noteId = element.attributes["w:id"]; + return elementResult( + new documents.NoteReference({ + noteType: noteType, + noteId: noteId + }) + ); + }; + } + + function readCommentReference(element) { + return elementResult( + documents.commentReference({ + commentId: element.attributes["w:id"] + }) + ); + } + + function readChildElements(element) { + return readXmlElements(element.children); + } + + var xmlElementReaders = { + "w:p": function (element) { + var paragraphPropertiesElement = element.firstOrEmpty("w:pPr"); + + var isDeleted = !!paragraphPropertiesElement.firstOrEmpty("w:rPr").first("w:del"); + + if (isDeleted) { + element.children.forEach(function (child) { + deletedParagraphContents.push(child); + }); + return emptyResult(); + } else { + var childrenXml = element.children; + if (deletedParagraphContents.length > 0) { + childrenXml = deletedParagraphContents.concat(childrenXml); + deletedParagraphContents = []; + } + return ReadResult.map( + readParagraphProperties(paragraphPropertiesElement), + readXmlElements(childrenXml), + function (properties, children) { + return new documents.Paragraph(children, properties); + } + ).insertExtra(); + } + }, + "w:r": function (element) { + return ReadResult.map( + readRunProperties(element.firstOrEmpty("w:rPr")), + readXmlElements(element.children), + function (properties, children) { + var hyperlinkOptions = currentHyperlinkOptions(); + if (hyperlinkOptions !== null) { + children = [new documents.Hyperlink(children, hyperlinkOptions)]; + } + + return new documents.Run(children, properties); + } + ); + }, + "w:fldChar": readFldChar, + "w:instrText": readInstrText, + "w:t": function (element) { + return elementResult(new documents.Text(element.text())); + }, + "w:tab": function (element) { + return elementResult(new documents.Tab()); + }, + "w:noBreakHyphen": function () { + return elementResult(new documents.Text("\u2011")); + }, + "w:softHyphen": function (element) { + return elementResult(new documents.Text("\u00AD")); + }, + "w:sym": readSymbol, + "w:hyperlink": function (element) { + var relationshipId = element.attributes["r:id"]; + var anchor = element.attributes["w:anchor"]; + return readXmlElements(element.children).map(function (children) { + function create(options) { + var targetFrame = element.attributes["w:tgtFrame"] || null; + + return new documents.Hyperlink( + children, + _.extend({ targetFrame: targetFrame }, options) + ); + } + + if (relationshipId) { + var href = relationships.findTargetByRelationshipId(relationshipId); + if (anchor) { + href = uris.replaceFragment(href, anchor); + } + return create({ href: href }); + } else if (anchor) { + return create({ anchor: anchor }); + } else { + return children; + } + }); + }, + "w:tbl": readTable, + "w:tr": readTableRow, + "w:tc": readTableCell, + "w:footnoteReference": noteReferenceReader("footnote"), + "w:endnoteReference": noteReferenceReader("endnote"), + "w:commentReference": readCommentReference, + "w:br": function (element) { + var breakType = element.attributes["w:type"]; + if (breakType == null || breakType === "textWrapping") { + return elementResult(documents.lineBreak); + } else if (breakType === "page") { + return elementResult(documents.pageBreak); + } else if (breakType === "column") { + return elementResult(documents.columnBreak); + } else { + return emptyResultWithMessages([warning("Unsupported break type: " + breakType)]); + } + }, + "w:bookmarkStart": function (element) { + var name = element.attributes["w:name"]; + if (name === "_GoBack") { + return emptyResult(); + } else { + return elementResult(new documents.BookmarkStart({ name: name })); + } + }, + + "mc:AlternateContent": function (element) { + return readChildElements(element.first("mc:Fallback")); + }, + + "w:sdt": function (element) { + var checkbox = element.firstOrEmpty("w:sdtPr").first("wordml:checkbox"); + + if (checkbox) { + var checkedElement = checkbox.first("wordml:checked"); + var isChecked = + !!checkedElement && + readBooleanAttributeValue(checkedElement.attributes["wordml:val"]); + return elementResult( + documents.checkbox({ + checked: isChecked + }) + ); + } else { + return readXmlElements(element.firstOrEmpty("w:sdtContent").children); + } + }, + + "w:ins": readChildElements, + "w:object": readChildElements, + "w:smartTag": readChildElements, + "w:drawing": readChildElements, + "w:pict": function (element) { + return readChildElements(element).toExtra(); + }, + "v:roundrect": readChildElements, + "v:shape": readChildElements, + "v:textbox": readChildElements, + "w:txbxContent": readChildElements, + "wp:inline": readDrawingElement, + "wp:anchor": readDrawingElement, + "v:imagedata": readImageData, + "v:group": readChildElements, + "v:rect": readChildElements + }; + + return { + readXmlElement: readXmlElement, + readXmlElements: readXmlElements + }; + + function readTable(element) { + var propertiesResult = readTableProperties(element.firstOrEmpty("w:tblPr")); + return readXmlElements(element.children) + .flatMap(calculateRowSpans) + .flatMap(function (children) { + return propertiesResult.map(function (properties) { + return documents.Table(children, properties); + }); + }); + } + + function readTableProperties(element) { + return readTableStyle(element).map(function (style) { + return { + styleId: style.styleId, + styleName: style.name + }; + }); + } + + function readTableRow(element) { + var properties = element.firstOrEmpty("w:trPr"); + var isHeader = !!properties.first("w:tblHeader"); + return readXmlElements(element.children).map(function (children) { + return documents.TableRow(children, { isHeader: isHeader }); + }); + } + + function readTableCell(element) { + return readXmlElements(element.children).map(function (children) { + var properties = element.firstOrEmpty("w:tcPr"); + + var gridSpan = properties.firstOrEmpty("w:gridSpan").attributes["w:val"]; + var colSpan = gridSpan ? parseInt(gridSpan, 10) : 1; + + var cell = documents.TableCell(children, { colSpan: colSpan }); + cell._vMerge = readVMerge(properties); + return cell; + }); + } + + function readVMerge(properties) { + var element = properties.first("w:vMerge"); + if (element) { + var val = element.attributes["w:val"]; + return val === "continue" || !val; + } else { + return null; + } + } + + function calculateRowSpans(rows) { + var unexpectedNonRows = _.any(rows, function (row) { + return row.type !== documents.types.tableRow; + }); + if (unexpectedNonRows) { + return elementResultWithMessages(rows, [ + warning("unexpected non-row element in table, cell merging may be incorrect") + ]); + } + var unexpectedNonCells = _.any(rows, function (row) { + return _.any(row.children, function (cell) { + return cell.type !== documents.types.tableCell; + }); + }); + if (unexpectedNonCells) { + return elementResultWithMessages(rows, [ + warning("unexpected non-cell element in table row, cell merging may be incorrect") + ]); + } + + var columns = {}; + + rows.forEach(function (row) { + var cellIndex = 0; + row.children.forEach(function (cell) { + if (cell._vMerge && columns[cellIndex]) { + columns[cellIndex].rowSpan++; + } else { + columns[cellIndex] = cell; + cell._vMerge = false; + } + cellIndex += cell.colSpan; + }); + }); + + rows.forEach(function (row) { + row.children = row.children.filter(function (cell) { + return !cell._vMerge; + }); + row.children.forEach(function (cell) { + delete cell._vMerge; + }); + }); + + return elementResult(rows); + } + + function readDrawingElement(element) { + var blips = element + .getElementsByTagName("a:graphic") + .getElementsByTagName("a:graphicData") + .getElementsByTagName("pic:pic") + .getElementsByTagName("pic:blipFill") + .getElementsByTagName("a:blip"); + + return combineResults(blips.map(readBlip.bind(null, element))); + } + + function readBlip(element, blip) { + var properties = element.first("wp:docPr").attributes; + var altText = isBlank(properties.descr) ? properties.title : properties.descr; + var blipImageFile = findBlipImageFile(blip); + if (blipImageFile === null) { + return emptyResultWithMessages([ + warning("Could not find image file for a:blip element") + ]); + } else { + return readImage(blipImageFile, altText); + } + } + + function isBlank(value) { + return value == null || /^\s*$/.test(value); + } + + function findBlipImageFile(blip) { + var embedRelationshipId = blip.attributes["r:embed"]; + var linkRelationshipId = blip.attributes["r:link"]; + if (embedRelationshipId) { + return findEmbeddedImageFile(embedRelationshipId); + } else if (linkRelationshipId) { + var imagePath = relationships.findTargetByRelationshipId(linkRelationshipId); + return { + path: imagePath, + read: files.read.bind(files, imagePath) + }; + } else { + return null; + } + } + + function readImageData(element) { + var relationshipId = element.attributes["r:id"]; + + if (relationshipId) { + return readImage(findEmbeddedImageFile(relationshipId), element.attributes["o:title"]); + } else { + return emptyResultWithMessages([ + warning("A v:imagedata element without a relationship ID was ignored") + ]); + } + } + + function findEmbeddedImageFile(relationshipId) { + var path = uris.uriToZipEntryName( + "word", + relationships.findTargetByRelationshipId(relationshipId) + ); + return { + path: path, + read: docxFile.read.bind(docxFile, path) + }; + } + + function readImage(imageFile, altText) { + var contentType = contentTypes.findContentType(imageFile.path); + + var image = documents.Image({ + readImage: imageFile.read, + altText: altText, + contentType: contentType + }); + var warnings = supportedImageTypes[contentType] + ? [] + : warning("Image of type " + contentType + " is unlikely to display in web browsers"); + return elementResultWithMessages(image, warnings); + } + + function undefinedStyleWarning(type, styleId) { + return warning( + type + " style with ID " + styleId + " was referenced but not defined in the document" + ); + } + } + + function readNumberingProperties(styleId, element, numbering) { + var level = element.firstOrEmpty("w:ilvl").attributes["w:val"]; + var numId = element.firstOrEmpty("w:numId").attributes["w:val"]; + if (level !== undefined && numId !== undefined) { + return numbering.findLevel(numId, level); + } + + if (styleId != null) { + var levelByStyleId = numbering.findLevelByParagraphStyleId(styleId); + if (levelByStyleId != null) { + return levelByStyleId; + } + } + + return null; + } + + var supportedImageTypes = { + "image/png": true, + "image/gif": true, + "image/jpeg": true, + "image/svg+xml": true, + "image/tiff": true + }; + + var ignoreElements = { + "office-word:wrap": true, + "v:shadow": true, + "v:shapetype": true, + "w:annotationRef": true, + "w:bookmarkEnd": true, + "w:sectPr": true, + "w:proofErr": true, + "w:lastRenderedPageBreak": true, + "w:commentRangeStart": true, + "w:commentRangeEnd": true, + "w:del": true, + "w:footnoteRef": true, + "w:endnoteRef": true, + "w:pPr": true, + "w:rPr": true, + "w:tblPr": true, + "w:tblGrid": true, + "w:trPr": true, + "w:tcPr": true + }; + + function emptyResultWithMessages(messages) { + return new ReadResult(null, null, messages); + } + + function emptyResult() { + return new ReadResult(null); + } + + function elementResult(element) { + return new ReadResult(element); + } + + function elementResultWithMessages(element, messages) { + return new ReadResult(element, null, messages); + } + + function ReadResult(element, extra, messages) { + this.value = element || []; + this.extra = extra || []; + this._result = new Result( + { + element: this.value, + extra: extra + }, + messages + ); + this.messages = this._result.messages; + } + + ReadResult.prototype.toExtra = function () { + return new ReadResult(null, joinElements(this.extra, this.value), this.messages); + }; + + ReadResult.prototype.insertExtra = function () { + var extra = this.extra; + if (extra && extra.length) { + return new ReadResult(joinElements(this.value, extra), null, this.messages); + } else { + return this; + } + }; + + ReadResult.prototype.map = function (func) { + var result = this._result.map(function (value) { + return func(value.element); + }); + return new ReadResult(result.value, this.extra, result.messages); + }; + + ReadResult.prototype.flatMap = function (func) { + var result = this._result.flatMap(function (value) { + return func(value.element)._result; + }); + return new ReadResult( + result.value.element, + joinElements(this.extra, result.value.extra), + result.messages + ); + }; + + ReadResult.map = function (first, second, func) { + return new ReadResult( + func(first.value, second.value), + joinElements(first.extra, second.extra), + first.messages.concat(second.messages) + ); + }; + + function combineResults(results) { + var result = Result.combine(_.pluck(results, "_result")); + return new ReadResult( + _.flatten(_.pluck(result.value, "element")), + _.filter(_.flatten(_.pluck(result.value, "extra")), identity), + result.messages + ); + } + + function joinElements(first, second) { + return _.flatten([first, second]); + } + + function identity(value) { + return value; + } + }, + { + "../documents": 4, + "../results": 25, + "../xml": 35, + "./uris": 16, + "dingbat-to-unicode": 50, + underscore: 67 + } + ], + 6: [ + function (require, module, exports) { + var documents = require("../documents"); + var Result = require("../results").Result; + + function createCommentsReader(bodyReader) { + function readCommentsXml(element) { + return Result.combine(element.getElementsByTagName("w:comment").map(readCommentElement)); + } + + function readCommentElement(element) { + var id = element.attributes["w:id"]; + + function readOptionalAttribute(name) { + return (element.attributes[name] || "").trim() || null; + } + + return bodyReader.readXmlElements(element.children).map(function (body) { + return documents.comment({ + commentId: id, + body: body, + authorName: readOptionalAttribute("w:author"), + authorInitials: readOptionalAttribute("w:initials") + }); + }); + } + + return readCommentsXml; + } + + exports.createCommentsReader = createCommentsReader; + }, + { "../documents": 4, "../results": 25 } + ], + 7: [ + function (require, module, exports) { + exports.readContentTypesFromXml = readContentTypesFromXml; + + var fallbackContentTypes = { + png: "png", + gif: "gif", + jpeg: "jpeg", + jpg: "jpeg", + tif: "tiff", + tiff: "tiff", + bmp: "bmp" + }; + + exports.defaultContentTypes = contentTypes({}, {}); + + function readContentTypesFromXml(element) { + var extensionDefaults = {}; + var overrides = {}; + + element.children.forEach(function (child) { + if (child.name === "content-types:Default") { + extensionDefaults[child.attributes.Extension] = child.attributes.ContentType; + } + if (child.name === "content-types:Override") { + var name = child.attributes.PartName; + if (name.charAt(0) === "/") { + name = name.substring(1); + } + overrides[name] = child.attributes.ContentType; + } + }); + return contentTypes(overrides, extensionDefaults); + } + + function contentTypes(overrides, extensionDefaults) { + return { + findContentType: function (path) { + var overrideContentType = overrides[path]; + if (overrideContentType) { + return overrideContentType; + } else { + var pathParts = path.split("."); + var extension = pathParts[pathParts.length - 1]; + if (extensionDefaults.hasOwnProperty(extension)) { + return extensionDefaults[extension]; + } else { + var fallback = fallbackContentTypes[extension.toLowerCase()]; + if (fallback) { + return "image/" + fallback; + } else { + return null; + } + } + } + } + }; + } + }, + {} + ], + 8: [ + function (require, module, exports) { + exports.DocumentXmlReader = DocumentXmlReader; + + var documents = require("../documents"); + var Result = require("../results").Result; + + function DocumentXmlReader(options) { + var bodyReader = options.bodyReader; + + function convertXmlToDocument(element) { + var body = element.first("w:body"); + + if (body == null) { + throw new Error("Could not find the body element: are you sure this is a docx file?"); + } + + var result = bodyReader.readXmlElements(body.children).map(function (children) { + return new documents.Document(children, { + notes: options.notes, + comments: options.comments + }); + }); + return new Result(result.value, result.messages); + } + + return { + convertXmlToDocument: convertXmlToDocument + }; + } + }, + { "../documents": 4, "../results": 25 } + ], + 9: [ + function (require, module, exports) { + exports.read = read; + exports._findPartPaths = findPartPaths; + + var promises = require("../promises"); + var documents = require("../documents"); + var Result = require("../results").Result; + var zipfile = require("../zipfile"); + + var readXmlFromZipFile = require("./office-xml-reader").readXmlFromZipFile; + var createBodyReader = require("./body-reader").createBodyReader; + var DocumentXmlReader = require("./document-xml-reader").DocumentXmlReader; + var relationshipsReader = require("./relationships-reader"); + var contentTypesReader = require("./content-types-reader"); + var numberingXml = require("./numbering-xml"); + var stylesReader = require("./styles-reader"); + var notesReader = require("./notes-reader"); + var commentsReader = require("./comments-reader"); + var Files = require("./files").Files; + + function read(docxFile, input) { + input = input || {}; + + return promises + .props({ + contentTypes: readContentTypesFromZipFile(docxFile), + partPaths: findPartPaths(docxFile), + docxFile: docxFile, + files: input.path ? Files.relativeToFile(input.path) : new Files(null) + }) + .also(function (result) { + return { + styles: readStylesFromZipFile(docxFile, result.partPaths.styles) + }; + }) + .also(function (result) { + return { + numbering: readNumberingFromZipFile( + docxFile, + result.partPaths.numbering, + result.styles + ) + }; + }) + .also(function (result) { + return { + footnotes: readXmlFileWithBody( + result.partPaths.footnotes, + result, + function (bodyReader, xml) { + if (xml) { + return notesReader.createFootnotesReader(bodyReader)(xml); + } else { + return new Result([]); + } + } + ), + endnotes: readXmlFileWithBody( + result.partPaths.endnotes, + result, + function (bodyReader, xml) { + if (xml) { + return notesReader.createEndnotesReader(bodyReader)(xml); + } else { + return new Result([]); + } + } + ), + comments: readXmlFileWithBody( + result.partPaths.comments, + result, + function (bodyReader, xml) { + if (xml) { + return commentsReader.createCommentsReader(bodyReader)(xml); + } else { + return new Result([]); + } + } + ) + }; + }) + .also(function (result) { + return { + notes: result.footnotes.flatMap(function (footnotes) { + return result.endnotes.map(function (endnotes) { + return new documents.Notes(footnotes.concat(endnotes)); + }); + }) + }; + }) + .then(function (result) { + return readXmlFileWithBody( + result.partPaths.mainDocument, + result, + function (bodyReader, xml) { + return result.notes.flatMap(function (notes) { + return result.comments.flatMap(function (comments) { + var reader = new DocumentXmlReader({ + bodyReader: bodyReader, + notes: notes, + comments: comments + }); + return reader.convertXmlToDocument(xml); + }); + }); + } + ); + }); + } + + function findPartPaths(docxFile) { + return readPackageRelationships(docxFile).then(function (packageRelationships) { + var mainDocumentPath = findPartPath({ + docxFile: docxFile, + relationships: packageRelationships, + relationshipType: + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", + basePath: "", + fallbackPath: "word/document.xml" + }); + + if (!docxFile.exists(mainDocumentPath)) { + throw new Error( + "Could not find main document part. Are you sure this is a valid .docx file?" + ); + } + + return xmlFileReader({ + filename: relationshipsFilename(mainDocumentPath), + readElement: relationshipsReader.readRelationships, + defaultValue: relationshipsReader.defaultValue + })(docxFile).then(function (documentRelationships) { + function findPartRelatedToMainDocument(name) { + return findPartPath({ + docxFile: docxFile, + relationships: documentRelationships, + relationshipType: + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/" + + name, + basePath: zipfile.splitPath(mainDocumentPath).dirname, + fallbackPath: "word/" + name + ".xml" + }); + } + + return { + mainDocument: mainDocumentPath, + comments: findPartRelatedToMainDocument("comments"), + endnotes: findPartRelatedToMainDocument("endnotes"), + footnotes: findPartRelatedToMainDocument("footnotes"), + numbering: findPartRelatedToMainDocument("numbering"), + styles: findPartRelatedToMainDocument("styles") + }; + }); + }); + } + + function findPartPath(options) { + var docxFile = options.docxFile; + var relationships = options.relationships; + var relationshipType = options.relationshipType; + var basePath = options.basePath; + var fallbackPath = options.fallbackPath; + + var targets = relationships.findTargetsByType(relationshipType); + var normalisedTargets = targets.map(function (target) { + return stripPrefix(zipfile.joinPath(basePath, target), "/"); + }); + var validTargets = normalisedTargets.filter(function (target) { + return docxFile.exists(target); + }); + if (validTargets.length === 0) { + return fallbackPath; + } else { + return validTargets[0]; + } + } + + function stripPrefix(value, prefix) { + if (value.substring(0, prefix.length) === prefix) { + return value.substring(prefix.length); + } else { + return value; + } + } + + function xmlFileReader(options) { + return function (zipFile) { + return readXmlFromZipFile(zipFile, options.filename).then(function (element) { + return element ? options.readElement(element) : options.defaultValue; + }); + }; + } + + function readXmlFileWithBody(filename, options, func) { + var readRelationshipsFromZipFile = xmlFileReader({ + filename: relationshipsFilename(filename), + readElement: relationshipsReader.readRelationships, + defaultValue: relationshipsReader.defaultValue + }); + + return readRelationshipsFromZipFile(options.docxFile).then(function (relationships) { + var bodyReader = new createBodyReader({ + relationships: relationships, + contentTypes: options.contentTypes, + docxFile: options.docxFile, + numbering: options.numbering, + styles: options.styles, + files: options.files + }); + return readXmlFromZipFile(options.docxFile, filename).then(function (xml) { + return func(bodyReader, xml); + }); + }); + } + + function relationshipsFilename(filename) { + var split = zipfile.splitPath(filename); + return zipfile.joinPath(split.dirname, "_rels", split.basename + ".rels"); + } + + var readContentTypesFromZipFile = xmlFileReader({ + filename: "[Content_Types].xml", + readElement: contentTypesReader.readContentTypesFromXml, + defaultValue: contentTypesReader.defaultContentTypes + }); + + function readNumberingFromZipFile(zipFile, path, styles) { + return xmlFileReader({ + filename: path, + readElement: function (element) { + return numberingXml.readNumberingXml(element, { styles: styles }); + }, + defaultValue: numberingXml.defaultNumbering + })(zipFile); + } + + function readStylesFromZipFile(zipFile, path) { + return xmlFileReader({ + filename: path, + readElement: stylesReader.readStylesXml, + defaultValue: stylesReader.defaultStyles + })(zipFile); + } + + var readPackageRelationships = xmlFileReader({ + filename: "_rels/.rels", + readElement: relationshipsReader.readRelationships, + defaultValue: relationshipsReader.defaultValue + }); + }, + { + "../documents": 4, + "../promises": 23, + "../results": 25, + "../zipfile": 40, + "./body-reader": 5, + "./comments-reader": 6, + "./content-types-reader": 7, + "./document-xml-reader": 8, + "./files": 1, + "./notes-reader": 10, + "./numbering-xml": 11, + "./office-xml-reader": 12, + "./relationships-reader": 13, + "./styles-reader": 15 + } + ], + 10: [ + function (require, module, exports) { + var documents = require("../documents"); + var Result = require("../results").Result; + + exports.createFootnotesReader = createReader.bind(this, "footnote"); + exports.createEndnotesReader = createReader.bind(this, "endnote"); + + function createReader(noteType, bodyReader) { + function readNotesXml(element) { + return Result.combine( + element + .getElementsByTagName("w:" + noteType) + .filter(isFootnoteElement) + .map(readFootnoteElement) + ); + } + + function isFootnoteElement(element) { + var type = element.attributes["w:type"]; + return type !== "continuationSeparator" && type !== "separator"; + } + + function readFootnoteElement(footnoteElement) { + var id = footnoteElement.attributes["w:id"]; + return bodyReader.readXmlElements(footnoteElement.children).map(function (body) { + return documents.Note({ noteType: noteType, noteId: id, body: body }); + }); + } + + return readNotesXml; + } + }, + { "../documents": 4, "../results": 25 } + ], + 11: [ + function (require, module, exports) { + var _ = require("underscore"); + + exports.readNumberingXml = readNumberingXml; + exports.Numbering = Numbering; + exports.defaultNumbering = new Numbering({}, {}); + + function Numbering(nums, abstractNums, styles) { + var allLevels = _.flatten( + _.values(abstractNums).map(function (abstractNum) { + return _.values(abstractNum.levels); + }) + ); + + var levelsByParagraphStyleId = _.indexBy( + allLevels.filter(function (level) { + return level.paragraphStyleId != null; + }), + "paragraphStyleId" + ); + + function findLevel(numId, level) { + var num = nums[numId]; + if (num) { + var abstractNum = abstractNums[num.abstractNumId]; + if (!abstractNum) { + return null; + } else if (abstractNum.numStyleLink == null) { + return abstractNums[num.abstractNumId].levels[level]; + } else { + var style = styles.findNumberingStyleById(abstractNum.numStyleLink); + return findLevel(style.numId, level); + } + } else { + return null; + } + } + + function findLevelByParagraphStyleId(styleId) { + return levelsByParagraphStyleId[styleId] || null; + } + + return { + findLevel: findLevel, + findLevelByParagraphStyleId: findLevelByParagraphStyleId + }; + } + + function readNumberingXml(root, options) { + if (!options || !options.styles) { + throw new Error("styles is missing"); + } + + var abstractNums = readAbstractNums(root); + var nums = readNums(root, abstractNums); + return new Numbering(nums, abstractNums, options.styles); + } + + function readAbstractNums(root) { + var abstractNums = {}; + root.getElementsByTagName("w:abstractNum").forEach(function (element) { + var id = element.attributes["w:abstractNumId"]; + abstractNums[id] = readAbstractNum(element); + }); + return abstractNums; + } + + function readAbstractNum(element) { + var levels = {}; + element.getElementsByTagName("w:lvl").forEach(function (levelElement) { + var levelIndex = levelElement.attributes["w:ilvl"]; + var numFmt = levelElement.firstOrEmpty("w:numFmt").attributes["w:val"]; + var paragraphStyleId = levelElement.firstOrEmpty("w:pStyle").attributes["w:val"]; + + levels[levelIndex] = { + isOrdered: numFmt !== "bullet", + level: levelIndex, + paragraphStyleId: paragraphStyleId + }; + }); + + var numStyleLink = element.firstOrEmpty("w:numStyleLink").attributes["w:val"]; + + return { levels: levels, numStyleLink: numStyleLink }; + } + + function readNums(root) { + var nums = {}; + root.getElementsByTagName("w:num").forEach(function (element) { + var numId = element.attributes["w:numId"]; + var abstractNumId = element.first("w:abstractNumId").attributes["w:val"]; + nums[numId] = { abstractNumId: abstractNumId }; + }); + return nums; + } + }, + { underscore: 67 } + ], + 12: [ + function (require, module, exports) { + var _ = require("underscore"); + + var promises = require("../promises"); + var xml = require("../xml"); + + exports.read = read; + exports.readXmlFromZipFile = readXmlFromZipFile; + + var xmlNamespaceMap = { + // Transitional format + "http://schemas.openxmlformats.org/wordprocessingml/2006/main": "w", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships": "r", + "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing": "wp", + "http://schemas.openxmlformats.org/drawingml/2006/main": "a", + "http://schemas.openxmlformats.org/drawingml/2006/picture": "pic", + + // Strict format + "http://purl.oclc.org/ooxml/wordprocessingml/main": "w", + "http://purl.oclc.org/ooxml/officeDocument/relationships": "r", + "http://purl.oclc.org/ooxml/drawingml/wordprocessingDrawing": "wp", + "http://purl.oclc.org/ooxml/drawingml/main": "a", + "http://purl.oclc.org/ooxml/drawingml/picture": "pic", + + // Common + "http://schemas.openxmlformats.org/package/2006/content-types": "content-types", + "http://schemas.openxmlformats.org/package/2006/relationships": "relationships", + "http://schemas.openxmlformats.org/markup-compatibility/2006": "mc", + "urn:schemas-microsoft-com:vml": "v", + "urn:schemas-microsoft-com:office:word": "office-word", + + // [MS-DOCX]: Word Extensions to the Office Open XML (.docx) File Format + // https://learn.microsoft.com/en-us/openspecs/office_standards/ms-docx/b839fe1f-e1ca-4fa6-8c26-5954d0abbccd + "http://schemas.microsoft.com/office/word/2010/wordml": "wordml" + }; + + function read(xmlString) { + return xml.readString(xmlString, xmlNamespaceMap).then(function (document) { + return collapseAlternateContent(document)[0]; + }); + } + + function readXmlFromZipFile(docxFile, path) { + if (docxFile.exists(path)) { + return docxFile.read(path, "utf-8").then(stripUtf8Bom).then(read); + } else { + return promises.resolve(null); + } + } + + function stripUtf8Bom(xmlString) { + return xmlString.replace(/^\uFEFF/g, ""); + } + + function collapseAlternateContent(node) { + if (node.type === "element") { + if (node.name === "mc:AlternateContent") { + return node.first("mc:Fallback").children; + } else { + node.children = _.flatten(node.children.map(collapseAlternateContent, true)); + return [node]; + } + } else { + return [node]; + } + } + }, + { "../promises": 23, "../xml": 35, underscore: 67 } + ], + 13: [ + function (require, module, exports) { + exports.readRelationships = readRelationships; + exports.defaultValue = new Relationships([]); + exports.Relationships = Relationships; + + function readRelationships(element) { + var relationships = []; + element.children.forEach(function (child) { + if (child.name === "relationships:Relationship") { + var relationship = { + relationshipId: child.attributes.Id, + target: child.attributes.Target, + type: child.attributes.Type + }; + relationships.push(relationship); + } + }); + return new Relationships(relationships); + } + + function Relationships(relationships) { + var targetsByRelationshipId = {}; + relationships.forEach(function (relationship) { + targetsByRelationshipId[relationship.relationshipId] = relationship.target; + }); + + var targetsByType = {}; + relationships.forEach(function (relationship) { + if (!targetsByType[relationship.type]) { + targetsByType[relationship.type] = []; + } + targetsByType[relationship.type].push(relationship.target); + }); + + return { + findTargetByRelationshipId: function (relationshipId) { + return targetsByRelationshipId[relationshipId]; + }, + findTargetsByType: function (type) { + return targetsByType[type] || []; + } + }; + } + }, + {} + ], + 14: [ + function (require, module, exports) { + var _ = require("underscore"); + + var promises = require("../promises"); + var xml = require("../xml"); + + exports.writeStyleMap = writeStyleMap; + exports.readStyleMap = readStyleMap; + + var schema = "http://schemas.zwobble.org/mammoth/style-map"; + var styleMapPath = "mammoth/style-map"; + var styleMapAbsolutePath = "/" + styleMapPath; + + function writeStyleMap(docxFile, styleMap) { + docxFile.write(styleMapPath, styleMap); + return updateRelationships(docxFile).then(function () { + return updateContentTypes(docxFile); + }); + } + + function updateRelationships(docxFile) { + var path = "word/_rels/document.xml.rels"; + var relationshipsUri = "http://schemas.openxmlformats.org/package/2006/relationships"; + var relationshipElementName = "{" + relationshipsUri + "}Relationship"; + return docxFile + .read(path, "utf8") + .then(xml.readString) + .then(function (relationshipsContainer) { + var relationships = relationshipsContainer.children; + addOrUpdateElement(relationships, relationshipElementName, "Id", { + Id: "rMammothStyleMap", + Type: schema, + Target: styleMapAbsolutePath + }); + + var namespaces = { "": relationshipsUri }; + return docxFile.write(path, xml.writeString(relationshipsContainer, namespaces)); + }); + } + + function updateContentTypes(docxFile) { + var path = "[Content_Types].xml"; + var contentTypesUri = "http://schemas.openxmlformats.org/package/2006/content-types"; + var overrideName = "{" + contentTypesUri + "}Override"; + return docxFile + .read(path, "utf8") + .then(xml.readString) + .then(function (typesElement) { + var children = typesElement.children; + addOrUpdateElement(children, overrideName, "PartName", { + PartName: styleMapAbsolutePath, + ContentType: "text/prs.mammoth.style-map" + }); + var namespaces = { "": contentTypesUri }; + return docxFile.write(path, xml.writeString(typesElement, namespaces)); + }); + } + + function addOrUpdateElement(elements, name, identifyingAttribute, attributes) { + var existingElement = _.find(elements, function (element) { + return ( + element.name === name && + element.attributes[identifyingAttribute] === attributes[identifyingAttribute] + ); + }); + if (existingElement) { + existingElement.attributes = attributes; + } else { + elements.push(xml.element(name, attributes)); + } + } + + function readStyleMap(docxFile) { + if (docxFile.exists(styleMapPath)) { + return docxFile.read(styleMapPath, "utf8"); + } else { + return promises.resolve(null); + } + } + }, + { "../promises": 23, "../xml": 35, underscore: 67 } + ], + 15: [ + function (require, module, exports) { + exports.readStylesXml = readStylesXml; + exports.Styles = Styles; + exports.defaultStyles = new Styles({}, {}); + + function Styles(paragraphStyles, characterStyles, tableStyles, numberingStyles) { + return { + findParagraphStyleById: function (styleId) { + return paragraphStyles[styleId]; + }, + findCharacterStyleById: function (styleId) { + return characterStyles[styleId]; + }, + findTableStyleById: function (styleId) { + return tableStyles[styleId]; + }, + findNumberingStyleById: function (styleId) { + return numberingStyles[styleId]; + } + }; + } + + Styles.EMPTY = new Styles({}, {}, {}, {}); + + function readStylesXml(root) { + var paragraphStyles = {}; + var characterStyles = {}; + var tableStyles = {}; + var numberingStyles = {}; + + var styles = { + paragraph: paragraphStyles, + character: characterStyles, + table: tableStyles + }; + + root.getElementsByTagName("w:style").forEach(function (styleElement) { + var style = readStyleElement(styleElement); + if (style.type === "numbering") { + numberingStyles[style.styleId] = readNumberingStyleElement(styleElement); + } else { + var styleSet = styles[style.type]; + if (styleSet) { + styleSet[style.styleId] = style; + } + } + }); + + return new Styles(paragraphStyles, characterStyles, tableStyles, numberingStyles); + } + + function readStyleElement(styleElement) { + var type = styleElement.attributes["w:type"]; + var styleId = styleElement.attributes["w:styleId"]; + var name = styleName(styleElement); + return { type: type, styleId: styleId, name: name }; + } + + function styleName(styleElement) { + var nameElement = styleElement.first("w:name"); + return nameElement ? nameElement.attributes["w:val"] : null; + } + + function readNumberingStyleElement(styleElement) { + var numId = styleElement.firstOrEmpty("w:pPr").firstOrEmpty("w:numPr").firstOrEmpty("w:numId") + .attributes["w:val"]; + return { numId: numId }; + } + }, + {} + ], + 16: [ + function (require, module, exports) { + exports.uriToZipEntryName = uriToZipEntryName; + exports.replaceFragment = replaceFragment; + + function uriToZipEntryName(base, uri) { + if (uri.charAt(0) === "/") { + return uri.substr(1); + } else { + // In general, we should check first and second for trailing and leading slashes, + // but in our specific case this seems to be sufficient + return base + "/" + uri; + } + } + + function replaceFragment(uri, fragment) { + var hashIndex = uri.indexOf("#"); + if (hashIndex !== -1) { + uri = uri.substring(0, hashIndex); + } + return uri + "#" + fragment; + } + }, + {} + ], + 17: [ + function (require, module, exports) { + var htmlPaths = require("../styles/html-paths"); + + function nonFreshElement(tagName, attributes, children) { + return elementWithTag(htmlPaths.element(tagName, attributes, { fresh: false }), children); + } + + function freshElement(tagName, attributes, children) { + var tag = htmlPaths.element(tagName, attributes, { fresh: true }); + return elementWithTag(tag, children); + } + + function elementWithTag(tag, children) { + return { + type: "element", + tag: tag, + children: children || [] + }; + } + + function text(value) { + return { + type: "text", + value: value + }; + } + + var forceWrite = { + type: "forceWrite" + }; + + exports.freshElement = freshElement; + exports.nonFreshElement = nonFreshElement; + exports.elementWithTag = elementWithTag; + exports.text = text; + exports.forceWrite = forceWrite; + + var voidTagNames = { + br: true, + hr: true, + img: true, + input: true + }; + + function isVoidElement(node) { + return node.children.length === 0 && voidTagNames[node.tag.tagName]; + } + + exports.isVoidElement = isVoidElement; + }, + { "../styles/html-paths": 28 } + ], + 18: [ + function (require, module, exports) { + var ast = require("./ast"); + + exports.freshElement = ast.freshElement; + exports.nonFreshElement = ast.nonFreshElement; + exports.elementWithTag = ast.elementWithTag; + exports.text = ast.text; + exports.forceWrite = ast.forceWrite; + + exports.simplify = require("./simplify"); + + function write(writer, nodes) { + nodes.forEach(function (node) { + writeNode(writer, node); + }); + } + + function writeNode(writer, node) { + toStrings[node.type](writer, node); + } + + var toStrings = { + element: generateElementString, + text: generateTextString, + forceWrite: function () {} + }; + + function generateElementString(writer, node) { + if (ast.isVoidElement(node)) { + writer.selfClosing(node.tag.tagName, node.tag.attributes); + } else { + writer.open(node.tag.tagName, node.tag.attributes); + write(writer, node.children); + writer.close(node.tag.tagName); + } + } + + function generateTextString(writer, node) { + writer.text(node.value); + } + + exports.write = write; + }, + { "./ast": 17, "./simplify": 19 } + ], + 19: [ + function (require, module, exports) { + var _ = require("underscore"); + + var ast = require("./ast"); + + function simplify(nodes) { + return collapse(removeEmpty(nodes)); + } + + function collapse(nodes) { + var children = []; + + nodes.map(collapseNode).forEach(function (child) { + appendChild(children, child); + }); + return children; + } + + function collapseNode(node) { + return collapsers[node.type](node); + } + + var collapsers = { + element: collapseElement, + text: identity, + forceWrite: identity + }; + + function collapseElement(node) { + return ast.elementWithTag(node.tag, collapse(node.children)); + } + + function identity(value) { + return value; + } + + function appendChild(children, child) { + var lastChild = children[children.length - 1]; + if ( + child.type === "element" && + !child.tag.fresh && + lastChild && + lastChild.type === "element" && + child.tag.matchesElement(lastChild.tag) + ) { + if (child.tag.separator) { + appendChild(lastChild.children, ast.text(child.tag.separator)); + } + child.children.forEach(function (grandChild) { + // Mutation is fine since simplifying elements create a copy of the children. + appendChild(lastChild.children, grandChild); + }); + } else { + children.push(child); + } + } + + function removeEmpty(nodes) { + return flatMap(nodes, function (node) { + return emptiers[node.type](node); + }); + } + + function flatMap(values, func) { + return _.flatten(_.map(values, func), true); + } + + var emptiers = { + element: elementEmptier, + text: textEmptier, + forceWrite: neverEmpty + }; + + function neverEmpty(node) { + return [node]; + } + + function elementEmptier(element) { + var children = removeEmpty(element.children); + if (children.length === 0 && !ast.isVoidElement(element)) { + return []; + } else { + return [ast.elementWithTag(element.tag, children)]; + } + } + + function textEmptier(node) { + if (node.value.length === 0) { + return []; + } else { + return [node]; + } + } + + module.exports = simplify; + }, + { "./ast": 17, underscore: 67 } + ], + 20: [ + function (require, module, exports) { + var _ = require("underscore"); + + var promises = require("./promises"); + var Html = require("./html"); + + exports.imgElement = imgElement; + + function imgElement(func) { + return function (element, messages) { + return promises.when(func(element)).then(function (result) { + var attributes = {}; + if (element.altText) { + attributes.alt = element.altText; + } + _.extend(attributes, result); + + return [Html.freshElement("img", attributes)]; + }); + }; + } + + // Undocumented, but retained for backwards-compatibility with 0.3.x + exports.inline = exports.imgElement; + + exports.dataUri = imgElement(function (element) { + return element.readAsBase64String().then(function (imageBuffer) { + return { + src: "data:" + element.contentType + ";base64," + imageBuffer + }; + }); + }); + }, + { "./html": 18, "./promises": 23, underscore: 67 } + ], + 21: [ + function (require, module, exports) { + (function (Buffer) { + var _ = require("underscore"); + + var docxReader = require("./docx/docx-reader"); + var docxStyleMap = require("./docx/style-map"); + var DocumentConverter = require("./document-to-html").DocumentConverter; + var convertElementToRawText = require("./raw-text").convertElementToRawText; + var readStyle = require("./style-reader").readStyle; + var readOptions = require("./options-reader").readOptions; + var unzip = require("./unzip"); + var Result = require("./results").Result; + + exports.convertToHtml = convertToHtml; + exports.convertToMarkdown = convertToMarkdown; + exports.convert = convert; + exports.extractRawText = extractRawText; + exports.images = require("./images"); + exports.transforms = require("./transforms"); + exports.underline = require("./underline"); + exports.embedStyleMap = embedStyleMap; + exports.readEmbeddedStyleMap = readEmbeddedStyleMap; + + function convertToHtml(input, options) { + return convert(input, options); + } + + function convertToMarkdown(input, options) { + var markdownOptions = Object.create(options || {}); + markdownOptions.outputFormat = "markdown"; + return convert(input, markdownOptions); + } + + function convert(input, options) { + options = readOptions(options); + + return unzip + .openZip(input) + .tap(function (docxFile) { + return docxStyleMap.readStyleMap(docxFile).then(function (styleMap) { + options.embeddedStyleMap = styleMap; + }); + }) + .then(function (docxFile) { + return docxReader + .read(docxFile, input) + .then(function (documentResult) { + return documentResult.map(options.transformDocument); + }) + .then(function (documentResult) { + return convertDocumentToHtml(documentResult, options); + }); + }); + } + + function readEmbeddedStyleMap(input) { + return unzip.openZip(input).then(docxStyleMap.readStyleMap); + } + + function convertDocumentToHtml(documentResult, options) { + var styleMapResult = parseStyleMap(options.readStyleMap()); + var parsedOptions = _.extend({}, options, { + styleMap: styleMapResult.value + }); + var documentConverter = new DocumentConverter(parsedOptions); + + return documentResult.flatMapThen(function (document) { + return styleMapResult.flatMapThen(function (styleMap) { + return documentConverter.convertToHtml(document); + }); + }); + } + + function parseStyleMap(styleMap) { + return Result.combine((styleMap || []).map(readStyle)).map(function (styleMap) { + return styleMap.filter(function (styleMapping) { + return !!styleMapping; + }); + }); + } + + function extractRawText(input) { + return unzip + .openZip(input) + .then(docxReader.read) + .then(function (documentResult) { + return documentResult.map(convertElementToRawText); + }); + } + + function embedStyleMap(input, styleMap) { + return unzip + .openZip(input) + .tap(function (docxFile) { + return docxStyleMap.writeStyleMap(docxFile, styleMap); + }) + .then(function (docxFile) { + return docxFile.toArrayBuffer(); + }) + .then(function (arrayBuffer) { + return { + toArrayBuffer: function () { + return arrayBuffer; + }, + toBuffer: function () { + return Buffer.from(arrayBuffer); + } + }; + }); + } + + exports.styleMapping = function () { + throw new Error( + "Use a raw string instead of mammoth.styleMapping e.g. \"p[style-name='Title'] => h1\" instead of mammoth.styleMapping(\"p[style-name='Title'] => h1\")" + ); + }; + }).call(this, require("buffer").Buffer); + }, + { + "./document-to-html": 3, + "./docx/docx-reader": 9, + "./docx/style-map": 14, + "./images": 20, + "./options-reader": 22, + "./raw-text": 24, + "./results": 25, + "./style-reader": 26, + "./transforms": 30, + "./underline": 31, + "./unzip": 2, + buffer: 48, + underscore: 67 + } + ], + 22: [ + function (require, module, exports) { + exports.readOptions = readOptions; + + var _ = require("underscore"); + + var defaultStyleMap = (exports._defaultStyleMap = [ + "p.Heading1 => h1:fresh", + "p.Heading2 => h2:fresh", + "p.Heading3 => h3:fresh", + "p.Heading4 => h4:fresh", + "p.Heading5 => h5:fresh", + "p.Heading6 => h6:fresh", + "p[style-name='Heading 1'] => h1:fresh", + "p[style-name='Heading 2'] => h2:fresh", + "p[style-name='Heading 3'] => h3:fresh", + "p[style-name='Heading 4'] => h4:fresh", + "p[style-name='Heading 5'] => h5:fresh", + "p[style-name='Heading 6'] => h6:fresh", + "p[style-name='heading 1'] => h1:fresh", + "p[style-name='heading 2'] => h2:fresh", + "p[style-name='heading 3'] => h3:fresh", + "p[style-name='heading 4'] => h4:fresh", + "p[style-name='heading 5'] => h5:fresh", + "p[style-name='heading 6'] => h6:fresh", + + "r[style-name='Strong'] => strong", + + "p[style-name='footnote text'] => p:fresh", + "r[style-name='footnote reference'] =>", + "p[style-name='endnote text'] => p:fresh", + "r[style-name='endnote reference'] =>", + "p[style-name='annotation text'] => p:fresh", + "r[style-name='annotation reference'] =>", + + // LibreOffice + "p[style-name='Footnote'] => p:fresh", + "r[style-name='Footnote anchor'] =>", + "p[style-name='Endnote'] => p:fresh", + "r[style-name='Endnote anchor'] =>", + + "p:unordered-list(1) => ul > li:fresh", + "p:unordered-list(2) => ul|ol > li > ul > li:fresh", + "p:unordered-list(3) => ul|ol > li > ul|ol > li > ul > li:fresh", + "p:unordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh", + "p:unordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh", + "p:ordered-list(1) => ol > li:fresh", + "p:ordered-list(2) => ul|ol > li > ol > li:fresh", + "p:ordered-list(3) => ul|ol > li > ul|ol > li > ol > li:fresh", + "p:ordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh", + "p:ordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh", + + "r[style-name='Hyperlink'] =>", + + "p[style-name='Normal'] => p:fresh" + ]); + + var standardOptions = (exports._standardOptions = { + transformDocument: identity, + includeDefaultStyleMap: true, + includeEmbeddedStyleMap: true + }); + + function readOptions(options) { + options = options || {}; + return _.extend({}, standardOptions, options, { + customStyleMap: readStyleMap(options.styleMap), + readStyleMap: function () { + var styleMap = this.customStyleMap; + if (this.includeEmbeddedStyleMap) { + styleMap = styleMap.concat(readStyleMap(this.embeddedStyleMap)); + } + if (this.includeDefaultStyleMap) { + styleMap = styleMap.concat(defaultStyleMap); + } + return styleMap; + } + }); + } + + function readStyleMap(styleMap) { + if (!styleMap) { + return []; + } else if (_.isString(styleMap)) { + return styleMap + .split("\n") + .map(function (line) { + return line.trim(); + }) + .filter(function (line) { + return line !== "" && line.charAt(0) !== "#"; + }); + } else { + return styleMap; + } + } + + function identity(value) { + return value; + } + }, + { underscore: 67 } + ], + 23: [ + function (require, module, exports) { + (function (process) { + var _ = require("underscore"); + // Replace bluebird with native Promises + // var bluebird = require("bluebird/js/release/promise")(); + + // Use the built-in Promise + // This avoids the need to check if Promise is available + // since we're requiring Node.js 12+ in package.json + exports.defer = defer; + exports.when = when; + exports.resolve = resolve; + exports.all = all; + exports.props = props; + exports.reject = reject; + exports.promisify = promisify; + exports.mapSeries = mapSeries; + exports.attempt = attempt; + exports.nfcall = nfcall; + + function when(value) { + return wrapPromise(Promise.resolve(value)); + } + + function resolve(value) { + return wrapPromise(Promise.resolve(value)); + } + + function all(values) { + return wrapPromise(Promise.all(values)); + } + + function reject(reason) { + return wrapPromise(Promise.reject(reason)); + } + + function nfcall(func) { + var args = Array.prototype.slice.call(arguments, 1); + var promisedFunc = promisify(func); + return promisedFunc.apply(null, args); + } + + // Since we can't modify Promise.prototype, we'll wrap promises + function wrapPromise(promise) { + // We need to store the original promise for methods like .done + var originalPromise = promise; + var wrapped = promise.then(function (value) { + // This first .then ensures we have a native promise base + // before potentially overriding .then + return value; + }); + + // Override .then to always return a wrapped promise + wrapped.then = function (onFulfilled, onRejected) { + // Call the original native .then but wrap its result + var newPromise = originalPromise.then(onFulfilled, onRejected); + return wrapPromise(newPromise); + }; + + // Add .fail as an alias for .catch for Q compatibility + wrapped.fail = function (onRejected) { + return wrapPromise(originalPromise.catch(onRejected)); + }; + + // Add .caught which is a Bluebird alias for .catch + wrapped.caught = function (onRejected) { + return wrapPromise(originalPromise.catch(onRejected)); + }; + + // Add .done() method which is used in Bluebird to terminate the chain + // and throw any unhandled errors + wrapped.done = function () { + // Use the original promise here to avoid infinite recursion with the overridden .then + return originalPromise.catch(function (error) { + // In the next tick, throw the error + process.nextTick(function () { + throw error; + }); + }); + }; + + // Add .tap method from Bluebird which runs a function and returns the original value + wrapped.tap = function (onFulfilled) { + // Use the overridden .then to keep the chain wrapped + return wrapped.then(function (value) { + return Promise.resolve(onFulfilled(value)).then(function () { + return value; + }); + }); + }; + + // Add .also method which is used to add additional properties to the result + wrapped.also = function (func) { + // Use the overridden .then to keep the chain wrapped + return wrapped.then(function (value) { + var returnValue = _.extend({}, value, func(value)); + return props(returnValue); + }); + }; + + return wrapped; + } + + function defer() { + var resolve; + var reject; + var promise = new Promise(function (resolveArg, rejectArg) { + resolve = resolveArg; + reject = rejectArg; + }); + + return { + resolve: resolve, + reject: reject, + promise: wrapPromise(promise) + }; + } + + // Implement Bluebird's props method using native Promises + function props(obj) { + var keys = Object.keys(obj); + var values = keys.map(function (key) { + return obj[key]; + }); + + return wrapPromise( + Promise.all(values).then(function (results) { + var result = {}; + keys.forEach(function (key, index) { + result[key] = results[index]; + }); + return result; + }) + ); + } + + // Implement Bluebird's promisify + function promisify(nodeFunction) { + return function () { + var self = this; + var args = Array.prototype.slice.call(arguments); + + return wrapPromise( + new Promise(function (resolve, reject) { + args.push(function (err, result) { + if (err) { + reject(err); + } else { + resolve(result); + } + }); + + nodeFunction.apply(self, args); + }) + ); + }; + } + + // Implement Bluebird's mapSeries + function mapSeries(items, iterator) { + if (!items.length) { + return wrapPromise(Promise.resolve([])); + } + + var results = []; + var current = Promise.resolve(); + + items.forEach(function (item) { + current = current + .then(function () { + return iterator(item); + }) + .then(function (result) { + results.push(result); + }); + }); + + return wrapPromise( + current.then(function () { + return results; + }) + ); + } + + // Implement Bluebird's attempt + function attempt(fn) { + try { + return wrapPromise(Promise.resolve(fn())); + } catch (error) { + return wrapPromise(Promise.reject(error)); + } + } + }).call(this, require("_process")); + }, + { _process: 66, underscore: 67 } + ], + 24: [ + function (require, module, exports) { + var documents = require("./documents"); + + function convertElementToRawText(element) { + if (element.type === "text") { + return element.value; + } else if (element.type === documents.types.tab) { + return "\t"; + } else { + var tail = element.type === "paragraph" ? "\n\n" : ""; + return (element.children || []).map(convertElementToRawText).join("") + tail; + } + } + + exports.convertElementToRawText = convertElementToRawText; + }, + { "./documents": 4 } + ], + 25: [ + function (require, module, exports) { + var _ = require("underscore"); + + exports.Result = Result; + exports.success = success; + exports.warning = warning; + exports.error = error; + + function Result(value, messages) { + this.value = value; + this.messages = messages || []; + } + + Result.prototype.map = function (func) { + return new Result(func(this.value), this.messages); + }; + + Result.prototype.flatMap = function (func) { + var funcResult = func(this.value); + return new Result(funcResult.value, combineMessages([this, funcResult])); + }; + + Result.prototype.flatMapThen = function (func) { + var that = this; + return func(this.value).then(function (otherResult) { + return new Result(otherResult.value, combineMessages([that, otherResult])); + }); + }; + + Result.combine = function (results) { + var values = _.flatten(_.pluck(results, "value")); + var messages = combineMessages(results); + return new Result(values, messages); + }; + + function success(value) { + return new Result(value, []); + } + + function warning(message) { + return { + type: "warning", + message: message + }; + } + + function error(exception) { + return { + type: "error", + message: exception.message, + error: exception + }; + } + + function combineMessages(results) { + var messages = []; + _.flatten(_.pluck(results, "messages"), true).forEach(function (message) { + if (!containsMessage(messages, message)) { + messages.push(message); + } + }); + return messages; + } + + function containsMessage(messages, message) { + return _.find(messages, isSameMessage.bind(null, message)) !== undefined; + } + + function isSameMessage(first, second) { + return first.type === second.type && first.message === second.message; + } + }, + { underscore: 67 } + ], + 26: [ + function (require, module, exports) { + var _ = require("underscore"); + var lop = require("lop"); + + var documentMatchers = require("./styles/document-matchers"); + var htmlPaths = require("./styles/html-paths"); + var tokenise = require("./styles/parser/tokeniser").tokenise; + var results = require("./results"); + + exports.readHtmlPath = readHtmlPath; + exports.readDocumentMatcher = readDocumentMatcher; + exports.readStyle = readStyle; + + function readStyle(string) { + return parseString(styleRule, string); + } + + function createStyleRule() { + return lop.rules + .sequence( + lop.rules.sequence.capture(documentMatcherRule()), + lop.rules.tokenOfType("whitespace"), + lop.rules.tokenOfType("arrow"), + lop.rules.sequence.capture( + lop.rules.optional( + lop.rules + .sequence( + lop.rules.tokenOfType("whitespace"), + lop.rules.sequence.capture(htmlPathRule()) + ) + .head() + ) + ), + lop.rules.tokenOfType("end") + ) + .map(function (documentMatcher, htmlPath) { + return { + from: documentMatcher, + to: htmlPath.valueOrElse(htmlPaths.empty) + }; + }); + } + + function readDocumentMatcher(string) { + return parseString(documentMatcherRule(), string); + } + + function documentMatcherRule() { + var sequence = lop.rules.sequence; + + var identifierToConstant = function (identifier, constant) { + return lop.rules.then(lop.rules.token("identifier", identifier), function () { + return constant; + }); + }; + + var paragraphRule = identifierToConstant("p", documentMatchers.paragraph); + var runRule = identifierToConstant("r", documentMatchers.run); + + var elementTypeRule = lop.rules.firstOf("p or r or table", paragraphRule, runRule); + + var styleIdRule = lop.rules + .sequence( + lop.rules.tokenOfType("dot"), + lop.rules.sequence.cut(), + lop.rules.sequence.capture(identifierRule) + ) + .map(function (styleId) { + return { styleId: styleId }; + }); + + var styleNameMatcherRule = lop.rules.firstOf( + "style name matcher", + lop.rules.then( + lop.rules + .sequence( + lop.rules.tokenOfType("equals"), + lop.rules.sequence.cut(), + lop.rules.sequence.capture(stringRule) + ) + .head(), + function (styleName) { + return { styleName: documentMatchers.equalTo(styleName) }; + } + ), + lop.rules.then( + lop.rules + .sequence( + lop.rules.tokenOfType("startsWith"), + lop.rules.sequence.cut(), + lop.rules.sequence.capture(stringRule) + ) + .head(), + function (styleName) { + return { styleName: documentMatchers.startsWith(styleName) }; + } + ) + ); + + var styleNameRule = lop.rules + .sequence( + lop.rules.tokenOfType("open-square-bracket"), + lop.rules.sequence.cut(), + lop.rules.token("identifier", "style-name"), + lop.rules.sequence.capture(styleNameMatcherRule), + lop.rules.tokenOfType("close-square-bracket") + ) + .head(); + + var listTypeRule = lop.rules.firstOf( + "list type", + identifierToConstant("ordered-list", { isOrdered: true }), + identifierToConstant("unordered-list", { isOrdered: false }) + ); + var listRule = sequence( + lop.rules.tokenOfType("colon"), + sequence.capture(listTypeRule), + sequence.cut(), + lop.rules.tokenOfType("open-paren"), + sequence.capture(integerRule), + lop.rules.tokenOfType("close-paren") + ).map(function (listType, levelNumber) { + return { + list: { + isOrdered: listType.isOrdered, + levelIndex: levelNumber - 1 + } + }; + }); + + function createMatcherSuffixesRule(rules) { + var matcherSuffix = lop.rules.firstOf.apply( + lop.rules.firstOf, + ["matcher suffix"].concat(rules) + ); + var matcherSuffixes = lop.rules.zeroOrMore(matcherSuffix); + return lop.rules.then(matcherSuffixes, function (suffixes) { + var matcherOptions = {}; + suffixes.forEach(function (suffix) { + _.extend(matcherOptions, suffix); + }); + return matcherOptions; + }); + } + + var paragraphOrRun = sequence( + sequence.capture(elementTypeRule), + sequence.capture(createMatcherSuffixesRule([styleIdRule, styleNameRule, listRule])) + ).map(function (createMatcher, matcherOptions) { + return createMatcher(matcherOptions); + }); + + var table = sequence( + lop.rules.token("identifier", "table"), + sequence.capture(createMatcherSuffixesRule([styleIdRule, styleNameRule])) + ).map(function (options) { + return documentMatchers.table(options); + }); + + var bold = identifierToConstant("b", documentMatchers.bold); + var italic = identifierToConstant("i", documentMatchers.italic); + var underline = identifierToConstant("u", documentMatchers.underline); + var strikethrough = identifierToConstant("strike", documentMatchers.strikethrough); + var allCaps = identifierToConstant("all-caps", documentMatchers.allCaps); + var smallCaps = identifierToConstant("small-caps", documentMatchers.smallCaps); + + var highlight = sequence( + lop.rules.token("identifier", "highlight"), + lop.rules.sequence.capture( + lop.rules.optional( + lop.rules + .sequence( + lop.rules.tokenOfType("open-square-bracket"), + lop.rules.sequence.cut(), + lop.rules.token("identifier", "color"), + lop.rules.tokenOfType("equals"), + lop.rules.sequence.capture(stringRule), + lop.rules.tokenOfType("close-square-bracket") + ) + .head() + ) + ) + ).map(function (color) { + return documentMatchers.highlight({ + color: color.valueOrElse(undefined) + }); + }); + + var commentReference = identifierToConstant( + "comment-reference", + documentMatchers.commentReference + ); + + var breakMatcher = sequence( + lop.rules.token("identifier", "br"), + sequence.cut(), + lop.rules.tokenOfType("open-square-bracket"), + lop.rules.token("identifier", "type"), + lop.rules.tokenOfType("equals"), + sequence.capture(stringRule), + lop.rules.tokenOfType("close-square-bracket") + ).map(function (breakType) { + switch (breakType) { + case "line": + return documentMatchers.lineBreak; + case "page": + return documentMatchers.pageBreak; + case "column": + return documentMatchers.columnBreak; + default: + // TODO: handle unknown document matchers + } + }); + + return lop.rules.firstOf( + "element type", + paragraphOrRun, + table, + bold, + italic, + underline, + strikethrough, + allCaps, + smallCaps, + highlight, + commentReference, + breakMatcher + ); + } + + function readHtmlPath(string) { + return parseString(htmlPathRule(), string); + } + + function htmlPathRule() { + var capture = lop.rules.sequence.capture; + var whitespaceRule = lop.rules.tokenOfType("whitespace"); + var freshRule = lop.rules.then( + lop.rules.optional( + lop.rules.sequence( + lop.rules.tokenOfType("colon"), + lop.rules.token("identifier", "fresh") + ) + ), + function (option) { + return option + .map(function () { + return true; + }) + .valueOrElse(false); + } + ); + + var separatorRule = lop.rules.then( + lop.rules.optional( + lop.rules + .sequence( + lop.rules.tokenOfType("colon"), + lop.rules.token("identifier", "separator"), + lop.rules.tokenOfType("open-paren"), + capture(stringRule), + lop.rules.tokenOfType("close-paren") + ) + .head() + ), + function (option) { + return option.valueOrElse(""); + } + ); + + var tagNamesRule = lop.rules.oneOrMoreWithSeparator( + identifierRule, + lop.rules.tokenOfType("choice") + ); + + var styleElementRule = lop.rules + .sequence( + capture(tagNamesRule), + capture(lop.rules.zeroOrMore(attributeOrClassRule)), + capture(freshRule), + capture(separatorRule) + ) + .map(function (tagName, attributesList, fresh, separator) { + var attributes = {}; + var options = {}; + attributesList.forEach(function (attribute) { + if (attribute.append && attributes[attribute.name]) { + attributes[attribute.name] += " " + attribute.value; + } else { + attributes[attribute.name] = attribute.value; + } + }); + if (fresh) { + options.fresh = true; + } + if (separator) { + options.separator = separator; + } + return htmlPaths.element(tagName, attributes, options); + }); + + return lop.rules.firstOf( + "html path", + lop.rules.then(lop.rules.tokenOfType("bang"), function () { + return htmlPaths.ignore; + }), + lop.rules.then( + lop.rules.zeroOrMoreWithSeparator( + styleElementRule, + lop.rules.sequence(whitespaceRule, lop.rules.tokenOfType("gt"), whitespaceRule) + ), + htmlPaths.elements + ) + ); + } + + var identifierRule = lop.rules.then(lop.rules.tokenOfType("identifier"), decodeEscapeSequences); + var integerRule = lop.rules.tokenOfType("integer"); + + var stringRule = lop.rules.then(lop.rules.tokenOfType("string"), decodeEscapeSequences); + + var escapeSequences = { + n: "\n", + r: "\r", + t: "\t" + }; + + function decodeEscapeSequences(value) { + return value.replace(/\\(.)/g, function (match, code) { + return escapeSequences[code] || code; + }); + } + + var attributeRule = lop.rules + .sequence( + lop.rules.tokenOfType("open-square-bracket"), + lop.rules.sequence.cut(), + lop.rules.sequence.capture(identifierRule), + lop.rules.tokenOfType("equals"), + lop.rules.sequence.capture(stringRule), + lop.rules.tokenOfType("close-square-bracket") + ) + .map(function (name, value) { + return { name: name, value: value, append: false }; + }); + + var classRule = lop.rules + .sequence( + lop.rules.tokenOfType("dot"), + lop.rules.sequence.cut(), + lop.rules.sequence.capture(identifierRule) + ) + .map(function (className) { + return { name: "class", value: className, append: true }; + }); + + var attributeOrClassRule = lop.rules.firstOf("attribute or class", attributeRule, classRule); + + function parseString(rule, string) { + var tokens = tokenise(string); + var parser = lop.Parser(); + var parseResult = parser.parseTokens(rule, tokens); + if (parseResult.isSuccess()) { + return results.success(parseResult.value()); + } else { + return new results.Result(null, [results.warning(describeFailure(string, parseResult))]); + } + } + + function describeFailure(input, parseResult) { + return ( + "Did not understand this style mapping, so ignored it: " + + input + + "\n" + + parseResult.errors().map(describeError).join("\n") + ); + } + + function describeError(error) { + return ( + "Error was at character number " + + error.characterNumber() + + ": " + + "Expected " + + error.expected + + " but got " + + error.actual + ); + } + + var styleRule = createStyleRule(); + }, + { + "./results": 25, + "./styles/document-matchers": 27, + "./styles/html-paths": 28, + "./styles/parser/tokeniser": 29, + lop: 54, + underscore: 67 + } + ], + 27: [ + function (require, module, exports) { + exports.paragraph = paragraph; + exports.run = run; + exports.table = table; + exports.bold = new Matcher("bold"); + exports.italic = new Matcher("italic"); + exports.underline = new Matcher("underline"); + exports.strikethrough = new Matcher("strikethrough"); + exports.allCaps = new Matcher("allCaps"); + exports.smallCaps = new Matcher("smallCaps"); + exports.highlight = highlight; + exports.commentReference = new Matcher("commentReference"); + exports.lineBreak = new BreakMatcher({ breakType: "line" }); + exports.pageBreak = new BreakMatcher({ breakType: "page" }); + exports.columnBreak = new BreakMatcher({ breakType: "column" }); + exports.equalTo = equalTo; + exports.startsWith = startsWith; + + function paragraph(options) { + return new Matcher("paragraph", options); + } + + function run(options) { + return new Matcher("run", options); + } + + function table(options) { + return new Matcher("table", options); + } + + function highlight(options) { + return new HighlightMatcher(options); + } + + function Matcher(elementType, options) { + options = options || {}; + this._elementType = elementType; + this._styleId = options.styleId; + this._styleName = options.styleName; + if (options.list) { + this._listIndex = options.list.levelIndex; + this._listIsOrdered = options.list.isOrdered; + } + } + + Matcher.prototype.matches = function (element) { + return ( + element.type === this._elementType && + (this._styleId === undefined || element.styleId === this._styleId) && + (this._styleName === undefined || + (element.styleName && + this._styleName.operator(this._styleName.operand, element.styleName))) && + (this._listIndex === undefined || isList(element, this._listIndex, this._listIsOrdered)) && + (this._breakType === undefined || this._breakType === element.breakType) + ); + }; + + function HighlightMatcher(options) { + options = options || {}; + this._color = options.color; + } + + HighlightMatcher.prototype.matches = function (element) { + return ( + element.type === "highlight" && (this._color === undefined || element.color === this._color) + ); + }; + + function BreakMatcher(options) { + options = options || {}; + this._breakType = options.breakType; + } + + BreakMatcher.prototype.matches = function (element) { + return ( + element.type === "break" && + (this._breakType === undefined || element.breakType === this._breakType) + ); + }; + + function isList(element, levelIndex, isOrdered) { + return ( + element.numbering && + element.numbering.level == levelIndex && + element.numbering.isOrdered == isOrdered + ); + } + + function equalTo(value) { + return { + operator: operatorEqualTo, + operand: value + }; + } + + function startsWith(value) { + return { + operator: operatorStartsWith, + operand: value + }; + } + + function operatorEqualTo(first, second) { + return first.toUpperCase() === second.toUpperCase(); + } + + function operatorStartsWith(first, second) { + return second.toUpperCase().indexOf(first.toUpperCase()) === 0; + } + }, + {} + ], + 28: [ + function (require, module, exports) { + var _ = require("underscore"); + + var html = require("../html"); + + exports.topLevelElement = topLevelElement; + exports.elements = elements; + exports.element = element; + + function topLevelElement(tagName, attributes) { + return elements([element(tagName, attributes, { fresh: true })]); + } + + function elements(elementStyles) { + return new HtmlPath( + elementStyles.map(function (elementStyle) { + if (_.isString(elementStyle)) { + return element(elementStyle); + } else { + return elementStyle; + } + }) + ); + } + + function HtmlPath(elements) { + this._elements = elements; + } + + HtmlPath.prototype.wrap = function wrap(children) { + var result = children(); + for (var index = this._elements.length - 1; index >= 0; index--) { + result = this._elements[index].wrapNodes(result); + } + return result; + }; + + function element(tagName, attributes, options) { + options = options || {}; + return new Element(tagName, attributes, options); + } + + function Element(tagName, attributes, options) { + var tagNames = {}; + if (_.isArray(tagName)) { + tagName.forEach(function (tagName) { + tagNames[tagName] = true; + }); + tagName = tagName[0]; + } else { + tagNames[tagName] = true; + } + + this.tagName = tagName; + this.tagNames = tagNames; + this.attributes = attributes || {}; + this.fresh = options.fresh; + this.separator = options.separator; + } + + Element.prototype.matchesElement = function (element) { + return ( + this.tagNames[element.tagName] && _.isEqual(this.attributes || {}, element.attributes || {}) + ); + }; + + Element.prototype.wrap = function wrap(generateNodes) { + return this.wrapNodes(generateNodes()); + }; + + Element.prototype.wrapNodes = function wrapNodes(nodes) { + return [html.elementWithTag(this, nodes)]; + }; + + exports.empty = elements([]); + exports.ignore = { + wrap: function () { + return []; + } + }; + }, + { "../html": 18, underscore: 67 } + ], + 29: [ + function (require, module, exports) { + var lop = require("lop"); + var RegexTokeniser = lop.RegexTokeniser; + + exports.tokenise = tokenise; + + var stringPrefix = "'((?:\\\\.|[^'])*)"; + + function tokenise(string) { + var identifierCharacter = "(?:[a-zA-Z\\-_]|\\\\.)"; + var tokeniser = new RegexTokeniser([ + { + name: "identifier", + regex: new RegExp("(" + identifierCharacter + "(?:" + identifierCharacter + "|[0-9])*)") + }, + { name: "dot", regex: /\./ }, + { name: "colon", regex: /:/ }, + { name: "gt", regex: />/ }, + { name: "whitespace", regex: /\s+/ }, + { name: "arrow", regex: /=>/ }, + { name: "equals", regex: /=/ }, + { name: "startsWith", regex: /\^=/ }, + { name: "open-paren", regex: /\(/ }, + { name: "close-paren", regex: /\)/ }, + { name: "open-square-bracket", regex: /\[/ }, + { name: "close-square-bracket", regex: /\]/ }, + { name: "string", regex: new RegExp(stringPrefix + "'") }, + { name: "unterminated-string", regex: new RegExp(stringPrefix) }, + { name: "integer", regex: /([0-9]+)/ }, + { name: "choice", regex: /\|/ }, + { name: "bang", regex: /(!)/ } + ]); + return tokeniser.tokenise(string); + } + }, + { lop: 54 } + ], + 30: [ + function (require, module, exports) { + var _ = require("underscore"); + + exports.paragraph = paragraph; + exports.run = run; + exports._elements = elements; + exports.getDescendantsOfType = getDescendantsOfType; + exports.getDescendants = getDescendants; + + function paragraph(transform) { + return elementsOfType("paragraph", transform); + } + + function run(transform) { + return elementsOfType("run", transform); + } + + function elementsOfType(elementType, transform) { + return elements(function (element) { + if (element.type === elementType) { + return transform(element); + } else { + return element; + } + }); + } + + function elements(transform) { + return function transformElement(element) { + if (element.children) { + var children = _.map(element.children, transformElement); + element = _.extend(element, { children: children }); + } + return transform(element); + }; + } + + function getDescendantsOfType(element, type) { + return getDescendants(element).filter(function (descendant) { + return descendant.type === type; + }); + } + + function getDescendants(element) { + var descendants = []; + + visitDescendants(element, function (descendant) { + descendants.push(descendant); + }); + + return descendants; + } + + function visitDescendants(element, visit) { + if (element.children) { + element.children.forEach(function (child) { + visitDescendants(child, visit); + visit(child); + }); + } + } + }, + { underscore: 67 } + ], + 31: [ + function (require, module, exports) { + var htmlPaths = require("./styles/html-paths"); + var Html = require("./html"); + + exports.element = element; + + function element(name) { + return function (html) { + return Html.elementWithTag(htmlPaths.element(name), [html]); + }; + } + }, + { "./html": 18, "./styles/html-paths": 28 } + ], + 32: [ + function (require, module, exports) { + var _ = require("underscore"); + + exports.writer = writer; + + function writer(options) { + options = options || {}; + if (options.prettyPrint) { + return prettyWriter(); + } else { + return simpleWriter(); + } + } + + var indentedElements = { + div: true, + p: true, + ul: true, + li: true + }; + + function prettyWriter() { + var indentationLevel = 0; + var indentation = " "; + var stack = []; + var start = true; + var inText = false; + + var writer = simpleWriter(); + + function open(tagName, attributes) { + if (indentedElements[tagName]) { + indent(); + } + stack.push(tagName); + writer.open(tagName, attributes); + if (indentedElements[tagName]) { + indentationLevel++; + } + start = false; + } + + function close(tagName) { + if (indentedElements[tagName]) { + indentationLevel--; + indent(); + } + stack.pop(); + writer.close(tagName); + } + + function text(value) { + startText(); + var text = isInPre() ? value : value.replace("\n", "\n" + indentation); + writer.text(text); + } + + function selfClosing(tagName, attributes) { + indent(); + writer.selfClosing(tagName, attributes); + } + + function insideIndentedElement() { + return stack.length === 0 || indentedElements[stack[stack.length - 1]]; + } + + function startText() { + if (!inText) { + indent(); + inText = true; + } + } + + function indent() { + inText = false; + if (!start && insideIndentedElement() && !isInPre()) { + writer._append("\n"); + for (var i = 0; i < indentationLevel; i++) { + writer._append(indentation); + } + } + } + + function isInPre() { + return _.some(stack, function (tagName) { + return tagName === "pre"; + }); + } + + return { + asString: writer.asString, + open: open, + close: close, + text: text, + selfClosing: selfClosing + }; + } + + function simpleWriter() { + var fragments = []; + + function open(tagName, attributes) { + var attributeString = generateAttributeString(attributes); + fragments.push("<" + tagName + attributeString + ">"); + } + + function close(tagName) { + fragments.push(""); + } + + function selfClosing(tagName, attributes) { + var attributeString = generateAttributeString(attributes); + fragments.push("<" + tagName + attributeString + " />"); + } + + function generateAttributeString(attributes) { + return _.map(attributes, function (value, key) { + return " " + key + '="' + escapeHtmlAttribute(value) + '"'; + }).join(""); + } + + function text(value) { + fragments.push(escapeHtmlText(value)); + } + + function append(html) { + fragments.push(html); + } + + function asString() { + return fragments.join(""); + } + + return { + asString: asString, + open: open, + close: close, + text: text, + selfClosing: selfClosing, + _append: append + }; + } + + function escapeHtmlText(value) { + return value.replace(/&/g, "&").replace(//g, ">"); + } + + function escapeHtmlAttribute(value) { + return value + .replace(/&/g, "&") + .replace(/"/g, """) + .replace(//g, ">"); + } + }, + { underscore: 67 } + ], + 33: [ + function (require, module, exports) { + var htmlWriter = require("./html-writer"); + var markdownWriter = require("./markdown-writer"); + + exports.writer = writer; + + function writer(options) { + options = options || {}; + if (options.outputFormat === "markdown") { + return markdownWriter.writer(); + } else { + return htmlWriter.writer(options); + } + } + }, + { "./html-writer": 32, "./markdown-writer": 34 } + ], + 34: [ + function (require, module, exports) { + var _ = require("underscore"); + + function symmetricMarkdownElement(end) { + return markdownElement(end, end); + } + + function markdownElement(start, end) { + return function () { + return { start: start, end: end }; + }; + } + + function markdownLink(attributes) { + var href = attributes.href || ""; + if (href) { + return { + start: "[", + end: "](" + href + ")", + anchorPosition: "before" + }; + } else { + return {}; + } + } + + function markdownImage(attributes) { + var src = attributes.src || ""; + var altText = attributes.alt || ""; + if (src || altText) { + return { start: "![" + altText + "](" + src + ")" }; + } else { + return {}; + } + } + + function markdownList(options) { + return function (attributes, list) { + return { + start: list ? "\n" : "", + end: list ? "" : "\n", + list: { + isOrdered: options.isOrdered, + indent: list ? list.indent + 1 : 0, + count: 0 + } + }; + }; + } + + function markdownListItem(attributes, list, listItem) { + list = list || { indent: 0, isOrdered: false, count: 0 }; + list.count++; + listItem.hasClosed = false; + + var bullet = list.isOrdered ? list.count + "." : "-"; + var start = repeatString("\t", list.indent) + bullet + " "; + + return { + start: start, + end: function () { + if (!listItem.hasClosed) { + listItem.hasClosed = true; + return "\n"; + } + } + }; + } + + var htmlToMarkdown = { + p: markdownElement("", "\n\n"), + br: markdownElement("", " \n"), + ul: markdownList({ isOrdered: false }), + ol: markdownList({ isOrdered: true }), + li: markdownListItem, + strong: symmetricMarkdownElement("__"), + em: symmetricMarkdownElement("*"), + a: markdownLink, + img: markdownImage + }; + + (function () { + for (var i = 1; i <= 6; i++) { + htmlToMarkdown["h" + i] = markdownElement(repeatString("#", i) + " ", "\n\n"); + } + })(); + + function repeatString(value, count) { + return new Array(count + 1).join(value); + } + + function markdownWriter() { + var fragments = []; + var elementStack = []; + var list = null; + var listItem = {}; + + function open(tagName, attributes) { + attributes = attributes || {}; + + var createElement = + htmlToMarkdown[tagName] || + function () { + return {}; + }; + var element = createElement(attributes, list, listItem); + elementStack.push({ end: element.end, list: list }); + + if (element.list) { + list = element.list; + } + + var anchorBeforeStart = element.anchorPosition === "before"; + if (anchorBeforeStart) { + writeAnchor(attributes); + } + + fragments.push(element.start || ""); + if (!anchorBeforeStart) { + writeAnchor(attributes); + } + } + + function writeAnchor(attributes) { + if (attributes.id) { + fragments.push(''); + } + } + + function close(tagName) { + var element = elementStack.pop(); + list = element.list; + var end = _.isFunction(element.end) ? element.end() : element.end; + fragments.push(end || ""); + } + + function selfClosing(tagName, attributes) { + open(tagName, attributes); + close(tagName); + } + + function text(value) { + fragments.push(escapeMarkdown(value)); + } + + function asString() { + return fragments.join(""); + } + + return { + asString: asString, + open: open, + close: close, + text: text, + selfClosing: selfClosing + }; + } + + exports.writer = markdownWriter; + + function escapeMarkdown(value) { + return value.replace(/\\/g, "\\\\").replace(/([\`\*_\{\}\[\]\(\)\#\+\-\.\!])/g, "\\$1"); + } + }, + { underscore: 67 } + ], + 35: [ + function (require, module, exports) { + var nodes = require("./nodes"); + + exports.Element = nodes.Element; + exports.element = nodes.element; + exports.emptyElement = nodes.emptyElement; + exports.text = nodes.text; + exports.readString = require("./reader").readString; + exports.writeString = require("./writer").writeString; + }, + { "./nodes": 36, "./reader": 37, "./writer": 38 } + ], + 36: [ + function (require, module, exports) { + var _ = require("underscore"); + + exports.Element = Element; + exports.element = function (name, attributes, children) { + return new Element(name, attributes, children); + }; + exports.text = function (value) { + return { + type: "text", + value: value + }; + }; + + var emptyElement = (exports.emptyElement = { + first: function () { + return null; + }, + firstOrEmpty: function () { + return emptyElement; + }, + attributes: {}, + children: [] + }); + + function Element(name, attributes, children) { + this.type = "element"; + this.name = name; + this.attributes = attributes || {}; + this.children = children || []; + } + + Element.prototype.first = function (name) { + return _.find(this.children, function (child) { + return child.name === name; + }); + }; + + Element.prototype.firstOrEmpty = function (name) { + return this.first(name) || emptyElement; + }; + + Element.prototype.getElementsByTagName = function (name) { + var elements = _.filter(this.children, function (child) { + return child.name === name; + }); + return toElementList(elements); + }; + + Element.prototype.text = function () { + if (this.children.length === 0) { + return ""; + } else if (this.children.length !== 1 || this.children[0].type !== "text") { + throw new Error("Not implemented"); + } + return this.children[0].value; + }; + + var elementListPrototype = { + getElementsByTagName: function (name) { + return toElementList( + _.flatten( + this.map(function (element) { + return element.getElementsByTagName(name); + }, true) + ) + ); + } + }; + + function toElementList(array) { + return _.extend(array, elementListPrototype); + } + }, + { underscore: 67 } + ], + 37: [ + function (require, module, exports) { + var promises = require("../promises"); + var _ = require("underscore"); + + var xmldom = require("./xmldom"); + var nodes = require("./nodes"); + var Element = nodes.Element; + + exports.readString = readString; + + var Node = xmldom.Node; + + function readString(xmlString, namespaceMap) { + namespaceMap = namespaceMap || {}; + + try { + var document = xmldom.parseFromString(xmlString, "text/xml"); + } catch (error) { + return promises.reject(error); + } + + if (document.documentElement.tagName === "parsererror") { + return promises.resolve(new Error(document.documentElement.textContent)); + } + + function convertNode(node) { + switch (node.nodeType) { + case Node.ELEMENT_NODE: + return convertElement(node); + case Node.TEXT_NODE: + return nodes.text(node.nodeValue); + } + } + + function convertElement(element) { + var convertedName = convertName(element); + + var convertedChildren = []; + _.forEach(element.childNodes, function (childNode) { + var convertedNode = convertNode(childNode); + if (convertedNode) { + convertedChildren.push(convertedNode); + } + }); + + var convertedAttributes = {}; + _.forEach(element.attributes, function (attribute) { + convertedAttributes[convertName(attribute)] = attribute.value; + }); + + return new Element(convertedName, convertedAttributes, convertedChildren); + } + + function convertName(node) { + if (node.namespaceURI) { + var mappedPrefix = namespaceMap[node.namespaceURI]; + var prefix; + if (mappedPrefix) { + prefix = mappedPrefix + ":"; + } else { + prefix = "{" + node.namespaceURI + "}"; + } + return prefix + node.localName; + } else { + return node.localName; + } + } + + return promises.resolve(convertNode(document.documentElement)); + } + }, + { "../promises": 23, "./nodes": 36, "./xmldom": 39, underscore: 67 } + ], + 38: [ + function (require, module, exports) { + var _ = require("underscore"); + var xmlbuilder = require("xmlbuilder"); + + exports.writeString = writeString; + + function writeString(root, namespaces) { + var uriToPrefix = _.invert(namespaces); + + var nodeWriters = { + element: writeElement, + text: writeTextNode + }; + + function writeNode(builder, node) { + return nodeWriters[node.type](builder, node); + } + + function writeElement(builder, element) { + var elementBuilder = builder.element(mapElementName(element.name), element.attributes); + element.children.forEach(function (child) { + writeNode(elementBuilder, child); + }); + } + + function mapElementName(name) { + var longFormMatch = /^\{(.*)\}(.*)$/.exec(name); + if (longFormMatch) { + var prefix = uriToPrefix[longFormMatch[1]]; + return prefix + (prefix === "" ? "" : ":") + longFormMatch[2]; + } else { + return name; + } + } + + function writeDocument(root) { + var builder = xmlbuilder.create(mapElementName(root.name), { + version: "1.0", + encoding: "UTF-8", + standalone: true + }); + + _.forEach(namespaces, function (uri, prefix) { + var key = "xmlns" + (prefix === "" ? "" : ":" + prefix); + builder.attribute(key, uri); + }); + + root.children.forEach(function (child) { + writeNode(builder, child); + }); + return builder.end(); + } + + return writeDocument(root); + } + + function writeTextNode(builder, node) { + builder.text(node.value); + } + }, + { underscore: 67, xmlbuilder: 89 } + ], + 39: [ + function (require, module, exports) { + var xmldom = require("@xmldom/xmldom"); + var dom = require("@xmldom/xmldom/lib/dom"); + + function parseFromString(string) { + var error = null; + + var domParser = new xmldom.DOMParser({ + errorHandler: function (level, message) { + error = { level: level, message: message }; + } + }); + + var document = domParser.parseFromString(string); + + if (error === null) { + return document; + } else { + throw new Error(error.level + ": " + error.message); + } + } + + exports.parseFromString = parseFromString; + exports.Node = dom.Node; + }, + { "@xmldom/xmldom": 45, "@xmldom/xmldom/lib/dom": 43 } + ], + 40: [ + function (require, module, exports) { + var base64js = require("base64-js"); + var JSZip = require("jszip"); + + exports.openArrayBuffer = openArrayBuffer; + exports.splitPath = splitPath; + exports.joinPath = joinPath; + + function openArrayBuffer(arrayBuffer) { + return JSZip.loadAsync(arrayBuffer).then(function (zipFile) { + function exists(name) { + return zipFile.file(name) !== null; + } + + function read(name, encoding) { + return zipFile + .file(name) + .async("uint8array") + .then(function (array) { + if (encoding === "base64") { + return base64js.fromByteArray(array); + } else if (encoding) { + var decoder = new TextDecoder(encoding); + return decoder.decode(array); + } else { + return array; + } + }); + } + + function write(name, contents) { + zipFile.file(name, contents); + } + + function toArrayBuffer() { + return zipFile.generateAsync({ type: "arraybuffer" }); + } + + return { + exists: exists, + read: read, + write: write, + toArrayBuffer: toArrayBuffer + }; + }); + } + + function splitPath(path) { + var lastIndex = path.lastIndexOf("/"); + if (lastIndex === -1) { + return { dirname: "", basename: path }; + } else { + return { + dirname: path.substring(0, lastIndex), + basename: path.substring(lastIndex + 1) + }; + } + } + + function joinPath() { + var nonEmptyPaths = Array.prototype.filter.call(arguments, function (path) { + return path; + }); + + var relevantPaths = []; + + nonEmptyPaths.forEach(function (path) { + if (/^\//.test(path)) { + relevantPaths = [path]; + } else { + relevantPaths.push(path); + } + }); + + return relevantPaths.join("/"); + } + }, + { "base64-js": 47, jszip: 53 } + ], + 41: [ + function (require, module, exports) { + "use strict"; + + /** + * Ponyfill for `Array.prototype.find` which is only available in ES6 runtimes. + * + * Works with anything that has a `length` property and index access properties, including NodeList. + * + * @template {unknown} T + * @param {Array | ({length:number, [number]: T})} list + * @param {function (item: T, index: number, list:Array | ({length:number, [number]: T})):boolean} predicate + * @param {Partial>?} ac `Array.prototype` by default, + * allows injecting a custom implementation in tests + * @returns {T | undefined} + * + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find + * @see https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.find + */ + function find(list, predicate, ac) { + if (ac === undefined) { + ac = Array.prototype; + } + if (list && typeof ac.find === "function") { + return ac.find.call(list, predicate); + } + for (var i = 0; i < list.length; i++) { + if (Object.prototype.hasOwnProperty.call(list, i)) { + var item = list[i]; + if (predicate.call(undefined, item, i, list)) { + return item; + } + } + } + } + + /** + * "Shallow freezes" an object to render it immutable. + * Uses `Object.freeze` if available, + * otherwise the immutability is only in the type. + * + * Is used to create "enum like" objects. + * + * @template T + * @param {T} object the object to freeze + * @param {Pick = Object} oc `Object` by default, + * allows to inject custom object constructor for tests + * @returns {Readonly} + * + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze + */ + function freeze(object, oc) { + if (oc === undefined) { + oc = Object; + } + return oc && typeof oc.freeze === "function" ? oc.freeze(object) : object; + } + + /** + * Since we can not rely on `Object.assign` we provide a simplified version + * that is sufficient for our needs. + * + * @param {Object} target + * @param {Object | null | undefined} source + * + * @returns {Object} target + * @throws TypeError if target is not an object + * + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + * @see https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.assign + */ + function assign(target, source) { + if (target === null || typeof target !== "object") { + throw new TypeError("target is not an object"); + } + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + return target; + } + + /** + * All mime types that are allowed as input to `DOMParser.parseFromString` + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#Argument02 MDN + * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#domparsersupportedtype WHATWG HTML Spec + * @see DOMParser.prototype.parseFromString + */ + var MIME_TYPE = freeze({ + /** + * `text/html`, the only mime type that triggers treating an XML document as HTML. + * + * @see DOMParser.SupportedType.isHTML + * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration + * @see https://en.wikipedia.org/wiki/HTML Wikipedia + * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN + * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring WHATWG HTML Spec + */ + HTML: "text/html", + + /** + * Helper method to check a mime type if it indicates an HTML document + * + * @param {string} [value] + * @returns {boolean} + * + * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration + * @see https://en.wikipedia.org/wiki/HTML Wikipedia + * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN + * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring */ + isHTML: function (value) { + return value === MIME_TYPE.HTML; + }, + + /** + * `application/xml`, the standard mime type for XML documents. + * + * @see https://www.iana.org/assignments/media-types/application/xml IANA MimeType registration + * @see https://tools.ietf.org/html/rfc7303#section-9.1 RFC 7303 + * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia + */ + XML_APPLICATION: "application/xml", + + /** + * `text/html`, an alias for `application/xml`. + * + * @see https://tools.ietf.org/html/rfc7303#section-9.2 RFC 7303 + * @see https://www.iana.org/assignments/media-types/text/xml IANA MimeType registration + * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia + */ + XML_TEXT: "text/xml", + + /** + * `application/xhtml+xml`, indicates an XML document that has the default HTML namespace, + * but is parsed as an XML document. + * + * @see https://www.iana.org/assignments/media-types/application/xhtml+xml IANA MimeType registration + * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument WHATWG DOM Spec + * @see https://en.wikipedia.org/wiki/XHTML Wikipedia + */ + XML_XHTML_APPLICATION: "application/xhtml+xml", + + /** + * `image/svg+xml`, + * + * @see https://www.iana.org/assignments/media-types/image/svg+xml IANA MimeType registration + * @see https://www.w3.org/TR/SVG11/ W3C SVG 1.1 + * @see https://en.wikipedia.org/wiki/Scalable_Vector_Graphics Wikipedia + */ + XML_SVG_IMAGE: "image/svg+xml" + }); + + /** + * Namespaces that are used in this code base. + * + * @see http://www.w3.org/TR/REC-xml-names + */ + var NAMESPACE = freeze({ + /** + * The XHTML namespace. + * + * @see http://www.w3.org/1999/xhtml + */ + HTML: "http://www.w3.org/1999/xhtml", + + /** + * Checks if `uri` equals `NAMESPACE.HTML`. + * + * @param {string} [uri] + * + * @see NAMESPACE.HTML + */ + isHTML: function (uri) { + return uri === NAMESPACE.HTML; + }, + + /** + * The SVG namespace. + * + * @see http://www.w3.org/2000/svg + */ + SVG: "http://www.w3.org/2000/svg", + + /** + * The `xml:` namespace. + * + * @see http://www.w3.org/XML/1998/namespace + */ + XML: "http://www.w3.org/XML/1998/namespace", + + /** + * The `xmlns:` namespace + * + * @see https://www.w3.org/2000/xmlns/ + */ + XMLNS: "http://www.w3.org/2000/xmlns/" + }); + + exports.assign = assign; + exports.find = find; + exports.freeze = freeze; + exports.MIME_TYPE = MIME_TYPE; + exports.NAMESPACE = NAMESPACE; + }, + {} + ], + 42: [ + function (require, module, exports) { + var conventions = require("./conventions"); + var dom = require("./dom"); + var entities = require("./entities"); + var sax = require("./sax"); + + var DOMImplementation = dom.DOMImplementation; + + var NAMESPACE = conventions.NAMESPACE; + + var ParseError = sax.ParseError; + var XMLReader = sax.XMLReader; + + /** + * Normalizes line ending according to https://www.w3.org/TR/xml11/#sec-line-ends: + * + * > XML parsed entities are often stored in computer files which, + * > for editing convenience, are organized into lines. + * > These lines are typically separated by some combination + * > of the characters CARRIAGE RETURN (#xD) and LINE FEED (#xA). + * > + * > To simplify the tasks of applications, the XML processor must behave + * > as if it normalized all line breaks in external parsed entities (including the document entity) + * > on input, before parsing, by translating all of the following to a single #xA character: + * > + * > 1. the two-character sequence #xD #xA + * > 2. the two-character sequence #xD #x85 + * > 3. the single character #x85 + * > 4. the single character #x2028 + * > 5. any #xD character that is not immediately followed by #xA or #x85. + * + * @param {string} input + * @returns {string} + */ + function normalizeLineEndings(input) { + return input.replace(/\r[\n\u0085]/g, "\n").replace(/[\r\u0085\u2028]/g, "\n"); + } + + /** + * @typedef Locator + * @property {number} [columnNumber] + * @property {number} [lineNumber] + */ + + /** + * @typedef DOMParserOptions + * @property {DOMHandler} [domBuilder] + * @property {Function} [errorHandler] + * @property {(string) => string} [normalizeLineEndings] used to replace line endings before parsing + * defaults to `normalizeLineEndings` + * @property {Locator} [locator] + * @property {Record} [xmlns] + * + * @see normalizeLineEndings + */ + + /** + * The DOMParser interface provides the ability to parse XML or HTML source code + * from a string into a DOM `Document`. + * + * _xmldom is different from the spec in that it allows an `options` parameter, + * to override the default behavior._ + * + * @param {DOMParserOptions} [options] + * @constructor + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser + * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-parsing-and-serialization + */ + function DOMParser(options) { + this.options = options || { locator: {} }; + } + + DOMParser.prototype.parseFromString = function (source, mimeType) { + var options = this.options; + var sax = new XMLReader(); + var domBuilder = options.domBuilder || new DOMHandler(); //contentHandler and LexicalHandler + var errorHandler = options.errorHandler; + var locator = options.locator; + var defaultNSMap = options.xmlns || {}; + var isHTML = /\/x?html?$/.test(mimeType); //mimeType.toLowerCase().indexOf('html') > -1; + var entityMap = isHTML ? entities.HTML_ENTITIES : entities.XML_ENTITIES; + if (locator) { + domBuilder.setDocumentLocator(locator); + } + + sax.errorHandler = buildErrorHandler(errorHandler, domBuilder, locator); + sax.domBuilder = options.domBuilder || domBuilder; + if (isHTML) { + defaultNSMap[""] = NAMESPACE.HTML; + } + defaultNSMap.xml = defaultNSMap.xml || NAMESPACE.XML; + var normalize = options.normalizeLineEndings || normalizeLineEndings; + if (source && typeof source === "string") { + sax.parse(normalize(source), defaultNSMap, entityMap); + } else { + sax.errorHandler.error("invalid doc source"); + } + return domBuilder.doc; + }; + function buildErrorHandler(errorImpl, domBuilder, locator) { + if (!errorImpl) { + if (domBuilder instanceof DOMHandler) { + return domBuilder; + } + errorImpl = domBuilder; + } + var errorHandler = {}; + var isCallback = errorImpl instanceof Function; + locator = locator || {}; + function build(key) { + var fn = errorImpl[key]; + if (!fn && isCallback) { + fn = + errorImpl.length == 2 + ? function (msg) { + errorImpl(key, msg); + } + : errorImpl; + } + errorHandler[key] = + (fn && + function (msg) { + fn("[xmldom " + key + "]\t" + msg + _locator(locator)); + }) || + function () {}; + } + build("warning"); + build("error"); + build("fatalError"); + return errorHandler; + } + + //console.log('#\n\n\n\n\n\n\n####') + /** + * +ContentHandler+ErrorHandler + * +LexicalHandler+EntityResolver2 + * -DeclHandler-DTDHandler + * + * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler + * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2 + * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html + */ + function DOMHandler() { + this.cdata = false; + } + function position(locator, node) { + node.lineNumber = locator.lineNumber; + node.columnNumber = locator.columnNumber; + } + /** + * @see org.xml.sax.ContentHandler#startDocument + * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html + */ + DOMHandler.prototype = { + startDocument: function () { + this.doc = new DOMImplementation().createDocument(null, null, null); + if (this.locator) { + this.doc.documentURI = this.locator.systemId; + } + }, + startElement: function (namespaceURI, localName, qName, attrs) { + var doc = this.doc; + var el = doc.createElementNS(namespaceURI, qName || localName); + var len = attrs.length; + appendElement(this, el); + this.currentElement = el; + + this.locator && position(this.locator, el); + for (var i = 0; i < len; i++) { + var namespaceURI = attrs.getURI(i); + var value = attrs.getValue(i); + var qName = attrs.getQName(i); + var attr = doc.createAttributeNS(namespaceURI, qName); + this.locator && position(attrs.getLocator(i), attr); + attr.value = attr.nodeValue = value; + el.setAttributeNode(attr); + } + }, + endElement: function (namespaceURI, localName, qName) { + var current = this.currentElement; + var tagName = current.tagName; + this.currentElement = current.parentNode; + }, + startPrefixMapping: function (prefix, uri) {}, + endPrefixMapping: function (prefix) {}, + processingInstruction: function (target, data) { + var ins = this.doc.createProcessingInstruction(target, data); + this.locator && position(this.locator, ins); + appendElement(this, ins); + }, + ignorableWhitespace: function (ch, start, length) {}, + characters: function (chars, start, length) { + chars = _toString.apply(this, arguments); + //console.log(chars) + if (chars) { + if (this.cdata) { + var charNode = this.doc.createCDATASection(chars); + } else { + var charNode = this.doc.createTextNode(chars); + } + if (this.currentElement) { + this.currentElement.appendChild(charNode); + } else if (/^\s*$/.test(chars)) { + this.doc.appendChild(charNode); + //process xml + } + this.locator && position(this.locator, charNode); + } + }, + skippedEntity: function (name) {}, + endDocument: function () { + this.doc.normalize(); + }, + setDocumentLocator: function (locator) { + if ((this.locator = locator)) { + // && !('lineNumber' in locator)){ + locator.lineNumber = 0; + } + }, + //LexicalHandler + comment: function (chars, start, length) { + chars = _toString.apply(this, arguments); + var comm = this.doc.createComment(chars); + this.locator && position(this.locator, comm); + appendElement(this, comm); + }, + + startCDATA: function () { + //used in characters() methods + this.cdata = true; + }, + endCDATA: function () { + this.cdata = false; + }, + + startDTD: function (name, publicId, systemId) { + var impl = this.doc.implementation; + if (impl && impl.createDocumentType) { + var dt = impl.createDocumentType(name, publicId, systemId); + this.locator && position(this.locator, dt); + appendElement(this, dt); + this.doc.doctype = dt; + } + }, + /** + * @see org.xml.sax.ErrorHandler + * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html + */ + warning: function (error) { + console.warn("[xmldom warning]\t" + error, _locator(this.locator)); + }, + error: function (error) { + console.error("[xmldom error]\t" + error, _locator(this.locator)); + }, + fatalError: function (error) { + throw new ParseError(error, this.locator); + } + }; + function _locator(l) { + if (l) { + return ( + "\n@" + (l.systemId || "") + "#[line:" + l.lineNumber + ",col:" + l.columnNumber + "]" + ); + } + } + function _toString(chars, start, length) { + if (typeof chars == "string") { + return chars.substr(start, length); + } else { + //java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)") + if (chars.length >= start + length || start) { + return new java.lang.String(chars, start, length) + ""; + } + return chars; + } + } + + /* + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html + * used method of org.xml.sax.ext.LexicalHandler: + * #comment(chars, start, length) + * #startCDATA() + * #endCDATA() + * #startDTD(name, publicId, systemId) + * + * + * IGNORED method of org.xml.sax.ext.LexicalHandler: + * #endDTD() + * #startEntity(name) + * #endEntity(name) + * + * + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html + * IGNORED method of org.xml.sax.ext.DeclHandler + * #attributeDecl(eName, aName, type, mode, value) + * #elementDecl(name, model) + * #externalEntityDecl(name, publicId, systemId) + * #internalEntityDecl(name, value) + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html + * IGNORED method of org.xml.sax.EntityResolver2 + * #resolveEntity(String name,String publicId,String baseURI,String systemId) + * #resolveEntity(publicId, systemId) + * #getExternalSubset(name, baseURI) + * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html + * IGNORED method of org.xml.sax.DTDHandler + * #notationDecl(name, publicId, systemId) {}; + * #unparsedEntityDecl(name, publicId, systemId, notationName) {}; + */ + "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace( + /\w+/g, + function (key) { + DOMHandler.prototype[key] = function () { + return null; + }; + } + ); + + /* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */ + function appendElement(hander, node) { + if (!hander.currentElement) { + hander.doc.appendChild(node); + } else { + hander.currentElement.appendChild(node); + } + } //appendChild and setAttributeNS are preformance key + + exports.__DOMHandler = DOMHandler; + exports.normalizeLineEndings = normalizeLineEndings; + exports.DOMParser = DOMParser; + }, + { "./conventions": 41, "./dom": 43, "./entities": 44, "./sax": 46 } + ], + 43: [ + function (require, module, exports) { + var conventions = require("./conventions"); + + var find = conventions.find; + var NAMESPACE = conventions.NAMESPACE; + + /** + * A prerequisite for `[].filter`, to drop elements that are empty + * @param {string} input + * @returns {boolean} + */ + function notEmptyString(input) { + return input !== ""; + } + /** + * @see https://infra.spec.whatwg.org/#split-on-ascii-whitespace + * @see https://infra.spec.whatwg.org/#ascii-whitespace + * + * @param {string} input + * @returns {string[]} (can be empty) + */ + function splitOnASCIIWhitespace(input) { + // U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, U+0020 SPACE + return input ? input.split(/[\t\n\f\r ]+/).filter(notEmptyString) : []; + } + + /** + * Adds element as a key to current if it is not already present. + * + * @param {Record} current + * @param {string} element + * @returns {Record} + */ + function orderedSetReducer(current, element) { + if (!current.hasOwnProperty(element)) { + current[element] = true; + } + return current; + } + + /** + * @see https://infra.spec.whatwg.org/#ordered-set + * @param {string} input + * @returns {string[]} + */ + function toOrderedSet(input) { + if (!input) return []; + var list = splitOnASCIIWhitespace(input); + return Object.keys(list.reduce(orderedSetReducer, {})); + } + + /** + * Uses `list.indexOf` to implement something like `Array.prototype.includes`, + * which we can not rely on being available. + * + * @param {any[]} list + * @returns {function(any): boolean} + */ + function arrayIncludes(list) { + return function (element) { + return list && list.indexOf(element) !== -1; + }; + } + + function copy(src, dest) { + for (var p in src) { + if (Object.prototype.hasOwnProperty.call(src, p)) { + dest[p] = src[p]; + } + } + } + + /** +^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));? +^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));? + */ + function _extends(Class, Super) { + var pt = Class.prototype; + if (!(pt instanceof Super)) { + function t() {} + t.prototype = Super.prototype; + t = new t(); + copy(pt, t); + Class.prototype = pt = t; + } + if (pt.constructor != Class) { + if (typeof Class != "function") { + console.error("unknown Class:" + Class); + } + pt.constructor = Class; + } + } + + // Node Types + var NodeType = {}; + var ELEMENT_NODE = (NodeType.ELEMENT_NODE = 1); + var ATTRIBUTE_NODE = (NodeType.ATTRIBUTE_NODE = 2); + var TEXT_NODE = (NodeType.TEXT_NODE = 3); + var CDATA_SECTION_NODE = (NodeType.CDATA_SECTION_NODE = 4); + var ENTITY_REFERENCE_NODE = (NodeType.ENTITY_REFERENCE_NODE = 5); + var ENTITY_NODE = (NodeType.ENTITY_NODE = 6); + var PROCESSING_INSTRUCTION_NODE = (NodeType.PROCESSING_INSTRUCTION_NODE = 7); + var COMMENT_NODE = (NodeType.COMMENT_NODE = 8); + var DOCUMENT_NODE = (NodeType.DOCUMENT_NODE = 9); + var DOCUMENT_TYPE_NODE = (NodeType.DOCUMENT_TYPE_NODE = 10); + var DOCUMENT_FRAGMENT_NODE = (NodeType.DOCUMENT_FRAGMENT_NODE = 11); + var NOTATION_NODE = (NodeType.NOTATION_NODE = 12); + + // ExceptionCode + var ExceptionCode = {}; + var ExceptionMessage = {}; + var INDEX_SIZE_ERR = (ExceptionCode.INDEX_SIZE_ERR = + ((ExceptionMessage[1] = "Index size error"), 1)); + var DOMSTRING_SIZE_ERR = (ExceptionCode.DOMSTRING_SIZE_ERR = + ((ExceptionMessage[2] = "DOMString size error"), 2)); + var HIERARCHY_REQUEST_ERR = (ExceptionCode.HIERARCHY_REQUEST_ERR = + ((ExceptionMessage[3] = "Hierarchy request error"), 3)); + var WRONG_DOCUMENT_ERR = (ExceptionCode.WRONG_DOCUMENT_ERR = + ((ExceptionMessage[4] = "Wrong document"), 4)); + var INVALID_CHARACTER_ERR = (ExceptionCode.INVALID_CHARACTER_ERR = + ((ExceptionMessage[5] = "Invalid character"), 5)); + var NO_DATA_ALLOWED_ERR = (ExceptionCode.NO_DATA_ALLOWED_ERR = + ((ExceptionMessage[6] = "No data allowed"), 6)); + var NO_MODIFICATION_ALLOWED_ERR = (ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = + ((ExceptionMessage[7] = "No modification allowed"), 7)); + var NOT_FOUND_ERR = (ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8] = "Not found"), 8)); + var NOT_SUPPORTED_ERR = (ExceptionCode.NOT_SUPPORTED_ERR = + ((ExceptionMessage[9] = "Not supported"), 9)); + var INUSE_ATTRIBUTE_ERR = (ExceptionCode.INUSE_ATTRIBUTE_ERR = + ((ExceptionMessage[10] = "Attribute in use"), 10)); + //level2 + var INVALID_STATE_ERR = (ExceptionCode.INVALID_STATE_ERR = + ((ExceptionMessage[11] = "Invalid state"), 11)); + var SYNTAX_ERR = (ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12] = "Syntax error"), 12)); + var INVALID_MODIFICATION_ERR = (ExceptionCode.INVALID_MODIFICATION_ERR = + ((ExceptionMessage[13] = "Invalid modification"), 13)); + var NAMESPACE_ERR = (ExceptionCode.NAMESPACE_ERR = + ((ExceptionMessage[14] = "Invalid namespace"), 14)); + var INVALID_ACCESS_ERR = (ExceptionCode.INVALID_ACCESS_ERR = + ((ExceptionMessage[15] = "Invalid access"), 15)); + + /** + * DOM Level 2 + * Object DOMException + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html + * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html + */ + function DOMException(code, message) { + if (message instanceof Error) { + var error = message; + } else { + error = this; + Error.call(this, ExceptionMessage[code]); + this.message = ExceptionMessage[code]; + if (Error.captureStackTrace) Error.captureStackTrace(this, DOMException); + } + error.code = code; + if (message) this.message = this.message + ": " + message; + return error; + } + DOMException.prototype = Error.prototype; + copy(ExceptionCode, DOMException); + + /** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177 + * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live. + * The items in the NodeList are accessible via an integral index, starting from 0. + */ + function NodeList() {} + NodeList.prototype = { + /** + * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive. + * @standard level1 + */ + length: 0, + /** + * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null. + * @standard level1 + * @param index unsigned long + * Index into the collection. + * @return Node + * The node at the indexth position in the NodeList, or null if that is not a valid index. + */ + item: function (index) { + return this[index] || null; + }, + toString: function (isHTML, nodeFilter) { + for (var buf = [], i = 0; i < this.length; i++) { + serializeToString(this[i], buf, isHTML, nodeFilter); + } + return buf.join(""); + }, + /** + * @private + * @param {function (Node):boolean} predicate + * @returns {Node[]} + */ + filter: function (predicate) { + return Array.prototype.filter.call(this, predicate); + }, + /** + * @private + * @param {Node} item + * @returns {number} + */ + indexOf: function (item) { + return Array.prototype.indexOf.call(this, item); + } + }; + + function LiveNodeList(node, refresh) { + this._node = node; + this._refresh = refresh; + _updateLiveList(this); + } + function _updateLiveList(list) { + var inc = list._node._inc || list._node.ownerDocument._inc; + if (list._inc != inc) { + var ls = list._refresh(list._node); + //console.log(ls.length) + __set__(list, "length", ls.length); + copy(ls, list); + list._inc = inc; + } + } + LiveNodeList.prototype.item = function (i) { + _updateLiveList(this); + return this[i]; + }; + + _extends(LiveNodeList, NodeList); + + /** + * Objects implementing the NamedNodeMap interface are used + * to represent collections of nodes that can be accessed by name. + * Note that NamedNodeMap does not inherit from NodeList; + * NamedNodeMaps are not maintained in any particular order. + * Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, + * but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, + * and does not imply that the DOM specifies an order to these Nodes. + * NamedNodeMap objects in the DOM are live. + * used for attributes or DocumentType entities + */ + function NamedNodeMap() {} + + function _findNodeIndex(list, node) { + var i = list.length; + while (i--) { + if (list[i] === node) { + return i; + } + } + } + + function _addNamedNode(el, list, newAttr, oldAttr) { + if (oldAttr) { + list[_findNodeIndex(list, oldAttr)] = newAttr; + } else { + list[list.length++] = newAttr; + } + if (el) { + newAttr.ownerElement = el; + var doc = el.ownerDocument; + if (doc) { + oldAttr && _onRemoveAttribute(doc, el, oldAttr); + _onAddAttribute(doc, el, newAttr); + } + } + } + function _removeNamedNode(el, list, attr) { + //console.log('remove attr:'+attr) + var i = _findNodeIndex(list, attr); + if (i >= 0) { + var lastIndex = list.length - 1; + while (i < lastIndex) { + list[i] = list[++i]; + } + list.length = lastIndex; + if (el) { + var doc = el.ownerDocument; + if (doc) { + _onRemoveAttribute(doc, el, attr); + attr.ownerElement = null; + } + } + } else { + throw new DOMException(NOT_FOUND_ERR, new Error(el.tagName + "@" + attr)); + } + } + NamedNodeMap.prototype = { + length: 0, + item: NodeList.prototype.item, + getNamedItem: function (key) { + // if(key.indexOf(':')>0 || key == 'xmlns'){ + // return null; + // } + //console.log() + var i = this.length; + while (i--) { + var attr = this[i]; + //console.log(attr.nodeName,key) + if (attr.nodeName == key) { + return attr; + } + } + }, + setNamedItem: function (attr) { + var el = attr.ownerElement; + if (el && el != this._ownerElement) { + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + var oldAttr = this.getNamedItem(attr.nodeName); + _addNamedNode(this._ownerElement, this, attr, oldAttr); + return oldAttr; + }, + /* returns Node */ + setNamedItemNS: function (attr) { + // raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR + var el = attr.ownerElement, + oldAttr; + if (el && el != this._ownerElement) { + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + oldAttr = this.getNamedItemNS(attr.namespaceURI, attr.localName); + _addNamedNode(this._ownerElement, this, attr, oldAttr); + return oldAttr; + }, + + /* returns Node */ + removeNamedItem: function (key) { + var attr = this.getNamedItem(key); + _removeNamedNode(this._ownerElement, this, attr); + return attr; + }, // raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR + + //for level2 + removeNamedItemNS: function (namespaceURI, localName) { + var attr = this.getNamedItemNS(namespaceURI, localName); + _removeNamedNode(this._ownerElement, this, attr); + return attr; + }, + getNamedItemNS: function (namespaceURI, localName) { + var i = this.length; + while (i--) { + var node = this[i]; + if (node.localName == localName && node.namespaceURI == namespaceURI) { + return node; + } + } + return null; + } + }; + + /** + * The DOMImplementation interface represents an object providing methods + * which are not dependent on any particular document. + * Such an object is returned by the `Document.implementation` property. + * + * __The individual methods describe the differences compared to the specs.__ + * + * @constructor + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation MDN + * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 DOM Level 1 Core (Initial) + * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-102161490 DOM Level 2 Core + * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-102161490 DOM Level 3 Core + * @see https://dom.spec.whatwg.org/#domimplementation DOM Living Standard + */ + function DOMImplementation() {} + + DOMImplementation.prototype = { + /** + * The DOMImplementation.hasFeature() method returns a Boolean flag indicating if a given feature is supported. + * The different implementations fairly diverged in what kind of features were reported. + * The latest version of the spec settled to force this method to always return true, where the functionality was accurate and in use. + * + * @deprecated It is deprecated and modern browsers return true in all cases. + * + * @param {string} feature + * @param {string} [version] + * @returns {boolean} always true + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/hasFeature MDN + * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-5CED94D7 DOM Level 1 Core + * @see https://dom.spec.whatwg.org/#dom-domimplementation-hasfeature DOM Living Standard + */ + hasFeature: function (feature, version) { + return true; + }, + /** + * Creates an XML Document object of the specified type with its document element. + * + * __It behaves slightly different from the description in the living standard__: + * - There is no interface/class `XMLDocument`, it returns a `Document` instance. + * - `contentType`, `encoding`, `mode`, `origin`, `url` fields are currently not declared. + * - this implementation is not validating names or qualified names + * (when parsing XML strings, the SAX parser takes care of that) + * + * @param {string|null} namespaceURI + * @param {string} qualifiedName + * @param {DocumentType=null} doctype + * @returns {Document} + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocument MDN + * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocument DOM Level 2 Core (initial) + * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument DOM Level 2 Core + * + * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract + * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names + * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names + */ + createDocument: function (namespaceURI, qualifiedName, doctype) { + var doc = new Document(); + doc.implementation = this; + doc.childNodes = new NodeList(); + doc.doctype = doctype || null; + if (doctype) { + doc.appendChild(doctype); + } + if (qualifiedName) { + var root = doc.createElementNS(namespaceURI, qualifiedName); + doc.appendChild(root); + } + return doc; + }, + /** + * Returns a doctype, with the given `qualifiedName`, `publicId`, and `systemId`. + * + * __This behavior is slightly different from the in the specs__: + * - this implementation is not validating names or qualified names + * (when parsing XML strings, the SAX parser takes care of that) + * + * @param {string} qualifiedName + * @param {string} [publicId] + * @param {string} [systemId] + * @returns {DocumentType} which can either be used with `DOMImplementation.createDocument` upon document creation + * or can be put into the document via methods like `Node.insertBefore()` or `Node.replaceChild()` + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocumentType MDN + * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocType DOM Level 2 Core + * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype DOM Living Standard + * + * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract + * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names + * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names + */ + createDocumentType: function (qualifiedName, publicId, systemId) { + var node = new DocumentType(); + node.name = qualifiedName; + node.nodeName = qualifiedName; + node.publicId = publicId || ""; + node.systemId = systemId || ""; + + return node; + } + }; + + /** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 + */ + + function Node() {} + + Node.prototype = { + firstChild: null, + lastChild: null, + previousSibling: null, + nextSibling: null, + attributes: null, + parentNode: null, + childNodes: null, + ownerDocument: null, + nodeValue: null, + namespaceURI: null, + prefix: null, + localName: null, + // Modified in DOM Level 2: + insertBefore: function (newChild, refChild) { + //raises + return _insertBefore(this, newChild, refChild); + }, + replaceChild: function (newChild, oldChild) { + //raises + _insertBefore(this, newChild, oldChild, assertPreReplacementValidityInDocument); + if (oldChild) { + this.removeChild(oldChild); + } + }, + removeChild: function (oldChild) { + return _removeChild(this, oldChild); + }, + appendChild: function (newChild) { + return this.insertBefore(newChild, null); + }, + hasChildNodes: function () { + return this.firstChild != null; + }, + cloneNode: function (deep) { + return cloneNode(this.ownerDocument || this, this, deep); + }, + // Modified in DOM Level 2: + normalize: function () { + var child = this.firstChild; + while (child) { + var next = child.nextSibling; + if (next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE) { + this.removeChild(next); + child.appendData(next.data); + } else { + child.normalize(); + child = next; + } + } + }, + // Introduced in DOM Level 2: + isSupported: function (feature, version) { + return this.ownerDocument.implementation.hasFeature(feature, version); + }, + // Introduced in DOM Level 2: + hasAttributes: function () { + return this.attributes.length > 0; + }, + /** + * Look up the prefix associated to the given namespace URI, starting from this node. + * **The default namespace declarations are ignored by this method.** + * See Namespace Prefix Lookup for details on the algorithm used by this method. + * + * _Note: The implementation seems to be incomplete when compared to the algorithm described in the specs._ + * + * @param {string | null} namespaceURI + * @returns {string | null} + * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespacePrefix + * @see https://www.w3.org/TR/DOM-Level-3-Core/namespaces-algorithms.html#lookupNamespacePrefixAlgo + * @see https://dom.spec.whatwg.org/#dom-node-lookupprefix + * @see https://github.com/xmldom/xmldom/issues/322 + */ + lookupPrefix: function (namespaceURI) { + var el = this; + while (el) { + var map = el._nsMap; + //console.dir(map) + if (map) { + for (var n in map) { + if (Object.prototype.hasOwnProperty.call(map, n) && map[n] === namespaceURI) { + return n; + } + } + } + el = el.nodeType == ATTRIBUTE_NODE ? el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + lookupNamespaceURI: function (prefix) { + var el = this; + while (el) { + var map = el._nsMap; + //console.dir(map) + if (map) { + if (Object.prototype.hasOwnProperty.call(map, prefix)) { + return map[prefix]; + } + } + el = el.nodeType == ATTRIBUTE_NODE ? el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + isDefaultNamespace: function (namespaceURI) { + var prefix = this.lookupPrefix(namespaceURI); + return prefix == null; + } + }; + + function _xmlEncoder(c) { + return ( + (c == "<" && "<") || + (c == ">" && ">") || + (c == "&" && "&") || + (c == '"' && """) || + "&#" + c.charCodeAt() + ";" + ); + } + + copy(NodeType, Node); + copy(NodeType, Node.prototype); + + /** + * @param callback return true for continue,false for break + * @return boolean true: break visit; + */ + function _visitNode(node, callback) { + if (callback(node)) { + return true; + } + if ((node = node.firstChild)) { + do { + if (_visitNode(node, callback)) { + return true; + } + } while ((node = node.nextSibling)); + } + } + + function Document() { + this.ownerDocument = this; + } + + function _onAddAttribute(doc, el, newAttr) { + doc && doc._inc++; + var ns = newAttr.namespaceURI; + if (ns === NAMESPACE.XMLNS) { + //update namespace + el._nsMap[newAttr.prefix ? newAttr.localName : ""] = newAttr.value; + } + } + + function _onRemoveAttribute(doc, el, newAttr, remove) { + doc && doc._inc++; + var ns = newAttr.namespaceURI; + if (ns === NAMESPACE.XMLNS) { + //update namespace + delete el._nsMap[newAttr.prefix ? newAttr.localName : ""]; + } + } + + /** + * Updates `el.childNodes`, updating the indexed items and it's `length`. + * Passing `newChild` means it will be appended. + * Otherwise it's assumed that an item has been removed, + * and `el.firstNode` and it's `.nextSibling` are used + * to walk the current list of child nodes. + * + * @param {Document} doc + * @param {Node} el + * @param {Node} [newChild] + * @private + */ + function _onUpdateChild(doc, el, newChild) { + if (doc && doc._inc) { + doc._inc++; + //update childNodes + var cs = el.childNodes; + if (newChild) { + cs[cs.length++] = newChild; + } else { + var child = el.firstChild; + var i = 0; + while (child) { + cs[i++] = child; + child = child.nextSibling; + } + cs.length = i; + delete cs[cs.length]; + } + } + } + + /** + * Removes the connections between `parentNode` and `child` + * and any existing `child.previousSibling` or `child.nextSibling`. + * + * @see https://github.com/xmldom/xmldom/issues/135 + * @see https://github.com/xmldom/xmldom/issues/145 + * + * @param {Node} parentNode + * @param {Node} child + * @returns {Node} the child that was removed. + * @private + */ + function _removeChild(parentNode, child) { + var previous = child.previousSibling; + var next = child.nextSibling; + if (previous) { + previous.nextSibling = next; + } else { + parentNode.firstChild = next; + } + if (next) { + next.previousSibling = previous; + } else { + parentNode.lastChild = previous; + } + child.parentNode = null; + child.previousSibling = null; + child.nextSibling = null; + _onUpdateChild(parentNode.ownerDocument, parentNode); + return child; + } + + /** + * Returns `true` if `node` can be a parent for insertion. + * @param {Node} node + * @returns {boolean} + */ + function hasValidParentNodeType(node) { + return ( + node && + (node.nodeType === Node.DOCUMENT_NODE || + node.nodeType === Node.DOCUMENT_FRAGMENT_NODE || + node.nodeType === Node.ELEMENT_NODE) + ); + } + + /** + * Returns `true` if `node` can be inserted according to it's `nodeType`. + * @param {Node} node + * @returns {boolean} + */ + function hasInsertableNodeType(node) { + return ( + node && + (isElementNode(node) || + isTextNode(node) || + isDocTypeNode(node) || + node.nodeType === Node.DOCUMENT_FRAGMENT_NODE || + node.nodeType === Node.COMMENT_NODE || + node.nodeType === Node.PROCESSING_INSTRUCTION_NODE) + ); + } + + /** + * Returns true if `node` is a DOCTYPE node + * @param {Node} node + * @returns {boolean} + */ + function isDocTypeNode(node) { + return node && node.nodeType === Node.DOCUMENT_TYPE_NODE; + } + + /** + * Returns true if the node is an element + * @param {Node} node + * @returns {boolean} + */ + function isElementNode(node) { + return node && node.nodeType === Node.ELEMENT_NODE; + } + /** + * Returns true if `node` is a text node + * @param {Node} node + * @returns {boolean} + */ + function isTextNode(node) { + return node && node.nodeType === Node.TEXT_NODE; + } + + /** + * Check if en element node can be inserted before `child`, or at the end if child is falsy, + * according to the presence and position of a doctype node on the same level. + * + * @param {Document} doc The document node + * @param {Node} child the node that would become the nextSibling if the element would be inserted + * @returns {boolean} `true` if an element can be inserted before child + * @private + * https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity + */ + function isElementInsertionPossible(doc, child) { + var parentChildNodes = doc.childNodes || []; + if (find(parentChildNodes, isElementNode) || isDocTypeNode(child)) { + return false; + } + var docTypeNode = find(parentChildNodes, isDocTypeNode); + return !( + child && + docTypeNode && + parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child) + ); + } + + /** + * Check if en element node can be inserted before `child`, or at the end if child is falsy, + * according to the presence and position of a doctype node on the same level. + * + * @param {Node} doc The document node + * @param {Node} child the node that would become the nextSibling if the element would be inserted + * @returns {boolean} `true` if an element can be inserted before child + * @private + * https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity + */ + function isElementReplacementPossible(doc, child) { + var parentChildNodes = doc.childNodes || []; + + function hasElementChildThatIsNotChild(node) { + return isElementNode(node) && node !== child; + } + + if (find(parentChildNodes, hasElementChildThatIsNotChild)) { + return false; + } + var docTypeNode = find(parentChildNodes, isDocTypeNode); + return !( + child && + docTypeNode && + parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child) + ); + } + + /** + * @private + * Steps 1-5 of the checks before inserting and before replacing a child are the same. + * + * @param {Node} parent the parent node to insert `node` into + * @param {Node} node the node to insert + * @param {Node=} child the node that should become the `nextSibling` of `node` + * @returns {Node} + * @throws DOMException for several node combinations that would create a DOM that is not well-formed. + * @throws DOMException if `child` is provided but is not a child of `parent`. + * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity + * @see https://dom.spec.whatwg.org/#concept-node-replace + */ + function assertPreInsertionValidity1to5(parent, node, child) { + // 1. If `parent` is not a Document, DocumentFragment, or Element node, then throw a "HierarchyRequestError" DOMException. + if (!hasValidParentNodeType(parent)) { + throw new DOMException( + HIERARCHY_REQUEST_ERR, + "Unexpected parent node type " + parent.nodeType + ); + } + // 2. If `node` is a host-including inclusive ancestor of `parent`, then throw a "HierarchyRequestError" DOMException. + // not implemented! + // 3. If `child` is non-null and its parent is not `parent`, then throw a "NotFoundError" DOMException. + if (child && child.parentNode !== parent) { + throw new DOMException(NOT_FOUND_ERR, "child not in parent"); + } + if ( + // 4. If `node` is not a DocumentFragment, DocumentType, Element, or CharacterData node, then throw a "HierarchyRequestError" DOMException. + !hasInsertableNodeType(node) || + // 5. If either `node` is a Text node and `parent` is a document, + // the sax parser currently adds top level text nodes, this will be fixed in 0.9.0 + // || (node.nodeType === Node.TEXT_NODE && parent.nodeType === Node.DOCUMENT_NODE) + // or `node` is a doctype and `parent` is not a document, then throw a "HierarchyRequestError" DOMException. + (isDocTypeNode(node) && parent.nodeType !== Node.DOCUMENT_NODE) + ) { + throw new DOMException( + HIERARCHY_REQUEST_ERR, + "Unexpected node type " + node.nodeType + " for parent node type " + parent.nodeType + ); + } + } + + /** + * @private + * Step 6 of the checks before inserting and before replacing a child are different. + * + * @param {Document} parent the parent node to insert `node` into + * @param {Node} node the node to insert + * @param {Node | undefined} child the node that should become the `nextSibling` of `node` + * @returns {Node} + * @throws DOMException for several node combinations that would create a DOM that is not well-formed. + * @throws DOMException if `child` is provided but is not a child of `parent`. + * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity + * @see https://dom.spec.whatwg.org/#concept-node-replace + */ + function assertPreInsertionValidityInDocument(parent, node, child) { + var parentChildNodes = parent.childNodes || []; + var nodeChildNodes = node.childNodes || []; + + // DocumentFragment + if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { + var nodeChildElements = nodeChildNodes.filter(isElementNode); + // If node has more than one element child or has a Text node child. + if (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) { + throw new DOMException( + HIERARCHY_REQUEST_ERR, + "More than one element or text in fragment" + ); + } + // Otherwise, if `node` has one element child and either `parent` has an element child, + // `child` is a doctype, or `child` is non-null and a doctype is following `child`. + if (nodeChildElements.length === 1 && !isElementInsertionPossible(parent, child)) { + throw new DOMException( + HIERARCHY_REQUEST_ERR, + "Element in fragment can not be inserted before doctype" + ); + } + } + // Element + if (isElementNode(node)) { + // `parent` has an element child, `child` is a doctype, + // or `child` is non-null and a doctype is following `child`. + if (!isElementInsertionPossible(parent, child)) { + throw new DOMException( + HIERARCHY_REQUEST_ERR, + "Only one element can be added and only after doctype" + ); + } + } + // DocumentType + if (isDocTypeNode(node)) { + // `parent` has a doctype child, + if (find(parentChildNodes, isDocTypeNode)) { + throw new DOMException(HIERARCHY_REQUEST_ERR, "Only one doctype is allowed"); + } + var parentElementChild = find(parentChildNodes, isElementNode); + // `child` is non-null and an element is preceding `child`, + if ( + child && + parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child) + ) { + throw new DOMException( + HIERARCHY_REQUEST_ERR, + "Doctype can only be inserted before an element" + ); + } + // or `child` is null and `parent` has an element child. + if (!child && parentElementChild) { + throw new DOMException( + HIERARCHY_REQUEST_ERR, + "Doctype can not be appended since element is present" + ); + } + } + } + + /** + * @private + * Step 6 of the checks before inserting and before replacing a child are different. + * + * @param {Document} parent the parent node to insert `node` into + * @param {Node} node the node to insert + * @param {Node | undefined} child the node that should become the `nextSibling` of `node` + * @returns {Node} + * @throws DOMException for several node combinations that would create a DOM that is not well-formed. + * @throws DOMException if `child` is provided but is not a child of `parent`. + * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity + * @see https://dom.spec.whatwg.org/#concept-node-replace + */ + function assertPreReplacementValidityInDocument(parent, node, child) { + var parentChildNodes = parent.childNodes || []; + var nodeChildNodes = node.childNodes || []; + + // DocumentFragment + if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { + var nodeChildElements = nodeChildNodes.filter(isElementNode); + // If `node` has more than one element child or has a Text node child. + if (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) { + throw new DOMException( + HIERARCHY_REQUEST_ERR, + "More than one element or text in fragment" + ); + } + // Otherwise, if `node` has one element child and either `parent` has an element child that is not `child` or a doctype is following `child`. + if (nodeChildElements.length === 1 && !isElementReplacementPossible(parent, child)) { + throw new DOMException( + HIERARCHY_REQUEST_ERR, + "Element in fragment can not be inserted before doctype" + ); + } + } + // Element + if (isElementNode(node)) { + // `parent` has an element child that is not `child` or a doctype is following `child`. + if (!isElementReplacementPossible(parent, child)) { + throw new DOMException( + HIERARCHY_REQUEST_ERR, + "Only one element can be added and only after doctype" + ); + } + } + // DocumentType + if (isDocTypeNode(node)) { + function hasDoctypeChildThatIsNotChild(node) { + return isDocTypeNode(node) && node !== child; + } + + // `parent` has a doctype child that is not `child`, + if (find(parentChildNodes, hasDoctypeChildThatIsNotChild)) { + throw new DOMException(HIERARCHY_REQUEST_ERR, "Only one doctype is allowed"); + } + var parentElementChild = find(parentChildNodes, isElementNode); + // or an element is preceding `child`. + if ( + child && + parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child) + ) { + throw new DOMException( + HIERARCHY_REQUEST_ERR, + "Doctype can only be inserted before an element" + ); + } + } + } + + /** + * @private + * @param {Node} parent the parent node to insert `node` into + * @param {Node} node the node to insert + * @param {Node=} child the node that should become the `nextSibling` of `node` + * @returns {Node} + * @throws DOMException for several node combinations that would create a DOM that is not well-formed. + * @throws DOMException if `child` is provided but is not a child of `parent`. + * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity + */ + function _insertBefore(parent, node, child, _inDocumentAssertion) { + // To ensure pre-insertion validity of a node into a parent before a child, run these steps: + assertPreInsertionValidity1to5(parent, node, child); + + // If parent is a document, and any of the statements below, switched on the interface node implements, + // are true, then throw a "HierarchyRequestError" DOMException. + if (parent.nodeType === Node.DOCUMENT_NODE) { + (_inDocumentAssertion || assertPreInsertionValidityInDocument)(parent, node, child); + } + + var cp = node.parentNode; + if (cp) { + cp.removeChild(node); //remove and update + } + if (node.nodeType === DOCUMENT_FRAGMENT_NODE) { + var newFirst = node.firstChild; + if (newFirst == null) { + return node; + } + var newLast = node.lastChild; + } else { + newFirst = newLast = node; + } + var pre = child ? child.previousSibling : parent.lastChild; + + newFirst.previousSibling = pre; + newLast.nextSibling = child; + + if (pre) { + pre.nextSibling = newFirst; + } else { + parent.firstChild = newFirst; + } + if (child == null) { + parent.lastChild = newLast; + } else { + child.previousSibling = newLast; + } + do { + newFirst.parentNode = parent; + } while (newFirst !== newLast && (newFirst = newFirst.nextSibling)); + _onUpdateChild(parent.ownerDocument || parent, parent); + //console.log(parent.lastChild.nextSibling == null) + if (node.nodeType == DOCUMENT_FRAGMENT_NODE) { + node.firstChild = node.lastChild = null; + } + return node; + } + + /** + * Appends `newChild` to `parentNode`. + * If `newChild` is already connected to a `parentNode` it is first removed from it. + * + * @see https://github.com/xmldom/xmldom/issues/135 + * @see https://github.com/xmldom/xmldom/issues/145 + * @param {Node} parentNode + * @param {Node} newChild + * @returns {Node} + * @private + */ + function _appendSingleChild(parentNode, newChild) { + if (newChild.parentNode) { + newChild.parentNode.removeChild(newChild); + } + newChild.parentNode = parentNode; + newChild.previousSibling = parentNode.lastChild; + newChild.nextSibling = null; + if (newChild.previousSibling) { + newChild.previousSibling.nextSibling = newChild; + } else { + parentNode.firstChild = newChild; + } + parentNode.lastChild = newChild; + _onUpdateChild(parentNode.ownerDocument, parentNode, newChild); + return newChild; + } + + Document.prototype = { + //implementation : null, + nodeName: "#document", + nodeType: DOCUMENT_NODE, + /** + * The DocumentType node of the document. + * + * @readonly + * @type DocumentType + */ + doctype: null, + documentElement: null, + _inc: 1, + + insertBefore: function (newChild, refChild) { + //raises + if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) { + var child = newChild.firstChild; + while (child) { + var next = child.nextSibling; + this.insertBefore(child, refChild); + child = next; + } + return newChild; + } + _insertBefore(this, newChild, refChild); + newChild.ownerDocument = this; + if (this.documentElement === null && newChild.nodeType === ELEMENT_NODE) { + this.documentElement = newChild; + } + + return newChild; + }, + removeChild: function (oldChild) { + if (this.documentElement == oldChild) { + this.documentElement = null; + } + return _removeChild(this, oldChild); + }, + replaceChild: function (newChild, oldChild) { + //raises + _insertBefore(this, newChild, oldChild, assertPreReplacementValidityInDocument); + newChild.ownerDocument = this; + if (oldChild) { + this.removeChild(oldChild); + } + if (isElementNode(newChild)) { + this.documentElement = newChild; + } + }, + // Introduced in DOM Level 2: + importNode: function (importedNode, deep) { + return importNode(this, importedNode, deep); + }, + // Introduced in DOM Level 2: + getElementById: function (id) { + var rtv = null; + _visitNode(this.documentElement, function (node) { + if (node.nodeType == ELEMENT_NODE) { + if (node.getAttribute("id") == id) { + rtv = node; + return true; + } + } + }); + return rtv; + }, + + /** + * The `getElementsByClassName` method of `Document` interface returns an array-like object + * of all child elements which have **all** of the given class name(s). + * + * Returns an empty list if `classeNames` is an empty string or only contains HTML white space characters. + * + * + * Warning: This is a live LiveNodeList. + * Changes in the DOM will reflect in the array as the changes occur. + * If an element selected by this array no longer qualifies for the selector, + * it will automatically be removed. Be aware of this for iteration purposes. + * + * @param {string} classNames is a string representing the class name(s) to match; multiple class names are separated by (ASCII-)whitespace + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName + * @see https://dom.spec.whatwg.org/#concept-getelementsbyclassname + */ + getElementsByClassName: function (classNames) { + var classNamesSet = toOrderedSet(classNames); + return new LiveNodeList(this, function (base) { + var ls = []; + if (classNamesSet.length > 0) { + _visitNode(base.documentElement, function (node) { + if (node !== base && node.nodeType === ELEMENT_NODE) { + var nodeClassNames = node.getAttribute("class"); + // can be null if the attribute does not exist + if (nodeClassNames) { + // before splitting and iterating just compare them for the most common case + var matches = classNames === nodeClassNames; + if (!matches) { + var nodeClassNamesSet = toOrderedSet(nodeClassNames); + matches = classNamesSet.every(arrayIncludes(nodeClassNamesSet)); + } + if (matches) { + ls.push(node); + } + } + } + }); + } + return ls; + }); + }, + + //document factory method: + createElement: function (tagName) { + var node = new Element(); + node.ownerDocument = this; + node.nodeName = tagName; + node.tagName = tagName; + node.localName = tagName; + node.childNodes = new NodeList(); + var attrs = (node.attributes = new NamedNodeMap()); + attrs._ownerElement = node; + return node; + }, + createDocumentFragment: function () { + var node = new DocumentFragment(); + node.ownerDocument = this; + node.childNodes = new NodeList(); + return node; + }, + createTextNode: function (data) { + var node = new Text(); + node.ownerDocument = this; + node.appendData(data); + return node; + }, + createComment: function (data) { + var node = new Comment(); + node.ownerDocument = this; + node.appendData(data); + return node; + }, + createCDATASection: function (data) { + var node = new CDATASection(); + node.ownerDocument = this; + node.appendData(data); + return node; + }, + createProcessingInstruction: function (target, data) { + var node = new ProcessingInstruction(); + node.ownerDocument = this; + node.tagName = node.target = target; + node.nodeValue = node.data = data; + return node; + }, + createAttribute: function (name) { + var node = new Attr(); + node.ownerDocument = this; + node.name = name; + node.nodeName = name; + node.localName = name; + node.specified = true; + return node; + }, + createEntityReference: function (name) { + var node = new EntityReference(); + node.ownerDocument = this; + node.nodeName = name; + return node; + }, + // Introduced in DOM Level 2: + createElementNS: function (namespaceURI, qualifiedName) { + var node = new Element(); + var pl = qualifiedName.split(":"); + var attrs = (node.attributes = new NamedNodeMap()); + node.childNodes = new NodeList(); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.tagName = qualifiedName; + node.namespaceURI = namespaceURI; + if (pl.length == 2) { + node.prefix = pl[0]; + node.localName = pl[1]; + } else { + //el.prefix = null; + node.localName = qualifiedName; + } + attrs._ownerElement = node; + return node; + }, + // Introduced in DOM Level 2: + createAttributeNS: function (namespaceURI, qualifiedName) { + var node = new Attr(); + var pl = qualifiedName.split(":"); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.name = qualifiedName; + node.namespaceURI = namespaceURI; + node.specified = true; + if (pl.length == 2) { + node.prefix = pl[0]; + node.localName = pl[1]; + } else { + //el.prefix = null; + node.localName = qualifiedName; + } + return node; + } + }; + _extends(Document, Node); + + function Element() { + this._nsMap = {}; + } + Element.prototype = { + nodeType: ELEMENT_NODE, + hasAttribute: function (name) { + return this.getAttributeNode(name) != null; + }, + getAttribute: function (name) { + var attr = this.getAttributeNode(name); + return (attr && attr.value) || ""; + }, + getAttributeNode: function (name) { + return this.attributes.getNamedItem(name); + }, + setAttribute: function (name, value) { + var attr = this.ownerDocument.createAttribute(name); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr); + }, + removeAttribute: function (name) { + var attr = this.getAttributeNode(name); + attr && this.removeAttributeNode(attr); + }, + + //four real opeartion method + appendChild: function (newChild) { + if (newChild.nodeType === DOCUMENT_FRAGMENT_NODE) { + return this.insertBefore(newChild, null); + } else { + return _appendSingleChild(this, newChild); + } + }, + setAttributeNode: function (newAttr) { + return this.attributes.setNamedItem(newAttr); + }, + setAttributeNodeNS: function (newAttr) { + return this.attributes.setNamedItemNS(newAttr); + }, + removeAttributeNode: function (oldAttr) { + //console.log(this == oldAttr.ownerElement) + return this.attributes.removeNamedItem(oldAttr.nodeName); + }, + //get real attribute name,and remove it by removeAttributeNode + removeAttributeNS: function (namespaceURI, localName) { + var old = this.getAttributeNodeNS(namespaceURI, localName); + old && this.removeAttributeNode(old); + }, + + hasAttributeNS: function (namespaceURI, localName) { + return this.getAttributeNodeNS(namespaceURI, localName) != null; + }, + getAttributeNS: function (namespaceURI, localName) { + var attr = this.getAttributeNodeNS(namespaceURI, localName); + return (attr && attr.value) || ""; + }, + setAttributeNS: function (namespaceURI, qualifiedName, value) { + var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr); + }, + getAttributeNodeNS: function (namespaceURI, localName) { + return this.attributes.getNamedItemNS(namespaceURI, localName); + }, + + getElementsByTagName: function (tagName) { + return new LiveNodeList(this, function (base) { + var ls = []; + _visitNode(base, function (node) { + if ( + node !== base && + node.nodeType == ELEMENT_NODE && + (tagName === "*" || node.tagName == tagName) + ) { + ls.push(node); + } + }); + return ls; + }); + }, + getElementsByTagNameNS: function (namespaceURI, localName) { + return new LiveNodeList(this, function (base) { + var ls = []; + _visitNode(base, function (node) { + if ( + node !== base && + node.nodeType === ELEMENT_NODE && + (namespaceURI === "*" || node.namespaceURI === namespaceURI) && + (localName === "*" || node.localName == localName) + ) { + ls.push(node); + } + }); + return ls; + }); + } + }; + Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName; + Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS; + + _extends(Element, Node); + function Attr() {} + Attr.prototype.nodeType = ATTRIBUTE_NODE; + _extends(Attr, Node); + + function CharacterData() {} + CharacterData.prototype = { + data: "", + substringData: function (offset, count) { + return this.data.substring(offset, offset + count); + }, + appendData: function (text) { + text = this.data + text; + this.nodeValue = this.data = text; + this.length = text.length; + }, + insertData: function (offset, text) { + this.replaceData(offset, 0, text); + }, + appendChild: function (newChild) { + throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR]); + }, + deleteData: function (offset, count) { + this.replaceData(offset, count, ""); + }, + replaceData: function (offset, count, text) { + var start = this.data.substring(0, offset); + var end = this.data.substring(offset + count); + text = start + text + end; + this.nodeValue = this.data = text; + this.length = text.length; + } + }; + _extends(CharacterData, Node); + function Text() {} + Text.prototype = { + nodeName: "#text", + nodeType: TEXT_NODE, + splitText: function (offset) { + var text = this.data; + var newText = text.substring(offset); + text = text.substring(0, offset); + this.data = this.nodeValue = text; + this.length = text.length; + var newNode = this.ownerDocument.createTextNode(newText); + if (this.parentNode) { + this.parentNode.insertBefore(newNode, this.nextSibling); + } + return newNode; + } + }; + _extends(Text, CharacterData); + function Comment() {} + Comment.prototype = { + nodeName: "#comment", + nodeType: COMMENT_NODE + }; + _extends(Comment, CharacterData); + + function CDATASection() {} + CDATASection.prototype = { + nodeName: "#cdata-section", + nodeType: CDATA_SECTION_NODE + }; + _extends(CDATASection, CharacterData); + + function DocumentType() {} + DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE; + _extends(DocumentType, Node); + + function Notation() {} + Notation.prototype.nodeType = NOTATION_NODE; + _extends(Notation, Node); + + function Entity() {} + Entity.prototype.nodeType = ENTITY_NODE; + _extends(Entity, Node); + + function EntityReference() {} + EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE; + _extends(EntityReference, Node); + + function DocumentFragment() {} + DocumentFragment.prototype.nodeName = "#document-fragment"; + DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE; + _extends(DocumentFragment, Node); + + function ProcessingInstruction() {} + ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE; + _extends(ProcessingInstruction, Node); + function XMLSerializer() {} + XMLSerializer.prototype.serializeToString = function (node, isHtml, nodeFilter) { + return nodeSerializeToString.call(node, isHtml, nodeFilter); + }; + Node.prototype.toString = nodeSerializeToString; + function nodeSerializeToString(isHtml, nodeFilter) { + var buf = []; + var refNode = (this.nodeType == 9 && this.documentElement) || this; + var prefix = refNode.prefix; + var uri = refNode.namespaceURI; + + if (uri && prefix == null) { + //console.log(prefix) + var prefix = refNode.lookupPrefix(uri); + if (prefix == null) { + //isHTML = true; + var visibleNamespaces = [ + { namespace: uri, prefix: null } + //{namespace:uri,prefix:''} + ]; + } + } + serializeToString(this, buf, isHtml, nodeFilter, visibleNamespaces); + //console.log('###',this.nodeType,uri,prefix,buf.join('')) + return buf.join(""); + } + + function needNamespaceDefine(node, isHTML, visibleNamespaces) { + var prefix = node.prefix || ""; + var uri = node.namespaceURI; + // According to [Namespaces in XML 1.0](https://www.w3.org/TR/REC-xml-names/#ns-using) , + // and more specifically https://www.w3.org/TR/REC-xml-names/#nsc-NoPrefixUndecl : + // > In a namespace declaration for a prefix [...], the attribute value MUST NOT be empty. + // in a similar manner [Namespaces in XML 1.1](https://www.w3.org/TR/xml-names11/#ns-using) + // and more specifically https://www.w3.org/TR/xml-names11/#nsc-NSDeclared : + // > [...] Furthermore, the attribute value [...] must not be an empty string. + // so serializing empty namespace value like xmlns:ds="" would produce an invalid XML document. + if (!uri) { + return false; + } + if ((prefix === "xml" && uri === NAMESPACE.XML) || uri === NAMESPACE.XMLNS) { + return false; + } + + var i = visibleNamespaces.length; + while (i--) { + var ns = visibleNamespaces[i]; + // get namespace prefix + if (ns.prefix === prefix) { + return ns.namespace !== uri; + } + } + return true; + } + /** + * Well-formed constraint: No < in Attribute Values + * > The replacement text of any entity referred to directly or indirectly + * > in an attribute value must not contain a <. + * @see https://www.w3.org/TR/xml11/#CleanAttrVals + * @see https://www.w3.org/TR/xml11/#NT-AttValue + * + * Literal whitespace other than space that appear in attribute values + * are serialized as their entity references, so they will be preserved. + * (In contrast to whitespace literals in the input which are normalized to spaces) + * @see https://www.w3.org/TR/xml11/#AVNormalize + * @see https://w3c.github.io/DOM-Parsing/#serializing-an-element-s-attributes + */ + function addSerializedAttribute(buf, qualifiedName, value) { + buf.push(" ", qualifiedName, '="', value.replace(/[<>&"\t\n\r]/g, _xmlEncoder), '"'); + } + + function serializeToString(node, buf, isHTML, nodeFilter, visibleNamespaces) { + if (!visibleNamespaces) { + visibleNamespaces = []; + } + + if (nodeFilter) { + node = nodeFilter(node); + if (node) { + if (typeof node == "string") { + buf.push(node); + return; + } + } else { + return; + } + //buf.sort.apply(attrs, attributeSorter); + } + + switch (node.nodeType) { + case ELEMENT_NODE: + var attrs = node.attributes; + var len = attrs.length; + var child = node.firstChild; + var nodeName = node.tagName; + + isHTML = NAMESPACE.isHTML(node.namespaceURI) || isHTML; + + var prefixedNodeName = nodeName; + if (!isHTML && !node.prefix && node.namespaceURI) { + var defaultNS; + // lookup current default ns from `xmlns` attribute + for (var ai = 0; ai < attrs.length; ai++) { + if (attrs.item(ai).name === "xmlns") { + defaultNS = attrs.item(ai).value; + break; + } + } + if (!defaultNS) { + // lookup current default ns in visibleNamespaces + for (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) { + var namespace = visibleNamespaces[nsi]; + if (namespace.prefix === "" && namespace.namespace === node.namespaceURI) { + defaultNS = namespace.namespace; + break; + } + } + } + if (defaultNS !== node.namespaceURI) { + for (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) { + var namespace = visibleNamespaces[nsi]; + if (namespace.namespace === node.namespaceURI) { + if (namespace.prefix) { + prefixedNodeName = namespace.prefix + ":" + nodeName; + } + break; + } + } + } + } + + buf.push("<", prefixedNodeName); + + for (var i = 0; i < len; i++) { + // add namespaces for attributes + var attr = attrs.item(i); + if (attr.prefix == "xmlns") { + visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value }); + } else if (attr.nodeName == "xmlns") { + visibleNamespaces.push({ prefix: "", namespace: attr.value }); + } + } + + for (var i = 0; i < len; i++) { + var attr = attrs.item(i); + if (needNamespaceDefine(attr, isHTML, visibleNamespaces)) { + var prefix = attr.prefix || ""; + var uri = attr.namespaceURI; + addSerializedAttribute(buf, prefix ? "xmlns:" + prefix : "xmlns", uri); + visibleNamespaces.push({ prefix: prefix, namespace: uri }); + } + serializeToString(attr, buf, isHTML, nodeFilter, visibleNamespaces); + } + + // add namespace for current node + if ( + nodeName === prefixedNodeName && + needNamespaceDefine(node, isHTML, visibleNamespaces) + ) { + var prefix = node.prefix || ""; + var uri = node.namespaceURI; + addSerializedAttribute(buf, prefix ? "xmlns:" + prefix : "xmlns", uri); + visibleNamespaces.push({ prefix: prefix, namespace: uri }); + } + + if (child || (isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName))) { + buf.push(">"); + //if is cdata child node + if (isHTML && /^script$/i.test(nodeName)) { + while (child) { + if (child.data) { + buf.push(child.data); + } else { + serializeToString( + child, + buf, + isHTML, + nodeFilter, + visibleNamespaces.slice() + ); + } + child = child.nextSibling; + } + } else { + while (child) { + serializeToString( + child, + buf, + isHTML, + nodeFilter, + visibleNamespaces.slice() + ); + child = child.nextSibling; + } + } + buf.push(""); + } else { + buf.push("/>"); + } + // remove added visible namespaces + //visibleNamespaces.length = startVisibleNamespaces; + return; + case DOCUMENT_NODE: + case DOCUMENT_FRAGMENT_NODE: + var child = node.firstChild; + while (child) { + serializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice()); + child = child.nextSibling; + } + return; + case ATTRIBUTE_NODE: + return addSerializedAttribute(buf, node.name, node.value); + case TEXT_NODE: + /** + * The ampersand character (&) and the left angle bracket (<) must not appear in their literal form, + * except when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section. + * If they are needed elsewhere, they must be escaped using either numeric character references or the strings + * `&` and `<` respectively. + * The right angle bracket (>) may be represented using the string " > ", and must, for compatibility, + * be escaped using either `>` or a character reference when it appears in the string `]]>` in content, + * when that string is not marking the end of a CDATA section. + * + * In the content of elements, character data is any string of characters + * which does not contain the start-delimiter of any markup + * and does not include the CDATA-section-close delimiter, `]]>`. + * + * @see https://www.w3.org/TR/xml/#NT-CharData + * @see https://w3c.github.io/DOM-Parsing/#xml-serializing-a-text-node + */ + return buf.push(node.data.replace(/[<&>]/g, _xmlEncoder)); + case CDATA_SECTION_NODE: + return buf.push(""); + case COMMENT_NODE: + return buf.push(""); + case DOCUMENT_TYPE_NODE: + var pubid = node.publicId; + var sysid = node.systemId; + buf.push(""); + } else if (sysid && sysid != ".") { + buf.push(" SYSTEM ", sysid, ">"); + } else { + var sub = node.internalSubset; + if (sub) { + buf.push(" [", sub, "]"); + } + buf.push(">"); + } + return; + case PROCESSING_INSTRUCTION_NODE: + return buf.push(""); + case ENTITY_REFERENCE_NODE: + return buf.push("&", node.nodeName, ";"); + //case ENTITY_NODE: + //case NOTATION_NODE: + default: + buf.push("??", node.nodeName); + } + } + function importNode(doc, node, deep) { + var node2; + switch (node.nodeType) { + case ELEMENT_NODE: + node2 = node.cloneNode(false); + node2.ownerDocument = doc; + //var attrs = node2.attributes; + //var len = attrs.length; + //for(var i=0;i", lt: "<", quot: '"' }); + + /** + * A map of currently 241 entities that are detected in an HTML document. + * They contain all entries from `XML_ENTITIES`. + * + * @see XML_ENTITIES + * @see DOMParser.parseFromString + * @see DOMImplementation.prototype.createHTMLDocument + * @see https://html.spec.whatwg.org/#named-character-references WHATWG HTML(5) Spec + * @see https://www.w3.org/TR/xml-entity-names/ W3C XML Entity Names + * @see https://www.w3.org/TR/html4/sgml/entities.html W3C HTML4/SGML + * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_entity_references_in_HTML Wikipedia (HTML) + * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Entities_representing_special_characters_in_XHTML Wikpedia (XHTML) + */ + exports.HTML_ENTITIES = freeze({ + lt: "<", + gt: ">", + amp: "&", + quot: '"', + apos: "'", + Agrave: "À", + Aacute: "Á", + Acirc: "Â", + Atilde: "Ã", + Auml: "Ä", + Aring: "Å", + AElig: "Æ", + Ccedil: "Ç", + Egrave: "È", + Eacute: "É", + Ecirc: "Ê", + Euml: "Ë", + Igrave: "Ì", + Iacute: "Í", + Icirc: "Î", + Iuml: "Ï", + ETH: "Ð", + Ntilde: "Ñ", + Ograve: "Ò", + Oacute: "Ó", + Ocirc: "Ô", + Otilde: "Õ", + Ouml: "Ö", + Oslash: "Ø", + Ugrave: "Ù", + Uacute: "Ú", + Ucirc: "Û", + Uuml: "Ü", + Yacute: "Ý", + THORN: "Þ", + szlig: "ß", + agrave: "à", + aacute: "á", + acirc: "â", + atilde: "ã", + auml: "ä", + aring: "å", + aelig: "æ", + ccedil: "ç", + egrave: "è", + eacute: "é", + ecirc: "ê", + euml: "ë", + igrave: "ì", + iacute: "í", + icirc: "î", + iuml: "ï", + eth: "ð", + ntilde: "ñ", + ograve: "ò", + oacute: "ó", + ocirc: "ô", + otilde: "õ", + ouml: "ö", + oslash: "ø", + ugrave: "ù", + uacute: "ú", + ucirc: "û", + uuml: "ü", + yacute: "ý", + thorn: "þ", + yuml: "ÿ", + nbsp: "\u00a0", + iexcl: "¡", + cent: "¢", + pound: "£", + curren: "¤", + yen: "¥", + brvbar: "¦", + sect: "§", + uml: "¨", + copy: "©", + ordf: "ª", + laquo: "«", + not: "¬", + shy: "­­", + reg: "®", + macr: "¯", + deg: "°", + plusmn: "±", + sup2: "²", + sup3: "³", + acute: "´", + micro: "µ", + para: "¶", + middot: "·", + cedil: "¸", + sup1: "¹", + ordm: "º", + raquo: "»", + frac14: "¼", + frac12: "½", + frac34: "¾", + iquest: "¿", + times: "×", + divide: "÷", + forall: "∀", + part: "∂", + exist: "∃", + empty: "∅", + nabla: "∇", + isin: "∈", + notin: "∉", + ni: "∋", + prod: "∏", + sum: "∑", + minus: "−", + lowast: "∗", + radic: "√", + prop: "∝", + infin: "∞", + ang: "∠", + and: "∧", + or: "∨", + cap: "∩", + cup: "∪", + int: "∫", + there4: "∴", + sim: "∼", + cong: "≅", + asymp: "≈", + ne: "≠", + equiv: "≡", + le: "≤", + ge: "≥", + sub: "⊂", + sup: "⊃", + nsub: "⊄", + sube: "⊆", + supe: "⊇", + oplus: "⊕", + otimes: "⊗", + perp: "⊥", + sdot: "⋅", + Alpha: "Α", + Beta: "Β", + Gamma: "Γ", + Delta: "Δ", + Epsilon: "Ε", + Zeta: "Ζ", + Eta: "Η", + Theta: "Θ", + Iota: "Ι", + Kappa: "Κ", + Lambda: "Λ", + Mu: "Μ", + Nu: "Ν", + Xi: "Ξ", + Omicron: "Ο", + Pi: "Π", + Rho: "Ρ", + Sigma: "Σ", + Tau: "Τ", + Upsilon: "Υ", + Phi: "Φ", + Chi: "Χ", + Psi: "Ψ", + Omega: "Ω", + alpha: "α", + beta: "β", + gamma: "γ", + delta: "δ", + epsilon: "ε", + zeta: "ζ", + eta: "η", + theta: "θ", + iota: "ι", + kappa: "κ", + lambda: "λ", + mu: "μ", + nu: "ν", + xi: "ξ", + omicron: "ο", + pi: "π", + rho: "ρ", + sigmaf: "ς", + sigma: "σ", + tau: "τ", + upsilon: "υ", + phi: "φ", + chi: "χ", + psi: "ψ", + omega: "ω", + thetasym: "ϑ", + upsih: "ϒ", + piv: "ϖ", + OElig: "Œ", + oelig: "œ", + Scaron: "Š", + scaron: "š", + Yuml: "Ÿ", + fnof: "ƒ", + circ: "ˆ", + tilde: "˜", + ensp: " ", + emsp: " ", + thinsp: " ", + zwnj: "‌", + zwj: "‍", + lrm: "‎", + rlm: "‏", + ndash: "–", + mdash: "—", + lsquo: "‘", + rsquo: "’", + sbquo: "‚", + ldquo: "“", + rdquo: "”", + bdquo: "„", + dagger: "†", + Dagger: "‡", + bull: "•", + hellip: "…", + permil: "‰", + prime: "′", + Prime: "″", + lsaquo: "‹", + rsaquo: "›", + oline: "‾", + euro: "€", + trade: "™", + larr: "←", + uarr: "↑", + rarr: "→", + darr: "↓", + harr: "↔", + crarr: "↵", + lceil: "⌈", + rceil: "⌉", + lfloor: "⌊", + rfloor: "⌋", + loz: "◊", + spades: "♠", + clubs: "♣", + hearts: "♥", + diams: "♦" + }); + + /** + * @deprecated use `HTML_ENTITIES` instead + * @see HTML_ENTITIES + */ + exports.entityMap = exports.HTML_ENTITIES; + }, + { "./conventions": 41 } + ], + 45: [ + function (require, module, exports) { + var dom = require("./dom"); + exports.DOMImplementation = dom.DOMImplementation; + exports.XMLSerializer = dom.XMLSerializer; + exports.DOMParser = require("./dom-parser").DOMParser; + }, + { "./dom": 43, "./dom-parser": 42 } + ], + 46: [ + function (require, module, exports) { + var NAMESPACE = require("./conventions").NAMESPACE; + + //[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] + //[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] + //[5] Name ::= NameStartChar (NameChar)* + var nameStartChar = + /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/; //\u10000-\uEFFFF + var nameChar = new RegExp( + "[\\-\\.0-9" + nameStartChar.source.slice(1, -1) + "\\u00B7\\u0300-\\u036F\\u203F-\\u2040]" + ); + var tagNamePattern = new RegExp( + "^" + + nameStartChar.source + + nameChar.source + + "*(?::" + + nameStartChar.source + + nameChar.source + + "*)?$" + ); + //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/ + //var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',') + + //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE + //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE + var S_TAG = 0; //tag name offerring + var S_ATTR = 1; //attr name offerring + var S_ATTR_SPACE = 2; //attr name end and space offer + var S_EQ = 3; //=space? + var S_ATTR_NOQUOT_VALUE = 4; //attr value(no quot value only) + var S_ATTR_END = 5; //attr value end and no space(quot end) + var S_TAG_SPACE = 6; //(attr value end || tag end ) && (space offer) + var S_TAG_CLOSE = 7; //closed el + + /** + * Creates an error that will not be caught by XMLReader aka the SAX parser. + * + * @param {string} message + * @param {any?} locator Optional, can provide details about the location in the source + * @constructor + */ + function ParseError(message, locator) { + this.message = message; + this.locator = locator; + if (Error.captureStackTrace) Error.captureStackTrace(this, ParseError); + } + ParseError.prototype = new Error(); + ParseError.prototype.name = ParseError.name; + + function XMLReader() {} + + XMLReader.prototype = { + parse: function (source, defaultNSMap, entityMap) { + var domBuilder = this.domBuilder; + domBuilder.startDocument(); + _copy(defaultNSMap, (defaultNSMap = {})); + parse(source, defaultNSMap, entityMap, domBuilder, this.errorHandler); + domBuilder.endDocument(); + } + }; + function parse(source, defaultNSMapCopy, entityMap, domBuilder, errorHandler) { + function fixedFromCharCode(code) { + // String.prototype.fromCharCode does not supports + // > 2 bytes unicode chars directly + if (code > 0xffff) { + code -= 0x10000; + var surrogate1 = 0xd800 + (code >> 10), + surrogate2 = 0xdc00 + (code & 0x3ff); + + return String.fromCharCode(surrogate1, surrogate2); + } else { + return String.fromCharCode(code); + } + } + function entityReplacer(a) { + var k = a.slice(1, -1); + if (Object.hasOwnProperty.call(entityMap, k)) { + return entityMap[k]; + } else if (k.charAt(0) === "#") { + return fixedFromCharCode(parseInt(k.substr(1).replace("x", "0x"))); + } else { + errorHandler.error("entity not found:" + a); + return a; + } + } + function appendText(end) { + //has some bugs + if (end > start) { + var xt = source.substring(start, end).replace(/&#?\w+;/g, entityReplacer); + locator && position(start); + domBuilder.characters(xt, 0, end - start); + start = end; + } + } + function position(p, m) { + while (p >= lineEnd && (m = linePattern.exec(source))) { + lineStart = m.index; + lineEnd = lineStart + m[0].length; + locator.lineNumber++; + //console.log('line++:',locator,startPos,endPos) + } + locator.columnNumber = p - lineStart + 1; + } + var lineStart = 0; + var lineEnd = 0; + var linePattern = /.*(?:\r\n?|\n)|.*$/g; + var locator = domBuilder.locator; + + var parseStack = [{ currentNSMap: defaultNSMapCopy }]; + var closeMap = {}; + var start = 0; + while (true) { + try { + var tagStart = source.indexOf("<", start); + if (tagStart < 0) { + if (!source.substr(start).match(/^\s*$/)) { + var doc = domBuilder.doc; + var text = doc.createTextNode(source.substr(start)); + doc.appendChild(text); + domBuilder.currentElement = text; + } + return; + } + if (tagStart > start) { + appendText(tagStart); + } + switch (source.charAt(tagStart + 1)) { + case "/": + var end = source.indexOf(">", tagStart + 3); + var tagName = source.substring(tagStart + 2, end).replace(/[ \t\n\r]+$/g, ""); + var config = parseStack.pop(); + if (end < 0) { + tagName = source.substring(tagStart + 2).replace(/[\s<].*/, ""); + errorHandler.error( + "end tag name: " + tagName + " is not complete:" + config.tagName + ); + end = tagStart + 1 + tagName.length; + } else if (tagName.match(/\s + locator && position(tagStart); + end = parseInstruction(source, tagStart, domBuilder); + break; + case "!": // start) { + start = end; + } else { + //TODO: 这里有可能sax回退,有位置错误风险 + appendText(Math.max(tagStart, start) + 1); + } + } + } + function copyLocator(f, t) { + t.lineNumber = f.lineNumber; + t.columnNumber = f.columnNumber; + return t; + } + + /** + * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack); + * @return end of the elementStartPart(end of elementEndPart for selfClosed el) + */ + function parseElementStartPart(source, start, el, currentNSMap, entityReplacer, errorHandler) { + /** + * @param {string} qname + * @param {string} value + * @param {number} startIndex + */ + function addAttribute(qname, value, startIndex) { + if (el.attributeNames.hasOwnProperty(qname)) { + errorHandler.fatalError("Attribute " + qname + " redefined"); + } + el.addValue( + qname, + // @see https://www.w3.org/TR/xml/#AVNormalize + // since the xmldom sax parser does not "interpret" DTD the following is not implemented: + // - recursive replacement of (DTD) entity references + // - trimming and collapsing multiple spaces into a single one for attributes that are not of type CDATA + value.replace(/[\t\n\r]/g, " ").replace(/&#?\w+;/g, entityReplacer), + startIndex + ); + } + var attrName; + var value; + var p = ++start; + var s = S_TAG; //status + while (true) { + var c = source.charAt(p); + switch (c) { + case "=": + if (s === S_ATTR) { + //attrName + attrName = source.slice(start, p); + s = S_EQ; + } else if (s === S_ATTR_SPACE) { + s = S_EQ; + } else { + //fatalError: equal must after attrName or space after attrName + throw new Error("attribute equal must after attrName"); // No known test case + } + break; + case "'": + case '"': + if ( + s === S_EQ || + s === S_ATTR //|| s == S_ATTR_SPACE + ) { + //equal + if (s === S_ATTR) { + errorHandler.warning('attribute value must after "="'); + attrName = source.slice(start, p); + } + start = p + 1; + p = source.indexOf(c, start); + if (p > 0) { + value = source.slice(start, p); + addAttribute(attrName, value, start - 1); + s = S_ATTR_END; + } else { + //fatalError: no end quot match + throw new Error("attribute value no end '" + c + "' match"); + } + } else if (s == S_ATTR_NOQUOT_VALUE) { + value = source.slice(start, p); + addAttribute(attrName, value, start); + errorHandler.warning( + 'attribute "' + attrName + '" missed start quot(' + c + ")!!" + ); + start = p + 1; + s = S_ATTR_END; + } else { + //fatalError: no equal before + throw new Error('attribute value must after "="'); // No known test case + } + break; + case "/": + switch (s) { + case S_TAG: + el.setTagName(source.slice(start, p)); + case S_ATTR_END: + case S_TAG_SPACE: + case S_TAG_CLOSE: + s = S_TAG_CLOSE; + el.closed = true; + case S_ATTR_NOQUOT_VALUE: + case S_ATTR: + case S_ATTR_SPACE: + break; + //case S_EQ: + default: + throw new Error("attribute invalid close char('/')"); // No known test case + } + break; + case "": //end document + errorHandler.error("unexpected end of input"); + if (s == S_TAG) { + el.setTagName(source.slice(start, p)); + } + return p; + case ">": + switch (s) { + case S_TAG: + el.setTagName(source.slice(start, p)); + case S_ATTR_END: + case S_TAG_SPACE: + case S_TAG_CLOSE: + break; //normal + case S_ATTR_NOQUOT_VALUE: //Compatible state + case S_ATTR: + value = source.slice(start, p); + if (value.slice(-1) === "/") { + el.closed = true; + value = value.slice(0, -1); + } + case S_ATTR_SPACE: + if (s === S_ATTR_SPACE) { + value = attrName; + } + if (s == S_ATTR_NOQUOT_VALUE) { + errorHandler.warning('attribute "' + value + '" missed quot(")!'); + addAttribute(attrName, value, start); + } else { + if ( + !NAMESPACE.isHTML(currentNSMap[""]) || + !value.match(/^(?:disabled|checked|selected)$/i) + ) { + errorHandler.warning( + 'attribute "' + + value + + '" missed value!! "' + + value + + '" instead!!' + ); + } + addAttribute(value, value, start); + } + break; + case S_EQ: + throw new Error("attribute value missed!!"); + } + // console.log(tagName,tagNamePattern,tagNamePattern.test(tagName)) + return p; + /*xml space '\x20' | #x9 | #xD | #xA; */ + case "\u0080": + c = " "; + default: + if (c <= " ") { + //space + switch (s) { + case S_TAG: + el.setTagName(source.slice(start, p)); //tagName + s = S_TAG_SPACE; + break; + case S_ATTR: + attrName = source.slice(start, p); + s = S_ATTR_SPACE; + break; + case S_ATTR_NOQUOT_VALUE: + var value = source.slice(start, p); + errorHandler.warning('attribute "' + value + '" missed quot(")!!'); + addAttribute(attrName, value, start); + case S_ATTR_END: + s = S_TAG_SPACE; + break; + //case S_TAG_SPACE: + //case S_EQ: + //case S_ATTR_SPACE: + // void();break; + //case S_TAG_CLOSE: + //ignore warning + } + } else { + //not space + //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE + //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE + switch (s) { + //case S_TAG:void();break; + //case S_ATTR:void();break; + //case S_ATTR_NOQUOT_VALUE:void();break; + case S_ATTR_SPACE: + var tagName = el.tagName; + if ( + !NAMESPACE.isHTML(currentNSMap[""]) || + !attrName.match(/^(?:disabled|checked|selected)$/i) + ) { + errorHandler.warning( + 'attribute "' + + attrName + + '" missed value!! "' + + attrName + + '" instead2!!' + ); + } + addAttribute(attrName, attrName, start); + start = p; + s = S_ATTR; + break; + case S_ATTR_END: + errorHandler.warning('attribute space is required"' + attrName + '"!!'); + case S_TAG_SPACE: + s = S_ATTR; + start = p; + break; + case S_EQ: + s = S_ATTR_NOQUOT_VALUE; + start = p; + break; + case S_TAG_CLOSE: + throw new Error( + "elements closed character '/' and '>' must be connected to" + ); + } + } + } //end outer switch + //console.log('p++',p) + p++; + } + } + /** + * @return true if has new namespace define + */ + function appendElement(el, domBuilder, currentNSMap) { + var tagName = el.tagName; + var localNSMap = null; + //var currentNSMap = parseStack[parseStack.length-1].currentNSMap; + var i = el.length; + while (i--) { + var a = el[i]; + var qName = a.qName; + var value = a.value; + var nsp = qName.indexOf(":"); + if (nsp > 0) { + var prefix = (a.prefix = qName.slice(0, nsp)); + var localName = qName.slice(nsp + 1); + var nsPrefix = prefix === "xmlns" && localName; + } else { + localName = qName; + prefix = null; + nsPrefix = qName === "xmlns" && ""; + } + //can not set prefix,because prefix !== '' + a.localName = localName; + //prefix == null for no ns prefix attribute + if (nsPrefix !== false) { + //hack!! + if (localNSMap == null) { + localNSMap = {}; + //console.log(currentNSMap,0) + _copy(currentNSMap, (currentNSMap = {})); + //console.log(currentNSMap,1) + } + currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value; + a.uri = NAMESPACE.XMLNS; + domBuilder.startPrefixMapping(nsPrefix, value); + } + } + var i = el.length; + while (i--) { + a = el[i]; + var prefix = a.prefix; + if (prefix) { + //no prefix attribute has no namespace + if (prefix === "xml") { + a.uri = NAMESPACE.XML; + } + if (prefix !== "xmlns") { + a.uri = currentNSMap[prefix || ""]; + + //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)} + } + } + } + var nsp = tagName.indexOf(":"); + if (nsp > 0) { + prefix = el.prefix = tagName.slice(0, nsp); + localName = el.localName = tagName.slice(nsp + 1); + } else { + prefix = null; //important!! + localName = el.localName = tagName; + } + //no prefix element has default namespace + var ns = (el.uri = currentNSMap[prefix || ""]); + domBuilder.startElement(ns, localName, tagName, el); + //endPrefixMapping and startPrefixMapping have not any help for dom builder + //localNSMap = null + if (el.closed) { + domBuilder.endElement(ns, localName, tagName); + if (localNSMap) { + for (prefix in localNSMap) { + if (Object.prototype.hasOwnProperty.call(localNSMap, prefix)) { + domBuilder.endPrefixMapping(prefix); + } + } + } + } else { + el.currentNSMap = currentNSMap; + el.localNSMap = localNSMap; + //parseStack.push(el); + return true; + } + } + function parseHtmlSpecialContent(source, elStartEnd, tagName, entityReplacer, domBuilder) { + if (/^(?:script|textarea)$/i.test(tagName)) { + var elEndStart = source.indexOf("", elStartEnd); + var text = source.substring(elStartEnd + 1, elEndStart); + if (/[&<]/.test(text)) { + if (/^script$/i.test(tagName)) { + //if(!/\]\]>/.test(text)){ + //lexHandler.startCDATA(); + domBuilder.characters(text, 0, text.length); + //lexHandler.endCDATA(); + return elEndStart; + //} + } //}else{//text area + text = text.replace(/&#?\w+;/g, entityReplacer); + domBuilder.characters(text, 0, text.length); + return elEndStart; + //} + } + } + return elStartEnd + 1; + } + function fixSelfClosed(source, elStartEnd, tagName, closeMap) { + //if(tagName in closeMap){ + var pos = closeMap[tagName]; + if (pos == null) { + //console.log(tagName) + pos = source.lastIndexOf(""); + if (pos < elStartEnd) { + //忘记闭合 + pos = source.lastIndexOf("", start + 4); + //append comment source.substring(4,end)//" + this.endline(node) + ); + }; + + XMLStreamWriter.prototype.declaration = function (node, level) { + this.stream.write(this.space(level)); + this.stream.write('"); + return this.stream.write(this.endline(node)); + }; + + XMLStreamWriter.prototype.docType = function (node, level) { + var child, i, len, ref; + level || (level = 0); + this.stream.write(this.space(level)); + this.stream.write(" 0) { + this.stream.write(" ["); + this.stream.write(this.endline(node)); + ref = node.children; + for (i = 0, len = ref.length; i < len; i++) { + child = ref[i]; + switch (false) { + case !(child instanceof XMLDTDAttList): + this.dtdAttList(child, level + 1); + break; + case !(child instanceof XMLDTDElement): + this.dtdElement(child, level + 1); + break; + case !(child instanceof XMLDTDEntity): + this.dtdEntity(child, level + 1); + break; + case !(child instanceof XMLDTDNotation): + this.dtdNotation(child, level + 1); + break; + case !(child instanceof XMLCData): + this.cdata(child, level + 1); + break; + case !(child instanceof XMLComment): + this.comment(child, level + 1); + break; + case !(child instanceof XMLProcessingInstruction): + this.processingInstruction(child, level + 1); + break; + default: + throw new Error("Unknown DTD node type: " + child.constructor.name); + } + } + this.stream.write("]"); + } + this.stream.write(this.spacebeforeslash + ">"); + return this.stream.write(this.endline(node)); + }; + + XMLStreamWriter.prototype.element = function (node, level) { + var att, child, i, len, name, ref, ref1, space; + level || (level = 0); + space = this.space(level); + this.stream.write(space + "<" + node.name); + ref = node.attributes; + for (name in ref) { + if (!hasProp.call(ref, name)) continue; + att = ref[name]; + this.attribute(att); + } + if ( + node.children.length === 0 || + node.children.every(function (e) { + return e.value === ""; + }) + ) { + if (this.allowEmpty) { + this.stream.write(">"); + } else { + this.stream.write(this.spacebeforeslash + "/>"); + } + } else if ( + this.pretty && + node.children.length === 1 && + node.children[0].value != null + ) { + this.stream.write(">"); + this.stream.write(node.children[0].value); + this.stream.write(""); + } else { + this.stream.write(">" + this.newline); + ref1 = node.children; + for (i = 0, len = ref1.length; i < len; i++) { + child = ref1[i]; + switch (false) { + case !(child instanceof XMLCData): + this.cdata(child, level + 1); + break; + case !(child instanceof XMLComment): + this.comment(child, level + 1); + break; + case !(child instanceof XMLElement): + this.element(child, level + 1); + break; + case !(child instanceof XMLRaw): + this.raw(child, level + 1); + break; + case !(child instanceof XMLText): + this.text(child, level + 1); + break; + case !(child instanceof XMLProcessingInstruction): + this.processingInstruction(child, level + 1); + break; + default: + throw new Error("Unknown XML node type: " + child.constructor.name); + } + } + this.stream.write(space + ""); + } + return this.stream.write(this.endline(node)); + }; + + XMLStreamWriter.prototype.processingInstruction = function (node, level) { + this.stream.write(this.space(level) + "" + this.endline(node)); + }; + + XMLStreamWriter.prototype.raw = function (node, level) { + return this.stream.write(this.space(level) + node.value + this.endline(node)); + }; + + XMLStreamWriter.prototype.text = function (node, level) { + return this.stream.write(this.space(level) + node.value + this.endline(node)); + }; + + XMLStreamWriter.prototype.dtdAttList = function (node, level) { + this.stream.write( + this.space(level) + + "" + this.endline(node)); + }; + + XMLStreamWriter.prototype.dtdElement = function (node, level) { + this.stream.write(this.space(level) + "" + this.endline(node)); + }; + + XMLStreamWriter.prototype.dtdEntity = function (node, level) { + this.stream.write(this.space(level) + "" + this.endline(node)); + }; + + XMLStreamWriter.prototype.dtdNotation = function (node, level) { + this.stream.write(this.space(level) + "" + this.endline(node)); + }; + + XMLStreamWriter.prototype.endline = function (node) { + if (!node.isLastRootNode) { + return this.newline; + } else { + return ""; + } + }; + + return XMLStreamWriter; + })(XMLWriterBase); + }).call(this); + }, + { + "./XMLCData": 70, + "./XMLComment": 71, + "./XMLDTDAttList": 72, + "./XMLDTDElement": 73, + "./XMLDTDEntity": 74, + "./XMLDTDNotation": 75, + "./XMLDeclaration": 76, + "./XMLDocType": 77, + "./XMLElement": 80, + "./XMLProcessingInstruction": 82, + "./XMLRaw": 83, + "./XMLText": 87, + "./XMLWriterBase": 88 + } + ], + 85: [ + function (require, module, exports) { + // Generated by CoffeeScript 1.12.7 + (function () { + var XMLCData, + XMLComment, + XMLDTDAttList, + XMLDTDElement, + XMLDTDEntity, + XMLDTDNotation, + XMLDeclaration, + XMLDocType, + XMLElement, + XMLProcessingInstruction, + XMLRaw, + XMLStringWriter, + XMLText, + XMLWriterBase, + extend = function (child, parent) { + for (var key in parent) { + if (hasProp.call(parent, key)) child[key] = parent[key]; + } + function ctor() { + this.constructor = child; + } + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + child.__super__ = parent.prototype; + return child; + }, + hasProp = {}.hasOwnProperty; + + XMLDeclaration = require("./XMLDeclaration"); + + XMLDocType = require("./XMLDocType"); + + XMLCData = require("./XMLCData"); + + XMLComment = require("./XMLComment"); + + XMLElement = require("./XMLElement"); + + XMLRaw = require("./XMLRaw"); + + XMLText = require("./XMLText"); + + XMLProcessingInstruction = require("./XMLProcessingInstruction"); + + XMLDTDAttList = require("./XMLDTDAttList"); + + XMLDTDElement = require("./XMLDTDElement"); + + XMLDTDEntity = require("./XMLDTDEntity"); + + XMLDTDNotation = require("./XMLDTDNotation"); + + XMLWriterBase = require("./XMLWriterBase"); + + module.exports = XMLStringWriter = (function (superClass) { + extend(XMLStringWriter, superClass); + + function XMLStringWriter(options) { + XMLStringWriter.__super__.constructor.call(this, options); + } + + XMLStringWriter.prototype.document = function (doc) { + var child, i, len, r, ref; + this.textispresent = false; + r = ""; + ref = doc.children; + for (i = 0, len = ref.length; i < len; i++) { + child = ref[i]; + r += function () { + switch (false) { + case !(child instanceof XMLDeclaration): + return this.declaration(child); + case !(child instanceof XMLDocType): + return this.docType(child); + case !(child instanceof XMLComment): + return this.comment(child); + case !(child instanceof XMLProcessingInstruction): + return this.processingInstruction(child); + default: + return this.element(child, 0); + } + }.call(this); + } + if (this.pretty && r.slice(-this.newline.length) === this.newline) { + r = r.slice(0, -this.newline.length); + } + return r; + }; + + XMLStringWriter.prototype.attribute = function (att) { + return " " + att.name + '="' + att.value + '"'; + }; + + XMLStringWriter.prototype.cdata = function (node, level) { + return this.space(level) + "" + this.newline; + }; + + XMLStringWriter.prototype.comment = function (node, level) { + return this.space(level) + "" + this.newline; + }; + + XMLStringWriter.prototype.declaration = function (node, level) { + var r; + r = this.space(level); + r += '"; + r += this.newline; + return r; + }; + + XMLStringWriter.prototype.docType = function (node, level) { + var child, i, len, r, ref; + level || (level = 0); + r = this.space(level); + r += " 0) { + r += " ["; + r += this.newline; + ref = node.children; + for (i = 0, len = ref.length; i < len; i++) { + child = ref[i]; + r += function () { + switch (false) { + case !(child instanceof XMLDTDAttList): + return this.dtdAttList(child, level + 1); + case !(child instanceof XMLDTDElement): + return this.dtdElement(child, level + 1); + case !(child instanceof XMLDTDEntity): + return this.dtdEntity(child, level + 1); + case !(child instanceof XMLDTDNotation): + return this.dtdNotation(child, level + 1); + case !(child instanceof XMLCData): + return this.cdata(child, level + 1); + case !(child instanceof XMLComment): + return this.comment(child, level + 1); + case !(child instanceof XMLProcessingInstruction): + return this.processingInstruction(child, level + 1); + default: + throw new Error("Unknown DTD node type: " + child.constructor.name); + } + }.call(this); + } + r += "]"; + } + r += this.spacebeforeslash + ">"; + r += this.newline; + return r; + }; + + XMLStringWriter.prototype.element = function (node, level) { + var att, child, i, j, len, len1, name, r, ref, ref1, ref2, space, textispresentwasset; + level || (level = 0); + textispresentwasset = false; + if (this.textispresent) { + this.newline = ""; + this.pretty = false; + } else { + this.newline = this.newlinedefault; + this.pretty = this.prettydefault; + } + space = this.space(level); + r = ""; + r += space + "<" + node.name; + ref = node.attributes; + for (name in ref) { + if (!hasProp.call(ref, name)) continue; + att = ref[name]; + r += this.attribute(att); + } + if ( + node.children.length === 0 || + node.children.every(function (e) { + return e.value === ""; + }) + ) { + if (this.allowEmpty) { + r += ">" + this.newline; + } else { + r += this.spacebeforeslash + "/>" + this.newline; + } + } else if ( + this.pretty && + node.children.length === 1 && + node.children[0].value != null + ) { + r += ">"; + r += node.children[0].value; + r += "" + this.newline; + } else { + if (this.dontprettytextnodes) { + ref1 = node.children; + for (i = 0, len = ref1.length; i < len; i++) { + child = ref1[i]; + if (child.value != null) { + this.textispresent++; + textispresentwasset = true; + break; + } + } + } + if (this.textispresent) { + this.newline = ""; + this.pretty = false; + space = this.space(level); + } + r += ">" + this.newline; + ref2 = node.children; + for (j = 0, len1 = ref2.length; j < len1; j++) { + child = ref2[j]; + r += function () { + switch (false) { + case !(child instanceof XMLCData): + return this.cdata(child, level + 1); + case !(child instanceof XMLComment): + return this.comment(child, level + 1); + case !(child instanceof XMLElement): + return this.element(child, level + 1); + case !(child instanceof XMLRaw): + return this.raw(child, level + 1); + case !(child instanceof XMLText): + return this.text(child, level + 1); + case !(child instanceof XMLProcessingInstruction): + return this.processingInstruction(child, level + 1); + default: + throw new Error("Unknown XML node type: " + child.constructor.name); + } + }.call(this); + } + if (textispresentwasset) { + this.textispresent--; + } + if (!this.textispresent) { + this.newline = this.newlinedefault; + this.pretty = this.prettydefault; + } + r += space + "" + this.newline; + } + return r; + }; + + XMLStringWriter.prototype.processingInstruction = function (node, level) { + var r; + r = this.space(level) + "" + this.newline; + return r; + }; + + XMLStringWriter.prototype.raw = function (node, level) { + return this.space(level) + node.value + this.newline; + }; + + XMLStringWriter.prototype.text = function (node, level) { + return this.space(level) + node.value + this.newline; + }; + + XMLStringWriter.prototype.dtdAttList = function (node, level) { + var r; + r = + this.space(level) + + "" + this.newline; + return r; + }; + + XMLStringWriter.prototype.dtdElement = function (node, level) { + return ( + this.space(level) + + "" + + this.newline + ); + }; + + XMLStringWriter.prototype.dtdEntity = function (node, level) { + var r; + r = this.space(level) + "" + this.newline; + return r; + }; + + XMLStringWriter.prototype.dtdNotation = function (node, level) { + var r; + r = this.space(level) + "" + this.newline; + return r; + }; + + XMLStringWriter.prototype.openNode = function (node, level) { + var att, name, r, ref; + level || (level = 0); + if (node instanceof XMLElement) { + r = this.space(level) + "<" + node.name; + ref = node.attributes; + for (name in ref) { + if (!hasProp.call(ref, name)) continue; + att = ref[name]; + r += this.attribute(att); + } + r += (node.children ? ">" : "/>") + this.newline; + return r; + } else { + r = this.space(level) + "") + this.newline; + return r; + } + }; + + XMLStringWriter.prototype.closeNode = function (node, level) { + level || (level = 0); + switch (false) { + case !(node instanceof XMLElement): + return this.space(level) + "" + this.newline; + case !(node instanceof XMLDocType): + return this.space(level) + "]>" + this.newline; + } + }; + + return XMLStringWriter; + })(XMLWriterBase); + }).call(this); + }, + { + "./XMLCData": 70, + "./XMLComment": 71, + "./XMLDTDAttList": 72, + "./XMLDTDElement": 73, + "./XMLDTDEntity": 74, + "./XMLDTDNotation": 75, + "./XMLDeclaration": 76, + "./XMLDocType": 77, + "./XMLElement": 80, + "./XMLProcessingInstruction": 82, + "./XMLRaw": 83, + "./XMLText": 87, + "./XMLWriterBase": 88 + } + ], + 86: [ + function (require, module, exports) { + // Generated by CoffeeScript 1.12.7 + (function () { + var XMLStringifier, + bind = function (fn, me) { + return function () { + return fn.apply(me, arguments); + }; + }, + hasProp = {}.hasOwnProperty; + + module.exports = XMLStringifier = (function () { + function XMLStringifier(options) { + this.assertLegalChar = bind(this.assertLegalChar, this); + var key, ref, value; + options || (options = {}); + this.noDoubleEncoding = options.noDoubleEncoding; + ref = options.stringify || {}; + for (key in ref) { + if (!hasProp.call(ref, key)) continue; + value = ref[key]; + this[key] = value; + } + } + + XMLStringifier.prototype.eleName = function (val) { + val = "" + val || ""; + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.eleText = function (val) { + val = "" + val || ""; + return this.assertLegalChar(this.elEscape(val)); + }; + + XMLStringifier.prototype.cdata = function (val) { + val = "" + val || ""; + val = val.replace("]]>", "]]]]>"); + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.comment = function (val) { + val = "" + val || ""; + if (val.match(/--/)) { + throw new Error("Comment text cannot contain double-hypen: " + val); + } + return this.assertLegalChar(val); + }; + + XMLStringifier.prototype.raw = function (val) { + return "" + val || ""; + }; + + XMLStringifier.prototype.attName = function (val) { + return (val = "" + val || ""); + }; + + XMLStringifier.prototype.attValue = function (val) { + val = "" + val || ""; + return this.attEscape(val); + }; + + XMLStringifier.prototype.insTarget = function (val) { + return "" + val || ""; + }; + + XMLStringifier.prototype.insValue = function (val) { + val = "" + val || ""; + if (val.match(/\?>/)) { + throw new Error("Invalid processing instruction value: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlVersion = function (val) { + val = "" + val || ""; + if (!val.match(/1\.[0-9]+/)) { + throw new Error("Invalid version number: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlEncoding = function (val) { + val = "" + val || ""; + if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/)) { + throw new Error("Invalid encoding: " + val); + } + return val; + }; + + XMLStringifier.prototype.xmlStandalone = function (val) { + if (val) { + return "yes"; + } else { + return "no"; + } + }; + + XMLStringifier.prototype.dtdPubID = function (val) { + return "" + val || ""; + }; + + XMLStringifier.prototype.dtdSysID = function (val) { + return "" + val || ""; + }; + + XMLStringifier.prototype.dtdElementValue = function (val) { + return "" + val || ""; + }; + + XMLStringifier.prototype.dtdAttType = function (val) { + return "" + val || ""; + }; + + XMLStringifier.prototype.dtdAttDefault = function (val) { + if (val != null) { + return "" + val || ""; + } else { + return val; + } + }; + + XMLStringifier.prototype.dtdEntityValue = function (val) { + return "" + val || ""; + }; + + XMLStringifier.prototype.dtdNData = function (val) { + return "" + val || ""; + }; + + XMLStringifier.prototype.convertAttKey = "@"; + + XMLStringifier.prototype.convertPIKey = "?"; + + XMLStringifier.prototype.convertTextKey = "#text"; + + XMLStringifier.prototype.convertCDataKey = "#cdata"; + + XMLStringifier.prototype.convertCommentKey = "#comment"; + + XMLStringifier.prototype.convertRawKey = "#raw"; + + XMLStringifier.prototype.assertLegalChar = function (str) { + var res; + res = str.match( + /[\0\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/ + ); + if (res) { + throw new Error("Invalid character in string: " + str + " at index " + res.index); + } + return str; + }; + + XMLStringifier.prototype.elEscape = function (str) { + var ampregex; + ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g; + return str + .replace(ampregex, "&") + .replace(//g, ">") + .replace(/\r/g, " "); + }; + + XMLStringifier.prototype.attEscape = function (str) { + var ampregex; + ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g; + return str + .replace(ampregex, "&") + .replace(/ 0) { + return new Array(indent).join(this.indent); + } else { + return ""; + } + } else { + return ""; + } + }; + + return XMLWriterBase; + })(); + }).call(this); + }, + {} + ], + 89: [ + function (require, module, exports) { + // Generated by CoffeeScript 1.12.7 + (function () { + var XMLDocument, XMLDocumentCB, XMLStreamWriter, XMLStringWriter, assign, isFunction, ref; + + (ref = require("./Utility")), (assign = ref.assign), (isFunction = ref.isFunction); + + XMLDocument = require("./XMLDocument"); + + XMLDocumentCB = require("./XMLDocumentCB"); + + XMLStringWriter = require("./XMLStringWriter"); + + XMLStreamWriter = require("./XMLStreamWriter"); + + module.exports.create = function (name, xmldec, doctype, options) { + var doc, root; + if (name == null) { + throw new Error("Root element needs a name."); + } + options = assign({}, xmldec, doctype, options); + doc = new XMLDocument(options); + root = doc.element(name); + if (!options.headless) { + doc.declaration(options); + if (options.pubID != null || options.sysID != null) { + doc.doctype(options); + } + } + return root; + }; + + module.exports.begin = function (options, onData, onEnd) { + var ref1; + if (isFunction(options)) { + (ref1 = [options, onData]), (onData = ref1[0]), (onEnd = ref1[1]); + options = {}; + } + if (onData) { + return new XMLDocumentCB(options, onData, onEnd); + } else { + return new XMLDocument(options); + } + }; + + module.exports.stringWriter = function (options) { + return new XMLStringWriter(options); + }; + + module.exports.streamWriter = function (stream, options) { + return new XMLStreamWriter(stream, options); + }; + }).call(this); + }, + { + "./Utility": 68, + "./XMLDocument": 78, + "./XMLDocumentCB": 79, + "./XMLStreamWriter": 84, + "./XMLStringWriter": 85 + } + ] + }, + {}, + [21] + )(21); +}); diff --git a/packages/pluggableWidgets/rich-text-web/.eslintignore b/packages/pluggableWidgets/rich-text-web/.eslintignore new file mode 100644 index 0000000000..d3834116c6 --- /dev/null +++ b/packages/pluggableWidgets/rich-text-web/.eslintignore @@ -0,0 +1,2 @@ +src/assets +src/utils/mammoth.browser.js diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83430dc71e..ef8a3b07d9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1312,6 +1312,9 @@ importers: '@mendix/pluggable-widgets-tools': specifier: 10.18.2 version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + '@rollup/plugin-replace': + specifier: ^6.0.2 + version: 6.0.2(rollup@3.29.5) packages/pluggableWidgets/dropdown-sort-web: dependencies: @@ -14037,7 +14040,7 @@ snapshots: shelljs: 0.8.5 shx: 0.3.4 ts-jest: 29.2.6(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2)))(typescript@5.8.2) - ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2) + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.1.6) typescript: 5.8.2 xml2js: 0.6.2 zip-a-folder: 0.0.12 @@ -14090,7 +14093,7 @@ snapshots: '@types/react-dom': 18.2.14 '@types/react-native': 0.72.8(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.1.6)) '@types/testing-library__jest-dom': 5.14.9 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.1.6))(eslint@7.32.0)(typescript@5.1.6) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.8.2))(eslint@7.32.0)(typescript@5.8.2) '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@5.8.2) ansi-colors: 4.1.1 babel-eslint: 10.1.0(eslint@7.32.0) @@ -17095,7 +17098,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.1 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) copy-webpack-plugin@11.0.0(webpack@5.96.1): dependencies: @@ -17288,7 +17291,7 @@ snapshots: postcss-modules-values: 4.0.0(postcss@8.4.21) postcss-value-parser: 4.2.0 semver: 7.5.1 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) css-loader@6.7.3(webpack@5.96.1): dependencies: @@ -18161,7 +18164,7 @@ snapshots: eslint: 9.23.0(jiti@2.4.2) globals: 15.15.0 - eslint-plugin-jest@24.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.8.2))(eslint@7.32.0)(typescript@5.8.2))(eslint@7.32.0)(typescript@5.8.2): + eslint-plugin-jest@24.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.1.6))(eslint@7.32.0)(typescript@5.8.2))(eslint@7.32.0)(typescript@5.8.2): dependencies: '@typescript-eslint/experimental-utils': 4.33.0(eslint@7.32.0)(typescript@5.8.2) eslint: 7.32.0 @@ -19844,7 +19847,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.14.0 - ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2) + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.1.6) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -21650,7 +21653,7 @@ snapshots: yaml: 1.10.2 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2) + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.1.6) postcss-merge-longhand@5.1.7(postcss@8.4.31): dependencies: @@ -23110,7 +23113,7 @@ snapshots: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) optionalDependencies: sass: 1.58.3 @@ -23755,7 +23758,7 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) optionalDependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.15) @@ -23934,7 +23937,7 @@ snapshots: micromatch: 4.0.5 semver: 7.5.1 typescript: 5.1.6 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) ts-loader@9.4.2(typescript@5.1.6)(webpack@5.96.1): dependencies: From 370ce6594dc84b171b09ec3b3fb77818c093ebaf Mon Sep 17 00:00:00 2001 From: gjulivan Date: Wed, 9 Apr 2025 14:10:31 +0200 Subject: [PATCH 6/8] fix: styling and icons --- .../assets/DocViewer.woff2 | Bin 0 -> 1304 bytes .../components/DocxViewer.tsx | 3 + .../components/PDFViewer.tsx | 26 +++++-- .../src/DocumentViewer.editorConfig.ts | 49 +++++++++++++ .../src/DocumentViewer.editorPreview.tsx | 12 ++++ .../src/DocumentViewer.icon.dark.png | Bin 0 -> 1735 bytes .../src/DocumentViewer.icon.png | Bin 0 -> 1734 bytes .../src/DocumentViewer.tile.dark.png | Bin 0 -> 5642 bytes .../src/DocumentViewer.tile.png | Bin 0 -> 5613 bytes .../src/DocumentViewer.tsx | 3 +- .../ui/documentViewer.scss | 20 +++++- .../ui/documentViewerIcons.scss | 38 ++++++++++ pnpm-lock.yaml | 65 +++--------------- 13 files changed, 152 insertions(+), 64 deletions(-) create mode 100644 packages/pluggableWidgets/document-viewer-web/assets/DocViewer.woff2 create mode 100644 packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.editorConfig.ts create mode 100644 packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.editorPreview.tsx create mode 100644 packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.icon.dark.png create mode 100644 packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.icon.png create mode 100644 packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.tile.dark.png create mode 100644 packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.tile.png create mode 100644 packages/pluggableWidgets/document-viewer-web/ui/documentViewerIcons.scss diff --git a/packages/pluggableWidgets/document-viewer-web/assets/DocViewer.woff2 b/packages/pluggableWidgets/document-viewer-web/assets/DocViewer.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..16ebb6d15e99ae2d8b6d0f9e21e0433af1684cd4 GIT binary patch literal 1304 zcmV+z1?T#APew8T0RR9100kHT3jhEB01MCn00hYZ0RR9100000000000000000000 z0000Sfn)|?0EQ+Cgmi>)0X70818fU800bZfgkA@MGaJzgQIt*2k;uL%9smFUz)4UP z-G=9M`i5~SA`Pk{?^KN9`@RnT`S$zYJ~MMopJ>A+!B2QH^(Iydkz|cU{E?)q>!tJm zbV;r%qcbez+Kg47&ZZh9A0mXGNB-&5c~Ao2a`zK=<&jU(P4DSz(O7C}7H)wi*EF?2 zvUS87G53~L9pT94$DjdFxUqXuV>{b5KtTF`gWqpfw0Wc2;VD5Z@8b{Aq)BHciM|k* z%p~RY5!06IRK#r=W>@Rofu|r4TWEqAta<6M)#ea6w#5O7t&tcp3%PkH5=(?q8PVEuTH5MEd&5&GRTrr*mDYMRRB6NmSw!3kilg0Eyb$}P z9{=kGhEh541roWojy~t7c6cxw^Trsj^qTsysF1Q}j}UILadn%pf5iM4U~l|71YK~w z6nMabxxhh>==cw&%+k56m}))k4KP&to-@xX9ZII+k)g@QeP;iM)<_A9>hN5O{ zy7}uZ2R(tllzXy4w+wXcLZT}kG@3t4BOTtve1qaMP>Nu_$3$RQpVPEHTh;CLjWtMm zaaa%L#GL-VP(KA|g7P7lC!+^eApl#^2ZxY?!x)02$iOkQz;U#}36$U@DsTz~IEw_F zLl>M!3@#u97cl^rk%OzK!3{*_O0e2@@y1Z(hFLE;7j@N-DseNDyWui510Zp0BA`I*qht%lrD$Of>#P zUxH$Sir|V`u7yV_IT3y$-~W5!VebcrT%0TXArwaj!XQ_T19I{m=27K+U=SQkDg;(% z1F+N>NsdTo+O{&72fEzQjWHl-tGIrD-&ty_Vhd75F6hCoK(ruqIh&khbJ?Mx>^vtt zFmEm?P?z~+e&aNi|H?<1!e_T`7f^IR@bU33?Xgs}1}NyxJDqtqJYz&77IFH|ZfjD0 zYe~PJNe>L9rzN5Vrp+e49E)_>ti*#xBt%%jO;&o7-G`uU#UlXBZE6hzbJv6RjP6KY zE&Fr&8SXwO9}1e2|6$?)_&MtJ!6YkR1H$>~*T2rD&SbB9y?q9c#mT=*@~AT3(zQ@* zKrBvyUqG@n*}SCWiR*(A$Zcv(Uk7Z*p8`)}5q!B7h|RI#_(aP!Qxr$Y*kcAG_ZrsN zTejnWhNtTveB(fDd$3b@iRoQFj*f%@2VN5T7MQ-30X@82JuINk(DB3YAkcenoC^}J z#=IVwh)8qovE+A2t_Rj4uRP`uQC z8fi>8xG;1UWisPWnUtpOF->!m3s{QG&2}zSO8RAeiUgq;W=TrHjZi~5SxF`G%4C#^ O1k#$Ql+adHQZNAhs$D<; literal 0 HcmV?d00001 diff --git a/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx index 1d13e9a7b3..b6c0471f4b 100644 --- a/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx +++ b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx @@ -43,6 +43,9 @@ const DocxViewer: DocRendererElement = (props: DocumentViewerContainerProps) => return ( +
+
{file.value?.name}
+
{docxHtml && (
{/* {docHtmlStr} */} diff --git a/packages/pluggableWidgets/document-viewer-web/components/PDFViewer.tsx b/packages/pluggableWidgets/document-viewer-web/components/PDFViewer.tsx index 253fa4432f..e16208972a 100644 --- a/packages/pluggableWidgets/document-viewer-web/components/PDFViewer.tsx +++ b/packages/pluggableWidgets/document-viewer-web/components/PDFViewer.tsx @@ -33,13 +33,25 @@ const PDFViewer: DocRendererElement = (props: DocumentViewerContainerProps) => { return (
- - - Page {currentPage} of {numberOfPages} - - +
{file.value?.name}
+
+
+ + + {currentPage} / {numberOfPages} + + +
+
{pdfUrl && ( diff --git a/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.editorConfig.ts b/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.editorConfig.ts new file mode 100644 index 0000000000..b44b35564a --- /dev/null +++ b/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.editorConfig.ts @@ -0,0 +1,49 @@ +import { Properties } from "@mendix/pluggable-widgets-tools"; +import { + StructurePreviewProps, + structurePreviewPalette +} from "@mendix/widget-plugin-platform/preview/structure-preview-api"; +import { DocumentViewerPreviewProps } from "typings/DocumentViewerProps"; + +export function getProperties(_values: DocumentViewerPreviewProps, defaultProperties: Properties): Properties { + return defaultProperties; +} + +export function getPreview(_values: DocumentViewerPreviewProps, isDarkMode: boolean): StructurePreviewProps { + const palette = structurePreviewPalette[isDarkMode ? "dark" : "light"]; + return { + type: "Container", + children: [ + { + type: "RowLayout", + grow: 2, + columnSize: "grow", + borders: true, + borderWidth: 1, + borderRadius: 2, + backgroundColor: _values.readOnly ? palette.background.containerDisabled : palette.background.container, + children: [ + { + type: "Container", + grow: 1, + padding: 4, + children: [ + { + type: "Text", + content: getCustomCaption(_values), + fontColor: palette.text.data + } + ] + } + ], + padding: 8 + } + ], + backgroundColor: palette.background.container, + borderRadius: 8 + }; +} + +export function getCustomCaption(_values: DocumentViewerPreviewProps): string { + return `[${_values.file ?? "No attribute selected"}]`; +} diff --git a/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.editorPreview.tsx b/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.editorPreview.tsx new file mode 100644 index 0000000000..b83273bf78 --- /dev/null +++ b/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.editorPreview.tsx @@ -0,0 +1,12 @@ +import { createElement, ReactElement } from "react"; +import { DocumentViewerPreviewProps } from "typings/DocumentViewerProps"; +import "../ui/DocumentViewer.scss"; + +export const preview = (props: DocumentViewerPreviewProps): ReactElement => { + const { file } = props; + return ( +
+
{file ? `[${file}]` : "[No attribute selected]"}
+
+ ); +}; diff --git a/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.icon.dark.png b/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.icon.dark.png new file mode 100644 index 0000000000000000000000000000000000000000..77ef7d1017f04710816c888836bd7d483ace380c GIT binary patch literal 1735 zcmYLJ3pCqV9=?AGrCv$Br4-q=qNr-9ifW=NiC0jT(nqu<)D}G`={6>eS6`fv-h0ue&79m-@WJj&iS32?&V2T-LJnN z0H8`HIs3>MzXwGH*-z#)CG_W~q?BZT@>yFjJ@_FrEPfYfjR z|0Clm_$ELLL6<#IWQ3&fIg+$xMO;F5D!o5VNEp_YFK7NM_yr|PgX#&QI5s3(Ie8vM z1UEj~QlAv{>;<8`2 zzm-f+Pot`H*(sp(nJ|DE{0L(IATsY7?!l6Ky*IHVPkLQh1jPBDl-P=1DwmvJERjt0 zfkM3(LR$@3Jo_2R_S02V-bamy-~=7n^D+|)@TPF4b&{7Z2!YsMpdC1U1e&T&7+`uJ zr5AW|9J}`SngPv@B3a|Zz2OZ!qo?I7)&qfa)v|VUB2!-yW&-v3NDCzV& z)(gQai25I>(Q>yPymErF1RdVyFh#lm>Xo`v`skINMh%hb%?-jJrCUFt3}XL!DgMyL z(DwlvMmL3PVLHjhhqp5Wet8(KEi3>==Qc}($7Xv^tm(}&o;)itC z%Z?AK&6+eZ{}KJMj&A!odBI>Bx;Bq7VtuDfYdeJd(RXO`)5{2pM`Y}1D}#GK$0ASb zD)Ga|8{EzHRziapmSzUrXWbF*O<1T$_+ojKFW%<#MWxCurHH~(PU;W?q7SZS6KvKs z)8Z`y#$Xz{h(7H*(z{U>{Q@*a_&CUz?s$XkIC%AC^Ls|{pmzX#DB-fAFQzI`Q)!p6 zaXl}|-TX_Z$uf2y+io^zTzhuA&){p@68tf<(z8VlpLi-AK6wE3&;EFg0+1F{OnmUw)F3LaE}Qn8y6XLT&Wwa>J$|Oq zqFBFeGTSmqb=+mG)+$dQ6vyYxV7ot=B95Hyp25r8Vr%fLefJw4pLj2u80)V69E#<{mQG-<=9X^@vZfZ^$vXt|5}oI9xlHvv>`$aa5dAQMOW+@!ISw zAJ(E7*74gy7b2nnnsDTqdm$Ii{VrI7P%&im+kn&-*A~oa=d1}wTKTRQ7}OqPUNk^( zn{I0HGf`%&N0G`D7_)l*F8RwhFnpziHb!Fj_t0}HC&IXCMh0vxYhIuoP|wTL7_{eVtR^_i@ND#wua=F*id+LAqq-mL)vZZMeP}OF|Fi z(BR`3rgq0WjP-`AMVzQ_xzVgdZi{CuQ93d;IXQVX@QfeUBfD~rEY!25EC$Uu*>-gx zKC|i~?1!Vm_LmRam#=V3%1|cvh&#RftooGLPE^$s!*gJ$w$W|Z4c&h+cg11Ejx$Ax z%8eYS@s2s4-fksZECf~V@~dj z>dY|`pKy!s-#IYTv*Watm@2}d=f%Q0F+!;&XXIDzzmuqFZpSyiceM-UepoIlu|Dk2 zn81$5UYXv_ipxlu5u;ZmE9dO<-&9WI=DS2=YMiO*EtK?@U4>wFh3EFYx3Zrdkk5NM JS36OYe+S71^U?qS literal 0 HcmV?d00001 diff --git a/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.icon.png b/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d6b877ee42b67a81c5fb4db4a6acb7f85aa00ddd GIT binary patch literal 1734 zcmYL}dpr|r1IM4uTsDlUPKV_ZYwL1$+$Q5KM#H8ym*m=OLrbBV+l+ zrI6j_ByCAWNj_JejTn&w7Hmhe1E4NPbv-~)zBUM=xYGcL#{$4l0bo@g@h1R?F#%wb z34nDG06RItCvJ!28$6ab^)!tJ_RGBrfI)P?)(sH3Y#`{ry(45VQ21{S1t9G#fc@2> z%egg}a&4XY9~H_Vf3@XV8T9WqsZ8PjUfu?RO9GM{a1O;M3IJsLmLLTOkZ1rDo2XbW1|JCCoM$&nCXf;ZtKWWjeg}4U;f)y z?-`}8)yP&uX1A2Hk@{O2Orn^rXRBDiAE@>Bwhp=A`=;7upms#J8dZjFV&7ZMbv1>M zIgc=5LIAj7IaQOCK_Vn+b1u*ur*)7HzFxRVsYu~l=elY`Vs`)N4xJ>~kHb7@_IQP2i$kaSn<7L}~2gjVdY@y#a&ozqQzPRDlm-Pllh`W^ikbuYn@3EnaS?xoakKtvv zkyIj6$Z(usb`hJ|^B?T4vmUUswihdSt1Wz_@qJ>D)Q6@^DwHadqnjEyM(In&H^0YB z$zK85y%I)AiZKYd1*6Q?drgt-f3zY&JHJ@8O6tk~@eiLLSbM<2*Usp{@>dFvC)}Er zz9*ygzZ-J167sZLTAwdfKG!L%IwrcUX^=Mm^Qg?9!kipX_MhMolk`XW#FDmtm`$u^ zxyn%J6(YY5snB0s|C%X_HVd157KbwQ<{HHPG-2 z$+pcNi~eNNIDBJa-S@MwK*glB7*n*;3zJS4MRA$QqlZ@#loIsfk$&|}GPE@PTUT8h zMX&gPowFA+sha29-h^EfC#m^)T7Ny1EW5Ef0UapfS~xKDe_m2222Tg+Y;rH&#DBcp zgh{i>PD!#!!DGx0x9c@}5RAV&iAL!!v+$pbG}h;{?KVu6W=yP}P|P$XKX=MkL=mbsZge|hk34r}Vez`&Ps zr=N0MSpU4Qw)iyE=hx`%b`z1@8jM>*-{(Ykr^~sz8O3memZS4$3DDTs#kOEAo*AUD z?#ORu3(wuImv~8B4}BkX|Bj29kZ!(BvrbJ%f+gm|%o!GJl=316bvOO@d|&Rr_-G@% z{<4c;TGMPBiPcemIn=TvQHp_!6849tBpwl&j&&K%AWpD$(axRVc0{2_J2c@9sm<5T zUW44L*Nnfu3om;SSbh&~_3lG;I6gP~N#r(COm$#+TdH$D0_A$AgD7weNo+-gtIjD= z@3X5BHN0_{REy}Y9;#E7EGXP9s{J&ZqWZ?WE)qIhvF2$$baF>S*Y@2*s7mM6%CZmb zb1&fH!aFY?R2?7lz;$aqs}8S0IR3-FTF8&!m98)Nnj_EmzU>kGu>b1!vpx)3+aAuD z8bpXF%Zm=Q-|<3KIBZ@%3zJ@=%nK^nGm%VAKDPRe4H9=kV3`w-Xf5fB^WS%%dxRK^#@2XSeQIq}lgq$tN`ac&9w=xHiL<_i5BNNd3&ozT`W8Her>(Mh+zmx?0L@*vxi*~D2{*vn4a|M&h*Cu2~ zkbMdsBWjJV&|{*DTUXW%qc-OHgi{28WAZrk*S#A9oi}f;Fp=Yb$VhprMf?t$TZ3tQ zCuwt+@?pK$9D{ZANTc_GU6&JH1vD8(M?e$L_K!y?;~=Ns4rA9SWk-ZU${wsl@zk?( zn}(FNNXMtPgE_|k)()E!x>2T>4MC~u03@;i0ZvBz zu5C2g5edv*Nk<6)DxxS)ACeNwXdCsrIso9u0|3~U0B}sK!Y%`VrzildS_6P=G5|2R zrq>(D6B~SN?`zoU=l}vl9uB}jCg4vGf5x~4GXIxX1^EDyf7U|)5atNL{*BQk(m%(1(4K0j zC>i;H8x|IK=T&Qa<0(?#CWrm_T=D?7LPymUYU$qmvjKG`nsSW{w8r*7XZ$(KzK9&w5uRc3?5h!Y7)re*XqPH#}Qum<%D= zIVw>^0VUHE)N_#_2HRtgmO-eKTrFP{L`d6~DuA9vm7}qqJ(p1hX?J+nNTB35dYom!uv8l_B*xu2L&Go{!-G%Pp@Lk8J=!TR zqxi1P6*&Q*(NnNzjT~{`C7ZOJ1Qdc>U#Sd%tvcBvF)yB`72Bb4<}=kFM3LAVAIhze z(b%(_-2&`zwBVyldeo?bkxKwnkffm1PsXKB@pqmP1o4qB9vefbf-vI0wqI_;ZHk2n z;1otQm4Ld|vBp*m}1)m%cf#Hgb#5}V;wm}i6rPyVKW%KLa~65(9d zNxn*e*VucS?^xKnm;{_~%}i1g6^&(GBm+kuhN)_TsDhvCXzc3KZw?3yG?Yr5%JuVt z3?zUs@@B3sD*kbnI-+OfF9Y|=(|1xXd>fs!n{BKI_uUBJmKwUdB~qL96JPeUf=Lu{ zdN>yadoQao=;0R_D11{&st>h9^A!ZEfknV=?!rZGa_&5gSLtHv?#q*4#B~2r-ItqL zl%WB|&{p4O!+F;~x}JuKOeehsOre!gT2E3~G|kwiLD0RL#;BNqzSMh#*ExctCbtxu zQf_D&4&Y$jHS%yY$xo4}t%H|FVez4v+bKa$XSzNaFs4-96l~){Inblpog&1rjADzt zEq|q+*pcxsBpBIQT@=5+D1FsxW!%cydMGc9w4E0wsezrlA4Spe#7+baTA9=_m@45U z>GhRLz80fkq9I@F`pR;D=y7crNKH@A4#m-^ojWdxjKn8i=r(jrtS9-?x&-xZbty1i zAxux(V~_*iLn{!c{sfq5^fX>z^y6P z`vh(=46QE=EkoL$&1&cC``1^d!G3!M`UJZ5MyH-RZ~{Bpx5mdo)+$ z$ewvMH{U?{TqlZ?3f8R(z(ncXYKnN-38ni!iRBc7{+vy@V6A!973yL}}_Ip6P$vyiQ zguDBv51g6Cma1M(aD%5pCii*-P6?2V*p}4_%q4|ibReR(MJ|Q37vIfm{XmxD3Z>_oNrkR2YLDZCg`yDT{Mr0f0GNyFBrm#-IE zY{gSv4Le1v&LqUr%aJ=2tQxpS$DW8_RwCu?RwF8ub5TAiXzs8!gQfF|WJ=gAx?7C; zGLv%+1(I}oE7iH>zvz@aB8N$&@jhpJqOYgfkOfzXTSfdTmc=_O{n)HK$D7>lI&P=n zS(xqLsiZ4dOa)Qh;~*_5K>-PG>KpBzfC zXUpynSDLc9KbjO4++^TgiFzGYV69LIx!eZBj4+LjrK4FaVw{yKW$XEMNhVm<1jzfXS96>T&2{R4NX$K%A9; z6bJ*LA$Fq3W&c4cm;iD8`gI62fGoI76!9FDySLlp{aNaCDSa9#O$YuB(+(wL@PLi} z%4163k)epNvaGQ?r&ku?b;57TvDvnBZtXdM^N|jhdImDGhHN-6TG`iLk%5D4Z$lkp zJkIeP(U>Ue(`h<9pG=FVC?bz4B=t|FwO(16s2Nx`6F zuZS`JYfx9W5~QIr5gr0eR2cKe>OMb@$jHw>B}ehK)BfvVx04b`Sv;+v|08`sls1Dfj>n+TOB;F@KSDN+hZ=$OBI(aJG$BthMC5jZ@irTKa&D*CJvBtGse$szl zEswWUfY4aTIod;bTpi7CMfJI{mu<-&wLNquu^vdv`RIbiie%CGy~on)TiN^@g7uO$ z-xt!hy0ShlGWE-UVL%RYI%x*Lhw+x%-u`D?4E3UV&bxNgW6Ndco&e z^QR{-ZN+-~RQ*O*El7WMY`R@+{J9tOMvlV7u%sn&5$;b}CMmd^t~3=9?H8bJO@HK3 z=S<-pb=<(QycMS%m)@+_AYvs*bIyL-b0hq-Cw~4QR&TpAg`^*mH-%vN1?PdUoHO zxos>#e&;LVPU%=qezVbu(K0?iFsdG0->Z98*PF{3P@$?)o+MsAdgYxg{O@j#Zkw6UUiqiVUj^B#4 z`7MUNhe*-)L-d})FaD8k>1jz4649OCV`PUvDecoaH(0tiduHKuR3=~N@bg2Ui2`0& z2A*Z;G$)jjM9vXb$y0`BBnKatn_2c6(<0`%t;p1$YaH+3FAVr<68Juq}1Fd39fW?cTG}~yU!#6+9rRv`ZxwD!=XkfC4e`HQt_j`gks{5k6WMi8JjjoPgaRiM zH6clt{rkrIFZgMuxVht$UM@)Ju>iv7dEd~3 z5HxnQKHO%kHz5JmohSnKDH|;KvlU=#P1O4m!f$Fr&G-wsu2O2MTI1;fGpd6?G*;|p zad({^H?C-&nZ$U}P@ekH-dVk@t7GD%Yk)HMB2;jLp#e&U$Kykvx|V9hh2A&Ml!!*A z^)Box1XWJR&-K$<1s<$P^qlq+MV4KZ=IzjncpE_;^GbKe>IrB{;Ox1;v?)#%0*o<9tGRBzHXMT z*zEgV9o>A5&BAA=>SI44OO*E{dfi_5#+l9EbDWARg@`i?mZkToM@fp}-}}Z`$iQe% zXZQ2NS1GDcsdP{-^$UmF9cmrf1{bm)Sq}?q0@VHXIatFkehAkEQbq$Up#GmmDPV>-|jG0a$j*IYR(kg zyEBtY>31U$XqG+RD$*i(BK8LsbER{exsB0berln)+IQ^Ia{UbuMudR*)646ZoBoJej3bx%+vFHjq$la*;2*z%aZ&#)B@ z`01UiEh?LLp>N-oO87RZdIJO8G|f{L=hrava#UQsuyX7-CG~yq{PsK1^{Z}_oM?bD z@~%kCW3>^r!t(r%HQHAkR8UH_QI#f0RJ2Ryi3HpA zp(`-!!iTFI^jpKlYtJjLKil)kXl*pXzN2nJh|bchVgPz3QVtMTN%Y9#LnT*1h@Jz0 z%D?d;5%Bm>;!Q4;%WN7&bky!mhK{+_H$G@>yFp#eve#8bUnLHQ%D)Tk(`fo;iivMd zPNh8~U437KEHUZOS93HBiKP6kLX15|b3Vi-U&nrvvL_qXSkdRP^cC0_8Q&)XM_t&L z79=tVp(_=;%DUsBB`dxw4Pj0SE;d(T*6)pAsTsJmceP zH_fOA``@Z*I*QzDNvVQ z(;H=mz)`0(Qw<*0DJA<@G4r3hMCY!n5}(Kn%?&Q*u~qXx>HIM93jvFcl8lKk$9-ix4> z;x^^Azw2C)m|koS-UIeZ%f6U|Gn97iPnaXtD}!9Qw(sp|x|=90u;snn+7M)6hs3@m zYYpXeJ@O09j1Kpn&zv|}Eod?IS&%Unomf}dU~d1_dC|L5=+=va!wDegkd6u?Rjo#T z=7)R!(}h-2x-N1*WCTO{<$|V8Fs(H=K>zR5Sx#>D!Dzr<+n7x$EW)0r9;(KEVDe#e z=E3##irnd_e)YU`g{_Ag`YVP|VFb%5#TqTXN~Mp(r0(vLRkgY36mBn=Fv8JNdEzF=JipbGZp2&Y1z@FGds#ADLr$ z`8=aG1G%XcxhD3(78(h>HqmpUai3M8gS%>BPX;(W1#8+vLi*#!Vf#IQZyB-)ASn81?B_)+HqA`;1II}6HM-l6vd$4SnWdEc8 zF>|I<*1=0=uhRweC^stSxMPsDsn#fq{PgBqmrwC~y0O0vzE2%57_SNW{v5{d_Ciqk z{&1>QX*G@adli1Y6~V@-+(vf9mIjhSiSxKx z)UmTCPVks{Yma(pkMHYJ{yDzLf|uywOBc_k-+-%>;JA-e`MNkaY_h(Q!pGm261=la z1;eVUh0S?DDu~|oAiMJvIsG7{KLCdgpug12?-pmZ!pU7R$2L)uc%c~*dr~E>nB-cq zyEiz5Q>q43H^KCBR$S!V_>EY%h}6>{W+@roh|_AXi%8U}l;x-GhbxsrW0BRuwZyf& zLeRKf0yjBcYW*zA{~{o>%kVCm^~bw>ovc+a4~tiCh5a-2rQYdZyuK;)09Dtb;~EJ| z=f$!G9?ncjYMPl$>9^z~uY~}XZ4@&ogtQ{rbnCg3%_%JZ$s4Se4b*!DyLB@D+UjhY z944epphLN40?ns8J!vMz`){0sY-7&YDUhzS8`xbN0N;njZoo(7d5EXt*(NTa2177G z0pQ^5?_iWL+L{xA14w_mpj_fU`F{>N9v d|HAx{hd~MD?(AGiB4z+FY249ODOI)({y&V*3}FyTmd6-;%M!_&%tMwLd&xE}C|iWSWGq=`QprA1C~Jh2CHqzy zS}6M#k>yJnTeh*U@AO;Vf8Wphd_MO%=iYnHeeOB;Jm=hVA}!1exj2M5007`3;Poy5 z0E~$OG$b4IJ@@;a3lkt*bxd^tpfsLy*O8Uk2e0EVm;ykMGystA0l+qMh&&Adeu@Av z>i__nDF7gJE3NLl7IPxN*_Pm9Y6_fS;z$4i69)dQ@aG%auw(y=8^HboSpGE*2Y`qh z0OCJ1W=#0!abUJTJpYC)S+M_5Gsm*v|D}cjSuFp>0UDDUc>4ENGZUb0;q80@fcxX0 z274mQeGC8&j}i2AE(XAUUonjvHV`a!|H7g!$aS1fQm?+;G_F1|s*m6cgm zSWCH`T%-=X)Zs)h1`Wk|!>CYPY%0|qB;O;iRvw{}OOlq)DWJ*XB)k;|6?(N4r67U; zhk}>yv!gyXzrr8a0a(ja@mbL4xPlW%P}(Apz{b}SEtS~Kf}kFX%Qk|c9-gv!)pQrQ zaDQN|Ne8|^ByIc!0_?JX+g$-+orlU;|Av4|z)1cH9k{lgmAp1s!cpM3ySC6(if`_Wwb%3(p^!uwI>}1=UBs55_bT}t1 z1Y=sj!x(iW^dMaikK#i+<~^i>WTeQ$n^6GX!4gs4&I4}|T-5Dj>A*u%c@X2(AwCkKc$&TPU0}D;v>3~R+PqXfccLSo0019gDV?>XomGGbRr8A%hrbl8ZGN*14DgKauS=o-QJ1{=QX z0K?Tf&!qs=&4FEz{CgsP2nD0k*1f`4)?X#r`xf1J6~0WD%r(6tYo)x38~D2Vq~}U* ze{0!^cbncj?&b|uGww9(QvBkgY*9aXfJcB(kxQ6G9IP!l&UMq0kowKWUA$QEcUmN0E2CPiVEe**VGK>gnLII_q2| z3cqX|h#usCgJh{UjNY*${SUD@G6z48i))-c$@ijvcChwpi3;v=6-Qe1LpVha4GB4* zzMfMVs!p_!$ui^~sp|ZM@--&saeG@11*L>$eKqB%Zraprrgvrx?j`s|Eot(6KHa0j zLj+ovRHD+?SJd{f@84F*>2Zc*2r>Jre1-_5Qw)G~&=|jCmQc(eFZ#=hLb?`odthF@ z2?9M35YWn7GDNVR*%{tapI1Psf`Aa_qw*goqcr}K8@YLp$sDQT#!=!bQ{eR`FRTn| zQ7HB{M6kdeD+4}|dIE0CA;NMs^g?2}IAdqmdS!esbbE*=gip?vKE^eGTr$y7 zw8c-d8pO_ZS0f7$LCJu57$*Ty{QzJ(z|}_L{*<9l&|X&upWKuZeXKO6a-W{u)?&uT z<#DbAZSUJGkbMKq0zWE2R-kb}iIY{+Hx9^UgCmp_sih5;zVNJ=6b|V^=aSC&Fg^nNt9sqSf#!<6^WiqZfFN9t?1VfWu*(mA|Xw1~3U3P38ne2)r16s<+k1)6$ z27tHldG@g)w9WyD@uxb$g7mo$xP|30*P{}{?nnozarXcLRh2Uh-*PP3$W60*@ivq1 zIZI*gfn!^4EN*;Xq68s~;#56)c+1XG8eV}|ar8w)+Vd&T1dACF0u+QU)=B)2BTas_ z%1FZ%9>$_E5*tW3)uaBRl>OAM<1dhcMm;q|lTGS#PpoOt)rg{9)!dsb1&_q>AUxtF z5(z!7?GYk9V!ZdZF`N02pAS-2e^afvKyo2f(4zAcoyQ75-NU!w?gBrD6?wTPG{bC< z;z2##bzTHG92$v#|B4au};?uXhv{+0$cACtT5`ulPmDJ?^y1%-;^E7(4r3PE3Nr7>Osg zu8eQ5GY{#71Is{duq4c;0e#mm9oL4FfDHlnNfu4!2zbCTMMvd!-(nQXXFEU`em=>VGJd3h4A-2vG*eTWM_rI zP7Q&(&3scYl>eHW#nV{wA-C5X2`BubdQKq=lzA1Si7goVisScr%+|M~ORYT}^PBY% znPS{+vN3bV;9G!4S#|qd1)5=~2=Z|ANJXW1gRldgIQFC|k{L4BOlxv5Cq4 z^;*JD$i&ZZMl+W6N7laXh?(zEZsL*lM@N4r{tnP&tga9nbQu-`Ilt2DHzbQ1`#(DWVUNZRzbdhvrGE!oVEzDE$3yWLYYZJa)(S#3C(ICv@d8PzG) z6a;f}nlEFx>e4Ni%hL|@^=%sd`J_Lmx@IGgIyWKx{@Y}}W#A3a2Q$|v6)D3EySDPj z=|<6rgamI^JRiY`d+k|9Rjiw1qvb(kee*y=>(}Mq+qLfxs`i}2pY8E5gIdGqva+^y zjRHqBWYQ}2`!XRB>RI`8&w0{m_q0^RP&sFI=nZp^kk*KO)mDpdxv6rA@{+A-5lH}& zRyCV;i`enxFzSWWn20*xnRdp`LSm+9Z0guOQ?=44Rk??kSagydo*`|2Rfk_h%E;1*$%wK9 zZ1KaGdPjLRa%7B!OX|B zi$(7JO=up;F@N86Z6U;XDpWr+q}LbIb#J#aaC~2Q;3CxLiZ|CW6(TJA>fm3nbOs`_dq2|85v9k1= z_FTA%kRSR|NL0TP&S4HTXodxxYnOx(I>e`SEuEj6HU1rhmiMtUa=I!DMeW{~2FB8H zZzC`BQKxoyxp4K1ok7d4)w+8x#9b@lwyvlkfh54~MTmJ1nTUt?q-Ca)wZ{WHNo?-> znMMmc!*#a;dN`&B>4fHxGYcLyZx9f-zHjZ+plZxw$0zLgj@s@`t&>e1`PI|s|l5x!FRY2cCJesyOa3|Nj+}4XYuypA(tEcY77V}-MTE2`Dha!M*y$Z3+-vO}(|{7M$z; zTJhqq4AD-@ly9mvKLxu-46o<_+C(YCQ%7^$t27tl&aSJ>IQo0C)B!#699tBqgBRii z>1+>zAO~LN)k%MPTo~P=!Nk&z1q{!2gAScZI!&|cmqx9c79wZ zw!cvC0|I06*vs0_IDFG+2fs?^&K1v@jTZB7C@_3SJc77V%rhhMeww6yjA8v@g+BmkuBtawxYXc*pzy?l1wuPAmIQ z0u_g9ypE-~0zaNm*8S|8++ds6B1Kx2tfjYE!E)cnYJM{}!iKvGCO^K5Vea*`al^gr z{C}cf8suf*4e8!r&MK>aXN*q> zs~yN_+NUv8n75$*Q-O)bo7|e5?Ggc%_GS$hK`#Lq*7{i(~1X&6($nA#eMh z40e!gXZ@-6BX3G|c-+rYU}49@Q&`pZuu$cg1kd<@;3_ zL)%%e%wq-*l7TpZ+$>Y$cWUjYOk;b^?&lSceoZ5B!*i#Vt)Q>6|C-^kXWbs+ zF67gN;&1Wx#5**QFtjDj5-~8ic)kczlg0C#$@x|g?W>rcG79P)L z7rLA6W5lX+SVDUZs3uI?zHw)wO%RPF!iPlatt>sV8r!|E`pjK5mK0Oh?pIL^SNplS z<0V?rv#1m@Ms`)g;0mzJJT8UzktYW7?y7uj&4Yi?AkY2?GQH88{f%~PHeRjAjaN@3 zbM{&2Y^rwadeUe4fCk)2Y?f!1)PqH4GPu$FYw=%&n7Y2al;^dQ3xXm}PCiY`tta~` z%}RS0cI^vWs{uhyaI5^Acawch;Kq}I7w$i+1v!!&j+nvT=&3D}>b^~`cWHw_% zNnw;({Lmh?{?hW1+h7vl2^XYIV9u=SEx4=f`xV~K^an|562G_z9UIsqi^nT{!$p$g zcJE)iqZ5A#gOEt2}jp^ReGk7mhyI+0vj$8=v#wnFfvG>91;9V!X{;8n1sU!72cSn0WGG z1SwT~j@W%?(}g~KWF-8)J8!}2OWCD_uYsjAu5Ynb%#?uBo9FVXD21WW^gY8`b9y*Y zd0;xP_=5O*m)4FrGqcfrFTMEB9HIHQN0f)kX`-@k7=`>v2JjWsc;*JK3p(#7dR@YN z1?eDYaGZbz!w%8(k{?Nj8RzJMZ-n6qpAjGVX)TYrAIB+(*tK8Ab0HE8Ar90-8L|-W zpk7Tl+3SLRUgF!M=P_toaTp2U4USc(Pi z3?di{Lqnu>LsN)We_R(0co~6IB{+i!udtnw<`N;5A2!^TgOVJcD}Yo4T-lX *:not(:last-child) { + margin-right: var(--spacing-small); + } + } } diff --git a/packages/pluggableWidgets/document-viewer-web/ui/documentViewerIcons.scss b/packages/pluggableWidgets/document-viewer-web/ui/documentViewerIcons.scss new file mode 100644 index 0000000000..4b19b410b0 --- /dev/null +++ b/packages/pluggableWidgets/document-viewer-web/ui/documentViewerIcons.scss @@ -0,0 +1,38 @@ +@use "sass:map"; +@font-face { + font-family: "DocViewer"; + src: url("../assets/DocViewer.woff2") format("woff2"); +} + +$icons: ( + Download: "\e903", + Right: "\e906", + Left: "\e902", + ZoomIn: "\e901", + ZoomOut: "\e900", + FitToWidth: "\e904" +); + +.icons.btn { + background-color: transparent; +} + +div.widget-document-viewer { + &-controls { + .icons { + font-family: "DocViewer" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; + padding: var(--spacing-smallest) var(--spacing-small); + + @each $name, $code in $icons { + &.icon-#{$name}:before { + content: $code; + } + } + } + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ef8a3b07d9..3f5d937480 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6453,8 +6453,6 @@ packages: dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - duck@0.1.12: - resolution: {integrity: sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==} dup@1.0.0: resolution: {integrity: sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA==} @@ -13987,7 +13985,7 @@ snapshots: '@types/react-dom': 18.2.14 '@types/react-native': 0.72.8(react-native@0.75.3(@babel/core@7.21.0)(@babel/preset-env@7.26.9(@babel/core@7.21.0))(@types/react@18.2.36)(react@18.2.0)(typescript@5.1.6)) '@types/testing-library__jest-dom': 5.14.9 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.1.6))(eslint@9.24.0(jiti@2.4.2))(typescript@5.1.6) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.8.2))(eslint@7.32.0)(typescript@5.8.2) '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@5.8.2) ansi-colors: 4.1.1 babel-eslint: 10.1.0(eslint@7.32.0) @@ -14040,7 +14038,7 @@ snapshots: shelljs: 0.8.5 shx: 0.3.4 ts-jest: 29.2.6(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2)))(typescript@5.8.2) - ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.1.6) + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2) typescript: 5.8.2 xml2js: 0.6.2 zip-a-folder: 0.0.12 @@ -15692,25 +15690,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.1.6))(eslint@9.24.0(jiti@2.4.2))(typescript@5.1.6)': - dependencies: - '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@5.8.2) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@7.32.0)(typescript@5.8.2) - '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@5.8.2) - debug: 4.3.7 - eslint: 9.24.0(jiti@2.4.2) - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare-lite: 1.4.0 - semver: 7.7.1 - tsutils: 3.21.0(typescript@5.8.2) - optionalDependencies: - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -17098,7 +17077,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.1 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) copy-webpack-plugin@11.0.0(webpack@5.96.1): dependencies: @@ -17291,7 +17270,7 @@ snapshots: postcss-modules-values: 4.0.0(postcss@8.4.21) postcss-value-parser: 4.2.0 semver: 7.5.1 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) css-loader@6.7.3(webpack@5.96.1): dependencies: @@ -17779,9 +17758,6 @@ snapshots: call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 - duck@0.1.12: - dependencies: - underscore: 1.13.7 dup@1.0.0: {} @@ -18164,12 +18140,12 @@ snapshots: eslint: 9.23.0(jiti@2.4.2) globals: 15.15.0 - eslint-plugin-jest@24.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.1.6))(eslint@7.32.0)(typescript@5.8.2))(eslint@7.32.0)(typescript@5.8.2): + eslint-plugin-jest@24.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.8.2))(eslint@7.32.0)(typescript@5.8.2))(eslint@7.32.0)(typescript@5.8.2): dependencies: '@typescript-eslint/experimental-utils': 4.33.0(eslint@7.32.0)(typescript@5.8.2) eslint: 7.32.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.1.6))(eslint@9.24.0(jiti@2.4.2))(typescript@5.1.6) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.8.2))(eslint@7.32.0)(typescript@5.8.2) transitivePeerDependencies: - supports-color - typescript @@ -19847,7 +19823,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.14.0 - ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.1.6) + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -21653,7 +21629,7 @@ snapshots: yaml: 1.10.2 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.1.6) + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2) postcss-merge-longhand@5.1.7(postcss@8.4.31): dependencies: @@ -23113,7 +23089,7 @@ snapshots: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) optionalDependencies: sass: 1.58.3 @@ -23758,7 +23734,7 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) optionalDependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.15) @@ -23873,25 +23849,6 @@ snapshots: ts-custom-error@3.3.1: {} - ts-jest@29.2.6(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.21.0))(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2)))(typescript@5.8.2): - dependencies: - bs-logger: 0.2.6 - ejs: 3.1.10 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2)) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.7.1 - typescript: 5.8.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.26.10 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) - ts-jest@29.2.6(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.1.6)))(typescript@5.8.2): dependencies: bs-logger: 0.2.6 @@ -23937,7 +23894,7 @@ snapshots: micromatch: 4.0.5 semver: 7.5.1 typescript: 5.1.6 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) ts-loader@9.4.2(typescript@5.1.6)(webpack@5.96.1): dependencies: From e95a9a7816b883bcb5ab54875c8ec97c13f20aec Mon Sep 17 00:00:00 2001 From: gjulivan Date: Thu, 10 Apr 2025 10:18:20 +0200 Subject: [PATCH 7/8] fix: update rollup config --- .../components/DocxViewer.tsx | 1 - .../document-viewer-web/components/index.ts | 4 +- .../{rollup.config.js => rollup.config.mjs} | 0 .../src/DocumentViewer.editorPreview.tsx | 2 +- .../utils/mammoth.browser.d.ts | 88 +++++++++++++++++++ 5 files changed, 91 insertions(+), 4 deletions(-) rename packages/pluggableWidgets/document-viewer-web/{rollup.config.js => rollup.config.mjs} (100%) create mode 100644 packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.d.ts diff --git a/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx index b6c0471f4b..aee0c720de 100644 --- a/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx +++ b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx @@ -1,5 +1,4 @@ import { createElement, Fragment, useCallback, useEffect, useState } from "react"; -// @ts-ignore implicit any import mammoth from "../utils/mammoth.browser"; import { DocumentViewerContainerProps } from "../typings/DocumentViewerProps"; import { DocRendererElement } from "./documentRenderer"; diff --git a/packages/pluggableWidgets/document-viewer-web/components/index.ts b/packages/pluggableWidgets/document-viewer-web/components/index.ts index 8aa1d61991..de729ac8ba 100644 --- a/packages/pluggableWidgets/document-viewer-web/components/index.ts +++ b/packages/pluggableWidgets/document-viewer-web/components/index.ts @@ -1,4 +1,4 @@ -import Docxviewer from "./Docxviewer"; +import DocxViewer from "./DocxViewer"; import PDFViewer from "./PDFViewer"; -export const DocumentRenderers = [Docxviewer, PDFViewer]; +export const DocumentRenderers = [DocxViewer, PDFViewer]; diff --git a/packages/pluggableWidgets/document-viewer-web/rollup.config.js b/packages/pluggableWidgets/document-viewer-web/rollup.config.mjs similarity index 100% rename from packages/pluggableWidgets/document-viewer-web/rollup.config.js rename to packages/pluggableWidgets/document-viewer-web/rollup.config.mjs diff --git a/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.editorPreview.tsx b/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.editorPreview.tsx index b83273bf78..ed2e1579c3 100644 --- a/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.editorPreview.tsx +++ b/packages/pluggableWidgets/document-viewer-web/src/DocumentViewer.editorPreview.tsx @@ -1,6 +1,6 @@ import { createElement, ReactElement } from "react"; import { DocumentViewerPreviewProps } from "typings/DocumentViewerProps"; -import "../ui/DocumentViewer.scss"; +import "../ui/documentViewer.scss"; export const preview = (props: DocumentViewerPreviewProps): ReactElement => { const { file } = props; diff --git a/packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.d.ts b/packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.d.ts new file mode 100644 index 0000000000..1b9f3c0ce0 --- /dev/null +++ b/packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.d.ts @@ -0,0 +1,88 @@ +interface Mammoth { + convertToHtml: (input: Input, options?: Options) => Promise; + extractRawText: (input: Input) => Promise; + embedStyleMap: ( + input: Input, + styleMap: string + ) => Promise<{ + toArrayBuffer: () => ArrayBuffer; + toBuffer: () => Buffer; + }>; + images: Images; +} + +type Input = NodeJsInput | BrowserInput; + +type NodeJsInput = PathInput | BufferInput; + +interface PathInput { + path: string; +} + +interface BufferInput { + buffer: Buffer; +} + +type BrowserInput = ArrayBufferInput; + +interface ArrayBufferInput { + arrayBuffer: ArrayBuffer; +} + +interface Options { + styleMap?: string | Array; + includeEmbeddedStyleMap?: boolean; + includeDefaultStyleMap?: boolean; + convertImage?: ImageConverter; + ignoreEmptyParagraphs?: boolean; + idPrefix?: string; + transformDocument?: (element: any) => any; +} + +interface ImageConverter { + __mammothBrand: "ImageConverter"; +} + +interface Image { + contentType: string; + readAsArrayBuffer: () => Promise; + readAsBase64String: () => Promise; + readAsBuffer: () => Promise; + read: ImageRead; +} + +interface ImageRead { + (): Promise; + (encoding: string): Promise; +} + +interface ImageAttributes { + src: string; +} + +interface Images { + dataUri: ImageConverter; + imgElement: (f: (image: Image) => Promise) => ImageConverter; +} + +interface Result { + value: string; + messages: Array; +} + +type Message = Warning | Error; + +interface Warning { + type: "warning"; + message: string; +} + +interface Error { + type: "error"; + message: string; + error: unknown; +} + +declare const mammoth: Mammoth; + +export = mammoth; From 11048b523095e41a34192eb104cf9c4778e3e26e Mon Sep 17 00:00:00 2001 From: gjulivan Date: Thu, 10 Apr 2025 14:54:22 +0200 Subject: [PATCH 8/8] fix: remove local mammoth dependency --- .../components/DocxViewer.tsx | 2 +- .../document-viewer-web/package.json | 1 + .../utils/mammoth.browser.d.ts | 88 - .../utils/mammoth.browser.js | 30354 ---------------- pnpm-lock.yaml | 456 +- 5 files changed, 156 insertions(+), 30745 deletions(-) delete mode 100644 packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.d.ts delete mode 100644 packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.js diff --git a/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx index aee0c720de..a71341ed8b 100644 --- a/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx +++ b/packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx @@ -1,5 +1,5 @@ import { createElement, Fragment, useCallback, useEffect, useState } from "react"; -import mammoth from "../utils/mammoth.browser"; +import mammoth from "mammoth"; import { DocumentViewerContainerProps } from "../typings/DocumentViewerProps"; import { DocRendererElement } from "./documentRenderer"; diff --git a/packages/pluggableWidgets/document-viewer-web/package.json b/packages/pluggableWidgets/document-viewer-web/package.json index 831cbba7bc..2c2b9a4ebd 100644 --- a/packages/pluggableWidgets/document-viewer-web/package.json +++ b/packages/pluggableWidgets/document-viewer-web/package.json @@ -35,6 +35,7 @@ }, "dependencies": { "classnames": "^2.3.2", + "mammoth": "github:uicontent/mammoth", "pdfjs-dist": "^5.0.375", "react-pdf": "^9.2.1" }, diff --git a/packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.d.ts b/packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.d.ts deleted file mode 100644 index 1b9f3c0ce0..0000000000 --- a/packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.d.ts +++ /dev/null @@ -1,88 +0,0 @@ -interface Mammoth { - convertToHtml: (input: Input, options?: Options) => Promise; - extractRawText: (input: Input) => Promise; - embedStyleMap: ( - input: Input, - styleMap: string - ) => Promise<{ - toArrayBuffer: () => ArrayBuffer; - toBuffer: () => Buffer; - }>; - images: Images; -} - -type Input = NodeJsInput | BrowserInput; - -type NodeJsInput = PathInput | BufferInput; - -interface PathInput { - path: string; -} - -interface BufferInput { - buffer: Buffer; -} - -type BrowserInput = ArrayBufferInput; - -interface ArrayBufferInput { - arrayBuffer: ArrayBuffer; -} - -interface Options { - styleMap?: string | Array; - includeEmbeddedStyleMap?: boolean; - includeDefaultStyleMap?: boolean; - convertImage?: ImageConverter; - ignoreEmptyParagraphs?: boolean; - idPrefix?: string; - transformDocument?: (element: any) => any; -} - -interface ImageConverter { - __mammothBrand: "ImageConverter"; -} - -interface Image { - contentType: string; - readAsArrayBuffer: () => Promise; - readAsBase64String: () => Promise; - readAsBuffer: () => Promise; - read: ImageRead; -} - -interface ImageRead { - (): Promise; - (encoding: string): Promise; -} - -interface ImageAttributes { - src: string; -} - -interface Images { - dataUri: ImageConverter; - imgElement: (f: (image: Image) => Promise) => ImageConverter; -} - -interface Result { - value: string; - messages: Array; -} - -type Message = Warning | Error; - -interface Warning { - type: "warning"; - message: string; -} - -interface Error { - type: "error"; - message: string; - error: unknown; -} - -declare const mammoth: Mammoth; - -export = mammoth; diff --git a/packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.js b/packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.js deleted file mode 100644 index 9bec5a13a5..0000000000 --- a/packages/pluggableWidgets/document-viewer-web/utils/mammoth.browser.js +++ /dev/null @@ -1,30354 +0,0 @@ -// Module: @xmldom/xmldom@0.8.6 -// License: MIT -// -// Module: base64-js@1.5.1 -// License: MIT -// -// Module: buffer@4.9.1 -// License: MIT -// -// Module: dingbat-to-unicode@1.0.1 -// License: BSD-2-Clause -// -// Module: ieee754@1.1.8 -// License: BSD-3-Clause -// -// Module: isarray@1.0.0 -// License: MIT -// -// Module: jszip@3.7.1 -// License: (MIT OR GPL-3.0-or-later) -// -// Module: lop@0.4.2 -// License: BSD-2-Clause -// -// Module: mammoth@1.9.0 -// License: BSD-2-Clause -// -// Module: option@0.2.4 -// License: BSD-2-Clause -// -// Module: process@0.11.9 -// License: MIT -// -// Module: underscore@1.13.1 -// License: MIT -// -// Module: xmlbuilder@10.0.0 -// License: MIT -// -(function (f) { - if (typeof exports === "object" && typeof module !== "undefined") { - module.exports = f(); - } else if (typeof define === "function" && define.amd) { - define([], f); - } else { - var g; - if (typeof window !== "undefined") { - g = window; - } else if (typeof global !== "undefined") { - g = global; - } else if (typeof self !== "undefined") { - g = self; - } else { - g = this; - } - g.mammoth = f(); - } -})(function () { - var define, module, exports; - return (function e(t, n, r) { - function s(o, u) { - if (!n[o]) { - if (!t[o]) { - var a = typeof require == "function" && require; - if (!u && a) return a(o, !0); - if (i) return i(o, !0); - var f = new Error("Cannot find module '" + o + "'"); - throw ((f.code = "MODULE_NOT_FOUND"), f); - } - var l = (n[o] = { exports: {} }); - t[o][0].call( - l.exports, - function (e) { - var n = t[o][1][e]; - return s(n ? n : e); - }, - l, - l.exports, - e, - t, - n, - r - ); - } - return n[o].exports; - } - var i = typeof require == "function" && require; - for (var o = 0; o < r.length; o++) s(r[o]); - return s; - })( - { - 1: [ - function (require, module, exports) { - var promises = require("../../lib/promises"); - - exports.Files = Files; - - function Files() { - function read(uri) { - return promises.reject( - new Error( - "could not open external image: '" + - uri + - "'\ncannot open linked files from a web browser" - ) - ); - } - - return { - read: read - }; - } - }, - { "../../lib/promises": 23 } - ], - 2: [ - function (require, module, exports) { - var promises = require("../lib/promises"); - var zipfile = require("../lib/zipfile"); - - exports.openZip = openZip; - - function openZip(options) { - if (options.arrayBuffer) { - return promises.resolve(zipfile.openArrayBuffer(options.arrayBuffer)); - } else { - return promises.reject(new Error("Could not find file in options")); - } - } - }, - { "../lib/promises": 23, "../lib/zipfile": 40 } - ], - 3: [ - function (require, module, exports) { - var _ = require("underscore"); - - var promises = require("./promises"); - var documents = require("./documents"); - var htmlPaths = require("./styles/html-paths"); - var results = require("./results"); - var images = require("./images"); - var Html = require("./html"); - var writers = require("./writers"); - - exports.DocumentConverter = DocumentConverter; - - function DocumentConverter(options) { - return { - convertToHtml: function (element) { - var comments = _.indexBy( - element.type === documents.types.document ? element.comments : [], - "commentId" - ); - var conversion = new DocumentConversion(options, comments); - return conversion.convertToHtml(element); - } - }; - } - - function DocumentConversion(options, comments) { - var noteNumber = 1; - - var noteReferences = []; - - var referencedComments = []; - - options = _.extend({ ignoreEmptyParagraphs: true }, options); - var idPrefix = options.idPrefix === undefined ? "" : options.idPrefix; - var ignoreEmptyParagraphs = options.ignoreEmptyParagraphs; - - var defaultParagraphStyle = htmlPaths.topLevelElement("p"); - - var styleMap = options.styleMap || []; - - function convertToHtml(document) { - var messages = []; - - var html = elementToHtml(document, messages, {}); - - var deferredNodes = []; - walkHtml(html, function (node) { - if (node.type === "deferred") { - deferredNodes.push(node); - } - }); - var deferredValues = {}; - return promises - .mapSeries(deferredNodes, function (deferred) { - return deferred.value().then(function (value) { - deferredValues[deferred.id] = value; - }); - }) - .then(function () { - function replaceDeferred(nodes) { - return flatMap(nodes, function (node) { - if (node.type === "deferred") { - return deferredValues[node.id]; - } else if (node.children) { - return [ - _.extend({}, node, { - children: replaceDeferred(node.children) - }) - ]; - } else { - return [node]; - } - }); - } - var writer = writers.writer({ - prettyPrint: options.prettyPrint, - outputFormat: options.outputFormat - }); - Html.write(writer, Html.simplify(replaceDeferred(html))); - return new results.Result(writer.asString(), messages); - }); - } - - function convertElements(elements, messages, options) { - return flatMap(elements, function (element) { - return elementToHtml(element, messages, options); - }); - } - - function elementToHtml(element, messages, options) { - if (!options) { - throw new Error("options not set"); - } - var handler = elementConverters[element.type]; - if (handler) { - return handler(element, messages, options); - } else { - return []; - } - } - - function convertParagraph(element, messages, options) { - return htmlPathForParagraph(element, messages).wrap(function () { - var content = convertElements(element.children, messages, options); - if (ignoreEmptyParagraphs) { - return content; - } else { - return [Html.forceWrite].concat(content); - } - }); - } - - function htmlPathForParagraph(element, messages) { - var style = findStyle(element); - - if (style) { - return style.to; - } else { - if (element.styleId) { - messages.push(unrecognisedStyleWarning("paragraph", element)); - } - return defaultParagraphStyle; - } - } - - function convertRun(run, messages, options) { - var nodes = function () { - return convertElements(run.children, messages, options); - }; - var paths = []; - if (run.highlight !== null) { - var path = findHtmlPath({ type: "highlight", color: run.highlight }); - if (path) { - paths.push(path); - } - } - if (run.isSmallCaps) { - paths.push(findHtmlPathForRunProperty("smallCaps")); - } - if (run.isAllCaps) { - paths.push(findHtmlPathForRunProperty("allCaps")); - } - if (run.isStrikethrough) { - paths.push(findHtmlPathForRunProperty("strikethrough", "s")); - } - if (run.isUnderline) { - paths.push(findHtmlPathForRunProperty("underline")); - } - if (run.verticalAlignment === documents.verticalAlignment.subscript) { - paths.push(htmlPaths.element("sub", {}, { fresh: false })); - } - if (run.verticalAlignment === documents.verticalAlignment.superscript) { - paths.push(htmlPaths.element("sup", {}, { fresh: false })); - } - if (run.isItalic) { - paths.push(findHtmlPathForRunProperty("italic", "em")); - } - if (run.isBold) { - paths.push(findHtmlPathForRunProperty("bold", "strong")); - } - var stylePath = htmlPaths.empty; - var style = findStyle(run); - if (style) { - stylePath = style.to; - } else if (run.styleId) { - messages.push(unrecognisedStyleWarning("run", run)); - } - paths.push(stylePath); - - paths.forEach(function (path) { - nodes = path.wrap.bind(path, nodes); - }); - - return nodes(); - } - - function findHtmlPathForRunProperty(elementType, defaultTagName) { - var path = findHtmlPath({ type: elementType }); - if (path) { - return path; - } else if (defaultTagName) { - return htmlPaths.element(defaultTagName, {}, { fresh: false }); - } else { - return htmlPaths.empty; - } - } - - function findHtmlPath(element, defaultPath) { - var style = findStyle(element); - return style ? style.to : defaultPath; - } - - function findStyle(element) { - for (var i = 0; i < styleMap.length; i++) { - if (styleMap[i].from.matches(element)) { - return styleMap[i]; - } - } - } - - function recoveringConvertImage(convertImage) { - return function (image, messages) { - return promises - .attempt(function () { - return convertImage(image, messages); - }) - .caught(function (error) { - messages.push(results.error(error)); - return []; - }); - }; - } - - function noteHtmlId(note) { - return referentHtmlId(note.noteType, note.noteId); - } - - function noteRefHtmlId(note) { - return referenceHtmlId(note.noteType, note.noteId); - } - - function referentHtmlId(referenceType, referenceId) { - return htmlId(referenceType + "-" + referenceId); - } - - function referenceHtmlId(referenceType, referenceId) { - return htmlId(referenceType + "-ref-" + referenceId); - } - - function htmlId(suffix) { - return idPrefix + suffix; - } - - var defaultTablePath = htmlPaths.elements([htmlPaths.element("table", {}, { fresh: true })]); - - function convertTable(element, messages, options) { - return findHtmlPath(element, defaultTablePath).wrap(function () { - return convertTableChildren(element, messages, options); - }); - } - - function convertTableChildren(element, messages, options) { - var bodyIndex = _.findIndex(element.children, function (child) { - return !child.type === documents.types.tableRow || !child.isHeader; - }); - if (bodyIndex === -1) { - bodyIndex = element.children.length; - } - var children; - if (bodyIndex === 0) { - children = convertElements( - element.children, - messages, - _.extend({}, options, { isTableHeader: false }) - ); - } else { - var headRows = convertElements( - element.children.slice(0, bodyIndex), - messages, - _.extend({}, options, { isTableHeader: true }) - ); - var bodyRows = convertElements( - element.children.slice(bodyIndex), - messages, - _.extend({}, options, { isTableHeader: false }) - ); - children = [ - Html.freshElement("thead", {}, headRows), - Html.freshElement("tbody", {}, bodyRows) - ]; - } - return [Html.forceWrite].concat(children); - } - - function convertTableRow(element, messages, options) { - var children = convertElements(element.children, messages, options); - return [Html.freshElement("tr", {}, [Html.forceWrite].concat(children))]; - } - - function convertTableCell(element, messages, options) { - var tagName = options.isTableHeader ? "th" : "td"; - var children = convertElements(element.children, messages, options); - var attributes = {}; - if (element.colSpan !== 1) { - attributes.colspan = element.colSpan.toString(); - } - if (element.rowSpan !== 1) { - attributes.rowspan = element.rowSpan.toString(); - } - - return [Html.freshElement(tagName, attributes, [Html.forceWrite].concat(children))]; - } - - function convertCommentReference(reference, messages, options) { - return findHtmlPath(reference, htmlPaths.ignore).wrap(function () { - var comment = comments[reference.commentId]; - var count = referencedComments.length + 1; - var label = "[" + commentAuthorLabel(comment) + count + "]"; - referencedComments.push({ label: label, comment: comment }); - // TODO: remove duplication with note references - return [ - Html.freshElement( - "a", - { - href: "#" + referentHtmlId("comment", reference.commentId), - id: referenceHtmlId("comment", reference.commentId) - }, - [Html.text(label)] - ) - ]; - }); - } - - function convertComment(referencedComment, messages, options) { - // TODO: remove duplication with note references - - var label = referencedComment.label; - var comment = referencedComment.comment; - var body = convertElements(comment.body, messages, options).concat([ - Html.nonFreshElement("p", {}, [ - Html.text(" "), - Html.freshElement( - "a", - { href: "#" + referenceHtmlId("comment", comment.commentId) }, - [Html.text("↑")] - ) - ]) - ]); - - return [ - Html.freshElement("dt", { id: referentHtmlId("comment", comment.commentId) }, [ - Html.text("Comment " + label) - ]), - Html.freshElement("dd", {}, body) - ]; - } - - function convertBreak(element, messages, options) { - return htmlPathForBreak(element).wrap(function () { - return []; - }); - } - - function htmlPathForBreak(element) { - var style = findStyle(element); - if (style) { - return style.to; - } else if (element.breakType === "line") { - return htmlPaths.topLevelElement("br"); - } else { - return htmlPaths.empty; - } - } - - var elementConverters = { - document: function (document, messages, options) { - var children = convertElements(document.children, messages, options); - var notes = noteReferences.map(function (noteReference) { - return document.notes.resolve(noteReference); - }); - var notesNodes = convertElements(notes, messages, options); - return children.concat([ - Html.freshElement("ol", {}, notesNodes), - Html.freshElement( - "dl", - {}, - flatMap(referencedComments, function (referencedComment) { - return convertComment(referencedComment, messages, options); - }) - ) - ]); - }, - paragraph: convertParagraph, - run: convertRun, - text: function (element, messages, options) { - return [Html.text(element.value)]; - }, - tab: function (element, messages, options) { - return [Html.text("\t")]; - }, - hyperlink: function (element, messages, options) { - var href = element.anchor ? "#" + htmlId(element.anchor) : element.href; - var attributes = { href: href }; - if (element.targetFrame != null) { - attributes.target = element.targetFrame; - } - - var children = convertElements(element.children, messages, options); - return [Html.nonFreshElement("a", attributes, children)]; - }, - checkbox: function (element) { - var attributes = { type: "checkbox" }; - if (element.checked) { - attributes["checked"] = "checked"; - } - return [Html.freshElement("input", attributes)]; - }, - bookmarkStart: function (element, messages, options) { - var anchor = Html.freshElement( - "a", - { - id: htmlId(element.name) - }, - [Html.forceWrite] - ); - return [anchor]; - }, - noteReference: function (element, messages, options) { - noteReferences.push(element); - var anchor = Html.freshElement( - "a", - { - href: "#" + noteHtmlId(element), - id: noteRefHtmlId(element) - }, - [Html.text("[" + noteNumber++ + "]")] - ); - - return [Html.freshElement("sup", {}, [anchor])]; - }, - note: function (element, messages, options) { - var children = convertElements(element.body, messages, options); - var backLink = Html.elementWithTag(htmlPaths.element("p", {}, { fresh: false }), [ - Html.text(" "), - Html.freshElement("a", { href: "#" + noteRefHtmlId(element) }, [Html.text("↑")]) - ]); - var body = children.concat([backLink]); - - return Html.freshElement("li", { id: noteHtmlId(element) }, body); - }, - commentReference: convertCommentReference, - comment: convertComment, - image: deferredConversion(recoveringConvertImage(options.convertImage || images.dataUri)), - table: convertTable, - tableRow: convertTableRow, - tableCell: convertTableCell, - break: convertBreak - }; - return { - convertToHtml: convertToHtml - }; - } - - var deferredId = 1; - - function deferredConversion(func) { - return function (element, messages, options) { - return [ - { - type: "deferred", - id: deferredId++, - value: function () { - return func(element, messages, options); - } - } - ]; - }; - } - - function unrecognisedStyleWarning(type, element) { - return results.warning( - "Unrecognised " + - type + - " style: '" + - element.styleName + - "'" + - " (Style ID: " + - element.styleId + - ")" - ); - } - - function flatMap(values, func) { - return _.flatten(values.map(func), true); - } - - function walkHtml(nodes, callback) { - nodes.forEach(function (node) { - callback(node); - if (node.children) { - walkHtml(node.children, callback); - } - }); - } - - var commentAuthorLabel = (exports.commentAuthorLabel = function commentAuthorLabel(comment) { - return comment.authorInitials || ""; - }); - }, - { - "./documents": 4, - "./html": 18, - "./images": 20, - "./promises": 23, - "./results": 25, - "./styles/html-paths": 28, - "./writers": 33, - underscore: 67 - } - ], - 4: [ - function (require, module, exports) { - (function (Buffer) { - var _ = require("underscore"); - - var types = (exports.types = { - document: "document", - paragraph: "paragraph", - run: "run", - text: "text", - tab: "tab", - checkbox: "checkbox", - hyperlink: "hyperlink", - noteReference: "noteReference", - image: "image", - note: "note", - commentReference: "commentReference", - comment: "comment", - table: "table", - tableRow: "tableRow", - tableCell: "tableCell", - break: "break", - bookmarkStart: "bookmarkStart" - }); - - function Document(children, options) { - options = options || {}; - return { - type: types.document, - children: children, - notes: options.notes || new Notes({}), - comments: options.comments || [] - }; - } - - function Paragraph(children, properties) { - properties = properties || {}; - var indent = properties.indent || {}; - return { - type: types.paragraph, - children: children, - styleId: properties.styleId || null, - styleName: properties.styleName || null, - numbering: properties.numbering || null, - alignment: properties.alignment || null, - indent: { - start: indent.start || null, - end: indent.end || null, - firstLine: indent.firstLine || null, - hanging: indent.hanging || null - } - }; - } - - function Run(children, properties) { - properties = properties || {}; - return { - type: types.run, - children: children, - styleId: properties.styleId || null, - styleName: properties.styleName || null, - isBold: !!properties.isBold, - isUnderline: !!properties.isUnderline, - isItalic: !!properties.isItalic, - isStrikethrough: !!properties.isStrikethrough, - isAllCaps: !!properties.isAllCaps, - isSmallCaps: !!properties.isSmallCaps, - verticalAlignment: properties.verticalAlignment || verticalAlignment.baseline, - font: properties.font || null, - fontSize: properties.fontSize || null, - highlight: properties.highlight || null - }; - } - - var verticalAlignment = { - baseline: "baseline", - superscript: "superscript", - subscript: "subscript" - }; - - function Text(value) { - return { - type: types.text, - value: value - }; - } - - function Tab() { - return { - type: types.tab - }; - } - - function Checkbox(options) { - return { - type: types.checkbox, - checked: options.checked - }; - } - - function Hyperlink(children, options) { - return { - type: types.hyperlink, - children: children, - href: options.href, - anchor: options.anchor, - targetFrame: options.targetFrame - }; - } - - function NoteReference(options) { - return { - type: types.noteReference, - noteType: options.noteType, - noteId: options.noteId - }; - } - - function Notes(notes) { - this._notes = _.indexBy(notes, function (note) { - return noteKey(note.noteType, note.noteId); - }); - } - - Notes.prototype.resolve = function (reference) { - return this.findNoteByKey(noteKey(reference.noteType, reference.noteId)); - }; - - Notes.prototype.findNoteByKey = function (key) { - return this._notes[key] || null; - }; - - function Note(options) { - return { - type: types.note, - noteType: options.noteType, - noteId: options.noteId, - body: options.body - }; - } - - function commentReference(options) { - return { - type: types.commentReference, - commentId: options.commentId - }; - } - - function comment(options) { - return { - type: types.comment, - commentId: options.commentId, - body: options.body, - authorName: options.authorName, - authorInitials: options.authorInitials - }; - } - - function noteKey(noteType, id) { - return noteType + "-" + id; - } - - function Image(options) { - return { - type: types.image, - // `read` is retained for backwards compatibility, but other read - // methods should be preferred. - read: function (encoding) { - if (encoding) { - return options.readImage(encoding); - } else { - return options.readImage().then(function (arrayBuffer) { - return Buffer.from(arrayBuffer); - }); - } - }, - readAsArrayBuffer: function () { - return options.readImage(); - }, - readAsBase64String: function () { - return options.readImage("base64"); - }, - readAsBuffer: function () { - return options.readImage().then(function (arrayBuffer) { - return Buffer.from(arrayBuffer); - }); - }, - altText: options.altText, - contentType: options.contentType - }; - } - - function Table(children, properties) { - properties = properties || {}; - return { - type: types.table, - children: children, - styleId: properties.styleId || null, - styleName: properties.styleName || null - }; - } - - function TableRow(children, options) { - options = options || {}; - return { - type: types.tableRow, - children: children, - isHeader: options.isHeader || false - }; - } - - function TableCell(children, options) { - options = options || {}; - return { - type: types.tableCell, - children: children, - colSpan: options.colSpan == null ? 1 : options.colSpan, - rowSpan: options.rowSpan == null ? 1 : options.rowSpan - }; - } - - function Break(breakType) { - return { - type: types["break"], - breakType: breakType - }; - } - - function BookmarkStart(options) { - return { - type: types.bookmarkStart, - name: options.name - }; - } - - exports.document = exports.Document = Document; - exports.paragraph = exports.Paragraph = Paragraph; - exports.run = exports.Run = Run; - exports.text = exports.Text = Text; - exports.tab = exports.Tab = Tab; - exports.checkbox = exports.Checkbox = Checkbox; - exports.Hyperlink = Hyperlink; - exports.noteReference = exports.NoteReference = NoteReference; - exports.Notes = Notes; - exports.Note = Note; - exports.commentReference = commentReference; - exports.comment = comment; - exports.Image = Image; - exports.Table = Table; - exports.TableRow = TableRow; - exports.TableCell = TableCell; - exports.lineBreak = Break("line"); - exports.pageBreak = Break("page"); - exports.columnBreak = Break("column"); - exports.BookmarkStart = BookmarkStart; - - exports.verticalAlignment = verticalAlignment; - }).call(this, require("buffer").Buffer); - }, - { buffer: 48, underscore: 67 } - ], - 5: [ - function (require, module, exports) { - exports.createBodyReader = createBodyReader; - exports._readNumberingProperties = readNumberingProperties; - - var dingbatToUnicode = require("dingbat-to-unicode"); - var _ = require("underscore"); - - var documents = require("../documents"); - var Result = require("../results").Result; - var warning = require("../results").warning; - var xml = require("../xml"); - var uris = require("./uris"); - - function createBodyReader(options) { - return { - readXmlElement: function (element) { - return new BodyReader(options).readXmlElement(element); - }, - readXmlElements: function (elements) { - return new BodyReader(options).readXmlElements(elements); - } - }; - } - - function BodyReader(options) { - var complexFieldStack = []; - var currentInstrText = []; - - // When a paragraph is marked as deleted, its contents should be combined - // with the following paragraph. See 17.13.5.15 del (Deleted Paragraph) of - // ECMA-376 4th edition Part 1. - var deletedParagraphContents = []; - - var relationships = options.relationships; - var contentTypes = options.contentTypes; - var docxFile = options.docxFile; - var files = options.files; - var numbering = options.numbering; - var styles = options.styles; - - function readXmlElements(elements) { - var results = elements.map(readXmlElement); - return combineResults(results); - } - - function readXmlElement(element) { - if (element.type === "element") { - var handler = xmlElementReaders[element.name]; - if (handler) { - return handler(element); - } else if (!Object.prototype.hasOwnProperty.call(ignoreElements, element.name)) { - var message = warning("An unrecognised element was ignored: " + element.name); - return emptyResultWithMessages([message]); - } - } - return emptyResult(); - } - - function readParagraphProperties(element) { - return readParagraphStyle(element).map(function (style) { - return { - type: "paragraphProperties", - styleId: style.styleId, - styleName: style.name, - alignment: element.firstOrEmpty("w:jc").attributes["w:val"], - numbering: readNumberingProperties( - style.styleId, - element.firstOrEmpty("w:numPr"), - numbering - ), - indent: readParagraphIndent(element.firstOrEmpty("w:ind")) - }; - }); - } - - function readParagraphIndent(element) { - return { - start: element.attributes["w:start"] || element.attributes["w:left"], - end: element.attributes["w:end"] || element.attributes["w:right"], - firstLine: element.attributes["w:firstLine"], - hanging: element.attributes["w:hanging"] - }; - } - - function readRunProperties(element) { - return readRunStyle(element).map(function (style) { - var fontSizeString = element.firstOrEmpty("w:sz").attributes["w:val"]; - // w:sz gives the font size in half points, so halve the value to get the size in points - var fontSize = /^[0-9]+$/.test(fontSizeString) - ? parseInt(fontSizeString, 10) / 2 - : null; - - return { - type: "runProperties", - styleId: style.styleId, - styleName: style.name, - verticalAlignment: element.firstOrEmpty("w:vertAlign").attributes["w:val"], - font: element.firstOrEmpty("w:rFonts").attributes["w:ascii"], - fontSize: fontSize, - isBold: readBooleanElement(element.first("w:b")), - isUnderline: readUnderline(element.first("w:u")), - isItalic: readBooleanElement(element.first("w:i")), - isStrikethrough: readBooleanElement(element.first("w:strike")), - isAllCaps: readBooleanElement(element.first("w:caps")), - isSmallCaps: readBooleanElement(element.first("w:smallCaps")), - highlight: readHighlightValue( - element.firstOrEmpty("w:highlight").attributes["w:val"] - ) - }; - }); - } - - function readUnderline(element) { - if (element) { - var value = element.attributes["w:val"]; - return value !== undefined && value !== "false" && value !== "0" && value !== "none"; - } else { - return false; - } - } - - function readBooleanElement(element) { - if (element) { - var value = element.attributes["w:val"]; - return value !== "false" && value !== "0"; - } else { - return false; - } - } - - function readBooleanAttributeValue(value) { - return value !== "false" && value !== "0"; - } - - function readHighlightValue(value) { - if (!value || value === "none") { - return null; - } else { - return value; - } - } - - function readParagraphStyle(element) { - return readStyle(element, "w:pStyle", "Paragraph", styles.findParagraphStyleById); - } - - function readRunStyle(element) { - return readStyle(element, "w:rStyle", "Run", styles.findCharacterStyleById); - } - - function readTableStyle(element) { - return readStyle(element, "w:tblStyle", "Table", styles.findTableStyleById); - } - - function readStyle(element, styleTagName, styleType, findStyleById) { - var messages = []; - var styleElement = element.first(styleTagName); - var styleId = null; - var name = null; - if (styleElement) { - styleId = styleElement.attributes["w:val"]; - if (styleId) { - var style = findStyleById(styleId); - if (style) { - name = style.name; - } else { - messages.push(undefinedStyleWarning(styleType, styleId)); - } - } - } - return elementResultWithMessages({ styleId: styleId, name: name }, messages); - } - - function readFldChar(element) { - var type = element.attributes["w:fldCharType"]; - if (type === "begin") { - complexFieldStack.push({ type: "begin", fldChar: element }); - currentInstrText = []; - } else if (type === "end") { - var complexFieldEnd = complexFieldStack.pop(); - if (complexFieldEnd.type === "begin") { - complexFieldEnd = parseCurrentInstrText(complexFieldEnd); - } - if (complexFieldEnd.type === "checkbox") { - return elementResult( - documents.checkbox({ - checked: complexFieldEnd.checked - }) - ); - } - } else if (type === "separate") { - var complexFieldSeparate = complexFieldStack.pop(); - var complexField = parseCurrentInstrText(complexFieldSeparate); - complexFieldStack.push(complexField); - } - return emptyResult(); - } - - function currentHyperlinkOptions() { - var topHyperlink = _.last( - complexFieldStack.filter(function (complexField) { - return complexField.type === "hyperlink"; - }) - ); - return topHyperlink ? topHyperlink.options : null; - } - - function parseCurrentInstrText(complexField) { - return parseInstrText( - currentInstrText.join(""), - complexField.type === "begin" ? complexField.fldChar : xml.emptyElement - ); - } - - function parseInstrText(instrText, fldChar) { - var externalLinkResult = /\s*HYPERLINK "(.*)"/.exec(instrText); - if (externalLinkResult) { - return { type: "hyperlink", options: { href: externalLinkResult[1] } }; - } - - var internalLinkResult = /\s*HYPERLINK\s+\\l\s+"(.*)"/.exec(instrText); - if (internalLinkResult) { - return { type: "hyperlink", options: { anchor: internalLinkResult[1] } }; - } - - var checkboxResult = /\s*FORMCHECKBOX\s*/.exec(instrText); - if (checkboxResult) { - var checkboxElement = fldChar.firstOrEmpty("w:ffData").firstOrEmpty("w:checkBox"); - var checkedElement = checkboxElement.first("w:checked"); - var checked = - checkedElement == null - ? readBooleanElement(checkboxElement.first("w:default")) - : readBooleanElement(checkedElement); - return { type: "checkbox", checked: checked }; - } - - return { type: "unknown" }; - } - - function readInstrText(element) { - currentInstrText.push(element.text()); - return emptyResult(); - } - - function readSymbol(element) { - // See 17.3.3.30 sym (Symbol Character) of ECMA-376 4th edition Part 1 - var font = element.attributes["w:font"]; - var char = element.attributes["w:char"]; - var unicodeCharacter = dingbatToUnicode.hex(font, char); - if (unicodeCharacter == null && /^F0..$/.test(char)) { - unicodeCharacter = dingbatToUnicode.hex(font, char.substring(2)); - } - - if (unicodeCharacter == null) { - return emptyResultWithMessages([ - warning( - "A w:sym element with an unsupported character was ignored: char " + - char + - " in font " + - font - ) - ]); - } else { - return elementResult(new documents.Text(unicodeCharacter.string)); - } - } - - function noteReferenceReader(noteType) { - return function (element) { - var noteId = element.attributes["w:id"]; - return elementResult( - new documents.NoteReference({ - noteType: noteType, - noteId: noteId - }) - ); - }; - } - - function readCommentReference(element) { - return elementResult( - documents.commentReference({ - commentId: element.attributes["w:id"] - }) - ); - } - - function readChildElements(element) { - return readXmlElements(element.children); - } - - var xmlElementReaders = { - "w:p": function (element) { - var paragraphPropertiesElement = element.firstOrEmpty("w:pPr"); - - var isDeleted = !!paragraphPropertiesElement.firstOrEmpty("w:rPr").first("w:del"); - - if (isDeleted) { - element.children.forEach(function (child) { - deletedParagraphContents.push(child); - }); - return emptyResult(); - } else { - var childrenXml = element.children; - if (deletedParagraphContents.length > 0) { - childrenXml = deletedParagraphContents.concat(childrenXml); - deletedParagraphContents = []; - } - return ReadResult.map( - readParagraphProperties(paragraphPropertiesElement), - readXmlElements(childrenXml), - function (properties, children) { - return new documents.Paragraph(children, properties); - } - ).insertExtra(); - } - }, - "w:r": function (element) { - return ReadResult.map( - readRunProperties(element.firstOrEmpty("w:rPr")), - readXmlElements(element.children), - function (properties, children) { - var hyperlinkOptions = currentHyperlinkOptions(); - if (hyperlinkOptions !== null) { - children = [new documents.Hyperlink(children, hyperlinkOptions)]; - } - - return new documents.Run(children, properties); - } - ); - }, - "w:fldChar": readFldChar, - "w:instrText": readInstrText, - "w:t": function (element) { - return elementResult(new documents.Text(element.text())); - }, - "w:tab": function (element) { - return elementResult(new documents.Tab()); - }, - "w:noBreakHyphen": function () { - return elementResult(new documents.Text("\u2011")); - }, - "w:softHyphen": function (element) { - return elementResult(new documents.Text("\u00AD")); - }, - "w:sym": readSymbol, - "w:hyperlink": function (element) { - var relationshipId = element.attributes["r:id"]; - var anchor = element.attributes["w:anchor"]; - return readXmlElements(element.children).map(function (children) { - function create(options) { - var targetFrame = element.attributes["w:tgtFrame"] || null; - - return new documents.Hyperlink( - children, - _.extend({ targetFrame: targetFrame }, options) - ); - } - - if (relationshipId) { - var href = relationships.findTargetByRelationshipId(relationshipId); - if (anchor) { - href = uris.replaceFragment(href, anchor); - } - return create({ href: href }); - } else if (anchor) { - return create({ anchor: anchor }); - } else { - return children; - } - }); - }, - "w:tbl": readTable, - "w:tr": readTableRow, - "w:tc": readTableCell, - "w:footnoteReference": noteReferenceReader("footnote"), - "w:endnoteReference": noteReferenceReader("endnote"), - "w:commentReference": readCommentReference, - "w:br": function (element) { - var breakType = element.attributes["w:type"]; - if (breakType == null || breakType === "textWrapping") { - return elementResult(documents.lineBreak); - } else if (breakType === "page") { - return elementResult(documents.pageBreak); - } else if (breakType === "column") { - return elementResult(documents.columnBreak); - } else { - return emptyResultWithMessages([warning("Unsupported break type: " + breakType)]); - } - }, - "w:bookmarkStart": function (element) { - var name = element.attributes["w:name"]; - if (name === "_GoBack") { - return emptyResult(); - } else { - return elementResult(new documents.BookmarkStart({ name: name })); - } - }, - - "mc:AlternateContent": function (element) { - return readChildElements(element.first("mc:Fallback")); - }, - - "w:sdt": function (element) { - var checkbox = element.firstOrEmpty("w:sdtPr").first("wordml:checkbox"); - - if (checkbox) { - var checkedElement = checkbox.first("wordml:checked"); - var isChecked = - !!checkedElement && - readBooleanAttributeValue(checkedElement.attributes["wordml:val"]); - return elementResult( - documents.checkbox({ - checked: isChecked - }) - ); - } else { - return readXmlElements(element.firstOrEmpty("w:sdtContent").children); - } - }, - - "w:ins": readChildElements, - "w:object": readChildElements, - "w:smartTag": readChildElements, - "w:drawing": readChildElements, - "w:pict": function (element) { - return readChildElements(element).toExtra(); - }, - "v:roundrect": readChildElements, - "v:shape": readChildElements, - "v:textbox": readChildElements, - "w:txbxContent": readChildElements, - "wp:inline": readDrawingElement, - "wp:anchor": readDrawingElement, - "v:imagedata": readImageData, - "v:group": readChildElements, - "v:rect": readChildElements - }; - - return { - readXmlElement: readXmlElement, - readXmlElements: readXmlElements - }; - - function readTable(element) { - var propertiesResult = readTableProperties(element.firstOrEmpty("w:tblPr")); - return readXmlElements(element.children) - .flatMap(calculateRowSpans) - .flatMap(function (children) { - return propertiesResult.map(function (properties) { - return documents.Table(children, properties); - }); - }); - } - - function readTableProperties(element) { - return readTableStyle(element).map(function (style) { - return { - styleId: style.styleId, - styleName: style.name - }; - }); - } - - function readTableRow(element) { - var properties = element.firstOrEmpty("w:trPr"); - var isHeader = !!properties.first("w:tblHeader"); - return readXmlElements(element.children).map(function (children) { - return documents.TableRow(children, { isHeader: isHeader }); - }); - } - - function readTableCell(element) { - return readXmlElements(element.children).map(function (children) { - var properties = element.firstOrEmpty("w:tcPr"); - - var gridSpan = properties.firstOrEmpty("w:gridSpan").attributes["w:val"]; - var colSpan = gridSpan ? parseInt(gridSpan, 10) : 1; - - var cell = documents.TableCell(children, { colSpan: colSpan }); - cell._vMerge = readVMerge(properties); - return cell; - }); - } - - function readVMerge(properties) { - var element = properties.first("w:vMerge"); - if (element) { - var val = element.attributes["w:val"]; - return val === "continue" || !val; - } else { - return null; - } - } - - function calculateRowSpans(rows) { - var unexpectedNonRows = _.any(rows, function (row) { - return row.type !== documents.types.tableRow; - }); - if (unexpectedNonRows) { - return elementResultWithMessages(rows, [ - warning("unexpected non-row element in table, cell merging may be incorrect") - ]); - } - var unexpectedNonCells = _.any(rows, function (row) { - return _.any(row.children, function (cell) { - return cell.type !== documents.types.tableCell; - }); - }); - if (unexpectedNonCells) { - return elementResultWithMessages(rows, [ - warning("unexpected non-cell element in table row, cell merging may be incorrect") - ]); - } - - var columns = {}; - - rows.forEach(function (row) { - var cellIndex = 0; - row.children.forEach(function (cell) { - if (cell._vMerge && columns[cellIndex]) { - columns[cellIndex].rowSpan++; - } else { - columns[cellIndex] = cell; - cell._vMerge = false; - } - cellIndex += cell.colSpan; - }); - }); - - rows.forEach(function (row) { - row.children = row.children.filter(function (cell) { - return !cell._vMerge; - }); - row.children.forEach(function (cell) { - delete cell._vMerge; - }); - }); - - return elementResult(rows); - } - - function readDrawingElement(element) { - var blips = element - .getElementsByTagName("a:graphic") - .getElementsByTagName("a:graphicData") - .getElementsByTagName("pic:pic") - .getElementsByTagName("pic:blipFill") - .getElementsByTagName("a:blip"); - - return combineResults(blips.map(readBlip.bind(null, element))); - } - - function readBlip(element, blip) { - var properties = element.first("wp:docPr").attributes; - var altText = isBlank(properties.descr) ? properties.title : properties.descr; - var blipImageFile = findBlipImageFile(blip); - if (blipImageFile === null) { - return emptyResultWithMessages([ - warning("Could not find image file for a:blip element") - ]); - } else { - return readImage(blipImageFile, altText); - } - } - - function isBlank(value) { - return value == null || /^\s*$/.test(value); - } - - function findBlipImageFile(blip) { - var embedRelationshipId = blip.attributes["r:embed"]; - var linkRelationshipId = blip.attributes["r:link"]; - if (embedRelationshipId) { - return findEmbeddedImageFile(embedRelationshipId); - } else if (linkRelationshipId) { - var imagePath = relationships.findTargetByRelationshipId(linkRelationshipId); - return { - path: imagePath, - read: files.read.bind(files, imagePath) - }; - } else { - return null; - } - } - - function readImageData(element) { - var relationshipId = element.attributes["r:id"]; - - if (relationshipId) { - return readImage(findEmbeddedImageFile(relationshipId), element.attributes["o:title"]); - } else { - return emptyResultWithMessages([ - warning("A v:imagedata element without a relationship ID was ignored") - ]); - } - } - - function findEmbeddedImageFile(relationshipId) { - var path = uris.uriToZipEntryName( - "word", - relationships.findTargetByRelationshipId(relationshipId) - ); - return { - path: path, - read: docxFile.read.bind(docxFile, path) - }; - } - - function readImage(imageFile, altText) { - var contentType = contentTypes.findContentType(imageFile.path); - - var image = documents.Image({ - readImage: imageFile.read, - altText: altText, - contentType: contentType - }); - var warnings = supportedImageTypes[contentType] - ? [] - : warning("Image of type " + contentType + " is unlikely to display in web browsers"); - return elementResultWithMessages(image, warnings); - } - - function undefinedStyleWarning(type, styleId) { - return warning( - type + " style with ID " + styleId + " was referenced but not defined in the document" - ); - } - } - - function readNumberingProperties(styleId, element, numbering) { - var level = element.firstOrEmpty("w:ilvl").attributes["w:val"]; - var numId = element.firstOrEmpty("w:numId").attributes["w:val"]; - if (level !== undefined && numId !== undefined) { - return numbering.findLevel(numId, level); - } - - if (styleId != null) { - var levelByStyleId = numbering.findLevelByParagraphStyleId(styleId); - if (levelByStyleId != null) { - return levelByStyleId; - } - } - - return null; - } - - var supportedImageTypes = { - "image/png": true, - "image/gif": true, - "image/jpeg": true, - "image/svg+xml": true, - "image/tiff": true - }; - - var ignoreElements = { - "office-word:wrap": true, - "v:shadow": true, - "v:shapetype": true, - "w:annotationRef": true, - "w:bookmarkEnd": true, - "w:sectPr": true, - "w:proofErr": true, - "w:lastRenderedPageBreak": true, - "w:commentRangeStart": true, - "w:commentRangeEnd": true, - "w:del": true, - "w:footnoteRef": true, - "w:endnoteRef": true, - "w:pPr": true, - "w:rPr": true, - "w:tblPr": true, - "w:tblGrid": true, - "w:trPr": true, - "w:tcPr": true - }; - - function emptyResultWithMessages(messages) { - return new ReadResult(null, null, messages); - } - - function emptyResult() { - return new ReadResult(null); - } - - function elementResult(element) { - return new ReadResult(element); - } - - function elementResultWithMessages(element, messages) { - return new ReadResult(element, null, messages); - } - - function ReadResult(element, extra, messages) { - this.value = element || []; - this.extra = extra || []; - this._result = new Result( - { - element: this.value, - extra: extra - }, - messages - ); - this.messages = this._result.messages; - } - - ReadResult.prototype.toExtra = function () { - return new ReadResult(null, joinElements(this.extra, this.value), this.messages); - }; - - ReadResult.prototype.insertExtra = function () { - var extra = this.extra; - if (extra && extra.length) { - return new ReadResult(joinElements(this.value, extra), null, this.messages); - } else { - return this; - } - }; - - ReadResult.prototype.map = function (func) { - var result = this._result.map(function (value) { - return func(value.element); - }); - return new ReadResult(result.value, this.extra, result.messages); - }; - - ReadResult.prototype.flatMap = function (func) { - var result = this._result.flatMap(function (value) { - return func(value.element)._result; - }); - return new ReadResult( - result.value.element, - joinElements(this.extra, result.value.extra), - result.messages - ); - }; - - ReadResult.map = function (first, second, func) { - return new ReadResult( - func(first.value, second.value), - joinElements(first.extra, second.extra), - first.messages.concat(second.messages) - ); - }; - - function combineResults(results) { - var result = Result.combine(_.pluck(results, "_result")); - return new ReadResult( - _.flatten(_.pluck(result.value, "element")), - _.filter(_.flatten(_.pluck(result.value, "extra")), identity), - result.messages - ); - } - - function joinElements(first, second) { - return _.flatten([first, second]); - } - - function identity(value) { - return value; - } - }, - { - "../documents": 4, - "../results": 25, - "../xml": 35, - "./uris": 16, - "dingbat-to-unicode": 50, - underscore: 67 - } - ], - 6: [ - function (require, module, exports) { - var documents = require("../documents"); - var Result = require("../results").Result; - - function createCommentsReader(bodyReader) { - function readCommentsXml(element) { - return Result.combine(element.getElementsByTagName("w:comment").map(readCommentElement)); - } - - function readCommentElement(element) { - var id = element.attributes["w:id"]; - - function readOptionalAttribute(name) { - return (element.attributes[name] || "").trim() || null; - } - - return bodyReader.readXmlElements(element.children).map(function (body) { - return documents.comment({ - commentId: id, - body: body, - authorName: readOptionalAttribute("w:author"), - authorInitials: readOptionalAttribute("w:initials") - }); - }); - } - - return readCommentsXml; - } - - exports.createCommentsReader = createCommentsReader; - }, - { "../documents": 4, "../results": 25 } - ], - 7: [ - function (require, module, exports) { - exports.readContentTypesFromXml = readContentTypesFromXml; - - var fallbackContentTypes = { - png: "png", - gif: "gif", - jpeg: "jpeg", - jpg: "jpeg", - tif: "tiff", - tiff: "tiff", - bmp: "bmp" - }; - - exports.defaultContentTypes = contentTypes({}, {}); - - function readContentTypesFromXml(element) { - var extensionDefaults = {}; - var overrides = {}; - - element.children.forEach(function (child) { - if (child.name === "content-types:Default") { - extensionDefaults[child.attributes.Extension] = child.attributes.ContentType; - } - if (child.name === "content-types:Override") { - var name = child.attributes.PartName; - if (name.charAt(0) === "/") { - name = name.substring(1); - } - overrides[name] = child.attributes.ContentType; - } - }); - return contentTypes(overrides, extensionDefaults); - } - - function contentTypes(overrides, extensionDefaults) { - return { - findContentType: function (path) { - var overrideContentType = overrides[path]; - if (overrideContentType) { - return overrideContentType; - } else { - var pathParts = path.split("."); - var extension = pathParts[pathParts.length - 1]; - if (extensionDefaults.hasOwnProperty(extension)) { - return extensionDefaults[extension]; - } else { - var fallback = fallbackContentTypes[extension.toLowerCase()]; - if (fallback) { - return "image/" + fallback; - } else { - return null; - } - } - } - } - }; - } - }, - {} - ], - 8: [ - function (require, module, exports) { - exports.DocumentXmlReader = DocumentXmlReader; - - var documents = require("../documents"); - var Result = require("../results").Result; - - function DocumentXmlReader(options) { - var bodyReader = options.bodyReader; - - function convertXmlToDocument(element) { - var body = element.first("w:body"); - - if (body == null) { - throw new Error("Could not find the body element: are you sure this is a docx file?"); - } - - var result = bodyReader.readXmlElements(body.children).map(function (children) { - return new documents.Document(children, { - notes: options.notes, - comments: options.comments - }); - }); - return new Result(result.value, result.messages); - } - - return { - convertXmlToDocument: convertXmlToDocument - }; - } - }, - { "../documents": 4, "../results": 25 } - ], - 9: [ - function (require, module, exports) { - exports.read = read; - exports._findPartPaths = findPartPaths; - - var promises = require("../promises"); - var documents = require("../documents"); - var Result = require("../results").Result; - var zipfile = require("../zipfile"); - - var readXmlFromZipFile = require("./office-xml-reader").readXmlFromZipFile; - var createBodyReader = require("./body-reader").createBodyReader; - var DocumentXmlReader = require("./document-xml-reader").DocumentXmlReader; - var relationshipsReader = require("./relationships-reader"); - var contentTypesReader = require("./content-types-reader"); - var numberingXml = require("./numbering-xml"); - var stylesReader = require("./styles-reader"); - var notesReader = require("./notes-reader"); - var commentsReader = require("./comments-reader"); - var Files = require("./files").Files; - - function read(docxFile, input) { - input = input || {}; - - return promises - .props({ - contentTypes: readContentTypesFromZipFile(docxFile), - partPaths: findPartPaths(docxFile), - docxFile: docxFile, - files: input.path ? Files.relativeToFile(input.path) : new Files(null) - }) - .also(function (result) { - return { - styles: readStylesFromZipFile(docxFile, result.partPaths.styles) - }; - }) - .also(function (result) { - return { - numbering: readNumberingFromZipFile( - docxFile, - result.partPaths.numbering, - result.styles - ) - }; - }) - .also(function (result) { - return { - footnotes: readXmlFileWithBody( - result.partPaths.footnotes, - result, - function (bodyReader, xml) { - if (xml) { - return notesReader.createFootnotesReader(bodyReader)(xml); - } else { - return new Result([]); - } - } - ), - endnotes: readXmlFileWithBody( - result.partPaths.endnotes, - result, - function (bodyReader, xml) { - if (xml) { - return notesReader.createEndnotesReader(bodyReader)(xml); - } else { - return new Result([]); - } - } - ), - comments: readXmlFileWithBody( - result.partPaths.comments, - result, - function (bodyReader, xml) { - if (xml) { - return commentsReader.createCommentsReader(bodyReader)(xml); - } else { - return new Result([]); - } - } - ) - }; - }) - .also(function (result) { - return { - notes: result.footnotes.flatMap(function (footnotes) { - return result.endnotes.map(function (endnotes) { - return new documents.Notes(footnotes.concat(endnotes)); - }); - }) - }; - }) - .then(function (result) { - return readXmlFileWithBody( - result.partPaths.mainDocument, - result, - function (bodyReader, xml) { - return result.notes.flatMap(function (notes) { - return result.comments.flatMap(function (comments) { - var reader = new DocumentXmlReader({ - bodyReader: bodyReader, - notes: notes, - comments: comments - }); - return reader.convertXmlToDocument(xml); - }); - }); - } - ); - }); - } - - function findPartPaths(docxFile) { - return readPackageRelationships(docxFile).then(function (packageRelationships) { - var mainDocumentPath = findPartPath({ - docxFile: docxFile, - relationships: packageRelationships, - relationshipType: - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", - basePath: "", - fallbackPath: "word/document.xml" - }); - - if (!docxFile.exists(mainDocumentPath)) { - throw new Error( - "Could not find main document part. Are you sure this is a valid .docx file?" - ); - } - - return xmlFileReader({ - filename: relationshipsFilename(mainDocumentPath), - readElement: relationshipsReader.readRelationships, - defaultValue: relationshipsReader.defaultValue - })(docxFile).then(function (documentRelationships) { - function findPartRelatedToMainDocument(name) { - return findPartPath({ - docxFile: docxFile, - relationships: documentRelationships, - relationshipType: - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/" + - name, - basePath: zipfile.splitPath(mainDocumentPath).dirname, - fallbackPath: "word/" + name + ".xml" - }); - } - - return { - mainDocument: mainDocumentPath, - comments: findPartRelatedToMainDocument("comments"), - endnotes: findPartRelatedToMainDocument("endnotes"), - footnotes: findPartRelatedToMainDocument("footnotes"), - numbering: findPartRelatedToMainDocument("numbering"), - styles: findPartRelatedToMainDocument("styles") - }; - }); - }); - } - - function findPartPath(options) { - var docxFile = options.docxFile; - var relationships = options.relationships; - var relationshipType = options.relationshipType; - var basePath = options.basePath; - var fallbackPath = options.fallbackPath; - - var targets = relationships.findTargetsByType(relationshipType); - var normalisedTargets = targets.map(function (target) { - return stripPrefix(zipfile.joinPath(basePath, target), "/"); - }); - var validTargets = normalisedTargets.filter(function (target) { - return docxFile.exists(target); - }); - if (validTargets.length === 0) { - return fallbackPath; - } else { - return validTargets[0]; - } - } - - function stripPrefix(value, prefix) { - if (value.substring(0, prefix.length) === prefix) { - return value.substring(prefix.length); - } else { - return value; - } - } - - function xmlFileReader(options) { - return function (zipFile) { - return readXmlFromZipFile(zipFile, options.filename).then(function (element) { - return element ? options.readElement(element) : options.defaultValue; - }); - }; - } - - function readXmlFileWithBody(filename, options, func) { - var readRelationshipsFromZipFile = xmlFileReader({ - filename: relationshipsFilename(filename), - readElement: relationshipsReader.readRelationships, - defaultValue: relationshipsReader.defaultValue - }); - - return readRelationshipsFromZipFile(options.docxFile).then(function (relationships) { - var bodyReader = new createBodyReader({ - relationships: relationships, - contentTypes: options.contentTypes, - docxFile: options.docxFile, - numbering: options.numbering, - styles: options.styles, - files: options.files - }); - return readXmlFromZipFile(options.docxFile, filename).then(function (xml) { - return func(bodyReader, xml); - }); - }); - } - - function relationshipsFilename(filename) { - var split = zipfile.splitPath(filename); - return zipfile.joinPath(split.dirname, "_rels", split.basename + ".rels"); - } - - var readContentTypesFromZipFile = xmlFileReader({ - filename: "[Content_Types].xml", - readElement: contentTypesReader.readContentTypesFromXml, - defaultValue: contentTypesReader.defaultContentTypes - }); - - function readNumberingFromZipFile(zipFile, path, styles) { - return xmlFileReader({ - filename: path, - readElement: function (element) { - return numberingXml.readNumberingXml(element, { styles: styles }); - }, - defaultValue: numberingXml.defaultNumbering - })(zipFile); - } - - function readStylesFromZipFile(zipFile, path) { - return xmlFileReader({ - filename: path, - readElement: stylesReader.readStylesXml, - defaultValue: stylesReader.defaultStyles - })(zipFile); - } - - var readPackageRelationships = xmlFileReader({ - filename: "_rels/.rels", - readElement: relationshipsReader.readRelationships, - defaultValue: relationshipsReader.defaultValue - }); - }, - { - "../documents": 4, - "../promises": 23, - "../results": 25, - "../zipfile": 40, - "./body-reader": 5, - "./comments-reader": 6, - "./content-types-reader": 7, - "./document-xml-reader": 8, - "./files": 1, - "./notes-reader": 10, - "./numbering-xml": 11, - "./office-xml-reader": 12, - "./relationships-reader": 13, - "./styles-reader": 15 - } - ], - 10: [ - function (require, module, exports) { - var documents = require("../documents"); - var Result = require("../results").Result; - - exports.createFootnotesReader = createReader.bind(this, "footnote"); - exports.createEndnotesReader = createReader.bind(this, "endnote"); - - function createReader(noteType, bodyReader) { - function readNotesXml(element) { - return Result.combine( - element - .getElementsByTagName("w:" + noteType) - .filter(isFootnoteElement) - .map(readFootnoteElement) - ); - } - - function isFootnoteElement(element) { - var type = element.attributes["w:type"]; - return type !== "continuationSeparator" && type !== "separator"; - } - - function readFootnoteElement(footnoteElement) { - var id = footnoteElement.attributes["w:id"]; - return bodyReader.readXmlElements(footnoteElement.children).map(function (body) { - return documents.Note({ noteType: noteType, noteId: id, body: body }); - }); - } - - return readNotesXml; - } - }, - { "../documents": 4, "../results": 25 } - ], - 11: [ - function (require, module, exports) { - var _ = require("underscore"); - - exports.readNumberingXml = readNumberingXml; - exports.Numbering = Numbering; - exports.defaultNumbering = new Numbering({}, {}); - - function Numbering(nums, abstractNums, styles) { - var allLevels = _.flatten( - _.values(abstractNums).map(function (abstractNum) { - return _.values(abstractNum.levels); - }) - ); - - var levelsByParagraphStyleId = _.indexBy( - allLevels.filter(function (level) { - return level.paragraphStyleId != null; - }), - "paragraphStyleId" - ); - - function findLevel(numId, level) { - var num = nums[numId]; - if (num) { - var abstractNum = abstractNums[num.abstractNumId]; - if (!abstractNum) { - return null; - } else if (abstractNum.numStyleLink == null) { - return abstractNums[num.abstractNumId].levels[level]; - } else { - var style = styles.findNumberingStyleById(abstractNum.numStyleLink); - return findLevel(style.numId, level); - } - } else { - return null; - } - } - - function findLevelByParagraphStyleId(styleId) { - return levelsByParagraphStyleId[styleId] || null; - } - - return { - findLevel: findLevel, - findLevelByParagraphStyleId: findLevelByParagraphStyleId - }; - } - - function readNumberingXml(root, options) { - if (!options || !options.styles) { - throw new Error("styles is missing"); - } - - var abstractNums = readAbstractNums(root); - var nums = readNums(root, abstractNums); - return new Numbering(nums, abstractNums, options.styles); - } - - function readAbstractNums(root) { - var abstractNums = {}; - root.getElementsByTagName("w:abstractNum").forEach(function (element) { - var id = element.attributes["w:abstractNumId"]; - abstractNums[id] = readAbstractNum(element); - }); - return abstractNums; - } - - function readAbstractNum(element) { - var levels = {}; - element.getElementsByTagName("w:lvl").forEach(function (levelElement) { - var levelIndex = levelElement.attributes["w:ilvl"]; - var numFmt = levelElement.firstOrEmpty("w:numFmt").attributes["w:val"]; - var paragraphStyleId = levelElement.firstOrEmpty("w:pStyle").attributes["w:val"]; - - levels[levelIndex] = { - isOrdered: numFmt !== "bullet", - level: levelIndex, - paragraphStyleId: paragraphStyleId - }; - }); - - var numStyleLink = element.firstOrEmpty("w:numStyleLink").attributes["w:val"]; - - return { levels: levels, numStyleLink: numStyleLink }; - } - - function readNums(root) { - var nums = {}; - root.getElementsByTagName("w:num").forEach(function (element) { - var numId = element.attributes["w:numId"]; - var abstractNumId = element.first("w:abstractNumId").attributes["w:val"]; - nums[numId] = { abstractNumId: abstractNumId }; - }); - return nums; - } - }, - { underscore: 67 } - ], - 12: [ - function (require, module, exports) { - var _ = require("underscore"); - - var promises = require("../promises"); - var xml = require("../xml"); - - exports.read = read; - exports.readXmlFromZipFile = readXmlFromZipFile; - - var xmlNamespaceMap = { - // Transitional format - "http://schemas.openxmlformats.org/wordprocessingml/2006/main": "w", - "http://schemas.openxmlformats.org/officeDocument/2006/relationships": "r", - "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing": "wp", - "http://schemas.openxmlformats.org/drawingml/2006/main": "a", - "http://schemas.openxmlformats.org/drawingml/2006/picture": "pic", - - // Strict format - "http://purl.oclc.org/ooxml/wordprocessingml/main": "w", - "http://purl.oclc.org/ooxml/officeDocument/relationships": "r", - "http://purl.oclc.org/ooxml/drawingml/wordprocessingDrawing": "wp", - "http://purl.oclc.org/ooxml/drawingml/main": "a", - "http://purl.oclc.org/ooxml/drawingml/picture": "pic", - - // Common - "http://schemas.openxmlformats.org/package/2006/content-types": "content-types", - "http://schemas.openxmlformats.org/package/2006/relationships": "relationships", - "http://schemas.openxmlformats.org/markup-compatibility/2006": "mc", - "urn:schemas-microsoft-com:vml": "v", - "urn:schemas-microsoft-com:office:word": "office-word", - - // [MS-DOCX]: Word Extensions to the Office Open XML (.docx) File Format - // https://learn.microsoft.com/en-us/openspecs/office_standards/ms-docx/b839fe1f-e1ca-4fa6-8c26-5954d0abbccd - "http://schemas.microsoft.com/office/word/2010/wordml": "wordml" - }; - - function read(xmlString) { - return xml.readString(xmlString, xmlNamespaceMap).then(function (document) { - return collapseAlternateContent(document)[0]; - }); - } - - function readXmlFromZipFile(docxFile, path) { - if (docxFile.exists(path)) { - return docxFile.read(path, "utf-8").then(stripUtf8Bom).then(read); - } else { - return promises.resolve(null); - } - } - - function stripUtf8Bom(xmlString) { - return xmlString.replace(/^\uFEFF/g, ""); - } - - function collapseAlternateContent(node) { - if (node.type === "element") { - if (node.name === "mc:AlternateContent") { - return node.first("mc:Fallback").children; - } else { - node.children = _.flatten(node.children.map(collapseAlternateContent, true)); - return [node]; - } - } else { - return [node]; - } - } - }, - { "../promises": 23, "../xml": 35, underscore: 67 } - ], - 13: [ - function (require, module, exports) { - exports.readRelationships = readRelationships; - exports.defaultValue = new Relationships([]); - exports.Relationships = Relationships; - - function readRelationships(element) { - var relationships = []; - element.children.forEach(function (child) { - if (child.name === "relationships:Relationship") { - var relationship = { - relationshipId: child.attributes.Id, - target: child.attributes.Target, - type: child.attributes.Type - }; - relationships.push(relationship); - } - }); - return new Relationships(relationships); - } - - function Relationships(relationships) { - var targetsByRelationshipId = {}; - relationships.forEach(function (relationship) { - targetsByRelationshipId[relationship.relationshipId] = relationship.target; - }); - - var targetsByType = {}; - relationships.forEach(function (relationship) { - if (!targetsByType[relationship.type]) { - targetsByType[relationship.type] = []; - } - targetsByType[relationship.type].push(relationship.target); - }); - - return { - findTargetByRelationshipId: function (relationshipId) { - return targetsByRelationshipId[relationshipId]; - }, - findTargetsByType: function (type) { - return targetsByType[type] || []; - } - }; - } - }, - {} - ], - 14: [ - function (require, module, exports) { - var _ = require("underscore"); - - var promises = require("../promises"); - var xml = require("../xml"); - - exports.writeStyleMap = writeStyleMap; - exports.readStyleMap = readStyleMap; - - var schema = "http://schemas.zwobble.org/mammoth/style-map"; - var styleMapPath = "mammoth/style-map"; - var styleMapAbsolutePath = "/" + styleMapPath; - - function writeStyleMap(docxFile, styleMap) { - docxFile.write(styleMapPath, styleMap); - return updateRelationships(docxFile).then(function () { - return updateContentTypes(docxFile); - }); - } - - function updateRelationships(docxFile) { - var path = "word/_rels/document.xml.rels"; - var relationshipsUri = "http://schemas.openxmlformats.org/package/2006/relationships"; - var relationshipElementName = "{" + relationshipsUri + "}Relationship"; - return docxFile - .read(path, "utf8") - .then(xml.readString) - .then(function (relationshipsContainer) { - var relationships = relationshipsContainer.children; - addOrUpdateElement(relationships, relationshipElementName, "Id", { - Id: "rMammothStyleMap", - Type: schema, - Target: styleMapAbsolutePath - }); - - var namespaces = { "": relationshipsUri }; - return docxFile.write(path, xml.writeString(relationshipsContainer, namespaces)); - }); - } - - function updateContentTypes(docxFile) { - var path = "[Content_Types].xml"; - var contentTypesUri = "http://schemas.openxmlformats.org/package/2006/content-types"; - var overrideName = "{" + contentTypesUri + "}Override"; - return docxFile - .read(path, "utf8") - .then(xml.readString) - .then(function (typesElement) { - var children = typesElement.children; - addOrUpdateElement(children, overrideName, "PartName", { - PartName: styleMapAbsolutePath, - ContentType: "text/prs.mammoth.style-map" - }); - var namespaces = { "": contentTypesUri }; - return docxFile.write(path, xml.writeString(typesElement, namespaces)); - }); - } - - function addOrUpdateElement(elements, name, identifyingAttribute, attributes) { - var existingElement = _.find(elements, function (element) { - return ( - element.name === name && - element.attributes[identifyingAttribute] === attributes[identifyingAttribute] - ); - }); - if (existingElement) { - existingElement.attributes = attributes; - } else { - elements.push(xml.element(name, attributes)); - } - } - - function readStyleMap(docxFile) { - if (docxFile.exists(styleMapPath)) { - return docxFile.read(styleMapPath, "utf8"); - } else { - return promises.resolve(null); - } - } - }, - { "../promises": 23, "../xml": 35, underscore: 67 } - ], - 15: [ - function (require, module, exports) { - exports.readStylesXml = readStylesXml; - exports.Styles = Styles; - exports.defaultStyles = new Styles({}, {}); - - function Styles(paragraphStyles, characterStyles, tableStyles, numberingStyles) { - return { - findParagraphStyleById: function (styleId) { - return paragraphStyles[styleId]; - }, - findCharacterStyleById: function (styleId) { - return characterStyles[styleId]; - }, - findTableStyleById: function (styleId) { - return tableStyles[styleId]; - }, - findNumberingStyleById: function (styleId) { - return numberingStyles[styleId]; - } - }; - } - - Styles.EMPTY = new Styles({}, {}, {}, {}); - - function readStylesXml(root) { - var paragraphStyles = {}; - var characterStyles = {}; - var tableStyles = {}; - var numberingStyles = {}; - - var styles = { - paragraph: paragraphStyles, - character: characterStyles, - table: tableStyles - }; - - root.getElementsByTagName("w:style").forEach(function (styleElement) { - var style = readStyleElement(styleElement); - if (style.type === "numbering") { - numberingStyles[style.styleId] = readNumberingStyleElement(styleElement); - } else { - var styleSet = styles[style.type]; - if (styleSet) { - styleSet[style.styleId] = style; - } - } - }); - - return new Styles(paragraphStyles, characterStyles, tableStyles, numberingStyles); - } - - function readStyleElement(styleElement) { - var type = styleElement.attributes["w:type"]; - var styleId = styleElement.attributes["w:styleId"]; - var name = styleName(styleElement); - return { type: type, styleId: styleId, name: name }; - } - - function styleName(styleElement) { - var nameElement = styleElement.first("w:name"); - return nameElement ? nameElement.attributes["w:val"] : null; - } - - function readNumberingStyleElement(styleElement) { - var numId = styleElement.firstOrEmpty("w:pPr").firstOrEmpty("w:numPr").firstOrEmpty("w:numId") - .attributes["w:val"]; - return { numId: numId }; - } - }, - {} - ], - 16: [ - function (require, module, exports) { - exports.uriToZipEntryName = uriToZipEntryName; - exports.replaceFragment = replaceFragment; - - function uriToZipEntryName(base, uri) { - if (uri.charAt(0) === "/") { - return uri.substr(1); - } else { - // In general, we should check first and second for trailing and leading slashes, - // but in our specific case this seems to be sufficient - return base + "/" + uri; - } - } - - function replaceFragment(uri, fragment) { - var hashIndex = uri.indexOf("#"); - if (hashIndex !== -1) { - uri = uri.substring(0, hashIndex); - } - return uri + "#" + fragment; - } - }, - {} - ], - 17: [ - function (require, module, exports) { - var htmlPaths = require("../styles/html-paths"); - - function nonFreshElement(tagName, attributes, children) { - return elementWithTag(htmlPaths.element(tagName, attributes, { fresh: false }), children); - } - - function freshElement(tagName, attributes, children) { - var tag = htmlPaths.element(tagName, attributes, { fresh: true }); - return elementWithTag(tag, children); - } - - function elementWithTag(tag, children) { - return { - type: "element", - tag: tag, - children: children || [] - }; - } - - function text(value) { - return { - type: "text", - value: value - }; - } - - var forceWrite = { - type: "forceWrite" - }; - - exports.freshElement = freshElement; - exports.nonFreshElement = nonFreshElement; - exports.elementWithTag = elementWithTag; - exports.text = text; - exports.forceWrite = forceWrite; - - var voidTagNames = { - br: true, - hr: true, - img: true, - input: true - }; - - function isVoidElement(node) { - return node.children.length === 0 && voidTagNames[node.tag.tagName]; - } - - exports.isVoidElement = isVoidElement; - }, - { "../styles/html-paths": 28 } - ], - 18: [ - function (require, module, exports) { - var ast = require("./ast"); - - exports.freshElement = ast.freshElement; - exports.nonFreshElement = ast.nonFreshElement; - exports.elementWithTag = ast.elementWithTag; - exports.text = ast.text; - exports.forceWrite = ast.forceWrite; - - exports.simplify = require("./simplify"); - - function write(writer, nodes) { - nodes.forEach(function (node) { - writeNode(writer, node); - }); - } - - function writeNode(writer, node) { - toStrings[node.type](writer, node); - } - - var toStrings = { - element: generateElementString, - text: generateTextString, - forceWrite: function () {} - }; - - function generateElementString(writer, node) { - if (ast.isVoidElement(node)) { - writer.selfClosing(node.tag.tagName, node.tag.attributes); - } else { - writer.open(node.tag.tagName, node.tag.attributes); - write(writer, node.children); - writer.close(node.tag.tagName); - } - } - - function generateTextString(writer, node) { - writer.text(node.value); - } - - exports.write = write; - }, - { "./ast": 17, "./simplify": 19 } - ], - 19: [ - function (require, module, exports) { - var _ = require("underscore"); - - var ast = require("./ast"); - - function simplify(nodes) { - return collapse(removeEmpty(nodes)); - } - - function collapse(nodes) { - var children = []; - - nodes.map(collapseNode).forEach(function (child) { - appendChild(children, child); - }); - return children; - } - - function collapseNode(node) { - return collapsers[node.type](node); - } - - var collapsers = { - element: collapseElement, - text: identity, - forceWrite: identity - }; - - function collapseElement(node) { - return ast.elementWithTag(node.tag, collapse(node.children)); - } - - function identity(value) { - return value; - } - - function appendChild(children, child) { - var lastChild = children[children.length - 1]; - if ( - child.type === "element" && - !child.tag.fresh && - lastChild && - lastChild.type === "element" && - child.tag.matchesElement(lastChild.tag) - ) { - if (child.tag.separator) { - appendChild(lastChild.children, ast.text(child.tag.separator)); - } - child.children.forEach(function (grandChild) { - // Mutation is fine since simplifying elements create a copy of the children. - appendChild(lastChild.children, grandChild); - }); - } else { - children.push(child); - } - } - - function removeEmpty(nodes) { - return flatMap(nodes, function (node) { - return emptiers[node.type](node); - }); - } - - function flatMap(values, func) { - return _.flatten(_.map(values, func), true); - } - - var emptiers = { - element: elementEmptier, - text: textEmptier, - forceWrite: neverEmpty - }; - - function neverEmpty(node) { - return [node]; - } - - function elementEmptier(element) { - var children = removeEmpty(element.children); - if (children.length === 0 && !ast.isVoidElement(element)) { - return []; - } else { - return [ast.elementWithTag(element.tag, children)]; - } - } - - function textEmptier(node) { - if (node.value.length === 0) { - return []; - } else { - return [node]; - } - } - - module.exports = simplify; - }, - { "./ast": 17, underscore: 67 } - ], - 20: [ - function (require, module, exports) { - var _ = require("underscore"); - - var promises = require("./promises"); - var Html = require("./html"); - - exports.imgElement = imgElement; - - function imgElement(func) { - return function (element, messages) { - return promises.when(func(element)).then(function (result) { - var attributes = {}; - if (element.altText) { - attributes.alt = element.altText; - } - _.extend(attributes, result); - - return [Html.freshElement("img", attributes)]; - }); - }; - } - - // Undocumented, but retained for backwards-compatibility with 0.3.x - exports.inline = exports.imgElement; - - exports.dataUri = imgElement(function (element) { - return element.readAsBase64String().then(function (imageBuffer) { - return { - src: "data:" + element.contentType + ";base64," + imageBuffer - }; - }); - }); - }, - { "./html": 18, "./promises": 23, underscore: 67 } - ], - 21: [ - function (require, module, exports) { - (function (Buffer) { - var _ = require("underscore"); - - var docxReader = require("./docx/docx-reader"); - var docxStyleMap = require("./docx/style-map"); - var DocumentConverter = require("./document-to-html").DocumentConverter; - var convertElementToRawText = require("./raw-text").convertElementToRawText; - var readStyle = require("./style-reader").readStyle; - var readOptions = require("./options-reader").readOptions; - var unzip = require("./unzip"); - var Result = require("./results").Result; - - exports.convertToHtml = convertToHtml; - exports.convertToMarkdown = convertToMarkdown; - exports.convert = convert; - exports.extractRawText = extractRawText; - exports.images = require("./images"); - exports.transforms = require("./transforms"); - exports.underline = require("./underline"); - exports.embedStyleMap = embedStyleMap; - exports.readEmbeddedStyleMap = readEmbeddedStyleMap; - - function convertToHtml(input, options) { - return convert(input, options); - } - - function convertToMarkdown(input, options) { - var markdownOptions = Object.create(options || {}); - markdownOptions.outputFormat = "markdown"; - return convert(input, markdownOptions); - } - - function convert(input, options) { - options = readOptions(options); - - return unzip - .openZip(input) - .tap(function (docxFile) { - return docxStyleMap.readStyleMap(docxFile).then(function (styleMap) { - options.embeddedStyleMap = styleMap; - }); - }) - .then(function (docxFile) { - return docxReader - .read(docxFile, input) - .then(function (documentResult) { - return documentResult.map(options.transformDocument); - }) - .then(function (documentResult) { - return convertDocumentToHtml(documentResult, options); - }); - }); - } - - function readEmbeddedStyleMap(input) { - return unzip.openZip(input).then(docxStyleMap.readStyleMap); - } - - function convertDocumentToHtml(documentResult, options) { - var styleMapResult = parseStyleMap(options.readStyleMap()); - var parsedOptions = _.extend({}, options, { - styleMap: styleMapResult.value - }); - var documentConverter = new DocumentConverter(parsedOptions); - - return documentResult.flatMapThen(function (document) { - return styleMapResult.flatMapThen(function (styleMap) { - return documentConverter.convertToHtml(document); - }); - }); - } - - function parseStyleMap(styleMap) { - return Result.combine((styleMap || []).map(readStyle)).map(function (styleMap) { - return styleMap.filter(function (styleMapping) { - return !!styleMapping; - }); - }); - } - - function extractRawText(input) { - return unzip - .openZip(input) - .then(docxReader.read) - .then(function (documentResult) { - return documentResult.map(convertElementToRawText); - }); - } - - function embedStyleMap(input, styleMap) { - return unzip - .openZip(input) - .tap(function (docxFile) { - return docxStyleMap.writeStyleMap(docxFile, styleMap); - }) - .then(function (docxFile) { - return docxFile.toArrayBuffer(); - }) - .then(function (arrayBuffer) { - return { - toArrayBuffer: function () { - return arrayBuffer; - }, - toBuffer: function () { - return Buffer.from(arrayBuffer); - } - }; - }); - } - - exports.styleMapping = function () { - throw new Error( - "Use a raw string instead of mammoth.styleMapping e.g. \"p[style-name='Title'] => h1\" instead of mammoth.styleMapping(\"p[style-name='Title'] => h1\")" - ); - }; - }).call(this, require("buffer").Buffer); - }, - { - "./document-to-html": 3, - "./docx/docx-reader": 9, - "./docx/style-map": 14, - "./images": 20, - "./options-reader": 22, - "./raw-text": 24, - "./results": 25, - "./style-reader": 26, - "./transforms": 30, - "./underline": 31, - "./unzip": 2, - buffer: 48, - underscore: 67 - } - ], - 22: [ - function (require, module, exports) { - exports.readOptions = readOptions; - - var _ = require("underscore"); - - var defaultStyleMap = (exports._defaultStyleMap = [ - "p.Heading1 => h1:fresh", - "p.Heading2 => h2:fresh", - "p.Heading3 => h3:fresh", - "p.Heading4 => h4:fresh", - "p.Heading5 => h5:fresh", - "p.Heading6 => h6:fresh", - "p[style-name='Heading 1'] => h1:fresh", - "p[style-name='Heading 2'] => h2:fresh", - "p[style-name='Heading 3'] => h3:fresh", - "p[style-name='Heading 4'] => h4:fresh", - "p[style-name='Heading 5'] => h5:fresh", - "p[style-name='Heading 6'] => h6:fresh", - "p[style-name='heading 1'] => h1:fresh", - "p[style-name='heading 2'] => h2:fresh", - "p[style-name='heading 3'] => h3:fresh", - "p[style-name='heading 4'] => h4:fresh", - "p[style-name='heading 5'] => h5:fresh", - "p[style-name='heading 6'] => h6:fresh", - - "r[style-name='Strong'] => strong", - - "p[style-name='footnote text'] => p:fresh", - "r[style-name='footnote reference'] =>", - "p[style-name='endnote text'] => p:fresh", - "r[style-name='endnote reference'] =>", - "p[style-name='annotation text'] => p:fresh", - "r[style-name='annotation reference'] =>", - - // LibreOffice - "p[style-name='Footnote'] => p:fresh", - "r[style-name='Footnote anchor'] =>", - "p[style-name='Endnote'] => p:fresh", - "r[style-name='Endnote anchor'] =>", - - "p:unordered-list(1) => ul > li:fresh", - "p:unordered-list(2) => ul|ol > li > ul > li:fresh", - "p:unordered-list(3) => ul|ol > li > ul|ol > li > ul > li:fresh", - "p:unordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh", - "p:unordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ul > li:fresh", - "p:ordered-list(1) => ol > li:fresh", - "p:ordered-list(2) => ul|ol > li > ol > li:fresh", - "p:ordered-list(3) => ul|ol > li > ul|ol > li > ol > li:fresh", - "p:ordered-list(4) => ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh", - "p:ordered-list(5) => ul|ol > li > ul|ol > li > ul|ol > li > ul|ol > li > ol > li:fresh", - - "r[style-name='Hyperlink'] =>", - - "p[style-name='Normal'] => p:fresh" - ]); - - var standardOptions = (exports._standardOptions = { - transformDocument: identity, - includeDefaultStyleMap: true, - includeEmbeddedStyleMap: true - }); - - function readOptions(options) { - options = options || {}; - return _.extend({}, standardOptions, options, { - customStyleMap: readStyleMap(options.styleMap), - readStyleMap: function () { - var styleMap = this.customStyleMap; - if (this.includeEmbeddedStyleMap) { - styleMap = styleMap.concat(readStyleMap(this.embeddedStyleMap)); - } - if (this.includeDefaultStyleMap) { - styleMap = styleMap.concat(defaultStyleMap); - } - return styleMap; - } - }); - } - - function readStyleMap(styleMap) { - if (!styleMap) { - return []; - } else if (_.isString(styleMap)) { - return styleMap - .split("\n") - .map(function (line) { - return line.trim(); - }) - .filter(function (line) { - return line !== "" && line.charAt(0) !== "#"; - }); - } else { - return styleMap; - } - } - - function identity(value) { - return value; - } - }, - { underscore: 67 } - ], - 23: [ - function (require, module, exports) { - (function (process) { - var _ = require("underscore"); - // Replace bluebird with native Promises - // var bluebird = require("bluebird/js/release/promise")(); - - // Use the built-in Promise - // This avoids the need to check if Promise is available - // since we're requiring Node.js 12+ in package.json - exports.defer = defer; - exports.when = when; - exports.resolve = resolve; - exports.all = all; - exports.props = props; - exports.reject = reject; - exports.promisify = promisify; - exports.mapSeries = mapSeries; - exports.attempt = attempt; - exports.nfcall = nfcall; - - function when(value) { - return wrapPromise(Promise.resolve(value)); - } - - function resolve(value) { - return wrapPromise(Promise.resolve(value)); - } - - function all(values) { - return wrapPromise(Promise.all(values)); - } - - function reject(reason) { - return wrapPromise(Promise.reject(reason)); - } - - function nfcall(func) { - var args = Array.prototype.slice.call(arguments, 1); - var promisedFunc = promisify(func); - return promisedFunc.apply(null, args); - } - - // Since we can't modify Promise.prototype, we'll wrap promises - function wrapPromise(promise) { - // We need to store the original promise for methods like .done - var originalPromise = promise; - var wrapped = promise.then(function (value) { - // This first .then ensures we have a native promise base - // before potentially overriding .then - return value; - }); - - // Override .then to always return a wrapped promise - wrapped.then = function (onFulfilled, onRejected) { - // Call the original native .then but wrap its result - var newPromise = originalPromise.then(onFulfilled, onRejected); - return wrapPromise(newPromise); - }; - - // Add .fail as an alias for .catch for Q compatibility - wrapped.fail = function (onRejected) { - return wrapPromise(originalPromise.catch(onRejected)); - }; - - // Add .caught which is a Bluebird alias for .catch - wrapped.caught = function (onRejected) { - return wrapPromise(originalPromise.catch(onRejected)); - }; - - // Add .done() method which is used in Bluebird to terminate the chain - // and throw any unhandled errors - wrapped.done = function () { - // Use the original promise here to avoid infinite recursion with the overridden .then - return originalPromise.catch(function (error) { - // In the next tick, throw the error - process.nextTick(function () { - throw error; - }); - }); - }; - - // Add .tap method from Bluebird which runs a function and returns the original value - wrapped.tap = function (onFulfilled) { - // Use the overridden .then to keep the chain wrapped - return wrapped.then(function (value) { - return Promise.resolve(onFulfilled(value)).then(function () { - return value; - }); - }); - }; - - // Add .also method which is used to add additional properties to the result - wrapped.also = function (func) { - // Use the overridden .then to keep the chain wrapped - return wrapped.then(function (value) { - var returnValue = _.extend({}, value, func(value)); - return props(returnValue); - }); - }; - - return wrapped; - } - - function defer() { - var resolve; - var reject; - var promise = new Promise(function (resolveArg, rejectArg) { - resolve = resolveArg; - reject = rejectArg; - }); - - return { - resolve: resolve, - reject: reject, - promise: wrapPromise(promise) - }; - } - - // Implement Bluebird's props method using native Promises - function props(obj) { - var keys = Object.keys(obj); - var values = keys.map(function (key) { - return obj[key]; - }); - - return wrapPromise( - Promise.all(values).then(function (results) { - var result = {}; - keys.forEach(function (key, index) { - result[key] = results[index]; - }); - return result; - }) - ); - } - - // Implement Bluebird's promisify - function promisify(nodeFunction) { - return function () { - var self = this; - var args = Array.prototype.slice.call(arguments); - - return wrapPromise( - new Promise(function (resolve, reject) { - args.push(function (err, result) { - if (err) { - reject(err); - } else { - resolve(result); - } - }); - - nodeFunction.apply(self, args); - }) - ); - }; - } - - // Implement Bluebird's mapSeries - function mapSeries(items, iterator) { - if (!items.length) { - return wrapPromise(Promise.resolve([])); - } - - var results = []; - var current = Promise.resolve(); - - items.forEach(function (item) { - current = current - .then(function () { - return iterator(item); - }) - .then(function (result) { - results.push(result); - }); - }); - - return wrapPromise( - current.then(function () { - return results; - }) - ); - } - - // Implement Bluebird's attempt - function attempt(fn) { - try { - return wrapPromise(Promise.resolve(fn())); - } catch (error) { - return wrapPromise(Promise.reject(error)); - } - } - }).call(this, require("_process")); - }, - { _process: 66, underscore: 67 } - ], - 24: [ - function (require, module, exports) { - var documents = require("./documents"); - - function convertElementToRawText(element) { - if (element.type === "text") { - return element.value; - } else if (element.type === documents.types.tab) { - return "\t"; - } else { - var tail = element.type === "paragraph" ? "\n\n" : ""; - return (element.children || []).map(convertElementToRawText).join("") + tail; - } - } - - exports.convertElementToRawText = convertElementToRawText; - }, - { "./documents": 4 } - ], - 25: [ - function (require, module, exports) { - var _ = require("underscore"); - - exports.Result = Result; - exports.success = success; - exports.warning = warning; - exports.error = error; - - function Result(value, messages) { - this.value = value; - this.messages = messages || []; - } - - Result.prototype.map = function (func) { - return new Result(func(this.value), this.messages); - }; - - Result.prototype.flatMap = function (func) { - var funcResult = func(this.value); - return new Result(funcResult.value, combineMessages([this, funcResult])); - }; - - Result.prototype.flatMapThen = function (func) { - var that = this; - return func(this.value).then(function (otherResult) { - return new Result(otherResult.value, combineMessages([that, otherResult])); - }); - }; - - Result.combine = function (results) { - var values = _.flatten(_.pluck(results, "value")); - var messages = combineMessages(results); - return new Result(values, messages); - }; - - function success(value) { - return new Result(value, []); - } - - function warning(message) { - return { - type: "warning", - message: message - }; - } - - function error(exception) { - return { - type: "error", - message: exception.message, - error: exception - }; - } - - function combineMessages(results) { - var messages = []; - _.flatten(_.pluck(results, "messages"), true).forEach(function (message) { - if (!containsMessage(messages, message)) { - messages.push(message); - } - }); - return messages; - } - - function containsMessage(messages, message) { - return _.find(messages, isSameMessage.bind(null, message)) !== undefined; - } - - function isSameMessage(first, second) { - return first.type === second.type && first.message === second.message; - } - }, - { underscore: 67 } - ], - 26: [ - function (require, module, exports) { - var _ = require("underscore"); - var lop = require("lop"); - - var documentMatchers = require("./styles/document-matchers"); - var htmlPaths = require("./styles/html-paths"); - var tokenise = require("./styles/parser/tokeniser").tokenise; - var results = require("./results"); - - exports.readHtmlPath = readHtmlPath; - exports.readDocumentMatcher = readDocumentMatcher; - exports.readStyle = readStyle; - - function readStyle(string) { - return parseString(styleRule, string); - } - - function createStyleRule() { - return lop.rules - .sequence( - lop.rules.sequence.capture(documentMatcherRule()), - lop.rules.tokenOfType("whitespace"), - lop.rules.tokenOfType("arrow"), - lop.rules.sequence.capture( - lop.rules.optional( - lop.rules - .sequence( - lop.rules.tokenOfType("whitespace"), - lop.rules.sequence.capture(htmlPathRule()) - ) - .head() - ) - ), - lop.rules.tokenOfType("end") - ) - .map(function (documentMatcher, htmlPath) { - return { - from: documentMatcher, - to: htmlPath.valueOrElse(htmlPaths.empty) - }; - }); - } - - function readDocumentMatcher(string) { - return parseString(documentMatcherRule(), string); - } - - function documentMatcherRule() { - var sequence = lop.rules.sequence; - - var identifierToConstant = function (identifier, constant) { - return lop.rules.then(lop.rules.token("identifier", identifier), function () { - return constant; - }); - }; - - var paragraphRule = identifierToConstant("p", documentMatchers.paragraph); - var runRule = identifierToConstant("r", documentMatchers.run); - - var elementTypeRule = lop.rules.firstOf("p or r or table", paragraphRule, runRule); - - var styleIdRule = lop.rules - .sequence( - lop.rules.tokenOfType("dot"), - lop.rules.sequence.cut(), - lop.rules.sequence.capture(identifierRule) - ) - .map(function (styleId) { - return { styleId: styleId }; - }); - - var styleNameMatcherRule = lop.rules.firstOf( - "style name matcher", - lop.rules.then( - lop.rules - .sequence( - lop.rules.tokenOfType("equals"), - lop.rules.sequence.cut(), - lop.rules.sequence.capture(stringRule) - ) - .head(), - function (styleName) { - return { styleName: documentMatchers.equalTo(styleName) }; - } - ), - lop.rules.then( - lop.rules - .sequence( - lop.rules.tokenOfType("startsWith"), - lop.rules.sequence.cut(), - lop.rules.sequence.capture(stringRule) - ) - .head(), - function (styleName) { - return { styleName: documentMatchers.startsWith(styleName) }; - } - ) - ); - - var styleNameRule = lop.rules - .sequence( - lop.rules.tokenOfType("open-square-bracket"), - lop.rules.sequence.cut(), - lop.rules.token("identifier", "style-name"), - lop.rules.sequence.capture(styleNameMatcherRule), - lop.rules.tokenOfType("close-square-bracket") - ) - .head(); - - var listTypeRule = lop.rules.firstOf( - "list type", - identifierToConstant("ordered-list", { isOrdered: true }), - identifierToConstant("unordered-list", { isOrdered: false }) - ); - var listRule = sequence( - lop.rules.tokenOfType("colon"), - sequence.capture(listTypeRule), - sequence.cut(), - lop.rules.tokenOfType("open-paren"), - sequence.capture(integerRule), - lop.rules.tokenOfType("close-paren") - ).map(function (listType, levelNumber) { - return { - list: { - isOrdered: listType.isOrdered, - levelIndex: levelNumber - 1 - } - }; - }); - - function createMatcherSuffixesRule(rules) { - var matcherSuffix = lop.rules.firstOf.apply( - lop.rules.firstOf, - ["matcher suffix"].concat(rules) - ); - var matcherSuffixes = lop.rules.zeroOrMore(matcherSuffix); - return lop.rules.then(matcherSuffixes, function (suffixes) { - var matcherOptions = {}; - suffixes.forEach(function (suffix) { - _.extend(matcherOptions, suffix); - }); - return matcherOptions; - }); - } - - var paragraphOrRun = sequence( - sequence.capture(elementTypeRule), - sequence.capture(createMatcherSuffixesRule([styleIdRule, styleNameRule, listRule])) - ).map(function (createMatcher, matcherOptions) { - return createMatcher(matcherOptions); - }); - - var table = sequence( - lop.rules.token("identifier", "table"), - sequence.capture(createMatcherSuffixesRule([styleIdRule, styleNameRule])) - ).map(function (options) { - return documentMatchers.table(options); - }); - - var bold = identifierToConstant("b", documentMatchers.bold); - var italic = identifierToConstant("i", documentMatchers.italic); - var underline = identifierToConstant("u", documentMatchers.underline); - var strikethrough = identifierToConstant("strike", documentMatchers.strikethrough); - var allCaps = identifierToConstant("all-caps", documentMatchers.allCaps); - var smallCaps = identifierToConstant("small-caps", documentMatchers.smallCaps); - - var highlight = sequence( - lop.rules.token("identifier", "highlight"), - lop.rules.sequence.capture( - lop.rules.optional( - lop.rules - .sequence( - lop.rules.tokenOfType("open-square-bracket"), - lop.rules.sequence.cut(), - lop.rules.token("identifier", "color"), - lop.rules.tokenOfType("equals"), - lop.rules.sequence.capture(stringRule), - lop.rules.tokenOfType("close-square-bracket") - ) - .head() - ) - ) - ).map(function (color) { - return documentMatchers.highlight({ - color: color.valueOrElse(undefined) - }); - }); - - var commentReference = identifierToConstant( - "comment-reference", - documentMatchers.commentReference - ); - - var breakMatcher = sequence( - lop.rules.token("identifier", "br"), - sequence.cut(), - lop.rules.tokenOfType("open-square-bracket"), - lop.rules.token("identifier", "type"), - lop.rules.tokenOfType("equals"), - sequence.capture(stringRule), - lop.rules.tokenOfType("close-square-bracket") - ).map(function (breakType) { - switch (breakType) { - case "line": - return documentMatchers.lineBreak; - case "page": - return documentMatchers.pageBreak; - case "column": - return documentMatchers.columnBreak; - default: - // TODO: handle unknown document matchers - } - }); - - return lop.rules.firstOf( - "element type", - paragraphOrRun, - table, - bold, - italic, - underline, - strikethrough, - allCaps, - smallCaps, - highlight, - commentReference, - breakMatcher - ); - } - - function readHtmlPath(string) { - return parseString(htmlPathRule(), string); - } - - function htmlPathRule() { - var capture = lop.rules.sequence.capture; - var whitespaceRule = lop.rules.tokenOfType("whitespace"); - var freshRule = lop.rules.then( - lop.rules.optional( - lop.rules.sequence( - lop.rules.tokenOfType("colon"), - lop.rules.token("identifier", "fresh") - ) - ), - function (option) { - return option - .map(function () { - return true; - }) - .valueOrElse(false); - } - ); - - var separatorRule = lop.rules.then( - lop.rules.optional( - lop.rules - .sequence( - lop.rules.tokenOfType("colon"), - lop.rules.token("identifier", "separator"), - lop.rules.tokenOfType("open-paren"), - capture(stringRule), - lop.rules.tokenOfType("close-paren") - ) - .head() - ), - function (option) { - return option.valueOrElse(""); - } - ); - - var tagNamesRule = lop.rules.oneOrMoreWithSeparator( - identifierRule, - lop.rules.tokenOfType("choice") - ); - - var styleElementRule = lop.rules - .sequence( - capture(tagNamesRule), - capture(lop.rules.zeroOrMore(attributeOrClassRule)), - capture(freshRule), - capture(separatorRule) - ) - .map(function (tagName, attributesList, fresh, separator) { - var attributes = {}; - var options = {}; - attributesList.forEach(function (attribute) { - if (attribute.append && attributes[attribute.name]) { - attributes[attribute.name] += " " + attribute.value; - } else { - attributes[attribute.name] = attribute.value; - } - }); - if (fresh) { - options.fresh = true; - } - if (separator) { - options.separator = separator; - } - return htmlPaths.element(tagName, attributes, options); - }); - - return lop.rules.firstOf( - "html path", - lop.rules.then(lop.rules.tokenOfType("bang"), function () { - return htmlPaths.ignore; - }), - lop.rules.then( - lop.rules.zeroOrMoreWithSeparator( - styleElementRule, - lop.rules.sequence(whitespaceRule, lop.rules.tokenOfType("gt"), whitespaceRule) - ), - htmlPaths.elements - ) - ); - } - - var identifierRule = lop.rules.then(lop.rules.tokenOfType("identifier"), decodeEscapeSequences); - var integerRule = lop.rules.tokenOfType("integer"); - - var stringRule = lop.rules.then(lop.rules.tokenOfType("string"), decodeEscapeSequences); - - var escapeSequences = { - n: "\n", - r: "\r", - t: "\t" - }; - - function decodeEscapeSequences(value) { - return value.replace(/\\(.)/g, function (match, code) { - return escapeSequences[code] || code; - }); - } - - var attributeRule = lop.rules - .sequence( - lop.rules.tokenOfType("open-square-bracket"), - lop.rules.sequence.cut(), - lop.rules.sequence.capture(identifierRule), - lop.rules.tokenOfType("equals"), - lop.rules.sequence.capture(stringRule), - lop.rules.tokenOfType("close-square-bracket") - ) - .map(function (name, value) { - return { name: name, value: value, append: false }; - }); - - var classRule = lop.rules - .sequence( - lop.rules.tokenOfType("dot"), - lop.rules.sequence.cut(), - lop.rules.sequence.capture(identifierRule) - ) - .map(function (className) { - return { name: "class", value: className, append: true }; - }); - - var attributeOrClassRule = lop.rules.firstOf("attribute or class", attributeRule, classRule); - - function parseString(rule, string) { - var tokens = tokenise(string); - var parser = lop.Parser(); - var parseResult = parser.parseTokens(rule, tokens); - if (parseResult.isSuccess()) { - return results.success(parseResult.value()); - } else { - return new results.Result(null, [results.warning(describeFailure(string, parseResult))]); - } - } - - function describeFailure(input, parseResult) { - return ( - "Did not understand this style mapping, so ignored it: " + - input + - "\n" + - parseResult.errors().map(describeError).join("\n") - ); - } - - function describeError(error) { - return ( - "Error was at character number " + - error.characterNumber() + - ": " + - "Expected " + - error.expected + - " but got " + - error.actual - ); - } - - var styleRule = createStyleRule(); - }, - { - "./results": 25, - "./styles/document-matchers": 27, - "./styles/html-paths": 28, - "./styles/parser/tokeniser": 29, - lop: 54, - underscore: 67 - } - ], - 27: [ - function (require, module, exports) { - exports.paragraph = paragraph; - exports.run = run; - exports.table = table; - exports.bold = new Matcher("bold"); - exports.italic = new Matcher("italic"); - exports.underline = new Matcher("underline"); - exports.strikethrough = new Matcher("strikethrough"); - exports.allCaps = new Matcher("allCaps"); - exports.smallCaps = new Matcher("smallCaps"); - exports.highlight = highlight; - exports.commentReference = new Matcher("commentReference"); - exports.lineBreak = new BreakMatcher({ breakType: "line" }); - exports.pageBreak = new BreakMatcher({ breakType: "page" }); - exports.columnBreak = new BreakMatcher({ breakType: "column" }); - exports.equalTo = equalTo; - exports.startsWith = startsWith; - - function paragraph(options) { - return new Matcher("paragraph", options); - } - - function run(options) { - return new Matcher("run", options); - } - - function table(options) { - return new Matcher("table", options); - } - - function highlight(options) { - return new HighlightMatcher(options); - } - - function Matcher(elementType, options) { - options = options || {}; - this._elementType = elementType; - this._styleId = options.styleId; - this._styleName = options.styleName; - if (options.list) { - this._listIndex = options.list.levelIndex; - this._listIsOrdered = options.list.isOrdered; - } - } - - Matcher.prototype.matches = function (element) { - return ( - element.type === this._elementType && - (this._styleId === undefined || element.styleId === this._styleId) && - (this._styleName === undefined || - (element.styleName && - this._styleName.operator(this._styleName.operand, element.styleName))) && - (this._listIndex === undefined || isList(element, this._listIndex, this._listIsOrdered)) && - (this._breakType === undefined || this._breakType === element.breakType) - ); - }; - - function HighlightMatcher(options) { - options = options || {}; - this._color = options.color; - } - - HighlightMatcher.prototype.matches = function (element) { - return ( - element.type === "highlight" && (this._color === undefined || element.color === this._color) - ); - }; - - function BreakMatcher(options) { - options = options || {}; - this._breakType = options.breakType; - } - - BreakMatcher.prototype.matches = function (element) { - return ( - element.type === "break" && - (this._breakType === undefined || element.breakType === this._breakType) - ); - }; - - function isList(element, levelIndex, isOrdered) { - return ( - element.numbering && - element.numbering.level == levelIndex && - element.numbering.isOrdered == isOrdered - ); - } - - function equalTo(value) { - return { - operator: operatorEqualTo, - operand: value - }; - } - - function startsWith(value) { - return { - operator: operatorStartsWith, - operand: value - }; - } - - function operatorEqualTo(first, second) { - return first.toUpperCase() === second.toUpperCase(); - } - - function operatorStartsWith(first, second) { - return second.toUpperCase().indexOf(first.toUpperCase()) === 0; - } - }, - {} - ], - 28: [ - function (require, module, exports) { - var _ = require("underscore"); - - var html = require("../html"); - - exports.topLevelElement = topLevelElement; - exports.elements = elements; - exports.element = element; - - function topLevelElement(tagName, attributes) { - return elements([element(tagName, attributes, { fresh: true })]); - } - - function elements(elementStyles) { - return new HtmlPath( - elementStyles.map(function (elementStyle) { - if (_.isString(elementStyle)) { - return element(elementStyle); - } else { - return elementStyle; - } - }) - ); - } - - function HtmlPath(elements) { - this._elements = elements; - } - - HtmlPath.prototype.wrap = function wrap(children) { - var result = children(); - for (var index = this._elements.length - 1; index >= 0; index--) { - result = this._elements[index].wrapNodes(result); - } - return result; - }; - - function element(tagName, attributes, options) { - options = options || {}; - return new Element(tagName, attributes, options); - } - - function Element(tagName, attributes, options) { - var tagNames = {}; - if (_.isArray(tagName)) { - tagName.forEach(function (tagName) { - tagNames[tagName] = true; - }); - tagName = tagName[0]; - } else { - tagNames[tagName] = true; - } - - this.tagName = tagName; - this.tagNames = tagNames; - this.attributes = attributes || {}; - this.fresh = options.fresh; - this.separator = options.separator; - } - - Element.prototype.matchesElement = function (element) { - return ( - this.tagNames[element.tagName] && _.isEqual(this.attributes || {}, element.attributes || {}) - ); - }; - - Element.prototype.wrap = function wrap(generateNodes) { - return this.wrapNodes(generateNodes()); - }; - - Element.prototype.wrapNodes = function wrapNodes(nodes) { - return [html.elementWithTag(this, nodes)]; - }; - - exports.empty = elements([]); - exports.ignore = { - wrap: function () { - return []; - } - }; - }, - { "../html": 18, underscore: 67 } - ], - 29: [ - function (require, module, exports) { - var lop = require("lop"); - var RegexTokeniser = lop.RegexTokeniser; - - exports.tokenise = tokenise; - - var stringPrefix = "'((?:\\\\.|[^'])*)"; - - function tokenise(string) { - var identifierCharacter = "(?:[a-zA-Z\\-_]|\\\\.)"; - var tokeniser = new RegexTokeniser([ - { - name: "identifier", - regex: new RegExp("(" + identifierCharacter + "(?:" + identifierCharacter + "|[0-9])*)") - }, - { name: "dot", regex: /\./ }, - { name: "colon", regex: /:/ }, - { name: "gt", regex: />/ }, - { name: "whitespace", regex: /\s+/ }, - { name: "arrow", regex: /=>/ }, - { name: "equals", regex: /=/ }, - { name: "startsWith", regex: /\^=/ }, - { name: "open-paren", regex: /\(/ }, - { name: "close-paren", regex: /\)/ }, - { name: "open-square-bracket", regex: /\[/ }, - { name: "close-square-bracket", regex: /\]/ }, - { name: "string", regex: new RegExp(stringPrefix + "'") }, - { name: "unterminated-string", regex: new RegExp(stringPrefix) }, - { name: "integer", regex: /([0-9]+)/ }, - { name: "choice", regex: /\|/ }, - { name: "bang", regex: /(!)/ } - ]); - return tokeniser.tokenise(string); - } - }, - { lop: 54 } - ], - 30: [ - function (require, module, exports) { - var _ = require("underscore"); - - exports.paragraph = paragraph; - exports.run = run; - exports._elements = elements; - exports.getDescendantsOfType = getDescendantsOfType; - exports.getDescendants = getDescendants; - - function paragraph(transform) { - return elementsOfType("paragraph", transform); - } - - function run(transform) { - return elementsOfType("run", transform); - } - - function elementsOfType(elementType, transform) { - return elements(function (element) { - if (element.type === elementType) { - return transform(element); - } else { - return element; - } - }); - } - - function elements(transform) { - return function transformElement(element) { - if (element.children) { - var children = _.map(element.children, transformElement); - element = _.extend(element, { children: children }); - } - return transform(element); - }; - } - - function getDescendantsOfType(element, type) { - return getDescendants(element).filter(function (descendant) { - return descendant.type === type; - }); - } - - function getDescendants(element) { - var descendants = []; - - visitDescendants(element, function (descendant) { - descendants.push(descendant); - }); - - return descendants; - } - - function visitDescendants(element, visit) { - if (element.children) { - element.children.forEach(function (child) { - visitDescendants(child, visit); - visit(child); - }); - } - } - }, - { underscore: 67 } - ], - 31: [ - function (require, module, exports) { - var htmlPaths = require("./styles/html-paths"); - var Html = require("./html"); - - exports.element = element; - - function element(name) { - return function (html) { - return Html.elementWithTag(htmlPaths.element(name), [html]); - }; - } - }, - { "./html": 18, "./styles/html-paths": 28 } - ], - 32: [ - function (require, module, exports) { - var _ = require("underscore"); - - exports.writer = writer; - - function writer(options) { - options = options || {}; - if (options.prettyPrint) { - return prettyWriter(); - } else { - return simpleWriter(); - } - } - - var indentedElements = { - div: true, - p: true, - ul: true, - li: true - }; - - function prettyWriter() { - var indentationLevel = 0; - var indentation = " "; - var stack = []; - var start = true; - var inText = false; - - var writer = simpleWriter(); - - function open(tagName, attributes) { - if (indentedElements[tagName]) { - indent(); - } - stack.push(tagName); - writer.open(tagName, attributes); - if (indentedElements[tagName]) { - indentationLevel++; - } - start = false; - } - - function close(tagName) { - if (indentedElements[tagName]) { - indentationLevel--; - indent(); - } - stack.pop(); - writer.close(tagName); - } - - function text(value) { - startText(); - var text = isInPre() ? value : value.replace("\n", "\n" + indentation); - writer.text(text); - } - - function selfClosing(tagName, attributes) { - indent(); - writer.selfClosing(tagName, attributes); - } - - function insideIndentedElement() { - return stack.length === 0 || indentedElements[stack[stack.length - 1]]; - } - - function startText() { - if (!inText) { - indent(); - inText = true; - } - } - - function indent() { - inText = false; - if (!start && insideIndentedElement() && !isInPre()) { - writer._append("\n"); - for (var i = 0; i < indentationLevel; i++) { - writer._append(indentation); - } - } - } - - function isInPre() { - return _.some(stack, function (tagName) { - return tagName === "pre"; - }); - } - - return { - asString: writer.asString, - open: open, - close: close, - text: text, - selfClosing: selfClosing - }; - } - - function simpleWriter() { - var fragments = []; - - function open(tagName, attributes) { - var attributeString = generateAttributeString(attributes); - fragments.push("<" + tagName + attributeString + ">"); - } - - function close(tagName) { - fragments.push(""); - } - - function selfClosing(tagName, attributes) { - var attributeString = generateAttributeString(attributes); - fragments.push("<" + tagName + attributeString + " />"); - } - - function generateAttributeString(attributes) { - return _.map(attributes, function (value, key) { - return " " + key + '="' + escapeHtmlAttribute(value) + '"'; - }).join(""); - } - - function text(value) { - fragments.push(escapeHtmlText(value)); - } - - function append(html) { - fragments.push(html); - } - - function asString() { - return fragments.join(""); - } - - return { - asString: asString, - open: open, - close: close, - text: text, - selfClosing: selfClosing, - _append: append - }; - } - - function escapeHtmlText(value) { - return value.replace(/&/g, "&").replace(//g, ">"); - } - - function escapeHtmlAttribute(value) { - return value - .replace(/&/g, "&") - .replace(/"/g, """) - .replace(//g, ">"); - } - }, - { underscore: 67 } - ], - 33: [ - function (require, module, exports) { - var htmlWriter = require("./html-writer"); - var markdownWriter = require("./markdown-writer"); - - exports.writer = writer; - - function writer(options) { - options = options || {}; - if (options.outputFormat === "markdown") { - return markdownWriter.writer(); - } else { - return htmlWriter.writer(options); - } - } - }, - { "./html-writer": 32, "./markdown-writer": 34 } - ], - 34: [ - function (require, module, exports) { - var _ = require("underscore"); - - function symmetricMarkdownElement(end) { - return markdownElement(end, end); - } - - function markdownElement(start, end) { - return function () { - return { start: start, end: end }; - }; - } - - function markdownLink(attributes) { - var href = attributes.href || ""; - if (href) { - return { - start: "[", - end: "](" + href + ")", - anchorPosition: "before" - }; - } else { - return {}; - } - } - - function markdownImage(attributes) { - var src = attributes.src || ""; - var altText = attributes.alt || ""; - if (src || altText) { - return { start: "![" + altText + "](" + src + ")" }; - } else { - return {}; - } - } - - function markdownList(options) { - return function (attributes, list) { - return { - start: list ? "\n" : "", - end: list ? "" : "\n", - list: { - isOrdered: options.isOrdered, - indent: list ? list.indent + 1 : 0, - count: 0 - } - }; - }; - } - - function markdownListItem(attributes, list, listItem) { - list = list || { indent: 0, isOrdered: false, count: 0 }; - list.count++; - listItem.hasClosed = false; - - var bullet = list.isOrdered ? list.count + "." : "-"; - var start = repeatString("\t", list.indent) + bullet + " "; - - return { - start: start, - end: function () { - if (!listItem.hasClosed) { - listItem.hasClosed = true; - return "\n"; - } - } - }; - } - - var htmlToMarkdown = { - p: markdownElement("", "\n\n"), - br: markdownElement("", " \n"), - ul: markdownList({ isOrdered: false }), - ol: markdownList({ isOrdered: true }), - li: markdownListItem, - strong: symmetricMarkdownElement("__"), - em: symmetricMarkdownElement("*"), - a: markdownLink, - img: markdownImage - }; - - (function () { - for (var i = 1; i <= 6; i++) { - htmlToMarkdown["h" + i] = markdownElement(repeatString("#", i) + " ", "\n\n"); - } - })(); - - function repeatString(value, count) { - return new Array(count + 1).join(value); - } - - function markdownWriter() { - var fragments = []; - var elementStack = []; - var list = null; - var listItem = {}; - - function open(tagName, attributes) { - attributes = attributes || {}; - - var createElement = - htmlToMarkdown[tagName] || - function () { - return {}; - }; - var element = createElement(attributes, list, listItem); - elementStack.push({ end: element.end, list: list }); - - if (element.list) { - list = element.list; - } - - var anchorBeforeStart = element.anchorPosition === "before"; - if (anchorBeforeStart) { - writeAnchor(attributes); - } - - fragments.push(element.start || ""); - if (!anchorBeforeStart) { - writeAnchor(attributes); - } - } - - function writeAnchor(attributes) { - if (attributes.id) { - fragments.push(''); - } - } - - function close(tagName) { - var element = elementStack.pop(); - list = element.list; - var end = _.isFunction(element.end) ? element.end() : element.end; - fragments.push(end || ""); - } - - function selfClosing(tagName, attributes) { - open(tagName, attributes); - close(tagName); - } - - function text(value) { - fragments.push(escapeMarkdown(value)); - } - - function asString() { - return fragments.join(""); - } - - return { - asString: asString, - open: open, - close: close, - text: text, - selfClosing: selfClosing - }; - } - - exports.writer = markdownWriter; - - function escapeMarkdown(value) { - return value.replace(/\\/g, "\\\\").replace(/([\`\*_\{\}\[\]\(\)\#\+\-\.\!])/g, "\\$1"); - } - }, - { underscore: 67 } - ], - 35: [ - function (require, module, exports) { - var nodes = require("./nodes"); - - exports.Element = nodes.Element; - exports.element = nodes.element; - exports.emptyElement = nodes.emptyElement; - exports.text = nodes.text; - exports.readString = require("./reader").readString; - exports.writeString = require("./writer").writeString; - }, - { "./nodes": 36, "./reader": 37, "./writer": 38 } - ], - 36: [ - function (require, module, exports) { - var _ = require("underscore"); - - exports.Element = Element; - exports.element = function (name, attributes, children) { - return new Element(name, attributes, children); - }; - exports.text = function (value) { - return { - type: "text", - value: value - }; - }; - - var emptyElement = (exports.emptyElement = { - first: function () { - return null; - }, - firstOrEmpty: function () { - return emptyElement; - }, - attributes: {}, - children: [] - }); - - function Element(name, attributes, children) { - this.type = "element"; - this.name = name; - this.attributes = attributes || {}; - this.children = children || []; - } - - Element.prototype.first = function (name) { - return _.find(this.children, function (child) { - return child.name === name; - }); - }; - - Element.prototype.firstOrEmpty = function (name) { - return this.first(name) || emptyElement; - }; - - Element.prototype.getElementsByTagName = function (name) { - var elements = _.filter(this.children, function (child) { - return child.name === name; - }); - return toElementList(elements); - }; - - Element.prototype.text = function () { - if (this.children.length === 0) { - return ""; - } else if (this.children.length !== 1 || this.children[0].type !== "text") { - throw new Error("Not implemented"); - } - return this.children[0].value; - }; - - var elementListPrototype = { - getElementsByTagName: function (name) { - return toElementList( - _.flatten( - this.map(function (element) { - return element.getElementsByTagName(name); - }, true) - ) - ); - } - }; - - function toElementList(array) { - return _.extend(array, elementListPrototype); - } - }, - { underscore: 67 } - ], - 37: [ - function (require, module, exports) { - var promises = require("../promises"); - var _ = require("underscore"); - - var xmldom = require("./xmldom"); - var nodes = require("./nodes"); - var Element = nodes.Element; - - exports.readString = readString; - - var Node = xmldom.Node; - - function readString(xmlString, namespaceMap) { - namespaceMap = namespaceMap || {}; - - try { - var document = xmldom.parseFromString(xmlString, "text/xml"); - } catch (error) { - return promises.reject(error); - } - - if (document.documentElement.tagName === "parsererror") { - return promises.resolve(new Error(document.documentElement.textContent)); - } - - function convertNode(node) { - switch (node.nodeType) { - case Node.ELEMENT_NODE: - return convertElement(node); - case Node.TEXT_NODE: - return nodes.text(node.nodeValue); - } - } - - function convertElement(element) { - var convertedName = convertName(element); - - var convertedChildren = []; - _.forEach(element.childNodes, function (childNode) { - var convertedNode = convertNode(childNode); - if (convertedNode) { - convertedChildren.push(convertedNode); - } - }); - - var convertedAttributes = {}; - _.forEach(element.attributes, function (attribute) { - convertedAttributes[convertName(attribute)] = attribute.value; - }); - - return new Element(convertedName, convertedAttributes, convertedChildren); - } - - function convertName(node) { - if (node.namespaceURI) { - var mappedPrefix = namespaceMap[node.namespaceURI]; - var prefix; - if (mappedPrefix) { - prefix = mappedPrefix + ":"; - } else { - prefix = "{" + node.namespaceURI + "}"; - } - return prefix + node.localName; - } else { - return node.localName; - } - } - - return promises.resolve(convertNode(document.documentElement)); - } - }, - { "../promises": 23, "./nodes": 36, "./xmldom": 39, underscore: 67 } - ], - 38: [ - function (require, module, exports) { - var _ = require("underscore"); - var xmlbuilder = require("xmlbuilder"); - - exports.writeString = writeString; - - function writeString(root, namespaces) { - var uriToPrefix = _.invert(namespaces); - - var nodeWriters = { - element: writeElement, - text: writeTextNode - }; - - function writeNode(builder, node) { - return nodeWriters[node.type](builder, node); - } - - function writeElement(builder, element) { - var elementBuilder = builder.element(mapElementName(element.name), element.attributes); - element.children.forEach(function (child) { - writeNode(elementBuilder, child); - }); - } - - function mapElementName(name) { - var longFormMatch = /^\{(.*)\}(.*)$/.exec(name); - if (longFormMatch) { - var prefix = uriToPrefix[longFormMatch[1]]; - return prefix + (prefix === "" ? "" : ":") + longFormMatch[2]; - } else { - return name; - } - } - - function writeDocument(root) { - var builder = xmlbuilder.create(mapElementName(root.name), { - version: "1.0", - encoding: "UTF-8", - standalone: true - }); - - _.forEach(namespaces, function (uri, prefix) { - var key = "xmlns" + (prefix === "" ? "" : ":" + prefix); - builder.attribute(key, uri); - }); - - root.children.forEach(function (child) { - writeNode(builder, child); - }); - return builder.end(); - } - - return writeDocument(root); - } - - function writeTextNode(builder, node) { - builder.text(node.value); - } - }, - { underscore: 67, xmlbuilder: 89 } - ], - 39: [ - function (require, module, exports) { - var xmldom = require("@xmldom/xmldom"); - var dom = require("@xmldom/xmldom/lib/dom"); - - function parseFromString(string) { - var error = null; - - var domParser = new xmldom.DOMParser({ - errorHandler: function (level, message) { - error = { level: level, message: message }; - } - }); - - var document = domParser.parseFromString(string); - - if (error === null) { - return document; - } else { - throw new Error(error.level + ": " + error.message); - } - } - - exports.parseFromString = parseFromString; - exports.Node = dom.Node; - }, - { "@xmldom/xmldom": 45, "@xmldom/xmldom/lib/dom": 43 } - ], - 40: [ - function (require, module, exports) { - var base64js = require("base64-js"); - var JSZip = require("jszip"); - - exports.openArrayBuffer = openArrayBuffer; - exports.splitPath = splitPath; - exports.joinPath = joinPath; - - function openArrayBuffer(arrayBuffer) { - return JSZip.loadAsync(arrayBuffer).then(function (zipFile) { - function exists(name) { - return zipFile.file(name) !== null; - } - - function read(name, encoding) { - return zipFile - .file(name) - .async("uint8array") - .then(function (array) { - if (encoding === "base64") { - return base64js.fromByteArray(array); - } else if (encoding) { - var decoder = new TextDecoder(encoding); - return decoder.decode(array); - } else { - return array; - } - }); - } - - function write(name, contents) { - zipFile.file(name, contents); - } - - function toArrayBuffer() { - return zipFile.generateAsync({ type: "arraybuffer" }); - } - - return { - exists: exists, - read: read, - write: write, - toArrayBuffer: toArrayBuffer - }; - }); - } - - function splitPath(path) { - var lastIndex = path.lastIndexOf("/"); - if (lastIndex === -1) { - return { dirname: "", basename: path }; - } else { - return { - dirname: path.substring(0, lastIndex), - basename: path.substring(lastIndex + 1) - }; - } - } - - function joinPath() { - var nonEmptyPaths = Array.prototype.filter.call(arguments, function (path) { - return path; - }); - - var relevantPaths = []; - - nonEmptyPaths.forEach(function (path) { - if (/^\//.test(path)) { - relevantPaths = [path]; - } else { - relevantPaths.push(path); - } - }); - - return relevantPaths.join("/"); - } - }, - { "base64-js": 47, jszip: 53 } - ], - 41: [ - function (require, module, exports) { - "use strict"; - - /** - * Ponyfill for `Array.prototype.find` which is only available in ES6 runtimes. - * - * Works with anything that has a `length` property and index access properties, including NodeList. - * - * @template {unknown} T - * @param {Array | ({length:number, [number]: T})} list - * @param {function (item: T, index: number, list:Array | ({length:number, [number]: T})):boolean} predicate - * @param {Partial>?} ac `Array.prototype` by default, - * allows injecting a custom implementation in tests - * @returns {T | undefined} - * - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find - * @see https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.find - */ - function find(list, predicate, ac) { - if (ac === undefined) { - ac = Array.prototype; - } - if (list && typeof ac.find === "function") { - return ac.find.call(list, predicate); - } - for (var i = 0; i < list.length; i++) { - if (Object.prototype.hasOwnProperty.call(list, i)) { - var item = list[i]; - if (predicate.call(undefined, item, i, list)) { - return item; - } - } - } - } - - /** - * "Shallow freezes" an object to render it immutable. - * Uses `Object.freeze` if available, - * otherwise the immutability is only in the type. - * - * Is used to create "enum like" objects. - * - * @template T - * @param {T} object the object to freeze - * @param {Pick = Object} oc `Object` by default, - * allows to inject custom object constructor for tests - * @returns {Readonly} - * - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze - */ - function freeze(object, oc) { - if (oc === undefined) { - oc = Object; - } - return oc && typeof oc.freeze === "function" ? oc.freeze(object) : object; - } - - /** - * Since we can not rely on `Object.assign` we provide a simplified version - * that is sufficient for our needs. - * - * @param {Object} target - * @param {Object | null | undefined} source - * - * @returns {Object} target - * @throws TypeError if target is not an object - * - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign - * @see https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.assign - */ - function assign(target, source) { - if (target === null || typeof target !== "object") { - throw new TypeError("target is not an object"); - } - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - return target; - } - - /** - * All mime types that are allowed as input to `DOMParser.parseFromString` - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#Argument02 MDN - * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#domparsersupportedtype WHATWG HTML Spec - * @see DOMParser.prototype.parseFromString - */ - var MIME_TYPE = freeze({ - /** - * `text/html`, the only mime type that triggers treating an XML document as HTML. - * - * @see DOMParser.SupportedType.isHTML - * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration - * @see https://en.wikipedia.org/wiki/HTML Wikipedia - * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN - * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring WHATWG HTML Spec - */ - HTML: "text/html", - - /** - * Helper method to check a mime type if it indicates an HTML document - * - * @param {string} [value] - * @returns {boolean} - * - * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration - * @see https://en.wikipedia.org/wiki/HTML Wikipedia - * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN - * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring */ - isHTML: function (value) { - return value === MIME_TYPE.HTML; - }, - - /** - * `application/xml`, the standard mime type for XML documents. - * - * @see https://www.iana.org/assignments/media-types/application/xml IANA MimeType registration - * @see https://tools.ietf.org/html/rfc7303#section-9.1 RFC 7303 - * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia - */ - XML_APPLICATION: "application/xml", - - /** - * `text/html`, an alias for `application/xml`. - * - * @see https://tools.ietf.org/html/rfc7303#section-9.2 RFC 7303 - * @see https://www.iana.org/assignments/media-types/text/xml IANA MimeType registration - * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia - */ - XML_TEXT: "text/xml", - - /** - * `application/xhtml+xml`, indicates an XML document that has the default HTML namespace, - * but is parsed as an XML document. - * - * @see https://www.iana.org/assignments/media-types/application/xhtml+xml IANA MimeType registration - * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument WHATWG DOM Spec - * @see https://en.wikipedia.org/wiki/XHTML Wikipedia - */ - XML_XHTML_APPLICATION: "application/xhtml+xml", - - /** - * `image/svg+xml`, - * - * @see https://www.iana.org/assignments/media-types/image/svg+xml IANA MimeType registration - * @see https://www.w3.org/TR/SVG11/ W3C SVG 1.1 - * @see https://en.wikipedia.org/wiki/Scalable_Vector_Graphics Wikipedia - */ - XML_SVG_IMAGE: "image/svg+xml" - }); - - /** - * Namespaces that are used in this code base. - * - * @see http://www.w3.org/TR/REC-xml-names - */ - var NAMESPACE = freeze({ - /** - * The XHTML namespace. - * - * @see http://www.w3.org/1999/xhtml - */ - HTML: "http://www.w3.org/1999/xhtml", - - /** - * Checks if `uri` equals `NAMESPACE.HTML`. - * - * @param {string} [uri] - * - * @see NAMESPACE.HTML - */ - isHTML: function (uri) { - return uri === NAMESPACE.HTML; - }, - - /** - * The SVG namespace. - * - * @see http://www.w3.org/2000/svg - */ - SVG: "http://www.w3.org/2000/svg", - - /** - * The `xml:` namespace. - * - * @see http://www.w3.org/XML/1998/namespace - */ - XML: "http://www.w3.org/XML/1998/namespace", - - /** - * The `xmlns:` namespace - * - * @see https://www.w3.org/2000/xmlns/ - */ - XMLNS: "http://www.w3.org/2000/xmlns/" - }); - - exports.assign = assign; - exports.find = find; - exports.freeze = freeze; - exports.MIME_TYPE = MIME_TYPE; - exports.NAMESPACE = NAMESPACE; - }, - {} - ], - 42: [ - function (require, module, exports) { - var conventions = require("./conventions"); - var dom = require("./dom"); - var entities = require("./entities"); - var sax = require("./sax"); - - var DOMImplementation = dom.DOMImplementation; - - var NAMESPACE = conventions.NAMESPACE; - - var ParseError = sax.ParseError; - var XMLReader = sax.XMLReader; - - /** - * Normalizes line ending according to https://www.w3.org/TR/xml11/#sec-line-ends: - * - * > XML parsed entities are often stored in computer files which, - * > for editing convenience, are organized into lines. - * > These lines are typically separated by some combination - * > of the characters CARRIAGE RETURN (#xD) and LINE FEED (#xA). - * > - * > To simplify the tasks of applications, the XML processor must behave - * > as if it normalized all line breaks in external parsed entities (including the document entity) - * > on input, before parsing, by translating all of the following to a single #xA character: - * > - * > 1. the two-character sequence #xD #xA - * > 2. the two-character sequence #xD #x85 - * > 3. the single character #x85 - * > 4. the single character #x2028 - * > 5. any #xD character that is not immediately followed by #xA or #x85. - * - * @param {string} input - * @returns {string} - */ - function normalizeLineEndings(input) { - return input.replace(/\r[\n\u0085]/g, "\n").replace(/[\r\u0085\u2028]/g, "\n"); - } - - /** - * @typedef Locator - * @property {number} [columnNumber] - * @property {number} [lineNumber] - */ - - /** - * @typedef DOMParserOptions - * @property {DOMHandler} [domBuilder] - * @property {Function} [errorHandler] - * @property {(string) => string} [normalizeLineEndings] used to replace line endings before parsing - * defaults to `normalizeLineEndings` - * @property {Locator} [locator] - * @property {Record} [xmlns] - * - * @see normalizeLineEndings - */ - - /** - * The DOMParser interface provides the ability to parse XML or HTML source code - * from a string into a DOM `Document`. - * - * _xmldom is different from the spec in that it allows an `options` parameter, - * to override the default behavior._ - * - * @param {DOMParserOptions} [options] - * @constructor - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser - * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-parsing-and-serialization - */ - function DOMParser(options) { - this.options = options || { locator: {} }; - } - - DOMParser.prototype.parseFromString = function (source, mimeType) { - var options = this.options; - var sax = new XMLReader(); - var domBuilder = options.domBuilder || new DOMHandler(); //contentHandler and LexicalHandler - var errorHandler = options.errorHandler; - var locator = options.locator; - var defaultNSMap = options.xmlns || {}; - var isHTML = /\/x?html?$/.test(mimeType); //mimeType.toLowerCase().indexOf('html') > -1; - var entityMap = isHTML ? entities.HTML_ENTITIES : entities.XML_ENTITIES; - if (locator) { - domBuilder.setDocumentLocator(locator); - } - - sax.errorHandler = buildErrorHandler(errorHandler, domBuilder, locator); - sax.domBuilder = options.domBuilder || domBuilder; - if (isHTML) { - defaultNSMap[""] = NAMESPACE.HTML; - } - defaultNSMap.xml = defaultNSMap.xml || NAMESPACE.XML; - var normalize = options.normalizeLineEndings || normalizeLineEndings; - if (source && typeof source === "string") { - sax.parse(normalize(source), defaultNSMap, entityMap); - } else { - sax.errorHandler.error("invalid doc source"); - } - return domBuilder.doc; - }; - function buildErrorHandler(errorImpl, domBuilder, locator) { - if (!errorImpl) { - if (domBuilder instanceof DOMHandler) { - return domBuilder; - } - errorImpl = domBuilder; - } - var errorHandler = {}; - var isCallback = errorImpl instanceof Function; - locator = locator || {}; - function build(key) { - var fn = errorImpl[key]; - if (!fn && isCallback) { - fn = - errorImpl.length == 2 - ? function (msg) { - errorImpl(key, msg); - } - : errorImpl; - } - errorHandler[key] = - (fn && - function (msg) { - fn("[xmldom " + key + "]\t" + msg + _locator(locator)); - }) || - function () {}; - } - build("warning"); - build("error"); - build("fatalError"); - return errorHandler; - } - - //console.log('#\n\n\n\n\n\n\n####') - /** - * +ContentHandler+ErrorHandler - * +LexicalHandler+EntityResolver2 - * -DeclHandler-DTDHandler - * - * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler - * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2 - * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html - */ - function DOMHandler() { - this.cdata = false; - } - function position(locator, node) { - node.lineNumber = locator.lineNumber; - node.columnNumber = locator.columnNumber; - } - /** - * @see org.xml.sax.ContentHandler#startDocument - * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html - */ - DOMHandler.prototype = { - startDocument: function () { - this.doc = new DOMImplementation().createDocument(null, null, null); - if (this.locator) { - this.doc.documentURI = this.locator.systemId; - } - }, - startElement: function (namespaceURI, localName, qName, attrs) { - var doc = this.doc; - var el = doc.createElementNS(namespaceURI, qName || localName); - var len = attrs.length; - appendElement(this, el); - this.currentElement = el; - - this.locator && position(this.locator, el); - for (var i = 0; i < len; i++) { - var namespaceURI = attrs.getURI(i); - var value = attrs.getValue(i); - var qName = attrs.getQName(i); - var attr = doc.createAttributeNS(namespaceURI, qName); - this.locator && position(attrs.getLocator(i), attr); - attr.value = attr.nodeValue = value; - el.setAttributeNode(attr); - } - }, - endElement: function (namespaceURI, localName, qName) { - var current = this.currentElement; - var tagName = current.tagName; - this.currentElement = current.parentNode; - }, - startPrefixMapping: function (prefix, uri) {}, - endPrefixMapping: function (prefix) {}, - processingInstruction: function (target, data) { - var ins = this.doc.createProcessingInstruction(target, data); - this.locator && position(this.locator, ins); - appendElement(this, ins); - }, - ignorableWhitespace: function (ch, start, length) {}, - characters: function (chars, start, length) { - chars = _toString.apply(this, arguments); - //console.log(chars) - if (chars) { - if (this.cdata) { - var charNode = this.doc.createCDATASection(chars); - } else { - var charNode = this.doc.createTextNode(chars); - } - if (this.currentElement) { - this.currentElement.appendChild(charNode); - } else if (/^\s*$/.test(chars)) { - this.doc.appendChild(charNode); - //process xml - } - this.locator && position(this.locator, charNode); - } - }, - skippedEntity: function (name) {}, - endDocument: function () { - this.doc.normalize(); - }, - setDocumentLocator: function (locator) { - if ((this.locator = locator)) { - // && !('lineNumber' in locator)){ - locator.lineNumber = 0; - } - }, - //LexicalHandler - comment: function (chars, start, length) { - chars = _toString.apply(this, arguments); - var comm = this.doc.createComment(chars); - this.locator && position(this.locator, comm); - appendElement(this, comm); - }, - - startCDATA: function () { - //used in characters() methods - this.cdata = true; - }, - endCDATA: function () { - this.cdata = false; - }, - - startDTD: function (name, publicId, systemId) { - var impl = this.doc.implementation; - if (impl && impl.createDocumentType) { - var dt = impl.createDocumentType(name, publicId, systemId); - this.locator && position(this.locator, dt); - appendElement(this, dt); - this.doc.doctype = dt; - } - }, - /** - * @see org.xml.sax.ErrorHandler - * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html - */ - warning: function (error) { - console.warn("[xmldom warning]\t" + error, _locator(this.locator)); - }, - error: function (error) { - console.error("[xmldom error]\t" + error, _locator(this.locator)); - }, - fatalError: function (error) { - throw new ParseError(error, this.locator); - } - }; - function _locator(l) { - if (l) { - return ( - "\n@" + (l.systemId || "") + "#[line:" + l.lineNumber + ",col:" + l.columnNumber + "]" - ); - } - } - function _toString(chars, start, length) { - if (typeof chars == "string") { - return chars.substr(start, length); - } else { - //java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)") - if (chars.length >= start + length || start) { - return new java.lang.String(chars, start, length) + ""; - } - return chars; - } - } - - /* - * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html - * used method of org.xml.sax.ext.LexicalHandler: - * #comment(chars, start, length) - * #startCDATA() - * #endCDATA() - * #startDTD(name, publicId, systemId) - * - * - * IGNORED method of org.xml.sax.ext.LexicalHandler: - * #endDTD() - * #startEntity(name) - * #endEntity(name) - * - * - * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html - * IGNORED method of org.xml.sax.ext.DeclHandler - * #attributeDecl(eName, aName, type, mode, value) - * #elementDecl(name, model) - * #externalEntityDecl(name, publicId, systemId) - * #internalEntityDecl(name, value) - * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html - * IGNORED method of org.xml.sax.EntityResolver2 - * #resolveEntity(String name,String publicId,String baseURI,String systemId) - * #resolveEntity(publicId, systemId) - * #getExternalSubset(name, baseURI) - * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html - * IGNORED method of org.xml.sax.DTDHandler - * #notationDecl(name, publicId, systemId) {}; - * #unparsedEntityDecl(name, publicId, systemId, notationName) {}; - */ - "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace( - /\w+/g, - function (key) { - DOMHandler.prototype[key] = function () { - return null; - }; - } - ); - - /* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */ - function appendElement(hander, node) { - if (!hander.currentElement) { - hander.doc.appendChild(node); - } else { - hander.currentElement.appendChild(node); - } - } //appendChild and setAttributeNS are preformance key - - exports.__DOMHandler = DOMHandler; - exports.normalizeLineEndings = normalizeLineEndings; - exports.DOMParser = DOMParser; - }, - { "./conventions": 41, "./dom": 43, "./entities": 44, "./sax": 46 } - ], - 43: [ - function (require, module, exports) { - var conventions = require("./conventions"); - - var find = conventions.find; - var NAMESPACE = conventions.NAMESPACE; - - /** - * A prerequisite for `[].filter`, to drop elements that are empty - * @param {string} input - * @returns {boolean} - */ - function notEmptyString(input) { - return input !== ""; - } - /** - * @see https://infra.spec.whatwg.org/#split-on-ascii-whitespace - * @see https://infra.spec.whatwg.org/#ascii-whitespace - * - * @param {string} input - * @returns {string[]} (can be empty) - */ - function splitOnASCIIWhitespace(input) { - // U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, U+0020 SPACE - return input ? input.split(/[\t\n\f\r ]+/).filter(notEmptyString) : []; - } - - /** - * Adds element as a key to current if it is not already present. - * - * @param {Record} current - * @param {string} element - * @returns {Record} - */ - function orderedSetReducer(current, element) { - if (!current.hasOwnProperty(element)) { - current[element] = true; - } - return current; - } - - /** - * @see https://infra.spec.whatwg.org/#ordered-set - * @param {string} input - * @returns {string[]} - */ - function toOrderedSet(input) { - if (!input) return []; - var list = splitOnASCIIWhitespace(input); - return Object.keys(list.reduce(orderedSetReducer, {})); - } - - /** - * Uses `list.indexOf` to implement something like `Array.prototype.includes`, - * which we can not rely on being available. - * - * @param {any[]} list - * @returns {function(any): boolean} - */ - function arrayIncludes(list) { - return function (element) { - return list && list.indexOf(element) !== -1; - }; - } - - function copy(src, dest) { - for (var p in src) { - if (Object.prototype.hasOwnProperty.call(src, p)) { - dest[p] = src[p]; - } - } - } - - /** -^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));? -^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));? - */ - function _extends(Class, Super) { - var pt = Class.prototype; - if (!(pt instanceof Super)) { - function t() {} - t.prototype = Super.prototype; - t = new t(); - copy(pt, t); - Class.prototype = pt = t; - } - if (pt.constructor != Class) { - if (typeof Class != "function") { - console.error("unknown Class:" + Class); - } - pt.constructor = Class; - } - } - - // Node Types - var NodeType = {}; - var ELEMENT_NODE = (NodeType.ELEMENT_NODE = 1); - var ATTRIBUTE_NODE = (NodeType.ATTRIBUTE_NODE = 2); - var TEXT_NODE = (NodeType.TEXT_NODE = 3); - var CDATA_SECTION_NODE = (NodeType.CDATA_SECTION_NODE = 4); - var ENTITY_REFERENCE_NODE = (NodeType.ENTITY_REFERENCE_NODE = 5); - var ENTITY_NODE = (NodeType.ENTITY_NODE = 6); - var PROCESSING_INSTRUCTION_NODE = (NodeType.PROCESSING_INSTRUCTION_NODE = 7); - var COMMENT_NODE = (NodeType.COMMENT_NODE = 8); - var DOCUMENT_NODE = (NodeType.DOCUMENT_NODE = 9); - var DOCUMENT_TYPE_NODE = (NodeType.DOCUMENT_TYPE_NODE = 10); - var DOCUMENT_FRAGMENT_NODE = (NodeType.DOCUMENT_FRAGMENT_NODE = 11); - var NOTATION_NODE = (NodeType.NOTATION_NODE = 12); - - // ExceptionCode - var ExceptionCode = {}; - var ExceptionMessage = {}; - var INDEX_SIZE_ERR = (ExceptionCode.INDEX_SIZE_ERR = - ((ExceptionMessage[1] = "Index size error"), 1)); - var DOMSTRING_SIZE_ERR = (ExceptionCode.DOMSTRING_SIZE_ERR = - ((ExceptionMessage[2] = "DOMString size error"), 2)); - var HIERARCHY_REQUEST_ERR = (ExceptionCode.HIERARCHY_REQUEST_ERR = - ((ExceptionMessage[3] = "Hierarchy request error"), 3)); - var WRONG_DOCUMENT_ERR = (ExceptionCode.WRONG_DOCUMENT_ERR = - ((ExceptionMessage[4] = "Wrong document"), 4)); - var INVALID_CHARACTER_ERR = (ExceptionCode.INVALID_CHARACTER_ERR = - ((ExceptionMessage[5] = "Invalid character"), 5)); - var NO_DATA_ALLOWED_ERR = (ExceptionCode.NO_DATA_ALLOWED_ERR = - ((ExceptionMessage[6] = "No data allowed"), 6)); - var NO_MODIFICATION_ALLOWED_ERR = (ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = - ((ExceptionMessage[7] = "No modification allowed"), 7)); - var NOT_FOUND_ERR = (ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8] = "Not found"), 8)); - var NOT_SUPPORTED_ERR = (ExceptionCode.NOT_SUPPORTED_ERR = - ((ExceptionMessage[9] = "Not supported"), 9)); - var INUSE_ATTRIBUTE_ERR = (ExceptionCode.INUSE_ATTRIBUTE_ERR = - ((ExceptionMessage[10] = "Attribute in use"), 10)); - //level2 - var INVALID_STATE_ERR = (ExceptionCode.INVALID_STATE_ERR = - ((ExceptionMessage[11] = "Invalid state"), 11)); - var SYNTAX_ERR = (ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12] = "Syntax error"), 12)); - var INVALID_MODIFICATION_ERR = (ExceptionCode.INVALID_MODIFICATION_ERR = - ((ExceptionMessage[13] = "Invalid modification"), 13)); - var NAMESPACE_ERR = (ExceptionCode.NAMESPACE_ERR = - ((ExceptionMessage[14] = "Invalid namespace"), 14)); - var INVALID_ACCESS_ERR = (ExceptionCode.INVALID_ACCESS_ERR = - ((ExceptionMessage[15] = "Invalid access"), 15)); - - /** - * DOM Level 2 - * Object DOMException - * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html - * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html - */ - function DOMException(code, message) { - if (message instanceof Error) { - var error = message; - } else { - error = this; - Error.call(this, ExceptionMessage[code]); - this.message = ExceptionMessage[code]; - if (Error.captureStackTrace) Error.captureStackTrace(this, DOMException); - } - error.code = code; - if (message) this.message = this.message + ": " + message; - return error; - } - DOMException.prototype = Error.prototype; - copy(ExceptionCode, DOMException); - - /** - * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177 - * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live. - * The items in the NodeList are accessible via an integral index, starting from 0. - */ - function NodeList() {} - NodeList.prototype = { - /** - * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive. - * @standard level1 - */ - length: 0, - /** - * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null. - * @standard level1 - * @param index unsigned long - * Index into the collection. - * @return Node - * The node at the indexth position in the NodeList, or null if that is not a valid index. - */ - item: function (index) { - return this[index] || null; - }, - toString: function (isHTML, nodeFilter) { - for (var buf = [], i = 0; i < this.length; i++) { - serializeToString(this[i], buf, isHTML, nodeFilter); - } - return buf.join(""); - }, - /** - * @private - * @param {function (Node):boolean} predicate - * @returns {Node[]} - */ - filter: function (predicate) { - return Array.prototype.filter.call(this, predicate); - }, - /** - * @private - * @param {Node} item - * @returns {number} - */ - indexOf: function (item) { - return Array.prototype.indexOf.call(this, item); - } - }; - - function LiveNodeList(node, refresh) { - this._node = node; - this._refresh = refresh; - _updateLiveList(this); - } - function _updateLiveList(list) { - var inc = list._node._inc || list._node.ownerDocument._inc; - if (list._inc != inc) { - var ls = list._refresh(list._node); - //console.log(ls.length) - __set__(list, "length", ls.length); - copy(ls, list); - list._inc = inc; - } - } - LiveNodeList.prototype.item = function (i) { - _updateLiveList(this); - return this[i]; - }; - - _extends(LiveNodeList, NodeList); - - /** - * Objects implementing the NamedNodeMap interface are used - * to represent collections of nodes that can be accessed by name. - * Note that NamedNodeMap does not inherit from NodeList; - * NamedNodeMaps are not maintained in any particular order. - * Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, - * but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, - * and does not imply that the DOM specifies an order to these Nodes. - * NamedNodeMap objects in the DOM are live. - * used for attributes or DocumentType entities - */ - function NamedNodeMap() {} - - function _findNodeIndex(list, node) { - var i = list.length; - while (i--) { - if (list[i] === node) { - return i; - } - } - } - - function _addNamedNode(el, list, newAttr, oldAttr) { - if (oldAttr) { - list[_findNodeIndex(list, oldAttr)] = newAttr; - } else { - list[list.length++] = newAttr; - } - if (el) { - newAttr.ownerElement = el; - var doc = el.ownerDocument; - if (doc) { - oldAttr && _onRemoveAttribute(doc, el, oldAttr); - _onAddAttribute(doc, el, newAttr); - } - } - } - function _removeNamedNode(el, list, attr) { - //console.log('remove attr:'+attr) - var i = _findNodeIndex(list, attr); - if (i >= 0) { - var lastIndex = list.length - 1; - while (i < lastIndex) { - list[i] = list[++i]; - } - list.length = lastIndex; - if (el) { - var doc = el.ownerDocument; - if (doc) { - _onRemoveAttribute(doc, el, attr); - attr.ownerElement = null; - } - } - } else { - throw new DOMException(NOT_FOUND_ERR, new Error(el.tagName + "@" + attr)); - } - } - NamedNodeMap.prototype = { - length: 0, - item: NodeList.prototype.item, - getNamedItem: function (key) { - // if(key.indexOf(':')>0 || key == 'xmlns'){ - // return null; - // } - //console.log() - var i = this.length; - while (i--) { - var attr = this[i]; - //console.log(attr.nodeName,key) - if (attr.nodeName == key) { - return attr; - } - } - }, - setNamedItem: function (attr) { - var el = attr.ownerElement; - if (el && el != this._ownerElement) { - throw new DOMException(INUSE_ATTRIBUTE_ERR); - } - var oldAttr = this.getNamedItem(attr.nodeName); - _addNamedNode(this._ownerElement, this, attr, oldAttr); - return oldAttr; - }, - /* returns Node */ - setNamedItemNS: function (attr) { - // raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR - var el = attr.ownerElement, - oldAttr; - if (el && el != this._ownerElement) { - throw new DOMException(INUSE_ATTRIBUTE_ERR); - } - oldAttr = this.getNamedItemNS(attr.namespaceURI, attr.localName); - _addNamedNode(this._ownerElement, this, attr, oldAttr); - return oldAttr; - }, - - /* returns Node */ - removeNamedItem: function (key) { - var attr = this.getNamedItem(key); - _removeNamedNode(this._ownerElement, this, attr); - return attr; - }, // raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR - - //for level2 - removeNamedItemNS: function (namespaceURI, localName) { - var attr = this.getNamedItemNS(namespaceURI, localName); - _removeNamedNode(this._ownerElement, this, attr); - return attr; - }, - getNamedItemNS: function (namespaceURI, localName) { - var i = this.length; - while (i--) { - var node = this[i]; - if (node.localName == localName && node.namespaceURI == namespaceURI) { - return node; - } - } - return null; - } - }; - - /** - * The DOMImplementation interface represents an object providing methods - * which are not dependent on any particular document. - * Such an object is returned by the `Document.implementation` property. - * - * __The individual methods describe the differences compared to the specs.__ - * - * @constructor - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation MDN - * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 DOM Level 1 Core (Initial) - * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-102161490 DOM Level 2 Core - * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-102161490 DOM Level 3 Core - * @see https://dom.spec.whatwg.org/#domimplementation DOM Living Standard - */ - function DOMImplementation() {} - - DOMImplementation.prototype = { - /** - * The DOMImplementation.hasFeature() method returns a Boolean flag indicating if a given feature is supported. - * The different implementations fairly diverged in what kind of features were reported. - * The latest version of the spec settled to force this method to always return true, where the functionality was accurate and in use. - * - * @deprecated It is deprecated and modern browsers return true in all cases. - * - * @param {string} feature - * @param {string} [version] - * @returns {boolean} always true - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/hasFeature MDN - * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-5CED94D7 DOM Level 1 Core - * @see https://dom.spec.whatwg.org/#dom-domimplementation-hasfeature DOM Living Standard - */ - hasFeature: function (feature, version) { - return true; - }, - /** - * Creates an XML Document object of the specified type with its document element. - * - * __It behaves slightly different from the description in the living standard__: - * - There is no interface/class `XMLDocument`, it returns a `Document` instance. - * - `contentType`, `encoding`, `mode`, `origin`, `url` fields are currently not declared. - * - this implementation is not validating names or qualified names - * (when parsing XML strings, the SAX parser takes care of that) - * - * @param {string|null} namespaceURI - * @param {string} qualifiedName - * @param {DocumentType=null} doctype - * @returns {Document} - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocument MDN - * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocument DOM Level 2 Core (initial) - * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument DOM Level 2 Core - * - * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract - * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names - * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names - */ - createDocument: function (namespaceURI, qualifiedName, doctype) { - var doc = new Document(); - doc.implementation = this; - doc.childNodes = new NodeList(); - doc.doctype = doctype || null; - if (doctype) { - doc.appendChild(doctype); - } - if (qualifiedName) { - var root = doc.createElementNS(namespaceURI, qualifiedName); - doc.appendChild(root); - } - return doc; - }, - /** - * Returns a doctype, with the given `qualifiedName`, `publicId`, and `systemId`. - * - * __This behavior is slightly different from the in the specs__: - * - this implementation is not validating names or qualified names - * (when parsing XML strings, the SAX parser takes care of that) - * - * @param {string} qualifiedName - * @param {string} [publicId] - * @param {string} [systemId] - * @returns {DocumentType} which can either be used with `DOMImplementation.createDocument` upon document creation - * or can be put into the document via methods like `Node.insertBefore()` or `Node.replaceChild()` - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocumentType MDN - * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocType DOM Level 2 Core - * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype DOM Living Standard - * - * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract - * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names - * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names - */ - createDocumentType: function (qualifiedName, publicId, systemId) { - var node = new DocumentType(); - node.name = qualifiedName; - node.nodeName = qualifiedName; - node.publicId = publicId || ""; - node.systemId = systemId || ""; - - return node; - } - }; - - /** - * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 - */ - - function Node() {} - - Node.prototype = { - firstChild: null, - lastChild: null, - previousSibling: null, - nextSibling: null, - attributes: null, - parentNode: null, - childNodes: null, - ownerDocument: null, - nodeValue: null, - namespaceURI: null, - prefix: null, - localName: null, - // Modified in DOM Level 2: - insertBefore: function (newChild, refChild) { - //raises - return _insertBefore(this, newChild, refChild); - }, - replaceChild: function (newChild, oldChild) { - //raises - _insertBefore(this, newChild, oldChild, assertPreReplacementValidityInDocument); - if (oldChild) { - this.removeChild(oldChild); - } - }, - removeChild: function (oldChild) { - return _removeChild(this, oldChild); - }, - appendChild: function (newChild) { - return this.insertBefore(newChild, null); - }, - hasChildNodes: function () { - return this.firstChild != null; - }, - cloneNode: function (deep) { - return cloneNode(this.ownerDocument || this, this, deep); - }, - // Modified in DOM Level 2: - normalize: function () { - var child = this.firstChild; - while (child) { - var next = child.nextSibling; - if (next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE) { - this.removeChild(next); - child.appendData(next.data); - } else { - child.normalize(); - child = next; - } - } - }, - // Introduced in DOM Level 2: - isSupported: function (feature, version) { - return this.ownerDocument.implementation.hasFeature(feature, version); - }, - // Introduced in DOM Level 2: - hasAttributes: function () { - return this.attributes.length > 0; - }, - /** - * Look up the prefix associated to the given namespace URI, starting from this node. - * **The default namespace declarations are ignored by this method.** - * See Namespace Prefix Lookup for details on the algorithm used by this method. - * - * _Note: The implementation seems to be incomplete when compared to the algorithm described in the specs._ - * - * @param {string | null} namespaceURI - * @returns {string | null} - * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespacePrefix - * @see https://www.w3.org/TR/DOM-Level-3-Core/namespaces-algorithms.html#lookupNamespacePrefixAlgo - * @see https://dom.spec.whatwg.org/#dom-node-lookupprefix - * @see https://github.com/xmldom/xmldom/issues/322 - */ - lookupPrefix: function (namespaceURI) { - var el = this; - while (el) { - var map = el._nsMap; - //console.dir(map) - if (map) { - for (var n in map) { - if (Object.prototype.hasOwnProperty.call(map, n) && map[n] === namespaceURI) { - return n; - } - } - } - el = el.nodeType == ATTRIBUTE_NODE ? el.ownerDocument : el.parentNode; - } - return null; - }, - // Introduced in DOM Level 3: - lookupNamespaceURI: function (prefix) { - var el = this; - while (el) { - var map = el._nsMap; - //console.dir(map) - if (map) { - if (Object.prototype.hasOwnProperty.call(map, prefix)) { - return map[prefix]; - } - } - el = el.nodeType == ATTRIBUTE_NODE ? el.ownerDocument : el.parentNode; - } - return null; - }, - // Introduced in DOM Level 3: - isDefaultNamespace: function (namespaceURI) { - var prefix = this.lookupPrefix(namespaceURI); - return prefix == null; - } - }; - - function _xmlEncoder(c) { - return ( - (c == "<" && "<") || - (c == ">" && ">") || - (c == "&" && "&") || - (c == '"' && """) || - "&#" + c.charCodeAt() + ";" - ); - } - - copy(NodeType, Node); - copy(NodeType, Node.prototype); - - /** - * @param callback return true for continue,false for break - * @return boolean true: break visit; - */ - function _visitNode(node, callback) { - if (callback(node)) { - return true; - } - if ((node = node.firstChild)) { - do { - if (_visitNode(node, callback)) { - return true; - } - } while ((node = node.nextSibling)); - } - } - - function Document() { - this.ownerDocument = this; - } - - function _onAddAttribute(doc, el, newAttr) { - doc && doc._inc++; - var ns = newAttr.namespaceURI; - if (ns === NAMESPACE.XMLNS) { - //update namespace - el._nsMap[newAttr.prefix ? newAttr.localName : ""] = newAttr.value; - } - } - - function _onRemoveAttribute(doc, el, newAttr, remove) { - doc && doc._inc++; - var ns = newAttr.namespaceURI; - if (ns === NAMESPACE.XMLNS) { - //update namespace - delete el._nsMap[newAttr.prefix ? newAttr.localName : ""]; - } - } - - /** - * Updates `el.childNodes`, updating the indexed items and it's `length`. - * Passing `newChild` means it will be appended. - * Otherwise it's assumed that an item has been removed, - * and `el.firstNode` and it's `.nextSibling` are used - * to walk the current list of child nodes. - * - * @param {Document} doc - * @param {Node} el - * @param {Node} [newChild] - * @private - */ - function _onUpdateChild(doc, el, newChild) { - if (doc && doc._inc) { - doc._inc++; - //update childNodes - var cs = el.childNodes; - if (newChild) { - cs[cs.length++] = newChild; - } else { - var child = el.firstChild; - var i = 0; - while (child) { - cs[i++] = child; - child = child.nextSibling; - } - cs.length = i; - delete cs[cs.length]; - } - } - } - - /** - * Removes the connections between `parentNode` and `child` - * and any existing `child.previousSibling` or `child.nextSibling`. - * - * @see https://github.com/xmldom/xmldom/issues/135 - * @see https://github.com/xmldom/xmldom/issues/145 - * - * @param {Node} parentNode - * @param {Node} child - * @returns {Node} the child that was removed. - * @private - */ - function _removeChild(parentNode, child) { - var previous = child.previousSibling; - var next = child.nextSibling; - if (previous) { - previous.nextSibling = next; - } else { - parentNode.firstChild = next; - } - if (next) { - next.previousSibling = previous; - } else { - parentNode.lastChild = previous; - } - child.parentNode = null; - child.previousSibling = null; - child.nextSibling = null; - _onUpdateChild(parentNode.ownerDocument, parentNode); - return child; - } - - /** - * Returns `true` if `node` can be a parent for insertion. - * @param {Node} node - * @returns {boolean} - */ - function hasValidParentNodeType(node) { - return ( - node && - (node.nodeType === Node.DOCUMENT_NODE || - node.nodeType === Node.DOCUMENT_FRAGMENT_NODE || - node.nodeType === Node.ELEMENT_NODE) - ); - } - - /** - * Returns `true` if `node` can be inserted according to it's `nodeType`. - * @param {Node} node - * @returns {boolean} - */ - function hasInsertableNodeType(node) { - return ( - node && - (isElementNode(node) || - isTextNode(node) || - isDocTypeNode(node) || - node.nodeType === Node.DOCUMENT_FRAGMENT_NODE || - node.nodeType === Node.COMMENT_NODE || - node.nodeType === Node.PROCESSING_INSTRUCTION_NODE) - ); - } - - /** - * Returns true if `node` is a DOCTYPE node - * @param {Node} node - * @returns {boolean} - */ - function isDocTypeNode(node) { - return node && node.nodeType === Node.DOCUMENT_TYPE_NODE; - } - - /** - * Returns true if the node is an element - * @param {Node} node - * @returns {boolean} - */ - function isElementNode(node) { - return node && node.nodeType === Node.ELEMENT_NODE; - } - /** - * Returns true if `node` is a text node - * @param {Node} node - * @returns {boolean} - */ - function isTextNode(node) { - return node && node.nodeType === Node.TEXT_NODE; - } - - /** - * Check if en element node can be inserted before `child`, or at the end if child is falsy, - * according to the presence and position of a doctype node on the same level. - * - * @param {Document} doc The document node - * @param {Node} child the node that would become the nextSibling if the element would be inserted - * @returns {boolean} `true` if an element can be inserted before child - * @private - * https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity - */ - function isElementInsertionPossible(doc, child) { - var parentChildNodes = doc.childNodes || []; - if (find(parentChildNodes, isElementNode) || isDocTypeNode(child)) { - return false; - } - var docTypeNode = find(parentChildNodes, isDocTypeNode); - return !( - child && - docTypeNode && - parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child) - ); - } - - /** - * Check if en element node can be inserted before `child`, or at the end if child is falsy, - * according to the presence and position of a doctype node on the same level. - * - * @param {Node} doc The document node - * @param {Node} child the node that would become the nextSibling if the element would be inserted - * @returns {boolean} `true` if an element can be inserted before child - * @private - * https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity - */ - function isElementReplacementPossible(doc, child) { - var parentChildNodes = doc.childNodes || []; - - function hasElementChildThatIsNotChild(node) { - return isElementNode(node) && node !== child; - } - - if (find(parentChildNodes, hasElementChildThatIsNotChild)) { - return false; - } - var docTypeNode = find(parentChildNodes, isDocTypeNode); - return !( - child && - docTypeNode && - parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child) - ); - } - - /** - * @private - * Steps 1-5 of the checks before inserting and before replacing a child are the same. - * - * @param {Node} parent the parent node to insert `node` into - * @param {Node} node the node to insert - * @param {Node=} child the node that should become the `nextSibling` of `node` - * @returns {Node} - * @throws DOMException for several node combinations that would create a DOM that is not well-formed. - * @throws DOMException if `child` is provided but is not a child of `parent`. - * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity - * @see https://dom.spec.whatwg.org/#concept-node-replace - */ - function assertPreInsertionValidity1to5(parent, node, child) { - // 1. If `parent` is not a Document, DocumentFragment, or Element node, then throw a "HierarchyRequestError" DOMException. - if (!hasValidParentNodeType(parent)) { - throw new DOMException( - HIERARCHY_REQUEST_ERR, - "Unexpected parent node type " + parent.nodeType - ); - } - // 2. If `node` is a host-including inclusive ancestor of `parent`, then throw a "HierarchyRequestError" DOMException. - // not implemented! - // 3. If `child` is non-null and its parent is not `parent`, then throw a "NotFoundError" DOMException. - if (child && child.parentNode !== parent) { - throw new DOMException(NOT_FOUND_ERR, "child not in parent"); - } - if ( - // 4. If `node` is not a DocumentFragment, DocumentType, Element, or CharacterData node, then throw a "HierarchyRequestError" DOMException. - !hasInsertableNodeType(node) || - // 5. If either `node` is a Text node and `parent` is a document, - // the sax parser currently adds top level text nodes, this will be fixed in 0.9.0 - // || (node.nodeType === Node.TEXT_NODE && parent.nodeType === Node.DOCUMENT_NODE) - // or `node` is a doctype and `parent` is not a document, then throw a "HierarchyRequestError" DOMException. - (isDocTypeNode(node) && parent.nodeType !== Node.DOCUMENT_NODE) - ) { - throw new DOMException( - HIERARCHY_REQUEST_ERR, - "Unexpected node type " + node.nodeType + " for parent node type " + parent.nodeType - ); - } - } - - /** - * @private - * Step 6 of the checks before inserting and before replacing a child are different. - * - * @param {Document} parent the parent node to insert `node` into - * @param {Node} node the node to insert - * @param {Node | undefined} child the node that should become the `nextSibling` of `node` - * @returns {Node} - * @throws DOMException for several node combinations that would create a DOM that is not well-formed. - * @throws DOMException if `child` is provided but is not a child of `parent`. - * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity - * @see https://dom.spec.whatwg.org/#concept-node-replace - */ - function assertPreInsertionValidityInDocument(parent, node, child) { - var parentChildNodes = parent.childNodes || []; - var nodeChildNodes = node.childNodes || []; - - // DocumentFragment - if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { - var nodeChildElements = nodeChildNodes.filter(isElementNode); - // If node has more than one element child or has a Text node child. - if (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) { - throw new DOMException( - HIERARCHY_REQUEST_ERR, - "More than one element or text in fragment" - ); - } - // Otherwise, if `node` has one element child and either `parent` has an element child, - // `child` is a doctype, or `child` is non-null and a doctype is following `child`. - if (nodeChildElements.length === 1 && !isElementInsertionPossible(parent, child)) { - throw new DOMException( - HIERARCHY_REQUEST_ERR, - "Element in fragment can not be inserted before doctype" - ); - } - } - // Element - if (isElementNode(node)) { - // `parent` has an element child, `child` is a doctype, - // or `child` is non-null and a doctype is following `child`. - if (!isElementInsertionPossible(parent, child)) { - throw new DOMException( - HIERARCHY_REQUEST_ERR, - "Only one element can be added and only after doctype" - ); - } - } - // DocumentType - if (isDocTypeNode(node)) { - // `parent` has a doctype child, - if (find(parentChildNodes, isDocTypeNode)) { - throw new DOMException(HIERARCHY_REQUEST_ERR, "Only one doctype is allowed"); - } - var parentElementChild = find(parentChildNodes, isElementNode); - // `child` is non-null and an element is preceding `child`, - if ( - child && - parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child) - ) { - throw new DOMException( - HIERARCHY_REQUEST_ERR, - "Doctype can only be inserted before an element" - ); - } - // or `child` is null and `parent` has an element child. - if (!child && parentElementChild) { - throw new DOMException( - HIERARCHY_REQUEST_ERR, - "Doctype can not be appended since element is present" - ); - } - } - } - - /** - * @private - * Step 6 of the checks before inserting and before replacing a child are different. - * - * @param {Document} parent the parent node to insert `node` into - * @param {Node} node the node to insert - * @param {Node | undefined} child the node that should become the `nextSibling` of `node` - * @returns {Node} - * @throws DOMException for several node combinations that would create a DOM that is not well-formed. - * @throws DOMException if `child` is provided but is not a child of `parent`. - * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity - * @see https://dom.spec.whatwg.org/#concept-node-replace - */ - function assertPreReplacementValidityInDocument(parent, node, child) { - var parentChildNodes = parent.childNodes || []; - var nodeChildNodes = node.childNodes || []; - - // DocumentFragment - if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { - var nodeChildElements = nodeChildNodes.filter(isElementNode); - // If `node` has more than one element child or has a Text node child. - if (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) { - throw new DOMException( - HIERARCHY_REQUEST_ERR, - "More than one element or text in fragment" - ); - } - // Otherwise, if `node` has one element child and either `parent` has an element child that is not `child` or a doctype is following `child`. - if (nodeChildElements.length === 1 && !isElementReplacementPossible(parent, child)) { - throw new DOMException( - HIERARCHY_REQUEST_ERR, - "Element in fragment can not be inserted before doctype" - ); - } - } - // Element - if (isElementNode(node)) { - // `parent` has an element child that is not `child` or a doctype is following `child`. - if (!isElementReplacementPossible(parent, child)) { - throw new DOMException( - HIERARCHY_REQUEST_ERR, - "Only one element can be added and only after doctype" - ); - } - } - // DocumentType - if (isDocTypeNode(node)) { - function hasDoctypeChildThatIsNotChild(node) { - return isDocTypeNode(node) && node !== child; - } - - // `parent` has a doctype child that is not `child`, - if (find(parentChildNodes, hasDoctypeChildThatIsNotChild)) { - throw new DOMException(HIERARCHY_REQUEST_ERR, "Only one doctype is allowed"); - } - var parentElementChild = find(parentChildNodes, isElementNode); - // or an element is preceding `child`. - if ( - child && - parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child) - ) { - throw new DOMException( - HIERARCHY_REQUEST_ERR, - "Doctype can only be inserted before an element" - ); - } - } - } - - /** - * @private - * @param {Node} parent the parent node to insert `node` into - * @param {Node} node the node to insert - * @param {Node=} child the node that should become the `nextSibling` of `node` - * @returns {Node} - * @throws DOMException for several node combinations that would create a DOM that is not well-formed. - * @throws DOMException if `child` is provided but is not a child of `parent`. - * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity - */ - function _insertBefore(parent, node, child, _inDocumentAssertion) { - // To ensure pre-insertion validity of a node into a parent before a child, run these steps: - assertPreInsertionValidity1to5(parent, node, child); - - // If parent is a document, and any of the statements below, switched on the interface node implements, - // are true, then throw a "HierarchyRequestError" DOMException. - if (parent.nodeType === Node.DOCUMENT_NODE) { - (_inDocumentAssertion || assertPreInsertionValidityInDocument)(parent, node, child); - } - - var cp = node.parentNode; - if (cp) { - cp.removeChild(node); //remove and update - } - if (node.nodeType === DOCUMENT_FRAGMENT_NODE) { - var newFirst = node.firstChild; - if (newFirst == null) { - return node; - } - var newLast = node.lastChild; - } else { - newFirst = newLast = node; - } - var pre = child ? child.previousSibling : parent.lastChild; - - newFirst.previousSibling = pre; - newLast.nextSibling = child; - - if (pre) { - pre.nextSibling = newFirst; - } else { - parent.firstChild = newFirst; - } - if (child == null) { - parent.lastChild = newLast; - } else { - child.previousSibling = newLast; - } - do { - newFirst.parentNode = parent; - } while (newFirst !== newLast && (newFirst = newFirst.nextSibling)); - _onUpdateChild(parent.ownerDocument || parent, parent); - //console.log(parent.lastChild.nextSibling == null) - if (node.nodeType == DOCUMENT_FRAGMENT_NODE) { - node.firstChild = node.lastChild = null; - } - return node; - } - - /** - * Appends `newChild` to `parentNode`. - * If `newChild` is already connected to a `parentNode` it is first removed from it. - * - * @see https://github.com/xmldom/xmldom/issues/135 - * @see https://github.com/xmldom/xmldom/issues/145 - * @param {Node} parentNode - * @param {Node} newChild - * @returns {Node} - * @private - */ - function _appendSingleChild(parentNode, newChild) { - if (newChild.parentNode) { - newChild.parentNode.removeChild(newChild); - } - newChild.parentNode = parentNode; - newChild.previousSibling = parentNode.lastChild; - newChild.nextSibling = null; - if (newChild.previousSibling) { - newChild.previousSibling.nextSibling = newChild; - } else { - parentNode.firstChild = newChild; - } - parentNode.lastChild = newChild; - _onUpdateChild(parentNode.ownerDocument, parentNode, newChild); - return newChild; - } - - Document.prototype = { - //implementation : null, - nodeName: "#document", - nodeType: DOCUMENT_NODE, - /** - * The DocumentType node of the document. - * - * @readonly - * @type DocumentType - */ - doctype: null, - documentElement: null, - _inc: 1, - - insertBefore: function (newChild, refChild) { - //raises - if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) { - var child = newChild.firstChild; - while (child) { - var next = child.nextSibling; - this.insertBefore(child, refChild); - child = next; - } - return newChild; - } - _insertBefore(this, newChild, refChild); - newChild.ownerDocument = this; - if (this.documentElement === null && newChild.nodeType === ELEMENT_NODE) { - this.documentElement = newChild; - } - - return newChild; - }, - removeChild: function (oldChild) { - if (this.documentElement == oldChild) { - this.documentElement = null; - } - return _removeChild(this, oldChild); - }, - replaceChild: function (newChild, oldChild) { - //raises - _insertBefore(this, newChild, oldChild, assertPreReplacementValidityInDocument); - newChild.ownerDocument = this; - if (oldChild) { - this.removeChild(oldChild); - } - if (isElementNode(newChild)) { - this.documentElement = newChild; - } - }, - // Introduced in DOM Level 2: - importNode: function (importedNode, deep) { - return importNode(this, importedNode, deep); - }, - // Introduced in DOM Level 2: - getElementById: function (id) { - var rtv = null; - _visitNode(this.documentElement, function (node) { - if (node.nodeType == ELEMENT_NODE) { - if (node.getAttribute("id") == id) { - rtv = node; - return true; - } - } - }); - return rtv; - }, - - /** - * The `getElementsByClassName` method of `Document` interface returns an array-like object - * of all child elements which have **all** of the given class name(s). - * - * Returns an empty list if `classeNames` is an empty string or only contains HTML white space characters. - * - * - * Warning: This is a live LiveNodeList. - * Changes in the DOM will reflect in the array as the changes occur. - * If an element selected by this array no longer qualifies for the selector, - * it will automatically be removed. Be aware of this for iteration purposes. - * - * @param {string} classNames is a string representing the class name(s) to match; multiple class names are separated by (ASCII-)whitespace - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName - * @see https://dom.spec.whatwg.org/#concept-getelementsbyclassname - */ - getElementsByClassName: function (classNames) { - var classNamesSet = toOrderedSet(classNames); - return new LiveNodeList(this, function (base) { - var ls = []; - if (classNamesSet.length > 0) { - _visitNode(base.documentElement, function (node) { - if (node !== base && node.nodeType === ELEMENT_NODE) { - var nodeClassNames = node.getAttribute("class"); - // can be null if the attribute does not exist - if (nodeClassNames) { - // before splitting and iterating just compare them for the most common case - var matches = classNames === nodeClassNames; - if (!matches) { - var nodeClassNamesSet = toOrderedSet(nodeClassNames); - matches = classNamesSet.every(arrayIncludes(nodeClassNamesSet)); - } - if (matches) { - ls.push(node); - } - } - } - }); - } - return ls; - }); - }, - - //document factory method: - createElement: function (tagName) { - var node = new Element(); - node.ownerDocument = this; - node.nodeName = tagName; - node.tagName = tagName; - node.localName = tagName; - node.childNodes = new NodeList(); - var attrs = (node.attributes = new NamedNodeMap()); - attrs._ownerElement = node; - return node; - }, - createDocumentFragment: function () { - var node = new DocumentFragment(); - node.ownerDocument = this; - node.childNodes = new NodeList(); - return node; - }, - createTextNode: function (data) { - var node = new Text(); - node.ownerDocument = this; - node.appendData(data); - return node; - }, - createComment: function (data) { - var node = new Comment(); - node.ownerDocument = this; - node.appendData(data); - return node; - }, - createCDATASection: function (data) { - var node = new CDATASection(); - node.ownerDocument = this; - node.appendData(data); - return node; - }, - createProcessingInstruction: function (target, data) { - var node = new ProcessingInstruction(); - node.ownerDocument = this; - node.tagName = node.target = target; - node.nodeValue = node.data = data; - return node; - }, - createAttribute: function (name) { - var node = new Attr(); - node.ownerDocument = this; - node.name = name; - node.nodeName = name; - node.localName = name; - node.specified = true; - return node; - }, - createEntityReference: function (name) { - var node = new EntityReference(); - node.ownerDocument = this; - node.nodeName = name; - return node; - }, - // Introduced in DOM Level 2: - createElementNS: function (namespaceURI, qualifiedName) { - var node = new Element(); - var pl = qualifiedName.split(":"); - var attrs = (node.attributes = new NamedNodeMap()); - node.childNodes = new NodeList(); - node.ownerDocument = this; - node.nodeName = qualifiedName; - node.tagName = qualifiedName; - node.namespaceURI = namespaceURI; - if (pl.length == 2) { - node.prefix = pl[0]; - node.localName = pl[1]; - } else { - //el.prefix = null; - node.localName = qualifiedName; - } - attrs._ownerElement = node; - return node; - }, - // Introduced in DOM Level 2: - createAttributeNS: function (namespaceURI, qualifiedName) { - var node = new Attr(); - var pl = qualifiedName.split(":"); - node.ownerDocument = this; - node.nodeName = qualifiedName; - node.name = qualifiedName; - node.namespaceURI = namespaceURI; - node.specified = true; - if (pl.length == 2) { - node.prefix = pl[0]; - node.localName = pl[1]; - } else { - //el.prefix = null; - node.localName = qualifiedName; - } - return node; - } - }; - _extends(Document, Node); - - function Element() { - this._nsMap = {}; - } - Element.prototype = { - nodeType: ELEMENT_NODE, - hasAttribute: function (name) { - return this.getAttributeNode(name) != null; - }, - getAttribute: function (name) { - var attr = this.getAttributeNode(name); - return (attr && attr.value) || ""; - }, - getAttributeNode: function (name) { - return this.attributes.getNamedItem(name); - }, - setAttribute: function (name, value) { - var attr = this.ownerDocument.createAttribute(name); - attr.value = attr.nodeValue = "" + value; - this.setAttributeNode(attr); - }, - removeAttribute: function (name) { - var attr = this.getAttributeNode(name); - attr && this.removeAttributeNode(attr); - }, - - //four real opeartion method - appendChild: function (newChild) { - if (newChild.nodeType === DOCUMENT_FRAGMENT_NODE) { - return this.insertBefore(newChild, null); - } else { - return _appendSingleChild(this, newChild); - } - }, - setAttributeNode: function (newAttr) { - return this.attributes.setNamedItem(newAttr); - }, - setAttributeNodeNS: function (newAttr) { - return this.attributes.setNamedItemNS(newAttr); - }, - removeAttributeNode: function (oldAttr) { - //console.log(this == oldAttr.ownerElement) - return this.attributes.removeNamedItem(oldAttr.nodeName); - }, - //get real attribute name,and remove it by removeAttributeNode - removeAttributeNS: function (namespaceURI, localName) { - var old = this.getAttributeNodeNS(namespaceURI, localName); - old && this.removeAttributeNode(old); - }, - - hasAttributeNS: function (namespaceURI, localName) { - return this.getAttributeNodeNS(namespaceURI, localName) != null; - }, - getAttributeNS: function (namespaceURI, localName) { - var attr = this.getAttributeNodeNS(namespaceURI, localName); - return (attr && attr.value) || ""; - }, - setAttributeNS: function (namespaceURI, qualifiedName, value) { - var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName); - attr.value = attr.nodeValue = "" + value; - this.setAttributeNode(attr); - }, - getAttributeNodeNS: function (namespaceURI, localName) { - return this.attributes.getNamedItemNS(namespaceURI, localName); - }, - - getElementsByTagName: function (tagName) { - return new LiveNodeList(this, function (base) { - var ls = []; - _visitNode(base, function (node) { - if ( - node !== base && - node.nodeType == ELEMENT_NODE && - (tagName === "*" || node.tagName == tagName) - ) { - ls.push(node); - } - }); - return ls; - }); - }, - getElementsByTagNameNS: function (namespaceURI, localName) { - return new LiveNodeList(this, function (base) { - var ls = []; - _visitNode(base, function (node) { - if ( - node !== base && - node.nodeType === ELEMENT_NODE && - (namespaceURI === "*" || node.namespaceURI === namespaceURI) && - (localName === "*" || node.localName == localName) - ) { - ls.push(node); - } - }); - return ls; - }); - } - }; - Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName; - Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS; - - _extends(Element, Node); - function Attr() {} - Attr.prototype.nodeType = ATTRIBUTE_NODE; - _extends(Attr, Node); - - function CharacterData() {} - CharacterData.prototype = { - data: "", - substringData: function (offset, count) { - return this.data.substring(offset, offset + count); - }, - appendData: function (text) { - text = this.data + text; - this.nodeValue = this.data = text; - this.length = text.length; - }, - insertData: function (offset, text) { - this.replaceData(offset, 0, text); - }, - appendChild: function (newChild) { - throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR]); - }, - deleteData: function (offset, count) { - this.replaceData(offset, count, ""); - }, - replaceData: function (offset, count, text) { - var start = this.data.substring(0, offset); - var end = this.data.substring(offset + count); - text = start + text + end; - this.nodeValue = this.data = text; - this.length = text.length; - } - }; - _extends(CharacterData, Node); - function Text() {} - Text.prototype = { - nodeName: "#text", - nodeType: TEXT_NODE, - splitText: function (offset) { - var text = this.data; - var newText = text.substring(offset); - text = text.substring(0, offset); - this.data = this.nodeValue = text; - this.length = text.length; - var newNode = this.ownerDocument.createTextNode(newText); - if (this.parentNode) { - this.parentNode.insertBefore(newNode, this.nextSibling); - } - return newNode; - } - }; - _extends(Text, CharacterData); - function Comment() {} - Comment.prototype = { - nodeName: "#comment", - nodeType: COMMENT_NODE - }; - _extends(Comment, CharacterData); - - function CDATASection() {} - CDATASection.prototype = { - nodeName: "#cdata-section", - nodeType: CDATA_SECTION_NODE - }; - _extends(CDATASection, CharacterData); - - function DocumentType() {} - DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE; - _extends(DocumentType, Node); - - function Notation() {} - Notation.prototype.nodeType = NOTATION_NODE; - _extends(Notation, Node); - - function Entity() {} - Entity.prototype.nodeType = ENTITY_NODE; - _extends(Entity, Node); - - function EntityReference() {} - EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE; - _extends(EntityReference, Node); - - function DocumentFragment() {} - DocumentFragment.prototype.nodeName = "#document-fragment"; - DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE; - _extends(DocumentFragment, Node); - - function ProcessingInstruction() {} - ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE; - _extends(ProcessingInstruction, Node); - function XMLSerializer() {} - XMLSerializer.prototype.serializeToString = function (node, isHtml, nodeFilter) { - return nodeSerializeToString.call(node, isHtml, nodeFilter); - }; - Node.prototype.toString = nodeSerializeToString; - function nodeSerializeToString(isHtml, nodeFilter) { - var buf = []; - var refNode = (this.nodeType == 9 && this.documentElement) || this; - var prefix = refNode.prefix; - var uri = refNode.namespaceURI; - - if (uri && prefix == null) { - //console.log(prefix) - var prefix = refNode.lookupPrefix(uri); - if (prefix == null) { - //isHTML = true; - var visibleNamespaces = [ - { namespace: uri, prefix: null } - //{namespace:uri,prefix:''} - ]; - } - } - serializeToString(this, buf, isHtml, nodeFilter, visibleNamespaces); - //console.log('###',this.nodeType,uri,prefix,buf.join('')) - return buf.join(""); - } - - function needNamespaceDefine(node, isHTML, visibleNamespaces) { - var prefix = node.prefix || ""; - var uri = node.namespaceURI; - // According to [Namespaces in XML 1.0](https://www.w3.org/TR/REC-xml-names/#ns-using) , - // and more specifically https://www.w3.org/TR/REC-xml-names/#nsc-NoPrefixUndecl : - // > In a namespace declaration for a prefix [...], the attribute value MUST NOT be empty. - // in a similar manner [Namespaces in XML 1.1](https://www.w3.org/TR/xml-names11/#ns-using) - // and more specifically https://www.w3.org/TR/xml-names11/#nsc-NSDeclared : - // > [...] Furthermore, the attribute value [...] must not be an empty string. - // so serializing empty namespace value like xmlns:ds="" would produce an invalid XML document. - if (!uri) { - return false; - } - if ((prefix === "xml" && uri === NAMESPACE.XML) || uri === NAMESPACE.XMLNS) { - return false; - } - - var i = visibleNamespaces.length; - while (i--) { - var ns = visibleNamespaces[i]; - // get namespace prefix - if (ns.prefix === prefix) { - return ns.namespace !== uri; - } - } - return true; - } - /** - * Well-formed constraint: No < in Attribute Values - * > The replacement text of any entity referred to directly or indirectly - * > in an attribute value must not contain a <. - * @see https://www.w3.org/TR/xml11/#CleanAttrVals - * @see https://www.w3.org/TR/xml11/#NT-AttValue - * - * Literal whitespace other than space that appear in attribute values - * are serialized as their entity references, so they will be preserved. - * (In contrast to whitespace literals in the input which are normalized to spaces) - * @see https://www.w3.org/TR/xml11/#AVNormalize - * @see https://w3c.github.io/DOM-Parsing/#serializing-an-element-s-attributes - */ - function addSerializedAttribute(buf, qualifiedName, value) { - buf.push(" ", qualifiedName, '="', value.replace(/[<>&"\t\n\r]/g, _xmlEncoder), '"'); - } - - function serializeToString(node, buf, isHTML, nodeFilter, visibleNamespaces) { - if (!visibleNamespaces) { - visibleNamespaces = []; - } - - if (nodeFilter) { - node = nodeFilter(node); - if (node) { - if (typeof node == "string") { - buf.push(node); - return; - } - } else { - return; - } - //buf.sort.apply(attrs, attributeSorter); - } - - switch (node.nodeType) { - case ELEMENT_NODE: - var attrs = node.attributes; - var len = attrs.length; - var child = node.firstChild; - var nodeName = node.tagName; - - isHTML = NAMESPACE.isHTML(node.namespaceURI) || isHTML; - - var prefixedNodeName = nodeName; - if (!isHTML && !node.prefix && node.namespaceURI) { - var defaultNS; - // lookup current default ns from `xmlns` attribute - for (var ai = 0; ai < attrs.length; ai++) { - if (attrs.item(ai).name === "xmlns") { - defaultNS = attrs.item(ai).value; - break; - } - } - if (!defaultNS) { - // lookup current default ns in visibleNamespaces - for (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) { - var namespace = visibleNamespaces[nsi]; - if (namespace.prefix === "" && namespace.namespace === node.namespaceURI) { - defaultNS = namespace.namespace; - break; - } - } - } - if (defaultNS !== node.namespaceURI) { - for (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) { - var namespace = visibleNamespaces[nsi]; - if (namespace.namespace === node.namespaceURI) { - if (namespace.prefix) { - prefixedNodeName = namespace.prefix + ":" + nodeName; - } - break; - } - } - } - } - - buf.push("<", prefixedNodeName); - - for (var i = 0; i < len; i++) { - // add namespaces for attributes - var attr = attrs.item(i); - if (attr.prefix == "xmlns") { - visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value }); - } else if (attr.nodeName == "xmlns") { - visibleNamespaces.push({ prefix: "", namespace: attr.value }); - } - } - - for (var i = 0; i < len; i++) { - var attr = attrs.item(i); - if (needNamespaceDefine(attr, isHTML, visibleNamespaces)) { - var prefix = attr.prefix || ""; - var uri = attr.namespaceURI; - addSerializedAttribute(buf, prefix ? "xmlns:" + prefix : "xmlns", uri); - visibleNamespaces.push({ prefix: prefix, namespace: uri }); - } - serializeToString(attr, buf, isHTML, nodeFilter, visibleNamespaces); - } - - // add namespace for current node - if ( - nodeName === prefixedNodeName && - needNamespaceDefine(node, isHTML, visibleNamespaces) - ) { - var prefix = node.prefix || ""; - var uri = node.namespaceURI; - addSerializedAttribute(buf, prefix ? "xmlns:" + prefix : "xmlns", uri); - visibleNamespaces.push({ prefix: prefix, namespace: uri }); - } - - if (child || (isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName))) { - buf.push(">"); - //if is cdata child node - if (isHTML && /^script$/i.test(nodeName)) { - while (child) { - if (child.data) { - buf.push(child.data); - } else { - serializeToString( - child, - buf, - isHTML, - nodeFilter, - visibleNamespaces.slice() - ); - } - child = child.nextSibling; - } - } else { - while (child) { - serializeToString( - child, - buf, - isHTML, - nodeFilter, - visibleNamespaces.slice() - ); - child = child.nextSibling; - } - } - buf.push(""); - } else { - buf.push("/>"); - } - // remove added visible namespaces - //visibleNamespaces.length = startVisibleNamespaces; - return; - case DOCUMENT_NODE: - case DOCUMENT_FRAGMENT_NODE: - var child = node.firstChild; - while (child) { - serializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice()); - child = child.nextSibling; - } - return; - case ATTRIBUTE_NODE: - return addSerializedAttribute(buf, node.name, node.value); - case TEXT_NODE: - /** - * The ampersand character (&) and the left angle bracket (<) must not appear in their literal form, - * except when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section. - * If they are needed elsewhere, they must be escaped using either numeric character references or the strings - * `&` and `<` respectively. - * The right angle bracket (>) may be represented using the string " > ", and must, for compatibility, - * be escaped using either `>` or a character reference when it appears in the string `]]>` in content, - * when that string is not marking the end of a CDATA section. - * - * In the content of elements, character data is any string of characters - * which does not contain the start-delimiter of any markup - * and does not include the CDATA-section-close delimiter, `]]>`. - * - * @see https://www.w3.org/TR/xml/#NT-CharData - * @see https://w3c.github.io/DOM-Parsing/#xml-serializing-a-text-node - */ - return buf.push(node.data.replace(/[<&>]/g, _xmlEncoder)); - case CDATA_SECTION_NODE: - return buf.push(""); - case COMMENT_NODE: - return buf.push(""); - case DOCUMENT_TYPE_NODE: - var pubid = node.publicId; - var sysid = node.systemId; - buf.push(""); - } else if (sysid && sysid != ".") { - buf.push(" SYSTEM ", sysid, ">"); - } else { - var sub = node.internalSubset; - if (sub) { - buf.push(" [", sub, "]"); - } - buf.push(">"); - } - return; - case PROCESSING_INSTRUCTION_NODE: - return buf.push(""); - case ENTITY_REFERENCE_NODE: - return buf.push("&", node.nodeName, ";"); - //case ENTITY_NODE: - //case NOTATION_NODE: - default: - buf.push("??", node.nodeName); - } - } - function importNode(doc, node, deep) { - var node2; - switch (node.nodeType) { - case ELEMENT_NODE: - node2 = node.cloneNode(false); - node2.ownerDocument = doc; - //var attrs = node2.attributes; - //var len = attrs.length; - //for(var i=0;i", lt: "<", quot: '"' }); - - /** - * A map of currently 241 entities that are detected in an HTML document. - * They contain all entries from `XML_ENTITIES`. - * - * @see XML_ENTITIES - * @see DOMParser.parseFromString - * @see DOMImplementation.prototype.createHTMLDocument - * @see https://html.spec.whatwg.org/#named-character-references WHATWG HTML(5) Spec - * @see https://www.w3.org/TR/xml-entity-names/ W3C XML Entity Names - * @see https://www.w3.org/TR/html4/sgml/entities.html W3C HTML4/SGML - * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_entity_references_in_HTML Wikipedia (HTML) - * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Entities_representing_special_characters_in_XHTML Wikpedia (XHTML) - */ - exports.HTML_ENTITIES = freeze({ - lt: "<", - gt: ">", - amp: "&", - quot: '"', - apos: "'", - Agrave: "À", - Aacute: "Á", - Acirc: "Â", - Atilde: "Ã", - Auml: "Ä", - Aring: "Å", - AElig: "Æ", - Ccedil: "Ç", - Egrave: "È", - Eacute: "É", - Ecirc: "Ê", - Euml: "Ë", - Igrave: "Ì", - Iacute: "Í", - Icirc: "Î", - Iuml: "Ï", - ETH: "Ð", - Ntilde: "Ñ", - Ograve: "Ò", - Oacute: "Ó", - Ocirc: "Ô", - Otilde: "Õ", - Ouml: "Ö", - Oslash: "Ø", - Ugrave: "Ù", - Uacute: "Ú", - Ucirc: "Û", - Uuml: "Ü", - Yacute: "Ý", - THORN: "Þ", - szlig: "ß", - agrave: "à", - aacute: "á", - acirc: "â", - atilde: "ã", - auml: "ä", - aring: "å", - aelig: "æ", - ccedil: "ç", - egrave: "è", - eacute: "é", - ecirc: "ê", - euml: "ë", - igrave: "ì", - iacute: "í", - icirc: "î", - iuml: "ï", - eth: "ð", - ntilde: "ñ", - ograve: "ò", - oacute: "ó", - ocirc: "ô", - otilde: "õ", - ouml: "ö", - oslash: "ø", - ugrave: "ù", - uacute: "ú", - ucirc: "û", - uuml: "ü", - yacute: "ý", - thorn: "þ", - yuml: "ÿ", - nbsp: "\u00a0", - iexcl: "¡", - cent: "¢", - pound: "£", - curren: "¤", - yen: "¥", - brvbar: "¦", - sect: "§", - uml: "¨", - copy: "©", - ordf: "ª", - laquo: "«", - not: "¬", - shy: "­­", - reg: "®", - macr: "¯", - deg: "°", - plusmn: "±", - sup2: "²", - sup3: "³", - acute: "´", - micro: "µ", - para: "¶", - middot: "·", - cedil: "¸", - sup1: "¹", - ordm: "º", - raquo: "»", - frac14: "¼", - frac12: "½", - frac34: "¾", - iquest: "¿", - times: "×", - divide: "÷", - forall: "∀", - part: "∂", - exist: "∃", - empty: "∅", - nabla: "∇", - isin: "∈", - notin: "∉", - ni: "∋", - prod: "∏", - sum: "∑", - minus: "−", - lowast: "∗", - radic: "√", - prop: "∝", - infin: "∞", - ang: "∠", - and: "∧", - or: "∨", - cap: "∩", - cup: "∪", - int: "∫", - there4: "∴", - sim: "∼", - cong: "≅", - asymp: "≈", - ne: "≠", - equiv: "≡", - le: "≤", - ge: "≥", - sub: "⊂", - sup: "⊃", - nsub: "⊄", - sube: "⊆", - supe: "⊇", - oplus: "⊕", - otimes: "⊗", - perp: "⊥", - sdot: "⋅", - Alpha: "Α", - Beta: "Β", - Gamma: "Γ", - Delta: "Δ", - Epsilon: "Ε", - Zeta: "Ζ", - Eta: "Η", - Theta: "Θ", - Iota: "Ι", - Kappa: "Κ", - Lambda: "Λ", - Mu: "Μ", - Nu: "Ν", - Xi: "Ξ", - Omicron: "Ο", - Pi: "Π", - Rho: "Ρ", - Sigma: "Σ", - Tau: "Τ", - Upsilon: "Υ", - Phi: "Φ", - Chi: "Χ", - Psi: "Ψ", - Omega: "Ω", - alpha: "α", - beta: "β", - gamma: "γ", - delta: "δ", - epsilon: "ε", - zeta: "ζ", - eta: "η", - theta: "θ", - iota: "ι", - kappa: "κ", - lambda: "λ", - mu: "μ", - nu: "ν", - xi: "ξ", - omicron: "ο", - pi: "π", - rho: "ρ", - sigmaf: "ς", - sigma: "σ", - tau: "τ", - upsilon: "υ", - phi: "φ", - chi: "χ", - psi: "ψ", - omega: "ω", - thetasym: "ϑ", - upsih: "ϒ", - piv: "ϖ", - OElig: "Œ", - oelig: "œ", - Scaron: "Š", - scaron: "š", - Yuml: "Ÿ", - fnof: "ƒ", - circ: "ˆ", - tilde: "˜", - ensp: " ", - emsp: " ", - thinsp: " ", - zwnj: "‌", - zwj: "‍", - lrm: "‎", - rlm: "‏", - ndash: "–", - mdash: "—", - lsquo: "‘", - rsquo: "’", - sbquo: "‚", - ldquo: "“", - rdquo: "”", - bdquo: "„", - dagger: "†", - Dagger: "‡", - bull: "•", - hellip: "…", - permil: "‰", - prime: "′", - Prime: "″", - lsaquo: "‹", - rsaquo: "›", - oline: "‾", - euro: "€", - trade: "™", - larr: "←", - uarr: "↑", - rarr: "→", - darr: "↓", - harr: "↔", - crarr: "↵", - lceil: "⌈", - rceil: "⌉", - lfloor: "⌊", - rfloor: "⌋", - loz: "◊", - spades: "♠", - clubs: "♣", - hearts: "♥", - diams: "♦" - }); - - /** - * @deprecated use `HTML_ENTITIES` instead - * @see HTML_ENTITIES - */ - exports.entityMap = exports.HTML_ENTITIES; - }, - { "./conventions": 41 } - ], - 45: [ - function (require, module, exports) { - var dom = require("./dom"); - exports.DOMImplementation = dom.DOMImplementation; - exports.XMLSerializer = dom.XMLSerializer; - exports.DOMParser = require("./dom-parser").DOMParser; - }, - { "./dom": 43, "./dom-parser": 42 } - ], - 46: [ - function (require, module, exports) { - var NAMESPACE = require("./conventions").NAMESPACE; - - //[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] - //[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] - //[5] Name ::= NameStartChar (NameChar)* - var nameStartChar = - /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/; //\u10000-\uEFFFF - var nameChar = new RegExp( - "[\\-\\.0-9" + nameStartChar.source.slice(1, -1) + "\\u00B7\\u0300-\\u036F\\u203F-\\u2040]" - ); - var tagNamePattern = new RegExp( - "^" + - nameStartChar.source + - nameChar.source + - "*(?::" + - nameStartChar.source + - nameChar.source + - "*)?$" - ); - //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/ - //var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',') - - //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE - //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE - var S_TAG = 0; //tag name offerring - var S_ATTR = 1; //attr name offerring - var S_ATTR_SPACE = 2; //attr name end and space offer - var S_EQ = 3; //=space? - var S_ATTR_NOQUOT_VALUE = 4; //attr value(no quot value only) - var S_ATTR_END = 5; //attr value end and no space(quot end) - var S_TAG_SPACE = 6; //(attr value end || tag end ) && (space offer) - var S_TAG_CLOSE = 7; //closed el - - /** - * Creates an error that will not be caught by XMLReader aka the SAX parser. - * - * @param {string} message - * @param {any?} locator Optional, can provide details about the location in the source - * @constructor - */ - function ParseError(message, locator) { - this.message = message; - this.locator = locator; - if (Error.captureStackTrace) Error.captureStackTrace(this, ParseError); - } - ParseError.prototype = new Error(); - ParseError.prototype.name = ParseError.name; - - function XMLReader() {} - - XMLReader.prototype = { - parse: function (source, defaultNSMap, entityMap) { - var domBuilder = this.domBuilder; - domBuilder.startDocument(); - _copy(defaultNSMap, (defaultNSMap = {})); - parse(source, defaultNSMap, entityMap, domBuilder, this.errorHandler); - domBuilder.endDocument(); - } - }; - function parse(source, defaultNSMapCopy, entityMap, domBuilder, errorHandler) { - function fixedFromCharCode(code) { - // String.prototype.fromCharCode does not supports - // > 2 bytes unicode chars directly - if (code > 0xffff) { - code -= 0x10000; - var surrogate1 = 0xd800 + (code >> 10), - surrogate2 = 0xdc00 + (code & 0x3ff); - - return String.fromCharCode(surrogate1, surrogate2); - } else { - return String.fromCharCode(code); - } - } - function entityReplacer(a) { - var k = a.slice(1, -1); - if (Object.hasOwnProperty.call(entityMap, k)) { - return entityMap[k]; - } else if (k.charAt(0) === "#") { - return fixedFromCharCode(parseInt(k.substr(1).replace("x", "0x"))); - } else { - errorHandler.error("entity not found:" + a); - return a; - } - } - function appendText(end) { - //has some bugs - if (end > start) { - var xt = source.substring(start, end).replace(/&#?\w+;/g, entityReplacer); - locator && position(start); - domBuilder.characters(xt, 0, end - start); - start = end; - } - } - function position(p, m) { - while (p >= lineEnd && (m = linePattern.exec(source))) { - lineStart = m.index; - lineEnd = lineStart + m[0].length; - locator.lineNumber++; - //console.log('line++:',locator,startPos,endPos) - } - locator.columnNumber = p - lineStart + 1; - } - var lineStart = 0; - var lineEnd = 0; - var linePattern = /.*(?:\r\n?|\n)|.*$/g; - var locator = domBuilder.locator; - - var parseStack = [{ currentNSMap: defaultNSMapCopy }]; - var closeMap = {}; - var start = 0; - while (true) { - try { - var tagStart = source.indexOf("<", start); - if (tagStart < 0) { - if (!source.substr(start).match(/^\s*$/)) { - var doc = domBuilder.doc; - var text = doc.createTextNode(source.substr(start)); - doc.appendChild(text); - domBuilder.currentElement = text; - } - return; - } - if (tagStart > start) { - appendText(tagStart); - } - switch (source.charAt(tagStart + 1)) { - case "/": - var end = source.indexOf(">", tagStart + 3); - var tagName = source.substring(tagStart + 2, end).replace(/[ \t\n\r]+$/g, ""); - var config = parseStack.pop(); - if (end < 0) { - tagName = source.substring(tagStart + 2).replace(/[\s<].*/, ""); - errorHandler.error( - "end tag name: " + tagName + " is not complete:" + config.tagName - ); - end = tagStart + 1 + tagName.length; - } else if (tagName.match(/\s - locator && position(tagStart); - end = parseInstruction(source, tagStart, domBuilder); - break; - case "!": // start) { - start = end; - } else { - //TODO: 这里有可能sax回退,有位置错误风险 - appendText(Math.max(tagStart, start) + 1); - } - } - } - function copyLocator(f, t) { - t.lineNumber = f.lineNumber; - t.columnNumber = f.columnNumber; - return t; - } - - /** - * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack); - * @return end of the elementStartPart(end of elementEndPart for selfClosed el) - */ - function parseElementStartPart(source, start, el, currentNSMap, entityReplacer, errorHandler) { - /** - * @param {string} qname - * @param {string} value - * @param {number} startIndex - */ - function addAttribute(qname, value, startIndex) { - if (el.attributeNames.hasOwnProperty(qname)) { - errorHandler.fatalError("Attribute " + qname + " redefined"); - } - el.addValue( - qname, - // @see https://www.w3.org/TR/xml/#AVNormalize - // since the xmldom sax parser does not "interpret" DTD the following is not implemented: - // - recursive replacement of (DTD) entity references - // - trimming and collapsing multiple spaces into a single one for attributes that are not of type CDATA - value.replace(/[\t\n\r]/g, " ").replace(/&#?\w+;/g, entityReplacer), - startIndex - ); - } - var attrName; - var value; - var p = ++start; - var s = S_TAG; //status - while (true) { - var c = source.charAt(p); - switch (c) { - case "=": - if (s === S_ATTR) { - //attrName - attrName = source.slice(start, p); - s = S_EQ; - } else if (s === S_ATTR_SPACE) { - s = S_EQ; - } else { - //fatalError: equal must after attrName or space after attrName - throw new Error("attribute equal must after attrName"); // No known test case - } - break; - case "'": - case '"': - if ( - s === S_EQ || - s === S_ATTR //|| s == S_ATTR_SPACE - ) { - //equal - if (s === S_ATTR) { - errorHandler.warning('attribute value must after "="'); - attrName = source.slice(start, p); - } - start = p + 1; - p = source.indexOf(c, start); - if (p > 0) { - value = source.slice(start, p); - addAttribute(attrName, value, start - 1); - s = S_ATTR_END; - } else { - //fatalError: no end quot match - throw new Error("attribute value no end '" + c + "' match"); - } - } else if (s == S_ATTR_NOQUOT_VALUE) { - value = source.slice(start, p); - addAttribute(attrName, value, start); - errorHandler.warning( - 'attribute "' + attrName + '" missed start quot(' + c + ")!!" - ); - start = p + 1; - s = S_ATTR_END; - } else { - //fatalError: no equal before - throw new Error('attribute value must after "="'); // No known test case - } - break; - case "/": - switch (s) { - case S_TAG: - el.setTagName(source.slice(start, p)); - case S_ATTR_END: - case S_TAG_SPACE: - case S_TAG_CLOSE: - s = S_TAG_CLOSE; - el.closed = true; - case S_ATTR_NOQUOT_VALUE: - case S_ATTR: - case S_ATTR_SPACE: - break; - //case S_EQ: - default: - throw new Error("attribute invalid close char('/')"); // No known test case - } - break; - case "": //end document - errorHandler.error("unexpected end of input"); - if (s == S_TAG) { - el.setTagName(source.slice(start, p)); - } - return p; - case ">": - switch (s) { - case S_TAG: - el.setTagName(source.slice(start, p)); - case S_ATTR_END: - case S_TAG_SPACE: - case S_TAG_CLOSE: - break; //normal - case S_ATTR_NOQUOT_VALUE: //Compatible state - case S_ATTR: - value = source.slice(start, p); - if (value.slice(-1) === "/") { - el.closed = true; - value = value.slice(0, -1); - } - case S_ATTR_SPACE: - if (s === S_ATTR_SPACE) { - value = attrName; - } - if (s == S_ATTR_NOQUOT_VALUE) { - errorHandler.warning('attribute "' + value + '" missed quot(")!'); - addAttribute(attrName, value, start); - } else { - if ( - !NAMESPACE.isHTML(currentNSMap[""]) || - !value.match(/^(?:disabled|checked|selected)$/i) - ) { - errorHandler.warning( - 'attribute "' + - value + - '" missed value!! "' + - value + - '" instead!!' - ); - } - addAttribute(value, value, start); - } - break; - case S_EQ: - throw new Error("attribute value missed!!"); - } - // console.log(tagName,tagNamePattern,tagNamePattern.test(tagName)) - return p; - /*xml space '\x20' | #x9 | #xD | #xA; */ - case "\u0080": - c = " "; - default: - if (c <= " ") { - //space - switch (s) { - case S_TAG: - el.setTagName(source.slice(start, p)); //tagName - s = S_TAG_SPACE; - break; - case S_ATTR: - attrName = source.slice(start, p); - s = S_ATTR_SPACE; - break; - case S_ATTR_NOQUOT_VALUE: - var value = source.slice(start, p); - errorHandler.warning('attribute "' + value + '" missed quot(")!!'); - addAttribute(attrName, value, start); - case S_ATTR_END: - s = S_TAG_SPACE; - break; - //case S_TAG_SPACE: - //case S_EQ: - //case S_ATTR_SPACE: - // void();break; - //case S_TAG_CLOSE: - //ignore warning - } - } else { - //not space - //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE - //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE - switch (s) { - //case S_TAG:void();break; - //case S_ATTR:void();break; - //case S_ATTR_NOQUOT_VALUE:void();break; - case S_ATTR_SPACE: - var tagName = el.tagName; - if ( - !NAMESPACE.isHTML(currentNSMap[""]) || - !attrName.match(/^(?:disabled|checked|selected)$/i) - ) { - errorHandler.warning( - 'attribute "' + - attrName + - '" missed value!! "' + - attrName + - '" instead2!!' - ); - } - addAttribute(attrName, attrName, start); - start = p; - s = S_ATTR; - break; - case S_ATTR_END: - errorHandler.warning('attribute space is required"' + attrName + '"!!'); - case S_TAG_SPACE: - s = S_ATTR; - start = p; - break; - case S_EQ: - s = S_ATTR_NOQUOT_VALUE; - start = p; - break; - case S_TAG_CLOSE: - throw new Error( - "elements closed character '/' and '>' must be connected to" - ); - } - } - } //end outer switch - //console.log('p++',p) - p++; - } - } - /** - * @return true if has new namespace define - */ - function appendElement(el, domBuilder, currentNSMap) { - var tagName = el.tagName; - var localNSMap = null; - //var currentNSMap = parseStack[parseStack.length-1].currentNSMap; - var i = el.length; - while (i--) { - var a = el[i]; - var qName = a.qName; - var value = a.value; - var nsp = qName.indexOf(":"); - if (nsp > 0) { - var prefix = (a.prefix = qName.slice(0, nsp)); - var localName = qName.slice(nsp + 1); - var nsPrefix = prefix === "xmlns" && localName; - } else { - localName = qName; - prefix = null; - nsPrefix = qName === "xmlns" && ""; - } - //can not set prefix,because prefix !== '' - a.localName = localName; - //prefix == null for no ns prefix attribute - if (nsPrefix !== false) { - //hack!! - if (localNSMap == null) { - localNSMap = {}; - //console.log(currentNSMap,0) - _copy(currentNSMap, (currentNSMap = {})); - //console.log(currentNSMap,1) - } - currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value; - a.uri = NAMESPACE.XMLNS; - domBuilder.startPrefixMapping(nsPrefix, value); - } - } - var i = el.length; - while (i--) { - a = el[i]; - var prefix = a.prefix; - if (prefix) { - //no prefix attribute has no namespace - if (prefix === "xml") { - a.uri = NAMESPACE.XML; - } - if (prefix !== "xmlns") { - a.uri = currentNSMap[prefix || ""]; - - //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)} - } - } - } - var nsp = tagName.indexOf(":"); - if (nsp > 0) { - prefix = el.prefix = tagName.slice(0, nsp); - localName = el.localName = tagName.slice(nsp + 1); - } else { - prefix = null; //important!! - localName = el.localName = tagName; - } - //no prefix element has default namespace - var ns = (el.uri = currentNSMap[prefix || ""]); - domBuilder.startElement(ns, localName, tagName, el); - //endPrefixMapping and startPrefixMapping have not any help for dom builder - //localNSMap = null - if (el.closed) { - domBuilder.endElement(ns, localName, tagName); - if (localNSMap) { - for (prefix in localNSMap) { - if (Object.prototype.hasOwnProperty.call(localNSMap, prefix)) { - domBuilder.endPrefixMapping(prefix); - } - } - } - } else { - el.currentNSMap = currentNSMap; - el.localNSMap = localNSMap; - //parseStack.push(el); - return true; - } - } - function parseHtmlSpecialContent(source, elStartEnd, tagName, entityReplacer, domBuilder) { - if (/^(?:script|textarea)$/i.test(tagName)) { - var elEndStart = source.indexOf("", elStartEnd); - var text = source.substring(elStartEnd + 1, elEndStart); - if (/[&<]/.test(text)) { - if (/^script$/i.test(tagName)) { - //if(!/\]\]>/.test(text)){ - //lexHandler.startCDATA(); - domBuilder.characters(text, 0, text.length); - //lexHandler.endCDATA(); - return elEndStart; - //} - } //}else{//text area - text = text.replace(/&#?\w+;/g, entityReplacer); - domBuilder.characters(text, 0, text.length); - return elEndStart; - //} - } - } - return elStartEnd + 1; - } - function fixSelfClosed(source, elStartEnd, tagName, closeMap) { - //if(tagName in closeMap){ - var pos = closeMap[tagName]; - if (pos == null) { - //console.log(tagName) - pos = source.lastIndexOf(""); - if (pos < elStartEnd) { - //忘记闭合 - pos = source.lastIndexOf("", start + 4); - //append comment source.substring(4,end)//" + this.endline(node) - ); - }; - - XMLStreamWriter.prototype.declaration = function (node, level) { - this.stream.write(this.space(level)); - this.stream.write('"); - return this.stream.write(this.endline(node)); - }; - - XMLStreamWriter.prototype.docType = function (node, level) { - var child, i, len, ref; - level || (level = 0); - this.stream.write(this.space(level)); - this.stream.write(" 0) { - this.stream.write(" ["); - this.stream.write(this.endline(node)); - ref = node.children; - for (i = 0, len = ref.length; i < len; i++) { - child = ref[i]; - switch (false) { - case !(child instanceof XMLDTDAttList): - this.dtdAttList(child, level + 1); - break; - case !(child instanceof XMLDTDElement): - this.dtdElement(child, level + 1); - break; - case !(child instanceof XMLDTDEntity): - this.dtdEntity(child, level + 1); - break; - case !(child instanceof XMLDTDNotation): - this.dtdNotation(child, level + 1); - break; - case !(child instanceof XMLCData): - this.cdata(child, level + 1); - break; - case !(child instanceof XMLComment): - this.comment(child, level + 1); - break; - case !(child instanceof XMLProcessingInstruction): - this.processingInstruction(child, level + 1); - break; - default: - throw new Error("Unknown DTD node type: " + child.constructor.name); - } - } - this.stream.write("]"); - } - this.stream.write(this.spacebeforeslash + ">"); - return this.stream.write(this.endline(node)); - }; - - XMLStreamWriter.prototype.element = function (node, level) { - var att, child, i, len, name, ref, ref1, space; - level || (level = 0); - space = this.space(level); - this.stream.write(space + "<" + node.name); - ref = node.attributes; - for (name in ref) { - if (!hasProp.call(ref, name)) continue; - att = ref[name]; - this.attribute(att); - } - if ( - node.children.length === 0 || - node.children.every(function (e) { - return e.value === ""; - }) - ) { - if (this.allowEmpty) { - this.stream.write(">"); - } else { - this.stream.write(this.spacebeforeslash + "/>"); - } - } else if ( - this.pretty && - node.children.length === 1 && - node.children[0].value != null - ) { - this.stream.write(">"); - this.stream.write(node.children[0].value); - this.stream.write(""); - } else { - this.stream.write(">" + this.newline); - ref1 = node.children; - for (i = 0, len = ref1.length; i < len; i++) { - child = ref1[i]; - switch (false) { - case !(child instanceof XMLCData): - this.cdata(child, level + 1); - break; - case !(child instanceof XMLComment): - this.comment(child, level + 1); - break; - case !(child instanceof XMLElement): - this.element(child, level + 1); - break; - case !(child instanceof XMLRaw): - this.raw(child, level + 1); - break; - case !(child instanceof XMLText): - this.text(child, level + 1); - break; - case !(child instanceof XMLProcessingInstruction): - this.processingInstruction(child, level + 1); - break; - default: - throw new Error("Unknown XML node type: " + child.constructor.name); - } - } - this.stream.write(space + ""); - } - return this.stream.write(this.endline(node)); - }; - - XMLStreamWriter.prototype.processingInstruction = function (node, level) { - this.stream.write(this.space(level) + "" + this.endline(node)); - }; - - XMLStreamWriter.prototype.raw = function (node, level) { - return this.stream.write(this.space(level) + node.value + this.endline(node)); - }; - - XMLStreamWriter.prototype.text = function (node, level) { - return this.stream.write(this.space(level) + node.value + this.endline(node)); - }; - - XMLStreamWriter.prototype.dtdAttList = function (node, level) { - this.stream.write( - this.space(level) + - "" + this.endline(node)); - }; - - XMLStreamWriter.prototype.dtdElement = function (node, level) { - this.stream.write(this.space(level) + "" + this.endline(node)); - }; - - XMLStreamWriter.prototype.dtdEntity = function (node, level) { - this.stream.write(this.space(level) + "" + this.endline(node)); - }; - - XMLStreamWriter.prototype.dtdNotation = function (node, level) { - this.stream.write(this.space(level) + "" + this.endline(node)); - }; - - XMLStreamWriter.prototype.endline = function (node) { - if (!node.isLastRootNode) { - return this.newline; - } else { - return ""; - } - }; - - return XMLStreamWriter; - })(XMLWriterBase); - }).call(this); - }, - { - "./XMLCData": 70, - "./XMLComment": 71, - "./XMLDTDAttList": 72, - "./XMLDTDElement": 73, - "./XMLDTDEntity": 74, - "./XMLDTDNotation": 75, - "./XMLDeclaration": 76, - "./XMLDocType": 77, - "./XMLElement": 80, - "./XMLProcessingInstruction": 82, - "./XMLRaw": 83, - "./XMLText": 87, - "./XMLWriterBase": 88 - } - ], - 85: [ - function (require, module, exports) { - // Generated by CoffeeScript 1.12.7 - (function () { - var XMLCData, - XMLComment, - XMLDTDAttList, - XMLDTDElement, - XMLDTDEntity, - XMLDTDNotation, - XMLDeclaration, - XMLDocType, - XMLElement, - XMLProcessingInstruction, - XMLRaw, - XMLStringWriter, - XMLText, - XMLWriterBase, - extend = function (child, parent) { - for (var key in parent) { - if (hasProp.call(parent, key)) child[key] = parent[key]; - } - function ctor() { - this.constructor = child; - } - ctor.prototype = parent.prototype; - child.prototype = new ctor(); - child.__super__ = parent.prototype; - return child; - }, - hasProp = {}.hasOwnProperty; - - XMLDeclaration = require("./XMLDeclaration"); - - XMLDocType = require("./XMLDocType"); - - XMLCData = require("./XMLCData"); - - XMLComment = require("./XMLComment"); - - XMLElement = require("./XMLElement"); - - XMLRaw = require("./XMLRaw"); - - XMLText = require("./XMLText"); - - XMLProcessingInstruction = require("./XMLProcessingInstruction"); - - XMLDTDAttList = require("./XMLDTDAttList"); - - XMLDTDElement = require("./XMLDTDElement"); - - XMLDTDEntity = require("./XMLDTDEntity"); - - XMLDTDNotation = require("./XMLDTDNotation"); - - XMLWriterBase = require("./XMLWriterBase"); - - module.exports = XMLStringWriter = (function (superClass) { - extend(XMLStringWriter, superClass); - - function XMLStringWriter(options) { - XMLStringWriter.__super__.constructor.call(this, options); - } - - XMLStringWriter.prototype.document = function (doc) { - var child, i, len, r, ref; - this.textispresent = false; - r = ""; - ref = doc.children; - for (i = 0, len = ref.length; i < len; i++) { - child = ref[i]; - r += function () { - switch (false) { - case !(child instanceof XMLDeclaration): - return this.declaration(child); - case !(child instanceof XMLDocType): - return this.docType(child); - case !(child instanceof XMLComment): - return this.comment(child); - case !(child instanceof XMLProcessingInstruction): - return this.processingInstruction(child); - default: - return this.element(child, 0); - } - }.call(this); - } - if (this.pretty && r.slice(-this.newline.length) === this.newline) { - r = r.slice(0, -this.newline.length); - } - return r; - }; - - XMLStringWriter.prototype.attribute = function (att) { - return " " + att.name + '="' + att.value + '"'; - }; - - XMLStringWriter.prototype.cdata = function (node, level) { - return this.space(level) + "" + this.newline; - }; - - XMLStringWriter.prototype.comment = function (node, level) { - return this.space(level) + "" + this.newline; - }; - - XMLStringWriter.prototype.declaration = function (node, level) { - var r; - r = this.space(level); - r += '"; - r += this.newline; - return r; - }; - - XMLStringWriter.prototype.docType = function (node, level) { - var child, i, len, r, ref; - level || (level = 0); - r = this.space(level); - r += " 0) { - r += " ["; - r += this.newline; - ref = node.children; - for (i = 0, len = ref.length; i < len; i++) { - child = ref[i]; - r += function () { - switch (false) { - case !(child instanceof XMLDTDAttList): - return this.dtdAttList(child, level + 1); - case !(child instanceof XMLDTDElement): - return this.dtdElement(child, level + 1); - case !(child instanceof XMLDTDEntity): - return this.dtdEntity(child, level + 1); - case !(child instanceof XMLDTDNotation): - return this.dtdNotation(child, level + 1); - case !(child instanceof XMLCData): - return this.cdata(child, level + 1); - case !(child instanceof XMLComment): - return this.comment(child, level + 1); - case !(child instanceof XMLProcessingInstruction): - return this.processingInstruction(child, level + 1); - default: - throw new Error("Unknown DTD node type: " + child.constructor.name); - } - }.call(this); - } - r += "]"; - } - r += this.spacebeforeslash + ">"; - r += this.newline; - return r; - }; - - XMLStringWriter.prototype.element = function (node, level) { - var att, child, i, j, len, len1, name, r, ref, ref1, ref2, space, textispresentwasset; - level || (level = 0); - textispresentwasset = false; - if (this.textispresent) { - this.newline = ""; - this.pretty = false; - } else { - this.newline = this.newlinedefault; - this.pretty = this.prettydefault; - } - space = this.space(level); - r = ""; - r += space + "<" + node.name; - ref = node.attributes; - for (name in ref) { - if (!hasProp.call(ref, name)) continue; - att = ref[name]; - r += this.attribute(att); - } - if ( - node.children.length === 0 || - node.children.every(function (e) { - return e.value === ""; - }) - ) { - if (this.allowEmpty) { - r += ">" + this.newline; - } else { - r += this.spacebeforeslash + "/>" + this.newline; - } - } else if ( - this.pretty && - node.children.length === 1 && - node.children[0].value != null - ) { - r += ">"; - r += node.children[0].value; - r += "" + this.newline; - } else { - if (this.dontprettytextnodes) { - ref1 = node.children; - for (i = 0, len = ref1.length; i < len; i++) { - child = ref1[i]; - if (child.value != null) { - this.textispresent++; - textispresentwasset = true; - break; - } - } - } - if (this.textispresent) { - this.newline = ""; - this.pretty = false; - space = this.space(level); - } - r += ">" + this.newline; - ref2 = node.children; - for (j = 0, len1 = ref2.length; j < len1; j++) { - child = ref2[j]; - r += function () { - switch (false) { - case !(child instanceof XMLCData): - return this.cdata(child, level + 1); - case !(child instanceof XMLComment): - return this.comment(child, level + 1); - case !(child instanceof XMLElement): - return this.element(child, level + 1); - case !(child instanceof XMLRaw): - return this.raw(child, level + 1); - case !(child instanceof XMLText): - return this.text(child, level + 1); - case !(child instanceof XMLProcessingInstruction): - return this.processingInstruction(child, level + 1); - default: - throw new Error("Unknown XML node type: " + child.constructor.name); - } - }.call(this); - } - if (textispresentwasset) { - this.textispresent--; - } - if (!this.textispresent) { - this.newline = this.newlinedefault; - this.pretty = this.prettydefault; - } - r += space + "" + this.newline; - } - return r; - }; - - XMLStringWriter.prototype.processingInstruction = function (node, level) { - var r; - r = this.space(level) + "" + this.newline; - return r; - }; - - XMLStringWriter.prototype.raw = function (node, level) { - return this.space(level) + node.value + this.newline; - }; - - XMLStringWriter.prototype.text = function (node, level) { - return this.space(level) + node.value + this.newline; - }; - - XMLStringWriter.prototype.dtdAttList = function (node, level) { - var r; - r = - this.space(level) + - "" + this.newline; - return r; - }; - - XMLStringWriter.prototype.dtdElement = function (node, level) { - return ( - this.space(level) + - "" + - this.newline - ); - }; - - XMLStringWriter.prototype.dtdEntity = function (node, level) { - var r; - r = this.space(level) + "" + this.newline; - return r; - }; - - XMLStringWriter.prototype.dtdNotation = function (node, level) { - var r; - r = this.space(level) + "" + this.newline; - return r; - }; - - XMLStringWriter.prototype.openNode = function (node, level) { - var att, name, r, ref; - level || (level = 0); - if (node instanceof XMLElement) { - r = this.space(level) + "<" + node.name; - ref = node.attributes; - for (name in ref) { - if (!hasProp.call(ref, name)) continue; - att = ref[name]; - r += this.attribute(att); - } - r += (node.children ? ">" : "/>") + this.newline; - return r; - } else { - r = this.space(level) + "") + this.newline; - return r; - } - }; - - XMLStringWriter.prototype.closeNode = function (node, level) { - level || (level = 0); - switch (false) { - case !(node instanceof XMLElement): - return this.space(level) + "" + this.newline; - case !(node instanceof XMLDocType): - return this.space(level) + "]>" + this.newline; - } - }; - - return XMLStringWriter; - })(XMLWriterBase); - }).call(this); - }, - { - "./XMLCData": 70, - "./XMLComment": 71, - "./XMLDTDAttList": 72, - "./XMLDTDElement": 73, - "./XMLDTDEntity": 74, - "./XMLDTDNotation": 75, - "./XMLDeclaration": 76, - "./XMLDocType": 77, - "./XMLElement": 80, - "./XMLProcessingInstruction": 82, - "./XMLRaw": 83, - "./XMLText": 87, - "./XMLWriterBase": 88 - } - ], - 86: [ - function (require, module, exports) { - // Generated by CoffeeScript 1.12.7 - (function () { - var XMLStringifier, - bind = function (fn, me) { - return function () { - return fn.apply(me, arguments); - }; - }, - hasProp = {}.hasOwnProperty; - - module.exports = XMLStringifier = (function () { - function XMLStringifier(options) { - this.assertLegalChar = bind(this.assertLegalChar, this); - var key, ref, value; - options || (options = {}); - this.noDoubleEncoding = options.noDoubleEncoding; - ref = options.stringify || {}; - for (key in ref) { - if (!hasProp.call(ref, key)) continue; - value = ref[key]; - this[key] = value; - } - } - - XMLStringifier.prototype.eleName = function (val) { - val = "" + val || ""; - return this.assertLegalChar(val); - }; - - XMLStringifier.prototype.eleText = function (val) { - val = "" + val || ""; - return this.assertLegalChar(this.elEscape(val)); - }; - - XMLStringifier.prototype.cdata = function (val) { - val = "" + val || ""; - val = val.replace("]]>", "]]]]>"); - return this.assertLegalChar(val); - }; - - XMLStringifier.prototype.comment = function (val) { - val = "" + val || ""; - if (val.match(/--/)) { - throw new Error("Comment text cannot contain double-hypen: " + val); - } - return this.assertLegalChar(val); - }; - - XMLStringifier.prototype.raw = function (val) { - return "" + val || ""; - }; - - XMLStringifier.prototype.attName = function (val) { - return (val = "" + val || ""); - }; - - XMLStringifier.prototype.attValue = function (val) { - val = "" + val || ""; - return this.attEscape(val); - }; - - XMLStringifier.prototype.insTarget = function (val) { - return "" + val || ""; - }; - - XMLStringifier.prototype.insValue = function (val) { - val = "" + val || ""; - if (val.match(/\?>/)) { - throw new Error("Invalid processing instruction value: " + val); - } - return val; - }; - - XMLStringifier.prototype.xmlVersion = function (val) { - val = "" + val || ""; - if (!val.match(/1\.[0-9]+/)) { - throw new Error("Invalid version number: " + val); - } - return val; - }; - - XMLStringifier.prototype.xmlEncoding = function (val) { - val = "" + val || ""; - if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/)) { - throw new Error("Invalid encoding: " + val); - } - return val; - }; - - XMLStringifier.prototype.xmlStandalone = function (val) { - if (val) { - return "yes"; - } else { - return "no"; - } - }; - - XMLStringifier.prototype.dtdPubID = function (val) { - return "" + val || ""; - }; - - XMLStringifier.prototype.dtdSysID = function (val) { - return "" + val || ""; - }; - - XMLStringifier.prototype.dtdElementValue = function (val) { - return "" + val || ""; - }; - - XMLStringifier.prototype.dtdAttType = function (val) { - return "" + val || ""; - }; - - XMLStringifier.prototype.dtdAttDefault = function (val) { - if (val != null) { - return "" + val || ""; - } else { - return val; - } - }; - - XMLStringifier.prototype.dtdEntityValue = function (val) { - return "" + val || ""; - }; - - XMLStringifier.prototype.dtdNData = function (val) { - return "" + val || ""; - }; - - XMLStringifier.prototype.convertAttKey = "@"; - - XMLStringifier.prototype.convertPIKey = "?"; - - XMLStringifier.prototype.convertTextKey = "#text"; - - XMLStringifier.prototype.convertCDataKey = "#cdata"; - - XMLStringifier.prototype.convertCommentKey = "#comment"; - - XMLStringifier.prototype.convertRawKey = "#raw"; - - XMLStringifier.prototype.assertLegalChar = function (str) { - var res; - res = str.match( - /[\0\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/ - ); - if (res) { - throw new Error("Invalid character in string: " + str + " at index " + res.index); - } - return str; - }; - - XMLStringifier.prototype.elEscape = function (str) { - var ampregex; - ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g; - return str - .replace(ampregex, "&") - .replace(//g, ">") - .replace(/\r/g, " "); - }; - - XMLStringifier.prototype.attEscape = function (str) { - var ampregex; - ampregex = this.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g; - return str - .replace(ampregex, "&") - .replace(/ 0) { - return new Array(indent).join(this.indent); - } else { - return ""; - } - } else { - return ""; - } - }; - - return XMLWriterBase; - })(); - }).call(this); - }, - {} - ], - 89: [ - function (require, module, exports) { - // Generated by CoffeeScript 1.12.7 - (function () { - var XMLDocument, XMLDocumentCB, XMLStreamWriter, XMLStringWriter, assign, isFunction, ref; - - (ref = require("./Utility")), (assign = ref.assign), (isFunction = ref.isFunction); - - XMLDocument = require("./XMLDocument"); - - XMLDocumentCB = require("./XMLDocumentCB"); - - XMLStringWriter = require("./XMLStringWriter"); - - XMLStreamWriter = require("./XMLStreamWriter"); - - module.exports.create = function (name, xmldec, doctype, options) { - var doc, root; - if (name == null) { - throw new Error("Root element needs a name."); - } - options = assign({}, xmldec, doctype, options); - doc = new XMLDocument(options); - root = doc.element(name); - if (!options.headless) { - doc.declaration(options); - if (options.pubID != null || options.sysID != null) { - doc.doctype(options); - } - } - return root; - }; - - module.exports.begin = function (options, onData, onEnd) { - var ref1; - if (isFunction(options)) { - (ref1 = [options, onData]), (onData = ref1[0]), (onEnd = ref1[1]); - options = {}; - } - if (onData) { - return new XMLDocumentCB(options, onData, onEnd); - } else { - return new XMLDocument(options); - } - }; - - module.exports.stringWriter = function (options) { - return new XMLStringWriter(options); - }; - - module.exports.streamWriter = function (stream, options) { - return new XMLStreamWriter(stream, options); - }; - }).call(this); - }, - { - "./Utility": 68, - "./XMLDocument": 78, - "./XMLDocumentCB": 79, - "./XMLStreamWriter": 84, - "./XMLStringWriter": 85 - } - ] - }, - {}, - [21] - )(21); -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f5d937480..1e4ec2e412 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -550,7 +550,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -575,7 +575,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -609,7 +609,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -634,7 +634,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -662,7 +662,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -696,7 +696,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -724,7 +724,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -764,7 +764,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -798,7 +798,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -859,7 +859,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -927,7 +927,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -967,7 +967,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1001,7 +1001,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1044,7 +1044,7 @@ importers: devDependencies: '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1081,7 +1081,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1124,7 +1124,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1164,7 +1164,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1209,7 +1209,7 @@ importers: version: 6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9) mobx-react-lite: specifier: 4.0.7 - version: 4.0.7(patch_hash=47fd2d1b5c35554ddd4fa32fcaa928a16fda9f82dca0ff68bcdc1f7c3e5f9d1a)(mobx@6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9))(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0) + version: 4.0.7(patch_hash=47fd2d1b5c35554ddd4fa32fcaa928a16fda9f82dca0ff68bcdc1f7c3e5f9d1a)(mobx@6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9))(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0) devDependencies: '@mendix/automation-utils': specifier: workspace:* @@ -1219,7 +1219,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1264,7 +1264,7 @@ importers: version: 6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9) mobx-react-lite: specifier: 4.0.7 - version: 4.0.7(patch_hash=47fd2d1b5c35554ddd4fa32fcaa928a16fda9f82dca0ff68bcdc1f7c3e5f9d1a)(mobx@6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9))(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0) + version: 4.0.7(patch_hash=47fd2d1b5c35554ddd4fa32fcaa928a16fda9f82dca0ff68bcdc1f7c3e5f9d1a)(mobx@6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9))(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0) nanoevents: specifier: ^9.0.0 version: 9.0.0 @@ -1277,7 +1277,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1293,6 +1293,9 @@ importers: classnames: specifier: ^2.3.2 version: 2.3.2 + mammoth: + specifier: github:uicontent/mammoth + version: https://codeload.github.com/uicontent/mammoth/tar.gz/fb979cf1e789b2bfa43e61adb26c18b2c06d5c87 pdfjs-dist: specifier: ^5.0.375 version: 5.1.91 @@ -1311,7 +1314,7 @@ importers: version: 7.25.9(@babel/core@7.26.10) '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@rollup/plugin-replace': specifier: ^6.0.2 version: 6.0.2(rollup@3.29.5) @@ -1330,7 +1333,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1373,7 +1376,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1406,7 +1409,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1436,7 +1439,7 @@ importers: version: 6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9) mobx-react-lite: specifier: 4.0.7 - version: 4.0.7(patch_hash=47fd2d1b5c35554ddd4fa32fcaa928a16fda9f82dca0ff68bcdc1f7c3e5f9d1a)(mobx@6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9))(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0) + version: 4.0.7(patch_hash=47fd2d1b5c35554ddd4fa32fcaa928a16fda9f82dca0ff68bcdc1f7c3e5f9d1a)(mobx@6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9))(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0) react-dropzone: specifier: ^14.2.3 version: 14.2.9(react@18.2.0) @@ -1449,7 +1452,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1491,7 +1494,7 @@ importers: version: 6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9) mobx-react-lite: specifier: 4.0.7 - version: 4.0.7(patch_hash=47fd2d1b5c35554ddd4fa32fcaa928a16fda9f82dca0ff68bcdc1f7c3e5f9d1a)(mobx@6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9))(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0) + version: 4.0.7(patch_hash=47fd2d1b5c35554ddd4fa32fcaa928a16fda9f82dca0ff68bcdc1f7c3e5f9d1a)(mobx@6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9))(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0) devDependencies: '@mendix/automation-utils': specifier: workspace:* @@ -1501,7 +1504,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1531,7 +1534,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1559,7 +1562,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1587,7 +1590,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1612,7 +1615,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1640,7 +1643,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1671,7 +1674,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1714,7 +1717,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1757,7 +1760,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1800,7 +1803,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1828,7 +1831,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1859,7 +1862,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1893,7 +1896,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1930,7 +1933,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -1967,7 +1970,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -2088,7 +2091,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -2125,7 +2128,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -2162,7 +2165,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -2202,7 +2205,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -2230,7 +2233,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -2261,7 +2264,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -2289,7 +2292,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -2320,7 +2323,7 @@ importers: version: link:../../shared/eslint-config-web-widgets '@mendix/pluggable-widgets-tools': specifier: 10.18.2 - version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1) + version: 10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0)(tslib@2.8.1) '@mendix/prettier-config-web-widgets': specifier: workspace:* version: link:../../shared/prettier-config-web-widgets @@ -5123,6 +5126,10 @@ packages: '@xml-tools/parser@1.0.11': resolution: {integrity: sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==} + '@xmldom/xmldom@0.8.10': + resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} + engines: {node: '>=10.0.0'} + '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -6364,6 +6371,9 @@ packages: resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} engines: {node: '>=0.3.1'} + dingbat-to-unicode@1.0.1: + resolution: {integrity: sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -6450,6 +6460,9 @@ packages: resolution: {integrity: sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg==} engines: {node: '>= 0.8.0'} + duck@0.1.12: + resolution: {integrity: sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -7570,6 +7583,9 @@ packages: engines: {node: '>=16.x'} hasBin: true + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + immutable@4.3.0: resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} @@ -8276,6 +8292,9 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + junk@1.0.3: resolution: {integrity: sha512-3KF80UaaSSxo8jVnRYtMKNGFOoVPBdkkVPsw+Ad0y4oxKXPduS6G6iHkrf69yJVff/VAaYXkV42rtZ7daJxU3w==} engines: {node: '>=0.10.0'} @@ -8324,6 +8343,9 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lighthouse-logger@1.4.2: resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} @@ -8466,6 +8488,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lop@0.4.2: + resolution: {integrity: sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -8510,6 +8535,12 @@ packages: makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + mammoth@https://codeload.github.com/uicontent/mammoth/tar.gz/fb979cf1e789b2bfa43e61adb26c18b2c06d5c87: + resolution: {tarball: https://codeload.github.com/uicontent/mammoth/tar.gz/fb979cf1e789b2bfa43e61adb26c18b2c06d5c87} + version: 1.9.0 + engines: {node: '>=12.0.0'} + hasBin: true + map-limit@0.0.1: resolution: {integrity: sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==} @@ -9036,6 +9067,9 @@ packages: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} + option@0.2.4: + resolution: {integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==} + optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} @@ -9108,6 +9142,9 @@ packages: resolution: {integrity: sha512-gFL35q7kbE/zBaPA3UKhp2vSzcPYx2ecbYuwv1ucE9Il6IIgBDweBlH8D68UFGZic2MkllKa2KHCfC1IQBQUYA==} engines: {node: '>=12'} + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + parchment@3.0.0: resolution: {integrity: sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==} @@ -10315,6 +10352,9 @@ packages: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -11063,6 +11103,9 @@ packages: peerDependencies: react: ^18.0.0 + underscore@1.13.7: + resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -11432,6 +11475,10 @@ packages: xml@1.0.1: resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + xmlbuilder@10.1.1: + resolution: {integrity: sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==} + engines: {node: '>=4.0'} + xmlbuilder@11.0.1: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} @@ -14275,112 +14322,6 @@ snapshots: - tslib - utf-8-validate - '@mendix/pluggable-widgets-tools@10.18.2(@jest/transform@29.7.0)(@jest/types@29.6.3)(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/babel__core@7.20.3)(@types/node@22.14.0)(picomatch@4.0.2)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)(tslib@2.8.1)': - dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/preset-env': 7.26.9(@babel/core@7.26.10) - '@babel/preset-react': 7.26.3(@babel/core@7.26.10) - '@cfaester/enzyme-adapter-react-18': 0.6.0(enzyme@3.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@prettier/plugin-xml': 1.2.0 - '@rollup/plugin-alias': 5.1.1(rollup@3.29.5) - '@rollup/plugin-babel': 6.0.4(@babel/core@7.26.10)(@types/babel__core@7.20.3)(rollup@3.29.5) - '@rollup/plugin-commonjs': 28.0.3(rollup@3.29.5) - '@rollup/plugin-image': 3.0.3(rollup@3.29.5) - '@rollup/plugin-json': 6.1.0(rollup@3.29.5) - '@rollup/plugin-node-resolve': 15.3.1(rollup@3.29.5) - '@rollup/plugin-terser': 0.4.4(rollup@3.29.5) - '@rollup/plugin-typescript': 12.1.2(rollup@3.29.5)(tslib@2.8.1)(typescript@5.8.2) - '@rollup/plugin-url': 8.0.2(rollup@3.29.5) - '@rollup/pluginutils': 5.1.4(rollup@3.29.5) - '@testing-library/dom': 8.20.1 - '@testing-library/jest-dom': 5.17.0 - '@testing-library/react': 13.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@testing-library/user-event': 14.5.1(@testing-library/dom@8.20.1) - '@types/react': 18.2.36 - '@types/react-dom': 18.2.14 - '@types/react-native': 0.72.8(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)) - '@types/testing-library__jest-dom': 5.14.9 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.8.2))(eslint@7.32.0)(typescript@5.8.2) - '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@5.8.2) - ansi-colors: 4.1.1 - babel-eslint: 10.1.0(eslint@7.32.0) - babel-jest: 29.7.0(@babel/core@7.26.10) - big.js: 6.2.2 - concurrently: 6.5.1 - core-js: 3.33.2 - dotenv: 8.6.0 - enzyme: 3.11.0 - enzyme-to-json: 3.6.2(enzyme@3.11.0) - eslint: 7.32.0 - eslint-config-prettier: 8.10.0(eslint@7.32.0) - eslint-plugin-jest: 24.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@5.8.2))(eslint@7.32.0)(typescript@5.8.2))(eslint@7.32.0)(typescript@5.8.2) - eslint-plugin-prettier: 3.4.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@3.5.3) - eslint-plugin-promise: 4.3.1 - eslint-plugin-react: 7.28.0(eslint@7.32.0) - eslint-plugin-react-hooks: 4.6.0(eslint@7.32.0) - fast-glob: 3.3.2 - find-free-port: 2.0.0 - fs-extra: 9.1.0 - identity-obj-proxy: 3.0.0 - jasmine: 3.99.0 - jasmine-core: 3.99.1 - jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2)) - jest-environment-jsdom: 29.7.0 - jest-jasmine2: 29.7.0 - jest-junit: 13.2.0 - jest-react-hooks-shallow: 1.5.1 - make-dir: 3.1.0 - mendix: 10.20.60519 - metro-react-native-babel-preset: 0.74.1(@babel/core@7.26.10) - mime: 3.0.0 - node-fetch: 2.7.0 - postcss: 8.4.47 - postcss-import: 14.1.0(postcss@8.4.47) - postcss-url: 10.1.3(postcss@8.4.47) - prettier: 3.5.3 - react-test-renderer: 18.2.0(react@18.2.0) - recursive-copy: 2.0.14 - resolve: 1.22.8 - rollup: 3.29.5 - rollup-plugin-clear: 2.0.7 - rollup-plugin-command: 1.1.3 - rollup-plugin-license: 3.6.0(picomatch@4.0.2)(rollup@3.29.5) - rollup-plugin-livereload: 2.0.5 - rollup-plugin-postcss: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2)) - rollup-plugin-re: 1.0.7 - sass: 1.58.3 - semver: 7.7.1 - shelljs: 0.8.5 - shx: 0.3.4 - ts-jest: 29.2.6(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2)))(typescript@5.8.2) - ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.15))(@types/node@22.14.0)(typescript@5.8.2) - typescript: 5.8.2 - xml2js: 0.6.2 - zip-a-folder: 0.0.12 - transitivePeerDependencies: - - '@jest/transform' - - '@jest/types' - - '@swc/core' - - '@swc/wasm' - - '@types/babel__core' - - '@types/node' - - babel-plugin-macros - - bufferutil - - canvas - - encoding - - esbuild - - node-notifier - - picomatch - - react - - react-dom - - react-native - - supports-color - - tslib - - utf-8-validate - '@napi-rs/canvas-android-arm64@0.1.68': optional: true @@ -14570,17 +14511,6 @@ snapshots: execa: 5.1.1 fast-glob: 3.3.2 - '@react-native-community/cli-config@14.1.0': - dependencies: - '@react-native-community/cli-tools': 14.1.0 - chalk: 4.1.2 - cosmiconfig: 9.0.0 - deepmerge: 4.3.1 - fast-glob: 3.3.2 - joi: 17.13.3 - transitivePeerDependencies: - - typescript - '@react-native-community/cli-config@14.1.0(typescript@5.1.6)': dependencies: '@react-native-community/cli-tools': 14.1.0 @@ -14609,27 +14539,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@react-native-community/cli-doctor@14.1.0': - dependencies: - '@react-native-community/cli-config': 14.1.0 - '@react-native-community/cli-platform-android': 14.1.0 - '@react-native-community/cli-platform-apple': 14.1.0 - '@react-native-community/cli-platform-ios': 14.1.0 - '@react-native-community/cli-tools': 14.1.0 - chalk: 4.1.2 - command-exists: 1.2.9 - deepmerge: 4.3.1 - envinfo: 7.14.0 - execa: 5.1.1 - node-stream-zip: 1.15.0 - ora: 5.4.1 - semver: 7.7.1 - strip-ansi: 5.2.0 - wcwidth: 1.0.1 - yaml: 2.6.0 - transitivePeerDependencies: - - typescript - '@react-native-community/cli-doctor@14.1.0(typescript@5.1.6)': dependencies: '@react-native-community/cli-config': 14.1.0(typescript@5.1.6) @@ -14727,30 +14636,6 @@ snapshots: dependencies: joi: 17.13.3 - '@react-native-community/cli@14.1.0': - dependencies: - '@react-native-community/cli-clean': 14.1.0 - '@react-native-community/cli-config': 14.1.0 - '@react-native-community/cli-debugger-ui': 14.1.0 - '@react-native-community/cli-doctor': 14.1.0 - '@react-native-community/cli-server-api': 14.1.0 - '@react-native-community/cli-tools': 14.1.0 - '@react-native-community/cli-types': 14.1.0 - chalk: 4.1.2 - commander: 9.5.0 - deepmerge: 4.3.1 - execa: 5.1.1 - find-up: 5.0.0 - fs-extra: 8.1.0 - graceful-fs: 4.2.11 - prompts: 2.4.2 - semver: 7.7.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - typescript - - utf-8-validate - '@react-native-community/cli@14.1.0(typescript@5.1.6)': dependencies: '@react-native-community/cli-clean': 14.1.0 @@ -15053,12 +14938,6 @@ snapshots: nullthrows: 1.1.1 react-native: 0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2) - '@react-native/virtualized-lists@0.72.8(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))': - dependencies: - invariant: 2.2.4 - nullthrows: 1.1.1 - react-native: 0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0) - '@react-native/virtualized-lists@0.75.3(@types/react@18.2.36)(react-native@0.75.3(@babel/core@7.21.0)(@babel/preset-env@7.26.9(@babel/core@7.21.0))(@types/react@18.2.36)(react@18.2.0)(typescript@5.1.6))(react@18.2.0)': dependencies: invariant: 2.2.4 @@ -15086,15 +14965,6 @@ snapshots: optionalDependencies: '@types/react': 18.2.36 - '@react-native/virtualized-lists@0.75.3(@types/react@18.2.36)(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0)': - dependencies: - invariant: 2.2.4 - nullthrows: 1.1.1 - react: 18.2.0 - react-native: 0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.36 - '@restart/hooks@0.4.9(react@18.2.0)': dependencies: dequal: 2.0.3 @@ -15603,13 +15473,6 @@ snapshots: transitivePeerDependencies: - react-native - '@types/react-native@0.72.8(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))': - dependencies: - '@react-native/virtualized-lists': 0.72.8(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)) - '@types/react': 18.2.36 - transitivePeerDependencies: - - react-native - '@types/react-plotly.js@2.6.3': dependencies: '@types/plotly.js': 2.12.30 @@ -16083,6 +15946,8 @@ snapshots: dependencies: chevrotain: 7.1.1 + '@xmldom/xmldom@0.8.10': {} + '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} @@ -17077,7 +16942,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.1 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) copy-webpack-plugin@11.0.0(webpack@5.96.1): dependencies: @@ -17121,13 +16986,6 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@9.0.0: - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - cosmiconfig@9.0.0(typescript@5.1.6): dependencies: env-paths: 2.2.1 @@ -17270,7 +17128,7 @@ snapshots: postcss-modules-values: 4.0.0(postcss@8.4.21) postcss-value-parser: 4.2.0 semver: 7.5.1 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) css-loader@6.7.3(webpack@5.96.1): dependencies: @@ -17649,6 +17507,8 @@ snapshots: diff@5.0.0: {} + dingbat-to-unicode@1.0.1: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -17753,6 +17613,10 @@ snapshots: dtype@2.0.0: {} + duck@0.1.12: + dependencies: + underscore: 1.13.7 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -19236,6 +19100,8 @@ snapshots: dependencies: queue: 6.0.2 + immediate@3.0.6: {} + immutable@4.3.0: {} import-cwd@3.0.0: @@ -20322,6 +20188,13 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.1 + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + junk@1.0.3: {} katex@0.16.11: @@ -20360,6 +20233,10 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lie@3.3.0: + dependencies: + immediate: 3.0.6 + lighthouse-logger@1.4.2: dependencies: debug: 2.6.9 @@ -20485,6 +20362,12 @@ snapshots: dependencies: js-tokens: 4.0.0 + lop@0.4.2: + dependencies: + duck: 0.1.12 + option: 0.2.4 + underscore: 1.13.7 + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -20528,6 +20411,18 @@ snapshots: dependencies: tmpl: 1.0.5 + mammoth@https://codeload.github.com/uicontent/mammoth/tar.gz/fb979cf1e789b2bfa43e61adb26c18b2c06d5c87: + dependencies: + '@xmldom/xmldom': 0.8.10 + argparse: 1.0.10 + base64-js: 1.5.1 + dingbat-to-unicode: 1.0.1 + jszip: 3.10.1 + lop: 0.4.2 + path-is-absolute: 1.0.1 + underscore: 1.13.7 + xmlbuilder: 10.1.1 + map-limit@0.0.1: dependencies: once: 1.3.3 @@ -20953,14 +20848,14 @@ snapshots: mkdirp@1.0.4: {} - mobx-react-lite@4.0.7(patch_hash=47fd2d1b5c35554ddd4fa32fcaa928a16fda9f82dca0ff68bcdc1f7c3e5f9d1a)(mobx@6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9))(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0): + mobx-react-lite@4.0.7(patch_hash=47fd2d1b5c35554ddd4fa32fcaa928a16fda9f82dca0ff68bcdc1f7c3e5f9d1a)(mobx@6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9))(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2))(react@18.2.0): dependencies: mobx: 6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9) react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) optionalDependencies: react-dom: 18.2.0(react@18.2.0) - react-native: 0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0) + react-native: 0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.8.2) mobx-react-lite@4.0.7(patch_hash=47fd2d1b5c35554ddd4fa32fcaa928a16fda9f82dca0ff68bcdc1f7c3e5f9d1a)(mobx@6.12.3(patch_hash=39c55279e8f75c9a322eba64dd22e1a398f621c64bbfc3632e55a97f46edfeb9))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: @@ -21248,6 +21143,8 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 + option@0.2.4: {} + optionator@0.8.3: dependencies: deep-is: 0.1.4 @@ -21333,6 +21230,8 @@ snapshots: package-name-regex@2.0.6: {} + pako@1.0.11: {} + parchment@3.0.0: {} parent-module@1.0.1: @@ -22385,59 +22284,6 @@ snapshots: - typescript - utf-8-validate - react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0): - dependencies: - '@jest/create-cache-key-function': 29.7.0 - '@react-native-community/cli': 14.1.0 - '@react-native-community/cli-platform-android': 14.1.0 - '@react-native-community/cli-platform-ios': 14.1.0 - '@react-native/assets-registry': 0.75.3 - '@react-native/codegen': 0.75.3(@babel/preset-env@7.26.9(@babel/core@7.26.10)) - '@react-native/community-cli-plugin': 0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10)) - '@react-native/gradle-plugin': 0.75.3 - '@react-native/js-polyfills': 0.75.3 - '@react-native/normalize-colors': 0.75.3 - '@react-native/virtualized-lists': 0.75.3(@types/react@18.2.36)(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0))(react@18.2.0) - abort-controller: 3.0.0 - anser: 1.4.10 - ansi-regex: 5.0.1 - base64-js: 1.5.1 - chalk: 4.1.2 - commander: 9.5.0 - event-target-shim: 5.0.1 - flow-enums-runtime: 0.0.6 - glob: 7.2.3 - invariant: 2.2.4 - jest-environment-node: 29.7.0 - jsc-android: 250231.0.0 - memoize-one: 5.2.1 - metro-runtime: 0.80.12 - metro-source-map: 0.80.12 - mkdirp: 0.5.6 - nullthrows: 1.1.1 - pretty-format: 26.6.2 - promise: 8.3.0 - react: 18.2.0 - react-devtools-core: 5.3.2 - react-refresh: 0.14.2 - regenerator-runtime: 0.13.11 - scheduler: 0.24.0-canary-efb381bbf-20230505 - semver: 7.7.1 - stacktrace-parser: 0.1.10 - whatwg-fetch: 3.6.20 - ws: 6.2.3 - yargs: 17.7.2 - optionalDependencies: - '@types/react': 18.2.36 - transitivePeerDependencies: - - '@babel/core' - - '@babel/preset-env' - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.2.36)(react@18.2.0)(typescript@5.1.6): dependencies: '@jest/create-cache-key-function': 29.7.0 @@ -23089,7 +22935,7 @@ snapshots: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) optionalDependencies: sass: 1.58.3 @@ -23246,6 +23092,8 @@ snapshots: is-plain-object: 2.0.4 split-string: 3.1.0 + setimmediate@1.0.5: {} + setprototypeof@1.2.0: {} shallow-clone@3.0.1: @@ -23734,7 +23582,7 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) optionalDependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.15) @@ -23894,7 +23742,7 @@ snapshots: micromatch: 4.0.5 semver: 7.5.1 typescript: 5.1.6 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@5.0.1) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.15))(webpack-cli@4.10.0) ts-loader@9.4.2(typescript@5.1.6)(webpack@5.96.1): dependencies: @@ -24129,6 +23977,8 @@ snapshots: react: 18.2.0 react-lifecycles-compat: 3.0.4 + underscore@1.13.7: {} + undici-types@6.21.0: {} unicode-canonical-property-names-ecmascript@2.0.0: {} @@ -24566,6 +24416,8 @@ snapshots: xml@1.0.1: {} + xmlbuilder@10.1.1: {} + xmlbuilder@11.0.1: {} xmlchars@2.2.0: {}