Viewer: jedna reguła stylu dla węzłów typu "external"

Jedyna ingerencja w logikę viewera w tym repo, wydzielona do osobnego
commita zgodnie z ustaleniem.

Kolor węzła jest sterowany danymi ("background-color": "data(color)"),
więc odróżnienie kolorem załatwiła sama warstwa danych (poprzedni commit,
zero zmian w viewerze). Kształt już nie — cytoscape'owa tablica stylów
siedzi w viz.js. Dokładamy do niej DOKŁADNIE jedną regułę:

    selector: 'node[type = "external"]'
    shape: round-diamond, border-style: dotted, font-size: 10

To ta sama konwencja co istniejące reguły node[?stale] i
node[status = "deprecated"] — selektor po polu danych. Reguła jest
wstawiana przed node[?stale], czyli przed node:selected, więc
podświetlenie zaznaczenia nadal wygrywa.

Podmiana dzieje się w locie, na stringu wstawianym do viz.html; plik
viz.js w repo upstream pozostaje nietknięty. Jeśli upstream zmieni
kotwicę, gen_viz.py przerywa z błędem zamiast po cichu wygenerować
viewer bez reguły.

Zweryfikowane: viz.js w viz.html == upstream + ta jedna reguła (diff
bajtowy równy jej długości), viz.css nadal bajt w bajt, składnia
osadzonego JS-a sprawdzona node --check.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
oskar 2026-07-31 16:27:19 +02:00
parent c1c53d1b6c
commit 8cca477153
2 changed files with 64 additions and 0 deletions

View file

@ -272,6 +272,58 @@ def _add_external(graph: dict, concepts: list) -> None:
graph["palette"] = {**graph.get("palette", {}), EXTERNAL_TYPE: EXTERNAL_COLOR} graph["palette"] = {**graph.get("palette", {}), EXTERNAL_TYPE: EXTERNAL_COLOR}
# --- jedyna ingerencja w viewer ---------------------------------------
#
# Kolor węzła jest sterowany danymi ("background-color": "data(color)"),
# więc odróżnienie kolorem nie wymaga tykania viewera. Kształt już tak:
# cytoscape'owa tablica stylów siedzi w viz.js. Dokładamy do niej DOKŁADNIE
# jedną regułę dla typu "external", analogicznie do istniejących reguł
# `node[?stale]` i `node[status = "deprecated"]` — ta sama konwencja
# selektora po polu danych. Reguła ląduje przed `node[?stale]`, czyli przed
# `node:selected`, więc podświetlenie zaznaczenia nadal wygrywa.
#
# Plik viz.js w repo upstream pozostaje nietknięty — podmiana dzieje się
# w locie, na stringu wstawianym do viz.html.
_EXTERNAL_STYLE_ANCHOR = ' {\n selector: "node[?stale]",'
_EXTERNAL_STYLE_RULE = """ {
// DODANE (gen_viz.py): węzły linków zewnętrznych. Inny kształt niż
// koncepty, żeby jedno i drugie dało się rozróżnić bez czytania
// etykiet i niezależnie od koloru.
selector: 'node[type = "external"]',
style: {
"shape": "round-diamond",
"border-style": "dotted",
"font-size": 10,
"color": "#0f766e",
},
},
"""
_upstream_load_asset = G._load_asset
def _load_asset(name: str) -> str:
"""Upstreamowy asset; do viz.js dokłada regułę stylu dla "external"."""
asset = _upstream_load_asset(name)
if name != "viz.js":
return asset
if _EXTERNAL_STYLE_ANCHOR not in asset:
raise SystemExit(
"gen_viz.py: nie znaleziono kotwicy stylu w viz.js — upstream "
"się zmienił, popraw _EXTERNAL_STYLE_ANCHOR przed regeneracją."
)
return asset.replace(
_EXTERNAL_STYLE_ANCHOR,
_EXTERNAL_STYLE_RULE + _EXTERNAL_STYLE_ANCHOR,
1,
)
G._load_asset = _load_asset
# --- łatki na generator upstreamowy ----------------------------------- # --- łatki na generator upstreamowy -----------------------------------
_upstream_extract_links = G._extract_links _upstream_extract_links = G._extract_links

View file

@ -276,6 +276,18 @@ window.BUNDLE = {"nodes": [{"data": {"id": "oferty/alpenparks-rehrenberg", "labe
"border-color": "#0f172a", "border-color": "#0f172a",
}, },
}, },
{
// DODANE (gen_viz.py): węzły linków zewnętrznych. Inny kształt niż
// koncepty, żeby jedno i drugie dało się rozróżnić bez czytania
// etykiet i niezależnie od koloru.
selector: 'node[type = "external"]',
style: {
"shape": "round-diamond",
"border-style": "dotted",
"font-size": 10,
"color": "#0f766e",
},
},
{ {
selector: "node[?stale]", selector: "node[?stale]",
style: { style: {