@graphty/graph-io 0.3.45 → 0.3.47

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.
Files changed (67) hide show
  1. package/dist/chunks/{approximations-DJMHdDvv.js → approximations-wWjCRzKj.js} +2 -2
  2. package/dist/chunks/{approximations-DJMHdDvv.js.map → approximations-wWjCRzKj.js.map} +1 -1
  3. package/dist/chunks/{block-CPCHkX42.js → block-DiGq58c3.js} +9 -3
  4. package/dist/chunks/block-DiGq58c3.js.map +1 -0
  5. package/dist/chunks/{emit-DZy6JgdA.js → emit-CwU8cUmG.js} +2 -2
  6. package/dist/chunks/{emit-DZy6JgdA.js.map → emit-CwU8cUmG.js.map} +1 -1
  7. package/dist/chunks/{exporter-DFqJhBnj.js → exporter-CJgfhF-l.js} +4 -4
  8. package/dist/chunks/{exporter-DFqJhBnj.js.map → exporter-CJgfhF-l.js.map} +1 -1
  9. package/dist/chunks/{exporter-C-9cgZKa.js → exporter-CrDWIyiq.js} +4 -4
  10. package/dist/chunks/{exporter-C-9cgZKa.js.map → exporter-CrDWIyiq.js.map} +1 -1
  11. package/dist/chunks/{exporter-DteVeJki.js → exporter-DndFlGSa.js} +3 -3
  12. package/dist/chunks/{exporter-DteVeJki.js.map → exporter-DndFlGSa.js.map} +1 -1
  13. package/dist/chunks/{generic-BGO71QBv.js → generic-Dq1ntt9q.js} +3 -3
  14. package/dist/chunks/{generic-BGO71QBv.js.map → generic-Dq1ntt9q.js.map} +1 -1
  15. package/dist/chunks/{importer-B-9Rc1zO.js → importer-BSvfrX_h.js} +4 -4
  16. package/dist/chunks/{importer-B-9Rc1zO.js.map → importer-BSvfrX_h.js.map} +1 -1
  17. package/dist/chunks/{importer-BVVR740x.js → importer-CMmeMWlC.js} +3 -3
  18. package/dist/chunks/{importer-BVVR740x.js.map → importer-CMmeMWlC.js.map} +1 -1
  19. package/dist/chunks/{importer-C7pvJe1L.js → importer-COTK9Tsl.js} +5 -5
  20. package/dist/chunks/{importer-C7pvJe1L.js.map → importer-COTK9Tsl.js.map} +1 -1
  21. package/dist/chunks/{importer-ClwoVx3O.js → importer-DiZRmOQG.js} +4 -4
  22. package/dist/chunks/{importer-ClwoVx3O.js.map → importer-DiZRmOQG.js.map} +1 -1
  23. package/dist/chunks/{importer-EHQk1jbM.js → importer-e6LGpqHB.js} +5 -5
  24. package/dist/chunks/importer-e6LGpqHB.js.map +1 -0
  25. package/dist/chunks/{importer-C0AjA3Ax.js → importer-iFYPEKaJ.js} +4 -4
  26. package/dist/chunks/{importer-C0AjA3Ax.js.map → importer-iFYPEKaJ.js.map} +1 -1
  27. package/dist/chunks/{importer-D0sC_6bO.js → importer-yh_aBCU6.js} +2 -2
  28. package/dist/chunks/{importer-D0sC_6bO.js.map → importer-yh_aBCU6.js.map} +1 -1
  29. package/dist/chunks/{lexicon-WMsNddyU.js → lexicon-CT69Kd87.js} +2 -2
  30. package/dist/chunks/{lexicon-WMsNddyU.js.map → lexicon-CT69Kd87.js.map} +1 -1
  31. package/dist/chunks/{styles-zNTmz5R7.js → styles-BQnsga7p.js} +3 -3
  32. package/dist/chunks/{styles-zNTmz5R7.js.map → styles-BQnsga7p.js.map} +1 -1
  33. package/dist/chunks/{styles-DvoFBKCK.js → styles-D3fRphrO.js} +3 -3
  34. package/dist/chunks/{styles-DvoFBKCK.js.map → styles-D3fRphrO.js.map} +1 -1
  35. package/dist/chunks/{styles-yed-Cz9rLBCP.js → styles-yed-BF5x3_Y5.js} +3 -3
  36. package/dist/chunks/{styles-yed-Cz9rLBCP.js.map → styles-yed-BF5x3_Y5.js.map} +1 -1
  37. package/dist/chunks/{writer-gQ8kx99H.js → writer-DMKvthQE.js} +2 -2
  38. package/dist/chunks/{writer-gQ8kx99H.js.map → writer-DMKvthQE.js.map} +1 -1
  39. package/dist/cx.js +1 -1
  40. package/dist/cx2.js +2 -2
  41. package/dist/cys.js +1 -1
  42. package/dist/dot.js +2 -2
  43. package/dist/gexf.js +2 -2
  44. package/dist/gml.js +6 -6
  45. package/dist/graph-io.js +23 -23
  46. package/dist/graphml.js +2 -2
  47. package/dist/json.js +1 -1
  48. package/dist/pajek.js +1 -1
  49. package/dist/src/formats/pajek/styles.d.ts +1 -1
  50. package/dist/src/formats/pajek/styles.d.ts.map +1 -1
  51. package/dist/src/formats/pajek/styles.js +4 -3
  52. package/dist/src/formats/pajek/styles.js.map +1 -1
  53. package/dist/src/styles/canon/color-tables.d.ts +2 -1
  54. package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
  55. package/dist/src/styles/canon/color-tables.js +7 -2
  56. package/dist/src/styles/canon/color-tables.js.map +1 -1
  57. package/dist/src/styles/defaults.d.ts.map +1 -1
  58. package/dist/src/styles/defaults.js +7 -0
  59. package/dist/src/styles/defaults.js.map +1 -1
  60. package/dist/styles.js +6 -6
  61. package/dist/xgmml.js +3 -3
  62. package/package.json +2 -2
  63. package/src/formats/pajek/styles.ts +4 -3
  64. package/src/styles/canon/color-tables.ts +7 -2
  65. package/src/styles/defaults.ts +8 -0
  66. package/dist/chunks/block-CPCHkX42.js.map +0 -1
  67. package/dist/chunks/importer-EHQk1jbM.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"block-CPCHkX42.js","sources":["../../src/styles/codes.ts","../../src/styles/canon/site.ts","../../src/styles/canon/number.ts","../../src/styles/notes.ts","../../src/styles/canon/enums.ts","../../src/styles/canon/text.ts","../../src/styles/vocabulary.ts","../../src/styles/plan/resolve.ts","../../src/styles/canon/color-tables.ts","../../src/styles/canon/graphviz.ts","../../src/styles/canon/color.ts","../../src/styles/defaults.ts","../../src/styles/plan/features.ts","../../src/styles/io/block.ts"],"sourcesContent":["/**\n * The codes of every style condition graph-io reports: the notes attached to a file's styles (`W_STYLE_*`), the\n * import and export report codes about styles as a whole (`W_STYLES_*`), and the one error (`E_STYLES_MISMATCH`).\n */\n\nimport { STYLES_NOT_IMPORTED_CODE } from \"../common/codes.js\";\n\n/**\n * Every style code by name. A key is the code without its `E_` / `W_` and `STYLE_` / `STYLES_` prefixes. Every style\n * condition is a warning except `MISMATCH`; none counts toward an import's `errorLimit`.\n * @category Styles\n */\nexport const STYLE_ISSUE = Object.freeze({\n // ------------------------------------------------ reading values\n /** A value longer than 256 characters was not parsed. */\n VALUE_TOO_LONG: \"W_STYLE_VALUE_TOO_LONG\",\n /** A value does not parse in the file's dialect (an unknown color name, a non-number, a negative length). */\n BAD_VALUE: \"W_STYLE_BAD_VALUE\",\n /** An enumeration value the vocabulary has no name for; kept as `other:<value>`. */\n UNKNOWN_VALUE: \"W_STYLE_UNKNOWN_VALUE\",\n /** A color's alpha was dropped because the property has no opacity to carry it. */\n ALPHA_DROPPED: \"W_STYLE_ALPHA_DROPPED\",\n /** A list of colors where one color is expected; the tool draws it its own way and the first is not taken. */\n COLOR_LIST: \"W_STYLE_COLOR_LIST\",\n /** A gradient fill; its first color is kept. */\n GRADIENT: \"W_STYLE_GRADIENT\",\n /** A node the tool draws unfilled although the file gives it a fill color. */\n UNFILLED: \"W_STYLE_UNFILLED\",\n /** A node fill the file marks as transparent or absent. */\n NO_FILL: \"W_STYLE_NO_FILL\",\n /** An edge stroke the file marks as absent. */\n NO_STROKE: \"W_STYLE_NO_STROKE\",\n /** The tool grows a node to fit its label, so the stated size is a minimum. */\n SIZE_MINIMUM: \"W_STYLE_SIZE_MINIMUM\",\n /** An HTML-like label: its text is kept and its markup dropped. */\n HTML_LABEL: \"W_STYLE_HTML_LABEL\",\n /** A record label: its fields are joined with \" | \". */\n RECORD_LABEL: \"W_STYLE_RECORD_LABEL\",\n /** An element carries more than one label; the first is kept. */\n EXTRA_LABELS: \"W_STYLE_EXTRA_LABELS\",\n /** A color that inherits from the edge's ends in a way the vocabulary cannot express. */\n INHERIT_COLOR: \"W_STYLE_INHERIT_COLOR\",\n /** A style property the vocabulary has no counterpart for was not carried. */\n NOT_CARRIED: \"W_STYLE_NOT_CARRIED\",\n // ------------------------------------------------ reading declared styles\n /** A declared mapping that cannot be read. */\n BAD_MAPPING: \"W_STYLE_BAD_MAPPING\",\n /** A declared mapping reads a column the file does not have. */\n MAPPING_COLUMN_MISSING: \"W_STYLE_MAPPING_COLUMN_MISSING\",\n /** References between style records that are circular or too deep; the rest are read. */\n REFERENCE_CYCLE: \"W_STYLE_REFERENCE_CYCLE\",\n /** A style reference that names nothing in the file. */\n UNRESOLVED: \"W_STYLE_UNRESOLVED\",\n /** Style structures nested deeper than graph-io reads. */\n NESTING: \"W_STYLE_NESTING\",\n /** A style section that cannot be read at all. */\n UNREADABLE: \"W_STYLE_UNREADABLE\",\n /** A Cytoscape session without its visual styles; the tool's fallbacks apply. */\n NO_VIZMAP: \"W_STYLE_NO_VIZMAP\",\n /** The view names a visual style the file does not hold. */\n VIEW_STYLE_MISSING: \"W_STYLE_VIEW_STYLE_MISSING\",\n /** The file holds more visual styles than the one its view uses; the others are not read. */\n OTHER_STYLES: \"W_STYLE_OTHER_STYLES\",\n /** The file holds more views than one; only the first view's styles are read. */\n OTHER_VIEWS: \"W_STYLE_OTHER_VIEWS\",\n /** A selector the tool treats as invalid, which matches every element there. */\n SELECTOR: \"W_STYLE_SELECTOR\",\n /** A selector a short predicate cannot express; its members are marked on the elements instead. */\n SELECTOR_AS_COLUMN: \"W_STYLE_SELECTOR_AS_COLUMN\",\n /** A selector state that changes while the tool runs (selected, hovered), evaluated as at load. */\n STATE_ASSUMED: \"W_STYLE_STATE_ASSUMED\",\n // ------------------------------------------------ planning\n /** A continuous mapping matches the file's values only within the tool's rounding. */\n RAMP_ROUNDED: \"W_STYLE_RAMP_ROUNDED\",\n /** Rules were folded into a copy to keep the number of rules per kind bounded. */\n LAYER_CAP: \"W_STYLE_LAYER_CAP\",\n /** The counted work budget ran out; the values not yet explained are copied per element. */\n BUDGET: \"W_STYLE_BUDGET\",\n // ------------------------------------------------ graphty's own block\n /** A `graphty.styles` block was ignored, with a reason code; the file is read like any other. */\n BLOCK_IGNORED: \"W_STYLE_BLOCK_IGNORED\",\n // ------------------------------------------------ export\n /** The format has no place for this property; it is not written. */\n NOT_WRITTEN: \"W_STYLE_NOT_WRITTEN\",\n /** Written as the nearest value the format allows. */\n APPROXIMATED: \"W_STYLE_APPROXIMATED\",\n /** Per-element values were written but not the rules; importing the file infers them again. */\n RULES_NOT_KEPT: \"W_STYLE_RULES_NOT_KEPT\",\n /** A style was written as its per-element values and lost its editable form, with a reason code. */\n LAYER_FLATTENED: \"W_STYLE_LAYER_FLATTENED\",\n // ------------------------------------------------ styles as a whole\n /** The file holds styles that were not imported; import them with the `styles` option. */\n NOT_IMPORTED: STYLES_NOT_IMPORTED_CODE,\n /** The graph has styles that were not exported; export them with the `styles` option. */\n NOT_EXPORTED: \"W_STYLES_NOT_EXPORTED\",\n /** The styles were read from or built for a different graph; nothing is written. */\n MISMATCH: \"E_STYLES_MISMATCH\",\n});\n\n/**\n * Any style code.\n * @category Styles\n */\nexport type StyleIssueCode = (typeof STYLE_ISSUE)[keyof typeof STYLE_ISSUE];\n","/**\n * Where a raw value came from, so a canonicalizer can note a problem against the right target, property and element\n * and spend the work it costs from the extraction's one budget.\n */\n\nimport { STYLE_ISSUE } from \"../codes.js\";\nimport type { StyleNotes } from \"../notes.js\";\nimport type { StyleNoteCode, StyleTarget, StyleWorkBudget } from \"../types.js\";\n\n/**\n * A number, color, enumeration or mapper expression longer than this many characters is not parsed: it is noted as\n * `W_STYLE_VALUE_TOO_LONG` and gives no value. Text is copied whatever its length.\n * @category Styles\n */\nexport const MAX_STYLE_VALUE_LENGTH = 256;\n\n/**\n * Where a raw value is read: the notes it reports to, the target and property it is for, the element it belongs to\n * and the budget its work is spent from.\n * @category Styles\n */\nexport interface CanonSite {\n /** Where problems are noted. */\n readonly notes: StyleNotes;\n /** Nodes, edges or the graph. */\n readonly target: StyleTarget | \"graph\";\n /** The neutral property the value is for. */\n readonly property: string;\n /** The element the value belongs to, by index; absent for a rule's value. */\n readonly element?: number;\n /** The work budget; each value spends one operation plus one per character it reads. */\n readonly budget?: StyleWorkBudget;\n}\n\n/**\n * Notes a problem with a value at its site.\n * @param site - where the value was read\n * @param code - the condition\n * @param sample - the offending value\n */\nexport function noteAt(site: CanonSite, code: StyleNoteCode, sample: unknown): void {\n site.notes.add(code, site.target, site.property, { sample, element: site.element });\n}\n\n/**\n * Spends operations from the site's budget; graph values count as node work.\n * @param site - where the value was read\n * @param operations - the work\n */\nexport function spendAt(site: CanonSite, operations: number): void {\n site.budget?.spend(site.target === \"graph\" ? \"node\" : site.target, operations);\n}\n\n/**\n * The text of a raw scalar, untrimmed, after the length limit: null for an absent value (no note), and null with a\n * note for a value that is empty, too long, not finite or not a scalar. Spends at most 257 operations.\n * @param raw - the file's value\n * @param site - where it was read\n * @returns the value's text, or null\n */\nexport function scalarText(raw: unknown, site: CanonSite): string | null {\n spendAt(site, 1);\n if (raw === null || raw === undefined) {\n return null;\n }\n if (typeof raw === \"number\") {\n if (Number.isFinite(raw)) {\n return String(raw);\n }\n noteAt(site, STYLE_ISSUE.BAD_VALUE, String(raw));\n return null;\n }\n if (typeof raw !== \"string\") {\n noteAt(site, STYLE_ISSUE.BAD_VALUE, typeof raw);\n return null;\n }\n if (raw.length > MAX_STYLE_VALUE_LENGTH) {\n noteAt(site, STYLE_ISSUE.VALUE_TOO_LONG, `${raw.length} characters`);\n return null;\n }\n spendAt(site, raw.length);\n if (raw.trim() === \"\") {\n noteAt(site, STYLE_ISSUE.BAD_VALUE, raw);\n return null;\n }\n return raw;\n}\n","/**\n * Canonical numbers, lengths, opacities and booleans: 6 significant digits, never negative, never NaN or Infinity.\n */\n\nimport { STYLE_ISSUE } from \"../codes.js\";\nimport type { StyleDialect } from \"../types.js\";\nimport { type CanonSite, noteAt, scalarText, spendAt } from \"./site.js\";\n\n/**\n * The largest length or factor a file may give; a larger one is noted as `W_STYLE_BAD_VALUE` and gives no value.\n * @category Styles\n */\nexport const MAX_STYLE_NUMBER = 1e6;\n\n/**\n * Points per inch: DOT gives node sizes in inches, and a canonical length is in points (pixels at 72 dpi).\n * @category Styles\n */\nexport const DOT_POINTS_PER_INCH = 72;\n\n/** One way to read a decimal number, so a long run of digits fails or passes in one pass. */\nconst DECIMAL = /^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/;\n\n/**\n * A number at 6 significant digits, with `-0` as `0`.\n * @param value - a finite number\n * @returns the canonical number\n * @category Styles\n */\nexport function num6(value: number): number {\n return Number(value.toPrecision(6)) + 0;\n}\n\n/**\n * A finite number from a number or a decimal string, or null with a note.\n * @param raw - the file's value\n * @param site - where it was read\n * @returns the number, or null\n */\nfunction finite(raw: unknown, site: CanonSite): number | null {\n if (typeof raw === \"boolean\") {\n noteAt(site, STYLE_ISSUE.BAD_VALUE, raw);\n return null;\n }\n const text = scalarText(raw, site);\n if (text === null) {\n return null;\n }\n const trimmed = text.trim();\n let value = Number.NaN;\n if (typeof raw === \"number\") {\n value = raw;\n } else if (DECIMAL.test(trimmed)) {\n value = Number(trimmed);\n }\n if (!Number.isFinite(value)) {\n noteAt(site, STYLE_ISSUE.BAD_VALUE, text);\n return null;\n }\n return value;\n}\n\n/**\n * A length or factor: a finite number at least 0 and at most `MAX_STYLE_NUMBER` after multiplying by `factor`, at 6\n * significant digits. Anything else is null with a `W_STYLE_BAD_VALUE` note.\n * @param raw - the file's value: a number or a decimal string\n * @param site - where it was read\n * @param factor - multiplies the value first (`DOT_POINTS_PER_INCH` for DOT sizes); defaults to 1\n * @returns the canonical number, or null\n * @category Styles\n */\nexport function canonNumber(raw: unknown, site: CanonSite, factor = 1): number | null {\n const value = finite(raw, site);\n if (value === null) {\n return null;\n }\n const scaled = value * factor;\n if (!(scaled >= 0 && scaled <= MAX_STYLE_NUMBER)) {\n noteAt(site, STYLE_ISSUE.BAD_VALUE, typeof raw === \"string\" ? raw : String(raw));\n return null;\n }\n return num6(scaled);\n}\n\n/**\n * An opacity from 0 to 1. Cytoscape desktop states opacities from 0 to 255 and is divided by 255; every other\n * dialect states 0 to 1. A value outside the dialect's range is null with a `W_STYLE_BAD_VALUE` note.\n * @param raw - the file's value\n * @param dialect - the file's dialect\n * @param site - where it was read\n * @returns the canonical opacity, or null\n * @category Styles\n */\nexport function canonOpacity(raw: unknown, dialect: StyleDialect, site: CanonSite): number | null {\n const value = finite(raw, site);\n if (value === null) {\n return null;\n }\n const top = dialect === \"cytoscape\" ? 255 : 1;\n if (!(value >= 0 && value <= top)) {\n noteAt(site, STYLE_ISSUE.BAD_VALUE, typeof raw === \"string\" ? raw : String(raw));\n return null;\n }\n return num6(value / top);\n}\n\n/** Boolean spellings, lowercase. */\nconst BOOLEANS: ReadonlyMap<string, boolean> = new Map([\n [\"true\", true],\n [\"yes\", true],\n [\"on\", true],\n [\"1\", true],\n [\"false\", false],\n [\"no\", false],\n [\"off\", false],\n [\"0\", false],\n]);\n\n/**\n * A boolean from `true`/`false`, `yes`/`no`, `on`/`off` or `1`/`0` in any case; anything else is null with a note.\n * @param raw - the file's value\n * @param site - where it was read\n * @returns the boolean, or null\n * @category Styles\n */\nexport function canonBoolean(raw: unknown, site: CanonSite): boolean | null {\n if (typeof raw === \"boolean\") {\n spendAt(site, 1);\n return raw;\n }\n const text = scalarText(raw, site);\n if (text === null) {\n return null;\n }\n const value = BOOLEANS.get(text.trim().toLowerCase());\n if (value === undefined) {\n noteAt(site, STYLE_ISSUE.BAD_VALUE, text);\n return null;\n }\n return value;\n}\n\n/**\n * The unit of a dialect's lengths: GEXF and Pajek give size factors relative to their tool's normal size, every\n * other dialect gives pixels (after DOT's inches are converted).\n * @param dialect - the file's dialect\n * @returns `\"relative\"` or `\"px\"`\n * @category Styles\n */\nexport function styleLengthUnit(dialect: StyleDialect): \"px\" | \"relative\" {\n return dialect === \"gexf\" || dialect === \"dvips\" ? \"relative\" : \"px\";\n}\n","/**\n * Style notes are aggregated, never one per element: one note per (code, target, property), with up to 8 distinct\n * samples, a total count and the element indexes the note covers.\n */\n\nimport type { StyleNote, StyleNoteCode, StyleTarget } from \"./types.js\";\n\n/** At most this many samples per note. */\nconst MAX_SAMPLES = 8;\n/** A sample is cut to this many characters. */\nconst MAX_SAMPLE_LENGTH = 80;\n\n/** graph-io's English for each note, used only in its own report. */\nconst PHRASES: ReadonlyMap<StyleNoteCode, string> = new Map<StyleNoteCode, string>([\n [\"W_STYLE_VALUE_TOO_LONG\", \"values longer than 256 characters were not parsed\"],\n [\"W_STYLE_BAD_VALUE\", \"values do not parse\"],\n [\"W_STYLE_UNKNOWN_VALUE\", \"values have no name in the vocabulary and are kept as other:<value>\"],\n [\"W_STYLE_ALPHA_DROPPED\", \"color alpha was dropped\"],\n [\"W_STYLE_COLOR_LIST\", \"color lists are not read as one color\"],\n [\"W_STYLE_GRADIENT\", \"gradients are read as their first color\"],\n [\"W_STYLE_UNFILLED\", \"nodes with a fill color are drawn unfilled\"],\n [\"W_STYLE_NO_FILL\", \"fills are marked transparent\"],\n [\"W_STYLE_NO_STROKE\", \"strokes are marked absent\"],\n [\"W_STYLE_SIZE_MINIMUM\", \"node sizes are minimums: the node grows to fit its label\"],\n [\"W_STYLE_HTML_LABEL\", \"HTML-like labels keep their text; markup was dropped\"],\n [\"W_STYLE_RECORD_LABEL\", \"record label fields were joined\"],\n [\"W_STYLE_EXTRA_LABELS\", \"elements have more than one label; the first was kept\"],\n [\"W_STYLE_INHERIT_COLOR\", \"inherited colors cannot be expressed\"],\n [\"W_STYLE_NOT_CARRIED\", \"style properties have no counterpart and were not carried\"],\n [\"W_STYLE_BAD_MAPPING\", \"mappings cannot be read\"],\n [\"W_STYLE_MAPPING_COLUMN_MISSING\", \"mappings read a column the file does not have\"],\n [\"W_STYLE_REFERENCE_CYCLE\", \"style references are circular or too deep\"],\n [\"W_STYLE_UNRESOLVED\", \"style references name nothing\"],\n [\"W_STYLE_NESTING\", \"style structures are nested too deep\"],\n [\"W_STYLE_UNREADABLE\", \"a style section cannot be read\"],\n [\"W_STYLE_NO_VIZMAP\", \"the session holds no visual styles\"],\n [\"W_STYLE_VIEW_STYLE_MISSING\", \"the view names a style the file does not hold\"],\n [\"W_STYLE_OTHER_STYLES\", \"other visual styles were not read\"],\n [\"W_STYLE_OTHER_VIEWS\", \"other views were not read\"],\n [\"W_STYLE_SELECTOR\", \"invalid selectors match every element\"],\n [\"W_STYLE_SELECTOR_AS_COLUMN\", \"selectors were evaluated into per-element values\"],\n [\"W_STYLE_STATE_ASSUMED\", \"selector states were evaluated as at load\"],\n [\"W_STYLE_RAMP_ROUNDED\", \"continuous mappings match within the tool's rounding\"],\n [\"W_STYLE_LAYER_CAP\", \"rules were folded into per-element copies\"],\n [\"W_STYLE_BUDGET\", \"the work budget ran out; values were copied per element\"],\n [\"W_STYLE_BLOCK_IGNORED\", \"the graphty.styles block was ignored\"],\n [\"W_STYLE_NOT_WRITTEN\", \"the format cannot hold this style\"],\n [\"W_STYLE_APPROXIMATED\", \"written as the nearest value the format allows\"],\n [\"W_STYLE_RULES_NOT_KEPT\", \"per-element values were written but not the rules\"],\n [\"W_STYLE_LAYER_FLATTENED\", \"a style was written as per-element values\"],\n]);\n\n/** One note being collected. */\ninterface Collecting {\n readonly code: StyleNoteCode;\n readonly target: StyleTarget | \"graph\" | null;\n readonly property: string | null;\n count: number;\n readonly samples: string[];\n readonly elements: Set<number>;\n unindexed: boolean;\n}\n\n/**\n * Options of one report to `StyleNotes.add()`.\n * @category Styles\n */\nexport interface StyleNoteReport {\n /** An example of the offending value; kept while the note has fewer than 8 distinct samples. */\n readonly sample?: unknown;\n /** The element the report is about, by index. */\n readonly element?: number;\n /** How many occurrences the report stands for; defaults to 1. */\n readonly count?: number;\n}\n\n/**\n * Collects style notes, aggregated per (code, target, property).\n * @category Styles\n */\nexport class StyleNotes {\n readonly #notes = new Map<string, Collecting>();\n\n /**\n * Records one occurrence (or `count` occurrences) of a condition.\n * @param code - the condition\n * @param target - nodes, edges, the graph, or null for the file as a whole\n * @param property - the property or the file's name for the construct, or null\n * @param report - a sample, the element index and a count\n */\n add(\n code: StyleNoteCode,\n target: StyleTarget | \"graph\" | null,\n property: string | null,\n report: StyleNoteReport = {},\n ): void {\n const key = `${code}\\u0000${target ?? \"\"}\\u0000${property ?? \"\"}`;\n let note = this.#notes.get(key);\n if (note === undefined) {\n note = { code, target, property, count: 0, samples: [], elements: new Set(), unindexed: false };\n this.#notes.set(key, note);\n }\n note.count += report.count ?? 1;\n if (report.element === undefined) {\n note.unindexed = true;\n } else {\n note.elements.add(report.element);\n }\n if (report.sample !== undefined && note.samples.length < MAX_SAMPLES) {\n const sample = sampleText(report.sample);\n if (!note.samples.includes(sample)) {\n note.samples.push(sample);\n }\n }\n }\n\n /**\n * Whether a note with this code, target and property covers an element.\n * @param code - the condition\n * @param target - nodes or edges\n * @param property - the property\n * @param element - the element index\n * @returns true when such a note named the element\n */\n covers(code: StyleNoteCode, target: StyleTarget, property: string | null, element: number): boolean {\n return this.#notes.get(`${code}\\u0000${target}\\u0000${property ?? \"\"}`)?.elements.has(element) === true;\n }\n\n /**\n * The collected notes, in the order their conditions first occurred.\n * @returns one note per (code, target, property)\n */\n list(): StyleNote[] {\n const out: StyleNote[] = [];\n for (const n of this.#notes.values()) {\n const where = n.property === null ? (n.target ?? \"file\") : `${n.target ?? \"file\"} ${n.property}`;\n out.push({\n code: n.code,\n params: { property: n.property, target: n.target, count: n.count, samples: [...n.samples] },\n elements: n.unindexed ? { count: n.count } : Array.from(n.elements).sort((a, b) => a - b),\n message: `${where}: ${PHRASES.get(n.code) ?? n.code} (${n.count})`,\n });\n }\n return out;\n }\n}\n\n/**\n * A sample as at most 80 characters of text.\n * @param value - the sample\n * @returns its text\n */\nfunction sampleText(value: unknown): string {\n let text: string;\n if (typeof value === \"string\") {\n text = value;\n } else {\n try {\n text = JSON.stringify(value) ?? typeof value;\n } catch {\n text = typeof value;\n }\n }\n return text.slice(0, MAX_SAMPLE_LENGTH);\n}\n","/**\n * Canonical enumeration values: each dialect's spellings matched against an alias table without regard to case,\n * spaces or underscores. An unknown value of an open enumeration (shapes, border and line styles, arrows) is kept as\n * `other:<raw>` and noted; an unknown value of a closed one (weights, positions) gives no value and is noted.\n */\n\nimport { STYLE_ISSUE } from \"../codes.js\";\nimport type { StyleDialect } from \"../types.js\";\nimport { type CanonSite, noteAt, scalarText } from \"./site.js\";\n\n/**\n * The enumerations a style value can belong to.\n * @category Styles\n */\nexport type StyleEnumKind = \"shape\" | \"borderStyle\" | \"lineStyle\" | \"arrow\" | \"weight\" | \"position\";\n\ntype Aliases = Readonly<Record<string, readonly string[]>>;\n\nconst SHAPES: Aliases = {\n ellipse: [\n \"ellipse\",\n \"oval\",\n \"circle\",\n \"disc\",\n \"disk\",\n \"point\",\n \"doublecircle\",\n \"mcircle\",\n \"dot\",\n \"sphere\",\n \"circular\",\n ],\n rectangle: [\n \"rectangle\",\n \"rect\",\n \"box\",\n \"square\",\n \"plaintext\",\n \"plain\",\n \"record\",\n \"msquare\",\n \"box3d\",\n \"rectangle3d\",\n \"component\",\n \"tab\",\n \"folder\",\n \"note\",\n \"underline\",\n ],\n \"round-rectangle\": [\n \"round-rectangle\",\n \"roundrectangle\",\n \"roundrect\",\n \"rounded\",\n \"roundedrectangle\",\n \"round-rect\",\n \"mrecord\",\n \"cut-rectangle\",\n \"round-tag\",\n \"bottom-round-rectangle\",\n ],\n triangle: [\"triangle\", \"invtriangle\", \"round-triangle\", \"tag\"],\n diamond: [\"diamond\", \"rhombus\", \"mdiamond\", \"round-diamond\"],\n pentagon: [\"pentagon\", \"round-pentagon\"],\n hexagon: [\"hexagon\", \"hexagon2\", \"round-hexagon\", \"concave-hexagon\", \"septagon\", \"heptagon\", \"round-heptagon\"],\n octagon: [\"octagon\", \"doubleoctagon\", \"tripleoctagon\", \"round-octagon\", \"octagon2\"],\n parallelogram: [\"parallelogram\", \"parallelogram2\", \"rhomboid\", \"fat-arrow\", \"fatarrow\"],\n trapezoid: [\"trapezoid\", \"trapezoid2\", \"invtrapezoid\", \"trapezium\", \"round-trapezoid\"],\n star: [\"star\", \"star5\", \"star6\", \"star8\", \"polygon\"],\n vee: [\"vee\", \"v\"],\n none: [\"none\", \"empty\", \"invis\"],\n};\n\nconst BORDER_STYLES: Aliases = {\n solid: [\"solid\", \"line\"],\n dashed: [\"dashed\", \"dash\", \"equal-dash\"],\n dotted: [\"dotted\", \"dot\", \"dots\"],\n \"dash-dot\": [\"dash-dot\", \"dashdot\", \"dashed-dotted\"],\n double: [\"double\", \"parallel-lines\"],\n};\n\nconst LINE_STYLES: Aliases = {\n solid: [\"solid\", \"line\", \"continuous\", \"separate-arrow\"],\n dashed: [\"dashed\", \"dash\", \"dashed-line\", \"equal-dash\"],\n dotted: [\"dotted\", \"dot\", \"dots\", \"dotted-line\"],\n \"dash-dot\": [\"dash-dot\", \"dashdot\", \"dashed-dotted\", \"dash-dot-dot\"],\n \"long-dash\": [\"long-dash\", \"longdash\"],\n double: [\"double\", \"parallel\", \"parallel-lines\"],\n zigzag: [\"zigzag\"],\n sinewave: [\"sinewave\", \"sine-wave\"],\n};\n\nconst ARROWS: Aliases = {\n none: [\"none\", \"no-arrow\", \"noarrow\", \"0\"],\n triangle: [\n \"triangle\",\n \"normal\",\n \"delta\",\n \"standard\",\n \"arrow\",\n \"triangle-backcurve\",\n \"white-delta-inverted\",\n \"simple\",\n \"short\",\n \"plain\",\n \"convex\",\n \"a\",\n ],\n \"triangle-open\": [\"triangle-open\", \"onormal\", \"empty\", \"white-delta\", \"transparent-circle-inverted\", \"open-delta\"],\n vee: [\"vee\", \"open\", \"chevron\", \"concave\", \"triangle-cross\", \"b\"],\n tee: [\"tee\", \"t\", \"t-shape\", \"half-bottom\", \"half-top\", \"bar\"],\n diamond: [\"diamond\", \"white-diamond-inverted\"],\n \"diamond-open\": [\"diamond-open\", \"odiamond\", \"white-diamond\", \"ediamond\", \"open-diamond\"],\n circle: [\"circle\", \"dot\", \"transparent-circle\", \"white-circle-inverted\"],\n \"circle-open\": [\"circle-open\", \"odot\", \"white-circle\", \"open-circle\"],\n square: [\"square\", \"box\", \"skewed-dash\"],\n // An X-shaped \"cross\" (yEd, yFiles) is not a crow's foot: it stays other:cross.\n crow: [\"crow\", \"crows-foot\", \"crows-foot-many\"],\n half: [\"half\", \"half-top-arrow\", \"half-open\", \"lnormal\", \"rnormal\", \"halfopen\"],\n inverted: [\"inverted\", \"inv\", \"inverted-triangle\", \"inv-triangle\"],\n};\n\nconst WEIGHTS: Aliases = {\n normal: [\"normal\", \"regular\", \"plain\", \"lighter\", \"100\", \"200\", \"300\", \"400\", \"500\"],\n bold: [\"bold\", \"bolder\", \"600\", \"700\", \"800\", \"900\"],\n};\n\nconst POSITIONS: Aliases = {\n center: [\"center\", \"centre\", \"middle\", \"c\"],\n top: [\"top\", \"north\", \"t\"],\n bottom: [\"bottom\", \"south\", \"b\"],\n left: [\"left\", \"west\", \"l\"],\n right: [\"right\", \"east\", \"r\"],\n \"top-left\": [\"top-left\", \"north-west\", \"northwest\"],\n \"top-right\": [\"top-right\", \"north-east\", \"northeast\"],\n \"bottom-left\": [\"bottom-left\", \"south-west\", \"southwest\"],\n \"bottom-right\": [\"bottom-right\", \"south-east\", \"southeast\"],\n};\n\n/** vis-network draws these spellings differently from the common reading. */\nconst VIS: Partial<Record<StyleEnumKind, Aliases>> = {\n shape: {\n \"round-rectangle\": [\"box\"],\n ellipse: [\"dot\"],\n triangle: [\"triangledown\"],\n none: [\"text\"],\n },\n arrow: { inverted: [\"inv-triangle\"], square: [\"box\"] },\n};\n\n/** Per-dialect overrides; a dialect not listed reads the common table alone. */\nconst OVERRIDES: ReadonlyMap<string, Partial<Record<StyleEnumKind, Aliases>>> = new Map([[\"vis\", VIS]]);\n\nconst OPEN: ReadonlySet<StyleEnumKind> = new Set<StyleEnumKind>([\"shape\", \"borderStyle\", \"lineStyle\", \"arrow\"]);\n\n/**\n * Builds an alias lookup.\n * @param aliases - canonical value to spellings\n * @returns spelling to canonical value\n */\nfunction lookup(aliases: Aliases): ReadonlyMap<string, string> {\n const map = new Map<string, string>();\n for (const [value, spellings] of Object.entries(aliases)) {\n for (const spelling of spellings) {\n map.set(spelling, value);\n }\n }\n return map;\n}\n\nconst COMMON: ReadonlyMap<StyleEnumKind, ReadonlyMap<string, string>> = new Map([\n [\"shape\", lookup(SHAPES)],\n [\"borderStyle\", lookup(BORDER_STYLES)],\n [\"lineStyle\", lookup(LINE_STYLES)],\n [\"arrow\", lookup(ARROWS)],\n [\"weight\", lookup(WEIGHTS)],\n [\"position\", lookup(POSITIONS)],\n]);\n\nconst DIALECT: ReadonlyMap<string, ReadonlyMap<StyleEnumKind, ReadonlyMap<string, string>>> = new Map(\n Array.from(OVERRIDES, ([dialect, kinds]) => [\n dialect,\n new Map(Object.entries(kinds).map(([kind, aliases]) => [kind as StyleEnumKind, lookup(aliases)])),\n ]),\n);\n\n/**\n * A canonical enumeration value: the dialect's spelling matched without regard to case, with spaces and underscores\n * read as hyphens (Cytoscape's `ROUND_RECTANGLE` is `round-rectangle`). An unknown value is `other:<raw>` for an\n * open enumeration and null for a closed one, noted as `W_STYLE_UNKNOWN_VALUE` either way.\n * @param kind - the enumeration\n * @param raw - the file's value\n * @param dialect - the file's dialect\n * @param site - where it was read\n * @returns the canonical value, or null\n * @category Styles\n */\nexport function canonEnum(kind: StyleEnumKind, raw: unknown, dialect: StyleDialect, site: CanonSite): string | null {\n const text = scalarText(raw, site);\n if (text === null) {\n return null;\n }\n const trimmed = text.trim();\n const key = trimmed.toLowerCase().replaceAll(/[\\s_]+/g, \"-\");\n const value = DIALECT.get(dialect)?.get(kind)?.get(key) ?? COMMON.get(kind)?.get(key);\n if (value !== undefined) {\n return value;\n }\n noteAt(site, STYLE_ISSUE.UNKNOWN_VALUE, trimmed);\n return OPEN.has(kind) ? `other:${trimmed}` : null;\n}\n","/**\n * Canonical text: the text a tool draws. Text is copied whatever its length and never matched with a pattern that\n * can backtrack; every pass here is linear in the text's length and spends one operation per character.\n */\n\nimport { STYLE_ISSUE } from \"../codes.js\";\nimport { type CanonSite, noteAt, spendAt } from \"./site.js\";\n\n/**\n * A text value: a string as it is, a finite number or a boolean as its text. Anything else is null with a\n * `W_STYLE_BAD_VALUE` note; an absent value is null without one.\n * @param raw - the file's value\n * @param site - where it was read\n * @returns the text, or null\n * @category Styles\n */\nexport function canonText(raw: unknown, site: CanonSite): string | null {\n spendAt(site, 1);\n if (raw === null || raw === undefined) {\n return null;\n }\n if (typeof raw === \"string\") {\n spendAt(site, raw.length);\n return raw;\n }\n if ((typeof raw === \"number\" && Number.isFinite(raw)) || typeof raw === \"boolean\") {\n return String(raw);\n }\n noteAt(site, STYLE_ISSUE.BAD_VALUE, typeof raw === \"number\" ? String(raw) : typeof raw);\n return null;\n}\n\n/**\n * The names Graphviz substitutes for `\\N`, `\\G`, `\\E`, `\\T` and `\\H` in a label; an absent name leaves its escape\n * as written.\n * @category Styles\n */\nexport interface DotEscapeNames {\n /** The node's name, for `\\N`. */\n readonly node?: string;\n /** The graph's name, for `\\G`. */\n readonly graph?: string;\n /** The edge's name (`a->b` or `a--b`), for `\\E`. */\n readonly edge?: string;\n /** The edge's tail node, for `\\T`. */\n readonly tail?: string;\n /** The edge's head node, for `\\H`. */\n readonly head?: string;\n}\n\n/**\n * The text a DOT label draws, in Graphviz's two passes: first `\\N`, `\\G`, `\\E`, `\\T` and `\\H` are replaced by the\n * names and every other backslash pair is kept; then `\\n`, `\\l` and `\\r` end a line (a final one adds no empty line)\n * and any other escaped character stands for itself. So a node name holding `\\n` breaks the line.\n * @param text - the label as the file gives it\n * @param names - the names to substitute\n * @param site - where it was read, for the budget\n * @returns the label's text\n * @category Styles\n */\nexport function dotLabelText(text: string, names: DotEscapeNames, site?: CanonSite): string {\n if (site !== undefined) {\n spendAt(site, text.length);\n }\n const subs: Readonly<Record<string, string | undefined>> = {\n N: names.node,\n G: names.graph,\n E: names.edge,\n T: names.tail,\n H: names.head,\n };\n const first = replaceEscapes(text, (e) => (Object.hasOwn(subs, e) ? subs[e] : undefined) ?? `\\\\${e}`);\n const out = replaceEscapes(first, (e) => (e === \"n\" || e === \"l\" || e === \"r\" ? \"\\n\" : e));\n return out.endsWith(\"\\n\") ? out.slice(0, -1) : out;\n}\n\n/**\n * A text with every backslash escape (a backslash and the character after it) replaced; a backslash at the end stays.\n * @param text - the text\n * @param replace - the replacement of an escape, given the escaped character\n * @returns the text\n */\nfunction replaceEscapes(text: string, replace: (escaped: string) => string): string {\n let out = \"\";\n let i = 0;\n while (i < text.length) {\n const c = text[i];\n if (c === \"\\\\\" && i + 1 < text.length) {\n out += replace(text[i + 1]);\n i += 2;\n } else {\n out += c;\n i++;\n }\n }\n return out;\n}\n\n/** HTML entity names an HTML-like label may use. */\nconst ENTITIES: ReadonlyMap<string, string> = new Map([\n [\"amp\", \"&\"],\n [\"lt\", \"<\"],\n [\"gt\", \">\"],\n [\"quot\", '\"'],\n [\"apos\", \"'\"],\n [\"nbsp\", \" \"],\n]);\n\n/**\n * Decodes one entity body (`amp`, `#38`, `#x26`).\n * @param body - the text between `&` and `;`\n * @returns the character, or undefined when it is not an entity\n */\nfunction entity(body: string): string | undefined {\n if (body.startsWith(\"#\")) {\n const hex = body[1] === \"x\" || body[1] === \"X\";\n const digits = body.slice(hex ? 2 : 1);\n if (digits === \"\" || digits.length > 7 || !(hex ? /^[0-9a-f]+$/i : /^\\d+$/).test(digits)) {\n return undefined;\n }\n const cp = Number.parseInt(digits, hex ? 16 : 10);\n return cp > 0 && cp <= 0x10ffff ? String.fromCodePoint(cp) : undefined;\n }\n return ENTITIES.get(body.toLowerCase());\n}\n\n/**\n * The text an HTML-like label shows: tags dropped, `<br/>` as a line break, entities decoded, outer blanks trimmed.\n * Notes `W_STYLE_HTML_LABEL` at the site, since the markup is lost.\n * @param html - the label, with or without its outer `<` and `>`\n * @param site - where it was read\n * @returns the label's text\n * @category Styles\n */\nexport function htmlLabelText(html: string, site: CanonSite): string {\n spendAt(site, html.length);\n noteAt(site, STYLE_ISSUE.HTML_LABEL, html);\n const body = html.startsWith(\"<\") && html.endsWith(\">\") ? html.slice(1, -1) : html;\n let out = \"\";\n let i = 0;\n while (i < body.length) {\n const c = body[i];\n if (c === \"<\") {\n const close = body.indexOf(\">\", i + 1);\n if (close < 0) {\n break;\n }\n if (/^<br\\b/i.test(body.slice(i, i + 4))) {\n out += \"\\n\";\n }\n i = close + 1;\n } else if (c === \"&\") {\n const [text, next] = entityAt(body, i);\n out += text;\n i = next;\n } else {\n out += c;\n i++;\n }\n }\n return out.trim();\n}\n\n/**\n * The entity starting at an `&`, decoded; an `&` that starts none is itself. An entity is at most 9 characters, so\n * the search for its \";\" stays short and the pass stays linear.\n * @param body - the text\n * @param i - the offset of the `&`\n * @returns the text it stands for and the offset after it\n */\nfunction entityAt(body: string, i: number): [string, number] {\n const near = body.slice(i + 1, i + 10).indexOf(\";\");\n const semi = near < 0 ? -1 : i + 1 + near;\n const decoded = semi > i ? entity(body.slice(i + 1, semi)) : undefined;\n return decoded === undefined ? [\"&\", i + 1] : [decoded, semi + 1];\n}\n\n/**\n * The text a Graphviz record label shows: its fields (`<f0> left|<f1> mid|{a|b}`) without their port names, trimmed,\n * empty ones left out, joined with \" | \". Notes `W_STYLE_RECORD_LABEL` at the site, since the boxes are lost.\n * @param label - the record label\n * @param site - where it was read\n * @returns the fields' text\n * @category Styles\n */\nexport function recordLabelText(label: string, site: CanonSite): string {\n spendAt(site, label.length);\n noteAt(site, STYLE_ISSUE.RECORD_LABEL, label);\n const fields: string[] = [];\n let field = \"\";\n const flush = (): void => {\n const t = field.trim();\n if (t !== \"\") {\n fields.push(t);\n }\n field = \"\";\n };\n let i = 0;\n while (i < label.length) {\n const c = label[i];\n if (c === \"\\\\\" && i + 1 < label.length && \"|{}<> \".includes(label[i + 1])) {\n field += label[i + 1];\n i += 2;\n continue;\n }\n if (c === \"<\") {\n // a port name runs to its \">\"\n const close = label.indexOf(\">\", i + 1);\n i = close < 0 ? label.length : close + 1;\n continue;\n }\n if (c === \"|\" || c === \"{\" || c === \"}\") {\n flush();\n } else {\n field += c;\n }\n i++;\n }\n flush();\n return fields.join(\" | \");\n}\n","/**\n * The neutral property vocabulary at run time: which properties exist for nodes, edges and the graph, what kind of\n * value each takes, and the names of every enumeration. Readers type-check their output against it before\n * planning; a value of the wrong kind is a note, never a style.\n */\n\nimport type { StyleTarget } from \"./types.js\";\n\n/**\n * The kinds of style value: a canonical `#rrggbb` color, a number (lengths and factors at least 0), an opacity\n * (0..1), a text, a boolean, or a value of one of the enumerations in `STYLE_ENUMS`.\n * @category Styles\n */\nexport type StyleValueKind =\n | \"color\"\n | \"number\"\n | \"opacity\"\n | \"text\"\n | \"boolean\"\n | \"shape\"\n | \"borderStyle\"\n | \"lineStyle\"\n | \"arrow\"\n | \"weight\"\n | \"position\";\n\n/**\n * The value kind of every neutral property, per target.\n * @category Styles\n */\nexport const STYLE_PROPERTIES: {\n /** Node properties. */\n readonly node: ReadonlyMap<string, StyleValueKind>;\n /** Edge properties. */\n readonly edge: ReadonlyMap<string, StyleValueKind>;\n /** Graph properties. */\n readonly graph: ReadonlyMap<string, StyleValueKind>;\n} = Object.freeze({\n node: new Map<string, StyleValueKind>([\n [\"fill\", \"color\"],\n [\"borderColor\", \"color\"],\n [\"labelColor\", \"color\"],\n [\"fillOpacity\", \"opacity\"],\n [\"opacity\", \"opacity\"],\n [\"width\", \"number\"],\n [\"height\", \"number\"],\n [\"borderWidth\", \"number\"],\n [\"cornerRadius\", \"number\"],\n [\"labelSize\", \"number\"],\n [\"shape\", \"shape\"],\n [\"borderStyle\", \"borderStyle\"],\n [\"label\", \"text\"],\n [\"tooltip\", \"text\"],\n [\"labelFont\", \"text\"],\n [\"labelWeight\", \"weight\"],\n [\"labelItalic\", \"boolean\"],\n [\"labelPosition\", \"position\"],\n [\"image\", \"text\"],\n [\"visible\", \"boolean\"],\n ]),\n edge: new Map<string, StyleValueKind>([\n [\"color\", \"color\"],\n [\"sourceArrowColor\", \"color\"],\n [\"targetArrowColor\", \"color\"],\n [\"labelColor\", \"color\"],\n [\"opacity\", \"opacity\"],\n [\"width\", \"number\"],\n [\"labelSize\", \"number\"],\n [\"arrowSize\", \"number\"],\n [\"lineStyle\", \"lineStyle\"],\n [\"sourceArrow\", \"arrow\"],\n [\"targetArrow\", \"arrow\"],\n [\"curved\", \"boolean\"],\n [\"bends\", \"text\"],\n [\"label\", \"text\"],\n [\"tooltip\", \"text\"],\n [\"labelFont\", \"text\"],\n [\"labelWeight\", \"weight\"],\n [\"labelItalic\", \"boolean\"],\n [\"sourceLabel\", \"text\"],\n [\"targetLabel\", \"text\"],\n [\"visible\", \"boolean\"],\n ]),\n graph: new Map<string, StyleValueKind>([[\"background\", \"color\"]]),\n});\n\n/**\n * The values of each enumeration kind. A value outside the list is valid only as `other:<raw>` (where the\n * enumeration is open: shapes, border and line styles, arrows).\n * @category Styles\n */\nexport const STYLE_ENUMS: ReadonlyMap<StyleValueKind, readonly string[]> = new Map<StyleValueKind, readonly string[]>([\n [\n \"shape\",\n [\n \"ellipse\",\n \"rectangle\",\n \"round-rectangle\",\n \"triangle\",\n \"diamond\",\n \"pentagon\",\n \"hexagon\",\n \"octagon\",\n \"parallelogram\",\n \"trapezoid\",\n \"star\",\n \"vee\",\n \"none\",\n ],\n ],\n [\"borderStyle\", [\"solid\", \"dashed\", \"dotted\", \"dash-dot\", \"double\"]],\n [\"lineStyle\", [\"solid\", \"dashed\", \"dotted\", \"dash-dot\", \"long-dash\", \"double\", \"zigzag\", \"sinewave\"]],\n [\n \"arrow\",\n [\n \"none\",\n \"triangle\",\n \"triangle-open\",\n \"vee\",\n \"tee\",\n \"diamond\",\n \"diamond-open\",\n \"circle\",\n \"circle-open\",\n \"square\",\n \"crow\",\n \"half\",\n \"inverted\",\n ],\n ],\n [\"weight\", [\"normal\", \"bold\"]],\n [\"position\", [\"center\", \"top\", \"bottom\", \"left\", \"right\", \"top-left\", \"top-right\", \"bottom-left\", \"bottom-right\"]],\n]);\n\n/** The enumerations that keep unknown spellings as `other:<raw>`. */\nconst OPEN_ENUMS: ReadonlySet<StyleValueKind> = new Set<StyleValueKind>([\"shape\", \"borderStyle\", \"lineStyle\", \"arrow\"]);\n\n/**\n * Whether a value is a canonical value of a property. A `graphty:<channel>` property takes any string, number or\n * boolean; an unknown property takes nothing.\n * @param target - nodes, edges or the graph\n * @param property - the property name\n * @param value - the value to check\n * @returns true when the value has the property's kind and canonical spelling\n * @category Styles\n */\nexport function isStyleValue(target: StyleTarget | \"graph\", property: string, value: unknown): boolean {\n if (target !== \"graph\" && property.startsWith(\"graphty:\")) {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n }\n const kind = STYLE_PROPERTIES[target].get(property);\n switch (kind) {\n case undefined:\n return false;\n case \"color\":\n return typeof value === \"string\" && /^#[0-9a-f]{6}$/.test(value);\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0;\n case \"opacity\":\n return typeof value === \"number\" && value >= 0 && value <= 1;\n case \"text\":\n return typeof value === \"string\";\n case \"boolean\":\n return typeof value === \"boolean\";\n default:\n return (\n typeof value === \"string\" &&\n ((STYLE_ENUMS.get(kind)?.includes(value) ?? false) ||\n (OPEN_ENUMS.has(kind) && value.startsWith(\"other:\") && value.length > \"other:\".length))\n );\n }\n}\n","/**\n * The reference semantics of a file's styles: which value each element gets for one property. Walk the rules from\n * the top; the first rule whose predicate matches and that gives the property a non-null value wins. A passthrough\n * over a null, a discrete key absent from its table and a continuous mapping over a missing or non-numeric value give\n * no value, so the walk continues downward.\n */\n\nimport type { GraphSnapshot } from \"@graphty/graph-format\";\n\nimport { formatF32 } from \"../../common/format.js\";\nimport { canonEnum } from \"../canon/enums.js\";\nimport { canonBoolean, canonNumber, canonOpacity } from \"../canon/number.js\";\nimport type { CanonSite } from \"../canon/site.js\";\nimport { canonText } from \"../canon/text.js\";\nimport { StyleNotes } from \"../notes.js\";\nimport type {\n ColumnRef,\n ContinuousPoint,\n ExtractedStyles,\n Mapping,\n Predicate,\n Scalar,\n StyleColumn,\n StyleFeature,\n StyleProperty,\n StyleRule,\n StyleTarget,\n StyleValue,\n StyleWorkBudget,\n} from \"../types.js\";\nimport { STYLE_PROPERTIES } from \"../vocabulary.js\";\n\n/** Predicates nested deeper than this match nothing: a file never makes the resolver recurse without bound. */\nconst MAX_PREDICATE_DEPTH = 32;\n/** The most values an `in` predicate may hold in a short predicate. */\nconst MAX_PREDICATE_TERMS = 8;\nconst HEX6 = /^#[0-9a-f]{6}$/;\n\n/**\n * Where the per-element values a rule reads come from.\n */\ninterface RefSource {\n /** The number of elements. */\n readonly n: number;\n /**\n * The values of a column, by element index, or null when nothing holds it.\n * @param ref - the column\n * @returns the values, or null\n */\n column(ref: ColumnRef): ArrayLike<unknown> | null;\n}\n\n/**\n * The cache key of a column reference.\n * @param ref - the column\n * @returns a key unique per column\n */\nfunction refKey(ref: ColumnRef): string {\n if (\"style\" in ref) {\n return `style:${ref.style}`;\n }\n if (\"computed\" in ref) {\n return `computed:${ref.computed}`;\n }\n return `data:${(ref as { data: string }).data}`;\n}\n\n/**\n * A cell of a snapshot column as a plain value: 64-bit integers as numbers, typed-array items as arrays, unset as\n * null.\n * @param v - the value the table returns\n * @returns the plain value\n */\nexport function plainCell(v: unknown): unknown {\n if (v === undefined || v === null) {\n return null;\n }\n if (typeof v === \"bigint\") {\n return Number(v);\n }\n if (ArrayBuffer.isView(v)) {\n return Array.from(v as unknown as ArrayLike<number>);\n }\n return v;\n}\n\n/**\n * One cell of a data column as a plain value; a 32-bit float as its shortest decimal, so a value gives the same style\n * value whether a file kept it as a 32-bit or a 64-bit number.\n * @param table - the node or edge table\n * @param name - the column\n * @param i - the element\n * @returns the value\n */\nexport function dataCell(table: GraphSnapshot[\"nodes\"], name: string, i: number): unknown {\n const v = plainCell(table.value(name, i));\n return typeof v === \"number\" && table.get(name)?.dtype === \"f32\" ? Number(formatF32(v)) : v;\n}\n\n/**\n * The degree arrays of a snapshot as plain numbers.\n * @param snapshot - the graph\n * @param which - which degree\n * @returns the degree of every node\n */\nexport function degreeValues(snapshot: GraphSnapshot, which: \"degree\" | \"indegree\" | \"outdegree\"): number[] {\n let arr: ArrayLike<number>;\n if (which === \"degree\") {\n arr = snapshot.degree();\n } else if (which === \"indegree\") {\n arr = snapshot.inDegree();\n } else {\n arr = snapshot.outDegree();\n }\n return Array.from(arr);\n}\n\n/**\n * A reference source over a target's style columns, its features and, when given, the snapshot itself.\n * @param target - nodes or edges\n * @param n - the element count\n * @param columns - the style columns\n * @param features - candidate features (used for data and computed columns when no snapshot is given)\n * @param snapshot - the graph, read for data and computed columns when given\n * @returns the source\n */\nexport function refSource(\n target: StyleTarget,\n n: number,\n columns: ReadonlyMap<string, StyleColumn>,\n features: readonly StyleFeature[],\n snapshot?: GraphSnapshot,\n): RefSource {\n const cache = new Map<string, ArrayLike<unknown> | null>();\n const byKey = new Map<string, StyleFeature>();\n for (const f of features) {\n byKey.set(refKey(f.ref), f);\n }\n return {\n n,\n column(ref: ColumnRef): ArrayLike<unknown> | null {\n if (\"style\" in ref) {\n return columns.get(ref.style) ?? null;\n }\n const k = refKey(ref);\n if (cache.has(k)) {\n return cache.get(k) ?? null;\n }\n const out =\n snapshot === undefined ? (byKey.get(k)?.values ?? null) : snapshotColumn(snapshot, target, n, ref);\n cache.set(k, out);\n return out;\n },\n };\n}\n\n/**\n * A data or computed column read from the graph.\n * @param snapshot - the graph\n * @param target - nodes or edges\n * @param n - the element count\n * @param ref - the column, not a style column\n * @returns the values, or null when the graph has no such column (a degree of an edge)\n */\nfunction snapshotColumn(\n snapshot: GraphSnapshot,\n target: StyleTarget,\n n: number,\n ref: Exclude<ColumnRef, { style: string }>,\n): ArrayLike<unknown> | null {\n if (\"computed\" in ref) {\n return target === \"node\" ? degreeValues(snapshot, ref.computed) : null;\n }\n const table = target === \"node\" ? snapshot.nodes : snapshot.edges;\n return table.has(ref.data) ? Array.from({ length: n }, (_, i) => dataCell(table, ref.data, i)) : null;\n}\n\n/**\n * One element's value of a column.\n * @param src - the reference source\n * @param ref - the column\n * @param i - the element\n * @returns the value, or null\n */\nfunction readRef(src: RefSource, ref: ColumnRef, i: number): unknown {\n const col = src.column(ref);\n if (col === null) {\n return null;\n }\n return col[i] ?? null;\n}\n\n/**\n * Whether a predicate is short: `all`, `has`, `not has`, `eq` or `in` with at most 8 values, combined with at most\n * one `and` of at most 8 terms.\n * @param where - the predicate\n * @returns true when it is short\n */\nexport function isShortPredicate(where: Predicate): boolean {\n if (\"and\" in where) {\n if (!Array.isArray(where.and) || where.and.length === 0) {\n return false;\n }\n let terms = 0;\n for (const p of where.and as Predicate[]) {\n const t = atomTerms(p);\n if (t === 0) {\n return false;\n }\n terms += t;\n }\n return terms <= MAX_PREDICATE_TERMS;\n }\n return atomTerms(where) > 0;\n}\n\n/**\n * The terms of a short atom, or 0 when the predicate is not one.\n * @param p - the predicate\n * @returns its term count, or 0\n */\nfunction atomTerms(p: Predicate): number {\n if (\"all\" in p) {\n return p.all ? 1 : 0;\n }\n if (\"has\" in p) {\n return 1;\n }\n if (\"not\" in p) {\n // `not` over a degree test stays a predicate, so it follows later edits.\n return \"has\" in p.not || \"computed\" in refOfTest(p.not) ? atomTerms(p.not) : 0;\n }\n if (\"eq\" in p) {\n return 1;\n }\n if (\"in\" in p) {\n const n = Array.isArray(p.in[1]) ? p.in[1].length : 0;\n return n >= 1 && n <= MAX_PREDICATE_TERMS ? n : 0;\n }\n return 0;\n}\n\n/**\n * The column an `eq` or `in` test reads, or an empty reference for any other predicate.\n * @param p - the predicate\n * @returns the column reference\n */\nfunction refOfTest(p: Predicate): ColumnRef | Record<string, never> {\n if (\"eq\" in p) {\n return p.eq[0];\n }\n if (\"in\" in p) {\n return p.in[0];\n }\n return {};\n}\n\n/**\n * Whether a column value equals a predicate's scalar. A boolean also equals the 1 or 0 and the \"true\" or \"false\" (any\n * case) of a format that has no booleans (GML writes them as 1 and 0), so a rule over a boolean column still selects\n * the same elements after such a file is read back.\n * @param v - the element's value\n * @param k - the scalar\n * @returns true when equal\n */\nfunction scalarEq(v: unknown, k: Scalar): boolean {\n if (v === k) {\n return v !== null && v !== undefined;\n }\n if (typeof k === \"boolean\") {\n return boolEq(k, v);\n }\n return typeof v === \"boolean\" && boolEq(v, k);\n}\n\n/**\n * Whether a value is a boolean's 1 or 0, or its \"true\" or \"false\" in any case.\n * @param b - the boolean\n * @param other - the value\n * @returns true when equal\n */\nfunction boolEq(b: boolean, other: unknown): boolean {\n return other === (b ? 1 : 0) || (typeof other === \"string\" && other.toLowerCase() === String(b));\n}\n\n/**\n * Whether a predicate matches an element. Unknown predicate kinds and predicates nested deeper than 32 match nothing.\n * @param where - the predicate\n * @param src - the reference source\n * @param i - the element\n * @param depth - the current nesting depth\n * @returns true when the predicate matches\n */\nexport function matches(where: Predicate, src: RefSource, i: number, depth = 0): boolean {\n if (depth > MAX_PREDICATE_DEPTH) {\n return false;\n }\n if (\"all\" in where) {\n return where.all;\n }\n if (\"has\" in where) {\n const v = readRef(src, where.has, i);\n return v !== null && v !== false;\n }\n if (\"eq\" in where) {\n return scalarEq(readRef(src, where.eq[0], i), where.eq[1]);\n }\n if (\"in\" in where) {\n const v = readRef(src, where.in[0], i);\n return where.in[1].some((k) => scalarEq(v, k));\n }\n if (\"and\" in where) {\n return where.and.every((p) => matches(p, src, i, depth + 1));\n }\n if (\"or\" in where) {\n return where.or.some((p) => matches(p, src, i, depth + 1));\n }\n if (\"not\" in where) {\n return !matches(where.not, src, i, depth + 1);\n }\n return false;\n}\n\nconst ENUM_KINDS: ReadonlySet<string> = new Set([\"shape\", \"borderStyle\", \"lineStyle\", \"arrow\", \"weight\", \"position\"]);\n\n/**\n * How a passthrough reads a raw value as a property's canonical value (CSS spelling for colors).\n * @param target - nodes or edges\n * @param property - the property\n * @returns the reader: a canonical value or null\n */\nexport function canonicalFor(target: StyleTarget, property: string): (raw: unknown) => StyleValue | null {\n const kind = STYLE_PROPERTIES[target].get(property);\n const site: CanonSite = { notes: new StyleNotes(), target, property };\n if (kind === undefined) {\n return (raw) => (typeof raw === \"string\" || typeof raw === \"number\" || typeof raw === \"boolean\" ? raw : null);\n }\n switch (kind) {\n case \"color\":\n // only an already canonical color: a CSS function or a name may parse differently elsewhere\n return (raw) => (typeof raw === \"string\" && /^#[0-9a-fA-F]{6}$/.test(raw) ? raw.toLowerCase() : null);\n case \"number\":\n return (raw) => canonNumber(raw, site);\n case \"opacity\":\n return (raw) => canonOpacity(raw, \"css\", site);\n case \"boolean\":\n return (raw) => canonBoolean(raw, site);\n case \"text\":\n return (raw) => canonText(raw, site);\n default:\n if (!ENUM_KINDS.has(kind)) {\n return () => null;\n }\n return (raw) =>\n typeof raw === \"string\" && raw.startsWith(\"other:\") ? raw : canonEnum(kind, raw, \"css\", site);\n }\n}\n\nconst LOOKUPS = new WeakMap<object, (value: unknown) => number>();\nconst DECIMAL = /^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/;\n\n/**\n * A number from a number or a decimal string.\n * @param v - the value\n * @returns the number, or null\n */\nexport function numberOf(v: unknown): number | null {\n if (typeof v === \"number\") {\n return Number.isFinite(v) ? v : null;\n }\n if (typeof v === \"string\" && v.length <= 64 && DECIMAL.test(v.trim())) {\n return Number(v.trim());\n }\n return null;\n}\n\n/**\n * The lookup of a discrete table: keys compared by their text (numbers numerically, booleans without case), a list\n * value matched by its first item that has an entry. Built once per table through hash indexes.\n * @param table - the table\n * @returns the index of the matching entry, or -1\n */\nexport function discreteLookup(table: readonly (readonly [Scalar, StyleValue])[]): (value: unknown) => number {\n const cached = LOOKUPS.get(table);\n if (cached !== undefined) {\n return cached;\n }\n const byStr = new Map<string, number>();\n const byNum = new Map<number, number>();\n const byBool = new Map<string, number>();\n table.forEach(([k], j) => {\n if (k === null || typeof k === \"object\") {\n return;\n }\n const ks = String(k);\n if (!byStr.has(ks)) {\n byStr.set(ks, j);\n }\n const kn = numberOf(k);\n if (kn !== null && !byNum.has(kn)) {\n byNum.set(kn, j);\n }\n const kb = ks.toLowerCase();\n if ((kb === \"true\" || kb === \"false\") && !byBool.has(kb)) {\n byBool.set(kb, j);\n }\n });\n const one = (value: unknown): number => {\n if (typeof value === \"number\") {\n return byNum.get(value) ?? -1;\n }\n if (typeof value === \"boolean\") {\n return byBool.get(String(value)) ?? -1;\n }\n if (typeof value === \"string\") {\n return byStr.get(value) ?? -1;\n }\n return -1;\n };\n const f = (value: unknown): number => {\n if (Array.isArray(value)) {\n for (const v of value) {\n const j = one(v);\n if (j >= 0) {\n return j;\n }\n }\n return -1;\n }\n return one(value);\n };\n LOOKUPS.set(table, f);\n return f;\n}\n\n/**\n * Two hex digits.\n * @param v - a channel 0..255\n * @returns its hex\n */\nfunction hex2(v: number): string {\n return Math.min(255, Math.max(0, Math.round(v)))\n .toString(16)\n .padStart(2, \"0\");\n}\n\n/**\n * A number at 6 significant digits.\n * @param x - the number\n * @returns the rounded number\n */\nfunction num6(x: number): number {\n return Number(x.toPrecision(6)) + 0;\n}\n\n/**\n * Interpolates two values: numbers linearly at 6 significant digits, colors per sRGB channel; anything else steps at\n * the right end.\n * @param a - the left value\n * @param b - the right value\n * @param t - 0..1\n * @returns the value\n */\nexport function interpolate(a: StyleValue, b: StyleValue, t: number): StyleValue {\n if (typeof a === \"number\" && typeof b === \"number\") {\n return num6(a + (b - a) * t);\n }\n if (typeof a === \"string\" && typeof b === \"string\" && HEX6.test(a) && HEX6.test(b)) {\n let out = \"#\";\n for (const k of [1, 3, 5]) {\n const ca = Number.parseInt(a.slice(k, k + 2), 16);\n const cb = Number.parseInt(b.slice(k, k + 2), 16);\n out += hex2(ca + (cb - ca) * t);\n }\n return out;\n }\n return t < 1 ? a : b;\n}\n\n/**\n * Evaluates a continuous mapping at x.\n * @param points - the points, in increasing `at`\n * @param x - the input\n * @returns the value, or null for a missing or non-finite input\n */\nexport function evalContinuous(points: readonly ContinuousPoint[], x: number | null): StyleValue | null {\n if (x === null || !Number.isFinite(x) || points.length === 0) {\n return null;\n }\n if (x < points[0].at) {\n return points[0].below;\n }\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n if (x === p.at) {\n return p.value;\n }\n const q = points.at(i + 1);\n if (q === undefined) {\n return p.above;\n }\n if (x < q.at) {\n return interpolate(p.above, q.below, (x - p.at) / (q.at - p.at));\n }\n }\n return null;\n}\n\n/**\n * The value one mapping gives one element.\n * @param m - the mapping\n * @param canon - the property's passthrough reader\n * @param src - the reference source\n * @param i - the element\n * @returns the value, or null when the mapping gives none\n */\nfunction evalMapping(\n m: Mapping,\n canon: (raw: unknown) => StyleValue | null,\n src: RefSource,\n i: number,\n): StyleValue | null {\n const v = readRef(src, m.by, i);\n if (v === null || v === undefined) {\n return null;\n }\n switch (m.kind) {\n case \"passthrough\":\n if (Array.isArray(v)) {\n return null;\n }\n // a style column already holds canonical values; a data column is read as the property's value\n if (\"style\" in m.by) {\n return typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\" ? v : null;\n }\n return canon(v);\n case \"discrete\": {\n const j = discreteLookup(m.table)(v);\n return j < 0 ? null : m.table[j][1];\n }\n case \"continuous\":\n return Array.isArray(v) ? null : evalContinuous(m.points, numberOf(v));\n default:\n return null;\n }\n}\n\n/**\n * A rule's constant value of a property: its own member only, so a property named like a built-in object member\n * (`constructor`, `toString`) is never found on the prototype.\n * @param rule - the rule\n * @param property - the property\n * @returns the value, or undefined\n */\nfunction setOf(rule: StyleRule, property: string): StyleValue | undefined {\n const set: Readonly<Record<string, StyleValue | undefined>> = rule.set ?? {};\n return Object.hasOwn(set, property) ? set[property] : undefined;\n}\n\n/**\n * A rule's mapping of a property: its own member only.\n * @param rule - the rule\n * @param property - the property\n * @returns the mapping, or undefined\n */\nfunction mapOf(rule: StyleRule, property: string): Mapping | undefined {\n const map: Readonly<Record<string, Mapping | undefined>> = rule.map ?? {};\n return Object.hasOwn(map, property) ? map[property] : undefined;\n}\n\n/**\n * Resolves one property for every element over a rule list.\n * @param rules - the rules, bottom to top (other targets are skipped)\n * @param target - nodes or edges\n * @param property - the property\n * @param src - the reference source\n * @param budget - spent once per rule visited, when given\n * @returns each element's value, or null where no rule gives one\n */\nexport function resolveRules(\n rules: readonly StyleRule[],\n target: StyleTarget,\n property: string,\n src: RefSource,\n budget?: StyleWorkBudget,\n): (StyleValue | null)[] {\n // the rules that write the property, top first\n const writers = rules\n .filter(\n (rule) =>\n rule.target === target && (setOf(rule, property) !== undefined || mapOf(rule, property) !== undefined),\n )\n .reverse();\n const canon = canonicalFor(target, property);\n const out = new Array<StyleValue | null>(src.n).fill(null);\n let visits = 0;\n for (let i = 0; i < src.n; i++) {\n for (const rule of writers) {\n visits++;\n const v = ruleValue(rule, property, canon, src, i);\n if (v !== null) {\n out[i] = v;\n break;\n }\n }\n }\n budget?.spend(target, visits + src.n);\n return out;\n}\n\n/**\n * The value one rule gives an element, or null when it selects the element but gives no value, or does not select it.\n * @param rule - the rule\n * @param property - the property\n * @param canon - the property's canonicalizer\n * @param src - the reference source\n * @param i - the element\n * @returns the value, or null\n */\nfunction ruleValue(\n rule: StyleRule,\n property: string,\n canon: ReturnType<typeof canonicalFor>,\n src: RefSource,\n i: number,\n): StyleValue | null {\n if (!matches(rule.where, src, i)) {\n return null;\n }\n const set = setOf(rule, property);\n if (set !== undefined) {\n return set;\n }\n const mapping = mapOf(rule, property);\n return mapping === undefined ? null : evalMapping(mapping, canon, src, i);\n}\n\n/**\n * Every element's value of one property under a file's styles: the reference semantics of the format.\n * @param extracted - the styles\n * @param target - nodes or edges\n * @param property - the property\n * @param snapshot - the graph; when given, data columns and degrees are read from it (so a degree mapping follows\n * the graph), otherwise from `extracted.features`\n * @returns each element's value, or null where the file gives none\n * @category Styles\n */\nexport function resolveStyles(\n extracted: ExtractedStyles,\n target: StyleTarget,\n property: StyleProperty,\n snapshot?: GraphSnapshot,\n): readonly (StyleValue | null)[] {\n let n = extracted.fingerprint[target === \"node\" ? \"nodes\" : \"edges\"];\n if (snapshot !== undefined) {\n n = target === \"node\" ? snapshot.nodeCount : snapshot.edgeCount;\n }\n const src = refSource(target, n, extracted.columns[target], extracted.features[target], snapshot);\n return resolveRules(extracted.styles.rules, target, property, src);\n}\n\n/**\n * Whether two values agree within the rounding a writing tool does: 2 of 255 per color channel, or 1e-5 relative for\n * numbers.\n * @param a - one value\n * @param b - the other\n * @returns true when equal or within the rounding\n */\nexport function within(a: StyleValue | null, b: StyleValue | null): boolean {\n if (a === b) {\n return true;\n }\n if (typeof a === \"number\" && typeof b === \"number\") {\n return Math.abs(a - b) <= 1e-5 * Math.max(Math.abs(a), Math.abs(b), 1e-9);\n }\n if (typeof a === \"string\" && typeof b === \"string\" && HEX6.test(a) && HEX6.test(b)) {\n for (const k of [1, 3, 5]) {\n if (Math.abs(Number.parseInt(a.slice(k, k + 2), 16) - Number.parseInt(b.slice(k, k + 2), 16)) > 2) {\n return false;\n }\n }\n return true;\n }\n return false;\n}\n","/**\n * The color name tables of every dialect, as compact text read once when the module loads. Each is read into a\n * `Map`, so a name taken from a file (`constructor`, `__proto__`) is never an inherited member.\n *\n * - CSS: the CSS Color 4 named colors, as graphty-element draws them.\n * - X11: the names Graphviz 2.43 resolves in its default `x11` scheme, measured with `dot -Txdot` (`gray` is\n * `#c0c0c0` there, not CSS's `#808080`).\n * - Brewer: the ColorBrewer schemes Graphviz knows (`/blues9/3`), measured the same way; index i is entry i - 1.\n * - dvips: the 68 CMYK color names of LaTeX's dvips driver, which Pajek uses, converted to RGB.\n * - Java: the `java.awt.Color` constants Cytoscape and Gephi write.\n */\n\n/**\n * Reads \"name=rrggbb name=rrggbb ...\" into a Map.\n * @param text - the table\n * @returns name to `#rrggbb`\n */\nfunction table(text: string): ReadonlyMap<string, string> {\n const map = new Map<string, string>();\n for (const entry of text.split(\" \")) {\n const eq = entry.indexOf(\"=\");\n map.set(entry.slice(0, eq), `#${entry.slice(eq + 1)}`);\n }\n return map;\n}\n\n/** CSS named colors, lowercase. */\nexport const CSS_COLORS: ReadonlyMap<string, string> = table(\n \"aliceblue=f0f8ff antiquewhite=faebd7 aqua=00ffff aquamarine=7fffd4 azure=f0ffff beige=f5f5dc \" +\n \"bisque=ffe4c4 black=000000 blanchedalmond=ffebcd blue=0000ff blueviolet=8a2be2 brown=a52a2a \" +\n \"burlywood=deb887 cadetblue=5f9ea0 chartreuse=7fff00 chocolate=d2691e coral=ff7f50 cornflowerblue=6495ed \" +\n \"cornsilk=fff8dc crimson=dc143c cyan=00ffff darkblue=00008b darkcyan=008b8b darkgoldenrod=b8860b \" +\n \"darkgray=a9a9a9 darkgreen=006400 darkgrey=a9a9a9 darkkhaki=bdb76b darkmagenta=8b008b \" +\n \"darkolivegreen=556b2f darkorange=ff8c00 darkorchid=9932cc darkred=8b0000 darksalmon=e9967a \" +\n \"darkseagreen=8fbc8f darkslateblue=483d8b darkslategray=2f4f4f darkslategrey=2f4f4f darkturquoise=00ced1 \" +\n \"darkviolet=9400d3 deeppink=ff1493 deepskyblue=00bfff dimgray=696969 dimgrey=696969 dodgerblue=1e90ff \" +\n \"firebrick=b22222 floralwhite=fffaf0 forestgreen=228b22 fuchsia=ff00ff gainsboro=dcdcdc ghostwhite=f8f8ff \" +\n \"gold=ffd700 goldenrod=daa520 gray=808080 green=008000 greenyellow=adff2f grey=808080 honeydew=f0fff0 \" +\n \"hotpink=ff69b4 indianred=cd5c5c indigo=4b0082 ivory=fffff0 khaki=f0e68c lavender=e6e6fa \" +\n \"lavenderblush=fff0f5 lawngreen=7cfc00 lemonchiffon=fffacd lightblue=add8e6 lightcoral=f08080 \" +\n \"lightcyan=e0ffff lightgoldenrodyellow=fafad2 lightgray=d3d3d3 lightgreen=90ee90 lightgrey=d3d3d3 \" +\n \"lightpink=ffb6c1 lightsalmon=ffa07a lightseagreen=20b2aa lightskyblue=87cefa lightslategray=778899 \" +\n \"lightslategrey=778899 lightsteelblue=b0c4de lightyellow=ffffe0 lime=00ff00 limegreen=32cd32 linen=faf0e6 \" +\n \"magenta=ff00ff maroon=800000 mediumaquamarine=66cdaa mediumblue=0000cd mediumorchid=ba55d3 \" +\n \"mediumpurple=9370db mediumseagreen=3cb371 mediumslateblue=7b68ee mediumspringgreen=00fa9a \" +\n \"mediumturquoise=48d1cc mediumvioletred=c71585 midnightblue=191970 mintcream=f5fffa mistyrose=ffe4e1 \" +\n \"moccasin=ffe4b5 navajowhite=ffdead navy=000080 oldlace=fdf5e6 olive=808000 olivedrab=6b8e23 \" +\n \"orange=ffa500 orangered=ff4500 orchid=da70d6 palegoldenrod=eee8aa palegreen=98fb98 paleturquoise=afeeee \" +\n \"palevioletred=db7093 papayawhip=ffefd5 peachpuff=ffdab9 peru=cd853f pink=ffc0cb plum=dda0dd \" +\n \"powderblue=b0e0e6 purple=800080 rebeccapurple=663399 red=ff0000 rosybrown=bc8f8f royalblue=4169e1 \" +\n \"saddlebrown=8b4513 salmon=fa8072 sandybrown=f4a460 seagreen=2e8b57 seashell=fff5ee sienna=a0522d \" +\n \"silver=c0c0c0 skyblue=87ceeb slateblue=6a5acd slategray=708090 slategrey=708090 snow=fffafa \" +\n \"springgreen=00ff7f steelblue=4682b4 tan=d2b48c teal=008080 thistle=d8bfd8 tomato=ff6347 turquoise=40e0d0 \" +\n \"violet=ee82ee wheat=f5deb3 white=ffffff whitesmoke=f5f5f5 yellow=ffff00 yellowgreen=9acd32\",\n);\n\n/** Graphviz's X11 scheme, lowercase. */\nexport const X11_COLORS: ReadonlyMap<string, string> = table(\n \"aliceblue=f0f8ff antiquewhite=faebd7 antiquewhite1=ffefdb antiquewhite2=eedfcc antiquewhite3=cdc0b0 \" +\n \"antiquewhite4=8b8378 aqua=00ffff aquamarine=7fffd4 aquamarine1=7fffd4 aquamarine2=76eec6 \" +\n \"aquamarine3=66cdaa aquamarine4=458b74 azure=f0ffff azure1=f0ffff azure2=e0eeee azure3=c1cdcd \" +\n \"azure4=838b8b beige=f5f5dc bisque=ffe4c4 bisque1=ffe4c4 bisque2=eed5b7 bisque3=cdb79e bisque4=8b7d6b \" +\n \"black=000000 blanchedalmond=ffebcd blue=0000ff blue1=0000ff blue2=0000ee blue3=0000cd blue4=00008b \" +\n \"blueviolet=8a2be2 brown=a52a2a brown1=ff4040 brown2=ee3b3b brown3=cd3333 brown4=8b2323 burlywood=deb887 \" +\n \"burlywood1=ffd39b burlywood2=eec591 burlywood3=cdaa7d burlywood4=8b7355 cadetblue=5f9ea0 \" +\n \"cadetblue1=98f5ff cadetblue2=8ee5ee cadetblue3=7ac5cd cadetblue4=53868b chartreuse=7fff00 \" +\n \"chartreuse1=7fff00 chartreuse2=76ee00 chartreuse3=66cd00 chartreuse4=458b00 chocolate=d2691e \" +\n \"chocolate1=ff7f24 chocolate2=ee7621 chocolate3=cd661d chocolate4=8b4513 coral=ff7f50 coral1=ff7256 \" +\n \"coral2=ee6a50 coral3=cd5b45 coral4=8b3e2f cornflowerblue=6495ed cornsilk=fff8dc cornsilk1=fff8dc \" +\n \"cornsilk2=eee8cd cornsilk3=cdc8b1 cornsilk4=8b8878 crimson=dc143c cyan=00ffff cyan1=00ffff cyan2=00eeee \" +\n \"cyan3=00cdcd cyan4=008b8b darkblue=00008b darkcyan=008b8b darkgoldenrod=b8860b darkgoldenrod1=ffb90f \" +\n \"darkgoldenrod2=eead0e darkgoldenrod3=cd950c darkgoldenrod4=8b6508 darkgray=a9a9a9 darkgreen=006400 \" +\n \"darkgrey=a9a9a9 darkkhaki=bdb76b darkmagenta=8b008b darkolivegreen=556b2f darkolivegreen1=caff70 \" +\n \"darkolivegreen2=bcee68 darkolivegreen3=a2cd5a darkolivegreen4=6e8b3d darkorange=ff8c00 \" +\n \"darkorange1=ff7f00 darkorange2=ee7600 darkorange3=cd6600 darkorange4=8b4500 darkorchid=9932cc \" +\n \"darkorchid1=bf3eff darkorchid2=b23aee darkorchid3=9a32cd darkorchid4=68228b darkred=8b0000 \" +\n \"darksalmon=e9967a darkseagreen=8fbc8f darkseagreen1=c1ffc1 darkseagreen2=b4eeb4 darkseagreen3=9bcd9b \" +\n \"darkseagreen4=698b69 darkslateblue=483d8b darkslategray=2f4f4f darkslategray1=97ffff \" +\n \"darkslategray2=8deeee darkslategray3=79cdcd darkslategray4=528b8b darkslategrey=2f4f4f \" +\n \"darkturquoise=00ced1 darkviolet=9400d3 deeppink=ff1493 deeppink1=ff1493 deeppink2=ee1289 \" +\n \"deeppink3=cd1076 deeppink4=8b0a50 deepskyblue=00bfff deepskyblue1=00bfff deepskyblue2=00b2ee \" +\n \"deepskyblue3=009acd deepskyblue4=00688b dimgray=696969 dimgrey=696969 dodgerblue=1e90ff \" +\n \"dodgerblue1=1e90ff dodgerblue2=1c86ee dodgerblue3=1874cd dodgerblue4=104e8b firebrick=b22222 \" +\n \"firebrick1=ff3030 firebrick2=ee2c2c firebrick3=cd2626 firebrick4=8b1a1a floralwhite=fffaf0 \" +\n \"forestgreen=228b22 fuchsia=ff00ff gainsboro=dcdcdc ghostwhite=f8f8ff gold=ffd700 gold1=ffd700 \" +\n \"gold2=eec900 gold3=cdad00 gold4=8b7500 goldenrod=daa520 goldenrod1=ffc125 goldenrod2=eeb422 \" +\n \"goldenrod3=cd9b1d goldenrod4=8b6914 gray=c0c0c0 gray0=000000 gray1=030303 gray10=1a1a1a gray100=ffffff \" +\n \"gray11=1c1c1c gray12=1f1f1f gray13=212121 gray14=242424 gray15=262626 gray16=292929 gray17=2b2b2b \" +\n \"gray18=2e2e2e gray19=303030 gray2=050505 gray20=333333 gray21=363636 gray22=383838 gray23=3b3b3b \" +\n \"gray24=3d3d3d gray25=404040 gray26=424242 gray27=454545 gray28=474747 gray29=4a4a4a gray3=080808 \" +\n \"gray30=4d4d4d gray31=4f4f4f gray32=525252 gray33=545454 gray34=575757 gray35=595959 gray36=5c5c5c \" +\n \"gray37=5e5e5e gray38=616161 gray39=636363 gray4=0a0a0a gray40=666666 gray41=696969 gray42=6b6b6b \" +\n \"gray43=6e6e6e gray44=707070 gray45=737373 gray46=757575 gray47=787878 gray48=7a7a7a gray49=7d7d7d \" +\n \"gray5=0d0d0d gray50=7f7f7f gray51=828282 gray52=858585 gray53=878787 gray54=8a8a8a gray55=8c8c8c \" +\n \"gray56=8f8f8f gray57=919191 gray58=949494 gray59=969696 gray6=0f0f0f gray60=999999 gray61=9c9c9c \" +\n \"gray62=9e9e9e gray63=a1a1a1 gray64=a3a3a3 gray65=a6a6a6 gray66=a8a8a8 gray67=ababab gray68=adadad \" +\n \"gray69=b0b0b0 gray7=121212 gray70=b3b3b3 gray71=b5b5b5 gray72=b8b8b8 gray73=bababa gray74=bdbdbd \" +\n \"gray75=bfbfbf gray76=c2c2c2 gray77=c4c4c4 gray78=c7c7c7 gray79=c9c9c9 gray8=141414 gray80=cccccc \" +\n \"gray81=cfcfcf gray82=d1d1d1 gray83=d4d4d4 gray84=d6d6d6 gray85=d9d9d9 gray86=dbdbdb gray87=dedede \" +\n \"gray88=e0e0e0 gray89=e3e3e3 gray9=171717 gray90=e5e5e5 gray91=e8e8e8 gray92=ebebeb gray93=ededed \" +\n \"gray94=f0f0f0 gray95=f2f2f2 gray96=f5f5f5 gray97=f7f7f7 gray98=fafafa gray99=fcfcfc green=00ff00 \" +\n \"green1=00ff00 green2=00ee00 green3=00cd00 green4=008b00 greenyellow=adff2f grey=c0c0c0 grey0=000000 \" +\n \"grey1=030303 grey10=1a1a1a grey100=ffffff grey11=1c1c1c grey12=1f1f1f grey13=212121 grey14=242424 \" +\n \"grey15=262626 grey16=292929 grey17=2b2b2b grey18=2e2e2e grey19=303030 grey2=050505 grey20=333333 \" +\n \"grey21=363636 grey22=383838 grey23=3b3b3b grey24=3d3d3d grey25=404040 grey26=424242 grey27=454545 \" +\n \"grey28=474747 grey29=4a4a4a grey3=080808 grey30=4d4d4d grey31=4f4f4f grey32=525252 grey33=545454 \" +\n \"grey34=575757 grey35=595959 grey36=5c5c5c grey37=5e5e5e grey38=616161 grey39=636363 grey4=0a0a0a \" +\n \"grey40=666666 grey41=696969 grey42=6b6b6b grey43=6e6e6e grey44=707070 grey45=737373 grey46=757575 \" +\n \"grey47=787878 grey48=7a7a7a grey49=7d7d7d grey5=0d0d0d grey50=7f7f7f grey51=828282 grey52=858585 \" +\n \"grey53=878787 grey54=8a8a8a grey55=8c8c8c grey56=8f8f8f grey57=919191 grey58=949494 grey59=969696 \" +\n \"grey6=0f0f0f grey60=999999 grey61=9c9c9c grey62=9e9e9e grey63=a1a1a1 grey64=a3a3a3 grey65=a6a6a6 \" +\n \"grey66=a8a8a8 grey67=ababab grey68=adadad grey69=b0b0b0 grey7=121212 grey70=b3b3b3 grey71=b5b5b5 \" +\n \"grey72=b8b8b8 grey73=bababa grey74=bdbdbd grey75=bfbfbf grey76=c2c2c2 grey77=c4c4c4 grey78=c7c7c7 \" +\n \"grey79=c9c9c9 grey8=141414 grey80=cccccc grey81=cfcfcf grey82=d1d1d1 grey83=d4d4d4 grey84=d6d6d6 \" +\n \"grey85=d9d9d9 grey86=dbdbdb grey87=dedede grey88=e0e0e0 grey89=e3e3e3 grey9=171717 grey90=e5e5e5 \" +\n \"grey91=e8e8e8 grey92=ebebeb grey93=ededed grey94=f0f0f0 grey95=f2f2f2 grey96=f5f5f5 grey97=f7f7f7 \" +\n \"grey98=fafafa grey99=fcfcfc honeydew=f0fff0 honeydew1=f0fff0 honeydew2=e0eee0 honeydew3=c1cdc1 \" +\n \"honeydew4=838b83 hotpink=ff69b4 hotpink1=ff6eb4 hotpink2=ee6aa7 hotpink3=cd6090 hotpink4=8b3a62 \" +\n \"indianred=cd5c5c indianred1=ff6a6a indianred2=ee6363 indianred3=cd5555 indianred4=8b3a3a indigo=4b0082 \" +\n \"ivory=fffff0 ivory1=fffff0 ivory2=eeeee0 ivory3=cdcdc1 ivory4=8b8b83 khaki=f0e68c khaki1=fff68f \" +\n \"khaki2=eee685 khaki3=cdc673 khaki4=8b864e lavender=e6e6fa lavenderblush=fff0f5 lavenderblush1=fff0f5 \" +\n \"lavenderblush2=eee0e5 lavenderblush3=cdc1c5 lavenderblush4=8b8386 lawngreen=7cfc00 lemonchiffon=fffacd \" +\n \"lemonchiffon1=fffacd lemonchiffon2=eee9bf lemonchiffon3=cdc9a5 lemonchiffon4=8b8970 lightblue=add8e6 \" +\n \"lightblue1=bfefff lightblue2=b2dfee lightblue3=9ac0cd lightblue4=68838b lightcoral=f08080 \" +\n \"lightcyan=e0ffff lightcyan1=e0ffff lightcyan2=d1eeee lightcyan3=b4cdcd lightcyan4=7a8b8b \" +\n \"lightgoldenrod=eedd82 lightgoldenrod1=ffec8b lightgoldenrod2=eedc82 lightgoldenrod3=cdbe70 \" +\n \"lightgoldenrod4=8b814c lightgoldenrodyellow=fafad2 lightgray=d3d3d3 lightgreen=90ee90 lightgrey=d3d3d3 \" +\n \"lightpink=ffb6c1 lightpink1=ffaeb9 lightpink2=eea2ad lightpink3=cd8c95 lightpink4=8b5f65 \" +\n \"lightsalmon=ffa07a lightsalmon1=ffa07a lightsalmon2=ee9572 lightsalmon3=cd8162 lightsalmon4=8b5742 \" +\n \"lightseagreen=20b2aa lightskyblue=87cefa lightskyblue1=b0e2ff lightskyblue2=a4d3ee lightskyblue3=8db6cd \" +\n \"lightskyblue4=607b8b lightslateblue=8470ff lightslategray=778899 lightslategrey=778899 \" +\n \"lightsteelblue=b0c4de lightsteelblue1=cae1ff lightsteelblue2=bcd2ee lightsteelblue3=a2b5cd \" +\n \"lightsteelblue4=6e7b8b lightyellow=ffffe0 lightyellow1=ffffe0 lightyellow2=eeeed1 lightyellow3=cdcdb4 \" +\n \"lightyellow4=8b8b7a lime=00ff00 limegreen=32cd32 linen=faf0e6 magenta=ff00ff magenta1=ff00ff \" +\n \"magenta2=ee00ee magenta3=cd00cd magenta4=8b008b maroon=b03060 maroon1=ff34b3 maroon2=ee30a7 \" +\n \"maroon3=cd2990 maroon4=8b1c62 mediumaquamarine=66cdaa mediumblue=0000cd mediumorchid=ba55d3 \" +\n \"mediumorchid1=e066ff mediumorchid2=d15fee mediumorchid3=b452cd mediumorchid4=7a378b mediumpurple=9370db \" +\n \"mediumpurple1=ab82ff mediumpurple2=9f79ee mediumpurple3=8968cd mediumpurple4=5d478b \" +\n \"mediumseagreen=3cb371 mediumslateblue=7b68ee mediumspringgreen=00fa9a mediumturquoise=48d1cc \" +\n \"mediumvioletred=c71585 midnightblue=191970 mintcream=f5fffa mistyrose=ffe4e1 mistyrose1=ffe4e1 \" +\n \"mistyrose2=eed5d2 mistyrose3=cdb7b5 mistyrose4=8b7d7b moccasin=ffe4b5 navajowhite=ffdead \" +\n \"navajowhite1=ffdead navajowhite2=eecfa1 navajowhite3=cdb38b navajowhite4=8b795e navy=000080 \" +\n \"navyblue=000080 oldlace=fdf5e6 olive=808000 olivedrab=6b8e23 olivedrab1=c0ff3e olivedrab2=b3ee3a \" +\n \"olivedrab3=9acd32 olivedrab4=698b22 orange=ffa500 orange1=ffa500 orange2=ee9a00 orange3=cd8500 \" +\n \"orange4=8b5a00 orangered=ff4500 orangered1=ff4500 orangered2=ee4000 orangered3=cd3700 orangered4=8b2500 \" +\n \"orchid=da70d6 orchid1=ff83fa orchid2=ee7ae9 orchid3=cd69c9 orchid4=8b4789 palegoldenrod=eee8aa \" +\n \"palegreen=98fb98 palegreen1=9aff9a palegreen2=90ee90 palegreen3=7ccd7c palegreen4=548b54 \" +\n \"paleturquoise=afeeee paleturquoise1=bbffff paleturquoise2=aeeeee paleturquoise3=96cdcd \" +\n \"paleturquoise4=668b8b palevioletred=db7093 palevioletred1=ff82ab palevioletred2=ee799f \" +\n \"palevioletred3=cd6889 palevioletred4=8b475d papayawhip=ffefd5 peachpuff=ffdab9 peachpuff1=ffdab9 \" +\n \"peachpuff2=eecbad peachpuff3=cdaf95 peachpuff4=8b7765 peru=cd853f pink=ffc0cb pink1=ffb5c5 pink2=eea9b8 \" +\n \"pink3=cd919e pink4=8b636c plum=dda0dd plum1=ffbbff plum2=eeaeee plum3=cd96cd plum4=8b668b \" +\n \"powderblue=b0e0e6 purple=a020f0 purple1=9b30ff purple2=912cee purple3=7d26cd purple4=551a8b \" +\n \"rebeccapurple=663399 red=ff0000 red1=ff0000 red2=ee0000 red3=cd0000 red4=8b0000 rosybrown=bc8f8f \" +\n \"rosybrown1=ffc1c1 rosybrown2=eeb4b4 rosybrown3=cd9b9b rosybrown4=8b6969 royalblue=4169e1 \" +\n \"royalblue1=4876ff royalblue2=436eee royalblue3=3a5fcd royalblue4=27408b saddlebrown=8b4513 salmon=fa8072 \" +\n \"salmon1=ff8c69 salmon2=ee8262 salmon3=cd7054 salmon4=8b4c39 sandybrown=f4a460 seagreen=2e8b57 \" +\n \"seagreen1=54ff9f seagreen2=4eee94 seagreen3=43cd80 seagreen4=2e8b57 seashell=fff5ee seashell1=fff5ee \" +\n \"seashell2=eee5de seashell3=cdc5bf seashell4=8b8682 sienna=a0522d sienna1=ff8247 sienna2=ee7942 \" +\n \"sienna3=cd6839 sienna4=8b4726 silver=c0c0c0 skyblue=87ceeb skyblue1=87ceff skyblue2=7ec0ee \" +\n \"skyblue3=6ca6cd skyblue4=4a708b slateblue=6a5acd slateblue1=836fff slateblue2=7a67ee slateblue3=6959cd \" +\n \"slateblue4=473c8b slategray=708090 slategray1=c6e2ff slategray2=b9d3ee slategray3=9fb6cd \" +\n \"slategray4=6c7b8b slategrey=708090 snow=fffafa snow1=fffafa snow2=eee9e9 snow3=cdc9c9 snow4=8b8989 \" +\n \"springgreen=00ff7f springgreen1=00ff7f springgreen2=00ee76 springgreen3=00cd66 springgreen4=008b45 \" +\n \"steelblue=4682b4 steelblue1=63b8ff steelblue2=5cacee steelblue3=4f94cd steelblue4=36648b tan=d2b48c \" +\n \"tan1=ffa54f tan2=ee9a49 tan3=cd853f tan4=8b5a2b teal=008080 thistle=d8bfd8 thistle1=ffe1ff \" +\n \"thistle2=eed2ee thistle3=cdb5cd thistle4=8b7b8b tomato=ff6347 tomato1=ff6347 tomato2=ee5c42 \" +\n \"tomato3=cd4f39 tomato4=8b3626 turquoise=40e0d0 turquoise1=00f5ff turquoise2=00e5ee turquoise3=00c5cd \" +\n \"turquoise4=00868b violet=ee82ee violetred=d02090 violetred1=ff3e96 violetred2=ee3a8c violetred3=cd3278 \" +\n \"violetred4=8b2252 wheat=f5deb3 wheat1=ffe7ba wheat2=eed8ae wheat3=cdba96 wheat4=8b7e66 white=ffffff \" +\n \"whitesmoke=f5f5f5 yellow=ffff00 yellow1=ffff00 yellow2=eeee00 yellow3=cdcd00 yellow4=8b8b00 \" +\n \"yellowgreen=9acd32\",\n);\n\n/** dvips names, case as Pajek spells them. */\nexport const DVIPS_COLORS: ReadonlyMap<string, string> = table(\n \"GreenYellow=d9ff4f Yellow=ffff00 Goldenrod=ffe629 Dandelion=ffb529 Apricot=ffad7a Peach=ff804d \" +\n \"Melon=ff8a80 YellowOrange=ff9400 Orange=ff6321 BurntOrange=ff7d00 Bittersweet=c20300 RedOrange=ff3b21 \" +\n \"Mahogany=a60000 Maroon=ad0000 BrickRed=b80000 Red=ff0000 OrangeRed=ff0080 RubineRed=ff00de \" +\n \"WildStrawberry=ff0a9c Salmon=ff789e CarnationPink=ff5eff Magenta=ff00ff VioletRed=ff30ff \" +\n \"Rhodamine=ff2eff Mulberry=a314fa RedViolet=9600a8 Fuchsia=7303eb Lavender=ff85ff Thistle=e069ff \" +\n \"Orchid=ad5cff DarkOrchid=9933cc Purple=8c24ff Plum=8000ff Violet=361fff RoyalPurple=4019ff \" +\n \"BlueViolet=190df5 Periwinkle=6e73ff CadetBlue=616ec4 CornflowerBlue=59deff MidnightBlue=007091 \" +\n \"NavyBlue=0f75ff RoyalBlue=0080ff Blue=0000ff Cerulean=0fe3ff Cyan=00ffff ProcessBlue=0affff \" +\n \"SkyBlue=61ffe0 Turquoise=26ffcc TealBlue=1ffaa3 Aquamarine=2effb2 BlueGreen=26ffab Emerald=00ff80 \" +\n \"JungleGreen=03ff7a SeaGreen=4fff80 Green=00ff00 ForestGreen=00e000 PineGreen=00bf29 LimeGreen=80ff00 \" +\n \"YellowGreen=8fff42 SpringGreen=bdff3d OliveGreen=009900 RawSienna=8c0000 Sepia=4d0000 Brown=660000 \" +\n \"Tan=db9470 Gray=808080 Black=000000 White=ffffff\",\n);\n\n/** Java's `java.awt.Color` constants, lowercase, with and without the underscore. */\nexport const JAVA_COLORS: ReadonlyMap<string, string> = table(\n \"black=000000 blue=0000ff cyan=00ffff darkgray=404040 dark_gray=404040 gray=808080 green=00ff00 \" +\n \"lightgray=c0c0c0 light_gray=c0c0c0 magenta=ff00ff orange=ffc800 pink=ffafaf red=ff0000 white=ffffff yellow=ffff00\",\n);\n\n/** Graphviz's Brewer schemes: scheme name to its colors, entry i - 1 for index i. */\nexport const BREWER_SCHEMES: ReadonlyMap<string, readonly string[]> = new Map(\n (\n \"accent3=7fc97f,beaed4,fdc086 accent4=7fc97f,beaed4,fdc086,ffff99 \" +\n \"accent5=7fc97f,beaed4,fdc086,ffff99,386cb0 accent6=7fc97f,beaed4,fdc086,ffff99,386cb0,f0027f \" +\n \"accent7=7fc97f,beaed4,fdc086,ffff99,386cb0,f0027f,bf5b17 \" +\n \"accent8=7fc97f,beaed4,fdc086,ffff99,386cb0,f0027f,bf5b17,666666 blues3=deebf7,9ecae1,3182bd \" +\n \"blues4=eff3ff,bdd7e7,6baed6,2171b5 blues5=eff3ff,bdd7e7,6baed6,3182bd,08519c \" +\n \"blues6=eff3ff,c6dbef,9ecae1,6baed6,3182bd,08519c blues7=eff3ff,c6dbef,9ecae1,6baed6,4292c6,2171b5,084594 \" +\n \"blues8=f7fbff,deebf7,c6dbef,9ecae1,6baed6,4292c6,2171b5,084594 \" +\n \"blues9=f7fbff,deebf7,c6dbef,9ecae1,6baed6,4292c6,2171b5,08519c,08306b \" +\n \"brbg10=543005,8c510a,bf812d,dfc27d,f6e8c3,c7eae5,80cdc1,35978f,01665e,003c30 \" +\n \"brbg11=543005,8c510a,bf812d,dfc27d,f6e8c3,f5f5f5,c7eae5,80cdc1,35978f,01665e,003c30 \" +\n \"brbg3=d8b365,f5f5f5,5ab4ac brbg4=a6611a,dfc27d,80cdc1,018571 brbg5=a6611a,dfc27d,f5f5f5,80cdc1,018571 \" +\n \"brbg6=8c510a,d8b365,f6e8c3,c7eae5,5ab4ac,01665e brbg7=8c510a,d8b365,f6e8c3,f5f5f5,c7eae5,5ab4ac,01665e \" +\n \"brbg8=8c510a,bf812d,dfc27d,f6e8c3,c7eae5,80cdc1,35978f,01665e \" +\n \"brbg9=8c510a,bf812d,dfc27d,f6e8c3,f5f5f5,c7eae5,80cdc1,35978f,01665e bugn3=e5f5f9,99d8c9,2ca25f \" +\n \"bugn4=edf8fb,b2e2e2,66c2a4,238b45 bugn5=edf8fb,b2e2e2,66c2a4,2ca25f,006d2c \" +\n \"bugn6=edf8fb,ccece6,99d8c9,66c2a4,2ca25f,006d2c bugn7=edf8fb,ccece6,99d8c9,66c2a4,41ae76,238b45,005824 \" +\n \"bugn8=f7fcfd,e5f5f9,ccece6,99d8c9,66c2a4,41ae76,238b45,005824 \" +\n \"bugn9=f7fcfd,e5f5f9,ccece6,99d8c9,66c2a4,41ae76,238b45,006d2c,00441b bupu3=e0ecf4,9ebcda,8856a7 \" +\n \"bupu4=edf8fb,b3cde3,8c96c6,88419d bupu5=edf8fb,b3cde3,8c96c6,8856a7,810f7c \" +\n \"bupu6=edf8fb,bfd3e6,9ebcda,8c96c6,8856a7,810f7c bupu7=edf8fb,bfd3e6,9ebcda,8c96c6,8c6bb1,88419d,6e016b \" +\n \"bupu8=f7fcfd,e0ecf4,bfd3e6,9ebcda,8c96c6,8c6bb1,88419d,6e016b \" +\n \"bupu9=f7fcfd,e0ecf4,bfd3e6,9ebcda,8c96c6,8c6bb1,88419d,810f7c,4d004b dark23=1b9e77,d95f02,7570b3 \" +\n \"dark24=1b9e77,d95f02,7570b3,e7298a dark25=1b9e77,d95f02,7570b3,e7298a,66a61e \" +\n \"dark26=1b9e77,d95f02,7570b3,e7298a,66a61e,e6ab02 dark27=1b9e77,d95f02,7570b3,e7298a,66a61e,e6ab02,a6761d \" +\n \"dark28=1b9e77,d95f02,7570b3,e7298a,66a61e,e6ab02,a6761d,666666 gnbu3=e0f3db,a8ddb5,43a2ca \" +\n \"gnbu4=f0f9e8,bae4bc,7bccc4,2b8cbe gnbu5=f0f9e8,bae4bc,7bccc4,43a2ca,0868ac \" +\n \"gnbu6=f0f9e8,ccebc5,a8ddb5,7bccc4,43a2ca,0868ac gnbu7=f0f9e8,ccebc5,a8ddb5,7bccc4,4eb3d3,2b8cbe,08589e \" +\n \"gnbu8=f7fcf0,e0f3db,ccebc5,a8ddb5,7bccc4,4eb3d3,2b8cbe,08589e \" +\n \"gnbu9=f7fcf0,e0f3db,ccebc5,a8ddb5,7bccc4,4eb3d3,2b8cbe,0868ac,084081 greens3=e5f5e0,a1d99b,31a354 \" +\n \"greens4=edf8e9,bae4b3,74c476,238b45 greens5=edf8e9,bae4b3,74c476,31a354,006d2c \" +\n \"greens6=edf8e9,c7e9c0,a1d99b,74c476,31a354,006d2c \" +\n \"greens7=edf8e9,c7e9c0,a1d99b,74c476,41ab5d,238b45,005a32 \" +\n \"greens8=f7fcf5,e5f5e0,c7e9c0,a1d99b,74c476,41ab5d,238b45,005a32 \" +\n \"greens9=f7fcf5,e5f5e0,c7e9c0,a1d99b,74c476,41ab5d,238b45,006d2c,00441b greys3=f0f0f0,bdbdbd,636363 \" +\n \"greys4=f7f7f7,cccccc,969696,525252 greys5=f7f7f7,cccccc,969696,636363,252525 \" +\n \"greys6=f7f7f7,d9d9d9,bdbdbd,969696,636363,252525 greys7=f7f7f7,d9d9d9,bdbdbd,969696,737373,525252,252525 \" +\n \"greys8=ffffff,f0f0f0,d9d9d9,bdbdbd,969696,737373,525252,252525 \" +\n \"greys9=ffffff,f0f0f0,d9d9d9,bdbdbd,969696,737373,525252,252525,000000 oranges3=fee6ce,fdae6b,e6550d \" +\n \"oranges4=feedde,fdbe85,fd8d3c,d94701 oranges5=feedde,fdbe85,fd8d3c,e6550d,a63603 \" +\n \"oranges6=feedde,fdd0a2,fdae6b,fd8d3c,e6550d,a63603 \" +\n \"oranges7=feedde,fdd0a2,fdae6b,fd8d3c,f16913,d94801,8c2d04 \" +\n \"oranges8=fff5eb,fee6ce,fdd0a2,fdae6b,fd8d3c,f16913,d94801,8c2d04 \" +\n \"oranges9=fff5eb,fee6ce,fdd0a2,fdae6b,fd8d3c,f16913,d94801,a63603,7f2704 orrd3=fee8c8,fdbb84,e34a33 \" +\n \"orrd4=fef0d9,fdcc8a,fc8d59,d7301f orrd5=fef0d9,fdcc8a,fc8d59,e34a33,b30000 \" +\n \"orrd6=fef0d9,fdd49e,fdbb84,fc8d59,e34a33,b30000 orrd7=fef0d9,fdd49e,fdbb84,fc8d59,ef6548,d7301f,990000 \" +\n \"orrd8=fff7ec,fee8c8,fdd49e,fdbb84,fc8d59,ef6548,d7301f,990000 \" +\n \"orrd9=fff7ec,fee8c8,fdd49e,fdbb84,fc8d59,ef6548,d7301f,b30000,7f0000 \" +\n \"paired10=a6cee3,1f78b4,b2df8a,33a02c,fb9a99,e31a1c,fdbf6f,ff7f00,cab2d6,6a3d9a \" +\n \"paired11=a6cee3,1f78b4,b2df8a,33a02c,fb9a99,e31a1c,fdbf6f,ff7f00,cab2d6,6a3d9a,ffff99 \" +\n \"paired12=a6cee3,1f78b4,b2df8a,33a02c,fb9a99,e31a1c,fdbf6f,ff7f00,cab2d6,6a3d9a,ffff99,b15928 \" +\n \"paired3=a6cee3,1f78b4,b2df8a paired4=a6cee3,1f78b4,b2df8a,33a02c \" +\n \"paired5=a6cee3,1f78b4,b2df8a,33a02c,fb9a99 paired6=a6cee3,1f78b4,b2df8a,33a02c,fb9a99,e31a1c \" +\n \"paired7=a6cee3,1f78b4,b2df8a,33a02c,fb9a99,e31a1c,fdbf6f \" +\n \"paired8=a6cee3,1f78b4,b2df8a,33a02c,fb9a99,e31a1c,fdbf6f,ff7f00 \" +\n \"paired9=a6cee3,1f78b4,b2df8a,33a02c,fb9a99,e31a1c,fdbf6f,ff7f00,cab2d6 pastel13=fbb4ae,b3cde3,ccebc5 \" +\n \"pastel14=fbb4ae,b3cde3,ccebc5,decbe4 pastel15=fbb4ae,b3cde3,ccebc5,decbe4,fed9a6 \" +\n \"pastel16=fbb4ae,b3cde3,ccebc5,decbe4,fed9a6,ffffcc \" +\n \"pastel17=fbb4ae,b3cde3,ccebc5,decbe4,fed9a6,ffffcc,e5d8bd \" +\n \"pastel18=fbb4ae,b3cde3,ccebc5,decbe4,fed9a6,ffffcc,e5d8bd,fddaec \" +\n \"pastel19=fbb4ae,b3cde3,ccebc5,decbe4,fed9a6,ffffcc,e5d8bd,fddaec,f2f2f2 pastel23=b3e2cd,fdcdac,cbd5e8 \" +\n \"pastel24=b3e2cd,fdcdac,cbd5e8,f4cae4 pastel25=b3e2cd,fdcdac,cbd5e8,f4cae4,e6f5c9 \" +\n \"pastel26=b3e2cd,fdcdac,cbd5e8,f4cae4,e6f5c9,fff2ae \" +\n \"pastel27=b3e2cd,fdcdac,cbd5e8,f4cae4,e6f5c9,fff2ae,f1e2cc \" +\n \"pastel28=b3e2cd,fdcdac,cbd5e8,f4cae4,e6f5c9,fff2ae,f1e2cc,cccccc \" +\n \"piyg10=8e0152,c51b7d,de77ae,f1b6da,fde0ef,e6f5d0,b8e186,7fbc41,4d9221,276419 \" +\n \"piyg11=8e0152,c51b7d,de77ae,f1b6da,fde0ef,f7f7f7,e6f5d0,b8e186,7fbc41,4d9221,276419 \" +\n \"piyg3=e9a3c9,f7f7f7,a1d76a piyg4=d01c8b,f1b6da,b8e186,4dac26 piyg5=d01c8b,f1b6da,f7f7f7,b8e186,4dac26 \" +\n \"piyg6=c51b7d,e9a3c9,fde0ef,e6f5d0,a1d76a,4d9221 piyg7=c51b7d,e9a3c9,fde0ef,f7f7f7,e6f5d0,a1d76a,4d9221 \" +\n \"piyg8=c51b7d,de77ae,f1b6da,fde0ef,e6f5d0,b8e186,7fbc41,4d9221 \" +\n \"piyg9=c51b7d,de77ae,f1b6da,fde0ef,f7f7f7,e6f5d0,b8e186,7fbc41,4d9221 \" +\n \"prgn10=40004b,762a83,9970ab,c2a5cf,e7d4e8,d9f0d3,a6dba0,5aae61,1b7837,00441b \" +\n \"prgn11=40004b,762a83,9970ab,c2a5cf,e7d4e8,f7f7f7,d9f0d3,a6dba0,5aae61,1b7837,00441b \" +\n \"prgn3=af8dc3,f7f7f7,7fbf7b prgn4=7b3294,c2a5cf,a6dba0,008837 prgn5=7b3294,c2a5cf,f7f7f7,a6dba0,008837 \" +\n \"prgn6=762a83,af8dc3,e7d4e8,d9f0d3,7fbf7b,1b7837 prgn7=762a83,af8dc3,e7d4e8,f7f7f7,d9f0d3,7fbf7b,1b7837 \" +\n \"prgn8=762a83,9970ab,c2a5cf,e7d4e8,d9f0d3,a6dba0,5aae61,1b7837 \" +\n \"prgn9=762a83,9970ab,c2a5cf,e7d4e8,f7f7f7,d9f0d3,a6dba0,5aae61,1b7837 pubu3=ece7f2,a6bddb,2b8cbe \" +\n \"pubu4=f1eef6,bdc9e1,74a9cf,0570b0 pubu5=f1eef6,bdc9e1,74a9cf,2b8cbe,045a8d \" +\n \"pubu6=f1eef6,d0d1e6,a6bddb,74a9cf,2b8cbe,045a8d pubu7=f1eef6,d0d1e6,a6bddb,74a9cf,3690c0,0570b0,034e7b \" +\n \"pubu8=fff7fb,ece7f2,d0d1e6,a6bddb,74a9cf,3690c0,0570b0,034e7b \" +\n \"pubu9=fff7fb,ece7f2,d0d1e6,a6bddb,74a9cf,3690c0,0570b0,045a8d,023858 pubugn3=ece2f0,a6bddb,1c9099 \" +\n \"pubugn4=f6eff7,bdc9e1,67a9cf,02818a pubugn5=f6eff7,bdc9e1,67a9cf,1c9099,016c59 \" +\n \"pubugn6=f6eff7,d0d1e6,a6bddb,67a9cf,1c9099,016c59 \" +\n \"pubugn7=f6eff7,d0d1e6,a6bddb,67a9cf,3690c0,02818a,016450 \" +\n \"pubugn8=fff7fb,ece2f0,d0d1e6,a6bddb,67a9cf,3690c0,02818a,016450 \" +\n \"pubugn9=fff7fb,ece2f0,d0d1e6,a6bddb,67a9cf,3690c0,02818a,016c59,014636 \" +\n \"puor10=7f3b08,b35806,e08214,fdb863,fee0b6,d8daeb,b2abd2,8073ac,542788,2d004b \" +\n \"puor11=7f3b08,b35806,e08214,fdb863,fee0b6,f7f7f7,d8daeb,b2abd2,8073ac,542788,2d004b \" +\n \"puor3=f1a340,f7f7f7,998ec3 puor4=e66101,fdb863,b2abd2,5e3c99 puor5=e66101,fdb863,f7f7f7,b2abd2,5e3c99 \" +\n \"puor6=b35806,f1a340,fee0b6,d8daeb,998ec3,542788 puor7=b35806,f1a340,fee0b6,f7f7f7,d8daeb,998ec3,542788 \" +\n \"puor8=b35806,e08214,fdb863,fee0b6,d8daeb,b2abd2,8073ac,542788 \" +\n \"puor9=b35806,e08214,fdb863,fee0b6,f7f7f7,d8daeb,b2abd2,8073ac,542788 purd3=e7e1ef,c994c7,dd1c77 \" +\n \"purd4=f1eef6,d7b5d8,df65b0,ce1256 purd5=f1eef6,d7b5d8,df65b0,dd1c77,980043 \" +\n \"purd6=f1eef6,d4b9da,c994c7,df65b0,dd1c77,980043 purd7=f1eef6,d4b9da,c994c7,df65b0,e7298a,ce1256,91003f \" +\n \"purd8=f7f4f9,e7e1ef,d4b9da,c994c7,df65b0,e7298a,ce1256,91003f \" +\n \"purd9=f7f4f9,e7e1ef,d4b9da,c994c7,df65b0,e7298a,ce1256,980043,67001f purples3=efedf5,bcbddc,756bb1 \" +\n \"purples4=f2f0f7,cbc9e2,9e9ac8,6a51a3 purples5=f2f0f7,cbc9e2,9e9ac8,756bb1,54278f \" +\n \"purples6=f2f0f7,dadaeb,bcbddc,9e9ac8,756bb1,54278f \" +\n \"purples7=f2f0f7,dadaeb,bcbddc,9e9ac8,807dba,6a51a3,4a1486 \" +\n \"purples8=fcfbfd,efedf5,dadaeb,bcbddc,9e9ac8,807dba,6a51a3,4a1486 \" +\n \"purples9=fcfbfd,efedf5,dadaeb,bcbddc,9e9ac8,807dba,6a51a3,54278f,3f007d \" +\n \"rdbu10=67001f,b2182b,d6604d,f4a582,fddbc7,d1e5f0,92c5de,4393c3,2166ac,053061 \" +\n \"rdbu11=67001f,b2182b,d6604d,f4a582,fddbc7,f7f7f7,d1e5f0,92c5de,4393c3,2166ac,053061 \" +\n \"rdbu3=ef8a62,f7f7f7,67a9cf rdbu4=ca0020,f4a582,92c5de,0571b0 rdbu5=ca0020,f4a582,f7f7f7,92c5de,0571b0 \" +\n \"rdbu6=b2182b,ef8a62,fddbc7,d1e5f0,67a9cf,2166ac rdbu7=b2182b,ef8a62,fddbc7,f7f7f7,d1e5f0,67a9cf,2166ac \" +\n \"rdbu8=b2182b,d6604d,f4a582,fddbc7,d1e5f0,92c5de,4393c3,2166ac \" +\n \"rdbu9=b2182b,d6604d,f4a582,fddbc7,f7f7f7,d1e5f0,92c5de,4393c3,2166ac \" +\n \"rdgy10=67001f,b2182b,d6604d,f4a582,fddbc7,e0e0e0,bababa,878787,4d4d4d,1a1a1a \" +\n \"rdgy11=67001f,b2182b,d6604d,f4a582,fddbc7,ffffff,e0e0e0,bababa,878787,4d4d4d,1a1a1a \" +\n \"rdgy3=ef8a62,ffffff,999999 rdgy4=ca0020,f4a582,bababa,404040 rdgy5=ca0020,f4a582,ffffff,bababa,404040 \" +\n \"rdgy6=b2182b,ef8a62,fddbc7,e0e0e0,999999,4d4d4d rdgy7=b2182b,ef8a62,fddbc7,ffffff,e0e0e0,999999,4d4d4d \" +\n \"rdgy8=b2182b,d6604d,f4a582,fddbc7,e0e0e0,bababa,878787,4d4d4d \" +\n \"rdgy9=b2182b,d6604d,f4a582,fddbc7,ffffff,e0e0e0,bababa,878787,4d4d4d rdpu3=fde0dd,fa9fb5,c51b8a \" +\n \"rdpu4=feebe2,fbb4b9,f768a1,ae017e rdpu5=feebe2,fbb4b9,f768a1,c51b8a,7a0177 \" +\n \"rdpu6=feebe2,fcc5c0,fa9fb5,f768a1,c51b8a,7a0177 rdpu7=feebe2,fcc5c0,fa9fb5,f768a1,dd3497,ae017e,7a0177 \" +\n \"rdpu8=fff7f3,fde0dd,fcc5c0,fa9fb5,f768a1,dd3497,ae017e,7a0177 \" +\n \"rdpu9=fff7f3,fde0dd,fcc5c0,fa9fb5,f768a1,dd3497,ae017e,7a0177,49006a \" +\n \"rdylbu10=a50026,d73027,f46d43,fdae61,fee090,e0f3f8,abd9e9,74add1,4575b4,313695 \" +\n \"rdylbu11=a50026,d73027,f46d43,fdae61,fee090,ffffbf,e0f3f8,abd9e9,74add1,4575b4,313695 \" +\n \"rdylbu3=fc8d59,ffffbf,91bfdb rdylbu4=d7191c,fdae61,abd9e9,2c7bb6 \" +\n \"rdylbu5=d7191c,fdae61,ffffbf,abd9e9,2c7bb6 rdylbu6=d73027,fc8d59,fee090,e0f3f8,91bfdb,4575b4 \" +\n \"rdylbu7=d73027,fc8d59,fee090,ffffbf,e0f3f8,91bfdb,4575b4 \" +\n \"rdylbu8=d73027,f46d43,fdae61,fee090,e0f3f8,abd9e9,74add1,4575b4 \" +\n \"rdylbu9=d73027,f46d43,fdae61,fee090,ffffbf,e0f3f8,abd9e9,74add1,4575b4 \" +\n \"rdylgn10=a50026,d73027,f46d43,fdae61,fee08b,d9ef8b,a6d96a,66bd63,1a9850,006837 \" +\n \"rdylgn11=a50026,d73027,f46d43,fdae61,fee08b,ffffbf,d9ef8b,a6d96a,66bd63,1a9850,006837 \" +\n \"rdylgn3=fc8d59,ffffbf,91cf60 rdylgn4=d7191c,fdae61,a6d96a,1a9641 \" +\n \"rdylgn5=d7191c,fdae61,ffffbf,a6d96a,1a9641 rdylgn6=d73027,fc8d59,fee08b,d9ef8b,91cf60,1a9850 \" +\n \"rdylgn7=d73027,fc8d59,fee08b,ffffbf,d9ef8b,91cf60,1a9850 \" +\n \"rdylgn8=d73027,f46d43,fdae61,fee08b,d9ef8b,a6d96a,66bd63,1a9850 \" +\n \"rdylgn9=d73027,f46d43,fdae61,fee08b,ffffbf,d9ef8b,a6d96a,66bd63,1a9850 reds3=fee0d2,fc9272,de2d26 \" +\n \"reds4=fee5d9,fcae91,fb6a4a,cb181d reds5=fee5d9,fcae91,fb6a4a,de2d26,a50f15 \" +\n \"reds6=fee5d9,fcbba1,fc9272,fb6a4a,de2d26,a50f15 reds7=fee5d9,fcbba1,fc9272,fb6a4a,ef3b2c,cb181d,99000d \" +\n \"reds8=fff5f0,fee0d2,fcbba1,fc9272,fb6a4a,ef3b2c,cb181d,99000d \" +\n \"reds9=fff5f0,fee0d2,fcbba1,fc9272,fb6a4a,ef3b2c,cb181d,a50f15,67000d set13=e41a1c,377eb8,4daf4a \" +\n \"set14=e41a1c,377eb8,4daf4a,984ea3 set15=e41a1c,377eb8,4daf4a,984ea3,ff7f00 \" +\n \"set16=e41a1c,377eb8,4daf4a,984ea3,ff7f00,ffff33 set17=e41a1c,377eb8,4daf4a,984ea3,ff7f00,ffff33,a65628 \" +\n \"set18=e41a1c,377eb8,4daf4a,984ea3,ff7f00,ffff33,a65628,f781bf \" +\n \"set19=e41a1c,377eb8,4daf4a,984ea3,ff7f00,ffff33,a65628,f781bf,999999 set23=66c2a5,fc8d62,8da0cb \" +\n \"set24=66c2a5,fc8d62,8da0cb,e78ac3 set25=66c2a5,fc8d62,8da0cb,e78ac3,a6d854 \" +\n \"set26=66c2a5,fc8d62,8da0cb,e78ac3,a6d854,ffd92f set27=66c2a5,fc8d62,8da0cb,e78ac3,a6d854,ffd92f,e5c494 \" +\n \"set28=66c2a5,fc8d62,8da0cb,e78ac3,a6d854,ffd92f,e5c494,b3b3b3 \" +\n \"set310=8dd3c7,ffffb3,bebada,fb8072,80b1d3,fdb462,b3de69,fccde5,d9d9d9,bc80bd \" +\n \"set311=8dd3c7,ffffb3,bebada,fb8072,80b1d3,fdb462,b3de69,fccde5,d9d9d9,bc80bd,ccebc5 \" +\n \"set312=8dd3c7,ffffb3,bebada,fb8072,80b1d3,fdb462,b3de69,fccde5,d9d9d9,bc80bd,ccebc5,ffed6f \" +\n \"set33=8dd3c7,ffffb3,bebada set34=8dd3c7,ffffb3,bebada,fb8072 set35=8dd3c7,ffffb3,bebada,fb8072,80b1d3 \" +\n \"set36=8dd3c7,ffffb3,bebada,fb8072,80b1d3,fdb462 set37=8dd3c7,ffffb3,bebada,fb8072,80b1d3,fdb462,b3de69 \" +\n \"set38=8dd3c7,ffffb3,bebada,fb8072,80b1d3,fdb462,b3de69,fccde5 \" +\n \"set39=8dd3c7,ffffb3,bebada,fb8072,80b1d3,fdb462,b3de69,fccde5,d9d9d9 \" +\n \"spectral10=9e0142,d53e4f,f46d43,fdae61,fee08b,e6f598,abdda4,66c2a5,3288bd,5e4fa2 \" +\n \"spectral11=9e0142,d53e4f,f46d43,fdae61,fee08b,ffffbf,e6f598,abdda4,66c2a5,3288bd,5e4fa2 \" +\n \"spectral3=fc8d59,ffffbf,99d594 spectral4=d7191c,fdae61,abdda4,2b83ba \" +\n \"spectral5=d7191c,fdae61,ffffbf,abdda4,2b83ba spectral6=d53e4f,fc8d59,fee08b,e6f598,99d594,3288bd \" +\n \"spectral7=d53e4f,fc8d59,fee08b,ffffbf,e6f598,99d594,3288bd \" +\n \"spectral8=d53e4f,f46d43,fdae61,fee08b,e6f598,abdda4,66c2a5,3288bd \" +\n \"spectral9=d53e4f,f46d43,fdae61,fee08b,ffffbf,e6f598,abdda4,66c2a5,3288bd ylgn3=f7fcb9,addd8e,31a354 \" +\n \"ylgn4=ffffcc,c2e699,78c679,238443 ylgn5=ffffcc,c2e699,78c679,31a354,006837 \" +\n \"ylgn6=ffffcc,d9f0a3,addd8e,78c679,31a354,006837 ylgn7=ffffcc,d9f0a3,addd8e,78c679,41ab5d,238443,005a32 \" +\n \"ylgn8=ffffe5,f7fcb9,d9f0a3,addd8e,78c679,41ab5d,238443,005a32 \" +\n \"ylgn9=ffffe5,f7fcb9,d9f0a3,addd8e,78c679,41ab5d,238443,006837,004529 ylgnbu3=edf8b1,7fcdbb,2c7fb8 \" +\n \"ylgnbu4=ffffcc,a1dab4,41b6c4,225ea8 ylgnbu5=ffffcc,a1dab4,41b6c4,2c7fb8,253494 \" +\n \"ylgnbu6=ffffcc,c7e9b4,7fcdbb,41b6c4,2c7fb8,253494 \" +\n \"ylgnbu7=ffffcc,c7e9b4,7fcdbb,41b6c4,1d91c0,225ea8,0c2c84 \" +\n \"ylgnbu8=ffffd9,edf8b1,c7e9b4,7fcdbb,41b6c4,1d91c0,225ea8,0c2c84 \" +\n \"ylgnbu9=ffffd9,edf8b1,c7e9b4,7fcdbb,41b6c4,1d91c0,225ea8,253494,081d58 ylorbr3=fff7bc,fec44f,d95f0e \" +\n \"ylorbr4=ffffd4,fed98e,fe9929,cc4c02 ylorbr5=ffffd4,fed98e,fe9929,d95f0e,993404 \" +\n \"ylorbr6=ffffd4,fee391,fec44f,fe9929,d95f0e,993404 \" +\n \"ylorbr7=ffffd4,fee391,fec44f,fe9929,ec7014,cc4c02,8c2d04 \" +\n \"ylorbr8=ffffe5,fff7bc,fee391,fec44f,fe9929,ec7014,cc4c02,8c2d04 \" +\n \"ylorbr9=ffffe5,fff7bc,fee391,fec44f,fe9929,ec7014,cc4c02,993404,662506 ylorrd3=ffeda0,feb24c,f03b20 \" +\n \"ylorrd4=ffffb2,fecc5c,fd8d3c,e31a1c ylorrd5=ffffb2,fecc5c,fd8d3c,f03b20,bd0026 \" +\n \"ylorrd6=ffffb2,fed976,feb24c,fd8d3c,f03b20,bd0026 \" +\n \"ylorrd7=ffffb2,fed976,feb24c,fd8d3c,fc4e2a,e31a1c,b10026 \" +\n \"ylorrd8=ffffcc,ffeda0,fed976,feb24c,fd8d3c,fc4e2a,e31a1c,b10026 \" +\n \"ylorrd9=ffffcc,ffeda0,fed976,feb24c,fd8d3c,fc4e2a,e31a1c,bd0026,800026\"\n )\n .split(\" \")\n .map((entry): [string, readonly string[]] => {\n const eq = entry.indexOf(\"=\");\n return [\n entry.slice(0, eq),\n entry\n .slice(eq + 1)\n .split(\",\")\n .map((h) => `#${h}`),\n ];\n }),\n);\n","/**\n * Graphviz's own color resolution, measured against `dot` 2.43 with `-Txdot`:\n *\n * - Leading blanks are skipped and trailing ones are not (`\"red \"` is unknown); names match without regard to case\n * and keep their inner spaces (`Light Grey` is unknown).\n * - `#rrggbb` and `#rrggbbaa` only, with anything after the digits ignored; there is no 3-digit form.\n * - Three numbers starting with a digit or a point (`.5 .5 .5`, `0.5,0.5,0.5`) are hue, saturation and value, each\n * clamped to 0..1 and truncated to a byte; a fourth number and anything after it are ignored. A leading sign makes\n * the value a name, so `-0.5 0.5 0.5` is unknown.\n * - `/scheme/name` names a scheme for one value and `//name` means the object's scheme; scheme names ignore case. A\n * scheme other than `x11` is searched INSTEAD of X11: `colorscheme=blues9` makes `red` unknown, and an unknown\n * scheme knows no names at all.\n * - `transparent`, `none` and `invis` are `#fffffe` with alpha 0, whatever the scheme.\n * - An unknown color is drawn BLACK.\n * - A color list (`red:blue`, `red;0.3:blue`): an outline or a font color draws the text before the first `:` as one\n * color, so `red:blue` is red and `red;0.3:blue` is black (`red;0.3` is not a color). A fill draws a gradient and\n * an edge draws one line per color; both start with the first entry's color, its `;fraction` dropped. A value\n * with a `;` and no `:` is not a list: it is one unknown color, drawn black.\n */\n\nimport { BREWER_SCHEMES, CSS_COLORS, X11_COLORS } from \"./color-tables.js\";\n\n/**\n * How Graphviz draws a color value, which decides how a color list is read.\n * @category Styles\n */\nexport type GraphvizColorUse = \"line\" | \"fill\" | \"edge\";\n\n/**\n * A resolved Graphviz color, with how it was read.\n * @category Styles\n */\nexport interface GraphvizColor {\n /** `#rrggbb`. */\n readonly hex: string;\n /** 0..1. */\n readonly alpha: number;\n /** The value did not resolve, so Graphviz draws black. */\n readonly unknown: boolean;\n /** The value is a list read as its first color: a gradient for a fill, parallel lines for an edge. */\n readonly list: \"gradient\" | \"lines\" | null;\n}\n\nconst TRANSPARENT = new Set([\"transparent\", \"none\", \"invis\"]);\nconst HSV_PART = /^(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/;\n\n/**\n * A byte as two hex digits.\n * @param v - 0..255\n * @returns two lowercase hex digits\n */\nfunction hex2(v: number): string {\n return v.toString(16).padStart(2, \"0\");\n}\n\n/**\n * Graphviz's HSV to RGB, channels truncated to bytes.\n * @param h - hue 0..1\n * @param s - saturation 0..1\n * @param v - value 0..1\n * @returns `#rrggbb`\n */\nfunction hsvHex(h: number, s: number, v: number): string {\n const i = Math.floor(h * 6);\n const f = h * 6 - i;\n const p = v * (1 - s);\n const q = v * (1 - f * s);\n const t = v * (1 - (1 - f) * s);\n const rgb = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q],\n ][i % 6];\n return `#${rgb.map((c) => hex2(Math.trunc(c * 255))).join(\"\")}`;\n}\n\n/**\n * Resolves one Graphviz color (no list), or null when Graphviz does not know it.\n * @param text - the color, leading blanks already skipped\n * @param scheme - the object's color scheme, lowercase, `x11` when unset\n * @returns hex and alpha, or null\n */\nfunction resolveOne(text: string, scheme: string): { hex: string; alpha: number } | null {\n if (text.startsWith(\"#\")) {\n const m = /^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{1,2})?/.exec(text);\n if (m === null) {\n return null;\n }\n return {\n hex: `#${m[1]}${m[2]}${m[3]}`.toLowerCase(),\n alpha: m[4] === undefined ? 1 : Number.parseInt(m[4], 16) / 255,\n };\n }\n const hsv = /^[.\\d]/.test(text) ? hsvColor(text) : null;\n if (hsv !== null) {\n return { hex: hsv, alpha: 1 };\n }\n const named = schemedName(text.toLowerCase(), scheme);\n if (named === null) {\n return null;\n }\n if (TRANSPARENT.has(named.name)) {\n return { hex: \"#fffffe\", alpha: 0 };\n }\n const hex = schemeColor(named.name, named.scheme);\n return hex === undefined ? null : { hex, alpha: 1 };\n}\n\n/**\n * An HSV color: three numbers 0..1 separated by blanks or commas, clamped.\n * @param text - the color\n * @returns `#rrggbb`, or null when it is not one\n */\nfunction hsvColor(text: string): string | null {\n const parts = text.split(/[ ,]+/);\n if (parts.length < 3 || !parts.slice(0, 3).every((p) => HSV_PART.test(p))) {\n return null;\n }\n const [h, s, v] = parts.slice(0, 3).map((p) => Math.min(1, Math.max(0, Number(p))));\n return hsvHex(h, s, v);\n}\n\n/**\n * A color name and the scheme it is looked up in: `/scheme/name` names its own scheme, `//name` the object's.\n * @param name - the name, lowercase\n * @param scheme - the object's color scheme\n * @returns the name and scheme, or null for a malformed `/scheme/name`\n */\nfunction schemedName(name: string, scheme: string): { name: string; scheme: string } | null {\n if (!name.startsWith(\"/\")) {\n return { name, scheme };\n }\n const slash = name.indexOf(\"/\", 1);\n if (slash < 0) {\n return null;\n }\n const prefix = name.slice(1, slash);\n return { name: name.slice(slash + 1), scheme: prefix === \"\" ? scheme : prefix };\n}\n\n/**\n * A color in a scheme: X11's or SVG's names, or a Brewer scheme's colors by their 1-based index.\n * @param name - the name or index\n * @param scheme - the scheme\n * @returns `#rrggbb`, or undefined when the scheme has no such color\n */\nfunction schemeColor(name: string, scheme: string): string | undefined {\n if (scheme === \"x11\") {\n return X11_COLORS.get(name);\n }\n if (scheme === \"svg\") {\n return CSS_COLORS.get(name);\n }\n const colors = BREWER_SCHEMES.get(scheme);\n const index = /^\\d{1,3}$/.test(name) ? Number(name) : 0;\n return colors !== undefined && index >= 1 ? colors[index - 1] : undefined;\n}\n\n/**\n * Resolves a Graphviz color value the way Graphviz draws it for a use; an unknown color is black.\n * @param raw - the value, at most 256 characters\n * @param scheme - the object's `colorscheme`, or null\n * @param use - an outline or font color (`line`), a fill, or an edge's line color\n * @returns the color and how it was read\n * @category Styles\n */\nexport function graphvizColor(raw: string, scheme: string | null, use: GraphvizColorUse): GraphvizColor {\n let text = raw.replace(/^[ \\t\\r\\n]+/, \"\");\n let list: GraphvizColor[\"list\"] = null;\n const colon = text.indexOf(\":\");\n if (colon >= 0) {\n text = text.slice(0, colon);\n if (use !== \"line\") {\n const semi = text.indexOf(\";\");\n if (semi >= 0) {\n text = text.slice(0, semi);\n }\n list = use === \"fill\" ? \"gradient\" : \"lines\";\n }\n }\n const sc = scheme === null || scheme.trim() === \"\" ? \"x11\" : scheme.toLowerCase();\n const resolved = text === \"\" ? null : resolveOne(text, sc);\n return resolved === null\n ? { hex: \"#000000\", alpha: 1, unknown: true, list }\n : { hex: resolved.hex, alpha: resolved.alpha, unknown: false, list };\n}\n","/**\n * Canonical colors: lowercase `#rrggbb` plus an alpha from 0 to 1, read in the namespace of the file's dialect. The\n * alpha never stays in the color: `colorOpacity()` moves it into the property's opacity or drops it with a note.\n */\n\nimport { STYLE_ISSUE } from \"../codes.js\";\nimport type { StyleColor, StyleDialect } from \"../types.js\";\nimport { CSS_COLORS, DVIPS_COLORS, JAVA_COLORS } from \"./color-tables.js\";\nimport { graphvizColor, type GraphvizColorUse } from \"./graphviz.js\";\nimport { num6 } from \"./number.js\";\nimport { type CanonSite, noteAt, scalarText, spendAt } from \"./site.js\";\n\n/**\n * A canonical color and the alpha the file gave it.\n * @category Styles\n */\nexport interface CanonColor {\n /** Lowercase `#rrggbb`. */\n readonly color: StyleColor;\n /** 0..1 at 6 significant digits; 1 when the file gave none. */\n readonly alpha: number;\n}\n\n/**\n * Options of `canonColor()`.\n * @category Styles\n */\nexport interface CanonColorOptions {\n /** Graphviz only: the object's `colorscheme`. */\n readonly scheme?: string | null;\n /**\n * Graphviz only: how the value is drawn, which decides how a color list is read (`line` for an outline or a\n * font color, `fill`, or `edge` for an edge's line); defaults to `line`.\n */\n readonly use?: GraphvizColorUse;\n}\n\n/**\n * A byte as two hex digits, clamped and rounded.\n * @param v - a channel 0..255\n * @returns two lowercase hex digits\n */\nfunction hex2(v: number): string {\n return Math.max(0, Math.min(255, Math.round(v)))\n .toString(16)\n .padStart(2, \"0\");\n}\n\n/**\n * `#rrggbb` from channels 0..255.\n * @param r - red\n * @param g - green\n * @param b - blue\n * @returns the color\n */\nfunction rgbHex(r: number, g: number, b: number): StyleColor {\n return `#${hex2(r)}${hex2(g)}${hex2(b)}`;\n}\n\n/**\n * An alpha clamped to 0..1 at 6 significant digits.\n * @param a - the alpha\n * @returns the canonical alpha\n */\nfunction alpha01(a: number): number {\n return num6(Math.max(0, Math.min(1, a)));\n}\n\n// ------------------------------------------------------------ CSS Color 4 gamut mapping, as graphty-element draws\n\ntype Vec3 = readonly [number, number, number];\n\n/**\n * A 3x3 matrix times a vector.\n * @param m - the matrix, row by row\n * @param v - the vector\n * @returns m * v\n */\nfunction mul(m: readonly Vec3[], v: Vec3): Vec3 {\n return [\n m[0][0] * v[0] + m[0][1] * v[1] + m[0][2] * v[2],\n m[1][0] * v[0] + m[1][1] * v[1] + m[1][2] * v[2],\n m[2][0] * v[0] + m[2][1] * v[1] + m[2][2] * v[2],\n ];\n}\n\nconst LIN_TO_XYZ: readonly Vec3[] = [\n [0.41239079926595934, 0.357584339383878, 0.1804807884018343],\n [0.21263900587151027, 0.715168678767756, 0.07219231536073371],\n [0.01933081871559182, 0.11919477979462598, 0.9505321522496607],\n];\nconst XYZ_TO_LIN: readonly Vec3[] = [\n [3.2409699419045226, -1.537383177570094, -0.4986107602930034],\n [-0.9692436362808796, 1.8759675015077202, 0.04155505740717559],\n [0.05563007969699366, -0.20397695888897652, 1.0569715142428786],\n];\nconst XYZ_TO_LMS: readonly Vec3[] = [\n [0.819022437996703, 0.3619062600528904, -0.1288737815209879],\n [0.0329836539323885, 0.929286861586343, 0.0361446663506424],\n [0.0481771893596242, 0.2642395317527308, 0.6335478284694309],\n];\nconst LMS_TO_XYZ: readonly Vec3[] = [\n [1.2268798758459243, -0.5578149944602171, 0.2813910456659647],\n [-0.0405757452148008, 1.112286803280317, -0.0717110580655164],\n [-0.0763729366746601, -0.4214933324022432, 1.5869240198367816],\n];\nconst LMS_TO_LAB: readonly Vec3[] = [\n [0.210454268309314, 0.7936177747023054, -0.0040720430116193],\n [1.9779985324311684, -2.42859224204858, 0.450593709617411],\n [0.0259040424655478, 0.7827717124575296, -0.8086757549230774],\n];\nconst LAB_TO_LMS: readonly Vec3[] = [\n [1, 0.3963377773761749, 0.2158037573099136],\n [1, -0.1055613458156586, -0.0638541728258133],\n [1, -0.0894841775298119, -1.2914855480194092],\n];\n\n/**\n * sRGB (0..1, possibly out of range) to OKLab.\n * @param rgb - the channels\n * @returns L, a, b\n */\nfunction srgbToOklab(rgb: Vec3): Vec3 {\n const lin = rgb.map((c) => {\n const a = Math.abs(c);\n return Math.sign(c) * (a <= 0.04045 ? a / 12.92 : ((a + 0.055) / 1.055) ** 2.4);\n }) as unknown as Vec3;\n const lms = mul(XYZ_TO_LMS, mul(LIN_TO_XYZ, lin));\n return mul(LMS_TO_LAB, lms.map(Math.cbrt) as unknown as Vec3);\n}\n\n/**\n * OKLab to sRGB (0..1, possibly out of range).\n * @param lab - L, a, b\n * @returns the channels\n */\nfunction oklabToSrgb(lab: Vec3): Vec3 {\n const lms = mul(LAB_TO_LMS, lab).map((c) => c ** 3) as unknown as Vec3;\n return mul(XYZ_TO_LIN, mul(LMS_TO_XYZ, lms)).map((c) => {\n const a = Math.abs(c);\n return Math.sign(c) * (a > 0.0031308 ? 1.055 * a ** (1 / 2.4) - 0.055 : 12.92 * a);\n }) as unknown as Vec3;\n}\n\n/**\n * Whether sRGB channels are within 0..1.\n * @param rgb - the channels\n * @returns true when every channel is in range\n */\nfunction inGamut(rgb: Vec3): boolean {\n return rgb.every((c) => c >= 0 && c <= 1);\n}\n\n/**\n * Clamps sRGB channels to 0..1.\n * @param rgb - the channels\n * @returns the clamped channels\n */\nfunction clip(rgb: Vec3): Vec3 {\n return rgb.map((c) => Math.max(0, Math.min(1, c))) as unknown as Vec3;\n}\n\n/**\n * Distance in OKLab.\n * @param p - one color\n * @param q - the other\n * @returns delta E OK\n */\nfunction deltaEOK(p: Vec3, q: Vec3): number {\n return Math.hypot(p[0] - q[0], p[1] - q[1], p[2] - q[2]);\n}\n\n/**\n * CSS Color 4's gamut mapping into sRGB: chroma is reduced in OKLCh until clipping changes the color by less than\n * a just noticeable difference. It is what graphty-element's color parser does with an out-of-range `rgb()` or\n * `hsl()`, so a canonical color equals the color graphty-element draws for the same text.\n * @param rgb - sRGB channels 0..1, possibly out of range\n * @returns channels within 0..1\n */\nfunction toGamut(rgb: Vec3): Vec3 {\n if (inGamut(rgb)) {\n return rgb;\n }\n const JND = 0.02;\n const [l, a, b] = srgbToOklab(rgb);\n if (l >= 1) {\n return [1, 1, 1];\n }\n if (l <= 0) {\n return [0, 0, 0];\n }\n // The hue in degrees and back, as graphty-element's OKLCh does, so channels on a rounding edge round the same way.\n const achromatic = Math.abs(a) < 0.0002 && Math.abs(b) < 0.0002;\n const degrees = ((((Math.atan2(b, a) * 180) / Math.PI) % 360) + 360) % 360;\n const at = (chroma: number): Vec3 =>\n achromatic\n ? [l, 0, 0]\n : [l, chroma * Math.cos((degrees * Math.PI) / 180), chroma * Math.sin((degrees * Math.PI) / 180)];\n const chroma0 = Math.sqrt(a ** 2 + b ** 2); // NOSONAR(S7769): colorjs.io's own formula, so chroma matches it bit for bit\n const first = oklabToSrgb(at(chroma0));\n if (inGamut(first)) {\n return first;\n }\n const clipped = clip(first);\n if (deltaEOK(srgbToOklab(clipped), at(chroma0)) < JND) {\n // Clipping is close enough: clip the channels as given, without the round trip's rounding noise.\n return clip(rgb);\n }\n return bisectChroma(at, chroma0, clipped);\n}\n\n/**\n * CSS Color 4's chroma bisection: the largest chroma whose clipped color is within a just noticeable difference.\n * A bisection: log2(chroma / EPSILON) rounds, about 30 for the most extreme finite input.\n * @param at - the OKLab color of a chroma at the color's lightness and hue\n * @param chroma0 - the color's own chroma\n * @param first - the clipped color at that chroma\n * @returns the clipped color found\n */\nfunction bisectChroma(at: (chroma: number) => Vec3, chroma0: number, first: Vec3): Vec3 {\n const JND = 0.02;\n const EPSILON = 0.0001;\n let clipped = first;\n let min = 0;\n let max = chroma0;\n let minInGamut = true;\n while (max - min > EPSILON) {\n const chroma = (min + max) / 2;\n const current = at(chroma);\n const rgbNow = oklabToSrgb(current);\n if (minInGamut && inGamut(rgbNow)) {\n min = chroma;\n continue;\n }\n clipped = clip(rgbNow);\n const e = deltaEOK(srgbToOklab(clipped), current);\n if (e >= JND) {\n max = chroma;\n } else if (JND - e < EPSILON) {\n break;\n } else {\n minInGamut = false;\n min = chroma;\n }\n }\n return clipped;\n}\n\n/**\n * sRGB channels 0..1 (after gamut mapping) as `#rrggbb`.\n * @param rgb - the channels\n * @returns the color\n */\nfunction srgbHex(rgb: Vec3): StyleColor {\n const [r, g, b] = toGamut(rgb);\n return rgbHex(r * 255, g * 255, b * 255);\n}\n\n// ------------------------------------------------------------ CSS functional notation\n\n/** One CSS number, without its unit. */\nconst CSS_NUMBER = /^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i;\n\n/** A CSS number's unit: a percentage or an angle. */\nconst CSS_UNIT = /(%|deg|grad|rad|turn)$/i;\n\n/**\n * Splits a functional color's arguments: commas or blanks, with an optional `/` before the alpha.\n * @param body - the text between the parentheses\n * @returns the arguments and the alpha argument, or null when malformed\n */\nfunction cssArgs(body: string): { parts: string[]; alpha: string | undefined } | null {\n const slash = body.split(\"/\");\n if (slash.length > 2) {\n return null;\n }\n const parts = slash[0].split(/[\\s,]+/).filter((p) => p !== \"\");\n let alpha = slash.length === 2 ? slash[1].trim() : undefined;\n if (alpha === undefined && parts.length === 4) {\n alpha = parts.pop();\n }\n return parts.length === 3 && alpha !== \"\" ? { parts, alpha } : null;\n}\n\n/**\n * Reads one CSS number.\n * @param text - the argument\n * @returns the value and its unit (lowercase, \"\" for none), or null\n */\nfunction cssNumber(text: string): { value: number; unit: string } | null {\n const unit = CSS_UNIT.exec(text)?.[1] ?? \"\";\n const number = text.slice(0, text.length - unit.length);\n if (!CSS_NUMBER.test(number)) {\n return null;\n }\n const value = Number(number);\n return Number.isFinite(value) ? { value, unit: unit.toLowerCase() } : null;\n}\n\n/**\n * Reads a CSS alpha: a number 0..1 or a percentage, clamped.\n * @param text - the argument, or undefined for none\n * @returns the alpha, or null when malformed\n */\nfunction cssAlpha(text: string | undefined): number | null {\n if (text === undefined) {\n return 1;\n }\n const n = cssNumber(text);\n if (n === null || (n.unit !== \"\" && n.unit !== \"%\")) {\n return null;\n }\n return alpha01(n.unit === \"%\" ? n.value / 100 : n.value);\n}\n\n/**\n * `rgb()`, `rgba()`, `hsl()` and `hsla()` as graphty-element reads them: channels and lightness out of range are\n * gamut mapped, not refused.\n * @param text - the value, trimmed\n * @returns the color, or null when it is not one\n */\nfunction cssFunction(text: string): { hex: StyleColor; alpha: number } | null {\n const m = /^(rgba?|hsla?)\\(([^()]*)\\)$/i.exec(text);\n if (m === null) {\n return null;\n }\n const args = cssArgs(m[2]);\n if (args === null) {\n return null;\n }\n const nums = args.parts.map(cssNumber);\n const alpha = cssAlpha(args.alpha);\n if (nums.includes(null) || alpha === null) {\n return null;\n }\n const [x, y, z] = nums as { value: number; unit: string }[];\n if (m[1].toLowerCase().startsWith(\"rgb\")) {\n if ([x, y, z].some((n) => n.unit !== \"\" && n.unit !== \"%\")) {\n return null;\n }\n const ch = [x, y, z].map((n) => (n.unit === \"%\" ? n.value / 100 : n.value / 255)) as unknown as Vec3;\n return { hex: srgbHex(ch), alpha };\n }\n const turns: Readonly<Record<string, number>> = { \"\": 360, deg: 360, grad: 400, rad: 2 * Math.PI, turn: 1 };\n if (x.unit === \"%\" || !Object.hasOwn(turns, x.unit) || [y, z].some((n) => n.unit !== \"\" && n.unit !== \"%\")) {\n return null;\n }\n const h = ((((x.value / turns[x.unit]) * 360) % 360) + 360) % 360;\n const s = y.value / 100;\n const l = z.value / 100;\n const f = (n: number): number => {\n const k = (n + h / 30) % 12;\n return l - s * Math.min(l, 1 - l) * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n };\n return { hex: srgbHex([f(0), f(8), f(4)]), alpha };\n}\n\n// ------------------------------------------------------------ hex and names\n\n/**\n * A `#` hex color of 3, 4, 6 or 8 digits. Eight digits put the alpha last, except in yFiles 3, which puts it first.\n * @param text - the value, trimmed\n * @param alphaFirst - whether 8 digits are `#AARRGGBB`\n * @returns the color, or null\n */\nfunction hexColor(text: string, alphaFirst: boolean): { hex: StyleColor; alpha: number } | null {\n const m = /^#([0-9a-f]+)$/i.exec(text);\n if (m === null) {\n return null;\n }\n const h = m[1];\n const byte = (i: number): number => Number.parseInt(h.slice(i, i + 2), 16);\n switch (h.length) {\n case 3:\n case 4: {\n const v = Array.from(h, (c) => Number.parseInt(c + c, 16));\n return { hex: rgbHex(v[0], v[1], v[2]), alpha: h.length === 4 ? alpha01(v[3] / 255) : 1 };\n }\n case 6:\n return { hex: `#${h.toLowerCase()}`, alpha: 1 };\n case 8:\n return alphaFirst\n ? { hex: rgbHex(byte(2), byte(4), byte(6)), alpha: alpha01(byte(0) / 255) }\n : { hex: rgbHex(byte(0), byte(2), byte(4)), alpha: alpha01(byte(6) / 255) };\n default:\n return null;\n }\n}\n\n/**\n * A CSS color as graphty-element reads it: hex, `rgb()`/`hsl()` and their alpha forms, a CSS name or\n * `transparent`.\n * @param text - the value, trimmed\n * @returns the color, or null\n */\nfunction cssColor(text: string): { hex: StyleColor; alpha: number } | null {\n const lower = text.toLowerCase();\n if (lower === \"transparent\") {\n return { hex: \"#000000\", alpha: 0 };\n }\n const named = CSS_COLORS.get(lower);\n if (named !== undefined) {\n return { hex: named as StyleColor, alpha: 1 };\n }\n return hexColor(text, false) ?? cssFunction(text);\n}\n\n/** One of Pajek's decimal color channels in `RGB(1,0.8,0)`: 0..1, no spaces (Pajek 6.02 manual p. 76). */\nconst PAJEK_CHANNEL = /^(?:\\d+(?:\\.\\d*)?|\\.\\d+)$/;\n\n/**\n * Pajek's color names: the dvips names as written, `GrayNN` (NN percent black), `RGBrrggbb`, `RGB(r,g,b)` with\n * channels 0..1, `CMYKccmmyykk` and `CMYK(c,m,y,k)` (CMYK converted as dvips converts its names: each channel is\n * 1 - min(1, c + k)).\n * @param text - the value, trimmed\n * @returns the color, or null\n */\nfunction pajekColor(text: string): { hex: StyleColor; alpha: number } | null {\n const named = DVIPS_COLORS.get(text);\n if (named !== undefined) {\n return { hex: named as StyleColor, alpha: 1 };\n }\n const gray = /^Gray(\\d\\d)$/.exec(text);\n if (gray !== null) {\n const v = 255 * (1 - Number(gray[1]) / 100);\n return { hex: rgbHex(v, v, v), alpha: 1 };\n }\n const rgb = /^RGB([0-9A-Fa-f]{6})$/.exec(text);\n if (rgb !== null) {\n return { hex: `#${rgb[1].toLowerCase()}`, alpha: 1 };\n }\n const cmyk = /^CMYK([0-9A-Fa-f]{8})$/.exec(text);\n let parts: number[] | null = null;\n let model = \"\";\n if (cmyk === null) {\n const fn = /^(RGB|CMYK)\\(([^()]*)\\)$/.exec(text);\n const channels = fn === null ? [] : fn[2].split(\",\");\n if (fn !== null && channels.every((c) => PAJEK_CHANNEL.test(c))) {\n model = fn[1];\n parts = channels.map(Number);\n }\n } else {\n model = \"CMYK\";\n parts = [0, 2, 4, 6].map((i) => Number.parseInt(cmyk[1].slice(i, i + 2), 16) / 255);\n }\n if (parts === null || parts.some((p) => p > 1) || parts.length !== (model === \"RGB\" ? 3 : 4)) {\n return hexColor(text, false);\n }\n if (model === \"RGB\") {\n return { hex: rgbHex(parts[0] * 255, parts[1] * 255, parts[2] * 255), alpha: 1 };\n }\n const [c, m, y, k] = parts;\n const ch = (v: number): number => 255 * (1 - Math.min(1, v + k));\n return { hex: rgbHex(ch(c), ch(m), ch(y)), alpha: 1 };\n}\n\n/**\n * A color given as separate channels (`{ r, g, b, a? }`, GEXF's `viz:color` and Gephi's keys): r, g and b 0..255,\n * a 0..1.\n * @param raw - the object\n * @returns the color, or null when a channel is missing or out of range\n */\nfunction channels(raw: object): { hex: StyleColor; alpha: number } | null {\n if (!Object.hasOwn(raw, \"r\") || !Object.hasOwn(raw, \"g\") || !Object.hasOwn(raw, \"b\")) {\n return null;\n }\n const o = raw as { r: unknown; g: unknown; b: unknown; a?: unknown };\n const [r, g, b] = [o.r, o.g, o.b].map((v) =>\n typeof v === \"number\" || typeof v === \"string\" ? Number(v) : Number.NaN,\n );\n if (![r, g, b].every((v) => Number.isFinite(v) && v >= 0 && v <= 255)) {\n return null;\n }\n const a = Object.hasOwn(raw, \"a\") && o.a !== undefined && o.a !== null ? Number(o.a) : 1;\n return Number.isFinite(a) ? { hex: rgbHex(r, g, b), alpha: alpha01(a) } : null;\n}\n\n/**\n * A canonical color in the file's dialect, or null with a note.\n *\n * - CSS (`css`, `vis`, `graphology`, `cytoscape-js`, `graphty` and any dialect not listed): `#rgb`, `#rgba`,\n * `#rrggbb`, `#rrggbbaa`, `rgb()`, `rgba()`, `hsl()`, `hsla()`, CSS names and `transparent`, resolved as\n * graphty-element resolves them (out-of-range channels are gamut mapped).\n * - `graphviz`: Graphviz's own rules (see `graphvizColor`); an unknown color is BLACK, with a note, because that is\n * what Graphviz draws. `x11`: the same names, and an unknown one is null.\n * - `java`, `gephi`, `cytoscape`: the `java.awt.Color` names first, then CSS; a `java` integer is an RGB value.\n * - `dvips`: Pajek's names.\n * - `yed`: `#RRGGBBAA` with the alpha last; `yfiles3`: `#AARRGGBB` with the alpha first and constants such as\n * `DARK_ORANGE`.\n * - `gexf` and `gephi` also take `{ r, g, b, a }` objects.\n *\n * A Graphviz color list is read as `options.use` says and noted (`W_STYLE_GRADIENT`, `W_STYLE_COLOR_LIST`).\n * @param raw - the file's value\n * @param dialect - the file's dialect\n * @param site - where it was read\n * @param options - Graphviz's scheme and use\n * @returns the color and its alpha, or null\n * @category Styles\n */\nexport function canonColor(\n raw: unknown,\n dialect: StyleDialect,\n site: CanonSite,\n options: CanonColorOptions = {},\n): CanonColor | null {\n if (raw !== null && typeof raw === \"object\") {\n return objectColor(raw, dialect, site);\n }\n if (typeof raw === \"number\" && dialect === \"java\" && Number.isInteger(raw) && Math.abs(raw) <= 0xffffffff) {\n spendAt(site, 1);\n const v = raw >>> 0;\n return { color: rgbHex((v >>> 16) & 255, (v >>> 8) & 255, v & 255), alpha: 1 };\n }\n const text = scalarText(raw, site);\n if (text === null) {\n return null;\n }\n if (dialect === \"graphviz\" || dialect === \"x11\") {\n return graphvizCanon(text, dialect === \"x11\" ? \"x11\" : \"graphviz\", site, options);\n }\n const c = textColor(text.trim(), dialect);\n if (c === null) {\n noteAt(site, STYLE_ISSUE.BAD_VALUE, text);\n return null;\n }\n return { color: c.hex, alpha: c.alpha };\n}\n\n/**\n * A color given as an object: only GEXF and Gephi write one, as channels.\n * @param raw - the object\n * @param dialect - the file's dialect\n * @param site - where it was read\n * @returns the color and its alpha, or null with a note\n */\nfunction objectColor(raw: object, dialect: StyleDialect, site: CanonSite): CanonColor | null {\n spendAt(site, 1);\n const c = dialect === \"gexf\" || dialect === \"gephi\" ? channels(raw) : null;\n if (c === null) {\n noteAt(site, STYLE_ISSUE.BAD_VALUE, raw);\n return null;\n }\n return { color: c.hex, alpha: c.alpha };\n}\n\n/**\n * A Graphviz or X11 color: Graphviz draws an unknown color black; a plain X11 name that is unknown is no color at all.\n * @param text - the value\n * @param dialect - `graphviz` or `x11`\n * @param site - where it was read\n * @param options - Graphviz's scheme and use\n * @returns the color and its alpha, or null\n */\nfunction graphvizCanon(\n text: string,\n dialect: \"graphviz\" | \"x11\",\n site: CanonSite,\n options: CanonColorOptions,\n): CanonColor | null {\n const g = graphvizColor(text, dialect === \"x11\" ? null : (options.scheme ?? null), options.use ?? \"line\");\n if (g.unknown) {\n noteAt(site, STYLE_ISSUE.BAD_VALUE, text);\n if (dialect === \"x11\") {\n return null;\n }\n }\n if (g.list !== null) {\n noteAt(site, g.list === \"gradient\" ? STYLE_ISSUE.GRADIENT : STYLE_ISSUE.COLOR_LIST, text);\n }\n return { color: g.hex as StyleColor, alpha: alpha01(g.alpha) };\n}\n\n/**\n * A color written as text in a dialect other than Graphviz's.\n * @param trimmed - the value, trimmed\n * @param dialect - the file's dialect\n * @returns the color and its alpha, or null\n */\nfunction textColor(trimmed: string, dialect: StyleDialect): { hex: StyleColor; alpha: number } | null {\n const lower = trimmed.toLowerCase();\n switch (dialect) {\n case \"dvips\":\n return pajekColor(trimmed);\n case \"yfiles3\":\n return hexColor(trimmed, true) ?? cssColor(lower.replaceAll(\"_\", \"\"));\n case \"java\":\n case \"gephi\":\n case \"cytoscape\": {\n const java = JAVA_COLORS.get(lower);\n return java === undefined ? cssColor(trimmed) : { hex: java as StyleColor, alpha: 1 };\n }\n default:\n return cssColor(trimmed);\n }\n}\n\n/**\n * Moves a color's alpha into the property's opacity. When the property has an opacity (`fill` has `fillOpacity`,\n * an edge's `color` has `opacity`) the alpha is multiplied with any opacity the file also states; when it has none\n * (an outline, a label color) an alpha below 1 is dropped and noted as `W_STYLE_ALPHA_DROPPED`.\n * @param color - the canonical color\n * @param stated - the opacity the file states for the same element, or null\n * @param site - where the color was read\n * @param carried - whether the property has an opacity to carry the alpha\n * @returns the opacity to write, or null when there is none to write\n * @category Styles\n */\nexport function colorOpacity(\n color: CanonColor,\n stated: number | null,\n site: CanonSite,\n carried: boolean,\n): number | null {\n if (!carried) {\n if (color.alpha < 1) {\n noteAt(site, STYLE_ISSUE.ALPHA_DROPPED, color.color);\n }\n return stated;\n }\n if (color.alpha === 1) {\n return stated;\n }\n return num6((stated ?? 1) * color.alpha);\n}\n","/**\n * The defaults of the programs that write graph files: what each program draws for a property the file leaves\n * unset. A style reader adds them as one rule at the bottom (origin \"tool\"), so an imported graph looks the way it\n * does in the program that made it. Only values a primary source states are here; every value names its source.\n */\n\nimport type { EdgeStyleValues, GraphStyleValues, NodeStyleValues, StyleArrowShape, StyleTool } from \"./types.js\";\n\n/**\n * One default value and where it is stated.\n * @category Styles\n */\nexport interface ToolDefaultValue<V> {\n /** The canonical value. */\n readonly value: V;\n /** The primary source: a file and line of the tool's code or documentation. */\n readonly source: string;\n}\n\n/**\n * Default values per property, each with its source.\n * @category Styles\n */\nexport type ToolDefaultValues<T> = { readonly [K in keyof T]?: ToolDefaultValue<T[K]> };\n\n/**\n * A default that is a rule rather than a constant. Open union.\n * @category Styles\n */\nexport type ToolDerivedDefault =\n | {\n /** Nodes are labeled with the value of a column (Cytoscape's `name` passthrough). */\n readonly kind: \"labelFromColumn\";\n /** The column. */\n readonly column: string;\n /** Where the default is stated. */\n readonly source: string;\n }\n | {\n /** Nodes are labeled with their id (Graphviz's `\\N`). */\n readonly kind: \"labelFromId\";\n /** Where the default is stated. */\n readonly source: string;\n }\n | {\n /** An edge with no color of its own takes its source node's color. */\n readonly kind: \"colorFromSourceNode\";\n /** Where the default is stated. */\n readonly source: string;\n }\n | {\n /** An edge with no width of its own is drawn as thick as its weight (1 for an edge with no weight, or a weight of 0 or below). */\n readonly kind: \"widthFromWeight\";\n /** Where the default is stated. */\n readonly source: string;\n }\n | {\n /** A directed edge gets an arrow at its target end; an undirected edge keeps the constant default. */\n readonly kind: \"targetArrowOnDirected\";\n /** The arrow. */\n readonly arrow: StyleArrowShape;\n /** Where the default is stated. */\n readonly source: string;\n };\n\n/**\n * The defaults of one program.\n * @category Styles\n */\nexport interface ToolDefaults {\n /** The program's id. */\n readonly tool: StyleTool;\n /** The version of the program the values were read from. */\n readonly version: string;\n /** The unit of the lengths below: pixels (or points), or the program's relative size factor. */\n readonly units: \"px\" | \"relative\";\n /** Node defaults. */\n readonly node: ToolDefaultValues<NodeStyleValues>;\n /** Edge defaults. */\n readonly edge: ToolDefaultValues<EdgeStyleValues>;\n /** Graph defaults. */\n readonly graph: ToolDefaultValues<GraphStyleValues>;\n /** Defaults that are rules, applied above the constants. */\n readonly derived: readonly ToolDerivedDefault[];\n}\n\n/**\n * A value with its source.\n * @param value - the value\n * @param source - where it is stated\n * @returns the entry\n */\nfunction v<V>(value: V, source: string): ToolDefaultValue<V> {\n return { value, source };\n}\n\nconst CY = \"cytoscape-impl vizmap-gui-impl default_vizmap.xml, style default, line\";\nconst CYL = \"cytoscape-api BasicVisualLexicon.java line\";\nconst CYJS = \"cytoscape.js 3.34.3 dist/cytoscape.cjs.js line\";\nconst GV = \"graphviz.org/docs/attrs\";\nconst YED_QA = \"yEd Q&A, How can I change the default nodes and/or default edges\";\nconst YED_CORPUS = \"yEd GraphML corpus, most frequent value\";\nconst YED_EDGE = \"yFiles for Java 2.19 EdgeRealizer API docs\";\nconst Y3 = \"yFiles for HTML API docs,\";\nconst GEPHI = \"gephi master 92e503df61a7\";\nconst VIS = \"vis-network 10.1.2 vis-network.esm.js\";\nconst SIGMA = \"sigma 3.0.3 packages/sigma/src\";\nconst PAJEK = \"Pajek 6.02 reference manual\";\nconst OGDF = \"ogdf master 1a40505ac006\";\nconst NX = \"networkx 6da4704cbf32 networkx/drawing/nx_pylab.py line\";\n\n/**\n * The defaults of every program graph-io recognizes as a file's writer, by tool id.\n * @category Styles\n */\nexport const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<StyleTool, ToolDefaults>(\n (\n [\n {\n tool: \"cytoscape\",\n version: \"cytoscape-impl develop 6c63e97c5152 (3.11)\",\n units: \"px\",\n node: {\n fill: v(\"#89d0f5\", `${CY} 382`),\n fillOpacity: v(1, `${CY} 383`),\n shape: v(\"round-rectangle\", `${CY} 367`),\n width: v(75, `${CY} 384`),\n height: v(35, `${CY} 358`),\n borderColor: v(\"#cccccc\", `${CY} 392`),\n borderWidth: v(0, `${CY} 350`),\n borderStyle: v(\"solid\", `${CY} 366`),\n labelColor: v(\"#000000\", `${CY} 395`),\n labelFont: v(\"sans-serif\", `${CY} 370`),\n labelWeight: v(\"normal\", `${CY} 370`),\n labelItalic: v(false, `${CY} 370`),\n labelSize: v(12, `${CY} 371`),\n labelPosition: v(\"center\", `${CY} 380`),\n },\n edge: {\n color: v(\"#848484\", `${CY} 431`),\n width: v(2, `${CY} 417`),\n lineStyle: v(\"solid\", `${CY} 438`),\n opacity: v(1, `${CY} 423`),\n sourceArrow: v(\"none\", `${CY} 437`),\n targetArrow: v(\"none\", `${CY} 428`),\n sourceArrowColor: v(\"#000000\", `${CY} 432`),\n targetArrowColor: v(\"#000000\", `${CY} 432`),\n labelColor: v(\"#000000\", `${CY} 415`),\n labelFont: v(\"sans-serif\", `${CY} 439`),\n labelWeight: v(\"normal\", `${CY} 439`),\n labelItalic: v(false, `${CY} 439`),\n labelSize: v(10, `${CY} 439`),\n // EDGE_CURVED is true there, but it only rounds an edge's bends: an edge without bends is straight\n curved: v(false, `${CY} 422`),\n },\n graph: { background: v(\"#ffffff\", `${CY} 335`) },\n derived: [{ kind: \"labelFromColumn\", column: \"name\", source: `${CY} 406-408` }],\n },\n {\n tool: \"cytoscape-fallbacks\",\n version: \"cytoscape-api develop (3.11)\",\n units: \"px\",\n node: {\n fill: v(\"#c80000\", `${CYL} 83`),\n fillOpacity: v(1, `${CYL} 273`),\n shape: v(\"ellipse\", `${CYL} 302-303`),\n width: v(60, `${CYL} 155`),\n height: v(40, `${CYL} 163`),\n borderColor: v(\"#000000\", `${CYL} 230`),\n borderWidth: v(2, `${CYL} 54`),\n labelColor: v(\"#000000\", `${CYL} 91`),\n labelFont: v(\"sans-serif\", `${CYL} 255`),\n labelWeight: v(\"normal\", `${CYL} 255`),\n labelItalic: v(false, `${CYL} 255`),\n labelSize: v(12, `${CYL} 55`),\n labelPosition: v(\"center\", `${CYL} 205`),\n },\n edge: {\n color: v(\"#404040\", `${CYL} 469`),\n width: v(1, `${CYL} 368`),\n lineStyle: v(\"solid\", `${CYL} 392`),\n sourceArrow: v(\"none\", `${CYL} 487`),\n targetArrow: v(\"none\", `${CYL} 493`),\n labelColor: v(\"#000000\", `${CYL} 327`),\n labelFont: v(\"sans-serif\", `${CYL} 408`),\n labelWeight: v(\"normal\", `${CYL} 408`),\n labelItalic: v(false, `${CYL} 408`),\n labelSize: v(10, `${CYL} 416`),\n },\n graph: { background: v(\"#ffffff\", `${CYL} 667`) },\n derived: [],\n },\n {\n tool: \"cytoscape-js\",\n version: \"cytoscape.js 3.34.3\",\n units: \"px\",\n node: {\n fill: v(\"#999999\", `${CYJS} 18536`),\n fillOpacity: v(1, `${CYJS} 18538`),\n shape: v(\"ellipse\", `${CYJS} 18571`),\n width: v(30, `${CYJS} 18569`),\n height: v(30, `${CYJS} 18570`),\n borderColor: v(\"#000000\", `${CYJS} 18555`),\n borderWidth: v(0, `${CYJS} 18557`),\n borderStyle: v(\"solid\", `${CYJS} 18558`),\n opacity: v(1, `${CYJS} 18503`),\n labelColor: v(\"#000000\", `${CYJS} 18474`),\n labelSize: v(16, `${CYJS} 18496`),\n labelFont: v(\"Helvetica Neue, Helvetica, sans-serif\", `${CYJS} 18493`),\n labelWeight: v(\"normal\", `${CYJS} 18495`),\n labelPosition: v(\"top\", `${CYJS} 18470-18471`),\n },\n edge: {\n color: v(\"#999999\", `${CYJS} 18639`),\n sourceArrowColor: v(\"#999999\", `${CYJS} 18639`),\n targetArrowColor: v(\"#999999\", `${CYJS} 18639`),\n width: v(3, `${CYJS} 18711`),\n lineStyle: v(\"solid\", `${CYJS} 18638`),\n opacity: v(1, `${CYJS} 18503`),\n sourceArrow: v(\"none\", `${CYJS} 18670`),\n targetArrow: v(\"none\", `${CYJS} 18671`),\n arrowSize: v(1, `${CYJS} 18660`),\n curved: v(false, `${CYJS} 18658`),\n labelColor: v(\"#000000\", `${CYJS} 18474`),\n labelSize: v(16, `${CYJS} 18496`),\n labelFont: v(\"Helvetica Neue, Helvetica, sans-serif\", `${CYJS} 18493`),\n labelWeight: v(\"normal\", `${CYJS} 18495`),\n },\n graph: {},\n derived: [],\n },\n {\n tool: \"graphviz\",\n version: \"graphviz main (16.1.0)\",\n units: \"px\",\n node: {\n fillOpacity: v(0, `${GV}/style/ (default \"\", not filled)`),\n borderColor: v(\"#000000\", `${GV}/color/`),\n borderWidth: v(1, `${GV}/penwidth/; lib/common/const.h line 77`),\n shape: v(\"ellipse\", `${GV}/shape/; lib/common/const.h line 76`),\n width: v(54, `${GV}/width/ (0.75 inch); lib/common/const.h line 72`),\n height: v(36, `${GV}/height/ (0.5 inch); lib/common/const.h line 73`),\n labelColor: v(\"#000000\", `${GV}/fontcolor/`),\n labelSize: v(14, `${GV}/fontsize/; lib/common/const.h line 61`),\n labelFont: v(\"Times-Roman\", `${GV}/fontname/; lib/common/const.h line 67`),\n labelPosition: v(\"center\", `${GV}/labelloc/`),\n },\n edge: {\n color: v(\"#000000\", `${GV}/color/`),\n width: v(1, `${GV}/penwidth/`),\n lineStyle: v(\"solid\", `${GV}/style/`),\n sourceArrow: v(\"none\", `${GV}/dir/`),\n targetArrow: v(\"none\", `${GV}/dir/ (none in a graph)`),\n arrowSize: v(1, `${GV}/arrowsize/`),\n labelColor: v(\"#000000\", `${GV}/fontcolor/`),\n labelSize: v(14, `${GV}/fontsize/`),\n labelFont: v(\"Times-Roman\", `${GV}/fontname/`),\n },\n graph: {},\n derived: [\n { kind: \"labelFromId\", source: String.raw`${GV}/label/ (default \\N, the node name)` },\n {\n kind: \"targetArrowOnDirected\",\n arrow: \"triangle\",\n source: `${GV}/dir/ (forward in a digraph); ${GV}/arrowhead/ (normal)`,\n },\n ],\n },\n {\n tool: \"yed\",\n version: \"yEd / yFiles for Java 2.19\",\n units: \"px\",\n node: {\n fill: v(\"#ffcc00\", `${YED_QA}; ${YED_CORPUS} of y:Fill color`),\n shape: v(\"rectangle\", \"yFiles for Java 2.19 ShapeNodeRealizer API docs\"),\n borderColor: v(\"#000000\", `${YED_CORPUS} of y:BorderStyle`),\n borderWidth: v(1, `${YED_CORPUS} of y:BorderStyle`),\n borderStyle: v(\"solid\", `${YED_CORPUS} of y:BorderStyle`),\n labelColor: v(\"#000000\", `${YED_CORPUS} of y:NodeLabel`),\n labelFont: v(\"Dialog\", `${YED_CORPUS} of y:NodeLabel`),\n labelSize: v(12, `${YED_CORPUS} of y:NodeLabel`),\n labelWeight: v(\"normal\", `${YED_CORPUS} of y:NodeLabel`),\n labelPosition: v(\"center\", `${YED_CORPUS} of y:NodeLabel`),\n },\n edge: {\n color: v(\"#000000\", `${YED_EDGE} (line color defaults to Color.black)`),\n width: v(1, `${YED_EDGE} (line type defaults to LineType.LINE_1)`),\n lineStyle: v(\"solid\", `${YED_EDGE} (line type defaults to LineType.LINE_1)`),\n sourceArrow: v(\"none\", `${YED_EDGE} (defaults to Arrow.NONE)`),\n targetArrow: v(\"none\", `${YED_EDGE} (defaults to Arrow.NONE)`),\n labelColor: v(\"#000000\", `${YED_CORPUS} of y:EdgeLabel`),\n labelFont: v(\"Dialog\", `${YED_CORPUS} of y:EdgeLabel`),\n labelSize: v(12, `${YED_CORPUS} of y:EdgeLabel`),\n },\n graph: {},\n derived: [],\n },\n {\n tool: \"yfiles3\",\n version: \"yFiles for HTML (API docs retrieved 2026-10-11)\",\n units: \"px\",\n node: {\n fill: v(\"#ffffff\", `${Y3} ShapeNodeStyle fill`),\n borderColor: v(\"#000000\", `${Y3} ShapeNodeStyle stroke`),\n borderWidth: v(1, `${Y3} ShapeNodeStyle stroke`),\n shape: v(\"rectangle\", `${Y3} ShapeNodeStyle shape`),\n labelColor: v(\"#000000\", `${Y3} LabelStyle textFill`),\n labelFont: v(\"Arial\", `${Y3} LabelStyle font`),\n labelSize: v(12, `${Y3} LabelStyle font`),\n },\n edge: {\n color: v(\"#000000\", `${Y3} PolylineEdgeStyle stroke`),\n width: v(1, `${Y3} PolylineEdgeStyle stroke`),\n sourceArrow: v(\"none\", `${Y3} PolylineEdgeStyle sourceArrow`),\n targetArrow: v(\"none\", `${Y3} PolylineEdgeStyle targetArrow`),\n labelColor: v(\"#000000\", `${Y3} LabelStyle textFill`),\n labelFont: v(\"Arial\", `${Y3} LabelStyle font`),\n labelSize: v(12, `${Y3} LabelStyle font`),\n },\n graph: {},\n derived: [],\n },\n {\n tool: \"gephi\",\n version: \"gephi 0.11.4-SNAPSHOT\",\n units: \"relative\",\n node: {\n fill: v(\"#000000\", \"gephi/graphstore a4c790b2343e NodeImpl.java line 322\"),\n width: v(10, `${GEPHI} AbstractProcessor.java lines 195-198`),\n height: v(10, `${GEPHI} AbstractProcessor.java lines 195-198`),\n shape: v(\"ellipse\", \"GEXF 1.3 viz shape default disc; Preview NodeRenderer\"),\n labelPosition: v(\n \"center\",\n `${GEPHI} NodeLabelRenderer.java (a label is drawn centered on its node)`,\n ),\n },\n edge: {\n sourceArrow: v(\"none\", `${GEPHI} DefaultPreset.java line 62`),\n targetArrow: v(\"none\", `${GEPHI} DefaultPreset.java line 62`),\n },\n graph: { background: v(\"#ffffff\", `${GEPHI} VizConfig.java line 111`) },\n derived: [\n {\n kind: \"colorFromSourceNode\",\n source: `${GEPHI} VizConfig.java line 119 (EdgeColorMode.SOURCE)`,\n },\n {\n kind: \"widthFromWeight\",\n source: `${GEPHI} VizConfig.java lines 136, 144-145; DefaultPreset.java lines 67, 73`,\n },\n {\n kind: \"targetArrowOnDirected\",\n arrow: \"triangle\",\n source: `${GEPHI} DefaultPreset.java line 62`,\n },\n ],\n },\n {\n tool: \"vis-network\",\n version: \"vis-network 10.1.2\",\n units: \"px\",\n node: {\n fill: v(\"#97c2fc\", `${VIS} lines 32986-33110`),\n borderColor: v(\"#2b7ce9\", `${VIS} lines 32986-33110`),\n borderWidth: v(1, `${VIS} lines 32986-33110`),\n shape: v(\"ellipse\", `${VIS} lines 32986-33110`),\n labelColor: v(\"#343434\", `${VIS} lines 32986-33110`),\n labelSize: v(14, `${VIS} lines 32986-33110`),\n labelFont: v(\"arial\", `${VIS} lines 32986-33110`),\n labelPosition: v(\"center\", `${VIS} lines 32986-33110`),\n },\n edge: {\n width: v(1, `${VIS} lines 25160-25290`),\n lineStyle: v(\"solid\", `${VIS} lines 25160-25290 (dashes false)`),\n sourceArrow: v(\"none\", `${VIS} lines 25160-25290`),\n targetArrow: v(\"none\", `${VIS} lines 25160-25290`),\n labelColor: v(\"#343434\", `${VIS} lines 25160-25290`),\n labelSize: v(14, `${VIS} lines 25160-25290`),\n labelFont: v(\"arial\", `${VIS} lines 25160-25290`),\n },\n graph: {},\n derived: [\n { kind: \"labelFromColumn\", column: \"label\", source: `${VIS} lines 32986-33110` },\n { kind: \"colorFromSourceNode\", source: `${VIS} lines 25160-25290 (color.inherit \"from\")` },\n ],\n },\n {\n tool: \"sigma\",\n version: \"sigma 3.0.3\",\n units: \"relative\",\n node: {\n fill: v(\"#999999\", `${SIGMA}/settings.ts lines 119-126`),\n shape: v(\"ellipse\", `${SIGMA}/settings.ts lines 119-126`),\n width: v(2, `${SIGMA}/sigma.ts line 76`),\n height: v(2, `${SIGMA}/sigma.ts line 76`),\n labelColor: v(\"#000000\", `${SIGMA}/settings.ts lines 119-126`),\n labelFont: v(\"Arial\", `${SIGMA}/settings.ts lines 119-126`),\n labelSize: v(14, `${SIGMA}/settings.ts lines 119-126`),\n labelWeight: v(\"normal\", `${SIGMA}/settings.ts lines 119-126`),\n },\n edge: {\n color: v(\"#cccccc\", `${SIGMA}/settings.ts lines 119-126`),\n width: v(0.5, `${SIGMA}/sigma.ts line 100`),\n sourceArrow: v(\"none\", `${SIGMA}/settings.ts lines 119-126 (type line)`),\n targetArrow: v(\"none\", `${SIGMA}/settings.ts lines 119-126 (type line)`),\n },\n graph: {},\n derived: [{ kind: \"labelFromColumn\", column: \"label\", source: `${SIGMA}/settings.ts lines 119-126` }],\n },\n {\n tool: \"pajek\",\n version: \"Pajek 6.02\",\n units: \"relative\",\n node: {\n shape: v(\"ellipse\", `${PAJEK} p. 85`),\n opacity: v(1, `${PAJEK} p. 87`),\n borderColor: v(\"#000000\", `${PAJEK}, vertex parameter bc (default Black)`),\n borderWidth: v(0.2, `${PAJEK}, vertex parameter bw (default 1, against the default vertex size 5)`),\n },\n edge: {\n color: v(\"#000000\", `${PAJEK} p. 90`),\n lineStyle: v(\"solid\", `${PAJEK} p. 90`),\n opacity: v(1, `${PAJEK} p. 87`),\n sourceArrow: v(\"none\", `${PAJEK} p. 91`),\n targetArrow: v(\"none\", `${PAJEK} p. 91 (edges have none)`),\n },\n graph: {},\n derived: [\n { kind: \"labelFromColumn\", column: \"label\", source: `${PAJEK}, vertex labels (drawn by default)` },\n { kind: \"targetArrowOnDirected\", arrow: \"triangle\", source: `${PAJEK} p. 91 (arcs)` },\n ],\n },\n {\n tool: \"ogdf\",\n version: \"ogdf master 1a40505ac006\",\n units: \"px\",\n node: {\n fill: v(\"#ffffff\", `${OGDF} LayoutStandards.cpp lines 38-45`),\n shape: v(\"rectangle\", `${OGDF} LayoutStandards.cpp lines 38-45`),\n width: v(20, `${OGDF} LayoutStandards.cpp lines 38-45`),\n height: v(20, `${OGDF} LayoutStandards.cpp lines 38-45`),\n borderColor: v(\"#000000\", `${OGDF} LayoutStandards.cpp lines 38-45`),\n borderWidth: v(1, `${OGDF} LayoutStandards.cpp lines 38-45`),\n borderStyle: v(\"solid\", `${OGDF} LayoutStandards.cpp lines 38-45`),\n },\n edge: {\n color: v(\"#000000\", `${OGDF} LayoutStandards.cpp lines 38-45`),\n width: v(1, `${OGDF} LayoutStandards.cpp lines 38-45`),\n lineStyle: v(\"solid\", `${OGDF} LayoutStandards.cpp lines 38-45`),\n },\n graph: {},\n derived: [],\n },\n {\n tool: \"networkx\",\n version: \"networkx 3.7 (main 6da4704cbf32)\",\n units: \"px\",\n node: {\n fill: v(\"#1f78b4\", `${NX} 1378`),\n fillOpacity: v(1, `${NX} 549`),\n shape: v(\"ellipse\", `${NX} 1379 (node_shape \"o\")`),\n // node_size 300 is a marker area in points squared (matplotlib scatter): diameter sqrt(300)\n width: v(17.3205, `${NX} 1377 (node_size 300, points squared)`),\n height: v(17.3205, `${NX} 1377 (node_size 300, points squared)`),\n labelColor: v(\"#000000\", `${NX} 2143`),\n labelSize: v(12, `${NX} 2142`),\n labelFont: v(\"sans-serif\", `${NX} 2144`),\n labelWeight: v(\"normal\", `${NX} 2145`),\n labelPosition: v(\"center\", `${NX} 2148-2149`),\n },\n edge: {\n color: v(\"#000000\", `${NX} 1768 (edge_color \"k\")`),\n width: v(1, `${NX} 1767`),\n lineStyle: v(\"solid\", `${NX} 1769`),\n opacity: v(1, `${NX} 568`),\n sourceArrow: v(\"none\", `${NX} 1848-1849`),\n targetArrow: v(\"none\", `${NX} 1849 (undirected graphs draw \"-\")`),\n labelColor: v(\"#000000\", `${NX} 557`),\n labelSize: v(12, `${NX} 556`),\n labelFont: v(\"sans-serif\", `${NX} 558`),\n labelWeight: v(\"normal\", `${NX} 559`),\n },\n graph: {},\n derived: [\n {\n kind: \"targetArrowOnDirected\",\n arrow: \"triangle\",\n source: `${NX} 1848 (arrowstyle \"-|>\" for directed graphs)`,\n },\n ],\n },\n ] satisfies ToolDefaults[]\n ).map((d): [StyleTool, ToolDefaults] => [d.tool, d]),\n);\n\n/**\n * The defaults of one program.\n * @param tool - the program's id\n * @returns its defaults, or null when graph-io has none for it\n * @category Styles\n */\nexport function toolDefaults(tool: StyleTool): ToolDefaults | null {\n return TOOL_DEFAULTS.get(tool) ?? null;\n}\n","/**\n * Candidate explaining columns: the snapshot's attributes and the graph's degrees, which the planner tests as\n * explanations of a file's per-element style values, and the fingerprint that ties styles to their graph.\n */\n\nimport type { GraphSnapshot } from \"@graphty/graph-format\";\n\nimport type { ColumnRef, Scalar, StyleFeature, StyleFingerprint, StyleTarget } from \"../types.js\";\nimport { dataCell, degreeValues } from \"./resolve.js\";\n\n/** Column types whose values can be features: one scalar per element. */\nconst SCALAR_DTYPES: ReadonlySet<string> = new Set([\"string\", \"dict\", \"bool\", \"i32\", \"u32\", \"u8\", \"f32\", \"f64\"]);\n/** Coordinates say where the writer put a node, not what it is. */\nconst COORDINATE = /^(?:x|y|z|_pos)$/i;\n/** The column holding the group a node sits in. */\nconst PARENT_COLUMN = \"graphty.parent\";\n/** An integer column of at least this many values that fills a whole range is an index, not a quantity. */\nconst MIN_INDEX = 8;\n\n/**\n * The candidate explaining columns of one target: every scalar attribute (the reserved `graphty.*` columns,\n * coordinates and Cytoscape's selection state excepted), the group a node sits in as the style column `group`, and\n * for nodes the degree (and the in- and out-degree of a directed graph) as `{ computed }` references, which follow\n * later edits of the graph.\n * @param snapshot - the graph\n * @param target - nodes or edges\n * @returns the features, in column order with the degrees last\n * @category Styles\n */\nexport function featuresOf(snapshot: GraphSnapshot, target: StyleTarget): StyleFeature[] {\n const table = target === \"node\" ? snapshot.nodes : snapshot.edges;\n const n = target === \"node\" ? snapshot.nodeCount : snapshot.edgeCount;\n const out: StyleFeature[] = [];\n for (const name of table.names().filter((c) => isFeatureColumn(table, c))) {\n const values = Array.from({ length: n }, (_, i): Scalar | null => {\n const v = dataCell(table, name, i);\n return typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\" ? v : null;\n });\n if (name !== PARENT_COLUMN) {\n out.push({ ref: { data: name }, values });\n } else if (target === \"node\") {\n // the group a node sits in, by the group's id: graphty-element keeps no graphty.* column in its records\n const group = values.map((v) =>\n typeof v === \"number\" && v >= 0 && v < snapshot.nodeCount ? String(snapshot.ids.idOf(v)) : null,\n );\n out.push({ ref: { style: \"group\" }, values: group });\n }\n }\n if (target === \"node\" && n > 0) {\n const kinds: (\"degree\" | \"indegree\" | \"outdegree\")[] = snapshot.directed\n ? [\"degree\", \"indegree\", \"outdegree\"]\n : [\"degree\"];\n for (const k of kinds) {\n out.push({ ref: { computed: k }, values: degreeValues(snapshot, k) });\n }\n }\n return out;\n}\n\n/**\n * Whether a column may explain styles: one scalar component, neither a position nor a coordinate, nor graphty's own\n * columns (the parent excepted) or Cytoscape's selection state.\n * @param table - the node or edge table\n * @param name - the column\n * @returns true for a candidate\n */\nfunction isFeatureColumn(table: GraphSnapshot[\"nodes\"], name: string): boolean {\n if ((name.startsWith(\"graphty.\") && name !== PARENT_COLUMN) || name === \"selected\" || COORDINATE.test(name)) {\n return false;\n }\n const col = table.get(name);\n return (\n col !== null && col.meta.role !== \"position\" && SCALAR_DTYPES.has(col.meta.dtype) && col.meta.components === 1\n );\n}\n\n/**\n * The fingerprint of a graph: its node and edge counts and a hash of its node ids' text, whatever their order (a\n * format may read nodes back in another order). The id 7 and the id \"7\" hash alike, so a graph written to a format\n * that reads its ids back as text (or as numbers) keeps its fingerprint.\n * @param snapshot - the graph\n * @returns the fingerprint\n * @category Styles\n */\nexport function styleFingerprint(snapshot: GraphSnapshot): StyleFingerprint {\n // two FNV-1a hashes with different seeds over each id's text, summed: the sum does not depend on the order\n let h1 = 0;\n let h2 = 0;\n for (let i = 0; i < snapshot.nodeCount; i++) {\n const text = String(snapshot.ids.idOf(i));\n let a = 0x811c9dc5;\n let b = 0x01000193 ^ 0x5bd1e995;\n for (let c = 0; c < text.length; c++) {\n const code = text.charCodeAt(c); // NOSONAR(S7758): hashes UTF-16 code units; code points would change every fingerprint\n a = Math.imul(a ^ code, 0x01000193);\n b = Math.imul(b ^ code, 0x01000193) ^ (b >>> 13);\n }\n h1 = (h1 + (a >>> 0)) >>> 0;\n h2 = (h2 + (b >>> 0)) >>> 0;\n }\n const hex = (h: number): string => (h >>> 0).toString(16).padStart(8, \"0\");\n return {\n nodes: snapshot.nodeCount,\n edges: snapshot.edgeCount,\n heldEdges: heldEdgeRows(snapshot).length,\n ids: hex(h1) + hex(h2),\n };\n}\n\n/**\n * The edge rows a file holds, in order: every row but the second half of an undirected edge in a directed graph,\n * which every format writes once.\n * @param snapshot - the graph\n * @returns the rows\n */\nexport function heldEdgeRows(snapshot: GraphSnapshot): number[] {\n const pair = snapshot.edges.byRole(\"pair\");\n const rows: number[] = [];\n for (let e = 0; e < snapshot.edgeCount; e++) {\n if (!(pair?.isSet(e) === true && (pair.value(e) as number) < e)) {\n rows.push(e);\n }\n }\n return rows;\n}\n\n/** What describeFeature() reads off a feature's values. */\ninterface ValueStats {\n /** The distinct values, as type and text. */\n readonly seen: ReadonlySet<string>;\n /** Whether every value is text, a boolean or a finite integer. */\n readonly categorical: boolean;\n /** Whether every value is a finite number. */\n readonly numeric: boolean;\n /** Whether every value is an integer. */\n readonly integers: boolean;\n /** The smallest finite number. */\n readonly lo: number;\n /** The largest finite number. */\n readonly hi: number;\n /** How many values are set. */\n readonly count: number;\n}\n\n/**\n * The statistics of a feature's values.\n * @param values - the values\n * @returns the statistics\n */\nfunction valueStats(values: readonly (Scalar | null)[]): ValueStats {\n const seen = new Set<string>();\n let categorical = true;\n let numeric = true;\n let integers = true;\n let lo = Infinity;\n let hi = -Infinity;\n let count = 0;\n for (const v of values) {\n if (v === null) {\n continue;\n }\n count++;\n seen.add(`${typeof v}:${String(v)}`);\n if (typeof v !== \"number\") {\n numeric = false;\n integers = false;\n } else if (Number.isFinite(v)) {\n integers &&= Number.isInteger(v);\n categorical &&= Number.isInteger(v);\n lo = Math.min(lo, v);\n hi = Math.max(hi, v);\n } else {\n numeric = false;\n categorical = false;\n }\n }\n return { seen, categorical, numeric, integers, lo, hi, count };\n}\n\n/**\n * A feature's name in rule ids: the column's name, the generated key or the degree's name.\n * @param ref - the column\n * @returns its name\n */\nfunction featureName(ref: ColumnRef): string {\n if (\"style\" in ref) {\n return ref.style;\n }\n if (\"computed\" in ref) {\n return ref.computed;\n }\n return (ref as { data: string }).data;\n}\n\n/**\n * What the planner knows about a feature.\n */\nexport interface FeatureInfo {\n /** The feature. */\n readonly feature: StyleFeature;\n /** Its name in rule ids. */\n readonly name: string;\n /** Distinct non-null values. */\n readonly distinct: number;\n /** Whether a table on it may explain styles (strings, booleans, integers). */\n readonly categorical: boolean;\n /** Whether a ramp on it may explain styles (finite numbers that are not an index). */\n readonly numeric: boolean;\n /** Whether it is the file's own raw style column, which explains nothing. */\n readonly raw: boolean;\n}\n\n/**\n * Describes a feature for the planner.\n * @param feature - the feature\n * @param raw - whether it is the raw style column a reader read\n * @returns what the planner knows about it\n */\nexport function describeFeature(feature: StyleFeature, raw: boolean): FeatureInfo {\n const { seen, categorical, numeric, integers, lo, hi, count } = valueStats(feature.values);\n const computed = \"computed\" in feature.ref;\n // an integer column whose values are all different and fill a whole range (0..n-1, a z order) is an index:\n // a ramp on it would only replay the order the writer stored the elements in\n const index =\n !computed && numeric && integers && count >= MIN_INDEX && seen.size === count && hi - lo + 1 === count;\n return {\n feature,\n name: featureName(feature.ref),\n distinct: seen.size,\n categorical: count > 0 && categorical,\n numeric: count > 0 && numeric && !index,\n raw,\n };\n}\n","/**\n * The `graphty.styles` block: the rules of a graph's styles written into a file so that importing the file back into\n * graphty rebuilds the same rules. The block is JSON; the per-element values its rules read are written beside it as\n * element attributes named `graphty.style.<target>.<key>` (or, in a format with no per-element attributes, inside\n * the block). A block is file input like any other: it is size-limited, validated member by member, never keyed into\n * a plain object, and a block that fails any check is ignored with a reason code, never thrown.\n */\n\nimport type { GraphSnapshot } from \"@graphty/graph-format\";\n\nimport type { LossNote } from \"../../types.js\";\nimport { STYLE_ISSUE } from \"../codes.js\";\nimport { toolDefaults } from \"../defaults.js\";\nimport { featuresOf, heldEdgeRows, styleFingerprint } from \"../plan/features.js\";\nimport { plainCell, refSource, resolveRules, within } from \"../plan/resolve.js\";\nimport type {\n ColumnRef,\n ContinuousPoint,\n ExtractedStyles,\n FileStyles,\n Mapping,\n Predicate,\n Scalar,\n StyleBlockIgnoredReason,\n StyleColumn,\n StyleFingerprint,\n StyleNote,\n StyleRule,\n StyleRuleFacts,\n StyleTarget,\n StyleTool,\n StyleValue,\n} from \"../types.js\";\nimport { STYLE_PROPERTIES } from \"../vocabulary.js\";\n\n/**\n * The name of the block in every format: a graph attribute, a key, an aspect or an archive entry.\n * @category Styles\n */\nexport const STYLE_BLOCK_NAME = \"graphty.styles\";\n\n/**\n * The longest block graph-io reads, in characters; a longer one is ignored (`TOO_LARGE`).\n * @category Styles\n */\nexport const MAX_STYLE_BLOCK_LENGTH = 16 * 1024 * 1024;\n\n/** The deepest nesting of JSON values a block may have. */\nconst MAX_DEPTH = 64;\n/** The most rules a block may hold. */\nconst MAX_RULES = 4096;\n/** The longest id, key, property name or source field. */\nconst MAX_NAME = 256;\n/** Keys that would reach an object's prototype; a block holding one anywhere is ignored. */\nconst FORBIDDEN_KEYS: ReadonlySet<string> = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\nconst TARGETS: readonly StyleTarget[] = [\"node\", \"edge\"];\nconst COMPUTED: ReadonlySet<string> = new Set([\"degree\", \"indegree\", \"outdegree\"]);\n\n/**\n * The name of the element attribute holding one style column: `graphty.style.<target>.<key>`.\n * @param target - nodes or edges\n * @param key - the style column's key (`class`, `member.3`, `exceptions.fill`)\n * @returns the attribute name\n * @category Styles\n */\nexport function styleTag(target: StyleTarget, key: string): string {\n return `graphty.style.${target}.${key}`;\n}\n\n/**\n * The content of a `graphty.styles` block.\n * @category Styles\n */\nexport interface StyleBlock {\n /** The block's version: 1. */\n readonly version: 1;\n /** The format, dialect and tool the styles were described with. */\n readonly source: FileStyles[\"source\"];\n /** The unit of every length. */\n readonly units: FileStyles[\"units\"];\n /** The graph's own style. */\n readonly graph: FileStyles[\"graph\"];\n /** The rules, bottom to top, with their `ext` members. */\n readonly rules: readonly StyleRule[];\n /** The keys of the style columns the rules read, per target. */\n readonly columns: {\n /** Node style column keys. */\n readonly node: readonly string[];\n /** Edge style column keys. */\n readonly edge: readonly string[];\n };\n /**\n * The text of each node's id, in the order the inline style columns list the nodes, so they are matched to a graph\n * read back in another order; absent without inline columns.\n */\n readonly order?: readonly string[];\n /**\n * The keys of the style columns that hold booleans, per target, so a format that has no booleans (GML writes 0\n * and 1) reads them back as booleans; absent when none does.\n */\n readonly booleans?: {\n /** Node style column keys. */\n readonly node: readonly string[];\n /** Edge style column keys. */\n readonly edge: readonly string[];\n };\n /** The style columns themselves, for a format with no per-element attributes; absent otherwise. */\n readonly values?: {\n /** Node style columns by key. */\n readonly node: ReadonlyMap<string, StyleColumn>;\n /** Edge style columns by key. */\n readonly edge: ReadonlyMap<string, StyleColumn>;\n };\n /**\n * A hash of the values of every data column the rules read, per target, by the column's name when the block was\n * written; absent in a block written without its graph. A column the file reads back under another name (a\n * format writes its label column as its own `label`) is found again by its values.\n */\n readonly data?: {\n /** Node data column hashes by column name. */\n readonly node: ReadonlyMap<string, string>;\n /** Edge data column hashes by column name. */\n readonly edge: ReadonlyMap<string, string>;\n };\n /** The graph the block describes. */\n readonly fingerprint: StyleFingerprint;\n}\n\n/**\n * Options of `writeStyleBlock()`.\n * @category Styles\n */\nexport interface WriteStyleBlockOptions {\n /** Write the style columns inside the block, for a format with no per-element attributes; defaults to false. */\n readonly inlineColumns?: boolean;\n /**\n * The graph being written: with it, the block records a hash of each data column the rules read, so the rules\n * still find their columns in a file that renames them.\n */\n readonly snapshot?: GraphSnapshot;\n}\n\n/** The JSON escapes a reader of Cytoscape's convention would change, as `\\u` escapes that mean the same. */\nconst SAFE_ESCAPES: Readonly<Record<string, string>> = {\n \"\\\\\": String.raw`\\u005c`,\n n: String.raw`\\u000a`,\n t: String.raw`\\u0009`,\n};\n\n/**\n * Writes a graph's styles as a `graphty.styles` block. Notes are not written. The output is deterministic: the same\n * styles always give the same text. A backslash, newline or tab inside a string is written as a `\\u` escape, so a\n * format that decodes `\\n` and `\\t` in attribute values (Cytoscape's convention) reads the block back unchanged.\n * @param extracted - the styles\n * @param options - whether to write the style columns inside the block\n * @returns the block's JSON text\n * @category Styles\n */\nexport function writeStyleBlock(extracted: ExtractedStyles, options: WriteStyleBlockOptions = {}): string {\n const { styles, columns, fingerprint } = extracted;\n const out: Record<string, unknown> = {\n version: 1,\n source: styles.source,\n units: styles.units,\n graph: styles.graph,\n rules: styles.rules,\n columns: { node: Array.from(columns.node.keys()), edge: Array.from(columns.edge.keys()) },\n };\n const booleanKeys = (byKey: ReadonlyMap<string, StyleColumn>): string[] =>\n Array.from(byKey)\n .filter(([, col]) => col.some((x) => x !== null) && col.every((x) => x === null || typeof x === \"boolean\"))\n .map(([key]) => key);\n const booleans = { node: booleanKeys(columns.node), edge: booleanKeys(columns.edge) };\n if (booleans.node.length > 0 || booleans.edge.length > 0) {\n out.booleans = booleans;\n }\n if (options.inlineColumns === true) {\n if (options.snapshot !== undefined) {\n const { ids, nodeCount } = options.snapshot;\n out.order = Array.from({ length: nodeCount }, (_unused, i) => String(ids.idOf(i)));\n }\n // an edge's values are listed once per edge the file holds\n const held = options.snapshot === undefined ? null : heldEdgeRows(options.snapshot);\n out.values = {\n node: Object.fromEntries(columns.node),\n edge: Object.fromEntries(\n Array.from(columns.edge, ([key, col]) => [key, held === null ? col : held.map((e) => col[e] ?? null)]),\n ),\n };\n }\n const { snapshot } = options;\n if (snapshot !== undefined) {\n const hashes = (target: StyleTarget): Record<string, string> => {\n const table = target === \"node\" ? snapshot.nodes : snapshot.edges;\n const n = target === \"node\" ? snapshot.nodeCount : snapshot.edgeCount;\n // a name the reader refuses as a key is left out: its rules then find the column by its name alone\n const read = dataNames(styles.rules.filter((r) => r.target === target))\n .filter((c) => table.has(c) && !FORBIDDEN_KEYS.has(c) && c.length <= MAX_NAME)\n .slice(0, MAX_RULES);\n return Object.fromEntries(read.map((c) => [c, columnHash(table, c, n)]));\n };\n out.data = { node: hashes(\"node\"), edge: hashes(\"edge\") };\n }\n out.fingerprint = {\n nodes: fingerprint.nodes,\n edges: fingerprint.heldEdges ?? fingerprint.edges,\n ids: fingerprint.ids,\n };\n return JSON.stringify(out).replaceAll(/\\\\(.)/g, (escape, c: string) => SAFE_ESCAPES[c] ?? escape);\n}\n\n/**\n * The loss when graph-io would ignore a block it has just written: one longer than `MAX_STYLE_BLOCK_LENGTH`, or one\n * past another limit the reader enforces (too many rules, a name too long). The format's own styles are still\n * written, so importing the file back infers the rules again from them.\n * @param text - the block's text, as `writeStyleBlock()` wrote it\n * @param rules - how many rules the block holds\n * @param check - \"size\" to check only the length: a block rewritten with its columns inline, whose rules were\n * checked already\n * @returns one `W_STYLE_RULES_NOT_KEPT` note naming the reason, or none when the block reads back\n * @category Styles\n */\nexport function styleBlockLosses(text: string, rules: number, check: \"all\" | \"size\" = \"all\"): LossNote[] {\n let reason: StyleBlockIgnoredReason | null = null;\n if (text.length > MAX_STYLE_BLOCK_LENGTH) {\n reason = \"TOO_LARGE\";\n } else if (check === \"all\") {\n const top = JSON.parse(text) as { fingerprint: { nodes: number; edges: number; ids: string } };\n const { nodes, edges, ids } = top.fingerprint;\n const parsed = parseStyleBlock(text, { nodes, edges, ids });\n reason = parsed.ok ? null : parsed.reason;\n }\n if (reason === null) {\n return [];\n }\n return [\n Object.freeze({\n code: STYLE_ISSUE.RULES_NOT_KEPT,\n message: `the ${STYLE_BLOCK_NAME} block would not read back (${reason}): the styles are written as the format's own, and importing the file infers the rules again`,\n column: null,\n count: rules,\n }),\n ];\n}\n\n/**\n * What `parseStyleBlock()` found: a valid block, or the reason it is ignored.\n * @category Styles\n */\nexport type ParsedStyleBlock =\n | {\n /** The block is valid and describes this graph. */\n readonly ok: true;\n /** The block. */\n readonly block: StyleBlock;\n }\n | {\n /** The block is ignored. */\n readonly ok: false;\n /** Why. */\n readonly reason: StyleBlockIgnoredReason;\n };\n\n/** Thrown inside the validator only; turned into an `INVALID` result before parseStyleBlock() returns. */\nclass Invalid extends Error {}\n\n/**\n * Fails validation: throws `Invalid`, which parseStyleBlock() turns into an `INVALID` result.\n * @throws Invalid always\n */\nfunction invalid(): never {\n throw new Invalid();\n}\n\n/**\n * Reads a `graphty.styles` block as untrusted input. It never throws: a block that is not text, too large, not JSON,\n * of another version, nested too deep, holding a key that reaches a prototype (`__proto__`), shaped wrongly or\n * written for a different graph is ignored with the reason.\n * @param text - the block's text, as the file holds it\n * @param fingerprint - the graph being imported (`styleFingerprint(snapshot)`)\n * @returns the block, or why it is ignored\n * @category Styles\n */\nexport function parseStyleBlock(text: unknown, fingerprint: StyleFingerprint): ParsedStyleBlock {\n if (typeof text !== \"string\") {\n return { ok: false, reason: \"INVALID\" };\n }\n if (text.length > MAX_STYLE_BLOCK_LENGTH) {\n return { ok: false, reason: \"TOO_LARGE\" };\n }\n let json: unknown;\n try {\n json = JSON.parse(text);\n } catch {\n return { ok: false, reason: \"NOT_JSON\" };\n }\n if (!safeTree(json)) {\n return { ok: false, reason: \"INVALID\" };\n }\n const top = isObject(json) ? json : null;\n if (top === null) {\n return { ok: false, reason: \"INVALID\" };\n }\n if (top.version !== 1) {\n return { ok: false, reason: \"VERSION\" };\n }\n // a block for another graph says so, whatever else in it would not fit this one\n const fp = isObject(top.fingerprint) ? top.fingerprint : null;\n if (\n fp !== null &&\n (fp.nodes !== fingerprint.nodes ||\n fp.edges !== (fingerprint.heldEdges ?? fingerprint.edges) ||\n fp.ids !== fingerprint.ids)\n ) {\n return { ok: false, reason: \"FINGERPRINT\" };\n }\n let block: StyleBlock;\n try {\n block = readBlock(top);\n } catch (err) {\n if (err instanceof Invalid) {\n return { ok: false, reason: \"INVALID\" };\n }\n throw err;\n }\n const f = block.fingerprint;\n if (\n f.nodes !== fingerprint.nodes ||\n f.edges !== (fingerprint.heldEdges ?? fingerprint.edges) ||\n f.ids !== fingerprint.ids\n ) {\n return { ok: false, reason: \"FINGERPRINT\" };\n }\n return { ok: true, block };\n}\n\n/**\n * Whether a parsed JSON value is at most `MAX_DEPTH` deep and holds no key that reaches a prototype. Walked with an\n * explicit stack, never by recursion.\n * @param root - the parsed value\n * @returns true when safe\n */\nfunction safeTree(root: unknown): boolean {\n const stack: [unknown, number][] = [[root, 0]];\n while (stack.length > 0) {\n const [v, depth] = stack.pop() as [unknown, number];\n if (v === null || typeof v !== \"object\") {\n continue;\n }\n if (depth >= MAX_DEPTH || (!Array.isArray(v) && Object.keys(v).some((key) => FORBIDDEN_KEYS.has(key)))) {\n return false;\n }\n const items: unknown[] = Array.isArray(v) ? v : Object.values(v);\n for (const item of items) {\n if (item !== null && typeof item === \"object\") {\n stack.push([item, depth + 1]);\n }\n }\n }\n return true;\n}\n\n/**\n * Whether a value is a plain JSON object (not an array, not null).\n * @param v - the value\n * @returns true for an object\n */\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === \"object\" && !Array.isArray(v);\n}\n\n/**\n * A short string, or invalid.\n * @param v - the value\n * @returns the string\n */\nfunction name(v: unknown): string {\n return typeof v === \"string\" && v.length <= MAX_NAME ? v : invalid();\n}\n\n/**\n * A short string or null, or invalid.\n * @param v - the value\n * @returns the string or null\n */\nfunction nameOrNull(v: unknown): string | null {\n return v === null || v === undefined ? null : name(v);\n}\n\n/**\n * Whether a value is a scalar: a string, a finite number or a boolean.\n * @param v - the value\n * @returns true for a scalar\n */\nfunction isScalar(v: unknown): v is Scalar {\n return typeof v === \"string\" || typeof v === \"boolean\" || (typeof v === \"number\" && Number.isFinite(v));\n}\n\n/**\n * A scalar, or invalid.\n * @param v - the value\n * @returns the scalar\n */\nfunction scalar(v: unknown): Scalar {\n return isScalar(v) ? v : invalid();\n}\n\n/**\n * An array, or invalid.\n * @param v - the value\n * @param max - the most items allowed\n * @returns the array\n */\nfunction array(v: unknown, max: number): readonly unknown[] {\n return Array.isArray(v) && v.length <= max ? v : invalid();\n}\n\n/**\n * The whole block.\n * @param top - the parsed object\n * @returns the block\n */\nfunction readBlock(top: Record<string, unknown>): StyleBlock {\n const source = isObject(top.source) ? top.source : invalid();\n const units = isObject(top.units) ? top.units : invalid();\n const length = units.length === \"px\" || units.length === \"relative\" ? units.length : invalid();\n const fp = isObject(top.fingerprint) ? top.fingerprint : invalid();\n const count = (v: unknown): number => (typeof v === \"number\" && Number.isSafeInteger(v) && v >= 0 ? v : invalid());\n const cols = isObject(top.columns) ? top.columns : invalid();\n const block: StyleBlock = {\n version: 1,\n source: { format: name(source.format), dialect: nameOrNull(source.dialect), tool: nameOrNull(source.tool) },\n units: { length },\n graph: values(top.graph ?? {}),\n rules: array(top.rules, MAX_RULES).map(readRule),\n columns: {\n node: array(cols.node, MAX_RULES).map(name),\n edge: array(cols.edge, MAX_RULES).map(name),\n },\n fingerprint: { nodes: count(fp.nodes), edges: count(fp.edges), ids: name(fp.ids) },\n };\n const read = top.data === undefined ? block : { ...block, data: readData(top.data) };\n const withData = top.booleans === undefined ? read : { ...read, booleans: readBooleans(top.booleans) };\n if (top.values === undefined) {\n return withData;\n }\n const order = top.order === undefined ? undefined : readOrder(top.order, block.fingerprint.nodes);\n const inline = readInline(top.values, block);\n return { ...withData, ...(order === undefined ? {} : { order }), values: inline };\n}\n\n/**\n * The boolean style columns of a block, by target.\n * @param v - the parsed `booleans` member\n * @returns the column keys\n */\nfunction readBooleans(v: unknown): NonNullable<StyleBlock[\"booleans\"]> {\n const booleans = isObject(v) ? v : invalid();\n return {\n node: array(booleans.node ?? [], MAX_RULES).map(name),\n edge: array(booleans.edge ?? [], MAX_RULES).map(name),\n };\n}\n\n/**\n * The node ids of a block, in the order its inline values list the nodes.\n * @param v - the parsed `order` member\n * @param nodes - the node count of its fingerprint\n * @returns the ids\n */\nfunction readOrder(v: unknown, nodes: number): string[] {\n const order = array(v, nodes).map((id) => (typeof id === \"string\" ? id : invalid()));\n return order.length === nodes ? order : invalid();\n}\n\n/**\n * The style columns written inside a block: one value per node or edge for each column the block names.\n * @param v - the parsed `values` member\n * @param block - the block read so far\n * @returns the columns, by target\n */\nfunction readInline(v: unknown, block: StyleBlock): { node: Map<string, StyleColumn>; edge: Map<string, StyleColumn> } {\n const values = isObject(v) ? v : invalid();\n const inline = { node: new Map<string, StyleColumn>(), edge: new Map<string, StyleColumn>() };\n for (const target of TARGETS) {\n const n = target === \"node\" ? block.fingerprint.nodes : block.fingerprint.edges;\n const byKey = isObject(values[target]) ? values[target] : invalid();\n for (const key of block.columns[target]) {\n const col = array(Object.hasOwn(byKey, key) ? byKey[key] : invalid(), n);\n if (col.length !== n) {\n invalid();\n }\n inline[target].set(\n key,\n col.map((x) => (x === null ? null : scalar(x))),\n );\n }\n }\n return inline;\n}\n\n/**\n * The data column hashes of a block.\n * @param v - the parsed `data` member\n * @returns the hashes by column name, per target\n */\nfunction readData(v: unknown): NonNullable<StyleBlock[\"data\"]> {\n const d = isObject(v) ? v : invalid();\n const byTarget = (t: unknown): Map<string, string> => {\n const o = isObject(t) ? t : invalid();\n const keys = Object.keys(o);\n if (keys.length > MAX_RULES) {\n invalid();\n }\n return new Map(keys.map((k) => [name(k), name(o[k])]));\n };\n return { node: byTarget(d.node), edge: byTarget(d.edge) };\n}\n\n/**\n * A cell's value as text: a list as JSON, no value as a character no text holds.\n * @param v - the cell\n * @returns the text\n */\nfunction cellText(v: unknown): string {\n if (v === null) {\n return \"\\u0001\";\n }\n if (typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\") {\n return String(v);\n }\n return JSON.stringify(v);\n}\n\n/**\n * A hash of a column's values as text, by element index: the text of a value, so a format that reads the number 7\n * back as \"7\" keeps the hash.\n * @param table - the node or edge table\n * @param column - the column's name\n * @param n - the element count\n * @returns the hash\n */\nfunction columnHash(table: GraphSnapshot[\"nodes\"], column: string, n: number): string {\n let h1 = 0x811c9dc5;\n let h2 = 0x01000193 ^ 0x5bd1e995;\n for (let i = 0; i < n; i++) {\n const text = `${cellText(plainCell(table.value(column, i)))}\\u0000`;\n for (let c = 0; c < text.length; c++) {\n const code = text.charCodeAt(c); // NOSONAR(S7758): hashes UTF-16 code units; code points would change every written hash\n h1 = Math.imul(h1 ^ code, 0x01000193);\n h2 = Math.imul(h2 ^ code, 0x01000193) ^ (h2 >>> 13);\n }\n }\n const hex = (h: number): string => (h >>> 0).toString(16).padStart(8, \"0\");\n return hex(h1) + hex(h2);\n}\n\n/**\n * Every data column some rule reads, in first-read order. A rule's `ext` is the consumer's own and is not read.\n * @param rules - the rules\n * @returns the column names\n */\nfunction dataNames(rules: readonly StyleRule[]): string[] {\n const out = new Set<string>();\n for (const { ext: _ext, ...rule } of rules) {\n JSON.stringify(rule, (_k, v: unknown) => {\n if (isObject(v) && typeof v.data === \"string\" && Object.keys(v).length === 1) {\n out.add(v.data);\n }\n return v;\n });\n }\n return [...out];\n}\n\n/**\n * A rule with its data column references renamed; its `ext` is kept untouched.\n * @param rule - the rule\n * @param rename - the new name of each column that moved\n * @returns the rule\n */\nfunction renameData(rule: StyleRule, rename: ReadonlyMap<string, string>): StyleRule {\n const { ext, ...rest } = rule;\n const moved = JSON.parse(\n JSON.stringify(rest, (_k, v: unknown) =>\n isObject(v) && typeof v.data === \"string\" && Object.keys(v).length === 1 && rename.has(v.data)\n ? { data: rename.get(v.data) }\n : v,\n ),\n ) as StyleRule;\n return ext === undefined ? moved : { ...moved, ext };\n}\n\n/**\n * Where each data column a block's rules read is in the imported graph: under its own name when its values are the\n * same, else the first column holding the same values (a format that renamed it), else under its own name.\n * @param block - the block\n * @param snapshot - the graph\n * @param target - nodes or edges\n * @returns the new name of each column that moved\n */\nfunction movedColumns(block: StyleBlock, snapshot: GraphSnapshot, target: StyleTarget): Map<string, string> {\n const moved = new Map<string, string>();\n const want = block.data?.[target];\n if (want === undefined || want.size === 0) {\n return moved;\n }\n const table = target === \"node\" ? snapshot.nodes : snapshot.edges;\n const n = target === \"node\" ? snapshot.nodeCount : snapshot.edgeCount;\n let have: Map<string, string> | null = null;\n for (const [column, hash] of want) {\n if (table.has(column) && columnHash(table, column, n) === hash) {\n continue;\n }\n have ??= new Map(Array.from(table.names(), (c) => [c, columnHash(table, c, n)]));\n for (const [c, h] of have) {\n if (h === hash) {\n moved.set(column, c);\n break;\n }\n }\n }\n return moved;\n}\n\n/**\n * A record of style values, copied into a null-prototype object.\n * @param v - the parsed record\n * @returns the copy\n */\nfunction values(v: unknown): Record<string, StyleValue> {\n const o = isObject(v) ? v : invalid();\n const out = Object.create(null) as Record<string, StyleValue>;\n for (const key of Object.keys(o)) {\n out[name(key)] = scalar(o[key]);\n }\n return out;\n}\n\n/**\n * One rule.\n * @param v - the parsed rule\n * @returns the rule\n */\nfunction readRule(v: unknown): StyleRule {\n const r = isObject(v) ? v : invalid();\n const target = r.target === \"node\" || r.target === \"edge\" ? r.target : invalid();\n const rule: {\n -readonly [K in keyof StyleRule]: StyleRule[K];\n } = {\n id: name(r.id),\n target,\n role: name(r.role),\n origin: name(r.origin),\n where: predicate(r.where),\n };\n if (r.set !== undefined) {\n rule.set = values(r.set);\n }\n if (r.map !== undefined) {\n const m = isObject(r.map) ? r.map : invalid();\n const map = Object.create(null) as Record<string, Mapping>;\n for (const key of Object.keys(m)) {\n map[name(key)] = mapping(m[key]);\n }\n rule.map = map;\n }\n if (r.facts !== undefined) {\n rule.facts = facts(r.facts);\n }\n if (r.ext !== undefined) {\n // carried untouched for the consumer that wrote it; safeTree() already checked its keys and depth\n rule.ext = isObject(r.ext) ? r.ext : invalid();\n }\n return rule;\n}\n\n/**\n * A column reference.\n * @param v - the parsed reference\n * @returns the reference\n */\nfunction columnRef(v: unknown): ColumnRef {\n const o = isObject(v) ? v : invalid();\n if (typeof o.data === \"string\") {\n return { data: name(o.data) };\n }\n if (typeof o.style === \"string\") {\n return { style: name(o.style) };\n }\n if (typeof o.computed === \"string\" && COMPUTED.has(o.computed)) {\n return { computed: o.computed as \"degree\" | \"indegree\" | \"outdegree\" };\n }\n return invalid();\n}\n\n/**\n * A predicate. A predicate of a kind this version does not know is kept as it is and matches nothing.\n * @param v - the parsed predicate\n * @returns the predicate\n */\nfunction predicate(v: unknown): Predicate {\n const o = isObject(v) ? v : invalid();\n if (\"all\" in o) {\n return o.all === true ? { all: true } : invalid();\n }\n if (\"has\" in o) {\n return { has: columnRef(o.has) };\n }\n if (\"eq\" in o) {\n const t = array(o.eq, 2);\n return t.length === 2 ? { eq: [columnRef(t[0]), scalar(t[1])] } : invalid();\n }\n if (\"in\" in o) {\n const t = array(o.in, 2);\n return t.length === 2 ? { in: [columnRef(t[0]), array(t[1], 65536).map(scalar)] } : invalid();\n }\n if (\"and\" in o) {\n return { and: array(o.and, 64).map(predicate) };\n }\n if (\"or\" in o) {\n return { or: array(o.or, 64).map(predicate) };\n }\n if (\"not\" in o) {\n return { not: predicate(o.not) };\n }\n return o as Predicate;\n}\n\n/**\n * A mapping. A mapping of a kind this version does not know is kept and gives no value.\n * @param v - the parsed mapping\n * @returns the mapping\n */\nfunction mapping(v: unknown): Mapping {\n const o = isObject(v) ? v : invalid();\n const by = columnRef(o.by);\n switch (o.kind) {\n case \"passthrough\":\n return { kind: \"passthrough\", by };\n case \"discrete\":\n return {\n kind: \"discrete\",\n by,\n table: array(o.table, 1 << 20).map((pair) => {\n const p = array(pair, 2);\n return p.length === 2 ? ([scalar(p[0]), scalar(p[1])] as const) : invalid();\n }),\n };\n case \"continuous\":\n return {\n kind: \"continuous\",\n by,\n points: array(o.points, 4096).map((pt): ContinuousPoint => {\n const q = isObject(pt) ? pt : invalid();\n return {\n at: typeof q.at === \"number\" && Number.isFinite(q.at) ? q.at : invalid(),\n below: scalar(q.below),\n value: scalar(q.value),\n above: scalar(q.above),\n };\n }),\n };\n default:\n return { ...o, kind: name(o.kind), by } as unknown as Mapping;\n }\n}\n\n/**\n * A rule's facts: the known members, each checked; anything else is left out.\n * @param v - the parsed facts\n * @returns the facts\n */\nfunction facts(v: unknown): StyleRuleFacts {\n const o = isObject(v) ? v : invalid();\n const count = (x: unknown): number | undefined =>\n typeof x === \"number\" && Number.isSafeInteger(x) && x >= 0 ? x : undefined;\n const out: { -readonly [K in keyof StyleRuleFacts]: StyleRuleFacts[K] } = {};\n const elements = count(o.elements);\n const classes = count(o.classes);\n const distinctValues = count(o.distinctValues);\n if (elements !== undefined) {\n out.elements = elements;\n }\n if (classes !== undefined) {\n out.classes = classes;\n }\n if (distinctValues !== undefined) {\n out.distinctValues = distinctValues;\n }\n if (typeof o.reason === \"string\") {\n out.reason = name(o.reason);\n }\n if (o.names !== undefined) {\n out.names = array(o.names, 1 << 20).map((pair) => {\n const p = array(pair, 2);\n return p.length === 2 ? ([scalar(p[0]), String(scalar(p[1]))] as const) : invalid();\n });\n }\n return out;\n}\n\n/**\n * The style columns a block's rules read, from the block itself or from the tagged element attributes of the\n * snapshot; null when one is missing.\n * @param block - the block\n * @param snapshot - the graph\n * @param target - nodes or edges\n * @returns the columns by key, or null\n */\nfunction blockColumns(\n block: StyleBlock,\n snapshot: GraphSnapshot,\n target: StyleTarget,\n): Map<string, StyleColumn> | null {\n const out = new Map<string, StyleColumn>();\n const table = target === \"node\" ? snapshot.nodes : snapshot.edges;\n const n = target === \"node\" ? snapshot.nodeCount : snapshot.edgeCount;\n for (const key of block.columns[target]) {\n const inline = block.values?.[target].get(key);\n if (inline !== undefined) {\n out.set(key, target === \"node\" ? inNodeOrder(block, snapshot, inline) : onEdgeRows(snapshot, inline));\n continue;\n }\n const tag = styleTag(target, key);\n if (!table.has(tag)) {\n return null;\n }\n const col = Array.from({ length: n }, (_, i): StyleValue | null => {\n const v = plainCell(table.value(tag, i));\n return isScalar(v) ? v : null;\n });\n out.set(key, target === \"edge\" ? withPairValues(snapshot, col) : col);\n }\n return out;\n}\n\n/**\n * The style columns the block lists as booleans, as booleans: a format with no booleans (GML) holds them as 0 and 1\n * (or their text).\n * @param block - the block\n * @param columns - the style columns per target, changed in place\n */\nfunction asBooleans(block: StyleBlock, columns: Record<StyleTarget, Map<string, StyleColumn>>): void {\n for (const target of TARGETS) {\n for (const key of block.booleans?.[target] ?? []) {\n const col = columns[target].get(key);\n if (col !== undefined) {\n columns[target].set(key, col.map(asBoolean));\n }\n }\n }\n}\n\n/**\n * A value of a boolean style column as a boolean: 1 and 0, and their text, as GML and untyped formats hold them.\n * @param v - the value read\n * @returns the boolean, or the value when it is neither\n */\nfunction asBoolean(v: StyleValue | null): StyleValue | null {\n if (v === 1 || v === \"1\" || v === \"true\") {\n return true;\n }\n return v === 0 || v === \"0\" || v === \"false\" ? false : v;\n}\n\n/**\n * Inline node values in the order of the graph read back: by each node's id, when the block lists the order it wrote\n * them in and the file read its nodes back in another.\n * @param block - the block\n * @param snapshot - the graph\n * @param col - the values in the block's order\n * @returns the values per node row\n */\nfunction inNodeOrder(block: StyleBlock, snapshot: GraphSnapshot, col: StyleColumn): StyleColumn {\n const { order } = block;\n if (order === undefined || order.every((id, i) => id === String(snapshot.ids.idOf(i)))) {\n return col;\n }\n const at = new Map<string, number>();\n order.forEach((id, i) => {\n if (!at.has(id)) {\n at.set(id, i);\n }\n });\n return Array.from(\n { length: snapshot.nodeCount },\n (_unused, i) => col[at.get(String(snapshot.ids.idOf(i))) ?? -1] ?? null,\n );\n}\n\n/**\n * Inline edge values, listed once per edge the file holds, per edge row: both halves of an undirected edge in a\n * directed graph take the edge's value.\n * @param snapshot - the graph\n * @param col - the values per held edge\n * @returns the values per edge row\n */\nfunction onEdgeRows(snapshot: GraphSnapshot, col: StyleColumn): StyleColumn {\n const held = heldEdgeRows(snapshot);\n if (held.length === snapshot.edgeCount) {\n return col;\n }\n const out = new Array<StyleValue | null>(snapshot.edgeCount).fill(null);\n held.forEach((e, k) => {\n out[e] = col[k] ?? null;\n });\n return withPairValues(snapshot, out);\n}\n\n/**\n * Per-edge values with each half of an undirected edge in a directed graph given its other half's value where it has\n * none: the file holds the edge once, and the format reads its values onto one half.\n * @param snapshot - the graph\n * @param col - the values per edge row\n * @returns the values\n */\nfunction withPairValues(snapshot: GraphSnapshot, col: (StyleValue | null)[]): (StyleValue | null)[] {\n const pair = snapshot.edges.byRole(\"pair\");\n if (pair === null) {\n return col;\n }\n for (let i = 0; i < col.length; i++) {\n if (col[i] === null && pair.isSet(i)) {\n col[i] = col[pair.value(i) as number] ?? null;\n }\n }\n return col;\n}\n\n/** The color property whose alpha carries an opacity, and that opacity, per target. */\nconst ALPHA_SLOT: Readonly<Record<StyleTarget, readonly [string, string]>> = {\n node: [\"fill\", \"fillOpacity\"],\n edge: [\"color\", \"opacity\"],\n};\n\n/**\n * The native values with opacity 1 wherever the color is opaque (it has a color and no opacity) and the rules give a\n * translucent opacity: a format that writes the opacity as the color's alpha states 1 with an opaque color.\n * @param values - the native values of one target\n * @param target - nodes or edges\n * @param rules - the block's rules\n * @param src - the values the rules read\n * @param n - the element count\n * @returns the values, the opacity column replaced where it changes\n */\nfunction opaqueColors(\n values: Partial<Record<string, StyleColumn>>,\n target: StyleTarget,\n rules: readonly StyleRule[],\n src: ReturnType<typeof refSource>,\n n: number,\n): Partial<Record<string, StyleColumn>> {\n const [colorProperty, opacityProperty] = ALPHA_SLOT[target];\n const color = values[colorProperty];\n if (color === undefined) {\n return values;\n }\n const native = values[opacityProperty];\n const resolved = resolveRules(rules, target, opacityProperty, src);\n let out: (StyleValue | null)[] | null = null;\n for (let i = 0; i < n; i++) {\n const r = resolved[i];\n if ((color[i] ?? null) !== null && (native?.[i] ?? null) === null && r !== null && r !== 1) {\n out ??= native === undefined ? new Array<StyleValue | null>(n).fill(null) : [...native];\n out[i] = 1;\n }\n }\n return out === null ? values : { ...values, [opacityProperty]: out };\n}\n\n/**\n * A name not yet taken: the base, else the base with `#2`, `#3` and so on.\n * @param taken - whether a name is taken\n * @param base - the preferred name\n * @returns the name\n */\nfunction freeName(taken: (name: string) => boolean, base: string): string {\n let name = base;\n let k = 2;\n while (taken(name)) {\n name = `${base}#${String(k)}`;\n k++;\n }\n return name;\n}\n\n/**\n * Whether a property's values are text: an empty text draws what no text draws, so a format that holds no \"unset\"\n * (CyCSV) reads one back as \"\".\n * @param target - nodes or edges\n * @param property - the property\n * @returns true for text\n */\nfunction textProperty(target: StyleTarget, property: string): boolean {\n return STYLE_PROPERTIES[target].get(property) === \"text\";\n}\n\n/**\n * The elements whose native value differs from what the rules give: another program edited them. Where the rules\n * give no value, the program's own drawing of an unset property, and an empty text, are no edit.\n * @param values - the native values\n * @param resolved - what the rules give\n * @param unset - what the writing program draws for the unset property, or undefined\n * @param text - whether the property is text\n * @returns the edited values, null where an element is not edited; null when none is\n */\nfunction editedValues(\n values: readonly (StyleValue | null)[],\n resolved: readonly (StyleValue | null)[],\n unset: StyleValue | undefined,\n text: boolean,\n): (StyleValue | null)[] | null {\n const empty = text ? \"\" : undefined;\n let exceptions: (StyleValue | null)[] | null = null;\n for (let i = 0; i < resolved.length; i++) {\n const t = values[i] ?? null;\n const unchanged = resolved[i] === null && (t === unset || t === empty);\n if (t !== null && !within(t, resolved[i]) && !unchanged) {\n exceptions ??= new Array<StyleValue | null>(resolved.length).fill(null);\n exceptions[i] = t;\n }\n }\n return exceptions;\n}\n\n/**\n * The passthrough mappings of the elements whose native value differs from what the rules give, each over a new\n * exceptions column.\n * @param own - the native per-element values by property\n * @param rules - the block's rules\n * @param target - nodes or edges\n * @param src - what the rules read\n * @param columns - the target's style columns, added to\n * @param unsetOf - what the writing program draws for an unset property\n * @returns the mappings by property, empty when nothing was edited\n */\nfunction exceptionMappings(\n own: Partial<Record<string, StyleColumn>>,\n rules: readonly StyleRule[],\n target: StyleTarget,\n src: ReturnType<typeof refSource>,\n columns: Map<string, StyleColumn>,\n unsetOf: (property: string) => StyleValue | undefined,\n): Record<string, Mapping> {\n const map = Object.create(null) as Record<string, Mapping>;\n // in one order whatever order the reader found the properties in, so a file written again is the same\n for (const [property, values] of Object.entries(own).sort(([a], [b]) => (a < b ? -1 : 1))) {\n if (values === undefined) {\n continue;\n }\n const resolved = resolveRules(rules, target, property, src);\n const exceptions = editedValues(values, resolved, unsetOf(property), textProperty(target, property));\n if (exceptions !== null) {\n const key = freeName((k) => columns.has(k), `exceptions.${property}`);\n columns.set(key, exceptions);\n map[property] = { kind: \"passthrough\", by: { style: key } };\n }\n }\n return map;\n}\n\n/**\n * The styles a valid block describes, read against the graph it was imported into. The block's rules are the\n * file's declared rules and read the tagged per-element values. Where the file's own native values are given, they\n * are the truth: an element whose value differs from what the rules give (another program edited it) is written\n * into one exceptions rule on top, so the styles stay exact and, with no edit, are the block's rules unchanged.\n * @param block - a block `parseStyleBlock()` accepted for this graph\n * @param snapshot - the graph\n * @param format - the format the file was read as\n * @param truth - the native per-element values per target and property, when the format has any\n * @param notes - notes to carry (the reader's own)\n * @param tool - the program whose drawing the native values describe: where the rules give an element no value and\n * the file holds only what that program draws for an unset property (a font written with \"plain\" style), it is not\n * an edit\n * @param opacityInColor - whether the format writes a fill's and an edge's opacity as its color's alpha: a native\n * color with no native opacity then states opacity 1 where the rules give a translucent one\n * @returns the styles, or null when a style column the rules read is missing from the file\n * @category Styles\n */\nexport function blockStyles(\n block: StyleBlock,\n snapshot: GraphSnapshot,\n format: string,\n truth: Partial<Record<StyleTarget, Partial<Record<string, StyleColumn>>>> = {},\n notes: readonly StyleNote[] = [],\n tool: StyleTool | null = null,\n opacityInColor = false,\n): ExtractedStyles | null {\n const node = blockColumns(block, snapshot, \"node\");\n const edge = blockColumns(block, snapshot, \"edge\");\n if (node === null || edge === null) {\n return null;\n }\n const columns = { node, edge };\n asBooleans(block, columns);\n const features = { node: featuresOf(snapshot, \"node\"), edge: featuresOf(snapshot, \"edge\") };\n // a data column the file holds under another name is read there\n const moved = { node: movedColumns(block, snapshot, \"node\"), edge: movedColumns(block, snapshot, \"edge\") };\n const blockRules = block.rules.map((r) => (moved[r.target].size === 0 ? r : renameData(r, moved[r.target])));\n const rules: StyleRule[] = [...blockRules];\n for (const target of TARGETS) {\n const n = target === \"node\" ? snapshot.nodeCount : snapshot.edgeCount;\n const src = refSource(target, n, columns[target], features[target], snapshot);\n const own = opacityInColor ? opaqueColors(truth[target] ?? {}, target, blockRules, src, n) : truth[target];\n const unsetOf = (property: string): StyleValue | undefined =>\n (\n (tool === null ? null : toolDefaults(tool))?.[target]?.[property as never] as\n { readonly value: StyleValue } | undefined\n )?.value;\n const map = exceptionMappings(own ?? {}, blockRules, target, src, columns[target], unsetOf);\n if (Object.keys(map).length > 0) {\n // the block's own rules may hold an exceptions rule already (a file graphty wrote from an edited one)\n const id = freeName((x) => rules.some((r) => r.id === x), `${target}.exceptions`);\n rules.push({\n id,\n target,\n role: \"exceptions\",\n origin: \"inferred\",\n where: { all: true },\n map,\n });\n }\n }\n return {\n styles: {\n version: 1,\n source: { format, dialect: \"graphty\", tool: \"graphty\" },\n units: block.units,\n graph: block.graph,\n rules,\n notes,\n },\n columns,\n features,\n fingerprint: styleFingerprint(snapshot),\n };\n}\n"],"names":["DECIMAL","num6","VIS","v","table","name","hex2","mapping","channels","c","values"],"mappings":"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"}