@graphty/graph-io 0.3.48 → 0.3.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{approximations-C2riR4NT.js → approximations-BRXsll0T.js} +2 -2
- package/dist/chunks/{approximations-C2riR4NT.js.map → approximations-BRXsll0T.js.map} +1 -1
- package/dist/chunks/bends-BGXjv_U4.js +129 -0
- package/dist/chunks/bends-BGXjv_U4.js.map +1 -0
- package/dist/chunks/{block-Cu22ewuS.js → block-yl0f_qLO.js} +931 -164
- package/dist/chunks/block-yl0f_qLO.js.map +1 -0
- package/dist/chunks/choose-CczZJaX_.js +717 -0
- package/dist/chunks/choose-CczZJaX_.js.map +1 -0
- package/dist/chunks/{codes-CV_Bhcyi.js → codes-BE2xir2k.js} +6 -2
- package/dist/chunks/codes-BE2xir2k.js.map +1 -0
- package/dist/chunks/{constants-D0LqcsLJ.js → constants-CKkYLPtt.js} +2 -2
- package/dist/chunks/{constants-D0LqcsLJ.js.map → constants-CKkYLPtt.js.map} +1 -1
- package/dist/chunks/{context-cgmmOxZ2.js → context-DizmppHy.js} +5 -4
- package/dist/chunks/{context-cgmmOxZ2.js.map → context-DizmppHy.js.map} +1 -1
- package/dist/chunks/{convert-BcQ8_jMo.js → convert-Ct2zelbQ.js} +7 -2
- package/dist/chunks/convert-Ct2zelbQ.js.map +1 -0
- package/dist/chunks/{credentials-BiQsnMTb.js → credentials-CmvJXYeH.js} +67 -16
- package/dist/chunks/credentials-CmvJXYeH.js.map +1 -0
- package/dist/chunks/{cx-export-BEeF6ymo.js → cx-export-Bt6NoqTQ.js} +3 -3
- package/dist/chunks/{cx-export-BEeF6ymo.js.map → cx-export-Bt6NoqTQ.js.map} +1 -1
- package/dist/chunks/descriptor-B28U25x4.js +60 -0
- package/dist/chunks/descriptor-B28U25x4.js.map +1 -0
- package/dist/chunks/{descriptor-BJ-W0Jd-.js → descriptor-Dhez_Cew.js} +11 -2
- package/dist/chunks/descriptor-Dhez_Cew.js.map +1 -0
- package/dist/chunks/{emit-CD8xnY8s.js → emit-7Jkpg0yd.js} +1788 -133
- package/dist/chunks/emit-7Jkpg0yd.js.map +1 -0
- package/dist/chunks/{escape-DH2Egt-l.js → escape-CuCIzNMB.js} +8 -8
- package/dist/chunks/{escape-DH2Egt-l.js.map → escape-CuCIzNMB.js.map} +1 -1
- package/dist/chunks/{export-CZ7VRm4I.js → export-Cha4dRFz.js} +45 -387
- package/dist/chunks/export-Cha4dRFz.js.map +1 -0
- package/dist/chunks/{exporter-ChjL5fmP.js → exporter-1Ajud15J.js} +9 -8
- package/dist/chunks/{exporter-ChjL5fmP.js.map → exporter-1Ajud15J.js.map} +1 -1
- package/dist/chunks/{exporter-BIdaoIgh.js → exporter-B6yvL3wy.js} +7 -7
- package/dist/chunks/{exporter-BIdaoIgh.js.map → exporter-B6yvL3wy.js.map} +1 -1
- package/dist/chunks/{exporter-Dcw7Ldtq.js → exporter-BP6otMO6.js} +6 -6
- package/dist/chunks/{exporter-Dcw7Ldtq.js.map → exporter-BP6otMO6.js.map} +1 -1
- package/dist/chunks/{exporter-DtVU80Fa.js → exporter-CA5q8ROP.js} +9 -8
- package/dist/chunks/{exporter-DtVU80Fa.js.map → exporter-CA5q8ROP.js.map} +1 -1
- package/dist/chunks/{exporter-bxxjOrDZ.js → exporter-CQQZFJ2v.js} +1284 -156
- package/dist/chunks/exporter-CQQZFJ2v.js.map +1 -0
- package/dist/chunks/format-BXiAb-1h.js +408 -0
- package/dist/chunks/format-BXiAb-1h.js.map +1 -0
- package/dist/chunks/{generic-CP6YD34u.js → generic-Dc21MAdg.js} +387 -31
- package/dist/chunks/generic-Dc21MAdg.js.map +1 -0
- package/dist/chunks/{importer-B87_fmVx.js → importer-C6NVpCXp.js} +327 -84
- package/dist/chunks/importer-C6NVpCXp.js.map +1 -0
- package/dist/chunks/{importer-DPZDN40-.js → importer-CKFe4q54.js} +25 -17
- package/dist/chunks/importer-CKFe4q54.js.map +1 -0
- package/dist/chunks/{importer-Bji2MeWr.js → importer-CKbUbsJA.js} +13 -10
- package/dist/chunks/{importer-Bji2MeWr.js.map → importer-CKbUbsJA.js.map} +1 -1
- package/dist/chunks/{importer-CB_zV5_L.js → importer-ClCsdgTJ.js} +208 -1104
- package/dist/chunks/importer-ClCsdgTJ.js.map +1 -0
- package/dist/chunks/{importer-e3huMZbm.js → importer-CyVZTrf0.js} +14 -10
- package/dist/chunks/importer-CyVZTrf0.js.map +1 -0
- package/dist/chunks/{importer-CVT-JyDE.js → importer-DgG4v1Ms.js} +1537 -355
- package/dist/chunks/importer-DgG4v1Ms.js.map +1 -0
- package/dist/chunks/{importer-Cyy6UseH.js → importer-asFUrIsj.js} +66 -13
- package/dist/chunks/importer-asFUrIsj.js.map +1 -0
- package/dist/chunks/{input-Ccg9I22A.js → input-CAxt_aV-.js} +4 -4
- package/dist/chunks/{input-Ccg9I22A.js.map → input-CAxt_aV-.js.map} +1 -1
- package/dist/chunks/{json-elements-By172SVq.js → json-elements-Cq76WjnZ.js} +4 -4
- package/dist/chunks/{json-elements-By172SVq.js.map → json-elements-Cq76WjnZ.js.map} +1 -1
- package/dist/chunks/{lexicon-u2SI5xcx.js → lexicon-IVRq2Uoo.js} +282 -74
- package/dist/chunks/lexicon-IVRq2Uoo.js.map +1 -0
- package/dist/chunks/{ontology-export-BwgMyuF0.js → ontology-export-OMo91mb0.js} +4 -4
- package/dist/chunks/{ontology-export-BwgMyuF0.js.map → ontology-export-OMo91mb0.js.map} +1 -1
- package/dist/chunks/{records-Cgvxz-Vx.js → records-NJiYvekn.js} +2 -2
- package/dist/chunks/{records-Cgvxz-Vx.js.map → records-NJiYvekn.js.map} +1 -1
- package/dist/chunks/{report-CgdsL9Hb.js → report-CwMfYa9J.js} +23 -23
- package/dist/chunks/{report-CgdsL9Hb.js.map → report-CwMfYa9J.js.map} +1 -1
- package/dist/chunks/round-trip-Cy3_SHRZ.js +79 -0
- package/dist/chunks/round-trip-Cy3_SHRZ.js.map +1 -0
- package/dist/chunks/{sigv4-LkAzsLAu.js → sigv4-BXwVbza3.js} +5 -5
- package/dist/chunks/sigv4-BXwVbza3.js.map +1 -0
- package/dist/chunks/{styles-CaABMoO1.js → styles-CAVmBLgp.js} +1237 -138
- package/dist/chunks/styles-CAVmBLgp.js.map +1 -0
- package/dist/chunks/styles-CPczw1Jz.js +1928 -0
- package/dist/chunks/styles-CPczw1Jz.js.map +1 -0
- package/dist/chunks/styles-boK6Ln54.js +2847 -0
- package/dist/chunks/styles-boK6Ln54.js.map +1 -0
- package/dist/chunks/{styles-yed-Cs1nmrjn.js → styles-yed-XeFBQ6VS.js} +506 -175
- package/dist/chunks/styles-yed-XeFBQ6VS.js.map +1 -0
- package/dist/chunks/{text-BuKQVMz2.js → text-ystE2bYi.js} +2 -2
- package/dist/chunks/{text-BuKQVMz2.js.map → text-ystE2bYi.js.map} +1 -1
- package/dist/csv.js +7 -7
- package/dist/cx.js +2 -2
- package/dist/cx2.js +2 -2
- package/dist/cys.js +1 -1
- package/dist/dot.js +8 -4
- package/dist/dot.js.map +1 -1
- package/dist/gexf.js +42 -12
- package/dist/gexf.js.map +1 -1
- package/dist/gml.js +848 -194
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +230 -193
- package/dist/graph-io.js.map +1 -1
- package/dist/graphml.js +3 -3
- package/dist/json.js +3 -2
- package/dist/neo4j.js +6 -6
- package/dist/obo.js +1 -1
- package/dist/pajek.js +1 -1
- package/dist/positions.js +45 -3
- package/dist/positions.js.map +1 -1
- package/dist/sources-cypher.js +141 -23
- package/dist/sources-cypher.js.map +1 -1
- package/dist/sources-ndex.js +2 -2
- package/dist/sources-rest.js +32 -6
- package/dist/sources-rest.js.map +1 -1
- package/dist/sources-sparql.d.ts +1 -0
- package/dist/sources-sparql.js +439 -0
- package/dist/sources-sparql.js.map +1 -0
- package/dist/src/formats/cx/importer.d.ts.map +1 -1
- package/dist/src/formats/cx/importer.js +5 -1
- package/dist/src/formats/cx/importer.js.map +1 -1
- package/dist/src/formats/cx/styles.d.ts +24 -1
- package/dist/src/formats/cx/styles.d.ts.map +1 -1
- package/dist/src/formats/cx/styles.js +117 -11
- package/dist/src/formats/cx/styles.js.map +1 -1
- package/dist/src/formats/cx2/importer.d.ts.map +1 -1
- package/dist/src/formats/cx2/importer.js +1 -0
- package/dist/src/formats/cx2/importer.js.map +1 -1
- package/dist/src/formats/cx2/styles.d.ts.map +1 -1
- package/dist/src/formats/cx2/styles.js +3 -1
- package/dist/src/formats/cx2/styles.js.map +1 -1
- package/dist/src/formats/cys/importer.d.ts.map +1 -1
- package/dist/src/formats/cys/importer.js +1 -0
- package/dist/src/formats/cys/importer.js.map +1 -1
- package/dist/src/formats/cys/styles.d.ts +2 -0
- package/dist/src/formats/cys/styles.d.ts.map +1 -1
- package/dist/src/formats/cys/styles.js +15 -7
- package/dist/src/formats/cys/styles.js.map +1 -1
- package/dist/src/formats/dot/drawing.d.ts +98 -0
- package/dist/src/formats/dot/drawing.d.ts.map +1 -0
- package/dist/src/formats/dot/drawing.js +734 -0
- package/dist/src/formats/dot/drawing.js.map +1 -0
- package/dist/src/formats/dot/exporter.d.ts.map +1 -1
- package/dist/src/formats/dot/exporter.js +34 -2
- package/dist/src/formats/dot/exporter.js.map +1 -1
- package/dist/src/formats/dot/importer.d.ts +6 -1
- package/dist/src/formats/dot/importer.d.ts.map +1 -1
- package/dist/src/formats/dot/importer.js +170 -33
- package/dist/src/formats/dot/importer.js.map +1 -1
- package/dist/src/formats/dot/index.d.ts +3 -1
- package/dist/src/formats/dot/index.d.ts.map +1 -1
- package/dist/src/formats/dot/index.js +2 -1
- package/dist/src/formats/dot/index.js.map +1 -1
- package/dist/src/formats/dot/label-places.d.ts +41 -0
- package/dist/src/formats/dot/label-places.d.ts.map +1 -0
- package/dist/src/formats/dot/label-places.js +185 -0
- package/dist/src/formats/dot/label-places.js.map +1 -0
- package/dist/src/formats/dot/names.d.ts +13 -0
- package/dist/src/formats/dot/names.d.ts.map +1 -1
- package/dist/src/formats/dot/names.js +13 -0
- package/dist/src/formats/dot/names.js.map +1 -1
- package/dist/src/formats/dot/record.d.ts +50 -0
- package/dist/src/formats/dot/record.d.ts.map +1 -0
- package/dist/src/formats/dot/record.js +275 -0
- package/dist/src/formats/dot/record.js.map +1 -0
- package/dist/src/formats/dot/styles.d.ts +72 -2
- package/dist/src/formats/dot/styles.d.ts.map +1 -1
- package/dist/src/formats/dot/styles.js +1500 -119
- package/dist/src/formats/dot/styles.js.map +1 -1
- package/dist/src/formats/gexf/dialog-metrics.d.ts +15 -0
- package/dist/src/formats/gexf/dialog-metrics.d.ts.map +1 -0
- package/dist/src/formats/gexf/dialog-metrics.js +59 -0
- package/dist/src/formats/gexf/dialog-metrics.js.map +1 -0
- package/dist/src/formats/gexf/importer.d.ts +7 -0
- package/dist/src/formats/gexf/importer.d.ts.map +1 -1
- package/dist/src/formats/gexf/importer.js +41 -5
- package/dist/src/formats/gexf/importer.js.map +1 -1
- package/dist/src/formats/gexf/preview.d.ts +77 -0
- package/dist/src/formats/gexf/preview.d.ts.map +1 -0
- package/dist/src/formats/gexf/preview.js +191 -0
- package/dist/src/formats/gexf/preview.js.map +1 -0
- package/dist/src/formats/gexf/schema.d.ts.map +1 -1
- package/dist/src/formats/gexf/schema.js +2 -1
- package/dist/src/formats/gexf/schema.js.map +1 -1
- package/dist/src/formats/gexf/styles.d.ts +58 -31
- package/dist/src/formats/gexf/styles.d.ts.map +1 -1
- package/dist/src/formats/gexf/styles.js +848 -225
- package/dist/src/formats/gexf/styles.js.map +1 -1
- package/dist/src/formats/gml/importer.d.ts +5 -2
- package/dist/src/formats/gml/importer.d.ts.map +1 -1
- package/dist/src/formats/gml/importer.js +258 -71
- package/dist/src/formats/gml/importer.js.map +1 -1
- package/dist/src/formats/gml/index.d.ts +1 -1
- package/dist/src/formats/gml/index.d.ts.map +1 -1
- package/dist/src/formats/gml/index.js +1 -1
- package/dist/src/formats/gml/index.js.map +1 -1
- package/dist/src/formats/gml/positions.d.ts +7 -0
- package/dist/src/formats/gml/positions.d.ts.map +1 -1
- package/dist/src/formats/gml/positions.js +29 -7
- package/dist/src/formats/gml/positions.js.map +1 -1
- package/dist/src/formats/gml/styles.d.ts.map +1 -1
- package/dist/src/formats/gml/styles.js +754 -102
- package/dist/src/formats/gml/styles.js.map +1 -1
- package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-plain.js +6 -10
- package/dist/src/formats/graphml/styles-plain.js.map +1 -1
- package/dist/src/formats/graphml/styles-yed.d.ts +21 -15
- package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-yed.js +695 -164
- package/dist/src/formats/graphml/styles-yed.js.map +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.js +431 -64
- package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
- package/dist/src/formats/graphml/yfiles.d.ts +3 -3
- package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
- package/dist/src/formats/graphml/yfiles.js +16 -6
- package/dist/src/formats/graphml/yfiles.js.map +1 -1
- package/dist/src/formats/json/dialect.d.ts +3 -2
- package/dist/src/formats/json/dialect.d.ts.map +1 -1
- package/dist/src/formats/json/dialect.js +39 -5
- package/dist/src/formats/json/dialect.js.map +1 -1
- package/dist/src/formats/json/importer.d.ts +13 -2
- package/dist/src/formats/json/importer.d.ts.map +1 -1
- package/dist/src/formats/json/importer.js +42 -6
- package/dist/src/formats/json/importer.js.map +1 -1
- package/dist/src/formats/json/index.d.ts +1 -1
- package/dist/src/formats/json/index.d.ts.map +1 -1
- package/dist/src/formats/json/index.js +1 -1
- package/dist/src/formats/json/index.js.map +1 -1
- package/dist/src/formats/json/positions.d.ts +5 -2
- package/dist/src/formats/json/positions.d.ts.map +1 -1
- package/dist/src/formats/json/positions.js +20 -4
- package/dist/src/formats/json/positions.js.map +1 -1
- package/dist/src/formats/json/styles.d.ts +12 -1
- package/dist/src/formats/json/styles.d.ts.map +1 -1
- package/dist/src/formats/json/styles.js +1843 -136
- package/dist/src/formats/json/styles.js.map +1 -1
- package/dist/src/formats/pajek/draw.d.ts +104 -0
- package/dist/src/formats/pajek/draw.d.ts.map +1 -0
- package/dist/src/formats/pajek/draw.js +382 -0
- package/dist/src/formats/pajek/draw.js.map +1 -0
- package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
- package/dist/src/formats/pajek/exporter.js +70 -51
- package/dist/src/formats/pajek/exporter.js.map +1 -1
- package/dist/src/formats/pajek/importer.d.ts +9 -0
- package/dist/src/formats/pajek/importer.d.ts.map +1 -1
- package/dist/src/formats/pajek/importer.js +233 -102
- package/dist/src/formats/pajek/importer.js.map +1 -1
- package/dist/src/formats/pajek/index.d.ts +1 -0
- package/dist/src/formats/pajek/index.d.ts.map +1 -1
- package/dist/src/formats/pajek/index.js.map +1 -1
- package/dist/src/formats/pajek/styles.d.ts +15 -7
- package/dist/src/formats/pajek/styles.d.ts.map +1 -1
- package/dist/src/formats/pajek/styles.js +1395 -114
- package/dist/src/formats/pajek/styles.js.map +1 -1
- package/dist/src/formats/pajek/syntax.d.ts +10 -1
- package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
- package/dist/src/formats/pajek/syntax.js +26 -2
- package/dist/src/formats/pajek/syntax.js.map +1 -1
- package/dist/src/formats/xgmml/emit.d.ts +1 -0
- package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
- package/dist/src/formats/xgmml/emit.js +65 -5
- package/dist/src/formats/xgmml/emit.js.map +1 -1
- package/dist/src/formats/xgmml/styles.d.ts +23 -3
- package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
- package/dist/src/formats/xgmml/styles.js +277 -60
- package/dist/src/formats/xgmml/styles.js.map +1 -1
- package/dist/src/index.d.ts +6 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/positions/convert.d.ts.map +1 -1
- package/dist/src/positions/convert.js +11 -1
- package/dist/src/positions/convert.js.map +1 -1
- package/dist/src/positions/extract.d.ts.map +1 -1
- package/dist/src/positions/extract.js +53 -1
- package/dist/src/positions/extract.js.map +1 -1
- package/dist/src/positions/index.d.ts +1 -1
- package/dist/src/positions/index.d.ts.map +1 -1
- package/dist/src/positions/types.d.ts +59 -0
- package/dist/src/positions/types.d.ts.map +1 -1
- package/dist/src/sources/builtins.d.ts +1 -1
- package/dist/src/sources/builtins.d.ts.map +1 -1
- package/dist/src/sources/builtins.js +8 -2
- package/dist/src/sources/builtins.js.map +1 -1
- package/dist/src/sources/context.d.ts.map +1 -1
- package/dist/src/sources/context.js +1 -0
- package/dist/src/sources/context.js.map +1 -1
- package/dist/src/sources/credentials.d.ts +50 -1
- package/dist/src/sources/credentials.d.ts.map +1 -1
- package/dist/src/sources/credentials.js +69 -0
- package/dist/src/sources/credentials.js.map +1 -1
- package/dist/src/sources/cypher/descriptor.d.ts.map +1 -1
- package/dist/src/sources/cypher/descriptor.js +5 -0
- package/dist/src/sources/cypher/descriptor.js.map +1 -1
- package/dist/src/sources/cypher/index.d.ts.map +1 -1
- package/dist/src/sources/cypher/index.js +125 -18
- package/dist/src/sources/cypher/index.js.map +1 -1
- package/dist/src/sources/cypher/params.d.ts +1 -1
- package/dist/src/sources/cypher/params.d.ts.map +1 -1
- package/dist/src/sources/cypher/query-builder.d.ts +17 -0
- package/dist/src/sources/cypher/query-builder.d.ts.map +1 -1
- package/dist/src/sources/cypher/query-builder.js +31 -0
- package/dist/src/sources/cypher/query-builder.js.map +1 -1
- package/dist/src/sources/ids.d.ts +5 -0
- package/dist/src/sources/ids.d.ts.map +1 -1
- package/dist/src/sources/ids.js +5 -0
- package/dist/src/sources/ids.js.map +1 -1
- package/dist/src/sources/params.d.ts +3 -0
- package/dist/src/sources/params.d.ts.map +1 -1
- package/dist/src/sources/rest/descriptor.d.ts.map +1 -1
- package/dist/src/sources/rest/descriptor.js +9 -0
- package/dist/src/sources/rest/descriptor.js.map +1 -1
- package/dist/src/sources/rest/openalex.d.ts +4 -2
- package/dist/src/sources/rest/openalex.d.ts.map +1 -1
- package/dist/src/sources/rest/openalex.js +4 -2
- package/dist/src/sources/rest/openalex.js.map +1 -1
- package/dist/src/sources/rest/source.d.ts.map +1 -1
- package/dist/src/sources/rest/source.js +38 -0
- package/dist/src/sources/rest/source.js.map +1 -1
- package/dist/src/sources/run.d.ts +2 -0
- package/dist/src/sources/run.d.ts.map +1 -1
- package/dist/src/sources/run.js +30 -3
- package/dist/src/sources/run.js.map +1 -1
- package/dist/src/sources/sigv4.d.ts +5 -3
- package/dist/src/sources/sigv4.d.ts.map +1 -1
- package/dist/src/sources/sigv4.js +6 -4
- package/dist/src/sources/sigv4.js.map +1 -1
- package/dist/src/sources/sparql/descriptor.d.ts +10 -0
- package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
- package/dist/src/sources/sparql/descriptor.js +64 -0
- package/dist/src/sources/sparql/descriptor.js.map +1 -0
- package/dist/src/sources/sparql/index.d.ts +28 -0
- package/dist/src/sources/sparql/index.d.ts.map +1 -0
- package/dist/src/sources/sparql/index.js +327 -0
- package/dist/src/sources/sparql/index.js.map +1 -0
- package/dist/src/sources/sparql/ntriples.d.ts +69 -0
- package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
- package/dist/src/sources/sparql/ntriples.js +180 -0
- package/dist/src/sources/sparql/ntriples.js.map +1 -0
- package/dist/src/sources/sparql/params.d.ts +27 -0
- package/dist/src/sources/sparql/params.d.ts.map +1 -0
- package/dist/src/sources/sparql/params.js +5 -0
- package/dist/src/sources/sparql/params.js.map +1 -0
- package/dist/src/sources/sparql/query.d.ts +73 -0
- package/dist/src/sources/sparql/query.d.ts.map +1 -0
- package/dist/src/sources/sparql/query.js +164 -0
- package/dist/src/sources/sparql/query.js.map +1 -0
- package/dist/src/sources/types.d.ts +60 -0
- package/dist/src/sources/types.d.ts.map +1 -1
- package/dist/src/styles/annotations.d.ts +61 -5
- package/dist/src/styles/annotations.d.ts.map +1 -1
- package/dist/src/styles/annotations.js +130 -22
- package/dist/src/styles/annotations.js.map +1 -1
- package/dist/src/styles/canon/bends.d.ts +46 -0
- package/dist/src/styles/canon/bends.d.ts.map +1 -1
- package/dist/src/styles/canon/bends.js +123 -0
- package/dist/src/styles/canon/bends.js.map +1 -1
- package/dist/src/styles/canon/color-tables.d.ts +6 -1
- package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
- package/dist/src/styles/canon/color-tables.js +10 -4
- package/dist/src/styles/canon/color-tables.js.map +1 -1
- package/dist/src/styles/canon/color.d.ts +3 -1
- package/dist/src/styles/canon/color.d.ts.map +1 -1
- package/dist/src/styles/canon/color.js +103 -3
- package/dist/src/styles/canon/color.js.map +1 -1
- package/dist/src/styles/canon/enums.d.ts +2 -2
- package/dist/src/styles/canon/enums.d.ts.map +1 -1
- package/dist/src/styles/canon/enums.js +89 -7
- package/dist/src/styles/canon/enums.js.map +1 -1
- package/dist/src/styles/canon/graphviz.d.ts +12 -3
- package/dist/src/styles/canon/graphviz.d.ts.map +1 -1
- package/dist/src/styles/canon/graphviz.js +57 -9
- package/dist/src/styles/canon/graphviz.js.map +1 -1
- package/dist/src/styles/canon/number.d.ts +8 -0
- package/dist/src/styles/canon/number.d.ts.map +1 -1
- package/dist/src/styles/canon/number.js +18 -0
- package/dist/src/styles/canon/number.js.map +1 -1
- package/dist/src/styles/canon/text.d.ts +29 -2
- package/dist/src/styles/canon/text.d.ts.map +1 -1
- package/dist/src/styles/canon/text.js +156 -16
- package/dist/src/styles/canon/text.js.map +1 -1
- package/dist/src/styles/codes.d.ts +2 -0
- package/dist/src/styles/codes.d.ts.map +1 -1
- package/dist/src/styles/codes.js +2 -0
- package/dist/src/styles/codes.js.map +1 -1
- package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
- package/dist/src/styles/cyjs/cascade.js +1139 -79
- package/dist/src/styles/cyjs/cascade.js.map +1 -1
- package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
- package/dist/src/styles/cyjs/defaults-table.js +4 -0
- package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
- package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
- package/dist/src/styles/cyjs/emit.js +232 -10
- package/dist/src/styles/cyjs/emit.js.map +1 -1
- package/dist/src/styles/cyjs/face.d.ts +20 -0
- package/dist/src/styles/cyjs/face.d.ts.map +1 -0
- package/dist/src/styles/cyjs/face.js +332 -0
- package/dist/src/styles/cyjs/face.js.map +1 -0
- package/dist/src/styles/cyjs/mappers.d.ts +44 -1
- package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
- package/dist/src/styles/cyjs/mappers.js +475 -26
- package/dist/src/styles/cyjs/mappers.js.map +1 -1
- package/dist/src/styles/cyjs/routes.d.ts +53 -0
- package/dist/src/styles/cyjs/routes.d.ts.map +1 -0
- package/dist/src/styles/cyjs/routes.js +360 -0
- package/dist/src/styles/cyjs/routes.js.map +1 -0
- package/dist/src/styles/cytoscape/charts.d.ts +23 -0
- package/dist/src/styles/cytoscape/charts.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/charts.js +560 -0
- package/dist/src/styles/cytoscape/charts.js.map +1 -0
- package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/emit.js +156 -48
- package/dist/src/styles/cytoscape/emit.js.map +1 -1
- package/dist/src/styles/cytoscape/lexicon.d.ts +91 -3
- package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/lexicon.js +387 -77
- package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
- package/dist/src/styles/cytoscape/mappings.d.ts +30 -0
- package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/mappings.js +92 -0
- package/dist/src/styles/cytoscape/mappings.js.map +1 -1
- package/dist/src/styles/cytoscape/resolve.d.ts +42 -2
- package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/resolve.js +623 -17
- package/dist/src/styles/cytoscape/resolve.js.map +1 -1
- package/dist/src/styles/defaults.d.ts +46 -26
- package/dist/src/styles/defaults.d.ts.map +1 -1
- package/dist/src/styles/defaults.js +308 -71
- package/dist/src/styles/defaults.js.map +1 -1
- package/dist/src/styles/index.d.ts +4 -3
- package/dist/src/styles/index.d.ts.map +1 -1
- package/dist/src/styles/index.js +3 -2
- package/dist/src/styles/index.js.map +1 -1
- package/dist/src/styles/internal.d.ts +1 -0
- package/dist/src/styles/internal.d.ts.map +1 -1
- package/dist/src/styles/internal.js +1 -0
- package/dist/src/styles/internal.js.map +1 -1
- package/dist/src/styles/io/generic.d.ts.map +1 -1
- package/dist/src/styles/io/generic.js +56 -16
- package/dist/src/styles/io/generic.js.map +1 -1
- package/dist/src/styles/io/round-trip.d.ts +56 -0
- package/dist/src/styles/io/round-trip.d.ts.map +1 -0
- package/dist/src/styles/io/round-trip.js +138 -0
- package/dist/src/styles/io/round-trip.js.map +1 -0
- package/dist/src/styles/io/writer.d.ts.map +1 -1
- package/dist/src/styles/io/writer.js +6 -1
- package/dist/src/styles/io/writer.js.map +1 -1
- package/dist/src/styles/notes.d.ts.map +1 -1
- package/dist/src/styles/notes.js +1 -0
- package/dist/src/styles/notes.js.map +1 -1
- package/dist/src/styles/plan/features.d.ts +1 -1
- package/dist/src/styles/plan/features.d.ts.map +1 -1
- package/dist/src/styles/plan/features.js +22 -2
- package/dist/src/styles/plan/features.js.map +1 -1
- package/dist/src/styles/plan/index.d.ts +1 -1
- package/dist/src/styles/plan/index.d.ts.map +1 -1
- package/dist/src/styles/plan/index.js +1 -1
- package/dist/src/styles/plan/index.js.map +1 -1
- package/dist/src/styles/plan/plan.d.ts.map +1 -1
- package/dist/src/styles/plan/plan.js +61 -4
- package/dist/src/styles/plan/plan.js.map +1 -1
- package/dist/src/styles/plan/resolve.d.ts +11 -0
- package/dist/src/styles/plan/resolve.d.ts.map +1 -1
- package/dist/src/styles/plan/resolve.js +40 -4
- package/dist/src/styles/plan/resolve.js.map +1 -1
- package/dist/src/styles/slots.d.ts +14 -0
- package/dist/src/styles/slots.d.ts.map +1 -0
- package/dist/src/styles/slots.js +20 -0
- package/dist/src/styles/slots.js.map +1 -0
- package/dist/src/styles/types.d.ts +687 -6
- package/dist/src/styles/types.d.ts.map +1 -1
- package/dist/src/styles/vocabulary.d.ts +3 -2
- package/dist/src/styles/vocabulary.d.ts.map +1 -1
- package/dist/src/styles/vocabulary.js +224 -0
- package/dist/src/styles/vocabulary.js.map +1 -1
- package/dist/styles.js +30 -239
- package/dist/styles.js.map +1 -1
- package/dist/xgmml.js +3 -3
- package/package.json +27 -7
- package/src/formats/cx/importer.ts +6 -1
- package/src/formats/cx/styles.ts +143 -9
- package/src/formats/cx2/importer.ts +1 -0
- package/src/formats/cx2/styles.ts +3 -1
- package/src/formats/cys/importer.ts +1 -0
- package/src/formats/cys/styles.ts +27 -5
- package/src/formats/dot/drawing.ts +799 -0
- package/src/formats/dot/exporter.ts +37 -1
- package/src/formats/dot/importer.ts +192 -36
- package/src/formats/dot/index.ts +3 -1
- package/src/formats/dot/label-places.ts +241 -0
- package/src/formats/dot/names.ts +15 -0
- package/src/formats/dot/record.ts +336 -0
- package/src/formats/dot/styles.ts +1702 -149
- package/src/formats/gexf/dialog-metrics.ts +61 -0
- package/src/formats/gexf/importer.ts +50 -5
- package/src/formats/gexf/preview.ts +217 -0
- package/src/formats/gexf/schema.ts +2 -1
- package/src/formats/gexf/styles.ts +1099 -245
- package/src/formats/gml/importer.ts +291 -76
- package/src/formats/gml/index.ts +1 -1
- package/src/formats/gml/positions.ts +29 -7
- package/src/formats/gml/styles.ts +852 -110
- package/src/formats/graphml/styles-plain.ts +6 -15
- package/src/formats/graphml/styles-yed.ts +765 -176
- package/src/formats/graphml/styles-yfiles3.ts +487 -63
- package/src/formats/graphml/yfiles.ts +19 -6
- package/src/formats/json/dialect.ts +41 -5
- package/src/formats/json/importer.ts +59 -7
- package/src/formats/json/index.ts +1 -0
- package/src/formats/json/positions.ts +22 -5
- package/src/formats/json/styles.ts +2123 -171
- package/src/formats/pajek/draw.ts +469 -0
- package/src/formats/pajek/exporter.ts +81 -49
- package/src/formats/pajek/importer.ts +278 -103
- package/src/formats/pajek/index.ts +1 -0
- package/src/formats/pajek/styles.ts +1506 -133
- package/src/formats/pajek/syntax.ts +27 -2
- package/src/formats/xgmml/emit.ts +73 -5
- package/src/formats/xgmml/styles.ts +330 -71
- package/src/index.ts +12 -1
- package/src/positions/convert.ts +12 -1
- package/src/positions/extract.ts +55 -1
- package/src/positions/index.ts +1 -0
- package/src/positions/types.ts +60 -0
- package/src/sources/builtins.ts +8 -1
- package/src/sources/context.ts +1 -0
- package/src/sources/credentials.ts +90 -1
- package/src/sources/cypher/descriptor.ts +7 -1
- package/src/sources/cypher/index.ts +149 -18
- package/src/sources/cypher/params.ts +1 -1
- package/src/sources/cypher/query-builder.ts +33 -0
- package/src/sources/ids.ts +6 -0
- package/src/sources/params.ts +3 -0
- package/src/sources/rest/descriptor.ts +9 -0
- package/src/sources/rest/openalex.ts +4 -2
- package/src/sources/rest/source.ts +41 -0
- package/src/sources/run.ts +35 -3
- package/src/sources/sigv4.ts +6 -4
- package/src/sources/sparql/descriptor.ts +67 -0
- package/src/sources/sparql/index.ts +371 -0
- package/src/sources/sparql/ntriples.ts +219 -0
- package/src/sources/sparql/params.ts +28 -0
- package/src/sources/sparql/query.ts +216 -0
- package/src/sources/types.ts +68 -0
- package/src/styles/annotations.ts +201 -27
- package/src/styles/canon/bends.ts +137 -0
- package/src/styles/canon/color-tables.ts +10 -4
- package/src/styles/canon/color.ts +105 -3
- package/src/styles/canon/enums.ts +107 -8
- package/src/styles/canon/graphviz.ts +71 -10
- package/src/styles/canon/number.ts +19 -0
- package/src/styles/canon/text.ts +187 -16
- package/src/styles/codes.ts +2 -0
- package/src/styles/cyjs/cascade.ts +1303 -84
- package/src/styles/cyjs/defaults-table.ts +4 -0
- package/src/styles/cyjs/emit.ts +268 -14
- package/src/styles/cyjs/face.ts +372 -0
- package/src/styles/cyjs/mappers.ts +506 -27
- package/src/styles/cyjs/routes.ts +432 -0
- package/src/styles/cytoscape/charts.ts +684 -0
- package/src/styles/cytoscape/emit.ts +170 -48
- package/src/styles/cytoscape/lexicon.ts +431 -78
- package/src/styles/cytoscape/mappings.ts +108 -0
- package/src/styles/cytoscape/resolve.ts +741 -17
- package/src/styles/defaults.ts +417 -108
- package/src/styles/index.ts +5 -0
- package/src/styles/internal.ts +1 -0
- package/src/styles/io/generic.ts +79 -23
- package/src/styles/io/round-trip.ts +202 -0
- package/src/styles/io/writer.ts +6 -1
- package/src/styles/notes.ts +1 -0
- package/src/styles/plan/features.ts +23 -2
- package/src/styles/plan/index.ts +1 -1
- package/src/styles/plan/plan.ts +69 -5
- package/src/styles/plan/resolve.ts +47 -4
- package/src/styles/slots.ts +25 -0
- package/src/styles/types.ts +698 -5
- package/src/styles/vocabulary.ts +232 -2
- package/dist/chunks/block-Cu22ewuS.js.map +0 -1
- package/dist/chunks/choose-Cdx6Enl2.js +0 -57
- package/dist/chunks/choose-Cdx6Enl2.js.map +0 -1
- package/dist/chunks/codes-CV_Bhcyi.js.map +0 -1
- package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
- package/dist/chunks/credentials-BiQsnMTb.js.map +0 -1
- package/dist/chunks/descriptor-BJ-W0Jd-.js.map +0 -1
- package/dist/chunks/emit-CD8xnY8s.js.map +0 -1
- package/dist/chunks/export-CZ7VRm4I.js.map +0 -1
- package/dist/chunks/exporter-bxxjOrDZ.js.map +0 -1
- package/dist/chunks/format-BMS-1Nxb.js +0 -64
- package/dist/chunks/format-BMS-1Nxb.js.map +0 -1
- package/dist/chunks/generic-CP6YD34u.js.map +0 -1
- package/dist/chunks/importer-B87_fmVx.js.map +0 -1
- package/dist/chunks/importer-CB_zV5_L.js.map +0 -1
- package/dist/chunks/importer-CVT-JyDE.js.map +0 -1
- package/dist/chunks/importer-Cyy6UseH.js.map +0 -1
- package/dist/chunks/importer-DPZDN40-.js.map +0 -1
- package/dist/chunks/importer-e3huMZbm.js.map +0 -1
- package/dist/chunks/lexicon-u2SI5xcx.js.map +0 -1
- package/dist/chunks/sigv4-LkAzsLAu.js.map +0 -1
- package/dist/chunks/styles-CaABMoO1.js.map +0 -1
- package/dist/chunks/styles-P_gmFAOi.js +0 -770
- package/dist/chunks/styles-P_gmFAOi.js.map +0 -1
- package/dist/chunks/styles-yed-Cs1nmrjn.js.map +0 -1
- package/dist/chunks/writer-DvHTl36J.js +0 -449
- package/dist/chunks/writer-DvHTl36J.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"styles-P_gmFAOi.js","sources":["../../src/formats/gexf/schema.ts","../../src/formats/gexf/styles.ts"],"sourcesContent":["/**\n * What the GEXF importer and exporter share (research note 07 section 2.1, design sections 5.1,\n * 5.5, 5.6 and 5.10): the namespaces of the two supported versions, the fixed names and\n * declarations of the columns derived from XML attributes and viz elements (design section 5.6:\n * XML-attribute-derived columns have fixed names and roles, and a declared attribute that would\n * take one of them is renamed `<name>#<id>`), the shape of a temporal extension table, and the\n * declared-type table of each version for the exporter.\n */\n\nimport { type ColumnDecl, type Dtype } from \"@graphty/graph-format\";\n\nimport { TIME_TEXT_ROLE, TIME_TEXT_SUFFIX } from \"../../common/temporal.js\";\n\n/**\n * The GEXF versions the exporter writes.\n * @category Built-in formats\n */\nexport type GexfVersion = \"1.2\" | \"1.3\";\n\n/**\n * The format name.\n * @category Plugin helpers\n */\nexport const GEXF_FORMAT = \"gexf\";\n\n/**\n * The namespace URIs of each version.\n * @category Plugin helpers\n */\nexport const GEXF_NAMESPACES: Readonly<Record<GexfVersion, { readonly gexf: string; readonly viz: string }>> = {\n \"1.2\": { gexf: \"http://www.gexf.net/1.2draft\", viz: \"http://www.gexf.net/1.2draft/viz\" },\n \"1.3\": { gexf: \"http://gexf.net/1.3\", viz: \"http://gexf.net/1.3/viz\" },\n};\n\n/**\n * The default edge type values of `<graph defaultedgetype>` and `<edge type>`.\n * @category Plugin helpers\n */\nexport type GexfEdgeType = \"directed\" | \"undirected\" | \"mutual\";\n\n/**\n * The GEXF `timeformat` values.\n * @category Plugin helpers\n */\nexport const TIME_FORMATS: ReadonlySet<string> = new Set([\"integer\", \"double\", \"date\", \"dateTime\"]);\n\n/**\n * The GEXF graph `mode` values.\n * @category Plugin helpers\n */\nexport const GRAPH_MODES: ReadonlySet<string> = new Set([\"static\", \"dynamic\", \"slice\"]);\n\n/**\n * The GEXF 1.3 `timerepresentation` values.\n * @category Plugin helpers\n */\nexport const TIME_REPRESENTATIONS: ReadonlySet<string> = new Set([\"interval\", \"timestamp\"]);\n\n/**\n * The `origin.namespace` of viz-derived columns.\n * @category Plugin helpers\n */\nexport const VIZ_NAMESPACE = \"viz\";\n\n/** The origin every XML-derived column declares. */\nconst XML_ORIGIN = { format: GEXF_FORMAT };\n\n/** The origin of every viz-derived column. */\nconst VIZ_ORIGIN = { format: GEXF_FORMAT, namespace: VIZ_NAMESPACE };\n\n/**\n * The fixed node column names the importer owns (design section 5.6): a declared attribute with\n * one of these titles is renamed `<title>#<id>` so the XML-derived column keeps its name and role.\n *\n * Deprecated, unchanged until the next major version: the viz role columns (`color`, `size`,\n * `shape`, `shape.uri`, and on edges `color`, `thickness`, `shape`) and the rename of an attribute\n * titled like one. The GEXF style reader (styles.ts) is the only code that turns them into\n * drawing; in the next major they leave the import result.\n * @category Plugin helpers\n */\nexport const NODE_COLUMNS = Object.freeze({\n label: \"label\",\n parent: \"parent\",\n parents: \"parents\",\n start: \"start\",\n end: \"end\",\n timestamp: \"timestamp\",\n spells: \"spells\",\n spellsOpen: \"spells.open\",\n timestamps: \"timestamps\",\n open: \"open\",\n position: \"position\",\n color: \"color\",\n size: \"size\",\n shape: \"shape\",\n shapeUri: \"shape.uri\",\n});\n\n/** The fixed edge column names the importer owns. */\nconst EDGE_COLUMNS = Object.freeze({\n id: \"id\",\n label: \"label\",\n kind: \"kind\",\n start: \"start\",\n end: \"end\",\n timestamp: \"timestamp\",\n spells: \"spells\",\n spellsOpen: \"spells.open\",\n timestamps: \"timestamps\",\n open: \"open\",\n color: \"color\",\n thickness: \"thickness\",\n shape: \"shape\",\n});\n\n/**\n * Every reserved node column name, including the temporal companions.\n * @category Plugin helpers\n */\nexport const RESERVED_NODE_NAMES: ReadonlySet<string> = new Set([\n ...Object.values(NODE_COLUMNS),\n NODE_COLUMNS.start + TIME_TEXT_SUFFIX,\n NODE_COLUMNS.end + TIME_TEXT_SUFFIX,\n NODE_COLUMNS.timestamp + TIME_TEXT_SUFFIX,\n]);\n\n/**\n * Every reserved edge column name, including the temporal companions.\n * @category Plugin helpers\n */\nexport const RESERVED_EDGE_NAMES: ReadonlySet<string> = new Set([\n ...Object.values(EDGE_COLUMNS),\n EDGE_COLUMNS.start + TIME_TEXT_SUFFIX,\n EDGE_COLUMNS.end + TIME_TEXT_SUFFIX,\n EDGE_COLUMNS.timestamp + TIME_TEXT_SUFFIX,\n]);\n\n/**\n * The declarations of the XML-derived node columns, keyed as NODE_COLUMNS.\n * @category Plugin helpers\n */\nexport const NODE_DECLS: Readonly<Record<keyof typeof NODE_COLUMNS, ColumnDecl>> = {\n label: { name: NODE_COLUMNS.label, dtype: \"string\", role: \"label\", nullable: true, origin: XML_ORIGIN },\n parent: {\n name: NODE_COLUMNS.parent,\n dtype: \"u32\",\n role: \"parent\",\n refersTo: \"node\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n parents: {\n name: NODE_COLUMNS.parents,\n dtype: \"list\",\n itemDtype: \"u32\",\n role: \"parents\",\n refersTo: \"node\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n start: { name: NODE_COLUMNS.start, dtype: \"f64\", role: \"start\", nullable: true, origin: XML_ORIGIN },\n end: { name: NODE_COLUMNS.end, dtype: \"f64\", role: \"end\", nullable: true, origin: XML_ORIGIN },\n timestamp: { name: NODE_COLUMNS.timestamp, dtype: \"f64\", role: \"timestamp\", nullable: true, origin: XML_ORIGIN },\n spells: {\n name: NODE_COLUMNS.spells,\n dtype: \"list\",\n itemDtype: \"f64\",\n itemComponents: 2,\n role: \"spells\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n timestamps: {\n name: NODE_COLUMNS.timestamps,\n dtype: \"list\",\n itemDtype: \"f64\",\n role: \"timestamps\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n open: { name: NODE_COLUMNS.open, dtype: \"u8\", role: \"open\", nullable: true, origin: XML_ORIGIN },\n spellsOpen: {\n name: NODE_COLUMNS.spellsOpen,\n dtype: \"list\",\n itemDtype: \"u8\",\n role: \"spellsOpen\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n position: {\n name: NODE_COLUMNS.position,\n dtype: \"f64\",\n components: 3,\n role: \"position\",\n mutable: true,\n nullable: true,\n origin: VIZ_ORIGIN,\n extra: { units: \"file\" },\n },\n color: {\n name: NODE_COLUMNS.color,\n dtype: \"f32\",\n components: 4,\n role: \"color\",\n nullable: true,\n origin: VIZ_ORIGIN,\n },\n size: { name: NODE_COLUMNS.size, dtype: \"f32\", role: \"size\", nullable: true, origin: VIZ_ORIGIN },\n shape: { name: NODE_COLUMNS.shape, dtype: \"dict\", role: \"shape\", nullable: true, origin: VIZ_ORIGIN },\n shapeUri: { name: NODE_COLUMNS.shapeUri, dtype: \"string\", nullable: true, origin: VIZ_ORIGIN },\n};\n\n/**\n * The declarations of the XML-derived edge columns, keyed as EDGE_COLUMNS.\n * @category Plugin helpers\n */\nexport const EDGE_DECLS: Readonly<Record<keyof typeof EDGE_COLUMNS, ColumnDecl>> = {\n id: { name: EDGE_COLUMNS.id, dtype: \"string\", role: \"id\", unique: true, nullable: true, origin: XML_ORIGIN },\n label: { name: EDGE_COLUMNS.label, dtype: \"string\", role: \"label\", nullable: true, origin: XML_ORIGIN },\n kind: { name: EDGE_COLUMNS.kind, dtype: \"dict\", role: \"kind\", nullable: true, origin: XML_ORIGIN },\n start: { name: EDGE_COLUMNS.start, dtype: \"f64\", role: \"start\", nullable: true, origin: XML_ORIGIN },\n end: { name: EDGE_COLUMNS.end, dtype: \"f64\", role: \"end\", nullable: true, origin: XML_ORIGIN },\n timestamp: { name: EDGE_COLUMNS.timestamp, dtype: \"f64\", role: \"timestamp\", nullable: true, origin: XML_ORIGIN },\n spells: {\n name: EDGE_COLUMNS.spells,\n dtype: \"list\",\n itemDtype: \"f64\",\n itemComponents: 2,\n role: \"spells\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n timestamps: {\n name: EDGE_COLUMNS.timestamps,\n dtype: \"list\",\n itemDtype: \"f64\",\n role: \"timestamps\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n open: { name: EDGE_COLUMNS.open, dtype: \"u8\", role: \"open\", nullable: true, origin: XML_ORIGIN },\n spellsOpen: {\n name: EDGE_COLUMNS.spellsOpen,\n dtype: \"list\",\n itemDtype: \"u8\",\n role: \"spellsOpen\",\n nullable: true,\n origin: XML_ORIGIN,\n },\n color: {\n name: EDGE_COLUMNS.color,\n dtype: \"f32\",\n components: 4,\n role: \"color\",\n nullable: true,\n origin: VIZ_ORIGIN,\n },\n thickness: { name: EDGE_COLUMNS.thickness, dtype: \"f32\", role: \"thickness\", nullable: true, origin: VIZ_ORIGIN },\n shape: { name: EDGE_COLUMNS.shape, dtype: \"dict\", role: \"shape\", nullable: true, origin: VIZ_ORIGIN },\n};\n\n/**\n * The bit of the `open` column marking an open start (design section 5.1).\n * @category Plugin helpers\n */\nexport const OPEN_START = 1;\n\n/**\n * The bit of the `open` column marking an open end.\n * @category Plugin helpers\n */\nexport const OPEN_END = 2;\n\n/** The prefix of a temporal extension table's name (design section 5.10). */\nconst TEMPORAL_TABLE_PREFIX = \"temporal:\";\n\n/**\n * The column names of a temporal extension table (design section 5.10).\n * @category Plugin helpers\n */\nexport const TEMPORAL_COLUMNS = Object.freeze({\n element: \"element\",\n start: \"start\",\n end: \"end\",\n value: \"value\",\n open: \"open\",\n startText: `start${TIME_TEXT_SUFFIX}`,\n endText: `end${TIME_TEXT_SUFFIX}`,\n valueText: `value${TIME_TEXT_SUFFIX}`,\n});\n\n/**\n * The name of the temporal extension table of a dynamic attribute.\n * @param domain - node or edge\n * @param column - the static column's name\n * @returns `temporal:<domain>:<column>`\n * @category Plugin helpers\n */\nexport function temporalTableName(domain: \"node\" | \"edge\", column: string): string {\n return `${TEMPORAL_TABLE_PREFIX}${domain}:${column}`;\n}\n\n/**\n * Split a temporal table name into its domain and column.\n * @param name - the table name\n * @returns the parts, or null when the name is not a temporal table's\n * @category Plugin helpers\n */\nexport function parseTemporalTableName(name: string): { domain: \"node\" | \"edge\"; column: string } | null {\n if (!name.startsWith(TEMPORAL_TABLE_PREFIX)) {\n return null;\n }\n const rest = name.slice(TEMPORAL_TABLE_PREFIX.length);\n const colon = rest.indexOf(\":\");\n if (colon < 0) {\n return null;\n }\n const domain = rest.slice(0, colon);\n if (domain !== \"node\" && domain !== \"edge\") {\n return null;\n }\n return { domain, column: rest.slice(colon + 1) };\n}\n\n/**\n * The column declarations of a temporal extension table (design section 5.10): the element index,\n * the interval, the value in the attribute's dtype, the interval's text companions, an open-bounds\n * byte and, for a temporal-typed attribute, the value's text companion.\n * @param domain - the domain the element column refers to\n * @param value - the value column's declaration fields (dtype, itemDtype, options...)\n * @param temporalValue - whether the value is itself a temporal type needing a text companion\n * @returns the declarations in table order\n * @category Plugin helpers\n */\nexport function temporalTableDecls(\n domain: \"node\" | \"edge\",\n value: Pick<ColumnDecl, \"dtype\" | \"itemDtype\" | \"options\" | \"origin\">,\n temporalValue: boolean,\n): ColumnDecl[] {\n const decls: ColumnDecl[] = [\n { name: TEMPORAL_COLUMNS.element, dtype: \"u32\", refersTo: domain, nullable: false },\n { name: TEMPORAL_COLUMNS.start, dtype: \"f64\", role: \"start\", nullable: true },\n { name: TEMPORAL_COLUMNS.end, dtype: \"f64\", role: \"end\", nullable: true },\n { name: TEMPORAL_COLUMNS.value, ...value, nullable: true },\n {\n name: TEMPORAL_COLUMNS.startText,\n dtype: \"string\",\n role: TIME_TEXT_ROLE,\n nullable: true,\n extra: { for: TEMPORAL_COLUMNS.start },\n },\n { name: TEMPORAL_COLUMNS.endText, dtype: \"string\", nullable: true, extra: { for: TEMPORAL_COLUMNS.end } },\n { name: TEMPORAL_COLUMNS.open, dtype: \"u8\", role: \"open\", nullable: true },\n ];\n if (temporalValue) {\n decls.push({\n name: TEMPORAL_COLUMNS.valueText,\n dtype: \"string\",\n nullable: true,\n extra: { for: TEMPORAL_COLUMNS.value },\n });\n }\n return decls;\n}\n\n/** The scalar type names GEXF 1.2 declares. */\nconst TYPES_1_2: ReadonlySet<string> = new Set([\"integer\", \"long\", \"double\", \"float\", \"boolean\", \"string\", \"anyURI\"]);\n\n/** The scalar type names GEXF 1.3 declares (the list variants are derived). */\nconst TYPES_1_3: ReadonlySet<string> = new Set([\n ...TYPES_1_2,\n \"bigdecimal\",\n \"biginteger\",\n \"byte\",\n \"char\",\n \"short\",\n \"date\",\n \"dateTime\",\n]);\n\n/**\n * Whether a declared type text is a scalar type of a version (case-sensitive, as the schema spells\n * them).\n * @param type - the type text\n * @param version - the target version\n * @returns true when the version declares it\n * @category Plugin helpers\n */\nexport function isScalarType(type: string, version: GexfVersion): boolean {\n return (version === \"1.2\" ? TYPES_1_2 : TYPES_1_3).has(type);\n}\n\n/**\n * Whether a declared type text is a list type of a version: `liststring` in 1.2, `list<scalar>` in 1.3.\n * @param type - the type text\n * @param version - the target version\n * @returns true when the version declares it\n * @category Plugin helpers\n */\nexport function isListType(type: string, version: GexfVersion): boolean {\n if (version === \"1.2\") {\n return type === \"liststring\";\n }\n return type.startsWith(\"list\") && type.length > 4 && isScalarType(type.slice(4), \"1.3\");\n}\n\n/**\n * The canonical GEXF scalar type of a column dtype (design section 5.1 reversed).\n * @param dtype - a scalar dtype\n * @returns the type text; u32 becomes `long` (its range exceeds `integer`), u8 `integer`, json `string`\n * @category Plugin helpers\n */\nexport function canonicalScalarType(dtype: Dtype): string {\n switch (dtype) {\n case \"bool\":\n return \"boolean\";\n case \"i32\":\n case \"u8\":\n return \"integer\";\n case \"u32\":\n return \"long\";\n case \"f32\":\n return \"float\";\n case \"f64\":\n return \"double\";\n case \"dict\":\n case \"string\":\n case \"json\":\n case \"list\":\n return \"string\";\n default: {\n const name: string = dtype;\n return name;\n }\n }\n}\n","/**\n * GEXF styles: reading the viz module (`viz:color`, `viz:size`, `viz:shape`, `viz:thickness`) into the neutral\n * style vocabulary with Gephi's defaults, and writing a graph's styles back into the viz module, with graphty's\n * `graphty.styles` block in `<meta>` (in graphty's own XML namespace, which graph-io, NetworkX's `read_gexf` and\n * Gephi's GEXF importer all skip) and the per-element style values the block reads as ordinary attributes.\n */\n\nimport type { GraphSnapshot } from \"@graphty/graph-format\";\n\nimport { explicitWeights } from \"../../common/weights.js\";\nimport { canonColor } from \"../../styles/canon/color.js\";\nimport { canonEnum } from \"../../styles/canon/enums.js\";\nimport { canonNumber } from \"../../styles/canon/number.js\";\nimport type { CanonSite } from \"../../styles/canon/site.js\";\nimport { canonText } from \"../../styles/canon/text.js\";\nimport { StyleApproximations } from \"../../styles/io/approximations.js\";\nimport { blockStyles, parseStyleBlock, STYLE_BLOCK_NAME } from \"../../styles/io/block.js\";\nimport type { ExporterStyleInput } from \"../../styles/io/writer.js\";\nimport { StyleNotes } from \"../../styles/notes.js\";\nimport { styleFingerprint } from \"../../styles/plan/features.js\";\nimport { plainCell, resolveStyles } from \"../../styles/plan/resolve.js\";\nimport type {\n ImporterStyles,\n StyleColumn,\n StyleReadContext,\n StyleRule,\n StyleTarget,\n StyleValue,\n StyleWriteCapabilities,\n} from \"../../styles/types.js\";\nimport type { LossNote } from \"../../types.js\";\nimport { NODE_COLUMNS, VIZ_NAMESPACE } from \"./schema.js\";\n\n/** The column of a node's `label` attribute. */\nconst LABEL_COLUMN = NODE_COLUMNS.label;\n\n/**\n * The XML namespace of graphty's own elements in a GEXF file (the `graphty.styles` block inside `<meta>`).\n * @category Built-in formats\n */\nexport const GRAPHTY_XML_NAMESPACE = \"https://graphty.app/ns/gexf\";\n\n/**\n * What the GEXF writer holds natively: a node's `label` attribute, the viz module's color (with its alpha), size, shape and\n * thickness, and the edge line shape. The block goes into `<meta>`.\n * @category Built-in formats\n */\nexport const GEXF_STYLE_CAPABILITIES: StyleWriteCapabilities = Object.freeze({\n tool: \"gephi\",\n node: Object.freeze([\"label\", \"fill\", \"fillOpacity\", \"width\", \"height\", \"shape\", \"image\"] as const),\n edge: Object.freeze([\"color\", \"opacity\", \"width\", \"lineStyle\"] as const),\n block: \"native\",\n});\n\n/** Gephi's node fill when a node has no `viz:color` (graphstore NodeImpl), which its edges then take. */\nconst GEPHI_NODE_FILL = \"#000000\";\n\n/** The style column marking directed edges, which Gephi draws with an arrow at the target. */\nconst DIRECTED_KEY = \"directed\";\n\n/** The style column holding the mixed color of each edge without a color of its own. */\nconst MIXED_COLOR_KEY = \"mixed-color\";\n/** The style columns of the border Gephi draws on each node without one of its own. */\nconst BORDER_COLOR_KEY = \"border-color\";\nconst BORDER_WIDTH_KEY = \"border-width\";\n/** The style column of the label size Gephi draws on each node, scaled with the node. */\nconst LABEL_SIZE_KEY = \"label-size\";\n/** The style column of the width Gephi draws an edge with from its weight. */\nconst WEIGHT_WIDTH_KEY = \"weight-width\";\n\n/** GEXF's node shapes, by the neutral shape each writes exactly. */\nconst NODE_SHAPES: ReadonlyMap<string, string> = new Map([\n [\"ellipse\", \"disc\"],\n [\"rectangle\", \"square\"],\n [\"triangle\", \"triangle\"],\n [\"diamond\", \"diamond\"],\n]);\n\n/** The nearest GEXF node shape of the neutral shapes GEXF does not have; anything else is a disc. */\nconst NEAREST_NODE_SHAPES: ReadonlyMap<string, string> = new Map([\n [\"round-rectangle\", \"square\"],\n [\"vee\", \"triangle\"],\n]);\n\n/** GEXF's edge shapes; a dash pattern GEXF does not have is dashed, anything else solid. */\nconst EDGE_SHAPES: ReadonlySet<string> = new Set([\"solid\", \"dotted\", \"dashed\", \"double\"]);\n\n/**\n * The GEXF node shape written for a neutral shape.\n * @param shape - the neutral shape\n * @returns the GEXF shape and whether it is exact\n */\nfunction gexfNodeShape(shape: string): { readonly value: string; readonly exact: boolean } {\n const exact = NODE_SHAPES.get(shape);\n return exact === undefined\n ? { value: NEAREST_NODE_SHAPES.get(shape) ?? \"disc\", exact: false }\n : { value: exact, exact: true };\n}\n\n/**\n * The GEXF edge shape written for a neutral line style.\n * @param line - the neutral line style\n * @returns the GEXF shape and whether it is exact\n */\nfunction gexfEdgeShape(line: string): { readonly value: string; readonly exact: boolean } {\n if (EDGE_SHAPES.has(line)) {\n return { value: line, exact: true };\n }\n return { value: line === \"dash-dot\" || line === \"long-dash\" ? \"dashed\" : \"solid\", exact: false };\n}\n\n/** The viz-derived columns the reader reads; `shape.uri` is the image of an `image` shape. */\nconst VIZ_COLUMNS: Readonly<Record<StyleTarget, readonly string[]>> = {\n node: [\"color\", \"size\", \"shape\", \"shape.uri\"],\n edge: [\"color\", \"thickness\", \"shape\"],\n};\n\n/**\n * A `viz:color` `hex` value as channels: r, g and b 0..255 and an alpha 0..1. Reads `#rgb`, `#rgba`, `#rrggbb` and\n * `#rrggbbaa` (alpha last), with or without the `#`.\n * @param hex - the attribute's value\n * @returns `[r, g, b, a]`, or null when it is not a hex color\n */\nexport function canonVizColor(hex: string): [number, number, number, number] | null {\n const text = hex.trim();\n if (!/^#?([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(text)) {\n return null;\n }\n const c = canonColor(text.startsWith(\"#\") ? text : `#${text}`, \"css\", {\n notes: new StyleNotes(),\n target: \"node\",\n property: \"fill\",\n });\n if (c === null) {\n return null;\n }\n const n = Number.parseInt(c.color.slice(1), 16);\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255, c.alpha];\n}\n\n/**\n * A viz column of the snapshot, or null when the column is absent or not viz-derived.\n * @param snapshot - the graph\n * @param target - nodes or edges\n * @param name - the column's fixed name\n * @returns the column's name, or null\n */\nfunction vizColumn(snapshot: GraphSnapshot, target: StyleTarget, name: string): string | null {\n const col = (target === \"node\" ? snapshot.nodes : snapshot.edges).get(name);\n return col !== null && col.meta.origin?.namespace === VIZ_NAMESPACE ? name : null;\n}\n\n/** What the per-element readers of vizValues() share. */\ninterface VizRead {\n readonly table: GraphSnapshot[\"nodes\"];\n readonly target: StyleTarget;\n /** The values of a property, created on first use. */\n readonly column: (property: string) => (StyleValue | null)[];\n /** Where a value of an element was read. */\n readonly site: (i: number, property: string) => CanonSite;\n}\n\n/**\n * One target's canonical values from its viz columns and, on a node, its `label` attribute, which Gephi draws.\n * @param snapshot - the graph\n * @param target - nodes or edges\n * @param notes - where problems are noted\n * @param context - the work budget\n * @returns the values per property\n */\nfunction vizValues(\n snapshot: GraphSnapshot,\n target: StyleTarget,\n notes: StyleNotes,\n context: StyleReadContext,\n): Record<string, (StyleValue | null)[]> {\n const table = target === \"node\" ? snapshot.nodes : snapshot.edges;\n const n = target === \"node\" ? snapshot.nodeCount : snapshot.edgeCount;\n const out: Record<string, (StyleValue | null)[]> = {};\n const viz: VizRead = {\n table,\n target,\n column: (p) => (out[p] ??= new Array<StyleValue | null>(n).fill(null)),\n site: (i, property) => ({ notes, target, property, element: i, budget: context.budget }),\n };\n const color = vizColumn(snapshot, target, \"color\");\n const size = vizColumn(snapshot, target, target === \"node\" ? \"size\" : \"thickness\");\n const shape = vizColumn(snapshot, target, \"shape\");\n const uri = target === \"node\" ? vizColumn(snapshot, target, \"shape.uri\") : null;\n // Gephi draws the labels of nodes; an edge's label it does not draw\n const label = target === \"node\" ? table.byRole(\"label\") : null;\n for (let i = 0; i < n; i++) {\n if (label !== null) {\n readLabel(viz, label, i);\n }\n if (color !== null) {\n readVizColor(viz, color, i);\n }\n if (size !== null) {\n readVizSize(viz, size, i);\n }\n // GEXF gives a shape a uri only to name the picture of an `image` shape\n if (shape !== null && readVizShape(viz, shape, i) && uri !== null) {\n readVizImage(viz, uri, i);\n }\n }\n return out;\n}\n\n/**\n * Reads one node's label, which Gephi draws.\n * @param viz - the target's reading\n * @param label - the label column\n * @param i - the element\n */\nfunction readLabel(viz: VizRead, label: NonNullable<ReturnType<GraphSnapshot[\"nodes\"][\"byRole\"]>>, i: number): void {\n const text = canonText(plainCell(label.value(i)), viz.site(i, \"label\"));\n if (text !== null) {\n viz.column(\"label\")[i] = text;\n }\n}\n\n/**\n * Reads the picture of one node whose viz shape is `image`.\n * @param viz - the target's reading\n * @param uri - the viz shape uri column\n * @param i - the element\n */\nfunction readVizImage(viz: VizRead, uri: string, i: number): void {\n const v = plainCell(viz.table.value(uri, i));\n if (typeof v === \"string\" && v.length > 0) {\n viz.column(\"image\")[i] = v;\n }\n}\n\n/**\n * Reads one element's viz color: a fill on a node, a color on an edge, with its alpha as an opacity.\n * @param viz - the target's reading\n * @param color - the viz color column\n * @param i - the element\n */\nfunction readVizColor(viz: VizRead, color: string, i: number): void {\n const v = plainCell(viz.table.value(color, i));\n if (!Array.isArray(v)) {\n return;\n }\n const [fill, opacity] = viz.target === \"node\" ? [\"fill\", \"fillOpacity\"] : [\"color\", \"opacity\"];\n const [r, g, b, a = 1] = v as number[];\n const c = canonColor({ r: r * 255, g: g * 255, b: b * 255, a }, \"gexf\", viz.site(i, fill));\n if (c !== null) {\n viz.column(fill)[i] = c.color;\n if (c.alpha < 1) {\n viz.column(opacity)[i] = c.alpha;\n }\n }\n}\n\n/**\n * Reads one element's viz size (a node's width and height) or thickness (an edge's width).\n * @param viz - the target's reading\n * @param size - the viz size or thickness column\n * @param i - the element\n */\nfunction readVizSize(viz: VizRead, size: string, i: number): void {\n const v = canonNumber(plainCell(viz.table.value(size, i)), viz.site(i, \"width\"));\n if (v !== null) {\n viz.column(\"width\")[i] = v;\n if (viz.target === \"node\") {\n viz.column(\"height\")[i] = v;\n }\n }\n}\n\n/**\n * Reads one element's viz shape: a node's shape, an edge's line style.\n * @param viz - the target's reading\n * @param shape - the viz shape column\n * @param i - the element\n * @returns whether it is an `image` shape\n */\nfunction readVizShape(viz: VizRead, shape: string, i: number): boolean {\n const raw = plainCell(viz.table.value(shape, i));\n if (raw === null) {\n return false;\n }\n const kind = viz.target === \"node\" ? \"shape\" : \"lineStyle\";\n viz.column(kind)[i] = canonEnum(kind, raw, \"gexf\", viz.site(i, kind));\n return typeof raw === \"string\" && raw.toLowerCase() === \"image\";\n}\n\n/**\n * Whether each edge is directed.\n * @param snapshot - the graph\n * @returns one flag per edge\n */\nfunction directedEdges(snapshot: GraphSnapshot): boolean[] {\n const out = new Array<boolean>(snapshot.edgeCount).fill(snapshot.directed);\n const col = snapshot.directed ? snapshot.edges.byRole(\"directed\") : null;\n if (col !== null) {\n for (let e = 0; e < snapshot.edgeCount; e++) {\n out[e] = plainCell(col.value(e)) !== false;\n }\n }\n return out;\n}\n\n/**\n * The rules Gephi's defaults make per element, as Gephi's Preview draws them (`DefaultPreset.java`; sources in\n * `styles/defaults.ts`): an arrow at the target of every directed edge; the mean of its two nodes' colors on every\n * edge without a color of its own (Preview's \"mixed\" edge color); the edge's weight as the thickness of every edge\n * without a thickness of its own; a border darker than its fill and scaled with its size on every node without a\n * border of its own; and each node's label, in a size scaled with the node (12 for a size-10 node) on every node\n * without a label size of its own (Gephi draws GEXF, its GraphML export and its GML the same way).\n *\n * Labels are a choice, not Gephi's default: Gephi hides them in both its drawings (`DefaultPreset.java` line 106,\n * `VizConfig.java` line 113), while sigma.js and gexf-js, which most published GEXF files are viewed with, show\n * them. graph-io shows them: a label is what the file states about a node, and hiding it is a view setting Gephi\n * offers as a switch, like the application's own; an application that wants Gephi's look hides them itself.\n *\n * An edge's own color is kept, though Preview's \"mixed\" mode draws over it: the file states it, and Gephi's\n * Overview, Preview's \"original\" mode, sigma.js and gexf-js all draw it.\n * @param snapshot - the graph\n * @param node - the node values read from the file\n * @param edge - the edge values read from the file\n * @param budget - the work budget\n * @returns the node and edge rules and the style columns they read\n */\nexport function gephiRules(\n snapshot: GraphSnapshot,\n node: Readonly<Record<string, readonly (StyleValue | null)[]>>,\n edge: Readonly<Record<string, readonly (StyleValue | null)[]>>,\n budget: StyleReadContext[\"budget\"],\n): { readonly node: ToolRules; readonly edge: ToolRules } {\n return { node: gephiNodeRules(snapshot, node, budget), edge: gephiEdgeRules(snapshot, node, edge, budget) };\n}\n\n/** Rules and the style columns they read. */\ninterface ToolRules {\n readonly rules: StyleRule[];\n readonly columns: Map<string, StyleColumn>;\n}\n\n/** Preview's \"darker\" border: each channel of the fill times this (`DependantColor.java` line 55). */\nconst GEPHI_BORDER_DARKEN = 0.498;\n/** Preview's border width as a share of the node's drawn width (`SizeUtils.java` lines 11, 37). */\nconst GEPHI_BORDER_SHARE = 0.08;\n/** Gephi's node size when a node has none (`AbstractProcessor.java` lines 195-198). */\nconst GEPHI_NODE_SIZE = 10;\n/**\n * Preview's label size per unit of node size: Arial 12 (`DefaultPreset.java` line 93) times the node drawn twice its\n * size wide times 0.05 (`NodeLabelRenderer.java` lines 165-173, `NODE_LABEL_PROPORTIONAL_SIZE` true), so 12 for a\n * size-10 node.\n */\nconst GEPHI_LABEL_PER_SIZE = 1.2;\n\n/**\n * The node rules of Gephi's defaults: the border Preview draws, the label and its size scaled with the node.\n * @param snapshot - the graph\n * @param node - the node values read from the file\n * @param budget - the work budget\n * @returns the rules and their columns\n */\nfunction gephiNodeRules(\n snapshot: GraphSnapshot,\n node: Readonly<Record<string, readonly (StyleValue | null)[]>>,\n budget: StyleReadContext[\"budget\"],\n): ToolRules {\n const rules: StyleRule[] = [];\n const columns = new Map<string, StyleColumn>();\n const n = snapshot.nodeCount;\n budget.spend(\"node\", n);\n // Preview draws a ring of the fill, each channel times 0.498 (rounded), 0.08 of the node's width wide\n const color = withoutOwn(node.borderColor, n, (i) => darker(node.fill?.[i] ?? GEPHI_NODE_FILL));\n const size = (i: number): number => {\n const w = node.width?.[i];\n return typeof w === \"number\" ? w : GEPHI_NODE_SIZE;\n };\n const width = withoutOwn(node.borderWidth, n, (i) => round6(size(i) * GEPHI_BORDER_SHARE));\n // Preview scales each label with its node (NODE_LABEL_PROPORTIONAL_SIZE)\n const labelSize = withoutOwn(node.labelSize, n, (i) => round6(size(i) * GEPHI_LABEL_PER_SIZE));\n for (const [property, key, values, reason] of [\n [\"borderColor\", BORDER_COLOR_KEY, color, \"FILL_BORDER\"],\n [\"borderWidth\", BORDER_WIDTH_KEY, width, \"FILL_BORDER\"],\n [\"labelSize\", LABEL_SIZE_KEY, labelSize, \"NODE_SIZE_LABEL\"],\n ] as const) {\n const elements = values.filter((v) => v !== null).length;\n if (elements > 0) {\n columns.set(key, values);\n rules.push({\n id: `node.tool.${key}`,\n target: \"node\",\n role: \"passthrough\",\n origin: \"tool\",\n where: { has: { style: key } },\n map: { [property]: { kind: \"passthrough\" as const, by: { style: key } } },\n facts: { elements, reason },\n });\n }\n }\n const label = snapshot.nodes.names().find((name) => snapshot.nodes.get(name)?.meta.role === \"label\");\n if (label !== undefined && node.label === undefined) {\n rules.push({\n id: \"node.tool.label\",\n target: \"node\",\n role: \"passthrough\",\n origin: \"tool\",\n where: { has: { data: label } },\n map: { label: { kind: \"passthrough\", by: { data: label } } },\n facts: { reason: \"NODE_NAME\" },\n });\n }\n return { rules, columns };\n}\n\n/**\n * The edge rules of Gephi's defaults: the target arrow of a directed edge, the mixed color and the weight's width.\n * @param snapshot - the graph\n * @param node - the node values read from the file\n * @param edge - the edge values read from the file\n * @param budget - the work budget\n * @returns the rules and their columns\n */\nfunction gephiEdgeRules(\n snapshot: GraphSnapshot,\n node: Readonly<Record<string, readonly (StyleValue | null)[]>>,\n edge: Readonly<Record<string, readonly (StyleValue | null)[]>>,\n budget: StyleReadContext[\"budget\"],\n): ToolRules {\n const rules: StyleRule[] = [];\n const columns = new Map<string, StyleColumn>();\n const directed = directedEdges(snapshot);\n if (directed.some(Boolean)) {\n columns.set(\n DIRECTED_KEY,\n directed.map((d) => (d ? true : null)),\n );\n rules.push({\n id: \"edge.tool.arrow\",\n target: \"edge\",\n role: \"group\",\n origin: \"tool\",\n where: { has: { style: DIRECTED_KEY } },\n set: { targetArrow: \"triangle\" },\n });\n }\n // Preview draws an edge in the mean of its two nodes' colors. graphty-element cannot bind an edge's color to its\n // nodes' drawn colors yet, so the color is frozen here; replace this column with that binding once the element\n // has it (tracking issue \"graphty-element: bind an edge's color to its source node's drawn color\").\n const fill = (i: number): StyleValue => node.fill?.[i] ?? GEPHI_NODE_FILL;\n const mixed = withoutOwn(edge.color, snapshot.edgeCount, (e) =>\n mix(fill(snapshot.edgeSource(e)), fill(snapshot.edgeTarget(e))),\n );\n const uncolored = mixed.filter((v) => v !== null).length;\n budget.spend(\"edge\", snapshot.edgeCount);\n // Gephi draws an edge as thick as its weight (1 for an edge with none); a width of its own is the file's\n // The weights come from the snapshot's own weights (the role column exists only when some edge has none), read\n // as the shortest decimal of their dtype. A weight of 0 or below is drawn 1 wide, so the edge stays visible.\n // An undirected edge in a directed graph is one edge in the file and two halves here: both take the first's.\n const first = firstHalf(snapshot);\n const weights = explicitWeights(snapshot);\n const weightWidth = withoutOwn(edge.width, snapshot.edgeCount, (e) => {\n const w = Number(weights.text(first(e)) ?? 1);\n return Number.isFinite(w) && w > 0 ? w : 1;\n });\n const unsized = weightWidth.filter((v) => v !== null).length;\n if (unsized > 0) {\n columns.set(WEIGHT_WIDTH_KEY, weightWidth);\n rules.push({\n id: \"edge.tool.weight-width\",\n target: \"edge\",\n role: \"passthrough\",\n origin: \"tool\",\n where: { has: { style: WEIGHT_WIDTH_KEY } },\n map: { width: { kind: \"passthrough\", by: { style: WEIGHT_WIDTH_KEY } } },\n facts: { elements: unsized, reason: \"EDGE_WEIGHT\" },\n });\n }\n if (uncolored > 0) {\n columns.set(MIXED_COLOR_KEY, mixed);\n rules.push({\n id: \"edge.tool.mixed-color\",\n target: \"edge\",\n role: \"passthrough\",\n origin: \"tool\",\n where: { has: { style: MIXED_COLOR_KEY } },\n map: { color: { kind: \"passthrough\", by: { style: MIXED_COLOR_KEY } } },\n facts: { elements: uncolored, reason: \"END_NODES_COLOR\" },\n });\n }\n return { rules, columns };\n}\n\n/**\n * Preview's \"mixed\" edge color: the mean of two colors, each channel rounded down (`EdgeColor.java` lines 89-93).\n * @param a - one end's color, `#rrggbb`\n * @param b - the other's\n * @returns the mixed color\n */\nfunction gephiMix(a: string, b: string): string {\n const x = Number.parseInt(a.slice(1), 16);\n const y = Number.parseInt(b.slice(1), 16);\n let out = 0;\n for (const shift of [16, 8, 0]) {\n out |= Math.floor((((x >> shift) & 255) + ((y >> shift) & 255)) / 2) << shift;\n }\n return `#${out.toString(16).padStart(6, \"0\")}`;\n}\n\n/**\n * Preview's \"darker\" border color: each channel times 0.498, rounded (`ColorUtils.java` lines 22-34).\n * @param c - the fill, `#rrggbb`\n * @returns the border color\n */\nfunction gephiDarker(c: string): string {\n const x = Number.parseInt(c.slice(1), 16);\n let out = 0;\n for (const shift of [16, 8, 0]) {\n out |= Math.min(255, Math.round(((x >> shift) & 255) * GEPHI_BORDER_DARKEN)) << shift;\n }\n return `#${out.toString(16).padStart(6, \"0\")}`;\n}\n\nconst mix = (a: StyleValue, b: StyleValue): StyleValue => gephiMix(String(a), String(b));\nconst darker = (c: StyleValue): StyleValue => gephiDarker(String(c));\nconst round6 = (x: number): number => Math.round(x * 1e6) / 1e6;\n\n/**\n * The edge whose source Gephi draws for each edge: an undirected edge in a directed graph is one edge in the file\n * and two halves here, and the second half takes the first half's.\n * @param snapshot - the graph\n * @returns the first half of each edge\n */\nfunction firstHalf(snapshot: GraphSnapshot): (e: number) => number {\n const pair = snapshot.edges.byRole(\"pair\");\n return (e) => (pair?.isSet(e) === true ? Math.min(e, pair.value(e) as number) : e);\n}\n\n/**\n * A default value for every edge without a value of its own.\n * @param own - each edge's own value, or undefined when no edge has one\n * @param count - the edge count\n * @param value - the default of an edge\n * @returns the defaults, null where an edge has its own\n */\nfunction withoutOwn(\n own: readonly (StyleValue | null)[] | undefined,\n count: number,\n value: (e: number) => StyleValue,\n): (StyleValue | null)[] {\n const out = new Array<StyleValue | null>(count).fill(null);\n for (let e = 0; e < count; e++) {\n if (own?.[e] === null || own === undefined) {\n out[e] = value(e);\n }\n }\n return out;\n}\n\n/**\n * The styles of a GEXF file: each element's viz values as Gephi draws them, with Gephi Preview's defaults beneath\n * (black size-10 discs with a darker border, curved edges, an arrow at the target of every directed edge, the mixed\n * color of its nodes on every edge without a color of its own) and each node's label (see gephiRules()); plus a\n * `graphty.styles` block the file holds in `<meta>`.\n * @param snapshot - the graph the import built\n * @param context - the work budget and the block text the import kept\n * @returns the styles\n */\nexport function gexfStyles(snapshot: GraphSnapshot, context: StyleReadContext): ImporterStyles {\n const notes = new StyleNotes();\n const node = vizValues(snapshot, \"node\", notes, context);\n const edge = vizValues(snapshot, \"edge\", notes, context);\n const block = typeof context.kept === \"string\" ? context.kept : null;\n if (block !== null) {\n exactFromBlock(snapshot, block, node, edge);\n }\n const gephi = gephiRules(snapshot, node, edge, context.budget);\n return {\n canonical: true,\n dialect: \"gexf\",\n tool: \"gephi\",\n units: \"relative\",\n node: { values: node, ...gephi.node },\n edge: { values: edge, ...gephi.edge },\n notes: notes.list(),\n opacityInColor: true,\n block,\n readFrom: {\n node: VIZ_COLUMNS.node.filter((name) => vizColumn(snapshot, \"node\", name) !== null),\n edge: VIZ_COLUMNS.edge.filter((name) => vizColumn(snapshot, \"edge\", name) !== null),\n },\n };\n}\n\n/**\n * For a file graphty wrote: where a viz value is the nearest GEXF value of what the `graphty.styles` block gives (a\n * hexagon written as a disc, a width and height written as one size), the block's exact value is the truth, so a\n * re-import gives the same rules. A value that differs from what graphty wrote (another program edited it) stays\n * the truth.\n * @param snapshot - the graph\n * @param text - the block's text\n * @param node - the node values, changed in place\n * @param edge - the edge values, changed in place\n */\nfunction exactFromBlock(\n snapshot: GraphSnapshot,\n text: string,\n node: Record<string, (StyleValue | null)[]>,\n edge: Record<string, (StyleValue | null)[]>,\n): void {\n const parsed = parseStyleBlock(text, styleFingerprint(snapshot));\n const ex = parsed.ok ? blockStyles(parsed.block, snapshot, \"gexf\") : null;\n if (ex === null) {\n return;\n }\n const exact = (\n values: Record<string, (StyleValue | null)[]>,\n target: StyleTarget,\n property: string,\n written: (v: StyleValue, i: number) => StyleValue | null,\n ): void => {\n const native = values[property];\n if (native === undefined) {\n return;\n }\n const want = resolveStyles(ex, target, property as never, snapshot);\n for (let i = 0; i < native.length; i++) {\n const w = want[i];\n // a size is written from the width and the height together: one the block leaves unset reads back too\n const writable = w !== null || property === \"width\" || property === \"height\";\n if (writable && native[i] !== w && native[i] !== null && native[i] === written(w as StyleValue, i)) {\n native[i] = w;\n }\n }\n };\n const width = resolveStyles(ex, \"node\", \"width\", snapshot);\n const height = resolveStyles(ex, \"node\", \"height\", snapshot);\n const size = (i: number): StyleValue | null => {\n const w = width[i];\n const h = height[i];\n return typeof w === \"number\" && typeof h === \"number\" ? Math.max(w, h) : (w ?? h);\n };\n const read = new Map([\n [\"disc\", \"ellipse\"],\n [\"square\", \"rectangle\"],\n ]);\n exact(node, \"node\", \"shape\", (v) => {\n const written = gexfNodeShape(String(v)).value;\n return read.get(written) ?? written;\n });\n exact(edge, \"edge\", \"lineStyle\", (v) => gexfEdgeShape(String(v)).value);\n exact(node, \"node\", \"width\", (_v, i) => size(i));\n exact(node, \"node\", \"height\", (_v, i) => size(i));\n}\n\n// ============================================================ writing\n\n/** A GEXF export with styles worked out. */\nexport interface GexfStyledExport {\n /** The graph to write: the viz-derived columns the styles replace removed, the tagged style values added. */\n readonly snapshot: GraphSnapshot;\n /** The `<meta>` child holding the block. */\n readonly blockElement: string;\n /** The viz elements of one node from the styles. */\n node(row: number, indent: string): string;\n /** The viz elements of one edge from the styles. */\n edge(row: number, indent: string): string;\n /** W_STYLE_APPROXIMATED for every value written as the nearest one GEXF has. */\n readonly notes: readonly LossNote[];\n}\n\n/**\n * The dtype a tagged column is written with: numbers, booleans or text (a mixed column as text).\n * @param col - the values\n * @returns the dtype\n */\nfunction tagDtype(col: StyleColumn): \"f64\" | \"bool\" | \"string\" {\n const kinds = new Set(col.filter((v) => v !== null).map((v) => typeof v));\n if (kinds.size === 1 && kinds.has(\"number\")) {\n return \"f64\";\n }\n return kinds.size === 1 && kinds.has(\"boolean\") ? \"bool\" : \"string\";\n}\n\n/**\n * Works out a GEXF export with styles: the snapshot to write, the viz elements of each element from what graphty\n * draws, the block element and the approximations.\n * @param snapshot - the graph handed to the exporter\n * @param input - the styles, or undefined when none are written\n * @returns the styled export, or null without styles\n */\nexport function gexfStyledExport(\n snapshot: GraphSnapshot,\n input: ExporterStyleInput | undefined,\n): GexfStyledExport | null {\n if (input === undefined) {\n return null;\n }\n const p = (target: StyleTarget, property: string): readonly (StyleValue | null)[] =>\n input.picture(target, property as never);\n const fill = p(\"node\", \"fill\");\n const fillOpacity = p(\"node\", \"fillOpacity\");\n const image = p(\"node\", \"image\");\n const color = p(\"edge\", \"color\");\n const opacity = p(\"edge\", \"opacity\");\n const thickness = p(\"edge\", \"width\");\n const height = p(\"node\", \"height\");\n // the approximations are counted once, up front, so check() reports them before anything is written\n const approximated = new StyleApproximations();\n const nodeShapes = p(\"node\", \"shape\").map((s, i) => gexfShapeOf(s, typeof image[i] === \"string\", approximated));\n const nodeSizes = p(\"node\", \"width\").map((w, i) => gexfSizeOf(w, height[i], approximated));\n const edgeShapes = p(\"edge\", \"lineStyle\").map((s) => gexfLineOf(s, approximated));\n return {\n snapshot: withTagColumns(snapshot, input),\n blockElement: `<graphty:styles xmlns:graphty=\"${GRAPHTY_XML_NAMESPACE}\" name=\"${STYLE_BLOCK_NAME}\">${escapeXml(input.block)}</graphty:styles>`,\n notes: approximated.notes(\"GEXF\"),\n node(i, indent) {\n const size = nodeSizes[i];\n const s = nodeShapes[i];\n return (\n colorElement(fill[i], fillOpacity[i], indent) +\n (size === null ? \"\" : `${indent}<viz:size value=\"${String(size)}\"/>\\n`) +\n shapeElement(s, s === \"image\" ? String(image[i]) : null, indent)\n );\n },\n edge(e, indent) {\n const w = thickness[e];\n // an edge in the mixed color of its nodes is left without one: Gephi, and graph-io, draw it so anyway\n const c = color[e];\n const end = (i: number): string => String(fill[i] ?? GEPHI_NODE_FILL);\n const mixed =\n typeof c === \"string\" && c === gephiMix(end(snapshot.edgeSource(e)), end(snapshot.edgeTarget(e)));\n return (\n (mixed && (opacity[e] ?? 1) === 1 ? \"\" : colorElement(c, opacity[e], indent)) +\n (typeof w === \"number\" ? `${indent}<viz:thickness value=\"${String(w)}\"/>\\n` : \"\") +\n shapeElement(edgeShapes[e], null, indent)\n );\n },\n };\n}\n\n/**\n * The snapshot to write: the viz columns the styles replace removed, the tagged style values and the drawn labels\n * added.\n * @param snapshot - the graph handed to the exporter\n * @param input - the styles\n * @returns the snapshot\n */\nfunction withTagColumns(snapshot: GraphSnapshot, input: ExporterStyleInput): GraphSnapshot {\n const out = snapshot.withColumns();\n for (const target of [\"node\", \"edge\"] as const) {\n const table = target === \"node\" ? out.nodes : out.edges;\n for (const name of VIZ_COLUMNS[target]) {\n if (table.get(name)?.meta.origin?.namespace === VIZ_NAMESPACE) {\n table.remove(name);\n }\n }\n for (const [name, col] of input.tags[target]) {\n const dtype = tagDtype(col);\n table.set(name, dtype === \"string\" ? col.map((v) => (v === null ? null : String(v))) : col, { dtype });\n }\n }\n // a node's label attribute is the label Gephi draws\n const label = input.picture(\"node\", \"label\").map((v) => (typeof v === \"string\" ? v : null));\n out.nodes.set(LABEL_COLUMN, label, { dtype: \"string\", role: \"label\" }, { replaceRole: true });\n return out;\n}\n\n/**\n * A node's GEXF shape. A node with a picture is an `image` shape, the only shape GEXF gives a uri: another shape is\n * not written.\n * @param s - the node's shape\n * @param pictured - whether the node has a picture\n * @param approximated - where approximations are counted\n * @returns the shape, or null for none\n */\nfunction gexfShapeOf(s: StyleValue | null, pictured: boolean, approximated: StyleApproximations): string | null {\n if (pictured) {\n if (typeof s === \"string\" && s !== \"other:image\") {\n approximated.add(\"node\", \"shape\", s);\n }\n return \"image\";\n }\n if (typeof s !== \"string\") {\n return null;\n }\n const g = gexfNodeShape(s);\n if (!g.exact) {\n approximated.add(\"node\", \"shape\", s);\n }\n return g.value;\n}\n\n/**\n * An edge's GEXF shape.\n * @param s - the edge's line style\n * @param approximated - where approximations are counted\n * @returns the shape, or null for none\n */\nfunction gexfLineOf(s: StyleValue | null, approximated: StyleApproximations): string | null {\n if (typeof s !== \"string\") {\n return null;\n }\n const g = gexfEdgeShape(s);\n if (!g.exact) {\n approximated.add(\"edge\", \"lineStyle\", s);\n }\n return g.value;\n}\n\n/**\n * A node's GEXF size: one value, the larger of a width and height that differ.\n * @param w - the node's width\n * @param h - its height\n * @param approximated - where approximations are counted\n * @returns the size, or null for none\n */\nfunction gexfSizeOf(w: StyleValue | null, h: StyleValue | null, approximated: StyleApproximations): number | null {\n if (typeof w === \"number\" && typeof h === \"number\" && w !== h) {\n approximated.add(\"node\", w > h ? \"height\" : \"width\", `${String(w)} x ${String(h)}`);\n return Math.max(w, h);\n }\n if (typeof w === \"number\") {\n return w;\n }\n return typeof h === \"number\" ? h : null;\n}\n\n/**\n * A `<viz:color>` element.\n * @param hex - the color, `#rrggbb`\n * @param alpha - its opacity\n * @param indent - the indentation\n * @returns the element, \"\" without a color\n */\nfunction colorElement(hex: StyleValue | null, alpha: StyleValue | null, indent: string): string {\n if (typeof hex !== \"string\") {\n return \"\";\n }\n const n = Number.parseInt(hex.slice(1), 16);\n const a = typeof alpha === \"number\" && alpha !== 1 ? ` a=\"${String(alpha)}\"` : \"\";\n return `${indent}<viz:color r=\"${String((n >> 16) & 255)}\" g=\"${String((n >> 8) & 255)}\" b=\"${String(n & 255)}\"${a}/>\\n`;\n}\n\n/**\n * A `<viz:shape>` element.\n * @param shape - the GEXF shape, or null\n * @param uri - the picture of an `image` shape, or null\n * @param indent - the indentation\n * @returns the element, \"\" without a shape\n */\nfunction shapeElement(shape: string | null, uri: string | null, indent: string): string {\n if (shape === null) {\n return \"\";\n }\n return uri === null\n ? `${indent}<viz:shape value=\"${shape}\"/>\\n`\n : `${indent}<viz:shape value=\"${shape}\" uri=\"${escapeXml(uri)}\"/>\\n`;\n}\n\n/**\n * Text as XML character data or an attribute value.\n * @param text - the text\n * @returns the escaped text\n */\nfunction escapeXml(text: string): string {\n return text.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\").replaceAll('\"', \""\");\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"styles-yed-Cs1nmrjn.js","sources":["../../src/styles/canon/bends.ts","../../src/formats/graphml/styles-yed.ts"],"sourcesContent":["/**\n * The neutral `bends` value of an edge: the points its route passes through between its two nodes, each relative to\n * the straight line from the source node's center to the target node's center. `along` is how far along that line\n * the point lies (0 at the source center, 1 at the target center) and `across` how far to its left, y up, both as\n * fractions of the line's length. Written `along,across` per point, in order from the source, separated by spaces:\n * `\"0,-0.5 1,-0.5\"` is a route that leaves the source, runs parallel to the line half its length to the right, and\n * comes back to the target. Relative, so a drawing that moves or scales the nodes keeps the route's shape and its\n * right angles.\n */\n\n/** A point in the file's own coordinates. */\nexport type BendPoint = readonly [x: number, y: number];\n\n/**\n * Rounds a fraction to 4 decimals, so a value spells the same whatever float noise the file's numbers carry.\n * @param v - the fraction\n * @returns its spelling\n */\nconst fraction = (v: number): string => String(Math.round(v * 1e4) / 1e4);\n\n/**\n * The `bends` value of an edge whose route passes through `points`.\n * @param source - the source node's center\n * @param target - the target node's center\n * @param points - the bend points, from the source end\n * @param yDown - true when the file's y axis points down (the value is always y up)\n * @returns the value, or null with no bends, no line between distinct centers, or a coordinate that is not finite\n * @category Styles\n */\nexport function canonBends(\n source: BendPoint,\n target: BendPoint,\n points: readonly BendPoint[],\n yDown: boolean,\n): string | null {\n const flip = yDown ? -1 : 1;\n const dx = target[0] - source[0];\n const dy = (target[1] - source[1]) * flip;\n const length2 = dx * dx + dy * dy;\n if (points.length === 0 || length2 <= 0 || !Number.isFinite(length2)) {\n return null;\n }\n const out: string[] = [];\n for (const [px, py] of points) {\n const rx = px - source[0];\n const ry = (py - source[1]) * flip;\n const along = (rx * dx + ry * dy) / length2;\n const across = (dx * ry - dy * rx) / length2;\n if (!Number.isFinite(along) || !Number.isFinite(across)) {\n return null;\n }\n out.push(`${fraction(along)},${fraction(across)}`);\n }\n return out.join(\" \");\n}\n\n/**\n * The bend points a `bends` value places between two node centers: the inverse of {@link canonBends}.\n * @param source - the source node's center\n * @param target - the target node's center\n * @param value - the `bends` value\n * @param yDown - true when the points are wanted in a y-down file's coordinates\n * @returns the points, or null when the value is not `along,across` pairs or a coordinate is not finite\n * @category Styles\n */\nexport function bendsToPoints(source: BendPoint, target: BendPoint, value: string, yDown: boolean): BendPoint[] | null {\n const flip = yDown ? -1 : 1;\n const dx = target[0] - source[0];\n const dy = (target[1] - source[1]) * flip;\n const out: BendPoint[] = [];\n for (const pair of value.trim().split(/\\s+/)) {\n const [a, c, extra] = pair.split(\",\").map(Number);\n if (extra !== undefined || !Number.isFinite(a) || !Number.isFinite(c)) {\n return null;\n }\n const x = source[0] + a * dx - c * dy;\n const y = source[1] + (a * dy + c * dx) * flip;\n if (!Number.isFinite(x) || !Number.isFinite(y)) {\n return null;\n }\n out.push([x, y]);\n }\n return out.length === 0 ? null : out;\n}\n","/**\n * yEd styles (yFiles for Java 2.x GraphML): reading every realizer a yEd graphics tree holds (`y:ShapeNode`,\n * `y:GenericNode`, `y:GroupNode`, `y:SVGNode`, `y:PolyLineEdge`, `y:BezierEdge`, ...) into the neutral style\n * vocabulary, and writing a graph's styles back as `y:ShapeNode` and `y:PolyLineEdge` graphics. The trees are the\n * json columns the GraphML importer keeps (tree.ts), never the typed `yfiles.*` columns read from them.\n *\n * The tree helpers here are shared with the yFiles 3 reader.\n */\n\nimport type { GraphSnapshot } from \"@graphty/graph-format\";\n\nimport { toFilePositions, toNeutral } from \"../../positions/convert.js\";\nimport type { PositionColumnExtra } from \"../../positions/types.js\";\nimport { type BendPoint, bendsToPoints, canonBends } from \"../../styles/canon/bends.js\";\nimport { canonColor, colorOpacity } from \"../../styles/canon/color.js\";\nimport { canonEnum } from \"../../styles/canon/enums.js\";\nimport { canonNumber } from \"../../styles/canon/number.js\";\nimport { type CanonSite, MAX_STYLE_VALUE_LENGTH, noteAt } from \"../../styles/canon/site.js\";\nimport { canonText } from \"../../styles/canon/text.js\";\nimport { STYLE_ISSUE } from \"../../styles/codes.js\";\nimport { StyleApproximations } from \"../../styles/io/approximations.js\";\nimport type { ExporterStyleInput } from \"../../styles/io/writer.js\";\nimport type { StyleNotes } from \"../../styles/notes.js\";\nimport { plainCell } from \"../../styles/plan/resolve.js\";\nimport type { StyleTarget, StyleValue, StyleWorkBudget, StyleWriteCapabilities } from \"../../styles/types.js\";\nimport type { LossNote } from \"../../types.js\";\n\n// ============================================================ the kept trees\n\n/** A tree object as tree.ts builds it: `@_<name>` attributes, `#text`, and child elements by name. */\ntype Tree = Record<string, unknown>;\n\n/**\n * Whether a value is a tree object.\n * @param value - the value\n * @returns true for a non-array object\n */\nexport function isTree(value: unknown): value is Tree {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * The local part of an element name: `y:ShapeNode` is `ShapeNode`, whatever the prefix.\n * @param name - the name as written\n * @returns the local name\n */\nexport function localOf(name: string): string {\n const colon = name.indexOf(\":\");\n return colon < 0 ? name : name.slice(colon + 1);\n}\n\n/**\n * The child elements of a tree node with a local name, in file order.\n * @param node - the tree node\n * @param local - the local name\n * @returns the children\n */\nexport function treeChildren(node: unknown, local: string): unknown[] {\n const out: unknown[] = [];\n if (!isTree(node)) {\n return out;\n }\n for (const key of Object.keys(node)) {\n if (key.startsWith(\"@_\") || key === \"#text\" || localOf(key) !== local) {\n continue;\n }\n const value = node[key];\n if (Array.isArray(value)) {\n for (const item of value) {\n out.push(item);\n }\n } else {\n out.push(value);\n }\n }\n return out;\n}\n\n/**\n * The first child element of a tree node with a local name.\n * @param node - the tree node\n * @param local - the local name\n * @returns the child, or undefined\n */\nexport function treeChild(node: unknown, local: string): unknown {\n if (!isTree(node)) {\n return undefined;\n }\n for (const key of Object.keys(node)) {\n if (!key.startsWith(\"@_\") && key !== \"#text\" && localOf(key) === local) {\n const value = node[key];\n return Array.isArray(value) ? value[0] : value;\n }\n }\n return undefined;\n}\n\n/**\n * An attribute of a tree node.\n * @param node - the tree node\n * @param name - the attribute name as written\n * @returns its text, or undefined\n */\nexport function treeAttr(node: unknown, name: string): string | undefined {\n if (!isTree(node) || !Object.hasOwn(node, `@_${name}`)) {\n return undefined;\n }\n const value = node[`@_${name}`];\n return typeof value === \"string\" ? value : undefined;\n}\n\n/**\n * The text of an element: the element itself when it has neither attributes nor children, else its `#text`.\n * @param node - the tree node\n * @returns the text, or null\n */\nexport function treeText(node: unknown): string | null {\n if (typeof node === \"string\") {\n return node;\n }\n if (isTree(node) && Object.hasOwn(node, \"#text\")) {\n const text = node[\"#text\"];\n return typeof text === \"string\" ? text : null;\n }\n return null;\n}\n\n/**\n * The json columns of a table holding yFiles trees.\n * @param table - the node, edge or graph table\n * @returns their names\n */\nfunction treeColumns(table: GraphSnapshot[\"nodes\"]): string[] {\n const out: string[] = [];\n for (const col of table) {\n if (col.dtype === \"json\" && col.meta.origin?.namespace === \"yfiles\") {\n out.push(col.meta.name);\n }\n }\n return out;\n}\n\n/**\n * Every column of a table the GraphML importer made from yFiles keys: the trees and the typed `yfiles.*` columns\n * read from them. They hold the styles themselves, so the planner never explains a style with them.\n * @param table - the node or edge table\n * @returns their names\n */\nexport function yfilesColumns(table: GraphSnapshot[\"nodes\"]): string[] {\n const out: string[] = [];\n for (const col of table) {\n if (col.meta.origin?.namespace === \"yfiles\") {\n out.push(col.meta.name);\n }\n }\n return out;\n}\n\n// ============================================================ reading\n\n/** One element's canonical value of a property; null leaves it unset. */\nexport type PutValue = (property: string, value: StyleValue | null) => void;\n\n/** Where a value of an element was read, by property. */\nexport type SiteOf = (property: string) => CanonSite;\n\n/** The yEd node realizers, by local name. */\nconst NODE_REALIZERS: ReadonlySet<string> = new Set([\n \"ShapeNode\",\n \"GenericNode\",\n \"GroupNode\",\n \"GenericGroupNode\",\n \"SVGNode\",\n \"ImageNode\",\n \"TableNode\",\n \"UMLClassNode\",\n \"UMLNoteNode\",\n \"ProxyAutoBoundsNode\",\n]);\n\n/** The yEd edge realizers, by local name. */\nconst EDGE_REALIZERS: ReadonlySet<string> = new Set([\n \"PolyLineEdge\",\n \"ArcEdge\",\n \"BezierEdge\",\n \"QuadCurveEdge\",\n \"SplineEdge\",\n \"GenericEdge\",\n]);\n\n/** A realizer: its local name and its element. */\ninterface Realizer {\n readonly type: string;\n readonly r: unknown;\n}\n\n/**\n * The realizer a graphics tree holds; a `y:ProxyAutoBoundsNode` (a folder or group) gives its active realizer.\n * @param tree - the `<data>` content\n * @param names - the realizer names of the target\n * @returns the realizer, or null\n */\nfunction realizerOf(tree: unknown, names: ReadonlySet<string>): Realizer | null {\n if (!isTree(tree)) {\n return null;\n }\n for (const key of Object.keys(tree)) {\n const type = localOf(key);\n if (key.startsWith(\"@_\") || !names.has(type)) {\n continue;\n }\n const value = tree[key];\n const r = Array.isArray(value) ? value[0] : value;\n return type === \"ProxyAutoBoundsNode\" ? activeRealizer(r) : { type, r };\n }\n return null;\n}\n\n/**\n * The active realizer of a `y:ProxyAutoBoundsNode`, else its first.\n * @param proxy - the proxy element\n * @returns the realizer, or null when it has none\n */\nfunction activeRealizer(proxy: unknown): Realizer | null {\n const realizers = treeChild(proxy, \"Realizers\");\n const all: Realizer[] = [];\n if (isTree(realizers)) {\n for (const k of Object.keys(realizers).filter((key) => !key.startsWith(\"@_\") && key !== \"#text\")) {\n for (const item of treeChildren(realizers, localOf(k))) {\n all.push({ type: localOf(k), r: item });\n }\n }\n }\n const active = Number(treeAttr(realizers, \"active\") ?? \"0\");\n return all[Number.isInteger(active) && active >= 0 && active < all.length ? active : 0] ?? null;\n}\n\n/**\n * yEd's flowchart palette (`com.yworks.flowchart.<name>`), by name, to the shape each draws. Matched whole, before\n * the words below: \"data\" is a parallelogram, but \"storedData\" and \"directData\" are not.\n */\nconst FLOWCHART_SHAPES: ReadonlyMap<string, string> = new Map([\n [\"process\", \"rectangle\"],\n [\"decision\", \"diamond\"],\n [\"terminator\", \"round-rectangle\"],\n [\"start1\", \"ellipse\"],\n [\"start2\", \"ellipse\"],\n [\"data\", \"parallelogram\"],\n [\"preparation\", \"hexagon\"],\n]);\n\nconst FLOWCHART_PREFIX = \"com.yworks.flowchart.\";\n\n/**\n * The shape a yEd flowchart configuration draws: a GraphML GenericNode's `configuration`, or a yEd GML node's\n * `customconfiguration`.\n * @param configuration - the configuration\n * @returns the neutral shape, or null for a configuration that is not one of the flowchart shapes known here\n */\nexport function flowchartShape(configuration: string): string | null {\n return configuration.startsWith(FLOWCHART_PREFIX)\n ? (FLOWCHART_SHAPES.get(configuration.slice(FLOWCHART_PREFIX.length)) ?? null)\n : null;\n}\n\n/** GenericNode configurations, by a word they contain, to the shape they draw; the first match wins. */\nconst GENERIC_SHAPES: readonly (readonly [string, string])[] = [\n [\"ellipse\", \"ellipse\"],\n [\"circle\", \"ellipse\"],\n [\"oval\", \"ellipse\"],\n [\"diamond\", \"diamond\"],\n [\"decision\", \"diamond\"],\n [\"hexagon\", \"hexagon\"],\n [\"octagon\", \"octagon\"],\n [\"triangle\", \"triangle\"],\n [\"rect\", \"rectangle\"],\n [\"process\", \"rectangle\"],\n [\"box\", \"rectangle\"],\n];\n\n/**\n * yEd's label positions (`modelPosition` of the internal, sides, sandwich, corners and eight-position models). The\n * internal model's `t` (inside the top of the box: a group's title) is `inside-top`; its other inside positions have\n * no neutral value and read as the nearest side or corner.\n */\nconst YED_POSITIONS: ReadonlyMap<string, string> = new Map([\n [\"c\", \"center\"],\n [\"t\", \"top\"],\n [\"b\", \"bottom\"],\n [\"l\", \"left\"],\n [\"r\", \"right\"],\n [\"tl\", \"top-left\"],\n [\"tr\", \"top-right\"],\n [\"bl\", \"bottom-left\"],\n [\"br\", \"bottom-right\"],\n [\"n\", \"top\"],\n [\"s\", \"bottom\"],\n [\"e\", \"right\"],\n [\"w\", \"left\"],\n [\"nw\", \"top-left\"],\n [\"ne\", \"top-right\"],\n [\"sw\", \"bottom-left\"],\n [\"se\", \"bottom-right\"],\n]);\n\n/** yEd's font styles, as label weight and italic. */\nexport const FONT_STYLES: ReadonlyMap<string, readonly [string, boolean]> = new Map([\n [\"plain\", [\"normal\", false]],\n [\"bold\", [\"bold\", false]],\n [\"italic\", [\"normal\", true]],\n [\"bolditalic\", [\"bold\", true]],\n]);\n\n/**\n * Reads a color into a property and its alpha into the property's opacity (or notes the alpha dropped).\n * @param raw - the attribute\n * @param property - the color property\n * @param opacity - its opacity property, or null when it has none\n * @param put - receives the values\n * @param at - the sites\n */\nfunction readColor(raw: unknown, property: string, opacity: string | null, put: PutValue, at: SiteOf): void {\n const c = canonColor(raw, \"yed\", at(property));\n if (c === null) {\n return;\n }\n put(property, c.color);\n const alpha = colorOpacity(c, null, at(property), opacity !== null);\n if (opacity !== null) {\n put(opacity, alpha);\n }\n}\n\n/**\n * Reads an element's label: the first visible label with text (yEd icon nodes put an empty, `hasText=\"false\"`\n * label first); further visible labels are noted for the element.\n * @param labels - the label elements, in file order\n * @param node - whether they are node labels (which have a position)\n * @param put - receives the values\n * @param at - the sites\n */\nfunction readLabels(labels: readonly unknown[], node: boolean, put: PutValue, at: SiteOf): void {\n let label: unknown = undefined;\n let text = \"\";\n let extra = 0;\n for (const l of labels) {\n const t = treeText(l)?.trim() ?? \"\";\n if (t.length === 0 || treeAttr(l, \"visible\") === \"false\" || treeAttr(l, \"hasText\") === \"false\") {\n continue;\n }\n if (label === undefined) {\n label = l;\n text = t;\n } else {\n extra++;\n }\n }\n if (label === undefined) {\n return;\n }\n if (extra > 0) {\n noteAt(at(\"label\"), STYLE_ISSUE.EXTRA_LABELS, `${String(extra + 1)} labels`);\n }\n put(\"label\", canonText(text, at(\"label\")));\n readLabelLook(label, node, put, at);\n}\n\n/**\n * Reads a label's look: its color, font and, for a node label, its position.\n * @param label - the label element\n * @param node - whether it is a node label\n * @param put - receives the values\n * @param at - the sites\n */\nfunction readLabelLook(label: unknown, node: boolean, put: PutValue, at: SiteOf): void {\n readColor(treeAttr(label, \"textColor\"), \"labelColor\", null, put, at);\n put(\"labelSize\", canonNumber(treeAttr(label, \"fontSize\"), at(\"labelSize\")));\n put(\"labelFont\", canonText(treeAttr(label, \"fontFamily\"), at(\"labelFont\")));\n const style = treeAttr(label, \"fontStyle\");\n if (style !== undefined) {\n const known = FONT_STYLES.get(style.trim().toLowerCase());\n if (known === undefined) {\n noteAt(at(\"labelWeight\"), STYLE_ISSUE.UNKNOWN_VALUE, style.slice(0, MAX_STYLE_VALUE_LENGTH));\n } else {\n put(\"labelWeight\", known[0]);\n put(\"labelItalic\", known[1]);\n }\n }\n if (node) {\n readLabelPosition(label, put, at);\n }\n}\n\n/**\n * Reads a node label's position: a `custom` label from its `y:SmartNodeLabelModelParameter`, any other from its\n * `modelPosition` (yEd's default model is `internal`).\n * @param label - the label element\n * @param put - receives the values\n * @param at - the sites\n */\nfunction readLabelPosition(label: unknown, put: PutValue, at: SiteOf): void {\n const model = treeAttr(label, \"modelName\")?.trim().toLowerCase() ?? \"internal\";\n if (model === \"custom\") {\n const smart = treeChild(treeChild(label, \"ModelParameter\"), \"SmartNodeLabelModelParameter\");\n if (smart === undefined) {\n noteAt(at(\"labelPosition\"), STYLE_ISSUE.UNKNOWN_VALUE, \"custom\");\n return;\n }\n put(\"labelPosition\", smartPosition(smart));\n return;\n }\n const position = treeAttr(label, \"modelPosition\");\n if (position === undefined) {\n return;\n }\n const key = position.trim().toLowerCase();\n const known = model === \"internal\" && key === \"t\" ? \"inside-top\" : YED_POSITIONS.get(key);\n if (known === undefined) {\n noteAt(at(\"labelPosition\"), STYLE_ISSUE.UNKNOWN_VALUE, position.slice(0, MAX_STYLE_VALUE_LENGTH));\n }\n put(\"labelPosition\", known ?? null);\n}\n\n/**\n * The nearest neutral position of a SmartNodeLabelModel placement. yEd puts the point `labelRatio` of the label\n * (-0.5..0.5 of its size from its center) on the point `nodeRatio` of the node; the offsets are ignored. On each axis\n * a node ratio below or above zero is that side, zero is the middle. A label on the node's top edge that hangs down\n * into it (labelRatioY at or below zero) is `inside-top`; every other edge or corner placement is the outside side\n * or corner, the nearest neutral value (an inside bottom or side has none).\n * @param smart - the `y:SmartNodeLabelModelParameter` element\n * @returns the position\n */\nfunction smartPosition(smart: unknown): string {\n const ratio = (name: string): number => {\n const n = Number(treeAttr(smart, name));\n return Number.isFinite(n) ? n : 0;\n };\n const h = sideOf(ratio(\"nodeRatioX\"), \"left\", \"right\");\n const v = sideOf(ratio(\"nodeRatioY\"), \"top\", \"bottom\");\n if (v === \"top\" && h === \"\" && ratio(\"labelRatioY\") <= 0) {\n return \"inside-top\";\n }\n if (v === \"\" || h === \"\") {\n return v + h || \"center\";\n }\n return `${v}-${h}`;\n}\n\n/**\n * One axis of a SmartNodeLabelModel node ratio.\n * @param ratio - the ratio, -0.5..0.5\n * @param low - the side below zero\n * @param high - the side above zero\n * @returns the side, or \"\" for the middle\n */\nfunction sideOf(ratio: number, low: string, high: string): string {\n if (ratio < 0) {\n return low;\n }\n return ratio > 0 ? high : \"\";\n}\n\n/**\n * The shape of a node realizer: its `y:Shape` where it has one, a GenericNode's configuration, or the realizer\n * type itself for one that draws an image (SVG, image, table, UML).\n * @param real - the realizer\n * @param at - the sites\n * @returns the shape, or null\n */\nfunction realizerShape(real: Realizer, at: SiteOf): string | null {\n const shape = treeChild(real.r, \"Shape\");\n if (shape !== undefined) {\n return canonEnum(\"shape\", treeAttr(shape, \"type\"), \"yed\", at(\"shape\"));\n }\n if (real.type === \"ShapeNode\" || real.type === \"GroupNode\" || real.type === \"GenericGroupNode\") {\n return null;\n }\n if (real.type === \"GenericNode\") {\n const conf = treeAttr(real.r, \"configuration\") ?? \"\";\n const flowchart = flowchartShape(conf);\n if (flowchart !== null) {\n return flowchart;\n }\n const lower = conf.slice(0, MAX_STYLE_VALUE_LENGTH).toLowerCase();\n for (const [word, value] of GENERIC_SHAPES) {\n if (lower.includes(word)) {\n return value;\n }\n }\n if (lower.length === 0) {\n return null;\n }\n noteAt(at(\"shape\"), STYLE_ISSUE.UNKNOWN_VALUE, lower);\n return `other:${lower}`;\n }\n noteAt(at(\"shape\"), STYLE_ISSUE.UNKNOWN_VALUE, real.type);\n return `other:${real.type}`;\n}\n\n/**\n * Reads one node realizer.\n * @param real - the realizer\n * @param put - receives the values\n * @param at - the sites\n */\nfunction readNode(real: Realizer, put: PutValue, at: SiteOf): void {\n const { r } = real;\n const fill = treeChild(r, \"Fill\");\n if (fill !== undefined) {\n if (treeAttr(fill, \"hasColor\") === \"false\" || treeAttr(fill, \"transparent\") === \"true\") {\n noteAt(at(\"fill\"), STYLE_ISSUE.NO_FILL, \"transparent\");\n put(\"fillOpacity\", 0);\n } else {\n readColor(treeAttr(fill, \"color\"), \"fill\", \"fillOpacity\", put, at);\n const second = treeAttr(fill, \"color2\");\n if (second !== undefined) {\n noteAt(at(\"fill\"), STYLE_ISSUE.GRADIENT, second);\n }\n }\n }\n const border = treeChild(r, \"BorderStyle\");\n if (border !== undefined) {\n if (treeAttr(border, \"hasColor\") === \"false\") {\n put(\"borderWidth\", 0);\n } else {\n readColor(treeAttr(border, \"color\"), \"borderColor\", null, put, at);\n put(\"borderWidth\", canonNumber(treeAttr(border, \"width\"), at(\"borderWidth\")));\n }\n put(\"borderStyle\", canonEnum(\"borderStyle\", treeAttr(border, \"type\"), \"yed\", at(\"borderStyle\")));\n }\n const geometry = treeChild(r, \"Geometry\");\n put(\"width\", canonNumber(treeAttr(geometry, \"width\"), at(\"width\")));\n put(\"height\", canonNumber(treeAttr(geometry, \"height\"), at(\"height\")));\n put(\"shape\", realizerShape(real, at));\n readLabels(treeChildren(r, \"NodeLabel\"), true, put, at);\n}\n\n/**\n * Reads one edge realizer.\n * @param real - the realizer\n * @param put - receives the values\n * @param at - the sites\n */\nfunction readEdge(real: Realizer, put: PutValue, at: SiteOf): void {\n const { r } = real;\n const line = treeChild(r, \"LineStyle\");\n if (line !== undefined) {\n readColor(treeAttr(line, \"color\"), \"color\", \"opacity\", put, at);\n put(\"width\", canonNumber(treeAttr(line, \"width\"), at(\"width\")));\n put(\"lineStyle\", canonEnum(\"lineStyle\", treeAttr(line, \"type\"), \"yed\", at(\"lineStyle\")));\n }\n const arrows = treeChild(r, \"Arrows\");\n if (arrows !== undefined) {\n put(\"sourceArrow\", canonEnum(\"arrow\", treeAttr(arrows, \"source\"), \"yed\", at(\"sourceArrow\")));\n put(\"targetArrow\", canonEnum(\"arrow\", treeAttr(arrows, \"target\"), \"yed\", at(\"targetArrow\")));\n }\n put(\"curved\", edgeCurved(real));\n readLabels(treeChildren(r, \"EdgeLabel\"), false, put, at);\n}\n\n/**\n * Whether yEd draws an edge curved: an arc always; a Bezier, quad curve, spline or generic edge only through its\n * control points (with none it is a straight line); a polyline only when it smooths bends it has.\n * @param real - the edge realizer\n * @returns true when curved, null when a polyline does not say whether it smooths\n */\nfunction edgeCurved(real: Realizer): boolean | null {\n if (real.type === \"ArcEdge\") {\n return true;\n }\n const bent = treeChildren(treeChild(real.r, \"Path\"), \"Point\").length > 0;\n if (real.type !== \"PolyLineEdge\") {\n return bent;\n }\n const smoothed = treeAttr(treeChild(real.r, \"BendStyle\"), \"smoothed\");\n return smoothed === undefined ? null : smoothed === \"true\" && bent;\n}\n\n/**\n * An edge's bends: the points of its `y:Path`, relative to the centers of its two nodes. yEd draws a polyline through\n * them; a curve type (Bezier, quad curve, spline) passes near them as its control points.\n * @param real - the edge realizer\n * @param centers - each node's center, x and y\n * @param source - the source node's index\n * @param target - the target node's index\n * @returns the `bends` value, or null without bends\n */\nfunction edgeBends(real: Realizer, centers: Float64Array, source: number, target: number): string | null {\n const points = treeChildren(treeChild(real.r, \"Path\"), \"Point\").map((p): BendPoint => [\n Number(treeAttr(p, \"x\")),\n Number(treeAttr(p, \"y\")),\n ]);\n const at = (k: number): BendPoint => [centers[2 * k], centers[2 * k + 1]];\n return canonBends(at(source), at(target), points, true);\n}\n\n/** Canonical values per property, by element index. */\nexport type ValueColumns = Record<string, (StyleValue | null)[]>;\n\n/**\n * A collector of canonical values for one target.\n * @param n - the element count\n * @returns the values and a setter for element i\n */\nexport function valueColumns(n: number): {\n readonly values: ValueColumns;\n put(i: number, property: string, value: StyleValue | null): void;\n} {\n const values: ValueColumns = Object.create(null) as ValueColumns;\n return {\n values,\n put(i, property, value) {\n if (value !== null) {\n values[property] ??= new Array<StyleValue | null>(n).fill(null);\n values[property][i] = value;\n }\n },\n };\n}\n\n/** What the yEd reader read. */\nexport interface YedRead {\n /** Node values. */\n readonly node: ValueColumns;\n /** Edge values. */\n readonly edge: ValueColumns;\n}\n\n/**\n * The yEd styles of a graph: each element's realizer read into canonical values.\n * @param snapshot - the graph\n * @param notes - where problems are noted\n * @param budget - the work budget\n * @returns the values, or null when no element has a yEd realizer\n */\nexport function readYedStyles(snapshot: GraphSnapshot, notes: StyleNotes, budget: StyleWorkBudget): YedRead | null {\n let found = false;\n // each node's center, read with the node, for its edges' bends; NaN for a node without yEd graphics\n const centers = new Float64Array(2 * snapshot.nodeCount).fill(Number.NaN);\n const read = (target: StyleTarget): ValueColumns => {\n const table = target === \"node\" ? snapshot.nodes : snapshot.edges;\n const n = target === \"node\" ? snapshot.nodeCount : snapshot.edgeCount;\n const names = target === \"node\" ? NODE_REALIZERS : EDGE_REALIZERS;\n const columns = treeColumns(table);\n const out = valueColumns(n);\n if (columns.length === 0) {\n return out.values;\n }\n for (let i = 0; i < n; i++) {\n budget.spend(target, columns.length);\n let real: Realizer | null = null;\n for (let c = 0; c < columns.length && real === null; c++) {\n real = realizerOf(plainCell(table.value(columns[c], i)), names);\n }\n if (real === null) {\n continue;\n }\n found = true;\n const at: SiteOf = (property) => ({ notes, target, property, element: i, budget });\n const put: PutValue = (property, value) => {\n out.put(i, property, value);\n };\n if (target === \"node\") {\n readNode(real, put, at);\n const geometry = treeChild(real.r, \"Geometry\");\n centers[2 * i] = Number(treeAttr(geometry, \"x\")) + Number(treeAttr(geometry, \"width\")) / 2;\n centers[2 * i + 1] = Number(treeAttr(geometry, \"y\")) + Number(treeAttr(geometry, \"height\")) / 2;\n } else {\n readEdge(real, put, at);\n put(\"bends\", edgeBends(real, centers, snapshot.edgeSource(i), snapshot.edgeTarget(i)));\n }\n }\n return out.values;\n };\n const node = read(\"node\");\n const edge = read(\"edge\");\n return found ? { node, edge } : null;\n}\n\n// ============================================================ writing\n\n/**\n * What the GraphML writer holds natively: yEd `y:ShapeNode` and `y:PolyLineEdge` graphics. The `graphty.styles`\n * block is a graph `<data>` under its own key, and the per-element values its rules read are keys of their own.\n * @category Built-in formats\n */\nexport const GRAPHML_STYLE_CAPABILITIES: StyleWriteCapabilities = Object.freeze({\n tool: \"yed\",\n node: Object.freeze([\n \"fill\",\n \"fillOpacity\",\n \"borderColor\",\n \"borderWidth\",\n \"borderStyle\",\n \"shape\",\n \"width\",\n \"height\",\n \"label\",\n \"labelColor\",\n \"labelSize\",\n \"labelFont\",\n \"labelWeight\",\n \"labelItalic\",\n \"labelPosition\",\n ] as const),\n edge: Object.freeze([\n \"color\",\n \"opacity\",\n \"width\",\n \"lineStyle\",\n \"sourceArrow\",\n \"targetArrow\",\n \"curved\",\n \"bends\",\n \"label\",\n \"labelColor\",\n \"labelSize\",\n \"labelFont\",\n \"labelWeight\",\n \"labelItalic\",\n ] as const),\n block: \"attributes\",\n});\n\n/** A written value and whether it is the exact value. */\ninterface Written {\n readonly value: string;\n readonly exact: boolean;\n}\n\n/** yEd's ShapeNode types, by the neutral shape each draws exactly. */\nexport const YED_SHAPES: ReadonlyMap<string, string> = new Map([\n [\"ellipse\", \"ellipse\"],\n [\"rectangle\", \"rectangle\"],\n [\"round-rectangle\", \"roundrectangle\"],\n [\"triangle\", \"triangle\"],\n [\"diamond\", \"diamond\"],\n [\"hexagon\", \"hexagon\"],\n [\"octagon\", \"octagon\"],\n [\"parallelogram\", \"parallelogram\"],\n [\"trapezoid\", \"trapezoid\"],\n [\"star\", \"star5\"],\n]);\n\n/** yEd's line types, by the neutral line style each draws exactly. */\nexport const YED_LINES: ReadonlyMap<string, string> = new Map([\n [\"solid\", \"line\"],\n [\"dashed\", \"dashed\"],\n [\"dotted\", \"dotted\"],\n [\"dash-dot\", \"dashed_dotted\"],\n]);\n\n/** yEd's arrows, by the neutral arrow each draws exactly. */\nexport const YED_ARROWS: ReadonlyMap<string, string> = new Map([\n [\"none\", \"none\"],\n [\"triangle\", \"standard\"],\n [\"triangle-open\", \"white_delta\"],\n [\"vee\", \"concave\"],\n [\"tee\", \"t_shape\"],\n [\"diamond\", \"diamond\"],\n [\"diamond-open\", \"white_diamond\"],\n [\"circle\", \"circle\"],\n [\"circle-open\", \"white_circle\"],\n [\"square\", \"skewed_dash\"],\n [\"crow\", \"crows_foot_many\"],\n]);\n\n/**\n * yEd's label model and position by neutral position: the inside ones in the internal model, the outside sides and\n * corners in the eight-position model.\n */\nconst YED_MODEL_POSITIONS: ReadonlyMap<string, readonly [string, string]> = new Map([\n [\"center\", [\"internal\", \"c\"]],\n [\"inside-top\", [\"internal\", \"t\"]],\n [\"top\", [\"eight_pos\", \"n\"]],\n [\"bottom\", [\"eight_pos\", \"s\"]],\n [\"left\", [\"eight_pos\", \"w\"]],\n [\"right\", [\"eight_pos\", \"e\"]],\n [\"top-left\", [\"eight_pos\", \"nw\"]],\n [\"top-right\", [\"eight_pos\", \"ne\"]],\n [\"bottom-left\", [\"eight_pos\", \"sw\"]],\n [\"bottom-right\", [\"eight_pos\", \"se\"]],\n]);\n\n/**\n * A value of a table, or the nearest value the table has.\n * @param table - neutral value to yEd value\n * @param value - the neutral value\n * @param nearest - the yEd value written when the table has none\n * @returns the written value\n */\nexport function yedValue(table: ReadonlyMap<string, string>, value: string, nearest: string): Written {\n const exact = table.get(value);\n if (exact !== undefined) {\n return { value: exact, exact: true };\n }\n // a value the reader kept as other:<raw> goes back as written\n return value.startsWith(\"other:\") ? { value: value.slice(6), exact: true } : { value: nearest, exact: false };\n}\n\n/**\n * A color with an alpha from an opacity, as yEd writes it: `#RRGGBB`, or `#RRGGBBAA` with the alpha last.\n * @param color - the canonical color\n * @param opacity - the opacity, or null\n * @returns the text\n */\nexport function yedColor(color: string, opacity: StyleValue | null): string {\n const hex = color.toUpperCase();\n if (typeof opacity !== \"number\" || opacity >= 1) {\n return hex;\n }\n return (\n hex +\n Math.round(Math.max(0, opacity) * 255)\n .toString(16)\n .toUpperCase()\n .padStart(2, \"0\")\n );\n}\n\n/** Records a value written as the nearest one yEd has. */\ntype Approximate = (property: string, value: StyleValue) => void;\n\n/**\n * A value in yEd's spelling, recorded as approximated when yEd has no exact one.\n * @param table - yEd's spellings\n * @param value - the neutral value\n * @param nearest - the spelling written when there is no exact one\n * @param property - the property, for the approximation note\n * @param approximate - records approximations\n * @returns the spelling\n */\nexport function yedSpelled(\n table: ReadonlyMap<string, string>,\n value: string,\n nearest: string,\n property: string,\n approximate: Approximate,\n): string {\n const w = yedValue(table, value, nearest);\n if (!w.exact) {\n approximate(property, value);\n }\n return w.value;\n}\n\n/** One element's value of a property. */\ntype GetValue = (property: string) => StyleValue | null;\n\n/**\n * The label attributes and text of one element.\n * @param get - the element's values\n * @param node - whether it is a node label (which has a position)\n * @param approximate - records approximations\n * @returns the label element, or null when the element has no label text\n */\nfunction labelTree(get: GetValue, node: boolean, approximate: Approximate): Tree | null {\n const text = get(\"label\");\n if (typeof text !== \"string\" || text.trim().length === 0) {\n return null;\n }\n const label: Tree = {};\n const font = get(\"labelFont\");\n if (typeof font === \"string\") {\n label[\"@_fontFamily\"] = font;\n }\n const size = get(\"labelSize\");\n if (typeof size === \"number\") {\n label[\"@_fontSize\"] = String(size);\n }\n const weight = get(\"labelWeight\");\n const italic = get(\"labelItalic\");\n if (weight !== null || italic !== null) {\n const style = (weight === \"bold\" ? \"bold\" : \"\") + (italic === true ? \"italic\" : \"\");\n label[\"@_fontStyle\"] = style.length === 0 ? \"plain\" : style;\n }\n const color = get(\"labelColor\");\n if (typeof color === \"string\") {\n label[\"@_textColor\"] = color.toUpperCase();\n }\n const position = node ? get(\"labelPosition\") : null;\n if (typeof position === \"string\") {\n const written = YED_MODEL_POSITIONS.get(position);\n if (written === undefined) {\n approximate(\"labelPosition\", position);\n }\n label[\"@_modelName\"] = written?.[0] ?? \"internal\";\n label[\"@_modelPosition\"] = written?.[1] ?? \"c\";\n }\n label[\"#text\"] = text;\n return label;\n}\n\n/**\n * A node's `y:ShapeNode` from its values.\n * @param get - the node's values\n * @param at - the node's position from the graphics it had, or null\n * @param approximate - records approximations\n * @returns the graphics tree\n */\nfunction shapeNodeTree(get: GetValue, at: readonly [string, string] | null, approximate: Approximate): Tree {\n const node: Tree = {};\n node[\"y:Geometry\"] = geometryTree(get, at);\n const fill = get(\"fill\");\n const fillOpacity = get(\"fillOpacity\");\n if (typeof fill === \"string\") {\n node[\"y:Fill\"] = { \"@_color\": yedColor(fill, fillOpacity), \"@_transparent\": \"false\" };\n } else if (fillOpacity === 0) {\n node[\"y:Fill\"] = { \"@_hasColor\": \"false\", \"@_transparent\": \"false\" };\n }\n const border = lineTree(get, [\"borderColor\", \"borderWidth\", \"borderStyle\"], approximate);\n if (border !== null) {\n node[\"y:BorderStyle\"] = border;\n }\n const label = labelTree(get, true, approximate);\n if (label !== null) {\n node[\"y:NodeLabel\"] = label;\n }\n const shape = get(\"shape\");\n if (typeof shape === \"string\") {\n node[\"y:Shape\"] = {\n \"@_type\": yedSpelled(YED_SHAPES, shape, shape === \"vee\" ? \"triangle\" : \"rectangle\", \"shape\", approximate),\n };\n }\n return { \"y:ShapeNode\": node };\n}\n\n/**\n * A node's `y:Geometry`: its size, and its position from the graphics it had.\n * @param get - the node's values\n * @param at - the node's position, or null\n * @returns the geometry\n */\nfunction geometryTree(get: GetValue, at: readonly [string, string] | null): Tree {\n const geometry: Tree = {};\n const height = get(\"height\");\n const width = get(\"width\");\n if (typeof height === \"number\") {\n geometry[\"@_height\"] = String(height);\n }\n if (typeof width === \"number\") {\n geometry[\"@_width\"] = String(width);\n }\n if (at !== null) {\n geometry[\"@_x\"] = at[0];\n geometry[\"@_y\"] = at[1];\n }\n return geometry;\n}\n\n/**\n * A `y:BorderStyle` or `y:LineStyle`: a color, a width and a line type. A node's border color is written opaque; an\n * edge's color carries its opacity.\n * @param get - the element's values\n * @param properties - the color, width and style properties\n * @param approximate - records approximations\n * @param opacity - the opacity of the color, for an edge's line\n * @returns the element, or null when none of the three is set\n */\nfunction lineTree(\n get: GetValue,\n properties: readonly [string, string, string],\n approximate: Approximate,\n opacity?: StyleValue | null,\n): Tree | null {\n const [colorKey, widthKey, styleKey] = properties;\n const color = get(colorKey);\n const width = get(widthKey);\n const style = get(styleKey);\n if (color === null && width === null && style === null) {\n return null;\n }\n const line: Tree = {};\n if (typeof color === \"string\") {\n line[\"@_color\"] = opacity === undefined ? color.toUpperCase() : yedColor(color, opacity);\n }\n if (typeof style === \"string\") {\n const nearest = styleKey === \"lineStyle\" && style === \"long-dash\" ? \"dashed\" : \"line\";\n line[\"@_type\"] = yedSpelled(YED_LINES, style, nearest, styleKey, approximate);\n }\n if (typeof width === \"number\") {\n line[\"@_width\"] = String(width);\n }\n return line;\n}\n\n/**\n * An edge's `y:PolyLineEdge` from its values.\n * @param get - the edge's values\n * @param path - the `y:Path` of the graphics it had, or undefined\n * @param approximate - records approximations\n * @returns the graphics tree\n */\nfunction polyLineEdgeTree(get: GetValue, path: unknown, approximate: Approximate): Tree {\n const edge: Tree = {};\n if (path !== undefined) {\n edge[\"y:Path\"] = path;\n }\n const line = lineTree(get, [\"color\", \"width\", \"lineStyle\"], approximate, get(\"opacity\"));\n if (line !== null) {\n edge[\"y:LineStyle\"] = line;\n }\n const source = get(\"sourceArrow\");\n const target = get(\"targetArrow\");\n if (source !== null || target !== null) {\n const arrow = (property: string, value: StyleValue | null): string =>\n typeof value === \"string\" ? yedSpelled(YED_ARROWS, value, \"standard\", property, approximate) : \"none\";\n edge[\"y:Arrows\"] = { \"@_source\": arrow(\"sourceArrow\", source), \"@_target\": arrow(\"targetArrow\", target) };\n }\n const label = labelTree(get, false, approximate);\n if (label !== null) {\n edge[\"y:EdgeLabel\"] = label;\n }\n const curved = get(\"curved\");\n if (typeof curved === \"boolean\") {\n edge[\"y:BendStyle\"] = { \"@_smoothed\": String(curved) };\n }\n return { \"y:PolyLineEdge\": edge };\n}\n\n/**\n * Each element's values of the properties the writer writes, as a getter per element.\n * @param picture - each element's value of a property\n * @param target - nodes or edges\n * @returns the getter\n */\nfunction getter(\n picture: (target: StyleTarget, property: string) => readonly (StyleValue | null)[],\n target: StyleTarget,\n): (i: number) => GetValue {\n const columns = new Map<string, readonly (StyleValue | null)[]>();\n for (const p of GRAPHML_STYLE_CAPABILITIES[target]) {\n columns.set(p, picture(target, p));\n }\n return (i) => (property) => columns.get(property)?.[i] ?? null;\n}\n\n/**\n * For a file graphty wrote: where a value read from the yEd graphics is what the writer writes for the block's own\n * value (a pentagon written as a hexagon, an opacity rounded to yEd's 255 steps), the block's exact value is the\n * truth, so a re-import gives back the same rules; a value another program changed since stays the truth.\n * @param read - the values the reader read, changed in place\n * @param picture - each element's value of a property under the block's rules\n * @param counts - the node and edge counts\n * @param counts.node - the node count\n * @param counts.edge - the edge count\n * @param notes - a scratch note list for reading back what the writer writes\n */\nexport function exactFromBlock(\n read: YedRead,\n picture: (target: StyleTarget, property: string) => readonly (StyleValue | null)[],\n counts: { readonly node: number; readonly edge: number },\n notes: StyleNotes,\n): void {\n for (const target of [\"node\", \"edge\"] as const) {\n const values = read[target];\n const get = getter(picture, target);\n for (let i = 0; i < counts[target]; i++) {\n const want = get(i);\n const back = writtenAndReadBack(target, want, notes);\n if (back === null) {\n continue;\n }\n for (const property of GRAPHML_STYLE_CAPABILITIES[target]) {\n const native = values[property]?.[i] ?? null;\n const w = want(property);\n if (native !== w && native === (back.get(property) ?? null)) {\n values[property] ??= new Array<StyleValue | null>(counts[target]).fill(null);\n values[property][i] = w;\n }\n }\n }\n }\n}\n\n/**\n * An element's values written as the writer writes them and read back as the reader reads them.\n * @param target - nodes or edges\n * @param want - its values\n * @param notes - a scratch for the notes the round trip makes\n * @returns the values read back, by property, or null when the written graphics hold no realizer\n */\nfunction writtenAndReadBack(target: StyleTarget, want: GetValue, notes: StyleNotes): Map<string, StyleValue> | null {\n const ignore: Approximate = () => undefined;\n const tree = target === \"node\" ? shapeNodeTree(want, null, ignore) : polyLineEdgeTree(want, undefined, ignore);\n const real = realizerOf(tree, target === \"node\" ? NODE_REALIZERS : EDGE_REALIZERS);\n if (real === null) {\n return null;\n }\n const back = new Map<string, StyleValue>();\n const at: SiteOf = (property) => ({ notes, target, property });\n const put: PutValue = (property, value) => {\n if (value !== null) {\n back.set(property, value);\n }\n };\n if (target === \"node\") {\n readNode(real, put, at);\n } else {\n readEdge(real, put, at);\n }\n return back;\n}\n\n/** A GraphML export with styles worked out. */\ninterface GraphmlStyledExport {\n /** The graph to write: the yFiles drawing columns replaced by yEd graphics written from the styles. */\n readonly snapshot: GraphSnapshot;\n /** W_STYLE_APPROXIMATED for every value written as the nearest one yEd has. */\n readonly notes: readonly LossNote[];\n}\n\n/** The yFiles key type of the written node and edge graphics. */\nconst GRAPHICS_TYPES: Readonly<Record<StyleTarget, string>> = { node: \"nodegraphics\", edge: \"edgegraphics\" };\n\n/**\n * A node's position from the graphics it had: a yEd realizer's `y:Geometry` x and y, or a yFiles 3 `y:RectD`'s.\n * @param table - the node table\n * @param columns - its tree columns\n * @param i - the node\n * @returns the x and y as written, or null\n */\nfunction keptPosition(table: GraphSnapshot[\"nodes\"], columns: readonly string[], i: number): [string, string] | null {\n for (const name of columns) {\n const tree = plainCell(table.value(name, i));\n const real = realizerOf(tree, NODE_REALIZERS);\n const geometry = real === null ? treeChild(tree, \"RectD\") : treeChild(real.r, \"Geometry\");\n const x = treeAttr(geometry, real === null ? \"X\" : \"x\");\n const y = treeAttr(geometry, real === null ? \"Y\" : \"y\");\n if (x !== undefined && y !== undefined) {\n return [x, y];\n }\n }\n return null;\n}\n\n/**\n * A node's `y:Geometry` x and y from the graph's position column, for a node with no yEd graphics of its own: the\n * column's coordinate read in its declared spelling (center, y up when it declares none), written as yEd places a\n * box, by its top-left corner with y growing downward.\n * @param snapshot - the graph\n * @param i - the node\n * @param get - the node's values (its drawn width and height)\n * @returns the x and y to write, or null when the node has no finite position\n */\nfunction columnPosition(snapshot: GraphSnapshot, i: number, get: GetValue): [string, string] | null {\n const column = snapshot.nodes.byRole(\"position\");\n if (column === null || column.meta.components < 2 || !column.isSet(i)) {\n return null;\n }\n const v = column.value(i) as ArrayLike<number>;\n const width = get(\"width\");\n const height = get(\"height\");\n const size: [number, number] = [typeof width === \"number\" ? width : 0, typeof height === \"number\" ? height : 0];\n const p: [number, number, number] = [v[0], v[1], 0];\n toNeutral(p, column.meta.extra ?? {}, size, false);\n const [x, y] = toFilePositions(Float64Array.from(p), YED_SPELLING, {\n width: Float64Array.of(size[0]),\n height: Float64Array.of(size[1]),\n });\n return Number.isFinite(x) && Number.isFinite(y) ? [String(x), String(y)] : null;\n}\n\n/** How yEd spells a node's place: its box's top-left corner, y growing downward. */\nconst YED_SPELLING: PositionColumnExtra = { yAxis: \"down\", anchor: \"top-left\" };\n\n/**\n * An edge's `y:Path` (its bends) from the yEd graphics it had.\n * @param table - the edge table\n * @param columns - its tree columns\n * @param e - the edge\n * @returns the path, or undefined\n */\nfunction keptPath(table: GraphSnapshot[\"edges\"], columns: readonly string[], e: number): unknown {\n for (const name of columns) {\n const real = realizerOf(plainCell(table.value(name, e)), EDGE_REALIZERS);\n const path = real === null ? undefined : treeChild(real.r, \"Path\");\n if (path !== undefined) {\n return path;\n }\n }\n return undefined;\n}\n\n/**\n * An edge's `y:Path` with its points placed from its `bends` value between the written node centers, so the bends\n * read back as written; the ports of the path it had are kept. Without a value, or without both centers, the path it\n * had.\n * @param kept - the path from the graphics the edge had, or undefined\n * @param bends - the edge's `bends` value\n * @param ends - the written centers of its source and target\n * @returns the path, or undefined\n */\nfunction pathWithBends(kept: unknown, bends: StyleValue | null, ends: readonly [BendPoint, BendPoint]): unknown {\n const points = typeof bends === \"string\" ? bendsToPoints(ends[0], ends[1], bends, true) : null;\n if (points === null) {\n return kept;\n }\n const path: Tree = {};\n for (const port of [\"sx\", \"sy\", \"tx\", \"ty\"]) {\n path[`@_${port}`] = treeAttr(kept, port) ?? \"0.0\";\n }\n path[\"y:Point\"] = points.map(([x, y]) => ({ \"@_x\": String(x), \"@_y\": String(y) }));\n return path;\n}\n\n/**\n * A column name not yet taken in a table.\n * @param table - the table\n * @param base - the preferred name\n * @returns the name\n */\nfunction freeName(table: GraphSnapshot[\"nodes\"], base: string): string {\n let name = base;\n let k = 2;\n while (table.has(name)) {\n name = `${base}#${String(k)}`;\n k++;\n }\n return name;\n}\n\n/**\n * Works out a GraphML export with styles: every node and edge column made from yFiles keys (the graphics trees,\n * the typed `yfiles.*` columns and yFiles 3's drawing state) is replaced by yEd graphics written from what graphty\n * draws, keeping each node's position and each edge's bends from the graphics it had; graph data from yFiles 3\n * keys goes too, since its `y:` elements are not yEd's.\n * @param snapshot - the graph handed to the exporter\n * @param input - the styles, or undefined when none are written\n * @returns the styled export, or null without styles\n */\nexport function graphmlStyledExport(\n snapshot: GraphSnapshot,\n input: ExporterStyleInput | undefined,\n): GraphmlStyledExport | null {\n if (input === undefined) {\n return null;\n }\n const approximated = new StyleApproximations();\n const approximateFor =\n (target: StyleTarget): Approximate =>\n (property, value) => {\n approximated.add(target, property, value);\n };\n const picture = (target: StyleTarget, property: string): readonly (StyleValue | null)[] =>\n input.picture(target, property as never);\n const nodeColumns = treeColumns(snapshot.nodes);\n const edgeColumns = treeColumns(snapshot.edges);\n const getNode = getter(picture, \"node\");\n const getEdge = getter(picture, \"edge\");\n const nodeTrees: (Tree | null)[] = [];\n for (let i = 0; i < snapshot.nodeCount; i++) {\n const get = getNode(i);\n const at = keptPosition(snapshot.nodes, nodeColumns, i) ?? columnPosition(snapshot, i, get);\n nodeTrees.push(shapeNodeTree(get, at, approximateFor(\"node\")));\n }\n const centers = nodeTrees.map((tree): BendPoint => {\n const geometry = treeChild(treeChild(tree, \"ShapeNode\"), \"Geometry\");\n const at = (k: string): number => Number(treeAttr(geometry, k) ?? Number.NaN);\n return [at(\"x\") + at(\"width\") / 2, at(\"y\") + at(\"height\") / 2];\n });\n const edgeTrees: (Tree | null)[] = [];\n for (let e = 0; e < snapshot.edgeCount; e++) {\n const get = getEdge(e);\n const ends: readonly [BendPoint, BendPoint] = [\n centers[snapshot.edgeSource(e)],\n centers[snapshot.edgeTarget(e)],\n ];\n const path = pathWithBends(keptPath(snapshot.edges, edgeColumns, e), get(\"bends\"), ends);\n edgeTrees.push(polyLineEdgeTree(get, path, approximateFor(\"edge\")));\n }\n const out = snapshot.withColumns();\n for (const [table, trees, target] of [\n [out.nodes, nodeTrees, \"node\"],\n [out.edges, edgeTrees, \"edge\"],\n ] as const) {\n for (const name of yfilesColumns(table)) {\n table.remove(name);\n }\n const name = freeName(table, GRAPHICS_TYPES[target]);\n table.set(name, trees, {\n dtype: \"json\",\n nullable: true,\n origin: { format: \"graphml\", id: null, title: null, type: GRAPHICS_TYPES[target], namespace: \"yfiles\" },\n });\n }\n const yfiles3 = [...out.graph].filter(\n (col) => col.meta.origin?.namespace === \"yfiles\" && (col.meta.origin.type ?? \"\").includes(\"://\"),\n );\n for (const col of yfiles3) {\n out.graph.remove(col.meta.name);\n }\n return { snapshot: out, notes: approximated.notes(\"yEd\") };\n}\n"],"names":["name"],"mappings":"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"}
|