1
0
mirror of https://github.com/lise-henry/crowbook synced 2024-09-22 09:10:43 +02:00

Add html.if.end_turn

This commit is contained in:
Elisabeth Henry 2017-06-05 03:38:59 +02:00
parent 9ef7b607e2
commit ca4685f5ec
3 changed files with 76 additions and 59 deletions

View File

@ -84,7 +84,8 @@ html.dir.template:tpl # {html_dir_template}
# {html_if_opt}
html.if.js:tpl # {if_js}
html.if.new_turn:str:\"\" # {if_new_turn}
html.if.new_turn:str # {if_new_turn}
html.if.end_turn:str # {if_end_turn}
html.if.new_game:str:\"\" # {if_new_game}
# {epub_opt}
@ -263,6 +264,7 @@ crowbook.verbose:alias # {removed}
single_js = lformat!("Path of a javascript file"),
if_js = lformat!("Path of a javascript file"),
if_new_turn = lformat!("Javascript code that will be run at the beginning of each segment"),
if_end_turn = lformat!("Javascript code that will be run at the end of each segment"),
if_new_game = lformat!("Javascript code that will be run at the beginning of a 'game'"),
html_chapter_template = lformat!("Inline template for HTML chapter formatting"),

View File

@ -60,6 +60,62 @@ impl<'a> HtmlIfRenderer<'a> {
)
}
/// Parse embedded javascript code
pub fn parse_inner_code(&mut self, code: &str) -> Result<String> {
let mut gen_code = String::new();
let mut contains_md = false;
let mut i = 0;
while let Some(begin) = code[i..].find("@\"") {
let begin = i + begin;
if let Some(len) = code[begin..].find("\"@") {
contains_md = true;
let end = begin + len;
gen_code.push_str(&code[i..begin]);
gen_code.push_str("crowbook_return_variable += \"");
gen_code.push_str(&self.render_vec(
&Parser::new()
.parse(&code[begin+2..end])?)?
.replace('"', "\\\"")
.replace('\n', "\\\n"));
gen_code.push_str("\";");
i = end + 2;
} else {
gen_code.push_str(&code[i..begin+2]);
i = begin + 2;
}
}
gen_code.push_str(&code[i..]);
if contains_md {
gen_code = format!("var crowbook_return_variable = \"\";
{}
return crowbook_return_variable.replace(/<\\/ul><ul>/g, '');\n",
gen_code);
}
let container = if !contains_md {
"p"
} else {
"div"
};
let id = self.n_fn;
self.fn_defs
.push_str(&format!("function fn_{id}() {{
{code}
}}\n",
id = id,
code = gen_code));
self.curr_init
.push_str(&format!(" result = fn_{id}();
if (result != undefined) {{
document.getElementById(\"result_{id}\").innerHTML = result;
}}\n",
id = id));
let content = format!("<{container} id = \"result_{id}\"></{container}>\n",
id = (self.n_fn),
container = container);
self.n_fn += 1;
Ok(content)
}
/// Renders a token
///
/// Used by render_token implementation of Renderer trait. Separate function
@ -75,57 +131,7 @@ impl<'a> HtmlIfRenderer<'a> {
Token::CodeBlock(ref language, ref v) if language == "" => {
let mut html_if: &mut HtmlIfRenderer = this.as_mut();
let code = view_as_text(v);
let mut gen_code = String::new();
let mut contains_md = false;
let mut i = 0;
while let Some(begin) = code[i..].find("@\"") {
let begin = i + begin;
if let Some(len) = code[begin..].find("\"@") {
contains_md = true;
let end = begin + len;
gen_code.push_str(&code[i..begin]);
gen_code.push_str("crowbook_return_variable += \"");
gen_code.push_str(&html_if.render_vec(
&Parser::new()
.parse(&code[begin+2..end])?)?
.replace('"', "\\\"")
.replace('\n', "\\\n"));
gen_code.push_str("\";");
i = end + 2;
} else {
gen_code.push_str(&code[i..begin+2]);
i = begin + 2;
}
}
gen_code.push_str(&code[i..]);
if contains_md {
gen_code = format!("var crowbook_return_variable = \"\";
{}
return crowbook_return_variable.replace(/<\\/ul><ul>/g, '');\n",
gen_code);
}
let container = if !contains_md {
"p"
} else {
"div"
};
let id = html_if.n_fn;
html_if.fn_defs
.push_str(&format!("function fn_{id}() {{
{code}
}}\n",
id = id,
code = gen_code));
html_if.curr_init
.push_str(&format!(" result = fn_{id}();
if (result != undefined) {{
document.getElementById(\"result_{id}\").innerHTML = result;
}}\n",
id = id));
let content = format!("<{container} id = \"result_{id}\"></{container}>\n",
id = (html_if.n_fn),
container = container);
html_if.n_fn += 1;
let content = html_if.parse_inner_code(&code)?;
Ok(content)
},
@ -146,6 +152,11 @@ return crowbook_return_variable.replace(/<\\/ul><ul>/g, '');\n",
format!("#chapter-{}", i));
}
let pre_code = self.html.book.options.get_str("html.if.new_turn")
.unwrap_or("");
let post_code = self.html.book.options.get_str("html.if.end_turn")
.unwrap_or("");
for (i, chapter) in self.html.book.chapters.iter().enumerate() {
let n = chapter.number;
let v = &chapter.content;
@ -177,13 +188,22 @@ return crowbook_return_variable.replace(/<\\/ul><ul>/g, '');\n",
}
titles.push(title);
let mut chapter_content = String::new();
if !pre_code.is_empty() {
chapter_content.push_str(&self.parse_inner_code(pre_code)?);
}
chapter_content.push_str(&HtmlRenderer::render_html(self, v, render_notes_chapter)?);
if !post_code.is_empty() {
chapter_content.push_str(&self.parse_inner_code(post_code)?);
}
chapters.push(format!("<div id = \"chapter-{}\" class = \"chapter\">
{}
</div>",
i,
HtmlRenderer::render_html(self, v, render_notes_chapter)?));
chapter_content));
self.fn_defs.push_str(&format!("initFns.push(function () {{
new_turn();
{code}
}})\n",
code = self.curr_init));
@ -224,7 +244,6 @@ return crowbook_return_variable.replace(/<\\/ul><ul>/g, '');\n",
let data = self.html.book.get_metadata(|s| Ok(s.to_owned()))?
.insert_bool("one_chapter", true)
.insert_str("js_prelude", mem::replace(&mut self.fn_defs, String::new()))
.insert_str("new_turn", self.html.book.options.get_str("html.if.new_turn").unwrap())
.insert_str("new_game", self.html.book.options.get_str("html.if.new_game").unwrap())
.insert_str("common_script",
self.html.book.get_template("html.js").unwrap().as_ref())

View File

@ -4,10 +4,6 @@ var initFns = [];
{{{new_game}}}
function new_turn() {
{{{new_turn}}}
}
{{{js_prelude}}}
function showChapter(chap, noreset){