@graphty/graph-io 0.3.47 → 0.3.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{approximations-wWjCRzKj.js → approximations-Bzn3L-je.js} +2 -2
- package/dist/chunks/{approximations-wWjCRzKj.js.map → approximations-Bzn3L-je.js.map} +1 -1
- package/dist/chunks/bends-BGXjv_U4.js +129 -0
- package/dist/chunks/bends-BGXjv_U4.js.map +1 -0
- package/dist/chunks/{block-DiGq58c3.js → block-iptrlMBb.js} +947 -134
- package/dist/chunks/block-iptrlMBb.js.map +1 -0
- package/dist/chunks/choose-CczZJaX_.js +717 -0
- package/dist/chunks/choose-CczZJaX_.js.map +1 -0
- package/dist/chunks/codes-BE2xir2k.js +157 -0
- package/dist/chunks/codes-BE2xir2k.js.map +1 -0
- package/dist/chunks/{constants-BKwqelYD.js → constants-CKkYLPtt.js} +2 -2
- package/dist/chunks/{constants-BKwqelYD.js.map → constants-CKkYLPtt.js.map} +1 -1
- package/dist/chunks/context-C3p0RQxR.js +664 -0
- package/dist/chunks/context-C3p0RQxR.js.map +1 -0
- 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-DXHx7nwR.js +349 -0
- package/dist/chunks/credentials-DXHx7nwR.js.map +1 -0
- package/dist/chunks/cx-export-Bt6NoqTQ.js +259 -0
- package/dist/chunks/cx-export-Bt6NoqTQ.js.map +1 -0
- package/dist/chunks/descriptor-B28U25x4.js +60 -0
- package/dist/chunks/descriptor-B28U25x4.js.map +1 -0
- package/dist/chunks/descriptor-C-YDhtsn.js +48 -0
- package/dist/chunks/descriptor-C-YDhtsn.js.map +1 -0
- package/dist/chunks/descriptor-DLA5kINx.js +142 -0
- package/dist/chunks/descriptor-DLA5kINx.js.map +1 -0
- package/dist/chunks/{emit-CwU8cUmG.js → emit-BwHQkZle.js} +1690 -103
- package/dist/chunks/emit-BwHQkZle.js.map +1 -0
- package/dist/chunks/{escape-CgzxiYPg.js → escape-CuCIzNMB.js} +12 -12
- package/dist/chunks/{escape-CgzxiYPg.js.map → escape-CuCIzNMB.js.map} +1 -1
- package/dist/chunks/{export-BvqAXCKh.js → export-Cha4dRFz.js} +48 -1780
- package/dist/chunks/export-Cha4dRFz.js.map +1 -0
- package/dist/chunks/{exporter--Mk9gXCJ.js → exporter-BP6otMO6.js} +6 -4
- package/dist/chunks/{exporter--Mk9gXCJ.js.map → exporter-BP6otMO6.js.map} +1 -1
- package/dist/chunks/{exporter-CrDWIyiq.js → exporter-D2CETOMK.js} +1222 -154
- package/dist/chunks/exporter-D2CETOMK.js.map +1 -0
- package/dist/chunks/{exporter-DndFlGSa.js → exporter-D9yMtocA.js} +7 -6
- package/dist/chunks/{exporter-DndFlGSa.js.map → exporter-D9yMtocA.js.map} +1 -1
- package/dist/chunks/exporter-_jrBTnos.js +1009 -0
- package/dist/chunks/exporter-_jrBTnos.js.map +1 -0
- package/dist/chunks/{exporter-CJgfhF-l.js → exporter-nDfxIK5D.js} +9 -7
- package/dist/chunks/{exporter-CJgfhF-l.js.map → exporter-nDfxIK5D.js.map} +1 -1
- package/dist/chunks/format-BXiAb-1h.js +408 -0
- package/dist/chunks/format-BXiAb-1h.js.map +1 -0
- package/dist/chunks/{generic-Dq1ntt9q.js → generic-ymWCETAJ.js} +387 -31
- package/dist/chunks/generic-ymWCETAJ.js.map +1 -0
- package/dist/chunks/{importer-CMmeMWlC.js → importer-B92x1xY5.js} +15 -263
- package/dist/chunks/importer-B92x1xY5.js.map +1 -0
- package/dist/chunks/{importer-DiZRmOQG.js → importer-CT9mJ1nn.js} +328 -90
- package/dist/chunks/importer-CT9mJ1nn.js.map +1 -0
- package/dist/chunks/{importer-COTK9Tsl.js → importer-DaLTjbds.js} +116 -1099
- package/dist/chunks/importer-DaLTjbds.js.map +1 -0
- package/dist/chunks/{importer-iFYPEKaJ.js → importer-GREKMdIf.js} +28 -16
- package/dist/chunks/importer-GREKMdIf.js.map +1 -0
- package/dist/chunks/{importer-BSvfrX_h.js → importer-PqaaKKnY.js} +23 -1016
- package/dist/chunks/importer-PqaaKKnY.js.map +1 -0
- package/dist/chunks/{importer-yh_aBCU6.js → importer-Vn5QvmmJ.js} +66 -12
- package/dist/chunks/importer-Vn5QvmmJ.js.map +1 -0
- package/dist/chunks/{importer-e6LGpqHB.js → importer-vRq4h3j5.js} +1470 -354
- package/dist/chunks/importer-vRq4h3j5.js.map +1 -0
- package/dist/chunks/input-CAxt_aV-.js +1397 -0
- package/dist/chunks/input-CAxt_aV-.js.map +1 -0
- package/dist/chunks/{json-elements-DJZRZ6jd.js → json-elements-Cq76WjnZ.js} +4 -4
- package/dist/chunks/{json-elements-DJZRZ6jd.js.map → json-elements-Cq76WjnZ.js.map} +1 -1
- package/dist/chunks/{lexicon-CT69Kd87.js → lexicon-Clf4QIyl.js} +299 -77
- package/dist/chunks/lexicon-Clf4QIyl.js.map +1 -0
- package/dist/chunks/{ontology-export-G4MqRdux.js → ontology-export-OMo91mb0.js} +4 -3
- package/dist/chunks/{ontology-export-G4MqRdux.js.map → ontology-export-OMo91mb0.js.map} +1 -1
- package/dist/chunks/{records-CiaWZrFH.js → records-NJiYvekn.js} +2 -2
- package/dist/chunks/{records-CiaWZrFH.js.map → records-NJiYvekn.js.map} +1 -1
- package/dist/chunks/{format-BpQBx8MZ.js → report-CwMfYa9J.js} +70 -127
- package/dist/chunks/report-CwMfYa9J.js.map +1 -0
- package/dist/chunks/round-trip-Zm3_ivgq.js +79 -0
- package/dist/chunks/round-trip-Zm3_ivgq.js.map +1 -0
- package/dist/chunks/sigv4-EokFic1V.js +247 -0
- package/dist/chunks/sigv4-EokFic1V.js.map +1 -0
- package/dist/chunks/{styles-BQnsga7p.js → styles-CCs214_3.js} +1300 -168
- package/dist/chunks/styles-CCs214_3.js.map +1 -0
- package/dist/chunks/styles-Cm62yyQX.js +2812 -0
- package/dist/chunks/styles-Cm62yyQX.js.map +1 -0
- package/dist/chunks/styles-DPQQIig4.js +1928 -0
- package/dist/chunks/styles-DPQQIig4.js.map +1 -0
- package/dist/chunks/styles-yed-UMFdNqze.js +1213 -0
- package/dist/chunks/styles-yed-UMFdNqze.js.map +1 -0
- package/dist/chunks/{text-CzJNFOS9.js → text-ystE2bYi.js} +2 -2
- package/dist/chunks/{text-CzJNFOS9.js.map → text-ystE2bYi.js.map} +1 -1
- package/dist/csv.js +7 -5
- package/dist/csv.js.map +1 -1
- package/dist/cx.js +5 -4
- package/dist/cx.js.map +1 -1
- package/dist/cx2.js +2 -2
- package/dist/cys.js +1 -1
- package/dist/dot.js +5 -4
- package/dist/dot.js.map +1 -1
- package/dist/gexf.js +42 -10
- package/dist/gexf.js.map +1 -1
- package/dist/gml.js +850 -193
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +1189 -220
- package/dist/graph-io.js.map +1 -1
- package/dist/graphml.js +3 -3
- package/dist/json.js +3 -2
- package/dist/neo4j.js +6 -4
- package/dist/neo4j.js.map +1 -1
- 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.d.ts +1 -0
- package/dist/sources-cypher.js +1351 -0
- package/dist/sources-cypher.js.map +1 -0
- package/dist/sources-ndex.d.ts +1 -0
- package/dist/sources-ndex.js +278 -0
- package/dist/sources-ndex.js.map +1 -0
- package/dist/sources-rest.d.ts +1 -0
- package/dist/sources-rest.js +1377 -0
- package/dist/sources-rest.js.map +1 -0
- package/dist/sources-sparql.d.ts +1 -0
- package/dist/sources-sparql.js +405 -0
- package/dist/sources-sparql.js.map +1 -0
- package/dist/src/common/report.d.ts +6 -3
- package/dist/src/common/report.d.ts.map +1 -1
- package/dist/src/common/report.js +15 -9
- package/dist/src/common/report.js.map +1 -1
- 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 +118 -11
- package/dist/src/formats/cx/styles.js.map +1 -1
- package/dist/src/formats/cx2/importer.d.ts.map +1 -1
- package/dist/src/formats/cx2/importer.js +1 -0
- package/dist/src/formats/cx2/importer.js.map +1 -1
- package/dist/src/formats/cx2/styles.d.ts.map +1 -1
- package/dist/src/formats/cx2/styles.js +3 -1
- package/dist/src/formats/cx2/styles.js.map +1 -1
- package/dist/src/formats/cys/importer.d.ts.map +1 -1
- package/dist/src/formats/cys/importer.js +1 -0
- package/dist/src/formats/cys/importer.js.map +1 -1
- package/dist/src/formats/cys/styles.d.ts +2 -0
- package/dist/src/formats/cys/styles.d.ts.map +1 -1
- package/dist/src/formats/cys/styles.js +15 -7
- package/dist/src/formats/cys/styles.js.map +1 -1
- package/dist/src/formats/dot/drawing.d.ts +98 -0
- package/dist/src/formats/dot/drawing.d.ts.map +1 -0
- package/dist/src/formats/dot/drawing.js +734 -0
- package/dist/src/formats/dot/drawing.js.map +1 -0
- package/dist/src/formats/dot/importer.d.ts.map +1 -1
- package/dist/src/formats/dot/importer.js +108 -31
- package/dist/src/formats/dot/importer.js.map +1 -1
- package/dist/src/formats/dot/label-places.d.ts +34 -0
- package/dist/src/formats/dot/label-places.d.ts.map +1 -0
- package/dist/src/formats/dot/label-places.js +179 -0
- package/dist/src/formats/dot/label-places.js.map +1 -0
- package/dist/src/formats/dot/record.d.ts +50 -0
- package/dist/src/formats/dot/record.d.ts.map +1 -0
- package/dist/src/formats/dot/record.js +275 -0
- package/dist/src/formats/dot/record.js.map +1 -0
- package/dist/src/formats/dot/styles.d.ts +62 -2
- package/dist/src/formats/dot/styles.d.ts.map +1 -1
- package/dist/src/formats/dot/styles.js +1457 -120
- 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 +60 -16
- package/dist/src/formats/gexf/styles.d.ts.map +1 -1
- package/dist/src/formats/gexf/styles.js +883 -131
- 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 +756 -103
- 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 +8 -12
- 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 +749 -148
- package/dist/src/formats/graphml/styles-yed.js.map +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.js +429 -64
- package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
- package/dist/src/formats/graphml/yfiles.d.ts +3 -3
- package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
- package/dist/src/formats/graphml/yfiles.js +16 -6
- package/dist/src/formats/graphml/yfiles.js.map +1 -1
- package/dist/src/formats/json/dialect.d.ts +3 -2
- package/dist/src/formats/json/dialect.d.ts.map +1 -1
- package/dist/src/formats/json/dialect.js +39 -5
- package/dist/src/formats/json/dialect.js.map +1 -1
- package/dist/src/formats/json/importer.d.ts +13 -2
- package/dist/src/formats/json/importer.d.ts.map +1 -1
- package/dist/src/formats/json/importer.js +42 -6
- package/dist/src/formats/json/importer.js.map +1 -1
- package/dist/src/formats/json/index.d.ts +1 -1
- package/dist/src/formats/json/index.d.ts.map +1 -1
- package/dist/src/formats/json/index.js +1 -1
- package/dist/src/formats/json/index.js.map +1 -1
- package/dist/src/formats/json/positions.d.ts +5 -2
- package/dist/src/formats/json/positions.d.ts.map +1 -1
- package/dist/src/formats/json/positions.js +20 -4
- package/dist/src/formats/json/positions.js.map +1 -1
- package/dist/src/formats/json/styles.d.ts +12 -1
- package/dist/src/formats/json/styles.d.ts.map +1 -1
- package/dist/src/formats/json/styles.js +1755 -136
- package/dist/src/formats/json/styles.js.map +1 -1
- package/dist/src/formats/pajek/draw.d.ts +96 -0
- package/dist/src/formats/pajek/draw.d.ts.map +1 -0
- package/dist/src/formats/pajek/draw.js +372 -0
- package/dist/src/formats/pajek/draw.js.map +1 -0
- package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
- package/dist/src/formats/pajek/exporter.js +70 -51
- package/dist/src/formats/pajek/exporter.js.map +1 -1
- package/dist/src/formats/pajek/importer.d.ts +9 -0
- package/dist/src/formats/pajek/importer.d.ts.map +1 -1
- package/dist/src/formats/pajek/importer.js +233 -102
- package/dist/src/formats/pajek/importer.js.map +1 -1
- package/dist/src/formats/pajek/index.d.ts +1 -0
- package/dist/src/formats/pajek/index.d.ts.map +1 -1
- package/dist/src/formats/pajek/index.js.map +1 -1
- package/dist/src/formats/pajek/styles.d.ts +15 -7
- package/dist/src/formats/pajek/styles.d.ts.map +1 -1
- package/dist/src/formats/pajek/styles.js +1279 -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 +278 -60
- package/dist/src/formats/xgmml/styles.js.map +1 -1
- package/dist/src/index.d.ts +10 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +11 -2
- 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/registry.d.ts +173 -1
- package/dist/src/registry.d.ts.map +1 -1
- package/dist/src/registry.js +196 -1
- package/dist/src/registry.js.map +1 -1
- package/dist/src/sources/builtins.d.ts +11 -0
- package/dist/src/sources/builtins.d.ts.map +1 -0
- package/dist/src/sources/builtins.js +53 -0
- package/dist/src/sources/builtins.js.map +1 -0
- package/dist/src/sources/codes.d.ts +230 -0
- package/dist/src/sources/codes.d.ts.map +1 -0
- package/dist/src/sources/codes.js +58 -0
- package/dist/src/sources/codes.js.map +1 -0
- package/dist/src/sources/context.d.ts +112 -0
- package/dist/src/sources/context.d.ts.map +1 -0
- package/dist/src/sources/context.js +740 -0
- package/dist/src/sources/context.js.map +1 -0
- package/dist/src/sources/credentials.d.ts +179 -0
- package/dist/src/sources/credentials.d.ts.map +1 -0
- package/dist/src/sources/credentials.js +301 -0
- package/dist/src/sources/credentials.js.map +1 -0
- package/dist/src/sources/cypher/descriptor.d.ts +21 -0
- package/dist/src/sources/cypher/descriptor.d.ts.map +1 -0
- package/dist/src/sources/cypher/descriptor.js +124 -0
- package/dist/src/sources/cypher/descriptor.js.map +1 -0
- package/dist/src/sources/cypher/flatten.d.ts +72 -0
- package/dist/src/sources/cypher/flatten.d.ts.map +1 -0
- package/dist/src/sources/cypher/flatten.js +279 -0
- package/dist/src/sources/cypher/flatten.js.map +1 -0
- package/dist/src/sources/cypher/index.d.ts +33 -0
- package/dist/src/sources/cypher/index.d.ts.map +1 -0
- package/dist/src/sources/cypher/index.js +511 -0
- package/dist/src/sources/cypher/index.js.map +1 -0
- package/dist/src/sources/cypher/params.d.ts +40 -0
- package/dist/src/sources/cypher/params.d.ts.map +1 -0
- package/dist/src/sources/cypher/params.js +6 -0
- package/dist/src/sources/cypher/params.js.map +1 -0
- package/dist/src/sources/cypher/profiles.d.ts +44 -0
- package/dist/src/sources/cypher/profiles.d.ts.map +1 -0
- package/dist/src/sources/cypher/profiles.js +61 -0
- package/dist/src/sources/cypher/profiles.js.map +1 -0
- package/dist/src/sources/cypher/query-builder.d.ts +123 -0
- package/dist/src/sources/cypher/query-builder.d.ts.map +1 -0
- package/dist/src/sources/cypher/query-builder.js +267 -0
- package/dist/src/sources/cypher/query-builder.js.map +1 -0
- package/dist/src/sources/cypher/transports/bolt.d.ts +21 -0
- package/dist/src/sources/cypher/transports/bolt.d.ts.map +1 -0
- package/dist/src/sources/cypher/transports/bolt.js +185 -0
- package/dist/src/sources/cypher/transports/bolt.js.map +1 -0
- package/dist/src/sources/cypher/transports/neptune-analytics.d.ts +15 -0
- package/dist/src/sources/cypher/transports/neptune-analytics.d.ts.map +1 -0
- package/dist/src/sources/cypher/transports/neptune-analytics.js +38 -0
- package/dist/src/sources/cypher/transports/neptune-analytics.js.map +1 -0
- package/dist/src/sources/cypher/transports/neptune-https.d.ts +31 -0
- package/dist/src/sources/cypher/transports/neptune-https.d.ts.map +1 -0
- package/dist/src/sources/cypher/transports/neptune-https.js +104 -0
- package/dist/src/sources/cypher/transports/neptune-https.js.map +1 -0
- package/dist/src/sources/cypher/transports/query-api.d.ts +14 -0
- package/dist/src/sources/cypher/transports/query-api.d.ts.map +1 -0
- package/dist/src/sources/cypher/transports/query-api.js +80 -0
- package/dist/src/sources/cypher/transports/query-api.js.map +1 -0
- package/dist/src/sources/cypher/transports/transport.d.ts +78 -0
- package/dist/src/sources/cypher/transports/transport.d.ts.map +1 -0
- package/dist/src/sources/cypher/transports/transport.js +77 -0
- package/dist/src/sources/cypher/transports/transport.js.map +1 -0
- package/dist/src/sources/cypher/types-map.d.ts +91 -0
- package/dist/src/sources/cypher/types-map.d.ts.map +1 -0
- package/dist/src/sources/cypher/types-map.js +306 -0
- package/dist/src/sources/cypher/types-map.js.map +1 -0
- package/dist/src/sources/define.d.ts +47 -0
- package/dist/src/sources/define.d.ts.map +1 -0
- package/dist/src/sources/define.js +173 -0
- package/dist/src/sources/define.js.map +1 -0
- package/dist/src/sources/fail.d.ts +33 -0
- package/dist/src/sources/fail.d.ts.map +1 -0
- package/dist/src/sources/fail.js +49 -0
- package/dist/src/sources/fail.js.map +1 -0
- package/dist/src/sources/ids.d.ts +69 -0
- package/dist/src/sources/ids.d.ts.map +1 -0
- package/dist/src/sources/ids.js +69 -0
- package/dist/src/sources/ids.js.map +1 -0
- package/dist/src/sources/ndex/client.d.ts +31 -0
- package/dist/src/sources/ndex/client.d.ts.map +1 -0
- package/dist/src/sources/ndex/client.js +90 -0
- package/dist/src/sources/ndex/client.js.map +1 -0
- package/dist/src/sources/ndex/descriptor.d.ts +10 -0
- package/dist/src/sources/ndex/descriptor.d.ts.map +1 -0
- package/dist/src/sources/ndex/descriptor.js +55 -0
- package/dist/src/sources/ndex/descriptor.js.map +1 -0
- package/dist/src/sources/ndex/expand.d.ts +20 -0
- package/dist/src/sources/ndex/expand.d.ts.map +1 -0
- package/dist/src/sources/ndex/expand.js +87 -0
- package/dist/src/sources/ndex/expand.js.map +1 -0
- package/dist/src/sources/ndex/index.d.ts +25 -0
- package/dist/src/sources/ndex/index.d.ts.map +1 -0
- package/dist/src/sources/ndex/index.js +191 -0
- package/dist/src/sources/ndex/index.js.map +1 -0
- package/dist/src/sources/ndex/params.d.ts +17 -0
- package/dist/src/sources/ndex/params.d.ts.map +1 -0
- package/dist/src/sources/ndex/params.js +6 -0
- package/dist/src/sources/ndex/params.js.map +1 -0
- package/dist/src/sources/ndex/share-url.d.ts +40 -0
- package/dist/src/sources/ndex/share-url.d.ts.map +1 -0
- package/dist/src/sources/ndex/share-url.js +64 -0
- package/dist/src/sources/ndex/share-url.js.map +1 -0
- package/dist/src/sources/params.d.ts +31 -0
- package/dist/src/sources/params.d.ts.map +1 -0
- package/dist/src/sources/params.js +6 -0
- package/dist/src/sources/params.js.map +1 -0
- package/dist/src/sources/registry.d.ts +118 -0
- package/dist/src/sources/registry.d.ts.map +1 -0
- package/dist/src/sources/registry.js +193 -0
- package/dist/src/sources/registry.js.map +1 -0
- package/dist/src/sources/rest/descriptor.d.ts +16 -0
- package/dist/src/sources/rest/descriptor.d.ts.map +1 -0
- package/dist/src/sources/rest/descriptor.js +76 -0
- package/dist/src/sources/rest/descriptor.js.map +1 -0
- package/dist/src/sources/rest/index.d.ts +14 -0
- package/dist/src/sources/rest/index.d.ts.map +1 -0
- package/dist/src/sources/rest/index.js +13 -0
- package/dist/src/sources/rest/index.js.map +1 -0
- package/dist/src/sources/rest/mapping.d.ts +30 -0
- package/dist/src/sources/rest/mapping.d.ts.map +1 -0
- package/dist/src/sources/rest/mapping.js +362 -0
- package/dist/src/sources/rest/mapping.js.map +1 -0
- package/dist/src/sources/rest/openalex.d.ts +27 -0
- package/dist/src/sources/rest/openalex.d.ts.map +1 -0
- package/dist/src/sources/rest/openalex.js +269 -0
- package/dist/src/sources/rest/openalex.js.map +1 -0
- package/dist/src/sources/rest/paging.d.ts +53 -0
- package/dist/src/sources/rest/paging.d.ts.map +1 -0
- package/dist/src/sources/rest/paging.js +138 -0
- package/dist/src/sources/rest/paging.js.map +1 -0
- package/dist/src/sources/rest/params.d.ts +216 -0
- package/dist/src/sources/rest/params.d.ts.map +1 -0
- package/dist/src/sources/rest/params.js +7 -0
- package/dist/src/sources/rest/params.js.map +1 -0
- package/dist/src/sources/rest/records.d.ts +41 -0
- package/dist/src/sources/rest/records.d.ts.map +1 -0
- package/dist/src/sources/rest/records.js +240 -0
- package/dist/src/sources/rest/records.js.map +1 -0
- package/dist/src/sources/rest/samples/deps-dev.d.ts +10 -0
- package/dist/src/sources/rest/samples/deps-dev.d.ts.map +1 -0
- package/dist/src/sources/rest/samples/deps-dev.js +47 -0
- package/dist/src/sources/rest/samples/deps-dev.js.map +1 -0
- package/dist/src/sources/rest/samples/string.d.ts +9 -0
- package/dist/src/sources/rest/samples/string.d.ts.map +1 -0
- package/dist/src/sources/rest/samples/string.js +42 -0
- package/dist/src/sources/rest/samples/string.js.map +1 -0
- package/dist/src/sources/rest/selectors.d.ts +41 -0
- package/dist/src/sources/rest/selectors.d.ts.map +1 -0
- package/dist/src/sources/rest/selectors.js +81 -0
- package/dist/src/sources/rest/selectors.js.map +1 -0
- package/dist/src/sources/rest/source.d.ts +67 -0
- package/dist/src/sources/rest/source.d.ts.map +1 -0
- package/dist/src/sources/rest/source.js +650 -0
- package/dist/src/sources/rest/source.js.map +1 -0
- package/dist/src/sources/rest/templates.d.ts +38 -0
- package/dist/src/sources/rest/templates.d.ts.map +1 -0
- package/dist/src/sources/rest/templates.js +125 -0
- package/dist/src/sources/rest/templates.js.map +1 -0
- package/dist/src/sources/run.d.ts +93 -0
- package/dist/src/sources/run.d.ts.map +1 -0
- package/dist/src/sources/run.js +673 -0
- package/dist/src/sources/run.js.map +1 -0
- package/dist/src/sources/sha256.d.ts +12 -0
- package/dist/src/sources/sha256.d.ts.map +1 -0
- package/dist/src/sources/sha256.js +95 -0
- package/dist/src/sources/sha256.js.map +1 -0
- package/dist/src/sources/sigv4.d.ts +26 -0
- package/dist/src/sources/sigv4.d.ts.map +1 -0
- package/dist/src/sources/sigv4.js +184 -0
- package/dist/src/sources/sigv4.js.map +1 -0
- package/dist/src/sources/sparql/descriptor.d.ts +10 -0
- package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
- package/dist/src/sources/sparql/descriptor.js +64 -0
- package/dist/src/sources/sparql/descriptor.js.map +1 -0
- package/dist/src/sources/sparql/index.d.ts +28 -0
- package/dist/src/sources/sparql/index.d.ts.map +1 -0
- package/dist/src/sources/sparql/index.js +314 -0
- package/dist/src/sources/sparql/index.js.map +1 -0
- package/dist/src/sources/sparql/ntriples.d.ts +69 -0
- package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
- package/dist/src/sources/sparql/ntriples.js +180 -0
- package/dist/src/sources/sparql/ntriples.js.map +1 -0
- package/dist/src/sources/sparql/params.d.ts +27 -0
- package/dist/src/sources/sparql/params.d.ts.map +1 -0
- package/dist/src/sources/sparql/params.js +5 -0
- package/dist/src/sources/sparql/params.js.map +1 -0
- package/dist/src/sources/sparql/query.d.ts +72 -0
- package/dist/src/sources/sparql/query.d.ts.map +1 -0
- package/dist/src/sources/sparql/query.js +113 -0
- package/dist/src/sources/sparql/query.js.map +1 -0
- package/dist/src/sources/testing.d.ts +96 -0
- package/dist/src/sources/testing.d.ts.map +1 -0
- package/dist/src/sources/testing.js +138 -0
- package/dist/src/sources/testing.js.map +1 -0
- package/dist/src/sources/types.d.ts +696 -0
- package/dist/src/sources/types.d.ts.map +1 -0
- package/dist/src/sources/types.js +10 -0
- package/dist/src/sources/types.js.map +1 -0
- 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 +82 -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 +1037 -35
- 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 +5 -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 +216 -12
- 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 +48 -2
- package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
- package/dist/src/styles/cyjs/mappers.js +463 -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 +204 -44
- package/dist/src/styles/cytoscape/emit.js.map +1 -1
- package/dist/src/styles/cytoscape/lexicon.d.ts +97 -3
- package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/lexicon.js +413 -79
- 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 +46 -3
- package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/resolve.js +632 -22
- package/dist/src/styles/cytoscape/resolve.js.map +1 -1
- package/dist/src/styles/cytoscape/translate.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/translate.js +10 -10
- package/dist/src/styles/cytoscape/translate.js.map +1 -1
- package/dist/src/styles/defaults.d.ts +50 -0
- package/dist/src/styles/defaults.d.ts.map +1 -1
- package/dist/src/styles/defaults.js +315 -37
- 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/block.d.ts.map +1 -1
- package/dist/src/styles/io/block.js +9 -0
- package/dist/src/styles/io/block.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 +13 -4
- 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 +13 -1
- package/dist/src/styles/plan/resolve.d.ts.map +1 -1
- package/dist/src/styles/plan/resolve.js +53 -6
- 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 +638 -5
- 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 +218 -1
- package/dist/src/styles/vocabulary.js.map +1 -1
- package/dist/src/types.d.ts +19 -5
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/styles.js +29 -238
- package/dist/styles.js.map +1 -1
- package/dist/xgmml.js +3 -3
- package/docs/samples/people.json +6 -0
- package/package.json +53 -8
- package/src/common/report.ts +27 -7
- package/src/formats/cx/importer.ts +6 -1
- package/src/formats/cx/styles.ts +144 -9
- package/src/formats/cx2/importer.ts +1 -0
- package/src/formats/cx2/styles.ts +3 -1
- package/src/formats/cys/importer.ts +1 -0
- package/src/formats/cys/styles.ts +27 -5
- package/src/formats/dot/drawing.ts +799 -0
- package/src/formats/dot/importer.ts +120 -35
- package/src/formats/dot/label-places.ts +228 -0
- package/src/formats/dot/record.ts +336 -0
- package/src/formats/dot/styles.ts +1657 -154
- 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 +1144 -142
- 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 +854 -111
- package/src/formats/graphml/styles-plain.ts +8 -23
- package/src/formats/graphml/styles-yed.ts +821 -159
- package/src/formats/graphml/styles-yfiles3.ts +485 -63
- package/src/formats/graphml/yfiles.ts +19 -6
- package/src/formats/json/dialect.ts +41 -5
- package/src/formats/json/importer.ts +59 -7
- package/src/formats/json/index.ts +1 -0
- package/src/formats/json/positions.ts +22 -5
- package/src/formats/json/styles.ts +2041 -185
- package/src/formats/pajek/draw.ts +458 -0
- package/src/formats/pajek/exporter.ts +81 -49
- package/src/formats/pajek/importer.ts +278 -103
- package/src/formats/pajek/index.ts +1 -0
- package/src/formats/pajek/styles.ts +1382 -133
- package/src/formats/pajek/syntax.ts +27 -2
- package/src/formats/xgmml/emit.ts +73 -5
- package/src/formats/xgmml/styles.ts +331 -71
- package/src/index.ts +94 -0
- 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/registry.ts +326 -1
- package/src/sources/builtins.ts +63 -0
- package/src/sources/codes.ts +235 -0
- package/src/sources/context.ts +894 -0
- package/src/sources/credentials.ts +409 -0
- package/src/sources/cypher/descriptor.ts +131 -0
- package/src/sources/cypher/flatten.ts +323 -0
- package/src/sources/cypher/index.ts +628 -0
- package/src/sources/cypher/params.ts +41 -0
- package/src/sources/cypher/profiles.ts +78 -0
- package/src/sources/cypher/query-builder.ts +327 -0
- package/src/sources/cypher/transports/bolt.ts +228 -0
- package/src/sources/cypher/transports/neptune-analytics.ts +41 -0
- package/src/sources/cypher/transports/neptune-https.ts +122 -0
- package/src/sources/cypher/transports/query-api.ts +100 -0
- package/src/sources/cypher/transports/transport.ts +139 -0
- package/src/sources/cypher/types-map.ts +418 -0
- package/src/sources/define.ts +195 -0
- package/src/sources/fail.ts +70 -0
- package/src/sources/ids.ts +80 -0
- package/src/sources/ndex/client.ts +102 -0
- package/src/sources/ndex/descriptor.ts +64 -0
- package/src/sources/ndex/expand.ts +100 -0
- package/src/sources/ndex/index.ts +235 -0
- package/src/sources/ndex/params.ts +17 -0
- package/src/sources/ndex/share-url.ts +84 -0
- package/src/sources/params.ts +32 -0
- package/src/sources/registry.ts +325 -0
- package/src/sources/rest/descriptor.ts +79 -0
- package/src/sources/rest/index.ts +22 -0
- package/src/sources/rest/mapping.ts +401 -0
- package/src/sources/rest/openalex.ts +288 -0
- package/src/sources/rest/paging.ts +180 -0
- package/src/sources/rest/params.ts +243 -0
- package/src/sources/rest/records.ts +289 -0
- package/src/sources/rest/samples/deps-dev.ts +49 -0
- package/src/sources/rest/samples/string.ts +44 -0
- package/src/sources/rest/selectors.ts +91 -0
- package/src/sources/rest/source.ts +776 -0
- package/src/sources/rest/templates.ts +151 -0
- package/src/sources/run.ts +793 -0
- package/src/sources/sha256.ts +99 -0
- package/src/sources/sigv4.ts +209 -0
- package/src/sources/sparql/descriptor.ts +67 -0
- package/src/sources/sparql/index.ts +356 -0
- package/src/sources/sparql/ntriples.ts +219 -0
- package/src/sources/sparql/params.ts +28 -0
- package/src/sources/sparql/query.ts +162 -0
- package/src/sources/testing.ts +210 -0
- package/src/sources/types.ts +776 -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 +99 -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 +1193 -38
- package/src/styles/cyjs/defaults-table.ts +5 -0
- package/src/styles/cyjs/emit.ts +247 -16
- package/src/styles/cyjs/face.ts +372 -0
- package/src/styles/cyjs/mappers.ts +498 -28
- package/src/styles/cyjs/routes.ts +432 -0
- package/src/styles/cytoscape/charts.ts +684 -0
- package/src/styles/cytoscape/emit.ts +220 -44
- package/src/styles/cytoscape/lexicon.ts +459 -80
- package/src/styles/cytoscape/mappings.ts +108 -0
- package/src/styles/cytoscape/resolve.ts +763 -23
- package/src/styles/cytoscape/translate.ts +11 -11
- package/src/styles/defaults.ts +436 -38
- package/src/styles/index.ts +5 -0
- package/src/styles/internal.ts +1 -0
- package/src/styles/io/block.ts +10 -0
- package/src/styles/io/generic.ts +79 -23
- package/src/styles/io/round-trip.ts +202 -0
- package/src/styles/io/writer.ts +14 -4
- 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 +61 -6
- package/src/styles/slots.ts +25 -0
- package/src/styles/types.ts +658 -4
- package/src/styles/vocabulary.ts +226 -3
- package/src/types.ts +19 -5
- package/dist/chunks/block-DiGq58c3.js.map +0 -1
- package/dist/chunks/choose--jM0yYCo.js +0 -57
- package/dist/chunks/choose--jM0yYCo.js.map +0 -1
- package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
- package/dist/chunks/emit-CwU8cUmG.js.map +0 -1
- package/dist/chunks/export-BvqAXCKh.js.map +0 -1
- package/dist/chunks/exporter-CrDWIyiq.js.map +0 -1
- package/dist/chunks/format-BpQBx8MZ.js.map +0 -1
- package/dist/chunks/generic-Dq1ntt9q.js.map +0 -1
- package/dist/chunks/importer-BSvfrX_h.js.map +0 -1
- package/dist/chunks/importer-CMmeMWlC.js.map +0 -1
- package/dist/chunks/importer-COTK9Tsl.js.map +0 -1
- package/dist/chunks/importer-DiZRmOQG.js.map +0 -1
- package/dist/chunks/importer-e6LGpqHB.js.map +0 -1
- package/dist/chunks/importer-iFYPEKaJ.js.map +0 -1
- package/dist/chunks/importer-yh_aBCU6.js.map +0 -1
- package/dist/chunks/lexicon-CT69Kd87.js.map +0 -1
- package/dist/chunks/styles-BQnsga7p.js.map +0 -1
- package/dist/chunks/styles-D3fRphrO.js +0 -690
- package/dist/chunks/styles-D3fRphrO.js.map +0 -1
- package/dist/chunks/styles-yed-BF5x3_Y5.js +0 -842
- package/dist/chunks/styles-yed-BF5x3_Y5.js.map +0 -1
- package/dist/chunks/writer-DMKvthQE.js +0 -448
- package/dist/chunks/writer-DMKvthQE.js.map +0 -1
package/dist/gml.js
CHANGED
|
@@ -1,17 +1,60 @@
|
|
|
1
|
-
import {
|
|
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 {
|
|
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";
|
|
5
6
|
import { j as joinText, e as encodeChunks } from "./chunks/writer-DxjgHwSe.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { C as CYTOSCAPE_LEXICON } from "./chunks/lexicon-
|
|
9
|
-
import { S as StyleApproximations } from "./chunks/approximations-
|
|
10
|
-
import {
|
|
11
|
-
import { r as
|
|
12
|
-
import { i as importChosenGraph } from "./chunks/choose
|
|
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-iptrlMBb.js";
|
|
9
|
+
import { j as javaFamily, C as CYTOSCAPE_LEXICON } from "./chunks/lexicon-Clf4QIyl.js";
|
|
10
|
+
import { S as StyleApproximations } from "./chunks/approximations-Bzn3L-je.js";
|
|
11
|
+
import { e as elementValues, t as takeFromBlock } from "./chunks/round-trip-Zm3_ivgq.js";
|
|
12
|
+
import { k as dataRead, l as graphvizRouteBends, m as graphvizHasNoOutline, n as PERIPHERY_GAP, o as SHAPE_PERIPHERIES, p as graphvizOutline, q as putGlyph, r as graphvizArrowValue } from "./chunks/styles-Cm62yyQX.js";
|
|
13
|
+
import { G as GRAPHVIZ_GLYPH_SHAPES, i as importChosenGraph } from "./chunks/choose-CczZJaX_.js";
|
|
14
|
+
import { r as gephiRules } from "./chunks/styles-DPQQIig4.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-UMFdNqze.js";
|
|
13
16
|
import { t as toolOf } from "./chunks/units-XMZFIFe1.js";
|
|
14
|
-
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
|
+
}
|
|
15
58
|
const TOKEN_WORD = 0;
|
|
16
59
|
const TOKEN_INT = 1;
|
|
17
60
|
const TOKEN_REAL = 2;
|
|
@@ -448,7 +491,8 @@ const WRITERS = [
|
|
|
448
491
|
vocabulary: "graphlet",
|
|
449
492
|
spelling: "css",
|
|
450
493
|
units: "relative",
|
|
451
|
-
|
|
494
|
+
// Gephi's preview draws node labels as the GEXF reader reads them (formats/gexf/styles.ts)
|
|
495
|
+
labelKey: true
|
|
452
496
|
}
|
|
453
497
|
],
|
|
454
498
|
[
|
|
@@ -469,6 +513,14 @@ const UNKNOWN_WRITER = {
|
|
|
469
513
|
units: "px",
|
|
470
514
|
labelKey: true
|
|
471
515
|
};
|
|
516
|
+
const GV2GML_WRITER = {
|
|
517
|
+
dialect: "graphviz",
|
|
518
|
+
tool: "graphviz",
|
|
519
|
+
vocabulary: "graphviz",
|
|
520
|
+
spelling: "graphviz",
|
|
521
|
+
units: "px",
|
|
522
|
+
labelKey: true
|
|
523
|
+
};
|
|
472
524
|
const GRAPHTY_WRITER = { ...WRITERS[0][1], tool: null };
|
|
473
525
|
const GML_STYLE_BLOCK_KEY = mangleGmlKey(STYLE_BLOCK_NAME);
|
|
474
526
|
const TAG_PREFIX = mangleGmlKey("graphty.style.");
|
|
@@ -485,6 +537,18 @@ function graphText(snapshot, name) {
|
|
|
485
537
|
}
|
|
486
538
|
return typeof v === "number" ? String(v) : null;
|
|
487
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"];
|
|
488
552
|
function writerOf(snapshot) {
|
|
489
553
|
if (snapshot.graph.has(GML_STYLE_BLOCK_KEY)) {
|
|
490
554
|
return GRAPHTY_WRITER;
|
|
@@ -495,7 +559,10 @@ function writerOf(snapshot) {
|
|
|
495
559
|
return writer;
|
|
496
560
|
}
|
|
497
561
|
}
|
|
498
|
-
|
|
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;
|
|
499
566
|
}
|
|
500
567
|
const ARROW_ENDS = /* @__PURE__ */ new Map([
|
|
501
568
|
["none", ["none", "none"]],
|
|
@@ -503,15 +570,49 @@ const ARROW_ENDS = /* @__PURE__ */ new Map([
|
|
|
503
570
|
["first", ["triangle", "none"]],
|
|
504
571
|
["both", ["triangle", "triangle"]]
|
|
505
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
|
+
]);
|
|
506
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
|
+
]);
|
|
507
595
|
const OGDF_SHAPES = /* @__PURE__ */ new Map([
|
|
508
596
|
["rect", "rectangle"],
|
|
597
|
+
["roundedrect", "round-rectangle"],
|
|
509
598
|
["rhomb", "diamond"],
|
|
510
|
-
["
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
["
|
|
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"]
|
|
514
614
|
]);
|
|
615
|
+
const OGDF_REGULAR = /* @__PURE__ */ new Set(["triangle", "invtriangle", "pentagon", "hexagon", "octagon"]);
|
|
515
616
|
const YED_LABEL_KEYS = [
|
|
516
617
|
"outline",
|
|
517
618
|
"autoSizePolicy",
|
|
@@ -555,30 +656,164 @@ function strokeStyle(raw, kind, writer, at) {
|
|
|
555
656
|
return null;
|
|
556
657
|
}
|
|
557
658
|
if (writer.vocabulary === "ogdf") {
|
|
558
|
-
const stroke =
|
|
559
|
-
if (stroke === void 0
|
|
659
|
+
const stroke = ogdfStroke(raw);
|
|
660
|
+
if (stroke === void 0) {
|
|
560
661
|
noteAt(at, STYLE_ISSUE.UNKNOWN_VALUE, sampleOf(raw));
|
|
561
662
|
return null;
|
|
562
663
|
}
|
|
563
|
-
return stroke;
|
|
664
|
+
return stroke === "none" ? null : stroke;
|
|
564
665
|
}
|
|
565
666
|
return canonEnum(kind, raw, writer.spelling, at);
|
|
566
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
|
+
}
|
|
567
685
|
function readNodeGraphics(g, writer, put, at) {
|
|
568
686
|
const v = writer.vocabulary;
|
|
687
|
+
if (v === "graphviz") {
|
|
688
|
+
readGv2gmlNode(g, writer, put, at);
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
569
691
|
readNodeFill(g, writer, put, at);
|
|
570
692
|
readNodeOutline(g, writer, put, at);
|
|
571
693
|
put(
|
|
572
694
|
"borderStyle",
|
|
573
695
|
strokeStyle(v === "ogdf" ? g.stipple : g.outlineStyle, "borderStyle", writer, at("borderStyle"))
|
|
574
696
|
);
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
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")));
|
|
580
729
|
} else if (v === "yed" && typeof g.customconfiguration === "string") {
|
|
581
|
-
|
|
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}`);
|
|
582
817
|
}
|
|
583
818
|
}
|
|
584
819
|
function readNodeFill(g, writer, put, at) {
|
|
@@ -598,7 +833,7 @@ function readNodeOutline(g, writer, put, at) {
|
|
|
598
833
|
put("borderWidth", 0);
|
|
599
834
|
return;
|
|
600
835
|
}
|
|
601
|
-
readColor(v === "ogdf" ? g
|
|
836
|
+
readColor(v === "ogdf" ? first(g, "outline", "line") : g.outline, "borderColor", null, writer, put, at);
|
|
602
837
|
const width = outlineWidthOf(g, v);
|
|
603
838
|
put("borderWidth", width === void 0 ? null : canonNumber(width, at("borderWidth")));
|
|
604
839
|
}
|
|
@@ -616,10 +851,23 @@ function outlineWidthOf(g, v) {
|
|
|
616
851
|
}
|
|
617
852
|
function readEdgeGraphics(g, writer, put, at) {
|
|
618
853
|
const v = writer.vocabulary;
|
|
854
|
+
if (v === "graphviz") {
|
|
855
|
+
readGv2gmlEdge(g, writer, put, at);
|
|
856
|
+
return;
|
|
857
|
+
}
|
|
619
858
|
readColor(g.fill, "color", "opacity", writer, put, at);
|
|
620
859
|
const width = v === "ogdf" ? first(g, "lineWidth", "width") : g.width;
|
|
621
860
|
put("width", width === void 0 ? null : canonNumber(width, at("width")));
|
|
622
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) {
|
|
623
871
|
if (typeof g.arrow === "string") {
|
|
624
872
|
const ends = ARROW_ENDS.get(g.arrow.trim().toLowerCase());
|
|
625
873
|
if (ends === void 0) {
|
|
@@ -639,20 +887,56 @@ function readEdgeGraphics(g, writer, put, at) {
|
|
|
639
887
|
}
|
|
640
888
|
put(
|
|
641
889
|
property,
|
|
642
|
-
|
|
890
|
+
writer.vocabulary === "cytoscape" && cytoscapeArrow !== void 0 ? cytoscapeArrow(raw, at(property)) : canonEnum("arrow", raw, writer.spelling, at(property))
|
|
643
891
|
);
|
|
644
892
|
}
|
|
645
|
-
|
|
646
|
-
|
|
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
|
+
}
|
|
647
921
|
}
|
|
648
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
|
+
}
|
|
649
933
|
function readYedCurve(g, put) {
|
|
650
934
|
if (g.smoothBends !== void 0) {
|
|
651
935
|
const points = isRec(g.Line) ? g.Line.point : void 0;
|
|
652
936
|
put("curved", Number(g.smoothBends) === 1 && Array.isArray(points) && points.length > 2);
|
|
653
937
|
}
|
|
654
938
|
}
|
|
655
|
-
function readLabelGraphics(raw, writer, put, at) {
|
|
939
|
+
function readLabelGraphics(raw, writer, node, put, at) {
|
|
656
940
|
const visible = (Array.isArray(raw) ? raw : [raw]).filter((l) => isRec(l) && Number(l.visible) !== 0);
|
|
657
941
|
const lg = visible.at(0);
|
|
658
942
|
if (lg === void 0) {
|
|
@@ -663,22 +947,38 @@ function readLabelGraphics(raw, writer, put, at) {
|
|
|
663
947
|
noteAt(at("label"), STYLE_ISSUE.EXTRA_LABELS, `${String(extra + 1)} labels`);
|
|
664
948
|
}
|
|
665
949
|
if (lg.text !== void 0) {
|
|
666
|
-
put(
|
|
950
|
+
put(
|
|
951
|
+
"label",
|
|
952
|
+
writer.vocabulary === "graphviz" ? graphvizText(lg.text, at("label")) : canonText(lg.text, at("label"))
|
|
953
|
+
);
|
|
667
954
|
}
|
|
668
955
|
const yedLabel = writer.vocabulary === "yed" || YED_LABEL_KEYS.some((k) => Object.hasOwn(lg, k));
|
|
669
|
-
if (lg.color !== void 0) {
|
|
670
|
-
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);
|
|
671
958
|
} else if (lg.fill !== void 0 && !yedLabel) {
|
|
672
959
|
readColor(lg.fill, "labelColor", null, writer, put, at);
|
|
673
960
|
}
|
|
674
961
|
if (lg.fill !== void 0 && yedLabel) {
|
|
675
962
|
noteAt(at("label"), STYLE_ISSUE.NOT_CARRIED, "label background");
|
|
676
963
|
}
|
|
677
|
-
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$/, "");
|
|
678
977
|
}
|
|
679
|
-
function readLabelFont(lg, put, at) {
|
|
978
|
+
function readLabelFont(lg, java, put, at) {
|
|
680
979
|
put("labelSize", lg.fontSize === void 0 ? null : canonNumber(lg.fontSize, at("labelSize")));
|
|
681
|
-
|
|
980
|
+
const font = lg.fontName === void 0 ? null : canonText(lg.fontName, at("labelFont"));
|
|
981
|
+
put("labelFont", java && typeof font === "string" ? javaFamily(font) : font);
|
|
682
982
|
const style = scalarText(lg.fontStyle, at("labelWeight"))?.trim().toLowerCase();
|
|
683
983
|
if (style !== void 0) {
|
|
684
984
|
const known = FONT_STYLES.get(style);
|
|
@@ -700,13 +1000,63 @@ function readElement(target, g, lg, label, writer, put, at) {
|
|
|
700
1000
|
(target === "node" ? readNodeGraphics : readEdgeGraphics)(g, writer, put, at);
|
|
701
1001
|
}
|
|
702
1002
|
if (lg !== null && lg !== void 0) {
|
|
703
|
-
readLabelGraphics(lg, writer, putLabel, at);
|
|
1003
|
+
readLabelGraphics(lg, writer, target === "node", putLabel, at);
|
|
704
1004
|
}
|
|
705
1005
|
const drawn = writer.vocabulary === "cytoscape" ? target === "node" : writer.labelKey && (isRec(g) || lg !== void 0);
|
|
706
1006
|
if (!text && drawn && label !== null && label !== void 0) {
|
|
707
|
-
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
|
+
}
|
|
708
1014
|
}
|
|
709
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
|
+
}
|
|
710
1060
|
function cellOf(table, name, i) {
|
|
711
1061
|
if (!table.has(name)) {
|
|
712
1062
|
return void 0;
|
|
@@ -719,18 +1069,117 @@ function centerOf(snapshot, i) {
|
|
|
719
1069
|
const v = column?.isSet(i) === true ? column.value(i) : null;
|
|
720
1070
|
return v === null ? [Number.NaN, Number.NaN] : [v[0], v[1]];
|
|
721
1071
|
}
|
|
722
|
-
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) {
|
|
723
1077
|
const raw = isRec(g) && isRec(g.Line) ? g.Line.point : void 0;
|
|
724
|
-
|
|
725
|
-
|
|
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);
|
|
726
1088
|
}
|
|
727
|
-
|
|
728
|
-
|
|
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(
|
|
729
1114
|
centerOf(snapshot, snapshot.edgeSource(e)),
|
|
730
1115
|
centerOf(snapshot, snapshot.edgeTarget(e)),
|
|
731
|
-
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
|
|
732
1166
|
);
|
|
733
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
|
+
}
|
|
734
1183
|
function readValues(snapshot, writer, notes, context) {
|
|
735
1184
|
let found = false;
|
|
736
1185
|
const read = (target) => {
|
|
@@ -747,7 +1196,7 @@ function readValues(snapshot, writer, notes, context) {
|
|
|
747
1196
|
target,
|
|
748
1197
|
cellOf(table, "graphics", i),
|
|
749
1198
|
cellOf(table, "LabelGraphics", i),
|
|
750
|
-
|
|
1199
|
+
labelOf(snapshot, writer, target, i),
|
|
751
1200
|
writer,
|
|
752
1201
|
(property, value) => {
|
|
753
1202
|
if (value !== null) {
|
|
@@ -757,12 +1206,32 @@ function readValues(snapshot, writer, notes, context) {
|
|
|
757
1206
|
},
|
|
758
1207
|
at
|
|
759
1208
|
);
|
|
760
|
-
if (target === "edge") {
|
|
761
|
-
|
|
762
|
-
|
|
1209
|
+
if (target === "edge" && writer.vocabulary === "graphviz") {
|
|
1210
|
+
let bent = false;
|
|
1211
|
+
readGv2gmlRoute(snapshot, cellOf(table, "graphics", i), i, (property, value) => {
|
|
763
1212
|
found = true;
|
|
764
|
-
|
|
765
|
-
|
|
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
|
+
);
|
|
766
1235
|
}
|
|
767
1236
|
}
|
|
768
1237
|
return out.values;
|
|
@@ -805,8 +1274,11 @@ function styleColumns(table) {
|
|
|
805
1274
|
}
|
|
806
1275
|
function gmlStyles(snapshot, context) {
|
|
807
1276
|
const notes = new StyleNotes();
|
|
808
|
-
const writer = writerOf(snapshot);
|
|
1277
|
+
const writer = { ...writerOf(snapshot), directed: snapshot.directed };
|
|
809
1278
|
const values = readValues(snapshot, writer, notes, context);
|
|
1279
|
+
if (writer.vocabulary === "ogdf") {
|
|
1280
|
+
placeOgdfClusterLabels(snapshot, values.node);
|
|
1281
|
+
}
|
|
810
1282
|
const blockText = graphText(snapshot, GML_STYLE_BLOCK_KEY);
|
|
811
1283
|
const block = blockText === null ? null : blockWithValues(snapshot, blockText);
|
|
812
1284
|
if (block !== null) {
|
|
@@ -815,14 +1287,33 @@ function gmlStyles(snapshot, context) {
|
|
|
815
1287
|
if (writer.tool === null && !values.found && block === null) {
|
|
816
1288
|
return null;
|
|
817
1289
|
}
|
|
818
|
-
|
|
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 };
|
|
819
1310
|
return {
|
|
820
1311
|
canonical: true,
|
|
821
1312
|
dialect: writer.dialect,
|
|
822
1313
|
tool: writer.tool,
|
|
823
1314
|
units: writer.units,
|
|
824
|
-
node: { values: values.node },
|
|
825
|
-
edge: { values: values.edge,
|
|
1315
|
+
node: { values: values.node, ...gephi.node },
|
|
1316
|
+
edge: { values: values.edge, ...gephi.edge },
|
|
826
1317
|
notes: notes.list(),
|
|
827
1318
|
opacityInColor: true,
|
|
828
1319
|
block,
|
|
@@ -831,6 +1322,7 @@ function gmlStyles(snapshot, context) {
|
|
|
831
1322
|
};
|
|
832
1323
|
}
|
|
833
1324
|
const GML_STYLE_CAPABILITIES = Object.freeze({
|
|
1325
|
+
tool: "yed",
|
|
834
1326
|
node: Object.freeze([
|
|
835
1327
|
"fill",
|
|
836
1328
|
"fillOpacity",
|
|
@@ -856,6 +1348,8 @@ const GML_STYLE_CAPABILITIES = Object.freeze({
|
|
|
856
1348
|
"targetArrow",
|
|
857
1349
|
"curved",
|
|
858
1350
|
"bends",
|
|
1351
|
+
"sourcePort",
|
|
1352
|
+
"targetPort",
|
|
859
1353
|
"label",
|
|
860
1354
|
"labelColor",
|
|
861
1355
|
"labelSize",
|
|
@@ -991,7 +1485,7 @@ function labelGraphics(get) {
|
|
|
991
1485
|
}
|
|
992
1486
|
const font = get("labelFont");
|
|
993
1487
|
if (typeof font === "string") {
|
|
994
|
-
lg.fontName = font;
|
|
1488
|
+
lg.fontName = yedFontName(font);
|
|
995
1489
|
}
|
|
996
1490
|
const weight = get("labelWeight");
|
|
997
1491
|
const italic = get("labelItalic");
|
|
@@ -1022,37 +1516,17 @@ function mergedLabels(old, written) {
|
|
|
1022
1516
|
}
|
|
1023
1517
|
return head === void 0 ? rest : [head, ...rest];
|
|
1024
1518
|
}
|
|
1025
|
-
function getter(picture, target) {
|
|
1026
|
-
const columns = /* @__PURE__ */ new Map();
|
|
1027
|
-
for (const p of GML_STYLE_CAPABILITIES[target]) {
|
|
1028
|
-
columns.set(p, picture(target, p));
|
|
1029
|
-
}
|
|
1030
|
-
return (i) => (property) => columns.get(property)?.[i] ?? null;
|
|
1031
|
-
}
|
|
1032
1519
|
function exactFromBlock(snapshot, text, read) {
|
|
1033
|
-
const parsed = parseStyleBlock(text, styleFingerprint(snapshot));
|
|
1034
|
-
const ex = parsed.ok ? blockStyles(parsed.block, snapshot, "gml") : null;
|
|
1035
|
-
if (ex === null) {
|
|
1036
|
-
return;
|
|
1037
|
-
}
|
|
1038
1520
|
const notes = new StyleNotes();
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
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) => {
|
|
1045
1526
|
const back = writtenAndReadBack(target, want, notes);
|
|
1046
|
-
|
|
1047
|
-
const native = values[property]?.[i] ?? null;
|
|
1048
|
-
const w = want(property);
|
|
1049
|
-
if (native !== w && native === (back.get(property) ?? null)) {
|
|
1050
|
-
values[property] ??= new Array(n).fill(null);
|
|
1051
|
-
values[property][i] = w;
|
|
1052
|
-
}
|
|
1053
|
-
}
|
|
1527
|
+
return (property) => back.get(property) ?? null;
|
|
1054
1528
|
}
|
|
1055
|
-
}
|
|
1529
|
+
}));
|
|
1056
1530
|
}
|
|
1057
1531
|
function writtenAndReadBack(target, want, notes) {
|
|
1058
1532
|
const ignore = () => void 0;
|
|
@@ -1113,13 +1587,18 @@ function writeGraphicsColumns(snapshot, input, target, table, approximated) {
|
|
|
1113
1587
|
const approximate = (property, value) => {
|
|
1114
1588
|
approximated.add(target, property, value);
|
|
1115
1589
|
};
|
|
1116
|
-
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
|
+
};
|
|
1117
1596
|
const graphics = [];
|
|
1118
1597
|
const labels = [];
|
|
1119
1598
|
for (let i = 0; i < n; i++) {
|
|
1120
1599
|
const g = target === "node" ? nodeGraphics(get(i), approximate) : edgeGraphics(get(i), approximate);
|
|
1121
1600
|
if (target === "edge") {
|
|
1122
|
-
const line =
|
|
1601
|
+
const line = routeLine(snapshot, get(i), i, size);
|
|
1123
1602
|
if (line !== null) {
|
|
1124
1603
|
g.Line = line;
|
|
1125
1604
|
}
|
|
@@ -1138,14 +1617,28 @@ function writeGraphicsColumns(snapshot, input, target, table, approximated) {
|
|
|
1138
1617
|
}
|
|
1139
1618
|
}
|
|
1140
1619
|
}
|
|
1141
|
-
function
|
|
1142
|
-
const
|
|
1143
|
-
const
|
|
1144
|
-
const
|
|
1145
|
-
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) {
|
|
1146
1639
|
return null;
|
|
1147
1640
|
}
|
|
1148
|
-
return { point: [source, ...points, target].map(([x, y]) => ({ x, y })) };
|
|
1641
|
+
return { point: [from ?? source, ...points ?? [], to ?? target].map(([x, y]) => ({ x, y })) };
|
|
1149
1642
|
}
|
|
1150
1643
|
function renameDataColumn(table, target, name, col) {
|
|
1151
1644
|
let renamed = `data_${name}`;
|
|
@@ -2176,33 +2669,6 @@ const gmlExporter = Object.freeze({
|
|
|
2176
2669
|
function* lazyParts(snapshot, options) {
|
|
2177
2670
|
yield* gmlParts(contextOf(gmlStyledExport(snapshot, options?.styles)?.snapshot ?? snapshot, options));
|
|
2178
2671
|
}
|
|
2179
|
-
const GRAPHICS_COLUMN = "graphics";
|
|
2180
|
-
function gmlPositions(snapshot) {
|
|
2181
|
-
if (snapshot.nodes.byRole("position") === null) {
|
|
2182
|
-
return null;
|
|
2183
|
-
}
|
|
2184
|
-
const tool = toolOf(snapshot.meta.creator);
|
|
2185
|
-
return {
|
|
2186
|
-
units: "px",
|
|
2187
|
-
// a z that is the same on every node collapses to 2D
|
|
2188
|
-
sourceDims: 3,
|
|
2189
|
-
yAxis: tool === "gephi" || tool === "tulip" ? "up" : "down",
|
|
2190
|
-
tool,
|
|
2191
|
-
medianNodeSize: graphicsMedian(snapshot)
|
|
2192
|
-
};
|
|
2193
|
-
}
|
|
2194
|
-
function graphicsMedian(snapshot) {
|
|
2195
|
-
const graphics = snapshot.nodes.get(GRAPHICS_COLUMN);
|
|
2196
|
-
const sizes = [];
|
|
2197
|
-
for (let row = 0; graphics !== null && row < graphics.length; row++) {
|
|
2198
|
-
const g = graphics.isSet(row) ? graphics.value(row) : void 0;
|
|
2199
|
-
const { w, h } = typeof g === "object" && g !== null ? g : {};
|
|
2200
|
-
if (typeof w === "number" && typeof h === "number") {
|
|
2201
|
-
sizes.push((w + h) / 2);
|
|
2202
|
-
}
|
|
2203
|
-
}
|
|
2204
|
-
return median(sizes);
|
|
2205
|
-
}
|
|
2206
2672
|
const NO_GRAPH_CODE = NO_GRAPH_CODE$1;
|
|
2207
2673
|
const SECOND_GRAPH_CODE = MULTIPLE_GRAPHS_CODE;
|
|
2208
2674
|
const MISSING_ID_CODE = MISSING_ID_CODE$1;
|
|
@@ -2220,6 +2686,7 @@ const UNKNOWN_ENTITY_CODE = "W_GML_UNKNOWN_ENTITY";
|
|
|
2220
2686
|
const GRAPHICS_CODE = "W_GML_GRAPHICS";
|
|
2221
2687
|
const NESTED_ELEMENT_CODE = "W_GML_NESTED_ELEMENT";
|
|
2222
2688
|
const GROUPS_CODE = "W_GML_GROUPS";
|
|
2689
|
+
const GROUP_PARENT_COLUMN = "graphty.parent";
|
|
2223
2690
|
const WIDENED_CODE = WIDENED_CODE$1;
|
|
2224
2691
|
const PRECISION_CODE = PRECISION_CODE$1;
|
|
2225
2692
|
const COLUMN_RENAMED_CODE_GML = COLUMN_RENAMED_CODE;
|
|
@@ -2309,6 +2776,10 @@ class GmlImport {
|
|
|
2309
2776
|
this.elementsSinceCheck = 0;
|
|
2310
2777
|
this.idMap = null;
|
|
2311
2778
|
this.skippedIds = /* @__PURE__ */ new Set();
|
|
2779
|
+
this.groupRefs = [];
|
|
2780
|
+
this.rootCluster = -1;
|
|
2781
|
+
this.parentHandle = null;
|
|
2782
|
+
this.clusterCount = 0;
|
|
2312
2783
|
this.declared = new Uint32Array(64);
|
|
2313
2784
|
this.touched = [];
|
|
2314
2785
|
this.graphTouched = [];
|
|
@@ -2376,6 +2847,8 @@ class GmlImport {
|
|
|
2376
2847
|
this.creatorToken = v;
|
|
2377
2848
|
} else if (key === "Version" && !record && this.versionToken < 0) {
|
|
2378
2849
|
this.versionToken = v;
|
|
2850
|
+
} else if (key === "rootcluster" && record && this.rootCluster < 0) {
|
|
2851
|
+
this.rootCluster = v;
|
|
2379
2852
|
} else {
|
|
2380
2853
|
this.observe(this.topSchema, "graph", key, v, TOP_SEQ);
|
|
2381
2854
|
}
|
|
@@ -2560,7 +3033,7 @@ class GmlImport {
|
|
|
2560
3033
|
}
|
|
2561
3034
|
/**
|
|
2562
3035
|
* Warn about keys of a node or edge whose meaning GML readers give but this import does not:
|
|
2563
|
-
* a nested graph / node / edge record
|
|
3036
|
+
* a nested graph / node / edge record.
|
|
2564
3037
|
* @param domain - the table
|
|
2565
3038
|
* @param key - the key
|
|
2566
3039
|
* @param v - the value token
|
|
@@ -2578,13 +3051,6 @@ class GmlImport {
|
|
|
2578
3051
|
{ line: t.line[v], element: key },
|
|
2579
3052
|
`${NESTED_ELEMENT_CODE}:${domain}:${key}`
|
|
2580
3053
|
);
|
|
2581
|
-
} else if (domain === "node" && (key === "isGroup" || key === "gid")) {
|
|
2582
|
-
this.report.warnOnce(
|
|
2583
|
-
"unsupported",
|
|
2584
|
-
GROUPS_CODE,
|
|
2585
|
-
"yEd group keys (isGroup, gid) are kept as plain node columns; the group hierarchy is not read as containment",
|
|
2586
|
-
{ line: t.line[v], element: key }
|
|
2587
|
-
);
|
|
2588
3054
|
}
|
|
2589
3055
|
}
|
|
2590
3056
|
/**
|
|
@@ -2641,8 +3107,155 @@ class GmlImport {
|
|
|
2641
3107
|
}
|
|
2642
3108
|
this.pushTopLevel();
|
|
2643
3109
|
this.pushNodes();
|
|
3110
|
+
this.pushGroups();
|
|
3111
|
+
this.pushClusters();
|
|
2644
3112
|
this.pushEdges();
|
|
2645
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
|
+
}
|
|
2646
3259
|
/** Turn every schema entry into a column plan. */
|
|
2647
3260
|
buildPlans() {
|
|
2648
3261
|
for (const [key, entry] of this.nodeSchema) {
|
|
@@ -2912,13 +3525,84 @@ class GmlImport {
|
|
|
2912
3525
|
{ line: t.line[p], element: what }
|
|
2913
3526
|
);
|
|
2914
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
|
+
}
|
|
2915
3599
|
/**
|
|
2916
3600
|
* Push one node block.
|
|
2917
3601
|
* @param open - the block's `[`
|
|
2918
3602
|
*/
|
|
2919
3603
|
importNode(open) {
|
|
2920
3604
|
const t = this.requireTokens();
|
|
2921
|
-
const { sink, report
|
|
3605
|
+
const { sink, report } = this;
|
|
2922
3606
|
const close = t.match[open];
|
|
2923
3607
|
const line = t.line[open];
|
|
2924
3608
|
const ordinal = this.nodeOrdinal++;
|
|
@@ -2927,55 +3611,14 @@ class GmlImport {
|
|
|
2927
3611
|
let sinkId;
|
|
2928
3612
|
let fileId;
|
|
2929
3613
|
try {
|
|
2930
|
-
|
|
2931
|
-
let labelTok = -1;
|
|
2932
|
-
let originalTok = -1;
|
|
2933
|
-
for (let p = open + 1; p < close; p = t.nextPair(p)) {
|
|
2934
|
-
const key = t.textOf(p);
|
|
2935
|
-
if (key === "id") {
|
|
2936
|
-
idTok = this.structuralToken(idTok, p, "id");
|
|
2937
|
-
} else if (key === "label") {
|
|
2938
|
-
labelTok = labelTok < 0 ? p + 1 : labelTok;
|
|
2939
|
-
} else if (key === ORIGINAL_ID_KEY && options.restoreMangledIds) {
|
|
2940
|
-
originalTok = originalTok < 0 ? p + 1 : originalTok;
|
|
2941
|
-
}
|
|
2942
|
-
}
|
|
3614
|
+
const { idTok, labelTok, originalTok } = this.nodeKeyTokens(open, close);
|
|
2943
3615
|
if (idTok < 0) {
|
|
2944
3616
|
throw new GraphFormatError("E_INVALID_ID", "node has no id", { reason: "missing id" });
|
|
2945
3617
|
}
|
|
2946
3618
|
fileId = this.coerceFileId(idTok, this.fileIdOf(idTok, "id"));
|
|
2947
|
-
|
|
2948
|
-
sinkId = this.restoredId(originalTok);
|
|
2949
|
-
} else {
|
|
2950
|
-
switch (options.nodeIdFrom) {
|
|
2951
|
-
case "label":
|
|
2952
|
-
if (labelTok < 0) {
|
|
2953
|
-
throw new GraphFormatError("E_INVALID_ID", "node has no label", {
|
|
2954
|
-
reason: "missing label"
|
|
2955
|
-
});
|
|
2956
|
-
}
|
|
2957
|
-
sinkId = this.coerceValueToken(labelTok);
|
|
2958
|
-
break;
|
|
2959
|
-
case "index":
|
|
2960
|
-
sinkId = ordinal;
|
|
2961
|
-
break;
|
|
2962
|
-
default:
|
|
2963
|
-
sinkId = fileId;
|
|
2964
|
-
}
|
|
2965
|
-
}
|
|
3619
|
+
sinkId = this.nodeSinkId(fileId, labelTok, originalTok, ordinal);
|
|
2966
3620
|
index = sink.addNode(sinkId);
|
|
2967
|
-
|
|
2968
|
-
const before = this.idMap.get(fileId);
|
|
2969
|
-
if (before !== void 0 && before !== sinkId) {
|
|
2970
|
-
report.warning(
|
|
2971
|
-
"merged",
|
|
2972
|
-
DUPLICATE_NODE_CODE,
|
|
2973
|
-
`file id ${JSON.stringify(fileId)} is declared twice (nodes ${JSON.stringify(before)} and ${JSON.stringify(sinkId)}); edges to it resolve to the later`,
|
|
2974
|
-
{ line, element: String(fileId) }
|
|
2975
|
-
);
|
|
2976
|
-
}
|
|
2977
|
-
this.idMap.set(fileId, sinkId);
|
|
2978
|
-
}
|
|
3621
|
+
this.mapFileId(fileId, sinkId, line);
|
|
2979
3622
|
} catch (err) {
|
|
2980
3623
|
this.recordNodeError(err, line);
|
|
2981
3624
|
report.counts.skippedNodes++;
|
|
@@ -2997,33 +3640,47 @@ class GmlImport {
|
|
|
2997
3640
|
}
|
|
2998
3641
|
this.beginElement(this.seq++);
|
|
2999
3642
|
try {
|
|
3000
|
-
|
|
3001
|
-
let graphicsPlan = null;
|
|
3002
|
-
for (let p = open + 1; p < close; p = t.nextPair(p)) {
|
|
3003
|
-
const key = t.textOf(p);
|
|
3004
|
-
if (key === "id" || key === ORIGINAL_ID_KEY && options.restoreMangledIds) {
|
|
3005
|
-
continue;
|
|
3006
|
-
}
|
|
3007
|
-
const plan = this.nodePlans.get(key);
|
|
3008
|
-
if (plan !== void 0 && plan.position !== null) {
|
|
3009
|
-
graphicsPlan = plan;
|
|
3010
|
-
graphics.push(p + 1);
|
|
3011
|
-
} else if (plan !== void 0) {
|
|
3012
|
-
this.writeNode(plan, index, p + 1);
|
|
3013
|
-
}
|
|
3014
|
-
}
|
|
3015
|
-
if (graphicsPlan !== null) {
|
|
3016
|
-
this.writeGraphics(graphicsPlan, index, graphics, {
|
|
3017
|
-
line: t.line[graphics[0]],
|
|
3018
|
-
element: String(sinkId)
|
|
3019
|
-
});
|
|
3020
|
-
}
|
|
3643
|
+
this.writeNodeKeys(open, index, sinkId);
|
|
3021
3644
|
this.flushLists("node", index);
|
|
3022
3645
|
} catch (err) {
|
|
3023
3646
|
this.touched.length = 0;
|
|
3024
3647
|
report.recordError(err, { line, element: String(sinkId) });
|
|
3025
3648
|
}
|
|
3026
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
|
+
}
|
|
3027
3684
|
/**
|
|
3028
3685
|
* Push one edge block.
|
|
3029
3686
|
* @param open - the block's `[`
|
|
@@ -3804,7 +4461,7 @@ const GML_ISSUE = Object.freeze({
|
|
|
3804
4461
|
GRAPHICS: GRAPHICS_CODE,
|
|
3805
4462
|
/** A graph, node or edge record nested in a node or edge; kept as json, not read as structure. */
|
|
3806
4463
|
NESTED_ELEMENT: NESTED_ELEMENT_CODE,
|
|
3807
|
-
/**
|
|
4464
|
+
/** A yEd `gid` that names no other node; it stays a plain column value and puts the node in no group. */
|
|
3808
4465
|
GROUPS: GROUPS_CODE,
|
|
3809
4466
|
/**
|
|
3810
4467
|
* An attribute's type was widened because a later value did not fit: an integer above 2^31 in an integer column,
|