aboutsummaryrefslogtreecommitdiffstats
path: root/renderer/src
diff options
context:
space:
mode:
Diffstat (limited to 'renderer/src')
-rw-r--r--renderer/src/html.rs8
-rw-r--r--renderer/src/lib.rs1
-rw-r--r--renderer/src/opt.rs93
3 files changed, 100 insertions, 2 deletions
diff --git a/renderer/src/html.rs b/renderer/src/html.rs
index bb7c42e..3dab74e 100644
--- a/renderer/src/html.rs
+++ b/renderer/src/html.rs
@@ -6,6 +6,7 @@ use std::io::Write;
use failure::Error;
// use crate::url::Url;
+use crate::opt::{RenderOptionsStandalone, RenderOptionsStandaloneBuilder};
use document_tree::{
Document,Element,HasChildren,ExtraAttributes,
elements as e,
@@ -17,9 +18,12 @@ use document_tree::{
// static FOOTNOTE_SYMBOLS: [char; 10] = ['*', '†', '‡', '§', '¶', '#', '♠', '♥', '♦', '♣'];
-pub fn render_html<W>(document: &Document, stream: W, standalone: bool) -> Result<(), Error> where W: Write {
+pub fn render_html<W, O>(document: &Document, stream: W, opts: O) -> Result<(), Error>
+ where W: Write, O: Into<RenderOptionsStandalone>
+{
let mut renderer = HTMLRenderer { stream, level: 0 };
- if standalone {
+ let opts = opts.into();
+ if opts.standalone() {
document.render_html(&mut renderer)
} else {
for c in document.children() {
diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs
index 4d6bfdb..c9bc7dd 100644
--- a/renderer/src/lib.rs
+++ b/renderer/src/lib.rs
@@ -1,4 +1,5 @@
mod html;
+mod opt;
use std::io::Write;
diff --git a/renderer/src/opt.rs b/renderer/src/opt.rs
new file mode 100644
index 0000000..2242624
--- /dev/null
+++ b/renderer/src/opt.rs
@@ -0,0 +1,93 @@
+pub struct RenderOptions {
+ initial_header_level: u8,
+}
+
+impl Default for RenderOptions {
+ fn default() -> Self {
+ RenderOptions {
+ initial_header_level: 0,
+ }
+ }
+}
+
+pub trait RenderOptionsBuilder {
+ fn initial_header_level(&self) -> u8;
+ fn with_initial_header_level(&mut self, lvl: u8) -> &mut Self;
+}
+
+impl RenderOptionsBuilder for RenderOptions {
+ fn initial_header_level(&self) -> u8 {
+ self.initial_header_level
+ }
+ fn with_initial_header_level(&mut self, lvl: u8) -> &mut Self {
+ self.initial_header_level = lvl;
+ self
+ }
+}
+
+// standalone document formats
+
+pub struct RenderOptionsStandalone {
+ render_options: RenderOptions,
+ standalone: bool,
+}
+
+impl Default for RenderOptionsStandalone {
+ fn default() -> Self {
+ RenderOptionsStandalone {
+ render_options: Default::default(),
+ standalone: true,
+ }
+ }
+}
+
+pub trait RenderOptionsStandaloneBuilder {
+ fn into_render_options(self) -> RenderOptions;
+ fn render_options(&self) -> &RenderOptions;
+ fn render_options_mut(&mut self) -> &mut RenderOptions;
+ fn standalone(&self) -> bool;
+ fn with_standalone(&mut self, standalone: bool) -> &mut Self;
+}
+
+impl<T> RenderOptionsBuilder for T where T: RenderOptionsStandaloneBuilder {
+ fn initial_header_level(&self) -> u8 {
+ self.render_options().initial_header_level()
+ }
+ fn with_initial_header_level(&mut self, lvl: u8) -> &mut Self {
+ self.render_options_mut().with_initial_header_level(lvl);
+ self
+ }
+}
+
+impl RenderOptionsStandaloneBuilder for RenderOptionsStandalone {
+ fn into_render_options(self) -> RenderOptions {
+ self.render_options
+ }
+ fn render_options(&self) -> &RenderOptions {
+ &self.render_options
+ }
+ fn render_options_mut(&mut self) -> &mut RenderOptions {
+ &mut self.render_options
+ }
+ fn standalone(&self) -> bool {
+ self.standalone
+ }
+ fn with_standalone(&mut self, standalone: bool) -> &mut Self {
+ self.standalone = standalone;
+ self
+ }
+}
+
+impl From<bool> for RenderOptionsStandalone {
+ fn from(standalone: bool) -> Self {
+ let mut r: RenderOptionsStandalone = Default::default();
+ r.with_standalone(standalone);
+ r
+ }
+}
+
+impl<T> From<T> for RenderOptions where T: RenderOptionsStandaloneBuilder {
+ fn from(opts: T) -> Self {
+ opts.into_render_options()
+ }
+}