Change images to be embedded as base64

feature/epub-rendering
trivernis 4 years ago
parent 8715ca7b41
commit 038a9ef554

841
Cargo.lock generated

File diff suppressed because it is too large Load Diff

@ -1,6 +1,6 @@
[package] [package]
name = "snekdown" name = "snekdown"
version = "0.20.0" version = "0.21.0"
authors = ["trivernis <trivernis@protonmail.com>"] authors = ["trivernis <trivernis@protonmail.com>"]
edition = "2018" edition = "2018"
license-file = "LICENSE" license-file = "LICENSE"
@ -32,4 +32,9 @@ notify = "4.0.12"
toml = "0.5.6" toml = "0.5.6"
serde ="1.0.111" serde ="1.0.111"
serde_derive = "1.0.111" serde_derive = "1.0.111"
asciimath-rs = "0.4.8" asciimath-rs = "0.4.8"
reqwest = {version = "0.10", features=["blocking"]}
mime_guess = "2.0.3"
mime = "0.3.16"
base64 = "0.12.3"
rayon = "1.3.1"

@ -45,6 +45,7 @@ Extended syntax with metadata and no description
!(url)[metadata] !(url)[metadata]
``` ```
When generating the html file the images are base64 embedded.
### Quotes ### Quotes
@ -68,6 +69,10 @@ Imports are parsed via multithreading.
```md ```md
<[path] <[path]
<[document.md]
<[style.css]
``` ```

@ -6,6 +6,8 @@ use crate::references::placeholders::ProcessPlaceholders;
use crate::references::templates::{Template, TemplateVariable}; use crate::references::templates::{Template, TemplateVariable};
use asciimath_rs::elements::special::Expression; use asciimath_rs::elements::special::Expression;
use std::collections::HashMap; use std::collections::HashMap;
use std::fs::read;
use std::path::PathBuf;
use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, RwLock}; use std::sync::{Arc, RwLock};
@ -615,3 +617,30 @@ impl Metadata for InlineMetadata {
} }
} }
} }
impl Image {
pub fn get_content(&self) -> Option<Vec<u8>> {
let path = PathBuf::from(&self.url.url);
if path.exists() {
if let Ok(content) = read(path) {
Some(content)
} else {
None
}
} else {
self.download_content()
}
}
fn download_content(&self) -> Option<Vec<u8>> {
if let Ok(content) = reqwest::blocking::get(&self.url.url) {
if let Ok(bytes) = content.bytes() {
Some(bytes.to_vec())
} else {
None
}
} else {
None
}
}
}

@ -6,6 +6,7 @@ use crate::references::templates::{Template, TemplateVariable};
use asciimath_rs::format::mathml::ToMathML; use asciimath_rs::format::mathml::ToMathML;
use htmlescape::{encode_attribute, encode_minimal}; use htmlescape::{encode_attribute, encode_minimal};
use minify::html::minify; use minify::html::minify;
use rayon::prelude::*;
use std::cell::RefCell; use std::cell::RefCell;
use syntect::highlighting::ThemeSet; use syntect::highlighting::ThemeSet;
use syntect::html::highlighted_html_for_string; use syntect::html::highlighted_html_for_string;
@ -105,8 +106,15 @@ impl ToHtml for Document {
fn to_html(&self) -> String { fn to_html(&self) -> String {
let inner = self let inner = self
.elements .elements
.iter() .par_iter()
.fold("".to_string(), |a, b| format!("{}{}", a, b.to_html())); .fold(|| String::new(), |a, b| format!("{}{}", a, b.to_html()))
.reduce(
|| String::new(),
|mut a: String, b: String| {
a.push_str(&b);
a
},
);
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 {
@ -334,6 +342,17 @@ impl ToHtml for TextLine {
impl ToHtml for Image { impl ToHtml for Image {
fn to_html(&self) -> String { fn to_html(&self) -> String {
let mut style = String::new(); let mut style = String::new();
let url = if let Some(content) = self.get_content() {
let mime_type = mime_guess::from_path(&self.url.url).first_or(mime::IMAGE_PNG);
format!(
"data:{};base64,{}",
mime_type.to_string(),
base64::encode(content)
)
} else {
encode_attribute(self.url.url.as_str())
};
if let Some(meta) = &self.metadata { if let Some(meta) = &self.metadata {
if let Some(width) = meta.data.get("width") { if let Some(width) = meta.data.get("width") {
style = format!("{}width: {};", style, width.to_html()) style = format!("{}width: {};", style, width.to_html())
@ -347,11 +366,12 @@ impl ToHtml for Image {
format!( format!(
"<div class='figure'>\ "<div class='figure'>\
<a href={0}>\ <a href={0}>\
<img src='{0}' alt='{1}' style='{2}'/>\ <img src='{1}' alt='{2}' style='{3}'/>\
</a>\ </a>\
<label class='imageDescription'>{1}</label>\ <label class='imageDescription'>{2}</label>\
</div>", </div>",
encode_attribute(self.url.url.clone().as_str()), encode_attribute(self.url.url.as_str()),
url,
encode_attribute( encode_attribute(
description description
.iter() .iter()
@ -363,11 +383,7 @@ impl ToHtml for Image {
.as_str(), .as_str(),
) )
} else { } else {
format!( format!("<a href={0}><img src='{0}' style='{1}'/></a>", url, style)
"<a href={0}><img src='{0}' style='{1}'/></a>",
self.url.url.clone(),
style
)
} }
} }
} }

Loading…
Cancel
Save