@ai-matrx/office 0.8.1 → 0.8.2
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/CHANGELOG.md +8 -0
- package/dist/chunk-47MIGBMH.js +148 -0
- package/dist/chunk-47MIGBMH.js.map +1 -0
- package/dist/{chunk-BWMAYLW4.cjs → chunk-6Z3Y6DUI.cjs} +7 -7
- package/dist/chunk-6Z3Y6DUI.cjs.map +1 -0
- package/dist/chunk-MQB2ZK2F.cjs +148 -0
- package/dist/chunk-MQB2ZK2F.cjs.map +1 -0
- package/dist/chunk-QZE7HBZB.cjs.map +1 -1
- package/dist/{chunk-O6FTSXHE.cjs → chunk-UBLEFLES.cjs} +40 -10
- package/dist/chunk-UBLEFLES.cjs.map +1 -0
- package/dist/{chunk-IDEA5UXK.js → chunk-XMM62UAT.js} +2 -2
- package/dist/{chunk-PI473GES.js → chunk-Z247F527.js} +36 -6
- package/dist/chunk-Z247F527.js.map +1 -0
- package/dist/chunk-ZDZCCOUB.cjs.map +1 -1
- package/dist/docs-io.cjs +9 -10
- package/dist/docs-io.cjs.map +1 -1
- package/dist/docs-io.js +2 -3
- package/dist/docs-io.js.map +1 -1
- package/dist/docs-tools.cjs +40 -129
- package/dist/docs-tools.cjs.map +1 -1
- package/dist/docs-tools.d.cts +21 -14
- package/dist/docs-tools.d.ts +21 -14
- package/dist/docs-tools.js +21 -110
- package/dist/docs-tools.js.map +1 -1
- package/dist/docs.cjs +19 -4
- package/dist/docs.cjs.map +1 -1
- package/dist/docs.d.cts +5 -0
- package/dist/docs.d.ts +5 -0
- package/dist/docs.js +18 -3
- package/dist/docs.js.map +1 -1
- package/dist/matrxImagePorts-JDFYE4QI.cjs.map +1 -1
- package/dist/sheets-xlsx.cjs.map +1 -1
- package/dist/sheets.cjs.map +1 -1
- package/dist/xlsx-to-univer-AQAXU3TC.cjs.map +1 -1
- package/package.json +6 -6
- package/dist/chunk-2UBGQUXW.cjs +0 -37
- package/dist/chunk-2UBGQUXW.cjs.map +0 -1
- package/dist/chunk-BWMAYLW4.cjs.map +0 -1
- package/dist/chunk-MPKXXZZV.js +0 -37
- package/dist/chunk-MPKXXZZV.js.map +0 -1
- package/dist/chunk-O6FTSXHE.cjs.map +0 -1
- package/dist/chunk-PI473GES.js.map +0 -1
- /package/dist/{chunk-IDEA5UXK.js.map → chunk-XMM62UAT.js.map} +0 -0
package/dist/docs-tools.cjs
CHANGED
|
@@ -1,134 +1,44 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if (stream.endsWith("\n")) stream = stream.slice(0, -1);
|
|
21
|
-
const paragraphs = (_nullishCoalesce(body.paragraphs, () => ( []))).filter((p) => p.startIndex < stream.length);
|
|
22
|
-
const textRuns = (_nullishCoalesce(body.textRuns, () => ( []))).filter((r) => r.st < stream.length).map((r) => ({ ...r, ed: Math.min(r.ed, stream.length) }));
|
|
23
|
-
return { dataStream: stream, paragraphs, ...textRuns.length ? { textRuns } : {} };
|
|
24
|
-
}
|
|
25
|
-
function blockInsertPlan(dataStream, caret) {
|
|
26
|
-
const c = Math.max(0, Math.min(caret, dataStream.length));
|
|
27
|
-
const start = Math.max(dataStream.lastIndexOf("\r", c - 1), dataStream.lastIndexOf("\n", c - 1)) + 1;
|
|
28
|
-
let end = dataStream.indexOf("\r", c);
|
|
29
|
-
if (end < 0) end = dataStream.length;
|
|
30
|
-
const text = dataStream.slice(start, end).replace(/[\u0000-\u001f\u200b]/g, "").trim();
|
|
31
|
-
if (c === start || text === "") return { at: start, breakAt: null };
|
|
32
|
-
return { at: end + 1, breakAt: end };
|
|
33
|
-
}
|
|
34
|
-
var BOOKMARK_RANGE_TYPE = 3;
|
|
35
|
-
var BOOKMARK_ANCHOR = "\u200B";
|
|
36
|
-
function collectBookmarks(snapshot) {
|
|
37
|
-
const body = _optionalChain([snapshot, 'optionalAccess', _ => _.body]);
|
|
38
|
-
const out = [];
|
|
39
|
-
for (const r of _nullishCoalesce(_optionalChain([body, 'optionalAccess', _2 => _2.customRanges]), () => ( []))) {
|
|
40
|
-
if (r.rangeType !== BOOKMARK_RANGE_TYPE) continue;
|
|
41
|
-
out.push({ id: r.rangeId, name: typeof _optionalChain([r, 'access', _3 => _3.properties, 'optionalAccess', _4 => _4.name]) === "string" ? r.properties.name : "", offset: r.startIndex });
|
|
42
|
-
}
|
|
43
|
-
return out.sort((a, b) => a.offset - b.offset);
|
|
44
|
-
}
|
|
45
|
-
function bookmarkBody(id, name) {
|
|
46
|
-
return {
|
|
47
|
-
dataStream: BOOKMARK_ANCHOR,
|
|
48
|
-
customRanges: [{ startIndex: 0, endIndex: 0, rangeId: id, rangeType: BOOKMARK_RANGE_TYPE, properties: { name }, wholeEntity: true }]
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
function cleanBookmarkName(raw, existing) {
|
|
52
|
-
const name = raw.replace(/\s+/g, " ").trim().slice(0, 80);
|
|
53
|
-
if (!name) return { ok: false, why: "Give the bookmark a name." };
|
|
54
|
-
if (existing.some((b) => b.name.toLowerCase() === name.toLowerCase())) return { ok: false, why: `A bookmark named "${name}" already exists.` };
|
|
55
|
-
return { ok: true, name };
|
|
56
|
-
}
|
|
57
|
-
function bookmarkFromHash(hash) {
|
|
58
|
-
const m = /^#bookmark=(.+)$/.exec(hash);
|
|
59
|
-
if (!m) return null;
|
|
60
|
-
try {
|
|
61
|
-
return decodeURIComponent(m[1]);
|
|
62
|
-
} catch (e2) {
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
var bookmarkHash = (name) => `#bookmark=${encodeURIComponent(name)}`;
|
|
67
|
-
var DASH = { solid: 1, dotted: 2, dashed: 3 };
|
|
68
|
-
function paragraphBorderParams(c) {
|
|
69
|
-
const line = { color: { rgb: c.color }, width: c.width, dashStyle: DASH[c.dash], padding: c.padding };
|
|
70
|
-
return {
|
|
71
|
-
borderTop: c.side === "top" || c.side === "both" ? line : null,
|
|
72
|
-
borderBottom: c.side === "bottom" || c.side === "both" ? line : null
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
function rulerGeometry(a) {
|
|
76
|
-
const pageWidth = a.pageWidthPx * a.zoom;
|
|
77
|
-
const pageLeft = Math.max(0, (a.containerWidth - pageWidth) / 2);
|
|
78
|
-
const ticks = [];
|
|
79
|
-
const inches = a.pageWidthPx / _chunk2UBGQUXWcjs.PX_PER_INCH;
|
|
80
|
-
for (let eighth = 0; eighth <= Math.floor(inches * 8); eighth++) {
|
|
81
|
-
const x = pageLeft + eighth * _chunk2UBGQUXWcjs.PX_PER_INCH * a.zoom / 8;
|
|
82
|
-
if (eighth % 8 === 0) {
|
|
83
|
-
const marginInches = a.marginLeftPx / _chunk2UBGQUXWcjs.PX_PER_INCH;
|
|
84
|
-
ticks.push({ x, kind: "inch", ...eighth / 8 !== marginInches ? { label: String(Math.round(Math.abs(eighth / 8 - marginInches))) } : {} });
|
|
85
|
-
} else ticks.push({ x, kind: eighth % 4 === 0 ? "half" : "eighth" });
|
|
86
|
-
}
|
|
87
|
-
return { pageLeft, pageWidth, marginLeft: a.marginLeftPx * a.zoom, marginRight: a.marginRightPx * a.zoom, ticks };
|
|
88
|
-
}
|
|
89
|
-
var DOCUMENT_LANGUAGE_KEY = "matrxLanguage";
|
|
90
|
-
var DOCUMENT_LANGUAGES = [
|
|
91
|
-
{ code: "en-US", label: "English (United States)" },
|
|
92
|
-
{ code: "en-GB", label: "English (United Kingdom)" },
|
|
93
|
-
{ code: "es", label: "Spanish" },
|
|
94
|
-
{ code: "fr", label: "French" },
|
|
95
|
-
{ code: "de", label: "German" },
|
|
96
|
-
{ code: "it", label: "Italian" },
|
|
97
|
-
{ code: "pt-BR", label: "Portuguese (Brazil)" },
|
|
98
|
-
{ code: "nl", label: "Dutch" },
|
|
99
|
-
{ code: "ja", label: "Japanese" },
|
|
100
|
-
{ code: "ko", label: "Korean" },
|
|
101
|
-
{ code: "zh-CN", label: "Chinese (Simplified)" },
|
|
102
|
-
{ code: "ar", label: "Arabic" },
|
|
103
|
-
{ code: "hi", label: "Hindi" },
|
|
104
|
-
{ code: "ru", label: "Russian" }
|
|
105
|
-
];
|
|
106
|
-
function readDocumentLanguage(documentStyle) {
|
|
107
|
-
const v = _optionalChain([documentStyle, 'optionalAccess', _5 => _5[DOCUMENT_LANGUAGE_KEY]]);
|
|
108
|
-
return typeof v === "string" && DOCUMENT_LANGUAGES.some((l) => l.code === v) ? v : "en-US";
|
|
109
|
-
}
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
var _chunkMQB2ZK2Fcjs = require('./chunk-MQB2ZK2F.cjs');
|
|
19
|
+
require('./chunk-UBLEFLES.cjs');
|
|
110
20
|
|
|
111
21
|
// src/docs/doc-edit-ops.ts
|
|
112
22
|
function createDocEditOps(deps) {
|
|
113
|
-
const doc = () => _nullishCoalesce(_optionalChain([deps, 'access',
|
|
114
|
-
const snapshot = () => _nullishCoalesce(_optionalChain([doc, 'call',
|
|
23
|
+
const doc = () => _nullishCoalesce(_optionalChain([deps, 'access', _ => _.api, 'call', _2 => _2(), 'optionalAccess', _3 => _3.getActiveDocument, 'optionalCall', _4 => _4()]), () => ( null));
|
|
24
|
+
const snapshot = () => _nullishCoalesce(_optionalChain([doc, 'call', _5 => _5(), 'optionalAccess', _6 => _6.save, 'optionalCall', _7 => _7()]), () => ( null));
|
|
115
25
|
const range = async () => {
|
|
116
26
|
const { DocSelectionManagerService } = await Promise.resolve().then(() => _interopRequireWildcard(require("@univerjs/docs")));
|
|
117
|
-
const live = _optionalChain([deps, 'access',
|
|
27
|
+
const live = _optionalChain([deps, 'access', _8 => _8.injector, 'call', _9 => _9(), 'optionalAccess', _10 => _10.get, 'call', _11 => _11(DocSelectionManagerService), 'optionalAccess', _12 => _12.getActiveTextRange, 'optionalCall', _13 => _13()]);
|
|
118
28
|
return _nullishCoalesce(live, () => ( null));
|
|
119
29
|
};
|
|
120
|
-
const exec = async (id, params) => await _optionalChain([deps, 'access',
|
|
30
|
+
const exec = async (id, params) => await _optionalChain([deps, 'access', _14 => _14.api, 'call', _15 => _15(), 'optionalAccess', _16 => _16.executeCommand, 'call', _17 => _17(id, params)]) !== false;
|
|
121
31
|
const toBlockStart = async () => {
|
|
122
32
|
const d = doc();
|
|
123
33
|
const r = await range();
|
|
124
|
-
const stream = _optionalChain([snapshot, 'call',
|
|
34
|
+
const stream = _optionalChain([snapshot, 'call', _18 => _18(), 'optionalAccess', _19 => _19.body, 'optionalAccess', _20 => _20.dataStream]);
|
|
125
35
|
if (!d || !r || typeof stream !== "string") return false;
|
|
126
|
-
const plan = blockInsertPlan(stream, r.startOffset);
|
|
36
|
+
const plan = _chunkMQB2ZK2Fcjs.blockInsertPlan.call(void 0, stream, r.startOffset);
|
|
127
37
|
if (plan.breakAt === null) {
|
|
128
|
-
_optionalChain([d, 'access',
|
|
38
|
+
_optionalChain([d, 'access', _21 => _21.setSelection, 'optionalCall', _22 => _22(plan.at, plan.at)]);
|
|
129
39
|
return true;
|
|
130
40
|
}
|
|
131
|
-
_optionalChain([d, 'access',
|
|
41
|
+
_optionalChain([d, 'access', _23 => _23.setSelection, 'optionalCall', _24 => _24(plan.breakAt, plan.breakAt)]);
|
|
132
42
|
return exec("doc.command.break-line", { unitId: d.getId() });
|
|
133
43
|
};
|
|
134
44
|
return {
|
|
@@ -141,51 +51,51 @@ function createDocEditOps(deps) {
|
|
|
141
51
|
async insertMarkdown(markdown) {
|
|
142
52
|
const d = doc();
|
|
143
53
|
if (!d || !await toBlockStart()) return false;
|
|
144
|
-
return exec("doc.command.
|
|
54
|
+
return exec("doc.command.inner-paste", { unitId: d.getId(), doc: _chunkMQB2ZK2Fcjs.markdownFragment.call(void 0, markdown) });
|
|
145
55
|
},
|
|
146
|
-
bookmarks: () => collectBookmarks(snapshot()),
|
|
56
|
+
bookmarks: () => _chunkMQB2ZK2Fcjs.collectBookmarks.call(void 0, snapshot()),
|
|
147
57
|
async addBookmark(name) {
|
|
148
58
|
const d = doc();
|
|
149
59
|
const r = await range();
|
|
150
60
|
if (!d || !r) return false;
|
|
151
|
-
_optionalChain([d, 'access',
|
|
61
|
+
_optionalChain([d, 'access', _25 => _25.setSelection, 'optionalCall', _26 => _26(r.startOffset, r.startOffset)]);
|
|
152
62
|
const id = `bm_${Math.random().toString(36).slice(2, 10)}`;
|
|
153
|
-
return exec("doc.command.replace-selection", { unitId: d.getId(), body: bookmarkBody(id, name) });
|
|
63
|
+
return exec("doc.command.replace-selection", { unitId: d.getId(), body: _chunkMQB2ZK2Fcjs.bookmarkBody.call(void 0, id, name) });
|
|
154
64
|
},
|
|
155
65
|
async deleteBookmark(b) {
|
|
156
66
|
const d = doc();
|
|
157
67
|
if (!d) return false;
|
|
158
|
-
_optionalChain([d, 'access',
|
|
68
|
+
_optionalChain([d, 'access', _27 => _27.setSelection, 'optionalCall', _28 => _28(b.offset + 1, b.offset + 1)]);
|
|
159
69
|
return exec("doc.command.delete-left", { unitId: d.getId() });
|
|
160
70
|
},
|
|
161
71
|
async setViewOnly(viewOnly) {
|
|
162
|
-
const perm = _optionalChain([doc, 'call',
|
|
72
|
+
const perm = _optionalChain([doc, 'call', _29 => _29(), 'optionalAccess', _30 => _30.getPermission, 'optionalCall', _31 => _31()]);
|
|
163
73
|
if (!perm) return;
|
|
164
74
|
if (viewOnly) await perm.setReadOnly();
|
|
165
75
|
else await perm.setEditable(true);
|
|
166
76
|
const { IPermissionService } = await Promise.resolve().then(() => _interopRequireWildcard(require("@univerjs/core")));
|
|
167
|
-
_optionalChain([deps, 'access',
|
|
77
|
+
_optionalChain([deps, 'access', _32 => _32.injector, 'call', _33 => _33(), 'optionalAccess', _34 => _34.get, 'call', _35 => _35(IPermissionService), 'optionalAccess', _36 => _36.setShowComponents, 'optionalCall', _37 => _37(!viewOnly)]);
|
|
168
78
|
},
|
|
169
79
|
async onEditDenied(cb) {
|
|
170
80
|
const { ErrorService } = await Promise.resolve().then(() => _interopRequireWildcard(require("@univerjs/core")));
|
|
171
|
-
const errors = _optionalChain([deps, 'access',
|
|
172
|
-
const sub = _optionalChain([errors, 'optionalAccess',
|
|
81
|
+
const errors = _optionalChain([deps, 'access', _38 => _38.injector, 'call', _39 => _39(), 'optionalAccess', _40 => _40.get, 'call', _41 => _41(ErrorService)]);
|
|
82
|
+
const sub = _optionalChain([errors, 'optionalAccess', _42 => _42.error$, 'optionalAccess', _43 => _43.subscribe, 'call', _44 => _44((e) => {
|
|
173
83
|
if (e.code === "PERMISSION_DENIED") cb();
|
|
174
84
|
})]);
|
|
175
|
-
return () => _optionalChain([sub, 'optionalAccess',
|
|
85
|
+
return () => _optionalChain([sub, 'optionalAccess', _45 => _45.unsubscribe, 'call', _46 => _46()]);
|
|
176
86
|
},
|
|
177
87
|
async openImagePanel() {
|
|
178
88
|
return exec("sidebar.operation.doc-image", { value: "doc-image" });
|
|
179
89
|
},
|
|
180
90
|
goTo(offset) {
|
|
181
|
-
_optionalChain([doc, 'call',
|
|
91
|
+
_optionalChain([doc, 'call', _47 => _47(), 'optionalAccess', _48 => _48.setSelection, 'optionalCall', _49 => _49(offset, offset)]);
|
|
182
92
|
}
|
|
183
93
|
};
|
|
184
94
|
}
|
|
185
95
|
async function writeDocumentStyleKey(api, key, value) {
|
|
186
|
-
const doc = _optionalChain([api, 'access',
|
|
96
|
+
const doc = _optionalChain([api, 'access', _50 => _50.getActiveDocument, 'optionalCall', _51 => _51()]);
|
|
187
97
|
if (!doc) return;
|
|
188
|
-
const style = _nullishCoalesce(_optionalChain([doc, 'access',
|
|
98
|
+
const style = _nullishCoalesce(_optionalChain([doc, 'access', _52 => _52.getDocumentDataModel, 'optionalCall', _53 => _53(), 'optionalAccess', _54 => _54.getSnapshot, 'call', _55 => _55(), 'access', _56 => _56.documentStyle]), () => ( {}));
|
|
189
99
|
const old = style[key];
|
|
190
100
|
if (old === value) return;
|
|
191
101
|
const { JSONX } = await Promise.resolve().then(() => _interopRequireWildcard(require("@univerjs/core")));
|
|
@@ -213,5 +123,6 @@ async function writeDocumentStyleKey(api, key, value) {
|
|
|
213
123
|
|
|
214
124
|
|
|
215
125
|
|
|
216
|
-
|
|
126
|
+
|
|
127
|
+
exports.BOOKMARK_ANCHOR = _chunkMQB2ZK2Fcjs.BOOKMARK_ANCHOR; exports.BOOKMARK_RANGE_TYPE = _chunkMQB2ZK2Fcjs.BOOKMARK_RANGE_TYPE; exports.BUILDING_BLOCKS = _chunkMQB2ZK2Fcjs.BUILDING_BLOCKS; exports.DOCUMENT_LANGUAGES = _chunkMQB2ZK2Fcjs.DOCUMENT_LANGUAGES; exports.DOCUMENT_LANGUAGE_KEY = _chunkMQB2ZK2Fcjs.DOCUMENT_LANGUAGE_KEY; exports.blockInsertPlan = _chunkMQB2ZK2Fcjs.blockInsertPlan; exports.bookmarkBody = _chunkMQB2ZK2Fcjs.bookmarkBody; exports.bookmarkFromHash = _chunkMQB2ZK2Fcjs.bookmarkFromHash; exports.bookmarkHash = _chunkMQB2ZK2Fcjs.bookmarkHash; exports.cleanBookmarkName = _chunkMQB2ZK2Fcjs.cleanBookmarkName; exports.collectBookmarks = _chunkMQB2ZK2Fcjs.collectBookmarks; exports.createDocEditOps = createDocEditOps; exports.looksLikeMarkdown = _chunkMQB2ZK2Fcjs.looksLikeMarkdown; exports.markdownFragment = _chunkMQB2ZK2Fcjs.markdownFragment; exports.paragraphBorderParams = _chunkMQB2ZK2Fcjs.paragraphBorderParams; exports.readDocumentLanguage = _chunkMQB2ZK2Fcjs.readDocumentLanguage; exports.rulerGeometry = _chunkMQB2ZK2Fcjs.rulerGeometry; exports.writeDocumentStyleKey = writeDocumentStyleKey;
|
|
217
128
|
//# sourceMappingURL=docs-tools.cjs.map
|
package/dist/docs-tools.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/_work/aidream/aidream/apps/shared/office/dist/docs-tools.cjs","../src/docs/doc-tools-core.ts","../src/docs/doc-edit-ops.ts"],"names":[],"mappings":"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","file":"/home/runner/_work/aidream/aidream/apps/shared/office/dist/docs-tools.cjs","sourcesContent":[null,"/**\n * The pure half of the Docs tools: building blocks, bookmarks, paragraph borders, the ruler's\n * geometry and the document language. No Univer import, so each is proven on plain snapshots.\n */\n\nimport { PX_PER_INCH } from \"../core\";\nimport { markdownToUniverDoc } from \"./markdown-to-univer-doc\";\n\nexport interface BuildingBlock {\n id: string;\n label: string;\n description: string;\n markdown: string;\n}\n\nexport const BUILDING_BLOCKS: BuildingBlock[] = [\n { id: \"meeting-notes\", label: \"Meeting notes\", description: \"Date, attendees, agenda, decisions and action items.\", markdown: \"## Meeting notes\\n\\nDate: \\nAttendees: \\n\\n### Agenda\\n\\n1. \\n\\n### Discussion\\n\\n### Decisions\\n\\n### Action items\\n\\n☐ Owner: Task, due date\\n\" },\n { id: \"project-tracker\", label: \"Project tracker\", description: \"Goal, milestones, owners, risks and status.\", markdown: \"## Project tracker\\n\\nGoal: \\nOwner: \\nStatus: On track\\n\\n### Milestones\\n\\n☐ Milestone, owner, due date\\n\\n### Risks\\n\\n### Next steps\\n\" },\n { id: \"email-draft\", label: \"Email draft\", description: \"To, subject and a three-part message ready to fill in.\", markdown: \"## Email draft\\n\\nTo: \\nSubject: \\n\\nHi ,\\n\\nI am writing about .\\n\\nThe next step is .\\n\\nThanks,\\n\" },\n { id: \"weekly-status\", label: \"Weekly status\", description: \"Done, next, and blocked, for one week.\", markdown: \"## Weekly status\\n\\nWeek of: \\n\\n### Done this week\\n\\n### Next week\\n\\n### Blocked\\n\" },\n { id: \"decision-log\", label: \"Decision record\", description: \"Context, options, decision and consequences.\", markdown: \"## Decision record\\n\\nDate: \\nDecider: \\n\\n### Context\\n\\n### Options considered\\n\\n### Decision\\n\\n### Consequences\\n\" },\n { id: \"pros-cons\", label: \"Pros and cons\", description: \"A side-by-side weighing of one choice.\", markdown: \"## Pros and cons\\n\\nChoice: \\n\\n### Pros\\n\\n### Cons\\n\\n### Verdict\\n\" },\n];\n\nexport interface InsertableBody {\n dataStream: string;\n paragraphs: Array<{ startIndex: number; paragraphStyle?: Record<string, unknown> }>;\n textRuns?: Array<{ st: number; ed: number; ts?: Record<string, unknown> }>;\n}\n\n/** Markdown to a body Univer can insert at the caret: the document-closing `\\n` is dropped. */\nexport function insertableBody(markdown: string): InsertableBody {\n const body = (markdownToUniverDoc(markdown).body ?? { dataStream: \"\" }) as unknown as Partial<InsertableBody> & { dataStream: string };\n let stream = body.dataStream;\n if (stream.endsWith(\"\\n\")) stream = stream.slice(0, -1);\n const paragraphs = (body.paragraphs ?? []).filter((p) => p.startIndex < stream.length);\n const textRuns = (body.textRuns ?? []).filter((r) => r.st < stream.length).map((r) => ({ ...r, ed: Math.min(r.ed, stream.length) }));\n return { dataStream: stream, paragraphs, ...(textRuns.length ? { textRuns } : {}) };\n}\n\n/**\n * Where a BLOCK (table of contents, building block) goes for a caret: never inside a paragraph's\n * text, so a heading is never split. Caret at the start of a paragraph (or in an empty one) →\n * insert right there; anywhere else → end the caret's paragraph with a new line and insert at the\n * start of that new paragraph. `dataStream` is Univer's body stream (paragraphs end in `\\r`).\n */\nexport function blockInsertPlan(dataStream: string, caret: number): { at: number; breakAt: number | null } {\n const c = Math.max(0, Math.min(caret, dataStream.length));\n const start = Math.max(dataStream.lastIndexOf(\"\\r\", c - 1), dataStream.lastIndexOf(\"\\n\", c - 1)) + 1;\n let end = dataStream.indexOf(\"\\r\", c);\n if (end < 0) end = dataStream.length;\n // Field marks and anchors are zero-width: a paragraph holding only them is empty.\n const text = dataStream.slice(start, end).replace(/[\\u0000-\\u001f\\u200b]/g, \"\").trim();\n if (c === start || text === \"\") return { at: start, breakAt: null };\n return { at: end + 1, breakAt: end };\n}\n\n/** Univer's CustomRangeType.BOOKMARK. */\nexport const BOOKMARK_RANGE_TYPE = 3;\n/** A bookmark is an invisible anchor: one zero-width character the custom range wraps. */\nexport const BOOKMARK_ANCHOR = \"\";\n\nexport interface Bookmark {\n id: string;\n name: string;\n offset: number;\n}\n\ninterface BodyWithRanges {\n customRanges?: Array<{ rangeId: string; rangeType: number; startIndex: number; properties?: { name?: unknown } }>;\n}\n\nexport function collectBookmarks(snapshot: unknown): Bookmark[] {\n const body = (snapshot as { body?: BodyWithRanges } | null)?.body;\n const out: Bookmark[] = [];\n for (const r of body?.customRanges ?? []) {\n if (r.rangeType !== BOOKMARK_RANGE_TYPE) continue;\n out.push({ id: r.rangeId, name: typeof r.properties?.name === \"string\" ? r.properties.name : \"\", offset: r.startIndex });\n }\n return out.sort((a, b) => a.offset - b.offset);\n}\n\nexport function bookmarkBody(id: string, name: string) {\n return {\n dataStream: BOOKMARK_ANCHOR,\n customRanges: [{ startIndex: 0, endIndex: 0, rangeId: id, rangeType: BOOKMARK_RANGE_TYPE, properties: { name }, wholeEntity: true }],\n };\n}\n\nexport function cleanBookmarkName(raw: string, existing: readonly Bookmark[]): { ok: true; name: string } | { ok: false; why: string } {\n const name = raw.replace(/\\s+/g, \" \").trim().slice(0, 80);\n if (!name) return { ok: false, why: \"Give the bookmark a name.\" };\n if (existing.some((b) => b.name.toLowerCase() === name.toLowerCase())) return { ok: false, why: `A bookmark named \"${name}\" already exists.` };\n return { ok: true, name };\n}\n\n/** `#bookmark=<name>` in the page address names a bookmark to jump to on open. */\nexport function bookmarkFromHash(hash: string): string | null {\n const m = /^#bookmark=(.+)$/.exec(hash);\n if (!m) return null;\n try {\n return decodeURIComponent(m[1]!);\n } catch {\n return null;\n }\n}\nexport const bookmarkHash = (name: string) => `#bookmark=${encodeURIComponent(name)}`;\n\nexport type BorderSide = \"top\" | \"bottom\" | \"both\" | \"none\";\nexport type BorderDash = \"solid\" | \"dashed\" | \"dotted\";\n/** Univer's DashStyleType values. */\nconst DASH: Record<BorderDash, number> = { solid: 1, dotted: 2, dashed: 3 };\n\nexport interface BorderChoice {\n side: BorderSide;\n color: string;\n width: number;\n dash: BorderDash;\n padding: number;\n}\n\n/** The `paragraph` argument of `doc-paragraph-setting.command` for a choice (Univer draws top and bottom paragraph borders). */\nexport function paragraphBorderParams(c: BorderChoice): Record<string, unknown> {\n const line = { color: { rgb: c.color }, width: c.width, dashStyle: DASH[c.dash], padding: c.padding };\n return {\n borderTop: c.side === \"top\" || c.side === \"both\" ? line : null,\n borderBottom: c.side === \"bottom\" || c.side === \"both\" ? line : null,\n };\n}\n\nexport interface RulerGeometry {\n pageLeft: number;\n pageWidth: number;\n marginLeft: number;\n marginRight: number;\n ticks: Array<{ x: number; kind: \"inch\" | \"half\" | \"eighth\"; label?: string }>;\n}\n\n/** The ruler above the page: inch ticks from the page's left edge (margins shaded), at the current zoom. */\nexport function rulerGeometry(a: { containerWidth: number; zoom: number; pageWidthPx: number; marginLeftPx: number; marginRightPx: number }): RulerGeometry {\n const pageWidth = a.pageWidthPx * a.zoom;\n const pageLeft = Math.max(0, (a.containerWidth - pageWidth) / 2);\n const ticks: RulerGeometry[\"ticks\"] = [];\n const inches = a.pageWidthPx / PX_PER_INCH;\n for (let eighth = 0; eighth <= Math.floor(inches * 8); eighth++) {\n const x = pageLeft + (eighth * PX_PER_INCH * a.zoom) / 8;\n if (eighth % 8 === 0) {\n const marginInches = a.marginLeftPx / PX_PER_INCH;\n ticks.push({ x, kind: \"inch\", ...(eighth / 8 !== marginInches ? { label: String(Math.round(Math.abs(eighth / 8 - marginInches))) } : {}) });\n } else ticks.push({ x, kind: eighth % 4 === 0 ? \"half\" : \"eighth\" });\n }\n return { pageLeft, pageWidth, marginLeft: a.marginLeftPx * a.zoom, marginRight: a.marginRightPx * a.zoom, ticks };\n}\n\n/** The key on the document style that carries the language (the slot the paper colour also uses). */\nexport const DOCUMENT_LANGUAGE_KEY = \"matrxLanguage\";\nexport const DOCUMENT_LANGUAGES: Array<{ code: string; label: string }> = [\n { code: \"en-US\", label: \"English (United States)\" },\n { code: \"en-GB\", label: \"English (United Kingdom)\" },\n { code: \"es\", label: \"Spanish\" },\n { code: \"fr\", label: \"French\" },\n { code: \"de\", label: \"German\" },\n { code: \"it\", label: \"Italian\" },\n { code: \"pt-BR\", label: \"Portuguese (Brazil)\" },\n { code: \"nl\", label: \"Dutch\" },\n { code: \"ja\", label: \"Japanese\" },\n { code: \"ko\", label: \"Korean\" },\n { code: \"zh-CN\", label: \"Chinese (Simplified)\" },\n { code: \"ar\", label: \"Arabic\" },\n { code: \"hi\", label: \"Hindi\" },\n { code: \"ru\", label: \"Russian\" },\n];\n\nexport function readDocumentLanguage(documentStyle: unknown): string {\n const v = (documentStyle as Record<string, unknown> | undefined)?.[DOCUMENT_LANGUAGE_KEY];\n return typeof v === \"string\" && DOCUMENT_LANGUAGES.some((l) => l.code === v) ? v : \"en-US\";\n}\n","/**\n * The Univer-facing half of the Docs tools: insert text, markdown and bookmarks at the caret, move\n * the selection, read the live snapshot, set view-only. Every operation is a real Univer command.\n */\n\nimport { blockInsertPlan, bookmarkBody, collectBookmarks, insertableBody, type Bookmark } from \"./doc-tools-core\";\n\ninterface ApiLike {\n executeCommand(id: string, params?: object): Promise<unknown> | unknown;\n getActiveDocument?(): {\n getId(): string;\n save?(): unknown;\n setSelection?(a: number, b: number): void;\n getPermission?(): { setReadOnly(): Promise<void>; setEditable(editable?: boolean): Promise<void> };\n } | null;\n}\ninterface InjectorLike {\n get<T>(token: unknown): T | undefined;\n}\ninterface TextRangeLike {\n startOffset: number;\n endOffset: number;\n}\n\nexport interface DocEditOps {\n insertText(text: string): Promise<boolean>;\n /** A block (building block) at a new paragraph, never mid-line. */\n insertMarkdown(markdown: string): Promise<boolean>;\n /** Move the caret to where a block goes (`blockInsertPlan`); false when there is no caret. */\n toBlockStart(): Promise<boolean>;\n bookmarks(): Bookmark[];\n addBookmark(name: string): Promise<boolean>;\n deleteBookmark(b: Bookmark): Promise<boolean>;\n goTo(offset: number): void;\n snapshot(): unknown;\n setViewOnly(viewOnly: boolean): Promise<void>;\n /** Calls back when Univer refuses an edit (Viewing mode); returns the unsubscribe. */\n onEditDenied(cb: () => void): Promise<() => void>;\n openImagePanel(): Promise<boolean>;\n}\n\nexport function createDocEditOps(deps: { api: () => ApiLike | null; injector: () => InjectorLike | null }): DocEditOps {\n const doc = () => deps.api()?.getActiveDocument?.() ?? null;\n const snapshot = () => doc()?.save?.() ?? null;\n const range = async (): Promise<TextRangeLike | null> => {\n const { DocSelectionManagerService } = await import(\"@univerjs/docs\");\n const live = deps.injector()?.get<{ getActiveTextRange?(): TextRangeLike | null | undefined }>(DocSelectionManagerService)?.getActiveTextRange?.();\n return live ?? null;\n };\n const exec = async (id: string, params: object) => (await deps.api()?.executeCommand(id, params)) !== false;\n const toBlockStart = async (): Promise<boolean> => {\n const d = doc();\n const r = await range();\n const stream = (snapshot() as { body?: { dataStream?: string } } | null)?.body?.dataStream;\n if (!d || !r || typeof stream !== \"string\") return false;\n const plan = blockInsertPlan(stream, r.startOffset);\n if (plan.breakAt === null) {\n d.setSelection?.(plan.at, plan.at);\n return true;\n }\n d.setSelection?.(plan.breakAt, plan.breakAt);\n return exec(\"doc.command.break-line\", { unitId: d.getId() });\n };\n\n return {\n snapshot,\n async insertText(text) {\n if (!text || !(await range())) return false;\n return exec(\"doc.command.insert-special-character\", { value: text });\n },\n toBlockStart,\n async insertMarkdown(markdown) {\n const d = doc();\n if (!d || !(await toBlockStart())) return false;\n return exec(\"doc.command.replace-selection\", { unitId: d.getId(), body: insertableBody(markdown) });\n },\n bookmarks: () => collectBookmarks(snapshot()),\n async addBookmark(name) {\n const d = doc();\n const r = await range();\n if (!d || !r) return false;\n d.setSelection?.(r.startOffset, r.startOffset);\n const id = `bm_${Math.random().toString(36).slice(2, 10)}`;\n return exec(\"doc.command.replace-selection\", { unitId: d.getId(), body: bookmarkBody(id, name) });\n },\n async deleteBookmark(b) {\n const d = doc();\n if (!d) return false;\n d.setSelection?.(b.offset + 1, b.offset + 1);\n return exec(\"doc.command.delete-left\", { unitId: d.getId() });\n },\n async setViewOnly(viewOnly) {\n const perm = doc()?.getPermission?.();\n if (!perm) return;\n if (viewOnly) await perm.setReadOnly();\n else await perm.setEditable(true);\n // Univer's own refusal notice (\"This content is protected…\") stays off while viewing; the\n // editor shows ours through onEditDenied.\n const { IPermissionService } = await import(\"@univerjs/core\");\n deps.injector()?.get<{ setShowComponents?(show: boolean): void }>(IPermissionService)?.setShowComponents?.(!viewOnly);\n },\n async onEditDenied(cb) {\n const { ErrorService } = await import(\"@univerjs/core\");\n const errors = deps.injector()?.get<{ error$?: { subscribe(fn: (e: { code?: string }) => void): { unsubscribe(): void } } }>(ErrorService);\n const sub = errors?.error$?.subscribe((e) => {\n if (e.code === \"PERMISSION_DENIED\") cb();\n });\n return () => sub?.unsubscribe();\n },\n async openImagePanel() {\n return exec(\"sidebar.operation.doc-image\", { value: \"doc-image\" });\n },\n goTo(offset) {\n doc()?.setSelection?.(offset, offset);\n },\n };\n}\n\n/** Write one plain key onto the document style (it rides the snapshot like the paper colour does). */\nexport async function writeDocumentStyleKey(api: ApiLike, key: string, value: string): Promise<void> {\n const doc = api.getActiveDocument?.();\n if (!doc) return;\n const style = (doc as unknown as { getDocumentDataModel?(): { getSnapshot(): { documentStyle?: Record<string, unknown> } } }).getDocumentDataModel?.()?.getSnapshot().documentStyle ?? {};\n const old = style[key];\n if (old === value) return;\n const { JSONX } = await import(\"@univerjs/core\");\n const jsonX = JSONX.getInstance();\n const path = [\"documentStyle\", key];\n const action = old === undefined ? jsonX.insertOp(path, value) : jsonX.replaceOp(path, old, value);\n if (!action) return;\n await api.executeCommand(\"doc.mutation.rich-text-editing\", { unitId: doc.getId(), actions: action, textRanges: undefined });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/aidream/aidream/apps/shared/office/dist/docs-tools.cjs","../src/docs/doc-edit-ops.ts"],"names":[],"mappings":"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","file":"/home/runner/work/aidream/aidream/apps/shared/office/dist/docs-tools.cjs","sourcesContent":[null,"/**\n * The Univer-facing half of the Docs tools: insert text, markdown and bookmarks at the caret, move\n * the selection, read the live snapshot, set view-only. Every operation is a real Univer command.\n */\n\nimport { blockInsertPlan, bookmarkBody, collectBookmarks, markdownFragment, type Bookmark } from \"./doc-tools-core\";\n\ninterface ApiLike {\n executeCommand(id: string, params?: object): Promise<unknown> | unknown;\n getActiveDocument?(): {\n getId(): string;\n save?(): unknown;\n setSelection?(a: number, b: number): void;\n getPermission?(): { setReadOnly(): Promise<void>; setEditable(editable?: boolean): Promise<void> };\n } | null;\n}\ninterface InjectorLike {\n get<T>(token: unknown): T | undefined;\n}\ninterface TextRangeLike {\n startOffset: number;\n endOffset: number;\n}\n\nexport interface DocEditOps {\n insertText(text: string): Promise<boolean>;\n /** A block (building block) at a new paragraph, never mid-line. */\n insertMarkdown(markdown: string): Promise<boolean>;\n /** Move the caret to where a block goes (`blockInsertPlan`); false when there is no caret. */\n toBlockStart(): Promise<boolean>;\n bookmarks(): Bookmark[];\n addBookmark(name: string): Promise<boolean>;\n deleteBookmark(b: Bookmark): Promise<boolean>;\n goTo(offset: number): void;\n snapshot(): unknown;\n setViewOnly(viewOnly: boolean): Promise<void>;\n /** Calls back when Univer refuses an edit (Viewing mode); returns the unsubscribe. */\n onEditDenied(cb: () => void): Promise<() => void>;\n openImagePanel(): Promise<boolean>;\n}\n\nexport function createDocEditOps(deps: { api: () => ApiLike | null; injector: () => InjectorLike | null }): DocEditOps {\n const doc = () => deps.api()?.getActiveDocument?.() ?? null;\n const snapshot = () => doc()?.save?.() ?? null;\n const range = async (): Promise<TextRangeLike | null> => {\n const { DocSelectionManagerService } = await import(\"@univerjs/docs\");\n const live = deps.injector()?.get<{ getActiveTextRange?(): TextRangeLike | null | undefined }>(DocSelectionManagerService)?.getActiveTextRange?.();\n return live ?? null;\n };\n const exec = async (id: string, params: object) => (await deps.api()?.executeCommand(id, params)) !== false;\n const toBlockStart = async (): Promise<boolean> => {\n const d = doc();\n const r = await range();\n const stream = (snapshot() as { body?: { dataStream?: string } } | null)?.body?.dataStream;\n if (!d || !r || typeof stream !== \"string\") return false;\n const plan = blockInsertPlan(stream, r.startOffset);\n if (plan.breakAt === null) {\n d.setSelection?.(plan.at, plan.at);\n return true;\n }\n d.setSelection?.(plan.breakAt, plan.breakAt);\n return exec(\"doc.command.break-line\", { unitId: d.getId() });\n };\n\n return {\n snapshot,\n async insertText(text) {\n if (!text || !(await range())) return false;\n return exec(\"doc.command.insert-special-character\", { value: text });\n },\n toBlockStart,\n async insertMarkdown(markdown) {\n const d = doc();\n if (!d || !(await toBlockStart())) return false;\n return exec(\"doc.command.inner-paste\", { unitId: d.getId(), doc: markdownFragment(markdown) });\n },\n bookmarks: () => collectBookmarks(snapshot()),\n async addBookmark(name) {\n const d = doc();\n const r = await range();\n if (!d || !r) return false;\n d.setSelection?.(r.startOffset, r.startOffset);\n const id = `bm_${Math.random().toString(36).slice(2, 10)}`;\n return exec(\"doc.command.replace-selection\", { unitId: d.getId(), body: bookmarkBody(id, name) });\n },\n async deleteBookmark(b) {\n const d = doc();\n if (!d) return false;\n d.setSelection?.(b.offset + 1, b.offset + 1);\n return exec(\"doc.command.delete-left\", { unitId: d.getId() });\n },\n async setViewOnly(viewOnly) {\n const perm = doc()?.getPermission?.();\n if (!perm) return;\n if (viewOnly) await perm.setReadOnly();\n else await perm.setEditable(true);\n // Univer's own refusal notice (\"This content is protected…\") stays off while viewing; the\n // editor shows ours through onEditDenied.\n const { IPermissionService } = await import(\"@univerjs/core\");\n deps.injector()?.get<{ setShowComponents?(show: boolean): void }>(IPermissionService)?.setShowComponents?.(!viewOnly);\n },\n async onEditDenied(cb) {\n const { ErrorService } = await import(\"@univerjs/core\");\n const errors = deps.injector()?.get<{ error$?: { subscribe(fn: (e: { code?: string }) => void): { unsubscribe(): void } } }>(ErrorService);\n const sub = errors?.error$?.subscribe((e) => {\n if (e.code === \"PERMISSION_DENIED\") cb();\n });\n return () => sub?.unsubscribe();\n },\n async openImagePanel() {\n return exec(\"sidebar.operation.doc-image\", { value: \"doc-image\" });\n },\n goTo(offset) {\n doc()?.setSelection?.(offset, offset);\n },\n };\n}\n\n/** Write one plain key onto the document style (it rides the snapshot like the paper colour does). */\nexport async function writeDocumentStyleKey(api: ApiLike, key: string, value: string): Promise<void> {\n const doc = api.getActiveDocument?.();\n if (!doc) return;\n const style = (doc as unknown as { getDocumentDataModel?(): { getSnapshot(): { documentStyle?: Record<string, unknown> } } }).getDocumentDataModel?.()?.getSnapshot().documentStyle ?? {};\n const old = style[key];\n if (old === value) return;\n const { JSONX } = await import(\"@univerjs/core\");\n const jsonX = JSONX.getInstance();\n const path = [\"documentStyle\", key];\n const action = old === undefined ? jsonX.insertOp(path, value) : jsonX.replaceOp(path, old, value);\n if (!action) return;\n await api.executeCommand(\"doc.mutation.rich-text-editing\", { unitId: doc.getId(), actions: action, textRanges: undefined });\n}\n"]}
|
package/dist/docs-tools.d.cts
CHANGED
|
@@ -9,20 +9,27 @@ interface BuildingBlock {
|
|
|
9
9
|
markdown: string;
|
|
10
10
|
}
|
|
11
11
|
declare const BUILDING_BLOCKS: BuildingBlock[];
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
st: number;
|
|
20
|
-
ed: number;
|
|
21
|
-
ts?: Record<string, unknown>;
|
|
22
|
-
}>;
|
|
12
|
+
/** What Univer's paste command takes as `doc`: a body (no document-closing `\n`) plus the table sources its `tables` name. */
|
|
13
|
+
interface MarkdownFragment {
|
|
14
|
+
body: Record<string, unknown> & {
|
|
15
|
+
dataStream: string;
|
|
16
|
+
};
|
|
17
|
+
tableSource?: Record<string, unknown>;
|
|
18
|
+
drawings?: Record<string, unknown>;
|
|
23
19
|
}
|
|
24
|
-
/**
|
|
25
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Markdown to a fragment Univer can insert at the caret (`doc.command.inner-paste`): headings, lists,
|
|
22
|
+
* bold, links and REAL tables, from THE one writer (`markdownToUniverDoc`). The document-closing `\n`
|
|
23
|
+
* and its section break are dropped; every other body part (tables, links, runs) is kept.
|
|
24
|
+
*/
|
|
25
|
+
declare function markdownFragment(markdown: string): MarkdownFragment;
|
|
26
|
+
/**
|
|
27
|
+
* True when text carries markdown STRUCTURE a document should draw: a table, a heading, a list, a
|
|
28
|
+
* fence, a quote, a link, or bold. Plain prose (and a stray `*` or `_`) is false, so ordinary
|
|
29
|
+
* typing and paste stay plain text. Every door that takes agent- or clipboard-supplied text asks
|
|
30
|
+
* this one question, then converts through `markdownFragment`.
|
|
31
|
+
*/
|
|
32
|
+
declare function looksLikeMarkdown(text: string): boolean;
|
|
26
33
|
/**
|
|
27
34
|
* Where a BLOCK (table of contents, building block) goes for a caret: never inside a paragraph's
|
|
28
35
|
* text, so a heading is never split. Caret at the start of a paragraph (or in an empty one) →
|
|
@@ -147,4 +154,4 @@ declare function createDocEditOps(deps: {
|
|
|
147
154
|
/** Write one plain key onto the document style (it rides the snapshot like the paper colour does). */
|
|
148
155
|
declare function writeDocumentStyleKey(api: ApiLike, key: string, value: string): Promise<void>;
|
|
149
156
|
|
|
150
|
-
export { BOOKMARK_ANCHOR, BOOKMARK_RANGE_TYPE, BUILDING_BLOCKS, type Bookmark, type BorderChoice, type BorderDash, type BorderSide, type BuildingBlock, DOCUMENT_LANGUAGES, DOCUMENT_LANGUAGE_KEY, type DocEditOps, type
|
|
157
|
+
export { BOOKMARK_ANCHOR, BOOKMARK_RANGE_TYPE, BUILDING_BLOCKS, type Bookmark, type BorderChoice, type BorderDash, type BorderSide, type BuildingBlock, DOCUMENT_LANGUAGES, DOCUMENT_LANGUAGE_KEY, type DocEditOps, type MarkdownFragment, type RulerGeometry, blockInsertPlan, bookmarkBody, bookmarkFromHash, bookmarkHash, cleanBookmarkName, collectBookmarks, createDocEditOps, looksLikeMarkdown, markdownFragment, paragraphBorderParams, readDocumentLanguage, rulerGeometry, writeDocumentStyleKey };
|
package/dist/docs-tools.d.ts
CHANGED
|
@@ -9,20 +9,27 @@ interface BuildingBlock {
|
|
|
9
9
|
markdown: string;
|
|
10
10
|
}
|
|
11
11
|
declare const BUILDING_BLOCKS: BuildingBlock[];
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
st: number;
|
|
20
|
-
ed: number;
|
|
21
|
-
ts?: Record<string, unknown>;
|
|
22
|
-
}>;
|
|
12
|
+
/** What Univer's paste command takes as `doc`: a body (no document-closing `\n`) plus the table sources its `tables` name. */
|
|
13
|
+
interface MarkdownFragment {
|
|
14
|
+
body: Record<string, unknown> & {
|
|
15
|
+
dataStream: string;
|
|
16
|
+
};
|
|
17
|
+
tableSource?: Record<string, unknown>;
|
|
18
|
+
drawings?: Record<string, unknown>;
|
|
23
19
|
}
|
|
24
|
-
/**
|
|
25
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Markdown to a fragment Univer can insert at the caret (`doc.command.inner-paste`): headings, lists,
|
|
22
|
+
* bold, links and REAL tables, from THE one writer (`markdownToUniverDoc`). The document-closing `\n`
|
|
23
|
+
* and its section break are dropped; every other body part (tables, links, runs) is kept.
|
|
24
|
+
*/
|
|
25
|
+
declare function markdownFragment(markdown: string): MarkdownFragment;
|
|
26
|
+
/**
|
|
27
|
+
* True when text carries markdown STRUCTURE a document should draw: a table, a heading, a list, a
|
|
28
|
+
* fence, a quote, a link, or bold. Plain prose (and a stray `*` or `_`) is false, so ordinary
|
|
29
|
+
* typing and paste stay plain text. Every door that takes agent- or clipboard-supplied text asks
|
|
30
|
+
* this one question, then converts through `markdownFragment`.
|
|
31
|
+
*/
|
|
32
|
+
declare function looksLikeMarkdown(text: string): boolean;
|
|
26
33
|
/**
|
|
27
34
|
* Where a BLOCK (table of contents, building block) goes for a caret: never inside a paragraph's
|
|
28
35
|
* text, so a heading is never split. Caret at the start of a paragraph (or in an empty one) →
|
|
@@ -147,4 +154,4 @@ declare function createDocEditOps(deps: {
|
|
|
147
154
|
/** Write one plain key onto the document style (it rides the snapshot like the paper colour does). */
|
|
148
155
|
declare function writeDocumentStyleKey(api: ApiLike, key: string, value: string): Promise<void>;
|
|
149
156
|
|
|
150
|
-
export { BOOKMARK_ANCHOR, BOOKMARK_RANGE_TYPE, BUILDING_BLOCKS, type Bookmark, type BorderChoice, type BorderDash, type BorderSide, type BuildingBlock, DOCUMENT_LANGUAGES, DOCUMENT_LANGUAGE_KEY, type DocEditOps, type
|
|
157
|
+
export { BOOKMARK_ANCHOR, BOOKMARK_RANGE_TYPE, BUILDING_BLOCKS, type Bookmark, type BorderChoice, type BorderDash, type BorderSide, type BuildingBlock, DOCUMENT_LANGUAGES, DOCUMENT_LANGUAGE_KEY, type DocEditOps, type MarkdownFragment, type RulerGeometry, blockInsertPlan, bookmarkBody, bookmarkFromHash, bookmarkHash, cleanBookmarkName, collectBookmarks, createDocEditOps, looksLikeMarkdown, markdownFragment, paragraphBorderParams, readDocumentLanguage, rulerGeometry, writeDocumentStyleKey };
|
package/dist/docs-tools.js
CHANGED
|
@@ -1,112 +1,22 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if (stream.endsWith("\n")) stream = stream.slice(0, -1);
|
|
21
|
-
const paragraphs = (body.paragraphs ?? []).filter((p) => p.startIndex < stream.length);
|
|
22
|
-
const textRuns = (body.textRuns ?? []).filter((r) => r.st < stream.length).map((r) => ({ ...r, ed: Math.min(r.ed, stream.length) }));
|
|
23
|
-
return { dataStream: stream, paragraphs, ...textRuns.length ? { textRuns } : {} };
|
|
24
|
-
}
|
|
25
|
-
function blockInsertPlan(dataStream, caret) {
|
|
26
|
-
const c = Math.max(0, Math.min(caret, dataStream.length));
|
|
27
|
-
const start = Math.max(dataStream.lastIndexOf("\r", c - 1), dataStream.lastIndexOf("\n", c - 1)) + 1;
|
|
28
|
-
let end = dataStream.indexOf("\r", c);
|
|
29
|
-
if (end < 0) end = dataStream.length;
|
|
30
|
-
const text = dataStream.slice(start, end).replace(/[\u0000-\u001f\u200b]/g, "").trim();
|
|
31
|
-
if (c === start || text === "") return { at: start, breakAt: null };
|
|
32
|
-
return { at: end + 1, breakAt: end };
|
|
33
|
-
}
|
|
34
|
-
var BOOKMARK_RANGE_TYPE = 3;
|
|
35
|
-
var BOOKMARK_ANCHOR = "\u200B";
|
|
36
|
-
function collectBookmarks(snapshot) {
|
|
37
|
-
const body = snapshot?.body;
|
|
38
|
-
const out = [];
|
|
39
|
-
for (const r of body?.customRanges ?? []) {
|
|
40
|
-
if (r.rangeType !== BOOKMARK_RANGE_TYPE) continue;
|
|
41
|
-
out.push({ id: r.rangeId, name: typeof r.properties?.name === "string" ? r.properties.name : "", offset: r.startIndex });
|
|
42
|
-
}
|
|
43
|
-
return out.sort((a, b) => a.offset - b.offset);
|
|
44
|
-
}
|
|
45
|
-
function bookmarkBody(id, name) {
|
|
46
|
-
return {
|
|
47
|
-
dataStream: BOOKMARK_ANCHOR,
|
|
48
|
-
customRanges: [{ startIndex: 0, endIndex: 0, rangeId: id, rangeType: BOOKMARK_RANGE_TYPE, properties: { name }, wholeEntity: true }]
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
function cleanBookmarkName(raw, existing) {
|
|
52
|
-
const name = raw.replace(/\s+/g, " ").trim().slice(0, 80);
|
|
53
|
-
if (!name) return { ok: false, why: "Give the bookmark a name." };
|
|
54
|
-
if (existing.some((b) => b.name.toLowerCase() === name.toLowerCase())) return { ok: false, why: `A bookmark named "${name}" already exists.` };
|
|
55
|
-
return { ok: true, name };
|
|
56
|
-
}
|
|
57
|
-
function bookmarkFromHash(hash) {
|
|
58
|
-
const m = /^#bookmark=(.+)$/.exec(hash);
|
|
59
|
-
if (!m) return null;
|
|
60
|
-
try {
|
|
61
|
-
return decodeURIComponent(m[1]);
|
|
62
|
-
} catch {
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
var bookmarkHash = (name) => `#bookmark=${encodeURIComponent(name)}`;
|
|
67
|
-
var DASH = { solid: 1, dotted: 2, dashed: 3 };
|
|
68
|
-
function paragraphBorderParams(c) {
|
|
69
|
-
const line = { color: { rgb: c.color }, width: c.width, dashStyle: DASH[c.dash], padding: c.padding };
|
|
70
|
-
return {
|
|
71
|
-
borderTop: c.side === "top" || c.side === "both" ? line : null,
|
|
72
|
-
borderBottom: c.side === "bottom" || c.side === "both" ? line : null
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
function rulerGeometry(a) {
|
|
76
|
-
const pageWidth = a.pageWidthPx * a.zoom;
|
|
77
|
-
const pageLeft = Math.max(0, (a.containerWidth - pageWidth) / 2);
|
|
78
|
-
const ticks = [];
|
|
79
|
-
const inches = a.pageWidthPx / PX_PER_INCH;
|
|
80
|
-
for (let eighth = 0; eighth <= Math.floor(inches * 8); eighth++) {
|
|
81
|
-
const x = pageLeft + eighth * PX_PER_INCH * a.zoom / 8;
|
|
82
|
-
if (eighth % 8 === 0) {
|
|
83
|
-
const marginInches = a.marginLeftPx / PX_PER_INCH;
|
|
84
|
-
ticks.push({ x, kind: "inch", ...eighth / 8 !== marginInches ? { label: String(Math.round(Math.abs(eighth / 8 - marginInches))) } : {} });
|
|
85
|
-
} else ticks.push({ x, kind: eighth % 4 === 0 ? "half" : "eighth" });
|
|
86
|
-
}
|
|
87
|
-
return { pageLeft, pageWidth, marginLeft: a.marginLeftPx * a.zoom, marginRight: a.marginRightPx * a.zoom, ticks };
|
|
88
|
-
}
|
|
89
|
-
var DOCUMENT_LANGUAGE_KEY = "matrxLanguage";
|
|
90
|
-
var DOCUMENT_LANGUAGES = [
|
|
91
|
-
{ code: "en-US", label: "English (United States)" },
|
|
92
|
-
{ code: "en-GB", label: "English (United Kingdom)" },
|
|
93
|
-
{ code: "es", label: "Spanish" },
|
|
94
|
-
{ code: "fr", label: "French" },
|
|
95
|
-
{ code: "de", label: "German" },
|
|
96
|
-
{ code: "it", label: "Italian" },
|
|
97
|
-
{ code: "pt-BR", label: "Portuguese (Brazil)" },
|
|
98
|
-
{ code: "nl", label: "Dutch" },
|
|
99
|
-
{ code: "ja", label: "Japanese" },
|
|
100
|
-
{ code: "ko", label: "Korean" },
|
|
101
|
-
{ code: "zh-CN", label: "Chinese (Simplified)" },
|
|
102
|
-
{ code: "ar", label: "Arabic" },
|
|
103
|
-
{ code: "hi", label: "Hindi" },
|
|
104
|
-
{ code: "ru", label: "Russian" }
|
|
105
|
-
];
|
|
106
|
-
function readDocumentLanguage(documentStyle) {
|
|
107
|
-
const v = documentStyle?.[DOCUMENT_LANGUAGE_KEY];
|
|
108
|
-
return typeof v === "string" && DOCUMENT_LANGUAGES.some((l) => l.code === v) ? v : "en-US";
|
|
109
|
-
}
|
|
2
|
+
BOOKMARK_ANCHOR,
|
|
3
|
+
BOOKMARK_RANGE_TYPE,
|
|
4
|
+
BUILDING_BLOCKS,
|
|
5
|
+
DOCUMENT_LANGUAGES,
|
|
6
|
+
DOCUMENT_LANGUAGE_KEY,
|
|
7
|
+
blockInsertPlan,
|
|
8
|
+
bookmarkBody,
|
|
9
|
+
bookmarkFromHash,
|
|
10
|
+
bookmarkHash,
|
|
11
|
+
cleanBookmarkName,
|
|
12
|
+
collectBookmarks,
|
|
13
|
+
looksLikeMarkdown,
|
|
14
|
+
markdownFragment,
|
|
15
|
+
paragraphBorderParams,
|
|
16
|
+
readDocumentLanguage,
|
|
17
|
+
rulerGeometry
|
|
18
|
+
} from "./chunk-47MIGBMH.js";
|
|
19
|
+
import "./chunk-Z247F527.js";
|
|
110
20
|
|
|
111
21
|
// src/docs/doc-edit-ops.ts
|
|
112
22
|
function createDocEditOps(deps) {
|
|
@@ -141,7 +51,7 @@ function createDocEditOps(deps) {
|
|
|
141
51
|
async insertMarkdown(markdown) {
|
|
142
52
|
const d = doc();
|
|
143
53
|
if (!d || !await toBlockStart()) return false;
|
|
144
|
-
return exec("doc.command.
|
|
54
|
+
return exec("doc.command.inner-paste", { unitId: d.getId(), doc: markdownFragment(markdown) });
|
|
145
55
|
},
|
|
146
56
|
bookmarks: () => collectBookmarks(snapshot()),
|
|
147
57
|
async addBookmark(name) {
|
|
@@ -208,7 +118,8 @@ export {
|
|
|
208
118
|
cleanBookmarkName,
|
|
209
119
|
collectBookmarks,
|
|
210
120
|
createDocEditOps,
|
|
211
|
-
|
|
121
|
+
looksLikeMarkdown,
|
|
122
|
+
markdownFragment,
|
|
212
123
|
paragraphBorderParams,
|
|
213
124
|
readDocumentLanguage,
|
|
214
125
|
rulerGeometry,
|