aboutsummaryrefslogtreecommitdiffstats
path: root/src/document_tree/extra_attributes.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/document_tree/extra_attributes.rs')
-rw-r--r--src/document_tree/extra_attributes.rs92
1 files changed, 52 insertions, 40 deletions
diff --git a/src/document_tree/extra_attributes.rs b/src/document_tree/extra_attributes.rs
index 80fe045..916ba41 100644
--- a/src/document_tree/extra_attributes.rs
+++ b/src/document_tree/extra_attributes.rs
@@ -1,50 +1,27 @@
use url::Url;
-use serde::{
- Serialize,
- Serializer,
- ser::SerializeStruct,
-};
+use serde_derive::Serialize;
+use super::serde_util::{serialize_url,serialize_opt_url};
use super::attribute_types::{FixedSpace,ID,NameToken,AlignHV,AlignH,Measure,EnumeratedListType};
pub trait ExtraAttributes<A> {
-// fn with_extra(extra: A) -> Self;
+ fn with_extra(extra: A) -> Self;
fn extra (& self) -> & A;
fn extra_mut(&mut self) -> &mut A;
}
-macro_rules! count {
- () => (0usize);
- ( $x:tt $($xs:tt)* ) => (1usize + count!($($xs)*));
-}
-
-macro_rules! ser_url {
- ($self:ident, refuri ) => { $self.refuri.as_ref().map(|uri| uri.to_string()) };
- ($self:ident, uri ) => { $self.uri.to_string() };
- ($self:ident, $param:ident) => { $self.$param };
-}
-
macro_rules! impl_extra {
- ( $name:ident { $( $param:ident : $type:ty ),* $(,)* } ) => (
+ ( $name:ident { $( $(#[$pattr:meta])* $param:ident : $type:ty ),* $(,)* } ) => (
impl_extra!(
- #[derive(Default,Debug)]
- $name { $( $param : $type, )* }
+ #[derive(Default,Debug,Serialize)]
+ $name { $( $(#[$pattr])* $param : $type, )* }
);
);
- ( $(#[$attr:meta])+ $name:ident { $( $param:ident : $type:ty ),* $(,)* } ) => (
+ ( $(#[$attr:meta])+ $name:ident { $( $(#[$pattr:meta])* $param:ident : $type:ty ),* $(,)* } ) => (
$(#[$attr])+
pub struct $name {
- $( pub $param : $type, )*
- }
-
- impl Serialize for $name {
- fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
- #[allow(unused_mut)]
- let mut state = serializer.serialize_struct(stringify!($name), count!($($param)*))?;
- $( state.serialize_field(stringify!($param), &ser_url!(self, $param))?; )*
- state.end()
- }
+ $( $(#[$pattr])* pub $param : $type, )*
}
);
}
@@ -54,15 +31,24 @@ impl_extra!(LiteralBlock { space: FixedSpace });
impl_extra!(DoctestBlock { space: FixedSpace });
impl_extra!(SubstitutionDefinition { ltrim: Option<bool>, rtrim: Option<bool> });
impl_extra!(Comment { space: FixedSpace });
-impl_extra!(Target { refuri: Option<Url>, refid: Option<ID>, refname: Vec<NameToken>, anonymous: bool });
+impl_extra!(Target {
+ #[serde(serialize_with = "serialize_opt_url")]
+ refuri: Option<Url>,
+ refid: Option<ID>,
+ refname: Vec<NameToken>,
+ anonymous: bool,
+});
impl_extra!(Raw { space: FixedSpace, format: Vec<NameToken> });
-impl_extra!(#[derive(Debug)] Image {
- align: Option<AlignHV>,
+impl_extra!(#[derive(Debug,Serialize)] Image {
+ #[serde(serialize_with = "serialize_url")]
uri: Url,
+ align: Option<AlignHV>,
alt: Option<String>,
height: Option<Measure>,
width: Option<Measure>,
- scale: Option<f64>,
+ scale: Option<u8>,
+ #[serde(serialize_with = "serialize_opt_url")]
+ target: Option<Url>, // Not part of the DTD but a valid argument
});
//bools usually are XML yesorno. “auto” however either exists and is set to something random like “1” or doesn’t exist
@@ -78,20 +64,46 @@ impl_extra!(Table {}); //TODO
impl_extra!(OptionArgument { delimiter: Option<String> });
-impl_extra!(Reference { name: Option<String>, refuri: Option<Url>, refid: Option<ID>, refname: Vec<NameToken> });
+impl_extra!(Reference {
+ name: Option<String>,
+ #[serde(serialize_with = "serialize_opt_url")]
+ refuri: Option<Url>,
+ refid: Option<ID>,
+ refname: Vec<NameToken>,
+});
impl_extra!(FootnoteReference { refid: Option<ID>, refname: Vec<NameToken>, auto: Option<bool> });
impl_extra!(CitationReference { refid: Option<ID>, refname: Vec<NameToken> });
impl_extra!(SubstitutionReference { refname: Vec<NameToken> });
impl_extra!(Problematic { refid: Option<ID> });
//also have non-inline versions. Inline image is no figure child, inline target has content
-impl_extra!(TargetInline { refuri: Option<Url>, refid: Option<ID>, refname: Vec<NameToken>, anonymous: bool });
+impl_extra!(TargetInline {
+ #[serde(serialize_with = "serialize_opt_url")]
+ refuri: Option<Url>,
+ refid: Option<ID>,
+ refname: Vec<NameToken>,
+ anonymous: bool,
+});
impl_extra!(RawInline { space: FixedSpace, format: Vec<NameToken> });
-impl_extra!(#[derive(Debug)] ImageInline {
- align: Option<AlignHV>,
+impl_extra!(#[derive(Debug,Serialize)] ImageInline {
+ #[serde(serialize_with = "serialize_url")]
uri: Url,
+ align: Option<AlignHV>,
alt: Option<String>,
height: Option<Measure>,
width: Option<Measure>,
- scale: Option<f64>,
+ scale: Option<u8>,
+ #[serde(serialize_with = "serialize_opt_url")]
+ target: Option<Url>, // Not part of the DTD but a valid argument
});
+impl ImageInline {
+ pub fn new(uri: Url) -> ImageInline { ImageInline {
+ uri: uri,
+ align: None,
+ alt: None,
+ height: None,
+ width: None,
+ scale: None,
+ target: None,
+ } }
+}