Browse Source

Add default transition javascript

master
Teascade 4 years ago
parent
commit
bd0aae2e70
  1. 48
      config.example.toml
  2. 29
      config.toml
  3. 24
      src/builder.rs
  4. 1
      src/config_toml.rs
  5. 7
      src/file_writer.rs
  6. 2
      src/main.rs
  7. 1
      src/template.rs
  8. 81
      src/templates/default-js.js
  9. 2
      src/templates/meta_tags/css_tag.html
  10. 2
      src/templates/meta_tags/js_tag.html
  11. 5
      src/templates/page-template.html
  12. 2
      test_page/about.toml
  13. 6
      test_page/other.toml
  14. BIN
      test_page/resources/img/global.png
  15. BIN
      test_page/resources/img/square_trans.png

48
config.example.toml

@ -4,25 +4,41 @@ built_pages = ["test_page/about.toml", "test_page/other.toml"]
use_default_css = true
javascript = []
css = []
#before_navbar_url = "/navbar.html"
#before_content_url = "/before_content.html"
#after_content_url = "/after_content.html"
#before_navbar_url = "test_page/resources/before_navbar.html"
#before_content_url = "test_page/resources/before_content.html"
#after_content_url = "test_page/resources/after_content.html"
#favicon = "favicon.png"
#twitter_author = "@teascade"
#charset = "utf-8"
#mobile_viewport = true
#meta_description = true
#meta_og = true
#output = "public"
#[google]
#google_robots = "all"
#google_site_verification = ""
#google_site_verification = "some_verification"
#[twitter]
#twitter_site = "@teascade"
#twitter_creator = "@teascade"
[navbar]
items = ["about", "other", "google"]
#[navbar]
#items = ["about", "other", "google"]
#
# [navbar.item.about]
# title = "About"
# link = "/"
[navbar.item.about]
title = "About"
link = "/"
# [navbar.item.other]
# title = "Other"
# link = "/other"
[navbar.item.other]
title = "Other"
link = "/other"
# [navbar.item.google]
# title = "Google!"
# link = "https://google.com"
[navbar.item.google]
title = "Google!"
link = "https://google.com"
#[resource.test]
#source = "test_page/resources/copied_resources/"
#destination = ""

29
config.toml

@ -2,12 +2,13 @@
website_name = "Test Website Name!"
built_pages = ["test_page/about.toml", "test_page/other.toml"]
use_default_css = true
javascript = []
css = []
use_default_js = true
javascript = ["test.js"]
css = ["test.css"]
before_navbar_url = "test_page/resources/before_navbar.html"
before_content_url = "test_page/resources/before_content.html"
after_content_url = "test_page/resources/after_content.html"
favicon = "favicon.png"
favicon = "/img/global.png"
charset = "utf-8"
mobile_viewport = true
@ -27,18 +28,18 @@ twitter_creator = "@teascade"
[navbar]
items = ["about", "other", "google"]
[navbar.item.about]
title = "About"
link = "/"
[navbar.item.about]
title = "About"
link = "/"
[navbar.item.other]
title = "Other"
link = "/other"
[navbar.item.other]
title = "Other"
link = "/other"
[navbar.item.google]
title = "Google!"
link = "https://google.com"
[navbar.item.google]
title = "Google!"
link = "https://google.com"
[resource.test]
source = "test_page/resources/copied_resources/"
destination = ""
source = "test_page/resources/img"
destination = "img"

24
src/builder.rs

@ -15,6 +15,7 @@ use options::{BuildOpt, Opt};
use file_writer;
const DEFAULT_CSS: &'static str = include_str!("templates/default-css.css");
const DEFAULT_JS: &'static str = include_str!("templates/default-js.js");
const PAGE_TEMPLATE: &'static str = include_str!("templates/page-template.html");
const NAVBAR_ITEM: &'static str = include_str!("templates/navbar/item-template.html");
const NAVBAR_IMAGE_ITEM: &'static str = include_str!("templates/navbar/image-item-template.html");
@ -46,6 +47,20 @@ pub fn build(logger: &Logger, opt: &Opt, _: &BuildOpt) -> Result<(), Error> {
file_writer::write_file(&css_path, DEFAULT_CSS, opt.overwrite)?;
}
if config.global_config.website.use_default_js {
let js_path = file_writer::add_to_beginning(
PathBuf::from("js/default.js"),
config
.clone()
.global_config
.website
.output
.unwrap_or("public".to_owned()),
);
logger.log(LogLevel::DETAIL, format!("Adding {:?}", js_path));
file_writer::write_file(&js_path, DEFAULT_JS, opt.overwrite)?;
}
logger.log(LogLevel::INFO, "Generating page templates");
let page_template = Template::new(PAGE_TEMPLATE);
let css_tag_template = Template::new(CSS_TAG);
@ -207,15 +222,18 @@ fn write_recursive_resource(
} else {
match File::open(resource_path.clone()) {
Ok(mut read_file) => {
let mut contents = String::new();
read_file.read_to_string(&mut contents)?;
let bytes: Vec<u8> = match read_file.bytes().collect() {
Ok(bytes) => bytes,
Err(_) => Vec::new(),
};
let mut dest_path = destination.clone();
if source.is_dir() {
dest_path = dest_path.join(relative.clone());
dest_path.set_file_name(resource_path.file_name().unwrap());
}
file_writer::write_file(&dest_path, contents, true)?;
file_writer::write_bytes(&dest_path, &bytes, true)?;
Ok(())
}

1
src/config_toml.rs

@ -30,6 +30,7 @@ pub struct WebsiteConfig {
pub website_name: String,
pub built_pages: Vec<String>,
pub use_default_css: bool,
pub use_default_js: bool,
pub javascript: Vec<String>,
pub css: Vec<String>,

7
src/file_writer.rs

@ -42,6 +42,10 @@ pub fn write_file<T: Into<String>>(
content: T,
overwrite: bool,
) -> Result<(), Error> {
write_bytes(path, content.into().as_bytes(), overwrite)
}
pub fn write_bytes(path: &PathBuf, bytes: &[u8], overwrite: bool) -> Result<(), Error> {
if let Some(parent) = path.clone().parent() {
create_dir_all(parent.clone())?;
} else {
@ -51,7 +55,6 @@ pub fn write_file<T: Into<String>>(
));
}
let content = content.into();
if path.exists() && !overwrite {
Err(Error::new(
LogLevel::SEVERE,
@ -62,7 +65,7 @@ pub fn write_file<T: Into<String>>(
))
} else {
match File::create(path) {
Ok(mut file) => Ok(file.write_all(content.as_bytes()).unwrap()),
Ok(mut file) => Ok(file.write_all(bytes).unwrap()),
Err(err) => Err(Error::from(err)),
}
}

2
src/main.rs

@ -30,6 +30,7 @@ use logger::{LogLevel, Logger};
use options::{Opt, Subcommands};
use config_toml::{GlobalConfigToml, NavbarConfig, NavbarItem, WebsiteConfig};
//TODO: Custom markdown
fn main() {
exit(match run() {
Ok(()) => 0,
@ -102,6 +103,7 @@ fn run() -> Result<(), ()> {
website_name: init_opt.name,
built_pages: Vec::new(),
use_default_css: true,
use_default_js: true,
javascript: Vec::new(),
css: Vec::new(),
favicon: init_opt.favicon,

1
src/template.rs

@ -125,6 +125,7 @@ impl Template {
"javascript_links".to_owned() => js_tags,
"use_default_css".to_owned() => config.global_config.website.use_default_css.to_string(),
"use_default_js".to_owned() => config.global_config.website.use_default_js.to_string(),
"navbar".to_owned() => config.global_config.navbar.is_some().to_string(),
"navbar_content".to_owned() => navbar_content,

81
src/templates/default-js.js

@ -0,0 +1,81 @@
var _default_js_pageloader = {
begin: (url) => { console.log("Started to load " + url); },
progress: (url, current, total) => { console.log("Progress of " + url + ": " + current + "/" + current + " (" + ((current / total) * 100) + "%)"); },
loaded: (url) => { console.log("Loaded " + url); }
}
function _default_js_main() {
let elements = document.getElementsByTagName("a");
for (element of elements) {
if (element.hostname == window.location.hostname) {
element.onclick = _default_js_onclick;
}
}
window.onpopstate = function () {
var page = window.location
_default_js_open_page(page, false);
};
}
function _default_js_onclick(event) {
event.preventDefault();
let url = event.target.href;
_default_js_open_page(url, true);
}
function _default_js_open_page(url, no_pop_state) {
let request = new XMLHttpRequest();
request.addEventListener("loadstart", (progress) => {
_default_js_pageloader.begin(url);
});
request.addEventListener("progress", (progress) => {
_default_js_pageloader.progress(url, progress.loaded, progress.total);
});
request.addEventListener("loadend", (progress) => {
_default_js_pageloader.loaded(url);
let parser = new DOMParser();
let new_document = parser.parseFromString(request.responseText, "text/html");
change_page(new_document, url, no_pop_state);
});
request.open("GET", url);
request.send();
}
function change_page(new_document, new_url, no_pop_state) {
// Some meta tags
document.title = new_document.title;
let new_favicon = new_document.querySelector("link[rel*='icon']").href;
document.querySelector("link[rel*='icon']").href = new_favicon;
// Replace css/js tags
let list = document.getElementsByClassName("._default_js_meta");
for (i in list) {
let element = list[0];
if (element !== undefined) {
element.parentNode.removeChild(element);
}
}
let new_list = new_document.getElementsByClassName("._default_js_meta");
for (i in new_list) {
let element = new_list[0];
if (element !== undefined) {
document.head.appendChild(element);
}
}
// Actually replace the content
document.body = new_document.body;
_default_js_main();
// Do history modifications
if (no_pop_state) {
window.history.pushState(new_url, new_url, new_url);
}
}

2
src/templates/meta_tags/css_tag.html

@ -1 +1 @@
<link rel="stylesheet" href="{{link}}">
<link class="._default_js_meta" rel="stylesheet" href="{{link}}">

2
src/templates/meta_tags/js_tag.html

@ -1 +1 @@
<script type="text/javascript" src="{{link}}"></script>
<script class="._default_js_meta" type="text/javascript" src="{{link}}"></script>

5
src/templates/page-template.html

@ -22,7 +22,8 @@
<meta name="twitter:creator" content="{{twitter_creator}}">
<meta name="twitter:title" content="{{page_title}}">
<meta name="twitter:description" content="{{page_description}}">
<meta name="twitter:image" content="{{favicon}}"> {{endif}} {{if use_default_css}}
<meta name="twitter:image" content="{{favicon}}"> {{endif}} {{if use_default_js}}
<script type="text/javascript" src="/js/default.js"></script> {{endif}} {{if use_default_css}}
<link rel="stylesheet" href="/css/default.css"> {{endif}} {{css_links}}{{javascript_links}}
<link rel="shortcut icon" href="{{favicon}}"></link>
@ -30,7 +31,7 @@
<title>{{page_title}}</title>
</head>
<body>
<body {{if use_default_js}} onload="_default_js_main()" {{endif}}>
{{before_navbar}} {{if navbar}}
<nav>
<ul>

2
test_page/about.toml

@ -3,7 +3,7 @@ html_path = "index.html"
title = "About"
description = "This is the test About page"
content_path = "about.md"
favicon = "/favicon.png"
#favicon = "/favicon.png"
#before_navbar_url = "/navbar.html"
#before_content_url = "/before_content.html"
#after_content_url = "/after_content.html"

6
test_page/other.toml

@ -3,9 +3,9 @@ html_path = "other/index.html"
title = "Other!"
description = "This is the .. other page"
content_path = "other.md"
#favicon = "optional_favicon.png"
favicon = "/img/square_trans.png"
#before_navbar_url = "/navbar.html"
before_content_url = "test_page/resources/before_content_other.html"
#after_content_url = "/after_content.html"
#javascript = ["Additional JavaScript"]
#css = ["Additional CSS"]
javascript = ["test_additional.js"]
css = ["test_additional.css"]

BIN
test_page/resources/img/global.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
test_page/resources/img/square_trans.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Loading…
Cancel
Save