1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
use super::*; pub trait MutVisitor { fn visit_block(&mut self, block: &mut Block) { self.walk_block(block) } fn visit_attr(&mut self, attr: &mut Attr) { self.walk_attr(attr) } fn visit_inline(&mut self, inline: &mut Inline) { self.walk_inline(inline) } fn visit_meta(&mut self, _key: &str, meta: &mut MetaValue) { self.walk_meta(meta) } fn visit_vec_block(&mut self, vec_block: &mut Vec<Block>) { self.walk_vec_block(vec_block) } fn visit_vec_inline(&mut self, vec_inline: &mut Vec<Inline>) { self.walk_vec_inline(vec_inline) } fn walk_meta(&mut self, meta: &mut MetaValue) { use MetaValue::*; match *meta { MetaMap(ref mut c) => { for (key, meta) in c { self.visit_meta(key, meta); } } MetaList(ref mut c) => { for meta in c { self.walk_meta(meta); } } MetaBool(_) => {} MetaString(_) => {} MetaInlines(ref mut v_inline) => { self.visit_vec_inline(v_inline); } MetaBlocks(ref mut v_block) => { self.visit_vec_block(v_block); } } } fn walk_pandoc(&mut self, pandoc: &mut Pandoc) { for (key, meta) in &mut pandoc.meta { self.visit_meta(key, meta); } self.visit_vec_block(&mut pandoc.blocks); } fn walk_block(&mut self, block: &mut Block) { use Block::*; match *block { Plain(ref mut vec_inline) | Para(ref mut vec_inline) => { self.visit_vec_inline(vec_inline); } LineBlock(ref mut vec_vec_inline) => { for vec_inline in vec_vec_inline { self.visit_vec_inline(vec_inline); } } CodeBlock(ref mut attr, _) => self.visit_attr(attr), RawBlock { .. } => {} BlockQuote(ref mut vec_block) => { self.visit_vec_block(vec_block); } OrderedList(_, ref mut vec_vec_block) | BulletList(ref mut vec_vec_block) => { for vec_block in vec_vec_block { self.visit_vec_block(vec_block); } } DefinitionList(ref mut c) => { for def in c { self.visit_vec_inline(&mut def.0); for vec_block in &mut def.1 { self.visit_vec_block(vec_block); } } } Header(_, ref mut attr, ref mut vec_inline) => { self.visit_attr(attr); self.visit_vec_inline(vec_inline); } HorizontalRule => {} Table(ref mut vec_inline, _, _, ref mut vv_block, ref mut vvv_block) => { self.visit_vec_inline(vec_inline); for vec_block in vv_block { self.visit_vec_block(vec_block); } for vv_block in vvv_block { for vec_block in vv_block { self.visit_vec_block(vec_block); } } } Div(ref mut attr, ref mut vec_block) => { self.visit_attr(attr); self.visit_vec_block(vec_block); } Null => {} } } fn walk_attr(&mut self, _attr: &mut Attr) {} fn walk_inline(&mut self, inline: &mut Inline) { use Inline::*; match *inline { Str { .. } => {} Emph(ref mut c) | Strong(ref mut c) | Strikeout(ref mut c) | Superscript(ref mut c) | Subscript(ref mut c) | SmallCaps(ref mut c) | Quoted(_, ref mut c) => { self.visit_vec_inline(c); } Cite(ref mut v_cite, ref mut v_inl) => { for cite in v_cite { self.visit_vec_inline(&mut cite.citationPrefix); self.visit_vec_inline(&mut cite.citationSuffix); } self.visit_vec_inline(v_inl); } Code(ref mut attr, _) => self.visit_attr(attr), Space { .. } => {} SoftBreak { .. } => {} LineBreak { .. } => {} Math { .. } => {} RawInline { .. } => {} Link(ref mut attr, ref mut v_inline, _) | Image(ref mut attr, ref mut v_inline, _) | Span(ref mut attr, ref mut v_inline) => { self.visit_attr(attr); self.visit_vec_inline(v_inline); } Note(ref mut c) => { self.visit_vec_block(c); } } } fn walk_vec_block(&mut self, vec_block: &mut Vec<Block>) { for block in vec_block { self.visit_block(block); } } fn walk_vec_inline(&mut self, vec_inline: &mut Vec<Inline>) { for inline in vec_inline { self.visit_inline(inline); } } }