@graphty/graph-io 0.3.48 → 0.3.50
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-BRXsll0T.js} +2 -2
- package/dist/chunks/{approximations-C2riR4NT.js.map → approximations-BRXsll0T.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-yl0f_qLO.js} +931 -164
- package/dist/chunks/block-yl0f_qLO.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-DizmppHy.js} +5 -4
- package/dist/chunks/{context-cgmmOxZ2.js.map → context-DizmppHy.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-CmvJXYeH.js} +67 -16
- package/dist/chunks/credentials-CmvJXYeH.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-Dhez_Cew.js} +11 -2
- package/dist/chunks/descriptor-Dhez_Cew.js.map +1 -0
- package/dist/chunks/{emit-CD8xnY8s.js → emit-7Jkpg0yd.js} +1788 -133
- package/dist/chunks/emit-7Jkpg0yd.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-ChjL5fmP.js → exporter-1Ajud15J.js} +9 -8
- package/dist/chunks/{exporter-ChjL5fmP.js.map → exporter-1Ajud15J.js.map} +1 -1
- package/dist/chunks/{exporter-BIdaoIgh.js → exporter-B6yvL3wy.js} +7 -7
- package/dist/chunks/{exporter-BIdaoIgh.js.map → exporter-B6yvL3wy.js.map} +1 -1
- 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-DtVU80Fa.js → exporter-CA5q8ROP.js} +9 -8
- package/dist/chunks/{exporter-DtVU80Fa.js.map → exporter-CA5q8ROP.js.map} +1 -1
- package/dist/chunks/{exporter-bxxjOrDZ.js → exporter-CQQZFJ2v.js} +1284 -156
- package/dist/chunks/exporter-CQQZFJ2v.js.map +1 -0
- 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-Dc21MAdg.js} +387 -31
- package/dist/chunks/generic-Dc21MAdg.js.map +1 -0
- package/dist/chunks/{importer-B87_fmVx.js → importer-C6NVpCXp.js} +327 -84
- package/dist/chunks/importer-C6NVpCXp.js.map +1 -0
- package/dist/chunks/{importer-DPZDN40-.js → importer-CKFe4q54.js} +25 -17
- package/dist/chunks/importer-CKFe4q54.js.map +1 -0
- package/dist/chunks/{importer-Bji2MeWr.js → importer-CKbUbsJA.js} +13 -10
- package/dist/chunks/{importer-Bji2MeWr.js.map → importer-CKbUbsJA.js.map} +1 -1
- package/dist/chunks/{importer-CB_zV5_L.js → importer-ClCsdgTJ.js} +208 -1104
- package/dist/chunks/importer-ClCsdgTJ.js.map +1 -0
- package/dist/chunks/{importer-e3huMZbm.js → importer-CyVZTrf0.js} +14 -10
- package/dist/chunks/importer-CyVZTrf0.js.map +1 -0
- package/dist/chunks/{importer-CVT-JyDE.js → importer-DgG4v1Ms.js} +1537 -355
- package/dist/chunks/importer-DgG4v1Ms.js.map +1 -0
- package/dist/chunks/{importer-Cyy6UseH.js → importer-asFUrIsj.js} +66 -13
- package/dist/chunks/importer-asFUrIsj.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-IVRq2Uoo.js} +282 -74
- package/dist/chunks/lexicon-IVRq2Uoo.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-Cy3_SHRZ.js +79 -0
- package/dist/chunks/round-trip-Cy3_SHRZ.js.map +1 -0
- package/dist/chunks/{sigv4-LkAzsLAu.js → sigv4-BXwVbza3.js} +5 -5
- package/dist/chunks/sigv4-BXwVbza3.js.map +1 -0
- package/dist/chunks/{styles-CaABMoO1.js → styles-CAVmBLgp.js} +1237 -138
- package/dist/chunks/styles-CAVmBLgp.js.map +1 -0
- package/dist/chunks/styles-CPczw1Jz.js +1928 -0
- package/dist/chunks/styles-CPczw1Jz.js.map +1 -0
- package/dist/chunks/styles-boK6Ln54.js +2847 -0
- package/dist/chunks/styles-boK6Ln54.js.map +1 -0
- package/dist/chunks/{styles-yed-Cs1nmrjn.js → styles-yed-XeFBQ6VS.js} +506 -175
- package/dist/chunks/styles-yed-XeFBQ6VS.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 +8 -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 +848 -194
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +230 -193
- 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 +141 -23
- package/dist/sources-cypher.js.map +1 -1
- package/dist/sources-ndex.js +2 -2
- package/dist/sources-rest.js +32 -6
- package/dist/sources-rest.js.map +1 -1
- package/dist/sources-sparql.d.ts +1 -0
- package/dist/sources-sparql.js +439 -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/exporter.d.ts.map +1 -1
- package/dist/src/formats/dot/exporter.js +34 -2
- package/dist/src/formats/dot/exporter.js.map +1 -1
- package/dist/src/formats/dot/importer.d.ts +6 -1
- package/dist/src/formats/dot/importer.d.ts.map +1 -1
- package/dist/src/formats/dot/importer.js +170 -33
- package/dist/src/formats/dot/importer.js.map +1 -1
- package/dist/src/formats/dot/index.d.ts +3 -1
- package/dist/src/formats/dot/index.d.ts.map +1 -1
- package/dist/src/formats/dot/index.js +2 -1
- package/dist/src/formats/dot/index.js.map +1 -1
- package/dist/src/formats/dot/label-places.d.ts +41 -0
- package/dist/src/formats/dot/label-places.d.ts.map +1 -0
- package/dist/src/formats/dot/label-places.js +185 -0
- package/dist/src/formats/dot/label-places.js.map +1 -0
- package/dist/src/formats/dot/names.d.ts +13 -0
- package/dist/src/formats/dot/names.d.ts.map +1 -1
- package/dist/src/formats/dot/names.js +13 -0
- package/dist/src/formats/dot/names.js.map +1 -1
- 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 +72 -2
- package/dist/src/formats/dot/styles.d.ts.map +1 -1
- package/dist/src/formats/dot/styles.js +1500 -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 +754 -102
- 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 +695 -164
- 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 +431 -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 +1843 -136
- package/dist/src/formats/json/styles.js.map +1 -1
- package/dist/src/formats/pajek/draw.d.ts +104 -0
- package/dist/src/formats/pajek/draw.d.ts.map +1 -0
- package/dist/src/formats/pajek/draw.js +382 -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 +1395 -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 +6 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -5
- 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/credentials.d.ts +50 -1
- package/dist/src/sources/credentials.d.ts.map +1 -1
- package/dist/src/sources/credentials.js +69 -0
- package/dist/src/sources/credentials.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 +125 -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 +9 -0
- package/dist/src/sources/rest/descriptor.js.map +1 -1
- package/dist/src/sources/rest/openalex.d.ts +4 -2
- package/dist/src/sources/rest/openalex.d.ts.map +1 -1
- package/dist/src/sources/rest/openalex.js +4 -2
- package/dist/src/sources/rest/openalex.js.map +1 -1
- package/dist/src/sources/rest/source.d.ts.map +1 -1
- package/dist/src/sources/rest/source.js +38 -0
- package/dist/src/sources/rest/source.js.map +1 -1
- package/dist/src/sources/run.d.ts +2 -0
- package/dist/src/sources/run.d.ts.map +1 -1
- package/dist/src/sources/run.js +30 -3
- package/dist/src/sources/run.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 +327 -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 +73 -0
- package/dist/src/sources/sparql/query.d.ts.map +1 -0
- package/dist/src/sources/sparql/query.js +164 -0
- package/dist/src/sources/sparql/query.js.map +1 -0
- package/dist/src/sources/types.d.ts +60 -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 +89 -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 +1139 -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 +4 -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 +232 -10
- 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 +475 -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 +687 -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 +224 -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/exporter.ts +37 -1
- package/src/formats/dot/importer.ts +192 -36
- package/src/formats/dot/index.ts +3 -1
- package/src/formats/dot/label-places.ts +241 -0
- package/src/formats/dot/names.ts +15 -0
- package/src/formats/dot/record.ts +336 -0
- package/src/formats/dot/styles.ts +1702 -149
- 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 +852 -110
- package/src/formats/graphml/styles-plain.ts +6 -15
- package/src/formats/graphml/styles-yed.ts +765 -176
- package/src/formats/graphml/styles-yfiles3.ts +487 -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 +2123 -171
- package/src/formats/pajek/draw.ts +469 -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 +1506 -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 +12 -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/credentials.ts +90 -1
- package/src/sources/cypher/descriptor.ts +7 -1
- package/src/sources/cypher/index.ts +149 -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 +9 -0
- package/src/sources/rest/openalex.ts +4 -2
- package/src/sources/rest/source.ts +41 -0
- package/src/sources/run.ts +35 -3
- package/src/sources/sigv4.ts +6 -4
- package/src/sources/sparql/descriptor.ts +67 -0
- package/src/sources/sparql/index.ts +371 -0
- package/src/sources/sparql/ntriples.ts +219 -0
- package/src/sources/sparql/params.ts +28 -0
- package/src/sources/sparql/query.ts +216 -0
- package/src/sources/types.ts +68 -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 +107 -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 +1303 -84
- package/src/styles/cyjs/defaults-table.ts +4 -0
- package/src/styles/cyjs/emit.ts +268 -14
- package/src/styles/cyjs/face.ts +372 -0
- package/src/styles/cyjs/mappers.ts +506 -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 +698 -5
- package/src/styles/vocabulary.ts +232 -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
package/dist/gml.js
CHANGED
|
@@ -1,19 +1,60 @@
|
|
|
1
|
-
import { Q as SYNTAX_CODE, p as plural, a as agree, R as ROLE_TAKEN_CODE$1, a2 as WIDENED_CODE$1, P as PRECISION_CODE$1, k as DUPLICATE_NODE_CODE$1, n as MISSING_ENDPOINT_CODE$1, o as MISSING_ID_CODE$1, i as MULTIPLE_GRAPHS_CODE, N as NO_GRAPH_CODE$1, K as ImportReportBuilder, C as COLUMN_RENAMED_CODE, M as MIXED_DIRECTION_CODE, D as DIRECTION_FORCED_CODE, b as DIRECTION_REFUSED_CODE, S as SINK_OPTION_CODE, O as OPTION_IGNORED_CODE, I as ID_MERGED_CODE, W as AMBIGUOUS_GRAPH_NAME_CODE, Y as GRAPH_NOT_FOUND_CODE, s as UNKNOWN_ENCODING_CODE, t as ENCODING_FALLBACK_CODE, u as INVALID_ENCODING_CODE, v as INVALID_UTF8_CODE, y as ELEMENT_ISSUE, z as INPUT_ISSUE } from "./chunks/report-
|
|
1
|
+
import { Q as SYNTAX_CODE, p as plural, a as agree, R as ROLE_TAKEN_CODE$1, a2 as WIDENED_CODE$1, P as PRECISION_CODE$1, k as DUPLICATE_NODE_CODE$1, n as MISSING_ENDPOINT_CODE$1, o as MISSING_ID_CODE$1, i as MULTIPLE_GRAPHS_CODE, N as NO_GRAPH_CODE$1, K as ImportReportBuilder, C as COLUMN_RENAMED_CODE, M as MIXED_DIRECTION_CODE, D as DIRECTION_FORCED_CODE, b as DIRECTION_REFUSED_CODE, S as SINK_OPTION_CODE, O as OPTION_IGNORED_CODE, I as ID_MERGED_CODE, W as AMBIGUOUS_GRAPH_NAME_CODE, Y as GRAPH_NOT_FOUND_CODE, s as UNKNOWN_ENCODING_CODE, t as ENCODING_FALLBACK_CODE, u as INVALID_ENCODING_CODE, v as INVALID_UTF8_CODE, y as ELEMENT_ISSUE, z as INPUT_ISSUE } from "./chunks/report-CwMfYa9J.js";
|
|
2
2
|
import { GraphFormatError, INVALID_INDEX } from "@graphty/graph-format";
|
|
3
|
-
import { c as capabilities, a as checkCapabilities, L as LOSS,
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { c as capabilities, a as checkCapabilities, L as LOSS, z as sanitizeIds, G as countMixedEdges, e as explicitWeights, r as resolveExportOptions, D as DictHeuristic, O as DICT_SAMPLE_ROWS, b as resolveImportOptions, d as reportUnusedOptions, f as reportSinkOptions, h as graphChosen, I as IdCoercer, u as uniqueColumnName, w as weightFromValue, S as reportWeightPrecision, p as parseWeightText, i as declareResolved } from "./chunks/export-Cha4dRFz.js";
|
|
4
|
+
import { p as pairFolding, c as formatInteger, e as formatGmlReal, D as DirectionResolver } from "./chunks/format-BXiAb-1h.js";
|
|
5
|
+
import { k as decodeGmlString, m as quoteGmlString } from "./chunks/escape-CuCIzNMB.js";
|
|
6
6
|
import { j as joinText, e as encodeChunks } from "./chunks/writer-DxjgHwSe.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { C as CYTOSCAPE_LEXICON } from "./chunks/lexicon-
|
|
10
|
-
import { S as StyleApproximations } from "./chunks/approximations-
|
|
11
|
-
import {
|
|
12
|
-
import { r as
|
|
13
|
-
import { i as importChosenGraph } from "./chunks/choose-
|
|
14
|
-
import { r as
|
|
7
|
+
import { n as nodeOffsetsToPoints, b as bendsToPoints, c as canonNodeOffsets, d as canonBends } from "./chunks/bends-BGXjv_U4.js";
|
|
8
|
+
import { A as writeStyleBlock, B as styleBlockLosses, h as StyleNotes, z as styleTag, p as plainCell, m as parseStyleBlock, o as styleFingerprint, f as canonText, c as canonNumber, n as noteAt, b as STYLE_ISSUE, s as scalarText, M as MAX_STYLE_VALUE_LENGTH, i as num6, d as canonColor, a as canonEnum, g as canonSigned, e as colorOpacity, S as STYLE_BLOCK_NAME } from "./chunks/block-yl0f_qLO.js";
|
|
9
|
+
import { j as javaFamily, C as CYTOSCAPE_LEXICON } from "./chunks/lexicon-IVRq2Uoo.js";
|
|
10
|
+
import { S as StyleApproximations } from "./chunks/approximations-BRXsll0T.js";
|
|
11
|
+
import { e as elementValues, t as takeFromBlock } from "./chunks/round-trip-Cy3_SHRZ.js";
|
|
12
|
+
import { m as dataRead, n as graphvizRouteBends, o as graphvizHasNoOutline, p as PERIPHERY_GAP, q as SHAPE_PERIPHERIES, r as graphvizOutline, s as putGlyph, t as graphvizArrowValue } from "./chunks/styles-boK6Ln54.js";
|
|
13
|
+
import { G as GRAPHVIZ_GLYPH_SHAPES, i as importChosenGraph } from "./chunks/choose-CczZJaX_.js";
|
|
14
|
+
import { r as gephiRules } from "./chunks/styles-CPczw1Jz.js";
|
|
15
|
+
import { y as yedValue, a as yedColor, b as yedSpelled, c as yedFontName, Y as YED_SHAPES, d as YED_LINES, v as valueColumns, e as configurationOutline, F as FONT_STYLES, f as YED_ARROWS } from "./chunks/styles-yed-XeFBQ6VS.js";
|
|
15
16
|
import { t as toolOf } from "./chunks/units-XMZFIFe1.js";
|
|
16
|
-
import { m as median } from "./chunks/convert-
|
|
17
|
+
import { m as median } from "./chunks/convert-Ct2zelbQ.js";
|
|
18
|
+
import { r as readText, b as throwIfAborted } from "./chunks/input-CAxt_aV-.js";
|
|
19
|
+
const GRAPHICS_COLUMN = "graphics";
|
|
20
|
+
function gmlPositions(snapshot) {
|
|
21
|
+
if (snapshot.nodes.byRole("position") === null) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const inGraph = snapshot.graph.has("Creator") ? snapshot.graph.value("Creator", 0) : null;
|
|
25
|
+
const gv2gml = writtenByGv2gml(snapshot);
|
|
26
|
+
const graphCreator = typeof inGraph === "string" ? inGraph : null;
|
|
27
|
+
const tool = gv2gml ? "graphviz" : toolOf(snapshot.meta.creator ?? graphCreator);
|
|
28
|
+
return {
|
|
29
|
+
units: "px",
|
|
30
|
+
// a z that is the same on every node collapses to 2D
|
|
31
|
+
sourceDims: 3,
|
|
32
|
+
// gv2gml writes Graphviz's own coordinates, y up
|
|
33
|
+
yAxis: tool === "gephi" || tool === "tulip" || gv2gml ? "up" : "down",
|
|
34
|
+
tool,
|
|
35
|
+
medianNodeSize: graphicsMedian(snapshot, tool === "gephi")
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function writtenByGv2gml(snapshot) {
|
|
39
|
+
if ((snapshot.meta.creator ?? null) !== null || snapshot.graph.has("Creator") || !snapshot.graph.has("version")) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return Number(snapshot.graph.value("version", 0)) === 2;
|
|
43
|
+
}
|
|
44
|
+
function graphicsMedian(snapshot, gephi) {
|
|
45
|
+
const graphics = snapshot.nodes.get(GRAPHICS_COLUMN);
|
|
46
|
+
const sizes = [];
|
|
47
|
+
for (let row = 0; graphics !== null && row < graphics.length; row++) {
|
|
48
|
+
const g = graphics.isSet(row) ? graphics.value(row) : void 0;
|
|
49
|
+
const { w, h, H } = typeof g === "object" && g !== null ? g : {};
|
|
50
|
+
if (gephi && typeof w === "number") {
|
|
51
|
+
sizes.push(2 * w);
|
|
52
|
+
} else if (typeof w === "number" && typeof (h ?? H) === "number") {
|
|
53
|
+
sizes.push((w + Number(h ?? H)) / 2);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return median(sizes);
|
|
57
|
+
}
|
|
17
58
|
const TOKEN_WORD = 0;
|
|
18
59
|
const TOKEN_INT = 1;
|
|
19
60
|
const TOKEN_REAL = 2;
|
|
@@ -450,7 +491,8 @@ const WRITERS = [
|
|
|
450
491
|
vocabulary: "graphlet",
|
|
451
492
|
spelling: "css",
|
|
452
493
|
units: "relative",
|
|
453
|
-
|
|
494
|
+
// Gephi's preview draws node labels as the GEXF reader reads them (formats/gexf/styles.ts)
|
|
495
|
+
labelKey: true
|
|
454
496
|
}
|
|
455
497
|
],
|
|
456
498
|
[
|
|
@@ -471,6 +513,14 @@ const UNKNOWN_WRITER = {
|
|
|
471
513
|
units: "px",
|
|
472
514
|
labelKey: true
|
|
473
515
|
};
|
|
516
|
+
const GV2GML_WRITER = {
|
|
517
|
+
dialect: "graphviz",
|
|
518
|
+
tool: "graphviz",
|
|
519
|
+
vocabulary: "graphviz",
|
|
520
|
+
spelling: "graphviz",
|
|
521
|
+
units: "px",
|
|
522
|
+
labelKey: true
|
|
523
|
+
};
|
|
474
524
|
const GRAPHTY_WRITER = { ...WRITERS[0][1], tool: null };
|
|
475
525
|
const GML_STYLE_BLOCK_KEY = mangleGmlKey(STYLE_BLOCK_NAME);
|
|
476
526
|
const TAG_PREFIX = mangleGmlKey("graphty.style.");
|
|
@@ -487,6 +537,18 @@ function graphText(snapshot, name) {
|
|
|
487
537
|
}
|
|
488
538
|
return typeof v === "number" ? String(v) : null;
|
|
489
539
|
}
|
|
540
|
+
const GML_ANCHORS = new Map([
|
|
541
|
+
...["c", "t", "b", "l", "r", "tl", "tr", "bl", "br"].map((a) => [a, "center"]),
|
|
542
|
+
["n", "top"],
|
|
543
|
+
["s", "bottom"],
|
|
544
|
+
["e", "right"],
|
|
545
|
+
["w", "left"],
|
|
546
|
+
["nw", "top-left"],
|
|
547
|
+
["ne", "top-right"],
|
|
548
|
+
["sw", "bottom-left"],
|
|
549
|
+
["se", "bottom-right"]
|
|
550
|
+
]);
|
|
551
|
+
const YED_NODE_KEYS = ["isGroup", "gid"];
|
|
490
552
|
function writerOf(snapshot) {
|
|
491
553
|
if (snapshot.graph.has(GML_STYLE_BLOCK_KEY)) {
|
|
492
554
|
return GRAPHTY_WRITER;
|
|
@@ -497,7 +559,10 @@ function writerOf(snapshot) {
|
|
|
497
559
|
return writer;
|
|
498
560
|
}
|
|
499
561
|
}
|
|
500
|
-
|
|
562
|
+
if (creator.trim() === "" && (YED_NODE_KEYS.some((k) => snapshot.nodes.has(k)) || snapshot.graph.has("hierarchic"))) {
|
|
563
|
+
return WRITERS[0][1];
|
|
564
|
+
}
|
|
565
|
+
return creator.trim() === "" && writtenByGv2gml(snapshot) ? GV2GML_WRITER : UNKNOWN_WRITER;
|
|
501
566
|
}
|
|
502
567
|
const ARROW_ENDS = /* @__PURE__ */ new Map([
|
|
503
568
|
["none", ["none", "none"]],
|
|
@@ -505,15 +570,49 @@ const ARROW_ENDS = /* @__PURE__ */ new Map([
|
|
|
505
570
|
["first", ["triangle", "none"]],
|
|
506
571
|
["both", ["triangle", "triangle"]]
|
|
507
572
|
]);
|
|
573
|
+
const CYTOSCAPE_GML_SHAPES = /* @__PURE__ */ new Map([
|
|
574
|
+
["ellipse", "ellipse"],
|
|
575
|
+
["round_rectangle", "round-rectangle"],
|
|
576
|
+
["round_rect", "round-rectangle"],
|
|
577
|
+
["rectangle", "rectangle"],
|
|
578
|
+
["rect", "rectangle"],
|
|
579
|
+
["hexagon", "hexagon"],
|
|
580
|
+
["octagon", "octagon"],
|
|
581
|
+
["parallelogram", "parallelogram"],
|
|
582
|
+
["triangle", "triangle"],
|
|
583
|
+
["vee", "vee"],
|
|
584
|
+
["diamond", "diamond"]
|
|
585
|
+
]);
|
|
508
586
|
const OGDF_STROKES = ["none", "solid", "dashed", "dotted", "dash-dot", "dash-dot"];
|
|
587
|
+
const OGDF_STROKE_NAMES = /* @__PURE__ */ new Map([
|
|
588
|
+
["none", "none"],
|
|
589
|
+
["solid", "solid"],
|
|
590
|
+
["dash", "dashed"],
|
|
591
|
+
["dot", "dotted"],
|
|
592
|
+
["dashdot", "dash-dot"],
|
|
593
|
+
["dashdotdot", "dash-dot"]
|
|
594
|
+
]);
|
|
509
595
|
const OGDF_SHAPES = /* @__PURE__ */ new Map([
|
|
510
596
|
["rect", "rectangle"],
|
|
597
|
+
["roundedrect", "round-rectangle"],
|
|
511
598
|
["rhomb", "diamond"],
|
|
512
|
-
["
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
["
|
|
599
|
+
["image", "rectangle"]
|
|
600
|
+
]);
|
|
601
|
+
const OGDF_POLYGONS = /* @__PURE__ */ new Map([
|
|
602
|
+
["triangle", "0,1 0.866,-0.5 -0.866,-0.5"],
|
|
603
|
+
["invtriangle", "0,-1 0.866,0.5 -0.866,0.5"],
|
|
604
|
+
["pentagon", "0,1 0.951,0.309 0.588,-0.809 -0.588,-0.809 -0.951,0.309"],
|
|
605
|
+
["hexagon", "1,0 0.5,0.866 -0.5,0.866 -1,0 -0.5,-0.866 0.5,-0.866"],
|
|
606
|
+
[
|
|
607
|
+
"octagon",
|
|
608
|
+
"0.924,0.383 0.383,0.924 -0.383,0.924 -0.924,0.383 -0.924,-0.383 -0.383,-0.924 0.383,-0.924 0.924,-0.383"
|
|
609
|
+
],
|
|
610
|
+
["trapeze", "-1,-1 1,-1 0.5,1 -0.5,1"],
|
|
611
|
+
["invtrapeze", "-1,1 1,1 0.5,-1 -0.5,-1"],
|
|
612
|
+
["parallelogram", "-1,-1 0.5,-1 1,1 -0.5,1"],
|
|
613
|
+
["invparallelogram", "-1,1 0.5,1 1,-1 -0.5,-1"]
|
|
516
614
|
]);
|
|
615
|
+
const OGDF_REGULAR = /* @__PURE__ */ new Set(["triangle", "invtriangle", "pentagon", "hexagon", "octagon"]);
|
|
517
616
|
const YED_LABEL_KEYS = [
|
|
518
617
|
"outline",
|
|
519
618
|
"autoSizePolicy",
|
|
@@ -557,30 +656,164 @@ function strokeStyle(raw, kind, writer, at) {
|
|
|
557
656
|
return null;
|
|
558
657
|
}
|
|
559
658
|
if (writer.vocabulary === "ogdf") {
|
|
560
|
-
const stroke =
|
|
561
|
-
if (stroke === void 0
|
|
659
|
+
const stroke = ogdfStroke(raw);
|
|
660
|
+
if (stroke === void 0) {
|
|
562
661
|
noteAt(at, STYLE_ISSUE.UNKNOWN_VALUE, sampleOf(raw));
|
|
563
662
|
return null;
|
|
564
663
|
}
|
|
565
|
-
return stroke;
|
|
664
|
+
return stroke === "none" ? null : stroke;
|
|
566
665
|
}
|
|
567
666
|
return canonEnum(kind, raw, writer.spelling, at);
|
|
568
667
|
}
|
|
668
|
+
function ogdfStroke(raw) {
|
|
669
|
+
const text = typeof raw === "string" || typeof raw === "number" ? String(raw).trim() : "";
|
|
670
|
+
return /^\d+$/.test(text) ? OGDF_STROKES[Number(text)] : OGDF_STROKE_NAMES.get(text.toLowerCase());
|
|
671
|
+
}
|
|
672
|
+
function readOgdfShape(raw, writer, put, at) {
|
|
673
|
+
const name = raw.trim().toLowerCase();
|
|
674
|
+
const points = OGDF_POLYGONS.get(name);
|
|
675
|
+
if (points !== void 0) {
|
|
676
|
+
put("shape", "polygon");
|
|
677
|
+
put("shapePoints", points);
|
|
678
|
+
if (OGDF_REGULAR.has(name)) {
|
|
679
|
+
put("shapePointsStretch", false);
|
|
680
|
+
}
|
|
681
|
+
return;
|
|
682
|
+
}
|
|
683
|
+
put("shape", canonEnum("shape", OGDF_SHAPES.get(name) ?? raw, writer.spelling, at("shape")));
|
|
684
|
+
}
|
|
569
685
|
function readNodeGraphics(g, writer, put, at) {
|
|
570
686
|
const v = writer.vocabulary;
|
|
687
|
+
if (v === "graphviz") {
|
|
688
|
+
readGv2gmlNode(g, writer, put, at);
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
571
691
|
readNodeFill(g, writer, put, at);
|
|
572
692
|
readNodeOutline(g, writer, put, at);
|
|
573
693
|
put(
|
|
574
694
|
"borderStyle",
|
|
575
695
|
strokeStyle(v === "ogdf" ? g.stipple : g.outlineStyle, "borderStyle", writer, at("borderStyle"))
|
|
576
696
|
);
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
697
|
+
if (v === "ogdf" && g.stipple !== void 0 && ogdfStroke(g.stipple) === "none") {
|
|
698
|
+
put("borderWidth", 0);
|
|
699
|
+
}
|
|
700
|
+
readNodeSize(g, writer, put, at);
|
|
701
|
+
if (v === "ogdf") {
|
|
702
|
+
readOgdfLabelOffset(g.label, put, at);
|
|
703
|
+
}
|
|
704
|
+
readNodeShape(g, writer, put, at);
|
|
705
|
+
}
|
|
706
|
+
function readNodeSize(g, writer, put, at) {
|
|
707
|
+
if (writer.tool === "gephi") {
|
|
708
|
+
const size = g.w === void 0 ? null : canonNumber(g.w, at("width"));
|
|
709
|
+
put("width", size === null ? null : 2 * size);
|
|
710
|
+
put("height", size === null ? null : 2 * size);
|
|
711
|
+
} else {
|
|
712
|
+
put("width", g.w === void 0 ? null : canonNumber(g.w, at("width")));
|
|
713
|
+
put("height", g.h === void 0 ? null : canonNumber(g.h, at("height")));
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
function readNodeShape(g, writer, put, at) {
|
|
717
|
+
const v = writer.vocabulary;
|
|
718
|
+
if (v === "ogdf" && typeof g.type === "string") {
|
|
719
|
+
readOgdfShape(g.type, writer, put, at);
|
|
720
|
+
} else if (v === "cytoscape" && g.type !== void 0) {
|
|
721
|
+
const name = scalarText(g.type, at("shape"))?.trim().toLowerCase() ?? "";
|
|
722
|
+
const shape = CYTOSCAPE_GML_SHAPES.get(name);
|
|
723
|
+
if (shape === void 0) {
|
|
724
|
+
noteAt(at("shape"), STYLE_ISSUE.UNKNOWN_VALUE, name.slice(0, MAX_STYLE_VALUE_LENGTH));
|
|
725
|
+
}
|
|
726
|
+
put("shape", shape ?? null);
|
|
727
|
+
} else if (g.type !== void 0) {
|
|
728
|
+
put("shape", canonEnum("shape", g.type, writer.spelling, at("shape")));
|
|
582
729
|
} else if (v === "yed" && typeof g.customconfiguration === "string") {
|
|
583
|
-
|
|
730
|
+
const outline = configurationOutline(g.customconfiguration);
|
|
731
|
+
put("shape", outline?.shape ?? null);
|
|
732
|
+
if (outline?.points !== void 0) {
|
|
733
|
+
put("shapePoints", outline.points);
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
function readOgdfLabelOffset(label, put, at) {
|
|
738
|
+
if (typeof label !== "object" || label === null || Array.isArray(label)) {
|
|
739
|
+
return;
|
|
740
|
+
}
|
|
741
|
+
const { x, y } = label;
|
|
742
|
+
put("labelOffsetX", x === void 0 ? null : canonSigned(x, at("labelOffsetX")));
|
|
743
|
+
put("labelOffsetY", y === void 0 ? null : canonSigned(y, at("labelOffsetY")));
|
|
744
|
+
}
|
|
745
|
+
function readGv2gmlNode(g, writer, put, at) {
|
|
746
|
+
const shape = typeof g.type === "string" ? g.type.trim().toLowerCase() : "";
|
|
747
|
+
if (Number(g.hasFill) === 1 || shape === "point") {
|
|
748
|
+
const c = canonColor(g.fill ?? "black", writer.spelling, at("fill"), { use: "fill" });
|
|
749
|
+
put("fill", c?.color ?? null);
|
|
750
|
+
put("fillOpacity", c?.alpha ?? null);
|
|
751
|
+
} else if (g.fill !== void 0) {
|
|
752
|
+
noteAt(at("fill"), STYLE_ISSUE.UNFILLED, sampleOf(g.fill));
|
|
753
|
+
}
|
|
754
|
+
if (graphvizHasNoOutline(shape)) {
|
|
755
|
+
put("borderWidth", 0);
|
|
756
|
+
} else {
|
|
757
|
+
readColor(g.outline, "borderColor", null, writer, put, at);
|
|
758
|
+
put("borderWidth", g.width === void 0 ? null : canonNumber(g.width, at("borderWidth")));
|
|
759
|
+
}
|
|
760
|
+
const borderStyle = strokeStyle(g.outlineStyle, "borderStyle", writer, at("borderStyle"));
|
|
761
|
+
put("borderStyle", borderStyle);
|
|
762
|
+
readGv2gmlRings(g, shape, borderStyle, writer, put, at);
|
|
763
|
+
const rings = 2 * PERIPHERY_GAP * ((SHAPE_PERIPHERIES.get(shape) ?? 1) - 1);
|
|
764
|
+
const inner = (raw, property) => {
|
|
765
|
+
const n = raw === void 0 ? null : canonNumber(raw, at(property));
|
|
766
|
+
return n === null ? null : Math.max(0, n - rings);
|
|
767
|
+
};
|
|
768
|
+
put("width", inner(g.w, "width"));
|
|
769
|
+
put("height", inner(first(g, "H", "h"), "height"));
|
|
770
|
+
if (Number(g.visible) === 0 && g.visible !== void 0) {
|
|
771
|
+
put("visible", false);
|
|
772
|
+
}
|
|
773
|
+
const outline = graphvizOutline(shape);
|
|
774
|
+
if (shape === "polygon") {
|
|
775
|
+
put("shape", "rectangle");
|
|
776
|
+
} else if (outline !== void 0) {
|
|
777
|
+
put("shape", "polygon");
|
|
778
|
+
put("shapePoints", outline);
|
|
779
|
+
put("shapePointsStretch", false);
|
|
780
|
+
} else if (GRAPHVIZ_GLYPH_SHAPES.has(shape)) {
|
|
781
|
+
const size = (raw, property) => raw === void 0 ? null : canonNumber(raw, at(property));
|
|
782
|
+
putGlyph(
|
|
783
|
+
shape,
|
|
784
|
+
size(g.w, "width"),
|
|
785
|
+
size(first(g, "H", "h"), "height"),
|
|
786
|
+
put,
|
|
787
|
+
() => {
|
|
788
|
+
const pen = g.width === void 0 ? 1 : Number(g.width);
|
|
789
|
+
return Number.isFinite(pen) ? Math.max(0, pen) : 1;
|
|
790
|
+
},
|
|
791
|
+
() => canonColor(g.outline ?? "black", writer.spelling, at("outerBorderColor"), { use: "line" })?.color ?? null
|
|
792
|
+
);
|
|
793
|
+
} else if (g.type !== void 0) {
|
|
794
|
+
put("shape", canonEnum("shape", g.type, "graphviz", at("shape")));
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
function readGv2gmlRings(g, shape, style, writer, put, at) {
|
|
798
|
+
const count = SHAPE_PERIPHERIES.get(shape) ?? 1;
|
|
799
|
+
if (count < 2) {
|
|
800
|
+
return;
|
|
801
|
+
}
|
|
802
|
+
const c = canonColor(g.outline ?? "black", writer.spelling, at("outerBorderColor"), { use: "line" });
|
|
803
|
+
if (c !== null && c.alpha === 0) {
|
|
804
|
+
return;
|
|
805
|
+
}
|
|
806
|
+
const parsed = g.width === void 0 ? 1 : Number(g.width);
|
|
807
|
+
const pen = Number.isFinite(parsed) ? Math.max(0, parsed) : 1;
|
|
808
|
+
put("outerBorderColor", c?.color ?? "#000000");
|
|
809
|
+
put("outerBorderOpacity", c !== null && c.alpha < 1 ? c.alpha : null);
|
|
810
|
+
put("outerBorderWidth", pen);
|
|
811
|
+
put("outerBorderOffset", Math.max(0, PERIPHERY_GAP - pen));
|
|
812
|
+
if (style === "dashed" || style === "dotted") {
|
|
813
|
+
put("outerBorderStyle", style);
|
|
814
|
+
}
|
|
815
|
+
if (count > 2) {
|
|
816
|
+
noteAt(at("outerBorderWidth"), STYLE_ISSUE.NOT_CARRIED, `type ${shape}`);
|
|
584
817
|
}
|
|
585
818
|
}
|
|
586
819
|
function readNodeFill(g, writer, put, at) {
|
|
@@ -600,7 +833,7 @@ function readNodeOutline(g, writer, put, at) {
|
|
|
600
833
|
put("borderWidth", 0);
|
|
601
834
|
return;
|
|
602
835
|
}
|
|
603
|
-
readColor(v === "ogdf" ? g
|
|
836
|
+
readColor(v === "ogdf" ? first(g, "outline", "line") : g.outline, "borderColor", null, writer, put, at);
|
|
604
837
|
const width = outlineWidthOf(g, v);
|
|
605
838
|
put("borderWidth", width === void 0 ? null : canonNumber(width, at("borderWidth")));
|
|
606
839
|
}
|
|
@@ -618,10 +851,23 @@ function outlineWidthOf(g, v) {
|
|
|
618
851
|
}
|
|
619
852
|
function readEdgeGraphics(g, writer, put, at) {
|
|
620
853
|
const v = writer.vocabulary;
|
|
854
|
+
if (v === "graphviz") {
|
|
855
|
+
readGv2gmlEdge(g, writer, put, at);
|
|
856
|
+
return;
|
|
857
|
+
}
|
|
621
858
|
readColor(g.fill, "color", "opacity", writer, put, at);
|
|
622
859
|
const width = v === "ogdf" ? first(g, "lineWidth", "width") : g.width;
|
|
623
860
|
put("width", width === void 0 ? null : canonNumber(width, at("width")));
|
|
624
861
|
put("lineStyle", strokeStyle(v === "ogdf" ? g.stipple : g.style, "lineStyle", writer, at("lineStyle")));
|
|
862
|
+
if (v === "ogdf" && g.stipple !== void 0 && ogdfStroke(g.stipple) === "none") {
|
|
863
|
+
put("visible", false);
|
|
864
|
+
}
|
|
865
|
+
readEdgeArrows(g, writer, put, at);
|
|
866
|
+
if (v === "yed") {
|
|
867
|
+
readYedCurve(g, put);
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
function readEdgeArrows(g, writer, put, at) {
|
|
625
871
|
if (typeof g.arrow === "string") {
|
|
626
872
|
const ends = ARROW_ENDS.get(g.arrow.trim().toLowerCase());
|
|
627
873
|
if (ends === void 0) {
|
|
@@ -641,20 +887,56 @@ function readEdgeGraphics(g, writer, put, at) {
|
|
|
641
887
|
}
|
|
642
888
|
put(
|
|
643
889
|
property,
|
|
644
|
-
|
|
890
|
+
writer.vocabulary === "cytoscape" && cytoscapeArrow !== void 0 ? cytoscapeArrow(raw, at(property)) : canonEnum("arrow", raw, writer.spelling, at(property))
|
|
645
891
|
);
|
|
646
892
|
}
|
|
647
|
-
|
|
648
|
-
|
|
893
|
+
}
|
|
894
|
+
const GV2GML_DIRECTIONS = /* @__PURE__ */ new Map([
|
|
895
|
+
["first", [false, true]],
|
|
896
|
+
["last", [true, false]],
|
|
897
|
+
["both", [true, true]],
|
|
898
|
+
["none", [false, false]]
|
|
899
|
+
]);
|
|
900
|
+
function readGv2gmlEdge(g, writer, put, at) {
|
|
901
|
+
readColor(g.fill, "color", "opacity", writer, put, at);
|
|
902
|
+
put("width", g.width === void 0 ? null : canonNumber(g.width, at("width")));
|
|
903
|
+
put("lineStyle", strokeStyle(g.style, "lineStyle", writer, at("lineStyle")));
|
|
904
|
+
if (Number(g.visible) === 0 && g.visible !== void 0) {
|
|
905
|
+
put("visible", false);
|
|
906
|
+
}
|
|
907
|
+
const ends = gv2gmlArrowEnds(g, writer.directed === true);
|
|
908
|
+
if (ends === null) {
|
|
909
|
+
return;
|
|
910
|
+
}
|
|
911
|
+
for (const [end, raw, on] of [
|
|
912
|
+
["target", g.targetArrow, ends[1]],
|
|
913
|
+
["source", g.sourceArrow, ends[0]]
|
|
914
|
+
]) {
|
|
915
|
+
const name = typeof raw === "string" ? raw : "normal";
|
|
916
|
+
const arrow = on ? graphvizArrowValue(name, at(`${end}Arrow`)) : null;
|
|
917
|
+
put(`${end}Arrow`, arrow === null ? "none" : arrow.value);
|
|
918
|
+
if (arrow?.side !== null && arrow?.side !== void 0) {
|
|
919
|
+
put(`${end}ArrowSide`, arrow.side);
|
|
920
|
+
}
|
|
649
921
|
}
|
|
650
922
|
}
|
|
923
|
+
function gv2gmlArrowEnds(g, directed) {
|
|
924
|
+
if (g.arrow === void 0 && g.targetArrow === void 0 && g.sourceArrow === void 0) {
|
|
925
|
+
return directed ? [false, true] : null;
|
|
926
|
+
}
|
|
927
|
+
let dir = directed ? "first" : "none";
|
|
928
|
+
if (typeof g.arrow === "string") {
|
|
929
|
+
dir = g.arrow.trim().toLowerCase();
|
|
930
|
+
}
|
|
931
|
+
return GV2GML_DIRECTIONS.get(dir) ?? null;
|
|
932
|
+
}
|
|
651
933
|
function readYedCurve(g, put) {
|
|
652
934
|
if (g.smoothBends !== void 0) {
|
|
653
935
|
const points = isRec(g.Line) ? g.Line.point : void 0;
|
|
654
936
|
put("curved", Number(g.smoothBends) === 1 && Array.isArray(points) && points.length > 2);
|
|
655
937
|
}
|
|
656
938
|
}
|
|
657
|
-
function readLabelGraphics(raw, writer, put, at) {
|
|
939
|
+
function readLabelGraphics(raw, writer, node, put, at) {
|
|
658
940
|
const visible = (Array.isArray(raw) ? raw : [raw]).filter((l) => isRec(l) && Number(l.visible) !== 0);
|
|
659
941
|
const lg = visible.at(0);
|
|
660
942
|
if (lg === void 0) {
|
|
@@ -665,22 +947,38 @@ function readLabelGraphics(raw, writer, put, at) {
|
|
|
665
947
|
noteAt(at("label"), STYLE_ISSUE.EXTRA_LABELS, `${String(extra + 1)} labels`);
|
|
666
948
|
}
|
|
667
949
|
if (lg.text !== void 0) {
|
|
668
|
-
put(
|
|
950
|
+
put(
|
|
951
|
+
"label",
|
|
952
|
+
writer.vocabulary === "graphviz" ? graphvizText(lg.text, at("label")) : canonText(lg.text, at("label"))
|
|
953
|
+
);
|
|
669
954
|
}
|
|
670
955
|
const yedLabel = writer.vocabulary === "yed" || YED_LABEL_KEYS.some((k) => Object.hasOwn(lg, k));
|
|
671
|
-
if (lg.color !== void 0) {
|
|
672
|
-
readColor(lg.color, "labelColor",
|
|
956
|
+
if (lg.color !== void 0 || lg.fontColor !== void 0) {
|
|
957
|
+
readColor(lg.color ?? lg.fontColor, "labelColor", "labelOpacity", writer, put, at);
|
|
673
958
|
} else if (lg.fill !== void 0 && !yedLabel) {
|
|
674
959
|
readColor(lg.fill, "labelColor", null, writer, put, at);
|
|
675
960
|
}
|
|
676
961
|
if (lg.fill !== void 0 && yedLabel) {
|
|
677
962
|
noteAt(at("label"), STYLE_ISSUE.NOT_CARRIED, "label background");
|
|
678
963
|
}
|
|
679
|
-
readLabelFont(lg, put, at);
|
|
964
|
+
readLabelFont(lg, yedLabel || writer.vocabulary === "cytoscape", put, at);
|
|
965
|
+
if (node && lg.anchor !== void 0) {
|
|
966
|
+
const anchor = scalarText(lg.anchor, at("labelPosition"))?.trim().toLowerCase() ?? "";
|
|
967
|
+
const known = GML_ANCHORS.get(anchor);
|
|
968
|
+
if (known === void 0) {
|
|
969
|
+
noteAt(at("labelPosition"), STYLE_ISSUE.UNKNOWN_VALUE, anchor.slice(0, MAX_STYLE_VALUE_LENGTH));
|
|
970
|
+
}
|
|
971
|
+
put("labelPosition", known ?? null);
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
function graphvizText(raw, at) {
|
|
975
|
+
const text = canonText(raw, at);
|
|
976
|
+
return text === null ? null : text.replaceAll(/\\[nlr]/g, "\n").replace(/\n$/, "");
|
|
680
977
|
}
|
|
681
|
-
function readLabelFont(lg, put, at) {
|
|
978
|
+
function readLabelFont(lg, java, put, at) {
|
|
682
979
|
put("labelSize", lg.fontSize === void 0 ? null : canonNumber(lg.fontSize, at("labelSize")));
|
|
683
|
-
|
|
980
|
+
const font = lg.fontName === void 0 ? null : canonText(lg.fontName, at("labelFont"));
|
|
981
|
+
put("labelFont", java && typeof font === "string" ? javaFamily(font) : font);
|
|
684
982
|
const style = scalarText(lg.fontStyle, at("labelWeight"))?.trim().toLowerCase();
|
|
685
983
|
if (style !== void 0) {
|
|
686
984
|
const known = FONT_STYLES.get(style);
|
|
@@ -702,13 +1000,63 @@ function readElement(target, g, lg, label, writer, put, at) {
|
|
|
702
1000
|
(target === "node" ? readNodeGraphics : readEdgeGraphics)(g, writer, put, at);
|
|
703
1001
|
}
|
|
704
1002
|
if (lg !== null && lg !== void 0) {
|
|
705
|
-
readLabelGraphics(lg, writer, putLabel, at);
|
|
1003
|
+
readLabelGraphics(lg, writer, target === "node", putLabel, at);
|
|
706
1004
|
}
|
|
707
1005
|
const drawn = writer.vocabulary === "cytoscape" ? target === "node" : writer.labelKey && (isRec(g) || lg !== void 0);
|
|
708
1006
|
if (!text && drawn && label !== null && label !== void 0) {
|
|
709
|
-
put(
|
|
1007
|
+
put(
|
|
1008
|
+
"label",
|
|
1009
|
+
writer.vocabulary === "graphviz" ? graphvizText(label, at("label")) : canonText(label, at("label"))
|
|
1010
|
+
);
|
|
1011
|
+
if (target === "node" && writer.tool === null && writer.vocabulary === "graphlet") {
|
|
1012
|
+
put("labelPosition", "center");
|
|
1013
|
+
}
|
|
710
1014
|
}
|
|
711
1015
|
}
|
|
1016
|
+
const OGDF_SVG_FONT_SIZE = 10;
|
|
1017
|
+
function placeOgdfClusterLabels(snapshot, values) {
|
|
1018
|
+
const n = snapshot.nodeCount;
|
|
1019
|
+
const boxOf = (i) => {
|
|
1020
|
+
const [x, y] = centerOf(snapshot, i);
|
|
1021
|
+
const [w, h] = sizeOf(snapshot, i);
|
|
1022
|
+
return [x - w / 2, y - h / 2, x + w / 2, y + h / 2];
|
|
1023
|
+
};
|
|
1024
|
+
const all = [Infinity, Infinity, -Infinity, -Infinity];
|
|
1025
|
+
for (let i = 0; i < n; i++) {
|
|
1026
|
+
const b = boxOf(i);
|
|
1027
|
+
if (b.every(Number.isFinite)) {
|
|
1028
|
+
all[0] = Math.min(all[0], b[0]);
|
|
1029
|
+
all[1] = Math.min(all[1], b[1]);
|
|
1030
|
+
all[2] = Math.max(all[2], b[2]);
|
|
1031
|
+
all[3] = Math.max(all[3], b[3]);
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
const put = (property, i, value) => {
|
|
1035
|
+
values[property] ??= new Array(n).fill(null);
|
|
1036
|
+
values[property][i] = value;
|
|
1037
|
+
};
|
|
1038
|
+
for (let i = 0; i < n; i++) {
|
|
1039
|
+
const id = snapshot.ids.idOf(i);
|
|
1040
|
+
const [x0, y0, x1, y1] = boxOf(i);
|
|
1041
|
+
if (typeof id !== "string" || !id.startsWith("cluster") || ![x0, y0, x1, y1].every(Number.isFinite)) {
|
|
1042
|
+
continue;
|
|
1043
|
+
}
|
|
1044
|
+
const below = all[3] - y1 > y0 - all[1];
|
|
1045
|
+
const start = x0 - all[0] > all[2] - x1;
|
|
1046
|
+
put("labelPosition", i, "center");
|
|
1047
|
+
put("labelOffsetX", i, (start ? -1 : 1) * (x1 - x0) / 2);
|
|
1048
|
+
put("labelShiftX", i, start ? 0.5 : -0.5);
|
|
1049
|
+
put("labelOffsetY", i, (below ? 1 : -1) * ((y1 - y0) / 2 + OGDF_SVG_FONT_SIZE));
|
|
1050
|
+
}
|
|
1051
|
+
}
|
|
1052
|
+
function labelOf(snapshot, writer, target, i) {
|
|
1053
|
+
const table = target === "node" ? snapshot.nodes : snapshot.edges;
|
|
1054
|
+
const label = cellOf(table, "label", i);
|
|
1055
|
+
if (writer.vocabulary === "cytoscape" && target === "node" && (label === void 0 || label === "")) {
|
|
1056
|
+
return String(snapshot.ids.idOf(i));
|
|
1057
|
+
}
|
|
1058
|
+
return label;
|
|
1059
|
+
}
|
|
712
1060
|
function cellOf(table, name, i) {
|
|
713
1061
|
if (!table.has(name)) {
|
|
714
1062
|
return void 0;
|
|
@@ -721,18 +1069,117 @@ function centerOf(snapshot, i) {
|
|
|
721
1069
|
const v = column?.isSet(i) === true ? column.value(i) : null;
|
|
722
1070
|
return v === null ? [Number.NaN, Number.NaN] : [v[0], v[1]];
|
|
723
1071
|
}
|
|
724
|
-
function
|
|
1072
|
+
function sizeOf(snapshot, i) {
|
|
1073
|
+
const g = cellOf(snapshot.nodes, "graphics", i);
|
|
1074
|
+
return isRec(g) ? [Number(g.w ?? Number.NaN), Number(g.h ?? Number.NaN)] : [Number.NaN, Number.NaN];
|
|
1075
|
+
}
|
|
1076
|
+
function readLineRoute(snapshot, g, e, bendsOnly, put) {
|
|
725
1077
|
const raw = isRec(g) && isRec(g.Line) ? g.Line.point : void 0;
|
|
726
|
-
|
|
727
|
-
|
|
1078
|
+
const list = isRec(raw) ? [raw] : raw;
|
|
1079
|
+
if (!Array.isArray(list) || list.length < (bendsOnly ? 1 : 2)) {
|
|
1080
|
+
return;
|
|
1081
|
+
}
|
|
1082
|
+
const all = list.map((p) => isRec(p) ? [Number(p.x), Number(p.y)] : [Number.NaN, 0]);
|
|
1083
|
+
const [s, t] = [snapshot.edgeSource(e), snapshot.edgeTarget(e)];
|
|
1084
|
+
const points = bendsOnly ? all : all.slice(1, -1);
|
|
1085
|
+
const bends = s === t ? canonNodeOffsets(centerOf(snapshot, s), sizeOf(snapshot, s), points, true) : canonBends(centerOf(snapshot, s), centerOf(snapshot, t), points, true);
|
|
1086
|
+
if (bends !== null) {
|
|
1087
|
+
put("bends", bends);
|
|
728
1088
|
}
|
|
729
|
-
|
|
730
|
-
|
|
1089
|
+
if (bendsOnly) {
|
|
1090
|
+
return;
|
|
1091
|
+
}
|
|
1092
|
+
for (const [property, k, end] of [
|
|
1093
|
+
["sourcePort", s, all[0]],
|
|
1094
|
+
["targetPort", t, all.at(-1) ?? all[0]]
|
|
1095
|
+
]) {
|
|
1096
|
+
const center = centerOf(snapshot, k);
|
|
1097
|
+
const port = end[0] === center[0] && end[1] === center[1] ? null : canonNodeOffsets(center, sizeOf(snapshot, k), [end], true);
|
|
1098
|
+
if (port !== null) {
|
|
1099
|
+
put(property, port);
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
function readGv2gmlRoute(snapshot, g, e, put) {
|
|
1104
|
+
const raw = isRec(g) && isRec(g.Line) ? g.Line.point : void 0;
|
|
1105
|
+
const list = isRec(raw) ? [raw] : raw;
|
|
1106
|
+
if (!Array.isArray(list) || !isRec(g)) {
|
|
1107
|
+
return;
|
|
1108
|
+
}
|
|
1109
|
+
let points = list.map((p) => isRec(p) ? [Number(p.x), Number(p.y)] : [Number.NaN, 0]);
|
|
1110
|
+
const tips = (points.length - 1) % 3;
|
|
1111
|
+
const sourceTip = tips === 2 || tips === 1 && gv2gmlArrowEnds(g, snapshot.directed)?.[0] === true;
|
|
1112
|
+
points = points.slice(sourceTip ? 1 : 0, points.length - (tips === 2 || tips === 1 && !sourceTip ? 1 : 0));
|
|
1113
|
+
const bends = graphvizRouteBends(
|
|
731
1114
|
centerOf(snapshot, snapshot.edgeSource(e)),
|
|
732
1115
|
centerOf(snapshot, snapshot.edgeTarget(e)),
|
|
733
|
-
points
|
|
1116
|
+
[points]
|
|
1117
|
+
);
|
|
1118
|
+
if (bends !== null) {
|
|
1119
|
+
put("bends", bends);
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1122
|
+
function routeMiddle(points) {
|
|
1123
|
+
const m = points.length - 1;
|
|
1124
|
+
if (m % 2 === 0) {
|
|
1125
|
+
return points[m / 2];
|
|
1126
|
+
}
|
|
1127
|
+
const [a, b] = [points[(m - 1) / 2], points[(m + 1) / 2]];
|
|
1128
|
+
return [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];
|
|
1129
|
+
}
|
|
1130
|
+
function putEdgeLabelOffset(at, middle, yUp, put) {
|
|
1131
|
+
const dx = num6(at[0] - middle[0]);
|
|
1132
|
+
const dy = num6((yUp ? -1 : 1) * (at[1] - middle[1]));
|
|
1133
|
+
if (Number.isFinite(dx) && Number.isFinite(dy) && (dx !== 0 || dy !== 0)) {
|
|
1134
|
+
put("labelPosition", "center");
|
|
1135
|
+
put("labelOffsetX", dx);
|
|
1136
|
+
put("labelOffsetY", dy);
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
function readGv2gmlLabelPlace(snapshot, e, bent, put) {
|
|
1140
|
+
const lp = cellOf(snapshot.edges, "lp", e);
|
|
1141
|
+
const m = typeof lp === "string" ? /^\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*$/.exec(lp) : null;
|
|
1142
|
+
if (m === null || bent) {
|
|
1143
|
+
return;
|
|
1144
|
+
}
|
|
1145
|
+
const [s, t] = [centerOf(snapshot, snapshot.edgeSource(e)), centerOf(snapshot, snapshot.edgeTarget(e))];
|
|
1146
|
+
putEdgeLabelOffset([Number(m[1]), Number(m[2])], routeMiddle([s, t]), true, put);
|
|
1147
|
+
}
|
|
1148
|
+
function readOgdfLabelPlace(snapshot, g, e, put) {
|
|
1149
|
+
const raw = isRec(g) && isRec(g.Line) ? g.Line.point : void 0;
|
|
1150
|
+
const list = isRec(raw) ? [raw] : raw;
|
|
1151
|
+
const [s, t] = [centerOf(snapshot, snapshot.edgeSource(e)), centerOf(snapshot, snapshot.edgeTarget(e))];
|
|
1152
|
+
if (!Array.isArray(list) || snapshot.edgeSource(e) === snapshot.edgeTarget(e)) {
|
|
1153
|
+
return;
|
|
1154
|
+
}
|
|
1155
|
+
const same = (a, b) => Math.hypot(a[0] - b[0], a[1] - b[1]) < 1e-6;
|
|
1156
|
+
const bends = list.map((p) => isRec(p) ? [Number(p.x), Number(p.y)] : [Number.NaN, 0]).filter((p) => !same(p, s) && !same(p, t));
|
|
1157
|
+
if (bends.length === 0) {
|
|
1158
|
+
return;
|
|
1159
|
+
}
|
|
1160
|
+
const route = [s, ...bends, t];
|
|
1161
|
+
putEdgeLabelOffset(
|
|
1162
|
+
[(route[0][0] + route[1][0]) / 2, (route[0][1] + route[1][1]) / 2],
|
|
1163
|
+
routeMiddle(route),
|
|
1164
|
+
false,
|
|
1165
|
+
put
|
|
734
1166
|
);
|
|
735
1167
|
}
|
|
1168
|
+
function hideGephiDroppedEdges(snapshot, values) {
|
|
1169
|
+
const header = snapshot.meta.extra.gml?.directed;
|
|
1170
|
+
const directed = snapshot.edges.byRole("directed");
|
|
1171
|
+
if (directed === null || header === void 0) {
|
|
1172
|
+
return;
|
|
1173
|
+
}
|
|
1174
|
+
const graphDirected = Number(header) === 1;
|
|
1175
|
+
for (let e = 0; e < snapshot.edgeCount; e++) {
|
|
1176
|
+
const v = plainCell(directed.value(e));
|
|
1177
|
+
if (typeof v === "boolean" && v !== graphDirected) {
|
|
1178
|
+
values.visible ??= new Array(snapshot.edgeCount).fill(null);
|
|
1179
|
+
values.visible[e] = false;
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
736
1183
|
function readValues(snapshot, writer, notes, context) {
|
|
737
1184
|
let found = false;
|
|
738
1185
|
const read = (target) => {
|
|
@@ -749,7 +1196,7 @@ function readValues(snapshot, writer, notes, context) {
|
|
|
749
1196
|
target,
|
|
750
1197
|
cellOf(table, "graphics", i),
|
|
751
1198
|
cellOf(table, "LabelGraphics", i),
|
|
752
|
-
|
|
1199
|
+
labelOf(snapshot, writer, target, i),
|
|
753
1200
|
writer,
|
|
754
1201
|
(property, value) => {
|
|
755
1202
|
if (value !== null) {
|
|
@@ -759,12 +1206,32 @@ function readValues(snapshot, writer, notes, context) {
|
|
|
759
1206
|
},
|
|
760
1207
|
at
|
|
761
1208
|
);
|
|
762
|
-
if (target === "edge") {
|
|
763
|
-
|
|
764
|
-
|
|
1209
|
+
if (target === "edge" && writer.vocabulary === "graphviz") {
|
|
1210
|
+
let bent = false;
|
|
1211
|
+
readGv2gmlRoute(snapshot, cellOf(table, "graphics", i), i, (property, value) => {
|
|
765
1212
|
found = true;
|
|
766
|
-
|
|
767
|
-
|
|
1213
|
+
bent ||= property === "bends";
|
|
1214
|
+
out.put(i, property, value);
|
|
1215
|
+
});
|
|
1216
|
+
readGv2gmlLabelPlace(snapshot, i, bent, (property, value) => {
|
|
1217
|
+
out.put(i, property, value);
|
|
1218
|
+
});
|
|
1219
|
+
} else if (target === "edge" && writer.vocabulary === "ogdf") {
|
|
1220
|
+
readOgdfLabelPlace(snapshot, cellOf(table, "graphics", i), i, (property, value) => {
|
|
1221
|
+
out.put(i, property, value);
|
|
1222
|
+
});
|
|
1223
|
+
}
|
|
1224
|
+
if (target === "edge" && writer.vocabulary !== "graphviz") {
|
|
1225
|
+
readLineRoute(
|
|
1226
|
+
snapshot,
|
|
1227
|
+
cellOf(table, "graphics", i),
|
|
1228
|
+
i,
|
|
1229
|
+
writer.vocabulary === "ogdf",
|
|
1230
|
+
(property, value) => {
|
|
1231
|
+
found = true;
|
|
1232
|
+
out.put(i, property, value);
|
|
1233
|
+
}
|
|
1234
|
+
);
|
|
768
1235
|
}
|
|
769
1236
|
}
|
|
770
1237
|
return out.values;
|
|
@@ -807,8 +1274,11 @@ function styleColumns(table) {
|
|
|
807
1274
|
}
|
|
808
1275
|
function gmlStyles(snapshot, context) {
|
|
809
1276
|
const notes = new StyleNotes();
|
|
810
|
-
const writer = writerOf(snapshot);
|
|
1277
|
+
const writer = { ...writerOf(snapshot), directed: snapshot.directed };
|
|
811
1278
|
const values = readValues(snapshot, writer, notes, context);
|
|
1279
|
+
if (writer.vocabulary === "ogdf") {
|
|
1280
|
+
placeOgdfClusterLabels(snapshot, values.node);
|
|
1281
|
+
}
|
|
812
1282
|
const blockText = graphText(snapshot, GML_STYLE_BLOCK_KEY);
|
|
813
1283
|
const block = blockText === null ? null : blockWithValues(snapshot, blockText);
|
|
814
1284
|
if (block !== null) {
|
|
@@ -817,7 +1287,26 @@ function gmlStyles(snapshot, context) {
|
|
|
817
1287
|
if (writer.tool === null && !values.found && block === null) {
|
|
818
1288
|
return null;
|
|
819
1289
|
}
|
|
820
|
-
|
|
1290
|
+
if (writer.tool === "gephi" && block === null) {
|
|
1291
|
+
delete values.edge.color;
|
|
1292
|
+
if (snapshot.edges.byRole("weight") === null && snapshot.edges.has("value")) {
|
|
1293
|
+
values.edge.width = Array.from({ length: snapshot.edgeCount }, (_, e) => {
|
|
1294
|
+
const w = cellOf(snapshot.edges, "value", e);
|
|
1295
|
+
if (typeof w !== "number" || !Number.isFinite(w)) {
|
|
1296
|
+
return null;
|
|
1297
|
+
}
|
|
1298
|
+
return w > 0 ? w : 1;
|
|
1299
|
+
});
|
|
1300
|
+
}
|
|
1301
|
+
hideGephiDroppedEdges(snapshot, values.edge);
|
|
1302
|
+
}
|
|
1303
|
+
const none = { rules: [], columns: /* @__PURE__ */ new Map() };
|
|
1304
|
+
const gephi = writer.tool === "gephi" ? gephiRules(
|
|
1305
|
+
snapshot,
|
|
1306
|
+
{ fill: values.node.fill, width: values.node.width },
|
|
1307
|
+
{ color: values.edge.color, width: values.edge.width },
|
|
1308
|
+
context.budget
|
|
1309
|
+
) : { node: none, edge: none };
|
|
821
1310
|
return {
|
|
822
1311
|
canonical: true,
|
|
823
1312
|
dialect: writer.dialect,
|
|
@@ -859,6 +1348,8 @@ const GML_STYLE_CAPABILITIES = Object.freeze({
|
|
|
859
1348
|
"targetArrow",
|
|
860
1349
|
"curved",
|
|
861
1350
|
"bends",
|
|
1351
|
+
"sourcePort",
|
|
1352
|
+
"targetPort",
|
|
862
1353
|
"label",
|
|
863
1354
|
"labelColor",
|
|
864
1355
|
"labelSize",
|
|
@@ -969,7 +1460,7 @@ function edgeGraphics(get, approximate) {
|
|
|
969
1460
|
for (const property of ["sourceArrow", "targetArrow"]) {
|
|
970
1461
|
const arrow = get(property);
|
|
971
1462
|
if (typeof arrow === "string") {
|
|
972
|
-
g[property] = yedSpelled(YED_ARROWS, arrow, "
|
|
1463
|
+
g[property] = yedSpelled(YED_ARROWS, arrow, "delta", property, approximate);
|
|
973
1464
|
}
|
|
974
1465
|
}
|
|
975
1466
|
const curved = get("curved");
|
|
@@ -994,7 +1485,7 @@ function labelGraphics(get) {
|
|
|
994
1485
|
}
|
|
995
1486
|
const font = get("labelFont");
|
|
996
1487
|
if (typeof font === "string") {
|
|
997
|
-
lg.fontName = font;
|
|
1488
|
+
lg.fontName = yedFontName(font);
|
|
998
1489
|
}
|
|
999
1490
|
const weight = get("labelWeight");
|
|
1000
1491
|
const italic = get("labelItalic");
|
|
@@ -1025,37 +1516,17 @@ function mergedLabels(old, written) {
|
|
|
1025
1516
|
}
|
|
1026
1517
|
return head === void 0 ? rest : [head, ...rest];
|
|
1027
1518
|
}
|
|
1028
|
-
function getter(picture, target) {
|
|
1029
|
-
const columns = /* @__PURE__ */ new Map();
|
|
1030
|
-
for (const p of GML_STYLE_CAPABILITIES[target]) {
|
|
1031
|
-
columns.set(p, picture(target, p));
|
|
1032
|
-
}
|
|
1033
|
-
return (i) => (property) => columns.get(property)?.[i] ?? null;
|
|
1034
|
-
}
|
|
1035
1519
|
function exactFromBlock(snapshot, text, read) {
|
|
1036
|
-
const parsed = parseStyleBlock(text, styleFingerprint(snapshot));
|
|
1037
|
-
const ex = parsed.ok ? blockStyles(parsed.block, snapshot, "gml") : null;
|
|
1038
|
-
if (ex === null) {
|
|
1039
|
-
return;
|
|
1040
|
-
}
|
|
1041
1520
|
const notes = new StyleNotes();
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
const want = get(i);
|
|
1521
|
+
takeFromBlock(snapshot, text, "gml", (target) => ({
|
|
1522
|
+
values: read[target],
|
|
1523
|
+
properties: GML_STYLE_CAPABILITIES[target],
|
|
1524
|
+
writes: GML_STYLE_CAPABILITIES[target],
|
|
1525
|
+
readBack: (_i, want) => {
|
|
1048
1526
|
const back = writtenAndReadBack(target, want, notes);
|
|
1049
|
-
|
|
1050
|
-
const native = values[property]?.[i] ?? null;
|
|
1051
|
-
const w = want(property);
|
|
1052
|
-
if (native !== w && native === (back.get(property) ?? null)) {
|
|
1053
|
-
values[property] ??= new Array(n).fill(null);
|
|
1054
|
-
values[property][i] = w;
|
|
1055
|
-
}
|
|
1056
|
-
}
|
|
1527
|
+
return (property) => back.get(property) ?? null;
|
|
1057
1528
|
}
|
|
1058
|
-
}
|
|
1529
|
+
}));
|
|
1059
1530
|
}
|
|
1060
1531
|
function writtenAndReadBack(target, want, notes) {
|
|
1061
1532
|
const ignore = () => void 0;
|
|
@@ -1116,13 +1587,18 @@ function writeGraphicsColumns(snapshot, input, target, table, approximated) {
|
|
|
1116
1587
|
const approximate = (property, value) => {
|
|
1117
1588
|
approximated.add(target, property, value);
|
|
1118
1589
|
};
|
|
1119
|
-
const get =
|
|
1590
|
+
const get = elementValues((t, p) => input.picture(t, p), target, GML_STYLE_CAPABILITIES[target]);
|
|
1591
|
+
const getNode = elementValues((t, p) => input.picture(t, p), "node", GML_STYLE_CAPABILITIES.node);
|
|
1592
|
+
const size = (k) => {
|
|
1593
|
+
const [w, h] = [getNode(k)("width"), getNode(k)("height")];
|
|
1594
|
+
return typeof w === "number" && typeof h === "number" ? [w, h] : sizeOf(snapshot, k);
|
|
1595
|
+
};
|
|
1120
1596
|
const graphics = [];
|
|
1121
1597
|
const labels = [];
|
|
1122
1598
|
for (let i = 0; i < n; i++) {
|
|
1123
1599
|
const g = target === "node" ? nodeGraphics(get(i), approximate) : edgeGraphics(get(i), approximate);
|
|
1124
1600
|
if (target === "edge") {
|
|
1125
|
-
const line =
|
|
1601
|
+
const line = routeLine(snapshot, get(i), i, size);
|
|
1126
1602
|
if (line !== null) {
|
|
1127
1603
|
g.Line = line;
|
|
1128
1604
|
}
|
|
@@ -1141,14 +1617,28 @@ function writeGraphicsColumns(snapshot, input, target, table, approximated) {
|
|
|
1141
1617
|
}
|
|
1142
1618
|
}
|
|
1143
1619
|
}
|
|
1144
|
-
function
|
|
1145
|
-
const
|
|
1146
|
-
const
|
|
1147
|
-
const
|
|
1148
|
-
if (
|
|
1620
|
+
function routeLine(snapshot, get, e, size) {
|
|
1621
|
+
const [s, t] = [snapshot.edgeSource(e), snapshot.edgeTarget(e)];
|
|
1622
|
+
const source = centerOf(snapshot, s);
|
|
1623
|
+
const target = centerOf(snapshot, t);
|
|
1624
|
+
if (![...source, ...target].every(Number.isFinite)) {
|
|
1625
|
+
return null;
|
|
1626
|
+
}
|
|
1627
|
+
const bends = get("bends");
|
|
1628
|
+
let points = null;
|
|
1629
|
+
if (typeof bends === "string") {
|
|
1630
|
+
points = s === t ? nodeOffsetsToPoints(source, size(s), bends) : bendsToPoints(source, target, bends);
|
|
1631
|
+
}
|
|
1632
|
+
const port = (property, k, center) => {
|
|
1633
|
+
const value = get(property);
|
|
1634
|
+
return typeof value === "string" ? nodeOffsetsToPoints(center, size(k), value)?.[0] ?? null : null;
|
|
1635
|
+
};
|
|
1636
|
+
const from = port("sourcePort", s, source);
|
|
1637
|
+
const to = port("targetPort", t, target);
|
|
1638
|
+
if (points === null && from === null && to === null) {
|
|
1149
1639
|
return null;
|
|
1150
1640
|
}
|
|
1151
|
-
return { point: [source, ...points, target].map(([x, y]) => ({ x, y })) };
|
|
1641
|
+
return { point: [from ?? source, ...points ?? [], to ?? target].map(([x, y]) => ({ x, y })) };
|
|
1152
1642
|
}
|
|
1153
1643
|
function renameDataColumn(table, target, name, col) {
|
|
1154
1644
|
let renamed = `data_${name}`;
|
|
@@ -2179,33 +2669,6 @@ const gmlExporter = Object.freeze({
|
|
|
2179
2669
|
function* lazyParts(snapshot, options) {
|
|
2180
2670
|
yield* gmlParts(contextOf(gmlStyledExport(snapshot, options?.styles)?.snapshot ?? snapshot, options));
|
|
2181
2671
|
}
|
|
2182
|
-
const GRAPHICS_COLUMN = "graphics";
|
|
2183
|
-
function gmlPositions(snapshot) {
|
|
2184
|
-
if (snapshot.nodes.byRole("position") === null) {
|
|
2185
|
-
return null;
|
|
2186
|
-
}
|
|
2187
|
-
const tool = toolOf(snapshot.meta.creator);
|
|
2188
|
-
return {
|
|
2189
|
-
units: "px",
|
|
2190
|
-
// a z that is the same on every node collapses to 2D
|
|
2191
|
-
sourceDims: 3,
|
|
2192
|
-
yAxis: tool === "gephi" || tool === "tulip" ? "up" : "down",
|
|
2193
|
-
tool,
|
|
2194
|
-
medianNodeSize: graphicsMedian(snapshot)
|
|
2195
|
-
};
|
|
2196
|
-
}
|
|
2197
|
-
function graphicsMedian(snapshot) {
|
|
2198
|
-
const graphics = snapshot.nodes.get(GRAPHICS_COLUMN);
|
|
2199
|
-
const sizes = [];
|
|
2200
|
-
for (let row = 0; graphics !== null && row < graphics.length; row++) {
|
|
2201
|
-
const g = graphics.isSet(row) ? graphics.value(row) : void 0;
|
|
2202
|
-
const { w, h } = typeof g === "object" && g !== null ? g : {};
|
|
2203
|
-
if (typeof w === "number" && typeof h === "number") {
|
|
2204
|
-
sizes.push((w + h) / 2);
|
|
2205
|
-
}
|
|
2206
|
-
}
|
|
2207
|
-
return median(sizes);
|
|
2208
|
-
}
|
|
2209
2672
|
const NO_GRAPH_CODE = NO_GRAPH_CODE$1;
|
|
2210
2673
|
const SECOND_GRAPH_CODE = MULTIPLE_GRAPHS_CODE;
|
|
2211
2674
|
const MISSING_ID_CODE = MISSING_ID_CODE$1;
|
|
@@ -2223,6 +2686,7 @@ const UNKNOWN_ENTITY_CODE = "W_GML_UNKNOWN_ENTITY";
|
|
|
2223
2686
|
const GRAPHICS_CODE = "W_GML_GRAPHICS";
|
|
2224
2687
|
const NESTED_ELEMENT_CODE = "W_GML_NESTED_ELEMENT";
|
|
2225
2688
|
const GROUPS_CODE = "W_GML_GROUPS";
|
|
2689
|
+
const GROUP_PARENT_COLUMN = "graphty.parent";
|
|
2226
2690
|
const WIDENED_CODE = WIDENED_CODE$1;
|
|
2227
2691
|
const PRECISION_CODE = PRECISION_CODE$1;
|
|
2228
2692
|
const COLUMN_RENAMED_CODE_GML = COLUMN_RENAMED_CODE;
|
|
@@ -2312,6 +2776,10 @@ class GmlImport {
|
|
|
2312
2776
|
this.elementsSinceCheck = 0;
|
|
2313
2777
|
this.idMap = null;
|
|
2314
2778
|
this.skippedIds = /* @__PURE__ */ new Set();
|
|
2779
|
+
this.groupRefs = [];
|
|
2780
|
+
this.rootCluster = -1;
|
|
2781
|
+
this.parentHandle = null;
|
|
2782
|
+
this.clusterCount = 0;
|
|
2315
2783
|
this.declared = new Uint32Array(64);
|
|
2316
2784
|
this.touched = [];
|
|
2317
2785
|
this.graphTouched = [];
|
|
@@ -2379,6 +2847,8 @@ class GmlImport {
|
|
|
2379
2847
|
this.creatorToken = v;
|
|
2380
2848
|
} else if (key === "Version" && !record && this.versionToken < 0) {
|
|
2381
2849
|
this.versionToken = v;
|
|
2850
|
+
} else if (key === "rootcluster" && record && this.rootCluster < 0) {
|
|
2851
|
+
this.rootCluster = v;
|
|
2382
2852
|
} else {
|
|
2383
2853
|
this.observe(this.topSchema, "graph", key, v, TOP_SEQ);
|
|
2384
2854
|
}
|
|
@@ -2563,7 +3033,7 @@ class GmlImport {
|
|
|
2563
3033
|
}
|
|
2564
3034
|
/**
|
|
2565
3035
|
* Warn about keys of a node or edge whose meaning GML readers give but this import does not:
|
|
2566
|
-
* a nested graph / node / edge record
|
|
3036
|
+
* a nested graph / node / edge record.
|
|
2567
3037
|
* @param domain - the table
|
|
2568
3038
|
* @param key - the key
|
|
2569
3039
|
* @param v - the value token
|
|
@@ -2581,13 +3051,6 @@ class GmlImport {
|
|
|
2581
3051
|
{ line: t.line[v], element: key },
|
|
2582
3052
|
`${NESTED_ELEMENT_CODE}:${domain}:${key}`
|
|
2583
3053
|
);
|
|
2584
|
-
} else if (domain === "node" && (key === "isGroup" || key === "gid")) {
|
|
2585
|
-
this.report.warnOnce(
|
|
2586
|
-
"unsupported",
|
|
2587
|
-
GROUPS_CODE,
|
|
2588
|
-
"yEd group keys (isGroup, gid) are kept as plain node columns; the group hierarchy is not read as containment",
|
|
2589
|
-
{ line: t.line[v], element: key }
|
|
2590
|
-
);
|
|
2591
3054
|
}
|
|
2592
3055
|
}
|
|
2593
3056
|
/**
|
|
@@ -2644,8 +3107,155 @@ class GmlImport {
|
|
|
2644
3107
|
}
|
|
2645
3108
|
this.pushTopLevel();
|
|
2646
3109
|
this.pushNodes();
|
|
3110
|
+
this.pushGroups();
|
|
3111
|
+
this.pushClusters();
|
|
2647
3112
|
this.pushEdges();
|
|
2648
3113
|
}
|
|
3114
|
+
/**
|
|
3115
|
+
* Read yEd's group hierarchy into the parent column: a node's `gid` names the group node it sits in. A `gid` that
|
|
3116
|
+
* names no node (or the node itself) is warned once and left a plain column value.
|
|
3117
|
+
*/
|
|
3118
|
+
pushGroups() {
|
|
3119
|
+
const t = this.requireTokens();
|
|
3120
|
+
for (const [node, v] of this.groupRefs) {
|
|
3121
|
+
let parent = INVALID_INDEX;
|
|
3122
|
+
try {
|
|
3123
|
+
const fileId = this.coerceFileId(v, this.fileIdOf(v, "gid"));
|
|
3124
|
+
parent = this.sink.indexOf(this.idMap?.get(fileId) ?? fileId);
|
|
3125
|
+
} catch {
|
|
3126
|
+
parent = INVALID_INDEX;
|
|
3127
|
+
}
|
|
3128
|
+
if (parent === INVALID_INDEX || parent === node) {
|
|
3129
|
+
this.report.warnOnce(
|
|
3130
|
+
"validation-error",
|
|
3131
|
+
GROUPS_CODE,
|
|
3132
|
+
`gid ${t.kind[v] === TOKEN_OPEN ? "[...]" : t.textOf(v)} names no other node; it is kept as a plain column value`,
|
|
3133
|
+
{ line: t.line[v], element: "gid" }
|
|
3134
|
+
);
|
|
3135
|
+
continue;
|
|
3136
|
+
}
|
|
3137
|
+
this.setParent(node, parent, "gid");
|
|
3138
|
+
}
|
|
3139
|
+
}
|
|
3140
|
+
/**
|
|
3141
|
+
* Put a node in a group: the parent column, declared on first use.
|
|
3142
|
+
* @param node - the node's index
|
|
3143
|
+
* @param parent - the group node's index
|
|
3144
|
+
* @param type - the file key the hierarchy came from (`gid`, `rootcluster`)
|
|
3145
|
+
*/
|
|
3146
|
+
setParent(node, parent, type) {
|
|
3147
|
+
this.parentHandle ??= this.sink.declareNodeColumn({
|
|
3148
|
+
name: uniqueColumnName(GROUP_PARENT_COLUMN, null, (c) => this.sink.nodeColumn(c) !== INVALID_INDEX),
|
|
3149
|
+
dtype: "u32",
|
|
3150
|
+
role: "parent",
|
|
3151
|
+
refersTo: "node",
|
|
3152
|
+
nullable: true,
|
|
3153
|
+
origin: { format: "gml", id: null, title: null, type, namespace: null }
|
|
3154
|
+
});
|
|
3155
|
+
this.sink.setNodeValue(this.parentHandle, node, parent);
|
|
3156
|
+
}
|
|
3157
|
+
/**
|
|
3158
|
+
* Read OGDF's cluster tree (`rootcluster`, GraphIO::writeGML): every cluster below the root becomes a group node
|
|
3159
|
+
* (id `cluster<id>`) holding its `vertex` nodes and its child clusters, with its label, its box as the node's
|
|
3160
|
+
* center and size, and its graphics as a node's (`color` is the outline, `style` the shape, `stipple` kept as
|
|
3161
|
+
* `clusterStipple`, since OGDF draws a cluster's outline solid). The root cluster is
|
|
3162
|
+
* the whole graph and draws nothing of its own. A `vertex` that names no node is warned once.
|
|
3163
|
+
*/
|
|
3164
|
+
pushClusters() {
|
|
3165
|
+
if (this.rootCluster < 0) {
|
|
3166
|
+
return;
|
|
3167
|
+
}
|
|
3168
|
+
const t = this.requireTokens();
|
|
3169
|
+
const stack = [[this.rootCluster, INVALID_INDEX]];
|
|
3170
|
+
for (let frame = stack.pop(); frame !== void 0; frame = stack.pop()) {
|
|
3171
|
+
const [open, parent] = frame;
|
|
3172
|
+
for (let p = open + 1; p < t.match[open]; p = t.nextPair(p)) {
|
|
3173
|
+
const key = t.textOf(p);
|
|
3174
|
+
const v = p + 1;
|
|
3175
|
+
if (key === "cluster" && t.kind[v] === TOKEN_OPEN) {
|
|
3176
|
+
const cluster = this.addCluster(v, parent);
|
|
3177
|
+
if (cluster !== INVALID_INDEX) {
|
|
3178
|
+
stack.push([v, cluster]);
|
|
3179
|
+
}
|
|
3180
|
+
} else if (key === "vertex" && parent !== INVALID_INDEX) {
|
|
3181
|
+
this.addClusterVertex(v, parent);
|
|
3182
|
+
}
|
|
3183
|
+
}
|
|
3184
|
+
}
|
|
3185
|
+
}
|
|
3186
|
+
/**
|
|
3187
|
+
* Put a cluster's `vertex` in it.
|
|
3188
|
+
* @param v - the value token, the vertex's id as a string
|
|
3189
|
+
* @param cluster - the cluster's group node
|
|
3190
|
+
*/
|
|
3191
|
+
addClusterVertex(v, cluster) {
|
|
3192
|
+
const t = this.requireTokens();
|
|
3193
|
+
const id = t.kind[v] === TOKEN_STRING ? this.coercer.text(t.stringOf(v)) : null;
|
|
3194
|
+
const node = id === null ? INVALID_INDEX : this.sink.indexOf(this.idMap?.get(id) ?? id);
|
|
3195
|
+
if (node === INVALID_INDEX || node === cluster) {
|
|
3196
|
+
this.report.warnOnce(
|
|
3197
|
+
"validation-error",
|
|
3198
|
+
GROUPS_CODE,
|
|
3199
|
+
`cluster vertex ${describeValue(t, v)} names no node; it is in no cluster`,
|
|
3200
|
+
{ line: t.line[v], element: "vertex" }
|
|
3201
|
+
);
|
|
3202
|
+
return;
|
|
3203
|
+
}
|
|
3204
|
+
this.setParent(node, cluster, "rootcluster");
|
|
3205
|
+
}
|
|
3206
|
+
/**
|
|
3207
|
+
* Add one OGDF cluster as a group node: its label, and its graphics box (x, y its top-left corner, width and
|
|
3208
|
+
* height) as a node's center, w and h.
|
|
3209
|
+
* @param open - the cluster record's `[`
|
|
3210
|
+
* @param parent - the group node of the cluster it is in, or INVALID_INDEX under the root
|
|
3211
|
+
* @returns the group node's index, or INVALID_INDEX when its id is taken
|
|
3212
|
+
*/
|
|
3213
|
+
addCluster(open, parent) {
|
|
3214
|
+
const t = this.requireTokens();
|
|
3215
|
+
const record = parseRecord(t, open);
|
|
3216
|
+
const ordinal = this.clusterCount++;
|
|
3217
|
+
const ownId = typeof record.id === "number" || typeof record.id === "string" ? String(record.id) : null;
|
|
3218
|
+
const fallback = `#${String(ordinal)}`;
|
|
3219
|
+
const id = `cluster${ownId ?? fallback}`;
|
|
3220
|
+
if (this.sink.indexOf(id) !== INVALID_INDEX) {
|
|
3221
|
+
this.report.warnOnce(
|
|
3222
|
+
"validation-error",
|
|
3223
|
+
GROUPS_CODE,
|
|
3224
|
+
`cluster ${id} has the id of a node; it is read as no group`,
|
|
3225
|
+
{ line: t.line[open], element: id }
|
|
3226
|
+
);
|
|
3227
|
+
return INVALID_INDEX;
|
|
3228
|
+
}
|
|
3229
|
+
const index = this.sink.addNode(id);
|
|
3230
|
+
this.report.counts.nodes++;
|
|
3231
|
+
if (parent !== INVALID_INDEX) {
|
|
3232
|
+
this.setParent(index, parent, "rootcluster");
|
|
3233
|
+
}
|
|
3234
|
+
const label = this.nodePlans.get("label");
|
|
3235
|
+
if (typeof record.label === "string" && record.label !== "" && label?.kind === "string" && !label.list) {
|
|
3236
|
+
this.sink.setNodeValue(this.handleOf(label, "node"), index, record.label);
|
|
3237
|
+
}
|
|
3238
|
+
const graphics = this.nodePlans.get("graphics");
|
|
3239
|
+
const g = isRecord(record.graphics) ? record.graphics : null;
|
|
3240
|
+
if (g === null || graphics?.position === void 0 || graphics.position === null) {
|
|
3241
|
+
return index;
|
|
3242
|
+
}
|
|
3243
|
+
const { x, y, width, height, color, style, stipple, ...rest } = g;
|
|
3244
|
+
if (typeof x === "number" && typeof y === "number" && typeof width === "number" && typeof height === "number") {
|
|
3245
|
+
this.sink.setNodeValue(this.handleOf(graphics.position, "node"), index, [x + width / 2, y + height / 2, 0]);
|
|
3246
|
+
Object.assign(rest, { w: width, h: height });
|
|
3247
|
+
}
|
|
3248
|
+
Object.assign(
|
|
3249
|
+
rest,
|
|
3250
|
+
color === void 0 ? {} : { outline: color },
|
|
3251
|
+
style === void 0 ? {} : { type: style },
|
|
3252
|
+
stipple === void 0 ? {} : { clusterStipple: stipple }
|
|
3253
|
+
);
|
|
3254
|
+
if (graphics.rest !== null) {
|
|
3255
|
+
this.sink.setNodeValue(this.handleOf(graphics.rest, "node"), index, rest);
|
|
3256
|
+
}
|
|
3257
|
+
return index;
|
|
3258
|
+
}
|
|
2649
3259
|
/** Turn every schema entry into a column plan. */
|
|
2650
3260
|
buildPlans() {
|
|
2651
3261
|
for (const [key, entry] of this.nodeSchema) {
|
|
@@ -2915,13 +3525,84 @@ class GmlImport {
|
|
|
2915
3525
|
{ line: t.line[p], element: what }
|
|
2916
3526
|
);
|
|
2917
3527
|
}
|
|
3528
|
+
/**
|
|
3529
|
+
* Find a node block's id, label and original-id values.
|
|
3530
|
+
* @param open - the block's `[`
|
|
3531
|
+
* @param close - the block's `]`
|
|
3532
|
+
* @returns each key's value token, or -1 when the block has none
|
|
3533
|
+
*/
|
|
3534
|
+
nodeKeyTokens(open, close) {
|
|
3535
|
+
const t = this.requireTokens();
|
|
3536
|
+
let idTok = -1;
|
|
3537
|
+
let labelTok = -1;
|
|
3538
|
+
let originalTok = -1;
|
|
3539
|
+
for (let p = open + 1; p < close; p = t.nextPair(p)) {
|
|
3540
|
+
const key = t.textOf(p);
|
|
3541
|
+
if (key === "id") {
|
|
3542
|
+
idTok = this.structuralToken(idTok, p, "id");
|
|
3543
|
+
} else if (key === "label") {
|
|
3544
|
+
labelTok = labelTok < 0 ? p + 1 : labelTok;
|
|
3545
|
+
} else if (key === ORIGINAL_ID_KEY && this.options.restoreMangledIds) {
|
|
3546
|
+
originalTok = originalTok < 0 ? p + 1 : originalTok;
|
|
3547
|
+
}
|
|
3548
|
+
}
|
|
3549
|
+
return { idTok, labelTok, originalTok };
|
|
3550
|
+
}
|
|
3551
|
+
/**
|
|
3552
|
+
* The id a node is added to the sink under: its restored original id, else its label, its
|
|
3553
|
+
* ordinal or its file id, as `nodeIdFrom` says.
|
|
3554
|
+
* @param fileId - the node's file id
|
|
3555
|
+
* @param labelTok - its label's value token, or -1
|
|
3556
|
+
* @param originalTok - its original id's value token, or -1
|
|
3557
|
+
* @param ordinal - its position among the file's nodes
|
|
3558
|
+
* @returns the sink id
|
|
3559
|
+
*/
|
|
3560
|
+
nodeSinkId(fileId, labelTok, originalTok, ordinal) {
|
|
3561
|
+
if (originalTok >= 0) {
|
|
3562
|
+
return this.restoredId(originalTok);
|
|
3563
|
+
}
|
|
3564
|
+
switch (this.options.nodeIdFrom) {
|
|
3565
|
+
case "label":
|
|
3566
|
+
if (labelTok < 0) {
|
|
3567
|
+
throw new GraphFormatError("E_INVALID_ID", "node has no label", {
|
|
3568
|
+
reason: "missing label"
|
|
3569
|
+
});
|
|
3570
|
+
}
|
|
3571
|
+
return this.coerceValueToken(labelTok);
|
|
3572
|
+
case "index":
|
|
3573
|
+
return ordinal;
|
|
3574
|
+
default:
|
|
3575
|
+
return fileId;
|
|
3576
|
+
}
|
|
3577
|
+
}
|
|
3578
|
+
/**
|
|
3579
|
+
* Note which sink id a file id resolves to, warning when a file id is declared twice.
|
|
3580
|
+
* @param fileId - the file id
|
|
3581
|
+
* @param sinkId - the sink id it now resolves to
|
|
3582
|
+
* @param line - the node block's line
|
|
3583
|
+
*/
|
|
3584
|
+
mapFileId(fileId, sinkId, line) {
|
|
3585
|
+
if (this.idMap === null) {
|
|
3586
|
+
return;
|
|
3587
|
+
}
|
|
3588
|
+
const before = this.idMap.get(fileId);
|
|
3589
|
+
if (before !== void 0 && before !== sinkId) {
|
|
3590
|
+
this.report.warning(
|
|
3591
|
+
"merged",
|
|
3592
|
+
DUPLICATE_NODE_CODE,
|
|
3593
|
+
`file id ${JSON.stringify(fileId)} is declared twice (nodes ${JSON.stringify(before)} and ${JSON.stringify(sinkId)}); edges to it resolve to the later`,
|
|
3594
|
+
{ line, element: String(fileId) }
|
|
3595
|
+
);
|
|
3596
|
+
}
|
|
3597
|
+
this.idMap.set(fileId, sinkId);
|
|
3598
|
+
}
|
|
2918
3599
|
/**
|
|
2919
3600
|
* Push one node block.
|
|
2920
3601
|
* @param open - the block's `[`
|
|
2921
3602
|
*/
|
|
2922
3603
|
importNode(open) {
|
|
2923
3604
|
const t = this.requireTokens();
|
|
2924
|
-
const { sink, report
|
|
3605
|
+
const { sink, report } = this;
|
|
2925
3606
|
const close = t.match[open];
|
|
2926
3607
|
const line = t.line[open];
|
|
2927
3608
|
const ordinal = this.nodeOrdinal++;
|
|
@@ -2930,55 +3611,14 @@ class GmlImport {
|
|
|
2930
3611
|
let sinkId;
|
|
2931
3612
|
let fileId;
|
|
2932
3613
|
try {
|
|
2933
|
-
|
|
2934
|
-
let labelTok = -1;
|
|
2935
|
-
let originalTok = -1;
|
|
2936
|
-
for (let p = open + 1; p < close; p = t.nextPair(p)) {
|
|
2937
|
-
const key = t.textOf(p);
|
|
2938
|
-
if (key === "id") {
|
|
2939
|
-
idTok = this.structuralToken(idTok, p, "id");
|
|
2940
|
-
} else if (key === "label") {
|
|
2941
|
-
labelTok = labelTok < 0 ? p + 1 : labelTok;
|
|
2942
|
-
} else if (key === ORIGINAL_ID_KEY && options.restoreMangledIds) {
|
|
2943
|
-
originalTok = originalTok < 0 ? p + 1 : originalTok;
|
|
2944
|
-
}
|
|
2945
|
-
}
|
|
3614
|
+
const { idTok, labelTok, originalTok } = this.nodeKeyTokens(open, close);
|
|
2946
3615
|
if (idTok < 0) {
|
|
2947
3616
|
throw new GraphFormatError("E_INVALID_ID", "node has no id", { reason: "missing id" });
|
|
2948
3617
|
}
|
|
2949
3618
|
fileId = this.coerceFileId(idTok, this.fileIdOf(idTok, "id"));
|
|
2950
|
-
|
|
2951
|
-
sinkId = this.restoredId(originalTok);
|
|
2952
|
-
} else {
|
|
2953
|
-
switch (options.nodeIdFrom) {
|
|
2954
|
-
case "label":
|
|
2955
|
-
if (labelTok < 0) {
|
|
2956
|
-
throw new GraphFormatError("E_INVALID_ID", "node has no label", {
|
|
2957
|
-
reason: "missing label"
|
|
2958
|
-
});
|
|
2959
|
-
}
|
|
2960
|
-
sinkId = this.coerceValueToken(labelTok);
|
|
2961
|
-
break;
|
|
2962
|
-
case "index":
|
|
2963
|
-
sinkId = ordinal;
|
|
2964
|
-
break;
|
|
2965
|
-
default:
|
|
2966
|
-
sinkId = fileId;
|
|
2967
|
-
}
|
|
2968
|
-
}
|
|
3619
|
+
sinkId = this.nodeSinkId(fileId, labelTok, originalTok, ordinal);
|
|
2969
3620
|
index = sink.addNode(sinkId);
|
|
2970
|
-
|
|
2971
|
-
const before = this.idMap.get(fileId);
|
|
2972
|
-
if (before !== void 0 && before !== sinkId) {
|
|
2973
|
-
report.warning(
|
|
2974
|
-
"merged",
|
|
2975
|
-
DUPLICATE_NODE_CODE,
|
|
2976
|
-
`file id ${JSON.stringify(fileId)} is declared twice (nodes ${JSON.stringify(before)} and ${JSON.stringify(sinkId)}); edges to it resolve to the later`,
|
|
2977
|
-
{ line, element: String(fileId) }
|
|
2978
|
-
);
|
|
2979
|
-
}
|
|
2980
|
-
this.idMap.set(fileId, sinkId);
|
|
2981
|
-
}
|
|
3621
|
+
this.mapFileId(fileId, sinkId, line);
|
|
2982
3622
|
} catch (err) {
|
|
2983
3623
|
this.recordNodeError(err, line);
|
|
2984
3624
|
report.counts.skippedNodes++;
|
|
@@ -3000,33 +3640,47 @@ class GmlImport {
|
|
|
3000
3640
|
}
|
|
3001
3641
|
this.beginElement(this.seq++);
|
|
3002
3642
|
try {
|
|
3003
|
-
|
|
3004
|
-
let graphicsPlan = null;
|
|
3005
|
-
for (let p = open + 1; p < close; p = t.nextPair(p)) {
|
|
3006
|
-
const key = t.textOf(p);
|
|
3007
|
-
if (key === "id" || key === ORIGINAL_ID_KEY && options.restoreMangledIds) {
|
|
3008
|
-
continue;
|
|
3009
|
-
}
|
|
3010
|
-
const plan = this.nodePlans.get(key);
|
|
3011
|
-
if (plan !== void 0 && plan.position !== null) {
|
|
3012
|
-
graphicsPlan = plan;
|
|
3013
|
-
graphics.push(p + 1);
|
|
3014
|
-
} else if (plan !== void 0) {
|
|
3015
|
-
this.writeNode(plan, index, p + 1);
|
|
3016
|
-
}
|
|
3017
|
-
}
|
|
3018
|
-
if (graphicsPlan !== null) {
|
|
3019
|
-
this.writeGraphics(graphicsPlan, index, graphics, {
|
|
3020
|
-
line: t.line[graphics[0]],
|
|
3021
|
-
element: String(sinkId)
|
|
3022
|
-
});
|
|
3023
|
-
}
|
|
3643
|
+
this.writeNodeKeys(open, index, sinkId);
|
|
3024
3644
|
this.flushLists("node", index);
|
|
3025
3645
|
} catch (err) {
|
|
3026
3646
|
this.touched.length = 0;
|
|
3027
3647
|
report.recordError(err, { line, element: String(sinkId) });
|
|
3028
3648
|
}
|
|
3029
3649
|
}
|
|
3650
|
+
/**
|
|
3651
|
+
* Write one node block's keys into its columns: its graphics record into the position plan, a yEd `gid` noted
|
|
3652
|
+
* for the group hierarchy, and every other planned key as it is.
|
|
3653
|
+
* @param open - the block's `[`
|
|
3654
|
+
* @param index - the node's index
|
|
3655
|
+
* @param sinkId - the node's id, for the report
|
|
3656
|
+
*/
|
|
3657
|
+
writeNodeKeys(open, index, sinkId) {
|
|
3658
|
+
const t = this.requireTokens();
|
|
3659
|
+
const graphics = [];
|
|
3660
|
+
let graphicsPlan = null;
|
|
3661
|
+
for (let p = open + 1; p < t.match[open]; p = t.nextPair(p)) {
|
|
3662
|
+
const key = t.textOf(p);
|
|
3663
|
+
if (key === "id" || key === ORIGINAL_ID_KEY && this.options.restoreMangledIds) {
|
|
3664
|
+
continue;
|
|
3665
|
+
}
|
|
3666
|
+
if (key === "gid") {
|
|
3667
|
+
this.groupRefs.push([index, p + 1]);
|
|
3668
|
+
}
|
|
3669
|
+
const plan = this.nodePlans.get(key);
|
|
3670
|
+
if (plan !== void 0 && plan.position !== null) {
|
|
3671
|
+
graphicsPlan = plan;
|
|
3672
|
+
graphics.push(p + 1);
|
|
3673
|
+
} else if (plan !== void 0) {
|
|
3674
|
+
this.writeNode(plan, index, p + 1);
|
|
3675
|
+
}
|
|
3676
|
+
}
|
|
3677
|
+
if (graphicsPlan !== null) {
|
|
3678
|
+
this.writeGraphics(graphicsPlan, index, graphics, {
|
|
3679
|
+
line: t.line[graphics[0]],
|
|
3680
|
+
element: String(sinkId)
|
|
3681
|
+
});
|
|
3682
|
+
}
|
|
3683
|
+
}
|
|
3030
3684
|
/**
|
|
3031
3685
|
* Push one edge block.
|
|
3032
3686
|
* @param open - the block's `[`
|
|
@@ -3807,7 +4461,7 @@ const GML_ISSUE = Object.freeze({
|
|
|
3807
4461
|
GRAPHICS: GRAPHICS_CODE,
|
|
3808
4462
|
/** A graph, node or edge record nested in a node or edge; kept as json, not read as structure. */
|
|
3809
4463
|
NESTED_ELEMENT: NESTED_ELEMENT_CODE,
|
|
3810
|
-
/**
|
|
4464
|
+
/** A yEd `gid` that names no other node; it stays a plain column value and puts the node in no group. */
|
|
3811
4465
|
GROUPS: GROUPS_CODE,
|
|
3812
4466
|
/**
|
|
3813
4467
|
* An attribute's type was widened because a later value did not fit: an integer above 2^31 in an integer column,
|