Skip to content

Commit f53de88

Browse files
author
tjk
committed
Add initial support for html_writer macro and expose writer base class
1 parent 24a1b37 commit f53de88

File tree

7 files changed

+77
-26
lines changed

7 files changed

+77
-26
lines changed

Cargo.lock

Lines changed: 4 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pulldown-html-ext/src/html/default.rs

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,58 @@ use pulldown_cmark_escape::StrWrite;
33
use crate::html::config::HtmlConfig;
44
use crate::html::state::HtmlState;
55
use crate::html::writer::HtmlWriter;
6+
use crate::html_writer;
67

7-
/// Default HTML writer implementation that can work with any StrWrite-compatible writer
8-
pub struct DefaultHtmlWriter<'a, W: StrWrite> {
8+
/// Base type for HTML writers that handles common functionality
9+
pub struct HtmlWriterBase<W: StrWrite> {
910
writer: W,
10-
config: &'a HtmlConfig,
11+
config: HtmlConfig,
1112
state: HtmlState,
1213
}
1314

14-
impl<'a, W: StrWrite> DefaultHtmlWriter<'a, W> {
15-
/// Create a new DefaultHtmlWriter with the given writer and configuration
16-
pub fn new(writer: W, config: &'a HtmlConfig) -> Self {
15+
impl<W: StrWrite> HtmlWriterBase<W> {
16+
/// Create a new HtmlWriterBase with the given writer and configuration
17+
pub fn new(writer: W, config: HtmlConfig) -> Self {
1718
Self {
1819
writer,
1920
config,
2021
state: HtmlState::new(),
2122
}
2223
}
23-
}
2424

25-
impl<'a, W: StrWrite> HtmlWriter<W> for DefaultHtmlWriter<'a, W> {
26-
fn get_writer(&mut self) -> &mut W {
25+
/// Get a mutable reference to the underlying writer
26+
pub fn get_writer(&mut self) -> &mut W {
2727
&mut self.writer
2828
}
2929

30-
fn get_config(&self) -> &HtmlConfig {
31-
self.config
30+
/// Get a reference to the configuration
31+
pub fn get_config(&self) -> &HtmlConfig {
32+
&self.config
3233
}
3334

34-
fn get_state(&mut self) -> &mut HtmlState {
35+
/// Get a mutable reference to the state
36+
pub fn get_state(&mut self) -> &mut HtmlState {
3537
&mut self.state
3638
}
3739
}
3840

41+
/// Default HTML writer implementation that can work with any StrWrite-compatible writer
42+
/// This should be the approximate amount of code any custom implementation needs to
43+
/// provide
44+
#[html_writer]
45+
pub struct DefaultHtmlWriter<W: StrWrite> {
46+
base: HtmlWriterBase<W>,
47+
}
48+
49+
impl<W: StrWrite> DefaultHtmlWriter<W> {
50+
/// Create a new DefaultHtmlWriter with the given writer and configuration
51+
pub fn new(writer: W, config: HtmlConfig) -> Self {
52+
Self {
53+
base: HtmlWriterBase::new(writer, config.clone()),
54+
}
55+
}
56+
}
57+
3958
#[cfg(test)]
4059
mod tests {
4160
use super::*;
@@ -46,7 +65,7 @@ mod tests {
4665
fn test_basic_writing() {
4766
let mut output = String::new();
4867
let config = HtmlConfig::default();
49-
let mut writer = DefaultHtmlWriter::new(FmtWriter(&mut output), &config);
68+
let mut writer = DefaultHtmlWriter::new(FmtWriter(&mut output), config);
5069

5170
writer.write_str("<p>").unwrap();
5271
let _ = escape_html(&mut writer.get_writer(), "Hello & World");
@@ -66,7 +85,7 @@ mod tests {
6685
.collect(),
6786
);
6887

69-
let mut writer = DefaultHtmlWriter::new(FmtWriter(&mut output), &config);
88+
let mut writer = DefaultHtmlWriter::new(FmtWriter(&mut output), config);
7089
writer.start_paragraph().unwrap();
7190
writer.text("Test").unwrap();
7291
writer.end_paragraph().unwrap();
@@ -99,7 +118,7 @@ mod tests {
99118
#[test]
100119
fn test_custom_writer() {
101120
let config = HtmlConfig::default();
102-
let mut writer = DefaultHtmlWriter::new(TestWriter(String::new()), &config);
121+
let mut writer = DefaultHtmlWriter::new(TestWriter(String::new()), config);
103122

104123
writer.write_str("Test").unwrap();
105124
assert_eq!(writer.get_writer().0, "Test");
@@ -110,7 +129,7 @@ mod tests {
110129
let mut output = String::new();
111130
let mut config = HtmlConfig::default();
112131
config.html.escape_html = true;
113-
let mut writer = DefaultHtmlWriter::new(FmtWriter(&mut output), &config);
132+
let mut writer = DefaultHtmlWriter::new(FmtWriter(&mut output), config);
114133

115134
assert!(!writer.get_state().currently_in_code_block);
116135
writer.get_state().currently_in_code_block = true;

pulldown-html-ext/src/html/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ where
203203
W: std::fmt::Write,
204204
I: Iterator<Item = Event<'a>>,
205205
{
206-
let writer = DefaultHtmlWriter::new(FmtWriter(writer), config);
206+
let writer = DefaultHtmlWriter::new(FmtWriter(writer), config.clone());
207207
let mut renderer = HtmlRenderer::new(writer);
208208
renderer.run(iter)
209209
}
@@ -220,7 +220,7 @@ where
220220
W: std::io::Write,
221221
I: Iterator<Item = Event<'a>>,
222222
{
223-
let writer = DefaultHtmlWriter::new(IoWriter(writer), config);
223+
let writer = DefaultHtmlWriter::new(IoWriter(writer), config.clone());
224224
let mut renderer = HtmlRenderer::new(writer);
225225
renderer.run(iter)
226226
}

pulldown-html-ext/src/html/syntect.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ impl HtmlConfig {
9292

9393
/// Writer that adds syntax highlighting to code blocks
9494
pub struct SyntectWriter<'a, W: StrWrite> {
95-
inner: DefaultHtmlWriter<'a, W>,
95+
inner: DefaultHtmlWriter<W>,
9696
style: SyntectConfigStyle,
9797
syntax_set: Option<&'a SyntaxSet>,
9898
theme_set: Option<&'a ThemeSet>,
@@ -104,7 +104,7 @@ impl<'a, W: StrWrite> SyntectWriter<'a, W> {
104104
let style = config.syntect.clone().unwrap_or_default();
105105

106106
Self {
107-
inner: DefaultHtmlWriter::new(writer, config),
107+
inner: DefaultHtmlWriter::new(writer, config.clone()),
108108
style,
109109
syntax_set: None,
110110
theme_set: None,
@@ -121,7 +121,7 @@ impl<'a, W: StrWrite> SyntectWriter<'a, W> {
121121
let style = config.syntect.clone().unwrap_or_default();
122122

123123
Self {
124-
inner: DefaultHtmlWriter::new(writer, config),
124+
inner: DefaultHtmlWriter::new(writer, config.clone()),
125125
style,
126126
syntax_set,
127127
theme_set,

pulldown-html-ext/src/html/writer.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,37 @@ pub trait HtmlWriter<W: StrWrite> {
530530
}
531531
}
532532

533+
// Default bases to derive from, implements the default getter methods.
534+
pub struct HtmlWriterBase<W: StrWrite> {
535+
writer: W,
536+
config: HtmlConfig,
537+
state: HtmlState,
538+
}
539+
540+
impl<W: StrWrite> HtmlWriterBase<W> {
541+
pub fn new(writer: W, config: HtmlConfig) -> Self {
542+
Self {
543+
writer,
544+
config,
545+
state: HtmlState::new(),
546+
}
547+
}
548+
}
549+
550+
impl<W: StrWrite> HtmlWriter<W> for HtmlWriterBase<W> {
551+
fn get_writer(&mut self) -> &mut W {
552+
&mut self.writer
553+
}
554+
555+
fn get_config(&self) -> &HtmlConfig {
556+
&self.config
557+
}
558+
559+
fn get_state(&mut self) -> &mut HtmlState {
560+
&mut self.state
561+
}
562+
}
563+
533564
#[cfg(test)]
534565
mod tests {
535566

pulldown-html-ext/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,13 @@
7474
7575
mod html;
7676
pub mod utils;
77-
7877
pub use html::{
7978
create_html_renderer, push_html, push_html_with_highlighting, write_html_fmt, write_html_io,
8079
AttributeMappings, CodeBlockOptions, DefaultHtmlWriter, ElementOptions, HeadingOptions,
8180
HtmlConfig, HtmlError, HtmlOptions, HtmlRenderer, HtmlState, HtmlWriter, LinkOptions,
8281
SyntectConfig, SyntectConfigStyle, SyntectWriter,
8382
};
83+
pub use pulldown_html_ext_derive::html_writer;
8484

8585
#[cfg(test)]
8686
mod tests_lib {

pulldown-html-ext/tests/integration.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::collections::HashMap;
55

66
fn render_with_config(input: &str, config: &HtmlConfig) -> String {
77
let mut output = String::new();
8-
let handler = DefaultHtmlWriter::new(&mut output, config);
8+
let handler = DefaultHtmlWriter::new(&mut output, config.clone());
99
let mut renderer = HtmlRenderer::new(handler);
1010
let _ = renderer.run(Parser::new(input));
1111
output

0 commit comments

Comments
 (0)