use std::path::PathBuf;
use crate::plectureparser::lecture_book_theme::{
lecture_book_theme_header,
lecture_book_theme_body_begin,
lecture_book_theme_body_top_menu,
lecture_book_theme_body_end
};
use crate::phighlighter::PLocation;
use crate::pcontent::{
PAbstractLectureBackend,
PVecContent,
};
use crate::plectureparser::{
plecturebuffer::PLectureBuffer,
plecturemenu::PLectureMenu,
pformulamanager::PFormulaManager
};
pub struct PLecureBackend{
p_output_directory: PathBuf,
p_project_url: String,
p_author_email: String,
p_current_branch: String,
p_master_project_url: String,
p_prev_page: String,
p_next_page: String,
p_current_filename: String,
p_buffer: PLectureBuffer,
p_menu: PLectureMenu,
p_formula_manager: PFormulaManager,
}
impl Drop for PLecureBackend {
fn drop(&mut self) {
self.close();
}
}
impl PLecureBackend {
pub fn new(absolute_output_directory: &PathBuf, project_url: &String, author_email: &String, current_branch: &String, master_project_url: &String, vec_content: &PVecContent, main_page_index_image: &Option<PathBuf>) -> Self{
PLecureBackend {
p_output_directory: absolute_output_directory.clone(),
p_project_url: project_url.clone(),
p_author_email: author_email.clone(),
p_current_branch: current_branch.clone(),
p_master_project_url: master_project_url.clone(),
p_prev_page: String::from("index.html"),
p_next_page: String::from("index.html"),
p_current_filename: String::from("index.html"),
p_buffer: Default::default(),
p_menu: PLectureMenu::from(vec_content, main_page_index_image),
p_formula_manager: PFormulaManager::new(absolute_output_directory)
}
}
}
impl PAbstractLectureBackend for PLecureBackend {
fn create_file(&mut self, output_filename: &String, title: &String,
location: &PLocation,
prev_page: &String, next_page: &String)
{
let base_filename = PathBuf::from(output_filename);
let absolute_output_filename: PathBuf = if base_filename.is_absolute() {
base_filename
}else{
self.p_output_directory.join(base_filename)
};
self.close();
self.p_buffer = PLectureBuffer::new(&absolute_output_filename);
self.write(&lecture_book_theme_header(title));
self.write(&lecture_book_theme_body_begin());
self.p_menu.to_html(&mut self.p_buffer, output_filename);
self.write(&lecture_book_theme_body_top_menu(&self.p_project_url, &self.p_author_email, &self.p_current_branch, &String::from(location.get_filename().to_str().unwrap()), location.get_current_line(), &self.p_master_project_url));
self.p_current_filename = output_filename.clone();
self.p_prev_page = prev_page.clone();
self.p_next_page = next_page.clone();
}
fn write(&mut self, text: &String){
self.p_buffer.write(text);
}
fn write_formula(&mut self, formula: &String){
let html: String = self.p_formula_manager.formula_to_html(formula);
self.write(&html);
}
fn close(&mut self){
if self.p_buffer.is_writable() { self.p_buffer.write(&lecture_book_theme_body_end(&self.p_prev_page, &self.p_next_page));
}
self.p_buffer.close();
}
}