@graphty/graph-io 0.3.43 → 0.3.44
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-3Q4TsdTh.js +40 -0
- package/dist/chunks/approximations-3Q4TsdTh.js.map +1 -0
- package/dist/chunks/block-JQiwViEt.js +2777 -0
- package/dist/chunks/block-JQiwViEt.js.map +1 -0
- package/dist/chunks/{choose-DvpbdRuz.js → choose-BemygfH8.js} +3 -2
- package/dist/chunks/{choose-DvpbdRuz.js.map → choose-BemygfH8.js.map} +1 -1
- package/dist/chunks/{constants-fT3E8JYY.js → constants-BFUR_CtU.js} +6 -2
- package/dist/chunks/constants-BFUR_CtU.js.map +1 -0
- package/dist/chunks/convert-BcQ8_jMo.js +59 -0
- package/dist/chunks/convert-BcQ8_jMo.js.map +1 -0
- package/dist/chunks/emit-DCwFLts5.js +3456 -0
- package/dist/chunks/emit-DCwFLts5.js.map +1 -0
- package/dist/chunks/{escape-B62ZGM_a.js → escape-B1rMftd9.js} +43 -20
- package/dist/chunks/escape-B1rMftd9.js.map +1 -0
- package/dist/chunks/{export-rKLeGQMo.js → export-D7IGzTG4.js} +196 -792
- package/dist/chunks/export-D7IGzTG4.js.map +1 -0
- package/dist/chunks/{exporter-BWwEuOPT.js → exporter-BtnqYuuj.js} +22 -12
- package/dist/chunks/exporter-BtnqYuuj.js.map +1 -0
- package/dist/chunks/{exporter-yLxKBvLE.js → exporter-ChPyhBOv.js} +4 -3
- package/dist/chunks/{exporter-yLxKBvLE.js.map → exporter-ChPyhBOv.js.map} +1 -1
- package/dist/chunks/{exporter-8hLNemFk.js → exporter-KEPxYUXD.js} +133 -74
- package/dist/chunks/exporter-KEPxYUXD.js.map +1 -0
- package/dist/chunks/{exporter-RVtXVetw.js → exporter-quPUCBiC.js} +1805 -287
- package/dist/chunks/exporter-quPUCBiC.js.map +1 -0
- package/dist/chunks/format-GDmO6m6Q.js +676 -0
- package/dist/chunks/format-GDmO6m6Q.js.map +1 -0
- package/dist/chunks/generic-BL06jrJf.js +1347 -0
- package/dist/chunks/generic-BL06jrJf.js.map +1 -0
- package/dist/chunks/{importer-WrGRZb0N.js → importer-B7r2owVf.js} +449 -102
- package/dist/chunks/importer-B7r2owVf.js.map +1 -0
- package/dist/chunks/{importer-Ht7LNg8L.js → importer-BFmOP96W.js} +116 -296
- package/dist/chunks/importer-BFmOP96W.js.map +1 -0
- package/dist/chunks/{importer-BbNb7eNg.js → importer-C2nzGhdV.js} +1390 -129
- package/dist/chunks/importer-C2nzGhdV.js.map +1 -0
- package/dist/chunks/{importer-Dz7tI8Sa.js → importer-CbX2_rNF.js} +617 -115
- package/dist/chunks/importer-CbX2_rNF.js.map +1 -0
- package/dist/chunks/{importer-D794XUTe.js → importer-CdzeN6X4.js} +31 -8
- package/dist/chunks/importer-CdzeN6X4.js.map +1 -0
- package/dist/chunks/{importer-xZ-3suY1.js → importer-ChKNC_GN.js} +791 -135
- package/dist/chunks/importer-ChKNC_GN.js.map +1 -0
- package/dist/chunks/{importer-C98dpSH4.js → importer-dwoYpSqb.js} +141 -82
- package/dist/chunks/importer-dwoYpSqb.js.map +1 -0
- package/dist/chunks/index-B9fdNpTA.js +4310 -0
- package/dist/chunks/index-B9fdNpTA.js.map +1 -0
- package/dist/chunks/{json-elements-DKSqpNW1.js → json-elements-C4FwgnH5.js} +123 -32
- package/dist/chunks/json-elements-C4FwgnH5.js.map +1 -0
- package/dist/chunks/lexicon-B-knUi-l.js +508 -0
- package/dist/chunks/lexicon-B-knUi-l.js.map +1 -0
- package/dist/chunks/{ontology-export-CtRXjg_i.js → ontology-export-BSpbY5FL.js} +3 -2
- package/dist/chunks/{ontology-export-CtRXjg_i.js.map → ontology-export-BSpbY5FL.js.map} +1 -1
- package/dist/chunks/{records-Cu4bxYOm.js → records-Nwz_rbNt.js} +2 -2
- package/dist/chunks/{records-Cu4bxYOm.js.map → records-Nwz_rbNt.js.map} +1 -1
- package/dist/chunks/styles-Brt9JMfs.js +690 -0
- package/dist/chunks/styles-Brt9JMfs.js.map +1 -0
- package/dist/chunks/styles-_N-C8S-U.js +2102 -0
- package/dist/chunks/styles-_N-C8S-U.js.map +1 -0
- package/dist/chunks/styles-yed-DAfcIkf7.js +842 -0
- package/dist/chunks/styles-yed-DAfcIkf7.js.map +1 -0
- package/dist/chunks/{text-DHOJXnED.js → text-CgzMqHQb.js} +2 -2
- package/dist/chunks/{text-DHOJXnED.js.map → text-CgzMqHQb.js.map} +1 -1
- package/dist/chunks/units-XMZFIFe1.js +19 -0
- package/dist/chunks/units-XMZFIFe1.js.map +1 -0
- package/dist/csv.js +5 -4
- package/dist/csv.js.map +1 -1
- package/dist/cx.js +1 -1
- package/dist/cx2.js +2 -2
- package/dist/cys.js +1 -1
- package/dist/dot.js +5 -2
- package/dist/dot.js.map +1 -1
- package/dist/gexf.js +292 -412
- package/dist/gexf.js.map +1 -1
- package/dist/gml.js +8 -3031
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +354 -240
- package/dist/graph-io.js.map +1 -1
- package/dist/graphml.js +4 -2
- package/dist/graphml.js.map +1 -1
- package/dist/json.js +1 -1
- package/dist/neo4j.js +4 -3
- package/dist/neo4j.js.map +1 -1
- package/dist/obo.js +1 -1
- package/dist/pajek.js +4 -2
- package/dist/positions.d.ts +1 -0
- package/dist/positions.js +427 -0
- package/dist/positions.js.map +1 -0
- package/dist/src/common/codes.d.ts +6 -0
- package/dist/src/common/codes.d.ts.map +1 -1
- package/dist/src/common/codes.js +6 -0
- package/dist/src/common/codes.js.map +1 -1
- package/dist/src/common/escape.d.ts.map +1 -1
- package/dist/src/common/escape.js +4 -2
- package/dist/src/common/escape.js.map +1 -1
- package/dist/src/common/export.d.ts +10 -0
- package/dist/src/common/export.d.ts.map +1 -1
- package/dist/src/common/export.js +123 -100
- package/dist/src/common/export.js.map +1 -1
- package/dist/src/common/input.d.ts.map +1 -1
- package/dist/src/common/input.js +8 -1
- package/dist/src/common/input.js.map +1 -1
- package/dist/src/common/json-elements.d.ts +12 -9
- package/dist/src/common/json-elements.d.ts.map +1 -1
- package/dist/src/common/json-elements.js +160 -37
- package/dist/src/common/json-elements.js.map +1 -1
- package/dist/src/common/notes.d.ts +42 -0
- package/dist/src/common/notes.d.ts.map +1 -0
- package/dist/src/common/notes.js +72 -0
- package/dist/src/common/notes.js.map +1 -0
- package/dist/src/common/report.d.ts +18 -0
- package/dist/src/common/report.d.ts.map +1 -1
- package/dist/src/common/report.js +36 -1
- package/dist/src/common/report.js.map +1 -1
- package/dist/src/common/units.d.ts +24 -0
- package/dist/src/common/units.d.ts.map +1 -0
- package/dist/src/common/units.js +26 -0
- package/dist/src/common/units.js.map +1 -0
- package/dist/src/common/xml.d.ts +18 -0
- package/dist/src/common/xml.d.ts.map +1 -1
- package/dist/src/common/xml.js +42 -5
- package/dist/src/common/xml.js.map +1 -1
- package/dist/src/formats/cx/exporter.d.ts +6 -0
- package/dist/src/formats/cx/exporter.d.ts.map +1 -1
- package/dist/src/formats/cx/exporter.js +71 -8
- package/dist/src/formats/cx/exporter.js.map +1 -1
- package/dist/src/formats/cx/importer.d.ts +5 -2
- package/dist/src/formats/cx/importer.d.ts.map +1 -1
- package/dist/src/formats/cx/importer.js +102 -72
- package/dist/src/formats/cx/importer.js.map +1 -1
- package/dist/src/formats/cx/styles.d.ts +102 -0
- package/dist/src/formats/cx/styles.d.ts.map +1 -0
- package/dist/src/formats/cx/styles.js +225 -0
- package/dist/src/formats/cx/styles.js.map +1 -0
- package/dist/src/formats/cx2/exporter.d.ts +5 -0
- package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
- package/dist/src/formats/cx2/exporter.js +181 -71
- package/dist/src/formats/cx2/exporter.js.map +1 -1
- package/dist/src/formats/cx2/importer.d.ts +4 -1
- package/dist/src/formats/cx2/importer.d.ts.map +1 -1
- package/dist/src/formats/cx2/importer.js +19 -1
- package/dist/src/formats/cx2/importer.js.map +1 -1
- package/dist/src/formats/cx2/styles.d.ts +18 -0
- package/dist/src/formats/cx2/styles.d.ts.map +1 -0
- package/dist/src/formats/cx2/styles.js +24 -0
- package/dist/src/formats/cx2/styles.js.map +1 -0
- package/dist/src/formats/cys/constants.d.ts +2 -0
- package/dist/src/formats/cys/constants.d.ts.map +1 -1
- package/dist/src/formats/cys/constants.js +2 -0
- package/dist/src/formats/cys/constants.js.map +1 -1
- package/dist/src/formats/cys/exporter.d.ts +6 -2
- package/dist/src/formats/cys/exporter.d.ts.map +1 -1
- package/dist/src/formats/cys/exporter.js +215 -53
- package/dist/src/formats/cys/exporter.js.map +1 -1
- package/dist/src/formats/cys/importer.d.ts +2 -1
- package/dist/src/formats/cys/importer.d.ts.map +1 -1
- package/dist/src/formats/cys/importer.js +119 -6
- package/dist/src/formats/cys/importer.js.map +1 -1
- package/dist/src/formats/cys/session.d.ts +2 -0
- package/dist/src/formats/cys/session.d.ts.map +1 -1
- package/dist/src/formats/cys/session.js +5 -0
- package/dist/src/formats/cys/session.js.map +1 -1
- package/dist/src/formats/cys/styles.d.ts +38 -0
- package/dist/src/formats/cys/styles.d.ts.map +1 -0
- package/dist/src/formats/cys/styles.js +213 -0
- package/dist/src/formats/cys/styles.js.map +1 -0
- package/dist/src/formats/cys/tables.d.ts +8 -3
- package/dist/src/formats/cys/tables.d.ts.map +1 -1
- package/dist/src/formats/cys/tables.js +88 -34
- package/dist/src/formats/cys/tables.js.map +1 -1
- package/dist/src/formats/dot/exporter.d.ts +2 -0
- package/dist/src/formats/dot/exporter.d.ts.map +1 -1
- package/dist/src/formats/dot/exporter.js +195 -81
- package/dist/src/formats/dot/exporter.js.map +1 -1
- package/dist/src/formats/dot/importer.d.ts.map +1 -1
- package/dist/src/formats/dot/importer.js +100 -20
- package/dist/src/formats/dot/importer.js.map +1 -1
- package/dist/src/formats/dot/index.d.ts +1 -0
- package/dist/src/formats/dot/index.d.ts.map +1 -1
- package/dist/src/formats/dot/index.js +1 -0
- package/dist/src/formats/dot/index.js.map +1 -1
- package/dist/src/formats/dot/positions.d.ts +14 -0
- package/dist/src/formats/dot/positions.d.ts.map +1 -0
- package/dist/src/formats/dot/positions.js +70 -0
- package/dist/src/formats/dot/positions.js.map +1 -0
- package/dist/src/formats/dot/styles.d.ts +82 -0
- package/dist/src/formats/dot/styles.d.ts.map +1 -0
- package/dist/src/formats/dot/styles.js +1484 -0
- package/dist/src/formats/dot/styles.js.map +1 -0
- package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
- package/dist/src/formats/gexf/exporter.js +20 -5
- package/dist/src/formats/gexf/exporter.js.map +1 -1
- package/dist/src/formats/gexf/importer.d.ts +8 -1
- package/dist/src/formats/gexf/importer.d.ts.map +1 -1
- package/dist/src/formats/gexf/importer.js +251 -131
- package/dist/src/formats/gexf/importer.js.map +1 -1
- package/dist/src/formats/gexf/index.d.ts +8 -0
- package/dist/src/formats/gexf/index.d.ts.map +1 -1
- package/dist/src/formats/gexf/index.js +10 -2
- package/dist/src/formats/gexf/index.js.map +1 -1
- package/dist/src/formats/gexf/schema.d.ts +5 -0
- package/dist/src/formats/gexf/schema.d.ts.map +1 -1
- package/dist/src/formats/gexf/schema.js +5 -0
- package/dist/src/formats/gexf/schema.js.map +1 -1
- package/dist/src/formats/gexf/styles.d.ts +74 -0
- package/dist/src/formats/gexf/styles.d.ts.map +1 -0
- package/dist/src/formats/gexf/styles.js +604 -0
- package/dist/src/formats/gexf/styles.js.map +1 -0
- package/dist/src/formats/gml/exporter.d.ts +1 -5
- package/dist/src/formats/gml/exporter.d.ts.map +1 -1
- package/dist/src/formats/gml/exporter.js +19 -8
- package/dist/src/formats/gml/exporter.js.map +1 -1
- package/dist/src/formats/gml/importer.d.ts.map +1 -1
- package/dist/src/formats/gml/importer.js +4 -0
- package/dist/src/formats/gml/importer.js.map +1 -1
- package/dist/src/formats/gml/index.d.ts +2 -1
- package/dist/src/formats/gml/index.d.ts.map +1 -1
- package/dist/src/formats/gml/index.js +2 -1
- package/dist/src/formats/gml/index.js.map +1 -1
- package/dist/src/formats/gml/positions.d.ts +14 -0
- package/dist/src/formats/gml/positions.d.ts.map +1 -0
- package/dist/src/formats/gml/positions.js +46 -0
- package/dist/src/formats/gml/positions.js.map +1 -0
- package/dist/src/formats/gml/styles.d.ts +59 -0
- package/dist/src/formats/gml/styles.d.ts.map +1 -0
- package/dist/src/formats/gml/styles.js +1056 -0
- package/dist/src/formats/gml/styles.js.map +1 -0
- package/dist/src/formats/gml/syntax.d.ts +11 -0
- package/dist/src/formats/gml/syntax.d.ts.map +1 -1
- package/dist/src/formats/gml/syntax.js +151 -62
- package/dist/src/formats/gml/syntax.js.map +1 -1
- package/dist/src/formats/graphml/constants.d.ts +4 -0
- package/dist/src/formats/graphml/constants.d.ts.map +1 -1
- package/dist/src/formats/graphml/constants.js +5 -1
- package/dist/src/formats/graphml/constants.js.map +1 -1
- package/dist/src/formats/graphml/exporter.d.ts.map +1 -1
- package/dist/src/formats/graphml/exporter.js +133 -65
- package/dist/src/formats/graphml/exporter.js.map +1 -1
- package/dist/src/formats/graphml/importer.d.ts +4 -1
- package/dist/src/formats/graphml/importer.d.ts.map +1 -1
- package/dist/src/formats/graphml/importer.js +100 -44
- package/dist/src/formats/graphml/importer.js.map +1 -1
- package/dist/src/formats/graphml/index.d.ts +1 -0
- package/dist/src/formats/graphml/index.d.ts.map +1 -1
- package/dist/src/formats/graphml/index.js +1 -0
- package/dist/src/formats/graphml/index.js.map +1 -1
- package/dist/src/formats/graphml/styles-plain.d.ts +19 -0
- package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -0
- package/dist/src/formats/graphml/styles-plain.js +187 -0
- package/dist/src/formats/graphml/styles-plain.js.map +1 -0
- package/dist/src/formats/graphml/styles-yed.d.ts +179 -0
- package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -0
- package/dist/src/formats/graphml/styles-yed.js +1086 -0
- package/dist/src/formats/graphml/styles-yed.js.map +1 -0
- package/dist/src/formats/graphml/styles-yfiles3.d.ts +19 -0
- package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -0
- package/dist/src/formats/graphml/styles-yfiles3.js +508 -0
- package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -0
- package/dist/src/formats/graphml/tree.d.ts.map +1 -1
- package/dist/src/formats/graphml/tree.js +34 -19
- package/dist/src/formats/graphml/tree.js.map +1 -1
- package/dist/src/formats/graphml/yfiles.d.ts +16 -2
- package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
- package/dist/src/formats/graphml/yfiles.js +83 -12
- package/dist/src/formats/graphml/yfiles.js.map +1 -1
- package/dist/src/formats/json/exporter.d.ts +5 -0
- package/dist/src/formats/json/exporter.d.ts.map +1 -1
- package/dist/src/formats/json/exporter.js +68 -25
- package/dist/src/formats/json/exporter.js.map +1 -1
- package/dist/src/formats/json/importer.d.ts +22 -3
- package/dist/src/formats/json/importer.d.ts.map +1 -1
- package/dist/src/formats/json/importer.js +439 -264
- package/dist/src/formats/json/importer.js.map +1 -1
- package/dist/src/formats/json/positions.d.ts +16 -0
- package/dist/src/formats/json/positions.d.ts.map +1 -0
- package/dist/src/formats/json/positions.js +44 -0
- package/dist/src/formats/json/positions.js.map +1 -0
- package/dist/src/formats/json/styles.d.ts +102 -0
- package/dist/src/formats/json/styles.d.ts.map +1 -0
- package/dist/src/formats/json/styles.js +1753 -0
- package/dist/src/formats/json/styles.js.map +1 -0
- package/dist/src/formats/neo4j/exporter.d.ts.map +1 -1
- package/dist/src/formats/neo4j/exporter.js +2 -1
- package/dist/src/formats/neo4j/exporter.js.map +1 -1
- package/dist/src/formats/pajek/exporter.d.ts +2 -0
- package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
- package/dist/src/formats/pajek/exporter.js +142 -76
- package/dist/src/formats/pajek/exporter.js.map +1 -1
- package/dist/src/formats/pajek/importer.d.ts +4 -0
- package/dist/src/formats/pajek/importer.d.ts.map +1 -1
- package/dist/src/formats/pajek/importer.js +60 -6
- package/dist/src/formats/pajek/importer.js.map +1 -1
- package/dist/src/formats/pajek/index.d.ts +2 -0
- package/dist/src/formats/pajek/index.d.ts.map +1 -1
- package/dist/src/formats/pajek/index.js +2 -0
- package/dist/src/formats/pajek/index.js.map +1 -1
- package/dist/src/formats/pajek/styles.d.ts +50 -0
- package/dist/src/formats/pajek/styles.d.ts.map +1 -0
- package/dist/src/formats/pajek/styles.js +569 -0
- package/dist/src/formats/pajek/styles.js.map +1 -0
- package/dist/src/formats/pajek/syntax.d.ts +6 -0
- package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
- package/dist/src/formats/pajek/syntax.js +6 -0
- package/dist/src/formats/pajek/syntax.js.map +1 -1
- package/dist/src/formats/xgmml/columns.d.ts.map +1 -1
- package/dist/src/formats/xgmml/columns.js +34 -9
- package/dist/src/formats/xgmml/columns.js.map +1 -1
- package/dist/src/formats/xgmml/constants.d.ts +2 -0
- package/dist/src/formats/xgmml/constants.d.ts.map +1 -1
- package/dist/src/formats/xgmml/constants.js +3 -1
- package/dist/src/formats/xgmml/constants.js.map +1 -1
- package/dist/src/formats/xgmml/document.d.ts +12 -8
- package/dist/src/formats/xgmml/document.d.ts.map +1 -1
- package/dist/src/formats/xgmml/document.js +56 -13
- package/dist/src/formats/xgmml/document.js.map +1 -1
- package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
- package/dist/src/formats/xgmml/emit.js +12 -6
- package/dist/src/formats/xgmml/emit.js.map +1 -1
- package/dist/src/formats/xgmml/exporter.d.ts +3 -1
- package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
- package/dist/src/formats/xgmml/exporter.js +22 -9
- package/dist/src/formats/xgmml/exporter.js.map +1 -1
- package/dist/src/formats/xgmml/importer.d.ts +2 -1
- package/dist/src/formats/xgmml/importer.d.ts.map +1 -1
- package/dist/src/formats/xgmml/importer.js +31 -24
- package/dist/src/formats/xgmml/importer.js.map +1 -1
- package/dist/src/formats/xgmml/styles.d.ts +104 -0
- package/dist/src/formats/xgmml/styles.d.ts.map +1 -0
- package/dist/src/formats/xgmml/styles.js +310 -0
- package/dist/src/formats/xgmml/styles.js.map +1 -0
- package/dist/src/index.d.ts +9 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -7
- package/dist/src/index.js.map +1 -1
- package/dist/src/positions/codes.d.ts +31 -0
- package/dist/src/positions/codes.d.ts.map +1 -0
- package/dist/src/positions/codes.js +26 -0
- package/dist/src/positions/codes.js.map +1 -0
- package/dist/src/positions/convert.d.ts +58 -0
- package/dist/src/positions/convert.d.ts.map +1 -0
- package/dist/src/positions/convert.js +107 -0
- package/dist/src/positions/convert.js.map +1 -0
- package/dist/src/positions/extract.d.ts +27 -0
- package/dist/src/positions/extract.d.ts.map +1 -0
- package/dist/src/positions/extract.js +526 -0
- package/dist/src/positions/extract.js.map +1 -0
- package/dist/src/positions/index.d.ts +10 -0
- package/dist/src/positions/index.d.ts.map +1 -0
- package/dist/src/positions/index.js +9 -0
- package/dist/src/positions/index.js.map +1 -0
- package/dist/src/positions/types.d.ts +208 -0
- package/dist/src/positions/types.d.ts.map +1 -0
- package/dist/src/positions/types.js +10 -0
- package/dist/src/positions/types.js.map +1 -0
- package/dist/src/registry.d.ts +30 -0
- package/dist/src/registry.d.ts.map +1 -1
- package/dist/src/registry.js +130 -9
- package/dist/src/registry.js.map +1 -1
- package/dist/src/styles/annotations.d.ts +132 -0
- package/dist/src/styles/annotations.d.ts.map +1 -0
- package/dist/src/styles/annotations.js +320 -0
- package/dist/src/styles/annotations.js.map +1 -0
- package/dist/src/styles/budget.d.ts +45 -0
- package/dist/src/styles/budget.d.ts.map +1 -0
- package/dist/src/styles/budget.js +58 -0
- package/dist/src/styles/budget.js.map +1 -0
- package/dist/src/styles/canon/bends.d.ts +32 -0
- package/dist/src/styles/canon/bends.d.ts.map +1 -0
- package/dist/src/styles/canon/bends.js +74 -0
- package/dist/src/styles/canon/bends.js.map +1 -0
- package/dist/src/styles/canon/color-tables.d.ts +22 -0
- package/dist/src/styles/canon/color-tables.d.ts.map +1 -0
- package/dist/src/styles/canon/color-tables.js +369 -0
- package/dist/src/styles/canon/color-tables.js.map +1 -0
- package/dist/src/styles/canon/color.d.ts +66 -0
- package/dist/src/styles/canon/color.d.ts.map +1 -0
- package/dist/src/styles/canon/color.js +548 -0
- package/dist/src/styles/canon/color.js.map +1 -0
- package/dist/src/styles/canon/enums.d.ts +25 -0
- package/dist/src/styles/canon/enums.d.ts.map +1 -0
- package/dist/src/styles/canon/enums.js +187 -0
- package/dist/src/styles/canon/enums.js.map +1 -0
- package/dist/src/styles/canon/graphviz.d.ts +48 -0
- package/dist/src/styles/canon/graphviz.d.ts.map +1 -0
- package/dist/src/styles/canon/graphviz.js +160 -0
- package/dist/src/styles/canon/graphviz.js.map +1 -0
- package/dist/src/styles/canon/index.d.ts +13 -0
- package/dist/src/styles/canon/index.d.ts.map +1 -0
- package/dist/src/styles/canon/index.js +13 -0
- package/dist/src/styles/canon/index.js.map +1 -0
- package/dist/src/styles/canon/number.d.ts +59 -0
- package/dist/src/styles/canon/number.d.ts.map +1 -0
- package/dist/src/styles/canon/number.js +142 -0
- package/dist/src/styles/canon/number.js.map +1 -0
- package/dist/src/styles/canon/site.d.ts +51 -0
- package/dist/src/styles/canon/site.d.ts.map +1 -0
- package/dist/src/styles/canon/site.js +63 -0
- package/dist/src/styles/canon/site.js.map +1 -0
- package/dist/src/styles/canon/text.d.ts +61 -0
- package/dist/src/styles/canon/text.d.ts.map +1 -0
- package/dist/src/styles/canon/text.js +199 -0
- package/dist/src/styles/canon/text.js.map +1 -0
- package/dist/src/styles/codes.d.ts +95 -0
- package/dist/src/styles/codes.d.ts.map +1 -0
- package/dist/src/styles/codes.js +97 -0
- package/dist/src/styles/codes.js.map +1 -0
- package/dist/src/styles/cyjs/cascade.d.ts +134 -0
- package/dist/src/styles/cyjs/cascade.d.ts.map +1 -0
- package/dist/src/styles/cyjs/cascade.js +2252 -0
- package/dist/src/styles/cyjs/cascade.js.map +1 -0
- package/dist/src/styles/cyjs/defaults-table.d.ts +25 -0
- package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -0
- package/dist/src/styles/cyjs/defaults-table.js +76 -0
- package/dist/src/styles/cyjs/defaults-table.js.map +1 -0
- package/dist/src/styles/cyjs/emit.d.ts +82 -0
- package/dist/src/styles/cyjs/emit.d.ts.map +1 -0
- package/dist/src/styles/cyjs/emit.js +790 -0
- package/dist/src/styles/cyjs/emit.js.map +1 -0
- package/dist/src/styles/cyjs/index.d.ts +13 -0
- package/dist/src/styles/cyjs/index.d.ts.map +1 -0
- package/dist/src/styles/cyjs/index.js +13 -0
- package/dist/src/styles/cyjs/index.js.map +1 -0
- package/dist/src/styles/cyjs/live.d.ts +46 -0
- package/dist/src/styles/cyjs/live.d.ts.map +1 -0
- package/dist/src/styles/cyjs/live.js +108 -0
- package/dist/src/styles/cyjs/live.js.map +1 -0
- package/dist/src/styles/cyjs/mappers.d.ts +147 -0
- package/dist/src/styles/cyjs/mappers.d.ts.map +1 -0
- package/dist/src/styles/cyjs/mappers.js +744 -0
- package/dist/src/styles/cyjs/mappers.js.map +1 -0
- package/dist/src/styles/cyjs/selector.d.ts +113 -0
- package/dist/src/styles/cyjs/selector.d.ts.map +1 -0
- package/dist/src/styles/cyjs/selector.js +611 -0
- package/dist/src/styles/cyjs/selector.js.map +1 -0
- package/dist/src/styles/cyjs/stylesheet-text.d.ts +37 -0
- package/dist/src/styles/cyjs/stylesheet-text.d.ts.map +1 -0
- package/dist/src/styles/cyjs/stylesheet-text.js +181 -0
- package/dist/src/styles/cyjs/stylesheet-text.js.map +1 -0
- package/dist/src/styles/cytoscape/emit.d.ts +125 -0
- package/dist/src/styles/cytoscape/emit.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/emit.js +1025 -0
- package/dist/src/styles/cytoscape/emit.js.map +1 -0
- package/dist/src/styles/cytoscape/index.d.ts +10 -0
- package/dist/src/styles/cytoscape/index.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/index.js +10 -0
- package/dist/src/styles/cytoscape/index.js.map +1 -0
- package/dist/src/styles/cytoscape/lexicon.d.ts +49 -0
- package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/lexicon.js +603 -0
- package/dist/src/styles/cytoscape/lexicon.js.map +1 -0
- package/dist/src/styles/cytoscape/mappings.d.ts +171 -0
- package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/mappings.js +460 -0
- package/dist/src/styles/cytoscape/mappings.js.map +1 -0
- package/dist/src/styles/cytoscape/resolve.d.ts +137 -0
- package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/resolve.js +381 -0
- package/dist/src/styles/cytoscape/resolve.js.map +1 -0
- package/dist/src/styles/cytoscape/translate.d.ts +50 -0
- package/dist/src/styles/cytoscape/translate.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/translate.js +156 -0
- package/dist/src/styles/cytoscape/translate.js.map +1 -0
- package/dist/src/styles/defaults.d.ts +90 -0
- package/dist/src/styles/defaults.d.ts.map +1 -0
- package/dist/src/styles/defaults.js +414 -0
- package/dist/src/styles/defaults.js.map +1 -0
- package/dist/src/styles/index.d.ts +15 -0
- package/dist/src/styles/index.d.ts.map +1 -0
- package/dist/src/styles/index.js +14 -0
- package/dist/src/styles/index.js.map +1 -0
- package/dist/src/styles/internal.d.ts +17 -0
- package/dist/src/styles/internal.d.ts.map +1 -0
- package/dist/src/styles/internal.js +16 -0
- package/dist/src/styles/internal.js.map +1 -0
- package/dist/src/styles/io/approximations.d.ts +24 -0
- package/dist/src/styles/io/approximations.d.ts.map +1 -0
- package/dist/src/styles/io/approximations.js +51 -0
- package/dist/src/styles/io/approximations.js.map +1 -0
- package/dist/src/styles/io/block.d.ts +166 -0
- package/dist/src/styles/io/block.d.ts.map +1 -0
- package/dist/src/styles/io/block.js +930 -0
- package/dist/src/styles/io/block.js.map +1 -0
- package/dist/src/styles/io/generic.d.ts +88 -0
- package/dist/src/styles/io/generic.d.ts.map +1 -0
- package/dist/src/styles/io/generic.js +516 -0
- package/dist/src/styles/io/generic.js.map +1 -0
- package/dist/src/styles/io/index.d.ts +8 -0
- package/dist/src/styles/io/index.d.ts.map +1 -0
- package/dist/src/styles/io/index.js +7 -0
- package/dist/src/styles/io/index.js.map +1 -0
- package/dist/src/styles/io/writer.d.ts +80 -0
- package/dist/src/styles/io/writer.d.ts.map +1 -0
- package/dist/src/styles/io/writer.js +596 -0
- package/dist/src/styles/io/writer.js.map +1 -0
- package/dist/src/styles/notes.d.ts +47 -0
- package/dist/src/styles/notes.d.ts.map +1 -0
- package/dist/src/styles/notes.js +140 -0
- package/dist/src/styles/notes.js.map +1 -0
- package/dist/src/styles/plan/classes.d.ts +31 -0
- package/dist/src/styles/plan/classes.d.ts.map +1 -0
- package/dist/src/styles/plan/classes.js +139 -0
- package/dist/src/styles/plan/classes.js.map +1 -0
- package/dist/src/styles/plan/continuous.d.ts +32 -0
- package/dist/src/styles/plan/continuous.d.ts.map +1 -0
- package/dist/src/styles/plan/continuous.js +165 -0
- package/dist/src/styles/plan/continuous.js.map +1 -0
- package/dist/src/styles/plan/discrete.d.ts +39 -0
- package/dist/src/styles/plan/discrete.d.ts.map +1 -0
- package/dist/src/styles/plan/discrete.js +127 -0
- package/dist/src/styles/plan/discrete.js.map +1 -0
- package/dist/src/styles/plan/families.d.ts +31 -0
- package/dist/src/styles/plan/families.d.ts.map +1 -0
- package/dist/src/styles/plan/families.js +95 -0
- package/dist/src/styles/plan/families.js.map +1 -0
- package/dist/src/styles/plan/features.d.ts +58 -0
- package/dist/src/styles/plan/features.d.ts.map +1 -0
- package/dist/src/styles/plan/features.js +185 -0
- package/dist/src/styles/plan/features.js.map +1 -0
- package/dist/src/styles/plan/index.d.ts +7 -0
- package/dist/src/styles/plan/index.d.ts.map +1 -0
- package/dist/src/styles/plan/index.js +7 -0
- package/dist/src/styles/plan/index.js.map +1 -0
- package/dist/src/styles/plan/plan.d.ts +71 -0
- package/dist/src/styles/plan/plan.d.ts.map +1 -0
- package/dist/src/styles/plan/plan.js +893 -0
- package/dist/src/styles/plan/plan.js.map +1 -0
- package/dist/src/styles/plan/resolve.d.ts +137 -0
- package/dist/src/styles/plan/resolve.d.ts.map +1 -0
- package/dist/src/styles/plan/resolve.js +587 -0
- package/dist/src/styles/plan/resolve.js.map +1 -0
- package/dist/src/styles/types.d.ts +702 -0
- package/dist/src/styles/types.d.ts.map +1 -0
- package/dist/src/styles/types.js +10 -0
- package/dist/src/styles/types.js.map +1 -0
- package/dist/src/styles/vocabulary.d.ts +41 -0
- package/dist/src/styles/vocabulary.d.ts.map +1 -0
- package/dist/src/styles/vocabulary.js +140 -0
- package/dist/src/styles/vocabulary.js.map +1 -0
- package/dist/src/types.d.ts +64 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/styles.d.ts +1 -0
- package/dist/styles.js +322 -0
- package/dist/styles.js.map +1 -0
- package/dist/xgmml.js +5 -4
- package/dist/xgmml.js.map +1 -1
- package/package.json +13 -2
- package/src/common/codes.ts +7 -0
- package/src/common/escape.ts +5 -2
- package/src/common/export.ts +179 -140
- package/src/common/input.ts +8 -4
- package/src/common/json-elements.ts +169 -38
- package/src/common/notes.ts +94 -0
- package/src/common/report.ts +41 -1
- package/src/common/units.ts +42 -0
- package/src/common/xml.ts +45 -5
- package/src/formats/cx/exporter.ts +95 -11
- package/src/formats/cx/importer.ts +126 -90
- package/src/formats/cx/styles.ts +304 -0
- package/src/formats/cx2/exporter.ts +234 -77
- package/src/formats/cx2/importer.ts +19 -1
- package/src/formats/cx2/styles.ts +29 -0
- package/src/formats/cys/constants.ts +3 -0
- package/src/formats/cys/exporter.ts +246 -60
- package/src/formats/cys/importer.ts +125 -9
- package/src/formats/cys/session.ts +6 -0
- package/src/formats/cys/styles.ts +254 -0
- package/src/formats/cys/tables.ts +117 -48
- package/src/formats/dot/exporter.ts +262 -126
- package/src/formats/dot/importer.ts +111 -20
- package/src/formats/dot/index.ts +1 -0
- package/src/formats/dot/positions.ts +77 -0
- package/src/formats/dot/styles.ts +1741 -0
- package/src/formats/gexf/exporter.ts +27 -11
- package/src/formats/gexf/importer.ts +308 -158
- package/src/formats/gexf/index.ts +10 -0
- package/src/formats/gexf/schema.ts +5 -0
- package/src/formats/gexf/styles.ts +719 -0
- package/src/formats/gml/exporter.ts +33 -14
- package/src/formats/gml/importer.ts +4 -0
- package/src/formats/gml/index.ts +2 -1
- package/src/formats/gml/positions.ts +52 -0
- package/src/formats/gml/styles.ts +1248 -0
- package/src/formats/gml/syntax.ts +173 -62
- package/src/formats/graphml/constants.ts +5 -0
- package/src/formats/graphml/exporter.ts +163 -71
- package/src/formats/graphml/importer.ts +119 -45
- package/src/formats/graphml/index.ts +1 -0
- package/src/formats/graphml/styles-plain.ts +236 -0
- package/src/formats/graphml/styles-yed.ts +1221 -0
- package/src/formats/graphml/styles-yfiles3.ts +573 -0
- package/src/formats/graphml/tree.ts +36 -20
- package/src/formats/graphml/yfiles.ts +89 -13
- package/src/formats/json/exporter.ts +76 -26
- package/src/formats/json/importer.ts +541 -322
- package/src/formats/json/positions.ts +50 -0
- package/src/formats/json/styles.ts +2082 -0
- package/src/formats/neo4j/exporter.ts +2 -1
- package/src/formats/pajek/exporter.ts +195 -106
- package/src/formats/pajek/importer.ts +78 -9
- package/src/formats/pajek/index.ts +2 -0
- package/src/formats/pajek/styles.ts +685 -0
- package/src/formats/pajek/syntax.ts +7 -0
- package/src/formats/xgmml/columns.ts +39 -9
- package/src/formats/xgmml/constants.ts +3 -0
- package/src/formats/xgmml/document.ts +54 -12
- package/src/formats/xgmml/emit.ts +11 -6
- package/src/formats/xgmml/exporter.ts +32 -13
- package/src/formats/xgmml/importer.ts +43 -29
- package/src/formats/xgmml/styles.ts +400 -0
- package/src/index.ts +16 -0
- package/src/positions/codes.ts +32 -0
- package/src/positions/convert.ts +123 -0
- package/src/positions/extract.ts +619 -0
- package/src/positions/index.ts +23 -0
- package/src/positions/types.ts +221 -0
- package/src/registry.ts +179 -8
- package/src/styles/annotations.ts +478 -0
- package/src/styles/budget.ts +60 -0
- package/src/styles/canon/bends.ts +84 -0
- package/src/styles/canon/color-tables.ts +386 -0
- package/src/styles/canon/color.ts +624 -0
- package/src/styles/canon/enums.ts +211 -0
- package/src/styles/canon/graphviz.ts +189 -0
- package/src/styles/canon/index.ts +13 -0
- package/src/styles/canon/number.ts +152 -0
- package/src/styles/canon/site.ts +87 -0
- package/src/styles/canon/text.ts +221 -0
- package/src/styles/codes.ts +104 -0
- package/src/styles/cyjs/cascade.ts +2670 -0
- package/src/styles/cyjs/defaults-table.ts +82 -0
- package/src/styles/cyjs/emit.ts +951 -0
- package/src/styles/cyjs/index.ts +37 -0
- package/src/styles/cyjs/live.ts +147 -0
- package/src/styles/cyjs/mappers.ts +879 -0
- package/src/styles/cyjs/selector.ts +778 -0
- package/src/styles/cyjs/stylesheet-text.ts +214 -0
- package/src/styles/cytoscape/emit.ts +1264 -0
- package/src/styles/cytoscape/index.ts +40 -0
- package/src/styles/cytoscape/lexicon.ts +656 -0
- package/src/styles/cytoscape/mappings.ts +603 -0
- package/src/styles/cytoscape/resolve.ts +521 -0
- package/src/styles/cytoscape/translate.ts +237 -0
- package/src/styles/defaults.ts +504 -0
- package/src/styles/index.ts +57 -0
- package/src/styles/internal.ts +17 -0
- package/src/styles/io/approximations.ts +47 -0
- package/src/styles/io/block.ts +1138 -0
- package/src/styles/io/generic.ts +687 -0
- package/src/styles/io/index.ts +18 -0
- package/src/styles/io/writer.ts +745 -0
- package/src/styles/notes.ts +165 -0
- package/src/styles/plan/classes.ts +166 -0
- package/src/styles/plan/continuous.ts +218 -0
- package/src/styles/plan/discrete.ts +165 -0
- package/src/styles/plan/families.ts +115 -0
- package/src/styles/plan/features.ts +234 -0
- package/src/styles/plan/index.ts +7 -0
- package/src/styles/plan/plan.ts +1129 -0
- package/src/styles/plan/resolve.ts +685 -0
- package/src/styles/types.ts +814 -0
- package/src/styles/vocabulary.ts +172 -0
- package/src/types.ts +76 -1
- package/dist/chunks/constants-fT3E8JYY.js.map +0 -1
- package/dist/chunks/escape-B62ZGM_a.js.map +0 -1
- package/dist/chunks/export-rKLeGQMo.js.map +0 -1
- package/dist/chunks/exporter-8hLNemFk.js.map +0 -1
- package/dist/chunks/exporter-BWwEuOPT.js.map +0 -1
- package/dist/chunks/exporter-RVtXVetw.js.map +0 -1
- package/dist/chunks/importer-BbNb7eNg.js.map +0 -1
- package/dist/chunks/importer-C98dpSH4.js.map +0 -1
- package/dist/chunks/importer-D794XUTe.js.map +0 -1
- package/dist/chunks/importer-Dz7tI8Sa.js.map +0 -1
- package/dist/chunks/importer-Ht7LNg8L.js.map +0 -1
- package/dist/chunks/importer-WrGRZb0N.js.map +0 -1
- package/dist/chunks/importer-xZ-3suY1.js.map +0 -1
- package/dist/chunks/json-elements-DKSqpNW1.js.map +0 -1
|
@@ -0,0 +1,790 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Neutral styles written as a Cytoscape.js stylesheet: the rules in order as stylesheet rules, the per-element values
|
|
3
|
+
* those rules read as element data under flat keys, and per-element bypasses for the values no rule gives.
|
|
4
|
+
*
|
|
5
|
+
* - A short predicate becomes a selector (`all`, `has`, `eq`, `in`, `not`, one `and`); a predicate a selector cannot
|
|
6
|
+
* state exactly (a computed degree, a boolean value, a column whose name a selector cannot spell) becomes a
|
|
7
|
+
* membership value written into element data and tested with `[key]`.
|
|
8
|
+
* - A passthrough becomes `data(key)` over the values, written ready for Cytoscape.js; a discrete mapping becomes one
|
|
9
|
+
* rule per table key; a continuous mapping becomes `mapData()`, one per segment; every mapped rule is scoped to the
|
|
10
|
+
* elements it gives a value, because a Cytoscape.js mapper that finds nothing resets the property to its default.
|
|
11
|
+
* - The stylesheet is then applied to the element data with graph-io's own Cytoscape.js engine, and every element
|
|
12
|
+
* whose drawn value still differs from the styles gets a bypass (its own `style`), so the result is exact.
|
|
13
|
+
* - With an import id, every element gets `graphty_import: <id>` and every selector tests it, so two imports in one
|
|
14
|
+
* core never style each other's elements.
|
|
15
|
+
* - Cytoscape.js draws what it draws regardless of any stylesheet: a loop is always curved, and its own default rules
|
|
16
|
+
* (compound parents, selected elements) apply beneath the stylesheet. A file Cytoscape.js wrote keeps those
|
|
17
|
+
* defaults as Cytoscape.js's own; they are not written again.
|
|
18
|
+
*/
|
|
19
|
+
import { STYLE_ISSUE } from "../codes.js";
|
|
20
|
+
import { StyleNotes } from "../notes.js";
|
|
21
|
+
import { matches, refSource, resolveRules } from "../plan/resolve.js";
|
|
22
|
+
import { STYLE_PROPERTIES } from "../vocabulary.js";
|
|
23
|
+
import { evaluateCytoscapeJs } from "./cascade.js";
|
|
24
|
+
import { CYJS_EDGE_PROPERTIES, CYJS_NODE_PROPERTIES, isFontFamily } from "./mappers.js";
|
|
25
|
+
import { parseCyjsSelector } from "./selector.js";
|
|
26
|
+
/** The element data key that holds the import id. */
|
|
27
|
+
export const CYTOSCAPE_IMPORT_KEY = "graphty_import";
|
|
28
|
+
/**
|
|
29
|
+
* The flat element data key of a style column: Cytoscape.js reads a dot in a data selector as a nested path, so the
|
|
30
|
+
* key has none (`member.3` is `graphty_style_member_3`).
|
|
31
|
+
* @param key - the style column's key
|
|
32
|
+
* @returns the element data key
|
|
33
|
+
* @category Styles
|
|
34
|
+
*/
|
|
35
|
+
export function cytoscapeStyleKey(key) {
|
|
36
|
+
return `graphty_style_${key.replaceAll(/\W/g, "_")}`;
|
|
37
|
+
}
|
|
38
|
+
/** A name a selector and a mapper can both spell without escapes or paths. */
|
|
39
|
+
const PLAIN_NAME = /^[A-Za-z_]\w*$/;
|
|
40
|
+
const SHAPES_TO_CYJS = new Map([
|
|
41
|
+
["ellipse", "ellipse"],
|
|
42
|
+
["rectangle", "rectangle"],
|
|
43
|
+
["round-rectangle", "round-rectangle"],
|
|
44
|
+
["triangle", "triangle"],
|
|
45
|
+
["diamond", "diamond"],
|
|
46
|
+
["pentagon", "pentagon"],
|
|
47
|
+
["hexagon", "hexagon"],
|
|
48
|
+
["octagon", "octagon"],
|
|
49
|
+
["parallelogram", "rhomboid"],
|
|
50
|
+
["star", "star"],
|
|
51
|
+
["vee", "vee"],
|
|
52
|
+
]);
|
|
53
|
+
const ARROWS_TO_CYJS = new Map([
|
|
54
|
+
["none", "none"],
|
|
55
|
+
["triangle", "triangle"],
|
|
56
|
+
["vee", "vee"],
|
|
57
|
+
["tee", "tee"],
|
|
58
|
+
["diamond", "diamond"],
|
|
59
|
+
["circle", "circle"],
|
|
60
|
+
["square", "square"],
|
|
61
|
+
]);
|
|
62
|
+
const ARROWS_NEAREST = new Map([
|
|
63
|
+
["triangle-open", "triangle"],
|
|
64
|
+
["diamond-open", "diamond"],
|
|
65
|
+
["circle-open", "circle"],
|
|
66
|
+
["half", "triangle"],
|
|
67
|
+
["inverted", "triangle"],
|
|
68
|
+
["crow", "vee"],
|
|
69
|
+
]);
|
|
70
|
+
/**
|
|
71
|
+
* A neutral value as Cytoscape.js properties.
|
|
72
|
+
* @param target - nodes or edges
|
|
73
|
+
* @param property - the neutral property
|
|
74
|
+
* @param value - the value
|
|
75
|
+
* @returns the properties, or null when Cytoscape.js has no place for it
|
|
76
|
+
*/
|
|
77
|
+
function toCyjs(target, property, value) {
|
|
78
|
+
const specs = target === "node" ? CYJS_NODE_PROPERTIES : CYJS_EDGE_PROPERTIES;
|
|
79
|
+
switch (property) {
|
|
80
|
+
case "visible":
|
|
81
|
+
return exact({ display: value === false ? "none" : "element" });
|
|
82
|
+
case "labelItalic":
|
|
83
|
+
return exact({ "font-style": value === true ? "italic" : "normal" });
|
|
84
|
+
case "curved":
|
|
85
|
+
return exact({ "curve-style": value === true ? "bezier" : "straight" });
|
|
86
|
+
case "labelPosition":
|
|
87
|
+
return labelPositionToCyjs(String(value));
|
|
88
|
+
case "shape":
|
|
89
|
+
return enumToCyjs("shape", String(value), SHAPES_TO_CYJS, specs);
|
|
90
|
+
case "borderStyle":
|
|
91
|
+
return borderStyleToCyjs(String(value));
|
|
92
|
+
case "lineStyle":
|
|
93
|
+
return lineStyleToCyjs(String(value));
|
|
94
|
+
case "sourceArrow":
|
|
95
|
+
case "targetArrow":
|
|
96
|
+
return arrowToCyjs(property === "sourceArrow" ? "source-arrow-shape" : "target-arrow-shape", String(value), specs);
|
|
97
|
+
case "labelFont":
|
|
98
|
+
return isFontFamily(String(value)) ? exact({ "font-family": String(value) }) : null;
|
|
99
|
+
default:
|
|
100
|
+
return propertyToCyjs(property, value, specs);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Properties written exactly.
|
|
105
|
+
* @param props - the properties
|
|
106
|
+
* @returns the written value
|
|
107
|
+
*/
|
|
108
|
+
function exact(props) {
|
|
109
|
+
return { props, approximate: false };
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Properties written as the nearest Cytoscape.js has.
|
|
113
|
+
* @param props - the properties
|
|
114
|
+
* @returns the written value
|
|
115
|
+
*/
|
|
116
|
+
function near(props) {
|
|
117
|
+
return { props, approximate: true };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* A label position as the vertical and horizontal alignments.
|
|
121
|
+
* @param text - the position
|
|
122
|
+
* @returns the written value
|
|
123
|
+
*/
|
|
124
|
+
function labelPositionToCyjs(text) {
|
|
125
|
+
const v = ["top", "bottom"].find((x) => text.startsWith(x)) ?? "center";
|
|
126
|
+
const h = ["left", "right"].find((x) => text.endsWith(x)) ?? "center";
|
|
127
|
+
return exact({ "text-valign": v, "text-halign": h });
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* An enumeration value: Cytoscape.js's name for it, or an `other:` value Cytoscape.js has.
|
|
131
|
+
* @param name - the Cytoscape.js property
|
|
132
|
+
* @param value - the neutral value
|
|
133
|
+
* @param table - the neutral values Cytoscape.js has, by their Cytoscape.js names
|
|
134
|
+
* @param specs - the target's properties
|
|
135
|
+
* @returns the written value, or null when Cytoscape.js has none
|
|
136
|
+
*/
|
|
137
|
+
function enumToCyjs(name, value, table, specs) {
|
|
138
|
+
const cy = table.get(value);
|
|
139
|
+
if (cy !== undefined) {
|
|
140
|
+
return exact({ [name]: cy });
|
|
141
|
+
}
|
|
142
|
+
const other = value.startsWith("other:") ? value.slice(6) : null;
|
|
143
|
+
return other !== null && specs.get(name)?.enums?.includes(other) === true ? exact({ [name]: other }) : null;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* An arrow, or the nearest arrow Cytoscape.js has.
|
|
147
|
+
* @param name - the Cytoscape.js property
|
|
148
|
+
* @param value - the neutral arrow
|
|
149
|
+
* @param specs - the target's properties
|
|
150
|
+
* @returns the written value, or null when Cytoscape.js has none near
|
|
151
|
+
*/
|
|
152
|
+
function arrowToCyjs(name, value, specs) {
|
|
153
|
+
const own = enumToCyjs(name, value, ARROWS_TO_CYJS, specs);
|
|
154
|
+
if (own !== null) {
|
|
155
|
+
return own;
|
|
156
|
+
}
|
|
157
|
+
const nearest = ARROWS_NEAREST.get(value);
|
|
158
|
+
return nearest === undefined ? null : near({ [name]: nearest });
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* A border style: dash-dot is drawn dashed.
|
|
162
|
+
* @param value - the neutral style
|
|
163
|
+
* @returns the written value, or null when Cytoscape.js has none
|
|
164
|
+
*/
|
|
165
|
+
function borderStyleToCyjs(value) {
|
|
166
|
+
if (value === "dash-dot") {
|
|
167
|
+
return near({ "border-style": "dashed" });
|
|
168
|
+
}
|
|
169
|
+
return ["solid", "dotted", "dashed", "double"].includes(value) ? exact({ "border-style": value }) : null;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* A line style: the dashed kinds are drawn dashed, any other solid.
|
|
173
|
+
* @param value - the neutral style
|
|
174
|
+
* @returns the written value
|
|
175
|
+
*/
|
|
176
|
+
function lineStyleToCyjs(value) {
|
|
177
|
+
if (["solid", "dotted", "dashed"].includes(value)) {
|
|
178
|
+
return exact({ "line-style": value });
|
|
179
|
+
}
|
|
180
|
+
return near({ "line-style": value === "dash-dot" || value === "long-dash" ? "dashed" : "solid" });
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Any other property: the Cytoscape.js property that carries it, the value as it is.
|
|
184
|
+
* @param property - the neutral property
|
|
185
|
+
* @param value - the value
|
|
186
|
+
* @param specs - the target's properties
|
|
187
|
+
* @returns the written value, or null when no property carries it
|
|
188
|
+
*/
|
|
189
|
+
function propertyToCyjs(property, value, specs) {
|
|
190
|
+
const entry = Array.from(specs).find(([, spec]) => spec.property === property);
|
|
191
|
+
if (entry === undefined) {
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
const [name, spec] = entry;
|
|
195
|
+
if (spec.type === "positive" && !(typeof value === "number" && value > 0)) {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
// Cytoscape.js takes an empty bypass as no bypass at all; a blank, which it trims, draws no text
|
|
199
|
+
if (value === "" && /label$/i.test(property)) {
|
|
200
|
+
return exact({ [name]: " " });
|
|
201
|
+
}
|
|
202
|
+
return exact({ [name]: typeof value === "boolean" ? String(value) : value });
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* A selector value literal: a string in quotes (when it holds no quote of that kind and no backslash) or a number.
|
|
206
|
+
* @param v - the value
|
|
207
|
+
* @returns the literal, or null when a selector cannot state it
|
|
208
|
+
*/
|
|
209
|
+
function literal(v) {
|
|
210
|
+
if (typeof v === "number") {
|
|
211
|
+
return Number.isFinite(v) ? String(v) : null;
|
|
212
|
+
}
|
|
213
|
+
if (typeof v !== "string" || v.includes("\\") || /[\n\r\u2028\u2029]/.test(v)) {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
if (!v.includes('"')) {
|
|
217
|
+
return `"${v}"`;
|
|
218
|
+
}
|
|
219
|
+
return v.includes("'") ? null : `'${v}'`;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* A flat element data key for a source, unique within the target's data.
|
|
223
|
+
* @param e - the emit
|
|
224
|
+
* @param target - nodes or edges
|
|
225
|
+
* @param source - the source: a style column key, or a generated name
|
|
226
|
+
* @returns the flat key, and whether it is new
|
|
227
|
+
*/
|
|
228
|
+
function flatKey(e, target, source) {
|
|
229
|
+
const known = e.keys[target].get(source);
|
|
230
|
+
if (known !== undefined) {
|
|
231
|
+
return { key: known, fresh: false };
|
|
232
|
+
}
|
|
233
|
+
let key = cytoscapeStyleKey(source);
|
|
234
|
+
let k = 2;
|
|
235
|
+
while (e.used[target].has(key)) {
|
|
236
|
+
key = `${cytoscapeStyleKey(source)}_${String(k)}`;
|
|
237
|
+
k++;
|
|
238
|
+
}
|
|
239
|
+
e.keys[target].set(source, key);
|
|
240
|
+
e.used[target].add(key);
|
|
241
|
+
return { key, fresh: true };
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Writes a column into element data.
|
|
245
|
+
* @param e - the emit
|
|
246
|
+
* @param target - nodes or edges
|
|
247
|
+
* @param key - the flat key
|
|
248
|
+
* @param values - the values by element index; null and false are not written
|
|
249
|
+
*/
|
|
250
|
+
function writeColumn(e, target, key, values) {
|
|
251
|
+
const rows = e.data[target];
|
|
252
|
+
for (let i = 0; i < rows.length && i < values.length; i++) {
|
|
253
|
+
const v = values[i];
|
|
254
|
+
if (v !== null && v !== undefined && v !== false) {
|
|
255
|
+
rows[i][key] = v;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* The selector tests of a predicate, as alternatives of conjunctions; null when a selector cannot state it exactly.
|
|
261
|
+
* @param e - the emit
|
|
262
|
+
* @param target - nodes or edges
|
|
263
|
+
* @param where - the predicate
|
|
264
|
+
* @returns the alternatives (each a string of tests), or null
|
|
265
|
+
*/
|
|
266
|
+
function testsOf(e, target, where) {
|
|
267
|
+
if ("all" in where) {
|
|
268
|
+
return where.all ? [""] : null;
|
|
269
|
+
}
|
|
270
|
+
if ("has" in where) {
|
|
271
|
+
const k = keyOf(e, target, where.has);
|
|
272
|
+
return k === null || !("style" in where.has) ? null : [`[${k}]`];
|
|
273
|
+
}
|
|
274
|
+
if ("eq" in where) {
|
|
275
|
+
return equalTest(e, target, where.eq, "=");
|
|
276
|
+
}
|
|
277
|
+
if ("in" in where) {
|
|
278
|
+
const k = keyOf(e, target, where.in[0]);
|
|
279
|
+
const values = where.in[1].map((x) => literal(x));
|
|
280
|
+
if (values.length === 0) {
|
|
281
|
+
return [];
|
|
282
|
+
}
|
|
283
|
+
return k === null || values.includes(null) ? null : values.map((v) => `[${k} = ${String(v)}]`);
|
|
284
|
+
}
|
|
285
|
+
if ("not" in where) {
|
|
286
|
+
return notTests(e, target, where.not);
|
|
287
|
+
}
|
|
288
|
+
if ("and" in where) {
|
|
289
|
+
return andTests(e, target, where.and);
|
|
290
|
+
}
|
|
291
|
+
if ("or" in where) {
|
|
292
|
+
return orTests(e, target, where.or);
|
|
293
|
+
}
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* An equality test, or its negation.
|
|
298
|
+
* @param e - the emit
|
|
299
|
+
* @param target - nodes or edges
|
|
300
|
+
* @param eq - the column and the value
|
|
301
|
+
* @param op - `=` or `!=`
|
|
302
|
+
* @returns the test, or null when a selector cannot state it
|
|
303
|
+
*/
|
|
304
|
+
function equalTest(e, target, eq, op) {
|
|
305
|
+
const k = keyOf(e, target, eq[0]);
|
|
306
|
+
const v = literal(eq[1]);
|
|
307
|
+
return k === null || v === null ? null : [`[${k} ${op} ${v}]`];
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* A negated predicate: only a style column's absence and an inequality are stated.
|
|
311
|
+
* @param e - the emit
|
|
312
|
+
* @param target - nodes or edges
|
|
313
|
+
* @param inner - the predicate negated
|
|
314
|
+
* @returns the tests, or null
|
|
315
|
+
*/
|
|
316
|
+
function notTests(e, target, inner) {
|
|
317
|
+
if ("has" in inner && "style" in inner.has) {
|
|
318
|
+
const k = keyOf(e, target, inner.has);
|
|
319
|
+
return k === null ? null : [`[^${k}]`];
|
|
320
|
+
}
|
|
321
|
+
return "eq" in inner ? equalTest(e, target, inner.eq, "!=") : null;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* A conjunction: every combination of its parts' alternatives, at most 8.
|
|
325
|
+
* @param e - the emit
|
|
326
|
+
* @param target - nodes or edges
|
|
327
|
+
* @param parts - the predicates joined
|
|
328
|
+
* @returns the alternatives, or null
|
|
329
|
+
*/
|
|
330
|
+
function andTests(e, target, parts) {
|
|
331
|
+
let alts = [""];
|
|
332
|
+
for (const p of parts) {
|
|
333
|
+
const t = testsOf(e, target, p);
|
|
334
|
+
if (t === null) {
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
alts = alts.flatMap((a) => t.map((b) => a + b));
|
|
338
|
+
if (alts.length > 8) {
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return alts;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* A disjunction: its parts' alternatives, at most 8.
|
|
346
|
+
* @param e - the emit
|
|
347
|
+
* @param target - nodes or edges
|
|
348
|
+
* @param parts - the predicates joined
|
|
349
|
+
* @returns the alternatives, or null
|
|
350
|
+
*/
|
|
351
|
+
function orTests(e, target, parts) {
|
|
352
|
+
const out = [];
|
|
353
|
+
for (const p of parts) {
|
|
354
|
+
const t = testsOf(e, target, p);
|
|
355
|
+
if (t === null) {
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
358
|
+
out.push(...t);
|
|
359
|
+
}
|
|
360
|
+
return out.length > 8 ? null : out;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* The element data key a column reference is read from: a style column's flat key (its values written into element
|
|
364
|
+
* data) or a data column's own name when a selector can spell it; null for anything else.
|
|
365
|
+
* @param e - the emit
|
|
366
|
+
* @param target - nodes or edges
|
|
367
|
+
* @param ref - the reference
|
|
368
|
+
* @returns the key, or null
|
|
369
|
+
*/
|
|
370
|
+
function keyOf(e, target, ref) {
|
|
371
|
+
if ("style" in ref) {
|
|
372
|
+
const col = e.extracted.columns[target].get(ref.style);
|
|
373
|
+
if (col === undefined) {
|
|
374
|
+
return null;
|
|
375
|
+
}
|
|
376
|
+
const { key, fresh } = flatKey(e, target, ref.style);
|
|
377
|
+
if (fresh) {
|
|
378
|
+
writeColumn(e, target, key, col);
|
|
379
|
+
}
|
|
380
|
+
return key;
|
|
381
|
+
}
|
|
382
|
+
if ("data" in ref &&
|
|
383
|
+
PLAIN_NAME.test(ref.data) &&
|
|
384
|
+
ref.data !== CYTOSCAPE_IMPORT_KEY &&
|
|
385
|
+
!ref.data.startsWith("graphty_")) {
|
|
386
|
+
return ref.data;
|
|
387
|
+
}
|
|
388
|
+
return null;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* The selectors of a rule: its predicate as tests, or a membership value written into element data.
|
|
392
|
+
* @param e - the emit
|
|
393
|
+
* @param rule - the rule
|
|
394
|
+
* @param index - the rule's position
|
|
395
|
+
* @returns the selector prefixes (group and scope included), one per alternative
|
|
396
|
+
*/
|
|
397
|
+
function selectorsOf(e, rule, index) {
|
|
398
|
+
const head = `${rule.target}${e.scope}`;
|
|
399
|
+
const tests = testsOf(e, rule.target, rule.where);
|
|
400
|
+
if (tests !== null) {
|
|
401
|
+
return tests.map((t) => head + t);
|
|
402
|
+
}
|
|
403
|
+
const src = refSource(rule.target, e.data[rule.target].length, e.extracted.columns[rule.target], e.extracted.features[rule.target]);
|
|
404
|
+
const { key } = flatKey(e, rule.target, `emit.where.${String(index)}`);
|
|
405
|
+
const col = new Array(src.n);
|
|
406
|
+
for (let i = 0; i < src.n; i++) {
|
|
407
|
+
col[i] = matches(rule.where, src, i) ? true : null;
|
|
408
|
+
}
|
|
409
|
+
writeColumn(e, rule.target, key, col);
|
|
410
|
+
return [`${head}[${key}]`];
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Emits one rule's constants and mappings.
|
|
414
|
+
* @param e - the emit
|
|
415
|
+
* @param rule - the rule
|
|
416
|
+
* @param index - the rule's position
|
|
417
|
+
*/
|
|
418
|
+
function emitRule(e, rule, index) {
|
|
419
|
+
const { target } = rule;
|
|
420
|
+
const selectors = selectorsOf(e, rule, index);
|
|
421
|
+
const constants = {};
|
|
422
|
+
for (const [p, v] of Object.entries(rule.set ?? {})) {
|
|
423
|
+
if (v === undefined) {
|
|
424
|
+
continue;
|
|
425
|
+
}
|
|
426
|
+
const w = written(e, target, p, v);
|
|
427
|
+
if (w !== null) {
|
|
428
|
+
Object.assign(constants, w);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
if (Object.keys(constants).length > 0) {
|
|
432
|
+
for (const sel of selectors) {
|
|
433
|
+
e.stylesheet.push({ selector: sel, style: constants });
|
|
434
|
+
// Cytoscape.js curves a straight loop, but keeps a loop it is told to draw as a haystack
|
|
435
|
+
if (target === "edge" && constants["curve-style"] === "straight") {
|
|
436
|
+
e.stylesheet.push({ selector: `${sel}:loop`, style: { "curve-style": "haystack" } });
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
for (const [p, m] of Object.entries(rule.map ?? {})) {
|
|
441
|
+
if (m !== undefined) {
|
|
442
|
+
emitMapping(e, rule, index, selectors, p, m);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Whether Cytoscape.js holds a neutral value exactly: a value it cannot hold, or holds only as a nearest one, reads back
|
|
448
|
+
* as something else.
|
|
449
|
+
* @param target - nodes or edges
|
|
450
|
+
* @param property - the neutral property
|
|
451
|
+
* @param value - the value
|
|
452
|
+
* @returns true when it is written as it is
|
|
453
|
+
*/
|
|
454
|
+
export function cyjsHoldsExactly(target, property, value) {
|
|
455
|
+
const w = toCyjs(target, property, value);
|
|
456
|
+
return w !== null && !w.approximate;
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* A value as Cytoscape.js properties, noted when it cannot be written or only approximately.
|
|
460
|
+
* @param e - the emit
|
|
461
|
+
* @param target - nodes or edges
|
|
462
|
+
* @param property - the neutral property
|
|
463
|
+
* @param value - the value
|
|
464
|
+
* @returns the properties, or null
|
|
465
|
+
*/
|
|
466
|
+
function written(e, target, property, value) {
|
|
467
|
+
const w = toCyjs(target, property, value);
|
|
468
|
+
if (w === null) {
|
|
469
|
+
e.notes.add(STYLE_ISSUE.NOT_WRITTEN, target, property, { sample: value });
|
|
470
|
+
return null;
|
|
471
|
+
}
|
|
472
|
+
if (w.approximate) {
|
|
473
|
+
e.notes.add(STYLE_ISSUE.APPROXIMATED, target, property, { sample: value });
|
|
474
|
+
}
|
|
475
|
+
return w.props;
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Emits one mapping of a rule.
|
|
479
|
+
* @param e - the emit
|
|
480
|
+
* @param rule - the rule
|
|
481
|
+
* @param index - the rule's position
|
|
482
|
+
* @param selectors - the rule's selectors
|
|
483
|
+
* @param property - the property
|
|
484
|
+
* @param m - the mapping
|
|
485
|
+
*/
|
|
486
|
+
function emitMapping(e, rule, index, selectors, property, m) {
|
|
487
|
+
const { target } = rule;
|
|
488
|
+
if (m.kind === "discrete") {
|
|
489
|
+
// one rule per table key, when a selector can state every key; else the per-element values
|
|
490
|
+
const key = keyOf(e, target, m.by);
|
|
491
|
+
const keys = m.table.map(([k]) => literal(k));
|
|
492
|
+
if (key === null || keys.includes(null)) {
|
|
493
|
+
emitValues(e, rule, index, selectors, property);
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
m.table.forEach(([, v], j) => {
|
|
497
|
+
const w = written(e, target, property, v);
|
|
498
|
+
if (w === null) {
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
for (const sel of selectors) {
|
|
502
|
+
e.stylesheet.push({ selector: `${sel}[${key} = ${String(keys[j])}]`, style: w });
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
if (m.kind === "continuous" && isNumericOutput(target, property)) {
|
|
508
|
+
const key = numericKey(e, target, m.by, index);
|
|
509
|
+
if (key !== null) {
|
|
510
|
+
emitContinuous(e, target, selectors, property, key, m.points);
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
emitValues(e, rule, index, selectors, property);
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Whether a property's values are numbers or colors, which `mapData()` interpolates.
|
|
518
|
+
* @param target - nodes or edges
|
|
519
|
+
* @param property - the property
|
|
520
|
+
* @returns true for a number, opacity or color property
|
|
521
|
+
*/
|
|
522
|
+
function isNumericOutput(target, property) {
|
|
523
|
+
const kind = STYLE_PROPERTIES[target].get(property);
|
|
524
|
+
return kind === "number" || kind === "opacity" || kind === "color";
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* The element data key of a mapping's numeric input: a data column a mapper can spell, or the input copied into
|
|
528
|
+
* element data.
|
|
529
|
+
* @param e - the emit
|
|
530
|
+
* @param target - nodes or edges
|
|
531
|
+
* @param by - the input
|
|
532
|
+
* @param index - the rule's position
|
|
533
|
+
* @returns the key, or null when the input has no values
|
|
534
|
+
*/
|
|
535
|
+
function numericKey(e, target, by, index) {
|
|
536
|
+
const src = refSource(target, e.data[target].length, e.extracted.columns[target], e.extracted.features[target]);
|
|
537
|
+
const col = src.column(by);
|
|
538
|
+
if (col === null) {
|
|
539
|
+
return null;
|
|
540
|
+
}
|
|
541
|
+
if ("data" in by && PLAIN_NAME.test(by.data) && !by.data.startsWith("graphty_")) {
|
|
542
|
+
return by.data;
|
|
543
|
+
}
|
|
544
|
+
const { key } = flatKey(e, target, `emit.input.${String(index)}`);
|
|
545
|
+
const values = new Array(src.n);
|
|
546
|
+
for (let i = 0; i < src.n; i++) {
|
|
547
|
+
const v = col[i];
|
|
548
|
+
values[i] = typeof v === "number" && Number.isFinite(v) ? v : null;
|
|
549
|
+
}
|
|
550
|
+
writeColumn(e, target, key, values);
|
|
551
|
+
return key;
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* A continuous mapping as `mapData()` rules: one per segment, the values below the first point and above the last,
|
|
555
|
+
* and the exact values at the points, each scoped to its input range.
|
|
556
|
+
* @param e - the emit
|
|
557
|
+
* @param target - nodes or edges
|
|
558
|
+
* @param selectors - the rule's selectors
|
|
559
|
+
* @param property - the property
|
|
560
|
+
* @param key - the input's element data key
|
|
561
|
+
* @param points - the points
|
|
562
|
+
*/
|
|
563
|
+
function emitContinuous(e, target, selectors, property, key, points) {
|
|
564
|
+
if (points.length === 0) {
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
const lit = String;
|
|
568
|
+
const push = (test, style) => {
|
|
569
|
+
if (style === null) {
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
for (const sel of selectors) {
|
|
573
|
+
e.stylesheet.push({ selector: `${sel}${test}`, style });
|
|
574
|
+
}
|
|
575
|
+
};
|
|
576
|
+
const first = points[0];
|
|
577
|
+
const last = points.at(-1) ?? first;
|
|
578
|
+
push(`[${key} < ${lit(first.at)}]`, written(e, target, property, first.below));
|
|
579
|
+
for (let k = 0; k + 1 < points.length; k++) {
|
|
580
|
+
const a = points[k];
|
|
581
|
+
const b = points[k + 1];
|
|
582
|
+
const wa = written(e, target, property, a.above);
|
|
583
|
+
const wb = written(e, target, property, b.below);
|
|
584
|
+
if (wa === null || wb === null) {
|
|
585
|
+
continue;
|
|
586
|
+
}
|
|
587
|
+
const style = {};
|
|
588
|
+
for (const name of Object.keys(wa)) {
|
|
589
|
+
style[name] = `mapData(${key}, ${lit(a.at)}, ${lit(b.at)}, ${String(wa[name])}, ${String(wb[name])})`;
|
|
590
|
+
}
|
|
591
|
+
push(`[${key} > ${lit(a.at)}][${key} < ${lit(b.at)}]`, style);
|
|
592
|
+
}
|
|
593
|
+
push(`[${key} > ${lit(last.at)}]`, written(e, target, property, last.above));
|
|
594
|
+
for (const p of points) {
|
|
595
|
+
push(`[${key} = ${lit(p.at)}]`, written(e, target, property, p.value));
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
/**
|
|
599
|
+
* A mapping as its per-element values: what the rule gives each element, written ready for Cytoscape.js into element
|
|
600
|
+
* data and read with `data()`, scoped to the elements that have a value.
|
|
601
|
+
* @param e - the emit
|
|
602
|
+
* @param rule - the rule
|
|
603
|
+
* @param index - the rule's position
|
|
604
|
+
* @param selectors - the rule's selectors
|
|
605
|
+
* @param property - the property
|
|
606
|
+
*/
|
|
607
|
+
function emitValues(e, rule, index, selectors, property) {
|
|
608
|
+
const { target } = rule;
|
|
609
|
+
const n = e.data[target].length;
|
|
610
|
+
const src = refSource(target, n, e.extracted.columns[target], e.extracted.features[target]);
|
|
611
|
+
const mapping = new Map(Object.entries(rule.map ?? {})).get(property);
|
|
612
|
+
const only = { ...rule, where: { all: true }, set: undefined, map: { [property]: mapping } };
|
|
613
|
+
const values = resolveRules([only], target, property, src);
|
|
614
|
+
const names = new Map();
|
|
615
|
+
for (let i = 0; i < n; i++) {
|
|
616
|
+
const v = values[i];
|
|
617
|
+
if (v === null) {
|
|
618
|
+
continue;
|
|
619
|
+
}
|
|
620
|
+
const w = written(e, target, property, v);
|
|
621
|
+
if (w === null) {
|
|
622
|
+
continue;
|
|
623
|
+
}
|
|
624
|
+
for (const [name, x] of Object.entries(w)) {
|
|
625
|
+
let col = names.get(name);
|
|
626
|
+
if (col === undefined) {
|
|
627
|
+
col = new Array(n).fill(null);
|
|
628
|
+
names.set(name, col);
|
|
629
|
+
}
|
|
630
|
+
col[i] = x;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
for (const [name, col] of names) {
|
|
634
|
+
const { key } = flatKey(e, target, `emit.value.${String(index)}.${name}`);
|
|
635
|
+
writeColumn(e, target, key, col);
|
|
636
|
+
for (const sel of selectors) {
|
|
637
|
+
e.stylesheet.push({ selector: `${sel}[${key}]`, style: { [name]: `data(${key})` } });
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Writes neutral styles as a Cytoscape.js stylesheet, the element data it reads and the bypasses that make it exact.
|
|
643
|
+
* @param extracted - the styles
|
|
644
|
+
* @param options - the import id that scopes the stylesheet
|
|
645
|
+
* @returns the stylesheet, the element data, the bypasses and the notes of what could not be written
|
|
646
|
+
* @category Styles
|
|
647
|
+
*/
|
|
648
|
+
export function toCytoscapeStylesheet(extracted, options = {}) {
|
|
649
|
+
const notes = new StyleNotes();
|
|
650
|
+
const importId = options.importId?.replaceAll(/["'\\\n\r\u2028\u2029]/g, "_");
|
|
651
|
+
const { nodes } = extracted.fingerprint;
|
|
652
|
+
const { edges } = extracted.fingerprint;
|
|
653
|
+
const e = {
|
|
654
|
+
extracted,
|
|
655
|
+
notes,
|
|
656
|
+
scope: importId === undefined ? "" : `[${CYTOSCAPE_IMPORT_KEY} = "${importId}"]`,
|
|
657
|
+
stylesheet: [],
|
|
658
|
+
data: {
|
|
659
|
+
node: Array.from({ length: nodes }, () => ({})),
|
|
660
|
+
edge: Array.from({ length: edges }, () => ({})),
|
|
661
|
+
},
|
|
662
|
+
keys: { node: new Map(), edge: new Map() },
|
|
663
|
+
// a flat key never takes the name of a data field the elements already hold
|
|
664
|
+
used: {
|
|
665
|
+
node: new Set([CYTOSCAPE_IMPORT_KEY, ...dataNames(extracted, "node")]),
|
|
666
|
+
edge: new Set([CYTOSCAPE_IMPORT_KEY, ...dataNames(extracted, "edge")]),
|
|
667
|
+
},
|
|
668
|
+
};
|
|
669
|
+
if (importId !== undefined) {
|
|
670
|
+
for (const rows of [e.data.node, e.data.edge]) {
|
|
671
|
+
for (const row of rows) {
|
|
672
|
+
row[CYTOSCAPE_IMPORT_KEY] = importId;
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
// Cytoscape.js draws its own defaults: the rules that state them are not written again
|
|
677
|
+
const rules = extracted.styles.source.tool === "cytoscape-js"
|
|
678
|
+
? extracted.styles.rules.filter((r) => r.origin !== "tool")
|
|
679
|
+
: extracted.styles.rules;
|
|
680
|
+
rules.forEach((rule, k) => {
|
|
681
|
+
if (rule.role !== "exceptions") {
|
|
682
|
+
emitRule(e, rule, k);
|
|
683
|
+
}
|
|
684
|
+
});
|
|
685
|
+
const bypass = exactness(e, rules);
|
|
686
|
+
for (const sel of e.stylesheet) {
|
|
687
|
+
if (parseCyjsSelector(sel.selector).invalid) {
|
|
688
|
+
notes.add(STYLE_ISSUE.NOT_WRITTEN, null, "selector", { sample: sel.selector });
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
const rows = (list) => list.map((r) => (Object.keys(r).length > 0 ? r : null));
|
|
692
|
+
return {
|
|
693
|
+
stylesheet: e.stylesheet,
|
|
694
|
+
elementData: { node: rows(e.data.node), edge: rows(e.data.edge) },
|
|
695
|
+
bypass,
|
|
696
|
+
notes: notes.list(),
|
|
697
|
+
};
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Applies the stylesheet to the element data with graph-io's Cytoscape.js engine and gives every element whose drawn
|
|
701
|
+
* value differs from the styles a bypass with the right value.
|
|
702
|
+
* @param e - the emit
|
|
703
|
+
* @param rules - the rules written (Cytoscape.js's own defaults left out)
|
|
704
|
+
* @returns the bypasses
|
|
705
|
+
*/
|
|
706
|
+
function exactness(e, rules) {
|
|
707
|
+
const { extracted } = e;
|
|
708
|
+
const nodes = e.data.node.length;
|
|
709
|
+
const elements = [];
|
|
710
|
+
for (let i = 0; i < nodes; i++) {
|
|
711
|
+
elements.push({
|
|
712
|
+
group: "nodes",
|
|
713
|
+
data: { ...dataColumns(extracted, "node", i), ...e.data.node[i], id: `n${String(i)}` },
|
|
714
|
+
});
|
|
715
|
+
}
|
|
716
|
+
// the edges join two nodes (no loops: Cytoscape.js draws a loop curved whatever the stylesheet says)
|
|
717
|
+
const far = nodes > 1 ? "n1" : "n0";
|
|
718
|
+
for (let i = 0; i < e.data.edge.length && nodes > 0; i++) {
|
|
719
|
+
elements.push({
|
|
720
|
+
group: "edges",
|
|
721
|
+
data: {
|
|
722
|
+
...dataColumns(extracted, "edge", i),
|
|
723
|
+
...e.data.edge[i],
|
|
724
|
+
id: `e${String(i)}`,
|
|
725
|
+
source: "n0",
|
|
726
|
+
target: far,
|
|
727
|
+
},
|
|
728
|
+
});
|
|
729
|
+
}
|
|
730
|
+
const drawn = evaluateCytoscapeJs({ elements, style: e.stylesheet, toolDefaults: false });
|
|
731
|
+
const out = {
|
|
732
|
+
node: [],
|
|
733
|
+
edge: [],
|
|
734
|
+
};
|
|
735
|
+
for (const target of ["node", "edge"]) {
|
|
736
|
+
const n = e.data[target].length;
|
|
737
|
+
const src = refSource(target, n, extracted.columns[target], extracted.features[target]);
|
|
738
|
+
const rows = new Array(n).fill(null);
|
|
739
|
+
for (const property of STYLE_PROPERTIES[target].keys()) {
|
|
740
|
+
const want = resolveRules(rules, target, property, src);
|
|
741
|
+
addBypasses(rows, target, property, want, drawn[target].values[property]);
|
|
742
|
+
}
|
|
743
|
+
out[target] = rows;
|
|
744
|
+
}
|
|
745
|
+
return out;
|
|
746
|
+
}
|
|
747
|
+
/**
|
|
748
|
+
* A bypass of one property for every element whose drawn value differs from the styles' and that Cytoscape.js can
|
|
749
|
+
* hold exactly.
|
|
750
|
+
* @param rows - the bypasses, changed in place
|
|
751
|
+
* @param target - nodes or edges
|
|
752
|
+
* @param property - the property
|
|
753
|
+
* @param want - the styles' values
|
|
754
|
+
* @param got - what is drawn, or undefined for nothing
|
|
755
|
+
*/
|
|
756
|
+
function addBypasses(rows, target, property, want, got) {
|
|
757
|
+
for (let i = 0; i < rows.length; i++) {
|
|
758
|
+
const w = want[i];
|
|
759
|
+
const conv = w === null || (got?.[i] ?? null) === w ? null : toCyjs(target, property, w);
|
|
760
|
+
if (conv !== null && !conv.approximate) {
|
|
761
|
+
rows[i] = { ...rows[i], ...conv.props };
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
/**
|
|
766
|
+
* The names of the data columns among the styles' features.
|
|
767
|
+
* @param extracted - the styles
|
|
768
|
+
* @param target - nodes or edges
|
|
769
|
+
* @returns the names
|
|
770
|
+
*/
|
|
771
|
+
function dataNames(extracted, target) {
|
|
772
|
+
return extracted.features[target].flatMap((f) => ("data" in f.ref ? [f.ref.data] : []));
|
|
773
|
+
}
|
|
774
|
+
/**
|
|
775
|
+
* An element's data columns from the styles' features: what a consumer writes into element data from the graph.
|
|
776
|
+
* @param extracted - the styles
|
|
777
|
+
* @param target - nodes or edges
|
|
778
|
+
* @param i - the element
|
|
779
|
+
* @returns the data fields
|
|
780
|
+
*/
|
|
781
|
+
function dataColumns(extracted, target, i) {
|
|
782
|
+
const out = Object.create(null);
|
|
783
|
+
for (const f of extracted.features[target]) {
|
|
784
|
+
if ("data" in f.ref && f.values[i] !== null) {
|
|
785
|
+
out[f.ref.data] = f.values[i];
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
return out;
|
|
789
|
+
}
|
|
790
|
+
//# sourceMappingURL=emit.js.map
|