@graphty/graph-io 0.3.48 → 0.3.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{approximations-C2riR4NT.js → approximations-Bzn3L-je.js} +2 -2
- package/dist/chunks/{approximations-C2riR4NT.js.map → approximations-Bzn3L-je.js.map} +1 -1
- package/dist/chunks/bends-BGXjv_U4.js +129 -0
- package/dist/chunks/bends-BGXjv_U4.js.map +1 -0
- package/dist/chunks/{block-Cu22ewuS.js → block-iptrlMBb.js} +906 -164
- package/dist/chunks/block-iptrlMBb.js.map +1 -0
- package/dist/chunks/choose-CczZJaX_.js +717 -0
- package/dist/chunks/choose-CczZJaX_.js.map +1 -0
- package/dist/chunks/{codes-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-C3p0RQxR.js} +5 -4
- package/dist/chunks/{context-cgmmOxZ2.js.map → context-C3p0RQxR.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-DXHx7nwR.js} +16 -14
- package/dist/chunks/credentials-DXHx7nwR.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-DLA5kINx.js} +7 -2
- package/dist/chunks/descriptor-DLA5kINx.js.map +1 -0
- package/dist/chunks/{emit-CD8xnY8s.js → emit-BwHQkZle.js} +1660 -133
- package/dist/chunks/emit-BwHQkZle.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-Dcw7Ldtq.js → exporter-BP6otMO6.js} +6 -6
- package/dist/chunks/{exporter-Dcw7Ldtq.js.map → exporter-BP6otMO6.js.map} +1 -1
- package/dist/chunks/{exporter-bxxjOrDZ.js → exporter-D2CETOMK.js} +1222 -156
- package/dist/chunks/exporter-D2CETOMK.js.map +1 -0
- package/dist/chunks/{exporter-BIdaoIgh.js → exporter-D9yMtocA.js} +7 -7
- package/dist/chunks/{exporter-BIdaoIgh.js.map → exporter-D9yMtocA.js.map} +1 -1
- package/dist/chunks/{exporter-DtVU80Fa.js → exporter-_jrBTnos.js} +9 -8
- package/dist/chunks/{exporter-DtVU80Fa.js.map → exporter-_jrBTnos.js.map} +1 -1
- package/dist/chunks/{exporter-ChjL5fmP.js → exporter-nDfxIK5D.js} +9 -8
- package/dist/chunks/{exporter-ChjL5fmP.js.map → exporter-nDfxIK5D.js.map} +1 -1
- package/dist/chunks/format-BXiAb-1h.js +408 -0
- package/dist/chunks/format-BXiAb-1h.js.map +1 -0
- package/dist/chunks/{generic-CP6YD34u.js → generic-ymWCETAJ.js} +387 -31
- package/dist/chunks/generic-ymWCETAJ.js.map +1 -0
- package/dist/chunks/{importer-e3huMZbm.js → importer-B92x1xY5.js} +14 -10
- package/dist/chunks/importer-B92x1xY5.js.map +1 -0
- package/dist/chunks/{importer-B87_fmVx.js → importer-CT9mJ1nn.js} +326 -84
- package/dist/chunks/importer-CT9mJ1nn.js.map +1 -0
- package/dist/chunks/{importer-CB_zV5_L.js → importer-DaLTjbds.js} +116 -1102
- package/dist/chunks/importer-DaLTjbds.js.map +1 -0
- package/dist/chunks/{importer-DPZDN40-.js → importer-GREKMdIf.js} +25 -17
- package/dist/chunks/importer-GREKMdIf.js.map +1 -0
- package/dist/chunks/{importer-Bji2MeWr.js → importer-PqaaKKnY.js} +13 -10
- package/dist/chunks/{importer-Bji2MeWr.js.map → importer-PqaaKKnY.js.map} +1 -1
- package/dist/chunks/{importer-Cyy6UseH.js → importer-Vn5QvmmJ.js} +66 -13
- package/dist/chunks/importer-Vn5QvmmJ.js.map +1 -0
- package/dist/chunks/{importer-CVT-JyDE.js → importer-vRq4h3j5.js} +1469 -356
- package/dist/chunks/importer-vRq4h3j5.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-Clf4QIyl.js} +282 -74
- package/dist/chunks/lexicon-Clf4QIyl.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-Zm3_ivgq.js +79 -0
- package/dist/chunks/round-trip-Zm3_ivgq.js.map +1 -0
- package/dist/chunks/{sigv4-LkAzsLAu.js → sigv4-EokFic1V.js} +5 -5
- package/dist/chunks/sigv4-EokFic1V.js.map +1 -0
- package/dist/chunks/{styles-CaABMoO1.js → styles-CCs214_3.js} +1237 -138
- package/dist/chunks/styles-CCs214_3.js.map +1 -0
- package/dist/chunks/styles-Cm62yyQX.js +2812 -0
- package/dist/chunks/styles-Cm62yyQX.js.map +1 -0
- package/dist/chunks/styles-DPQQIig4.js +1928 -0
- package/dist/chunks/styles-DPQQIig4.js.map +1 -0
- package/dist/chunks/{styles-yed-Cs1nmrjn.js → styles-yed-UMFdNqze.js} +503 -172
- package/dist/chunks/styles-yed-UMFdNqze.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 +5 -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 +847 -193
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +232 -220
- package/dist/graph-io.js.map +1 -1
- package/dist/graphml.js +3 -3
- package/dist/json.js +3 -2
- package/dist/neo4j.js +6 -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 +138 -23
- package/dist/sources-cypher.js.map +1 -1
- package/dist/sources-ndex.js +2 -2
- package/dist/sources-rest.js +16 -6
- package/dist/sources-rest.js.map +1 -1
- package/dist/sources-sparql.d.ts +1 -0
- package/dist/sources-sparql.js +405 -0
- package/dist/sources-sparql.js.map +1 -0
- package/dist/src/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/importer.d.ts.map +1 -1
- package/dist/src/formats/dot/importer.js +108 -31
- package/dist/src/formats/dot/importer.js.map +1 -1
- package/dist/src/formats/dot/label-places.d.ts +34 -0
- package/dist/src/formats/dot/label-places.d.ts.map +1 -0
- package/dist/src/formats/dot/label-places.js +179 -0
- package/dist/src/formats/dot/label-places.js.map +1 -0
- package/dist/src/formats/dot/record.d.ts +50 -0
- package/dist/src/formats/dot/record.d.ts.map +1 -0
- package/dist/src/formats/dot/record.js +275 -0
- package/dist/src/formats/dot/record.js.map +1 -0
- package/dist/src/formats/dot/styles.d.ts +62 -2
- package/dist/src/formats/dot/styles.d.ts.map +1 -1
- package/dist/src/formats/dot/styles.js +1454 -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 +753 -101
- 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 +692 -161
- package/dist/src/formats/graphml/styles-yed.js.map +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.js +429 -64
- package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
- package/dist/src/formats/graphml/yfiles.d.ts +3 -3
- package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
- package/dist/src/formats/graphml/yfiles.js +16 -6
- package/dist/src/formats/graphml/yfiles.js.map +1 -1
- package/dist/src/formats/json/dialect.d.ts +3 -2
- package/dist/src/formats/json/dialect.d.ts.map +1 -1
- package/dist/src/formats/json/dialect.js +39 -5
- package/dist/src/formats/json/dialect.js.map +1 -1
- package/dist/src/formats/json/importer.d.ts +13 -2
- package/dist/src/formats/json/importer.d.ts.map +1 -1
- package/dist/src/formats/json/importer.js +42 -6
- package/dist/src/formats/json/importer.js.map +1 -1
- package/dist/src/formats/json/index.d.ts +1 -1
- package/dist/src/formats/json/index.d.ts.map +1 -1
- package/dist/src/formats/json/index.js +1 -1
- package/dist/src/formats/json/index.js.map +1 -1
- package/dist/src/formats/json/positions.d.ts +5 -2
- package/dist/src/formats/json/positions.d.ts.map +1 -1
- package/dist/src/formats/json/positions.js +20 -4
- package/dist/src/formats/json/positions.js.map +1 -1
- package/dist/src/formats/json/styles.d.ts +12 -1
- package/dist/src/formats/json/styles.d.ts.map +1 -1
- package/dist/src/formats/json/styles.js +1755 -136
- package/dist/src/formats/json/styles.js.map +1 -1
- package/dist/src/formats/pajek/draw.d.ts +96 -0
- package/dist/src/formats/pajek/draw.d.ts.map +1 -0
- package/dist/src/formats/pajek/draw.js +372 -0
- package/dist/src/formats/pajek/draw.js.map +1 -0
- package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
- package/dist/src/formats/pajek/exporter.js +70 -51
- package/dist/src/formats/pajek/exporter.js.map +1 -1
- package/dist/src/formats/pajek/importer.d.ts +9 -0
- package/dist/src/formats/pajek/importer.d.ts.map +1 -1
- package/dist/src/formats/pajek/importer.js +233 -102
- package/dist/src/formats/pajek/importer.js.map +1 -1
- package/dist/src/formats/pajek/index.d.ts +1 -0
- package/dist/src/formats/pajek/index.d.ts.map +1 -1
- package/dist/src/formats/pajek/index.js.map +1 -1
- package/dist/src/formats/pajek/styles.d.ts +15 -7
- package/dist/src/formats/pajek/styles.d.ts.map +1 -1
- package/dist/src/formats/pajek/styles.js +1278 -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 +4 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -3
- 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/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 +124 -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 +5 -0
- package/dist/src/sources/rest/descriptor.js.map +1 -1
- package/dist/src/sources/rest/source.d.ts.map +1 -1
- package/dist/src/sources/rest/source.js +15 -0
- package/dist/src/sources/rest/source.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 +314 -0
- package/dist/src/sources/sparql/index.js.map +1 -0
- package/dist/src/sources/sparql/ntriples.d.ts +69 -0
- package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
- package/dist/src/sources/sparql/ntriples.js +180 -0
- package/dist/src/sources/sparql/ntriples.js.map +1 -0
- package/dist/src/sources/sparql/params.d.ts +27 -0
- package/dist/src/sources/sparql/params.d.ts.map +1 -0
- package/dist/src/sources/sparql/params.js +5 -0
- package/dist/src/sources/sparql/params.js.map +1 -0
- package/dist/src/sources/sparql/query.d.ts +72 -0
- package/dist/src/sources/sparql/query.d.ts.map +1 -0
- package/dist/src/sources/sparql/query.js +113 -0
- package/dist/src/sources/sparql/query.js.map +1 -0
- package/dist/src/sources/types.d.ts +31 -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 +81 -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 +1015 -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 +3 -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 +202 -9
- 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 +461 -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 +622 -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 +203 -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/importer.ts +120 -35
- package/src/formats/dot/label-places.ts +228 -0
- package/src/formats/dot/record.ts +336 -0
- package/src/formats/dot/styles.ts +1654 -153
- 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 +851 -109
- package/src/formats/graphml/styles-plain.ts +6 -15
- package/src/formats/graphml/styles-yed.ts +762 -173
- package/src/formats/graphml/styles-yfiles3.ts +485 -63
- package/src/formats/graphml/yfiles.ts +19 -6
- package/src/formats/json/dialect.ts +41 -5
- package/src/formats/json/importer.ts +59 -7
- package/src/formats/json/index.ts +1 -0
- package/src/formats/json/positions.ts +22 -5
- package/src/formats/json/styles.ts +2041 -185
- package/src/formats/pajek/draw.ts +458 -0
- package/src/formats/pajek/exporter.ts +81 -49
- package/src/formats/pajek/importer.ts +278 -103
- package/src/formats/pajek/index.ts +1 -0
- package/src/formats/pajek/styles.ts +1381 -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 +5 -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/cypher/descriptor.ts +7 -1
- package/src/sources/cypher/index.ts +148 -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 +5 -0
- package/src/sources/rest/source.ts +16 -0
- package/src/sources/sigv4.ts +6 -4
- package/src/sources/sparql/descriptor.ts +67 -0
- package/src/sources/sparql/index.ts +356 -0
- package/src/sources/sparql/ntriples.ts +219 -0
- package/src/sources/sparql/params.ts +28 -0
- package/src/sources/sparql/query.ts +162 -0
- package/src/sources/types.ts +35 -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 +98 -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 +1160 -84
- package/src/styles/cyjs/defaults-table.ts +3 -0
- package/src/styles/cyjs/emit.ts +233 -13
- package/src/styles/cyjs/face.ts +372 -0
- package/src/styles/cyjs/mappers.ts +492 -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 +633 -5
- package/src/styles/vocabulary.ts +211 -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
|
@@ -15,16 +15,27 @@
|
|
|
15
15
|
* property to its Cytoscape.js default, whatever the rules beneath say.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
+
import { canonColor } from "../canon/color.js";
|
|
18
19
|
import { CSS_COLORS } from "../canon/color-tables.js";
|
|
19
20
|
import { canonEnum } from "../canon/enums.js";
|
|
20
21
|
import { num6 } from "../canon/number.js";
|
|
21
22
|
import type { CanonSite } from "../canon/site.js";
|
|
22
23
|
import { STYLE_ISSUE } from "../codes.js";
|
|
23
24
|
import type { StyleTarget, StyleValue } from "../types.js";
|
|
25
|
+
import { CYJS_FACE_PROPERTIES } from "./face.js";
|
|
24
26
|
|
|
25
27
|
/** How Cytoscape.js types a property's value. */
|
|
26
28
|
export type CyjsValueType =
|
|
27
|
-
|
|
29
|
+
| "color"
|
|
30
|
+
| "zeroOne"
|
|
31
|
+
| "size"
|
|
32
|
+
| "signedSize"
|
|
33
|
+
| "nodeSize"
|
|
34
|
+
| "positive"
|
|
35
|
+
| "text"
|
|
36
|
+
| "fontFamily"
|
|
37
|
+
| "fontWeight"
|
|
38
|
+
| "enum";
|
|
28
39
|
|
|
29
40
|
/** One property graph-io carries: the neutral property it sets (or a part it combines) and how it is parsed. */
|
|
30
41
|
export interface CyjsPropertySpec {
|
|
@@ -109,7 +120,8 @@ const FONT_WEIGHTS: readonly (string | number)[] = [
|
|
|
109
120
|
800,
|
|
110
121
|
900,
|
|
111
122
|
];
|
|
112
|
-
|
|
123
|
+
/** Cytoscape.js's curve styles. */
|
|
124
|
+
export const CYJS_CURVE_STYLES = [
|
|
113
125
|
"bezier",
|
|
114
126
|
"unbundled-bezier",
|
|
115
127
|
"haystack",
|
|
@@ -141,19 +153,318 @@ const LABEL: [string, CyjsPropertySpec][] = [
|
|
|
141
153
|
["visibility", { property: "_visibility", type: "enum", enums: ["hidden", "visible"] }],
|
|
142
154
|
["display", { property: "_display", type: "enum", enums: ["element", "none"] }],
|
|
143
155
|
["opacity", { property: "opacity", type: "zeroOne" }],
|
|
156
|
+
["text-transform", { property: "_transform", type: "enum", enums: ["none", "uppercase", "lowercase"] }],
|
|
157
|
+
["text-wrap", { property: "_wrap", type: "enum", enums: ["none", "wrap", "ellipsis"] }],
|
|
158
|
+
["text-overflow-wrap", { property: "_overflowWrap", type: "enum", enums: ["whitespace", "anywhere"] }],
|
|
159
|
+
// how the lines line up; `auto` follows the horizontal alignment (`combineLabelText`)
|
|
160
|
+
["text-justification", { property: "_justification", type: "enum", enums: ["auto", "left", "center", "right"] }],
|
|
161
|
+
// a width only `text-wrap: wrap` wraps at, so it is combined with the wrap afterward (`combineParts`)
|
|
162
|
+
["text-max-width", { property: "_maxWidth", type: "size" }],
|
|
163
|
+
// the outline and the background box draw only with a width and an opacity (`combineLabelDress`)
|
|
164
|
+
["text-outline-color", { property: "_outlineColor", type: "color" }],
|
|
165
|
+
["text-outline-width", { property: "_outlineWidth", type: "size" }],
|
|
166
|
+
["text-outline-opacity", { property: "_outlineOpacity", type: "zeroOne" }],
|
|
167
|
+
["text-background-color", { property: "_backgroundColor", type: "color" }],
|
|
168
|
+
["text-background-opacity", { property: "_backgroundOpacity", type: "zeroOne" }],
|
|
169
|
+
["text-background-padding", { property: "_backgroundPadding", type: "size" }],
|
|
170
|
+
[
|
|
171
|
+
"text-background-shape",
|
|
172
|
+
{
|
|
173
|
+
property: "_backgroundShape",
|
|
174
|
+
type: "enum",
|
|
175
|
+
enums: ["rectangle", "round-rectangle", "roundrectangle", "circle"],
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
["text-rotation", { property: "_rotation", type: "text" }],
|
|
179
|
+
// the words' own opacity, drawn times the element's (`combineLabelOpacity`)
|
|
180
|
+
["text-opacity", { property: "_textOpacity", type: "zeroOne" }],
|
|
181
|
+
// the label moved right and down by this many pixels from where its alignment puts it, a node's and an edge's
|
|
182
|
+
["text-margin-x", { property: "labelOffsetX", type: "signedSize" }],
|
|
183
|
+
["text-margin-y", { property: "labelOffsetY", type: "signedSize" }],
|
|
184
|
+
// the line round the label's box draws only with a width and an opacity above 0 (`combineLabelDress`)
|
|
185
|
+
["text-border-color", { property: "_textBorderColor", type: "color" }],
|
|
186
|
+
["text-border-width", { property: "_textBorderWidth", type: "size" }],
|
|
187
|
+
["text-border-opacity", { property: "_textBorderOpacity", type: "zeroOne" }],
|
|
188
|
+
[
|
|
189
|
+
"text-border-style",
|
|
190
|
+
{ property: "_textBorderStyle", type: "enum", enums: ["solid", "dotted", "dashed", "double"] },
|
|
191
|
+
],
|
|
144
192
|
];
|
|
145
193
|
|
|
194
|
+
/** Cytoscape.js's `background-gradient-direction` values. */
|
|
195
|
+
const GRADIENT_DIRECTIONS = [
|
|
196
|
+
"to-bottom",
|
|
197
|
+
"to-top",
|
|
198
|
+
"to-left",
|
|
199
|
+
"to-right",
|
|
200
|
+
"to-bottom-right",
|
|
201
|
+
"to-bottom-left",
|
|
202
|
+
"to-top-right",
|
|
203
|
+
"to-top-left",
|
|
204
|
+
"to-right-bottom",
|
|
205
|
+
"to-left-bottom",
|
|
206
|
+
"to-right-top",
|
|
207
|
+
"to-left-top",
|
|
208
|
+
];
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* The pixels of one `em`: Cytoscape.js reads it as its container's font size (`getEmSizeInPixels`, cytoscape.js
|
|
212
|
+
* 3.34.3 dist/cytoscape.cjs.js line 16896), 16 in a page that leaves the font size at the browser's default.
|
|
213
|
+
*/
|
|
214
|
+
const EM_PX = 16;
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Cytoscape.js's `shape-polygon-points` (`x y` pairs, y down, commas or spaces between) as neutral `shapePoints`.
|
|
218
|
+
* @param text - the points
|
|
219
|
+
* @returns `x,y` pairs with y up, or null when they are not pairs of numbers
|
|
220
|
+
*/
|
|
221
|
+
function cyjsPointsToNeutral(text: string): string | null {
|
|
222
|
+
const n = text
|
|
223
|
+
.trim()
|
|
224
|
+
.split(/[\s,]+/)
|
|
225
|
+
.map(Number);
|
|
226
|
+
if (n.length < 6 || n.length % 2 !== 0 || !n.every((v) => Number.isFinite(v))) {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
const pairs: string[] = [];
|
|
230
|
+
for (let i = 0; i < n.length; i += 2) {
|
|
231
|
+
pairs.push(`${String(round6(n[i]))},${String(round6(-n[i + 1]))}`);
|
|
232
|
+
}
|
|
233
|
+
return pairs.join(" ");
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Neutral `shapePoints` as Cytoscape.js's `shape-polygon-points`.
|
|
238
|
+
* @param points - `x,y` pairs with y up
|
|
239
|
+
* @returns `x y` pairs with y down, or null when they are not pairs of numbers
|
|
240
|
+
*/
|
|
241
|
+
export function neutralPointsToCyjs(points: string): string | null {
|
|
242
|
+
const n = points
|
|
243
|
+
.trim()
|
|
244
|
+
.split(/[\s,]+/)
|
|
245
|
+
.map(Number);
|
|
246
|
+
if (n.length < 6 || n.length % 2 !== 0 || !n.every((v) => Number.isFinite(v))) {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
const pairs: string[] = [];
|
|
250
|
+
for (let i = 0; i < n.length; i += 2) {
|
|
251
|
+
pairs.push(`${String(round6(n[i]))} ${String(round6(-n[i + 1]))}`);
|
|
252
|
+
}
|
|
253
|
+
return pairs.join(" ");
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* A coordinate to six decimals, with no negative zero.
|
|
258
|
+
* @param v - the coordinate
|
|
259
|
+
* @returns it rounded
|
|
260
|
+
*/
|
|
261
|
+
const round6 = (v: number): number => Math.round(v * 1e6) / 1e6 + 0;
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Cytoscape.js's corners of a heptagon fitted to its box (`generateUnitNgonPointsFitToSquare(7, 0)`): a regular
|
|
265
|
+
* heptagon with a corner up, stretched until it fills the box both ways.
|
|
266
|
+
* @returns the corners as `x,y` fractions of the half width and half height, y up
|
|
267
|
+
*/
|
|
268
|
+
function fittedHeptagon(): string {
|
|
269
|
+
const corners = Array.from({ length: 7 }, (_, i): [number, number] => {
|
|
270
|
+
const angle = Math.PI / 2 + (2 * Math.PI * i) / 7;
|
|
271
|
+
return [Math.cos(angle), Math.sin(angle)];
|
|
272
|
+
});
|
|
273
|
+
const [x0, x1] = [Math.min(...corners.map(([x]) => x)), Math.max(...corners.map(([x]) => x))];
|
|
274
|
+
const [y0, y1] = [Math.min(...corners.map(([, y]) => y)), Math.max(...corners.map(([, y]) => y))];
|
|
275
|
+
return corners
|
|
276
|
+
.map(([x, y]) => `${round6((2 * (x - x0)) / (x1 - x0) - 1)},${round6((2 * (y - y0)) / (y1 - y0) - 1)}`)
|
|
277
|
+
.join(" ");
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* The Cytoscape.js node shapes no neutral shape names, with the corners Cytoscape.js draws each at (cytoscape.js
|
|
282
|
+
* 3.34.3 dist/cytoscape.cjs.js lines 27976-28008); the round ones are `other:round-polygon` over the same corners.
|
|
283
|
+
*/
|
|
284
|
+
const CYJS_POLYGON_SHAPES: ReadonlyMap<string, string> = new Map([
|
|
285
|
+
["heptagon", fittedHeptagon()],
|
|
286
|
+
["round-heptagon", fittedHeptagon()],
|
|
287
|
+
["tag", "-1,-1 0.25,-1 1,0 0.25,1 -1,1"],
|
|
288
|
+
["round-tag", "-1,-1 0.25,-1 1,0 0.25,1 -1,1"],
|
|
289
|
+
]);
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Cytoscape.js's polygons drawn with rounded corners (`corner-radius`, by default a tenth of the shorter side),
|
|
293
|
+
* kept as their own `other:` shapes rather than read as their sharp twins.
|
|
294
|
+
*/
|
|
295
|
+
const CYJS_ROUND_SHAPES: ReadonlySet<string> = new Set([
|
|
296
|
+
"round-triangle",
|
|
297
|
+
"round-diamond",
|
|
298
|
+
"round-pentagon",
|
|
299
|
+
"round-hexagon",
|
|
300
|
+
"round-octagon",
|
|
301
|
+
]);
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Draws every Cytoscape.js shape no neutral shape names (`other:heptagon`, `other:tag`) as the polygon Cytoscape.js
|
|
305
|
+
* builds for it: `polygon` with its corners in `shapePoints`.
|
|
306
|
+
* @param values - node values (per element, or a rule's constants), changed in place
|
|
307
|
+
*/
|
|
308
|
+
export function cyjsPolygonShapes(values: Record<string, unknown>): void {
|
|
309
|
+
const { shape } = values;
|
|
310
|
+
const pointsOf = (v: unknown): string | undefined =>
|
|
311
|
+
typeof v === "string" && v.startsWith("other:") ? CYJS_POLYGON_SHAPES.get(v.slice("other:".length)) : undefined;
|
|
312
|
+
if (Array.isArray(shape)) {
|
|
313
|
+
const col = shape as (StyleValue | null)[];
|
|
314
|
+
if (!col.some((v) => pointsOf(v) !== undefined)) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
const points = Array.isArray(values.shapePoints)
|
|
318
|
+
? [...(values.shapePoints as (StyleValue | null)[])]
|
|
319
|
+
: new Array<StyleValue | null>(col.length).fill(null);
|
|
320
|
+
values.shape = col.map((v, i) => {
|
|
321
|
+
const p = pointsOf(v);
|
|
322
|
+
if (p === undefined) {
|
|
323
|
+
return v;
|
|
324
|
+
}
|
|
325
|
+
points[i] = p;
|
|
326
|
+
return polygonOf(v);
|
|
327
|
+
});
|
|
328
|
+
values.shapePoints = points;
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
const p = pointsOf(shape);
|
|
332
|
+
if (p !== undefined) {
|
|
333
|
+
values.shape = polygonOf(shape);
|
|
334
|
+
values.shapePoints = p;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* The polygon a Cytoscape.js polygon shape is drawn as: `other:round-polygon` for its round ones.
|
|
340
|
+
* @param shape - the shape, `other:<Cytoscape.js name>`
|
|
341
|
+
* @returns the neutral shape
|
|
342
|
+
*/
|
|
343
|
+
function polygonOf(shape: unknown): string {
|
|
344
|
+
return typeof shape === "string" && shape.startsWith("other:round-") ? "other:round-polygon" : "polygon";
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/** How Cytoscape.js's `line-fill` paints a line, as the neutral gradient kind. */
|
|
348
|
+
const GRADIENT_KINDS: ReadonlyMap<string, string> = new Map([
|
|
349
|
+
["solid", "none"],
|
|
350
|
+
["linear-gradient", "linear"],
|
|
351
|
+
["radial-gradient", "radial"],
|
|
352
|
+
]);
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* A text split at its runs of whitespace that are not inside parentheses: `rgb(0, 0, 0) red` is two words. A run is
|
|
356
|
+
* inside when the next parenthesis after it closes one (as `/\s+(?![^(]*\))/` splits, in one pass).
|
|
357
|
+
* @param text - the text
|
|
358
|
+
* @returns the words
|
|
359
|
+
*/
|
|
360
|
+
function wordsOutsideParens(text: string): string[] {
|
|
361
|
+
// whether the next parenthesis at or after each offset is a `)`
|
|
362
|
+
const closes = new Array<boolean>(text.length + 1).fill(false);
|
|
363
|
+
for (let i = text.length - 1; i >= 0; i--) {
|
|
364
|
+
closes[i] = text[i] === ")" || (text[i] !== "(" && closes[i + 1]);
|
|
365
|
+
}
|
|
366
|
+
const words: string[] = [];
|
|
367
|
+
let start = 0;
|
|
368
|
+
let i = 0;
|
|
369
|
+
while (i < text.length) {
|
|
370
|
+
if (!/\s/.test(text[i])) {
|
|
371
|
+
i++;
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
let end = i + 1;
|
|
375
|
+
while (end < text.length && /\s/.test(text[end])) {
|
|
376
|
+
end++;
|
|
377
|
+
}
|
|
378
|
+
if (!closes[end]) {
|
|
379
|
+
words.push(text.slice(start, i));
|
|
380
|
+
start = end;
|
|
381
|
+
}
|
|
382
|
+
i = end;
|
|
383
|
+
}
|
|
384
|
+
words.push(text.slice(start));
|
|
385
|
+
return words;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* Cytoscape.js's `line-gradient-stop-colors` (colors separated by spaces) as `#rrggbb` colors separated by spaces.
|
|
390
|
+
* @param text - the value
|
|
391
|
+
* @param site - where it was read
|
|
392
|
+
* @returns the colors, or undefined when one does not parse (noted)
|
|
393
|
+
*/
|
|
394
|
+
function gradientColors(text: string, site: CanonSite): string | undefined {
|
|
395
|
+
const hexes: string[] = [];
|
|
396
|
+
for (const token of wordsOutsideParens(text.trim())) {
|
|
397
|
+
const c = token === "" ? null : canonColor(token, "css", site);
|
|
398
|
+
if (c === null) {
|
|
399
|
+
return undefined;
|
|
400
|
+
}
|
|
401
|
+
hexes.push(c.color);
|
|
402
|
+
}
|
|
403
|
+
return hexes.join(" ");
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Cytoscape.js's gradient stop colors (colors separated by spaces) as `#rrggbb` colors.
|
|
408
|
+
* @param text - the value
|
|
409
|
+
* @param site - where it was read
|
|
410
|
+
* @returns the colors, none when one does not parse (noted)
|
|
411
|
+
*/
|
|
412
|
+
export function gradientStopColors(text: string, site: CanonSite): string[] {
|
|
413
|
+
return gradientColors(text, site)?.split(" ") ?? [];
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* Cytoscape.js's `line-gradient-stop-positions` (percentages or fractions separated by spaces) as fractions.
|
|
418
|
+
* @param text - the value
|
|
419
|
+
* @returns the fractions separated by spaces, or undefined when one is not a number
|
|
420
|
+
*/
|
|
421
|
+
export function gradientStops(text: string): string | undefined {
|
|
422
|
+
const stops = text
|
|
423
|
+
.trim()
|
|
424
|
+
.split(/\s+/)
|
|
425
|
+
.map((t) => (t.endsWith("%") ? Number.parseFloat(t) / 100 : Number.parseFloat(t)));
|
|
426
|
+
return stops.every((n) => Number.isFinite(n)) ? stops.map((n) => num6(n)).join(" ") : undefined;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/** The lengths Cytoscape.js draws at half their value: a bundle's control point step, an outline's offset. */
|
|
430
|
+
const HALVED: ReadonlySet<string> = new Set(["fanSpacing", "outerBorderOffset"]);
|
|
431
|
+
|
|
146
432
|
/** The node properties graph-io carries, by Cytoscape.js name. */
|
|
147
433
|
export const CYJS_NODE_PROPERTIES: ReadonlyMap<string, CyjsPropertySpec> = new Map<string, CyjsPropertySpec>([
|
|
148
434
|
["background-color", { property: "fill", type: "color" }],
|
|
149
435
|
["background-opacity", { property: "fillOpacity", type: "zeroOne" }],
|
|
150
436
|
["border-color", { property: "borderColor", type: "color" }],
|
|
437
|
+
// the rings are drawn at their own opacity times the node's (`combineNodeOpacity`)
|
|
438
|
+
["border-opacity", { property: "_ringOpacity", type: "zeroOne" }],
|
|
151
439
|
["border-width", { property: "borderWidth", type: "size" }],
|
|
152
440
|
["border-style", { property: "borderStyle", type: "enum", enums: ["solid", "dotted", "dashed", "double"] }],
|
|
441
|
+
// the dashes a dashed border is drawn with and their ends, which decide how it looks (`combineDashes`)
|
|
442
|
+
["border-dash-pattern", { property: "_dashPattern", type: "text" }],
|
|
443
|
+
["border-cap", { property: "_dashCap", type: "enum", enums: ["butt", "round", "square"] }],
|
|
444
|
+
// where the border sits against the node's outline: across it, inside it or outside it
|
|
445
|
+
["border-position", { property: "borderPosition", type: "enum", enums: ["center", "inside", "outside"] }],
|
|
446
|
+
["outline-color", { property: "outerBorderColor", type: "color" }],
|
|
447
|
+
["outline-opacity", { property: "_outlineRingOpacity", type: "zeroOne" }],
|
|
448
|
+
["outline-width", { property: "outerBorderWidth", type: "size" }],
|
|
449
|
+
["outline-style", { property: "outerBorderStyle", type: "enum", enums: ["solid", "dotted", "dashed", "double"] }],
|
|
450
|
+
["outline-offset", { property: "outerBorderOffset", type: "size" }],
|
|
451
|
+
["underlay-color", { property: "underlayColor", type: "color" }],
|
|
452
|
+
["underlay-opacity", { property: "underlayOpacity", type: "zeroOne" }],
|
|
453
|
+
["underlay-padding", { property: "underlayPadding", type: "size" }],
|
|
454
|
+
["underlay-shape", { property: "underlayShape", type: "enum", enums: NODE_SHAPES }],
|
|
455
|
+
["underlay-corner-radius", { property: "underlayCornerRadius", type: "size" }],
|
|
456
|
+
["overlay-color", { property: "overlayColor", type: "color" }],
|
|
457
|
+
["overlay-opacity", { property: "overlayOpacity", type: "zeroOne" }],
|
|
458
|
+
["overlay-padding", { property: "overlayPadding", type: "size" }],
|
|
459
|
+
["overlay-shape", { property: "overlayShape", type: "enum", enums: NODE_SHAPES }],
|
|
460
|
+
["overlay-corner-radius", { property: "overlayCornerRadius", type: "size" }],
|
|
153
461
|
["shape", { property: "shape", type: "enum", enums: NODE_SHAPES }],
|
|
462
|
+
["shape-polygon-points", { property: "shapePoints", type: "text" }],
|
|
154
463
|
["corner-radius", { property: "cornerRadius", type: "size" }],
|
|
155
464
|
["width", { property: "width", type: "nodeSize" }],
|
|
156
465
|
["height", { property: "height", type: "nodeSize" }],
|
|
466
|
+
// a node is drawn this much larger on every side (`nodeSizes`)
|
|
467
|
+
["padding", { property: "_padding", type: "text" }],
|
|
157
468
|
[
|
|
158
469
|
"text-valign",
|
|
159
470
|
{ property: "_valign", type: "enum", enums: ["top", "top-inside", "center", "bottom", "bottom-inside"] },
|
|
@@ -162,6 +473,16 @@ export const CYJS_NODE_PROPERTIES: ReadonlyMap<string, CyjsPropertySpec> = new M
|
|
|
162
473
|
"text-halign",
|
|
163
474
|
{ property: "_halign", type: "enum", enums: ["left", "left-inside", "center", "right", "right-inside"] },
|
|
164
475
|
],
|
|
476
|
+
// the fill's gradient, combined afterward into `fill`, `fillGradient`, `fillGradientAngle` and the other
|
|
477
|
+
// `fillGradient*` properties
|
|
478
|
+
[
|
|
479
|
+
"background-fill",
|
|
480
|
+
{ property: "_backgroundFill", type: "enum", enums: ["solid", "linear-gradient", "radial-gradient"] },
|
|
481
|
+
],
|
|
482
|
+
["background-gradient-stop-colors", { property: "_backgroundStops", type: "text" }],
|
|
483
|
+
["background-gradient-stop-positions", { property: "_backgroundPositions", type: "text" }],
|
|
484
|
+
["background-gradient-direction", { property: "_backgroundDirection", type: "enum", enums: GRADIENT_DIRECTIONS }],
|
|
485
|
+
...CYJS_FACE_PROPERTIES,
|
|
165
486
|
...LABEL,
|
|
166
487
|
]);
|
|
167
488
|
|
|
@@ -170,16 +491,67 @@ export const CYJS_EDGE_PROPERTIES: ReadonlyMap<string, CyjsPropertySpec> = new M
|
|
|
170
491
|
["line-color", { property: "color", type: "color" }],
|
|
171
492
|
["width", { property: "width", type: "nodeSize" }],
|
|
172
493
|
["line-style", { property: "lineStyle", type: "enum", enums: ["solid", "dotted", "dashed"] }],
|
|
494
|
+
// the dashes a dashed line is drawn with and their ends, which decide how it looks (`combineDashes`)
|
|
495
|
+
["line-dash-pattern", { property: "_dashPattern", type: "text" }],
|
|
496
|
+
["line-cap", { property: "_dashCap", type: "enum", enums: ["butt", "round", "square"] }],
|
|
497
|
+
// the line's own opacity, combined afterward into `opacity`, which the line is drawn at
|
|
498
|
+
["line-opacity", { property: "_lineOpacity", type: "zeroOne" }],
|
|
499
|
+
["line-outline-width", { property: "outlineWidth", type: "size" }],
|
|
500
|
+
["line-fill", { property: "gradientKind", type: "enum", enums: ["solid", "linear-gradient", "radial-gradient"] }],
|
|
501
|
+
["line-gradient-stop-colors", { property: "gradientColors", type: "text" }],
|
|
502
|
+
["line-gradient-stop-positions", { property: "gradientStops", type: "text" }],
|
|
503
|
+
["line-outline-color", { property: "outlineColor", type: "color" }],
|
|
504
|
+
["underlay-color", { property: "underlayColor", type: "color" }],
|
|
505
|
+
["underlay-opacity", { property: "underlayOpacity", type: "zeroOne" }],
|
|
506
|
+
["underlay-padding", { property: "underlayPadding", type: "size" }],
|
|
507
|
+
["overlay-color", { property: "overlayColor", type: "color" }],
|
|
508
|
+
["overlay-opacity", { property: "overlayOpacity", type: "zeroOne" }],
|
|
509
|
+
["overlay-padding", { property: "overlayPadding", type: "size" }],
|
|
173
510
|
["target-arrow-shape", { property: "targetArrow", type: "enum", enums: ARROWS }],
|
|
174
511
|
["source-arrow-shape", { property: "sourceArrow", type: "enum", enums: ARROWS }],
|
|
175
512
|
["target-arrow-color", { property: "targetArrowColor", type: "color" }],
|
|
176
513
|
["source-arrow-color", { property: "sourceArrowColor", type: "color" }],
|
|
514
|
+
["mid-target-arrow-shape", { property: "midTargetArrow", type: "enum", enums: ARROWS }],
|
|
515
|
+
["mid-source-arrow-shape", { property: "midSourceArrow", type: "enum", enums: ARROWS }],
|
|
516
|
+
["mid-target-arrow-color", { property: "midTargetArrowColor", type: "color" }],
|
|
517
|
+
["mid-source-arrow-color", { property: "midSourceArrowColor", type: "color" }],
|
|
518
|
+
// filled or hollow: combined with the shape afterward (`combineParts`), a hollow triangle being `triangle-open`
|
|
177
519
|
["target-arrow-fill", { property: "_targetArrowFill", type: "enum", enums: ["filled", "hollow"] }],
|
|
178
520
|
["source-arrow-fill", { property: "_sourceArrowFill", type: "enum", enums: ["filled", "hollow"] }],
|
|
179
|
-
["
|
|
521
|
+
["mid-target-arrow-fill", { property: "_midTargetArrowFill", type: "enum", enums: ["filled", "hollow"] }],
|
|
522
|
+
["mid-source-arrow-fill", { property: "_midSourceArrowFill", type: "enum", enums: ["filled", "hollow"] }],
|
|
523
|
+
["curve-style", { property: "curved", type: "enum", enums: CYJS_CURVE_STYLES }],
|
|
524
|
+
// a route's settings, read by the routes (`edgeRoutes`) as Cytoscape.js spells them
|
|
525
|
+
["segment-distances", { property: "_segmentDistances", type: "text" }],
|
|
526
|
+
["segment-weights", { property: "_segmentWeights", type: "text" }],
|
|
527
|
+
["control-point-distances", { property: "_controlPointDistances", type: "text" }],
|
|
528
|
+
["control-point-weights", { property: "_controlPointWeights", type: "text" }],
|
|
529
|
+
["taxi-direction", { property: "_taxiDirection", type: "text" }],
|
|
530
|
+
["taxi-turn", { property: "_taxiTurn", type: "text" }],
|
|
531
|
+
["taxi-turn-min-distance", { property: "_taxiTurnMinDistance", type: "size" }],
|
|
532
|
+
["edge-distances", { property: "_edgeDistances", type: "text" }],
|
|
533
|
+
["loop-direction", { property: "_loopDirection", type: "text" }],
|
|
534
|
+
["loop-sweep", { property: "_loopSweep", type: "text" }],
|
|
535
|
+
["segment-radii", { property: "_segmentRadii", type: "text" }],
|
|
536
|
+
["taxi-radius", { property: "_taxiRadius", type: "text" }],
|
|
537
|
+
["radius-type", { property: "_radiusType", type: "text" }],
|
|
538
|
+
// where the ends meet the nodes, read with the routes (`edgePorts`)
|
|
539
|
+
["source-endpoint", { property: "_sourceEndpoint", type: "text" }],
|
|
540
|
+
["target-endpoint", { property: "_targetEndpoint", type: "text" }],
|
|
541
|
+
// a bundle's control points are this far apart, so the curves' middles half of it (see cyjsNeutral)
|
|
542
|
+
["control-point-step-size", { property: "fanSpacing", type: "size" }],
|
|
180
543
|
["arrow-scale", { property: "arrowSize", type: "positive" }],
|
|
181
544
|
["source-label", { property: "sourceLabel", type: "text" }],
|
|
182
545
|
["target-label", { property: "targetLabel", type: "text" }],
|
|
546
|
+
["source-text-offset", { property: "sourceLabelOffset", type: "size" }],
|
|
547
|
+
["target-text-offset", { property: "targetLabelOffset", type: "size" }],
|
|
548
|
+
["source-text-margin-x", { property: "sourceLabelOffsetX", type: "signedSize" }],
|
|
549
|
+
["source-text-margin-y", { property: "sourceLabelOffsetY", type: "signedSize" }],
|
|
550
|
+
["target-text-margin-x", { property: "targetLabelOffsetX", type: "signedSize" }],
|
|
551
|
+
["target-text-margin-y", { property: "targetLabelOffsetY", type: "signedSize" }],
|
|
552
|
+
// an angle, or autorotate along the line, which the routes work out (`autorotateLabels`)
|
|
553
|
+
["source-text-rotation", { property: "_sourceRotation", type: "text" }],
|
|
554
|
+
["target-text-rotation", { property: "_targetRotation", type: "text" }],
|
|
183
555
|
...LABEL,
|
|
184
556
|
]);
|
|
185
557
|
|
|
@@ -192,6 +564,33 @@ export function cyjsProperties(target: StyleTarget): ReadonlyMap<string, CyjsPro
|
|
|
192
564
|
return target === "node" ? CYJS_NODE_PROPERTIES : CYJS_EDGE_PROPERTIES;
|
|
193
565
|
}
|
|
194
566
|
|
|
567
|
+
/**
|
|
568
|
+
* Cytoscape.js 3.34.3's property aliases (`styfn.aliases`): each name is read as the property it points to.
|
|
569
|
+
*/
|
|
570
|
+
const CYJS_ALIASES: ReadonlyMap<string, string> = new Map([
|
|
571
|
+
["content", "label"],
|
|
572
|
+
["control-point-distance", "control-point-distances"],
|
|
573
|
+
["control-point-weight", "control-point-weights"],
|
|
574
|
+
["segment-distance", "segment-distances"],
|
|
575
|
+
["segment-weight", "segment-weights"],
|
|
576
|
+
["segment-radius", "segment-radii"],
|
|
577
|
+
["edge-text-rotation", "text-rotation"],
|
|
578
|
+
["padding-left", "padding"],
|
|
579
|
+
["padding-right", "padding"],
|
|
580
|
+
["padding-top", "padding"],
|
|
581
|
+
["padding-bottom", "padding"],
|
|
582
|
+
]);
|
|
583
|
+
|
|
584
|
+
/**
|
|
585
|
+
* A dash-form property name with Cytoscape.js's aliases resolved (`content` is `label`, `segment-distance` is
|
|
586
|
+
* `segment-distances`, `padding-left` is `padding`).
|
|
587
|
+
* @param dashed - the name in dash form
|
|
588
|
+
* @returns the property it sets
|
|
589
|
+
*/
|
|
590
|
+
export function cyjsAliasOf(dashed: string): string {
|
|
591
|
+
return CYJS_ALIASES.get(dashed) ?? dashed;
|
|
592
|
+
}
|
|
593
|
+
|
|
195
594
|
/**
|
|
196
595
|
* A property name in Cytoscape.js's dash form, aliases resolved (`backgroundColor` and `content` are read as
|
|
197
596
|
* `background-color` and `label`).
|
|
@@ -199,8 +598,7 @@ export function cyjsProperties(target: StyleTarget): ReadonlyMap<string, CyjsPro
|
|
|
199
598
|
* @returns the dash-form name
|
|
200
599
|
*/
|
|
201
600
|
export function cyjsPropertyName(name: string): string {
|
|
202
|
-
|
|
203
|
-
return dashed === "content" ? "label" : dashed;
|
|
601
|
+
return cyjsAliasOf(name.replaceAll(/[A-Z]/g, (c) => `-${c.toLowerCase()}`));
|
|
204
602
|
}
|
|
205
603
|
|
|
206
604
|
/** A parsed value, ready to draw. */
|
|
@@ -515,6 +913,7 @@ function parseFlat(spec: CyjsPropertySpec, raw: unknown, rendered = false): Flat
|
|
|
515
913
|
return ok ? { kind: "number", value: x, units: null, str: String(x) } : null;
|
|
516
914
|
}
|
|
517
915
|
case "size":
|
|
916
|
+
case "signedSize":
|
|
518
917
|
case "nodeSize":
|
|
519
918
|
return parseSizeValue(spec, value, raw);
|
|
520
919
|
case "text":
|
|
@@ -576,7 +975,9 @@ function parseSizeValue(spec: CyjsPropertySpec, value: unknown, raw: unknown): C
|
|
|
576
975
|
if (Number.isNaN(x)) {
|
|
577
976
|
return spec.type === "nodeSize" && raw === "label" ? { kind: "word", value: "label", str: "label" } : null;
|
|
578
977
|
}
|
|
579
|
-
return x < 0
|
|
978
|
+
return x < 0 && spec.type !== "signedSize"
|
|
979
|
+
? null
|
|
980
|
+
: { kind: "number", value: x, units, str: `${String(x)}${units ?? ""}` };
|
|
580
981
|
}
|
|
581
982
|
|
|
582
983
|
/**
|
|
@@ -690,7 +1091,11 @@ function parseMapData(spec: CyjsPropertySpec, value: string, mode: CyjsParseMode
|
|
|
690
1091
|
return null;
|
|
691
1092
|
}
|
|
692
1093
|
const numeric =
|
|
693
|
-
spec.type === "zeroOne" ||
|
|
1094
|
+
spec.type === "zeroOne" ||
|
|
1095
|
+
spec.type === "positive" ||
|
|
1096
|
+
spec.type === "size" ||
|
|
1097
|
+
spec.type === "signedSize" ||
|
|
1098
|
+
spec.type === "nodeSize";
|
|
694
1099
|
if (spec.type !== "color" && !numeric) {
|
|
695
1100
|
return null;
|
|
696
1101
|
}
|
|
@@ -794,6 +1199,23 @@ export function applyCyjsMapper(
|
|
|
794
1199
|
return null;
|
|
795
1200
|
}
|
|
796
1201
|
|
|
1202
|
+
/**
|
|
1203
|
+
* A flat color as `#rrggbb`; a channel outside 0..255 is noted and undefined is returned.
|
|
1204
|
+
* @param v - the color
|
|
1205
|
+
* @param site - where it was read
|
|
1206
|
+
* @returns the color, or undefined
|
|
1207
|
+
*/
|
|
1208
|
+
function colorNeutral(v: Extract<CyjsFlat, { kind: "color" }>, site: CanonSite): StyleValue | undefined {
|
|
1209
|
+
if (v.rgb.some((c) => !Number.isFinite(c) || c < 0 || c > 255)) {
|
|
1210
|
+
site.notes.add(STYLE_ISSUE.BAD_VALUE, site.target, site.property, {
|
|
1211
|
+
sample: v.str,
|
|
1212
|
+
element: site.element,
|
|
1213
|
+
});
|
|
1214
|
+
return undefined;
|
|
1215
|
+
}
|
|
1216
|
+
return `#${v.rgb.map((c) => Math.round(c).toString(16).padStart(2, "0")).join("")}`;
|
|
1217
|
+
}
|
|
1218
|
+
|
|
797
1219
|
/**
|
|
798
1220
|
* The neutral value a flat value is drawn as, for one property. A value Cytoscape.js draws from the page (an `em`
|
|
799
1221
|
* size, a node sized to its label) cannot be evaluated: it is noted and undefined is returned.
|
|
@@ -804,25 +1226,12 @@ export function applyCyjsMapper(
|
|
|
804
1226
|
*/
|
|
805
1227
|
export function cyjsNeutral(spec: CyjsPropertySpec, v: CyjsFlat, site: CanonSite): StyleValue | undefined {
|
|
806
1228
|
switch (v.kind) {
|
|
807
|
-
case "color":
|
|
808
|
-
|
|
809
|
-
site.notes.add(STYLE_ISSUE.BAD_VALUE, site.target, site.property, {
|
|
810
|
-
sample: v.str,
|
|
811
|
-
element: site.element,
|
|
812
|
-
});
|
|
813
|
-
return undefined;
|
|
814
|
-
}
|
|
815
|
-
return `#${v.rgb.map((c) => Math.round(c).toString(16).padStart(2, "0")).join("")}`;
|
|
816
|
-
}
|
|
1229
|
+
case "color":
|
|
1230
|
+
return colorNeutral(v, site);
|
|
817
1231
|
case "number":
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
element: site.element,
|
|
822
|
-
});
|
|
823
|
-
return undefined;
|
|
824
|
-
}
|
|
825
|
-
return num6(v.value);
|
|
1232
|
+
// Cytoscape.js steps a bundle's control points; a quadratic's middle is half as far out. It grows the
|
|
1233
|
+
// outline's path by its offset across, so the outline starts half the offset out (drawOutline).
|
|
1234
|
+
return num6((HALVED.has(spec.property) ? v.value / 2 : v.value) * (v.units === "em" ? EM_PX : 1));
|
|
826
1235
|
default:
|
|
827
1236
|
break;
|
|
828
1237
|
}
|
|
@@ -830,25 +1239,58 @@ export function cyjsNeutral(spec: CyjsPropertySpec, v: CyjsFlat, site: CanonSite
|
|
|
830
1239
|
switch (spec.property) {
|
|
831
1240
|
case "width":
|
|
832
1241
|
case "height":
|
|
833
|
-
|
|
1242
|
+
// a node sized to its label is drawn so by the node sizes (`nodeSizes`); an edge has no such width
|
|
1243
|
+
if (site.target === "edge") {
|
|
1244
|
+
site.notes.add(STYLE_ISSUE.BAD_VALUE, site.target, site.property, {
|
|
1245
|
+
sample: v.str,
|
|
1246
|
+
element: site.element,
|
|
1247
|
+
});
|
|
1248
|
+
}
|
|
834
1249
|
return undefined;
|
|
835
1250
|
case "label":
|
|
836
1251
|
case "sourceLabel":
|
|
837
1252
|
case "targetLabel":
|
|
838
1253
|
case "labelFont":
|
|
839
1254
|
return String(word);
|
|
1255
|
+
case "gradientKind":
|
|
1256
|
+
return GRADIENT_KINDS.get(String(word)) ?? undefined;
|
|
1257
|
+
case "gradientColors":
|
|
1258
|
+
return gradientColors(String(word), site);
|
|
1259
|
+
case "gradientStops":
|
|
1260
|
+
return gradientStops(String(word));
|
|
840
1261
|
case "labelItalic":
|
|
841
1262
|
return word === "italic" || word === "oblique";
|
|
842
1263
|
case "curved":
|
|
843
1264
|
return !STRAIGHT.has(String(word));
|
|
844
|
-
case "
|
|
1265
|
+
case "shapePoints":
|
|
1266
|
+
return cyjsPointsToNeutral(String(word)) ?? undefined;
|
|
1267
|
+
case "underlayShape":
|
|
1268
|
+
case "overlayShape":
|
|
845
1269
|
return canonEnum("shape", String(word), "cytoscape-js", site) ?? undefined;
|
|
1270
|
+
case "shape": {
|
|
1271
|
+
const polygon = String(word).toLowerCase();
|
|
1272
|
+
if (polygon === "polygon") {
|
|
1273
|
+
return "polygon";
|
|
1274
|
+
}
|
|
1275
|
+
// drawn exactly as the polygon Cytoscape.js builds, by `cyjsPolygonShapes`
|
|
1276
|
+
return CYJS_POLYGON_SHAPES.has(polygon) || CYJS_ROUND_SHAPES.has(polygon)
|
|
1277
|
+
? `other:${polygon}`
|
|
1278
|
+
: (canonEnum("shape", String(word), "cytoscape-js", site) ?? undefined);
|
|
1279
|
+
}
|
|
846
1280
|
case "borderStyle":
|
|
847
1281
|
return canonEnum("borderStyle", String(word), "cytoscape-js", site) ?? undefined;
|
|
1282
|
+
case "outerBorderStyle":
|
|
1283
|
+
// cytoscape.js 3.34.3 drawOutline strokes a double outline whole and then erases a line a third of the
|
|
1284
|
+
// BORDER's width down its middle, a hairline under a border of 1: the ring it shows is solid
|
|
1285
|
+
return word === "double"
|
|
1286
|
+
? "solid"
|
|
1287
|
+
: (canonEnum("borderStyle", String(word), "cytoscape-js", site) ?? undefined);
|
|
848
1288
|
case "lineStyle":
|
|
849
1289
|
return canonEnum("lineStyle", String(word), "cytoscape-js", site) ?? undefined;
|
|
850
1290
|
case "sourceArrow":
|
|
851
1291
|
case "targetArrow":
|
|
1292
|
+
case "midSourceArrow":
|
|
1293
|
+
case "midTargetArrow":
|
|
852
1294
|
return canonEnum("arrow", String(word), "cytoscape-js", site) ?? undefined;
|
|
853
1295
|
case "labelWeight":
|
|
854
1296
|
return canonEnum("weight", String(word), "cytoscape-js", site) ?? undefined;
|
|
@@ -882,3 +1324,26 @@ export function cyjsRendered(
|
|
|
882
1324
|
}
|
|
883
1325
|
return cyjsNeutral(spec, v, site);
|
|
884
1326
|
}
|
|
1327
|
+
|
|
1328
|
+
/**
|
|
1329
|
+
* The line class a dash array looks like against the line's width: solid where its gaps are a tenth of it or less,
|
|
1330
|
+
* dotted where no dash is longer than one and a half widths, dash-dot where a dash is twice another, else dashed.
|
|
1331
|
+
* @param dash - the dashes and gaps, in pixels
|
|
1332
|
+
* @param width - the line's width
|
|
1333
|
+
* @param cap - the dashes' ends
|
|
1334
|
+
* @returns the neutral line style
|
|
1335
|
+
*/
|
|
1336
|
+
export function cyjsDashLook(dash: readonly number[], width: number, cap: string): string {
|
|
1337
|
+
const pairs = dash.length % 2 === 1 ? [...dash, ...dash] : [...dash];
|
|
1338
|
+
const grow = cap === "butt" ? 0 : width;
|
|
1339
|
+
const on = pairs.filter((_, i) => i % 2 === 0).map((d) => Math.max(0, d) + grow);
|
|
1340
|
+
const off = pairs.filter((_, i) => i % 2 === 1).map((d) => Math.max(0, d - grow));
|
|
1341
|
+
const sum = (xs: readonly number[]): number => xs.reduce((a, b) => a + b, 0);
|
|
1342
|
+
if (sum(off) <= 0.1 * (sum(on) + sum(off))) {
|
|
1343
|
+
return "solid";
|
|
1344
|
+
}
|
|
1345
|
+
if (on.every((d) => d <= Math.max(1, width) * 1.5)) {
|
|
1346
|
+
return "dotted";
|
|
1347
|
+
}
|
|
1348
|
+
return Math.max(...on) >= 2 * Math.min(...on) ? "dash-dot" : "dashed";
|
|
1349
|
+
}
|