diff options
author | Thomas Letan <contact@thomasletan.fr> | 2019-08-15 16:37:05 +0200 |
---|---|---|
committer | Thomas Letan <contact@thomasletan.fr> | 2019-08-15 16:37:05 +0200 |
commit | ad4f316b577593cecedeb76e381d1165b5fc9a62 (patch) | |
tree | 21619732691772bc77656f267b34b80994a2fc9b | |
parent | refactor: Make [load_and_render] static and self-sufficient (diff) |
feature: Require to specify the language of the Book
In addition to define the typography to use when generating ogmarkup
document, celtchar also sets the ebook metadata accordingly. This
patch required to update ogmkarkup for [ogmarkup::compile] works with
Typography objects of unknown size.
-rw-r--r-- | app/src/filesystem.rs | 3 | ||||
-rw-r--r-- | app/src/main.rs | 4 | ||||
-rw-r--r-- | lib/src/epub.rs | 9 | ||||
-rw-r--r-- | lib/src/project.rs | 27 | ||||
-rw-r--r-- | templates/chapter.xhtml | 4 | ||||
-rw-r--r-- | templates/content.opf | 2 |
6 files changed, 34 insertions, 15 deletions
diff --git a/app/src/filesystem.rs b/app/src/filesystem.rs index 7c07219..066e2d2 100644 --- a/app/src/filesystem.rs +++ b/app/src/filesystem.rs @@ -57,7 +57,8 @@ fn canonicalize_project( .or_raise("…")?, numbering: project.numbering, chapters: project.chapters.iter().map(canonicalize_chapter) - .collect::<Result<_, Error>>()? + .collect::<Result<_, Error>>()?, + language: project.language, }) } diff --git a/app/src/main.rs b/app/src/main.rs index 949f0ed..8b50d25 100644 --- a/app/src/main.rs +++ b/app/src/main.rs @@ -9,8 +9,6 @@ use std::path::PathBuf; use clap::{App, SubCommand}; -use ogmarkup::typography::FRENCH; - use libceltchar::{Error, Zip, Project, EpubWriter}; #[cfg(debug_assertions)] @@ -25,7 +23,7 @@ fn build(assets : &PathBuf) -> Result<(), Error> { let root = find_root()?; let loader = Fs; - let project = Project::load_and_render(&root, &loader, &FRENCH)?; + let project = Project::load_and_render(&root, &loader)?; let mut zip_writer = Zip::init()?; zip_writer.generate(&project, assets)?; diff --git a/lib/src/epub.rs b/lib/src/epub.rs index daa3446..518bdbf 100644 --- a/lib/src/epub.rs +++ b/lib/src/epub.rs @@ -6,7 +6,7 @@ use serde_json::json; use tera::{Tera, Context}; use crate::error::{Raise, Error}; -use crate::project::{Project, Chapter, Cover}; +use crate::project::{Project, Chapter, Cover, Language}; use zip::write::FileOptions; use zip::ZipWriter; @@ -58,7 +58,8 @@ pub trait EpubWriter { &mut self, tera : &Tera, chapters : &Vec<Chapter<String>>, - numbering : bool + numbering : bool, + lang : &Language, ) -> Result<(), Error> { chapters.iter().enumerate() .map(|(idx, c)| { @@ -66,6 +67,7 @@ pub trait EpubWriter { ctx.insert("number", &(idx + 1)); ctx.insert("chapter", &c); ctx.insert("numbering", &numbering); + ctx.insert("language", &lang); let path : String = format!("{}.xhtml", idx); @@ -106,7 +108,7 @@ pub trait EpubWriter { self.create_mimetype()?; self.create_container(&tera)?; - self.create_chapters(&tera, &project.chapters, project.numbering.unwrap_or(false))?; + self.create_chapters(&tera, &project.chapters, project.numbering.unwrap_or(false), &project.language)?; self.write_template( &PathBuf::from("OEBPS/Style/main.css"), @@ -137,6 +139,7 @@ pub trait EpubWriter { ctx.insert("cover_extension", &project.cover.as_ref().map(|x| x.extension.clone())); ctx.insert("files", &files); ctx.insert("fonts", &fonts); + ctx.insert("language", &project.language); self.write_template( &PathBuf::from("OEBPS/content.opf"), diff --git a/lib/src/project.rs b/lib/src/project.rs index e5ba7d4..c3af473 100644 --- a/lib/src/project.rs +++ b/lib/src/project.rs @@ -1,10 +1,25 @@ -use ogmarkup::typography::Typography; +use ogmarkup::typography::{Typography, FRENCH, ENGLISH}; use serde_derive::{Deserialize, Serialize}; use crate::render::Html; use crate::error::{Raise, Error}; #[derive(Debug, Serialize, Deserialize)] +pub enum Language { + Fr, + En, +} + +impl Language { + pub fn typography(&self) -> &dyn Typography { + match self { + Language::Fr => &FRENCH, + Language::En => &ENGLISH, + } + } +} + +#[derive(Debug, Serialize, Deserialize)] pub struct Cover { pub extension : String, pub content : Vec<u8>, @@ -44,7 +59,7 @@ impl<I> Chapter<Vec<I>> { typo : &T, ) -> Result<Chapter<String>, Error> where - T : Typography, + T : Typography + ?Sized, L : Loader<DocId = I> { let title = &self.title; @@ -74,20 +89,21 @@ pub struct Project<C, I> { pub chapters: Vec<Chapter<I>>, pub cover: Option<C>, pub numbering: Option<bool>, + pub language: Language, } impl Project<Cover, String> { - pub fn load_and_render<'input, T, L> ( + pub fn load_and_render<'input, L> ( id : &L::ProjId, loader : &L, - typo : &T, ) -> Result<Project<Cover, String>, Error> where - T : Typography, L : Loader, { let project = loader.load_project(id)?; + let lang = project.language; + let typo = lang.typography(); let numbering = project.numbering; let author = project.author; let title = project.title; @@ -104,6 +120,7 @@ impl Project<Cover, String> { chapters: x, cover: cover, numbering: numbering, + language: lang, }) } } diff --git a/templates/chapter.xhtml b/templates/chapter.xhtml index 18a33d6..cbbc9da 100644 --- a/templates/chapter.xhtml +++ b/templates/chapter.xhtml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="fr" xml:lang="fr"> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="{{ language | lower }}" xml:lang="{{ language | lower }}"> <head> <link rel="stylesheet" type="text/css" href="../Style/main.css" /> <title> @@ -13,7 +13,7 @@ {% if numbering %} – {{ number }} – <span class="title"> - {% filter upper %}{{ chapter.title }}{% endfilter %} + {{ chapter.title | upper }} </span> {% else %} {% filter upper %}{{ chapter.title }}{% endfilter %} diff --git a/templates/content.opf b/templates/content.opf index d182a33..5160fae 100644 --- a/templates/content.opf +++ b/templates/content.opf @@ -2,7 +2,7 @@ <package xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId" version="2.0" xmlns:opf="http://www.idpf.org/2007/opf"> <metadata xmlns:dc="http://purl.org/dc/elements/1.1/"> <dc:title>{{ title }}</dc:title> - <dc:language>fr</dc:language> + <dc:language>{{ language | lower }}</dc:language> <dc:creator opf:role="aut">{{ author }}</dc:creator> <dc:type>text</dc:type> <dc:description>Ceci est une description</dc:description> |