M .gitignore => .gitignore +1 -4
@@ 1,5 1,2 @@
/build
-/static/highlight.min.js
-/static/rust.min.js
-/static/html.min.js
-/static/arta.min.css>
\ No newline at end of file
+/static/*.min.*<
\ No newline at end of file
A .vscode/settings.json => .vscode/settings.json +5 -0
@@ 0,0 1,5 @@
+{
+ "files.associations": {
+ "*.html": "mustache"
+ }
+}<
\ No newline at end of file
A => +4 -0
@@ 0,0 1,4 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="/index.css">
<script src="/index.js" defer></script>
\ No newline at end of file
A => +13 -0
@@ 0,0 1,13 @@
<footer>
<div id="metadata">
<p>Deployed from commit <code><span class="from-commit-short"></span></code>, on <span
class="build-date"></span>. built with lightningcss <span class="lightningcss"></span>,
html-minifier-next <span class="html-minifier-next"></span>, and uglifyjs <span
class="uglifyjs"></span> </p>
</div>
<div id="lynx">
<a href="https://github.com/m1kadev">
<img src="/static/github-mark-white.svg" width="32" height="32" alt="GitHub logo">
</a>
</div>
</footer>
\ No newline at end of file
A => +10 -0
@@ 0,0 1,10 @@
<footer>
<div id="metadata">
<p>Deployed from commit <code><span class="from-commit-short"></span></code>, on <span class="build-date"></span> </p>
</div>
<div id="lynx">
<a href="https://github.com/m1kadev">
<img src="/static/github-mark-white.svg" width="32" height="32" alt="GitHub logo">
</a>
</div>
</footer>
\ No newline at end of file
A bricks/highlight.html => bricks/highlight.html +3 -0
@@ 0,0 1,3 @@
+<script src="/static/highlight.min.js"></script>
+<script defer>hljs.highlightAll();</script>
+<link rel="stylesheet" href="/static/arta.min.css"><
\ No newline at end of file
A bricks/navbar.html => bricks/navbar.html +13 -0
@@ 0,0 1,13 @@
+<div id="mark">
+ <h3>.nl</h3>
+ <h1>m1kadev</h1>
+ <nav>
+ <hr>
+ <a href="/">home</a>
+ <a href="/projects.html">projects</a>
+ <a href="/thoughts/">thoughts</a>
+ <a href="/pastes/">pastes</a>
+ <hr>
+ <a href="/colophon.html">colophon</a>
+ </nav>
+</div><
\ No newline at end of file
M build.exs => build.exs +49 -26
@@ 2,7 2,8 @@ require Mix
require EEx
Mix.install([
- {:tzdata, "~> 1.1"}
+ {:tzdata, "~> 1.1"},
+ {:mustache, "~> 0.5.0"}
])
Calendar.put_time_zone_database(Tzdata.TimeZoneDatabase)
@@ 79,47 80,53 @@ defmodule Builders do
])
end
- def fxg(input_path, template) do
+ def fxg(input_path, template, bricks) do
own_template = input_path |> String.replace_suffix("fxg", "html")
case File.read(own_template) do
- {:ok, ctemplate} -> _fxg(input_path, ctemplate)
- _ -> _fxg(input_path, template)
+ {:ok, ctemplate} -> _fxg(input_path, ctemplate, bricks)
+ _ -> _fxg(input_path, template, bricks)
end
end
- def paste(input_path, template) do
- {:ok, rcode} = File.read(input_path)
+ def paste(input_path, template, bricks) do
+ {:ok, code} = File.read(input_path)
+ IO.inspect(code)
output = "build/" <> input_path <> ".html"
- code =
- rcode
- |> String.replace("&", "&")
- |> String.replace("<", "<")
- |> String.replace(">", ">")
-
lang = Path.extname(input_path) |> String.slice(1..-1//1)
file = Path.basename(input_path)
- {:ok, %File.Stat{mtime: mtime}} = File.stat(input_path, time: :posix)
+ time = FileX.created(input_path)
result =
- template
- |> String.replace("$LANG", lang)
- |> String.replace("$CODE", code)
- |> String.replace("$FILENAME", input_path)
- |> String.replace("$FILEMETA", "Created on " <> Integer.to_string(mtime))
+ Mustache.render(
+ template,
+ Map.merge(
+ %{
+ filename: input_path,
+ about_paste: "Created on " <> time,
+ language: "<script src=\"static/" <> lang <> ".min.js\"></script>",
+ codetag: "<pre><code class=\"language-" <> lang <> "\">",
+ code: code
+ },
+ bricks
+ )
+ )
+
+ IO.inspect(input_path)
:ok = File.write(output, result)
end
- defp _fxg(input_path, template) do
+ defp _fxg(input_path, template, bricks) do
output_path =
String.replace_prefix(input_path, "src", "build")
|> String.replace_suffix("fxg", "html")
- {output, 0} = System.cmd("fxg", [input_path])
- output = String.replace(template, "<content />", output)
+ {content, 0} = System.cmd("fxg", [input_path])
+
+ output = Mustache.render(template, Map.merge(%{fxg_content: content}, bricks))
File.write(output_path, output)
end
end
@@ 129,6 136,12 @@ defmodule FileX do
{:ok, %File.Stat{mtime: {{y, m, d}, _}}} = File.stat(path, time: :local)
Integer.to_string(d) <> "/" <> Integer.to_string(m) <> "/" <> Integer.to_string(y)
end
+
+ def sanitised_name(path) do
+ Path.basename(path)
+ |> String.trim_trailing(".html")
+ |> String.replace("-", "_")
+ end
end
{commit, 0} = System.cmd("git", ["rev-parse", "HEAD"])
@@ 150,6 163,10 @@ end
# |> Task.async_stream(fn file -> Builders.html(file) end)
# |> Enum.to_list()
+bricks =
+ Path.wildcard("bricks/*.html")
+ |> Map.new(fn x -> {FileX.sanitised_name(x), File.read!(x)} end)
+
{:ok, main_template} = File.read("src/index.html")
Path.wildcard("src/**/*.css")
@@ 161,7 178,7 @@ Path.wildcard("src/**/*.js")
|> Enum.to_list()
Path.wildcard("src/**/*.fxg")
-|> Task.async_stream(fn file -> Builders.fxg(file, main_template) end)
+|> Task.async_stream(fn file -> Builders.fxg(file, main_template, bricks) end)
|> Enum.to_list()
Path.wildcard("static/**/*")
@@ 172,10 189,12 @@ File.mkdir_p("build/pastes")
{:ok, paste_template} = File.read("pastes/paste.html")
-pastes = Path.wildcard("pastes/**/*")
+pastes =
+ Path.wildcard("pastes/**/*")
+ |> Enum.filter(fn x -> x != "pastes/paste.html" end)
pastes
-|> Task.async_stream(fn file -> Builders.paste(file, paste_template) end)
+|> Task.async_stream(fn file -> Builders.paste(file, paste_template, bricks) end)
|> Enum.to_list()
# i cant test this :)) hope it works
@@ 190,9 209,13 @@ pastes_header = """
<hr>
"""
+# main_template
+# |> String.replace("<content />", pastes_header <> "<p>" <> paste_data <> "</p>")
paste_index =
- main_template
- |> String.replace("<content />", pastes_header <> "<p>" <> paste_data <> "</p>")
+ Mustache.render(
+ main_template,
+ Map.merge(bricks, %{fxg_content: pastes_header <> "<p>" <> paste_data <> "</p>"})
+ )
File.write("build/pastes/index.html", paste_index)
A pastes/main.rs => pastes/main.rs +3 -0
@@ 0,0 1,3 @@
+fn main() {
+ println!("Hello, world!");
+}
M pastes/paste.html => pastes/paste.html +10 -37
@@ 2,52 2,25 @@
<html lang="en-GB">
<head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>home - m1kadev.nl</title>
- <link rel="stylesheet" href="/index.css">
- <link rel="stylesheet" href="/static/arta.min.css">
- <script src="/static/highlight.min.js"></script>
- <script src="/static/$LANG.min.js"></script>
- <script defer>
- hljs.highlightAll();
- </script>
+ {{ &base_header }}
+
+ {{ &language }}
+ {{ &highlight }}
</head>
<body>
<div id="content">
<main>
- <h1>$FILENAME</h1>
- <small id="filemeta">$FILEMETA</small>
- <pre><code class="language-$LANG">
-$CODE
- </code></pre>
+ <h1>{{ filename }}</h1>
+ <p>{{ about_paste }}</p>
+ <hr>
+ {{ &codetag }}{{ code }}</code></pre>
<hr>
- <footer>
- <div id="metadata">
- <p>Deployed from commit <code><span class="from-commit-short"></span></code>, on <span
- class="build-date"></span> </p>
- </div>
- <div id="lynx">
- <a href="https://github.com/m1kadev">
- <img src="/static/github-mark-white.svg" width="32" height="32" alt="GitHub logo">
- </a>
- </div>
- </footer>
+ {{ &footer }}
</main>
</div>
- <div id="mark">
- <h3>.nl</h3>
- <h1>m1kadev</h1>
- <nav>
- <a href="/">home</a>
- <a href="/projects.html">projects</a>
- <a href="/thoughts/">thoughts</a>
- <a href="/pastes/">pastes</a>
- <a href="/colophon.html">colophon</a>
- </nav>
- </div>
+ {{ &navbar }}
</body>
M pull-hljs.sh => pull-hljs.sh +5 -3
@@ 4,14 4,16 @@ cd static
rm highlight.min.js
-rm rust.min.js
+rm rs.min.js
rm html.min.js
-rn arta.min.css
+rm arta.min.css
wget https://raw.githubusercontent.com/highlightjs/cdn-release/refs/heads/main/build/highlight.min.js
wget https://raw.githubusercontent.com/highlightjs/cdn-release/refs/heads/main/build/languages/rust.min.js
wget https://raw.githubusercontent.com/highlightjs/cdn-release/refs/heads/main/build/languages/html.min.js
-wget https://raw.githubusercontent.com/highlightjs/cdn-release/refs/heads/main/build/styles/arta.min.css>
\ No newline at end of file
+wget https://raw.githubusercontent.com/highlightjs/cdn-release/refs/heads/main/build/styles/arta.min.css
+
+mv rust.min.js rs.min.js<
\ No newline at end of file
M src/colophon.fxg => src/colophon.fxg +2 -2
@@ 1,5 1,5 @@
-= Colophon =
+= colophon =
-== About ==
+== about ==
you're looking at a <#https://en.wiktionary.org/wiki/beautiful#English beautiful> site, with <#https://caddyserver.com/ caddy> as its backend. all source pages are written in my own markup language, <#https://github.com/m1kadev/fxg fxg>. site generation is done by a homebrewn <#https://github.com/m1kadev/www.m1kadev.nl/blob/main/build.exs elixir script>. all code (including <#https://github.com/m1kadev/fxg fxg>) is licenced under the MIT licence.=
\ No newline at end of file
M src/colophon.html => src/colophon.html +8 -33
@@ 2,48 2,23 @@
<html lang="en-GB">
<head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>home - m1kadev.nl</title>
- <link rel="stylesheet" href="/index.css">
- <script src="/static/highlight.min.js"></script>
- <script src="/index.js" defer></script>
- <link rel="stylesheet" href="/static/arta.min.css">
+
+ {{ &base_header }}
+
+ <title>colophon - m1kadev.nl</title>
+
</head>
<body>
<div id="content">
<main>
- <content />
+ {{ &fxg_content }}
<hr>
- <footer>
- <div id="metadata">
- <p>Deployed from commit <code><span class="from-commit-short"></span></code>, on <span
- class="build-date"></span>. built with lightningcss <span class="lightningcss"></span>,
- html-minifier-next <span class="html-minifier-next"></span>, and uglifyjs <span
- class="uglifyjs"></span> </p>
- </div>
- <div id="lynx">
- <a href="https://github.com/m1kadev">
- <img src="/static/github-mark-white.svg" width="32" height="32" alt="GitHub logo">
- </a>
- </div>
- </footer>
+ {{ &extended_footer }}
</main>
</div>
- <div id="mark">
- <h3>.nl</h3>
- <h1>m1kadev</h1>
- <nav>
- <a href="/">home</a>
- <a href="/projects.html">projects</a>
- <a href="/thoughts/">thoughts</a>
- <a href="/pastes/">pastes</a>
- <a href="/colophon.html">colophon</a>
- </nav>
- </div>
-
+ {{ &navbar }}
</body>
</html>=
\ No newline at end of file
M src/index.html => src/index.html +9 -30
@@ 2,47 2,26 @@
<html lang="en-GB">
<head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>home - m1kadev.nl</title>
- <link rel="stylesheet" href="/index.css">
- <script src="/static/highlight.min.js"></script>
+ {{ &base_header }}
+
+ {{ &highlight }}
+
<script src="/static/rust.min.js"></script>
- <script src="/index.js" defer></script>
- <link rel="stylesheet" href="/static/arta.min.css">
+
+ <title>home - m1kadev</title>
</head>
<body>
<div id="content">
<main>
- <content />
+ {{ &fxg_content }}
<hr>
- <footer>
- <div id="metadata">
- <p>Deployed from commit <code><span class="from-commit-short"></span></code>, on <span
- class="build-date"></span> </p>
- </div>
- <div id="lynx">
- <a href="https://github.com/m1kadev">
- <img src="/static/github-mark-white.svg" width="32" height="32" alt="GitHub logo">
- </a>
- </div>
- </footer>
+ {{ &footer }}
</main>
</div>
- <div id="mark">
- <h3>.nl</h3>
- <h1>m1kadev</h1>
- <nav>
- <a href="/">home</a>
- <a href="/projects.html">projects</a>
- <a href="/thoughts/">thoughts</a>
- <a href="/pastes/">pastes</a>
- <a href="/colophon.html">colophon</a>
- </nav>
- </div>
+ {{ &navbar }}
</body>
M src/index.js => src/index.js +0 -2
@@ 4,8 4,6 @@ const htmlMinifierNext = Array.from(document.getElementsByClassName("html-minifi
const lightningcss = Array.from(document.getElementsByClassName("lightningcss"));
const uglifyjs = Array.from(document.getElementsByClassName("uglifyjs"));
-hljs.highlightAll();
-
fetch("/info.txt").then(async data => {
const res = await data.text();
let map = new Map();