~mika/www.m1kadev.nl

a3759866b6eeafafe8ae304a4b19501bfa793c74 — m1kadev 7 months ago bef2034
update pastes; add templating
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 bricks/base-header.html => bricks/base-header.html +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 bricks/extended-footer.html => bricks/extended-footer.html +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 bricks/footer.html => bricks/footer.html +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("&", "&amp;")
      |> String.replace("<", "&lt;")
      |> String.replace(">", "&gt;")

    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();