more simple language declaration in book.toml

This commit is contained in:
Gambhiro 2017-01-18 14:58:38 +00:00
parent cb861a7354
commit 8441bb99d2
6 changed files with 52 additions and 17 deletions

View File

@ -109,7 +109,9 @@ impl BookConfig {
/// name = "Marcus Aurelius Antoninus" /// name = "Marcus Aurelius Antoninus"
/// ``` /// ```
/// ///
pub fn parse_from_btreemap(&mut self, config: &BTreeMap<String, toml::Value>) -> &mut Self { pub fn parse_from_btreemap(&mut self,
default_language_code: String,
config: &BTreeMap<String, toml::Value>) -> &mut Self {
// Paths // Paths
@ -134,6 +136,8 @@ impl BookConfig {
.collect::<Vec<Author>>() .collect::<Vec<Author>>()
}; };
self.language = Language::new(&default_language_code);
if let Some(a) = config.get("title") { if let Some(a) = config.get("title") {
self.title = a.to_string().replace("\"", ""); self.title = a.to_string().replace("\"", "");
} }
@ -152,6 +156,14 @@ impl BookConfig {
} }
} }
if let Some(a) = config.get("language_code") {
self.language.code = a.to_string().replace("\"", "");
}
if let Some(a) = config.get("language_name") {
self.language.name = Some(a.to_string().replace("\"", ""));
}
// Author name as a hash key. // Author name as a hash key.
if let Some(a) = config.get("author") { if let Some(a) = config.get("author") {
if let Some(b) = a.as_str() { if let Some(b) = a.as_str() {
@ -286,24 +298,31 @@ impl From<toml::Table> for Author {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Language { pub struct Language {
pub name: String,
pub code: String, pub code: String,
pub name: Option<String>,
} }
impl Default for Language { impl Default for Language {
fn default() -> Self { fn default() -> Self {
Language { Language {
name: String::from("English"),
code: String::from("en"), code: String::from("en"),
name: Some(String::from("English")),
} }
} }
} }
impl Language { impl Language {
pub fn new(name: &str, code: &str) -> Language { pub fn new(code: &str) -> Language {
Language{ Language{
name: name.to_string(),
code: code.to_string(), code: code.to_string(),
name: None,
}
}
pub fn new_with_name(code: &str, name: &str) -> Language {
Language{
code: code.to_string(),
name: Some(name.to_string()),
} }
} }
} }
@ -311,12 +330,14 @@ impl Language {
impl From<toml::Table> for Language { impl From<toml::Table> for Language {
fn from(data: toml::Table) -> Language { fn from(data: toml::Table) -> Language {
let mut language = Language::default(); let mut language = Language::default();
if let Some(x) = data.get("name") {
language.name = x.to_string().replace("\"", "");
}
if let Some(x) = data.get("code") { if let Some(x) = data.get("code") {
language.code = x.to_string().replace("\"", ""); language.code = x.to_string().replace("\"", "");
} }
if let Some(x) = data.get("name") {
language.name = Some(x.to_string().replace("\"", ""));
} else {
language.name = None;
}
language language
} }
} }

View File

@ -321,7 +321,10 @@ impl MDBook {
book.config.dest = book.config.dest.join(key); book.config.dest = book.config.dest.join(key);
} }
book.config.is_multilang = is_multilang; book.config.is_multilang = is_multilang;
book.config.parse_from_btreemap(&d); book.config.parse_from_btreemap(key.to_owned(), &d);
// the language code and translation key must agree
// even after parsing the user's settings
book.config.language.code = key.to_owned();
if book.config.is_main_book { if book.config.is_main_book {
has_main_book_already = true; has_main_book_already = true;
} }
@ -379,7 +382,8 @@ impl MDBook {
} else { } else {
let mut book = Book::new(&self.project_root); let mut book = Book::new(&self.project_root);
book.config.parse_from_btreemap(&config); // take "en" as default code, will override if user sets it
book.config.parse_from_btreemap("en".to_owned(), &config);
let key = book.config.language.code.clone(); let key = book.config.language.code.clone();
self.translations.insert(key, book); self.translations.insert(key, book);
} }

View File

@ -356,7 +356,7 @@ fn make_data(book: &Book,
// Book data // Book data
data.insert("language".to_owned(), "en".to_json()); data.insert("language".to_owned(), book.config.language.code.to_json());
data.insert("page-title".to_owned(), format!("{} - {}", chapter.title, book.config.title).to_json()); data.insert("page-title".to_owned(), format!("{} - {}", chapter.title, book.config.title).to_json());
data.insert("chapter-title".to_owned(), chapter.title.to_json()); data.insert("chapter-title".to_owned(), chapter.title.to_json());
data.insert("description".to_owned(), book.config.description.to_json()); data.insert("description".to_owned(), book.config.description.to_json());

View File

@ -1,16 +1,19 @@
# Source: https://en.wikisource.org/wiki/Alice%27s_Adventures_in_Wonderland_(1866)" # Source: https://en.wikisource.org/wiki/Alice%27s_Adventures_in_Wonderland_(1866)"
# The language code will be the translation key.
[[translations.en]] [[translations.en]]
title = "Alice's Adventures in Wonderland" title = "Alice's Adventures in Wonderland"
author = "Lewis Carroll" author = "Lewis Carroll"
language = { name = "English", code = "en" }
[[translations.fr]] [[translations.fr]]
title = "Alice au pays des merveilles" title = "Alice au pays des merveilles"
author = "Lewis Carroll" author = "Lewis Carroll"
language = { name = "Français", code = "fr" }
# Optionally you can provide the language name.
language_name = "Français"
[[translations.hu]] [[translations.hu]]
title = "Alice Csodaországban" title = "Alice Csodaországban"
author = "Lewis Carroll" author = "Lewis Carroll"
language = { name = "Magyar", code = "hu" }

View File

@ -35,6 +35,7 @@ fn it_renders_multilanguage_book() {
chapter_path = book_path.join("tears.html"); chapter_path = book_path.join("tears.html");
s = utils::fs::file_to_string(&chapter_path).unwrap(); s = utils::fs::file_to_string(&chapter_path).unwrap();
assert!(s.contains("<html lang=\"en\">"));
assert!(s.contains("<h1>The Pool of Tears</h1>")); assert!(s.contains("<h1>The Pool of Tears</h1>"));
assert!(s.contains("<base href=\"../\">")); assert!(s.contains("<base href=\"../\">"));
assert!(s.contains("li><a href=\"en/tears.html\" class=\"active\"><strong>2.</strong> The Pool of Tears</a></li>")); assert!(s.contains("li><a href=\"en/tears.html\" class=\"active\"><strong>2.</strong> The Pool of Tears</a></li>"));
@ -42,12 +43,14 @@ fn it_renders_multilanguage_book() {
book_path = proj.translations.get("fr").unwrap().config.get_dest(); book_path = proj.translations.get("fr").unwrap().config.get_dest();
chapter_path = book_path.join("tears.html"); chapter_path = book_path.join("tears.html");
s = utils::fs::file_to_string(&chapter_path).unwrap(); s = utils::fs::file_to_string(&chapter_path).unwrap();
assert!(s.contains("<html lang=\"fr\">"));
assert!(s.contains("<h1>La mare aux larmes</h1>")); assert!(s.contains("<h1>La mare aux larmes</h1>"));
assert!(s.contains("<base href=\"../\">")); assert!(s.contains("<base href=\"../\">"));
book_path = proj.translations.get("hu").unwrap().config.get_dest(); book_path = proj.translations.get("hu").unwrap().config.get_dest();
chapter_path = book_path.join("tears.html"); chapter_path = book_path.join("tears.html");
s = utils::fs::file_to_string(&chapter_path).unwrap(); s = utils::fs::file_to_string(&chapter_path).unwrap();
assert!(s.contains("<html lang=\"hu\">"));
assert!(s.contains("<h1>Könnytó</h1>")); assert!(s.contains("<h1>Könnytó</h1>"));
assert!(s.contains("<base href=\"../\">")); assert!(s.contains("<base href=\"../\">"));

View File

@ -10,8 +10,7 @@ use serde_json;
use utils; use utils;
use book::MDBook; use book::MDBook;
use book::book::Book; use book::book::Book;
use book::bookconfig::BookConfig; use book::bookconfig::{BookConfig, Author, Language};
use book::bookconfig::Author;
use book::chapter::Chapter; use book::chapter::Chapter;
use book::toc::{TocItem, TocContent}; use book::toc::{TocItem, TocContent};
@ -36,6 +35,7 @@ fn it_parses_simple_json_config() {
book.config.title = "mdBook Documentation".to_string(); book.config.title = "mdBook Documentation".to_string();
book.config.description = Some("Create books from markdown files.".to_string()); book.config.description = Some("Create books from markdown files.".to_string());
book.config.authors = vec![Author::new("Mathieu David")]; book.config.authors = vec![Author::new("Mathieu David")];
book.config.language = Language::new("en");
expected.translations.insert("en".to_string(), book); expected.translations.insert("en".to_string(), book);
} }
@ -63,6 +63,7 @@ author = "Mathieu David"
book.config.title = "mdBook Documentation".to_string(); book.config.title = "mdBook Documentation".to_string();
book.config.description = Some("Create books from markdown files.".to_string()); book.config.description = Some("Create books from markdown files.".to_string());
book.config.authors = vec![Author::new("Mathieu David")]; book.config.authors = vec![Author::new("Mathieu David")];
book.config.language = Language::new("en");
expected.translations.insert("en".to_string(), book); expected.translations.insert("en".to_string(), book);
} }
@ -92,6 +93,7 @@ name = "Mathieu David"
book.config.title = "mdBook Documentation".to_string(); book.config.title = "mdBook Documentation".to_string();
book.config.description = Some("Create books from markdown files.".to_string()); book.config.description = Some("Create books from markdown files.".to_string());
book.config.authors = vec![Author::new("Mathieu David")]; book.config.authors = vec![Author::new("Mathieu David")];
book.config.language = Language::new("en");
expected.translations.insert("en".to_string(), book); expected.translations.insert("en".to_string(), book);
} }
@ -144,6 +146,7 @@ name = "Kosztolányi Dezső"
conf.dest = expected.get_project_root().join("book").join("en"); conf.dest = expected.get_project_root().join("book").join("en");
conf.is_multilang = true; conf.is_multilang = true;
conf.is_main_book = true; conf.is_main_book = true;
conf.language = Language::new("en");
let mut book = Book::default(); let mut book = Book::default();
book.config = conf; book.config = conf;
@ -160,6 +163,7 @@ name = "Kosztolányi Dezső"
conf.dest = expected.get_project_root().join("book").join("hu"); conf.dest = expected.get_project_root().join("book").join("hu");
conf.is_multilang = true; conf.is_multilang = true;
conf.is_main_book = false; conf.is_main_book = false;
conf.language = Language::new("hu");
let mut book = Book::default(); let mut book = Book::default();
book.config = conf; book.config = conf;
@ -219,7 +223,7 @@ name = "Kosztolányi Dezső"
book.config.title = "Alice Csodaországban".to_string(); book.config.title = "Alice Csodaországban".to_string();
book.config.authors = vec![Author::new("Lewis Carroll")]; book.config.authors = vec![Author::new("Lewis Carroll")];
book.config.translators = Some(vec![Author::new("Kosztolányi Dezső")]); book.config.translators = Some(vec![Author::new("Kosztolányi Dezső")]);
book.config.language.name = "Hungarian".to_string(); book.config.language.name = Some("Hungarian".to_string());
book.config.language.code = "hu".to_string(); book.config.language.code = "hu".to_string();
expected.translations.insert("hu".to_string(), book); expected.translations.insert("hu".to_string(), book);