aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp A2018-12-02 20:43:34 +0100
committerPhilipp A2018-12-02 20:43:34 +0100
commita22f1caf79d947ce860f9a4751c583bc90393069 (patch)
tree27a5ccf76deb4c7fe65ea688a13eb319320ffc1e
parentb46de05f56960074edff80d24af48f59f163e293 (diff)
downloadrust-rst-a22f1caf79d947ce860f9a4751c583bc90393069.tar.bz2
wonkily add names and so on
-rw-r--r--src/document_tree/elements.rs28
-rw-r--r--src/document_tree/extra_attributes.rs11
-rw-r--r--src/parser/conversion/block.rs13
-rw-r--r--src/parser/conversion/inline.rs6
4 files changed, 39 insertions, 19 deletions
diff --git a/src/document_tree/elements.rs b/src/document_tree/elements.rs
index 5f669ae..638d44b 100644
--- a/src/document_tree/elements.rs
+++ b/src/document_tree/elements.rs
@@ -1,6 +1,7 @@
use serde_derive::Serialize;
use crate::target;
+use super::attribute_types::{ID,NameToken};
use super::extra_attributes::{self,ExtraAttributes};
use super::element_categories::*;
@@ -10,10 +11,15 @@ use super::element_categories::*;
//-----------------\\
pub trait Element {
- fn ids (& self) -> & Vec<String>;
- fn ids_mut(&mut self) -> &mut Vec<String>;
- fn names (& self) -> & Vec<String>;
- fn names_mut(&mut self) -> &mut Vec<String>;
+ /// A list containing one or more unique identifier keys
+ fn ids (& self) -> & Vec<ID>;
+ fn ids_mut(&mut self) -> &mut Vec<ID>;
+ /// a list containing the names of an element, typically originating from the element's title or content.
+ /// Each name in names must be unique; if there are name conflicts (two or more elements want to the same name),
+ /// the contents will be transferred to the dupnames attribute on the duplicate elements.
+ /// An element may have at most one of the names or dupnames attributes, but not both.
+ fn names (& self) -> & Vec<NameToken>;
+ fn names_mut(&mut self) -> &mut Vec<NameToken>;
fn source (& self) -> & Option<target::Target>;
fn source_mut(&mut self) -> &mut Option<target::Target>;
fn classes (& self) -> & Vec<String>;
@@ -22,11 +28,11 @@ pub trait Element {
#[derive(Debug,Default,Serialize)]
pub struct CommonAttributes {
- ids: Vec<String>,
- names: Vec<String>,
+ ids: Vec<ID>,
+ names: Vec<NameToken>,
source: Option<target::Target>,
classes: Vec<String>,
- //left out dupnames
+ //TODO: dupnames
}
//----\\
@@ -35,10 +41,10 @@ pub struct CommonAttributes {
macro_rules! impl_element { ($name:ident) => (
impl Element for $name {
- fn ids (& self) -> & Vec<String> { & self.common.ids }
- fn ids_mut(&mut self) -> &mut Vec<String> { &mut self.common.ids }
- fn names (& self) -> & Vec<String> { & self.common.names }
- fn names_mut(&mut self) -> &mut Vec<String> { &mut self.common.names }
+ fn ids (& self) -> & Vec<ID> { & self.common.ids }
+ fn ids_mut(&mut self) -> &mut Vec<ID> { &mut self.common.ids }
+ fn names (& self) -> & Vec<NameToken> { & self.common.names }
+ fn names_mut(&mut self) -> &mut Vec<NameToken> { &mut self.common.names }
fn source (& self) -> & Option<target::Target> { & self.common.source }
fn source_mut(&mut self) -> &mut Option<target::Target> { &mut self.common.source }
fn classes (& self) -> & Vec<String> { & self.common.classes }
diff --git a/src/document_tree/extra_attributes.rs b/src/document_tree/extra_attributes.rs
index 0aa40f8..1799e4f 100644
--- a/src/document_tree/extra_attributes.rs
+++ b/src/document_tree/extra_attributes.rs
@@ -40,8 +40,11 @@ impl_extra!(DoctestBlock { space: FixedSpace });
impl_extra!(SubstitutionDefinition { ltrim: bool, rtrim: bool });
impl_extra!(Comment { space: FixedSpace });
impl_extra!(Target {
+ /// External reference to a URI/URL
refuri: Option<target::Target>,
+ /// References to ids attributes in other elements
refid: Option<ID>,
+ /// Internal reference to the names attribute of another element. May resolve to either an internal or external reference.
refname: Vec<NameToken>,
anonymous: bool,
});
@@ -71,9 +74,12 @@ impl_extra!(Table {}); //TODO
impl_extra!(OptionArgument { delimiter: Option<String> });
impl_extra!(Reference {
- name: Option<String>,
+ name: Option<NameToken>, //TODO: is CDATA in the DTD, so maybe no nametoken?
+ /// External reference to a URI/URL
refuri: Option<target::Target>,
+ /// References to ids attributes in other elements
refid: Option<ID>,
+ /// Internal reference to the names attribute of another element
refname: Vec<NameToken>,
});
impl_extra!(FootnoteReference { refid: Option<ID>, refname: Vec<NameToken>, auto: bool });
@@ -83,8 +89,11 @@ impl_extra!(Problematic { refid: Option<ID> });
//also have non-inline versions. Inline image is no figure child, inline target has content
impl_extra!(TargetInline {
+ /// External reference to a URI/URL
refuri: Option<target::Target>,
+ /// References to ids attributes in other elements
refid: Option<ID>,
+ /// Internal reference to the names attribute of another element. May resolve to either an internal or external reference.
refname: Vec<NameToken>,
anonymous: bool,
});
diff --git a/src/parser/conversion/block.rs b/src/parser/conversion/block.rs
index d99f38f..bca8559 100644
--- a/src/parser/conversion/block.rs
+++ b/src/parser/conversion/block.rs
@@ -5,7 +5,7 @@ use crate::document_tree::{
Element,HasChildren,ExtraAttributes,
elements as e,
element_categories as c,
- attribute_types::ID,
+ attribute_types::{ID,NameToken},
extra_attributes as a,
};
@@ -61,8 +61,11 @@ fn convert_target(pair: Pair<Rule>) -> Result<e::Target, Error> {
};
for p in pair.into_inner() {
match p.as_rule() {
- // TODO: or is it refnames?
- Rule::target_name_uq | Rule::target_name_qu => attrs.refid = Some(ID(p.as_str().to_owned())),
+ Rule::target_name_uq | Rule::target_name_qu => {
+ //TODO: abstract
+ attrs.refid = Some( ID(p.as_str().to_owned().replace(' ', "-")));
+ attrs.refname.push(NameToken(p.as_str().to_owned()));
+ },
Rule::link_target => attrs.refuri = Some(p.parse()?),
rule => panic!("Unexpected rule in target: {:?}", rule),
}
@@ -79,7 +82,7 @@ fn convert_substitution_def(pair: Pair<Rule>) -> Result<e::SubstitutionDefinitio
rule => panic!("Unknown substitution rule {:?}", rule),
};
let mut subst_def = e::SubstitutionDefinition::with_children(vec![inner.into()]);
- subst_def.names_mut().push(name.to_owned());
+ subst_def.names_mut().push(NameToken(name.to_owned()));
Ok(subst_def)
}
@@ -96,7 +99,7 @@ fn convert_image<I>(pair: Pair<Rule>) -> Result<I, Error> where I: Element + Ext
let opt_val = opt_iter.next().unwrap();
match opt_name.as_str() {
"class" => image.classes_mut().push(opt_val.as_str().to_owned()),
- "name" => image.names_mut().push(opt_val.as_str().to_owned()),
+ "name" => image.names_mut().push(NameToken(opt_val.as_str().to_owned())),
"alt" => image.extra_mut().alt = Some(opt_val.as_str().to_owned()),
"height" => image.extra_mut().height = Some(opt_val.parse()?),
"width" => image.extra_mut().width = Some(opt_val.parse()?),
diff --git a/src/parser/conversion/inline.rs b/src/parser/conversion/inline.rs
index 5d75c69..d0aa524 100644
--- a/src/parser/conversion/inline.rs
+++ b/src/parser/conversion/inline.rs
@@ -5,7 +5,7 @@ use crate::document_tree::{
ExtraAttributes,
elements as e,
element_categories as c,
-// attribute_types::ID,
+ attribute_types::{ID,NameToken},
extra_attributes as a,
};
@@ -32,7 +32,9 @@ fn convert_reference(pair: Pair<Rule>) -> Result<e::Reference, Error> {
match concrete.as_rule() {
Rule::reference_target => {
let rt_inner = concrete.into_inner().next().unwrap(); // reference_target_uq or target_name_qu
- name = Some(rt_inner.as_str().to_owned()); // TODO: is this right?
+ //TODO: abstract
+ id = Some( ID(rt_inner.as_str().to_owned().replace(' ', "-")));
+ name = Some(NameToken(rt_inner.as_str().to_owned()));
},
Rule::reference_explicit => unimplemented!("explicit reference"),
Rule::reference_auto => unimplemented!("auto reference"),