aboutsummaryrefslogtreecommitdiffstats
path: root/src/parser/simplify.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser/simplify.rs')
-rw-r--r--src/parser/simplify.rs139
1 files changed, 67 insertions, 72 deletions
diff --git a/src/parser/simplify.rs b/src/parser/simplify.rs
index ab79343..cc169ee 100644
--- a/src/parser/simplify.rs
+++ b/src/parser/simplify.rs
@@ -53,7 +53,7 @@ impl NamedTargetType {
#[derive(Clone, Debug)]
struct Substitution {
- content: e::ImageInline,
+ content: Vec<c::TextOrInlineElement>,
/// If true and the sibling before the reference is a text node,
/// the text node gets right-trimmed.
ltrim: bool,
@@ -94,7 +94,7 @@ impl TargetsCollected {
trait ResolvableRefs {
fn populate_targets(&self, refs: &mut TargetsCollected);
- fn resolve_refs(self, refs: &TargetsCollected) -> Self;
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> where Self: Sized;
}
pub fn resolve_references(mut doc: Document) -> Document {
@@ -102,7 +102,7 @@ pub fn resolve_references(mut doc: Document) -> Document {
for c in doc.children() {
c.populate_targets(&mut references);
}
- let new: Vec<_> = doc.children_mut().drain(..).map(|c| c.resolve_refs(&references)).collect();
+ let new: Vec<_> = doc.children_mut().drain(..).flat_map(|c| c.resolve_refs(&references)).collect();
Document::with_children(new)
}
@@ -113,7 +113,7 @@ fn sub_pop<P, C>(parent: &P, refs: &mut TargetsCollected) where P: HasChildren<C
}
fn sub_res<P, C>(mut parent: P, refs: &TargetsCollected) -> P where P: e::Element + HasChildren<C>, C: ResolvableRefs {
- let new: Vec<_> = parent.children_mut().drain(..).map(|c| c.resolve_refs(refs)).collect();
+ let new: Vec<_> = parent.children_mut().drain(..).flat_map(|c| c.resolve_refs(refs)).collect();
parent.children_mut().extend(new);
parent
}
@@ -141,15 +141,15 @@ impl ResolvableRefs for c::StructuralSubElement {
SubStructure(e) => e.populate_targets(refs),
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::StructuralSubElement::*;
- match self {
+ vec![match self {
Title(e) => sub_res(*e, refs).into(),
Subtitle(e) => sub_res(*e, refs).into(),
Decoration(e) => sub_res(*e, refs).into(),
Docinfo(e) => sub_res(*e, refs).into(),
- SubStructure(e) => e.resolve_refs(refs).into(),
- }
+ SubStructure(e) => return e.resolve_refs(refs).drain(..).map(Into::into).collect(),
+ }]
}
}
@@ -164,15 +164,15 @@ impl ResolvableRefs for c::SubStructure {
BodyElement(e) => e.populate_targets(refs),
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::SubStructure::*;
- match self {
+ vec![match self {
Topic(e) => sub_res(*e, refs).into(),
Sidebar(e) => sub_res(*e, refs).into(),
Transition(e) => Transition(e),
Section(e) => sub_res(*e, refs).into(),
- BodyElement(e) => e.resolve_refs(refs).into(),
- }
+ BodyElement(e) => return e.resolve_refs(refs).drain(..).map(Into::into).collect(),
+ }]
}
}
@@ -186,13 +186,8 @@ impl ResolvableRefs for c::BodyElement {
MathBlock(_) => {},
Rubric(e) => sub_pop(&**e, refs),
SubstitutionDefinition(e) => {
- let subst_content = if let [c::TextOrInlineElement::ImageInline(content)] = &e.children()[..] {
- content.as_ref()
- } else {
- panic!("Unexpected substitution contents.")
- };
let subst = Substitution {
- content: subst_content.clone(),
+ content: e.children().clone(),
ltrim: e.extra().ltrim,
rtrim: e.extra().rtrim
};
@@ -246,15 +241,15 @@ impl ResolvableRefs for c::BodyElement {
Table(e) => sub_pop(&**e, refs)
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::BodyElement::*;
- match self {
+ vec![match self {
Paragraph(e) => sub_res(*e, refs).into(),
LiteralBlock(e) => sub_res(*e, refs).into(),
DoctestBlock(e) => sub_res(*e, refs).into(),
MathBlock(e) => MathBlock(e),
Rubric(e) => sub_res(*e, refs).into(),
- SubstitutionDefinition(e) => SubstitutionDefinition(e),
+ SubstitutionDefinition(_) => return vec![],
Comment(e) => Comment(e),
Pending(e) => Pending(e),
Target(e) => Target(e),
@@ -284,7 +279,7 @@ impl ResolvableRefs for c::BodyElement {
SystemMessage(e) => sub_res(*e, refs).into(),
Figure(e) => sub_res(*e, refs).into(),
Table(e) => sub_res(*e, refs).into()
- }
+ }]
}
}
@@ -305,9 +300,9 @@ impl ResolvableRefs for c::BibliographicElement {
Field(e) => sub_pop(&**e, refs),
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::BibliographicElement::*;
- match self {
+ vec![match self {
Author(e) => sub_res(*e, refs).into(),
Authors(e) => sub_res(*e, refs).into(),
Organization(e) => sub_res(*e, refs).into(),
@@ -319,7 +314,7 @@ impl ResolvableRefs for c::BibliographicElement {
Date(e) => sub_res(*e, refs).into(),
Copyright(e) => sub_res(*e, refs).into(),
Field(e) => sub_res(*e, refs).into(),
- }
+ }]
}
}
@@ -351,10 +346,10 @@ impl ResolvableRefs for c::TextOrInlineElement {
ImageInline(_) => {}
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::TextOrInlineElement::*;
- match self {
- c::TextOrInlineElement::String(e) => c::TextOrInlineElement::String(e),
+ vec![match self {
+ String(e) => String(e),
Emphasis(e) => sub_res(*e, refs).into(),
Strong(e) => sub_res(*e, refs).into(),
Literal(e) => sub_res(*e, refs).into(),
@@ -375,7 +370,7 @@ impl ResolvableRefs for c::TextOrInlineElement {
if *ltrim || *rtrim {
dbg!(content, ltrim, rtrim);
}
- ImageInline(Box::new(content.clone()))
+ return content.clone()
},
None => {
// Undefined substitution name (level 3 system message).
@@ -404,7 +399,7 @@ impl ResolvableRefs for c::TextOrInlineElement {
TargetInline(e) => TargetInline(e),
RawInline(e) => RawInline(e),
ImageInline(e) => ImageInline(e)
- }
+ }]
}
}
@@ -418,14 +413,14 @@ impl ResolvableRefs for c::AuthorInfo {
Contact(e) => sub_pop(&**e, refs),
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::AuthorInfo::*;
- match self {
+ vec![match self {
Author(e) => sub_res(*e, refs).into(),
Organization(e) => sub_res(*e, refs).into(),
Address(e) => sub_res(*e, refs).into(),
Contact(e) => sub_res(*e, refs).into(),
- }
+ }]
}
}
@@ -437,12 +432,12 @@ impl ResolvableRefs for c::DecorationElement {
Footer(e) => sub_pop(&**e, refs),
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::DecorationElement::*;
- match self {
+ vec![match self {
Header(e) => sub_res(*e, refs).into(),
Footer(e) => sub_res(*e, refs).into(),
- }
+ }]
}
}
@@ -454,11 +449,11 @@ impl ResolvableRefs for c::SubTopic {
BodyElement(e) => e.populate_targets(refs),
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::SubTopic::*;
match self {
- Title(e) => sub_res(*e, refs).into(),
- BodyElement(e) => e.resolve_refs(refs).into(),
+ Title(e) => vec![sub_res(*e, refs).into()],
+ BodyElement(e) => e.resolve_refs(refs).drain(..).map(Into::into).collect(),
}
}
}
@@ -473,14 +468,14 @@ impl ResolvableRefs for c::SubSidebar {
BodyElement(e) => e.populate_targets(refs),
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::SubSidebar::*;
- match self {
+ vec![match self {
Topic(e) => sub_res(*e, refs).into(),
Title(e) => sub_res(*e, refs).into(),
Subtitle(e) => sub_res(*e, refs).into(),
- BodyElement(e) => e.resolve_refs(refs).into(),
- }
+ BodyElement(e) => return e.resolve_refs(refs).drain(..).map(Into::into).collect(),
+ }]
}
}
@@ -493,13 +488,13 @@ impl ResolvableRefs for c::SubDLItem {
Definition(e) => sub_pop(&**e, refs),
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::SubDLItem::*;
- match self {
+ vec![match self {
Term(e) => sub_res(*e, refs).into(),
Classifier(e) => sub_res(*e, refs).into(),
Definition(e) => sub_res(*e, refs).into(),
- }
+ }]
}
}
@@ -511,12 +506,12 @@ impl ResolvableRefs for c::SubField {
FieldBody(e) => sub_pop(&**e, refs),
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::SubField::*;
- match self {
+ vec![match self {
FieldName(e) => sub_res(*e, refs).into(),
FieldBody(e) => sub_res(*e, refs).into(),
- }
+ }]
}
}
@@ -528,18 +523,18 @@ impl ResolvableRefs for c::SubOptionListItem {
Description(e) => sub_pop(&**e, refs),
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::SubOptionListItem::*;
- match self {
+ vec![match self {
OptionGroup(e) => sub_sub_res(*e, refs).into(),
Description(e) => sub_res(*e, refs).into(),
- }
+ }]
}
}
impl ResolvableRefs for c::SubOption {
fn populate_targets(&self, _: &mut TargetsCollected) {}
- fn resolve_refs(self, _: &TargetsCollected) -> Self { self }
+ fn resolve_refs(self, _: &TargetsCollected) -> Vec<Self> { vec![self] }
}
impl ResolvableRefs for c::SubLineBlock {
@@ -550,12 +545,12 @@ impl ResolvableRefs for c::SubLineBlock {
Line(e) => sub_pop(&**e, refs),
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::SubLineBlock::*;
- match self {
+ vec![match self {
LineBlock(e) => sub_res(*e, refs).into(),
Line(e) => sub_res(*e, refs).into(),
- }
+ }]
}
}
@@ -567,11 +562,11 @@ impl ResolvableRefs for c::SubBlockQuote {
BodyElement(e) => e.populate_targets(refs),
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::SubBlockQuote::*;
match self {
- Attribution(e) => sub_res(*e, refs).into(),
- BodyElement(e) => e.resolve_refs(refs).into(),
+ Attribution(e) => vec![sub_res(*e, refs).into()],
+ BodyElement(e) => e.resolve_refs(refs).drain(..).map(Into::into).collect(),
}
}
}
@@ -584,11 +579,11 @@ impl ResolvableRefs for c::SubFootnote {
BodyElement(e) => e.populate_targets(refs),
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::SubFootnote::*;
match self {
- Label(e) => sub_res(*e, refs).into(),
- BodyElement(e) => e.resolve_refs(refs).into(),
+ Label(e) => vec![sub_res(*e, refs).into()],
+ BodyElement(e) => e.resolve_refs(refs).drain(..).map(Into::into).collect(),
}
}
}
@@ -602,13 +597,13 @@ impl ResolvableRefs for c::SubFigure {
BodyElement(e) => e.populate_targets(refs),
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::SubFigure::*;
- match self {
+ vec![match self {
Caption(e) => sub_res(*e, refs).into(),
Legend(e) => sub_res(*e, refs).into(),
- BodyElement(e) => e.resolve_refs(refs).into(),
- }
+ BodyElement(e) => return e.resolve_refs(refs).drain(..).map(Into::into).collect(),
+ }]
}
}
@@ -620,12 +615,12 @@ impl ResolvableRefs for c::SubTable {
TableGroup(e) => sub_pop(&**e, refs),
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::SubTable::*;
- match self {
+ vec![match self {
Title(e) => sub_res(*e, refs).into(),
TableGroup(e) => sub_res(*e, refs).into(),
- }
+ }]
}
}
@@ -648,9 +643,9 @@ impl ResolvableRefs for c::SubTableGroup {
},
}
}
- fn resolve_refs(self, refs: &TargetsCollected) -> Self {
+ fn resolve_refs(self, refs: &TargetsCollected) -> Vec<Self> {
use c::SubTableGroup::*;
- match self {
+ vec![match self {
TableColspec(e) => TableColspec(e),
TableHead(mut e) => {
let new: Vec<_> = e.children_mut().drain(..).map(|c| sub_sub_res(c, refs)).collect();
@@ -662,6 +657,6 @@ impl ResolvableRefs for c::SubTableGroup {
e.children_mut().extend(new);
TableBody(e)
},
- }
+ }]
}
}