@mdgate/odf 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/odf.d.ts +2 -0
- package/dist/to-markdown.d.ts +6 -0
- package/package.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# @mdgate/odf
|
|
2
|
+
|
|
3
|
+
Convert OpenDocument text, spreadsheets, and presentations to Markdown. Outputs GitHub-Flavored Markdown. Works in Node, Edge, and
|
|
4
|
+
browsers. No native addons.
|
|
5
|
+
|
|
6
|
+
Handles: `.odt`, `.ods`, `.odp`
|
|
7
|
+
|
|
8
|
+
## Usage
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
import { toMarkdown } from '@mdgate/odf';
|
|
12
|
+
|
|
13
|
+
const markdown = await toMarkdown(bytes);
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Compose with other converters:
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
import { create } from '@mdgate/core';
|
|
20
|
+
import { odf } from '@mdgate/odf';
|
|
21
|
+
|
|
22
|
+
const convert = create([odf()]);
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Part of [mdgate converters](https://github.com/mdgate/converters); install
|
|
26
|
+
`@mdgate/converters` for every format at once.
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{detectZipDoc as UZ}from"@mdgate/containers";import{documentToMarkdown as MZ}from"@mdgate/document";import{fileExtension as VZ}from"@mdgate/utils";import{ns as V,Package as WZ}from"@mdgate/containers";import{ConvertError as n}from"@mdgate/core";import{inlinesAreEmpty as a,inlinesToPlainText as YZ}from"@mdgate/document";import{AssetSink as GZ}from"@mdgate/office-common";import{ns as j}from"@mdgate/containers";import{ConvertError as B8}from"@mdgate/core";import{emptyDelta as Z8,fromStyleName as I8,mergeDelta as T8}from"@mdgate/office-common";var F=10;function q8(){return{marker:"bullet",start:1,prefix:"",suffix:void 0,displayLevels:1}}function h(z,Z){let q=[];if(z.prefix.length>0)q.push({type:"literal",text:z.prefix});let J=E8(z.displayLevels,1,Z+1),Q=Z+1-J,$=0;for(let K=Q;K<=Z;K+=1){if($>0)q.push({type:"literal",text:"."});q.push({type:"level",level:K}),$+=1}if(z.suffix!==void 0&&z.suffix.length>0)q.push({type:"literal",text:z.suffix});return{text:q,legal:!1}}class b{raw=new Map;memo=new Map;listStyles=new Map;outline;defaults=new Map;collect(z){for(let Z of z.childElems())for(let q of Z.childElems()){if(!(q.is(j.OFFICE,"automatic-styles")||q.is(j.OFFICE,"styles")))continue;for(let J of q.childElems()){if(J.is(j.STYLE,"default-style")){let Q=J.attr(j.STYLE,"family");if(Q!==void 0)this.defaults.set(Q,e(J))}if(J.is(j.STYLE,"style")){let Q=J.attr(j.STYLE,"name");if(Q!==void 0){let $=J.attr(j.STYLE,"family")??"",K=J.attr(j.STYLE,"parent-style-name"),H=K!==void 0?S($,K):void 0;this.raw.set(S($,Q),{def:J,parent:H})}}if(J.is(j.TEXT,"list-style")){let Q=J.attr(j.STYLE,"name");if(Q!==void 0)this.listStyles.set(Q,t(J))}if(J.is(j.TEXT,"outline-style"))this.outline=t(J)}}}delta(z,Z){let q=S(z,Z),J=this.memo.get(q);if(J!==void 0)return{...J};let Q=[],$=new Set,K=this.raw.has(q)?q:void 0;while(K!==void 0){if($.has(K))throw B8.malformed(`style inheritance cycle at ${JSON.stringify(K)}`);$.add(K),Q.push(K);let Y=this.raw.get(K)?.parent;K=Y!==void 0&&this.raw.has(Y)?Y:void 0}let H=this.defaults.get(z);H=H!==void 0?{...H}:Z8();for(let Y=Q.length-1;Y>=0;Y-=1){let G=Q[Y],X=this.raw.get(G).def;H=T8(H,e(X)),this.memo.set(G,{...H})}return H}blockStyle(z){let Z=S("paragraph",z),q=new Set;while(!q.has(Z)){q.add(Z);let J=this.raw.get(Z);if(J===void 0)return;let Q=J.def.attr(j.STYLE,"name");if(Q!==void 0){let $=I8(Q);if($!==void 0)return $}if(J.parent===void 0)return;Z=J.parent}return}listLevel(z,Z){let J=this.listStyles.get(z)?.[Z];return J!==void 0?{...J}:q8()}listLevels(z){return this.listStyles.get(z)}outlineLevels(){return this.outline}}function L(z){let Z=I(z);if(Z===void 0)return;return Math.min(Z,4294967295)}function t(z){let Z=Array.from({length:F},()=>q8());for(let q of z.childElems()){let J=q.attr(j.TEXT,"level");if(J===void 0)continue;let Q=I(J);if(Q===void 0||Q<1||Q>F)continue;let $=Z[Q-1];if(q.is(j.TEXT,"list-level-style-number")||q.is(j.TEXT,"outline-level-style")){let K=q.attr(j.STYLE,"num-format");if(K==="a")$.marker="lowerAlpha";else if(K==="A")$.marker="upperAlpha";else if(K==="i")$.marker="lowerRoman";else if(K==="I")$.marker="upperRoman";else if(K==="")$.marker="bullet";else $.marker="decimal";let H=q.attr(j.TEXT,"start-value");$.start=H!==void 0?L(H)??1:1,$.prefix=q.attr(j.STYLE,"num-prefix")??"";let Y=q.attr(j.STYLE,"num-suffix");$.suffix=Y!==void 0?Y:void 0;let G=q.attr(j.TEXT,"display-levels"),X=G!==void 0?I(G):void 0;$.displayLevels=X??1}}return Z}function e(z){let Z=z.find(j.STYLE,"text-properties");if(Z===void 0)return Z8();let q=Z.attr(j.FO,"font-weight"),J;if(q!==void 0){let Y=S8(q);J=q==="bold"||Y!==void 0&&Y>=600}let Q=Z.attr(j.FO,"font-style"),$=Q!==void 0?Q==="italic"||Q==="oblique":void 0,K=Z.attr(j.STYLE,"text-line-through-style");return{bold:J,italic:$,strike:K!==void 0?K!=="none":void 0,code:void 0}}function S(z,Z){return`${z}\x00${Z}`}function E8(z,Z,q){return Math.min(q,Math.max(Z,z))}function I(z){if(z.length===0||!/^[0-9]+$/.test(z))return;let Z;try{Z=BigInt(z)}catch{return}if(Z>0xffff_ffff_ffff_ffffn)return;if(Z>BigInt(Number.MAX_SAFE_INTEGER))return Number.MAX_SAFE_INTEGER;return Number(Z)}function S8(z){if(z.length===0||!/^[0-9]+$/.test(z))return;let Z;try{Z=BigInt(z)}catch{return}if(Z>0xffff_ffffn)return;return Number(Z)}import{ns as U}from"@mdgate/containers";import{ConvertError as V8}from"@mdgate/core";import{cellSpanning as o8,GridBuilder as i8,heading as r8,inlinesAreEmpty as c8,MAX_EXPANSION as n8,MAX_EXPANSION_TEXT_BYTES as a8,plain as P8,resolveHeaderRows as s8}from"@mdgate/document";import{debug as l8}from"@mdgate/utils";import{decodeFragment as L8,ns as O,resolve as w8}from"@mdgate/containers";import{inlinesAreEmpty as Q8,inlinesToPlainText as f8,markerIsOrdered as x,markerLabel as g8}from"@mdgate/document";import{compositeLabel as $8,mediaTypeFor as k8,mergeDelta as y8,rebaseEmphasis as v8,resolveDelta as H8,StyledRun as K8}from"@mdgate/office-common";import{cleanText as W8,collapseWs as h8,isAbsoluteUri as Y8,warn as z8}from"@mdgate/utils";var u={bold:!1,italic:!1,strike:!1,code:!1};class d{styles;pkg;assets;notes=[];listCounters=new Map;listIds=new Map;headingValues=Array.from({length:F},()=>0);headingStarted=Array.from({length:F},()=>!1);constructor(z,Z,q){this.styles=z,this.pkg=Z,this.assets=q}}function R(z,Z){let q=[],J=new K8;for(let Q of z.childElems())G8(Q,Z,q,J);return J.flush(q),q}function G8(z,Z,q,J){if(z.ns===O.TEXT){if(!z.is(O.TEXT,"p"))J.flush(q);switch(z.local){case"h":{let $=z.attr(O.TEXT,"outline-level"),H=($!==void 0?d8($):void 0)??1,[Y,G]=J8(z,Z);if(!Q8(Y)){let X=Y;v8(X,H8(O8(z,Z)));let W=f8(X),M=u8(z,H,Z);if(M!==void 0)X.unshift({type:"text",text:M,style:{...u}});q.push({type:"heading",level:H,anchor:W,content:X})}q.push(...G);return}case"p":{let[$,K]=J8(z,Z),H=z.attr(O.TEXT,"style-name"),Y=H!==void 0?Z.styles.blockStyle(H):void 0;if(Y!==void 0)J.push(Y,$,q);else J.flush(q),q.push({type:"paragraph",inlines:$});if(K.length>0)J.flush(q),q.push(...K);return}case"list":q.push(...X8(z,Z,0,void 0,[]));return;case"section":case"index-body":case"index-title":q.push(...R(z,Z));return;case"table-of-content":case"alphabetical-index":case"bibliography":case"illustration-index":q.push(...R(z,Z));return;default:return}}if(z.is(O.TABLE,"table"))J.flush(q),q.push(...T(z,Z))}function X8(z,Z,q,J,Q){let $=z.attr(O.TEXT,"style-name")??J,K=Z.styles.listLevel($??"",q),H=x(K.marker),Y=`${$??""}\x00${q}`,G=K.start;if(H){let _=z.attr(O.TEXT,"continue-list");if(_!==void 0){let D=Z.listIds.get(_);if(D!==void 0)G=D}else if(z.attr(O.TEXT,"continue-numbering")==="true"){let D=Z.listCounters.get(Y);if(D!==void 0)G=D}}let X=[],W={marker:K.marker,start:G,items:[]},M=G,P=!0,A=(_)=>{let D=W;if(W={marker:W.marker,start:_,items:[]},D.items.length>0)X.push({type:"list",list:D})};for(let _ of z.childElems()){let D=_.is(O.TEXT,"list-header");if(!(D||_.is(O.TEXT,"list-item")))continue;if(!D&&H){let N=_.attr(O.TEXT,"start-value"),v=N!==void 0?L(N):void 0;if(v!==void 0)if(P)W.start=v;else A(v)}let C8=p(W.start,W.items.length),l=Q.concat(C8),C=[],y=new K8;for(let N of _.childElems())if(N.is(O.TEXT,"list"))y.flush(C),C.push(...X8(N,Z,q+1,$,l));else G8(N,Z,C,y);if(y.flush(C),D){A(M),X.push(...C);continue}P=!1;let N8=b8(Z,$,q,l);W.items.push({blocks:C,checked:void 0,markerLabel:N8}),M=p(W.start,W.items.length)}if(A(M),H&&X.length>0){Z.listCounters.set(Y,M);let _=z.attrQualified(O.XML,"id");if(_!==void 0)Z.listIds.set(_,M)}return X}function b8(z,Z,q,J){if(Z===void 0)return;let Q=z.styles.listLevels(Z);if(Q===void 0)return;let $=Math.min(q,F-1),K=Q[$];if(!x(K.marker))return;return $8(h(K,$),K.marker,J[J.length-1]??1,(H)=>Q[Math.min(H,F-1)].marker,(H)=>J[H]??Q[Math.min(H,F-1)].start)}function u8(z,Z,q){let J=q.styles.outlineLevels();if(J===void 0)return;let Q=Math.min(Math.max(Z,1)-1,F-1),$=J[Q];if(!x($.marker))return;if(z.attr(O.TEXT,"is-list-header")==="true")return;let{headingValues:K,headingStarted:H}=q,Y=z.attr(O.TEXT,"restart-numbering")==="true",G=z.attr(O.TEXT,"start-value"),X=G!==void 0?L(G):void 0,W;if(X!==void 0)W=X;else if(H[Q]&&!Y)W=p(K[Q],1);else W=$.start;K[Q]=W,H[Q]=!0;for(let P=Q+1;P<H.length;P+=1)H[P]=!1;return`${$8(h($,Q),$.marker,W,(P)=>J[Math.min(P,F-1)].marker,(P)=>{let A=Math.min(P,F-1);return H[A]?K[A]:J[A].start})??g8($.marker,W)} `}function J8(z,Z){let q=O8(z,Z),J=[],Q=[];return w(z,Z,q,J,Q),[J,Q]}function O8(z,Z){return Z.styles.delta("paragraph",z.attr(O.TEXT,"style-name")??"")}function w(z,Z,q,J,Q){let $=H8(q);for(let K of z.children){if(K.type==="text"){let G=h8(W8(K.text));if(G.length>0)J.push({type:"text",text:G,style:{...$}});continue}let H=K.elem;if(H.ns===O.TEXT)switch(H.local){case"span":{let G=H.attr(O.TEXT,"style-name"),X=G!==void 0?y8(q,Z.styles.delta("text",G)):q;w(H,Z,X,J,Q);continue}case"a":{let G=H.attr(O.XLINK,"href")??"",X=[];w(H,Z,q,X,Q);let W=x8(G);if(W!==void 0&&!Q8(X))J.push({type:"link",content:X,target:W});else J.push(...X);continue}case"s":{let G=H.attr(O.TEXT,"c"),X=G!==void 0?m8(G):void 0,W=Math.min(X??1,20);J.push({type:"text",text:" ".repeat(W),style:{...u}});continue}case"tab":J.push({type:"text",text:" ",style:{...u}});continue;case"line-break":J.push({type:"lineBreak"});continue;case"bookmark":case"bookmark-start":{let G=H.attr(O.TEXT,"name");if(G!==void 0)J.push({type:"anchor",id:G});continue}case"note":{let G=Z.notes.length,X=H.attr(O.TEXT,"id")??`odt${G}`,W=H.attr(O.TEXT,"note-class")==="endnote"?"endnote":"footnote",M=H.find(O.TEXT,"note-body"),P=M!==void 0?R(M,Z):[];Z.notes.push({id:X,kind:W,blocks:P}),J.push({type:"noteRef",id:X});continue}case"annotation":case"tracked-changes":case"soft-page-break":continue;default:break}if(H.is(O.DRAW,"frame")){m(H,Z,J,Q);continue}w(H,Z,q,J,Q)}}function m(z,Z,q,J){let Q=z.find(O.DRAW,"text-box");if(Q!==void 0){J.push(...R(Q,Z));return}let $=z.firstDescendant(O.SVG_COMPAT,"title"),K=$===void 0?z.firstDescendant(O.SVG_COMPAT,"desc"):void 0,H=($??K)?.text()??"",Y=W8(H.trim()),G=z.firstDescendant(O.DRAW,"image");if(G!==void 0){let X=G.attr(O.XLINK,"href")??"",W=p8(Z,X);if(W!==void 0||Y.length>0)q.push({type:"image",alt:Y,source:W??{type:"unavailable"}});return}if(Y.length>0)q.push({type:"image",alt:Y,source:{type:"unavailable"}})}function p8(z,Z){if(Z.length===0)return;if(Y8(Z))return{type:"external",url:Z};let q;try{q=w8("content.xml",Z)}catch(Q){z8(`skipping unresolvable image reference ${JSON.stringify(Z)}: ${Q instanceof Error?Q.message:String(Q)}`);return}let J=z.pkg.optionalPart(q.path);if(J!==void 0){let Q=k8(q.path);return{type:"asset",id:z.assets.add(Q,q.path,J)}}z8(`image part ${q.path} is missing`);return}function x8(z){if(z.length===0)return;if(z.startsWith("#")){let Z=z.slice(1),q=Z.split("|")[0]??Z;if(q.length===0)return;return{type:"anchor",id:L8(q)}}if(Y8(z))return{type:"external",url:z};return{type:"relative",url:z}}function d8(z){if(z.length===0||!/^[0-9]+$/.test(z))return;let Z=Number(z);if(!Number.isInteger(Z)||Z>255)return;return Z}function m8(z){if(z.length===0||!/^[0-9]+$/.test(z))return;let Z;try{Z=BigInt(z)}catch{return}if(Z>0xffff_ffff_ffff_ffffn)return;if(Z>BigInt(Number.MAX_SAFE_INTEGER))return Number.MAX_SAFE_INTEGER;return Number(Z)}function p(z,Z){let q=z+Z;if(!Number.isFinite(q)||q>Number.MAX_SAFE_INTEGER)return Number.MAX_SAFE_INTEGER;return q}function T(z,Z){let q={builder:new i8,expansion:0,expansionBytes:0,pendingRows:0,headerRows:0,rowsEmitted:0};r(z,Z,q,!0);let J=q.builder.finish("data");if(J.grid.length===0)return[];return J.headerRows=s8(J,q.headerRows),[{type:"table",table:J}]}function E(z,Z){if(z.expansion=k(z.expansion,Z),z.expansion>n8)throw V8.resourceLimit("max_expansion","table repeat expansion exceeds the content budget")}function t8(z,Z){if(z.expansionBytes=k(z.expansionBytes,Z),z.expansionBytes>a8)throw V8.resourceLimit("max_expansion_text_bytes","table repeat expansion duplicates more text than the budget")}function i(z){let Z=0;for(let q of z)switch(q.type){case"text":Z+=q.text.length;break;case"link":{let J=q.target.type==="external"||q.target.type==="relative"?q.target.url.length:q.target.id.length;Z+=i(q.content)+J;break}case"image":Z+=q.alt.length;break;case"anchor":case"noteRef":Z+=q.id.length;break;case"lineBreak":Z+=1;break}return Z}function g(z){let Z=0;for(let q of z)switch(q.type){case"paragraph":Z+=i(q.inlines);break;case"heading":Z+=i(q.content);break;case"list":for(let J of q.list.items)Z+=g(J.blocks);break;case"table":for(let J of q.table.grid)for(let Q of J)if(Q.type==="origin")Z+=g(Q.cell.blocks);break;case"blockQuote":Z+=g(q.blocks);break;case"codeBlock":Z+=q.text.length;break;case"rule":break}return Z}function r(z,Z,q,J){for(let Q of z.childElems()){if(Q.ns!==U.TABLE)continue;switch(Q.local){case"table-header-rows":{let $=q.rowsEmitted;if(r(Q,Z,q,!1),J&&q.headerRows===0)q.headerRows=q.rowsEmitted-$;break}case"table-rows":case"table-row-group":r(Q,Z,q,!1);break;case"table-row":{let $=D8(Q.attr(U.TABLE,"number-rows-repeated"));e8(Q,Z,q,$);break}default:break}}}function e8(z,Z,q,J){if($Z(z)){q.pendingRows=k(q.pendingRows,J);return}if(q.pendingRows>0)E(q,q.pendingRows),q.builder.nextRows(q.pendingRows),q.rowsEmitted+=q.pendingRows,q.pendingRows=0;let Q=ZZ(z,Z);E(q,M8(J,1));for(let $ of Q)if($.kind==="cell"){let K=M8(c(J,$.repeat),1);t8(q,c($.bytes,K))}for(let $=0;$<J;$+=1)q.builder.nextRow(),q.rowsEmitted+=1,qZ(Q,q)}function ZZ(z,Z){let q=[];for(let J of z.childElems()){let Q=D8(J.attr(U.TABLE,"number-columns-repeated"));if(J.is(U.TABLE,"covered-table-cell")){q.push({kind:"covered",repeat:Q});continue}if(!J.is(U.TABLE,"table-cell"))continue;let $=U8(J.attr(U.TABLE,"number-columns-spanned")),K=U8(J.attr(U.TABLE,"number-rows-spanned")),H=zZ(J,Z),Y=g(H);q.push({kind:"cell",repeat:Q,colSpan:$,rowSpan:K,blocks:H,bytes:Y})}return q}function qZ(z,Z){let q=0;for(let J of z)if(J.kind==="covered"){j8(Z,q),q=0,E(Z,J.repeat);for(let Q=0;Q<J.repeat;Q+=1)if(!Z.builder.covered())l8("covered table cell without a spanning origin")}else{if(J.blocks.length===0&&J.colSpan===1&&J.rowSpan===1){q=k(q,J.repeat);continue}j8(Z,q),q=0,E(Z,c(J.repeat,J.colSpan));for(let Q=0;Q<J.repeat;Q+=1){let $=J.repeat===1?J.blocks:KZ(J.blocks);Z.builder.place(o8($,J.colSpan,J.rowSpan))}}}function j8(z,Z){if(Z===0)return;E(z,Z),z.builder.placeEmptyRun(Z)}function zZ(z,Z){let q=R(z,Z);if(q.some(($)=>$.type==="paragraph"?!c8($.inlines):!0))return q;let Q=JZ(z);if(Q!==void 0)return[{type:"paragraph",inlines:[P8(Q)]}];return[]}function JZ(z){let Z=z.attr(U.OFFICE,"value-type");if(Z===void 0)return;switch(Z){case"percentage":{let q=z.attr(U.OFFICE,"value");if(q===void 0)return;let J=B(q);if(J===void 0)return;return`${f(J*100)}%`}case"currency":{let q=z.attr(U.OFFICE,"value");if(q===void 0)return;let J=B(q);if(J===void 0)return;let Q=z.attr(U.OFFICE,"currency")??"";return Q.length===0?f(J):`${f(J)} ${Q}`}case"float":{let q=z.attr(U.OFFICE,"value");if(q===void 0)return;let J=B(q);if(J===void 0)return;return f(J)}case"date":return z.attr(U.OFFICE,"date-value");case"time":{let q=z.attr(U.OFFICE,"time-value");return q!==void 0?QZ(q):void 0}case"boolean":{let q=z.attr(U.OFFICE,"boolean-value");if(q===void 0)return;return q==="true"?"TRUE":"FALSE"}case"string":return z.attr(U.OFFICE,"string-value");default:return}}function f(z){if(Number.isNaN(z))return"NaN";if(z===Number.POSITIVE_INFINITY)return"inf";if(z===Number.NEGATIVE_INFINITY)return"-inf";return HZ(z)}function QZ(z){let Z=0,q="",J=!1,Q=!1;for(let W of z)if(W==="-"&&Z===0&&q.length===0)Q=!0;else if(W==="P");else if(W==="T")J=!0,q="";else if((W==="Y"||W==="M")&&!J){let M=B(q);if(M!==void 0&&M!==0)return z;q=""}else if((W==="W"||W==="D")&&!J){let M=W==="W"?604800:86400;Z+=(B(q)??0)*M,q=""}else if((W==="H"||W==="M"||W==="S")&&J){let M=W==="H"?3600:W==="M"?60:1;Z+=(B(q)??0)*M,q=""}else if(W>="0"&&W<="9"||W===".")q+=W;else q="";let $=Math.round(Z*1000);if(!($>=0&&$<1000000000000000000))return z;let K=Q?"-":"",H=Math.floor($/3600000),Y=$%3600000,G=Math.floor(Y/60000),X=Y%60000;if(X%1000!==0){let W=(X/1000).toFixed(3).padStart(6,"0");return`${K}${H}:${o(G)}:${W}`}return`${K}${H}:${o(G)}:${o(Math.floor(X/1000))}`}function $Z(z){return z.childElems().every((Z)=>{if(Z.is(U.TABLE,"covered-table-cell"))return!1;if(!Z.is(U.TABLE,"table-cell"))return!0;return Z.attr(U.TABLE,"number-columns-spanned")===void 0&&Z.attr(U.TABLE,"number-rows-spanned")===void 0&&Z.attr(U.OFFICE,"value-type")===void 0&&Z.children.length===0})}function _8(z,Z){let q=z.childElems().filter(($)=>$.is(U.TABLE,"table")),J=q.length>1,Q=[];for(let $ of q){let K=$.attr(U.TABLE,"name")??"",H=T($,Z);if(H.length===0)continue;if(J)Q.push(r8(2,[P8(K)]));Q.push(...H)}return Q}function D8(z){if(z===void 0)return 1;let Z=I(z);if(Z===void 0)return 1;return Math.max(Z,1)}function U8(z){if(z===void 0)return 1;if(!/^[0-9]+$/.test(z))return 1;let Z;try{Z=BigInt(z)}catch{return 1}if(Z>0xffff_ffffn)return 1;if(Z<1n)return 1;return Number(Z)}function B(z){let Z=z.toLowerCase();if(Z==="inf"||Z==="infinity"||Z==="+inf"||Z==="+infinity")return Number.POSITIVE_INFINITY;if(Z==="-inf"||Z==="-infinity")return Number.NEGATIVE_INFINITY;if(Z==="nan"||Z==="+nan"||Z==="-nan")return Number.NaN;if(!/^[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?$/.test(z))return;let q=Number(z);return Number.isFinite(q)?q:void 0}function HZ(z){if(Object.is(z,-0))return"-0";return String(z)}function o(z){return z<10?`0${z}`:String(z)}function KZ(z){return structuredClone(z)}function k(z,Z){let q=z+Z;if(!Number.isFinite(q)||q>Number.MAX_SAFE_INTEGER)return Number.MAX_SAFE_INTEGER;return q}function M8(z,Z){let q=z-Z;return q<0?0:q}function c(z,Z){let q=z*Z;if(!Number.isFinite(q)||q>Number.MAX_SAFE_INTEGER)return Number.MAX_SAFE_INTEGER;return q}function F8(z){let Z=WZ.open(z);if(XZ(Z))throw n.encrypted();let q=Z.optionalXmlPart("styles.xml"),J=Z.requiredXmlPart("content.xml"),Q=new b;if(q!==void 0)Q.collect(q);Q.collect(J);let $=J.find(V.OFFICE,"document-content")?.find(V.OFFICE,"body");if($===void 0)throw n.malformedPart("content.xml","no office:body");let K=new GZ,H=new d(Q,Z,K),Y=$.find(V.OFFICE,"text"),G=Y===void 0?$.find(V.OFFICE,"spreadsheet"):void 0,X=Y===void 0&&G===void 0?$.find(V.OFFICE,"presentation"):void 0,W;if(Y!==void 0)W=R(Y,H);else if(G!==void 0)W=_8(G,H);else if(X!==void 0)W=OZ(X,H);else throw n.malformedPart("content.xml","no recognized office body (text, spreadsheet, or presentation)");return{blocks:W,notes:H.notes,assets:K.assets}}function XZ(z){let Z=z.optionalXmlPart("META-INF/manifest.xml");if(Z===void 0)return!1;return Z.firstDescendant(V.MANIFEST,"encryption-data")!==void 0}function OZ(z,Z){let q=[];for(let J of z.findAll(V.DRAW,"page")){let Q=[],$=[],K=[];if(R8(J,Z,Q,$,K),q.push(...Q),q.push(...$),K.length>0)q.push({type:"blockQuote",blocks:K})}return q}function R8(z,Z,q,J,Q){for(let $ of z.childElems()){if($.is(V.PRESENTATION,"notes")){for(let K of $.descendants(V.DRAW,"frame")){let H=K.find(V.DRAW,"text-box");if(H!==void 0)Q.push(...R(H,Z))}continue}if($.ns!==V.DRAW)continue;switch($.local){case"frame":{let K=$.attr(V.PRESENTATION,"class")??"";if(K==="page-number"||K==="date-time"||K==="footer"||K==="header")continue;let H=[];for(let Y of $.childElems())if(Y.is(V.DRAW,"text-box"))H.push(...R(Y,Z));else if(Y.is(V.TABLE,"table"))H.push(...T(Y,Z));else if(Y.is(V.DRAW,"image")){let G=[],X=[];if(m($,Z,G,X),!a(G))H.push({type:"paragraph",inlines:G});H.push(...X);break}if(K==="title")jZ(H,q);else J.push(...H);break}case"g":R8($,Z,q,J,Q);break;case"custom-shape":case"rect":case"ellipse":case"polygon":case"path":case"line":case"connector":case"caption":{for(let K of $.childElems())if(K.is(V.TEXT,"p")||K.is(V.TEXT,"list")){J.push(...R($,Z));break}break}default:break}}}function jZ(z,Z){let q=[];for(let J of z){if(J.type!=="paragraph")continue;if(a(J.inlines))continue;if(q.length>0)q.push({type:"lineBreak"});q.push(...J.inlines)}if(!a(q))Z.push({type:"heading",level:2,anchor:YZ(q),content:q})}var A8=new Set(["odt","ods","odp"]);function s(){return{id:"odf",sniff(z,Z){if(A8.has(UZ(z)??""))return 2;if(Z?.path!==void 0&&A8.has(VZ(Z.path)??""))return 1;return 0},convert(z){return{markdown:MZ(F8(z))}}}}import{create as PZ}from"@mdgate/core";var _Z=PZ([s()]);function DZ(z,Z){return _Z(z,Z)}export{DZ as toMarkdown,s as odf};
|
package/dist/odf.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ConvertHint } from '@mdgate/core';
|
|
2
|
+
/**
|
|
3
|
+
* Convert a single file's bytes to Markdown with the odf converter.
|
|
4
|
+
* `hint.path` is only a sniff hint; it is never read from disk.
|
|
5
|
+
*/
|
|
6
|
+
export declare function toMarkdown(bytes: Uint8Array, hint?: ConvertHint): Promise<string>;
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mdgate/odf",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "mdgate OpenDocument converter (odt/ods/odp)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist/**/*.js",
|
|
18
|
+
"dist/**/*.d.ts"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "bun ../../scripts/build-package.ts",
|
|
22
|
+
"prepublishOnly": "bun run build"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@mdgate/containers": "0.1.0",
|
|
26
|
+
"@mdgate/core": "0.1.3",
|
|
27
|
+
"@mdgate/document": "0.1.0",
|
|
28
|
+
"@mdgate/office-common": "0.1.0",
|
|
29
|
+
"@mdgate/utils": "0.1.2"
|
|
30
|
+
},
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public"
|
|
33
|
+
},
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=20"
|
|
36
|
+
},
|
|
37
|
+
"keywords": [
|
|
38
|
+
"mdgate",
|
|
39
|
+
"markdown",
|
|
40
|
+
"odt",
|
|
41
|
+
"ods",
|
|
42
|
+
"odp",
|
|
43
|
+
"opendocument"
|
|
44
|
+
]
|
|
45
|
+
}
|