phase: 180_markdown_inline_links_images
All verification complete. Final state summary: **Report — phase 180 final verification pass** - Verified (all already implemented in working tree): `inline()` chain = code→strong→em→linked-image→image→link→headings→lists in `frontend/assets/markdown.js`; `allowLinkUrl`/`allowImageUrl` allowlists (A5), shared `mdAnchorOpen` (target/rel only for absolute http(s)); `####`→`<h5>`, `#####`/`######`→`<h6>`, `#`/`##`→`<h3>`/`###`→`<h4>` unchanged; `.md-link`/`.md-img`/h5-h6 scale in `styles.css` (palette vars only). All surfaces (chat, thinking, restore, viewer, modal) route through the one renderer (pinned in `app.js`/`document.js`). - Completion criteria: - `[text](url)`→`a.md-link`, `javascript:`/`data:` inert — ✅ (node probe + unit + E2E) - ``→`img.md-img loading="lazy"` with `alt`; bad src inert — ✅ - `####`/`#####`/`######` ladder; shallow rungs unchanged — ✅ - Fenced link/image/`####` stay code; cell-level link renders in `.md-table` — ✅ (node probe) - Byte-identity fixture + phase-44/138 suites pass unedited (git-verified untouched; 6 + 3 E2E pass in isolation) — ✅ - `uv run pytest --cov=app --cov-report=term-missing`: **4198 passed, TOTAL 99%**; `uv run pytest tests/e2e/test_markdown_inline_links_images.py -v --no-cov`: **4 passed**; `uv run ruff check .`: clean; `uv run pyright`: **0 errors** — ✅ - Docs: full README/AGENTS.md review vs the whole project — env-example↔README table complete, page routes match `app/main.py`, AGENTS quick-ref artifacts exist. Fixed 1 inconsistency: README understated the image allowlist (impl per task 02 accepts first segments ≤2 chars, `^.{0,2}/`, not only `./`/`../`); phase-180 paragraphs otherwise accurate. - Notable: image allowlist `.{0,2}/` is broader than the overview's `^\.{1,2}/` but is what task 02 explicitly specifies and the docstring documents — not a deviation from the tasks; SVG sizing deliberately deferred to phase 181. - Next pending phase: `181_svg_document_preview`.
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
# Homelab Inline Markdown Notes
|
||||
|
||||
The homelab runbook keeps its links and its topology diagram inline in
|
||||
every markdown note, so the links and the image render in place.
|
||||
|
||||
The backup job publishes an [absolute link](https://example.com/a?x=1&y=2),
|
||||
a [relative link](/sources), a [mail link](mailto:reese@example.com) and
|
||||
an [anchor link](#homelab-inline-markdown-notes) in the same note.
|
||||
|
||||

|
||||
|
||||
An unsafe reference stays plain text in the note:
|
||||
[oops](javascript:alert(1)) for a link and
|
||||
) for an image.
|
||||
|
||||
The diagram also ships as a linked image, so clicking the topology image
|
||||
opens the runbook:
|
||||
[](https://example.com/runbook)
|
||||
|
||||
#### Deep header
|
||||
|
||||
The runbook keeps one deep header and one deeper header per section.
|
||||
|
||||
##### Deeper
|
||||
|
||||
| Note | Link |
|
||||
|---|---|
|
||||
| topology | [cell link](https://example.com) |
|
||||
|
||||
The end of the homelab inline markdown notes.
|
||||
Reference in New Issue
Block a user