Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

lmd: list-table and definition-list divs built from AST nodes in a cell are not desugared

已关闭
#846 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

@cscheid 已经在做这个了。

开始于 2026年10月16日。

  • #850 来自 @cscheid —— 未关闭

评估

难度
4/5
预计耗时
3-5 天
新手友好度
15/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
停滞
技术栈
lua, rust
领域
backend

调研方向

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 内容生成。

描述

bug

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 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

quarto-dev/q2 的其他 Issue

查看 quarto-dev/q2 的全部 Issue

相似的 Issue

更多 Rust Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。