@cairn-tool/cairn 3.2.0 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -29
- package/dist/agent/audit/index.d.ts +6 -6
- package/dist/agent/audit/index.js +6 -17
- package/dist/agent/audit/index.js.map +1 -1
- package/dist/atomic-write.d.ts +22 -0
- package/dist/atomic-write.js +42 -0
- package/dist/atomic-write.js.map +1 -0
- package/dist/binary-kind.d.ts +13 -0
- package/dist/binary-kind.js +25 -0
- package/dist/binary-kind.js.map +1 -0
- package/dist/cli.js +543 -250
- package/dist/cli.js.map +1 -1
- package/dist/commands/jira.js +1 -21
- package/dist/commands/jira.js.map +1 -1
- package/dist/commands/pdf.d.ts +29 -0
- package/dist/commands/pdf.js +345 -0
- package/dist/commands/pdf.js.map +1 -0
- package/dist/contract/registry.js +64 -0
- package/dist/contract/registry.js.map +1 -1
- package/dist/contract/schemas/index.js +2 -0
- package/dist/contract/schemas/index.js.map +1 -1
- package/dist/contract/schemas/pdf.d.ts +2 -0
- package/dist/contract/schemas/pdf.js +292 -0
- package/dist/contract/schemas/pdf.js.map +1 -0
- package/dist/jira/adf/to-markdown.js +2 -32
- package/dist/jira/adf/to-markdown.js.map +1 -1
- package/dist/markdown-stringify.d.ts +35 -0
- package/dist/markdown-stringify.js +44 -0
- package/dist/markdown-stringify.js.map +1 -0
- package/dist/pdf/attachments.d.ts +50 -0
- package/dist/pdf/attachments.js +229 -0
- package/dist/pdf/attachments.js.map +1 -0
- package/dist/pdf/diagnostics.d.ts +110 -0
- package/dist/pdf/diagnostics.js +137 -0
- package/dist/pdf/diagnostics.js.map +1 -0
- package/dist/pdf/document.d.ts +159 -0
- package/dist/pdf/document.js +272 -0
- package/dist/pdf/document.js.map +1 -0
- package/dist/pdf/forms.d.ts +9 -0
- package/dist/pdf/forms.js +101 -0
- package/dist/pdf/forms.js.map +1 -0
- package/dist/pdf/inspect.d.ts +42 -0
- package/dist/pdf/inspect.js +232 -0
- package/dist/pdf/inspect.js.map +1 -0
- package/dist/pdf/layout.d.ts +78 -0
- package/dist/pdf/layout.js +524 -0
- package/dist/pdf/layout.js.map +1 -0
- package/dist/pdf/outline.d.ts +30 -0
- package/dist/pdf/outline.js +127 -0
- package/dist/pdf/outline.js.map +1 -0
- package/dist/pdf/read.d.ts +62 -0
- package/dist/pdf/read.js +193 -0
- package/dist/pdf/read.js.map +1 -0
- package/dist/pdf/struct.d.ts +35 -0
- package/dist/pdf/struct.js +226 -0
- package/dist/pdf/struct.js.map +1 -0
- package/dist/pdf/text.d.ts +71 -0
- package/dist/pdf/text.js +166 -0
- package/dist/pdf/text.js.map +1 -0
- package/dist/pdf/to-markdown.d.ts +22 -0
- package/dist/pdf/to-markdown.js +289 -0
- package/dist/pdf/to-markdown.js.map +1 -0
- package/dist/pdf/types.d.ts +205 -0
- package/dist/pdf/types.js +2 -0
- package/dist/pdf/types.js.map +1 -0
- package/dist/pdf/validate.d.ts +51 -0
- package/dist/pdf/validate.js +136 -0
- package/dist/pdf/validate.js.map +1 -0
- package/dist/serve/pdf-tools.d.ts +2 -0
- package/dist/serve/pdf-tools.js +196 -0
- package/dist/serve/pdf-tools.js.map +1 -0
- package/dist/serve/tools.d.ts +2 -17
- package/dist/serve/tools.js +4 -0
- package/dist/serve/tools.js.map +1 -1
- package/dist/serve/types.d.ts +22 -0
- package/dist/serve/types.js +2 -0
- package/dist/serve/types.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"struct.js","sourceRoot":"","sources":["../../src/pdf/struct.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,kBAAkB,CAAC;AAqBzD,MAAM,CAAC,MAAM,aAAa,GAAgC;IACxD,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,wCAAwC,EAAE;IAC3F,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,wCAAwC,EAAE;IACvF,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,wCAAwC,EAAE;IACtF,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,wCAAwC,EAAE;IACvF,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,wCAAwC,EAAE;IACtF,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,wCAAwC,EAAE;IAC5F,4EAA4E;IAC5E,+DAA+D;IAC/D,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,uCAAuC,EAAE;IAE1F,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE;IAChF,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE;IAChF,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE;IAChF,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE;IAChF,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE;IAChF,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE;IAChF,CAAC,EAAE;QACD,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,2CAA2C;KAClD;IACD,KAAK,EAAE;QACL,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,aAAa;QACtB,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,+BAA+B;KACtC;IAED,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE;IACjE,CAAC,EAAE;QACD,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,mDAAmD;KAC1D;IACD,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE;IACjE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,wCAAwC,EAAE;IACtF,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,0CAA0C,EAAE;IAE1F,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,wCAAwC,EAAE;IACxF,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,wCAAwC,EAAE;IAC1F,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,wCAAwC,EAAE;IAExF,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE;IAC7D,8EAA8E;IAC9E,2EAA2E;IAC3E,qEAAqE;IACrE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,4CAA4C,EAAE;IAC5F,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,4CAA4C,EAAE;IAC5F,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,4CAA4C,EAAE;IAC5F,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE;IACjE,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE;IACnE,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE;IAEpE,UAAU,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE;IAC7E,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,wCAAwC,EAAE;IAC/F,OAAO,EAAE;QACP,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,wCAAwC;KAC/C;IACD,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,mCAAmC,EAAE;IAC9F,OAAO,EAAE;QACP,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,mCAAmC;KAC1C;IACD,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,2CAA2C,EAAE;IACjG,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,4BAA4B,EAAE;IAEvF,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,0CAA0C,EAAE;IACzF,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,0CAA0C,EAAE;IAC1F,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,0CAA0C,EAAE;IAC/F,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,0CAA0C,EAAE;IAC9F,QAAQ,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACvF,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,yCAAyC,EAAE;IAC9F,oEAAoE;IACpE,4EAA4E;IAC5E,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,0CAA0C,EAAE;IAC/F,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,0CAA0C,EAAE;IACvF,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,0CAA0C,EAAE;IAC7F,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,0CAA0C,EAAE;IACvF,OAAO,EAAE;QACP,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,0CAA0C;KACjD;IACD,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,0CAA0C,EAAE;IACvF,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,0CAA0C,EAAE;IACvF,+DAA+D;IAC/D,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,2CAA2C,EAAE;IAChG,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,yCAAyC,EAAE;CAChG,CAAC;AAEF,iFAAiF;AACjF,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,SAAS,QAAQ,CAAC,IAAqB;IACrC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzC,6EAA6E;QAC7E,qBAAqB;QACrB,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;YAC7E,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvE,QAAQ,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;YACxD,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAQD;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAA0B,EAC1B,IAAqB,EACrB,IAAoB,EACpB,IAAY;IAEZ,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAEhD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,IAAI;YAAE,SAAS;QACxB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;YACxB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAE5D,MAAM,UAAU,GAAG,CAAC,OAAuB,EAAE,IAAa,EAAuB,EAAE,CAAC,CAAC;QACnF,IAAI,EAAE,QAAQ;QACd,OAAO;QACP,KAAK,EAAE,CAAC,IAAI,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1B,CAAC,CAAC;IAEH,0DAA0D;IAC1D,MAAM,MAAM,GAAG,CAAC,IAAmB,EAAE,KAAa,EAAmB,EAAE;QACrE,IAAI,KAAK,GAAG,gBAAgB;YAAE,OAAO,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,IAAmB,EAAE,KAAa,EAAW,EAAE;QAC3D,IAAI,KAAK,GAAG,gBAAgB;YAAE,OAAO,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,MAAM;YAC1B,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAE1E,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,uEAAuE;YACvE,2EAA2E;YAC3E,8DAA8D;YAC9D,IAAI,CAAC,GAAG,CAAC;gBACP,IAAI,EAAE,KAAK,CAAC,WAAW;gBACvB,OAAO,EAAE,aAAa;gBACtB,OAAO,EAAE,mBAAmB,IAAI,wDAAwD;gBACxF,SAAS,EAAE,IAAI;gBACf,IAAI;aACL,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACrC,OAAO,QAAQ,CAAC,MAAM;gBACpB,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,WAAW;wBACjB,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC;wBACzB,QAAQ,EAAE,EAAE;wBACZ,UAAU,EAAE,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC;qBAC5C;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAElF,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI;YAAE,OAAO,QAAQ,CAAC;QAE5C,IAAI,OAAO,CAAC,OAAO,KAAK,aAAa;YAAE,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE3E,MAAM,SAAS,GACb,OAAO,CAAC,KAAK,KAAK,MAAM;YACxB,OAAO,CAAC,KAAK,KAAK,UAAU;YAC5B,OAAO,CAAC,KAAK,KAAK,OAAO;YACzB,OAAO,CAAC,KAAK,KAAK,UAAU;YAC5B,OAAO,CAAC,KAAK,KAAK,YAAY,CAAC;QAEjC,IAAI,SAAS;YACX,OAAO;gBACL;oBACE,IAAI,EAAE,OAAO,CAAC,KAAK;oBACnB,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvD,KAAK,EAAE,EAAE;oBACT,QAAQ;oBACR,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;iBAC9C;aACF,CAAC;QAEJ,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAE3D,OAAO;YACL;gBACE,IAAI,EAAE,OAAO,CAAC,KAAK;gBACnB,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,KAAK;gBACL,QAAQ,EAAE,OAAO,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;gBACvD,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;aAC9C;SACF,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACjD,CAAC;AAED,2EAA2E;AAC3E,SAAS,iBAAiB,CAAC,IAAY,EAAE,IAAoB,EAAE,IAAY;IACzE,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,IAAI,GACR,IAAI,KAAK,GAAG;QACV,CAAC,CAAC,KAAK,CAAC,oBAAoB;QAC5B,CAAC,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,KAAK;YAC9B,CAAC,CAAC,KAAK,CAAC,oBAAoB;YAC5B,CAAC,CAAC,IAAI,KAAK,QAAQ;gBACjB,CAAC,CAAC,KAAK,CAAC,cAAc;gBACtB,CAAC,CAAC,IAAI,CAAC;IACf,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { OpenDocument } from "./document.js";
|
|
2
|
+
/** Two decimal places, applied wherever a float reaches a payload or a compare. */
|
|
3
|
+
export declare function round2(value: number): number;
|
|
4
|
+
/**
|
|
5
|
+
* One positioned run of text, in page-upright coordinates.
|
|
6
|
+
*
|
|
7
|
+
* `x`/`y` are the baseline origin with y increasing **downwards** from the top
|
|
8
|
+
* left, which is what lets every comparison downstream read as "smaller y is
|
|
9
|
+
* higher on the page".
|
|
10
|
+
*/
|
|
11
|
+
export interface PositionedRun {
|
|
12
|
+
page: number;
|
|
13
|
+
/** Order within the page as pdf.js emitted it: the final sort tie-break. */
|
|
14
|
+
index: number;
|
|
15
|
+
text: string;
|
|
16
|
+
x: number;
|
|
17
|
+
y: number;
|
|
18
|
+
width: number;
|
|
19
|
+
height: number;
|
|
20
|
+
/** Effective font size in user units. */
|
|
21
|
+
size: number;
|
|
22
|
+
/**
|
|
23
|
+
* Document-stable font identity.
|
|
24
|
+
*
|
|
25
|
+
* `TextItem.fontName` is a *per-page* internal id (`g_d10_f1`) and the same id
|
|
26
|
+
* means different fonts on different pages, so keying anything document-wide
|
|
27
|
+
* on it is silently wrong past page one. That failure presents as "headings
|
|
28
|
+
* detected inconsistently", which is very hard to attribute, so the raw id
|
|
29
|
+
* never leaves this module.
|
|
30
|
+
*/
|
|
31
|
+
fontKey: string;
|
|
32
|
+
fontFamily: string;
|
|
33
|
+
bold: boolean;
|
|
34
|
+
italic: boolean;
|
|
35
|
+
vertical: boolean;
|
|
36
|
+
/** Right angles only; null means an arbitrary rotation, excluded from layout. */
|
|
37
|
+
angle: 0 | 90 | 180 | 270 | null;
|
|
38
|
+
hasEOL: boolean;
|
|
39
|
+
/** Marked-content id, when the caller asked for marked content. */
|
|
40
|
+
mcid: string | null;
|
|
41
|
+
}
|
|
42
|
+
export interface PageRuns {
|
|
43
|
+
page: number;
|
|
44
|
+
runs: PositionedRun[];
|
|
45
|
+
width: number;
|
|
46
|
+
height: number;
|
|
47
|
+
rotation: number;
|
|
48
|
+
/** Non-whitespace code points across the whole page, including dropped runs. */
|
|
49
|
+
characters: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Extracts one page's runs.
|
|
53
|
+
*
|
|
54
|
+
* Position comes from `viewport.convertToViewportPoint`, never from a
|
|
55
|
+
* hand-rolled matrix: `transform[4]`/`[5]` are PDF user space — y-up, origin
|
|
56
|
+
* bottom-left, `/Rotate` not applied — and the viewport applies the rotation and
|
|
57
|
+
* the flip in one call that cannot drift from pdf.js's own convention.
|
|
58
|
+
*/
|
|
59
|
+
export declare function extractPage(handle: OpenDocument, page: number, options?: {
|
|
60
|
+
markedContent?: boolean;
|
|
61
|
+
}): Promise<PageRuns>;
|
|
62
|
+
/**
|
|
63
|
+
* Renders one page's runs as plain text.
|
|
64
|
+
*
|
|
65
|
+
* Line grouping only — no paragraph, heading, or list inference, which is
|
|
66
|
+
* `to-markdown`'s job. Runs are ordered top to bottom then left to right, and a
|
|
67
|
+
* new line starts when the baseline moves by more than a third of the run
|
|
68
|
+
* height, which is the same tolerance `layout.ts` uses so the two agree about
|
|
69
|
+
* what a line is.
|
|
70
|
+
*/
|
|
71
|
+
export declare function runsToText(runs: PositionedRun[]): string;
|
package/dist/pdf/text.js
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/** Two decimal places, applied wherever a float reaches a payload or a compare. */
|
|
2
|
+
export function round2(value) {
|
|
3
|
+
return Math.round(value * 100) / 100;
|
|
4
|
+
}
|
|
5
|
+
const BOLD = /bold|black|heavy|semibold|demi/i;
|
|
6
|
+
const ITALIC = /italic|oblique/i;
|
|
7
|
+
function nonWhitespace(text) {
|
|
8
|
+
let count = 0;
|
|
9
|
+
for (const char of text)
|
|
10
|
+
if (!/\s/.test(char))
|
|
11
|
+
count += 1;
|
|
12
|
+
return count;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Snaps a rotation to a right angle, or reports that it is not one.
|
|
16
|
+
*
|
|
17
|
+
* Text at an arbitrary angle cannot participate in line grouping — every
|
|
18
|
+
* geometric assumption downstream is axis-aligned — so it is excluded and
|
|
19
|
+
* reported rather than being folded in at the wrong position.
|
|
20
|
+
*/
|
|
21
|
+
function angleOf(transform) {
|
|
22
|
+
const degrees = (Math.atan2(transform[1] ?? 0, transform[0] ?? 1) * 180) / Math.PI;
|
|
23
|
+
const normalized = ((degrees % 360) + 360) % 360;
|
|
24
|
+
for (const candidate of [0, 90, 180, 270]) {
|
|
25
|
+
const delta = Math.abs(normalized - candidate);
|
|
26
|
+
if (delta <= 1 || delta >= 359)
|
|
27
|
+
return candidate;
|
|
28
|
+
}
|
|
29
|
+
return normalized > 359 || normalized < 1 ? 0 : null;
|
|
30
|
+
}
|
|
31
|
+
function isTextItem(item) {
|
|
32
|
+
return typeof item.str === "string" && item.type === undefined;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Extracts one page's runs.
|
|
36
|
+
*
|
|
37
|
+
* Position comes from `viewport.convertToViewportPoint`, never from a
|
|
38
|
+
* hand-rolled matrix: `transform[4]`/`[5]` are PDF user space — y-up, origin
|
|
39
|
+
* bottom-left, `/Rotate` not applied — and the viewport applies the rotation and
|
|
40
|
+
* the flip in one call that cannot drift from pdf.js's own convention.
|
|
41
|
+
*/
|
|
42
|
+
export async function extractPage(handle, page, options = {}) {
|
|
43
|
+
const proxy = await handle.within(() => handle.doc.getPage(page));
|
|
44
|
+
try {
|
|
45
|
+
const viewport = proxy.getViewport({ scale: 1 });
|
|
46
|
+
const content = await handle.within(() => proxy.getTextContent({ includeMarkedContent: Boolean(options.markedContent) }));
|
|
47
|
+
const runs = [];
|
|
48
|
+
let characters = 0;
|
|
49
|
+
// Only `beginMarkedContentProps` carries an id, so the stack records the
|
|
50
|
+
// innermost id-bearing frame and text inherits it.
|
|
51
|
+
const stack = [];
|
|
52
|
+
let index = 0;
|
|
53
|
+
for (const item of content.items) {
|
|
54
|
+
if (item.type !== undefined) {
|
|
55
|
+
if (item.type.startsWith("begin"))
|
|
56
|
+
stack.push(item.id ?? null);
|
|
57
|
+
else if (item.type.startsWith("end"))
|
|
58
|
+
stack.pop();
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (!isTextItem(item))
|
|
62
|
+
continue;
|
|
63
|
+
const text = item.str ?? "";
|
|
64
|
+
characters += nonWhitespace(text);
|
|
65
|
+
if (text.trim() === "")
|
|
66
|
+
continue;
|
|
67
|
+
const transform = item.transform ?? [1, 0, 0, 1, 0, 0];
|
|
68
|
+
const [x, y] = viewport.convertToViewportPoint(transform[4] ?? 0, transform[5] ?? 0);
|
|
69
|
+
const style = content.styles[item.fontName ?? ""] ?? {};
|
|
70
|
+
const family = style.fontFamily ?? "";
|
|
71
|
+
const matrixSize = Math.hypot(transform[1] ?? 0, transform[3] ?? 1);
|
|
72
|
+
const size = round2(item.height && item.height > 0 ? item.height : matrixSize);
|
|
73
|
+
let mcid = null;
|
|
74
|
+
for (let depth = stack.length - 1; depth >= 0; depth -= 1) {
|
|
75
|
+
if (stack[depth]) {
|
|
76
|
+
mcid = stack[depth];
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
runs.push({
|
|
81
|
+
page,
|
|
82
|
+
index,
|
|
83
|
+
text,
|
|
84
|
+
x: round2(x),
|
|
85
|
+
y: round2(y),
|
|
86
|
+
width: round2(item.width ?? 0),
|
|
87
|
+
height: round2(item.height ?? 0),
|
|
88
|
+
size,
|
|
89
|
+
fontKey: `${family}@${size}`,
|
|
90
|
+
fontFamily: family,
|
|
91
|
+
// The only weight signal `getTextContent` offers. It works for embedded
|
|
92
|
+
// fonts with descriptive names and never for the standard 14, which
|
|
93
|
+
// pdf.js reports as a generic CSS family ("sans-serif") regardless of
|
|
94
|
+
// weight — so size stays the primary heading signal and this is a hint.
|
|
95
|
+
bold: BOLD.test(family),
|
|
96
|
+
italic: ITALIC.test(family),
|
|
97
|
+
vertical: Boolean(style.vertical),
|
|
98
|
+
angle: angleOf(transform),
|
|
99
|
+
hasEOL: Boolean(item.hasEOL),
|
|
100
|
+
mcid,
|
|
101
|
+
});
|
|
102
|
+
index += 1;
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
page,
|
|
106
|
+
runs,
|
|
107
|
+
width: round2(viewport.width),
|
|
108
|
+
height: round2(viewport.height),
|
|
109
|
+
rotation: viewport.rotation,
|
|
110
|
+
characters,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
// The per-page font and glyph caches. Without this a 900-page document
|
|
115
|
+
// exhausts memory on a machine that has plenty.
|
|
116
|
+
proxy.cleanup();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Renders one page's runs as plain text.
|
|
121
|
+
*
|
|
122
|
+
* Line grouping only — no paragraph, heading, or list inference, which is
|
|
123
|
+
* `to-markdown`'s job. Runs are ordered top to bottom then left to right, and a
|
|
124
|
+
* new line starts when the baseline moves by more than a third of the run
|
|
125
|
+
* height, which is the same tolerance `layout.ts` uses so the two agree about
|
|
126
|
+
* what a line is.
|
|
127
|
+
*/
|
|
128
|
+
export function runsToText(runs) {
|
|
129
|
+
if (runs.length === 0)
|
|
130
|
+
return "";
|
|
131
|
+
const ordered = [...runs].sort((a, b) => a.y - b.y || a.x - b.x || a.index - b.index);
|
|
132
|
+
const lines = [];
|
|
133
|
+
let current = [ordered[0]];
|
|
134
|
+
for (const run of ordered.slice(1)) {
|
|
135
|
+
const previous = current[current.length - 1];
|
|
136
|
+
const tolerance = Math.max(previous.size, run.size) * 0.35;
|
|
137
|
+
if (Math.abs(run.y - previous.y) <= tolerance)
|
|
138
|
+
current.push(run);
|
|
139
|
+
else {
|
|
140
|
+
lines.push(joinLine(current));
|
|
141
|
+
current = [run];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
lines.push(joinLine(current));
|
|
145
|
+
return lines.join("\n");
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Joins one line's runs, reconstructing word spacing from glyph advances.
|
|
149
|
+
*
|
|
150
|
+
* A PDF carries no spaces between separately positioned runs; the gap between
|
|
151
|
+
* where one run ends and the next begins is the only evidence, measured in
|
|
152
|
+
* multiples of the font size so it holds at any scale.
|
|
153
|
+
*/
|
|
154
|
+
function joinLine(runs) {
|
|
155
|
+
const ordered = [...runs].sort((a, b) => a.x - b.x || a.index - b.index);
|
|
156
|
+
let text = ordered[0].text;
|
|
157
|
+
for (let index = 1; index < ordered.length; index += 1) {
|
|
158
|
+
const previous = ordered[index - 1];
|
|
159
|
+
const run = ordered[index];
|
|
160
|
+
const gap = run.x - (previous.x + previous.width);
|
|
161
|
+
const needsSpace = gap > previous.size * 0.25 && !/\s$/.test(text) && !/^\s/.test(run.text);
|
|
162
|
+
text += needsSpace ? ` ${run.text}` : run.text;
|
|
163
|
+
}
|
|
164
|
+
return text.trimEnd();
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/pdf/text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { OpenDocument } from "./document.js";
|
|
2
|
+
import type { Block, PdfDiagnostic } from "./types.js";
|
|
3
|
+
export interface ToMarkdownResult {
|
|
4
|
+
markdown: string;
|
|
5
|
+
diagnostics: PdfDiagnostic[];
|
|
6
|
+
blocks: Block[];
|
|
7
|
+
}
|
|
8
|
+
export interface ConvertOptions {
|
|
9
|
+
/** Pages to emit. Statistics are still computed across the whole document. */
|
|
10
|
+
pages?: number[];
|
|
11
|
+
headingLevels?: Map<string, number>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Converts a document to Markdown.
|
|
15
|
+
*
|
|
16
|
+
* The path is chosen **per page**: a page whose structure tree carries at least
|
|
17
|
+
* one content leaf uses it, and any other page falls to geometry. Mixed
|
|
18
|
+
* documents are real — a scanned appendix bound onto a tagged report — and
|
|
19
|
+
* `getMarkInfo().Marked` alone is not sufficient evidence, since producers set
|
|
20
|
+
* it and ship empty trees.
|
|
21
|
+
*/
|
|
22
|
+
export declare function toMarkdown(handle: OpenDocument, options?: ConvertOptions): Promise<ToMarkdownResult>;
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { stringifyMarkdown } from "../markdown-stringify.js";
|
|
2
|
+
import { CODES, DiagnosticSink } from "./diagnostics.js";
|
|
3
|
+
import { blocksFromLayout } from "./layout.js";
|
|
4
|
+
import { blocksFromStruct } from "./struct.js";
|
|
5
|
+
import { extractPage } from "./text.js";
|
|
6
|
+
/** The five Latin ligatures a text layer routinely carries. */
|
|
7
|
+
const LIGATURES = {
|
|
8
|
+
ff: "ff",
|
|
9
|
+
fi: "fi",
|
|
10
|
+
fl: "fl",
|
|
11
|
+
ffi: "ffi",
|
|
12
|
+
ffl: "ffl",
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Normalizes one span's text.
|
|
16
|
+
*
|
|
17
|
+
* Ligature expansion is opinionated and worth the notice it carries: leaving
|
|
18
|
+
* U+FB01 in place breaks searching a converted document for "find", "office", or
|
|
19
|
+
* "file", which is most of the reason to convert to Markdown at all.
|
|
20
|
+
*
|
|
21
|
+
* Markdown syntax is deliberately *not* pre-escaped here — that is
|
|
22
|
+
* remark-stringify's job, and doing both double-escapes.
|
|
23
|
+
*/
|
|
24
|
+
function normalizeText(text, seen) {
|
|
25
|
+
let out = "";
|
|
26
|
+
for (const char of text) {
|
|
27
|
+
const expansion = LIGATURES[char];
|
|
28
|
+
if (expansion) {
|
|
29
|
+
seen.ligatures = true;
|
|
30
|
+
out += expansion;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const code = char.codePointAt(0) ?? 0;
|
|
34
|
+
if ((code < 32 && char !== "\t") || code === 127) {
|
|
35
|
+
seen.controls = true;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
out += char;
|
|
39
|
+
}
|
|
40
|
+
// Two byte sequences for the same visible text defeat every downstream grep.
|
|
41
|
+
return out.replace(/\s+/g, " ").normalize("NFC");
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Renders spans as phrasing content, in a fixed nesting order.
|
|
45
|
+
*
|
|
46
|
+
* Code innermost, then emphasis, then strong — fixed for the same reason the ADF
|
|
47
|
+
* converter fixes its mark order: mdast nests what the source keeps flat, and a
|
|
48
|
+
* varying nesting order varies the output bytes for identical input.
|
|
49
|
+
*/
|
|
50
|
+
function phrasing(spans, seen) {
|
|
51
|
+
const out = [];
|
|
52
|
+
for (const span of spans) {
|
|
53
|
+
const value = normalizeText(span.text, seen);
|
|
54
|
+
if (!value)
|
|
55
|
+
continue;
|
|
56
|
+
let node = span.code
|
|
57
|
+
? { type: "inlineCode", value }
|
|
58
|
+
: { type: "text", value };
|
|
59
|
+
if (span.italic)
|
|
60
|
+
node = { type: "emphasis", children: [node] };
|
|
61
|
+
if (span.bold)
|
|
62
|
+
node = { type: "strong", children: [node] };
|
|
63
|
+
out.push(node);
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
function paragraphOf(spans, seen) {
|
|
68
|
+
const children = phrasing(spans, seen);
|
|
69
|
+
return children.length ? { type: "paragraph", children } : null;
|
|
70
|
+
}
|
|
71
|
+
/** Converts one block. Never branches on `provenance.path`. */
|
|
72
|
+
function toMdast(block, sink, seen) {
|
|
73
|
+
switch (block.kind) {
|
|
74
|
+
case "heading": {
|
|
75
|
+
const children = phrasing(block.spans, seen);
|
|
76
|
+
if (!children.length)
|
|
77
|
+
return [];
|
|
78
|
+
return [
|
|
79
|
+
{
|
|
80
|
+
type: "heading",
|
|
81
|
+
depth: Math.min(Math.max(block.level ?? 1, 1), 6),
|
|
82
|
+
children,
|
|
83
|
+
},
|
|
84
|
+
];
|
|
85
|
+
}
|
|
86
|
+
case "paragraph":
|
|
87
|
+
case "figure":
|
|
88
|
+
case "code": {
|
|
89
|
+
if (block.kind === "code") {
|
|
90
|
+
const value = block.spans.map((span) => span.text).join("\n");
|
|
91
|
+
// `lang` and `meta` pinned null: nothing here can infer a language, and
|
|
92
|
+
// guessing one would be a claim the converter cannot support.
|
|
93
|
+
return value ? [{ type: "code", lang: null, meta: null, value }] : [];
|
|
94
|
+
}
|
|
95
|
+
const paragraph = paragraphOf(block.spans, seen);
|
|
96
|
+
return paragraph ? [paragraph] : [];
|
|
97
|
+
}
|
|
98
|
+
case "caption": {
|
|
99
|
+
const children = phrasing(block.spans, seen);
|
|
100
|
+
return children.length
|
|
101
|
+
? [{ type: "paragraph", children: [{ type: "emphasis", children }] }]
|
|
102
|
+
: [];
|
|
103
|
+
}
|
|
104
|
+
case "blockquote": {
|
|
105
|
+
const children = block.children.flatMap((child) => toMdast(child, sink, seen));
|
|
106
|
+
return children.length ? [{ type: "blockquote", children: children }] : [];
|
|
107
|
+
}
|
|
108
|
+
case "list": {
|
|
109
|
+
const items = block.children
|
|
110
|
+
.filter((child) => child.kind === "listItem")
|
|
111
|
+
.map((child) => {
|
|
112
|
+
const own = paragraphOf(child.spans, seen);
|
|
113
|
+
const nested = child.children.flatMap((grand) => toMdast(grand, sink, seen));
|
|
114
|
+
const content = [...(own ? [own] : []), ...nested];
|
|
115
|
+
// `spread` and `checked` pinned rather than derived from input
|
|
116
|
+
// whitespace, which would make the bytes depend on the source's
|
|
117
|
+
// incidental leading.
|
|
118
|
+
return { type: "listItem", spread: false, checked: null, children: content };
|
|
119
|
+
})
|
|
120
|
+
.filter((item) => item.children.length > 0);
|
|
121
|
+
return items.length
|
|
122
|
+
? [
|
|
123
|
+
{
|
|
124
|
+
type: "list",
|
|
125
|
+
ordered: Boolean(block.ordered),
|
|
126
|
+
start: null,
|
|
127
|
+
spread: false,
|
|
128
|
+
children: items,
|
|
129
|
+
},
|
|
130
|
+
]
|
|
131
|
+
: [];
|
|
132
|
+
}
|
|
133
|
+
case "listItem": {
|
|
134
|
+
const paragraph = paragraphOf(block.spans, seen);
|
|
135
|
+
return paragraph ? [paragraph] : [];
|
|
136
|
+
}
|
|
137
|
+
case "table": {
|
|
138
|
+
const rows = block.children.filter((child) => child.kind === "tableRow");
|
|
139
|
+
if (rows.length === 0)
|
|
140
|
+
return [];
|
|
141
|
+
const width = Math.max(...rows.map((row) => row.children.length));
|
|
142
|
+
const mdRows = rows.map((row) => {
|
|
143
|
+
const cells = row.children.slice(0, width).map((cell) => {
|
|
144
|
+
if (cell.children.length > 0)
|
|
145
|
+
sink.add({
|
|
146
|
+
code: CODES.cellSpanDropped,
|
|
147
|
+
quality: "approximate",
|
|
148
|
+
message: "A table cell's block content was flattened into inline content",
|
|
149
|
+
construct: "TD",
|
|
150
|
+
});
|
|
151
|
+
return { type: "tableCell", children: phrasing(cell.spans, seen) };
|
|
152
|
+
});
|
|
153
|
+
while (cells.length < width)
|
|
154
|
+
cells.push({ type: "tableCell", children: [] });
|
|
155
|
+
return { type: "tableRow", children: cells };
|
|
156
|
+
});
|
|
157
|
+
// Alignment is never inferred from geometry: an ADF cell has no alignment
|
|
158
|
+
// and neither does a reconstructed one, so claiming one would be invented.
|
|
159
|
+
const table = {
|
|
160
|
+
type: "table",
|
|
161
|
+
align: Array.from({ length: width }, () => null),
|
|
162
|
+
children: mdRows,
|
|
163
|
+
};
|
|
164
|
+
return [table];
|
|
165
|
+
}
|
|
166
|
+
default:
|
|
167
|
+
return [];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Converts a document to Markdown.
|
|
172
|
+
*
|
|
173
|
+
* The path is chosen **per page**: a page whose structure tree carries at least
|
|
174
|
+
* one content leaf uses it, and any other page falls to geometry. Mixed
|
|
175
|
+
* documents are real — a scanned appendix bound onto a tagged report — and
|
|
176
|
+
* `getMarkInfo().Marked` alone is not sufficient evidence, since producers set
|
|
177
|
+
* it and ship empty trees.
|
|
178
|
+
*/
|
|
179
|
+
export async function toMarkdown(handle, options = {}) {
|
|
180
|
+
const sink = new DiagnosticSink();
|
|
181
|
+
const seen = { ligatures: false, controls: false };
|
|
182
|
+
const { doc } = handle;
|
|
183
|
+
const all = Array.from({ length: doc.numPages }, (_, index) => index + 1);
|
|
184
|
+
const wanted = options.pages ?? all;
|
|
185
|
+
const selected = new Set(wanted);
|
|
186
|
+
const structBlocks = [];
|
|
187
|
+
const geometricPages = [];
|
|
188
|
+
let structCount = 0;
|
|
189
|
+
let geometricCount = 0;
|
|
190
|
+
for (const page of all) {
|
|
191
|
+
let runs;
|
|
192
|
+
try {
|
|
193
|
+
runs = await extractPage(handle, page, { markedContent: true });
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
sink.add({
|
|
197
|
+
code: CODES.contentUndecodable,
|
|
198
|
+
quality: "unsupported",
|
|
199
|
+
message: "The page's content stream could not be decoded; nothing was emitted for it",
|
|
200
|
+
page,
|
|
201
|
+
});
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
if (runs.runs.length === 0) {
|
|
205
|
+
if (selected.has(page))
|
|
206
|
+
sink.add({
|
|
207
|
+
code: CODES.noTextLayer,
|
|
208
|
+
quality: "unsupported",
|
|
209
|
+
message: "The page carries no text layer; nothing was emitted for it",
|
|
210
|
+
page,
|
|
211
|
+
remediation: "The page is an image. Recognizing its text needs OCR, which this toolset does not do.",
|
|
212
|
+
});
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
let tree;
|
|
216
|
+
try {
|
|
217
|
+
const proxy = await handle.within(() => doc.getPage(page));
|
|
218
|
+
tree = await handle.within(() => proxy.getStructTree());
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
tree = null;
|
|
222
|
+
}
|
|
223
|
+
const structured = blocksFromStruct(tree, runs.runs, sink, page);
|
|
224
|
+
if (structured.usable) {
|
|
225
|
+
structCount += 1;
|
|
226
|
+
if (selected.has(page))
|
|
227
|
+
structBlocks.push(...structured.blocks);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
geometricCount += 1;
|
|
231
|
+
geometricPages.push(runs);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Geometry runs over every page it owns, selected or not, so document-wide
|
|
235
|
+
// statistics — the modal body size, the heading ranking, repeated headers —
|
|
236
|
+
// are the same whether or not `--pages` narrowed the output. The selection is
|
|
237
|
+
// applied afterwards, which is what makes a page range a true subset of the
|
|
238
|
+
// full conversion rather than a differently-inferred document.
|
|
239
|
+
const geometric = geometricPages.length
|
|
240
|
+
? blocksFromLayout(geometricPages, sink, { headingLevels: options.headingLevels })
|
|
241
|
+
: [];
|
|
242
|
+
const geometricSelected = geometric.filter((block) => block.provenance.pages.some((page) => selected.has(page)));
|
|
243
|
+
const blocks = [...structBlocks, ...geometricSelected].sort((a, b) => (a.provenance.pages[0] ?? 0) - (b.provenance.pages[0] ?? 0));
|
|
244
|
+
// Always emitted, and deliberately a notice rather than an approximation:
|
|
245
|
+
// making "this document was untagged" itself blocking would mean --strict
|
|
246
|
+
// refuses essentially every real PDF, which makes the flag meaningless.
|
|
247
|
+
// --strict blocks on the per-construct losses instead.
|
|
248
|
+
sink.add({
|
|
249
|
+
code: CODES.conversionPath,
|
|
250
|
+
quality: "exact",
|
|
251
|
+
message: structCount && geometricCount
|
|
252
|
+
? `Mixed conversion: ${structCount} page(s) from the structure tree, ${geometricCount} from geometry`
|
|
253
|
+
: structCount
|
|
254
|
+
? `Converted ${structCount} page(s) from the document's structure tree`
|
|
255
|
+
: `Converted ${geometricCount} page(s) by inferring structure from geometry`,
|
|
256
|
+
remediation: geometricCount > 0
|
|
257
|
+
? "An untagged page has no paragraphs, headings, or lists to read — all of them are inferred."
|
|
258
|
+
: undefined,
|
|
259
|
+
});
|
|
260
|
+
if (options.pages)
|
|
261
|
+
sink.add({
|
|
262
|
+
code: CODES.pageSubsetConverted,
|
|
263
|
+
quality: "exact",
|
|
264
|
+
message: `Emitted ${wanted.length} of ${doc.numPages} page(s); document-wide inference still used every page`,
|
|
265
|
+
});
|
|
266
|
+
if (geometricCount > 0)
|
|
267
|
+
sink.add({
|
|
268
|
+
code: CODES.inlineStyleInferred,
|
|
269
|
+
quality: "approximate",
|
|
270
|
+
message: "Bold and italic are inferred from font names; underline, strikethrough, and super/subscript are not represented",
|
|
271
|
+
remediation: "The standard 14 fonts report a generic family, so weight is undetectable in documents using them.",
|
|
272
|
+
});
|
|
273
|
+
if (seen.ligatures)
|
|
274
|
+
sink.add({
|
|
275
|
+
code: CODES.ligaturesExpanded,
|
|
276
|
+
quality: "exact",
|
|
277
|
+
message: "Typographic ligatures were expanded to their component letters",
|
|
278
|
+
});
|
|
279
|
+
if (seen.controls)
|
|
280
|
+
sink.add({
|
|
281
|
+
code: CODES.controlCharactersStripped,
|
|
282
|
+
quality: "exact",
|
|
283
|
+
message: "Control characters in the text layer were removed",
|
|
284
|
+
});
|
|
285
|
+
const children = blocks.flatMap((block) => toMdast(block, sink, seen));
|
|
286
|
+
const root = { type: "root", children };
|
|
287
|
+
return { markdown: stringifyMarkdown(root), diagnostics: sink.all(), blocks };
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=to-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-markdown.js","sourceRoot":"","sources":["../../src/pdf/to-markdown.ts"],"names":[],"mappings":"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"}
|