lmd: list-table and definition-list divs built from AST nodes in a cell are not desugared
维护者通常 1 天内回复
评估
调研方向
Start with transform_divs, validate_list_table_div and is_valid_definition_list_div in pampa/src/pandoc/treesitter_utils/postprocess.rs, then find where lmd cell results are spliced in at the lmd-execute stage. Linked PR #850 is already open against this, so read it before touching code. Done means sections 2 and 4 of the repro render <table> and <dl> instead of nested <div> and <ul>, with sections 1 and 3 unchanged.
由索引模型根据 Issue 内容生成。
描述
Summary
A .list-table or .definition-list div that an {lmd} cell builds from AST nodes (pandoc.Div + pandoc.BulletList) is never desugared into a Table / DefinitionList. It reaches the HTML writer as a div containing nested bullet lists. The same markup written literally in the document body converts fine.
The desugaring lives in the reader's postprocess step (pampa/src/pandoc/treesitter_utils/postprocess.rs, transform_divs / validate_list_table_div / is_valid_definition_list_div), so it only ever sees blocks that came out of the qmd reader. Blocks that lmd cells return at lmd-execute (which runs after the engine, before ast-transforms) are spliced in without that step. The natural fix seems to be running the same div transform over each cell's returned blocks (or as a stage right after lmd-execute); transform_divs is already public and used from pampa's CLI.
This matters for the use lmd was built for: a Lua function that builds a table from data (porting an Astro/Hugo "ConfigTable"-style component) has no clean way to produce a table. Building a pandoc.Table by hand is far more verbose than the list-table div; pandoc.read of generated markdown works but defeats the point of building nodes.
Repro
repro.qmd:
---
title: list-table and definition-list divs from lmd
---
## 1. Literal list-table (control)
::: {.list-table}
* - Key
- Value
* - `a`
- one
:::
## 2. list-table div built from AST nodes in an lmd cell
```{lmd}
local function row(cells)
local items = {}
for _, c in ipairs(cells) do table.insert(items, { pandoc.Plain(c) }) end
return { pandoc.BulletList(items) }
end
local rows = {
row({ {pandoc.Str("Key")}, {pandoc.Str("Value")} }),
row({ {pandoc.Code("b")}, {pandoc.Str("two")} }),
}
return pandoc.Div({ pandoc.BulletList(rows) }, pandoc.Attr("", {"list-table"}))
```
## 3. Literal definition-list (control)
::: {.definition-list}
* Term
* A definition.
:::
## 4. definition-list div built from AST nodes in an lmd cell
```{lmd}
local item = {
pandoc.Plain({ pandoc.Str("Term") }),
pandoc.BulletList({ { pandoc.Plain({ pandoc.Str("A definition.") }) } }),
}
return pandoc.Div({ pandoc.BulletList({ item }) }, pandoc.Attr("", {"definition-list"}))
```
q2 render repro.qmd --to html
Renders without diagnostics. In repro.html:
| Section | Expected | Actual |
|---|---|---|
| 1. literal list-table | <table> |
<table> |
| 2. AST-built list-table | <table> |
<div class="list-table"><ul><li><ul>… |
| 3. literal definition-list | <dl> |
<dl> |
| 4. AST-built definition-list | <dl> |
<div class="definition-list"><ul><li>… |
The node shapes in 2 and 4 match what the reader produces for 1 and 3 before postprocess (the validators' documented structure), so once transform_divs runs over them they should convert.
Related: the same markup inside a markdown fragment
The obvious workaround, writing the list-table literally inside a fragment, is also blocked, for the opposite reason: the fragment is parsed by the reader with postprocess, so it becomes a Table, and the desugarer then reports
Warning: lmd cell could not be desugared
lmd: `Table` nodes are not supported inside markdown fragments yet
The cell is left as written and will not run.
for
```{lmd}
return {=:
::: {.list-table}
* - Key
- Value
* - `b`
- two
:::
:=}
```
So today the only route from an lmd cell to a table is pandoc.read(markdown_string, "markdown"), which does run postprocess and produces a table.
Environment
q2 0.33.0 (macOS, arm64); repo inspected at e308835bd.
- 主要语言
- Rust
- 星标
- 278
- 派生
- 19
- 平均合并
- 20 小时 23 分钟
- 30 天内合并 PR
- 164
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 没有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
quarto-dev/q2 的其他 Issue
-
难度 3/5 1-2 天 新手友好度 54/100
quarto-dev/q2#905 ·
维护者通常 1 天内回复
-
难度 3/5 1-2 天 新手友好度 63/100
quarto-dev/q2#904 ·
维护者通常 1 天内回复
-
难度 5/5 一周以上 新手友好度 48/100
quarto-dev/q2#900 ·
维护者通常 1 天内回复
-
难度 5/5 一周以上 新手友好度 35/100
quarto-dev/q2#896 ·
维护者通常 1 天内回复
-
难度 5/5 一周以上 新手友好度 35/100
quarto-dev/q2#893 · 3 个 reaction ·
维护者通常 1 天内回复
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 85/100
farion1231/cc-switch#8829 ·
维护者通常 1 天内回复
-
Validate CI command vectors before indexing Cargo subcommands可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭bug ci good first issue
难度 2/5 1-3 小时 新手友好度 88/100
维护者通常 1 天内回复
-
难度 1/5 1 小时以内 新手友好度 92/100
longbridge/gpui-kit#3677 ·
维护者通常 1 天内回复
-
E-pr-welcome
难度 2/5 1-3 小时 新手友好度 77/100
seanmonstar/reqwest#3121 · 2 条评论 ·
维护者通常 1 天内回复
-
难度 1/5 1 小时以内 新手友好度 68/100
ilya-zlobintsev/LACT#1235 ·
维护者通常 1 天内回复