commonmark reader registers its input twice and stamps nodes with the content-less FileId(0)
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 78/100
Línea de trabajo
Lee crates/pampa/src/readers/commonmark.rs y compara cómo configura el contexto con crates/pampa/src/readers/qmd.rs. Actualiza crates/pampa/tests/integration/test_diagnostic_path_normalization.rs, especialmente commonmark_reader_source_context_uses_forward_slashes, para comprobar que la ruta normalizada y el contenido de entrada pertenecen a FileId(0) y que solo se registra un archivo. La tarea estará terminada cuando los nodos de commonmark usen ese archivo con contenido y pase la prueba específica.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
pampa::readers::commonmark::read registers its input in the SourceContext twice and then points every node's SourceInfo at the wrong entry: the one without content. Line/column mapping for commonmark-read nodes only works today because the sole caller (the pampa CLI's --from commonmark) passes a real path that the first registration reads back from disk. For an in-memory input (anything named like <pandoc.read>), no position in the resulting AST can be turned into a line and column.
Where
crates/pampa/src/readers/commonmark.rs, read:
let mut context = ASTContext::with_filename(filename.to_string()); // (1) add_file(filename, None) -> FileId(0)
let normalized_filename = context.filenames[0].clone();
context
.source_context
.add_file(normalized_filename, Some(input.to_string())); // (2) same path, with content -> FileId(1)
let file_id = FileId(0); // (3) ...but nodes are stamped with FileId(0)
let source_ctx = SourceLocationContext::new(input, file_id);
let pandoc = convert_document_with_source(root, Some(&source_ctx));
SourceContext::add_file (quarto-source-map 0.3.0, context.rs) always pushes a new SourceFile; it does not dedupe by path. So after (2) the context holds two files with the same path: FileId(0) with content: None and a file_info only if std::fs::read_to_string(path) succeeded, and FileId(1) with the actual content. Every SourceInfo::Original the conversion produces names FileId(0).
The qmd reader (readers/qmd.rs, same spot) avoids this by replacing the context before adding the file:
let mut context = ASTContext::with_filename(filename.to_string());
context.source_context = quarto_source_map::SourceContext::new();
context.source_context.add_file(normalized_filename, Some(input_str));
so its FileId(0) is the entry that has the content.
Evidence that it is pinned rather than caught
crates/pampa/tests/integration/test_diagnostic_path_normalization.rs, commonmark_reader_source_context_uses_forward_slashes, asserts on FileId(1) and explains why:
FileId(0) is the entry
ASTContext::with_filenamecreates internally … The fix this test protects is commonmark::read's own secondadd_filecall, which lands at FileId(1)
That test will need to move to FileId(0) with the fix (and could additionally assert the context holds exactly one file).
Consequences
- With a real on-disk path: works by accident.
FileId(0)got aFileInformationfrom re-reading the file, somap_offsetsucceeds;FileId(1)is dead weight. - With an in-memory input and a synthetic name:
FileId(0)has neither content norfile_info. A diagnostic or anymap_offsetagainst a commonmark node has an offset into a file the context cannot map. This is the path a Luapandoc.read(text, "commonmark")would take (separate issue), and the reason to fix this first. - Snapshot or provenance tooling that looks at
root_file_id()of commonmark nodes gets the content-less entry.
Fix
Mirror the qmd reader: build the context, replace source_context with a fresh one (or skip the with_filename registration), add_file(normalized, Some(input)) once, and use the FileId that call returns instead of a hard-coded FileId(0). Update the test above to assert a single file at FileId(0) with the normalized path and the content.
Environment
Repo at ad283a2cb (2026-10-16); quarto-source-map 0.3.0.
- Lenguaje dominante
- Rust
- Estrellas
- 278
- Forks
- 19
- Merge medio
- 21 h 56 min
- PR fusionados (30 d)
- 156
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de quarto-dev/q2
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 48/100
quarto-dev/q2#900 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
quarto-dev/q2#896 ·
Los mantenedores suelen responder en 1 día
-
"I want :emoji: to work"Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
quarto-dev/q2#893 · 3 reacciones ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
quarto-dev/q2#892 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 48/100
quarto-dev/q2#891 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de quarto-dev/q2
Issues similares
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 86/100
Los mantenedores suelen responder en 1 día
-
area:sim good first issue kind:feature
Dificultad 2/5 1-3 horas Aptitud para principiantes 87/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
bitcoindevkit/bdk#2432 ·
Los mantenedores suelen responder en 3 días
-
The demo's interval button and chart legend keep the previous interval after an interval changeAbiertobug ui
Dificultad 2/5 1-3 horas Aptitud para principiantes 83/100
userFRM/egui-charts#670 ·
Los mantenedores suelen responder en 1 día
-
docs good first issue
Dificultad 1/5 1-3 horas Aptitud para principiantes 84/100
Usenova-Labs/usenova-backend#35 ·
Los mantenedores suelen responder en 1 día