Compare commits

..

No commits in common. "1d502881f6f88df5c5f022d576261ed24476370f" and "71bd753b05adbe5a87841cd364a136adad66a17b" have entirely different histories.

10 changed files with 375 additions and 734 deletions

756
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -12,10 +12,8 @@ fs_extra = "1.2"
futures = {version = "0.3", optional = true}
grass = {version = "0.13", default-features = false}
hotwatch = {version = "0.5", optional = true}
html5ever = "0.29"
include_dir = "0.7"
itertools = "0.14"
kuchikiki = "0.8.6-speedreader"
itertools = "0.13"
lol_html = "2"
minifier = {version = "0.3", features = ["html"]}
percent-encoding = {version = "2", optional = true}
@ -30,7 +28,7 @@ serde_yml = "0.0.12"
syntect = "5"
tera = "1"
time = {version = "0.3", features = ["serde-human-readable"]}
tokio = {version = "1", features = [
tokio = {version = "1.10", features = [
"macros",
"rt-multi-thread",
], optional = true}

View file

@ -20,10 +20,6 @@ learn about standard webdog pages here
learn how to use webdog templates
## <a href="webdog-html">webdog html</a>
learn about webdog html extensions
## <a href="styling">styling</a>
learn about webdog styling

View file

@ -1,34 +0,0 @@
---
title: webdog html
template: docs.tera
---
# webdog html
webdog adds some extensions to html to make building your site easier.
## `wd-partial`
any template can be used as a partial in another template or page.
in a template like this:
```html
<p>this is a partial.</p>
<p>the hi argument is {{ userdata.hi }}</p>
<p>the hello argument is {{ userdata.hello }}</p>
<div>
<p>and here's the inner content:
{{ page | safe }}
</div>
```
simply include the `wd-partial` html tag like so:
```html
<wd-partial t="template-to-use.tera" hello="hi" hi="hello">
hiiiiiiiiiii~
</wd-partial>
```
a `wd-partial` tag consists of the `t` attribute to determine the template and any number of additional arguments, which are passed on to the partial template.

View file

@ -12,7 +12,6 @@
{{ self::docLink(text="configuration", href="config") }}
{{ self::docLink(text="pages", href="pages") }}
{{ self::docLink(text="templates", href="templates") }}
{{ self::docLink(text="webdog html", href="webdog-html") }}
{{ self::docLink(text="styling", href="styling") }}
{{ self::docLink(text="resources", href="resources") }}
{{ self::docLink(text="webdog assumptions", href="wd-assumptions") }}

View file

@ -163,64 +163,7 @@ impl SiteBuilder {
head: &Option<String>,
scripts: &[String],
styles: &[String],
is_partial: bool,
) -> eyre::Result<String> {
use kuchikiki::traits::*;
let html = {
let document = kuchikiki::parse_html().one(html.clone()).document_node;
let mut needs_reserialized = false;
while let Ok(el) = document.select_first("wd-partial") {
needs_reserialized = true;
let attr_map = el.attributes.borrow();
let template = attr_map
.get("t")
.ok_or_eyre("missing t attribute on wd-partial")?;
let attr_map: HashMap<_, _> = attr_map
.map
.iter()
.map(|(k, v)| (k.local.to_string(), &v.value))
.collect();
let mut html_buf = Vec::new();
for child in el.as_node().children() {
child.serialize(&mut html_buf)?;
}
let html = String::from_utf8(html_buf)?;
let new_html = self.build_page_raw(
PageMetadata {
template: Some(template.to_string()),
userdata: serde_yml::to_value(attr_map)?,
is_partial: true,
..Default::default()
},
&html,
(),
)?;
let new_doc = kuchikiki::parse_html()
.one(new_html)
.document_node
.select_first("body")
.map(|b| b.as_node().children())
.expect("should never fail");
for child in new_doc {
el.as_node().insert_before(child);
}
el.as_node().detach();
}
if needs_reserialized {
let mut html = Vec::new();
document.serialize(&mut html)?;
String::from_utf8(html)?
} else {
html
}
};
let output = if is_partial {
html
} else {
let mut output = Vec::new();
let mut rewriter = HtmlRewriter::new(
Settings {
@ -269,8 +212,7 @@ impl SiteBuilder {
"me" => {
el.set_attribute(
"rel",
&(el.get_attribute("rel").unwrap_or_default()
+ " me"),
&(el.get_attribute("rel").unwrap_or_default() + " me"),
)?;
}
_ => {
@ -347,10 +289,7 @@ impl SiteBuilder {
rewriter.write(html.as_bytes())?;
rewriter.end()?;
String::from_utf8(output)?
};
Ok(output)
Ok(String::from_utf8(output)?)
}
/// Helper to build a page without writing it to disk.
@ -395,7 +334,6 @@ impl SiteBuilder {
&head,
&page_metadata.scripts,
&page_metadata.styles,
page_metadata.is_partial,
)?;
if let Some(data) = extra {

View file

@ -6,7 +6,7 @@
let socket;
function start(reload) {
socket = new WebSocket(`ws://${location.host}`);
socket = new WebSocket("ws://127.0.0.1:8080");
let reloading = false;
socket.onmessage = function (ev) {
if (ev.data === "reload") {

View file

@ -12,18 +12,6 @@ pub struct FrontMatter<T> {
pub data: Option<T>,
}
impl<T> FrontMatter<T> {
/// Creates a new front matter.
pub fn new(data: Option<T>, content: String) -> Self {
Self { data, content }
}
/// Creates a new front matter without content.
pub fn new_empty(data: Option<T>) -> Self {
Self::new(data, String::new())
}
}
impl<T> FrontMatter<T>
where
T: DeserializeOwned,
@ -75,16 +63,6 @@ where
pub struct FrontMatterRequired<T>(FrontMatter<T>);
impl<T> FrontMatterRequired<T> {
/// Creates a new front matter.
pub fn new(data: T, content: String) -> Self {
Self(FrontMatter::new(Some(data), content))
}
/// Creates a new front matter without content.
pub fn new_empty(data: T) -> Self {
Self(FrontMatter::new_empty(Some(data)))
}
/// Gets a reference to the front matter's data.
pub fn data(&self) -> &T {
self.0.data.as_ref().expect("missing front matter data")

View file

@ -130,9 +130,6 @@ pub struct PageMetadata {
/// Custom values passed to the base template.
#[serde(default)]
pub userdata: serde_yml::Value,
/// Whether this page being rendered is a partial. Set by the builder, not your page metadata.
#[serde(skip)]
pub is_partial: bool,
}
/// Struct containing information about the site.

View file

@ -256,8 +256,11 @@ fn main() -> eyre::Result<()> {
title,
template,
} => {
let page_path = cli.site.join(webdog::PAGES_PATH).join(&id).with_extension("md");
let dir = page_path.parent().expect("should never fail");
let page_path = cli
.site
.join(webdog::PAGES_PATH)
.join(&id)
.with_extension("md");
if page_path.exists() {
eprintln!("page already exists!");
return Ok(());
@ -270,7 +273,7 @@ fn main() -> eyre::Result<()> {
..Default::default()
}),
};
std::fs::create_dir_all(dir)?;
std::fs::create_dir_all(page_path.parent().expect("should never fail"))?;
std::fs::write(&page_path, fm.format()?)?;
println!("Page created! Edit at {:?}.", page_path);