@unisim/doc 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +91 -0
- package/dist/convert.d.ts +54 -0
- package/dist/convert.d.ts.map +1 -0
- package/dist/convert.js +216 -0
- package/dist/convert.js.map +1 -0
- package/dist/image.d.ts +17 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +66 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/merge.d.ts +14 -0
- package/dist/merge.d.ts.map +1 -0
- package/dist/merge.js +51 -0
- package/dist/merge.js.map +1 -0
- package/dist/metrics.d.ts +19 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +151 -0
- package/dist/metrics.js.map +1 -0
- package/dist/model.d.ts +114 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +121 -0
- package/dist/model.js.map +1 -0
- package/dist/pdfcore.d.ts +118 -0
- package/dist/pdfcore.d.ts.map +1 -0
- package/dist/pdfcore.js +398 -0
- package/dist/pdfcore.js.map +1 -0
- package/dist/read/csv.d.ts +17 -0
- package/dist/read/csv.d.ts.map +1 -0
- package/dist/read/csv.js +167 -0
- package/dist/read/csv.js.map +1 -0
- package/dist/read/doc.d.ts +3 -0
- package/dist/read/doc.d.ts.map +1 -0
- package/dist/read/doc.js +360 -0
- package/dist/read/doc.js.map +1 -0
- package/dist/read/docx.d.ts +3 -0
- package/dist/read/docx.d.ts.map +1 -0
- package/dist/read/docx.js +455 -0
- package/dist/read/docx.js.map +1 -0
- package/dist/read/html.d.ts +4 -0
- package/dist/read/html.d.ts.map +1 -0
- package/dist/read/html.js +236 -0
- package/dist/read/html.js.map +1 -0
- package/dist/read/json.d.ts +9 -0
- package/dist/read/json.d.ts.map +1 -0
- package/dist/read/json.js +105 -0
- package/dist/read/json.js.map +1 -0
- package/dist/read/markdown.d.ts +4 -0
- package/dist/read/markdown.d.ts.map +1 -0
- package/dist/read/markdown.js +247 -0
- package/dist/read/markdown.js.map +1 -0
- package/dist/read/odt.d.ts +3 -0
- package/dist/read/odt.d.ts.map +1 -0
- package/dist/read/odt.js +359 -0
- package/dist/read/odt.js.map +1 -0
- package/dist/read/rtf.d.ts +3 -0
- package/dist/read/rtf.d.ts.map +1 -0
- package/dist/read/rtf.js +341 -0
- package/dist/read/rtf.js.map +1 -0
- package/dist/read/text.d.ts +4 -0
- package/dist/read/text.d.ts.map +1 -0
- package/dist/read/text.js +62 -0
- package/dist/read/text.js.map +1 -0
- package/dist/unzip.d.ts +23 -0
- package/dist/unzip.d.ts.map +1 -0
- package/dist/unzip.js +152 -0
- package/dist/unzip.js.map +1 -0
- package/dist/write/data.d.ts +16 -0
- package/dist/write/data.d.ts.map +1 -0
- package/dist/write/data.js +89 -0
- package/dist/write/data.js.map +1 -0
- package/dist/write/pdf.d.ts +10 -0
- package/dist/write/pdf.d.ts.map +1 -0
- package/dist/write/pdf.js +696 -0
- package/dist/write/pdf.js.map +1 -0
- package/dist/write/pdfSettings.d.ts +13 -0
- package/dist/write/pdfSettings.d.ts.map +1 -0
- package/dist/write/pdfSettings.js +26 -0
- package/dist/write/pdfSettings.js.map +1 -0
- package/dist/write/text.d.ts +5 -0
- package/dist/write/text.d.ts.map +1 -0
- package/dist/write/text.js +341 -0
- package/dist/write/text.js.map +1 -0
- package/dist/xml.d.ts +22 -0
- package/dist/xml.d.ts.map +1 -0
- package/dist/xml.js +83 -0
- package/dist/xml.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Grid → CSV and JSON.
|
|
3
|
+
//
|
|
4
|
+
// The two DATA targets, which deliberately never touch `RichDoc`. A CSV is rows
|
|
5
|
+
// of values, and routing it through a document model to get JSON back out would
|
|
6
|
+
// mean re-parsing the paragraphs it had been turned into — losing, on the way,
|
|
7
|
+
// the one thing JSON actually needs, which is what type each value is.
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
export function gridToCsv(grid) {
|
|
10
|
+
const rows = grid.header.length ? [grid.header, ...grid.rows] : grid.rows;
|
|
11
|
+
// CRLF, per RFC 4180 — and because Excel on Windows is the overwhelmingly
|
|
12
|
+
// likely destination, and it is the one that cares.
|
|
13
|
+
return rows.map((row) => row.map(csvCell).join(',')).join('\r\n') + '\r\n';
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* One cell, quoted only where it has to be.
|
|
17
|
+
*
|
|
18
|
+
* ⚠️ A LEADING SPACE COUNTS. A field that opens with whitespace loses it in
|
|
19
|
+
* some readers unless it is quoted, and a field that ENDS with a lone quote
|
|
20
|
+
* character needs quoting for the doubling rule to be unambiguous.
|
|
21
|
+
*/
|
|
22
|
+
function csvCell(value) {
|
|
23
|
+
const needsQuotes = /[",\r\n]/.test(value) || value !== value.trim();
|
|
24
|
+
return needsQuotes ? `"${value.replace(/"/g, '""')}"` : value;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A grid as an array of objects.
|
|
28
|
+
*
|
|
29
|
+
* Columns become keys. Where the source had no header row, the keys are
|
|
30
|
+
* `column1`, `column2`… rather than the first row's values — using data as keys
|
|
31
|
+
* silently deletes a row, and a file with no header is exactly the file where
|
|
32
|
+
* every row matters.
|
|
33
|
+
*/
|
|
34
|
+
export function gridToJson(grid, options = { inferTypes: true }) {
|
|
35
|
+
const columns = grid.header.length
|
|
36
|
+
? dedupe(grid.header)
|
|
37
|
+
: Array.from({ length: Math.max(0, ...grid.rows.map((r) => r.length)) }, (_, i) => `column${i + 1}`);
|
|
38
|
+
const records = grid.rows.map((row) => {
|
|
39
|
+
const record = {};
|
|
40
|
+
columns.forEach((key, i) => {
|
|
41
|
+
record[key] = options.inferTypes ? inferType(row[i] ?? '') : (row[i] ?? '');
|
|
42
|
+
});
|
|
43
|
+
return record;
|
|
44
|
+
});
|
|
45
|
+
return JSON.stringify(records, null, 2) + '\n';
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Column names, made unique.
|
|
49
|
+
*
|
|
50
|
+
* A spreadsheet cheerfully has two columns called "Notes"; a JSON object cannot,
|
|
51
|
+
* and the second would silently overwrite the first — losing a whole column with
|
|
52
|
+
* nothing to show for it.
|
|
53
|
+
*/
|
|
54
|
+
function dedupe(header) {
|
|
55
|
+
const seen = new Map();
|
|
56
|
+
return header.map((raw, i) => {
|
|
57
|
+
const name = raw.trim() || `column${i + 1}`;
|
|
58
|
+
const count = seen.get(name) ?? 0;
|
|
59
|
+
seen.set(name, count + 1);
|
|
60
|
+
return count ? `${name}_${count + 1}` : name;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* A cell's type, guessed conservatively.
|
|
65
|
+
*
|
|
66
|
+
* ⚠️ The rule that matters: A NUMBER ONLY BECOMES A NUMBER IF IT SURVIVES THE
|
|
67
|
+
* ROUND TRIP. `007` and `+441632960000` and `1.10` are all "numeric" and all
|
|
68
|
+
* come back changed — a leading zero gone, a plus sign gone, a trailing zero
|
|
69
|
+
* gone. Those are product codes, phone numbers and prices, and quietly
|
|
70
|
+
* corrupting them is far worse than leaving them as strings.
|
|
71
|
+
*/
|
|
72
|
+
function inferType(value) {
|
|
73
|
+
const trimmed = value.trim();
|
|
74
|
+
if (trimmed === '')
|
|
75
|
+
return null;
|
|
76
|
+
if (trimmed === 'true')
|
|
77
|
+
return true;
|
|
78
|
+
if (trimmed === 'false')
|
|
79
|
+
return false;
|
|
80
|
+
if (trimmed === 'null')
|
|
81
|
+
return null;
|
|
82
|
+
if (/^-?\d+(\.\d+)?([eE][-+]?\d+)?$/.test(trimmed)) {
|
|
83
|
+
const number = Number(trimmed);
|
|
84
|
+
if (Number.isFinite(number) && String(number) === trimmed)
|
|
85
|
+
return number;
|
|
86
|
+
}
|
|
87
|
+
return value;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/write/data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RichDoc } from '../model.js';
|
|
2
|
+
import type { PdfSettings } from './pdfSettings.js';
|
|
3
|
+
export interface PdfResult {
|
|
4
|
+
blob: Blob;
|
|
5
|
+
pages: number;
|
|
6
|
+
/** Characters no base-14 font can spell, for an honest warning. */
|
|
7
|
+
dropped: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare function docToPdf(doc: RichDoc, settings: PdfSettings): Promise<PdfResult>;
|
|
10
|
+
//# sourceMappingURL=pdf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../src/write/pdf.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAS,OAAO,EAAO,MAAM,aAAa,CAAA;AAGtD,OAAO,KAAK,EAAyB,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAmD1E,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAID,wBAAsB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAgCtF"}
|