feat(markdown): emit asset:N hrefs for embedded images - #70
feat(markdown): emit asset:N hrefs for embedded images#70alexiskowalski wants to merge 17 commits into
Conversation
|
diff --git a/tests/snapshots/snapshots__docx__handmade-ole.docx.snap b/tests/snapshots/snapshots__docx__handmade-ole.docx.snap
index c9626e8..b9e155d 100644
--- a/tests/snapshots/snapshots__docx__handmade-ole.docx.snap
+++ b/tests/snapshots/snapshots__docx__handmade-ole.docx.snap
@@ -4,4 +4,4 @@ expression: output
---
Before the object
-Embedded object: Excel.Sheet.12
+
diff --git a/tests/snapshots/snapshots__docx__handmade-rich.docx.snap b/tests/snapshots/snapshots__docx__handmade-rich.docx.snap
index 38580ca..9114d99 100644
--- a/tests/snapshots/snapshots__docx__handmade-rich.docx.snap
+++ b/tests/snapshots/snapshots__docx__handmade-rich.docx.snap
@@ -17,6 +17,6 @@ Rich objects follow.

-Embedded object: Excel.Sheet.12
+
After the objects.
diff --git a/tests/snapshots/snapshots__epub__book.epub.snap b/tests/snapshots/snapshots__epub__book.epub.snap
index c0dd0de..96bbaa9 100644
--- a/tests/snapshots/snapshots__epub__book.epub.snap
+++ b/tests/snapshots/snapshots__epub__book.epub.snap
@@ -26,7 +26,7 @@ A list of things:
See [Chapter Two](#epub-text-ch002-xhtml-chapter-two) for the table, or jump straight to [the marked paragraph](#epub-text-ch002-xhtml-markpoint).
- 
+ tiny dot
<a id="epub-text-ch002-xhtml-chapter-two"></a>
diff --git a/tests/snapshots/snapshots__odp__pres.odp.snap b/tests/snapshots/snapshots__odp__pres.odp.snap
index d46d347..e70d94b 100644
--- a/tests/snapshots/snapshots__odp__pres.odp.snap
+++ b/tests/snapshots/snapshots__odp__pres.odp.snap
@@ -17,6 +17,8 @@ Numbers Slide
| --- | --- |
| North | 42 |
+
+
Grouped shapes below.
Inside a group shape.
diff --git a/tests/snapshots/snapshots__pptx__handmade-order.pptx.snap b/tests/snapshots/snapshots__pptx__handmade-order.pptx.snap
index 782ed77..652da2e 100644
--- a/tests/snapshots/snapshots__pptx__handmade-order.pptx.snap
+++ b/tests/snapshots/snapshots__pptx__handmade-order.pptx.snap
@@ -8,4 +8,4 @@ Kicker before the title
Body after the title
-Quarterly numbers
+With it applied, |
|
Thanks @mirabilitum — applied your snapshot patch for ole / rich / epub / odp / pptx-order. |
There was a problem hiding this comment.
1 issue found and verified against the latest diff
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="README.md">
<violation number="1" location="README.md:132">
P3: The new sentence says every image and embedded object becomes an `` ref, but `ImageSource::Unavailable` images still render as alt-text-only (and as nothing when alt is empty). Qualify the claim, e.g. "images that carry embedded bytes become ...".</violation>
</file>
Reply with feedback, questions, or to request a fix.
Fix all with cubic | Re-trigger cubic
| - **One output for every format.** Each format parses into a shared document model and renders through a single Markdown serializer, so escaping, tables, heading anchors, and footnotes behave identically whether the input was a `.doc` from 2003 or a `.pptx` from yesterday. | ||
| - **Full document structure.** Headings with anchors, bold/italic/strikethrough, inline code and code blocks, links and internal cross-references, bulleted/numbered/nested/task lists with the source's own numbering, tables with merged cells and header rows, block quotes, footnotes and endnotes, and speaker notes. | ||
| - **Embedded assets.** Images and embedded objects render as their alt text in the Markdown, and the raw bytes stay available on the document model, tagged with their media type. Images with an external URL become ordinary Markdown images. | ||
| - **Embedded assets.** Images and embedded objects become Markdown image refs of the form ``, where `N` indexes `Document.assets` (raw bytes + media type). Rewrite those hrefs after writing the files out, or consume the document model directly. Images with an external URL become ordinary Markdown images. |
There was a problem hiding this comment.
P3: The new sentence says every image and embedded object becomes an  ref, but ImageSource::Unavailable images still render as alt-text-only (and as nothing when alt is empty). Qualify the claim, e.g. "images that carry embedded bytes become ...".
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At README.md, line 132:
<comment>The new sentence says every image and embedded object becomes an `` ref, but `ImageSource::Unavailable` images still render as alt-text-only (and as nothing when alt is empty). Qualify the claim, e.g. "images that carry embedded bytes become ...".</comment>
<file context>
@@ -129,7 +129,7 @@ let document = anydoc::to_document(&bytes, None)?;
- **One output for every format.** Each format parses into a shared document model and renders through a single Markdown serializer, so escaping, tables, heading anchors, and footnotes behave identically whether the input was a `.doc` from 2003 or a `.pptx` from yesterday.
- **Full document structure.** Headings with anchors, bold/italic/strikethrough, inline code and code blocks, links and internal cross-references, bulleted/numbered/nested/task lists with the source's own numbering, tables with merged cells and header rows, block quotes, footnotes and endnotes, and speaker notes.
-- **Embedded assets.** Images and embedded objects render as their alt text in the Markdown, and the raw bytes stay available on the document model, tagged with their media type. Images with an external URL become ordinary Markdown images.
+- **Embedded assets.** Images and embedded objects become Markdown image refs of the form ``, where `N` indexes `Document.assets` (raw bytes + media type). Rewrite those hrefs after writing the files out, or consume the document model directly. Images with an external URL become ordinary Markdown images.
- **Content-based format detection.** The format is read from the bytes themselves (PDF header, RTF open group, OLE stream names, ZIP package mimetype), so mislabeled files still convert correctly.
- **Fast.** Pure Rust, no ML models, no external services. Median conversion time is under 5ms per document.
</file context>
| - **Embedded assets.** Images and embedded objects become Markdown image refs of the form ``, where `N` indexes `Document.assets` (raw bytes + media type). Rewrite those hrefs after writing the files out, or consume the document model directly. Images with an external URL become ordinary Markdown images. | |
| - **Embedded assets.** Images and embedded objects with embedded bytes become Markdown image refs of the form ``, where `N` indexes `Document.assets` (raw bytes + media type). Rewrite those hrefs after writing the files out, or consume the document model directly. Images with an external URL become ordinary Markdown images. |
fca038c to
4a45add
Compare
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Signed-off-by: alexiskowalski <alexiskowalski@users.noreply.github.com>
Summary
Fixes #63: embedded assets already appear as
Inline::Image { source: Asset(id) }in the document model, but Markdown dropped them to alt text only (or nothing when alt was empty), soto_markdown_bytes()lost positional image markers.Changes
ImageSource::Assetas, whereNis the index intoDocument.assets.ImageSource::Unavailableas alt-text-only (no bytes to reference).asset:Nscheme in the README.Callers can rewrite
asset:Nafter writing asset files out, or keep using the document model for the bytes. This is complementary to approaches that inject resolved URLs.Test plan
cargo test --locked render::markdowncargo test --locked --test snapshots