mod context;
mod elements;
use self::context::TextContext;
use self::elements::render_elements;
use crate::data::PageInfo;
use crate::render::{Handle, Render};
use crate::settings::WikitextSettings;
use crate::tree::{BibliographyList, Element, SyntaxTree};
#[derive(Debug)]
pub struct TextRender;
impl TextRender {
#[inline]
pub fn render_partial(
&self,
elements: &[Element],
page_info: &PageInfo,
settings: &WikitextSettings,
wikitext_len: usize,
) -> String {
self.render_partial_direct(RenderPartial {
elements,
page_info,
settings,
table_of_contents: &[],
footnotes: &[],
bibliographies: &BibliographyList::new(),
wikitext_len,
})
}
fn render_partial_direct(
&self,
RenderPartial {
elements,
page_info,
settings,
table_of_contents,
footnotes,
bibliographies,
wikitext_len,
}: RenderPartial,
) -> String {
debug!(
"Rendering text (site {}, page {}, category {})",
page_info.site.as_ref(),
page_info.page.as_ref(),
match &page_info.category {
Some(category) => category.as_ref(),
None => "_default",
},
);
let mut ctx = TextContext::new(
page_info,
&Handle,
settings,
table_of_contents,
footnotes,
bibliographies,
wikitext_len,
);
render_elements(&mut ctx, elements);
while ctx.buffer().starts_with('\n') {
ctx.buffer().remove(0);
}
while ctx.buffer().ends_with('\n') {
ctx.buffer().pop();
}
ctx.into()
}
}
impl Render for TextRender {
type Output = String;
#[inline]
fn render(
&self,
tree: &SyntaxTree,
page_info: &PageInfo,
settings: &WikitextSettings,
) -> String {
info!(
"Rendering text (site {}, page {}, category {})",
page_info.site.as_ref(),
page_info.page.as_ref(),
match &page_info.category {
Some(category) => category.as_ref(),
None => "_default",
},
);
self.render_partial_direct(RenderPartial {
elements: &tree.elements,
page_info,
settings,
table_of_contents: &tree.table_of_contents,
footnotes: &tree.footnotes,
bibliographies: &tree.bibliographies,
wikitext_len: tree.wikitext_len,
})
}
}
#[derive(Debug)]
struct RenderPartial<'a> {
elements: &'a [Element<'a>],
page_info: &'a PageInfo<'a>,
settings: &'a WikitextSettings,
table_of_contents: &'a [Element<'a>],
footnotes: &'a [Vec<Element<'a>>],
bibliographies: &'a BibliographyList<'a>,
wikitext_len: usize,
}