Skip to content

Commit 19709de

Browse files
committed
set header autoid in readers
1 parent 8354eaa commit 19709de

File tree

8 files changed

+41
-48
lines changed

8 files changed

+41
-48
lines changed

crates/quarto_markdown_pandoc/src/filters.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ use crate::pandoc::MetaValue;
77
use crate::pandoc::block::MetaBlock;
88
use crate::pandoc::inline::AsInline;
99
use crate::pandoc::meta::Meta;
10-
use crate::pandoc::meta::parse_metadata_strings;
11-
use crate::pandoc::meta::rawblock_to_meta;
1210
use crate::pandoc::{self, Block, Blocks, Inline, Inlines};
1311

1412
// filters are destructive and take ownership of the input

crates/quarto_markdown_pandoc/src/pandoc/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,5 @@ pub use crate::pandoc::table::{
3333
Alignment, Cell, ColWidth, Row, Table, TableBody, TableFoot, TableHead,
3434
};
3535

36-
pub use crate::pandoc::location::{Location, Range};
3736
pub use crate::pandoc::meta::{Meta, MetaValue, rawblock_to_meta};
3837
pub use crate::pandoc::treesitter::treesitter_to_pandoc;

crates/quarto_markdown_pandoc/src/pandoc/treesitter.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use crate::pandoc::shortcode::{Shortcode, ShortcodeArg, shortcode_to_span};
2424
use crate::pandoc::table::{
2525
Alignment, Cell, ColSpec, ColWidth, Row, Table, TableBody, TableFoot, TableHead,
2626
};
27+
use crate::utils::autoid;
2728
use core::panic;
2829
use once_cell::sync::Lazy;
2930
use regex::Regex;
@@ -1816,15 +1817,22 @@ fn desugar(doc: Pandoc) -> Result<Pandoc, Vec<String>> {
18161817
.last()
18171818
.map_or(false, |v| matches!(v, Inline::Attr(_)));
18181819
if !is_last_attr {
1819-
return Unchanged(header);
1820+
let mut attr = header.attr.clone();
1821+
if attr.0.is_empty() {
1822+
attr.0 = autoid::auto_generated_id(&header.content);
1823+
header.attr = attr;
1824+
FilterResult(vec![Block::Header(header)], true)
1825+
} else {
1826+
Unchanged(header)
1827+
}
1828+
} else {
1829+
let Some(Inline::Attr(attr)) = header.content.pop() else {
1830+
panic!("shouldn't happen, header should have an attribute at this point");
1831+
};
1832+
header.attr = attr;
1833+
header.content = trim_inlines(header.content).0;
1834+
FilterResult(vec![Block::Header(header)], true)
18201835
}
1821-
1822-
let Some(Inline::Attr(attr)) = header.content.pop() else {
1823-
panic!("shouldn't happen, header should have an attribute at this point");
1824-
};
1825-
header.attr = attr;
1826-
header.content = trim_inlines(header.content).0;
1827-
FilterResult(vec![Block::Header(header)], true)
18281836
})
18291837
// attempt to desugar single-image paragraphs into figures
18301838
.with_paragraph(|para| {

crates/quarto_markdown_pandoc/src/readers/qmd.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,8 @@ pub fn read<T: Write>(
7676
let mut result = pandoc::treesitter_to_pandoc(&mut output_stream, &tree, &input_bytes)?;
7777
let mut meta_from_parses = Meta::default();
7878

79-
eprintln!("Hello?");
80-
eprintln!("{:?}", result);
81-
8279
result = {
8380
let mut filter = Filter::new().with_raw_block(|rb| {
84-
eprintln!("raw block: {:?}", rb);
8581
if rb.format != "quarto_minus_metadata" {
8682
return Unchanged(rb);
8783
}
@@ -131,6 +127,5 @@ pub fn read<T: Write>(
131127
for (k, v) in meta_from_parses.into_iter() {
132128
result.meta.insert(k, v);
133129
}
134-
eprintln!("result\n{:?}", result);
135130
Ok(result)
136131
}

crates/quarto_markdown_pandoc/src/writers/json.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
use crate::pandoc::{Attr, Block, Caption, CitationMode, Inline, Inlines, ListAttributes, Pandoc};
77
use crate::utils::autoid;
8-
use crate::writers::json;
98
use serde_json::{Value, json};
109

1110
fn write_location<T: crate::pandoc::location::SourceLocation>(item: &T) -> Value {
@@ -254,13 +253,9 @@ fn write_block(block: &Block) -> Value {
254253
"l": write_location(para),
255254
}),
256255
Block::Header(header) => {
257-
let mut attr = header.attr.clone();
258-
if attr.0.is_empty() {
259-
attr.0 = autoid::auto_generated_id(&header.content);
260-
}
261256
json!({
262257
"t": "Header",
263-
"c": [header.level, write_attr(&attr), write_inlines(&header.content)],
258+
"c": [header.level, write_attr(&header.attr), write_inlines(&header.content)],
264259
"l": write_location(header),
265260
})
266261
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
hello: world
3+
---
4+
5+
## What

crates/quarto_markdown_pandoc/tests/test.rs

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use glob::glob;
77
use quarto_markdown_pandoc::errors::parse_is_good;
88
use quarto_markdown_pandoc::pandoc::treesitter_to_pandoc;
9-
use quarto_markdown_pandoc::writers;
9+
use quarto_markdown_pandoc::{readers, writers};
1010
use std::io::Write;
1111
use std::process::{Command, Stdio};
1212
use tree_sitter_qmd::MarkdownParser;
@@ -69,6 +69,12 @@ fn matches_canonical_pandoc_format(
6969
}
7070
let our_ast = canonicalize_pandoc_ast(ast, output_format, output_format);
7171
let pandoc_ast = canonicalize_pandoc_ast(markdown, pandoc_reader, output_format);
72+
if our_ast != pandoc_ast {
73+
eprintln!("Format: {} -> {}", pandoc_reader, output_format);
74+
eprintln!("Input:\n{}", markdown);
75+
eprintln!("Our AST:\n{}", our_ast);
76+
eprintln!("Pandoc AST:\n{}", pandoc_ast);
77+
}
7278
our_ast == pandoc_ast
7379
}
7480

@@ -78,32 +84,18 @@ fn matches_pandoc_markdown_reader(input: &str) -> bool {
7884
}
7985
let mut buf1 = Vec::new();
8086
let mut buf2 = Vec::new();
81-
writers::native::write(
82-
&treesitter_to_pandoc(
83-
&mut std::io::sink(),
84-
&MarkdownParser::default()
85-
.parse(input.as_bytes(), None)
86-
.unwrap(),
87-
input.as_bytes(),
88-
)
89-
.unwrap(),
90-
&mut buf1,
91-
)
92-
.unwrap();
87+
88+
let doc = readers::qmd::read(input.as_bytes(), &mut std::io::sink()).unwrap();
89+
writers::native::write(&doc, &mut buf1).unwrap();
9390
let native_output = String::from_utf8(buf1).expect("Invalid UTF-8 in output");
94-
writers::json::write(
95-
&treesitter_to_pandoc(
96-
&mut std::io::sink(),
97-
&MarkdownParser::default()
98-
.parse(input.as_bytes(), None)
99-
.unwrap(),
100-
input.as_bytes(),
101-
)
102-
.unwrap(),
103-
&mut buf2,
104-
)
105-
.unwrap();
91+
writers::json::write(&doc, &mut buf2).unwrap();
10692
let json_output = String::from_utf8(buf2).expect("Invalid UTF-8 in output");
93+
94+
let mut our_value: serde_json::Value =
95+
serde_json::from_str(&json_output).expect("Failed to parse our JSON");
96+
remove_location_fields(&mut our_value);
97+
let json_output = serde_json::to_string(&our_value).expect("Failed to serialize our JSON");
98+
10799
matches_canonical_pandoc_format(input, &native_output, "markdown", "native")
108100
&& matches_canonical_pandoc_format(input, &json_output, "markdown", "json")
109101
}

crates/quarto_markdown_pandoc/tests/test_meta.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use quarto_markdown_pandoc::pandoc::{Location, MetaValue, Range, RawBlock, rawblock_to_meta};
1+
use quarto_markdown_pandoc::pandoc::location::{Location, Range};
2+
use quarto_markdown_pandoc::pandoc::{MetaValue, RawBlock, rawblock_to_meta};
23
use std::fs;
34

45
#[test]

0 commit comments

Comments
 (0)