|
4 | 4 | */ |
5 | 5 |
|
6 | 6 | use crate::pandoc::MetaValue; |
| 7 | +use crate::pandoc::block::MetaBlock; |
7 | 8 | use crate::pandoc::inline::AsInline; |
8 | 9 | use crate::pandoc::meta::Meta; |
9 | 10 | use crate::pandoc::meta::parse_metadata_strings; |
@@ -140,13 +141,21 @@ impl<'a> Filter<'a> { |
140 | 141 | self |
141 | 142 | } |
142 | 143 |
|
143 | | - // pub fn with_blocks<F>(mut self, f: F) -> Self |
144 | | - // where |
145 | | - // F: Fn(Blocks) -> FilterReturn<Blocks, Blocks> + 'static, |
146 | | - // { |
147 | | - // self.blocks = Some(Box::new(f)); |
148 | | - // self |
149 | | - // } |
| 144 | + pub fn with_blocks<F>(mut self, f: F) -> Filter<'a> |
| 145 | + where |
| 146 | + F: FnMut(Blocks) -> FilterReturn<Blocks, Blocks> + 'a, |
| 147 | + { |
| 148 | + self.blocks = Some(Box::new(f)); |
| 149 | + self |
| 150 | + } |
| 151 | + |
| 152 | + pub fn with_meta<F>(mut self, f: F) -> Filter<'a> |
| 153 | + where |
| 154 | + F: FnMut(Meta) -> FilterReturn<Meta, Meta> + 'a, |
| 155 | + { |
| 156 | + self.meta = Some(Box::new(f)); |
| 157 | + self |
| 158 | + } |
150 | 159 | } |
151 | 160 |
|
152 | 161 | macro_rules! define_filter_with_methods { |
@@ -657,6 +666,34 @@ pub fn topdown_traverse_block(block: Block, filter: &mut Filter) -> Blocks { |
657 | 666 | Block::HorizontalRule(hr) => { |
658 | 667 | handle_block_filter!(HorizontalRule, hr, horizontal_rule, filter) |
659 | 668 | } |
| 669 | + // quarto extensions |
| 670 | + Block::BlockMetadata(meta) => { |
| 671 | + if let Some(f) = &mut filter.meta { |
| 672 | + return match f(meta.meta) { |
| 673 | + FilterReturn::Unchanged(m) => vec![Block::BlockMetadata(MetaBlock { |
| 674 | + meta: m, |
| 675 | + filename: meta.filename, |
| 676 | + range: meta.range, |
| 677 | + })], |
| 678 | + FilterReturn::FilterResult(new_meta, recurse) => { |
| 679 | + if !recurse { |
| 680 | + vec![Block::BlockMetadata(MetaBlock { |
| 681 | + meta: new_meta, |
| 682 | + filename: meta.filename, |
| 683 | + range: meta.range, |
| 684 | + })] |
| 685 | + } else { |
| 686 | + vec![Block::BlockMetadata(MetaBlock { |
| 687 | + meta: topdown_traverse_meta(new_meta, filter), |
| 688 | + filename: meta.filename, |
| 689 | + range: meta.range, |
| 690 | + })] |
| 691 | + } |
| 692 | + } |
| 693 | + }; |
| 694 | + } |
| 695 | + vec![Block::BlockMetadata(meta)] |
| 696 | + } |
660 | 697 | } |
661 | 698 | } |
662 | 699 |
|
@@ -962,40 +999,8 @@ pub fn topdown_traverse_meta(meta: Meta, filter: &mut Filter) -> Meta { |
962 | 999 | } |
963 | 1000 |
|
964 | 1001 | pub fn topdown_traverse(doc: pandoc::Pandoc, filter: &mut Filter) -> pandoc::Pandoc { |
965 | | - let (real_blocks, meta_blocks): (Vec<Block>, Vec<Block>) = doc |
966 | | - .blocks |
967 | | - .into_iter() |
968 | | - .partition(|b| !matches!(b, Block::RawBlock(rb) if rb.format == "quarto_minus_metadata")); |
969 | | - |
970 | | - let mut meta = Meta::default(); |
971 | | - let mut meta_from_parses = Meta::default(); |
972 | | - meta_blocks.into_iter().for_each(|b| match b { |
973 | | - Block::RawBlock(rb) if rb.format == "quarto_minus_metadata" => { |
974 | | - let Some(result) = rawblock_to_meta(rb) else { |
975 | | - return; |
976 | | - }; |
977 | | - let meta_map = MetaValue::MetaMap(result); |
978 | | - |
979 | | - match parse_metadata_strings(meta_map, &mut meta_from_parses) { |
980 | | - MetaValue::MetaMap(m) => { |
981 | | - for (k, v) in m { |
982 | | - meta.insert(k, v); |
983 | | - } |
984 | | - } |
985 | | - _ => panic!("Expected MetaMap from parse_metadata_strings"), |
986 | | - } |
987 | | - } |
988 | | - _ => {} |
989 | | - }); |
990 | | - for (k, v) in meta_from_parses { |
991 | | - if !meta.contains_key(&k) { |
992 | | - meta.insert(k, v); |
993 | | - } |
994 | | - } |
995 | | - |
996 | 1002 | pandoc::Pandoc { |
997 | | - meta: topdown_traverse_meta(meta, filter), |
998 | | - blocks: topdown_traverse_blocks(real_blocks, filter), |
999 | | - // TODO: handle meta |
| 1003 | + meta: topdown_traverse_meta(doc.meta, filter), |
| 1004 | + blocks: topdown_traverse_blocks(doc.blocks, filter), |
1000 | 1005 | } |
1001 | 1006 | } |
0 commit comments