@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
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pajek's Draw window and export options: what Pajek keeps in its ini file and its Draw menu, not in the network file,
|
|
3
|
+
* and how each one changes the drawing. Every rule here was measured on Pajek 6.02's own SVG export of the Pajek
|
|
4
|
+
* specimen pages (`graph-io/test/fidelity/specimens/pajek/pages.json`, one option per page).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { GraphFormatError, type GraphSnapshot } from "@graphty/graph-format";
|
|
8
|
+
|
|
9
|
+
import type { StyleValue } from "../../styles/types.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* How a Pajek network is drawn, which Pajek keeps in its ini file and its Draw menu rather than in the file: the size
|
|
13
|
+
* of the Draw window, the partition and vectors Draw > Network + Partition (+ Vector) uses, and the window's options.
|
|
14
|
+
* @category Built-in formats
|
|
15
|
+
*/
|
|
16
|
+
export interface PajekDrawOptions {
|
|
17
|
+
/**
|
|
18
|
+
* The Draw window's width in px. Pajek stretches the file's x from 0..1 across it, while vertex sizes, line
|
|
19
|
+
* widths and fonts stay fixed px.
|
|
20
|
+
* @defaultValue 500, the square Pajek's EPS export maps 0..1 to
|
|
21
|
+
*/
|
|
22
|
+
readonly width?: number | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* The Draw window's height in px; the file's y from 0..1 is stretched down it.
|
|
25
|
+
* @defaultValue 500
|
|
26
|
+
*/
|
|
27
|
+
readonly height?: number | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Draw > Network + Partition: which `*Partition` of a project file colors the vertices, 1 for its first. Each
|
|
30
|
+
* vertex is filled with the partition color of its cluster (cluster 0 Cyan, 1 Yellow, 2 LimeGreen, 3 Red, ...).
|
|
31
|
+
* Absent or 0 draws the vertices' own colors.
|
|
32
|
+
*/
|
|
33
|
+
readonly partition?: number | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Draw > Network + Vector: which `*Vector` of a project file sizes the vertices, 1 for its first. A vertex is drawn
|
|
36
|
+
* the square root of its value times its own size (0 draws it at no size, a negative value at its own size).
|
|
37
|
+
*/
|
|
38
|
+
readonly vector?: number | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Draw > Network + First Vector + Second Vector: which `*Vector` sets the vertices' heights while `vector` sets
|
|
41
|
+
* their widths, each value then a plain factor of the vertex's own width or height.
|
|
42
|
+
*/
|
|
43
|
+
readonly vector2?: number | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Options of Pajek's ini file by the names its SAVEINI writes; a flag is on when given as "", true, or a value
|
|
46
|
+
* other than "0" or false. Read: `Form8.MarkVerticesUsing` (1 labels, 2 vertex numbers, 3 no labels, 4 no labels
|
|
47
|
+
* and no arrows), `Form8.SizeofVertices` (8), `TransparencyofVertices` and `TransparencyofLines` (the SVG
|
|
48
|
+
* export's opacities, 0 to 1), `Form10.StraightLinesOnly1` (every line straight) and `Form10.ColorGradientLines`
|
|
49
|
+
* (each line a gradient of its end vertices' colors), `Form8.withLabels1` (the lines' labels drawn; without it
|
|
50
|
+
* none is) and `Form10.effect3d` (each vertex filled with a gradient down to half its color). Any other option is
|
|
51
|
+
* ignored.
|
|
52
|
+
*/
|
|
53
|
+
readonly ini?: Readonly<Record<string, string | number | boolean>> | undefined;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** The Draw window's size in px. */
|
|
57
|
+
export interface DrawWindow {
|
|
58
|
+
readonly width: number;
|
|
59
|
+
readonly height: number;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** The `pajekDraw` option, checked: every field present, each ini value as text. */
|
|
63
|
+
export interface PajekDraw extends DrawWindow {
|
|
64
|
+
readonly partition: number;
|
|
65
|
+
readonly vector: number;
|
|
66
|
+
readonly vector2: number;
|
|
67
|
+
readonly ini: ReadonlyMap<string, string>;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** The square Pajek's EPS export maps the file's 0..1 coordinates to, and the Draw window's size by default. */
|
|
71
|
+
const PAJEK_WINDOW = 500;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* The `pajekDraw` import option, checked.
|
|
75
|
+
* @param option - the option as given
|
|
76
|
+
* @returns the draw settings, or null when none are given
|
|
77
|
+
*/
|
|
78
|
+
export function resolvePajekDraw(option: unknown): PajekDraw | null {
|
|
79
|
+
if (option === undefined) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const bad = (found: unknown): never => {
|
|
83
|
+
throw new GraphFormatError("E_UNSUPPORTED", "option pajekDraw: not an object of Pajek draw settings", {
|
|
84
|
+
option: "pajekDraw",
|
|
85
|
+
found,
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
if (typeof option !== "object" || option === null || Array.isArray(option)) {
|
|
89
|
+
return bad(option);
|
|
90
|
+
}
|
|
91
|
+
const o = option as PajekDrawOptions;
|
|
92
|
+
const num = (v: unknown, fallback: number, positive: boolean): number => {
|
|
93
|
+
if (v === undefined) {
|
|
94
|
+
return fallback;
|
|
95
|
+
}
|
|
96
|
+
if (typeof v !== "number" || !Number.isFinite(v)) {
|
|
97
|
+
return bad(v);
|
|
98
|
+
}
|
|
99
|
+
const inRange = positive ? v > 0 : v >= 0;
|
|
100
|
+
return inRange ? v : bad(v);
|
|
101
|
+
};
|
|
102
|
+
const ini = new Map<string, string>();
|
|
103
|
+
for (const [name, value] of Object.entries(o.ini ?? {})) {
|
|
104
|
+
if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
|
|
105
|
+
return bad(value);
|
|
106
|
+
}
|
|
107
|
+
ini.set(name, String(value));
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
width: num(o.width, PAJEK_WINDOW, true),
|
|
111
|
+
height: num(o.height, PAJEK_WINDOW, true),
|
|
112
|
+
partition: num(o.partition, 0, false),
|
|
113
|
+
vector: num(o.vector, 0, false),
|
|
114
|
+
vector2: num(o.vector2, 0, false),
|
|
115
|
+
ini,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Whether an ini flag is on.
|
|
121
|
+
* @param draw - the settings
|
|
122
|
+
* @param name - the option
|
|
123
|
+
* @returns true when given as "", "true" or any value but "0" and "false"
|
|
124
|
+
*/
|
|
125
|
+
function flag(draw: PajekDraw, name: string): boolean {
|
|
126
|
+
const v = draw.ini.get(name);
|
|
127
|
+
return v !== undefined && v !== "0" && v !== "false";
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Whether Pajek draws the lines' labels: only under Options / Lines / Mark Lines / with Labels (`Form8.withLabels1`);
|
|
132
|
+
* its default, Mark Lines / No, draws none (`pajek-specimen-edge-labels` against `-p2`, `pajek-synth-lines`: 28 `l`
|
|
133
|
+
* labels, none drawn).
|
|
134
|
+
* @param draw - the settings, or null when the import names none (Pajek's defaults)
|
|
135
|
+
* @returns true when the line labels are drawn
|
|
136
|
+
*/
|
|
137
|
+
export function drawsLineLabels(draw: PajekDraw | null): boolean {
|
|
138
|
+
return draw !== null && flag(draw, "Form8.withLabels1");
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Whether Pajek draws the arcs it would bow apart (a mutual pair, parallel arcs) straight: under Export Line Default /
|
|
143
|
+
* Straight Lines (`Form10.StraightLinesOnly1`, `pajek-specimen-edges-lines-p4` against `-p2`). A line's own Bezier
|
|
144
|
+
* route stays curved.
|
|
145
|
+
* @param draw - the settings, or null when the import names none (Pajek's defaults)
|
|
146
|
+
* @returns true when they are drawn straight
|
|
147
|
+
*/
|
|
148
|
+
export function drawsStraightLines(draw: PajekDraw | null): boolean {
|
|
149
|
+
return draw !== null && flag(draw, "Form10.StraightLinesOnly1");
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* An ini number.
|
|
154
|
+
* @param draw - the settings
|
|
155
|
+
* @param name - the option
|
|
156
|
+
* @returns the number, or null when not given or not a number
|
|
157
|
+
*/
|
|
158
|
+
function iniNumber(draw: PajekDraw, name: string): number | null {
|
|
159
|
+
const v = draw.ini.get(name);
|
|
160
|
+
const n = v === undefined || v.trim() === "" ? Number.NaN : Number(v);
|
|
161
|
+
return Number.isFinite(n) ? n : null;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Pajek's 40 partition colors, cluster k drawn in entry k modulo 40 (a negative cluster as its absolute value): the
|
|
166
|
+
* fills Pajek 6.02's SVG export draws for clusters 0 to 39 (`pajek-specimen-mappings-bypass.svg`, `part-*`; the
|
|
167
|
+
* manual's Figure 20 names them Cyan, Yellow, LimeGreen, Red, Blue, ...).
|
|
168
|
+
*/
|
|
169
|
+
const PARTITION_COLORS: readonly string[] = [
|
|
170
|
+
"#00ffff",
|
|
171
|
+
"#ffff00",
|
|
172
|
+
"#7fff00",
|
|
173
|
+
"#ff0000",
|
|
174
|
+
"#0000ff",
|
|
175
|
+
"#ffd8f2",
|
|
176
|
+
"#ffffff",
|
|
177
|
+
"#ff6321",
|
|
178
|
+
"#8c23ff",
|
|
179
|
+
"#606dc4",
|
|
180
|
+
"#1ef9a3",
|
|
181
|
+
"#009900",
|
|
182
|
+
"#7f7f7f",
|
|
183
|
+
"#000000",
|
|
184
|
+
"#ad0000",
|
|
185
|
+
"#ccffb2",
|
|
186
|
+
"#ffff99",
|
|
187
|
+
"#ff00ff",
|
|
188
|
+
"#007091",
|
|
189
|
+
"#ffb528",
|
|
190
|
+
"#ff0a9b",
|
|
191
|
+
"#00e000",
|
|
192
|
+
"#ff779e",
|
|
193
|
+
"#d8f2ff",
|
|
194
|
+
"#d8ff4f",
|
|
195
|
+
"#ff84ff",
|
|
196
|
+
"#e5ffcc",
|
|
197
|
+
"#ccccff",
|
|
198
|
+
"#59ddff",
|
|
199
|
+
"#ffd9bc",
|
|
200
|
+
"#db9370",
|
|
201
|
+
"#ccffff",
|
|
202
|
+
"#d8d8d8",
|
|
203
|
+
"#666666",
|
|
204
|
+
"#a5a5a5",
|
|
205
|
+
"#3f3f3f",
|
|
206
|
+
"#e5e5e5",
|
|
207
|
+
"#262626",
|
|
208
|
+
"#bfbfbf",
|
|
209
|
+
"#595959",
|
|
210
|
+
];
|
|
211
|
+
|
|
212
|
+
/** Pajek's vertex size (`styles.ts`) and its fill where a vertex sets none. */
|
|
213
|
+
const VERTEX_SIZE = 20;
|
|
214
|
+
const VERTEX_FILL = "#ffd9bc";
|
|
215
|
+
|
|
216
|
+
/** The Draw window's default `Form8.SizeofVertices`. */
|
|
217
|
+
const SIZE_OF_VERTICES = 8;
|
|
218
|
+
|
|
219
|
+
/** Per-element values by property, as the style reader builds them. */
|
|
220
|
+
type Values = Record<string, (StyleValue | null)[]>;
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* The node column a project file's n-th object of a kind went to (`meta.extra.pajek.objects`).
|
|
224
|
+
* @param snapshot - the graph
|
|
225
|
+
* @param kind - "partition" or "vector"
|
|
226
|
+
* @param n - 1 for the first
|
|
227
|
+
* @returns the column's values, or null
|
|
228
|
+
*/
|
|
229
|
+
function objectValues(snapshot: GraphSnapshot, kind: string, n: number): ((i: number) => number | null) | null {
|
|
230
|
+
if (n < 1) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
const pajek = snapshot.meta.extra.pajek as { objects?: { kind: string; column: string }[] } | undefined;
|
|
234
|
+
const name = pajek?.objects?.filter((o) => o.kind === kind)[n - 1]?.column;
|
|
235
|
+
if (name === undefined || !snapshot.nodes.has(name)) {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
return (i) => {
|
|
239
|
+
const v = snapshot.nodes.value(name, i);
|
|
240
|
+
return typeof v === "number" && Number.isFinite(v) ? v : null;
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* One property's column, made when first written.
|
|
246
|
+
* @param values - the values
|
|
247
|
+
* @param property - the property
|
|
248
|
+
* @param n - the element count
|
|
249
|
+
* @returns the column
|
|
250
|
+
*/
|
|
251
|
+
function column(values: Values, property: string, n: number): (StyleValue | null)[] {
|
|
252
|
+
values[property] ??= new Array<StyleValue | null>(n).fill(null);
|
|
253
|
+
return values[property];
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Draws the vertices under the Draw window's options and Draw > Network + Partition (+ Vector), in place.
|
|
258
|
+
* @param draw - the settings
|
|
259
|
+
* @param snapshot - the graph
|
|
260
|
+
* @param node - the vertices' values, as the file sets them
|
|
261
|
+
*/
|
|
262
|
+
export function drawVertices(draw: PajekDraw, snapshot: GraphSnapshot, node: Values): void {
|
|
263
|
+
const n = snapshot.nodeCount;
|
|
264
|
+
const width = column(node, "width", n);
|
|
265
|
+
const height = column(node, "height", n);
|
|
266
|
+
scaleVertexSizes(draw, width, height);
|
|
267
|
+
sizeByVectors(draw, snapshot, width, height);
|
|
268
|
+
colorByPartition(draw, snapshot, node);
|
|
269
|
+
// SVG Opacity of Vertices: Pajek writes it as the vertex's opacity and its stroke-opacity both, so the fill is
|
|
270
|
+
// drawn at it and the border at its square (`pajek-specimen-node-sizes-opacity-p3`: 0.5 fills at 0.5, strokes at
|
|
271
|
+
// 0.25); the label is drawn opaque
|
|
272
|
+
const opacity = iniNumber(draw, "TransparencyofVertices");
|
|
273
|
+
if (opacity !== null && opacity < 1) {
|
|
274
|
+
const o = Math.max(0, opacity);
|
|
275
|
+
const fill = column(node, "fillOpacity", n);
|
|
276
|
+
fill.forEach((v, i) => {
|
|
277
|
+
fill[i] = (typeof v === "number" ? v : 1) * o;
|
|
278
|
+
});
|
|
279
|
+
column(node, "borderOpacity", n).fill(o * o);
|
|
280
|
+
}
|
|
281
|
+
if (flag(draw, "Form10.effect3d")) {
|
|
282
|
+
effect3d(snapshot, node);
|
|
283
|
+
}
|
|
284
|
+
markVertices(draw, node, n);
|
|
285
|
+
for (const property of ["width", "height"]) {
|
|
286
|
+
if (node[property].every((v) => v === null)) {
|
|
287
|
+
Reflect.deleteProperty(node, property);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Options / Size / of Vertices s scales each axis by f = s / 8: an axis the file sizes (x_fact, y_fact) by f, and
|
|
294
|
+
* an axis it does not by f squared, each on its own (`pajek-specimen-node-sizes-opacity-p2` at 16; probed at 4, 16
|
|
295
|
+
* and 24: `x_fact 1.8 y_fact 1.8` 18, 72, 108 across; no parameters 5, 80, 180; `x_fact 2` alone 20 x 5, 80 x 80,
|
|
296
|
+
* 120 x 180).
|
|
297
|
+
* @param draw - the settings
|
|
298
|
+
* @param width - the vertices' widths, changed in place
|
|
299
|
+
* @param height - the vertices' heights, changed in place
|
|
300
|
+
*/
|
|
301
|
+
function scaleVertexSizes(draw: PajekDraw, width: (StyleValue | null)[], height: (StyleValue | null)[]): void {
|
|
302
|
+
const size = iniNumber(draw, "Form8.SizeofVertices");
|
|
303
|
+
if (size === null || size === SIZE_OF_VERTICES) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
const f = size / SIZE_OF_VERTICES;
|
|
307
|
+
const scaled = (v: StyleValue | null): number => (typeof v === "number" ? v * f : VERTEX_SIZE * f * f);
|
|
308
|
+
for (let i = 0; i < width.length; i++) {
|
|
309
|
+
width[i] = scaled(width[i]);
|
|
310
|
+
height[i] = scaled(height[i]);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Draw > Network + Partition: fills each vertex in its class's color.
|
|
316
|
+
* @param draw - the settings
|
|
317
|
+
* @param snapshot - the graph
|
|
318
|
+
* @param node - the vertices' values, changed in place
|
|
319
|
+
*/
|
|
320
|
+
function colorByPartition(draw: PajekDraw, snapshot: GraphSnapshot, node: Values): void {
|
|
321
|
+
const partition = objectValues(snapshot, "partition", draw.partition);
|
|
322
|
+
if (partition === null) {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
const fill = column(node, "fill", snapshot.nodeCount);
|
|
326
|
+
for (let i = 0; i < snapshot.nodeCount; i++) {
|
|
327
|
+
const k = partition(i);
|
|
328
|
+
if (k !== null) {
|
|
329
|
+
fill[i] = PARTITION_COLORS[Math.abs(k) % PARTITION_COLORS.length];
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Options / Mark Vertices Using: 2 labels each vertex with its number, 3 and 4 with nothing.
|
|
336
|
+
* @param draw - the settings
|
|
337
|
+
* @param node - the vertices' values, changed in place
|
|
338
|
+
* @param n - the vertex count
|
|
339
|
+
*/
|
|
340
|
+
function markVertices(draw: PajekDraw, node: Values, n: number): void {
|
|
341
|
+
const mark = iniNumber(draw, "Form8.MarkVerticesUsing");
|
|
342
|
+
if (mark === 2) {
|
|
343
|
+
// ponytail: a vertex's number is its place in the file, as in every file Pajek writes
|
|
344
|
+
column(node, "label", n).forEach((_, i, a) => {
|
|
345
|
+
a[i] = String(i + 1);
|
|
346
|
+
});
|
|
347
|
+
} else if (mark === 3 || mark === 4) {
|
|
348
|
+
column(node, "label", n).fill("");
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* SVG Vertices 3D Effect (`Form10.effect3d`): Pajek 6.02's SVG export fills each vertex with a linear gradient from
|
|
354
|
+
* its color at the top to half of it at the bottom (`pajek-specimen-node-shapes-p2`: `#ffd9bc` to rgb(128,108,94),
|
|
355
|
+
* `#c8c8c8` to rgb(100,100,100); each channel halved and rounded half to even, as Delphi's Round does). The gradient
|
|
356
|
+
* turns with the vertex: `phi 90` runs it from left to right (`phi-90-box`, `phi-90-triangle`).
|
|
357
|
+
* @param snapshot - the graph
|
|
358
|
+
* @param node - the vertices' values, changed in place
|
|
359
|
+
*/
|
|
360
|
+
function effect3d(snapshot: GraphSnapshot, node: Values): void {
|
|
361
|
+
const n = snapshot.nodeCount;
|
|
362
|
+
const fill = column(node, "fill", n);
|
|
363
|
+
const end = column(node, "fillGradient", n);
|
|
364
|
+
const angle = column(node, "fillGradientAngle", n);
|
|
365
|
+
const half = (v: number): number => {
|
|
366
|
+
const h = v / 2;
|
|
367
|
+
const f = Math.floor(h);
|
|
368
|
+
return h - f === 0.5 && f % 2 === 0 ? f : Math.round(h);
|
|
369
|
+
};
|
|
370
|
+
for (let i = 0; i < n; i++) {
|
|
371
|
+
const color = typeof fill[i] === "string" ? String(fill[i]) : VERTEX_FILL;
|
|
372
|
+
end[i] = `#${[1, 3, 5]
|
|
373
|
+
.map((k) =>
|
|
374
|
+
half(Number.parseInt(color.slice(k, k + 2), 16))
|
|
375
|
+
.toString(16)
|
|
376
|
+
.padStart(2, "0"),
|
|
377
|
+
)
|
|
378
|
+
.join("")}`;
|
|
379
|
+
const phi = snapshot.nodes.has("phi") ? Number(snapshot.nodes.value("phi", i)) : 0;
|
|
380
|
+
angle[i] = Number.isFinite(phi) ? (((90 - phi) % 360) + 360) % 360 : 90;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Sizes the vertices by Draw > Network + Vector (+ Second Vector), in place: with one vector each vertex is the square
|
|
386
|
+
* root of its value times its own size, with two the first is a plain factor of its width and the second of its
|
|
387
|
+
* height; 0 draws it at no size and a negative value at its own (`pajek-specimen-mappings-bypass`, `-p3`).
|
|
388
|
+
* @param draw - the settings
|
|
389
|
+
* @param snapshot - the graph
|
|
390
|
+
* @param width - the widths
|
|
391
|
+
* @param height - the heights
|
|
392
|
+
*/
|
|
393
|
+
function sizeByVectors(
|
|
394
|
+
draw: PajekDraw,
|
|
395
|
+
snapshot: GraphSnapshot,
|
|
396
|
+
width: (StyleValue | null)[],
|
|
397
|
+
height: (StyleValue | null)[],
|
|
398
|
+
): void {
|
|
399
|
+
const first = objectValues(snapshot, "vector", draw.vector);
|
|
400
|
+
if (first === null) {
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
const second = objectValues(snapshot, "vector", draw.vector2);
|
|
404
|
+
const scale = (sizes: (StyleValue | null)[], i: number, v: number | null): void => {
|
|
405
|
+
if (v !== null && v >= 0) {
|
|
406
|
+
sizes[i] = (typeof sizes[i] === "number" ? sizes[i] : VERTEX_SIZE) * v;
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
for (let i = 0; i < snapshot.nodeCount; i++) {
|
|
410
|
+
const v = first(i);
|
|
411
|
+
if (second === null) {
|
|
412
|
+
const root = v === null || v < 0 ? null : Math.sqrt(v);
|
|
413
|
+
scale(width, i, root);
|
|
414
|
+
scale(height, i, root);
|
|
415
|
+
} else {
|
|
416
|
+
scale(width, i, v);
|
|
417
|
+
scale(height, i, second(i));
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Draws the lines under the Draw window's options, in place.
|
|
424
|
+
* @param draw - the settings
|
|
425
|
+
* @param snapshot - the graph
|
|
426
|
+
* @param node - the vertices' values, already drawn (`drawVertices`)
|
|
427
|
+
* @param edge - the lines' values
|
|
428
|
+
*/
|
|
429
|
+
export function drawLines(draw: PajekDraw, snapshot: GraphSnapshot, node: Values, edge: Values): void {
|
|
430
|
+
const m = snapshot.edgeCount;
|
|
431
|
+
// Mark Vertices Using / No Labels no Arrows hides the arrowheads in the Draw window only: the SVG export still
|
|
432
|
+
// draws every one (`pajek-specimen-arrows-p2`), so the arrows are left as the file sets them
|
|
433
|
+
const opacity = iniNumber(draw, "TransparencyofLines");
|
|
434
|
+
if (opacity !== null && opacity < 1) {
|
|
435
|
+
const o = column(edge, "opacity", m);
|
|
436
|
+
o.forEach((v, e) => {
|
|
437
|
+
o[e] = (typeof v === "number" ? v : 1) * Math.max(0, opacity);
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
if (flag(draw, "Form10.StraightLinesOnly1")) {
|
|
441
|
+
// Straight Lines draws the two curves of a mutual pair or of parallel lines straight, while a line's own
|
|
442
|
+
// Bezier route (`a1 k1 a2 k2`, which set its bends) stays curved in the SVG export
|
|
443
|
+
// (`pajek-specimen-edges-lines-p4` against `-p2`: only `bidirected` and `parallel-edges` change)
|
|
444
|
+
const curved = column(edge, "curved", m);
|
|
445
|
+
for (let e = 0; e < m; e++) {
|
|
446
|
+
const bends = edge.bends?.[e];
|
|
447
|
+
if (bends === null || bends === undefined) {
|
|
448
|
+
curved[e] = false;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
if (flag(draw, "Form10.ColorGradientLines")) {
|
|
453
|
+
// each line runs from its source vertex's fill to its target's, and an arrowhead is its own end vertex's fill
|
|
454
|
+
// (`pajek-specimen-edges-lines-p5`)
|
|
455
|
+
const fill = node.fill as (StyleValue | null)[] | undefined;
|
|
456
|
+
const fillOf = (i: number): string => (typeof fill?.[i] === "string" ? fill[i] : VERTEX_FILL);
|
|
457
|
+
const colors = column(edge, "gradientColors", m);
|
|
458
|
+
const kind = column(edge, "gradientKind", m);
|
|
459
|
+
const sourceArrow = column(edge, "sourceArrowColor", m);
|
|
460
|
+
const targetArrow = column(edge, "targetArrowColor", m);
|
|
461
|
+
for (let e = 0; e < m; e++) {
|
|
462
|
+
const [s, t] = [fillOf(snapshot.edgeSource(e)), fillOf(snapshot.edgeTarget(e))];
|
|
463
|
+
colors[e] = `${s} ${t}`;
|
|
464
|
+
kind[e] = "linear";
|
|
465
|
+
sourceArrow[e] = s;
|
|
466
|
+
targetArrow[e] = t;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
RELATION_COLUMN,
|
|
38
38
|
SHAPE_COLUMN,
|
|
39
39
|
SHAPES,
|
|
40
|
+
VOIDING_KEYS,
|
|
40
41
|
} from "./syntax.js";
|
|
41
42
|
|
|
42
43
|
/** What the writer takes: the format's options, the common ones and the styles. */
|
|
@@ -832,27 +833,64 @@ function* writeVertices(
|
|
|
832
833
|
nodePlan: readonly PlannedColumn[],
|
|
833
834
|
mangle: boolean,
|
|
834
835
|
): Generator<string, void, undefined> {
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
let
|
|
838
|
-
|
|
839
|
-
|
|
836
|
+
const slots = vertexSlots(nodePlan);
|
|
837
|
+
const writeZ = slots.position !== null && needsZ(slots.position);
|
|
838
|
+
for (let i = 0; i < snapshot.nodeCount; i++) {
|
|
839
|
+
const parts = vertexParts(slots, i, writeZ);
|
|
840
|
+
if (mangle && ids.isChanged(i)) {
|
|
841
|
+
parts.push(`${ORIGINAL_ID_KEY} ${quotePajekLabel(idText(ids.originalAt(i)))}`);
|
|
842
|
+
}
|
|
843
|
+
if (slots.spells !== null) {
|
|
844
|
+
const spells = spellsText(slots.spells, i);
|
|
845
|
+
if (spells !== null) {
|
|
846
|
+
parts.push(spells);
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
const label = labelOf(slots.labels, ids, i, parts.length > 0);
|
|
850
|
+
let line = String(i + 1);
|
|
851
|
+
if (label !== null) {
|
|
852
|
+
// the importer decodes `&#dddd;` in labels, so a literal one is written with `&`
|
|
853
|
+
line += ` ${quotePajekLabel(encodeCharacterReferences(label))}`;
|
|
854
|
+
}
|
|
855
|
+
if (parts.length > 0) {
|
|
856
|
+
line += ` ${parts.join(" ")}`;
|
|
857
|
+
}
|
|
858
|
+
yield `${line}\n`;
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
/** The node columns a vertex line writes, by the slot each fills. */
|
|
863
|
+
interface VertexSlots {
|
|
864
|
+
labels: Column | null;
|
|
865
|
+
position: Column | null;
|
|
866
|
+
shape: Column | null;
|
|
867
|
+
spells: Column | null;
|
|
868
|
+
params: Column[];
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
/**
|
|
872
|
+
* Sorts the node column plan into the slots of a vertex line.
|
|
873
|
+
* @param nodePlan - the node column plan
|
|
874
|
+
* @returns the columns by slot
|
|
875
|
+
*/
|
|
876
|
+
function vertexSlots(nodePlan: readonly PlannedColumn[]): VertexSlots {
|
|
877
|
+
const slots: VertexSlots = { labels: null, position: null, shape: null, spells: null, params: [] };
|
|
840
878
|
for (const { column, slot } of nodePlan) {
|
|
841
879
|
switch (slot) {
|
|
842
880
|
case "label":
|
|
843
|
-
labels = column;
|
|
881
|
+
slots.labels = column;
|
|
844
882
|
break;
|
|
845
883
|
case "position":
|
|
846
|
-
position = column;
|
|
884
|
+
slots.position = column;
|
|
847
885
|
break;
|
|
848
886
|
case "shape":
|
|
849
|
-
shape = column;
|
|
887
|
+
slots.shape = column;
|
|
850
888
|
break;
|
|
851
889
|
case "spells":
|
|
852
|
-
|
|
890
|
+
slots.spells = column;
|
|
853
891
|
break;
|
|
854
892
|
case "param":
|
|
855
|
-
|
|
893
|
+
slots.params.push(column);
|
|
856
894
|
break;
|
|
857
895
|
case "relation":
|
|
858
896
|
case "skip":
|
|
@@ -863,48 +901,42 @@ function* writeVertices(
|
|
|
863
901
|
}
|
|
864
902
|
}
|
|
865
903
|
}
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
}
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
if (
|
|
892
|
-
|
|
893
|
-
if (spells !== null) {
|
|
894
|
-
parts.push(spells);
|
|
895
|
-
}
|
|
896
|
-
}
|
|
897
|
-
const label = labelOf(labels, ids, i, parts.length > 0);
|
|
898
|
-
let line = String(i + 1);
|
|
899
|
-
if (label !== null) {
|
|
900
|
-
// the importer decodes `&#dddd;` in labels, so a literal one is written with `&`
|
|
901
|
-
line += ` ${quotePajekLabel(encodeCharacterReferences(label))}`;
|
|
904
|
+
return slots;
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
/**
|
|
908
|
+
* A vertex line's coordinates, shape and parameters.
|
|
909
|
+
* @param slots - the node columns by slot
|
|
910
|
+
* @param i - the vertex's index
|
|
911
|
+
* @param writeZ - whether coordinates carry a z
|
|
912
|
+
* @returns the parts, in order
|
|
913
|
+
*/
|
|
914
|
+
function vertexParts(slots: VertexSlots, i: number, writeZ: boolean): string[] {
|
|
915
|
+
const { position, shape } = slots;
|
|
916
|
+
const parts: string[] = [];
|
|
917
|
+
const coordinates = position === null ? null : coordinatesText(position, i, writeZ);
|
|
918
|
+
if (coordinates !== null) {
|
|
919
|
+
parts.push(coordinates);
|
|
920
|
+
}
|
|
921
|
+
const placed = parts.length > 0;
|
|
922
|
+
const shaped = shape?.isSet(i) === true;
|
|
923
|
+
if (shaped) {
|
|
924
|
+
const keyword = cellText(shape, i);
|
|
925
|
+
parts.push(SHAPES.has(keyword) ? keyword : `${SHAPE_COLUMN} ${quotePajekLabel(keyword)}`);
|
|
926
|
+
}
|
|
927
|
+
const named = parts.length;
|
|
928
|
+
for (const column of slots.params) {
|
|
929
|
+
if (!column.isSet(i)) {
|
|
930
|
+
continue;
|
|
902
931
|
}
|
|
903
|
-
|
|
904
|
-
|
|
932
|
+
// a placed line that names no shape and starts with such a key is drawn by Pajek with none of its
|
|
933
|
+
// parameters (`VOIDING_KEYS`): the default shape is named first, so it is drawn as written
|
|
934
|
+
if (placed && !shaped && parts.length === named && VOIDING_KEYS.has(column.meta.name)) {
|
|
935
|
+
parts.push("ellipse");
|
|
905
936
|
}
|
|
906
|
-
|
|
937
|
+
parts.push(`${column.meta.name} ${quotePajekLabel(cellText(column, i))}`);
|
|
907
938
|
}
|
|
939
|
+
return parts;
|
|
908
940
|
}
|
|
909
941
|
|
|
910
942
|
/**
|