@graphty/graph-io 0.0.0 → 0.2.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/LICENSE +21 -0
- package/README.md +250 -28
- package/dist/chunks/children-CL3Cy0ez.js +238 -0
- package/dist/chunks/children-CL3Cy0ez.js.map +1 -0
- package/dist/chunks/escape-DyI8JofU.js +938 -0
- package/dist/chunks/escape-DyI8JofU.js.map +1 -0
- package/dist/chunks/importer-CQnJuWJw.js +2987 -0
- package/dist/chunks/importer-CQnJuWJw.js.map +1 -0
- package/dist/chunks/importer-CpCpfbxr.js +2015 -0
- package/dist/chunks/importer-CpCpfbxr.js.map +1 -0
- package/dist/chunks/importer-DbnGYr3_.js +2342 -0
- package/dist/chunks/importer-DbnGYr3_.js.map +1 -0
- package/dist/chunks/importer-GozH8DkN.js +3050 -0
- package/dist/chunks/importer-GozH8DkN.js.map +1 -0
- package/dist/chunks/records-CGpxszm1.js +605 -0
- package/dist/chunks/records-CGpxszm1.js.map +1 -0
- package/dist/chunks/text-CajMdVFy.js +189 -0
- package/dist/chunks/text-CajMdVFy.js.map +1 -0
- package/dist/chunks/writer-DxSKC7TL.js +2842 -0
- package/dist/chunks/writer-DxSKC7TL.js.map +1 -0
- package/dist/csv.d.ts +1 -0
- package/dist/csv.js +1702 -0
- package/dist/csv.js.map +1 -0
- package/dist/dot.d.ts +1 -0
- package/dist/dot.js +8 -0
- package/dist/dot.js.map +1 -0
- package/dist/gexf.d.ts +1 -0
- package/dist/gexf.js +3466 -0
- package/dist/gexf.js.map +1 -0
- package/dist/gml.d.ts +1 -0
- package/dist/gml.js +2647 -0
- package/dist/gml.js.map +1 -0
- package/dist/graph-io.d.ts +1 -0
- package/dist/graph-io.js +790 -0
- package/dist/graph-io.js.map +1 -0
- package/dist/graphml.d.ts +1 -0
- package/dist/graphml.js +8 -0
- package/dist/graphml.js.map +1 -0
- package/dist/json.d.ts +1 -0
- package/dist/json.js +11 -0
- package/dist/json.js.map +1 -0
- package/dist/neo4j.d.ts +1 -0
- package/dist/neo4j.js +2046 -0
- package/dist/neo4j.js.map +1 -0
- package/dist/pajek.d.ts +1 -0
- package/dist/pajek.js +8 -0
- package/dist/pajek.js.map +1 -0
- package/dist/src/children.d.ts +134 -0
- package/dist/src/children.d.ts.map +1 -0
- package/dist/src/children.js +274 -0
- package/dist/src/children.js.map +1 -0
- package/dist/src/common/attributes.d.ts +229 -0
- package/dist/src/common/attributes.d.ts.map +1 -0
- package/dist/src/common/attributes.js +368 -0
- package/dist/src/common/attributes.js.map +1 -0
- package/dist/src/common/codes.d.ts +105 -0
- package/dist/src/common/codes.d.ts.map +1 -0
- package/dist/src/common/codes.js +107 -0
- package/dist/src/common/codes.js.map +1 -0
- package/dist/src/common/declared-types.d.ts +84 -0
- package/dist/src/common/declared-types.d.ts.map +1 -0
- package/dist/src/common/declared-types.js +326 -0
- package/dist/src/common/declared-types.js.map +1 -0
- package/dist/src/common/direction.d.ts +206 -0
- package/dist/src/common/direction.d.ts.map +1 -0
- package/dist/src/common/direction.js +370 -0
- package/dist/src/common/direction.js.map +1 -0
- package/dist/src/common/escape.d.ts +92 -0
- package/dist/src/common/escape.d.ts.map +1 -0
- package/dist/src/common/escape.js +212 -0
- package/dist/src/common/escape.js.map +1 -0
- package/dist/src/common/export.d.ts +249 -0
- package/dist/src/common/export.d.ts.map +1 -0
- package/dist/src/common/export.js +594 -0
- package/dist/src/common/export.js.map +1 -0
- package/dist/src/common/format.d.ts +59 -0
- package/dist/src/common/format.d.ts.map +1 -0
- package/dist/src/common/format.js +106 -0
- package/dist/src/common/format.js.map +1 -0
- package/dist/src/common/ids.d.ts +83 -0
- package/dist/src/common/ids.d.ts.map +1 -0
- package/dist/src/common/ids.js +158 -0
- package/dist/src/common/ids.js.map +1 -0
- package/dist/src/common/input.d.ts +100 -0
- package/dist/src/common/input.d.ts.map +1 -0
- package/dist/src/common/input.js +335 -0
- package/dist/src/common/input.js.map +1 -0
- package/dist/src/common/lists.d.ts +34 -0
- package/dist/src/common/lists.d.ts.map +1 -0
- package/dist/src/common/lists.js +185 -0
- package/dist/src/common/lists.js.map +1 -0
- package/dist/src/common/options.d.ts +108 -0
- package/dist/src/common/options.d.ts.map +1 -0
- package/dist/src/common/options.js +265 -0
- package/dist/src/common/options.js.map +1 -0
- package/dist/src/common/report.d.ts +187 -0
- package/dist/src/common/report.d.ts.map +1 -0
- package/dist/src/common/report.js +274 -0
- package/dist/src/common/report.js.map +1 -0
- package/dist/src/common/temporal.d.ts +71 -0
- package/dist/src/common/temporal.d.ts.map +1 -0
- package/dist/src/common/temporal.js +266 -0
- package/dist/src/common/temporal.js.map +1 -0
- package/dist/src/common/text.d.ts +104 -0
- package/dist/src/common/text.d.ts.map +1 -0
- package/dist/src/common/text.js +255 -0
- package/dist/src/common/text.js.map +1 -0
- package/dist/src/common/weights.d.ts +77 -0
- package/dist/src/common/weights.d.ts.map +1 -0
- package/dist/src/common/weights.js +156 -0
- package/dist/src/common/weights.js.map +1 -0
- package/dist/src/common/writer.d.ts +51 -0
- package/dist/src/common/writer.d.ts.map +1 -0
- package/dist/src/common/writer.js +108 -0
- package/dist/src/common/writer.js.map +1 -0
- package/dist/src/common/xml.d.ts +245 -0
- package/dist/src/common/xml.d.ts.map +1 -0
- package/dist/src/common/xml.js +942 -0
- package/dist/src/common/xml.js.map +1 -0
- package/dist/src/formats/csv/exporter.d.ts +70 -0
- package/dist/src/formats/csv/exporter.d.ts.map +1 -0
- package/dist/src/formats/csv/exporter.js +682 -0
- package/dist/src/formats/csv/exporter.js.map +1 -0
- package/dist/src/formats/csv/header.d.ts +66 -0
- package/dist/src/formats/csv/header.d.ts.map +1 -0
- package/dist/src/formats/csv/header.js +152 -0
- package/dist/src/formats/csv/header.js.map +1 -0
- package/dist/src/formats/csv/importer.d.ts +82 -0
- package/dist/src/formats/csv/importer.d.ts.map +1 -0
- package/dist/src/formats/csv/importer.js +849 -0
- package/dist/src/formats/csv/importer.js.map +1 -0
- package/dist/src/formats/csv/index.d.ts +60 -0
- package/dist/src/formats/csv/index.d.ts.map +1 -0
- package/dist/src/formats/csv/index.js +63 -0
- package/dist/src/formats/csv/index.js.map +1 -0
- package/dist/src/formats/csv/records.d.ts +188 -0
- package/dist/src/formats/csv/records.d.ts.map +1 -0
- package/dist/src/formats/csv/records.js +702 -0
- package/dist/src/formats/csv/records.js.map +1 -0
- package/dist/src/formats/csv/values.d.ts +105 -0
- package/dist/src/formats/csv/values.d.ts.map +1 -0
- package/dist/src/formats/csv/values.js +192 -0
- package/dist/src/formats/csv/values.js.map +1 -0
- package/dist/src/formats/dot/exporter.d.ts +52 -0
- package/dist/src/formats/dot/exporter.d.ts.map +1 -0
- package/dist/src/formats/dot/exporter.js +836 -0
- package/dist/src/formats/dot/exporter.js.map +1 -0
- package/dist/src/formats/dot/importer.d.ts +102 -0
- package/dist/src/formats/dot/importer.d.ts.map +1 -0
- package/dist/src/formats/dot/importer.js +1291 -0
- package/dist/src/formats/dot/importer.js.map +1 -0
- package/dist/src/formats/dot/index.d.ts +7 -0
- package/dist/src/formats/dot/index.d.ts.map +1 -0
- package/dist/src/formats/dot/index.js +7 -0
- package/dist/src/formats/dot/index.js.map +1 -0
- package/dist/src/formats/dot/names.d.ts +29 -0
- package/dist/src/formats/dot/names.d.ts.map +1 -0
- package/dist/src/formats/dot/names.js +28 -0
- package/dist/src/formats/dot/names.js.map +1 -0
- package/dist/src/formats/dot/tokenizer.d.ts +114 -0
- package/dist/src/formats/dot/tokenizer.d.ts.map +1 -0
- package/dist/src/formats/dot/tokenizer.js +341 -0
- package/dist/src/formats/dot/tokenizer.js.map +1 -0
- package/dist/src/formats/gexf/exporter.d.ts +56 -0
- package/dist/src/formats/gexf/exporter.d.ts.map +1 -0
- package/dist/src/formats/gexf/exporter.js +1395 -0
- package/dist/src/formats/gexf/exporter.js.map +1 -0
- package/dist/src/formats/gexf/importer.d.ts +73 -0
- package/dist/src/formats/gexf/importer.d.ts.map +1 -0
- package/dist/src/formats/gexf/importer.js +1880 -0
- package/dist/src/formats/gexf/importer.js.map +1 -0
- package/dist/src/formats/gexf/index.d.ts +96 -0
- package/dist/src/formats/gexf/index.d.ts.map +1 -0
- package/dist/src/formats/gexf/index.js +97 -0
- package/dist/src/formats/gexf/index.js.map +1 -0
- package/dist/src/formats/gexf/schema.d.ts +135 -0
- package/dist/src/formats/gexf/schema.d.ts.map +1 -0
- package/dist/src/formats/gexf/schema.js +323 -0
- package/dist/src/formats/gexf/schema.js.map +1 -0
- package/dist/src/formats/gml/exporter.d.ts +69 -0
- package/dist/src/formats/gml/exporter.d.ts.map +1 -0
- package/dist/src/formats/gml/exporter.js +1093 -0
- package/dist/src/formats/gml/exporter.js.map +1 -0
- package/dist/src/formats/gml/importer.d.ts +66 -0
- package/dist/src/formats/gml/importer.d.ts.map +1 -0
- package/dist/src/formats/gml/importer.js +1331 -0
- package/dist/src/formats/gml/importer.js.map +1 -0
- package/dist/src/formats/gml/index.d.ts +85 -0
- package/dist/src/formats/gml/index.d.ts.map +1 -0
- package/dist/src/formats/gml/index.js +88 -0
- package/dist/src/formats/gml/index.js.map +1 -0
- package/dist/src/formats/gml/syntax.d.ts +186 -0
- package/dist/src/formats/gml/syntax.d.ts.map +1 -0
- package/dist/src/formats/gml/syntax.js +467 -0
- package/dist/src/formats/gml/syntax.js.map +1 -0
- package/dist/src/formats/graphml/constants.d.ts +169 -0
- package/dist/src/formats/graphml/constants.d.ts.map +1 -0
- package/dist/src/formats/graphml/constants.js +165 -0
- package/dist/src/formats/graphml/constants.js.map +1 -0
- package/dist/src/formats/graphml/exporter.d.ts +34 -0
- package/dist/src/formats/graphml/exporter.d.ts.map +1 -0
- package/dist/src/formats/graphml/exporter.js +1176 -0
- package/dist/src/formats/graphml/exporter.js.map +1 -0
- package/dist/src/formats/graphml/importer.d.ts +31 -0
- package/dist/src/formats/graphml/importer.d.ts.map +1 -0
- package/dist/src/formats/graphml/importer.js +1607 -0
- package/dist/src/formats/graphml/importer.js.map +1 -0
- package/dist/src/formats/graphml/index.d.ts +8 -0
- package/dist/src/formats/graphml/index.d.ts.map +1 -0
- package/dist/src/formats/graphml/index.js +8 -0
- package/dist/src/formats/graphml/index.js.map +1 -0
- package/dist/src/formats/graphml/tree.d.ts +72 -0
- package/dist/src/formats/graphml/tree.d.ts.map +1 -0
- package/dist/src/formats/graphml/tree.js +290 -0
- package/dist/src/formats/graphml/tree.js.map +1 -0
- package/dist/src/formats/json/dialect.d.ts +125 -0
- package/dist/src/formats/json/dialect.d.ts.map +1 -0
- package/dist/src/formats/json/dialect.js +262 -0
- package/dist/src/formats/json/dialect.js.map +1 -0
- package/dist/src/formats/json/exporter.d.ts +89 -0
- package/dist/src/formats/json/exporter.d.ts.map +1 -0
- package/dist/src/formats/json/exporter.js +1358 -0
- package/dist/src/formats/json/exporter.js.map +1 -0
- package/dist/src/formats/json/importer.d.ts +108 -0
- package/dist/src/formats/json/importer.d.ts.map +1 -0
- package/dist/src/formats/json/importer.js +1838 -0
- package/dist/src/formats/json/importer.js.map +1 -0
- package/dist/src/formats/json/index.d.ts +8 -0
- package/dist/src/formats/json/index.d.ts.map +1 -0
- package/dist/src/formats/json/index.js +8 -0
- package/dist/src/formats/json/index.js.map +1 -0
- package/dist/src/formats/neo4j/exporter.d.ts +68 -0
- package/dist/src/formats/neo4j/exporter.d.ts.map +1 -0
- package/dist/src/formats/neo4j/exporter.js +1055 -0
- package/dist/src/formats/neo4j/exporter.js.map +1 -0
- package/dist/src/formats/neo4j/header.d.ts +52 -0
- package/dist/src/formats/neo4j/header.d.ts.map +1 -0
- package/dist/src/formats/neo4j/header.js +131 -0
- package/dist/src/formats/neo4j/header.js.map +1 -0
- package/dist/src/formats/neo4j/importer.d.ts +73 -0
- package/dist/src/formats/neo4j/importer.d.ts.map +1 -0
- package/dist/src/formats/neo4j/importer.js +932 -0
- package/dist/src/formats/neo4j/importer.js.map +1 -0
- package/dist/src/formats/neo4j/index.d.ts +79 -0
- package/dist/src/formats/neo4j/index.d.ts.map +1 -0
- package/dist/src/formats/neo4j/index.js +83 -0
- package/dist/src/formats/neo4j/index.js.map +1 -0
- package/dist/src/formats/pajek/exporter.d.ts +58 -0
- package/dist/src/formats/pajek/exporter.d.ts.map +1 -0
- package/dist/src/formats/pajek/exporter.js +825 -0
- package/dist/src/formats/pajek/exporter.js.map +1 -0
- package/dist/src/formats/pajek/importer.d.ts +88 -0
- package/dist/src/formats/pajek/importer.d.ts.map +1 -0
- package/dist/src/formats/pajek/importer.js +1047 -0
- package/dist/src/formats/pajek/importer.js.map +1 -0
- package/dist/src/formats/pajek/index.d.ts +7 -0
- package/dist/src/formats/pajek/index.d.ts.map +1 -0
- package/dist/src/formats/pajek/index.js +7 -0
- package/dist/src/formats/pajek/index.js.map +1 -0
- package/dist/src/formats/pajek/syntax.d.ts +112 -0
- package/dist/src/formats/pajek/syntax.d.ts.map +1 -0
- package/dist/src/formats/pajek/syntax.js +269 -0
- package/dist/src/formats/pajek/syntax.js.map +1 -0
- package/dist/src/index.d.ts +35 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +39 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/registry.d.ts +207 -0
- package/dist/src/registry.d.ts.map +1 -0
- package/dist/src/registry.js +481 -0
- package/dist/src/registry.js.map +1 -0
- package/dist/src/sniff.d.ts +104 -0
- package/dist/src/sniff.d.ts.map +1 -0
- package/dist/src/sniff.js +357 -0
- package/dist/src/sniff.js.map +1 -0
- package/dist/src/types.d.ts +238 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +29 -0
- package/dist/src/types.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +122 -7
- package/src/children.ts +335 -0
- package/src/common/attributes.ts +520 -0
- package/src/common/codes.ts +153 -0
- package/src/common/declared-types.ts +374 -0
- package/src/common/direction.ts +518 -0
- package/src/common/escape.ts +231 -0
- package/src/common/export.ts +817 -0
- package/src/common/format.ts +111 -0
- package/src/common/ids.ts +176 -0
- package/src/common/input.ts +378 -0
- package/src/common/lists.ts +196 -0
- package/src/common/options.ts +377 -0
- package/src/common/report.ts +352 -0
- package/src/common/temporal.ts +302 -0
- package/src/common/text.ts +294 -0
- package/src/common/weights.ts +202 -0
- package/src/common/writer.ts +123 -0
- package/src/common/xml.ts +1053 -0
- package/src/formats/csv/exporter.ts +894 -0
- package/src/formats/csv/header.ts +172 -0
- package/src/formats/csv/importer.ts +1104 -0
- package/src/formats/csv/index.ts +88 -0
- package/src/formats/csv/records.ts +813 -0
- package/src/formats/csv/values.ts +224 -0
- package/src/formats/dot/exporter.ts +1014 -0
- package/src/formats/dot/importer.ts +1549 -0
- package/src/formats/dot/index.ts +7 -0
- package/src/formats/dot/names.ts +40 -0
- package/src/formats/dot/tokenizer.ts +384 -0
- package/src/formats/gexf/exporter.ts +1696 -0
- package/src/formats/gexf/importer.ts +2333 -0
- package/src/formats/gexf/index.ts +142 -0
- package/src/formats/gexf/schema.ts +361 -0
- package/src/formats/gml/exporter.ts +1404 -0
- package/src/formats/gml/importer.ts +1591 -0
- package/src/formats/gml/index.ts +128 -0
- package/src/formats/gml/syntax.ts +545 -0
- package/src/formats/graphml/constants.ts +225 -0
- package/src/formats/graphml/exporter.ts +1458 -0
- package/src/formats/graphml/importer.ts +2027 -0
- package/src/formats/graphml/index.ts +8 -0
- package/src/formats/graphml/tree.ts +318 -0
- package/src/formats/json/dialect.ts +317 -0
- package/src/formats/json/exporter.ts +1616 -0
- package/src/formats/json/importer.ts +2271 -0
- package/src/formats/json/index.ts +8 -0
- package/src/formats/neo4j/exporter.ts +1287 -0
- package/src/formats/neo4j/header.ts +156 -0
- package/src/formats/neo4j/importer.ts +1220 -0
- package/src/formats/neo4j/index.ts +116 -0
- package/src/formats/pajek/exporter.ts +1000 -0
- package/src/formats/pajek/importer.ts +1311 -0
- package/src/formats/pajek/index.ts +7 -0
- package/src/formats/pajek/syntax.ts +307 -0
- package/src/index.ts +244 -0
- package/src/registry.ts +617 -0
- package/src/sniff.ts +397 -0
- package/src/types.ts +262 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input handling shared by every importer (design section 8.4): the ImportInput union (whole
|
|
3
|
+
* text, whole bytes, a byte stream, an async iterable of text or byte chunks) read as a sequence of
|
|
4
|
+
* UTF-8 text chunks, as lines, or as one string, with BOM handling, cancellation through an
|
|
5
|
+
* AbortSignal and byte progress.
|
|
6
|
+
*
|
|
7
|
+
* Bytes are decoded with `new TextDecoder("utf-8", { fatal: true })` in streaming mode, so a
|
|
8
|
+
* multi-byte character split across two chunks decodes correctly and an invalid sequence is a
|
|
9
|
+
* parse-error (issue code E_INVALID_UTF8) that aborts the import, never a silent U+FFFD that could
|
|
10
|
+
* alias two ids. A leading U+FEFF is stripped from text and from decoded bytes alike.
|
|
11
|
+
*/
|
|
12
|
+
import { GraphFormatError } from "@graphty/graph-format";
|
|
13
|
+
import { INVALID_UTF8_CODE } from "./codes.js";
|
|
14
|
+
export { INVALID_UTF8_CODE };
|
|
15
|
+
/**
|
|
16
|
+
* Bytes decoded per call when the input is one in-memory Uint8Array: every consumer of textChunks()
|
|
17
|
+
* then sees bounded chunks whatever the input shape (a line reader or a record reader that holds
|
|
18
|
+
* one parse result per chunk never holds more than this much text at once), and progress stays
|
|
19
|
+
* granular.
|
|
20
|
+
*/
|
|
21
|
+
const DECODE_SLICE = 256 * 1024;
|
|
22
|
+
const BOM = String.fromCharCode(0xfeff);
|
|
23
|
+
/**
|
|
24
|
+
* Whether a value is an ImportInput this module can read.
|
|
25
|
+
* @param input - any value
|
|
26
|
+
* @returns true for a string, a Uint8Array, a ReadableStream or an async iterable
|
|
27
|
+
*/
|
|
28
|
+
export function isImportInput(input) {
|
|
29
|
+
if (typeof input === "string" || input instanceof Uint8Array) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
if (typeof input !== "object" || input === null) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
return typeof input.getReader === "function" || Symbol.asyncIterator in input;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The total size of an in-memory input (bytes for a Uint8Array, UTF-16 code units for a string),
|
|
39
|
+
* for the `bytesTotal` argument of onProgress; null for a stream or an iterable.
|
|
40
|
+
* @param input - the input
|
|
41
|
+
* @returns the size, or null when unknown up front
|
|
42
|
+
*/
|
|
43
|
+
export function inputLength(input) {
|
|
44
|
+
if (typeof input === "string") {
|
|
45
|
+
return input.length;
|
|
46
|
+
}
|
|
47
|
+
if (input instanceof Uint8Array) {
|
|
48
|
+
return input.byteLength;
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Throw the signal's reason when it is aborted, exactly as the platform's
|
|
54
|
+
* `AbortSignal.throwIfAborted()` does: the reason as it is (the DOMException named "AbortError"
|
|
55
|
+
* of a reason-less abort, or whatever the caller passed to `abort(reason)`, an Error or not), so a
|
|
56
|
+
* caller can compare the rejection with `signal.reason`. Only a runtime that stores no reason at
|
|
57
|
+
* all gets a synthesised AbortError.
|
|
58
|
+
* @param signal - the signal, or null
|
|
59
|
+
*/
|
|
60
|
+
export function throwIfAborted(signal) {
|
|
61
|
+
if (signal === null || signal === undefined || !signal.aborted) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const { reason } = signal;
|
|
65
|
+
if (reason === undefined) {
|
|
66
|
+
throw abortError();
|
|
67
|
+
}
|
|
68
|
+
// the platform contract: the reason itself, whatever its type
|
|
69
|
+
throw reason;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* An abort error for a signal that carries no reason.
|
|
73
|
+
* @returns a DOMException named "AbortError" where DOMException exists, else an Error with that name
|
|
74
|
+
*/
|
|
75
|
+
function abortError() {
|
|
76
|
+
const message = "The import was aborted";
|
|
77
|
+
if (typeof DOMException === "function") {
|
|
78
|
+
return new DOMException(message, "AbortError");
|
|
79
|
+
}
|
|
80
|
+
const err = new Error(message);
|
|
81
|
+
err.name = "AbortError";
|
|
82
|
+
return err;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Read an ImportInput as a sequence of decoded text chunks. Chunk boundaries carry no meaning:
|
|
86
|
+
* a caller that needs lines uses LineReader, one that needs the whole document uses readText().
|
|
87
|
+
* The signal is checked before every chunk; a stream is cancelled when the consumer stops early
|
|
88
|
+
* or the signal fires. Progress is reported after every chunk.
|
|
89
|
+
* @param input - the input
|
|
90
|
+
* @param report - the report the decode error is recorded in (E_INVALID_UTF8, then ImportError)
|
|
91
|
+
* @param options - cancellation and progress
|
|
92
|
+
* @yields decoded text; the first chunk has any leading BOM removed
|
|
93
|
+
* @returns nothing
|
|
94
|
+
*/
|
|
95
|
+
export async function* textChunks(input, report, options = {}) {
|
|
96
|
+
const signal = options.signal ?? null;
|
|
97
|
+
const onProgress = options.onProgress ?? null;
|
|
98
|
+
const total = inputLength(input);
|
|
99
|
+
let done = 0;
|
|
100
|
+
let first = true;
|
|
101
|
+
const emit = (text) => {
|
|
102
|
+
if (first && text.length > 0) {
|
|
103
|
+
first = false;
|
|
104
|
+
return text.startsWith(BOM) ? text.slice(1) : text;
|
|
105
|
+
}
|
|
106
|
+
return text;
|
|
107
|
+
};
|
|
108
|
+
throwIfAborted(signal);
|
|
109
|
+
if (typeof input === "string") {
|
|
110
|
+
const text = emit(input);
|
|
111
|
+
done = input.length;
|
|
112
|
+
if (text.length > 0) {
|
|
113
|
+
yield text;
|
|
114
|
+
}
|
|
115
|
+
onProgress?.(done, total ?? undefined);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const decoder = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
|
|
119
|
+
const decode = (bytes, stream) => {
|
|
120
|
+
try {
|
|
121
|
+
return decoder.decode(bytes, { stream });
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
if (err instanceof TypeError) {
|
|
125
|
+
report.fail(INVALID_UTF8_CODE, `invalid UTF-8 near byte ${done}`, undefined, { byteOffset: done });
|
|
126
|
+
}
|
|
127
|
+
throw err;
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
if (input instanceof Uint8Array) {
|
|
131
|
+
for (let offset = 0; offset < input.byteLength; offset += DECODE_SLICE) {
|
|
132
|
+
throwIfAborted(signal);
|
|
133
|
+
const slice = input.subarray(offset, Math.min(offset + DECODE_SLICE, input.byteLength));
|
|
134
|
+
const text = emit(decode(slice, offset + DECODE_SLICE < input.byteLength));
|
|
135
|
+
done = Math.min(offset + DECODE_SLICE, input.byteLength);
|
|
136
|
+
if (text.length > 0) {
|
|
137
|
+
yield text;
|
|
138
|
+
}
|
|
139
|
+
onProgress?.(done, total ?? undefined);
|
|
140
|
+
}
|
|
141
|
+
if (input.byteLength === 0) {
|
|
142
|
+
onProgress?.(0, 0);
|
|
143
|
+
}
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const chunks = isReadableStream(input) ? streamChunks(input, signal) : input;
|
|
147
|
+
for await (const chunk of chunks) {
|
|
148
|
+
throwIfAborted(signal);
|
|
149
|
+
let text;
|
|
150
|
+
if (typeof chunk === "string") {
|
|
151
|
+
// finish any byte sequence still pending in the decoder before switching to text
|
|
152
|
+
const pending = decode(new Uint8Array(0), false);
|
|
153
|
+
text = emit(pending + chunk);
|
|
154
|
+
done += chunk.length;
|
|
155
|
+
}
|
|
156
|
+
else if (chunk instanceof Uint8Array) {
|
|
157
|
+
text = emit(decode(chunk, true));
|
|
158
|
+
done += chunk.byteLength;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
throw new GraphFormatError("E_UNSUPPORTED", "an input chunk must be a string or a Uint8Array", {
|
|
162
|
+
reason: "chunk type",
|
|
163
|
+
found: typeof chunk,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
if (text.length > 0) {
|
|
167
|
+
yield text;
|
|
168
|
+
}
|
|
169
|
+
onProgress?.(done);
|
|
170
|
+
}
|
|
171
|
+
const tail = emit(decode(new Uint8Array(0), false));
|
|
172
|
+
if (tail.length > 0) {
|
|
173
|
+
yield tail;
|
|
174
|
+
}
|
|
175
|
+
onProgress?.(done, done);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Whether an input is a ReadableStream (by duck type, so a stream from another realm qualifies).
|
|
179
|
+
* @param input - a non-string, non-Uint8Array input
|
|
180
|
+
* @returns true for a ReadableStream
|
|
181
|
+
*/
|
|
182
|
+
function isReadableStream(input) {
|
|
183
|
+
return typeof input.getReader === "function";
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Iterate a ReadableStream through a reader, cancelling the stream when iteration stops early.
|
|
187
|
+
* @param stream - the stream
|
|
188
|
+
* @param signal - the cancellation signal, or null
|
|
189
|
+
* @yields the stream's chunks
|
|
190
|
+
* @returns nothing
|
|
191
|
+
*/
|
|
192
|
+
async function* streamChunks(stream, signal) {
|
|
193
|
+
const reader = stream.getReader();
|
|
194
|
+
let finished = false;
|
|
195
|
+
try {
|
|
196
|
+
for (;;) {
|
|
197
|
+
throwIfAborted(signal);
|
|
198
|
+
const { done, value } = await reader.read();
|
|
199
|
+
if (done) {
|
|
200
|
+
finished = true;
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
yield value;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
if (!finished) {
|
|
208
|
+
await reader.cancel(signal?.reason).catch(() => undefined);
|
|
209
|
+
}
|
|
210
|
+
reader.releaseLock();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Read the whole input as one string (the GML / DOT / JSON path, design section 8.4).
|
|
215
|
+
* @param input - the input
|
|
216
|
+
* @param report - the report the decode error is recorded in
|
|
217
|
+
* @param options - cancellation and progress
|
|
218
|
+
* @returns the decoded text without a leading BOM
|
|
219
|
+
*/
|
|
220
|
+
export async function readText(input, report, options = {}) {
|
|
221
|
+
if (typeof input === "string") {
|
|
222
|
+
throwIfAborted(options.signal);
|
|
223
|
+
options.onProgress?.(input.length, input.length);
|
|
224
|
+
return input.startsWith(BOM) ? input.slice(1) : input;
|
|
225
|
+
}
|
|
226
|
+
const parts = [];
|
|
227
|
+
for await (const chunk of textChunks(input, report, options)) {
|
|
228
|
+
parts.push(chunk);
|
|
229
|
+
}
|
|
230
|
+
return parts.length === 1 ? parts[0] : parts.join("");
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Lines of an ImportInput without allocating anything per line but the string itself: iterate with
|
|
234
|
+
* `for await (const text of reader)` and read `reader.line` (1-based) for the line just yielded.
|
|
235
|
+
* `\n`, `\r\n` and lone `\r` all end a line; the terminator is not part of the text; a final
|
|
236
|
+
* line without a terminator is yielded when non-empty, and every line in between is yielded even
|
|
237
|
+
* when empty (the importer decides what a blank line means).
|
|
238
|
+
*/
|
|
239
|
+
export class LineReader {
|
|
240
|
+
/**
|
|
241
|
+
* Create a reader over an input; nothing is read until iteration starts.
|
|
242
|
+
* @param input - the input
|
|
243
|
+
* @param report - the report decode errors are recorded in
|
|
244
|
+
* @param options - cancellation and progress
|
|
245
|
+
*/
|
|
246
|
+
constructor(input, report, options = {}) {
|
|
247
|
+
this.lineNumber = 0;
|
|
248
|
+
this.input = input;
|
|
249
|
+
this.report = report;
|
|
250
|
+
this.options = options;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* The 1-based number of the line most recently yielded.
|
|
254
|
+
* @returns the line number; 0 before the first line
|
|
255
|
+
*/
|
|
256
|
+
get line() {
|
|
257
|
+
return this.lineNumber;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Iterate the lines.
|
|
261
|
+
* @yields one line at a time, terminator removed
|
|
262
|
+
* @returns nothing
|
|
263
|
+
*/
|
|
264
|
+
async *[Symbol.asyncIterator]() {
|
|
265
|
+
// The pieces of the line in progress (none of them holds a line break, except that the last
|
|
266
|
+
// may end with a `\r` whose meaning the next chunk decides); joined once when the line ends,
|
|
267
|
+
// so a line spanning many chunks costs its length, not its length times the chunk count.
|
|
268
|
+
const pending = [];
|
|
269
|
+
let trailingCr = false;
|
|
270
|
+
for await (const chunk of textChunks(this.input, this.report, this.options)) {
|
|
271
|
+
let start = 0;
|
|
272
|
+
const end = chunk.length;
|
|
273
|
+
if (trailingCr) {
|
|
274
|
+
// the previous chunk ended with `\r`: that ended a line, and a leading `\n` here is
|
|
275
|
+
// the second half of the same terminator
|
|
276
|
+
trailingCr = false;
|
|
277
|
+
this.lineNumber++;
|
|
278
|
+
const joined = pending.join("");
|
|
279
|
+
pending.length = 0;
|
|
280
|
+
yield joined.slice(0, -1);
|
|
281
|
+
if (chunk.charCodeAt(0) === 10) {
|
|
282
|
+
start = 1;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// the next `\n` and `\r` at or after `start`; each is searched for once per chunk and
|
|
286
|
+
// again only after it was consumed, so a chunk is scanned once whatever its line count
|
|
287
|
+
let nl = chunk.indexOf("\n", start);
|
|
288
|
+
let cr = chunk.indexOf("\r", start);
|
|
289
|
+
while (nl >= 0 || cr >= 0) {
|
|
290
|
+
let cut;
|
|
291
|
+
let next;
|
|
292
|
+
if (cr >= 0 && (nl < 0 || cr < nl)) {
|
|
293
|
+
if (cr === end - 1) {
|
|
294
|
+
// a trailing \r may be the first half of \r\n split across chunks
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
cut = cr;
|
|
298
|
+
next = chunk.charCodeAt(cr + 1) === 10 ? cr + 2 : cr + 1;
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
cut = nl;
|
|
302
|
+
next = nl + 1;
|
|
303
|
+
}
|
|
304
|
+
this.lineNumber++;
|
|
305
|
+
const piece = chunk.slice(start, cut);
|
|
306
|
+
if (pending.length === 0) {
|
|
307
|
+
yield piece;
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
pending.push(piece);
|
|
311
|
+
const joined = pending.join("");
|
|
312
|
+
pending.length = 0;
|
|
313
|
+
yield joined;
|
|
314
|
+
}
|
|
315
|
+
start = next;
|
|
316
|
+
if (nl >= 0 && nl < next) {
|
|
317
|
+
nl = chunk.indexOf("\n", next);
|
|
318
|
+
}
|
|
319
|
+
if (cr >= 0 && cr < next) {
|
|
320
|
+
cr = chunk.indexOf("\r", next);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (start < end) {
|
|
324
|
+
pending.push(start === 0 ? chunk : chunk.slice(start));
|
|
325
|
+
trailingCr = chunk.charCodeAt(end - 1) === 13;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
if (pending.length > 0) {
|
|
329
|
+
this.lineNumber++;
|
|
330
|
+
const joined = pending.join("");
|
|
331
|
+
yield joined.endsWith("\r") ? joined.slice(0, -1) : joined;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../../src/common/input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List value syntaxes of the text formats (design section 5.1, research note 07 section 2.1):
|
|
3
|
+
* GEXF 1.3 bracket lists `[1, 2, 3]` / `[foo, 'bar baz']`, GEXF 1.2 `liststring` values separated
|
|
4
|
+
* by `|`, `,` or `;` ("an unsafe type"), Gephi and Neo4j `;`-separated arrays. The importer splits
|
|
5
|
+
* the text into item texts with splitListText() and parses each item by the declared item type.
|
|
6
|
+
*/
|
|
7
|
+
/** The list syntaxes an importer or exporter names. */
|
|
8
|
+
export type ListSyntax = "gexf" | "brackets" | "pipe" | "comma" | "semicolon";
|
|
9
|
+
/**
|
|
10
|
+
* Split a list value into its item texts.
|
|
11
|
+
*
|
|
12
|
+
* - "gexf": a bracketed text `[a, b]` is parsed with single or double quotes around items that
|
|
13
|
+
* contain commas; otherwise the 1.2 rule applies: the text is split on `|` when it contains one,
|
|
14
|
+
* else on `,` when it contains one, else on `;` when it contains one, else it is one item.
|
|
15
|
+
* - "brackets": bracketed only; an unbracketed text is one item.
|
|
16
|
+
* - "pipe" / "comma" / "semicolon": split on that separator.
|
|
17
|
+
*
|
|
18
|
+
* Items are trimmed; an empty text (or `[]`) is an empty list; an empty item between separators
|
|
19
|
+
* is kept as an empty string.
|
|
20
|
+
* @param text - the value text
|
|
21
|
+
* @param syntax - the syntax
|
|
22
|
+
* @returns the item texts
|
|
23
|
+
*/
|
|
24
|
+
export declare function splitListText(text: string, syntax: ListSyntax): string[];
|
|
25
|
+
/**
|
|
26
|
+
* Join item texts into a list value of one syntax, the inverse of splitListText() for the exporters.
|
|
27
|
+
* Bracket syntaxes quote an item that contains a comma, a bracket or a quote (with double quotes,
|
|
28
|
+
* a double quote inside doubled); separator syntaxes cannot escape and leave items as they are.
|
|
29
|
+
* @param items - the item texts
|
|
30
|
+
* @param syntax - the syntax; "gexf" writes the 1.3 bracket form
|
|
31
|
+
* @returns the list text
|
|
32
|
+
*/
|
|
33
|
+
export declare function joinListText(items: readonly string[], syntax: ListSyntax): string;
|
|
34
|
+
//# sourceMappingURL=lists.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lists.d.ts","sourceRoot":"","sources":["../../../src/common/lists.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,uDAAuD;AACvD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC;AAE9E;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CA6BxE;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAmBjF"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List value syntaxes of the text formats (design section 5.1, research note 07 section 2.1):
|
|
3
|
+
* GEXF 1.3 bracket lists `[1, 2, 3]` / `[foo, 'bar baz']`, GEXF 1.2 `liststring` values separated
|
|
4
|
+
* by `|`, `,` or `;` ("an unsafe type"), Gephi and Neo4j `;`-separated arrays. The importer splits
|
|
5
|
+
* the text into item texts with splitListText() and parses each item by the declared item type.
|
|
6
|
+
*/
|
|
7
|
+
import { GraphFormatError } from "@graphty/graph-format";
|
|
8
|
+
/**
|
|
9
|
+
* Split a list value into its item texts.
|
|
10
|
+
*
|
|
11
|
+
* - "gexf": a bracketed text `[a, b]` is parsed with single or double quotes around items that
|
|
12
|
+
* contain commas; otherwise the 1.2 rule applies: the text is split on `|` when it contains one,
|
|
13
|
+
* else on `,` when it contains one, else on `;` when it contains one, else it is one item.
|
|
14
|
+
* - "brackets": bracketed only; an unbracketed text is one item.
|
|
15
|
+
* - "pipe" / "comma" / "semicolon": split on that separator.
|
|
16
|
+
*
|
|
17
|
+
* Items are trimmed; an empty text (or `[]`) is an empty list; an empty item between separators
|
|
18
|
+
* is kept as an empty string.
|
|
19
|
+
* @param text - the value text
|
|
20
|
+
* @param syntax - the syntax
|
|
21
|
+
* @returns the item texts
|
|
22
|
+
*/
|
|
23
|
+
export function splitListText(text, syntax) {
|
|
24
|
+
const trimmed = text.trim();
|
|
25
|
+
if (trimmed.length === 0) {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
switch (syntax) {
|
|
29
|
+
case "gexf": {
|
|
30
|
+
if (isBracketed(trimmed)) {
|
|
31
|
+
return splitBracketed(trimmed);
|
|
32
|
+
}
|
|
33
|
+
const separator = firstSeparator(trimmed, ["|", ",", ";"]);
|
|
34
|
+
return separator === null ? [trimmed] : splitOn(trimmed, separator);
|
|
35
|
+
}
|
|
36
|
+
case "brackets":
|
|
37
|
+
return isBracketed(trimmed) ? splitBracketed(trimmed) : [trimmed];
|
|
38
|
+
case "pipe":
|
|
39
|
+
return splitOn(trimmed, "|");
|
|
40
|
+
case "comma":
|
|
41
|
+
return splitOn(trimmed, ",");
|
|
42
|
+
case "semicolon":
|
|
43
|
+
return splitOn(trimmed, ";");
|
|
44
|
+
default: {
|
|
45
|
+
const name = syntax;
|
|
46
|
+
throw new GraphFormatError("E_UNSUPPORTED", `unknown list syntax ${name}`, {
|
|
47
|
+
option: "listSyntax",
|
|
48
|
+
found: name,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Join item texts into a list value of one syntax, the inverse of splitListText() for the exporters.
|
|
55
|
+
* Bracket syntaxes quote an item that contains a comma, a bracket or a quote (with double quotes,
|
|
56
|
+
* a double quote inside doubled); separator syntaxes cannot escape and leave items as they are.
|
|
57
|
+
* @param items - the item texts
|
|
58
|
+
* @param syntax - the syntax; "gexf" writes the 1.3 bracket form
|
|
59
|
+
* @returns the list text
|
|
60
|
+
*/
|
|
61
|
+
export function joinListText(items, syntax) {
|
|
62
|
+
switch (syntax) {
|
|
63
|
+
case "gexf":
|
|
64
|
+
case "brackets":
|
|
65
|
+
return `[${items.map(quoteBracketItem).join(", ")}]`;
|
|
66
|
+
case "pipe":
|
|
67
|
+
return items.join("|");
|
|
68
|
+
case "comma":
|
|
69
|
+
return items.join(",");
|
|
70
|
+
case "semicolon":
|
|
71
|
+
return items.join(";");
|
|
72
|
+
default: {
|
|
73
|
+
const name = syntax;
|
|
74
|
+
throw new GraphFormatError("E_UNSUPPORTED", `unknown list syntax ${name}`, {
|
|
75
|
+
option: "listSyntax",
|
|
76
|
+
found: name,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Whether a trimmed text is `[...]`.
|
|
83
|
+
* @param text - the trimmed text
|
|
84
|
+
* @returns true when bracketed
|
|
85
|
+
*/
|
|
86
|
+
function isBracketed(text) {
|
|
87
|
+
return text.length >= 2 && text.startsWith("[") && text.endsWith("]");
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The first of several separators that occurs in a text.
|
|
91
|
+
* @param text - the text
|
|
92
|
+
* @param candidates - separators in priority order
|
|
93
|
+
* @returns the first candidate found, or null
|
|
94
|
+
*/
|
|
95
|
+
function firstSeparator(text, candidates) {
|
|
96
|
+
for (const candidate of candidates) {
|
|
97
|
+
if (text.includes(candidate)) {
|
|
98
|
+
return candidate;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Split on a separator and trim every item.
|
|
105
|
+
* @param text - the text
|
|
106
|
+
* @param separator - the separator
|
|
107
|
+
* @returns the trimmed items
|
|
108
|
+
*/
|
|
109
|
+
function splitOn(text, separator) {
|
|
110
|
+
return text.split(separator).map((item) => item.trim());
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Parse the inside of a bracketed list: comma-separated items, each optionally wrapped in single
|
|
114
|
+
* or double quotes (a doubled quote inside a quoted item is one quote).
|
|
115
|
+
* @param text - the bracketed text
|
|
116
|
+
* @returns the items
|
|
117
|
+
*/
|
|
118
|
+
function splitBracketed(text) {
|
|
119
|
+
const inner = text.slice(1, -1);
|
|
120
|
+
const items = [];
|
|
121
|
+
const n = inner.length;
|
|
122
|
+
if (inner.trim().length === 0) {
|
|
123
|
+
return items;
|
|
124
|
+
}
|
|
125
|
+
let i = 0;
|
|
126
|
+
for (;;) {
|
|
127
|
+
while (i < n && isSpace(inner.charCodeAt(i))) {
|
|
128
|
+
i++;
|
|
129
|
+
}
|
|
130
|
+
let item = "";
|
|
131
|
+
if (i < n && (inner[i] === '"' || inner[i] === "'")) {
|
|
132
|
+
const quote = inner[i];
|
|
133
|
+
i++;
|
|
134
|
+
while (i < n) {
|
|
135
|
+
if (inner[i] === quote) {
|
|
136
|
+
if (inner[i + 1] === quote) {
|
|
137
|
+
item += quote;
|
|
138
|
+
i += 2;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
i++;
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
item += inner[i];
|
|
145
|
+
i++;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// unquoted text, or text after a closing quote that is not a separator, runs to the next comma
|
|
149
|
+
let end = inner.indexOf(",", i);
|
|
150
|
+
if (end < 0) {
|
|
151
|
+
end = n;
|
|
152
|
+
}
|
|
153
|
+
item += inner.slice(i, end).trim();
|
|
154
|
+
items.push(item);
|
|
155
|
+
i = end;
|
|
156
|
+
if (i >= n) {
|
|
157
|
+
return items;
|
|
158
|
+
}
|
|
159
|
+
i++;
|
|
160
|
+
if (inner.slice(i).trim().length === 0) {
|
|
161
|
+
items.push("");
|
|
162
|
+
return items;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Whether a char code is ASCII whitespace.
|
|
168
|
+
* @param c - the char code
|
|
169
|
+
* @returns true for space, tab, CR, LF
|
|
170
|
+
*/
|
|
171
|
+
function isSpace(c) {
|
|
172
|
+
return c === 32 || c === 9 || c === 13 || c === 10;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Quote one item for a bracket list when it needs it.
|
|
176
|
+
* @param item - the item text
|
|
177
|
+
* @returns the item, quoted when it contains a comma, a bracket, a quote or surrounding whitespace
|
|
178
|
+
*/
|
|
179
|
+
function quoteBracketItem(item) {
|
|
180
|
+
if (item.length === 0 || /[,[\]"']/.test(item) || item !== item.trim()) {
|
|
181
|
+
return `"${item.replace(/"/g, '""')}"`;
|
|
182
|
+
}
|
|
183
|
+
return item;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=lists.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lists.js","sourceRoot":"","sources":["../../../src/common/lists.ts"],"names":[],"mappings":"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"}
|