Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

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

Chiusa
#846 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@cscheid ci sta già lavorando.

Dal 16/10/2026.

  • #850 di @cscheid — aperta

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
15/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Ferma
Stack tecnologico
lua, rust
Ambito
backend

Direzione di ricerca

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.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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.

Lingua principale
Rust
Stelle
278
Fork
19
Merge medio
23h 15m
PR unite (30g)
153

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di quarto-dev/q2

Tutte le issue di quarto-dev/q2

Issue simili

Altre issue su Rust

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.