aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp A2019-03-31 23:22:03 +0200
committerPhilipp A2019-03-31 23:22:03 +0200
commitd6cc93c02ceb4730375df9a0ca4ae2ea01391737 (patch)
treee4c6dc433298bf71a7f0b1216ed5bd865801857b
parent4e22848e3faa255c34fdc1b6503a88a02a7350c5 (diff)
downloadrust-rst-d6cc93c02ceb4730375df9a0ca4ae2ea01391737.tar.bz2
Add stub for ref resolution
-rw-r--r--src/document_tree/attribute_types.rs13
-rw-r--r--src/parser.rs15
-rw-r--r--src/parser/simplify.rs34
3 files changed, 52 insertions, 10 deletions
diff --git a/src/document_tree/attribute_types.rs b/src/document_tree/attribute_types.rs
index 1648c18..219a0ac 100644
--- a/src/document_tree/attribute_types.rs
+++ b/src/document_tree/attribute_types.rs
@@ -6,7 +6,7 @@ use regex::Regex;
use crate::target;
-#[derive(Debug,PartialEq,Serialize)]
+#[derive(Debug,PartialEq,Eq,Hash,Serialize)]
pub enum EnumeratedListType {
Arabic,
LowerAlpha,
@@ -15,16 +15,17 @@ pub enum EnumeratedListType {
UpperRoman,
}
-#[derive(Debug,PartialEq,Serialize)]
+#[derive(Debug,PartialEq,Eq,Hash,Serialize)]
pub enum FixedSpace { Default, Preserve } // yes, default really is not “Default”
impl Default for FixedSpace { fn default() -> FixedSpace { FixedSpace::Preserve } }
-#[derive(Debug,PartialEq,Serialize)] pub enum AlignH { Left, Center, Right}
-#[derive(Debug,PartialEq,Serialize)] pub enum AlignHV { Top, Middle, Bottom, Left, Center, Right }
+#[derive(Debug,PartialEq,Eq,Hash,Serialize)] pub enum AlignH { Left, Center, Right}
+#[derive(Debug,PartialEq,Eq,Hash,Serialize)] pub enum AlignHV { Top, Middle, Bottom, Left, Center, Right }
-#[derive(Debug,PartialEq,Serialize)] pub struct ID(pub String);
-#[derive(Debug,PartialEq,Serialize)] pub struct NameToken(pub String);
+#[derive(Debug,PartialEq,Eq,Hash,Serialize)] pub struct ID(pub String);
+#[derive(Debug,PartialEq,Eq,Hash,Serialize)] pub struct NameToken(pub String);
+// no eq for f64
#[derive(Debug,PartialEq,Serialize)]
pub enum Measure { // http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#length-units
Em(f64),
diff --git a/src/parser.rs b/src/parser.rs
index 89e6827..b2512cc 100644
--- a/src/parser.rs
+++ b/src/parser.rs
@@ -1,5 +1,6 @@
pub mod token;
pub mod conversion;
+mod simplify;
mod pest_rst;
mod pair_ext_parse;
#[cfg(test)]
@@ -8,14 +9,20 @@ pub mod tests;
use failure::Error;
use pest::Parser;
-use crate::document_tree::elements::Document;
+use crate::document_tree::Document;
use self::pest_rst::{RstParser,Rule};
use self::conversion::convert_document;
+use self::simplify::resolve_references;
-/// tokens to Document tree. resolves sections, but not references
+/// Parse into a document tree and resolve sections, but not references.
+pub fn parse_only(source: &str) -> Result<Document, Error> {
+ let pairs = RstParser::parse(Rule::document, source)?;
+ convert_document(pairs)
+}
+
+/// Parse into a document tree and resolve sections and references.
pub fn parse(source: &str) -> Result<Document, Error> {
- let pairs = RstParser::parse(Rule::document, source)?;
- convert_document(pairs)
+ parse_only(source).map(resolve_references)
}
diff --git a/src/parser/simplify.rs b/src/parser/simplify.rs
new file mode 100644
index 0000000..2743a69
--- /dev/null
+++ b/src/parser/simplify.rs
@@ -0,0 +1,34 @@
+use std::collections::HashMap;
+
+use crate::target::Target;
+use crate::document_tree::{
+ Document,
+ HasChildren,
+ attribute_types::ID,
+ element_categories as c,
+};
+
+
+trait ResolvableRefs {
+ fn populate_targets(&self, refs: &mut HashMap<&ID, Target>);
+ fn resolve_refs(self, refs: &HashMap<&ID, Target>) -> Self;
+}
+
+pub fn resolve_references(mut doc: Document) -> Document {
+ let mut references = HashMap::new();
+ for c in doc.children() {
+ c.populate_targets(&mut references);
+ }
+ let new: Vec<_> = doc.children_mut().drain(..).map(|c| c.resolve_refs(&references)).collect();
+ Document::with_children(new)
+}
+
+impl ResolvableRefs for c::StructuralSubElement {
+ fn populate_targets(&self, refs: &mut HashMap<&ID, Target>) {
+ //TODO
+ }
+ fn resolve_refs(self, refs: &HashMap<&ID, Target>) -> Self {
+ self //TODO
+ }
+}
+