aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Letan <contact@thomasletan.fr>2019-08-15 16:37:05 +0200
committerThomas Letan <contact@thomasletan.fr>2019-08-15 16:37:05 +0200
commitad4f316b577593cecedeb76e381d1165b5fc9a62 (patch)
tree21619732691772bc77656f267b34b80994a2fc9b
parentrefactor: 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.rs3
-rw-r--r--app/src/main.rs4
-rw-r--r--lib/src/epub.rs9
-rw-r--r--lib/src/project.rs27
-rw-r--r--templates/chapter.xhtml4
-rw-r--r--templates/content.opf2
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>