graphic design tool
git clone https://git.lucas.co/cce-designer.git
docs: cce-ui's KDL writer escapes strings now
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CLAUDE.md | 12 +++++++-----
src/visualizer.rs | 11 ++++++-----
2 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/CLAUDE.md b/CLAUDE.md
index c00f3f0..01db31b 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -2947,11 +2947,13 @@ the later over the earlier, as a chain of Visualize nodes composites.
states: `State::visualizers`, persisted in the viewport block of
state.kdl and with the project's display block, so a project keeps its
own. **As one string** (`visualizer::encode` / `decode`: `key=value`
- joined by `|`, a visualizer per `;`, percent-escaped) — and not JSON,
- because cce-ui's `json_to_kdl_string` writes a string between quotes
- WITHOUT escaping the ones inside it: a JSON string came back as a line no
- parser reads, and a settings file that fails to parse is read as the
- DEFAULTS. A key the reader does not know is skipped.
+ joined by `|`, a visualizer per `;`, percent-escaped) — not JSON,
+ because when this landed cce-ui's `json_to_kdl_string` wrote a string
+ between quotes WITHOUT escaping the ones inside it: a JSON string came
+ back as a line no parser reads, and a settings file that fails to parse
+ is read as the DEFAULTS. cce-ui escapes since the same day (`kdl_quote`),
+ but the encoding stays: it is what state.kdl files already hold, and it
+ reads plainly there. A key the reader does not know is skipped.
- **They are applied to the scene, not evaluated with it.**
`rebuild_scene_geometry` evaluates the graph, keeps the result as
`State::scene_base` with its attributes and ranges
diff --git a/src/visualizer.rs b/src/visualizer.rs
index 8fee32b..26c91c8 100644
--- a/src/visualizer.rs
+++ b/src/visualizer.rs
@@ -144,11 +144,12 @@ pub fn apply_all(visualizers: &[Visualizer], geom: &mut Detail) {
/// `;`, each `key=value` pairs joined by `|`, with `%`, `|`, `;`, `=`, `"`
/// and `\` percent-escaped in the values. One string, as the marked groups
/// are one, because the KDL writer cannot be trusted with a list of
-/// records; and not JSON, because it writes a string between quotes
-/// WITHOUT escaping the ones inside it — a JSON string came back as a line
-/// no parser reads, and a settings file that fails to parse is read as the
-/// DEFAULTS. A key the reader does not know is skipped and one it lacks
-/// takes the default, so the format can grow.
+/// records; and not JSON, because the writer then put a string between
+/// quotes WITHOUT escaping the ones inside it — a JSON string came back as
+/// a line no parser reads, and a settings file that fails to parse is read
+/// as the DEFAULTS. (cce-ui escapes since 2026-10-01; this format stays,
+/// being what the files hold.) A key the reader does not know is skipped
+/// and one it lacks takes the default, so the format can grow.
pub fn encode(visualizers: &[Visualizer]) -> String {
visualizers
.iter()