@graphty/graph-io 0.3.43 → 0.3.45
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-DJMHdDvv.js +40 -0
- package/dist/chunks/approximations-DJMHdDvv.js.map +1 -0
- package/dist/chunks/block-CPCHkX42.js +2777 -0
- package/dist/chunks/block-CPCHkX42.js.map +1 -0
- package/dist/chunks/{choose-DvpbdRuz.js → choose--jM0yYCo.js} +3 -2
- package/dist/chunks/{choose-DvpbdRuz.js.map → choose--jM0yYCo.js.map} +1 -1
- package/dist/chunks/{constants-fT3E8JYY.js → constants-BKwqelYD.js} +6 -2
- package/dist/chunks/constants-BKwqelYD.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-DZy6JgdA.js +3456 -0
- package/dist/chunks/emit-DZy6JgdA.js.map +1 -0
- package/dist/chunks/{escape-B62ZGM_a.js → escape-CgzxiYPg.js} +44 -21
- package/dist/chunks/escape-CgzxiYPg.js.map +1 -0
- package/dist/chunks/{export-rKLeGQMo.js → export-BvqAXCKh.js} +196 -792
- package/dist/chunks/export-BvqAXCKh.js.map +1 -0
- package/dist/chunks/{exporter-yLxKBvLE.js → exporter--Mk9gXCJ.js} +4 -3
- package/dist/chunks/{exporter-yLxKBvLE.js.map → exporter--Mk9gXCJ.js.map} +1 -1
- package/dist/chunks/{exporter-RVtXVetw.js → exporter-C-9cgZKa.js} +1805 -287
- package/dist/chunks/exporter-C-9cgZKa.js.map +1 -0
- package/dist/chunks/{exporter-8hLNemFk.js → exporter-DFqJhBnj.js} +133 -74
- package/dist/chunks/exporter-DFqJhBnj.js.map +1 -0
- package/dist/chunks/{exporter-BWwEuOPT.js → exporter-DteVeJki.js} +22 -12
- package/dist/chunks/exporter-DteVeJki.js.map +1 -0
- package/dist/chunks/format-BpQBx8MZ.js +676 -0
- package/dist/chunks/format-BpQBx8MZ.js.map +1 -0
- package/dist/chunks/generic-BGO71QBv.js +1347 -0
- package/dist/chunks/generic-BGO71QBv.js.map +1 -0
- package/dist/chunks/{importer-C98dpSH4.js → importer-B-9Rc1zO.js} +141 -82
- package/dist/chunks/importer-B-9Rc1zO.js.map +1 -0
- package/dist/chunks/{importer-D794XUTe.js → importer-BVVR740x.js} +31 -8
- package/dist/chunks/importer-BVVR740x.js.map +1 -0
- package/dist/chunks/{importer-WrGRZb0N.js → importer-C0AjA3Ax.js} +449 -102
- package/dist/chunks/importer-C0AjA3Ax.js.map +1 -0
- package/dist/chunks/{importer-BbNb7eNg.js → importer-C7pvJe1L.js} +1398 -129
- package/dist/chunks/importer-C7pvJe1L.js.map +1 -0
- package/dist/chunks/{importer-xZ-3suY1.js → importer-ClwoVx3O.js} +791 -135
- package/dist/chunks/importer-ClwoVx3O.js.map +1 -0
- package/dist/chunks/{importer-Ht7LNg8L.js → importer-D0sC_6bO.js} +116 -296
- package/dist/chunks/importer-D0sC_6bO.js.map +1 -0
- package/dist/chunks/{importer-Dz7tI8Sa.js → importer-EHQk1jbM.js} +617 -115
- package/dist/chunks/importer-EHQk1jbM.js.map +1 -0
- package/dist/chunks/{json-elements-DKSqpNW1.js → json-elements-DJZRZ6jd.js} +123 -32
- package/dist/chunks/json-elements-DJZRZ6jd.js.map +1 -0
- package/dist/chunks/lexicon-WMsNddyU.js +509 -0
- package/dist/chunks/lexicon-WMsNddyU.js.map +1 -0
- package/dist/chunks/{ontology-export-CtRXjg_i.js → ontology-export-G4MqRdux.js} +3 -2
- package/dist/chunks/{ontology-export-CtRXjg_i.js.map → ontology-export-G4MqRdux.js.map} +1 -1
- package/dist/chunks/{records-Cu4bxYOm.js → records-CiaWZrFH.js} +2 -2
- package/dist/chunks/{records-Cu4bxYOm.js.map → records-CiaWZrFH.js.map} +1 -1
- package/dist/chunks/styles-DvoFBKCK.js +690 -0
- package/dist/chunks/styles-DvoFBKCK.js.map +1 -0
- package/dist/chunks/styles-yed-Cz9rLBCP.js +842 -0
- package/dist/chunks/styles-yed-Cz9rLBCP.js.map +1 -0
- package/dist/chunks/styles-zNTmz5R7.js +2102 -0
- package/dist/chunks/styles-zNTmz5R7.js.map +1 -0
- package/dist/chunks/{text-DHOJXnED.js → text-CzJNFOS9.js} +2 -2
- package/dist/chunks/{text-DHOJXnED.js.map → text-CzJNFOS9.js.map} +1 -1
- package/dist/chunks/units-XMZFIFe1.js +19 -0
- package/dist/chunks/units-XMZFIFe1.js.map +1 -0
- package/dist/chunks/writer-gQ8kx99H.js +448 -0
- package/dist/chunks/writer-gQ8kx99H.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 +927 -74
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +351 -236
- 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 +1496 -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 +791 -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 +605 -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 +89 -0
- package/dist/src/styles/io/writer.d.ts.map +1 -0
- package/dist/src/styles/io/writer.js +626 -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 +1755 -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 +952 -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 +658 -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 +780 -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,778 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cytoscape.js's selector grammar, parsed the way Cytoscape.js 3.x parses it, by index in one pass. The grammar is
|
|
3
|
+
* Cytoscape.js's own: the same tokens tried in the same order (group, state, `#id`, `.class`, `[a]`, `[a op v]`,
|
|
4
|
+
* `[?a]`, `[[degree op n]]`, then the separators `,` `->` `<->` `>` and a space, and the subject `$`), building the
|
|
5
|
+
* same query structure, so a selector that is valid there is valid here and selects the same elements.
|
|
6
|
+
*
|
|
7
|
+
* Two of Cytoscape.js's behaviors are kept on purpose because files depend on them:
|
|
8
|
+
* - an invalid selector keeps what was parsed before the error. A selector whose first token fails has one empty
|
|
9
|
+
* query and matches every node and edge; `node:not(.a)` keeps `node` and matches every node.
|
|
10
|
+
* - a string value is kept as written between its quotes: `[a = "x\"y"]` compares with `x\"y`.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** A comparison operator after its `!` and `@` flags are taken off. */
|
|
14
|
+
export type CyjsCompareOp = "=" | ">" | ">=" | "<" | "<=" | "*=" | "^=" | "$=";
|
|
15
|
+
|
|
16
|
+
/** One check of a query; a query matches when every check does. */
|
|
17
|
+
export type CyjsCheck =
|
|
18
|
+
| {
|
|
19
|
+
/** The kind of check. */ readonly type: "group";
|
|
20
|
+
/** The value compared with or matched. */ readonly value: "nodes" | "edges" | "*";
|
|
21
|
+
}
|
|
22
|
+
| {
|
|
23
|
+
/** The kind of check. */ readonly type: "state";
|
|
24
|
+
/** The value compared with or matched. */ readonly value: string;
|
|
25
|
+
}
|
|
26
|
+
| {
|
|
27
|
+
/** The kind of check. */ readonly type: "id";
|
|
28
|
+
/** The value compared with or matched. */ readonly value: string;
|
|
29
|
+
}
|
|
30
|
+
| {
|
|
31
|
+
/** The kind of check. */ readonly type: "class";
|
|
32
|
+
/** The value compared with or matched. */ readonly value: string;
|
|
33
|
+
}
|
|
34
|
+
| {
|
|
35
|
+
/** The kind of check. */ readonly type: "exist";
|
|
36
|
+
/** The data field (or, for `meta`, the degree) the check reads. */ readonly field: string;
|
|
37
|
+
}
|
|
38
|
+
| {
|
|
39
|
+
/** The kind of check. */ readonly type: "compare";
|
|
40
|
+
/** The data field (or, for `meta`, the degree) the check reads. */ readonly field: string;
|
|
41
|
+
/** The operator. */ readonly op: CyjsCompareOp;
|
|
42
|
+
/** Whether the comparison is negated (`!`). */ readonly not: boolean;
|
|
43
|
+
/** Whether a string comparison ignores case (`@`). */ readonly ci: boolean;
|
|
44
|
+
/** The value compared with or matched. */ readonly value: string | number;
|
|
45
|
+
}
|
|
46
|
+
| {
|
|
47
|
+
/** The kind of check. */ readonly type: "bool";
|
|
48
|
+
/** The data field (or, for `meta`, the degree) the check reads. */ readonly field: string;
|
|
49
|
+
/** The operator. */ readonly op: "?" | "!" | "^";
|
|
50
|
+
}
|
|
51
|
+
| {
|
|
52
|
+
/** The kind of check. */ readonly type: "meta";
|
|
53
|
+
/** The data field (or, for `meta`, the degree) the check reads. */ readonly field:
|
|
54
|
+
"degree" | "indegree" | "outdegree";
|
|
55
|
+
/** The operator. */ readonly op: CyjsCompareOp;
|
|
56
|
+
/** Whether the comparison is negated (`!`). */ readonly not: boolean;
|
|
57
|
+
/** Whether a string comparison ignores case (`@`). */ readonly ci: boolean;
|
|
58
|
+
/** The value compared with or matched. */ readonly value: number;
|
|
59
|
+
}
|
|
60
|
+
| {
|
|
61
|
+
/** The kind of check: matches every element. */
|
|
62
|
+
readonly type: "true";
|
|
63
|
+
}
|
|
64
|
+
| {
|
|
65
|
+
/** The kind of check. */ readonly type: "child";
|
|
66
|
+
/** The query the parent must match. */ readonly parent: CyjsQuery;
|
|
67
|
+
/** The query the child must match. */ readonly child: CyjsQuery;
|
|
68
|
+
}
|
|
69
|
+
| {
|
|
70
|
+
/** The kind of check. */ readonly type: "descendant";
|
|
71
|
+
/** The query an ancestor must match. */ readonly ancestor: CyjsQuery;
|
|
72
|
+
/** The query the descendant must match. */ readonly descendant: CyjsQuery;
|
|
73
|
+
}
|
|
74
|
+
| {
|
|
75
|
+
/** The kind of check. */ readonly type: "parent";
|
|
76
|
+
/** The query the parent must match. */ readonly parent: CyjsQuery;
|
|
77
|
+
/** The query the child must match. */ readonly child: CyjsQuery;
|
|
78
|
+
}
|
|
79
|
+
| {
|
|
80
|
+
/** The kind of check. */ readonly type: "ancestor";
|
|
81
|
+
/** The query an ancestor must match. */ readonly ancestor: CyjsQuery;
|
|
82
|
+
/** The query the descendant must match. */ readonly descendant: CyjsQuery;
|
|
83
|
+
}
|
|
84
|
+
| {
|
|
85
|
+
/** The kind of check. */ readonly type: "split";
|
|
86
|
+
/** The query left of the separator. */ readonly left: CyjsQuery;
|
|
87
|
+
/** The query right of the separator. */ readonly right: CyjsQuery;
|
|
88
|
+
/** The query marked as the subject with `$`. */ readonly subject: CyjsQuery;
|
|
89
|
+
}
|
|
90
|
+
| {
|
|
91
|
+
/** The kind of check. */ readonly type: "directedEdge";
|
|
92
|
+
/** The query the source node must match. */ readonly source: CyjsQuery;
|
|
93
|
+
/** The query the target node must match. */ readonly target: CyjsQuery;
|
|
94
|
+
}
|
|
95
|
+
| {
|
|
96
|
+
/** The kind of check. */ readonly type: "undirectedEdge";
|
|
97
|
+
/** The queries the two end nodes must match, in either order. */ readonly nodes: readonly [
|
|
98
|
+
CyjsQuery,
|
|
99
|
+
CyjsQuery,
|
|
100
|
+
];
|
|
101
|
+
}
|
|
102
|
+
| {
|
|
103
|
+
/** The kind of check. */ readonly type: "nodeSource";
|
|
104
|
+
/** The query the source node must match. */ readonly source: CyjsQuery;
|
|
105
|
+
/** The query the target node must match. */ readonly target: CyjsQuery;
|
|
106
|
+
}
|
|
107
|
+
| {
|
|
108
|
+
/** The kind of check. */ readonly type: "nodeTarget";
|
|
109
|
+
/** The query the source node must match. */ readonly source: CyjsQuery;
|
|
110
|
+
/** The query the target node must match. */ readonly target: CyjsQuery;
|
|
111
|
+
}
|
|
112
|
+
| {
|
|
113
|
+
/** The kind of check. */ readonly type: "nodeNeighbor";
|
|
114
|
+
/** The query the node itself must match. */ readonly node: CyjsQuery;
|
|
115
|
+
/** The query a neighbor must match. */ readonly neighbor: CyjsQuery;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
/** One comma-separated alternative of a selector. */
|
|
119
|
+
export interface CyjsQuery {
|
|
120
|
+
/** The checks; an empty list matches every element. */
|
|
121
|
+
checks: CyjsCheck[];
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** A parsed selector. */
|
|
125
|
+
export interface CyjsSelector {
|
|
126
|
+
/** The alternatives; an element matches when any one does. None: the selector matches nothing. */
|
|
127
|
+
readonly queries: readonly CyjsQuery[];
|
|
128
|
+
/** Cytoscape.js rejects the selector; the queries hold what it parsed before the error. */
|
|
129
|
+
readonly invalid: boolean;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Every state selector Cytoscape.js 3.x knows. */
|
|
133
|
+
const CYJS_STATES: ReadonlySet<string> = new Set([
|
|
134
|
+
"selected",
|
|
135
|
+
"unselected",
|
|
136
|
+
"selectable",
|
|
137
|
+
"unselectable",
|
|
138
|
+
"locked",
|
|
139
|
+
"unlocked",
|
|
140
|
+
"visible",
|
|
141
|
+
"hidden",
|
|
142
|
+
"transparent",
|
|
143
|
+
"grabbed",
|
|
144
|
+
"free",
|
|
145
|
+
"removed",
|
|
146
|
+
"inside",
|
|
147
|
+
"grabbable",
|
|
148
|
+
"ungrabbable",
|
|
149
|
+
"animated",
|
|
150
|
+
"unanimated",
|
|
151
|
+
"parent",
|
|
152
|
+
"childless",
|
|
153
|
+
"child",
|
|
154
|
+
"orphan",
|
|
155
|
+
"nonorphan",
|
|
156
|
+
"compound",
|
|
157
|
+
"loop",
|
|
158
|
+
"simple",
|
|
159
|
+
"active",
|
|
160
|
+
"inactive",
|
|
161
|
+
"backgrounding",
|
|
162
|
+
"nonbackgrounding",
|
|
163
|
+
]);
|
|
164
|
+
|
|
165
|
+
/** The longest selector parsed; a longer one is treated as invalid (and noted by the caller). */
|
|
166
|
+
const MAX_SELECTOR_LENGTH = 1 << 22;
|
|
167
|
+
|
|
168
|
+
/** Cytoscape.js's escapable meta characters. */
|
|
169
|
+
const META = new Set("!\"#$%&'()*+,./:;<=>?@[]^`{|}~");
|
|
170
|
+
/** The base comparison operators, longest first so a scan takes `>=` before `>`. */
|
|
171
|
+
const BASE_OPS: readonly string[] = ["!=", ">=", "<=", "*=", "^=", "$=", "=", ">", "<"];
|
|
172
|
+
const META_FIELDS: readonly ("indegree" | "outdegree" | "degree")[] = ["indegree", "outdegree", "degree"];
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Whether a character is a JavaScript regular expression word character.
|
|
176
|
+
* @param c - the character
|
|
177
|
+
* @returns true for `[A-Za-z0-9_]`
|
|
178
|
+
*/
|
|
179
|
+
function isWord(c: string | undefined): boolean {
|
|
180
|
+
if (c === undefined) {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
const k = c.codePointAt(0) ?? 0;
|
|
184
|
+
return (k >= 48 && k <= 57) || (k >= 65 && k <= 90) || (k >= 97 && k <= 122) || k === 95;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Whether a character is JavaScript regular expression whitespace (`\s`).
|
|
189
|
+
* @param c - the character
|
|
190
|
+
* @returns true for whitespace
|
|
191
|
+
*/
|
|
192
|
+
function isSpace(c: string | undefined): boolean {
|
|
193
|
+
return c !== undefined && /\s/.test(c);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/** The text being parsed and the position reached. */
|
|
197
|
+
class Cursor {
|
|
198
|
+
pos = 0;
|
|
199
|
+
constructor(readonly text: string) {}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* The end of a run of whitespace.
|
|
203
|
+
* @param from - where the run starts
|
|
204
|
+
* @returns the first position after it
|
|
205
|
+
*/
|
|
206
|
+
spaceEnd(from: number): number {
|
|
207
|
+
let i = from;
|
|
208
|
+
while (i < this.text.length && isSpace(this.text[i])) {
|
|
209
|
+
i++;
|
|
210
|
+
}
|
|
211
|
+
return i;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* A name at `from`: word characters, `-`, and `.` when `dots` (Cytoscape.js's variable and id tokens), or a
|
|
216
|
+
* backslash before a meta character.
|
|
217
|
+
* @param from - the start
|
|
218
|
+
* @param dots - whether `.` belongs to the name
|
|
219
|
+
* @returns the raw name and its end, or null when there is none
|
|
220
|
+
*/
|
|
221
|
+
name(from: number, dots: boolean): { raw: string; end: number } | null {
|
|
222
|
+
let i = from;
|
|
223
|
+
const t = this.text;
|
|
224
|
+
while (i < t.length) {
|
|
225
|
+
const c = t[i];
|
|
226
|
+
if (isWord(c) || c === "-" || (dots && c === ".")) {
|
|
227
|
+
i++;
|
|
228
|
+
} else if (c === "\\" && i + 1 < t.length && META.has(t[i + 1])) {
|
|
229
|
+
i += 2;
|
|
230
|
+
} else {
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return i > from ? { raw: t.slice(from, i), end: i } : null;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* A number literal at `from` (Cytoscape.js's `[-+]?(\d+|\d*\.\d+)([Ee][+-]?\d+)?`). Both readings of the
|
|
239
|
+
* mantissa are returned, longest first, because the regular expression backtracks to the shorter one.
|
|
240
|
+
* @param from - the start
|
|
241
|
+
* @returns the possible ends, longest first
|
|
242
|
+
*/
|
|
243
|
+
numberEnds(from: number): number[] {
|
|
244
|
+
const t = this.text;
|
|
245
|
+
let i = from;
|
|
246
|
+
if (t[i] === "+" || t[i] === "-") {
|
|
247
|
+
i++;
|
|
248
|
+
}
|
|
249
|
+
const digits = (k: number): number => {
|
|
250
|
+
let j = k;
|
|
251
|
+
while (j < t.length && t[j] >= "0" && t[j] <= "9") {
|
|
252
|
+
j++;
|
|
253
|
+
}
|
|
254
|
+
return j;
|
|
255
|
+
};
|
|
256
|
+
const mantissas: number[] = [];
|
|
257
|
+
const intEnd = digits(i);
|
|
258
|
+
if (intEnd > i) {
|
|
259
|
+
mantissas.push(intEnd);
|
|
260
|
+
}
|
|
261
|
+
// \d*\.\d+
|
|
262
|
+
if (t[intEnd] === ".") {
|
|
263
|
+
const fracEnd = digits(intEnd + 1);
|
|
264
|
+
if (fracEnd > intEnd + 1) {
|
|
265
|
+
mantissas.unshift(fracEnd);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
const ends: number[] = [];
|
|
269
|
+
for (const m of mantissas) {
|
|
270
|
+
if (t[m] === "e" || t[m] === "E") {
|
|
271
|
+
let j = m + 1;
|
|
272
|
+
if (t[j] === "+" || t[j] === "-") {
|
|
273
|
+
j++;
|
|
274
|
+
}
|
|
275
|
+
const expEnd = digits(j);
|
|
276
|
+
if (expEnd > j) {
|
|
277
|
+
ends.push(expEnd);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
ends.push(m);
|
|
281
|
+
}
|
|
282
|
+
return ends;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* The possible ends of a quoted string at `from`: every quote that may close it, longest first (a quote after a
|
|
287
|
+
* backslash may also be escaped; the first quote with no backslash before it must close the string).
|
|
288
|
+
* @param from - the opening quote
|
|
289
|
+
* @returns the possible ends (after the closing quote), longest first
|
|
290
|
+
*/
|
|
291
|
+
stringEnds(from: number): number[] {
|
|
292
|
+
const t = this.text;
|
|
293
|
+
const q = t[from];
|
|
294
|
+
const ends: number[] = [];
|
|
295
|
+
for (let i = from + 1; i < t.length; i++) {
|
|
296
|
+
if (t[i] !== q) {
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
ends.push(i + 1);
|
|
300
|
+
if (t[i - 1] !== "\\" || i - 1 === from) {
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return ends.reverse();
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* A comparison operator at `from`: `!` and `@` flags, then a base operator (`!` before a base that holds `!`
|
|
309
|
+
* is not allowed).
|
|
310
|
+
* @param from - the start
|
|
311
|
+
* @returns the operator text and its end, or null
|
|
312
|
+
*/
|
|
313
|
+
op(from: number): { text: string; end: number } | null {
|
|
314
|
+
const t = this.text;
|
|
315
|
+
let i = from;
|
|
316
|
+
let prefix = "";
|
|
317
|
+
if (t[i] === "!" && t[i + 1] !== "=") {
|
|
318
|
+
prefix += "!";
|
|
319
|
+
i++;
|
|
320
|
+
}
|
|
321
|
+
if (t[i] === "@") {
|
|
322
|
+
prefix += "@";
|
|
323
|
+
i++;
|
|
324
|
+
}
|
|
325
|
+
for (const base of BASE_OPS) {
|
|
326
|
+
if (t.startsWith(base, i)) {
|
|
327
|
+
if (prefix.includes("!") && base === "!=") {
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
330
|
+
return { text: prefix + base, end: i + base.length };
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return null;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* A name with its backslash escapes of meta characters removed.
|
|
339
|
+
* @param raw - the name as written
|
|
340
|
+
* @returns the name
|
|
341
|
+
*/
|
|
342
|
+
function cleanMeta(raw: string): string {
|
|
343
|
+
let out = "";
|
|
344
|
+
let i = 0;
|
|
345
|
+
while (i < raw.length) {
|
|
346
|
+
const escaped = raw[i] === "\\" && i + 1 < raw.length && META.has(raw[i + 1]);
|
|
347
|
+
out += escaped ? raw[i + 1] : raw[i];
|
|
348
|
+
i += escaped ? 2 : 1;
|
|
349
|
+
}
|
|
350
|
+
return out;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Splits an operator into its base and its flags.
|
|
355
|
+
* @param text - the operator as written
|
|
356
|
+
* @returns the base operator and the `!` and `@` flags
|
|
357
|
+
*/
|
|
358
|
+
function splitOp(text: string): { op: CyjsCompareOp; not: boolean; ci: boolean } {
|
|
359
|
+
let op = text;
|
|
360
|
+
let not = false;
|
|
361
|
+
let ci = false;
|
|
362
|
+
if (op.includes("!")) {
|
|
363
|
+
op = op.replace("!", "");
|
|
364
|
+
not = true;
|
|
365
|
+
}
|
|
366
|
+
if (op.includes("@")) {
|
|
367
|
+
op = op.replace("@", "");
|
|
368
|
+
ci = true;
|
|
369
|
+
}
|
|
370
|
+
return { op: op as CyjsCompareOp, not, ci };
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/** The parser's state across queries: Cytoscape.js's selector object while it is filled. */
|
|
374
|
+
interface Building {
|
|
375
|
+
readonly queries: CyjsQuery[];
|
|
376
|
+
subject: CyjsQuery | null;
|
|
377
|
+
edgeCount: number;
|
|
378
|
+
compoundCount: number;
|
|
379
|
+
readonly counts: { edgeCount: number; compoundCount: number; subject: CyjsQuery | null }[];
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/** A token matched at the cursor: how to fill the selector, and where it ends. */
|
|
383
|
+
interface Token {
|
|
384
|
+
readonly end: number;
|
|
385
|
+
readonly fill: (b: Building, q: CyjsQuery) => CyjsQuery | null | false;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* Replaces the last query of the selector.
|
|
390
|
+
* @param b - the selector being built
|
|
391
|
+
* @param q - the replacement
|
|
392
|
+
*/
|
|
393
|
+
function replaceLast(b: Building, q: CyjsQuery): void {
|
|
394
|
+
b.queries[b.queries.length - 1] = q;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* The last query of the selector (a selector always has one).
|
|
399
|
+
* @param b - the selector being built
|
|
400
|
+
* @returns the query
|
|
401
|
+
*/
|
|
402
|
+
function lastQuery(b: Building): CyjsQuery {
|
|
403
|
+
return b.queries.at(-1) as CyjsQuery;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* The compound separators (`>` and a space) as Cytoscape.js fills them.
|
|
408
|
+
* @param kind - child or descendant
|
|
409
|
+
* @returns the fill function
|
|
410
|
+
*/
|
|
411
|
+
function compoundFill(kind: "child" | "descendant"): Token["fill"] {
|
|
412
|
+
return (b, query) => {
|
|
413
|
+
if (b.subject === null) {
|
|
414
|
+
const outer: CyjsQuery = { checks: [] };
|
|
415
|
+
const inner: CyjsQuery = { checks: [] };
|
|
416
|
+
const left = lastQuery(b);
|
|
417
|
+
outer.checks.push(
|
|
418
|
+
kind === "child"
|
|
419
|
+
? { type: "child", parent: left, child: inner }
|
|
420
|
+
: { type: "descendant", ancestor: left, descendant: inner },
|
|
421
|
+
);
|
|
422
|
+
replaceLast(b, outer);
|
|
423
|
+
b.compoundCount++;
|
|
424
|
+
return inner;
|
|
425
|
+
}
|
|
426
|
+
if (b.subject === query) {
|
|
427
|
+
const compound: CyjsQuery = { checks: [] };
|
|
428
|
+
const left = lastQuery(b);
|
|
429
|
+
const right: CyjsQuery = { checks: [] };
|
|
430
|
+
const subject: CyjsQuery = { checks: query.checks };
|
|
431
|
+
const inner: CyjsQuery = { checks: [] };
|
|
432
|
+
const outer: CyjsQuery = { checks: [{ type: "true" }] };
|
|
433
|
+
query.checks = [{ type: "true" }];
|
|
434
|
+
right.checks.push(
|
|
435
|
+
kind === "child"
|
|
436
|
+
? { type: "parent", parent: outer, child: inner }
|
|
437
|
+
: { type: "ancestor", ancestor: outer, descendant: inner },
|
|
438
|
+
);
|
|
439
|
+
compound.checks.push({ type: "split", left, right, subject });
|
|
440
|
+
replaceLast(b, compound);
|
|
441
|
+
b.subject = subject;
|
|
442
|
+
b.compoundCount++;
|
|
443
|
+
return inner;
|
|
444
|
+
}
|
|
445
|
+
const outer: CyjsQuery = { checks: query.checks };
|
|
446
|
+
const inner: CyjsQuery = { checks: [] };
|
|
447
|
+
query.checks = [
|
|
448
|
+
kind === "child"
|
|
449
|
+
? { type: "parent", parent: outer, child: inner }
|
|
450
|
+
: { type: "ancestor", ancestor: outer, descendant: inner },
|
|
451
|
+
];
|
|
452
|
+
b.compoundCount++;
|
|
453
|
+
return inner;
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* The first of Cytoscape.js's expressions that matches at the cursor, in its order.
|
|
459
|
+
* @param c - the cursor
|
|
460
|
+
* @returns the token, or null when none matches (the selector is invalid)
|
|
461
|
+
*/
|
|
462
|
+
function nextToken(c: Cursor): Token | null {
|
|
463
|
+
const ch = c.text[c.pos];
|
|
464
|
+
return (
|
|
465
|
+
groupToken(c) ??
|
|
466
|
+
(ch === ":" ? stateToken(c) : null) ??
|
|
467
|
+
(ch === "#" || ch === "." ? nameToken(c, ch) : null) ??
|
|
468
|
+
(ch === "[" ? dataToken(c, c.pos) : null) ??
|
|
469
|
+
separatorToken(c) ??
|
|
470
|
+
(ch === "$" ? subjectToken(c) : null)
|
|
471
|
+
);
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
/**
|
|
475
|
+
* A check that fills the query with a fixed check.
|
|
476
|
+
* @param end - where the token ends
|
|
477
|
+
* @param check - the check
|
|
478
|
+
* @returns the token
|
|
479
|
+
*/
|
|
480
|
+
function checkToken(end: number, check: CyjsCheck): Token {
|
|
481
|
+
return {
|
|
482
|
+
end,
|
|
483
|
+
fill: (_b, q) => {
|
|
484
|
+
q.checks.push(check);
|
|
485
|
+
return null;
|
|
486
|
+
},
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/**
|
|
491
|
+
* A group: `node`, `edge` or `*`.
|
|
492
|
+
* @param c - the cursor
|
|
493
|
+
* @returns the token, or null
|
|
494
|
+
*/
|
|
495
|
+
function groupToken(c: Cursor): Token | null {
|
|
496
|
+
const i = c.pos;
|
|
497
|
+
for (const [g, value] of [
|
|
498
|
+
["node", "nodes"],
|
|
499
|
+
["edge", "edges"],
|
|
500
|
+
["*", "*"],
|
|
501
|
+
] as const) {
|
|
502
|
+
if (c.text.startsWith(g, i)) {
|
|
503
|
+
return checkToken(i + g.length, { type: "group", value });
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
return null;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* A state: the longest state name that is a prefix after the `:`.
|
|
511
|
+
* @param c - the cursor
|
|
512
|
+
* @returns the token, or null
|
|
513
|
+
*/
|
|
514
|
+
function stateToken(c: Cursor): Token | null {
|
|
515
|
+
const i = c.pos;
|
|
516
|
+
let best: string | null = null;
|
|
517
|
+
for (const s of CYJS_STATES) {
|
|
518
|
+
if (c.text.startsWith(s, i + 1) && (best === null || s.length > best.length)) {
|
|
519
|
+
best = s;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
return best === null ? null : checkToken(i + 1 + best.length, { type: "state", value: best });
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
/**
|
|
526
|
+
* An id (`#`) or a class (`.`).
|
|
527
|
+
* @param c - the cursor
|
|
528
|
+
* @param ch - the `#` or `.`
|
|
529
|
+
* @returns the token, or null
|
|
530
|
+
*/
|
|
531
|
+
function nameToken(c: Cursor, ch: "#" | "."): Token | null {
|
|
532
|
+
const n = c.name(c.pos + 1, ch === "#");
|
|
533
|
+
if (n === null) {
|
|
534
|
+
return null;
|
|
535
|
+
}
|
|
536
|
+
return checkToken(n.end, { type: ch === "#" ? "id" : "class", value: cleanMeta(n.raw) });
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
/**
|
|
540
|
+
* A separator: `\s*,\s*`, `\s+->\s+`, `\s+<->\s+`, `\s+>\s+` or `\s+`.
|
|
541
|
+
* @param c - the cursor
|
|
542
|
+
* @returns the token, or null
|
|
543
|
+
*/
|
|
544
|
+
function separatorToken(c: Cursor): Token | null {
|
|
545
|
+
const t = c.text;
|
|
546
|
+
const i = c.pos;
|
|
547
|
+
const ws = c.spaceEnd(i);
|
|
548
|
+
if (t[ws] === ",") {
|
|
549
|
+
return { end: c.spaceEnd(ws + 1), fill: nextQuery };
|
|
550
|
+
}
|
|
551
|
+
if (ws === i) {
|
|
552
|
+
return null;
|
|
553
|
+
}
|
|
554
|
+
for (const [sep, kind] of [
|
|
555
|
+
["->", "directed"],
|
|
556
|
+
["<->", "undirected"],
|
|
557
|
+
[">", "child"],
|
|
558
|
+
] as const) {
|
|
559
|
+
const after = t.startsWith(sep, ws) ? c.spaceEnd(ws + sep.length) : -1;
|
|
560
|
+
if (after > ws + sep.length) {
|
|
561
|
+
return { end: after, fill: kind === "child" ? compoundFill("child") : edgeFill(kind) };
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
return { end: ws, fill: compoundFill("descendant") };
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Starts the next query of a selector list (`,`).
|
|
569
|
+
* @param b - the selector being built
|
|
570
|
+
* @returns the new query
|
|
571
|
+
*/
|
|
572
|
+
function nextQuery(b: Building): CyjsQuery {
|
|
573
|
+
b.counts.push({ edgeCount: b.edgeCount, compoundCount: b.compoundCount, subject: b.subject });
|
|
574
|
+
b.subject = null;
|
|
575
|
+
b.edgeCount = 0;
|
|
576
|
+
b.compoundCount = 0;
|
|
577
|
+
const next: CyjsQuery = { checks: [] };
|
|
578
|
+
b.queries.push(next);
|
|
579
|
+
return next;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
/**
|
|
583
|
+
* The subject marker `$`: the query it follows is the one the selector selects.
|
|
584
|
+
* @param c - the cursor
|
|
585
|
+
* @returns the token
|
|
586
|
+
*/
|
|
587
|
+
function subjectToken(c: Cursor): Token {
|
|
588
|
+
return {
|
|
589
|
+
end: c.pos + 1,
|
|
590
|
+
fill: (b, q) => {
|
|
591
|
+
if (b.subject !== null && b.subject !== q) {
|
|
592
|
+
return false;
|
|
593
|
+
}
|
|
594
|
+
b.subject = q;
|
|
595
|
+
const top = lastQuery(b);
|
|
596
|
+
const first = top.checks.at(0);
|
|
597
|
+
if (first?.type === "directedEdge") {
|
|
598
|
+
top.checks[0] = { type: "nodeTarget", source: first.source, target: first.target };
|
|
599
|
+
} else if (first?.type === "undirectedEdge") {
|
|
600
|
+
top.checks[0] = { type: "nodeNeighbor", node: first.nodes[1], neighbor: first.nodes[0] };
|
|
601
|
+
}
|
|
602
|
+
return null;
|
|
603
|
+
},
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
/**
|
|
608
|
+
* The edge separators (`->`, `<->`) as Cytoscape.js fills them.
|
|
609
|
+
* @param kind - directed or undirected
|
|
610
|
+
* @returns the fill function
|
|
611
|
+
*/
|
|
612
|
+
function edgeFill(kind: "directed" | "undirected"): Token["fill"] {
|
|
613
|
+
return (b, query) => {
|
|
614
|
+
const target: CyjsQuery = { checks: [] };
|
|
615
|
+
const outer: CyjsQuery = { checks: [] };
|
|
616
|
+
if (b.subject === null) {
|
|
617
|
+
outer.checks.push(
|
|
618
|
+
kind === "directed"
|
|
619
|
+
? { type: "directedEdge", source: query, target }
|
|
620
|
+
: { type: "undirectedEdge", nodes: [query, target] },
|
|
621
|
+
);
|
|
622
|
+
replaceLast(b, outer);
|
|
623
|
+
b.edgeCount++;
|
|
624
|
+
return target;
|
|
625
|
+
}
|
|
626
|
+
if (kind === "directed") {
|
|
627
|
+
outer.checks.push({ type: "nodeSource", source: query, target });
|
|
628
|
+
replaceLast(b, outer);
|
|
629
|
+
b.edgeCount++;
|
|
630
|
+
return target;
|
|
631
|
+
}
|
|
632
|
+
outer.checks.push({ type: "nodeNeighbor", node: query, neighbor: target });
|
|
633
|
+
replaceLast(b, outer);
|
|
634
|
+
return target;
|
|
635
|
+
};
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
/**
|
|
639
|
+
* A `[...]` token at `i`: data existence, a data comparison, a data boolean or a metadata comparison, tried in
|
|
640
|
+
* Cytoscape.js's order.
|
|
641
|
+
* @param c - the cursor
|
|
642
|
+
* @param i - the position of `[`
|
|
643
|
+
* @returns the token, or null
|
|
644
|
+
*/
|
|
645
|
+
function dataToken(c: Cursor, i: number): Token | null {
|
|
646
|
+
const inner = c.spaceEnd(i + 1);
|
|
647
|
+
return compareToken(c, inner) ?? boolToken(c, inner) ?? (c.text[i + 1] === "[" ? metaToken(c, i) : null);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
/**
|
|
651
|
+
* `[a]` or `[a op value]`.
|
|
652
|
+
* @param c - the cursor
|
|
653
|
+
* @param inner - the position after `[` and its whitespace
|
|
654
|
+
* @returns the token, or null
|
|
655
|
+
*/
|
|
656
|
+
function compareToken(c: Cursor, inner: number): Token | null {
|
|
657
|
+
const t = c.text;
|
|
658
|
+
const v = c.name(inner, true);
|
|
659
|
+
if (v === null) {
|
|
660
|
+
return null;
|
|
661
|
+
}
|
|
662
|
+
const field = cleanMeta(v.raw);
|
|
663
|
+
const afterName = c.spaceEnd(v.end);
|
|
664
|
+
if (t[afterName] === "]") {
|
|
665
|
+
return checkToken(afterName + 1, { type: "exist", field });
|
|
666
|
+
}
|
|
667
|
+
const op = c.op(afterName);
|
|
668
|
+
if (op === null) {
|
|
669
|
+
return null;
|
|
670
|
+
}
|
|
671
|
+
const at = c.spaceEnd(op.end);
|
|
672
|
+
const quoted = t[at] === '"' || t[at] === "'";
|
|
673
|
+
const end = (quoted ? c.stringEnds(at) : c.numberEnds(at)).find((x) => t[c.spaceEnd(x)] === "]");
|
|
674
|
+
if (end === undefined) {
|
|
675
|
+
return null;
|
|
676
|
+
}
|
|
677
|
+
const literal = t.slice(at, end);
|
|
678
|
+
const value: string | number = quoted ? literal.slice(1, -1) : Number.parseFloat(literal);
|
|
679
|
+
const { op: base, not, ci } = splitOp(op.text);
|
|
680
|
+
return checkToken(c.spaceEnd(end) + 1, { type: "compare", field, op: base, not, ci, value });
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
/**
|
|
684
|
+
* `[?a]`, `[!a]` or `[^a]`.
|
|
685
|
+
* @param c - the cursor
|
|
686
|
+
* @param inner - the position after `[` and its whitespace
|
|
687
|
+
* @returns the token, or null
|
|
688
|
+
*/
|
|
689
|
+
function boolToken(c: Cursor, inner: number): Token | null {
|
|
690
|
+
const t = c.text;
|
|
691
|
+
const flag = t[inner];
|
|
692
|
+
if (flag !== "?" && flag !== "!" && flag !== "^") {
|
|
693
|
+
return null;
|
|
694
|
+
}
|
|
695
|
+
const n = c.name(c.spaceEnd(inner + 1), true);
|
|
696
|
+
const close = n === null ? -1 : c.spaceEnd(n.end);
|
|
697
|
+
if (n === null || t[close] !== "]") {
|
|
698
|
+
return null;
|
|
699
|
+
}
|
|
700
|
+
return checkToken(close + 1, { type: "bool", field: cleanMeta(n.raw), op: flag });
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
/**
|
|
704
|
+
* `[[degree op n]]`.
|
|
705
|
+
* @param c - the cursor
|
|
706
|
+
* @param i - the position of the first `[`
|
|
707
|
+
* @returns the token, or null
|
|
708
|
+
*/
|
|
709
|
+
function metaToken(c: Cursor, i: number): Token | null {
|
|
710
|
+
const t = c.text;
|
|
711
|
+
const at = c.spaceEnd(i + 2);
|
|
712
|
+
const field = META_FIELDS.find((f) => t.startsWith(f, at));
|
|
713
|
+
const op = field === undefined ? null : c.op(c.spaceEnd(at + field.length));
|
|
714
|
+
if (field === undefined || op === null) {
|
|
715
|
+
return null;
|
|
716
|
+
}
|
|
717
|
+
const numAt = c.spaceEnd(op.end);
|
|
718
|
+
const end = c.numberEnds(numAt).find((x) => {
|
|
719
|
+
const close = c.spaceEnd(x);
|
|
720
|
+
return t[close] === "]" && t[close + 1] === "]";
|
|
721
|
+
});
|
|
722
|
+
if (end === undefined) {
|
|
723
|
+
return null;
|
|
724
|
+
}
|
|
725
|
+
const value = Number.parseFloat(t.slice(numAt, end));
|
|
726
|
+
const { op: base, not, ci } = splitOp(op.text);
|
|
727
|
+
return checkToken(c.spaceEnd(end) + 2, { type: "meta", field, op: base, not, ci, value });
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
/**
|
|
731
|
+
* Whether a selector is blank: white space only.
|
|
732
|
+
* @param text - the selector
|
|
733
|
+
* @returns true when blank
|
|
734
|
+
*/
|
|
735
|
+
function isBlank(text: string): boolean {
|
|
736
|
+
return /^\s*$/.test(text.length > 1024 ? text.slice(0, 1024) : text) && text.trim() === "";
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
/**
|
|
740
|
+
* Parses a selector the way Cytoscape.js does.
|
|
741
|
+
* @param text - the selector
|
|
742
|
+
* @returns the queries and whether Cytoscape.js rejects the selector
|
|
743
|
+
*/
|
|
744
|
+
export function parseCyjsSelector(text: unknown): CyjsSelector {
|
|
745
|
+
// a missing or blank selector matches nothing
|
|
746
|
+
if (typeof text !== "string" || isBlank(text)) {
|
|
747
|
+
return { queries: [], invalid: false };
|
|
748
|
+
}
|
|
749
|
+
if (text.length > MAX_SELECTOR_LENGTH) {
|
|
750
|
+
return { queries: [], invalid: true };
|
|
751
|
+
}
|
|
752
|
+
const c = new Cursor(text);
|
|
753
|
+
const first: CyjsQuery = { checks: [] };
|
|
754
|
+
const b: Building = { queries: [first], subject: null, edgeCount: 0, compoundCount: 0, counts: [] };
|
|
755
|
+
let current = first;
|
|
756
|
+
c.pos = c.spaceEnd(0);
|
|
757
|
+
for (;;) {
|
|
758
|
+
const tok = nextToken(c);
|
|
759
|
+
if (tok === null) {
|
|
760
|
+
return { queries: b.queries, invalid: true };
|
|
761
|
+
}
|
|
762
|
+
const next = tok.fill(b, current);
|
|
763
|
+
if (next === false) {
|
|
764
|
+
return { queries: b.queries, invalid: true };
|
|
765
|
+
}
|
|
766
|
+
if (next !== null) {
|
|
767
|
+
current = next;
|
|
768
|
+
}
|
|
769
|
+
c.pos = tok.end;
|
|
770
|
+
if (c.spaceEnd(c.pos) >= text.length) {
|
|
771
|
+
break;
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
b.counts.push({ edgeCount: b.edgeCount, compoundCount: b.compoundCount, subject: b.subject });
|
|
775
|
+
// a query may hold one edge or compound relation, not both and not two edges
|
|
776
|
+
const invalid = b.counts.some((k) => (k.compoundCount > 0 && k.edgeCount > 0) || k.edgeCount > 1);
|
|
777
|
+
return { queries: b.queries, invalid };
|
|
778
|
+
}
|