@graphty/graph-io 0.3.48 → 0.3.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{approximations-C2riR4NT.js → approximations-Bzn3L-je.js} +2 -2
- package/dist/chunks/{approximations-C2riR4NT.js.map → approximations-Bzn3L-je.js.map} +1 -1
- package/dist/chunks/bends-BGXjv_U4.js +129 -0
- package/dist/chunks/bends-BGXjv_U4.js.map +1 -0
- package/dist/chunks/{block-Cu22ewuS.js → block-iptrlMBb.js} +906 -164
- package/dist/chunks/block-iptrlMBb.js.map +1 -0
- package/dist/chunks/choose-CczZJaX_.js +717 -0
- package/dist/chunks/choose-CczZJaX_.js.map +1 -0
- package/dist/chunks/{codes-CV_Bhcyi.js → codes-BE2xir2k.js} +6 -2
- package/dist/chunks/codes-BE2xir2k.js.map +1 -0
- package/dist/chunks/{constants-D0LqcsLJ.js → constants-CKkYLPtt.js} +2 -2
- package/dist/chunks/{constants-D0LqcsLJ.js.map → constants-CKkYLPtt.js.map} +1 -1
- package/dist/chunks/{context-cgmmOxZ2.js → context-C3p0RQxR.js} +5 -4
- package/dist/chunks/{context-cgmmOxZ2.js.map → context-C3p0RQxR.js.map} +1 -1
- package/dist/chunks/{convert-BcQ8_jMo.js → convert-Ct2zelbQ.js} +7 -2
- package/dist/chunks/convert-Ct2zelbQ.js.map +1 -0
- package/dist/chunks/{credentials-BiQsnMTb.js → credentials-DXHx7nwR.js} +16 -14
- package/dist/chunks/credentials-DXHx7nwR.js.map +1 -0
- package/dist/chunks/{cx-export-BEeF6ymo.js → cx-export-Bt6NoqTQ.js} +3 -3
- package/dist/chunks/{cx-export-BEeF6ymo.js.map → cx-export-Bt6NoqTQ.js.map} +1 -1
- package/dist/chunks/descriptor-B28U25x4.js +60 -0
- package/dist/chunks/descriptor-B28U25x4.js.map +1 -0
- package/dist/chunks/{descriptor-BJ-W0Jd-.js → descriptor-DLA5kINx.js} +7 -2
- package/dist/chunks/descriptor-DLA5kINx.js.map +1 -0
- package/dist/chunks/{emit-CD8xnY8s.js → emit-BwHQkZle.js} +1660 -133
- package/dist/chunks/emit-BwHQkZle.js.map +1 -0
- package/dist/chunks/{escape-DH2Egt-l.js → escape-CuCIzNMB.js} +8 -8
- package/dist/chunks/{escape-DH2Egt-l.js.map → escape-CuCIzNMB.js.map} +1 -1
- package/dist/chunks/{export-CZ7VRm4I.js → export-Cha4dRFz.js} +45 -387
- package/dist/chunks/export-Cha4dRFz.js.map +1 -0
- package/dist/chunks/{exporter-Dcw7Ldtq.js → exporter-BP6otMO6.js} +6 -6
- package/dist/chunks/{exporter-Dcw7Ldtq.js.map → exporter-BP6otMO6.js.map} +1 -1
- package/dist/chunks/{exporter-bxxjOrDZ.js → exporter-D2CETOMK.js} +1222 -156
- package/dist/chunks/exporter-D2CETOMK.js.map +1 -0
- package/dist/chunks/{exporter-BIdaoIgh.js → exporter-D9yMtocA.js} +7 -7
- package/dist/chunks/{exporter-BIdaoIgh.js.map → exporter-D9yMtocA.js.map} +1 -1
- package/dist/chunks/{exporter-DtVU80Fa.js → exporter-_jrBTnos.js} +9 -8
- package/dist/chunks/{exporter-DtVU80Fa.js.map → exporter-_jrBTnos.js.map} +1 -1
- package/dist/chunks/{exporter-ChjL5fmP.js → exporter-nDfxIK5D.js} +9 -8
- package/dist/chunks/{exporter-ChjL5fmP.js.map → exporter-nDfxIK5D.js.map} +1 -1
- package/dist/chunks/format-BXiAb-1h.js +408 -0
- package/dist/chunks/format-BXiAb-1h.js.map +1 -0
- package/dist/chunks/{generic-CP6YD34u.js → generic-ymWCETAJ.js} +387 -31
- package/dist/chunks/generic-ymWCETAJ.js.map +1 -0
- package/dist/chunks/{importer-e3huMZbm.js → importer-B92x1xY5.js} +14 -10
- package/dist/chunks/importer-B92x1xY5.js.map +1 -0
- package/dist/chunks/{importer-B87_fmVx.js → importer-CT9mJ1nn.js} +326 -84
- package/dist/chunks/importer-CT9mJ1nn.js.map +1 -0
- package/dist/chunks/{importer-CB_zV5_L.js → importer-DaLTjbds.js} +116 -1102
- package/dist/chunks/importer-DaLTjbds.js.map +1 -0
- package/dist/chunks/{importer-DPZDN40-.js → importer-GREKMdIf.js} +25 -17
- package/dist/chunks/importer-GREKMdIf.js.map +1 -0
- package/dist/chunks/{importer-Bji2MeWr.js → importer-PqaaKKnY.js} +13 -10
- package/dist/chunks/{importer-Bji2MeWr.js.map → importer-PqaaKKnY.js.map} +1 -1
- package/dist/chunks/{importer-Cyy6UseH.js → importer-Vn5QvmmJ.js} +66 -13
- package/dist/chunks/importer-Vn5QvmmJ.js.map +1 -0
- package/dist/chunks/{importer-CVT-JyDE.js → importer-vRq4h3j5.js} +1469 -356
- package/dist/chunks/importer-vRq4h3j5.js.map +1 -0
- package/dist/chunks/{input-Ccg9I22A.js → input-CAxt_aV-.js} +4 -4
- package/dist/chunks/{input-Ccg9I22A.js.map → input-CAxt_aV-.js.map} +1 -1
- package/dist/chunks/{json-elements-By172SVq.js → json-elements-Cq76WjnZ.js} +4 -4
- package/dist/chunks/{json-elements-By172SVq.js.map → json-elements-Cq76WjnZ.js.map} +1 -1
- package/dist/chunks/{lexicon-u2SI5xcx.js → lexicon-Clf4QIyl.js} +282 -74
- package/dist/chunks/lexicon-Clf4QIyl.js.map +1 -0
- package/dist/chunks/{ontology-export-BwgMyuF0.js → ontology-export-OMo91mb0.js} +4 -4
- package/dist/chunks/{ontology-export-BwgMyuF0.js.map → ontology-export-OMo91mb0.js.map} +1 -1
- package/dist/chunks/{records-Cgvxz-Vx.js → records-NJiYvekn.js} +2 -2
- package/dist/chunks/{records-Cgvxz-Vx.js.map → records-NJiYvekn.js.map} +1 -1
- package/dist/chunks/{report-CgdsL9Hb.js → report-CwMfYa9J.js} +23 -23
- package/dist/chunks/{report-CgdsL9Hb.js.map → report-CwMfYa9J.js.map} +1 -1
- package/dist/chunks/round-trip-Zm3_ivgq.js +79 -0
- package/dist/chunks/round-trip-Zm3_ivgq.js.map +1 -0
- package/dist/chunks/{sigv4-LkAzsLAu.js → sigv4-EokFic1V.js} +5 -5
- package/dist/chunks/sigv4-EokFic1V.js.map +1 -0
- package/dist/chunks/{styles-CaABMoO1.js → styles-CCs214_3.js} +1237 -138
- package/dist/chunks/styles-CCs214_3.js.map +1 -0
- package/dist/chunks/styles-Cm62yyQX.js +2812 -0
- package/dist/chunks/styles-Cm62yyQX.js.map +1 -0
- package/dist/chunks/styles-DPQQIig4.js +1928 -0
- package/dist/chunks/styles-DPQQIig4.js.map +1 -0
- package/dist/chunks/{styles-yed-Cs1nmrjn.js → styles-yed-UMFdNqze.js} +503 -172
- package/dist/chunks/styles-yed-UMFdNqze.js.map +1 -0
- package/dist/chunks/{text-BuKQVMz2.js → text-ystE2bYi.js} +2 -2
- package/dist/chunks/{text-BuKQVMz2.js.map → text-ystE2bYi.js.map} +1 -1
- package/dist/csv.js +7 -7
- package/dist/cx.js +2 -2
- package/dist/cx2.js +2 -2
- package/dist/cys.js +1 -1
- package/dist/dot.js +5 -4
- package/dist/dot.js.map +1 -1
- package/dist/gexf.js +42 -12
- package/dist/gexf.js.map +1 -1
- package/dist/gml.js +847 -193
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +232 -220
- package/dist/graph-io.js.map +1 -1
- package/dist/graphml.js +3 -3
- package/dist/json.js +3 -2
- package/dist/neo4j.js +6 -6
- package/dist/obo.js +1 -1
- package/dist/pajek.js +1 -1
- package/dist/positions.js +45 -3
- package/dist/positions.js.map +1 -1
- package/dist/sources-cypher.js +138 -23
- package/dist/sources-cypher.js.map +1 -1
- package/dist/sources-ndex.js +2 -2
- package/dist/sources-rest.js +16 -6
- package/dist/sources-rest.js.map +1 -1
- package/dist/sources-sparql.d.ts +1 -0
- package/dist/sources-sparql.js +405 -0
- package/dist/sources-sparql.js.map +1 -0
- package/dist/src/formats/cx/importer.d.ts.map +1 -1
- package/dist/src/formats/cx/importer.js +5 -1
- package/dist/src/formats/cx/importer.js.map +1 -1
- package/dist/src/formats/cx/styles.d.ts +24 -1
- package/dist/src/formats/cx/styles.d.ts.map +1 -1
- package/dist/src/formats/cx/styles.js +117 -11
- package/dist/src/formats/cx/styles.js.map +1 -1
- package/dist/src/formats/cx2/importer.d.ts.map +1 -1
- package/dist/src/formats/cx2/importer.js +1 -0
- package/dist/src/formats/cx2/importer.js.map +1 -1
- package/dist/src/formats/cx2/styles.d.ts.map +1 -1
- package/dist/src/formats/cx2/styles.js +3 -1
- package/dist/src/formats/cx2/styles.js.map +1 -1
- package/dist/src/formats/cys/importer.d.ts.map +1 -1
- package/dist/src/formats/cys/importer.js +1 -0
- package/dist/src/formats/cys/importer.js.map +1 -1
- package/dist/src/formats/cys/styles.d.ts +2 -0
- package/dist/src/formats/cys/styles.d.ts.map +1 -1
- package/dist/src/formats/cys/styles.js +15 -7
- package/dist/src/formats/cys/styles.js.map +1 -1
- package/dist/src/formats/dot/drawing.d.ts +98 -0
- package/dist/src/formats/dot/drawing.d.ts.map +1 -0
- package/dist/src/formats/dot/drawing.js +734 -0
- package/dist/src/formats/dot/drawing.js.map +1 -0
- package/dist/src/formats/dot/importer.d.ts.map +1 -1
- package/dist/src/formats/dot/importer.js +108 -31
- package/dist/src/formats/dot/importer.js.map +1 -1
- package/dist/src/formats/dot/label-places.d.ts +34 -0
- package/dist/src/formats/dot/label-places.d.ts.map +1 -0
- package/dist/src/formats/dot/label-places.js +179 -0
- package/dist/src/formats/dot/label-places.js.map +1 -0
- package/dist/src/formats/dot/record.d.ts +50 -0
- package/dist/src/formats/dot/record.d.ts.map +1 -0
- package/dist/src/formats/dot/record.js +275 -0
- package/dist/src/formats/dot/record.js.map +1 -0
- package/dist/src/formats/dot/styles.d.ts +62 -2
- package/dist/src/formats/dot/styles.d.ts.map +1 -1
- package/dist/src/formats/dot/styles.js +1454 -119
- package/dist/src/formats/dot/styles.js.map +1 -1
- package/dist/src/formats/gexf/dialog-metrics.d.ts +15 -0
- package/dist/src/formats/gexf/dialog-metrics.d.ts.map +1 -0
- package/dist/src/formats/gexf/dialog-metrics.js +59 -0
- package/dist/src/formats/gexf/dialog-metrics.js.map +1 -0
- package/dist/src/formats/gexf/importer.d.ts +7 -0
- package/dist/src/formats/gexf/importer.d.ts.map +1 -1
- package/dist/src/formats/gexf/importer.js +41 -5
- package/dist/src/formats/gexf/importer.js.map +1 -1
- package/dist/src/formats/gexf/preview.d.ts +77 -0
- package/dist/src/formats/gexf/preview.d.ts.map +1 -0
- package/dist/src/formats/gexf/preview.js +191 -0
- package/dist/src/formats/gexf/preview.js.map +1 -0
- package/dist/src/formats/gexf/schema.d.ts.map +1 -1
- package/dist/src/formats/gexf/schema.js +2 -1
- package/dist/src/formats/gexf/schema.js.map +1 -1
- package/dist/src/formats/gexf/styles.d.ts +58 -31
- package/dist/src/formats/gexf/styles.d.ts.map +1 -1
- package/dist/src/formats/gexf/styles.js +848 -225
- package/dist/src/formats/gexf/styles.js.map +1 -1
- package/dist/src/formats/gml/importer.d.ts +5 -2
- package/dist/src/formats/gml/importer.d.ts.map +1 -1
- package/dist/src/formats/gml/importer.js +258 -71
- package/dist/src/formats/gml/importer.js.map +1 -1
- package/dist/src/formats/gml/index.d.ts +1 -1
- package/dist/src/formats/gml/index.d.ts.map +1 -1
- package/dist/src/formats/gml/index.js +1 -1
- package/dist/src/formats/gml/index.js.map +1 -1
- package/dist/src/formats/gml/positions.d.ts +7 -0
- package/dist/src/formats/gml/positions.d.ts.map +1 -1
- package/dist/src/formats/gml/positions.js +29 -7
- package/dist/src/formats/gml/positions.js.map +1 -1
- package/dist/src/formats/gml/styles.d.ts.map +1 -1
- package/dist/src/formats/gml/styles.js +753 -101
- package/dist/src/formats/gml/styles.js.map +1 -1
- package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-plain.js +6 -10
- package/dist/src/formats/graphml/styles-plain.js.map +1 -1
- package/dist/src/formats/graphml/styles-yed.d.ts +21 -15
- package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-yed.js +692 -161
- package/dist/src/formats/graphml/styles-yed.js.map +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.js +429 -64
- package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
- package/dist/src/formats/graphml/yfiles.d.ts +3 -3
- package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
- package/dist/src/formats/graphml/yfiles.js +16 -6
- package/dist/src/formats/graphml/yfiles.js.map +1 -1
- package/dist/src/formats/json/dialect.d.ts +3 -2
- package/dist/src/formats/json/dialect.d.ts.map +1 -1
- package/dist/src/formats/json/dialect.js +39 -5
- package/dist/src/formats/json/dialect.js.map +1 -1
- package/dist/src/formats/json/importer.d.ts +13 -2
- package/dist/src/formats/json/importer.d.ts.map +1 -1
- package/dist/src/formats/json/importer.js +42 -6
- package/dist/src/formats/json/importer.js.map +1 -1
- package/dist/src/formats/json/index.d.ts +1 -1
- package/dist/src/formats/json/index.d.ts.map +1 -1
- package/dist/src/formats/json/index.js +1 -1
- package/dist/src/formats/json/index.js.map +1 -1
- package/dist/src/formats/json/positions.d.ts +5 -2
- package/dist/src/formats/json/positions.d.ts.map +1 -1
- package/dist/src/formats/json/positions.js +20 -4
- package/dist/src/formats/json/positions.js.map +1 -1
- package/dist/src/formats/json/styles.d.ts +12 -1
- package/dist/src/formats/json/styles.d.ts.map +1 -1
- package/dist/src/formats/json/styles.js +1755 -136
- package/dist/src/formats/json/styles.js.map +1 -1
- package/dist/src/formats/pajek/draw.d.ts +96 -0
- package/dist/src/formats/pajek/draw.d.ts.map +1 -0
- package/dist/src/formats/pajek/draw.js +372 -0
- package/dist/src/formats/pajek/draw.js.map +1 -0
- package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
- package/dist/src/formats/pajek/exporter.js +70 -51
- package/dist/src/formats/pajek/exporter.js.map +1 -1
- package/dist/src/formats/pajek/importer.d.ts +9 -0
- package/dist/src/formats/pajek/importer.d.ts.map +1 -1
- package/dist/src/formats/pajek/importer.js +233 -102
- package/dist/src/formats/pajek/importer.js.map +1 -1
- package/dist/src/formats/pajek/index.d.ts +1 -0
- package/dist/src/formats/pajek/index.d.ts.map +1 -1
- package/dist/src/formats/pajek/index.js.map +1 -1
- package/dist/src/formats/pajek/styles.d.ts +15 -7
- package/dist/src/formats/pajek/styles.d.ts.map +1 -1
- package/dist/src/formats/pajek/styles.js +1278 -114
- package/dist/src/formats/pajek/styles.js.map +1 -1
- package/dist/src/formats/pajek/syntax.d.ts +10 -1
- package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
- package/dist/src/formats/pajek/syntax.js +26 -2
- package/dist/src/formats/pajek/syntax.js.map +1 -1
- package/dist/src/formats/xgmml/emit.d.ts +1 -0
- package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
- package/dist/src/formats/xgmml/emit.js +65 -5
- package/dist/src/formats/xgmml/emit.js.map +1 -1
- package/dist/src/formats/xgmml/styles.d.ts +23 -3
- package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
- package/dist/src/formats/xgmml/styles.js +277 -60
- package/dist/src/formats/xgmml/styles.js.map +1 -1
- package/dist/src/index.d.ts +4 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/positions/convert.d.ts.map +1 -1
- package/dist/src/positions/convert.js +11 -1
- package/dist/src/positions/convert.js.map +1 -1
- package/dist/src/positions/extract.d.ts.map +1 -1
- package/dist/src/positions/extract.js +53 -1
- package/dist/src/positions/extract.js.map +1 -1
- package/dist/src/positions/index.d.ts +1 -1
- package/dist/src/positions/index.d.ts.map +1 -1
- package/dist/src/positions/types.d.ts +59 -0
- package/dist/src/positions/types.d.ts.map +1 -1
- package/dist/src/sources/builtins.d.ts +1 -1
- package/dist/src/sources/builtins.d.ts.map +1 -1
- package/dist/src/sources/builtins.js +8 -2
- package/dist/src/sources/builtins.js.map +1 -1
- package/dist/src/sources/context.d.ts.map +1 -1
- package/dist/src/sources/context.js +1 -0
- package/dist/src/sources/context.js.map +1 -1
- package/dist/src/sources/cypher/descriptor.d.ts.map +1 -1
- package/dist/src/sources/cypher/descriptor.js +5 -0
- package/dist/src/sources/cypher/descriptor.js.map +1 -1
- package/dist/src/sources/cypher/index.d.ts.map +1 -1
- package/dist/src/sources/cypher/index.js +124 -18
- package/dist/src/sources/cypher/index.js.map +1 -1
- package/dist/src/sources/cypher/params.d.ts +1 -1
- package/dist/src/sources/cypher/params.d.ts.map +1 -1
- package/dist/src/sources/cypher/query-builder.d.ts +17 -0
- package/dist/src/sources/cypher/query-builder.d.ts.map +1 -1
- package/dist/src/sources/cypher/query-builder.js +31 -0
- package/dist/src/sources/cypher/query-builder.js.map +1 -1
- package/dist/src/sources/ids.d.ts +5 -0
- package/dist/src/sources/ids.d.ts.map +1 -1
- package/dist/src/sources/ids.js +5 -0
- package/dist/src/sources/ids.js.map +1 -1
- package/dist/src/sources/params.d.ts +3 -0
- package/dist/src/sources/params.d.ts.map +1 -1
- package/dist/src/sources/rest/descriptor.d.ts.map +1 -1
- package/dist/src/sources/rest/descriptor.js +5 -0
- package/dist/src/sources/rest/descriptor.js.map +1 -1
- package/dist/src/sources/rest/source.d.ts.map +1 -1
- package/dist/src/sources/rest/source.js +15 -0
- package/dist/src/sources/rest/source.js.map +1 -1
- package/dist/src/sources/sigv4.d.ts +5 -3
- package/dist/src/sources/sigv4.d.ts.map +1 -1
- package/dist/src/sources/sigv4.js +6 -4
- package/dist/src/sources/sigv4.js.map +1 -1
- package/dist/src/sources/sparql/descriptor.d.ts +10 -0
- package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
- package/dist/src/sources/sparql/descriptor.js +64 -0
- package/dist/src/sources/sparql/descriptor.js.map +1 -0
- package/dist/src/sources/sparql/index.d.ts +28 -0
- package/dist/src/sources/sparql/index.d.ts.map +1 -0
- package/dist/src/sources/sparql/index.js +314 -0
- package/dist/src/sources/sparql/index.js.map +1 -0
- package/dist/src/sources/sparql/ntriples.d.ts +69 -0
- package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
- package/dist/src/sources/sparql/ntriples.js +180 -0
- package/dist/src/sources/sparql/ntriples.js.map +1 -0
- package/dist/src/sources/sparql/params.d.ts +27 -0
- package/dist/src/sources/sparql/params.d.ts.map +1 -0
- package/dist/src/sources/sparql/params.js +5 -0
- package/dist/src/sources/sparql/params.js.map +1 -0
- package/dist/src/sources/sparql/query.d.ts +72 -0
- package/dist/src/sources/sparql/query.d.ts.map +1 -0
- package/dist/src/sources/sparql/query.js +113 -0
- package/dist/src/sources/sparql/query.js.map +1 -0
- package/dist/src/sources/types.d.ts +31 -0
- package/dist/src/sources/types.d.ts.map +1 -1
- package/dist/src/styles/annotations.d.ts +61 -5
- package/dist/src/styles/annotations.d.ts.map +1 -1
- package/dist/src/styles/annotations.js +130 -22
- package/dist/src/styles/annotations.js.map +1 -1
- package/dist/src/styles/canon/bends.d.ts +46 -0
- package/dist/src/styles/canon/bends.d.ts.map +1 -1
- package/dist/src/styles/canon/bends.js +123 -0
- package/dist/src/styles/canon/bends.js.map +1 -1
- package/dist/src/styles/canon/color-tables.d.ts +6 -1
- package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
- package/dist/src/styles/canon/color-tables.js +10 -4
- package/dist/src/styles/canon/color-tables.js.map +1 -1
- package/dist/src/styles/canon/color.d.ts +3 -1
- package/dist/src/styles/canon/color.d.ts.map +1 -1
- package/dist/src/styles/canon/color.js +103 -3
- package/dist/src/styles/canon/color.js.map +1 -1
- package/dist/src/styles/canon/enums.d.ts +2 -2
- package/dist/src/styles/canon/enums.d.ts.map +1 -1
- package/dist/src/styles/canon/enums.js +81 -7
- package/dist/src/styles/canon/enums.js.map +1 -1
- package/dist/src/styles/canon/graphviz.d.ts +12 -3
- package/dist/src/styles/canon/graphviz.d.ts.map +1 -1
- package/dist/src/styles/canon/graphviz.js +57 -9
- package/dist/src/styles/canon/graphviz.js.map +1 -1
- package/dist/src/styles/canon/number.d.ts +8 -0
- package/dist/src/styles/canon/number.d.ts.map +1 -1
- package/dist/src/styles/canon/number.js +18 -0
- package/dist/src/styles/canon/number.js.map +1 -1
- package/dist/src/styles/canon/text.d.ts +29 -2
- package/dist/src/styles/canon/text.d.ts.map +1 -1
- package/dist/src/styles/canon/text.js +156 -16
- package/dist/src/styles/canon/text.js.map +1 -1
- package/dist/src/styles/codes.d.ts +2 -0
- package/dist/src/styles/codes.d.ts.map +1 -1
- package/dist/src/styles/codes.js +2 -0
- package/dist/src/styles/codes.js.map +1 -1
- package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
- package/dist/src/styles/cyjs/cascade.js +1015 -79
- package/dist/src/styles/cyjs/cascade.js.map +1 -1
- package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
- package/dist/src/styles/cyjs/defaults-table.js +3 -0
- package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
- package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
- package/dist/src/styles/cyjs/emit.js +202 -9
- package/dist/src/styles/cyjs/emit.js.map +1 -1
- package/dist/src/styles/cyjs/face.d.ts +20 -0
- package/dist/src/styles/cyjs/face.d.ts.map +1 -0
- package/dist/src/styles/cyjs/face.js +332 -0
- package/dist/src/styles/cyjs/face.js.map +1 -0
- package/dist/src/styles/cyjs/mappers.d.ts +44 -1
- package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
- package/dist/src/styles/cyjs/mappers.js +461 -26
- package/dist/src/styles/cyjs/mappers.js.map +1 -1
- package/dist/src/styles/cyjs/routes.d.ts +53 -0
- package/dist/src/styles/cyjs/routes.d.ts.map +1 -0
- package/dist/src/styles/cyjs/routes.js +360 -0
- package/dist/src/styles/cyjs/routes.js.map +1 -0
- package/dist/src/styles/cytoscape/charts.d.ts +23 -0
- package/dist/src/styles/cytoscape/charts.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/charts.js +560 -0
- package/dist/src/styles/cytoscape/charts.js.map +1 -0
- package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/emit.js +156 -48
- package/dist/src/styles/cytoscape/emit.js.map +1 -1
- package/dist/src/styles/cytoscape/lexicon.d.ts +91 -3
- package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/lexicon.js +387 -77
- package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
- package/dist/src/styles/cytoscape/mappings.d.ts +30 -0
- package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/mappings.js +92 -0
- package/dist/src/styles/cytoscape/mappings.js.map +1 -1
- package/dist/src/styles/cytoscape/resolve.d.ts +42 -2
- package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/resolve.js +623 -17
- package/dist/src/styles/cytoscape/resolve.js.map +1 -1
- package/dist/src/styles/defaults.d.ts +46 -26
- package/dist/src/styles/defaults.d.ts.map +1 -1
- package/dist/src/styles/defaults.js +308 -71
- package/dist/src/styles/defaults.js.map +1 -1
- package/dist/src/styles/index.d.ts +4 -3
- package/dist/src/styles/index.d.ts.map +1 -1
- package/dist/src/styles/index.js +3 -2
- package/dist/src/styles/index.js.map +1 -1
- package/dist/src/styles/internal.d.ts +1 -0
- package/dist/src/styles/internal.d.ts.map +1 -1
- package/dist/src/styles/internal.js +1 -0
- package/dist/src/styles/internal.js.map +1 -1
- package/dist/src/styles/io/generic.d.ts.map +1 -1
- package/dist/src/styles/io/generic.js +56 -16
- package/dist/src/styles/io/generic.js.map +1 -1
- package/dist/src/styles/io/round-trip.d.ts +56 -0
- package/dist/src/styles/io/round-trip.d.ts.map +1 -0
- package/dist/src/styles/io/round-trip.js +138 -0
- package/dist/src/styles/io/round-trip.js.map +1 -0
- package/dist/src/styles/io/writer.d.ts.map +1 -1
- package/dist/src/styles/io/writer.js +6 -1
- package/dist/src/styles/io/writer.js.map +1 -1
- package/dist/src/styles/notes.d.ts.map +1 -1
- package/dist/src/styles/notes.js +1 -0
- package/dist/src/styles/notes.js.map +1 -1
- package/dist/src/styles/plan/features.d.ts +1 -1
- package/dist/src/styles/plan/features.d.ts.map +1 -1
- package/dist/src/styles/plan/features.js +22 -2
- package/dist/src/styles/plan/features.js.map +1 -1
- package/dist/src/styles/plan/index.d.ts +1 -1
- package/dist/src/styles/plan/index.d.ts.map +1 -1
- package/dist/src/styles/plan/index.js +1 -1
- package/dist/src/styles/plan/index.js.map +1 -1
- package/dist/src/styles/plan/plan.d.ts.map +1 -1
- package/dist/src/styles/plan/plan.js +61 -4
- package/dist/src/styles/plan/plan.js.map +1 -1
- package/dist/src/styles/plan/resolve.d.ts +11 -0
- package/dist/src/styles/plan/resolve.d.ts.map +1 -1
- package/dist/src/styles/plan/resolve.js +40 -4
- package/dist/src/styles/plan/resolve.js.map +1 -1
- package/dist/src/styles/slots.d.ts +14 -0
- package/dist/src/styles/slots.d.ts.map +1 -0
- package/dist/src/styles/slots.js +20 -0
- package/dist/src/styles/slots.js.map +1 -0
- package/dist/src/styles/types.d.ts +622 -6
- package/dist/src/styles/types.d.ts.map +1 -1
- package/dist/src/styles/vocabulary.d.ts +3 -2
- package/dist/src/styles/vocabulary.d.ts.map +1 -1
- package/dist/src/styles/vocabulary.js +203 -0
- package/dist/src/styles/vocabulary.js.map +1 -1
- package/dist/styles.js +30 -239
- package/dist/styles.js.map +1 -1
- package/dist/xgmml.js +3 -3
- package/package.json +27 -7
- package/src/formats/cx/importer.ts +6 -1
- package/src/formats/cx/styles.ts +143 -9
- package/src/formats/cx2/importer.ts +1 -0
- package/src/formats/cx2/styles.ts +3 -1
- package/src/formats/cys/importer.ts +1 -0
- package/src/formats/cys/styles.ts +27 -5
- package/src/formats/dot/drawing.ts +799 -0
- package/src/formats/dot/importer.ts +120 -35
- package/src/formats/dot/label-places.ts +228 -0
- package/src/formats/dot/record.ts +336 -0
- package/src/formats/dot/styles.ts +1654 -153
- package/src/formats/gexf/dialog-metrics.ts +61 -0
- package/src/formats/gexf/importer.ts +50 -5
- package/src/formats/gexf/preview.ts +217 -0
- package/src/formats/gexf/schema.ts +2 -1
- package/src/formats/gexf/styles.ts +1099 -245
- package/src/formats/gml/importer.ts +291 -76
- package/src/formats/gml/index.ts +1 -1
- package/src/formats/gml/positions.ts +29 -7
- package/src/formats/gml/styles.ts +851 -109
- package/src/formats/graphml/styles-plain.ts +6 -15
- package/src/formats/graphml/styles-yed.ts +762 -173
- package/src/formats/graphml/styles-yfiles3.ts +485 -63
- package/src/formats/graphml/yfiles.ts +19 -6
- package/src/formats/json/dialect.ts +41 -5
- package/src/formats/json/importer.ts +59 -7
- package/src/formats/json/index.ts +1 -0
- package/src/formats/json/positions.ts +22 -5
- package/src/formats/json/styles.ts +2041 -185
- package/src/formats/pajek/draw.ts +458 -0
- package/src/formats/pajek/exporter.ts +81 -49
- package/src/formats/pajek/importer.ts +278 -103
- package/src/formats/pajek/index.ts +1 -0
- package/src/formats/pajek/styles.ts +1381 -133
- package/src/formats/pajek/syntax.ts +27 -2
- package/src/formats/xgmml/emit.ts +73 -5
- package/src/formats/xgmml/styles.ts +330 -71
- package/src/index.ts +5 -1
- package/src/positions/convert.ts +12 -1
- package/src/positions/extract.ts +55 -1
- package/src/positions/index.ts +1 -0
- package/src/positions/types.ts +60 -0
- package/src/sources/builtins.ts +8 -1
- package/src/sources/context.ts +1 -0
- package/src/sources/cypher/descriptor.ts +7 -1
- package/src/sources/cypher/index.ts +148 -18
- package/src/sources/cypher/params.ts +1 -1
- package/src/sources/cypher/query-builder.ts +33 -0
- package/src/sources/ids.ts +6 -0
- package/src/sources/params.ts +3 -0
- package/src/sources/rest/descriptor.ts +5 -0
- package/src/sources/rest/source.ts +16 -0
- package/src/sources/sigv4.ts +6 -4
- package/src/sources/sparql/descriptor.ts +67 -0
- package/src/sources/sparql/index.ts +356 -0
- package/src/sources/sparql/ntriples.ts +219 -0
- package/src/sources/sparql/params.ts +28 -0
- package/src/sources/sparql/query.ts +162 -0
- package/src/sources/types.ts +35 -0
- package/src/styles/annotations.ts +201 -27
- package/src/styles/canon/bends.ts +137 -0
- package/src/styles/canon/color-tables.ts +10 -4
- package/src/styles/canon/color.ts +105 -3
- package/src/styles/canon/enums.ts +98 -8
- package/src/styles/canon/graphviz.ts +71 -10
- package/src/styles/canon/number.ts +19 -0
- package/src/styles/canon/text.ts +187 -16
- package/src/styles/codes.ts +2 -0
- package/src/styles/cyjs/cascade.ts +1160 -84
- package/src/styles/cyjs/defaults-table.ts +3 -0
- package/src/styles/cyjs/emit.ts +233 -13
- package/src/styles/cyjs/face.ts +372 -0
- package/src/styles/cyjs/mappers.ts +492 -27
- package/src/styles/cyjs/routes.ts +432 -0
- package/src/styles/cytoscape/charts.ts +684 -0
- package/src/styles/cytoscape/emit.ts +170 -48
- package/src/styles/cytoscape/lexicon.ts +431 -78
- package/src/styles/cytoscape/mappings.ts +108 -0
- package/src/styles/cytoscape/resolve.ts +741 -17
- package/src/styles/defaults.ts +417 -108
- package/src/styles/index.ts +5 -0
- package/src/styles/internal.ts +1 -0
- package/src/styles/io/generic.ts +79 -23
- package/src/styles/io/round-trip.ts +202 -0
- package/src/styles/io/writer.ts +6 -1
- package/src/styles/notes.ts +1 -0
- package/src/styles/plan/features.ts +23 -2
- package/src/styles/plan/index.ts +1 -1
- package/src/styles/plan/plan.ts +69 -5
- package/src/styles/plan/resolve.ts +47 -4
- package/src/styles/slots.ts +25 -0
- package/src/styles/types.ts +633 -5
- package/src/styles/vocabulary.ts +211 -2
- package/dist/chunks/block-Cu22ewuS.js.map +0 -1
- package/dist/chunks/choose-Cdx6Enl2.js +0 -57
- package/dist/chunks/choose-Cdx6Enl2.js.map +0 -1
- package/dist/chunks/codes-CV_Bhcyi.js.map +0 -1
- package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
- package/dist/chunks/credentials-BiQsnMTb.js.map +0 -1
- package/dist/chunks/descriptor-BJ-W0Jd-.js.map +0 -1
- package/dist/chunks/emit-CD8xnY8s.js.map +0 -1
- package/dist/chunks/export-CZ7VRm4I.js.map +0 -1
- package/dist/chunks/exporter-bxxjOrDZ.js.map +0 -1
- package/dist/chunks/format-BMS-1Nxb.js +0 -64
- package/dist/chunks/format-BMS-1Nxb.js.map +0 -1
- package/dist/chunks/generic-CP6YD34u.js.map +0 -1
- package/dist/chunks/importer-B87_fmVx.js.map +0 -1
- package/dist/chunks/importer-CB_zV5_L.js.map +0 -1
- package/dist/chunks/importer-CVT-JyDE.js.map +0 -1
- package/dist/chunks/importer-Cyy6UseH.js.map +0 -1
- package/dist/chunks/importer-DPZDN40-.js.map +0 -1
- package/dist/chunks/importer-e3huMZbm.js.map +0 -1
- package/dist/chunks/lexicon-u2SI5xcx.js.map +0 -1
- package/dist/chunks/sigv4-LkAzsLAu.js.map +0 -1
- package/dist/chunks/styles-CaABMoO1.js.map +0 -1
- package/dist/chunks/styles-P_gmFAOi.js +0 -770
- package/dist/chunks/styles-P_gmFAOi.js.map +0 -1
- package/dist/chunks/styles-yed-Cs1nmrjn.js.map +0 -1
- package/dist/chunks/writer-DvHTl36J.js +0 -449
- package/dist/chunks/writer-DvHTl36J.js.map +0 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The advance widths of Java's logical font "Dialog" (DejaVu Sans on the Linux JRE the Gephi oracle runs on), which
|
|
3
|
+
* Gephi measures its node labels with, in thousandths of an em: what Font.getStringBounds gives for one character with
|
|
4
|
+
* fractional metrics on (Temurin JDK 17, Font("Dialog").deriveFont(1000f).getStringBounds). No kerning
|
|
5
|
+
* ("AV" is A + V). Its line box is 1.1640625 em tall (ascent plus descent, no leading).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/** The widths of U+0020 .. U+007E. */
|
|
9
|
+
const ASCII = [
|
|
10
|
+
318, 401, 460, 838, 636, 950, 780, 275, 390, 390, 500, 838, 318, 361, 318, 337, 636, 636, 636, 636, 636, 636, 636,
|
|
11
|
+
636, 636, 636, 337, 337, 838, 838, 838, 531, 1000, 684, 686, 698, 770, 632, 575, 775, 752, 295, 295, 656, 557, 863,
|
|
12
|
+
748, 787, 603, 787, 695, 635, 611, 732, 684, 989, 685, 611, 685, 390, 337, 390, 838, 500, 500, 613, 635, 550, 635,
|
|
13
|
+
615, 352, 635, 634, 278, 278, 579, 278, 974, 634, 612, 635, 635, 411, 521, 392, 634, 592, 818, 592, 592, 525, 636,
|
|
14
|
+
337, 636, 838,
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
/** The widths of U+00A0 .. U+024F (Latin-1 Supplement, Latin Extended-A and -B). */
|
|
18
|
+
const LATIN = [
|
|
19
|
+
318, 401, 636, 636, 636, 636, 337, 500, 500, 1000, 471, 612, 838, 361, 1000, 500, 500, 838, 401, 401, 500, 636, 636,
|
|
20
|
+
318, 500, 401, 471, 612, 969, 969, 969, 531, 684, 684, 684, 684, 684, 684, 974, 698, 632, 632, 632, 632, 295, 295,
|
|
21
|
+
295, 295, 775, 748, 787, 787, 787, 787, 787, 838, 787, 732, 732, 732, 732, 611, 605, 630, 613, 613, 613, 613, 613,
|
|
22
|
+
613, 982, 550, 615, 615, 615, 615, 278, 278, 278, 278, 612, 634, 612, 612, 612, 612, 612, 838, 612, 634, 634, 634,
|
|
23
|
+
634, 592, 635, 592, 684, 613, 684, 613, 684, 613, 698, 550, 698, 550, 698, 550, 698, 550, 770, 635, 775, 635, 632,
|
|
24
|
+
615, 632, 615, 632, 615, 632, 615, 632, 615, 775, 635, 775, 635, 775, 635, 775, 635, 752, 634, 916, 695, 295, 278,
|
|
25
|
+
295, 278, 295, 278, 295, 278, 295, 278, 590, 556, 295, 278, 656, 579, 579, 557, 278, 557, 278, 557, 375, 557, 342,
|
|
26
|
+
562, 284, 748, 634, 748, 634, 748, 634, 813, 748, 634, 787, 612, 787, 612, 787, 612, 1070, 1023, 695, 411, 695, 411,
|
|
27
|
+
695, 411, 635, 521, 635, 521, 635, 521, 635, 521, 611, 392, 611, 392, 611, 392, 732, 634, 732, 634, 732, 634, 732,
|
|
28
|
+
634, 732, 634, 732, 634, 989, 818, 611, 592, 611, 685, 525, 685, 525, 685, 525, 352, 635, 735, 686, 635, 686, 635,
|
|
29
|
+
703, 698, 550, 775, 819, 686, 635, 612, 632, 787, 614, 575, 352, 775, 687, 984, 354, 295, 746, 579, 278, 592, 974,
|
|
30
|
+
748, 634, 787, 913, 612, 949, 759, 652, 635, 695, 635, 521, 632, 336, 392, 611, 392, 611, 858, 634, 764, 721, 744,
|
|
31
|
+
730, 685, 525, 666, 666, 578, 525, 636, 666, 578, 510, 635, 295, 492, 459, 295, 1422, 1299, 1154, 835, 787, 457,
|
|
32
|
+
931, 924, 797, 684, 613, 295, 278, 787, 612, 732, 634, 732, 634, 732, 634, 732, 634, 732, 634, 615, 684, 613, 684,
|
|
33
|
+
613, 974, 982, 775, 635, 775, 635, 656, 579, 787, 612, 787, 612, 666, 578, 278, 1422, 1299, 1154, 775, 635, 1113,
|
|
34
|
+
682, 748, 634, 684, 613, 974, 982, 787, 612, 684, 613, 684, 613, 632, 615, 632, 615, 295, 278, 295, 278, 787, 612,
|
|
35
|
+
787, 612, 695, 411, 695, 411, 732, 634, 732, 634, 635, 521, 611, 392, 627, 521, 752, 634, 735, 838, 698, 610, 685,
|
|
36
|
+
525, 684, 613, 632, 615, 787, 612, 787, 612, 787, 612, 787, 612, 611, 592, 475, 843, 477, 278, 998, 998, 684, 698,
|
|
37
|
+
550, 557, 611, 521, 525, 603, 479, 686, 732, 684, 632, 615, 295, 278, 781, 635, 695, 411, 611, 592,
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
/** How tall Dialog's line box is, in ems: what getStringBounds gives as a string's height. */
|
|
41
|
+
export const DIALOG_LINE_HEIGHT = 1.1640625;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* How wide Dialog draws a text, in ems.
|
|
45
|
+
* @param text - the text
|
|
46
|
+
* @returns its advance width
|
|
47
|
+
*/
|
|
48
|
+
export function dialogWidth(text: string): number {
|
|
49
|
+
let sum = 0;
|
|
50
|
+
for (const ch of text) {
|
|
51
|
+
const c = ch.codePointAt(0) ?? 0;
|
|
52
|
+
// ponytail: a character outside the table (CJK and other scripts Java falls back to another font for) is
|
|
53
|
+
// counted a full em; a measured table per script when a sample needs it
|
|
54
|
+
if (c >= 32 && c < 127) {
|
|
55
|
+
sum += ASCII[c - 32];
|
|
56
|
+
} else {
|
|
57
|
+
sum += c >= 160 && c < 0x250 ? LATIN[c - 160] : 1000;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return sum / 1000;
|
|
61
|
+
}
|
|
@@ -128,6 +128,13 @@ export interface GexfImportOptions extends CommonImportOptions {
|
|
|
128
128
|
* @defaultValue true
|
|
129
129
|
*/
|
|
130
130
|
viz?: boolean | undefined;
|
|
131
|
+
/**
|
|
132
|
+
* The Gephi Preview settings the file is drawn with, by Gephi's own property names and values as Gephi's
|
|
133
|
+
* Preview spells them (`{ "edge.curved": "false", "node.label.avoidOverlap": "false" }`): Gephi keeps them in its
|
|
134
|
+
* project, not in the GEXF, so a file's styles are Gephi's defaults unless they are given here. Read only when
|
|
135
|
+
* the file's styles are read; a property not given keeps Gephi's default.
|
|
136
|
+
*/
|
|
137
|
+
gephiPreview?: Readonly<Record<string, string | number | boolean>> | undefined;
|
|
131
138
|
}
|
|
132
139
|
|
|
133
140
|
/**
|
|
@@ -641,6 +648,9 @@ class GexfReader implements XmlHandler {
|
|
|
641
648
|
/** The text of graphty's `graphty.styles` block, read up to one character past the longest block read. */
|
|
642
649
|
private styleBlock = "";
|
|
643
650
|
|
|
651
|
+
/** The `graphty.styles` block kept for the styles, or null. */
|
|
652
|
+
keptBlock: string | null = null;
|
|
653
|
+
|
|
644
654
|
/** GEXF 1.0 only: nodes added for edges read before `<nodes>`, until their `<node>` declares them. */
|
|
645
655
|
private readonly implicitNodes = new Map<number, NodeId>();
|
|
646
656
|
|
|
@@ -870,6 +880,7 @@ class GexfReader implements XmlHandler {
|
|
|
870
880
|
return;
|
|
871
881
|
case Ctx.StyleBlock:
|
|
872
882
|
this.report.keepForStyles(this.styleBlock);
|
|
883
|
+
this.keptBlock = this.styleBlock;
|
|
873
884
|
this.styleBlock = "";
|
|
874
885
|
return;
|
|
875
886
|
case Ctx.Graph:
|
|
@@ -2841,8 +2852,9 @@ class GexfReader implements XmlHandler {
|
|
|
2841
2852
|
|
|
2842
2853
|
/**
|
|
2843
2854
|
* `<viz:color r g b a hex>` as rgba in 0..1 (design section 5.5: role color, f32 x4). `hex` is read as
|
|
2844
|
-
*
|
|
2845
|
-
*
|
|
2855
|
+
* Gephi reads it (Java's `Color.decode`: `canonVizColor`), and wins over `r` / `g` / `b` when both are written, as Gephi
|
|
2856
|
+
* reads it (`gexf-specimen-node-fills-borders`, `color-hex-and-rgb`); a channel outside 0..255 or an alpha
|
|
2857
|
+
* outside 0..1 is clamped and reported, as Gephi clamps it.
|
|
2846
2858
|
* @param attrs - the element's attributes
|
|
2847
2859
|
* @param name - the element name as written
|
|
2848
2860
|
* @param where - the element's location
|
|
@@ -2851,12 +2863,12 @@ class GexfReader implements XmlHandler {
|
|
|
2851
2863
|
private vizColor(attrs: ReadonlyMap<string, string>, name: string, where: IssueLocation): number[] {
|
|
2852
2864
|
const hex = attrs.get("hex");
|
|
2853
2865
|
let rgba: number[];
|
|
2854
|
-
if (hex !== undefined
|
|
2866
|
+
if (hex !== undefined) {
|
|
2855
2867
|
const c = canonVizColor(hex);
|
|
2856
2868
|
if (c === null) {
|
|
2857
2869
|
throw new GraphFormatError(
|
|
2858
2870
|
"E_COLUMN_TYPE",
|
|
2859
|
-
`viz hex="${hex}" is not a
|
|
2871
|
+
`viz hex="${hex}" is not a color Gephi reads (a #-prefixed hexadecimal, 0x, octal or decimal integer)`,
|
|
2860
2872
|
{ attribute: "hex" },
|
|
2861
2873
|
);
|
|
2862
2874
|
}
|
|
@@ -3104,13 +3116,42 @@ function resolveGexfOptions(options: (GexfImportOptions & CommonImportOptions) |
|
|
|
3104
3116
|
return viz;
|
|
3105
3117
|
}
|
|
3106
3118
|
|
|
3119
|
+
/**
|
|
3120
|
+
* The `gephiPreview` option, each value as text.
|
|
3121
|
+
* @param options - the import options
|
|
3122
|
+
* @returns the settings, or null when none are given
|
|
3123
|
+
*/
|
|
3124
|
+
function resolveGephiPreview(options: GexfImportOptions | undefined): Readonly<Record<string, string>> | null {
|
|
3125
|
+
const preview = options?.gephiPreview;
|
|
3126
|
+
if (preview === undefined) {
|
|
3127
|
+
return null;
|
|
3128
|
+
}
|
|
3129
|
+
const bad = (found: unknown): never => {
|
|
3130
|
+
throw new GraphFormatError("E_UNSUPPORTED", "option gephiPreview: not an object of Preview property values", {
|
|
3131
|
+
option: "gephiPreview",
|
|
3132
|
+
found,
|
|
3133
|
+
});
|
|
3134
|
+
};
|
|
3135
|
+
if (typeof preview !== "object" || preview === null || Array.isArray(preview)) {
|
|
3136
|
+
return bad(preview);
|
|
3137
|
+
}
|
|
3138
|
+
const out: Record<string, string> = {};
|
|
3139
|
+
for (const [name, value] of Object.entries(preview)) {
|
|
3140
|
+
if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
|
|
3141
|
+
return bad(value);
|
|
3142
|
+
}
|
|
3143
|
+
out[name] = String(value);
|
|
3144
|
+
}
|
|
3145
|
+
return out;
|
|
3146
|
+
}
|
|
3147
|
+
|
|
3107
3148
|
/**
|
|
3108
3149
|
* The GEXF importer.
|
|
3109
3150
|
* @category Built-in formats
|
|
3110
3151
|
*/
|
|
3111
3152
|
export const gexfImporter: GraphImporter<GexfImportOptions> = Object.freeze({
|
|
3112
3153
|
format: GEXF_FORMAT,
|
|
3113
|
-
options: Object.freeze(["viz"]),
|
|
3154
|
+
options: Object.freeze(["viz", "gephiPreview"]),
|
|
3114
3155
|
extensions: Object.freeze([".gexf"]),
|
|
3115
3156
|
mimeTypes: Object.freeze(["application/gexf+xml", "application/xml", "text/xml"]),
|
|
3116
3157
|
sniff: sniffGexf,
|
|
@@ -3156,6 +3197,10 @@ export const gexfImporter: GraphImporter<GexfImportOptions> = Object.freeze({
|
|
|
3156
3197
|
throw err;
|
|
3157
3198
|
}
|
|
3158
3199
|
reader.finish();
|
|
3200
|
+
const preview = resolveGephiPreview(options);
|
|
3201
|
+
if (preview !== null) {
|
|
3202
|
+
report.keepForStyles({ block: reader.keptBlock, gephiPreview: preview });
|
|
3203
|
+
}
|
|
3159
3204
|
// an abort raised during the last few elements (after the last periodic check) still rejects
|
|
3160
3205
|
throwIfAborted(resolved.signal);
|
|
3161
3206
|
return report.finish();
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gephi's Preview settings: what Gephi keeps in its project, not in a GEXF file, and how each one changes the
|
|
3
|
+
* drawing. Every rule here was measured on the Gephi Toolkit 0.11.3's SVG export of the GEXF specimen sheets
|
|
4
|
+
* (`graph-io/test/fidelity/specimens/gexf/pages.json`, one Preview setting per page).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { StyleValue } from "../../styles/types.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Gephi's Preview defaults as the Gephi Toolkit 0.11.3 spells them (a fresh PreviewModel), with node labels shown,
|
|
11
|
+
* as graph-io has always drawn a GEXF file.
|
|
12
|
+
*/
|
|
13
|
+
const GEPHI_PREVIEW: Readonly<Record<string, string>> = Object.freeze({
|
|
14
|
+
"edge.show": "true",
|
|
15
|
+
"edge.thickness": "1.0",
|
|
16
|
+
"edge.use-weight": "true",
|
|
17
|
+
"edge.rescale-weight": "false",
|
|
18
|
+
"edge.rescale-weight.min": "0.4",
|
|
19
|
+
"edge.rescale-weight.max": "8.0",
|
|
20
|
+
"edge.color": "mixed",
|
|
21
|
+
"edge.opacity": "100.0",
|
|
22
|
+
"edge.curved": "true",
|
|
23
|
+
"arrow.size": "3.0",
|
|
24
|
+
"node.border.fixed": "false",
|
|
25
|
+
"node.border.width": "1.0",
|
|
26
|
+
"node.border.color": "darker",
|
|
27
|
+
"node.opacity": "100.0",
|
|
28
|
+
"node.per.node.opacity": "false",
|
|
29
|
+
"node.label.show": "true",
|
|
30
|
+
"node.label.customFont": "false",
|
|
31
|
+
"node.label.font": "Dialog,plain,12",
|
|
32
|
+
"node.label.proportinalSize": "true",
|
|
33
|
+
"node.label.color": "#000000",
|
|
34
|
+
"node.label.shorten": "false",
|
|
35
|
+
"node.label.avoidOverlap": "true",
|
|
36
|
+
"node.label.overlapGridSize": "10",
|
|
37
|
+
"node.label.scale": "1.0",
|
|
38
|
+
"node.label.max-char": "30",
|
|
39
|
+
"node.label.outline.size": "0.0",
|
|
40
|
+
"node.label.outline.color": "#ffffff",
|
|
41
|
+
"node.label.outline.opacity": "80.0",
|
|
42
|
+
"node.label.box": "false",
|
|
43
|
+
"node.label.box.color": "parent",
|
|
44
|
+
"node.label.box.opacity": "100.0",
|
|
45
|
+
"edge.label.show": "false",
|
|
46
|
+
"edge.label.customFont": "false",
|
|
47
|
+
"edge.label.font": "Dialog,plain,10",
|
|
48
|
+
"edge.label.color": "original",
|
|
49
|
+
"edge.label.shorten": "false",
|
|
50
|
+
"edge.label.max-char": "30",
|
|
51
|
+
"edge.label.outline.size": "0.0",
|
|
52
|
+
"edge.label.outline.color": "#ffffff",
|
|
53
|
+
"edge.label.outline.opacity": "80.0",
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
/** A Java Font as Gephi's Preview writes it: `Family,style,size`. */
|
|
57
|
+
export interface GephiFont {
|
|
58
|
+
readonly family: string;
|
|
59
|
+
readonly bold: boolean;
|
|
60
|
+
readonly italic: boolean;
|
|
61
|
+
readonly size: number;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** The Preview settings a drawing was made with: Gephi's defaults under the ones given. */
|
|
65
|
+
export class GephiPreview {
|
|
66
|
+
private readonly values: Readonly<Record<string, string>>;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* The settings: Gephi's defaults under the ones given.
|
|
70
|
+
* @param given - the settings given, by Gephi's property names
|
|
71
|
+
*/
|
|
72
|
+
constructor(given: Readonly<Record<string, string>> = {}) {
|
|
73
|
+
this.values = { ...GEPHI_PREVIEW, ...given };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* A setting's text, trimmed and lower case.
|
|
78
|
+
* @param name - the property
|
|
79
|
+
* @returns the text
|
|
80
|
+
*/
|
|
81
|
+
text(name: string): string {
|
|
82
|
+
return (this.values[name] ?? "").trim().toLowerCase();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* A boolean setting.
|
|
87
|
+
* @param name - the property
|
|
88
|
+
* @returns its value
|
|
89
|
+
*/
|
|
90
|
+
on(name: string): boolean {
|
|
91
|
+
return this.text(name) === "true";
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* A number setting; Gephi's default where the text is not a number.
|
|
96
|
+
* @param name - the property
|
|
97
|
+
* @returns its value
|
|
98
|
+
*/
|
|
99
|
+
num(name: string): number {
|
|
100
|
+
const v = Number(this.text(name));
|
|
101
|
+
return Number.isFinite(v) ? v : Number(GEPHI_PREVIEW[name] ?? 0);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* The font of node or edge labels: the given font when `<target>.label.customFont` is on, else Gephi's.
|
|
106
|
+
* @param target - "node" or "edge"
|
|
107
|
+
* @returns the font
|
|
108
|
+
*/
|
|
109
|
+
font(target: "node" | "edge"): GephiFont {
|
|
110
|
+
const name = `${target}.label.font`;
|
|
111
|
+
const raw = this.on(`${target}.label.customFont`) ? (this.values[name] ?? "") : (GEPHI_PREVIEW[name] ?? "");
|
|
112
|
+
const [family = "Dialog", style = "plain", size = ""] = raw.split(",").map((s) => s.trim());
|
|
113
|
+
const s = style.toLowerCase();
|
|
114
|
+
const pt = Number(size);
|
|
115
|
+
const fallback = target === "node" ? 12 : 10;
|
|
116
|
+
return {
|
|
117
|
+
family,
|
|
118
|
+
bold: s.includes("bold"),
|
|
119
|
+
italic: s.includes("italic"),
|
|
120
|
+
size: Number.isFinite(pt) && pt > 0 ? pt : fallback,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* A label as Gephi's shorten setting cuts it: only a label of at least max-char + 3 characters, to its first max-char
|
|
127
|
+
* characters and "..." (`gexf-specimen-labels-p7`, `-p8`).
|
|
128
|
+
* @param label - the label
|
|
129
|
+
* @param max - max-char
|
|
130
|
+
* @returns the label drawn
|
|
131
|
+
*/
|
|
132
|
+
function shortened(label: string, max: number): string {
|
|
133
|
+
return label.length >= max + 3 ? `${label.slice(0, max)}...` : label;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* A color derived from another as Gephi's DependantColor modes derive it: `darker` halves each channel, `lighter`
|
|
138
|
+
* raises each by half (to 255 at most), `parent` (and `original`) is the color itself, `#rrggbb` is that color.
|
|
139
|
+
* @param mode - the mode, lower case
|
|
140
|
+
* @param parent - the color it derives from, r, g and b 0..255
|
|
141
|
+
* @returns the color as r, g and b, or null for a mode Gephi does not have
|
|
142
|
+
*/
|
|
143
|
+
export function dependantColor(mode: string, parent: readonly number[]): number[] | null {
|
|
144
|
+
switch (mode) {
|
|
145
|
+
case "darker":
|
|
146
|
+
return parent.slice(0, 3).map((v) => Math.floor(v / 2));
|
|
147
|
+
case "lighter":
|
|
148
|
+
return parent.slice(0, 3).map((v) => Math.min(255, Math.floor(v * 1.5)));
|
|
149
|
+
case "parent":
|
|
150
|
+
case "original":
|
|
151
|
+
return parent.slice(0, 3);
|
|
152
|
+
default: {
|
|
153
|
+
const m = /^#([0-9a-f]{6})$/.exec(mode);
|
|
154
|
+
if (m === null) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
const n = Number.parseInt(m[1], 16);
|
|
158
|
+
return [(n >> 16) & 255, (n >> 8) & 255, n & 255];
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* The labels drawn: none when `<target>.label.show` is off, each cut when `<target>.label.shorten` is on, and, unless
|
|
165
|
+
* the file keeps its own values, with its line breaks left out, as Java's `drawString` draws a label on one line with
|
|
166
|
+
* nothing for a break ("line one\nline two" is drawn "line oneline two": Gephi Toolkit 0.11.3's preview and PNG
|
|
167
|
+
* export, `gexf-specimen-labels`).
|
|
168
|
+
* @param labels - each element's label, or undefined when none has one
|
|
169
|
+
* @param preview - the settings
|
|
170
|
+
* @param target - "node" or "edge"
|
|
171
|
+
* @param kept - whether the file keeps its own values (a `graphty.styles` block): its line breaks are drawn
|
|
172
|
+
* @returns the labels drawn, or undefined for none
|
|
173
|
+
*/
|
|
174
|
+
export function drawnLabels(
|
|
175
|
+
labels: readonly (StyleValue | null)[] | undefined,
|
|
176
|
+
preview: GephiPreview,
|
|
177
|
+
target: "node" | "edge",
|
|
178
|
+
kept = false,
|
|
179
|
+
): (StyleValue | null)[] | undefined {
|
|
180
|
+
if (labels === undefined || !preview.on(`${target}.label.show`)) {
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
const max = preview.on(`${target}.label.shorten`) ? preview.num(`${target}.label.max-char`) : Infinity;
|
|
184
|
+
const drawn = (l: string): string => (kept ? l : l.replaceAll(/[\r\n]/g, ""));
|
|
185
|
+
return labels.map((l) => (typeof l === "string" ? drawn(shortened(l, max)) : l));
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Each edge's weight as Gephi draws its thickness: with `edge.use-weight` off, `edge.thickness`; else the weight,
|
|
190
|
+
* rescaled linearly from the smallest and largest drawn weights to `edge.rescale-weight.min` .. `.max` when
|
|
191
|
+
* `edge.rescale-weight` is on, times `edge.thickness` (`gexf-specimen-edges-lines-p8` .. `-p11`).
|
|
192
|
+
* @param weights - each edge's weight
|
|
193
|
+
* @param drawn - whether each edge is drawn
|
|
194
|
+
* @param preview - the settings
|
|
195
|
+
* @returns each edge's thickness
|
|
196
|
+
*/
|
|
197
|
+
export function edgeThickness(weights: readonly number[], drawn: readonly boolean[], preview: GephiPreview): number[] {
|
|
198
|
+
const thickness = preview.num("edge.thickness");
|
|
199
|
+
if (!preview.on("edge.use-weight")) {
|
|
200
|
+
return weights.map(() => thickness);
|
|
201
|
+
}
|
|
202
|
+
if (!preview.on("edge.rescale-weight")) {
|
|
203
|
+
return weights.map((w) => w * thickness);
|
|
204
|
+
}
|
|
205
|
+
// loops, not Math.min(...): a spread of every edge overflows the call stack on a large graph
|
|
206
|
+
let lo = Infinity;
|
|
207
|
+
let hi = -Infinity;
|
|
208
|
+
weights.forEach((w, e) => {
|
|
209
|
+
if (drawn[e]) {
|
|
210
|
+
lo = Math.min(lo, w);
|
|
211
|
+
hi = Math.max(hi, w);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
const min = preview.num("edge.rescale-weight.min");
|
|
215
|
+
const max = preview.num("edge.rescale-weight.max");
|
|
216
|
+
return weights.map((w) => (hi > lo ? min + ((w - lo) / (hi - lo)) * (max - min) : min) * thickness);
|
|
217
|
+
}
|
|
@@ -195,7 +195,8 @@ export const NODE_DECLS: Readonly<Record<keyof typeof NODE_COLUMNS, ColumnDecl>>
|
|
|
195
195
|
mutable: true,
|
|
196
196
|
nullable: true,
|
|
197
197
|
origin: VIZ_ORIGIN,
|
|
198
|
-
|
|
198
|
+
// Gephi puts a node with no viz:position at the origin (gexf-specimen-node-sizes-opacity: position-none)
|
|
199
|
+
extra: { units: "file", originUnplaced: true },
|
|
199
200
|
},
|
|
200
201
|
color: {
|
|
201
202
|
name: NODE_COLUMNS.color,
|