Commit graph

2 commits

Author SHA1 Message Date
Kelsi
11441c8b7c feat(editor): WLNK JSON round-trip closure
Adds --export-wlnk-json / --import-wlnk-json mirroring the WCFR/WCAM
closure pattern. linkKind round-trips as both int and name string
("item"/"quest"/"spell"/"achievement"/"talent"/"trade").
requireServerLookup encodes as bool but accepts bool OR uint8 on
import. colorRGBA (uint32 quality color), linkTemplate (sprintf with
%d/%s placeholders), tooltipTemplate, and iconRule preserved
byte-identical.

All 3 presets (lnk-std / lnk-talent / lnk-quality) byte-identical
binary round-trip OK including the 4-placeholder Item template and
the 9-placeholder Achievement template.

Closes the audit gap that pre-existed for the 146th open format —
every catalog with --info/--validate now has matching JSON sidecar
flags.

CLI flag count 1508 -> 1510.
2026-05-13 11:12:56 -07:00
Kelsi
4b5b7ccd3e feat(pipeline): WLNK chat hyperlink template catalog (146th open format)
Some checks failed
Build / Build (arm64) (push) Has been cancelled
Build / Build (x86-64) (push) Has been cancelled
Build / Build (macOS arm64) (push) Has been cancelled
Build / Build (windows-arm64) (push) Has been cancelled
Build / Build (windows-x86-64) (push) Has been cancelled
Security / CodeQL (C/C++) (push) Has been cancelled
Security / Semgrep (push) Has been cancelled
Security / Sanitizer Build (ASan/UBSan) (push) Has been cancelled
Novel replacement for the implicit chat-link format templates
vanilla WoW carried in client-side LUA — each link kind (item /
quest / spell / achievement / talent / trade-skill) had a hard-
coded sprintf template baked into ChatFrame_OnHyperlinkClick
with no formal data-driven extension point. Each WLNK entry
binds one hyperlink kind to its sprintf-style chat-link
template (with %%d/%%s placeholders for link parameters),
tooltip-popup template, quality color (RGBA), icon source
rule, and server-lookup requirement flag.

Three presets covering the link-kind spectrum:
  --gen-lnk-std      4 standard hyperlink kinds (Item with
                     classic 4-rune-slot template / Quest
                     yellow / Spell white / Achievement with 9
                     placeholders for criteria-progress data)
  --gen-lnk-talent   2 less-common kinds (Talent green for
                     passive enhancements / Trade-skill recipe
                     orange with server lookup for ingredients)
  --gen-lnk-quality  3 Item-kind variants distinguished by
                     quality color (Common gray 0x9D9D9D / Epic
                     purple 0xA335EE / Legendary orange
                     0xFF8000) — chat composer picks variant by
                     item quality at link time

Validator catches: id+name+linkTemplate required, linkKind
0..5, no duplicate linkIds. CRITICAL: linkTemplate MUST contain
at least one %%d/%%s placeholder — composer would emit a static
string regardless of input (every link rendering identically
regardless of which item/spell/quest was clicked). Walks the
template character-by-character counting valid format
specifiers (%%d, %%s, %%u, %%i, %%x, %%X, with %%%% literal
double-percent excluded). Warns on > 12 placeholders (unusual,
verify intentional), colorRGBA=0 (fully transparent — link text
invisible), and requireServerLookup=true with empty
tooltipTemplate (server data has nowhere to render).

Format count 145 -> 146. CLI flag count 1508 -> 1515.
2026-05-10 06:16:37 -07:00