@w100n/documents 0.14.0 → 0.15.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/dist/{SheetView-4TPL7DES.js → SheetView-72KXS4DM.js} +4 -4
- package/dist/{TextEditor-VBHWUOZR.js → TextEditor-NSICFE6U.js} +173 -5
- package/dist/TextEditor-NSICFE6U.js.map +1 -0
- package/dist/{chunk-DR3TTJWZ.js → chunk-M4OQG3EN.js} +388 -36
- package/dist/chunk-M4OQG3EN.js.map +1 -0
- package/dist/{chunk-RCQODE2Z.js → chunk-OXC4PUOC.js} +2 -2
- package/dist/{chunk-5MH4WDW4.js → chunk-Z7UNJ4ND.js} +66 -10
- package/dist/chunk-Z7UNJ4ND.js.map +1 -0
- package/dist/collab.cjs +450 -44
- package/dist/collab.cjs.map +1 -1
- package/dist/collab.js +2 -2
- package/dist/index.cjs +712 -131
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +159 -0
- package/dist/index.css.map +1 -1
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/TextEditor-VBHWUOZR.js.map +0 -1
- package/dist/chunk-5MH4WDW4.js.map +0 -1
- package/dist/chunk-DR3TTJWZ.js.map +0 -1
- /package/dist/{SheetView-4TPL7DES.js.map → SheetView-72KXS4DM.js.map} +0 -0
- /package/dist/{chunk-RCQODE2Z.js.map → chunk-OXC4PUOC.js.map} +0 -0
package/dist/collab.cjs
CHANGED
|
@@ -38,7 +38,7 @@ __export(collab_exports, {
|
|
|
38
38
|
filled: () => filled,
|
|
39
39
|
follow: () => follow,
|
|
40
40
|
ours: () => ours,
|
|
41
|
-
parse: () =>
|
|
41
|
+
parse: () => parse3,
|
|
42
42
|
pending: () => pending,
|
|
43
43
|
save: () => save,
|
|
44
44
|
seed: () => seed
|
|
@@ -50,7 +50,7 @@ var import_y_tiptap2 = require("@tiptap/y-tiptap");
|
|
|
50
50
|
var Y2 = __toESM(require("yjs"), 1);
|
|
51
51
|
|
|
52
52
|
// package.json
|
|
53
|
-
var version = "0.
|
|
53
|
+
var version = "0.15.0";
|
|
54
54
|
|
|
55
55
|
// src/docx/xml.ts
|
|
56
56
|
function parse(s) {
|
|
@@ -672,6 +672,266 @@ function resolve(dir, target) {
|
|
|
672
672
|
return out.join("/");
|
|
673
673
|
}
|
|
674
674
|
|
|
675
|
+
// src/editor/math.ts
|
|
676
|
+
var words = {
|
|
677
|
+
alpha: "\u03B1",
|
|
678
|
+
beta: "\u03B2",
|
|
679
|
+
gamma: "\u03B3",
|
|
680
|
+
delta: "\u03B4",
|
|
681
|
+
epsilon: "\u03B5",
|
|
682
|
+
zeta: "\u03B6",
|
|
683
|
+
eta: "\u03B7",
|
|
684
|
+
theta: "\u03B8",
|
|
685
|
+
iota: "\u03B9",
|
|
686
|
+
kappa: "\u03BA",
|
|
687
|
+
lambda: "\u03BB",
|
|
688
|
+
mu: "\u03BC",
|
|
689
|
+
nu: "\u03BD",
|
|
690
|
+
xi: "\u03BE",
|
|
691
|
+
pi: "\u03C0",
|
|
692
|
+
rho: "\u03C1",
|
|
693
|
+
sigma: "\u03C3",
|
|
694
|
+
tau: "\u03C4",
|
|
695
|
+
upsilon: "\u03C5",
|
|
696
|
+
phi: "\u03C6",
|
|
697
|
+
chi: "\u03C7",
|
|
698
|
+
psi: "\u03C8",
|
|
699
|
+
omega: "\u03C9",
|
|
700
|
+
Gamma: "\u0393",
|
|
701
|
+
Delta: "\u0394",
|
|
702
|
+
Theta: "\u0398",
|
|
703
|
+
Lambda: "\u039B",
|
|
704
|
+
Xi: "\u039E",
|
|
705
|
+
Pi: "\u03A0",
|
|
706
|
+
Sigma: "\u03A3",
|
|
707
|
+
Phi: "\u03A6",
|
|
708
|
+
Psi: "\u03A8",
|
|
709
|
+
Omega: "\u03A9",
|
|
710
|
+
infty: "\u221E",
|
|
711
|
+
partial: "\u2202",
|
|
712
|
+
nabla: "\u2207"
|
|
713
|
+
};
|
|
714
|
+
var ops = {
|
|
715
|
+
cdot: "\xB7",
|
|
716
|
+
times: "\xD7",
|
|
717
|
+
div: "\xF7",
|
|
718
|
+
pm: "\xB1",
|
|
719
|
+
mp: "\u2213",
|
|
720
|
+
le: "\u2264",
|
|
721
|
+
leq: "\u2264",
|
|
722
|
+
ge: "\u2265",
|
|
723
|
+
geq: "\u2265",
|
|
724
|
+
ne: "\u2260",
|
|
725
|
+
neq: "\u2260",
|
|
726
|
+
approx: "\u2248",
|
|
727
|
+
equiv: "\u2261",
|
|
728
|
+
to: "\u2192",
|
|
729
|
+
rightarrow: "\u2192",
|
|
730
|
+
leftarrow: "\u2190",
|
|
731
|
+
Rightarrow: "\u21D2",
|
|
732
|
+
in: "\u2208",
|
|
733
|
+
notin: "\u2209",
|
|
734
|
+
subset: "\u2282",
|
|
735
|
+
cup: "\u222A",
|
|
736
|
+
cap: "\u2229",
|
|
737
|
+
forall: "\u2200",
|
|
738
|
+
exists: "\u2203",
|
|
739
|
+
sum: "\u2211",
|
|
740
|
+
prod: "\u220F",
|
|
741
|
+
int: "\u222B",
|
|
742
|
+
oint: "\u222E",
|
|
743
|
+
degree: "\xB0"
|
|
744
|
+
};
|
|
745
|
+
var big = /* @__PURE__ */ new Set(["\u2211", "\u220F", "\u222B", "\u222E"]);
|
|
746
|
+
var glyph = {};
|
|
747
|
+
for (const [k, v] of [...Object.entries(words), ...Object.entries(ops)]) glyph[v] ?? (glyph[v] = k);
|
|
748
|
+
function parse2(src) {
|
|
749
|
+
let i = 0;
|
|
750
|
+
const group = () => {
|
|
751
|
+
if (src[i] === "{") {
|
|
752
|
+
i++;
|
|
753
|
+
const kids2 = row2("}");
|
|
754
|
+
i++;
|
|
755
|
+
return kids2.length === 1 ? kids2[0] : { t: "row", kids: kids2 };
|
|
756
|
+
}
|
|
757
|
+
return one2() ?? { t: "row", kids: [] };
|
|
758
|
+
};
|
|
759
|
+
const one2 = () => {
|
|
760
|
+
while (src[i] === " ") i++;
|
|
761
|
+
if (i >= src.length) return null;
|
|
762
|
+
const c = src[i];
|
|
763
|
+
if (c === "{") return group();
|
|
764
|
+
if (c === "\\") {
|
|
765
|
+
const m = /^\\([a-zA-Z]+|.)/.exec(src.slice(i));
|
|
766
|
+
if (!m) {
|
|
767
|
+
i++;
|
|
768
|
+
return { t: "tok", v: "\\", kind: "mo" };
|
|
769
|
+
}
|
|
770
|
+
i += m[0].length;
|
|
771
|
+
const name = m[1];
|
|
772
|
+
if (name === "frac") return { t: "frac", num: group(), den: group() };
|
|
773
|
+
if (name === "sqrt") {
|
|
774
|
+
let deg = null;
|
|
775
|
+
if (src[i] === "[") {
|
|
776
|
+
const end = src.indexOf("]", i);
|
|
777
|
+
deg = parse2(src.slice(i + 1, end < 0 ? src.length : end));
|
|
778
|
+
i = end < 0 ? src.length : end + 1;
|
|
779
|
+
}
|
|
780
|
+
return { t: "sqrt", body: group(), deg };
|
|
781
|
+
}
|
|
782
|
+
if (name === "text" || name === "mathrm") {
|
|
783
|
+
const g = src[i] === "{" ? src.indexOf("}", i) : -1;
|
|
784
|
+
const v = g < 0 ? "" : src.slice(i + 1, g);
|
|
785
|
+
i = g < 0 ? i : g + 1;
|
|
786
|
+
return { t: "tok", v, kind: "mtext" };
|
|
787
|
+
}
|
|
788
|
+
if (name === "left" || name === "right") return one2();
|
|
789
|
+
if (words[name]) return { t: "tok", v: words[name], kind: "mi" };
|
|
790
|
+
if (ops[name]) return { t: "tok", v: ops[name], kind: "mo" };
|
|
791
|
+
return { t: "tok", v: name.length === 1 ? name : `\\${name}`, kind: name.length === 1 ? "mo" : "mi" };
|
|
792
|
+
}
|
|
793
|
+
if (/[0-9.]/.test(c)) {
|
|
794
|
+
const m = /^[0-9]*\.?[0-9]+|^[0-9]+/.exec(src.slice(i));
|
|
795
|
+
i += m[0].length;
|
|
796
|
+
return { t: "tok", v: m[0], kind: "mn" };
|
|
797
|
+
}
|
|
798
|
+
i++;
|
|
799
|
+
if (/[\p{L}]/u.test(c)) return { t: "tok", v: c, kind: big.has(c) ? "mo" : "mi" };
|
|
800
|
+
return { t: "tok", v: c, kind: "mo" };
|
|
801
|
+
};
|
|
802
|
+
const row2 = (stop) => {
|
|
803
|
+
const kids2 = [];
|
|
804
|
+
while (i < src.length && src[i] !== stop) {
|
|
805
|
+
while (src[i] === " ") i++;
|
|
806
|
+
if (i >= src.length || src[i] === stop) break;
|
|
807
|
+
if (src[i] === "^" || src[i] === "_") {
|
|
808
|
+
const base = kids2.pop() ?? { t: "row", kids: [] };
|
|
809
|
+
const s = base.t === "script" && !base.sub !== !base.sup ? base : { t: "script", base, sub: null, sup: null };
|
|
810
|
+
const which = src[i++] === "^" ? "sup" : "sub";
|
|
811
|
+
s[which] = group();
|
|
812
|
+
kids2.push(s);
|
|
813
|
+
continue;
|
|
814
|
+
}
|
|
815
|
+
if (src[i] === "}") {
|
|
816
|
+
i++;
|
|
817
|
+
continue;
|
|
818
|
+
}
|
|
819
|
+
const a = one2();
|
|
820
|
+
if (a) kids2.push(a);
|
|
821
|
+
}
|
|
822
|
+
return kids2;
|
|
823
|
+
};
|
|
824
|
+
const kids = row2("\0");
|
|
825
|
+
return kids.length === 1 ? kids[0] : { t: "row", kids };
|
|
826
|
+
}
|
|
827
|
+
var esc = (v) => v.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
828
|
+
function ml(a) {
|
|
829
|
+
switch (a.t) {
|
|
830
|
+
case "tok":
|
|
831
|
+
return `<${a.kind}>${esc(a.v)}</${a.kind}>`;
|
|
832
|
+
case "row":
|
|
833
|
+
return `<mrow>${a.kids.map(ml).join("")}</mrow>`;
|
|
834
|
+
case "frac":
|
|
835
|
+
return `<mfrac>${ml(a.num)}${ml(a.den)}</mfrac>`;
|
|
836
|
+
case "sqrt":
|
|
837
|
+
return a.deg ? `<mroot>${ml(a.body)}${ml(a.deg)}</mroot>` : `<msqrt>${ml(a.body)}</msqrt>`;
|
|
838
|
+
case "script": {
|
|
839
|
+
const over = a.base.t === "tok" && big.has(a.base.v);
|
|
840
|
+
if (a.sub && a.sup) return `<${over ? "munderover" : "msubsup"}>${ml(a.base)}${ml(a.sub)}${ml(a.sup)}</${over ? "munderover" : "msubsup"}>`;
|
|
841
|
+
if (a.sub) return `<${over ? "munder" : "msub"}>${ml(a.base)}${ml(a.sub)}</${over ? "munder" : "msub"}>`;
|
|
842
|
+
return `<${over ? "mover" : "msup"}>${ml(a.base)}${ml(a.sup)}</${over ? "mover" : "msup"}>`;
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
var mathml = (latex) => `<math xmlns="http://www.w3.org/1998/Math/MathML">${ml(parse2(latex))}</math>`;
|
|
847
|
+
var run = (v, plain4 = false) => `<m:r>${plain4 ? '<m:rPr><m:sty m:val="p"/></m:rPr>' : ""}<m:t xml:space="preserve">${esc(v)}</m:t></m:r>`;
|
|
848
|
+
function om(a) {
|
|
849
|
+
switch (a.t) {
|
|
850
|
+
case "tok":
|
|
851
|
+
return run(a.v, a.kind === "mtext" || a.kind === "mo" && !big.has(a.v));
|
|
852
|
+
case "row":
|
|
853
|
+
return a.kids.map(om).join("");
|
|
854
|
+
case "frac":
|
|
855
|
+
return `<m:f><m:num>${om(a.num)}</m:num><m:den>${om(a.den)}</m:den></m:f>`;
|
|
856
|
+
case "sqrt":
|
|
857
|
+
return a.deg ? `<m:rad><m:deg>${om(a.deg)}</m:deg><m:e>${om(a.body)}</m:e></m:rad>` : `<m:rad><m:radPr><m:degHide m:val="1"/></m:radPr><m:deg/><m:e>${om(a.body)}</m:e></m:rad>`;
|
|
858
|
+
case "script": {
|
|
859
|
+
if (a.base.t === "tok" && big.has(a.base.v)) return `<m:nary><m:naryPr><m:chr m:val="${a.base.v}"/>${a.sub ? "" : '<m:subHide m:val="1"/>'}${a.sup ? "" : '<m:supHide m:val="1"/>'}</m:naryPr><m:sub>${a.sub ? om(a.sub) : ""}</m:sub><m:sup>${a.sup ? om(a.sup) : ""}</m:sup><m:e/></m:nary>`;
|
|
860
|
+
if (a.sub && a.sup) return `<m:sSubSup><m:e>${om(a.base)}</m:e><m:sub>${om(a.sub)}</m:sub><m:sup>${om(a.sup)}</m:sup></m:sSubSup>`;
|
|
861
|
+
if (a.sub) return `<m:sSub><m:e>${om(a.base)}</m:e><m:sub>${om(a.sub)}</m:sub></m:sSub>`;
|
|
862
|
+
return `<m:sSup><m:e>${om(a.base)}</m:e><m:sup>${om(a.sup)}</m:sup></m:sSup>`;
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
var omml = (latex) => `<m:oMath xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">${om(parse2(latex))}</m:oMath>`;
|
|
867
|
+
function tree(xml) {
|
|
868
|
+
const root = { name: "", kids: [], text: "", attrs: {} };
|
|
869
|
+
const stack = [root];
|
|
870
|
+
for (const m of xml.matchAll(/<(\/?)([\w:]+)([^>]*?)(\/?)>|([^<]+)/g)) {
|
|
871
|
+
const top = stack[stack.length - 1];
|
|
872
|
+
if (m[5] !== void 0) {
|
|
873
|
+
top.text += m[5];
|
|
874
|
+
continue;
|
|
875
|
+
}
|
|
876
|
+
if (m[1]) {
|
|
877
|
+
stack.pop();
|
|
878
|
+
continue;
|
|
879
|
+
}
|
|
880
|
+
const attrs2 = Object.fromEntries([...m[3].matchAll(/([\w:]+)="([^"]*)"/g)].map((a) => [a[1], a[2]]));
|
|
881
|
+
const node = { name: m[2], kids: [], text: "", attrs: attrs2 };
|
|
882
|
+
top.kids.push(node);
|
|
883
|
+
if (!m[4]) stack.push(node);
|
|
884
|
+
}
|
|
885
|
+
return root;
|
|
886
|
+
}
|
|
887
|
+
var unesc = (v) => v.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/&/g, "&");
|
|
888
|
+
var brace = (v) => v.length === 1 ? v : `{${v}}`;
|
|
889
|
+
function tex(n) {
|
|
890
|
+
const part = (name) => n.kids.find((k) => k.name === name);
|
|
891
|
+
const all = (k) => k ? k.kids.map(tex).join("") : "";
|
|
892
|
+
switch (n.name) {
|
|
893
|
+
case "m:t":
|
|
894
|
+
return [...unesc(n.text)].map((ch) => glyph[ch] ? `\\${glyph[ch]} ` : ch).join("");
|
|
895
|
+
case "m:f":
|
|
896
|
+
return `\\frac{${all(part("m:num"))}}{${all(part("m:den"))}}`;
|
|
897
|
+
case "m:sSup":
|
|
898
|
+
return `${brace(all(part("m:e")))}^${brace(all(part("m:sup")))}`;
|
|
899
|
+
case "m:sSub":
|
|
900
|
+
return `${brace(all(part("m:e")))}_${brace(all(part("m:sub")))}`;
|
|
901
|
+
case "m:sSubSup":
|
|
902
|
+
return `${brace(all(part("m:e")))}_${brace(all(part("m:sub")))}^${brace(all(part("m:sup")))}`;
|
|
903
|
+
case "m:rad": {
|
|
904
|
+
const deg = all(part("m:deg"));
|
|
905
|
+
return `\\sqrt${deg ? `[${deg}]` : ""}{${all(part("m:e"))}}`;
|
|
906
|
+
}
|
|
907
|
+
case "m:nary": {
|
|
908
|
+
const chr = part("m:naryPr")?.kids.find((k) => k.name === "m:chr")?.attrs["m:val"] ?? "\u222B";
|
|
909
|
+
const sub = all(part("m:sub")), sup = all(part("m:sup"));
|
|
910
|
+
return `${glyph[chr] ? `\\${glyph[chr]}` : chr}${sub ? `_${brace(sub)}` : ""}${sup ? `^${brace(sup)}` : ""} ${all(part("m:e"))}`.trim();
|
|
911
|
+
}
|
|
912
|
+
case "m:d": {
|
|
913
|
+
const pr = part("m:dPr")?.kids ?? [];
|
|
914
|
+
const beg = pr.find((k) => k.name === "m:begChr")?.attrs["m:val"] ?? "(";
|
|
915
|
+
const end = pr.find((k) => k.name === "m:endChr")?.attrs["m:val"] ?? ")";
|
|
916
|
+
return `${beg}${n.kids.filter((k) => k.name === "m:e").map(all).join(",")}${end}`;
|
|
917
|
+
}
|
|
918
|
+
case "m:rPr":
|
|
919
|
+
case "m:ctrlPr":
|
|
920
|
+
case "w:rPr":
|
|
921
|
+
case "m:naryPr":
|
|
922
|
+
case "m:dPr":
|
|
923
|
+
case "m:radPr":
|
|
924
|
+
case "m:fPr":
|
|
925
|
+
case "m:sSupPr":
|
|
926
|
+
case "m:sSubPr":
|
|
927
|
+
case "m:sSubSupPr":
|
|
928
|
+
return "";
|
|
929
|
+
default:
|
|
930
|
+
return n.kids.map(tex).join("");
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
var latexOf = (xml) => tex(tree(xml)).replace(/\s+/g, " ").trim();
|
|
934
|
+
|
|
675
935
|
// src/docx/read.ts
|
|
676
936
|
var blank = () => ({ align: null, indent: 0, line: null, after: null, ref: null });
|
|
677
937
|
var mimes = { png: "image/png", jpg: "image/jpeg", jpeg: "image/jpeg", gif: "image/gif", bmp: "image/bmp", webp: "image/webp", svg: "image/svg+xml" };
|
|
@@ -691,6 +951,7 @@ var Reader = class {
|
|
|
691
951
|
this.pkg = pkg;
|
|
692
952
|
this.n = 0;
|
|
693
953
|
this.refs = /* @__PURE__ */ new Map();
|
|
954
|
+
this.footnotes = null;
|
|
694
955
|
this.counters = /* @__PURE__ */ new Map();
|
|
695
956
|
this.fmts = /* @__PURE__ */ new Map();
|
|
696
957
|
this.media = /* @__PURE__ */ new Map();
|
|
@@ -848,6 +1109,14 @@ var Reader = class {
|
|
|
848
1109
|
}
|
|
849
1110
|
return b;
|
|
850
1111
|
}
|
|
1112
|
+
notes() {
|
|
1113
|
+
if (!this.footnotes) {
|
|
1114
|
+
const rel = this.pkg.byType("/footnotes");
|
|
1115
|
+
const xml = rel ? this.pkg.text(rel.target) ?? "" : "";
|
|
1116
|
+
this.footnotes = new Map([...xml.matchAll(/<w:footnote\b[^>]*\bw:id="(-?\d+)"[^>]*>([\s\S]*?)<\/w:footnote>/g)].map((m) => [m[1], noteText(m[2])]));
|
|
1117
|
+
}
|
|
1118
|
+
return this.footnotes;
|
|
1119
|
+
}
|
|
851
1120
|
src(embed) {
|
|
852
1121
|
if (!this.media.has(embed)) {
|
|
853
1122
|
const rel = this.pkg.rels.get(embed);
|
|
@@ -893,10 +1162,8 @@ var Reader = class {
|
|
|
893
1162
|
const inside = [];
|
|
894
1163
|
this.walk(k.kids, ctx, k, inside, { lock: null, task: false, box: false });
|
|
895
1164
|
this.span(s.slice(k.start, k.end), inside, out, ctx, hyperlink(attr(s, k, "w:instr") ?? ""));
|
|
896
|
-
} else if (name === "m:oMath") {
|
|
897
|
-
|
|
898
|
-
this.span(s.slice(k.start, k.end), text ? [{ text, raw: null, run: null, ctx, span: null }] : [], out, ctx, null);
|
|
899
|
-
} else if (name === "m:oMathPara") st.lock = "Equation";
|
|
1165
|
+
} else if (name === "m:oMath") out.push({ text: "\uE000", raw: s.slice(k.start, k.end), run: null, ctx, span: null, math: latexOf(s.slice(k.start, k.end)) });
|
|
1166
|
+
else if (name === "m:oMathPara") st.lock = "Equation";
|
|
900
1167
|
else out.push({ text: null, raw: s.slice(k.start, k.end), run: null, ctx, span: null });
|
|
901
1168
|
}
|
|
902
1169
|
}
|
|
@@ -917,17 +1184,17 @@ var Reader = class {
|
|
|
917
1184
|
out.push({ text: null, raw: s.slice(k.start, k.end), run: null, ctx, span: null });
|
|
918
1185
|
return;
|
|
919
1186
|
}
|
|
920
|
-
const
|
|
1187
|
+
const run2 = { open: opened(s, k), rPr: rPrEl ? s.slice(rPrEl.start, rPrEl.end) : "", fmt: f, el: k, parent };
|
|
921
1188
|
const push = (text, raw, extra) => {
|
|
922
1189
|
if (text !== null && st.box) {
|
|
923
1190
|
st.box = false;
|
|
924
1191
|
if (text.startsWith(" ") && raw === null) {
|
|
925
|
-
out.push({ text: null, raw: '<w:t xml:space="preserve"> </w:t>', run, ctx, span: null, box: true });
|
|
1192
|
+
out.push({ text: null, raw: '<w:t xml:space="preserve"> </w:t>', run: run2, ctx, span: null, box: true });
|
|
926
1193
|
text = text.slice(1);
|
|
927
1194
|
if (!text) return;
|
|
928
1195
|
}
|
|
929
1196
|
}
|
|
930
|
-
out.push({ text, raw, run, ctx, span: null, ...extra });
|
|
1197
|
+
out.push({ text, raw, run: run2, ctx, span: null, ...extra });
|
|
931
1198
|
};
|
|
932
1199
|
for (const c of k.kids) {
|
|
933
1200
|
const raw = s.slice(c.start, c.end);
|
|
@@ -960,6 +1227,11 @@ var Reader = class {
|
|
|
960
1227
|
else push("\n", raw);
|
|
961
1228
|
break;
|
|
962
1229
|
}
|
|
1230
|
+
case "w:footnoteReference": {
|
|
1231
|
+
const id = attr(s, c, "w:id") ?? "";
|
|
1232
|
+
push("\uE001", raw, { note: { id, text: this.notes().get(id) ?? "" } });
|
|
1233
|
+
break;
|
|
1234
|
+
}
|
|
963
1235
|
case "w:fldChar":
|
|
964
1236
|
push(null, raw, { fld: attr(s, c, "w:fldCharType") ?? "" });
|
|
965
1237
|
break;
|
|
@@ -1164,10 +1436,16 @@ function fmtAt(p) {
|
|
|
1164
1436
|
link ?? (link = p.span?.link ?? null);
|
|
1165
1437
|
return link === f.link && rev === f.rev ? f : { ...f, link, rev };
|
|
1166
1438
|
}
|
|
1439
|
+
var noteText = (xml) => [...xml.matchAll(/<w:t(?:\s[^>]*)?>([^<]*)<\/w:t>/g)].map((m) => m[1]).join("").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/&/g, "&").trim();
|
|
1167
1440
|
function inline(pieces2) {
|
|
1168
1441
|
const out = [];
|
|
1169
1442
|
let key2 = "";
|
|
1170
1443
|
for (const p of pieces2) {
|
|
1444
|
+
if (p.math !== void 0 || p.note) {
|
|
1445
|
+
out.push(p.note ? { type: "footnote", attrs: { id: p.note.id, text: p.note.text } } : { type: "math", attrs: { latex: p.math } });
|
|
1446
|
+
key2 = "";
|
|
1447
|
+
continue;
|
|
1448
|
+
}
|
|
1171
1449
|
if (p.img) {
|
|
1172
1450
|
out.push({ type: "image", attrs: { ...p.img } });
|
|
1173
1451
|
key2 = "";
|
|
@@ -1332,7 +1610,7 @@ function inlineSig(kids) {
|
|
|
1332
1610
|
out += (next === key2 ? "" : `${next}`) + k.text;
|
|
1333
1611
|
key2 = next;
|
|
1334
1612
|
} else {
|
|
1335
|
-
out += `${k.type}${k.type === "image" ? picture2(k.attrs ?? {}) : ""}`;
|
|
1613
|
+
out += `${k.type}${k.type === "image" ? picture2(k.attrs ?? {}) : k.type === "math" ? k.attrs?.latex : k.type === "footnote" ? `${k.attrs?.id}:${k.attrs?.text}` : ""}`;
|
|
1336
1614
|
key2 = null;
|
|
1337
1615
|
}
|
|
1338
1616
|
}
|
|
@@ -1463,6 +1741,7 @@ var Writer = class {
|
|
|
1463
1741
|
this.srcs = null;
|
|
1464
1742
|
this.tocs = false;
|
|
1465
1743
|
this.revs = /* @__PURE__ */ new Map();
|
|
1744
|
+
this.lastNote = null;
|
|
1466
1745
|
this.r = new Reader(pkg);
|
|
1467
1746
|
this.s = pkg.doc;
|
|
1468
1747
|
for (const id of pkg.rels.keys()) this.relIds.add(id);
|
|
@@ -1485,6 +1764,7 @@ var Writer = class {
|
|
|
1485
1764
|
if (this.last === "tbl" && list[list.length - 1]?.kind !== "tbl") xml += "<w:p/>";
|
|
1486
1765
|
const changed2 = /* @__PURE__ */ new Map();
|
|
1487
1766
|
const text = this.marginal(s.slice(0, body.open) + xml + rest + s.slice(tail), setup, changed2);
|
|
1767
|
+
this.footnotes(doc, changed2);
|
|
1488
1768
|
if (text !== s) changed2.set(this.pkg.main, text);
|
|
1489
1769
|
if (this.rels.length) {
|
|
1490
1770
|
const path = this.pkg.relsPath(this.pkg.main);
|
|
@@ -1610,6 +1890,37 @@ var Writer = class {
|
|
|
1610
1890
|
if (o.kind === "toc") return b && sig(o.node) === sig(b.node) ? s.slice(b.start, b.end) : this.toc(o.node);
|
|
1611
1891
|
return this.code(o);
|
|
1612
1892
|
}
|
|
1893
|
+
noteId() {
|
|
1894
|
+
const rel = this.pkg.byType("/footnotes");
|
|
1895
|
+
const xml = rel ? this.pkg.text(rel.target) ?? "" : "";
|
|
1896
|
+
this.lastNote ?? (this.lastNote = Math.max(0, ...[...xml.matchAll(/<w:footnote\b[^>]*\bw:id="(-?\d+)"/g)].map((m) => +m[1])));
|
|
1897
|
+
return ++this.lastNote;
|
|
1898
|
+
}
|
|
1899
|
+
footnotes(doc, changed2) {
|
|
1900
|
+
const notes2 = [];
|
|
1901
|
+
const walk = (n) => {
|
|
1902
|
+
if (n.type === "footnote" && n.attrs?.id) notes2.push({ id: String(n.attrs.id), text: String(n.attrs.text ?? "") });
|
|
1903
|
+
n.content?.forEach(walk);
|
|
1904
|
+
};
|
|
1905
|
+
walk(doc);
|
|
1906
|
+
const rel = this.pkg.byType("/footnotes");
|
|
1907
|
+
const old = rel ? this.pkg.text(rel.target) : null;
|
|
1908
|
+
if (!notes2.length) return;
|
|
1909
|
+
const path = rel ? rel.target : "word/footnotes.xml";
|
|
1910
|
+
let xml = old ?? `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
1911
|
+
<w:footnotes xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:r="${REL}"><w:footnote w:type="separator" w:id="-1"><w:p><w:pPr><w:spacing w:after="0" w:line="240" w:lineRule="auto"/></w:pPr><w:r><w:separator/></w:r></w:p></w:footnote><w:footnote w:type="continuationSeparator" w:id="0"><w:p><w:pPr><w:spacing w:after="0" w:line="240" w:lineRule="auto"/></w:pPr><w:r><w:continuationSeparator/></w:r></w:p></w:footnote></w:footnotes>`;
|
|
1912
|
+
const fresh = (id, words2) => `<w:footnote w:id="${id}"><w:p><w:pPr><w:spacing w:after="0" w:line="240" w:lineRule="auto"/></w:pPr><w:r><w:rPr><w:vertAlign w:val="superscript"/></w:rPr><w:footnoteRef/></w:r><w:r><w:rPr><w:sz w:val="20"/></w:rPr><w:t xml:space="preserve"> ${escape(words2)}</w:t></w:r></w:p></w:footnote>`;
|
|
1913
|
+
for (const n of notes2) {
|
|
1914
|
+
const found = new RegExp(`<w:footnote\\b[^>]*\\bw:id="${n.id}"[^>]*>([\\s\\S]*?)</w:footnote>`).exec(xml);
|
|
1915
|
+
if (found && noteText(found[1]) === n.text) continue;
|
|
1916
|
+
xml = found ? xml.replace(found[0], fresh(n.id, n.text)) : xml.replace(/<\/w:footnotes>\s*$/, fresh(n.id, n.text) + "</w:footnotes>");
|
|
1917
|
+
}
|
|
1918
|
+
if (xml === old) return;
|
|
1919
|
+
changed2.set(path, xml);
|
|
1920
|
+
if (rel) return;
|
|
1921
|
+
this.rels.push(`<Relationship Id="${this.relId()}" Type="${REL}/footnotes" Target="footnotes.xml"/>`);
|
|
1922
|
+
this.types.add(`<Override PartName="/word/footnotes.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml"/>`);
|
|
1923
|
+
}
|
|
1613
1924
|
marginal(text, setup, changed2) {
|
|
1614
1925
|
if (!setup || !setup.page && setup.header === void 0 && setup.footer === void 0 && setup.numbers === void 0) return text;
|
|
1615
1926
|
const end = text.lastIndexOf("</w:body>");
|
|
@@ -1673,11 +1984,11 @@ var Writer = class {
|
|
|
1673
1984
|
const open = sec.indexOf(">") + 1;
|
|
1674
1985
|
sec = sec.slice(0, open) + `<w:${kind}Reference w:type="default" r:id="${id}"/>` + sec.slice(open);
|
|
1675
1986
|
};
|
|
1676
|
-
const line = (
|
|
1987
|
+
const line = (words2, page) => {
|
|
1677
1988
|
const field = '<w:r><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:instrText xml:space="preserve"> PAGE </w:instrText></w:r><w:r><w:fldChar w:fldCharType="separate"/></w:r><w:r><w:t>1</w:t></w:r><w:r><w:fldChar w:fldCharType="end"/></w:r>';
|
|
1678
|
-
const
|
|
1679
|
-
if (!
|
|
1680
|
-
return `<w:p><w:pPr>${page &&
|
|
1989
|
+
const run2 = words2 ? `<w:r><w:t xml:space="preserve">${escape(words2)}</w:t></w:r>` : "";
|
|
1990
|
+
if (!words2 && !page) return "";
|
|
1991
|
+
return `<w:p><w:pPr>${page && words2 ? `<w:tabs><w:tab w:val="right" w:pos="${this.textWidth()}"/></w:tabs>` : page ? '<w:jc w:val="right"/>' : ""}</w:pPr>${run2}${page && words2 ? "<w:r><w:tab/></w:r>" : ""}${page ? field : ""}</w:p>`;
|
|
1681
1992
|
};
|
|
1682
1993
|
if (setup.header !== void 0) part("header", line(setup.header, false));
|
|
1683
1994
|
if (setup.footer !== void 0 || setup.numbers !== void 0) part("footer", line(setup.footer ?? "", !!setup.numbers));
|
|
@@ -1870,7 +2181,7 @@ var Writer = class {
|
|
|
1870
2181
|
const base = p.span ? fmtAt({ ...p, span: null }) : fmt;
|
|
1871
2182
|
if (p.img) units.push({ ch: "\uFFFC", raw: p.raw, run: p.run, ctx: p.ctx, span: null, idx: n++, fmt, base, img: p.img });
|
|
1872
2183
|
else if (p.text === null) units.push({ ch: null, raw: p.raw, run: p.run, ctx: p.ctx, span: null, idx: n++, fmt, base, box: p.box });
|
|
1873
|
-
else if (p.raw !== null) units.push({ ch: p.text, raw: p.raw, run: p.run, ctx: p.ctx, span: p.span, idx: n++, fmt, base });
|
|
2184
|
+
else if (p.raw !== null) units.push({ ch: p.text, raw: p.raw, run: p.run, ctx: p.ctx, span: p.span, idx: n++, fmt, base, math: p.math, note: p.note });
|
|
1874
2185
|
else for (const ch of p.text) units.push({ ch, raw: null, run: p.run, ctx: p.ctx, span: p.span, idx: n++, fmt, base });
|
|
1875
2186
|
if (p.run) counts.set(p.run, n);
|
|
1876
2187
|
}
|
|
@@ -1885,6 +2196,8 @@ var Writer = class {
|
|
|
1885
2196
|
for (const ch of n.text ?? "") B.push({ ch: ch === "\r" ? "\n" : ch, fmt: f, key: k });
|
|
1886
2197
|
} else if (n.type === "hardBreak") B.push({ ch: "\n", fmt: lastFmt, key: keyOf(lastFmt) });
|
|
1887
2198
|
else if (n.type === "image") B.push({ ch: "\uFFFC", fmt: lastFmt, key: keyOf(lastFmt), img: n.attrs ?? {} });
|
|
2199
|
+
else if (n.type === "math") B.push({ ch: "\uE000", fmt: lastFmt, key: keyOf(lastFmt), math: String(n.attrs?.latex ?? "") });
|
|
2200
|
+
else if (n.type === "footnote") B.push({ ch: "\uE001", fmt: lastFmt, key: keyOf(lastFmt), note: n.attrs ?? (n.attrs = {}) });
|
|
1888
2201
|
}
|
|
1889
2202
|
const boxes2 = units.filter((u) => u.box);
|
|
1890
2203
|
let box2 = null;
|
|
@@ -1940,6 +2253,20 @@ var Writer = class {
|
|
|
1940
2253
|
} else out.push({ ch: want.ch, raw: this.drawing(want.img), run: { open: "<w:r>", rPr: "", fmt: plain, el: null, parent: null }, ctx: [], u: null, fmt: plain });
|
|
1941
2254
|
continue;
|
|
1942
2255
|
}
|
|
2256
|
+
if (want.math !== void 0) {
|
|
2257
|
+
const u = i >= 0 ? A[i] : null;
|
|
2258
|
+
out.push(u?.math === want.math ? { ch: u.ch, raw: u.raw, run: null, ctx: u.ctx, u, fmt: u.fmt } : { ch: want.ch, raw: omml(want.math), run: null, ctx: u?.ctx ?? [], u: null, fmt: plain });
|
|
2259
|
+
continue;
|
|
2260
|
+
}
|
|
2261
|
+
if (want.note) {
|
|
2262
|
+
const u = i >= 0 ? A[i] : null;
|
|
2263
|
+
if (u?.note && u.note.id === want.note.id) out.push({ ch: u.ch, raw: u.raw, run: u.run, ctx: u.ctx, u, fmt: u.fmt });
|
|
2264
|
+
else {
|
|
2265
|
+
want.note.id = typeof want.note.id === "string" && want.note.id ? want.note.id : String(this.noteId());
|
|
2266
|
+
out.push({ ch: want.ch, raw: `<w:footnoteReference w:id="${want.note.id}"/>`, run: { open: "<w:r>", rPr: '<w:rPr><w:vertAlign w:val="superscript"/></w:rPr>', fmt: plain, el: null, parent: null }, ctx: [], u: null, fmt: plain });
|
|
2267
|
+
}
|
|
2268
|
+
continue;
|
|
2269
|
+
}
|
|
1943
2270
|
if (i >= 0) {
|
|
1944
2271
|
const u = A[i];
|
|
1945
2272
|
if (u.span && intact.has(u.span)) {
|
|
@@ -1949,18 +2276,18 @@ var Writer = class {
|
|
|
1949
2276
|
const from = u.span ? u.base : u.fmt;
|
|
1950
2277
|
const keep = u.ch === "\n" || keyOf(from) === want.key;
|
|
1951
2278
|
const fmt = keep ? from : want.fmt;
|
|
1952
|
-
const
|
|
1953
|
-
out.push({ ch: u.ch, raw: u.raw, run, ctx: this.revised(this.linked(u.ctx, fmt.link, lastChar()), fmt.rev), u: keep && u.run ? u : null, fmt });
|
|
2279
|
+
const run2 = keep && u.run ? u.run : this.derive(u.run ?? paraBase.run, from, want.fmt);
|
|
2280
|
+
out.push({ ch: u.ch, raw: u.raw, run: run2, ctx: this.revised(this.linked(u.ctx, fmt.link, lastChar()), fmt.rev), u: keep && u.run ? u : null, fmt });
|
|
1954
2281
|
} else {
|
|
1955
2282
|
const left = lastChar();
|
|
1956
2283
|
const right = next[j + 1] >= 0 ? A[next[j + 1]] : null;
|
|
1957
2284
|
const base = left ? { run: left.run, fmt: left.fmt } : right ? { run: right.run ?? paraBase.run, fmt: right.span ? right.base : right.fmt } : paraBase;
|
|
1958
|
-
const
|
|
2285
|
+
const run2 = keyOf(base.fmt) === want.key ? base.run : this.derive(base.run, base.fmt, want.fmt);
|
|
1959
2286
|
const shared = [];
|
|
1960
2287
|
if (left && right) {
|
|
1961
2288
|
for (let k = 0; k < left.ctx.length && left.ctx[k] === right.ctx[k]; k++) if (!left.ctx[k].link) shared.push(left.ctx[k]);
|
|
1962
2289
|
}
|
|
1963
|
-
out.push({ ch: want.ch, raw: null, run, ctx: this.revised(this.linked(shared, want.fmt.link, left), want.fmt.rev), u: null, fmt: want.fmt });
|
|
2290
|
+
out.push({ ch: want.ch, raw: null, run: run2, ctx: this.revised(this.linked(shared, want.fmt.link, left), want.fmt.rev), u: null, fmt: want.fmt });
|
|
1964
2291
|
}
|
|
1965
2292
|
}
|
|
1966
2293
|
let xml = "";
|
|
@@ -2043,10 +2370,10 @@ var Writer = class {
|
|
|
2043
2370
|
this.relIds.add(`rId${n}`);
|
|
2044
2371
|
return `rId${n}`;
|
|
2045
2372
|
}
|
|
2046
|
-
derive(
|
|
2047
|
-
const cache =
|
|
2373
|
+
derive(run2, from, to) {
|
|
2374
|
+
const cache = run2.derived ?? (run2.derived = /* @__PURE__ */ new Map());
|
|
2048
2375
|
const key2 = keyOf(from) + ">" + keyOf(to);
|
|
2049
|
-
if (!cache.has(key2)) cache.set(key2, { open:
|
|
2376
|
+
if (!cache.has(key2)) cache.set(key2, { open: run2.open, rPr: this.delta(run2.rPr, from, to), fmt: to, el: null, parent: null });
|
|
2050
2377
|
return cache.get(key2);
|
|
2051
2378
|
}
|
|
2052
2379
|
delta(rPr, from, to) {
|
|
@@ -2095,8 +2422,8 @@ var Writer = class {
|
|
|
2095
2422
|
} else if (!to.link && from.link && this.pkg.styles.isLink(style)) set["w:rStyle"] = null;
|
|
2096
2423
|
return Object.keys(set).length ? rebuild(rPr, "w:rPr", R, set) : rPr;
|
|
2097
2424
|
}
|
|
2098
|
-
runXml(
|
|
2099
|
-
if (
|
|
2425
|
+
runXml(run2, glyphs, counts) {
|
|
2426
|
+
if (run2.el && glyphs.length === counts.get(run2) && glyphs.every((g, n) => g.u && g.u.run === run2 && g.u.idx === n)) return this.s.slice(run2.el.start, run2.el.end);
|
|
2100
2427
|
let body = "";
|
|
2101
2428
|
let text = "";
|
|
2102
2429
|
const tag = glyphs[0]?.ctx.some((w) => w.rev?.startsWith('["del"')) ? "w:delText" : "w:t";
|
|
@@ -2111,7 +2438,7 @@ var Writer = class {
|
|
|
2111
2438
|
} else text += g.ch;
|
|
2112
2439
|
}
|
|
2113
2440
|
flush();
|
|
2114
|
-
return
|
|
2441
|
+
return run2.open + run2.rPr + body + "</w:r>";
|
|
2115
2442
|
}
|
|
2116
2443
|
embed(src) {
|
|
2117
2444
|
if (!this.srcs) {
|
|
@@ -2350,14 +2677,14 @@ async function readDocx(bytes) {
|
|
|
2350
2677
|
const size2 = sect && kid(sect, "w:pgSz");
|
|
2351
2678
|
const mar = sect && kid(sect, "w:pgMar");
|
|
2352
2679
|
const px2 = (el, name, fallback) => Math.round(Math.abs(+((el && attr(s, el, name)) ?? fallback)) / 15 * 100) / 100;
|
|
2353
|
-
const
|
|
2680
|
+
const words2 = (kind) => {
|
|
2354
2681
|
const ref = sect?.kids.find((k) => k.name === `w:${kind}Reference` && attr(s, k, "w:type") === "default");
|
|
2355
2682
|
const part = ref && pkg.rels.get(attr(s, ref, "r:id") ?? "");
|
|
2356
2683
|
const xml = part ? pkg.text(part.target) ?? "" : "";
|
|
2357
2684
|
return { text: [...xml.matchAll(/<w:t(?:\s[^>]*)?>([^<]*)<\/w:t>/g)].map((m) => m[1]).join("").replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").trim(), page: /\bPAGE\b/.test(xml) };
|
|
2358
2685
|
};
|
|
2359
|
-
const head =
|
|
2360
|
-
const foot =
|
|
2686
|
+
const head = words2("header");
|
|
2687
|
+
const foot = words2("footer");
|
|
2361
2688
|
return {
|
|
2362
2689
|
marginal: { header: head.text, footer: foot.page ? foot.text.replace(/\s*\d+$/, "") : foot.text, numbers: foot.page },
|
|
2363
2690
|
doc: { type: "doc", content: content.length ? content : [{ type: "paragraph", attrs: { align: null, indent: 0, ref: null } }] },
|
|
@@ -2399,6 +2726,10 @@ function measure(view) {
|
|
|
2399
2726
|
const room = page.height - top - bottom;
|
|
2400
2727
|
const els = [...view.dom.children];
|
|
2401
2728
|
const gaps = [];
|
|
2729
|
+
const line = page.width - page.margins[1] - page.margins[3];
|
|
2730
|
+
const area = (list) => list.length ? 14 + list.reduce((h, text) => h + 15 * Math.max(1, Math.ceil(text.length * 5.6 / line)), 0) : 0;
|
|
2731
|
+
let notes2 = [];
|
|
2732
|
+
let count = 0;
|
|
2402
2733
|
let i = 0;
|
|
2403
2734
|
let shift = 0;
|
|
2404
2735
|
let start = 0;
|
|
@@ -2412,17 +2743,25 @@ function measure(view) {
|
|
|
2412
2743
|
if (!el) return;
|
|
2413
2744
|
const y = el.offsetTop - shift;
|
|
2414
2745
|
const end = y + el.offsetHeight;
|
|
2746
|
+
const mine = [];
|
|
2747
|
+
node.descendants((d) => {
|
|
2748
|
+
if (d.type.name === "footnote") mine.push(`${count + mine.length + 1} ${d.attrs.text}`);
|
|
2749
|
+
});
|
|
2415
2750
|
if (node.type.name === "pageBreak") {
|
|
2416
|
-
gaps.push({ pos: offset + node.nodeSize, height: start + room - end + bottom + 24 + top, page: gaps.length + 1 });
|
|
2751
|
+
gaps.push({ pos: offset + node.nodeSize, height: start + room - end + bottom + 24 + top, page: gaps.length + 1, notes: notes2 });
|
|
2752
|
+
notes2 = [];
|
|
2417
2753
|
start = end;
|
|
2418
|
-
} else if (end > start + room && y > start) {
|
|
2419
|
-
gaps.push({ pos: offset, height: start + room - y + bottom + 24 + top, page: gaps.length + 1 });
|
|
2754
|
+
} else if (end > start + room - area([...notes2, ...mine]) && y > start) {
|
|
2755
|
+
gaps.push({ pos: offset, height: start + room - y + bottom + 24 + top, page: gaps.length + 1, notes: notes2 });
|
|
2756
|
+
notes2 = [];
|
|
2420
2757
|
start = y;
|
|
2421
2758
|
}
|
|
2759
|
+
notes2.push(...mine);
|
|
2760
|
+
count += mine.length;
|
|
2422
2761
|
while (end > start + room) start += room;
|
|
2423
2762
|
last = end;
|
|
2424
2763
|
});
|
|
2425
|
-
gaps.push({ pos: view.state.doc.content.size, height: Math.max(0, start + room - last), page: gaps.length + 1, end: true });
|
|
2764
|
+
gaps.push({ pos: view.state.doc.content.size, height: Math.max(0, start + room - last), page: gaps.length + 1, end: true, notes: notes2 });
|
|
2426
2765
|
return gaps.map((g) => ({ ...g, height: Math.max(0, Math.round(g.height)) }));
|
|
2427
2766
|
}
|
|
2428
2767
|
var Pager = import_core.Extension.create({
|
|
@@ -2440,11 +2779,11 @@ var Pager = import_core.Extension.create({
|
|
|
2440
2779
|
view(view) {
|
|
2441
2780
|
let timer = 0;
|
|
2442
2781
|
let sig2 = "";
|
|
2443
|
-
const
|
|
2782
|
+
const run2 = () => {
|
|
2444
2783
|
if (!view.dom.isConnected) return;
|
|
2445
2784
|
const gaps = measure(view);
|
|
2446
2785
|
const { marks } = paging.getState(view.state);
|
|
2447
|
-
const next = gaps.map((g) => `${g.pos}:${g.height}`).join() + `|${marks.header}|${marks.footer}`;
|
|
2786
|
+
const next = gaps.map((g) => `${g.pos}:${g.height}:${g.notes.join("\n")}`).join() + `|${marks.header}|${marks.footer}`;
|
|
2448
2787
|
if (next === sig2) return;
|
|
2449
2788
|
sig2 = next;
|
|
2450
2789
|
const line = (parent, cls, text) => {
|
|
@@ -2469,13 +2808,25 @@ var Pager = import_core.Extension.create({
|
|
|
2469
2808
|
el.contentEditable = "false";
|
|
2470
2809
|
line(el, "w100n-text-foot", marks.footer);
|
|
2471
2810
|
if (!g.end) line(el, "w100n-text-head", marks.header);
|
|
2811
|
+
if (g.notes.length) {
|
|
2812
|
+
const list = document.createElement("div");
|
|
2813
|
+
list.className = "w100n-text-footnotes";
|
|
2814
|
+
for (const note of g.notes) {
|
|
2815
|
+
const p = document.createElement("p");
|
|
2816
|
+
const n = document.createElement("sup");
|
|
2817
|
+
n.textContent = note.slice(0, note.indexOf(" "));
|
|
2818
|
+
p.append(n, note.slice(note.indexOf(" ")));
|
|
2819
|
+
list.append(p);
|
|
2820
|
+
}
|
|
2821
|
+
el.append(list);
|
|
2822
|
+
}
|
|
2472
2823
|
return el;
|
|
2473
|
-
}, { key: `${g.pos}:${g.height}:${g.page}:${marks.header}:${marks.footer}`, side: -1, ignoreSelection: true }))]);
|
|
2824
|
+
}, { key: `${g.pos}:${g.height}:${g.page}:${marks.header}:${marks.footer}:${g.notes.join("\n")}`, side: -1, ignoreSelection: true }))]);
|
|
2474
2825
|
view.dispatch(view.state.tr.setMeta(paging, { set }).setMeta("addToHistory", false));
|
|
2475
2826
|
};
|
|
2476
2827
|
const later = (ms) => {
|
|
2477
2828
|
clearTimeout(timer);
|
|
2478
|
-
timer = window.setTimeout(
|
|
2829
|
+
timer = window.setTimeout(run2, ms);
|
|
2479
2830
|
};
|
|
2480
2831
|
const watch = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(() => later(200));
|
|
2481
2832
|
watch?.observe(view.dom);
|
|
@@ -2630,6 +2981,37 @@ var PageBreak = import_core2.Node.create({
|
|
|
2630
2981
|
return ["div", { "data-page-break": "", "data-label": this.options.label, class: "w100n-text-break", contenteditable: "false" }];
|
|
2631
2982
|
}
|
|
2632
2983
|
});
|
|
2984
|
+
var Formula = import_core2.Node.create({
|
|
2985
|
+
name: "math",
|
|
2986
|
+
group: "inline",
|
|
2987
|
+
inline: true,
|
|
2988
|
+
atom: true,
|
|
2989
|
+
selectable: true,
|
|
2990
|
+
addAttributes: () => ({ latex: { default: "", parseHTML: (el) => el.getAttribute("data-math") ?? "" } }),
|
|
2991
|
+
parseHTML: () => [{ tag: "span[data-math]" }],
|
|
2992
|
+
renderHTML: ({ node }) => ["span", { "data-math": node.attrs.latex, class: "w100n-math" }],
|
|
2993
|
+
addNodeView: () => ({ node }) => {
|
|
2994
|
+
const dom = document.createElement("span");
|
|
2995
|
+
dom.className = "w100n-math";
|
|
2996
|
+
dom.dataset.math = node.attrs.latex;
|
|
2997
|
+
dom.contentEditable = "false";
|
|
2998
|
+
dom.innerHTML = mathml(node.attrs.latex);
|
|
2999
|
+
return { dom };
|
|
3000
|
+
}
|
|
3001
|
+
});
|
|
3002
|
+
var Footnote = import_core2.Node.create({
|
|
3003
|
+
name: "footnote",
|
|
3004
|
+
group: "inline",
|
|
3005
|
+
inline: true,
|
|
3006
|
+
atom: true,
|
|
3007
|
+
selectable: true,
|
|
3008
|
+
addAttributes: () => ({
|
|
3009
|
+
id: { default: null, parseHTML: (el) => el.getAttribute("data-note-id") },
|
|
3010
|
+
text: { default: "", parseHTML: (el) => el.getAttribute("title") ?? "" }
|
|
3011
|
+
}),
|
|
3012
|
+
parseHTML: () => [{ tag: "sup[data-footnote]" }],
|
|
3013
|
+
renderHTML: ({ node }) => ["sup", { "data-footnote": "", "data-note-id": node.attrs.id ?? void 0, title: node.attrs.text, class: "w100n-fn", contenteditable: "false" }]
|
|
3014
|
+
});
|
|
2633
3015
|
var headings = (doc, after) => {
|
|
2634
3016
|
const found = [];
|
|
2635
3017
|
doc.descendants((node, pos) => {
|
|
@@ -2927,7 +3309,7 @@ function kit(kind, t, live) {
|
|
|
2927
3309
|
Toc.configure({ relative: kind === "markdown", label: t.toc, empty: t.tocEmpty }),
|
|
2928
3310
|
Note,
|
|
2929
3311
|
Notes,
|
|
2930
|
-
...kind === "docx" ? [Pager, Locks.configure({ label: t.locked }), revision("insertion", "ins"), revision("deletion", "del"), Suggest] : [],
|
|
3312
|
+
...kind === "docx" ? [Formula, Footnote, Pager, Locks.configure({ label: t.locked }), revision("insertion", "ins"), revision("deletion", "del"), Suggest] : [],
|
|
2931
3313
|
...live ? [import_extension_collaboration.default.configure({ document: live.doc }), import_extension_collaboration_caret.default.configure({ provider: live.link, user: live.user })] : []
|
|
2932
3314
|
];
|
|
2933
3315
|
}
|
|
@@ -3108,7 +3490,7 @@ var track = ({ doc: _json, ...parsed }, doc) => {
|
|
|
3108
3490
|
return nodes.length === parsed.raws.length ? { ...parsed, nodes } : { ...parsed, nodes: [], raws: [], head: "", tail: "\n" };
|
|
3109
3491
|
};
|
|
3110
3492
|
var ticks = (node, side2) => {
|
|
3111
|
-
const len = Math.max(0, ...(node.isText ? node.text.match(/`+/g) ?? [] : []).map((
|
|
3493
|
+
const len = Math.max(0, ...(node.isText ? node.text.match(/`+/g) ?? [] : []).map((run2) => run2.length));
|
|
3112
3494
|
return len ? side2 > 0 ? ` ${"`".repeat(len + 1)}` : `${"`".repeat(len + 1)} ` : "`";
|
|
3113
3495
|
};
|
|
3114
3496
|
var plain2 = (mark, parent, index) => {
|
|
@@ -3126,7 +3508,7 @@ var plain2 = (mark, parent, index) => {
|
|
|
3126
3508
|
function serializer(style, hints, before, cell2 = false) {
|
|
3127
3509
|
let form = null;
|
|
3128
3510
|
const hint = (node) => hints[node.attrs.ref] ?? {};
|
|
3129
|
-
const
|
|
3511
|
+
const run2 = (parent, index, types) => {
|
|
3130
3512
|
let n = 0;
|
|
3131
3513
|
for (let i = index - 1; i >= 0 && types.includes(parent.child(i).type.name); i--) n++;
|
|
3132
3514
|
if (!index && before && types.includes(before.type.name)) n++;
|
|
@@ -3140,7 +3522,7 @@ function serializer(style, hints, before, cell2 = false) {
|
|
|
3140
3522
|
state.options.tightLists = was;
|
|
3141
3523
|
};
|
|
3142
3524
|
const list = (state, node, parent, index) => {
|
|
3143
|
-
const bullet = hint(node).bullet ?? (
|
|
3525
|
+
const bullet = hint(node).bullet ?? (run2(parent, index, ["bulletList", "taskList"]) ? style.bullet === "-" ? "*" : "-" : style.bullet);
|
|
3144
3526
|
tight(state, node, () => state.renderList(node, " ", () => `${bullet} `));
|
|
3145
3527
|
};
|
|
3146
3528
|
const blank3 = { open: "", close: "", mixable: true };
|
|
@@ -3188,7 +3570,7 @@ ${lines2.join("")}<!-- /toc -->`);
|
|
|
3188
3570
|
taskList: list,
|
|
3189
3571
|
orderedList(state, node, parent, index) {
|
|
3190
3572
|
const start = node.attrs.start ?? 1;
|
|
3191
|
-
const delim = hint(node).delim ?? (
|
|
3573
|
+
const delim = hint(node).delim ?? (run2(parent, index, ["orderedList"]) ? style.delim === "." ? ")" : "." : style.delim);
|
|
3192
3574
|
const width = String(start + node.childCount - 1).length;
|
|
3193
3575
|
tight(state, node, () => state.renderList(node, " ".repeat(width + 2), (i) => `${start + i}${delim} `));
|
|
3194
3576
|
},
|
|
@@ -5819,6 +6201,14 @@ var en2 = {
|
|
|
5819
6201
|
chooseFile: "Choose a file",
|
|
5820
6202
|
put: "Insert",
|
|
5821
6203
|
link: "Link",
|
|
6204
|
+
footnote: "Footnote",
|
|
6205
|
+
footnoteText: "Footnote text",
|
|
6206
|
+
formula: "Formula",
|
|
6207
|
+
formulaHint: "Saved as a Word equation",
|
|
6208
|
+
symbols: "Special characters",
|
|
6209
|
+
symbolSearch: "Search, for example arrow",
|
|
6210
|
+
update: "Update",
|
|
6211
|
+
removeFootnote: "Remove footnote",
|
|
5822
6212
|
linkAddress: "Link address",
|
|
5823
6213
|
apply: "Apply",
|
|
5824
6214
|
unlink: "Remove link",
|
|
@@ -6137,6 +6527,14 @@ var pl2 = {
|
|
|
6137
6527
|
chooseFile: "Wybierz plik",
|
|
6138
6528
|
put: "Wstaw",
|
|
6139
6529
|
link: "Link",
|
|
6530
|
+
footnote: "Przypis",
|
|
6531
|
+
footnoteText: "Tekst przypisu",
|
|
6532
|
+
formula: "Wz\xF3r",
|
|
6533
|
+
formulaHint: "Zapisany jako r\xF3wnanie Word",
|
|
6534
|
+
symbols: "Znaki specjalne",
|
|
6535
|
+
symbolSearch: "Szukaj, na przyk\u0142ad strza\u0142ka",
|
|
6536
|
+
update: "Zmie\u0144",
|
|
6537
|
+
removeFootnote: "Usu\u0144 przypis",
|
|
6140
6538
|
linkAddress: "Adres linku",
|
|
6141
6539
|
apply: "Zastosuj",
|
|
6142
6540
|
unlink: "Usu\u0144 link",
|
|
@@ -6454,6 +6852,14 @@ var uk2 = {
|
|
|
6454
6852
|
imageLink: "\u0410\u0434\u0440\u0435\u0441\u0430 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F",
|
|
6455
6853
|
chooseFile: "\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u0444\u0430\u0439\u043B",
|
|
6456
6854
|
put: "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438",
|
|
6855
|
+
footnote: "\u0412\u0438\u043D\u043E\u0441\u043A\u0430",
|
|
6856
|
+
footnoteText: "\u0422\u0435\u043A\u0441\u0442 \u0432\u0438\u043D\u043E\u0441\u043A\u0438",
|
|
6857
|
+
formula: "\u0424\u043E\u0440\u043C\u0443\u043B\u0430",
|
|
6858
|
+
formulaHint: "\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0454\u0442\u044C\u0441\u044F \u044F\u043A \u0440\u0456\u0432\u043D\u044F\u043D\u043D\u044F Word",
|
|
6859
|
+
symbols: "\u0421\u043F\u0435\u0446\u0441\u0438\u043C\u0432\u043E\u043B\u0438",
|
|
6860
|
+
symbolSearch: "\u041F\u043E\u0448\u0443\u043A, \u043D\u0430\u043F\u0440\u0438\u043A\u043B\u0430\u0434 \u0441\u0442\u0440\u0456\u043B\u043A\u0430",
|
|
6861
|
+
update: "\u0417\u043C\u0456\u043D\u0438\u0442\u0438",
|
|
6862
|
+
removeFootnote: "\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0432\u0438\u043D\u043E\u0441\u043A\u0443",
|
|
6457
6863
|
link: "\u041F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F",
|
|
6458
6864
|
linkAddress: "\u0410\u0434\u0440\u0435\u0441\u0430 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F",
|
|
6459
6865
|
apply: "\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438",
|
|
@@ -6644,7 +7050,7 @@ var texts = { en: en2, pl: pl2, uk: uk2 };
|
|
|
6644
7050
|
var ours = "w100n-collab";
|
|
6645
7051
|
var schemas = /* @__PURE__ */ new Map();
|
|
6646
7052
|
var schemaOf = (kind) => schemas.get(kind) ?? schemas.set(kind, (0, import_core3.getSchema)(kit(kind, texts.en))).get(kind);
|
|
6647
|
-
var
|
|
7053
|
+
var parse3 = async (kind, bytes) => kind === "docx" ? (await readDocx(bytes)).doc : fromMarkdown(new TextDecoder().decode(bytes)).doc;
|
|
6648
7054
|
var edits = (tr) => tr.changedParentTypes.has(tr.doc.get("default")) || tr.changedParentTypes.has(tr.doc.get("book")) || tr.changedParentTypes.has(tr.doc.get("setup"));
|
|
6649
7055
|
var filled = (doc) => doc.getXmlFragment("default").length > 0 || doc.getMap("book").size > 0;
|
|
6650
7056
|
function seed(doc, kind, bytes, json) {
|
|
@@ -6690,7 +7096,7 @@ function applyText(doc, kind, changes, origin) {
|
|
|
6690
7096
|
if (c.replace) step.replaceWith(at, at + c.find.length, schema.text(c.replace, step.doc.resolve(at + 1).marks()));
|
|
6691
7097
|
else step.delete(at, at + c.find.length);
|
|
6692
7098
|
}
|
|
6693
|
-
(0, import_y_tiptap2.updateYFragment)({ transact: (
|
|
7099
|
+
(0, import_y_tiptap2.updateYFragment)({ transact: (run2) => doc.transact(run2, origin) }, fragment, step.doc, { mapping: /* @__PURE__ */ new Map(), isOMark: /* @__PURE__ */ new Map() });
|
|
6694
7100
|
return changes.length;
|
|
6695
7101
|
}
|
|
6696
7102
|
async function write2(kind, base, node, load2, setup) {
|
|
@@ -6735,7 +7141,7 @@ async function save(doc, kind, base, put, load2, note) {
|
|
|
6735
7141
|
const changed2 = !same2(bytes, base);
|
|
6736
7142
|
const id = changed2 ? await put(bytes, note ?? named2((texts[who[0].language] ?? texts.en).editedNote, who)) : null;
|
|
6737
7143
|
const refs2 = [];
|
|
6738
|
-
if (changed2) schema.nodeFromJSON(await
|
|
7144
|
+
if (changed2) schema.nodeFromJSON(await parse3(kind, bytes)).descendants((n) => {
|
|
6739
7145
|
if (n.isBlock) refs2.push([n.type.name, n.attrs.ref ?? null]);
|
|
6740
7146
|
});
|
|
6741
7147
|
doc.transact(() => {
|