Fix open options for written file

Signed-off-by: trivernis <trivernis@protonmail.com>
feature/epub-rendering
trivernis 4 years ago
parent f5bf361795
commit 609bc18d7f
Signed by: Trivernis
GPG Key ID: DFFFCC2C7A02DB45

2
Cargo.lock generated

@ -1142,7 +1142,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "snekdown" name = "snekdown"
version = "0.26.0" version = "0.26.1"
dependencies = [ dependencies = [
"asciimath-rs 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", "asciimath-rs 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)",
"base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", "base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",

@ -1,6 +1,6 @@
[package] [package]
name = "snekdown" name = "snekdown"
version = "0.26.0" version = "0.26.1"
authors = ["trivernis <trivernis@protonmail.com>"] authors = ["trivernis <trivernis@protonmail.com>"]
edition = "2018" edition = "2018"
license-file = "LICENSE" license-file = "LICENSE"

@ -355,6 +355,7 @@ impl Document {
self.elements.reverse(); self.elements.reverse();
let mut count: usize = 0; let mut count: usize = 0;
let mut last_section: Option<(u8, usize)> = None; let mut last_section: Option<(u8, usize)> = None;
while let Some(element) = self.elements.pop() { while let Some(element) = self.elements.pop() {
match element { match element {
Block::Section(sec) => { Block::Section(sec) => {
@ -733,6 +734,7 @@ impl BibReference {
pub(crate) fn get_formatted(&self) -> String { pub(crate) fn get_formatted(&self) -> String {
if let Some(entry) = &self.entry_anchor.lock().unwrap().entry { if let Some(entry) = &self.entry_anchor.lock().unwrap().entry {
let entry = entry.lock().unwrap(); let entry = entry.lock().unwrap();
if let Some(display) = &self.display { if let Some(display) = &self.display {
let display = display.read().unwrap(); let display = display.read().unwrap();
let mut template = PlaceholderTemplate::new(display.get().as_string()); let mut template = PlaceholderTemplate::new(display.get().as_string());

@ -25,4 +25,9 @@ impl HTMLWriter {
pub fn write_attribute(&mut self, attribute_value: String) -> io::Result<()> { pub fn write_attribute(&mut self, attribute_value: String) -> io::Result<()> {
self.write(htmlescape::encode_attribute(attribute_value.as_str())) self.write(htmlescape::encode_attribute(attribute_value.as_str()))
} }
/// Flushes the writer
pub fn flush(&mut self) -> io::Result<()> {
self.inner.flush()
}
} }

@ -6,7 +6,6 @@ use crate::references::templates::{Template, TemplateVariable};
use asciimath_rs::format::mathml::ToMathML; use asciimath_rs::format::mathml::ToMathML;
use htmlescape::encode_attribute; use htmlescape::encode_attribute;
use minify::html::minify; use minify::html::minify;
use std::cell::RefCell;
use std::io; use std::io;
use syntect::highlighting::ThemeSet; use syntect::highlighting::ThemeSet;
use syntect::html::highlighted_html_for_string; use syntect::html::highlighted_html_for_string;
@ -97,7 +96,7 @@ impl ToHtml for MetadataValue {
impl ToHtml for Document { impl ToHtml for Document {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> {
let path = if let Some(path) = &self.path { let path = if let Some(path) = &self.path {
format!("path='{}'", encode_attribute(path.as_str())) format!("path=\"{}\"", encode_attribute(path.as_str()))
} else { } else {
"".to_string() "".to_string()
}; };
@ -108,29 +107,29 @@ impl ToHtml for Document {
.map(|e| e.get().as_string()) .map(|e| e.get().as_string())
.unwrap_or("en".to_string()); .unwrap_or("en".to_string());
let style = minify(std::include_str!("assets/style.css")); let style = minify(std::include_str!("assets/style.css"));
writer.write("<!DOCTYPE html".to_string())?; writer.write("<!DOCTYPE html>".to_string())?;
writer.write("<html lang=\"".to_string())?; writer.write("<html lang=\"".to_string())?;
writer.write_attribute(language)?; writer.write_attribute(language)?;
writer.write("\"/><head ".to_string())?; writer.write("\"><head ".to_string())?;
writer.write(path)?; writer.write(path)?;
writer.write("/>".to_string())?; writer.write("/>".to_string())?;
writer.write("<meta charset='UTF-8'><script id='MathJax-script' async src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js'></script>".to_string())?; writer.write("<meta charset=\"UTF-8\"><script id=\"MathJax-script\" async src=\"https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js\"></script>".to_string())?;
writer.write("<style>".to_string())?; writer.write("<style>".to_string())?;
writer.write(style)?; writer.write(style)?;
writer.write("</style>".to_string())?; writer.write("</style>".to_string())?;
for stylesheet in &self.stylesheets { for stylesheet in &self.stylesheets {
writer.write("<style>".to_string())?; writer.write("<style>".to_string())?;
writer.write(stylesheet.clone())?; writer.write(minify(stylesheet.as_str()))?;
writer.write("</style>".to_string())?; writer.write("</style>".to_string())?;
} }
writer.write("</head><body><div class='content'>".to_string())?; writer.write("</head><body><div class=\"content\">".to_string())?;
for element in &self.elements { for element in &self.elements {
element.to_html(writer)?; element.to_html(writer)?;
} }
writer.write("</div></body></html>".to_string())?; writer.write("</div></body></html>".to_string())?;
} else { } else {
writer.write("<div class='documentImport' document-import='true' ".to_string())?; writer.write("<div class=\"documentImport\" document-import=\"true\" ".to_string())?;
writer.write(path)?; writer.write(path)?;
writer.write(">".to_string())?; writer.write(">".to_string())?;
@ -165,13 +164,8 @@ impl ToHtml for MathBlock {
} }
impl ToHtml for Import { impl ToHtml for Import {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, _writer: &mut HTMLWriter) -> io::Result<()> {
let anchor = self.anchor.read().unwrap(); Ok(())
if let Some(document) = &anchor.document {
document.to_html(writer)
} else {
Ok(())
}
} }
} }
@ -200,10 +194,16 @@ impl ToHtml for Header {
impl ToHtml for Paragraph { impl ToHtml for Paragraph {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> {
writer.write("<div class='paragraph'>".to_string())?; writer.write("<div class=\"paragraph\">".to_string())?;
for element in &self.elements {
element.to_html(writer)?; if let Some(first) = self.elements.first() {
writer.write("<br>".to_string())?; first.to_html(writer)?;
}
if self.elements.len() > 1 {
for element in &self.elements[1..] {
writer.write("<br/>".to_string())?;
element.to_html(writer)?;
}
} }
writer.write("</div>".to_string()) writer.write("</div>".to_string())
@ -256,7 +256,7 @@ impl ToHtml for ListItem {
impl ToHtml for Table { impl ToHtml for Table {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> {
writer.write("<div class='tableWrapper'><table><tr>".to_string())?; writer.write("<div class=\"tableWrapper\"><table><tr>".to_string())?;
for cell in &self.header.cells { for cell in &self.header.cells {
writer.write("<th>".to_string())?; writer.write("<th>".to_string())?;
@ -293,9 +293,6 @@ impl ToHtml for Cell {
} }
} }
thread_local! {static PS: RefCell<SyntaxSet> = RefCell::new(SyntaxSet::load_defaults_nonewlines());}
thread_local! {static TS: RefCell<ThemeSet> = RefCell::new(ThemeSet::load_defaults());}
impl ToHtml for CodeBlock { impl ToHtml for CodeBlock {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> {
writer.write("<div><code".to_string())?; writer.write("<div><code".to_string())?;
@ -303,25 +300,21 @@ impl ToHtml for CodeBlock {
writer.write(" lang=\"".to_string())?; writer.write(" lang=\"".to_string())?;
writer.write_attribute(self.language.clone())?; writer.write_attribute(self.language.clone())?;
writer.write("\">".to_string())?; writer.write("\">".to_string())?;
PS.with(|ps_cell| { lazy_static::lazy_static! { static ref PS: SyntaxSet = SyntaxSet::load_defaults_nonewlines(); }
let ps = ps_cell.borrow(); lazy_static::lazy_static! { static ref TS: ThemeSet = ThemeSet::load_defaults(); }
if let Some(syntax) = ps.find_syntax_by_token(self.language.as_str()) {
TS.with(|ts_cell| { if let Some(syntax) = PS.find_syntax_by_token(self.language.as_str()) {
let ts = ts_cell.borrow(); writer.write(highlighted_html_for_string(
self.code.as_str(),
let _ = writer.write(highlighted_html_for_string( &PS,
self.code.as_str(), syntax,
&ps, &TS.themes["InspiredGitHub"],
syntax, ))?;
&ts.themes["InspiredGitHub"], } else {
)); writer.write("<pre>".to_string())?;
}) writer.write_escaped(self.code.clone())?;
} else { writer.write("</pre>".to_string())?;
let _ = writer.write("<pre>".to_string()); }
let _ = writer.write(self.code.clone());
let _ = writer.write("</pre>".to_string());
}
})
} else { } else {
writer.write("><pre>".to_string())?; writer.write("><pre>".to_string())?;
writer.write_escaped(self.code.clone())?; writer.write_escaped(self.code.clone())?;
@ -334,13 +327,13 @@ impl ToHtml for CodeBlock {
impl ToHtml for Quote { impl ToHtml for Quote {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> {
writer.write("<div class='quote'><blockquote>".to_string())?; writer.write("<div class=\"quote\"><blockquote>".to_string())?;
for line in &self.text { for line in &self.text {
line.to_html(writer)?; line.to_html(writer)?;
writer.write("<br>".to_string())?; writer.write("<br/>".to_string())?;
} }
if let Some(meta) = self.metadata.clone() { if let Some(meta) = self.metadata.clone() {
writer.write("<span class='metadata'>".to_string())?; writer.write("<span class=\"metadata\">".to_string())?;
meta.to_html(writer)?; meta.to_html(writer)?;
writer.write("</span>".to_string())?; writer.write("</span>".to_string())?;
} }
@ -350,7 +343,7 @@ impl ToHtml for Quote {
impl ToHtml for Ruler { impl ToHtml for Ruler {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> {
writer.write("<hr>".to_string()) writer.write("<hr/>".to_string())
} }
} }
@ -387,26 +380,26 @@ impl ToHtml for Image {
} }
} }
if let Some(description) = self.url.description.clone() { if let Some(description) = self.url.description.clone() {
writer.write("<div class='figure'><a href='".to_string())?; writer.write("<div class=\"figure\"><a href=\"".to_string())?;
writer.write_attribute(self.url.url.clone())?; writer.write_attribute(self.url.url.clone())?;
writer.write("'><img src='".to_string())?; writer.write("\"><img src=\"".to_string())?;
writer.write(url)?; writer.write(url)?;
writer.write("' style='".to_string())?; writer.write("\" style=\"".to_string())?;
writer.write_attribute(style)?; writer.write(style)?;
writer.write("'/></a><br><label class='imageDescripton'>".to_string())?; writer.write("\"/></a><br><label class=\"imageDescripton\">".to_string())?;
for item in description { for item in description {
item.to_html(writer)?; item.to_html(writer)?;
writer.write("&#32;".to_string())?; writer.write("&#32;".to_string())?;
} }
writer.write("</label></div>".to_string())?; writer.write("</label></div>".to_string())?;
} else { } else {
writer.write("<a href='".to_string())?; writer.write("<a href=\"".to_string())?;
writer.write(url.clone())?; writer.write(url.clone())?;
writer.write("'><img src='".to_string())?; writer.write("\"><img src=\"".to_string())?;
writer.write(url)?; writer.write(url)?;
writer.write("' style='".to_string())?; writer.write("\" style=\"".to_string())?;
writer.write(style)?; writer.write(style)?;
writer.write("'/></a>".to_string())?; writer.write("\"/></a>".to_string())?;
} }
Ok(()) Ok(())
@ -465,7 +458,7 @@ impl ToHtml for SuperscriptText {
impl ToHtml for MonospaceText { impl ToHtml for MonospaceText {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> {
writer.write("<code class='inlineCode'>".to_string())?; writer.write("<code class=\"inlineCode\">".to_string())?;
writer.write_escaped(self.value.clone())?; writer.write_escaped(self.value.clone())?;
writer.write("</code>".to_string()) writer.write("</code>".to_string())
@ -474,9 +467,9 @@ impl ToHtml for MonospaceText {
impl ToHtml for Url { impl ToHtml for Url {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> {
writer.write("<a href='".to_string())?; writer.write("<a href=\"".to_string())?;
writer.write(self.url.clone())?; writer.write(self.url.clone())?;
writer.write("'>".to_string())?; writer.write("\">".to_string())?;
if let Some(description) = self.description.clone() { if let Some(description) = self.description.clone() {
for desc in description { for desc in description {
desc.to_html(writer)?; desc.to_html(writer)?;
@ -500,18 +493,18 @@ impl ToHtml for Placeholder {
if let Some(value) = &self.value { if let Some(value) = &self.value {
value.to_html(writer) value.to_html(writer)
} else { } else {
writer.write("Unknown placeholder '".to_string())?; writer.write("<!--Unknown placeholder \"".to_string())?;
writer.write_escaped(self.name.clone())?; writer.write_escaped(self.name.clone())?;
writer.write_escaped("'".to_string()) writer.write("\"-->".to_string())
} }
} }
} }
impl ToHtml for RefLink { impl ToHtml for RefLink {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> {
writer.write("<a href='#".to_string())?; writer.write("<a href=\"#".to_string())?;
writer.write_escaped(self.reference.clone())?; writer.write_escaped(self.reference.clone())?;
writer.write("'>".to_string())?; writer.write("\">".to_string())?;
self.description.to_html(writer)?; self.description.to_html(writer)?;
writer.write("</a>".to_string()) writer.write("</a>".to_string())
@ -538,7 +531,7 @@ impl ToHtml for InlineMetadata {
impl ToHtml for Centered { impl ToHtml for Centered {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> {
writer.write("<div class='centered'>".to_string())?; writer.write("<div class=\"centered\">".to_string())?;
self.line.to_html(writer)?; self.line.to_html(writer)?;
writer.write("</div>".to_string()) writer.write("</div>".to_string())
@ -547,7 +540,7 @@ impl ToHtml for Centered {
impl ToHtml for Checkbox { impl ToHtml for Checkbox {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> {
writer.write("<input type='checkbox' disabled ".to_string())?; writer.write("<input type=\"checkbox\" disabled ".to_string())?;
if self.value { if self.value {
writer.write("checked".to_string())?; writer.write("checked".to_string())?;
} }
@ -558,9 +551,9 @@ impl ToHtml for Checkbox {
impl ToHtml for Emoji { impl ToHtml for Emoji {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> {
writer.write("<span class='emoji' emoji-name='".to_string())?; writer.write("<span class=\"emoji\" emoji-name=\"".to_string())?;
writer.write_attribute(self.name.clone())?; writer.write_attribute(self.name.clone())?;
writer.write("'>".to_string())?; writer.write("\">".to_string())?;
writer.write(self.value.to_string())?; writer.write(self.value.to_string())?;
writer.write("</span>".to_string()) writer.write("</span>".to_string())
@ -569,9 +562,9 @@ impl ToHtml for Emoji {
impl ToHtml for Colored { impl ToHtml for Colored {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> {
writer.write("<span class='colored' style='color:".to_string())?; writer.write("<span class=\"colored\" style=\"color:".to_string())?;
writer.write_attribute(self.color.clone())?; writer.write(self.color.clone())?;
writer.write(";'>".to_string())?; writer.write(";\">".to_string())?;
self.value.to_html(writer)?; self.value.to_html(writer)?;
writer.write("</span>".to_string()) writer.write("</span>".to_string())
@ -580,9 +573,9 @@ impl ToHtml for Colored {
impl ToHtml for BibReference { impl ToHtml for BibReference {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> {
writer.write("<sup><a href='#".to_string())?; writer.write("<sup><a href=\"#".to_string())?;
writer.write_escaped(self.key.clone())?; writer.write_attribute(self.key.clone())?;
writer.write("'>".to_string())?; writer.write("\">".to_string())?;
writer.write(self.get_formatted())?; writer.write(self.get_formatted())?;
writer.write("</a></sup>".to_string()) writer.write("</a></sup>".to_string())
@ -622,9 +615,9 @@ impl ToHtml for CharacterCode {
impl ToHtml for Anchor { impl ToHtml for Anchor {
fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> { fn to_html(&self, writer: &mut HTMLWriter) -> io::Result<()> {
writer.write("<div id='".to_string())?; writer.write("<div id=\"".to_string())?;
writer.write_attribute(self.key.clone())?; writer.write_attribute(self.key.clone())?;
writer.write("'>".to_string())?; writer.write("\">".to_string())?;
self.inner.to_html(writer)?; self.inner.to_html(writer)?;
writer.write("</div>".to_string()) writer.write("</div>".to_string())

@ -88,15 +88,18 @@ fn render(opt: &Opt) -> Parser {
); );
let start_render = Instant::now(); let start_render = Instant::now();
let file = OpenOptions::new() let file = OpenOptions::new()
.write(true)
.read(true) .read(true)
.write(true)
.truncate(true)
.create(true)
.open(&opt.output) .open(&opt.output)
.unwrap(); .unwrap();
let writer = BufWriter::new(file); let writer = BufWriter::new(file);
match opt.format.as_str() { match opt.format.as_str() {
"html" => { "html" => {
let mut writer = HTMLWriter::new(Box::new(writer)); let mut writer = HTMLWriter::new(Box::new(writer));
document.to_html(&mut writer).unwrap() document.to_html(&mut writer).unwrap();
writer.flush().unwrap();
} }
_ => println!("Unknown format {}", opt.format), _ => println!("Unknown format {}", opt.format),
} }

@ -56,7 +56,7 @@ impl ConfigEntry {
impl Default for Configuration { impl Default for Configuration {
fn default() -> Self { fn default() -> Self {
let mut self_config = Self::new(); let mut self_config = Self::new();
self_config.set(BIB_REF_DISPLAY, Value::String("number".to_string())); self_config.set(BIB_REF_DISPLAY, Value::String("{{number}}".to_string()));
self_config.set(META_LANG, Value::String("en".to_string())); self_config.set(META_LANG, Value::String("en".to_string()));
self_config self_config

Loading…
Cancel
Save