rustex_lib 0.1.13

A crate for converting TeX/pdfTeX to HTML
Documentation
use crate::engine::{CSName, Types};
use crate::shipout::state::ShipoutState;
use crate::utils::{VecMap, VecSet};
use pdfium_render::prelude::Pdfium;
use tex_engine::commands::Macro;
use tex_engine::engine::utils::memory::MemoryManager;
use tex_engine::engine::EngineExtension;
use tex_engine::pdflatex::nodes::{
    MinimalPDFExtension, PDFAnnot, PDFColor, PDFExtension, PDFObj, PDFXForm, PDFXImage,
};
use tex_engine::prelude::CSHandler;
use tex_engine::tex::catcodes::DEFAULT_SCHEME_U8;
use tex_engine::tex::tokens::CompactToken;

#[allow(clippy::upper_case_acronyms)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum CSS {
    File(String),
    Literal(String),
}

pub struct RusTeXExtension {
    pdf: MinimalPDFExtension<Types>,
    pub(crate) state: ShipoutState,
    pub(crate) change_markers: Vec<usize>,
    pub(crate) oddhead: CSName,
    pub(crate) oddfoot: CSName,
    pub(crate) evenhead: CSName,
    pub(crate) evenfoot: CSName,
    pub(crate) mkboth: CSName,
    pub(crate) specialpage: CSName,
    pub(crate) gobbletwo: Macro<CompactToken>,
    pub(crate) empty: Macro<CompactToken>,
    pub(crate) namespaces: VecMap<String, String>,
    pub(crate) metas: Vec<VecMap<String, String>>,
    pub(crate) top: VecMap<String, String>,
    pub(crate) css: VecSet<CSS>,
}
impl RusTeXExtension {
    pub(crate) fn push(&mut self) {
        self.change_markers.push(0)
    }
    pub(crate) fn pop(&mut self) -> usize {
        self.change_markers.pop().unwrap()
    }
}
impl EngineExtension<Types> for RusTeXExtension {
    fn new(memory: &mut MemoryManager<CompactToken>) -> Self {
        let mut namespaces = VecMap::default();
        namespaces.insert("dc".to_string(), "http://purl.org/dc/terms/".to_string());
        let mut ret = Self {
            pdf: MinimalPDFExtension::new(memory),
            state: ShipoutState::default(),
            change_markers: vec![],
            oddhead: memory.cs_interner_mut().cs_from_str("@oddhead"),
            oddfoot: memory.cs_interner_mut().cs_from_str("@oddfoot"),
            evenhead: memory.cs_interner_mut().cs_from_str("@evenhead"),
            evenfoot: memory.cs_interner_mut().cs_from_str("@evenfoot"),
            mkboth: memory.cs_interner_mut().cs_from_str("@mkboth"),
            specialpage: memory.cs_interner_mut().cs_from_str("if@specialpage"),
            gobbletwo: Macro::new::<_, _, Types>(
                memory.cs_interner_mut(),
                &DEFAULT_SCHEME_U8,
                "#1#2",
                "",
            )
            .unwrap(),
            empty: Macro::new::<_, _, Types>(memory.cs_interner_mut(), &DEFAULT_SCHEME_U8, "", "")
                .unwrap(),
            namespaces,
            metas: vec![],
            top: VecMap::default(),
            css: VecSet::default(),
        };
        ret.gobbletwo.long = true;
        ret
    }
}
impl PDFExtension<Types> for RusTeXExtension {
    fn pdfmatches(&mut self) -> &mut Vec<String> {
        self.pdf.pdfmatches()
    }

    fn elapsed(&mut self) -> &mut std::time::Instant {
        self.pdf.elapsed()
    }

    fn colorstacks(&mut self) -> &mut Vec<Vec<PDFColor>> {
        self.pdf.colorstacks()
    }

    fn current_colorstack(&mut self) -> &mut usize {
        self.pdf.current_colorstack()
    }

    fn pdfobjs(&mut self) -> &mut Vec<PDFObj> {
        self.pdf.pdfobjs()
    }

    fn pdfxforms(&mut self) -> &mut Vec<PDFXForm<Types>> {
        self.pdf.pdfxforms()
    }

    fn pdfximages(&mut self) -> &mut Vec<PDFXImage<Types>> {
        self.pdf.pdfximages()
    }

    fn pdfannots(&mut self) -> &mut Vec<PDFAnnot<Types>> {
        self.pdf.pdfannots()
    }

    fn pdfium_direct(&mut self) -> &mut Option<Option<Pdfium>> {
        self.pdf.pdfium_direct()
    }
}