@graphty/graph-io 0.3.48 → 0.3.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{approximations-C2riR4NT.js → approximations-BRXsll0T.js} +2 -2
- package/dist/chunks/{approximations-C2riR4NT.js.map → approximations-BRXsll0T.js.map} +1 -1
- package/dist/chunks/bends-BGXjv_U4.js +129 -0
- package/dist/chunks/bends-BGXjv_U4.js.map +1 -0
- package/dist/chunks/{block-Cu22ewuS.js → block-yl0f_qLO.js} +931 -164
- package/dist/chunks/block-yl0f_qLO.js.map +1 -0
- package/dist/chunks/choose-CczZJaX_.js +717 -0
- package/dist/chunks/choose-CczZJaX_.js.map +1 -0
- package/dist/chunks/{codes-CV_Bhcyi.js → codes-BE2xir2k.js} +6 -2
- package/dist/chunks/codes-BE2xir2k.js.map +1 -0
- package/dist/chunks/{constants-D0LqcsLJ.js → constants-CKkYLPtt.js} +2 -2
- package/dist/chunks/{constants-D0LqcsLJ.js.map → constants-CKkYLPtt.js.map} +1 -1
- package/dist/chunks/{context-cgmmOxZ2.js → context-DizmppHy.js} +5 -4
- package/dist/chunks/{context-cgmmOxZ2.js.map → context-DizmppHy.js.map} +1 -1
- package/dist/chunks/{convert-BcQ8_jMo.js → convert-Ct2zelbQ.js} +7 -2
- package/dist/chunks/convert-Ct2zelbQ.js.map +1 -0
- package/dist/chunks/{credentials-BiQsnMTb.js → credentials-CmvJXYeH.js} +67 -16
- package/dist/chunks/credentials-CmvJXYeH.js.map +1 -0
- package/dist/chunks/{cx-export-BEeF6ymo.js → cx-export-Bt6NoqTQ.js} +3 -3
- package/dist/chunks/{cx-export-BEeF6ymo.js.map → cx-export-Bt6NoqTQ.js.map} +1 -1
- package/dist/chunks/descriptor-B28U25x4.js +60 -0
- package/dist/chunks/descriptor-B28U25x4.js.map +1 -0
- package/dist/chunks/{descriptor-BJ-W0Jd-.js → descriptor-Dhez_Cew.js} +11 -2
- package/dist/chunks/descriptor-Dhez_Cew.js.map +1 -0
- package/dist/chunks/{emit-CD8xnY8s.js → emit-7Jkpg0yd.js} +1788 -133
- package/dist/chunks/emit-7Jkpg0yd.js.map +1 -0
- package/dist/chunks/{escape-DH2Egt-l.js → escape-CuCIzNMB.js} +8 -8
- package/dist/chunks/{escape-DH2Egt-l.js.map → escape-CuCIzNMB.js.map} +1 -1
- package/dist/chunks/{export-CZ7VRm4I.js → export-Cha4dRFz.js} +45 -387
- package/dist/chunks/export-Cha4dRFz.js.map +1 -0
- package/dist/chunks/{exporter-ChjL5fmP.js → exporter-1Ajud15J.js} +9 -8
- package/dist/chunks/{exporter-ChjL5fmP.js.map → exporter-1Ajud15J.js.map} +1 -1
- package/dist/chunks/{exporter-BIdaoIgh.js → exporter-B6yvL3wy.js} +7 -7
- package/dist/chunks/{exporter-BIdaoIgh.js.map → exporter-B6yvL3wy.js.map} +1 -1
- package/dist/chunks/{exporter-Dcw7Ldtq.js → exporter-BP6otMO6.js} +6 -6
- package/dist/chunks/{exporter-Dcw7Ldtq.js.map → exporter-BP6otMO6.js.map} +1 -1
- package/dist/chunks/{exporter-DtVU80Fa.js → exporter-CA5q8ROP.js} +9 -8
- package/dist/chunks/{exporter-DtVU80Fa.js.map → exporter-CA5q8ROP.js.map} +1 -1
- package/dist/chunks/{exporter-bxxjOrDZ.js → exporter-CQQZFJ2v.js} +1284 -156
- package/dist/chunks/exporter-CQQZFJ2v.js.map +1 -0
- package/dist/chunks/format-BXiAb-1h.js +408 -0
- package/dist/chunks/format-BXiAb-1h.js.map +1 -0
- package/dist/chunks/{generic-CP6YD34u.js → generic-Dc21MAdg.js} +387 -31
- package/dist/chunks/generic-Dc21MAdg.js.map +1 -0
- package/dist/chunks/{importer-B87_fmVx.js → importer-C6NVpCXp.js} +327 -84
- package/dist/chunks/importer-C6NVpCXp.js.map +1 -0
- package/dist/chunks/{importer-DPZDN40-.js → importer-CKFe4q54.js} +25 -17
- package/dist/chunks/importer-CKFe4q54.js.map +1 -0
- package/dist/chunks/{importer-Bji2MeWr.js → importer-CKbUbsJA.js} +13 -10
- package/dist/chunks/{importer-Bji2MeWr.js.map → importer-CKbUbsJA.js.map} +1 -1
- package/dist/chunks/{importer-CB_zV5_L.js → importer-ClCsdgTJ.js} +208 -1104
- package/dist/chunks/importer-ClCsdgTJ.js.map +1 -0
- package/dist/chunks/{importer-e3huMZbm.js → importer-CyVZTrf0.js} +14 -10
- package/dist/chunks/importer-CyVZTrf0.js.map +1 -0
- package/dist/chunks/{importer-CVT-JyDE.js → importer-DgG4v1Ms.js} +1537 -355
- package/dist/chunks/importer-DgG4v1Ms.js.map +1 -0
- package/dist/chunks/{importer-Cyy6UseH.js → importer-asFUrIsj.js} +66 -13
- package/dist/chunks/importer-asFUrIsj.js.map +1 -0
- package/dist/chunks/{input-Ccg9I22A.js → input-CAxt_aV-.js} +4 -4
- package/dist/chunks/{input-Ccg9I22A.js.map → input-CAxt_aV-.js.map} +1 -1
- package/dist/chunks/{json-elements-By172SVq.js → json-elements-Cq76WjnZ.js} +4 -4
- package/dist/chunks/{json-elements-By172SVq.js.map → json-elements-Cq76WjnZ.js.map} +1 -1
- package/dist/chunks/{lexicon-u2SI5xcx.js → lexicon-IVRq2Uoo.js} +282 -74
- package/dist/chunks/lexicon-IVRq2Uoo.js.map +1 -0
- package/dist/chunks/{ontology-export-BwgMyuF0.js → ontology-export-OMo91mb0.js} +4 -4
- package/dist/chunks/{ontology-export-BwgMyuF0.js.map → ontology-export-OMo91mb0.js.map} +1 -1
- package/dist/chunks/{records-Cgvxz-Vx.js → records-NJiYvekn.js} +2 -2
- package/dist/chunks/{records-Cgvxz-Vx.js.map → records-NJiYvekn.js.map} +1 -1
- package/dist/chunks/{report-CgdsL9Hb.js → report-CwMfYa9J.js} +23 -23
- package/dist/chunks/{report-CgdsL9Hb.js.map → report-CwMfYa9J.js.map} +1 -1
- package/dist/chunks/round-trip-Cy3_SHRZ.js +79 -0
- package/dist/chunks/round-trip-Cy3_SHRZ.js.map +1 -0
- package/dist/chunks/{sigv4-LkAzsLAu.js → sigv4-BXwVbza3.js} +5 -5
- package/dist/chunks/sigv4-BXwVbza3.js.map +1 -0
- package/dist/chunks/{styles-CaABMoO1.js → styles-CAVmBLgp.js} +1237 -138
- package/dist/chunks/styles-CAVmBLgp.js.map +1 -0
- package/dist/chunks/styles-CPczw1Jz.js +1928 -0
- package/dist/chunks/styles-CPczw1Jz.js.map +1 -0
- package/dist/chunks/styles-boK6Ln54.js +2847 -0
- package/dist/chunks/styles-boK6Ln54.js.map +1 -0
- package/dist/chunks/{styles-yed-Cs1nmrjn.js → styles-yed-XeFBQ6VS.js} +506 -175
- package/dist/chunks/styles-yed-XeFBQ6VS.js.map +1 -0
- package/dist/chunks/{text-BuKQVMz2.js → text-ystE2bYi.js} +2 -2
- package/dist/chunks/{text-BuKQVMz2.js.map → text-ystE2bYi.js.map} +1 -1
- package/dist/csv.js +7 -7
- package/dist/cx.js +2 -2
- package/dist/cx2.js +2 -2
- package/dist/cys.js +1 -1
- package/dist/dot.js +8 -4
- package/dist/dot.js.map +1 -1
- package/dist/gexf.js +42 -12
- package/dist/gexf.js.map +1 -1
- package/dist/gml.js +848 -194
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +230 -193
- package/dist/graph-io.js.map +1 -1
- package/dist/graphml.js +3 -3
- package/dist/json.js +3 -2
- package/dist/neo4j.js +6 -6
- package/dist/obo.js +1 -1
- package/dist/pajek.js +1 -1
- package/dist/positions.js +45 -3
- package/dist/positions.js.map +1 -1
- package/dist/sources-cypher.js +141 -23
- package/dist/sources-cypher.js.map +1 -1
- package/dist/sources-ndex.js +2 -2
- package/dist/sources-rest.js +32 -6
- package/dist/sources-rest.js.map +1 -1
- package/dist/sources-sparql.d.ts +1 -0
- package/dist/sources-sparql.js +439 -0
- package/dist/sources-sparql.js.map +1 -0
- package/dist/src/formats/cx/importer.d.ts.map +1 -1
- package/dist/src/formats/cx/importer.js +5 -1
- package/dist/src/formats/cx/importer.js.map +1 -1
- package/dist/src/formats/cx/styles.d.ts +24 -1
- package/dist/src/formats/cx/styles.d.ts.map +1 -1
- package/dist/src/formats/cx/styles.js +117 -11
- package/dist/src/formats/cx/styles.js.map +1 -1
- package/dist/src/formats/cx2/importer.d.ts.map +1 -1
- package/dist/src/formats/cx2/importer.js +1 -0
- package/dist/src/formats/cx2/importer.js.map +1 -1
- package/dist/src/formats/cx2/styles.d.ts.map +1 -1
- package/dist/src/formats/cx2/styles.js +3 -1
- package/dist/src/formats/cx2/styles.js.map +1 -1
- package/dist/src/formats/cys/importer.d.ts.map +1 -1
- package/dist/src/formats/cys/importer.js +1 -0
- package/dist/src/formats/cys/importer.js.map +1 -1
- package/dist/src/formats/cys/styles.d.ts +2 -0
- package/dist/src/formats/cys/styles.d.ts.map +1 -1
- package/dist/src/formats/cys/styles.js +15 -7
- package/dist/src/formats/cys/styles.js.map +1 -1
- package/dist/src/formats/dot/drawing.d.ts +98 -0
- package/dist/src/formats/dot/drawing.d.ts.map +1 -0
- package/dist/src/formats/dot/drawing.js +734 -0
- package/dist/src/formats/dot/drawing.js.map +1 -0
- package/dist/src/formats/dot/exporter.d.ts.map +1 -1
- package/dist/src/formats/dot/exporter.js +34 -2
- package/dist/src/formats/dot/exporter.js.map +1 -1
- package/dist/src/formats/dot/importer.d.ts +6 -1
- package/dist/src/formats/dot/importer.d.ts.map +1 -1
- package/dist/src/formats/dot/importer.js +170 -33
- package/dist/src/formats/dot/importer.js.map +1 -1
- package/dist/src/formats/dot/index.d.ts +3 -1
- package/dist/src/formats/dot/index.d.ts.map +1 -1
- package/dist/src/formats/dot/index.js +2 -1
- package/dist/src/formats/dot/index.js.map +1 -1
- package/dist/src/formats/dot/label-places.d.ts +41 -0
- package/dist/src/formats/dot/label-places.d.ts.map +1 -0
- package/dist/src/formats/dot/label-places.js +185 -0
- package/dist/src/formats/dot/label-places.js.map +1 -0
- package/dist/src/formats/dot/names.d.ts +13 -0
- package/dist/src/formats/dot/names.d.ts.map +1 -1
- package/dist/src/formats/dot/names.js +13 -0
- package/dist/src/formats/dot/names.js.map +1 -1
- package/dist/src/formats/dot/record.d.ts +50 -0
- package/dist/src/formats/dot/record.d.ts.map +1 -0
- package/dist/src/formats/dot/record.js +275 -0
- package/dist/src/formats/dot/record.js.map +1 -0
- package/dist/src/formats/dot/styles.d.ts +72 -2
- package/dist/src/formats/dot/styles.d.ts.map +1 -1
- package/dist/src/formats/dot/styles.js +1500 -119
- package/dist/src/formats/dot/styles.js.map +1 -1
- package/dist/src/formats/gexf/dialog-metrics.d.ts +15 -0
- package/dist/src/formats/gexf/dialog-metrics.d.ts.map +1 -0
- package/dist/src/formats/gexf/dialog-metrics.js +59 -0
- package/dist/src/formats/gexf/dialog-metrics.js.map +1 -0
- package/dist/src/formats/gexf/importer.d.ts +7 -0
- package/dist/src/formats/gexf/importer.d.ts.map +1 -1
- package/dist/src/formats/gexf/importer.js +41 -5
- package/dist/src/formats/gexf/importer.js.map +1 -1
- package/dist/src/formats/gexf/preview.d.ts +77 -0
- package/dist/src/formats/gexf/preview.d.ts.map +1 -0
- package/dist/src/formats/gexf/preview.js +191 -0
- package/dist/src/formats/gexf/preview.js.map +1 -0
- package/dist/src/formats/gexf/schema.d.ts.map +1 -1
- package/dist/src/formats/gexf/schema.js +2 -1
- package/dist/src/formats/gexf/schema.js.map +1 -1
- package/dist/src/formats/gexf/styles.d.ts +58 -31
- package/dist/src/formats/gexf/styles.d.ts.map +1 -1
- package/dist/src/formats/gexf/styles.js +848 -225
- package/dist/src/formats/gexf/styles.js.map +1 -1
- package/dist/src/formats/gml/importer.d.ts +5 -2
- package/dist/src/formats/gml/importer.d.ts.map +1 -1
- package/dist/src/formats/gml/importer.js +258 -71
- package/dist/src/formats/gml/importer.js.map +1 -1
- package/dist/src/formats/gml/index.d.ts +1 -1
- package/dist/src/formats/gml/index.d.ts.map +1 -1
- package/dist/src/formats/gml/index.js +1 -1
- package/dist/src/formats/gml/index.js.map +1 -1
- package/dist/src/formats/gml/positions.d.ts +7 -0
- package/dist/src/formats/gml/positions.d.ts.map +1 -1
- package/dist/src/formats/gml/positions.js +29 -7
- package/dist/src/formats/gml/positions.js.map +1 -1
- package/dist/src/formats/gml/styles.d.ts.map +1 -1
- package/dist/src/formats/gml/styles.js +754 -102
- package/dist/src/formats/gml/styles.js.map +1 -1
- package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-plain.js +6 -10
- package/dist/src/formats/graphml/styles-plain.js.map +1 -1
- package/dist/src/formats/graphml/styles-yed.d.ts +21 -15
- package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-yed.js +695 -164
- package/dist/src/formats/graphml/styles-yed.js.map +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
- package/dist/src/formats/graphml/styles-yfiles3.js +431 -64
- package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
- package/dist/src/formats/graphml/yfiles.d.ts +3 -3
- package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
- package/dist/src/formats/graphml/yfiles.js +16 -6
- package/dist/src/formats/graphml/yfiles.js.map +1 -1
- package/dist/src/formats/json/dialect.d.ts +3 -2
- package/dist/src/formats/json/dialect.d.ts.map +1 -1
- package/dist/src/formats/json/dialect.js +39 -5
- package/dist/src/formats/json/dialect.js.map +1 -1
- package/dist/src/formats/json/importer.d.ts +13 -2
- package/dist/src/formats/json/importer.d.ts.map +1 -1
- package/dist/src/formats/json/importer.js +42 -6
- package/dist/src/formats/json/importer.js.map +1 -1
- package/dist/src/formats/json/index.d.ts +1 -1
- package/dist/src/formats/json/index.d.ts.map +1 -1
- package/dist/src/formats/json/index.js +1 -1
- package/dist/src/formats/json/index.js.map +1 -1
- package/dist/src/formats/json/positions.d.ts +5 -2
- package/dist/src/formats/json/positions.d.ts.map +1 -1
- package/dist/src/formats/json/positions.js +20 -4
- package/dist/src/formats/json/positions.js.map +1 -1
- package/dist/src/formats/json/styles.d.ts +12 -1
- package/dist/src/formats/json/styles.d.ts.map +1 -1
- package/dist/src/formats/json/styles.js +1843 -136
- package/dist/src/formats/json/styles.js.map +1 -1
- package/dist/src/formats/pajek/draw.d.ts +104 -0
- package/dist/src/formats/pajek/draw.d.ts.map +1 -0
- package/dist/src/formats/pajek/draw.js +382 -0
- package/dist/src/formats/pajek/draw.js.map +1 -0
- package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
- package/dist/src/formats/pajek/exporter.js +70 -51
- package/dist/src/formats/pajek/exporter.js.map +1 -1
- package/dist/src/formats/pajek/importer.d.ts +9 -0
- package/dist/src/formats/pajek/importer.d.ts.map +1 -1
- package/dist/src/formats/pajek/importer.js +233 -102
- package/dist/src/formats/pajek/importer.js.map +1 -1
- package/dist/src/formats/pajek/index.d.ts +1 -0
- package/dist/src/formats/pajek/index.d.ts.map +1 -1
- package/dist/src/formats/pajek/index.js.map +1 -1
- package/dist/src/formats/pajek/styles.d.ts +15 -7
- package/dist/src/formats/pajek/styles.d.ts.map +1 -1
- package/dist/src/formats/pajek/styles.js +1395 -114
- package/dist/src/formats/pajek/styles.js.map +1 -1
- package/dist/src/formats/pajek/syntax.d.ts +10 -1
- package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
- package/dist/src/formats/pajek/syntax.js +26 -2
- package/dist/src/formats/pajek/syntax.js.map +1 -1
- package/dist/src/formats/xgmml/emit.d.ts +1 -0
- package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
- package/dist/src/formats/xgmml/emit.js +65 -5
- package/dist/src/formats/xgmml/emit.js.map +1 -1
- package/dist/src/formats/xgmml/styles.d.ts +23 -3
- package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
- package/dist/src/formats/xgmml/styles.js +277 -60
- package/dist/src/formats/xgmml/styles.js.map +1 -1
- package/dist/src/index.d.ts +6 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/positions/convert.d.ts.map +1 -1
- package/dist/src/positions/convert.js +11 -1
- package/dist/src/positions/convert.js.map +1 -1
- package/dist/src/positions/extract.d.ts.map +1 -1
- package/dist/src/positions/extract.js +53 -1
- package/dist/src/positions/extract.js.map +1 -1
- package/dist/src/positions/index.d.ts +1 -1
- package/dist/src/positions/index.d.ts.map +1 -1
- package/dist/src/positions/types.d.ts +59 -0
- package/dist/src/positions/types.d.ts.map +1 -1
- package/dist/src/sources/builtins.d.ts +1 -1
- package/dist/src/sources/builtins.d.ts.map +1 -1
- package/dist/src/sources/builtins.js +8 -2
- package/dist/src/sources/builtins.js.map +1 -1
- package/dist/src/sources/context.d.ts.map +1 -1
- package/dist/src/sources/context.js +1 -0
- package/dist/src/sources/context.js.map +1 -1
- package/dist/src/sources/credentials.d.ts +50 -1
- package/dist/src/sources/credentials.d.ts.map +1 -1
- package/dist/src/sources/credentials.js +69 -0
- package/dist/src/sources/credentials.js.map +1 -1
- package/dist/src/sources/cypher/descriptor.d.ts.map +1 -1
- package/dist/src/sources/cypher/descriptor.js +5 -0
- package/dist/src/sources/cypher/descriptor.js.map +1 -1
- package/dist/src/sources/cypher/index.d.ts.map +1 -1
- package/dist/src/sources/cypher/index.js +125 -18
- package/dist/src/sources/cypher/index.js.map +1 -1
- package/dist/src/sources/cypher/params.d.ts +1 -1
- package/dist/src/sources/cypher/params.d.ts.map +1 -1
- package/dist/src/sources/cypher/query-builder.d.ts +17 -0
- package/dist/src/sources/cypher/query-builder.d.ts.map +1 -1
- package/dist/src/sources/cypher/query-builder.js +31 -0
- package/dist/src/sources/cypher/query-builder.js.map +1 -1
- package/dist/src/sources/ids.d.ts +5 -0
- package/dist/src/sources/ids.d.ts.map +1 -1
- package/dist/src/sources/ids.js +5 -0
- package/dist/src/sources/ids.js.map +1 -1
- package/dist/src/sources/params.d.ts +3 -0
- package/dist/src/sources/params.d.ts.map +1 -1
- package/dist/src/sources/rest/descriptor.d.ts.map +1 -1
- package/dist/src/sources/rest/descriptor.js +9 -0
- package/dist/src/sources/rest/descriptor.js.map +1 -1
- package/dist/src/sources/rest/openalex.d.ts +4 -2
- package/dist/src/sources/rest/openalex.d.ts.map +1 -1
- package/dist/src/sources/rest/openalex.js +4 -2
- package/dist/src/sources/rest/openalex.js.map +1 -1
- package/dist/src/sources/rest/source.d.ts.map +1 -1
- package/dist/src/sources/rest/source.js +38 -0
- package/dist/src/sources/rest/source.js.map +1 -1
- package/dist/src/sources/run.d.ts +2 -0
- package/dist/src/sources/run.d.ts.map +1 -1
- package/dist/src/sources/run.js +30 -3
- package/dist/src/sources/run.js.map +1 -1
- package/dist/src/sources/sigv4.d.ts +5 -3
- package/dist/src/sources/sigv4.d.ts.map +1 -1
- package/dist/src/sources/sigv4.js +6 -4
- package/dist/src/sources/sigv4.js.map +1 -1
- package/dist/src/sources/sparql/descriptor.d.ts +10 -0
- package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
- package/dist/src/sources/sparql/descriptor.js +64 -0
- package/dist/src/sources/sparql/descriptor.js.map +1 -0
- package/dist/src/sources/sparql/index.d.ts +28 -0
- package/dist/src/sources/sparql/index.d.ts.map +1 -0
- package/dist/src/sources/sparql/index.js +327 -0
- package/dist/src/sources/sparql/index.js.map +1 -0
- package/dist/src/sources/sparql/ntriples.d.ts +69 -0
- package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
- package/dist/src/sources/sparql/ntriples.js +180 -0
- package/dist/src/sources/sparql/ntriples.js.map +1 -0
- package/dist/src/sources/sparql/params.d.ts +27 -0
- package/dist/src/sources/sparql/params.d.ts.map +1 -0
- package/dist/src/sources/sparql/params.js +5 -0
- package/dist/src/sources/sparql/params.js.map +1 -0
- package/dist/src/sources/sparql/query.d.ts +73 -0
- package/dist/src/sources/sparql/query.d.ts.map +1 -0
- package/dist/src/sources/sparql/query.js +164 -0
- package/dist/src/sources/sparql/query.js.map +1 -0
- package/dist/src/sources/types.d.ts +60 -0
- package/dist/src/sources/types.d.ts.map +1 -1
- package/dist/src/styles/annotations.d.ts +61 -5
- package/dist/src/styles/annotations.d.ts.map +1 -1
- package/dist/src/styles/annotations.js +130 -22
- package/dist/src/styles/annotations.js.map +1 -1
- package/dist/src/styles/canon/bends.d.ts +46 -0
- package/dist/src/styles/canon/bends.d.ts.map +1 -1
- package/dist/src/styles/canon/bends.js +123 -0
- package/dist/src/styles/canon/bends.js.map +1 -1
- package/dist/src/styles/canon/color-tables.d.ts +6 -1
- package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
- package/dist/src/styles/canon/color-tables.js +10 -4
- package/dist/src/styles/canon/color-tables.js.map +1 -1
- package/dist/src/styles/canon/color.d.ts +3 -1
- package/dist/src/styles/canon/color.d.ts.map +1 -1
- package/dist/src/styles/canon/color.js +103 -3
- package/dist/src/styles/canon/color.js.map +1 -1
- package/dist/src/styles/canon/enums.d.ts +2 -2
- package/dist/src/styles/canon/enums.d.ts.map +1 -1
- package/dist/src/styles/canon/enums.js +89 -7
- package/dist/src/styles/canon/enums.js.map +1 -1
- package/dist/src/styles/canon/graphviz.d.ts +12 -3
- package/dist/src/styles/canon/graphviz.d.ts.map +1 -1
- package/dist/src/styles/canon/graphviz.js +57 -9
- package/dist/src/styles/canon/graphviz.js.map +1 -1
- package/dist/src/styles/canon/number.d.ts +8 -0
- package/dist/src/styles/canon/number.d.ts.map +1 -1
- package/dist/src/styles/canon/number.js +18 -0
- package/dist/src/styles/canon/number.js.map +1 -1
- package/dist/src/styles/canon/text.d.ts +29 -2
- package/dist/src/styles/canon/text.d.ts.map +1 -1
- package/dist/src/styles/canon/text.js +156 -16
- package/dist/src/styles/canon/text.js.map +1 -1
- package/dist/src/styles/codes.d.ts +2 -0
- package/dist/src/styles/codes.d.ts.map +1 -1
- package/dist/src/styles/codes.js +2 -0
- package/dist/src/styles/codes.js.map +1 -1
- package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
- package/dist/src/styles/cyjs/cascade.js +1139 -79
- package/dist/src/styles/cyjs/cascade.js.map +1 -1
- package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
- package/dist/src/styles/cyjs/defaults-table.js +4 -0
- package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
- package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
- package/dist/src/styles/cyjs/emit.js +232 -10
- package/dist/src/styles/cyjs/emit.js.map +1 -1
- package/dist/src/styles/cyjs/face.d.ts +20 -0
- package/dist/src/styles/cyjs/face.d.ts.map +1 -0
- package/dist/src/styles/cyjs/face.js +332 -0
- package/dist/src/styles/cyjs/face.js.map +1 -0
- package/dist/src/styles/cyjs/mappers.d.ts +44 -1
- package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
- package/dist/src/styles/cyjs/mappers.js +475 -26
- package/dist/src/styles/cyjs/mappers.js.map +1 -1
- package/dist/src/styles/cyjs/routes.d.ts +53 -0
- package/dist/src/styles/cyjs/routes.d.ts.map +1 -0
- package/dist/src/styles/cyjs/routes.js +360 -0
- package/dist/src/styles/cyjs/routes.js.map +1 -0
- package/dist/src/styles/cytoscape/charts.d.ts +23 -0
- package/dist/src/styles/cytoscape/charts.d.ts.map +1 -0
- package/dist/src/styles/cytoscape/charts.js +560 -0
- package/dist/src/styles/cytoscape/charts.js.map +1 -0
- package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/emit.js +156 -48
- package/dist/src/styles/cytoscape/emit.js.map +1 -1
- package/dist/src/styles/cytoscape/lexicon.d.ts +91 -3
- package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/lexicon.js +387 -77
- package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
- package/dist/src/styles/cytoscape/mappings.d.ts +30 -0
- package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/mappings.js +92 -0
- package/dist/src/styles/cytoscape/mappings.js.map +1 -1
- package/dist/src/styles/cytoscape/resolve.d.ts +42 -2
- package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
- package/dist/src/styles/cytoscape/resolve.js +623 -17
- package/dist/src/styles/cytoscape/resolve.js.map +1 -1
- package/dist/src/styles/defaults.d.ts +46 -26
- package/dist/src/styles/defaults.d.ts.map +1 -1
- package/dist/src/styles/defaults.js +308 -71
- package/dist/src/styles/defaults.js.map +1 -1
- package/dist/src/styles/index.d.ts +4 -3
- package/dist/src/styles/index.d.ts.map +1 -1
- package/dist/src/styles/index.js +3 -2
- package/dist/src/styles/index.js.map +1 -1
- package/dist/src/styles/internal.d.ts +1 -0
- package/dist/src/styles/internal.d.ts.map +1 -1
- package/dist/src/styles/internal.js +1 -0
- package/dist/src/styles/internal.js.map +1 -1
- package/dist/src/styles/io/generic.d.ts.map +1 -1
- package/dist/src/styles/io/generic.js +56 -16
- package/dist/src/styles/io/generic.js.map +1 -1
- package/dist/src/styles/io/round-trip.d.ts +56 -0
- package/dist/src/styles/io/round-trip.d.ts.map +1 -0
- package/dist/src/styles/io/round-trip.js +138 -0
- package/dist/src/styles/io/round-trip.js.map +1 -0
- package/dist/src/styles/io/writer.d.ts.map +1 -1
- package/dist/src/styles/io/writer.js +6 -1
- package/dist/src/styles/io/writer.js.map +1 -1
- package/dist/src/styles/notes.d.ts.map +1 -1
- package/dist/src/styles/notes.js +1 -0
- package/dist/src/styles/notes.js.map +1 -1
- package/dist/src/styles/plan/features.d.ts +1 -1
- package/dist/src/styles/plan/features.d.ts.map +1 -1
- package/dist/src/styles/plan/features.js +22 -2
- package/dist/src/styles/plan/features.js.map +1 -1
- package/dist/src/styles/plan/index.d.ts +1 -1
- package/dist/src/styles/plan/index.d.ts.map +1 -1
- package/dist/src/styles/plan/index.js +1 -1
- package/dist/src/styles/plan/index.js.map +1 -1
- package/dist/src/styles/plan/plan.d.ts.map +1 -1
- package/dist/src/styles/plan/plan.js +61 -4
- package/dist/src/styles/plan/plan.js.map +1 -1
- package/dist/src/styles/plan/resolve.d.ts +11 -0
- package/dist/src/styles/plan/resolve.d.ts.map +1 -1
- package/dist/src/styles/plan/resolve.js +40 -4
- package/dist/src/styles/plan/resolve.js.map +1 -1
- package/dist/src/styles/slots.d.ts +14 -0
- package/dist/src/styles/slots.d.ts.map +1 -0
- package/dist/src/styles/slots.js +20 -0
- package/dist/src/styles/slots.js.map +1 -0
- package/dist/src/styles/types.d.ts +687 -6
- package/dist/src/styles/types.d.ts.map +1 -1
- package/dist/src/styles/vocabulary.d.ts +3 -2
- package/dist/src/styles/vocabulary.d.ts.map +1 -1
- package/dist/src/styles/vocabulary.js +224 -0
- package/dist/src/styles/vocabulary.js.map +1 -1
- package/dist/styles.js +30 -239
- package/dist/styles.js.map +1 -1
- package/dist/xgmml.js +3 -3
- package/package.json +27 -7
- package/src/formats/cx/importer.ts +6 -1
- package/src/formats/cx/styles.ts +143 -9
- package/src/formats/cx2/importer.ts +1 -0
- package/src/formats/cx2/styles.ts +3 -1
- package/src/formats/cys/importer.ts +1 -0
- package/src/formats/cys/styles.ts +27 -5
- package/src/formats/dot/drawing.ts +799 -0
- package/src/formats/dot/exporter.ts +37 -1
- package/src/formats/dot/importer.ts +192 -36
- package/src/formats/dot/index.ts +3 -1
- package/src/formats/dot/label-places.ts +241 -0
- package/src/formats/dot/names.ts +15 -0
- package/src/formats/dot/record.ts +336 -0
- package/src/formats/dot/styles.ts +1702 -149
- package/src/formats/gexf/dialog-metrics.ts +61 -0
- package/src/formats/gexf/importer.ts +50 -5
- package/src/formats/gexf/preview.ts +217 -0
- package/src/formats/gexf/schema.ts +2 -1
- package/src/formats/gexf/styles.ts +1099 -245
- package/src/formats/gml/importer.ts +291 -76
- package/src/formats/gml/index.ts +1 -1
- package/src/formats/gml/positions.ts +29 -7
- package/src/formats/gml/styles.ts +852 -110
- package/src/formats/graphml/styles-plain.ts +6 -15
- package/src/formats/graphml/styles-yed.ts +765 -176
- package/src/formats/graphml/styles-yfiles3.ts +487 -63
- package/src/formats/graphml/yfiles.ts +19 -6
- package/src/formats/json/dialect.ts +41 -5
- package/src/formats/json/importer.ts +59 -7
- package/src/formats/json/index.ts +1 -0
- package/src/formats/json/positions.ts +22 -5
- package/src/formats/json/styles.ts +2123 -171
- package/src/formats/pajek/draw.ts +469 -0
- package/src/formats/pajek/exporter.ts +81 -49
- package/src/formats/pajek/importer.ts +278 -103
- package/src/formats/pajek/index.ts +1 -0
- package/src/formats/pajek/styles.ts +1506 -133
- package/src/formats/pajek/syntax.ts +27 -2
- package/src/formats/xgmml/emit.ts +73 -5
- package/src/formats/xgmml/styles.ts +330 -71
- package/src/index.ts +12 -1
- package/src/positions/convert.ts +12 -1
- package/src/positions/extract.ts +55 -1
- package/src/positions/index.ts +1 -0
- package/src/positions/types.ts +60 -0
- package/src/sources/builtins.ts +8 -1
- package/src/sources/context.ts +1 -0
- package/src/sources/credentials.ts +90 -1
- package/src/sources/cypher/descriptor.ts +7 -1
- package/src/sources/cypher/index.ts +149 -18
- package/src/sources/cypher/params.ts +1 -1
- package/src/sources/cypher/query-builder.ts +33 -0
- package/src/sources/ids.ts +6 -0
- package/src/sources/params.ts +3 -0
- package/src/sources/rest/descriptor.ts +9 -0
- package/src/sources/rest/openalex.ts +4 -2
- package/src/sources/rest/source.ts +41 -0
- package/src/sources/run.ts +35 -3
- package/src/sources/sigv4.ts +6 -4
- package/src/sources/sparql/descriptor.ts +67 -0
- package/src/sources/sparql/index.ts +371 -0
- package/src/sources/sparql/ntriples.ts +219 -0
- package/src/sources/sparql/params.ts +28 -0
- package/src/sources/sparql/query.ts +216 -0
- package/src/sources/types.ts +68 -0
- package/src/styles/annotations.ts +201 -27
- package/src/styles/canon/bends.ts +137 -0
- package/src/styles/canon/color-tables.ts +10 -4
- package/src/styles/canon/color.ts +105 -3
- package/src/styles/canon/enums.ts +107 -8
- package/src/styles/canon/graphviz.ts +71 -10
- package/src/styles/canon/number.ts +19 -0
- package/src/styles/canon/text.ts +187 -16
- package/src/styles/codes.ts +2 -0
- package/src/styles/cyjs/cascade.ts +1303 -84
- package/src/styles/cyjs/defaults-table.ts +4 -0
- package/src/styles/cyjs/emit.ts +268 -14
- package/src/styles/cyjs/face.ts +372 -0
- package/src/styles/cyjs/mappers.ts +506 -27
- package/src/styles/cyjs/routes.ts +432 -0
- package/src/styles/cytoscape/charts.ts +684 -0
- package/src/styles/cytoscape/emit.ts +170 -48
- package/src/styles/cytoscape/lexicon.ts +431 -78
- package/src/styles/cytoscape/mappings.ts +108 -0
- package/src/styles/cytoscape/resolve.ts +741 -17
- package/src/styles/defaults.ts +417 -108
- package/src/styles/index.ts +5 -0
- package/src/styles/internal.ts +1 -0
- package/src/styles/io/generic.ts +79 -23
- package/src/styles/io/round-trip.ts +202 -0
- package/src/styles/io/writer.ts +6 -1
- package/src/styles/notes.ts +1 -0
- package/src/styles/plan/features.ts +23 -2
- package/src/styles/plan/index.ts +1 -1
- package/src/styles/plan/plan.ts +69 -5
- package/src/styles/plan/resolve.ts +47 -4
- package/src/styles/slots.ts +25 -0
- package/src/styles/types.ts +698 -5
- package/src/styles/vocabulary.ts +232 -2
- package/dist/chunks/block-Cu22ewuS.js.map +0 -1
- package/dist/chunks/choose-Cdx6Enl2.js +0 -57
- package/dist/chunks/choose-Cdx6Enl2.js.map +0 -1
- package/dist/chunks/codes-CV_Bhcyi.js.map +0 -1
- package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
- package/dist/chunks/credentials-BiQsnMTb.js.map +0 -1
- package/dist/chunks/descriptor-BJ-W0Jd-.js.map +0 -1
- package/dist/chunks/emit-CD8xnY8s.js.map +0 -1
- package/dist/chunks/export-CZ7VRm4I.js.map +0 -1
- package/dist/chunks/exporter-bxxjOrDZ.js.map +0 -1
- package/dist/chunks/format-BMS-1Nxb.js +0 -64
- package/dist/chunks/format-BMS-1Nxb.js.map +0 -1
- package/dist/chunks/generic-CP6YD34u.js.map +0 -1
- package/dist/chunks/importer-B87_fmVx.js.map +0 -1
- package/dist/chunks/importer-CB_zV5_L.js.map +0 -1
- package/dist/chunks/importer-CVT-JyDE.js.map +0 -1
- package/dist/chunks/importer-Cyy6UseH.js.map +0 -1
- package/dist/chunks/importer-DPZDN40-.js.map +0 -1
- package/dist/chunks/importer-e3huMZbm.js.map +0 -1
- package/dist/chunks/lexicon-u2SI5xcx.js.map +0 -1
- package/dist/chunks/sigv4-LkAzsLAu.js.map +0 -1
- package/dist/chunks/styles-CaABMoO1.js.map +0 -1
- package/dist/chunks/styles-P_gmFAOi.js +0 -770
- package/dist/chunks/styles-P_gmFAOi.js.map +0 -1
- package/dist/chunks/styles-yed-Cs1nmrjn.js.map +0 -1
- package/dist/chunks/writer-DvHTl36J.js +0 -449
- package/dist/chunks/writer-DvHTl36J.js.map +0 -1
|
@@ -1,1070 +1,16 @@
|
|
|
1
1
|
import { GraphFormatError, INVALID_INDEX } from "@graphty/graph-format";
|
|
2
2
|
import { c as childrenCsr } from "./children-CA4coBi0.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { p as plural, a as agree, M as MIXED_DIRECTION_CODE, D as DIRECTION_FORCED_CODE, b as DIRECTION_REFUSED_CODE, S as SINK_OPTION_CODE, I as ID_MERGED_CODE, O as OPTION_IGNORED_CODE, C as COLUMN_RENAMED_CODE, R as ROLE_TAKEN_CODE, l as DUPLICATE_ATTRIBUTE_CODE, P as PRECISION_CODE, W as AMBIGUOUS_GRAPH_NAME_CODE, Y as GRAPH_NOT_FOUND_CODE, i as MULTIPLE_GRAPHS_CODE, r as ENCODING_CONFLICT_CODE, s as UNKNOWN_ENCODING_CODE, t as ENCODING_FALLBACK_CODE, u as INVALID_ENCODING_CODE, v as INVALID_UTF8_CODE, E as EMPTY_INPUT_CODE, Q as SYNTAX_CODE, y as ELEMENT_ISSUE, z as INPUT_ISSUE, K as ImportReportBuilder } from "./report-
|
|
7
|
-
import { i as inferTextDtype, W as WIDENING_UNSUPPORTED_CODE, p as parseTextCell, T as TextCellWriter } from "./text-
|
|
3
|
+
import { p as pairFolding, f as formatF32, a as formatF64, i as idText, d as formatDecimal, c as formatInteger, D as DirectionResolver } from "./format-BXiAb-1h.js";
|
|
4
|
+
import { q as quoteDotId, f as isWritableDotText } from "./escape-CuCIzNMB.js";
|
|
5
|
+
import { L as LOSS, c as capabilities, r as resolveExportOptions, a as checkCapabilities, G as countMixedEdges, e as explicitWeights, z as sanitizeIds, H as canonicalId, b as resolveImportOptions, d as reportUnusedOptions, f as reportSinkOptions, h as graphChosen, I as IdCoercer, p as parseWeightText, i as declareResolved } from "./export-Cha4dRFz.js";
|
|
6
|
+
import { p as plural, a as agree, M as MIXED_DIRECTION_CODE, D as DIRECTION_FORCED_CODE, b as DIRECTION_REFUSED_CODE, S as SINK_OPTION_CODE, I as ID_MERGED_CODE, O as OPTION_IGNORED_CODE, C as COLUMN_RENAMED_CODE, R as ROLE_TAKEN_CODE, l as DUPLICATE_ATTRIBUTE_CODE, P as PRECISION_CODE, W as AMBIGUOUS_GRAPH_NAME_CODE, Y as GRAPH_NOT_FOUND_CODE, i as MULTIPLE_GRAPHS_CODE, r as ENCODING_CONFLICT_CODE, s as UNKNOWN_ENCODING_CODE, t as ENCODING_FALLBACK_CODE, u as INVALID_ENCODING_CODE, v as INVALID_UTF8_CODE, E as EMPTY_INPUT_CODE, Q as SYNTAX_CODE, y as ELEMENT_ISSUE, z as INPUT_ISSUE, K as ImportReportBuilder } from "./report-CwMfYa9J.js";
|
|
7
|
+
import { i as inferTextDtype, W as WIDENING_UNSUPPORTED_CODE, p as parseTextCell, T as TextCellWriter } from "./text-ystE2bYi.js";
|
|
8
8
|
import { j as joinText, e as encodeChunks, i as indentUnit } from "./writer-DxjgHwSe.js";
|
|
9
|
-
import { i as
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
import { s as sharedInExportCall } from "./writer-DvHTl36J.js";
|
|
15
|
-
import { v as valueColumns } from "./styles-yed-Cs1nmrjn.js";
|
|
16
|
-
const DOT_FORMAT = "dot";
|
|
17
|
-
const DOT_ORIGIN = Object.freeze({ format: DOT_FORMAT });
|
|
18
|
-
const CLUSTER_COLUMN = "graphty.cluster";
|
|
19
|
-
const PARENT_COLUMN = "graphty.parent";
|
|
20
|
-
const SOURCE_PORT_COLUMN = "graphty.sourcePort";
|
|
21
|
-
const TARGET_PORT_COLUMN = "graphty.targetPort";
|
|
22
|
-
const LABEL_ATTRIBUTE = "label";
|
|
23
|
-
const POS_ATTRIBUTE = "pos";
|
|
24
|
-
const POSITION_COLUMN = "graphty.position";
|
|
25
|
-
const KEY_ATTRIBUTE = "key";
|
|
26
|
-
const PIN_ATTRIBUTE = "pin";
|
|
27
|
-
const DOT_META_KEY = "dot";
|
|
28
|
-
const DOT_STYLE_CAPABILITIES = Object.freeze({
|
|
29
|
-
tool: "graphviz",
|
|
30
|
-
node: Object.freeze([
|
|
31
|
-
"fill",
|
|
32
|
-
"fillOpacity",
|
|
33
|
-
"borderColor",
|
|
34
|
-
"borderWidth",
|
|
35
|
-
"borderStyle",
|
|
36
|
-
"shape",
|
|
37
|
-
"width",
|
|
38
|
-
"height",
|
|
39
|
-
"label",
|
|
40
|
-
"labelColor",
|
|
41
|
-
"labelSize",
|
|
42
|
-
"labelFont",
|
|
43
|
-
"tooltip",
|
|
44
|
-
"visible"
|
|
45
|
-
]),
|
|
46
|
-
edge: Object.freeze([
|
|
47
|
-
"color",
|
|
48
|
-
"opacity",
|
|
49
|
-
"width",
|
|
50
|
-
"lineStyle",
|
|
51
|
-
"sourceArrow",
|
|
52
|
-
"targetArrow",
|
|
53
|
-
"arrowSize",
|
|
54
|
-
"label",
|
|
55
|
-
"sourceLabel",
|
|
56
|
-
"targetLabel",
|
|
57
|
-
"labelColor",
|
|
58
|
-
"labelSize",
|
|
59
|
-
"labelFont",
|
|
60
|
-
"tooltip",
|
|
61
|
-
"visible"
|
|
62
|
-
]),
|
|
63
|
-
graph: Object.freeze(["background"]),
|
|
64
|
-
block: "native"
|
|
65
|
-
});
|
|
66
|
-
const NAME_KEY = "name";
|
|
67
|
-
const DIRECTED_KEY = "directed";
|
|
68
|
-
const CLUSTER_KEY = "cluster";
|
|
69
|
-
const NODE_ATTRIBUTES = [
|
|
70
|
-
"colorscheme",
|
|
71
|
-
"color",
|
|
72
|
-
"fillcolor",
|
|
73
|
-
"bgcolor",
|
|
74
|
-
"pencolor",
|
|
75
|
-
"style",
|
|
76
|
-
"shape",
|
|
77
|
-
"width",
|
|
78
|
-
"height",
|
|
79
|
-
"fixedsize",
|
|
80
|
-
"regular",
|
|
81
|
-
"penwidth",
|
|
82
|
-
"fontname",
|
|
83
|
-
"fontsize",
|
|
84
|
-
"fontcolor",
|
|
85
|
-
"tooltip"
|
|
86
|
-
];
|
|
87
|
-
const EDGE_ATTRIBUTES = [
|
|
88
|
-
"colorscheme",
|
|
89
|
-
"color",
|
|
90
|
-
"style",
|
|
91
|
-
"penwidth",
|
|
92
|
-
"fontname",
|
|
93
|
-
"fontsize",
|
|
94
|
-
"fontcolor",
|
|
95
|
-
"tooltip",
|
|
96
|
-
"edgetooltip",
|
|
97
|
-
"arrowhead",
|
|
98
|
-
"arrowtail",
|
|
99
|
-
"dir",
|
|
100
|
-
"arrowsize",
|
|
101
|
-
"headlabel",
|
|
102
|
-
"taillabel"
|
|
103
|
-
];
|
|
104
|
-
const NOTED_ATTRIBUTES = ["peripheries", "xlabel"];
|
|
105
|
-
const CIRCLE_LIKE = /* @__PURE__ */ new Set(["circle", "doublecircle", "mcircle", "square", "msquare"]);
|
|
106
|
-
const BOX_LIKE = /* @__PURE__ */ new Set(["box", "rect", "rectangle", "square"]);
|
|
107
|
-
const ELLIPSE_LIKE = /* @__PURE__ */ new Set(["", "ellipse", "oval", "circle"]);
|
|
108
|
-
const NO_OUTLINE = /* @__PURE__ */ new Set(["plain", "plaintext", "none"]);
|
|
109
|
-
const RECORD = /* @__PURE__ */ new Set(["record", "mrecord"]);
|
|
110
|
-
const TRUE_TEXTS$1 = /* @__PURE__ */ new Set(["true", "yes", "shape"]);
|
|
111
|
-
const POINT_SIZE = 0.05;
|
|
112
|
-
const REGULAR_SIZE = 0.5;
|
|
113
|
-
function isHtmlString(text) {
|
|
114
|
-
if (text.length < 2 || !text.startsWith("<") || !text.endsWith(">")) {
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
let depth = 0;
|
|
118
|
-
for (let i = 0; i < text.length; i++) {
|
|
119
|
-
const c = text.codePointAt(i);
|
|
120
|
-
if (c === 60) {
|
|
121
|
-
depth++;
|
|
122
|
-
} else if (c === 62) {
|
|
123
|
-
depth--;
|
|
124
|
-
if (depth === 0 && i !== text.length - 1) {
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
return depth === 0;
|
|
130
|
-
}
|
|
131
|
-
function cellText$1(table, name, i) {
|
|
132
|
-
if (!table.has(name)) {
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
|
-
const v = plainCell(table.value(name, i));
|
|
136
|
-
if (typeof v === "string") {
|
|
137
|
-
return v;
|
|
138
|
-
}
|
|
139
|
-
return typeof v === "number" || typeof v === "boolean" ? String(v) : null;
|
|
140
|
-
}
|
|
141
|
-
function nonEmpty(v) {
|
|
142
|
-
return v === null || v === "" ? null : v;
|
|
143
|
-
}
|
|
144
|
-
function styleTokens(raw, at) {
|
|
145
|
-
if (raw === null) {
|
|
146
|
-
return [];
|
|
147
|
-
}
|
|
148
|
-
if (raw.length > MAX_STYLE_VALUE_LENGTH) {
|
|
149
|
-
noteAt(at, STYLE_ISSUE.VALUE_TOO_LONG, `${String(raw.length)} characters`);
|
|
150
|
-
return [];
|
|
151
|
-
}
|
|
152
|
-
return raw.toLowerCase().split(",").map((t) => t.replace(/^[ \t\r\n]+/, "")).filter((t) => t !== "");
|
|
153
|
-
}
|
|
154
|
-
function setLineWidth(tokens) {
|
|
155
|
-
for (const t of tokens) {
|
|
156
|
-
if (t.startsWith("setlinewidth(") && t.endsWith(")")) {
|
|
157
|
-
return t.slice("setlinewidth(".length, -1).trim();
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
function isTrue(raw) {
|
|
163
|
-
if (raw === null) {
|
|
164
|
-
return false;
|
|
165
|
-
}
|
|
166
|
-
const t = raw.trim().toLowerCase();
|
|
167
|
-
return TRUE_TEXTS$1.has(t) || /^-?\d+$/.test(t) && Number(t) !== 0;
|
|
168
|
-
}
|
|
169
|
-
function labelText(raw, names, html, record, at) {
|
|
170
|
-
if (isHtmlString(raw)) {
|
|
171
|
-
return htmlLabelText(raw, at);
|
|
172
|
-
}
|
|
173
|
-
if (html.has(`<${raw}>`)) {
|
|
174
|
-
return htmlLabelText(`<${raw}>`, at);
|
|
175
|
-
}
|
|
176
|
-
return dotLabelText(record ? recordLabelText(raw, at) : raw, names, at);
|
|
177
|
-
}
|
|
178
|
-
function readColor(raw, scheme, use, property, opacity, put, at) {
|
|
179
|
-
if (raw === null) {
|
|
180
|
-
return null;
|
|
181
|
-
}
|
|
182
|
-
const c = canonColor(raw, "graphviz", at(property), { scheme, use });
|
|
183
|
-
if (c === null) {
|
|
184
|
-
return null;
|
|
185
|
-
}
|
|
186
|
-
put(property, c.color);
|
|
187
|
-
if (opacity !== null) {
|
|
188
|
-
put(opacity, c.alpha);
|
|
189
|
-
} else if (c.alpha > 0 || property !== "borderColor") {
|
|
190
|
-
colorOpacity(c, null, at(property), false);
|
|
191
|
-
}
|
|
192
|
-
return c.alpha;
|
|
193
|
-
}
|
|
194
|
-
function inchesOf(points) {
|
|
195
|
-
const want = num6(points);
|
|
196
|
-
for (let digits = 6; digits < 17; digits++) {
|
|
197
|
-
const inches2 = Number((points / DOT_POINTS_PER_INCH).toPrecision(digits));
|
|
198
|
-
if (num6(inches2 * DOT_POINTS_PER_INCH) === want) {
|
|
199
|
-
return inches2 + 0;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
return points / DOT_POINTS_PER_INCH;
|
|
203
|
-
}
|
|
204
|
-
function inches(raw, at) {
|
|
205
|
-
if (raw === null) {
|
|
206
|
-
return null;
|
|
207
|
-
}
|
|
208
|
-
const v = raw.trim() === "" ? Number.NaN : Number(raw);
|
|
209
|
-
if (!Number.isFinite(v) || v < 0) {
|
|
210
|
-
noteAt(at, STYLE_ISSUE.BAD_VALUE, raw.slice(0, MAX_STYLE_VALUE_LENGTH));
|
|
211
|
-
return null;
|
|
212
|
-
}
|
|
213
|
-
return v;
|
|
214
|
-
}
|
|
215
|
-
function readCommon(get, tokens, scheme, names, put, at) {
|
|
216
|
-
if (tokens.includes("invis")) {
|
|
217
|
-
put("visible", false);
|
|
218
|
-
}
|
|
219
|
-
readColor(nonEmpty(get("fontcolor")), scheme, "line", "labelColor", null, put, at);
|
|
220
|
-
const size = get("fontsize");
|
|
221
|
-
put("labelSize", size === null ? null : canonNumber(size, at("labelSize")));
|
|
222
|
-
const font = get("fontname");
|
|
223
|
-
if (font !== null && font.length <= MAX_STYLE_VALUE_LENGTH) {
|
|
224
|
-
put("labelFont", font);
|
|
225
|
-
}
|
|
226
|
-
const tip = get("tooltip") ?? get("edgetooltip");
|
|
227
|
-
if (tip !== null) {
|
|
228
|
-
put("tooltip", dotLabelText(tip, names, at("tooltip")));
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
function readNode(get, cx, put, at) {
|
|
232
|
-
const tokens = styleTokens(get("style"), at("visible"));
|
|
233
|
-
const shapeRaw = nonEmpty(get("shape"));
|
|
234
|
-
const shape = (shapeRaw ?? "").toLowerCase();
|
|
235
|
-
const n = {
|
|
236
|
-
get,
|
|
237
|
-
cx,
|
|
238
|
-
put,
|
|
239
|
-
at,
|
|
240
|
-
tokens,
|
|
241
|
-
shapeRaw,
|
|
242
|
-
shape,
|
|
243
|
-
point: !cx.cluster && shape === "point",
|
|
244
|
-
scheme: get("colorscheme"),
|
|
245
|
-
color: nonEmpty(get("color"))
|
|
246
|
-
};
|
|
247
|
-
const names = cx.cluster ? { graph: cx.name } : { node: cx.name, graph: cx.graph, edge: "" };
|
|
248
|
-
readCommon(get, tokens, n.scheme, names, put, at);
|
|
249
|
-
if (cx.cluster) {
|
|
250
|
-
readClusterFill(n);
|
|
251
|
-
} else {
|
|
252
|
-
readNodeFill(n);
|
|
253
|
-
}
|
|
254
|
-
readNodeOutline(n);
|
|
255
|
-
readNodeShape(n);
|
|
256
|
-
const label = n.point ? null : get(LABEL_ATTRIBUTE);
|
|
257
|
-
if (label !== null) {
|
|
258
|
-
put("label", labelText(label, names, cx.html, RECORD.has(shape), at("label")));
|
|
259
|
-
}
|
|
260
|
-
if (!cx.cluster) {
|
|
261
|
-
readSize(get, shape, n.point, label ?? (n.point ? null : cx.name), put, at);
|
|
262
|
-
}
|
|
263
|
-
if (Number(get("peripheries")) > 1 || nonEmpty(get("xlabel")) !== null) {
|
|
264
|
-
noteAt(at("label"), STYLE_ISSUE.NOT_CARRIED, nonEmpty(get("xlabel")) === null ? "peripheries" : "xlabel");
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
function readClusterFill(n) {
|
|
268
|
-
const { get, tokens } = n;
|
|
269
|
-
const filled = tokens.includes("filled") || tokens.includes("radial") || tokens.includes("striped");
|
|
270
|
-
const bg = nonEmpty(get("bgcolor"));
|
|
271
|
-
const raw = filled ? nonEmpty(get("fillcolor")) ?? n.color ?? bg ?? "lightgrey" : bg;
|
|
272
|
-
readColor(raw, n.scheme, "fill", "fill", "fillOpacity", n.put, n.at);
|
|
273
|
-
}
|
|
274
|
-
function readNodeFill(n) {
|
|
275
|
-
const { shape, point } = n;
|
|
276
|
-
const fillcolor = nonEmpty(n.get("fillcolor"));
|
|
277
|
-
const filled = point || n.tokens.some(
|
|
278
|
-
(t) => t === "filled" || t === "radial" || t === "striped" && BOX_LIKE.has(shape) || t === "wedged" && ELLIPSE_LIKE.has(shape)
|
|
279
|
-
);
|
|
280
|
-
if (filled) {
|
|
281
|
-
const raw = fillcolor ?? n.color ?? (point ? "black" : "lightgrey");
|
|
282
|
-
readColor(raw, n.scheme, "fill", "fill", "fillOpacity", n.put, n.at);
|
|
283
|
-
} else if (fillcolor !== null) {
|
|
284
|
-
noteAt(n.at("fill"), STYLE_ISSUE.UNFILLED, fillcolor.slice(0, MAX_STYLE_VALUE_LENGTH));
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
function readNodeOutline(n) {
|
|
288
|
-
const { get, cx, put, at, tokens } = n;
|
|
289
|
-
if (!cx.cluster && NO_OUTLINE.has(n.shape)) {
|
|
290
|
-
put("borderWidth", 0);
|
|
291
|
-
} else {
|
|
292
|
-
const outline = cx.cluster ? nonEmpty(get("pencolor")) ?? n.color : n.color;
|
|
293
|
-
const alpha = readColor(outline, n.scheme, "line", "borderColor", null, put, at);
|
|
294
|
-
const width = nonEmpty(get("penwidth")) ?? setLineWidth(tokens);
|
|
295
|
-
if (alpha === 0) {
|
|
296
|
-
put("borderWidth", 0);
|
|
297
|
-
} else if (width !== null) {
|
|
298
|
-
put("borderWidth", penWidth(width, get("penwidth") !== null, at("borderWidth")));
|
|
299
|
-
} else if (tokens.includes("bold")) {
|
|
300
|
-
put("borderWidth", 2);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
if (tokens.includes("dashed")) {
|
|
304
|
-
put("borderStyle", "dashed");
|
|
305
|
-
} else if (tokens.includes("dotted")) {
|
|
306
|
-
put("borderStyle", "dotted");
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
function readNodeShape(n) {
|
|
310
|
-
const rounded = n.tokens.includes("rounded");
|
|
311
|
-
if (n.cx.cluster) {
|
|
312
|
-
n.put("shape", rounded ? "round-rectangle" : "rectangle");
|
|
313
|
-
} else if (n.shapeRaw !== null) {
|
|
314
|
-
n.put(
|
|
315
|
-
"shape",
|
|
316
|
-
rounded && BOX_LIKE.has(n.shape) ? "round-rectangle" : canonEnum("shape", n.shapeRaw, "graphviz", n.at("shape"))
|
|
317
|
-
);
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
function penWidth(raw, attribute, site) {
|
|
321
|
-
const value = Number(raw.trim());
|
|
322
|
-
if (attribute && Number.isFinite(value) && value < 0) {
|
|
323
|
-
noteAt(site, STYLE_ISSUE.BAD_VALUE, raw.slice(0, MAX_STYLE_VALUE_LENGTH));
|
|
324
|
-
return 0;
|
|
325
|
-
}
|
|
326
|
-
return canonNumber(raw, site);
|
|
327
|
-
}
|
|
328
|
-
function readSize(get, shape, point, label, put, at) {
|
|
329
|
-
let w = inches(get("width"), at("width"));
|
|
330
|
-
let h = inches(get("height"), at("height"));
|
|
331
|
-
const same = point || CIRCLE_LIKE.has(shape) || isTrue(get("regular"));
|
|
332
|
-
if (shape === "plain") {
|
|
333
|
-
w = h = 0;
|
|
334
|
-
} else if (w === null && h === null) {
|
|
335
|
-
if (point) {
|
|
336
|
-
put("width", num6(POINT_SIZE * DOT_POINTS_PER_INCH));
|
|
337
|
-
put("height", num6(POINT_SIZE * DOT_POINTS_PER_INCH));
|
|
338
|
-
return;
|
|
339
|
-
}
|
|
340
|
-
if (!same) {
|
|
341
|
-
return;
|
|
342
|
-
}
|
|
343
|
-
w = h = REGULAR_SIZE;
|
|
344
|
-
}
|
|
345
|
-
let ww = w;
|
|
346
|
-
let hh = h;
|
|
347
|
-
if (point) {
|
|
348
|
-
ww = hh = Math.min(w ?? Infinity, h ?? Infinity);
|
|
349
|
-
} else if (same) {
|
|
350
|
-
ww = hh = Math.max(w ?? 0, h ?? 0);
|
|
351
|
-
}
|
|
352
|
-
const exact = point || isTrue(get("fixedsize")) || label === "" && !RECORD.has(shape);
|
|
353
|
-
if (!exact) {
|
|
354
|
-
noteAt(at("width"), STYLE_ISSUE.SIZE_MINIMUM, "grows to fit its label");
|
|
355
|
-
}
|
|
356
|
-
put("width", ww === null ? null : canonNumber(ww, at("width"), DOT_POINTS_PER_INCH));
|
|
357
|
-
put("height", hh === null ? null : canonNumber(hh, at("height"), DOT_POINTS_PER_INCH));
|
|
358
|
-
}
|
|
359
|
-
function readEdge(get, cx, put, at) {
|
|
360
|
-
const tokens = styleTokens(get("style"), at("visible"));
|
|
361
|
-
const scheme = get("colorscheme");
|
|
362
|
-
readCommon(get, tokens, scheme, cx.names, put, at);
|
|
363
|
-
readColor(nonEmpty(get("color")), scheme, "edge", "color", "opacity", put, at);
|
|
364
|
-
readEdgeLine(get, tokens, put, at);
|
|
365
|
-
readEdgeArrows(get, cx, put, at);
|
|
366
|
-
for (const [attribute, property] of [
|
|
367
|
-
[LABEL_ATTRIBUTE, "label"],
|
|
368
|
-
["headlabel", "targetLabel"],
|
|
369
|
-
["taillabel", "sourceLabel"]
|
|
370
|
-
]) {
|
|
371
|
-
const raw = get(attribute);
|
|
372
|
-
if (raw !== null) {
|
|
373
|
-
put(property, labelText(raw, cx.names, cx.html, false, at(property)));
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
if (nonEmpty(get("xlabel")) !== null) {
|
|
377
|
-
noteAt(at("label"), STYLE_ISSUE.NOT_CARRIED, "xlabel");
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
function readEdgeLine(get, tokens, put, at) {
|
|
381
|
-
const width = nonEmpty(get("penwidth")) ?? setLineWidth(tokens);
|
|
382
|
-
if (width !== null) {
|
|
383
|
-
put("width", penWidth(width, get("penwidth") !== null, at("width")));
|
|
384
|
-
} else if (tokens.includes("bold")) {
|
|
385
|
-
put("width", 2);
|
|
386
|
-
}
|
|
387
|
-
if (tokens.includes("dashed")) {
|
|
388
|
-
put("lineStyle", "dashed");
|
|
389
|
-
} else if (tokens.includes("dotted")) {
|
|
390
|
-
put("lineStyle", "dotted");
|
|
391
|
-
} else if (tokens.includes("solid") || tokens.includes("bold")) {
|
|
392
|
-
put("lineStyle", "solid");
|
|
393
|
-
} else if (tokens.includes("tapered")) {
|
|
394
|
-
put("lineStyle", "other:tapered");
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
function readEdgeArrows(get, cx, put, at) {
|
|
398
|
-
const dirRaw = nonEmpty(get("dir"));
|
|
399
|
-
const head = nonEmpty(get("arrowhead"));
|
|
400
|
-
const tail = nonEmpty(get("arrowtail"));
|
|
401
|
-
if (dirRaw !== null || head !== null || tail !== null) {
|
|
402
|
-
const dir = (dirRaw ?? (cx.directed ? "forward" : "none")).trim().toLowerCase();
|
|
403
|
-
const forward = dir === "forward" || dir === "both";
|
|
404
|
-
const back = dir === "back" || dir === "both";
|
|
405
|
-
put("targetArrow", forward ? canonEnum("arrow", head ?? "normal", "graphviz", at("targetArrow")) : "none");
|
|
406
|
-
put("sourceArrow", back ? canonEnum("arrow", tail ?? "normal", "graphviz", at("sourceArrow")) : "none");
|
|
407
|
-
}
|
|
408
|
-
const size = get("arrowsize");
|
|
409
|
-
if (size !== null) {
|
|
410
|
-
put("arrowSize", canonNumber(size, at("arrowSize")));
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
function htmlStrings(snapshot) {
|
|
414
|
-
const out = /* @__PURE__ */ new Set();
|
|
415
|
-
for (let i = 0; i < snapshot.nodeCount; i++) {
|
|
416
|
-
const id = snapshot.ids.idOf(i);
|
|
417
|
-
if (typeof id === "string" && isHtmlString(id)) {
|
|
418
|
-
out.add(id);
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
for (const [table, n] of [
|
|
422
|
-
[snapshot.nodes, snapshot.nodeCount],
|
|
423
|
-
[snapshot.edges, snapshot.edgeCount]
|
|
424
|
-
]) {
|
|
425
|
-
for (const name of [LABEL_ATTRIBUTE, "headlabel", "taillabel"].filter((c) => table.has(c))) {
|
|
426
|
-
addHtmlCells(table, name, n, out);
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
return out;
|
|
430
|
-
}
|
|
431
|
-
function addHtmlCells(table, name, n, out) {
|
|
432
|
-
for (let i = 0; i < n; i++) {
|
|
433
|
-
const v = cellText$1(table, name, i);
|
|
434
|
-
if (v !== null && isHtmlString(v)) {
|
|
435
|
-
out.add(v);
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
function directedEdges(snapshot) {
|
|
440
|
-
const out = new Array(snapshot.edgeCount).fill(snapshot.directed);
|
|
441
|
-
const col = snapshot.directed ? snapshot.edges.byRole("directed") : null;
|
|
442
|
-
if (col !== null) {
|
|
443
|
-
for (let e = 0; e < snapshot.edgeCount; e++) {
|
|
444
|
-
const v = plainCell(col.value(e));
|
|
445
|
-
if (typeof v === "boolean") {
|
|
446
|
-
out[e] = v;
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
return out;
|
|
451
|
-
}
|
|
452
|
-
function isCluster(snapshot, i) {
|
|
453
|
-
return snapshot.nodes.has(CLUSTER_COLUMN) && snapshot.nodes.value(CLUSTER_COLUMN, i) === true;
|
|
454
|
-
}
|
|
455
|
-
function contexts(snapshot, written = null) {
|
|
456
|
-
const html = htmlStrings(snapshot);
|
|
457
|
-
const graph = snapshot.meta.name ?? "";
|
|
458
|
-
const own = directedEdges(snapshot);
|
|
459
|
-
const directed = written === null || own.every((d) => d === snapshot.directed) ? own : own.map(() => written);
|
|
460
|
-
const name = (i) => String(snapshot.ids.idOf(i));
|
|
461
|
-
return {
|
|
462
|
-
node: (i) => ({ name: name(i), graph, cluster: isCluster(snapshot, i), html }),
|
|
463
|
-
edge: (e) => {
|
|
464
|
-
const tail = name(snapshot.edgeSource(e));
|
|
465
|
-
const head = name(snapshot.edgeTarget(e));
|
|
466
|
-
return {
|
|
467
|
-
names: { graph, tail, head, edge: `${tail}${directed[e] ? "->" : "--"}${head}` },
|
|
468
|
-
directed: directed[e],
|
|
469
|
-
html
|
|
470
|
-
};
|
|
471
|
-
}
|
|
472
|
-
};
|
|
473
|
-
}
|
|
474
|
-
function defaultLabel(cx, shape, notes) {
|
|
475
|
-
if (cx.cluster || shape === "point") {
|
|
476
|
-
return null;
|
|
477
|
-
}
|
|
478
|
-
const at = { notes, target: "node", property: "label" };
|
|
479
|
-
return isHtmlString(cx.name) ? htmlLabelText(cx.name, at) : dotLabelText(String.raw`\N`, { node: cx.name, graph: cx.graph }, at);
|
|
480
|
-
}
|
|
481
|
-
function styleColumns(table, attributes) {
|
|
482
|
-
const own = /* @__PURE__ */ new Set([...attributes, ...NOTED_ATTRIBUTES]);
|
|
483
|
-
return [...table.names()].filter((c) => own.has(c) || c.startsWith("graphty.style."));
|
|
484
|
-
}
|
|
485
|
-
function dotStyles(snapshot, context) {
|
|
486
|
-
const notes = new StyleNotes();
|
|
487
|
-
const cx = contexts(snapshot);
|
|
488
|
-
const node = valueColumns(snapshot.nodeCount);
|
|
489
|
-
const nameColumn = new Array(snapshot.nodeCount).fill(null);
|
|
490
|
-
const clusterColumn = new Array(snapshot.nodeCount).fill(null);
|
|
491
|
-
let named = 0;
|
|
492
|
-
let clusters = 0;
|
|
493
|
-
for (let i = 0; i < snapshot.nodeCount; i++) {
|
|
494
|
-
context.budget.spend("node", NODE_ATTRIBUTES.length);
|
|
495
|
-
const get = (name) => cellText$1(snapshot.nodes, name, i);
|
|
496
|
-
const ncx = cx.node(i);
|
|
497
|
-
const at = (property) => ({ notes, target: "node", property, element: i, budget: context.budget });
|
|
498
|
-
readNode(
|
|
499
|
-
get,
|
|
500
|
-
ncx,
|
|
501
|
-
(p, v) => {
|
|
502
|
-
node.put(i, p, v);
|
|
503
|
-
},
|
|
504
|
-
at
|
|
505
|
-
);
|
|
506
|
-
const shown = defaultLabel(ncx, (get("shape") ?? "").toLowerCase(), notes);
|
|
507
|
-
if (shown !== null) {
|
|
508
|
-
nameColumn[i] = shown;
|
|
509
|
-
named++;
|
|
510
|
-
}
|
|
511
|
-
if (ncx.cluster) {
|
|
512
|
-
clusterColumn[i] = true;
|
|
513
|
-
clusters++;
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
const edge = valueColumns(snapshot.edgeCount);
|
|
517
|
-
for (let e = 0; e < snapshot.edgeCount; e++) {
|
|
518
|
-
context.budget.spend("edge", EDGE_ATTRIBUTES.length);
|
|
519
|
-
const get = (name) => cellText$1(snapshot.edges, name, e);
|
|
520
|
-
const at = (property) => ({ notes, target: "edge", property, element: e, budget: context.budget });
|
|
521
|
-
readEdge(
|
|
522
|
-
get,
|
|
523
|
-
cx.edge(e),
|
|
524
|
-
(p, v) => {
|
|
525
|
-
edge.put(e, p, v);
|
|
526
|
-
},
|
|
527
|
-
at
|
|
528
|
-
);
|
|
529
|
-
}
|
|
530
|
-
const graph = {};
|
|
531
|
-
const bg = nonEmpty(cellText$1(snapshot.graph, "bgcolor", 0));
|
|
532
|
-
if (snapshot.graph.has("bgcolor") && bg !== null) {
|
|
533
|
-
readColor(
|
|
534
|
-
bg,
|
|
535
|
-
cellText$1(snapshot.graph, "colorscheme", 0),
|
|
536
|
-
"fill",
|
|
537
|
-
"background",
|
|
538
|
-
null,
|
|
539
|
-
(p, v) => {
|
|
540
|
-
if (v !== null) {
|
|
541
|
-
graph[p] = v;
|
|
542
|
-
}
|
|
543
|
-
},
|
|
544
|
-
(property) => ({ notes, target: "graph", property })
|
|
545
|
-
);
|
|
546
|
-
}
|
|
547
|
-
const blockText = cellText$1(snapshot.graph, STYLE_BLOCK_NAME, 0);
|
|
548
|
-
if (blockText !== null) {
|
|
549
|
-
exactFromBlock(snapshot, blockText, { node: node.values, edge: edge.values }, cx);
|
|
550
|
-
}
|
|
551
|
-
const nodeRules = [];
|
|
552
|
-
const nodeColumns = /* @__PURE__ */ new Map();
|
|
553
|
-
if (named > 0) {
|
|
554
|
-
nodeColumns.set(NAME_KEY, nameColumn);
|
|
555
|
-
nodeRules.push({
|
|
556
|
-
id: "node.tool.name-label",
|
|
557
|
-
target: "node",
|
|
558
|
-
role: "passthrough",
|
|
559
|
-
origin: "tool",
|
|
560
|
-
where: { has: { style: NAME_KEY } },
|
|
561
|
-
map: { label: { kind: "passthrough", by: { style: NAME_KEY } } },
|
|
562
|
-
facts: { elements: named, reason: "NODE_NAME" }
|
|
563
|
-
});
|
|
564
|
-
}
|
|
565
|
-
const features = clusters > 0 ? [{ ref: { style: CLUSTER_KEY }, values: clusterColumn }] : [];
|
|
566
|
-
const edgeRules = [];
|
|
567
|
-
const edgeColumns = /* @__PURE__ */ new Map();
|
|
568
|
-
const directed = directedEdges(snapshot);
|
|
569
|
-
if (directed.some(Boolean)) {
|
|
570
|
-
edgeColumns.set(
|
|
571
|
-
DIRECTED_KEY,
|
|
572
|
-
directed.map((d) => d ? true : null)
|
|
573
|
-
);
|
|
574
|
-
edgeRules.push({
|
|
575
|
-
id: "edge.tool.arrow",
|
|
576
|
-
target: "edge",
|
|
577
|
-
role: "group",
|
|
578
|
-
origin: "tool",
|
|
579
|
-
where: { has: { style: DIRECTED_KEY } },
|
|
580
|
-
set: { targetArrow: "triangle" }
|
|
581
|
-
});
|
|
582
|
-
}
|
|
583
|
-
return {
|
|
584
|
-
canonical: true,
|
|
585
|
-
dialect: "graphviz",
|
|
586
|
-
tool: "graphviz",
|
|
587
|
-
units: "px",
|
|
588
|
-
node: { values: node.values, rules: nodeRules, columns: nodeColumns, features },
|
|
589
|
-
edge: { values: edge.values, rules: edgeRules, columns: edgeColumns },
|
|
590
|
-
graph,
|
|
591
|
-
notes: notes.list(),
|
|
592
|
-
readFrom: {
|
|
593
|
-
node: styleColumns(snapshot.nodes, NODE_ATTRIBUTES),
|
|
594
|
-
edge: styleColumns(snapshot.edges, EDGE_ATTRIBUTES)
|
|
595
|
-
}
|
|
596
|
-
};
|
|
597
|
-
}
|
|
598
|
-
const SHAPES = /* @__PURE__ */ new Map([
|
|
599
|
-
["ellipse", "ellipse"],
|
|
600
|
-
["rectangle", "box"],
|
|
601
|
-
["round-rectangle", "box"],
|
|
602
|
-
["triangle", "triangle"],
|
|
603
|
-
["diamond", "diamond"],
|
|
604
|
-
["pentagon", "pentagon"],
|
|
605
|
-
["hexagon", "hexagon"],
|
|
606
|
-
["octagon", "octagon"],
|
|
607
|
-
["parallelogram", "parallelogram"],
|
|
608
|
-
["trapezoid", "trapezium"],
|
|
609
|
-
["star", "star"],
|
|
610
|
-
["none", "none"]
|
|
611
|
-
]);
|
|
612
|
-
const ARROWS = /* @__PURE__ */ new Map([
|
|
613
|
-
["none", "none"],
|
|
614
|
-
["triangle", "normal"],
|
|
615
|
-
["triangle-open", "onormal"],
|
|
616
|
-
["vee", "vee"],
|
|
617
|
-
["tee", "tee"],
|
|
618
|
-
["diamond", "diamond"],
|
|
619
|
-
["diamond-open", "odiamond"],
|
|
620
|
-
["circle", "dot"],
|
|
621
|
-
["circle-open", "odot"],
|
|
622
|
-
["square", "box"],
|
|
623
|
-
["crow", "crow"],
|
|
624
|
-
["half", "lnormal"],
|
|
625
|
-
["inverted", "inv"]
|
|
626
|
-
]);
|
|
627
|
-
const STROKES = /* @__PURE__ */ new Map([
|
|
628
|
-
["dashed", "dashed"],
|
|
629
|
-
["dotted", "dotted"]
|
|
630
|
-
]);
|
|
631
|
-
function graphvizDefaults(target) {
|
|
632
|
-
const t = toolDefaults("graphviz")?.[target];
|
|
633
|
-
const out = /* @__PURE__ */ new Map();
|
|
634
|
-
const add = (attribute, property, scale = 1) => {
|
|
635
|
-
const v = t[property]?.value;
|
|
636
|
-
if (typeof v === "number") {
|
|
637
|
-
out.set(attribute, num6(v / scale));
|
|
638
|
-
} else if (typeof v === "string") {
|
|
639
|
-
out.set(attribute, v);
|
|
640
|
-
}
|
|
641
|
-
};
|
|
642
|
-
add("fontcolor", "labelColor");
|
|
643
|
-
add("fontsize", "labelSize");
|
|
644
|
-
add("fontname", "labelFont");
|
|
645
|
-
if (target === "node") {
|
|
646
|
-
add("color", "borderColor");
|
|
647
|
-
add("pencolor", "borderColor");
|
|
648
|
-
add("penwidth", "borderWidth");
|
|
649
|
-
add("shape", "shape");
|
|
650
|
-
add("width", "width", DOT_POINTS_PER_INCH);
|
|
651
|
-
add("height", "height", DOT_POINTS_PER_INCH);
|
|
652
|
-
} else {
|
|
653
|
-
add("color", "color");
|
|
654
|
-
add("penwidth", "width");
|
|
655
|
-
add("arrowsize", "arrowSize");
|
|
656
|
-
}
|
|
657
|
-
return out;
|
|
658
|
-
}
|
|
659
|
-
const DEFAULT_ATTRIBUTES = {
|
|
660
|
-
node: graphvizDefaults("node"),
|
|
661
|
-
edge: graphvizDefaults("edge")
|
|
662
|
-
};
|
|
663
|
-
function withoutDefaults(out, target) {
|
|
664
|
-
for (const [attribute, value] of DEFAULT_ATTRIBUTES[target]) {
|
|
665
|
-
if (out.get(attribute) === value) {
|
|
666
|
-
out.delete(attribute);
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
if (!out.has("width") && !out.has("height")) {
|
|
670
|
-
out.delete("fixedsize");
|
|
671
|
-
}
|
|
672
|
-
return out;
|
|
673
|
-
}
|
|
674
|
-
function gvColor(color, opacity) {
|
|
675
|
-
if (typeof opacity !== "number" || opacity >= 1) {
|
|
676
|
-
return color;
|
|
677
|
-
}
|
|
678
|
-
const a = Math.max(0, Math.min(255, Math.round(opacity * 255)));
|
|
679
|
-
return color + a.toString(16).padStart(2, "0");
|
|
680
|
-
}
|
|
681
|
-
function escapeLabel(text) {
|
|
682
|
-
return text.replaceAll("\\", String.raw`\\`).replaceAll("\n", String.raw`\n`);
|
|
683
|
-
}
|
|
684
|
-
function spelled(table, value, nearest, property, approximate) {
|
|
685
|
-
const exact = table.get(value);
|
|
686
|
-
if (exact !== void 0) {
|
|
687
|
-
return exact;
|
|
688
|
-
}
|
|
689
|
-
if (value.startsWith("other:")) {
|
|
690
|
-
return value.slice("other:".length);
|
|
691
|
-
}
|
|
692
|
-
approximate(property, value);
|
|
693
|
-
return nearest;
|
|
694
|
-
}
|
|
695
|
-
function writeCommon(get, out, tokens) {
|
|
696
|
-
const color = get("labelColor");
|
|
697
|
-
if (typeof color === "string") {
|
|
698
|
-
out.set("fontcolor", color);
|
|
699
|
-
}
|
|
700
|
-
const size = get("labelSize");
|
|
701
|
-
if (typeof size === "number") {
|
|
702
|
-
out.set("fontsize", size);
|
|
703
|
-
}
|
|
704
|
-
const font = get("labelFont");
|
|
705
|
-
if (typeof font === "string") {
|
|
706
|
-
out.set("fontname", font);
|
|
707
|
-
}
|
|
708
|
-
const tip = get("tooltip");
|
|
709
|
-
if (typeof tip === "string") {
|
|
710
|
-
out.set("tooltip", escapeLabel(tip));
|
|
711
|
-
}
|
|
712
|
-
if (get("visible") === false) {
|
|
713
|
-
tokens.push("invis");
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
function nodeAttributes(get, cx, approximate, notes) {
|
|
717
|
-
const out = /* @__PURE__ */ new Map();
|
|
718
|
-
const tokens = [];
|
|
719
|
-
writeCommon(get, out, tokens);
|
|
720
|
-
writeNodeOutline(get, cx, approximate, out, tokens);
|
|
721
|
-
const gvShape = writeNodeShape(get, cx, approximate, out, tokens);
|
|
722
|
-
if (!cx.cluster) {
|
|
723
|
-
writeNodeSize(get, out);
|
|
724
|
-
}
|
|
725
|
-
const label = get("label");
|
|
726
|
-
const shown = defaultLabel(cx, gvShape, notes);
|
|
727
|
-
if (typeof label === "string" && label !== shown) {
|
|
728
|
-
out.set(LABEL_ATTRIBUTE, escapeLabel(label));
|
|
729
|
-
} else if (label === null && shown !== null) {
|
|
730
|
-
out.set(LABEL_ATTRIBUTE, "");
|
|
731
|
-
}
|
|
732
|
-
if (tokens.length > 0) {
|
|
733
|
-
out.set("style", tokens.join(","));
|
|
734
|
-
}
|
|
735
|
-
return withoutDefaults(out, "node");
|
|
736
|
-
}
|
|
737
|
-
function writeNodeOutline(get, cx, approximate, out, tokens) {
|
|
738
|
-
const fill = get("fill");
|
|
739
|
-
const fillOpacity = get("fillOpacity");
|
|
740
|
-
if (typeof fill === "string" && fillOpacity !== 0) {
|
|
741
|
-
tokens.push("filled");
|
|
742
|
-
out.set("fillcolor", gvColor(fill, fillOpacity));
|
|
743
|
-
}
|
|
744
|
-
const border = get("borderColor");
|
|
745
|
-
if (typeof border === "string") {
|
|
746
|
-
out.set(cx.cluster ? "pencolor" : "color", border);
|
|
747
|
-
}
|
|
748
|
-
const borderWidth = get("borderWidth");
|
|
749
|
-
if (typeof borderWidth === "number") {
|
|
750
|
-
out.set("penwidth", borderWidth);
|
|
751
|
-
}
|
|
752
|
-
const borderStyle = get("borderStyle");
|
|
753
|
-
if (typeof borderStyle === "string" && borderStyle !== "solid") {
|
|
754
|
-
const nearest = borderStyle.includes("dash") ? "dashed" : "solid";
|
|
755
|
-
tokens.push(spelled(STROKES, borderStyle, nearest, "borderStyle", approximate));
|
|
756
|
-
}
|
|
757
|
-
}
|
|
758
|
-
function writeNodeShape(get, cx, approximate, out, tokens) {
|
|
759
|
-
const shape = get("shape");
|
|
760
|
-
if (typeof shape !== "string") {
|
|
761
|
-
return "";
|
|
762
|
-
}
|
|
763
|
-
if (shape === "round-rectangle") {
|
|
764
|
-
tokens.push("rounded");
|
|
765
|
-
}
|
|
766
|
-
if (cx.cluster) {
|
|
767
|
-
if (shape !== "rectangle" && shape !== "round-rectangle") {
|
|
768
|
-
approximate("shape", shape);
|
|
769
|
-
}
|
|
770
|
-
return "";
|
|
771
|
-
}
|
|
772
|
-
const gvShape = spelled(SHAPES, shape, shape === "vee" ? "invtriangle" : "box", "shape", approximate);
|
|
773
|
-
out.set("shape", gvShape);
|
|
774
|
-
return gvShape;
|
|
775
|
-
}
|
|
776
|
-
function writeNodeSize(get, out) {
|
|
777
|
-
const width = get("width");
|
|
778
|
-
const height = get("height");
|
|
779
|
-
if (typeof width === "number" || typeof height === "number") {
|
|
780
|
-
out.set("fixedsize", "true");
|
|
781
|
-
}
|
|
782
|
-
if (typeof width === "number") {
|
|
783
|
-
out.set("width", inchesOf(width));
|
|
784
|
-
}
|
|
785
|
-
if (typeof height === "number") {
|
|
786
|
-
out.set("height", inchesOf(height));
|
|
787
|
-
}
|
|
788
|
-
}
|
|
789
|
-
function edgeAttributes(get, directed, approximate) {
|
|
790
|
-
const out = /* @__PURE__ */ new Map();
|
|
791
|
-
const tokens = [];
|
|
792
|
-
writeCommon(get, out, tokens);
|
|
793
|
-
const color = get("color");
|
|
794
|
-
if (typeof color === "string") {
|
|
795
|
-
out.set("color", gvColor(color, get("opacity")));
|
|
796
|
-
}
|
|
797
|
-
const width = get("width");
|
|
798
|
-
if (typeof width === "number") {
|
|
799
|
-
out.set("penwidth", width);
|
|
800
|
-
}
|
|
801
|
-
const line = get("lineStyle");
|
|
802
|
-
if (typeof line === "string" && line !== "solid") {
|
|
803
|
-
tokens.push(spelled(STROKES, line, line.includes("dash") ? "dashed" : "solid", "lineStyle", approximate));
|
|
804
|
-
}
|
|
805
|
-
writeEdgeArrows(get, directed, approximate, out);
|
|
806
|
-
const arrowSize = get("arrowSize");
|
|
807
|
-
if (typeof arrowSize === "number") {
|
|
808
|
-
out.set("arrowsize", arrowSize);
|
|
809
|
-
}
|
|
810
|
-
for (const [property, attribute] of [
|
|
811
|
-
["label", LABEL_ATTRIBUTE],
|
|
812
|
-
["targetLabel", "headlabel"],
|
|
813
|
-
["sourceLabel", "taillabel"]
|
|
814
|
-
]) {
|
|
815
|
-
const v = get(property);
|
|
816
|
-
if (typeof v === "string") {
|
|
817
|
-
out.set(attribute, escapeLabel(v));
|
|
818
|
-
}
|
|
819
|
-
}
|
|
820
|
-
if (tokens.length > 0) {
|
|
821
|
-
out.set("style", tokens.join(","));
|
|
822
|
-
}
|
|
823
|
-
return withoutDefaults(out, "edge");
|
|
824
|
-
}
|
|
825
|
-
function writeEdgeArrows(get, directed, approximate, out) {
|
|
826
|
-
const source = get("sourceArrow");
|
|
827
|
-
const target = get("targetArrow");
|
|
828
|
-
const tail = typeof source === "string" && source !== "none";
|
|
829
|
-
const head = typeof target === "string" && target !== "none";
|
|
830
|
-
const plain = directed ? head && !tail && target === "triangle" : !head && !tail;
|
|
831
|
-
if (plain || source === null && target === null) {
|
|
832
|
-
return;
|
|
833
|
-
}
|
|
834
|
-
let dir = "none";
|
|
835
|
-
if (head && tail) {
|
|
836
|
-
dir = "both";
|
|
837
|
-
} else if (head) {
|
|
838
|
-
dir = "forward";
|
|
839
|
-
} else if (tail) {
|
|
840
|
-
dir = "back";
|
|
841
|
-
}
|
|
842
|
-
out.set("dir", dir);
|
|
843
|
-
if (head) {
|
|
844
|
-
out.set("arrowhead", spelled(ARROWS, target, "normal", "targetArrow", approximate));
|
|
845
|
-
}
|
|
846
|
-
if (tail) {
|
|
847
|
-
out.set("arrowtail", spelled(ARROWS, source, "normal", "sourceArrow", approximate));
|
|
848
|
-
}
|
|
849
|
-
}
|
|
850
|
-
function getter(picture, target) {
|
|
851
|
-
const columns = /* @__PURE__ */ new Map();
|
|
852
|
-
for (const p of DOT_STYLE_CAPABILITIES[target]) {
|
|
853
|
-
columns.set(p, picture(target, p));
|
|
854
|
-
}
|
|
855
|
-
return (i) => (property) => columns.get(property)?.[i] ?? null;
|
|
856
|
-
}
|
|
857
|
-
function exactFromBlock(snapshot, text, read, cx) {
|
|
858
|
-
const parsed = parseStyleBlock(text, styleFingerprint(snapshot));
|
|
859
|
-
const ex = parsed.ok ? blockStyles(parsed.block, snapshot, "dot") : null;
|
|
860
|
-
if (ex === null) {
|
|
861
|
-
return;
|
|
862
|
-
}
|
|
863
|
-
const notes = new StyleNotes();
|
|
864
|
-
for (const target of ["node", "edge"]) {
|
|
865
|
-
const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
|
|
866
|
-
const get = getter((t, p) => resolveStyles(ex, t, p, snapshot), target);
|
|
867
|
-
const values = read[target];
|
|
868
|
-
for (let i = 0; i < n; i++) {
|
|
869
|
-
const want = get(i);
|
|
870
|
-
const back = writtenAndReadBack(target, i, want, cx, notes);
|
|
871
|
-
for (const property of DOT_STYLE_CAPABILITIES[target]) {
|
|
872
|
-
const native = values[property]?.[i] ?? null;
|
|
873
|
-
const w = want(property);
|
|
874
|
-
if (native !== w && native === (back.get(property) ?? null)) {
|
|
875
|
-
values[property] ??= new Array(n).fill(null);
|
|
876
|
-
values[property][i] = w;
|
|
877
|
-
}
|
|
878
|
-
}
|
|
879
|
-
}
|
|
880
|
-
}
|
|
881
|
-
}
|
|
882
|
-
function writtenAndReadBack(target, i, want, cx, notes) {
|
|
883
|
-
const ignore = () => void 0;
|
|
884
|
-
const back = /* @__PURE__ */ new Map();
|
|
885
|
-
const put = (property, value) => {
|
|
886
|
-
if (value !== null) {
|
|
887
|
-
back.set(property, value);
|
|
888
|
-
}
|
|
889
|
-
};
|
|
890
|
-
const at = (property) => ({ notes, target, property });
|
|
891
|
-
if (target === "node") {
|
|
892
|
-
const ncx = cx.node(i);
|
|
893
|
-
const attrs = nodeAttributes(want, ncx, ignore, notes);
|
|
894
|
-
readNode((name) => textOf(attrs.get(name)), ncx, put, at);
|
|
895
|
-
} else {
|
|
896
|
-
const ecx = cx.edge(i);
|
|
897
|
-
const attrs = edgeAttributes(want, ecx.directed, ignore);
|
|
898
|
-
readEdge((name) => textOf(attrs.get(name)), ecx, put, at);
|
|
899
|
-
}
|
|
900
|
-
return back;
|
|
901
|
-
}
|
|
902
|
-
function textOf(v) {
|
|
903
|
-
return v === void 0 ? null : String(v);
|
|
904
|
-
}
|
|
905
|
-
function readsBack(col) {
|
|
906
|
-
const vals = col.filter((v) => v !== null);
|
|
907
|
-
if (vals.every((v) => typeof v === "number")) {
|
|
908
|
-
return vals.every((v) => Number.isFinite(v));
|
|
909
|
-
}
|
|
910
|
-
if (vals.every((v) => typeof v === "boolean")) {
|
|
911
|
-
return true;
|
|
912
|
-
}
|
|
913
|
-
if (vals.every((v) => typeof v === "string")) {
|
|
914
|
-
return vals.some((v) => inferTextDtype(v) === "string") && vals.every((v) => isWritableDotText(v));
|
|
915
|
-
}
|
|
916
|
-
return false;
|
|
917
|
-
}
|
|
918
|
-
function dotSafeJson(json) {
|
|
919
|
-
return json.replaceAll(/\\(["\\])/g, (_m, c) => c === '"' ? String.raw`\u0022` : String.raw`\u005c`);
|
|
920
|
-
}
|
|
921
|
-
function dotStyledExport(snapshot, input, onMixedDirection) {
|
|
922
|
-
if (input === void 0) {
|
|
923
|
-
return null;
|
|
924
|
-
}
|
|
925
|
-
return sharedInExportCall(
|
|
926
|
-
input,
|
|
927
|
-
[snapshot, onMixedDirection],
|
|
928
|
-
() => styledExport(snapshot, input, onMixedDirection)
|
|
929
|
-
);
|
|
930
|
-
}
|
|
931
|
-
function styledExport(snapshot, input, onMixedDirection) {
|
|
932
|
-
const approximated = new StyleApproximations();
|
|
933
|
-
const replaced = [];
|
|
934
|
-
const out = snapshot.withColumns();
|
|
935
|
-
const written = onMixedDirection === "directed" || onMixedDirection === "undirected";
|
|
936
|
-
const cx = contexts(snapshot, written ? onMixedDirection === "directed" : null);
|
|
937
|
-
const notes = new StyleNotes();
|
|
938
|
-
for (const target of ["node", "edge"]) {
|
|
939
|
-
const table = target === "node" ? out.nodes : out.edges;
|
|
940
|
-
const read = dataRead(input.rules.styles.rules, target);
|
|
941
|
-
const approximate = (property, value) => {
|
|
942
|
-
approximated.add(target, property, value);
|
|
943
|
-
};
|
|
944
|
-
const columns = attributeColumns(snapshot, input, target, { cx, approximate, notes, read });
|
|
945
|
-
replaced.push(...removeStyleAttributes(table, target, columns, read));
|
|
946
|
-
setAttributeColumns(table, columns);
|
|
947
|
-
}
|
|
948
|
-
const { background } = input.rules.styles.graph;
|
|
949
|
-
if (out.graph.has("bgcolor")) {
|
|
950
|
-
out.graph.remove("bgcolor");
|
|
951
|
-
}
|
|
952
|
-
if (typeof background === "string" && background !== toolDefaults("graphviz")?.graph.background?.value) {
|
|
953
|
-
out.graph.set("bgcolor", [background], { dtype: "string" });
|
|
954
|
-
}
|
|
955
|
-
const inline = [...input.tags.node.values(), ...input.tags.edge.values()].some((col) => !readsBack(col));
|
|
956
|
-
if (!inline) {
|
|
957
|
-
setTagColumns(out, input);
|
|
958
|
-
}
|
|
959
|
-
const block = inline ? writeStyleBlock(input.rules, { inlineColumns: true, snapshot }) : input.block;
|
|
960
|
-
out.graph.set(STYLE_BLOCK_NAME, [dotSafeJson(block)], { dtype: "string" });
|
|
961
|
-
const losses = approximated.notes("Graphviz");
|
|
962
|
-
if (inline) {
|
|
963
|
-
losses.push(...styleBlockLosses(block, input.rules.styles.rules.length, "size"));
|
|
964
|
-
}
|
|
965
|
-
return { snapshot: out, notes: [...replaced, ...losses] };
|
|
966
|
-
}
|
|
967
|
-
function attributeColumns(snapshot, input, target, w) {
|
|
968
|
-
const n = target === "node" ? snapshot.nodeCount : snapshot.edgeCount;
|
|
969
|
-
const get = getter((t, p) => input.picture(t, p), target);
|
|
970
|
-
const columns = /* @__PURE__ */ new Map();
|
|
971
|
-
for (let i = 0; i < n; i++) {
|
|
972
|
-
const attrs = target === "node" ? nodeAttributes(get(i), w.cx.node(i), w.approximate, w.notes) : edgeAttributes(get(i), w.cx.edge(i).directed, w.approximate);
|
|
973
|
-
if (w.read.has(LABEL_ATTRIBUTE) && attrs.get(LABEL_ATTRIBUTE) === "" && get(i)("label") === null) {
|
|
974
|
-
w.approximate("label", "");
|
|
975
|
-
}
|
|
976
|
-
for (const [name, value] of attrs) {
|
|
977
|
-
let col = columns.get(name);
|
|
978
|
-
if (col === void 0) {
|
|
979
|
-
col = new Array(n).fill(null);
|
|
980
|
-
columns.set(name, col);
|
|
981
|
-
}
|
|
982
|
-
col[i] = value;
|
|
983
|
-
}
|
|
984
|
-
}
|
|
985
|
-
return columns;
|
|
986
|
-
}
|
|
987
|
-
function removeStyleAttributes(table, target, columns, read) {
|
|
988
|
-
const attributes = target === "node" ? NODE_ATTRIBUTES : EDGE_ATTRIBUTES;
|
|
989
|
-
const replaced = [];
|
|
990
|
-
for (const name of table.names()) {
|
|
991
|
-
if (!attributes.includes(name) && name !== LABEL_ATTRIBUTE && !name.startsWith("graphty.style.")) {
|
|
992
|
-
continue;
|
|
993
|
-
}
|
|
994
|
-
const differs = read.has(name) ? replacedRows(table, name, columns.get(name)) : 0;
|
|
995
|
-
if (differs > 0) {
|
|
996
|
-
replaced.push(
|
|
997
|
-
Object.freeze({
|
|
998
|
-
code: DOT_ATTRIBUTE_CLASH_CODE,
|
|
999
|
-
message: `${target} column "${name}" is not written: the ${name} attribute holds what graphty draws (${String(differs)} ${target}${differs === 1 ? "" : "s"} differ)`,
|
|
1000
|
-
column: name,
|
|
1001
|
-
count: differs
|
|
1002
|
-
})
|
|
1003
|
-
);
|
|
1004
|
-
}
|
|
1005
|
-
table.remove(name);
|
|
1006
|
-
}
|
|
1007
|
-
return replaced;
|
|
1008
|
-
}
|
|
1009
|
-
function setAttributeColumns(table, columns) {
|
|
1010
|
-
for (const [name, col] of columns) {
|
|
1011
|
-
if (name === LABEL_ATTRIBUTE) {
|
|
1012
|
-
table.set(name, col, { dtype: "string", role: "label" }, { replaceRole: true });
|
|
1013
|
-
} else if (col.every((v) => v === null || typeof v === "number")) {
|
|
1014
|
-
table.set(name, col, { dtype: "f64" });
|
|
1015
|
-
} else {
|
|
1016
|
-
table.set(
|
|
1017
|
-
name,
|
|
1018
|
-
col.map((v) => v === null ? null : String(v)),
|
|
1019
|
-
{ dtype: "string" }
|
|
1020
|
-
);
|
|
1021
|
-
}
|
|
1022
|
-
}
|
|
1023
|
-
}
|
|
1024
|
-
function setTagColumns(out, input) {
|
|
1025
|
-
for (const target of ["node", "edge"]) {
|
|
1026
|
-
const table = target === "node" ? out.nodes : out.edges;
|
|
1027
|
-
for (const [name, col] of input.tags[target]) {
|
|
1028
|
-
const kinds = new Set(col.filter((v) => v !== null).map((v) => typeof v));
|
|
1029
|
-
let dtype = "string";
|
|
1030
|
-
if (kinds.has("number")) {
|
|
1031
|
-
dtype = "f64";
|
|
1032
|
-
} else if (kinds.has("boolean")) {
|
|
1033
|
-
dtype = "bool";
|
|
1034
|
-
}
|
|
1035
|
-
table.set(name, col, { dtype });
|
|
1036
|
-
}
|
|
1037
|
-
}
|
|
1038
|
-
}
|
|
1039
|
-
function dataRead(rules, target) {
|
|
1040
|
-
const out = /* @__PURE__ */ new Set();
|
|
1041
|
-
for (const { ext: _ext, ...rule } of rules.filter((r) => r.target === target)) {
|
|
1042
|
-
JSON.stringify(rule, (_k, v) => {
|
|
1043
|
-
if (typeof v === "object" && v !== null && !Array.isArray(v) && Object.keys(v).length === 1) {
|
|
1044
|
-
const { data } = v;
|
|
1045
|
-
if (typeof data === "string") {
|
|
1046
|
-
out.add(data);
|
|
1047
|
-
}
|
|
1048
|
-
}
|
|
1049
|
-
return v;
|
|
1050
|
-
});
|
|
1051
|
-
}
|
|
1052
|
-
return out;
|
|
1053
|
-
}
|
|
1054
|
-
const DOT_ATTRIBUTE_CLASH_CODE = "W_DOT_ATTRIBUTE_CLASH";
|
|
1055
|
-
function replacedRows(table, name, written) {
|
|
1056
|
-
const column = table.get(name);
|
|
1057
|
-
let n = 0;
|
|
1058
|
-
for (let i = 0; column !== null && i < column.length; i++) {
|
|
1059
|
-
const cell = column.isSet(i) ? plainCell(column.value(i)) : null;
|
|
1060
|
-
const w = written?.[i] ?? null;
|
|
1061
|
-
const text = typeof cell === "string" ? cell : JSON.stringify(cell);
|
|
1062
|
-
if (cell !== null && (w === null || String(w) !== text)) {
|
|
1063
|
-
n++;
|
|
1064
|
-
}
|
|
1065
|
-
}
|
|
1066
|
-
return n;
|
|
1067
|
-
}
|
|
9
|
+
import { b as DOT_ATTRIBUTE_CLASH_CODE, c as DOT_FORMAT, d as dotStyledExport, D as DOT_STYLE_CAPABILITIES, C as CLUSTER_COLUMN, P as POS_ATTRIBUTE, K as KEY_ATTRIBUTE, L as LABEL_ATTRIBUTE, R as RANK_COLUMN, a as RANK_SET_COLUMN, e as DOT_META_KEY, i as isHtmlString, f as PARENT_COLUMN, T as TARGET_PORT_COLUMN, S as SOURCE_PORT_COLUMN, h as dotStyles, j as DOT_ORIGIN, k as PIN_ATTRIBUTE, l as POSITION_COLUMN } from "./styles-boK6Ln54.js";
|
|
10
|
+
import { i as importChosenGraph } from "./choose-CczZJaX_.js";
|
|
11
|
+
import { r as readText, b as throwIfAborted, c as canonicalEncoding } from "./input-CAxt_aV-.js";
|
|
12
|
+
import { m as median } from "./convert-Ct2zelbQ.js";
|
|
13
|
+
const RANK_COLUMNS = /* @__PURE__ */ new Set([RANK_COLUMN, RANK_SET_COLUMN]);
|
|
1068
14
|
const DOT_LOSS = Object.freeze({
|
|
1069
15
|
/**
|
|
1070
16
|
* An id, name or text with a backslash before a quote or a line break, or at its end, cannot be written as a DOT
|
|
@@ -1447,7 +393,7 @@ class ExportPlan {
|
|
|
1447
393
|
*/
|
|
1448
394
|
writesNodeColumn(column) {
|
|
1449
395
|
const { name, role } = column.meta;
|
|
1450
|
-
if (!isTextualDtype(column) || name === CLUSTER_COLUMN) {
|
|
396
|
+
if (!isTextualDtype(column) || name === CLUSTER_COLUMN || RANK_COLUMNS.has(name)) {
|
|
1451
397
|
return false;
|
|
1452
398
|
}
|
|
1453
399
|
if (role !== null && SKIPPED_NODE_ROLES.has(role)) {
|
|
@@ -1703,9 +649,39 @@ class ExportPlan {
|
|
|
1703
649
|
for (let i = 0; i < snapshot.nodeCount; i++) {
|
|
1704
650
|
yield* this.writeNode(i, 1, emitted);
|
|
1705
651
|
}
|
|
652
|
+
yield* this.writeRanks();
|
|
1706
653
|
yield* this.writeEdges();
|
|
1707
654
|
yield "}\n";
|
|
1708
655
|
}
|
|
656
|
+
/**
|
|
657
|
+
* Write each rank subgraph the `graphty.rank` and `graphty.rankSet` columns hold, after the nodes: a named one
|
|
658
|
+
* under its name, an anonymous one (`%<n>`) as an anonymous subgraph.
|
|
659
|
+
* @yields the statements
|
|
660
|
+
* @returns nothing
|
|
661
|
+
*/
|
|
662
|
+
*writeRanks() {
|
|
663
|
+
const { nodes } = this.snapshot;
|
|
664
|
+
const rank = nodes.get(RANK_COLUMN);
|
|
665
|
+
const set = nodes.get(RANK_SET_COLUMN);
|
|
666
|
+
if (rank === null || set === null) {
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
const sets = /* @__PURE__ */ new Map();
|
|
670
|
+
for (let i = 0; i < this.snapshot.nodeCount; i++) {
|
|
671
|
+
if (rank.isSet(i) && set.isSet(i)) {
|
|
672
|
+
const key = String(set.value(i));
|
|
673
|
+
const entry = sets.get(key) ?? { rank: String(rank.value(i)), members: [] };
|
|
674
|
+
entry.members.push(writeId(this.idText(i)));
|
|
675
|
+
sets.set(key, entry);
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
const order = (key) => key.startsWith("%") ? Number(key.slice(1)) : -1;
|
|
679
|
+
for (const [key, entry] of [...sets].sort(([a], [b]) => order(a) - order(b))) {
|
|
680
|
+
const head = key.startsWith("%") ? "" : `subgraph ${quoteDotId(key)} `;
|
|
681
|
+
yield `${this.indent}${head}{ rank=${quoteDotId(entry.rank)}; ${entry.members.join("; ")}; }
|
|
682
|
+
`;
|
|
683
|
+
}
|
|
684
|
+
}
|
|
1709
685
|
/**
|
|
1710
686
|
* Write one node (and, for a container, its cluster block with the members nested).
|
|
1711
687
|
* @param i - the node index
|
|
@@ -2454,8 +1430,13 @@ const DOT_ISSUE = Object.freeze({
|
|
|
2454
1430
|
AMBIGUOUS_GRAPH_NAME: AMBIGUOUS_GRAPH_NAME_CODE,
|
|
2455
1431
|
/** A badly delimited numeral (`1e3`) split into two tokens, as Graphviz does with a warning. */
|
|
2456
1432
|
NUMERAL_AMBIGUITY: "W_DOT_NUMERAL_AMBIGUITY",
|
|
2457
|
-
/**
|
|
1433
|
+
/**
|
|
1434
|
+
* Attributes of a subgraph that is not a cluster cannot be represented, except its `rank`, which is kept in the
|
|
1435
|
+
* `graphty.rank` and `graphty.rankSet` node columns.
|
|
1436
|
+
*/
|
|
2458
1437
|
SUBGRAPH_ATTRIBUTES_DROPPED: "W_DOT_SUBGRAPH_ATTRIBUTES_DROPPED",
|
|
1438
|
+
/** A node in two rank subgraphs (`rank=same` and the like) keeps the first one's rank. */
|
|
1439
|
+
RANK_CONFLICT: "W_DOT_RANK_CONFLICT",
|
|
2459
1440
|
/** A port on a node statement has no meaning and was dropped. */
|
|
2460
1441
|
NODE_PORT_DROPPED: "W_DOT_NODE_PORT_DROPPED",
|
|
2461
1442
|
/** A plain node and a cluster share a name and were merged into one container node. */
|
|
@@ -2533,8 +1514,28 @@ const EXTENSIONS = Object.freeze([".dot", ".gv"]);
|
|
|
2533
1514
|
const MIME_TYPES = Object.freeze(["text/vnd.graphviz"]);
|
|
2534
1515
|
const CLUSTER_PREFIX = "cluster";
|
|
2535
1516
|
const CLUSTER_ATTRIBUTE = "cluster";
|
|
1517
|
+
const RANK_ATTRIBUTE = "rank";
|
|
1518
|
+
const RANK_KINDS = /* @__PURE__ */ new Set(["same", "min", "max", "source", "sink"]);
|
|
2536
1519
|
const STATEMENTS_PER_ABORT_CHECK = 64;
|
|
2537
1520
|
const MAX_ANCESTOR_WALK = 4096;
|
|
1521
|
+
const INHERITED_GRAPH_ATTRIBUTES = /* @__PURE__ */ new Set([
|
|
1522
|
+
"bgcolor",
|
|
1523
|
+
"color",
|
|
1524
|
+
"colorscheme",
|
|
1525
|
+
"fillcolor",
|
|
1526
|
+
"fontcolor",
|
|
1527
|
+
"fontname",
|
|
1528
|
+
"fontsize",
|
|
1529
|
+
"gradientangle",
|
|
1530
|
+
"label",
|
|
1531
|
+
"labeljust",
|
|
1532
|
+
"labelloc",
|
|
1533
|
+
"pencolor",
|
|
1534
|
+
"penwidth",
|
|
1535
|
+
"peripheries",
|
|
1536
|
+
"style",
|
|
1537
|
+
"tooltip"
|
|
1538
|
+
]);
|
|
2538
1539
|
const DOT_HEADER = /^\s*(strict\s+)?(di)?graph(?=[\s{"/]|$)(?!\s*\[)/i;
|
|
2539
1540
|
const TRUE_TEXTS = /* @__PURE__ */ new Set(["true", "yes", "1"]);
|
|
2540
1541
|
const COMPASS_POINTS = /* @__PURE__ */ new Set(["n", "ne", "e", "se", "s", "sw", "w", "nw", "c", "_"]);
|
|
@@ -2824,6 +1825,8 @@ class DotParser {
|
|
|
2824
1825
|
this.idOf = /* @__PURE__ */ new Map();
|
|
2825
1826
|
this.containers = /* @__PURE__ */ new Set();
|
|
2826
1827
|
this.parentOf = /* @__PURE__ */ new Map();
|
|
1828
|
+
this.inherited = /* @__PURE__ */ new Map();
|
|
1829
|
+
this.ownAttributes = /* @__PURE__ */ new Map();
|
|
2827
1830
|
this.conflictWarned = /* @__PURE__ */ new Set();
|
|
2828
1831
|
this.strictEdges = /* @__PURE__ */ new Map();
|
|
2829
1832
|
this.keyedEdges = /* @__PURE__ */ new Map();
|
|
@@ -2835,6 +1838,10 @@ class DotParser {
|
|
|
2835
1838
|
this.keyHandle = INVALID_INDEX;
|
|
2836
1839
|
this.sourcePortHandle = INVALID_INDEX;
|
|
2837
1840
|
this.targetPortHandle = INVALID_INDEX;
|
|
1841
|
+
this.rankHandle = INVALID_INDEX;
|
|
1842
|
+
this.rankSetHandle = INVALID_INDEX;
|
|
1843
|
+
this.rankSetOf = /* @__PURE__ */ new Map();
|
|
1844
|
+
this.anonymousRanks = 0;
|
|
2838
1845
|
this.depth = 0;
|
|
2839
1846
|
this.posDims = 0;
|
|
2840
1847
|
this.headCharset = void 0;
|
|
@@ -2892,6 +1899,7 @@ class DotParser {
|
|
|
2892
1899
|
});
|
|
2893
1900
|
const root = this.newScope(null, headerLine, true, null);
|
|
2894
1901
|
this.statementList(root);
|
|
1902
|
+
this.applyInherited();
|
|
2895
1903
|
return lexer.next();
|
|
2896
1904
|
}
|
|
2897
1905
|
/**
|
|
@@ -2913,6 +1921,7 @@ class DotParser {
|
|
|
2913
1921
|
memberSet: /* @__PURE__ */ new Set(),
|
|
2914
1922
|
containers: [],
|
|
2915
1923
|
attributes: /* @__PURE__ */ new Map(),
|
|
1924
|
+
graphDefaults: new Map(parent?.graphDefaults),
|
|
2916
1925
|
cluster: false,
|
|
2917
1926
|
container: INVALID_INDEX
|
|
2918
1927
|
};
|
|
@@ -3140,42 +2149,10 @@ class DotParser {
|
|
|
3140
2149
|
*/
|
|
3141
2150
|
closeScope(scope, parent) {
|
|
3142
2151
|
const { container } = scope;
|
|
3143
|
-
if (container
|
|
3144
|
-
|
|
3145
|
-
if (attribute.name !== CLUSTER_ATTRIBUTE) {
|
|
3146
|
-
this.setNodeAttribute(container, attribute.name, attribute.value, attribute.line);
|
|
3147
|
-
}
|
|
3148
|
-
}
|
|
3149
|
-
for (const nested of scope.containers) {
|
|
3150
|
-
if (nested !== container && !this.parentOf.has(nested)) {
|
|
3151
|
-
this.setParent(nested, container);
|
|
3152
|
-
}
|
|
3153
|
-
}
|
|
3154
|
-
for (const member of scope.members) {
|
|
3155
|
-
if (member === container) {
|
|
3156
|
-
continue;
|
|
3157
|
-
}
|
|
3158
|
-
const existing = this.parentOf.get(member);
|
|
3159
|
-
if (existing === void 0) {
|
|
3160
|
-
this.setParent(member, container);
|
|
3161
|
-
} else if (existing !== container && !this.isAncestor(container, existing)) {
|
|
3162
|
-
this.clusterConflict(member, existing, container, scope.line);
|
|
3163
|
-
}
|
|
3164
|
-
}
|
|
3165
|
-
parent.containers.push(container);
|
|
2152
|
+
if (container === INVALID_INDEX) {
|
|
2153
|
+
this.closePlainSubgraph(scope, parent);
|
|
3166
2154
|
} else {
|
|
3167
|
-
|
|
3168
|
-
const names = [...scope.attributes.keys()].join(", ");
|
|
3169
|
-
this.report.warning(
|
|
3170
|
-
"unsupported",
|
|
3171
|
-
DOT_ISSUE.SUBGRAPH_ATTRIBUTES_DROPPED,
|
|
3172
|
-
`subgraph ${scope.name === null ? "(anonymous)" : JSON.stringify(scope.name)} is not a cluster; its attributes (${names}) cannot be represented and were dropped`,
|
|
3173
|
-
{ line: scope.line, element: scope.name }
|
|
3174
|
-
);
|
|
3175
|
-
}
|
|
3176
|
-
for (const nested of scope.containers) {
|
|
3177
|
-
parent.containers.push(nested);
|
|
3178
|
-
}
|
|
2155
|
+
this.closeCluster(scope, parent, container);
|
|
3179
2156
|
}
|
|
3180
2157
|
if (!parent.root) {
|
|
3181
2158
|
for (const member of scope.members) {
|
|
@@ -3186,6 +2163,84 @@ class DotParser {
|
|
|
3186
2163
|
}
|
|
3187
2164
|
}
|
|
3188
2165
|
}
|
|
2166
|
+
/**
|
|
2167
|
+
* Finish a cluster: apply its attributes to its container node, assign parents to its nested
|
|
2168
|
+
* containers and its members, and hand the container to the enclosing scope.
|
|
2169
|
+
* @param scope - the closed scope
|
|
2170
|
+
* @param parent - the enclosing scope
|
|
2171
|
+
* @param container - the cluster's container node
|
|
2172
|
+
*/
|
|
2173
|
+
closeCluster(scope, parent, container) {
|
|
2174
|
+
const own = this.ownAttributes.get(container) ?? /* @__PURE__ */ new Set();
|
|
2175
|
+
this.ownAttributes.set(container, own);
|
|
2176
|
+
for (const attribute of scope.attributes.values()) {
|
|
2177
|
+
if (attribute.name !== CLUSTER_ATTRIBUTE) {
|
|
2178
|
+
own.add(attribute.name);
|
|
2179
|
+
this.setNodeAttribute(container, attribute.name, attribute.value, attribute.line);
|
|
2180
|
+
}
|
|
2181
|
+
}
|
|
2182
|
+
for (const nested of scope.containers) {
|
|
2183
|
+
if (nested !== container && !this.parentOf.has(nested)) {
|
|
2184
|
+
this.setParent(nested, container);
|
|
2185
|
+
}
|
|
2186
|
+
}
|
|
2187
|
+
for (const member of scope.members) {
|
|
2188
|
+
if (member !== container) {
|
|
2189
|
+
this.adoptMember(member, container, scope.line);
|
|
2190
|
+
}
|
|
2191
|
+
}
|
|
2192
|
+
parent.containers.push(container);
|
|
2193
|
+
}
|
|
2194
|
+
/**
|
|
2195
|
+
* Put a cluster's member in it, unless it is already in another cluster this one is not inside.
|
|
2196
|
+
* @param member - the member node
|
|
2197
|
+
* @param container - the cluster's container node
|
|
2198
|
+
* @param line - the cluster's line
|
|
2199
|
+
*/
|
|
2200
|
+
adoptMember(member, container, line) {
|
|
2201
|
+
const existing = this.parentOf.get(member);
|
|
2202
|
+
if (existing === void 0) {
|
|
2203
|
+
this.setParent(member, container);
|
|
2204
|
+
} else if (existing !== container && !this.isAncestor(container, existing)) {
|
|
2205
|
+
this.clusterConflict(member, existing, container, line);
|
|
2206
|
+
}
|
|
2207
|
+
}
|
|
2208
|
+
/**
|
|
2209
|
+
* Finish a subgraph that is not a cluster: keep its rank, report its other attributes dropped, and hand its nested
|
|
2210
|
+
* containers to the enclosing scope.
|
|
2211
|
+
* @param scope - the closed scope
|
|
2212
|
+
* @param parent - the enclosing scope
|
|
2213
|
+
*/
|
|
2214
|
+
closePlainSubgraph(scope, parent) {
|
|
2215
|
+
const ranked = this.recordRank(scope);
|
|
2216
|
+
const dropped = [...scope.attributes.keys()].filter((name) => !(ranked && name === RANK_ATTRIBUTE));
|
|
2217
|
+
if (dropped.length > 0) {
|
|
2218
|
+
const names = dropped.join(", ");
|
|
2219
|
+
this.report.warning(
|
|
2220
|
+
"unsupported",
|
|
2221
|
+
DOT_ISSUE.SUBGRAPH_ATTRIBUTES_DROPPED,
|
|
2222
|
+
`subgraph ${scope.name === null ? "(anonymous)" : JSON.stringify(scope.name)} is not a cluster; its attributes (${names}) cannot be represented and were dropped`,
|
|
2223
|
+
{ line: scope.line, element: scope.name }
|
|
2224
|
+
);
|
|
2225
|
+
}
|
|
2226
|
+
for (const nested of scope.containers) {
|
|
2227
|
+
parent.containers.push(nested);
|
|
2228
|
+
}
|
|
2229
|
+
}
|
|
2230
|
+
/**
|
|
2231
|
+
* Give every cluster the drawing attributes it inherits and does not set itself (Graphviz's subgraph attribute
|
|
2232
|
+
* inheritance), once the whole graph is read: a cluster reopened later can still set its own.
|
|
2233
|
+
*/
|
|
2234
|
+
applyInherited() {
|
|
2235
|
+
for (const [container, attributes] of this.inherited) {
|
|
2236
|
+
const own = this.ownAttributes.get(container);
|
|
2237
|
+
for (const attribute of attributes.values()) {
|
|
2238
|
+
if (own?.has(attribute.name) !== true) {
|
|
2239
|
+
this.setNodeAttribute(container, attribute.name, attribute.value, attribute.line);
|
|
2240
|
+
}
|
|
2241
|
+
}
|
|
2242
|
+
}
|
|
2243
|
+
}
|
|
3189
2244
|
/**
|
|
3190
2245
|
* Whether `candidate` is an ancestor of `node` through the parents assigned so far.
|
|
3191
2246
|
* @param candidate - the possible ancestor
|
|
@@ -3267,6 +2322,7 @@ class DotParser {
|
|
|
3267
2322
|
if (!this.containers.has(index)) {
|
|
3268
2323
|
this.containers.add(index);
|
|
3269
2324
|
this.sink.setNodeValue(this.clusterColumn(), index, true);
|
|
2325
|
+
this.inherited.set(index, new Map(scope.graphDefaults));
|
|
3270
2326
|
}
|
|
3271
2327
|
scope.container = index;
|
|
3272
2328
|
} catch (err) {
|
|
@@ -3283,6 +2339,9 @@ class DotParser {
|
|
|
3283
2339
|
* @param attribute - the attribute
|
|
3284
2340
|
*/
|
|
3285
2341
|
scopeAttribute(scope, attribute) {
|
|
2342
|
+
if (INHERITED_GRAPH_ATTRIBUTES.has(attribute.name)) {
|
|
2343
|
+
scope.graphDefaults.set(attribute.name, attribute);
|
|
2344
|
+
}
|
|
3286
2345
|
if (scope.root) {
|
|
3287
2346
|
this.setGraphAttribute(attribute);
|
|
3288
2347
|
return;
|
|
@@ -3876,6 +2935,52 @@ class DotParser {
|
|
|
3876
2935
|
}
|
|
3877
2936
|
return this.positionHandle;
|
|
3878
2937
|
}
|
|
2938
|
+
/**
|
|
2939
|
+
* Keep a non-cluster subgraph's `rank` on its nodes: each gets the rank and the subgraph's name (`%<n>` for an
|
|
2940
|
+
* anonymous one). A node already in another rank subgraph keeps that one, with a warning.
|
|
2941
|
+
* @param scope - the closed subgraph
|
|
2942
|
+
* @returns true when the subgraph has a rank Graphviz knows
|
|
2943
|
+
*/
|
|
2944
|
+
recordRank(scope) {
|
|
2945
|
+
const rank = scope.attributes.get(RANK_ATTRIBUTE)?.value.trim();
|
|
2946
|
+
if (rank === void 0 || !RANK_KINDS.has(rank)) {
|
|
2947
|
+
return false;
|
|
2948
|
+
}
|
|
2949
|
+
const set = scope.name ?? `%${this.anonymousRanks++}`;
|
|
2950
|
+
for (const member of scope.members) {
|
|
2951
|
+
const held = this.rankSetOf.get(member);
|
|
2952
|
+
const id = String(this.idOf.get(member) ?? member);
|
|
2953
|
+
if (held === void 0) {
|
|
2954
|
+
this.rankSetOf.set(member, set);
|
|
2955
|
+
try {
|
|
2956
|
+
this.sink.setNodeValue(this.stringColumn("rankHandle", RANK_COLUMN), member, rank);
|
|
2957
|
+
this.sink.setNodeValue(this.stringColumn("rankSetHandle", RANK_SET_COLUMN), member, set);
|
|
2958
|
+
} catch (err) {
|
|
2959
|
+
this.report.recordError(err, { element: id });
|
|
2960
|
+
}
|
|
2961
|
+
} else if (held !== set) {
|
|
2962
|
+
this.report.warning(
|
|
2963
|
+
"coercion",
|
|
2964
|
+
DOT_ISSUE.RANK_CONFLICT,
|
|
2965
|
+
`node ${JSON.stringify(id)} is in rank subgraph ${JSON.stringify(held)} and in rank subgraph ${JSON.stringify(set)}; the first is kept`,
|
|
2966
|
+
{ line: scope.line, element: id }
|
|
2967
|
+
);
|
|
2968
|
+
}
|
|
2969
|
+
}
|
|
2970
|
+
return true;
|
|
2971
|
+
}
|
|
2972
|
+
/**
|
|
2973
|
+
* One of the importer's string node columns, declared on first use.
|
|
2974
|
+
* @param field - the field holding its handle
|
|
2975
|
+
* @param name - the column name
|
|
2976
|
+
* @returns the handle
|
|
2977
|
+
*/
|
|
2978
|
+
stringColumn(field, name) {
|
|
2979
|
+
if (this[field] === INVALID_INDEX) {
|
|
2980
|
+
this[field] = this.declare("node", { name, dtype: "string", nullable: true, origin: DOT_ORIGIN });
|
|
2981
|
+
}
|
|
2982
|
+
return this[field];
|
|
2983
|
+
}
|
|
3879
2984
|
/**
|
|
3880
2985
|
* The cluster marker column (bool).
|
|
3881
2986
|
* @returns the handle
|
|
@@ -3989,8 +3094,7 @@ class DotParser {
|
|
|
3989
3094
|
export {
|
|
3990
3095
|
DOT_ISSUE as D,
|
|
3991
3096
|
DOT_LOSS as a,
|
|
3992
|
-
|
|
3993
|
-
dotImporter as c,
|
|
3097
|
+
dotImporter as b,
|
|
3994
3098
|
dotExporter as d
|
|
3995
3099
|
};
|
|
3996
|
-
//# sourceMappingURL=importer-
|
|
3100
|
+
//# sourceMappingURL=importer-ClCsdgTJ.js.map
|