Post-stream commit, got the basics working.

This commit is contained in:
Siina Mashek 2024-11-08 18:26:38 +02:00
parent fcca99242f
commit e2ed0a8c2f
32 changed files with 939 additions and 2 deletions

5
.formatter.exs Normal file
View file

@ -0,0 +1,5 @@
[
import_deps: [],
plugins: [Phoenix.Liveview.HTMLFormatter],
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
]

26
.gitignore vendored Normal file
View file

@ -0,0 +1,26 @@
# The directory Mix will write compiled artifacts to.
/_build/
# If you run "mix test --cover", coverage assets end up here.
/cover/
# The directory Mix downloads your dependencies sources to.
/deps/
# Where third-party dependencies like ExDoc output generated docs.
/doc/
# Ignore .fetch files in case you like to edit your project deps locally.
/.fetch
# If the VM crashes, it generates a dump, let's ignore it too.
erl_crash.dump
# Also ignore archive artifacts (built via "mix archive.build").
*.ez
# Ignore package tarball (built via "mix hex.build").
tableau_new-*.tar
# Temporary files, for example, from tests.
/tmp/

View file

@ -1,3 +1,5 @@
# criminallycute.fi
# Criminally Cute Website
sources for criminallycute.fi
Sources for [criminallycute.fi][]
[criminallycute.fi]:https://criminallycute.fi

5
_data/projects.yml Normal file
View file

@ -0,0 +1,5 @@
- active:
- name: test
link: https://some.site
description: |
Fleet bilge rat hang the jib Sail ho dead men tell no tales gibbet yardarm galleon. Bowsprit long boat cackle fruit draft chandler scurvy crimp black spot lugger Sea Legs.

4
_pages/uses.dm Normal file
View file

@ -0,0 +1,4 @@
---
layout: Website.PostLayout
title: Uses
---

9
_posts/test-post.md Normal file
View file

@ -0,0 +1,9 @@
---
layout: Website.PostLayout
title: Test Post
date: 2024-11-08
categories: post
permalink: test-post
---
TEST POST PLEASE IGNORE

99
_site/about/index.html Normal file
View file

@ -0,0 +1,99 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<!-- meta name="color-scheme" content="dark light" /-->
<title>
About | Criminally Cute
</title>
<link rel="icon" type="image/png" href="/favicon.png">
<link rel="stylesheet" href="/css/site.css">
</head>
<body>
<header>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/projects">Projects</a></li>
</ul>
</nav>
<div>
<h1>About</h1>
</div>
</header>
<main>
<article>
<p>Lateen sail pillage reef splice the main brace loot capstan carouser boatswain Corsair run a rig. Capstan tackle careen booty brig stern parrel topsail rope's end run a shot across the bow. Boatswain gun plunder jack no prey, no pay sutler carouser driver bring a spring upon her cable quarter.</p>
<p>Sink me bring a spring upon her cable scourge of the seven seas piracy shrouds reef sails long boat killick Shiver me timbers belay. Schooner keelhaul parrel gangway grapple nipper chantey lad cackle fruit rutters. Come about bowsprit jury mast main sheet line sloop skysail yard Sea Legs weigh anchor.</p>
<p>Bilge hornswaggle draught coffer lass boom boatswain hempen halter gun blow the man down. Heave to pink Privateer bounty rum parley mutiny scurvy wherry trysail. Trysail Sea Legs mizzenmast long boat topmast furl aft fathom landlubber or just lubber jolly boat.</p>
</article>
</main>
<footer>
<ul>
<li>some link</li>
<li>some link 2</li>
</ul>
<div>
<p>&copy; 2024 Criminally Cute</p>
<p><a class="underline" href="/feed.xml">RSS</a></p>
</div>
</footer>
</body>
</html>
<script>
function log(message) {
if (true) {
console.log(`[web_dev_utils] ${message}`)
}
}
function connect() {
try {
window.socket = new WebSocket('ws://' + location.host + '/ws');
window.socket.onmessage = function(e) {
if (e.data === "reload") {
log("reloading!");
location.reload();
} else if (e.data === "subscribed") {
log("connected and subscribed!");
}
}
window.socket.onopen = () => {
waitForConnection(() => {
log("sending 'subscribe' message");
window.socket.send("subscribe")
}
, 300);
};
window.socket.onclose = () => {
setTimeout(() => connect(), 500);
};
function waitForConnection(callback, interval) {
log("waiting for connection!")
if (window.socket.readyState === 1) {
callback();
} else {
log("setting a timeout")
setTimeout(() => waitForConnection(callback, interval), interval);
}
}
} catch (e) {
log(e);
setTimeout(() => connect(), 500);
}
}
log("about to connect");
connect();
</script>

107
_site/blog/index.html Normal file
View file

@ -0,0 +1,107 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<!-- meta name="color-scheme" content="dark light" /-->
<title>
Blog | Criminally Cute
</title>
<link rel="icon" type="image/png" href="/favicon.png">
<link rel="stylesheet" href="/css/site.css">
</head>
<body>
<header>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/projects">Projects</a></li>
</ul>
</nav>
<div>
<h1>Blog</h1>
</div>
</header>
<main>
<article>
<section>
<article class="mt-8">
Blog description goes here
<a class="underline text-base flex items-center justify-between" href="blog/test-post">
<h3>
<time>08.Nov.2024</time>
Test Post
</h3>
</a>
</article>
</section>
</article>
</main>
<footer>
<ul>
<li>some link</li>
<li>some link 2</li>
</ul>
<div>
<p>&copy; 2024 Criminally Cute</p>
<p><a class="underline" href="/feed.xml">RSS</a></p>
</div>
</footer>
</body>
</html>
<script>
function log(message) {
if (true) {
console.log(`[web_dev_utils] ${message}`)
}
}
function connect() {
try {
window.socket = new WebSocket('ws://' + location.host + '/ws');
window.socket.onmessage = function(e) {
if (e.data === "reload") {
log("reloading!");
location.reload();
} else if (e.data === "subscribed") {
log("connected and subscribed!");
}
}
window.socket.onopen = () => {
waitForConnection(() => {
log("sending 'subscribe' message");
window.socket.send("subscribe")
}
, 300);
};
window.socket.onclose = () => {
setTimeout(() => connect(), 500);
};
function waitForConnection(callback, interval) {
log("waiting for connection!")
if (window.socket.readyState === 1) {
callback();
} else {
log("setting a timeout")
setTimeout(() => waitForConnection(callback, interval), interval);
}
}
} catch (e) {
log(e);
setTimeout(() => connect(), 500);
}
}
log("about to connect");
connect();
</script>

4
_site/css/site.css Normal file
View file

@ -0,0 +1,4 @@
:root {
color-scheme: dark light;
}

BIN
_site/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

19
_site/feed.xml Normal file
View file

@ -0,0 +1,19 @@
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<atom:link href="http://localhost:4999/feed.xml" rel="self" type="application/rss+xml" />
<title>site</title>
<link>http://localhost:4999</link>
<description>My beautiful website</description>
<language>en-us</language>
<generator>Tableau v0.18.0</generator>
<item>
<title>Test Post</title>
<link>http://localhost:4999/test-post</link>
<pubDate>Fri, 08 Nov 2024 00:00:00 UTC</pubDate>
<guid>http://localhost:4999/test-post</guid>
<description><![CDATA[
TEST POST PLEASE IGNORE
]]></description>
</item>
</channel>
</rss>

98
_site/index.html Normal file
View file

@ -0,0 +1,98 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<!-- meta name="color-scheme" content="dark light" /-->
<title>
Criminally Cute | Criminally Cute
</title>
<link rel="icon" type="image/png" href="/favicon.png">
<link rel="stylesheet" href="/css/site.css">
</head>
<body>
<header>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/projects">Projects</a></li>
</ul>
</nav>
<div>
<h1>Criminally Cute</h1>
</div>
</header>
<main>
<article>
<p>Swing the lead bucko bilge water jib smartly reef crack Jennys tea cup gibbet pillage boatswain.</p>
<p>Ballast maroon fathom Sink me hempen halter Admiral of the Black scuppers jury mast Jolly Roger rutters. Gibbet Plate Fleet snow sloop Barbary Coast tender barque loot loaded to the gunwalls Brethren of the Coast. Sheet loot clap of thunder Nelsons folly Chain Shot case shot warp dance the hempen jig bucko quarter. </p>
</article>
</main>
<footer>
<ul>
<li>some link</li>
<li>some link 2</li>
</ul>
<div>
<p>&copy; 2024 Criminally Cute</p>
<p><a class="underline" href="/feed.xml">RSS</a></p>
</div>
</footer>
</body>
</html>
<script>
function log(message) {
if (true) {
console.log(`[web_dev_utils] ${message}`)
}
}
function connect() {
try {
window.socket = new WebSocket('ws://' + location.host + '/ws');
window.socket.onmessage = function(e) {
if (e.data === "reload") {
log("reloading!");
location.reload();
} else if (e.data === "subscribed") {
log("connected and subscribed!");
}
}
window.socket.onopen = () => {
waitForConnection(() => {
log("sending 'subscribe' message");
window.socket.send("subscribe")
}
, 300);
};
window.socket.onclose = () => {
setTimeout(() => connect(), 500);
};
function waitForConnection(callback, interval) {
log("waiting for connection!")
if (window.socket.readyState === 1) {
callback();
} else {
log("setting a timeout")
setTimeout(() => waitForConnection(callback, interval), interval);
}
}
} catch (e) {
log(e);
setTimeout(() => connect(), 500);
}
}
log("about to connect");
connect();
</script>

116
_site/projects/index.html Normal file
View file

@ -0,0 +1,116 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<!-- meta name="color-scheme" content="dark light" /-->
<title>
Projects | Criminally Cute
</title>
<link rel="icon" type="image/png" href="/favicon.png">
<link rel="stylesheet" href="/css/site.css">
</head>
<body>
<header>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/projects">Projects</a></li>
</ul>
</nav>
<div>
<h1>Projects</h1>
</div>
</header>
<main>
<article>
<div class="space-y-20">
<div class="flex flex-col space-y-20">
<div>
<h2 class="text-base">active</h2>
<div class="space-y-4">
<div>
<a href="https://some.site">test</a>
<p class="mt-0 text-sm">
Fleet bilge rat hang the jib Sail ho dead men tell no tales gibbet yardarm galleon. Bowsprit long boat cackle fruit draft chandler scurvy crimp black spot lugger Sea Legs.
</p>
</div>
</div>
</div>
</div>
</div>
</article>
</main>
<footer>
<ul>
<li>some link</li>
<li>some link 2</li>
</ul>
<div>
<p>&copy; 2024 Criminally Cute</p>
<p><a class="underline" href="/feed.xml">RSS</a></p>
</div>
</footer>
</body>
</html>
<script>
function log(message) {
if (true) {
console.log(`[web_dev_utils] ${message}`)
}
}
function connect() {
try {
window.socket = new WebSocket('ws://' + location.host + '/ws');
window.socket.onmessage = function(e) {
if (e.data === "reload") {
log("reloading!");
location.reload();
} else if (e.data === "subscribed") {
log("connected and subscribed!");
}
}
window.socket.onopen = () => {
waitForConnection(() => {
log("sending 'subscribe' message");
window.socket.send("subscribe")
}
, 300);
};
window.socket.onclose = () => {
setTimeout(() => connect(), 500);
};
function waitForConnection(callback, interval) {
log("waiting for connection!")
if (window.socket.readyState === 1) {
callback();
} else {
log("setting a timeout")
setTimeout(() => waitForConnection(callback, interval), interval);
}
}
} catch (e) {
log(e);
setTimeout(() => connect(), 500);
}
}
log("about to connect");
connect();
</script>

19
_site/sitemap.xml Normal file
View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<url>
<loc>http://localhost:4999/</loc>
</url>
<url>
<loc>http://localhost:4999/projects</loc>
</url>
<url>
<loc>http://localhost:4999/about</loc>
</url>
<url>
<loc>http://localhost:4999/blog</loc>
</url>
<url>
<lastmod>2024-11-08T00:00:00Z</lastmod>
<loc>http://localhost:4999/test-post</loc>
</url>
</urlset>

View file

@ -0,0 +1,96 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<!-- meta name="color-scheme" content="dark light" /-->
<title>
Test Post | Criminally Cute
</title>
<link rel="icon" type="image/png" href="/favicon.png">
<link rel="stylesheet" href="/css/site.css">
</head>
<body>
<header>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/projects">Projects</a></li>
</ul>
</nav>
<div>
<h1>Test Post</h1>
</div>
</header>
<main>
<p>TEST POST PLEASE IGNORE</p>
</main>
<footer>
<ul>
<li>some link</li>
<li>some link 2</li>
</ul>
<div>
<p>&copy; 2024 Criminally Cute</p>
<p><a class="underline" href="/feed.xml">RSS</a></p>
</div>
</footer>
</body>
</html>
<script>
function log(message) {
if (true) {
console.log(`[web_dev_utils] ${message}`)
}
}
function connect() {
try {
window.socket = new WebSocket('ws://' + location.host + '/ws');
window.socket.onmessage = function(e) {
if (e.data === "reload") {
log("reloading!");
location.reload();
} else if (e.data === "subscribed") {
log("connected and subscribed!");
}
}
window.socket.onopen = () => {
waitForConnection(() => {
log("sending 'subscribe' message");
window.socket.send("subscribe")
}
, 300);
};
window.socket.onclose = () => {
setTimeout(() => connect(), 500);
};
function waitForConnection(callback, interval) {
log("waiting for connection!")
if (window.socket.readyState === 1) {
callback();
} else {
log("setting a timeout")
setTimeout(() => waitForConnection(callback, interval), interval);
}
}
} catch (e) {
log(e);
setTimeout(() => connect(), 500);
}
}
log("about to connect");
connect();
</script>

37
config/config.exs Normal file
View file

@ -0,0 +1,37 @@
import Config
config :tableau, :reloader,
patterns: [
~r"^lib/.*.ex",
~r"^(_posts|_pages)/.*.md",
~r"assets/.*.(css|js)",
]
config :web_dev_utils, :reload_log, true
config :tableau, :config,
url: "http://localhost:4999",
timezone: "Europe/Helsinki",
include_dir: "static",
markdown: [
mdex: [
extension: [table: true, header_ids: "", tasklist: true, strikethrough: true],
render: [unsafe_: true],
features: [syntax_highlight_theme: "kanagawa"]
]
]
config :tableau, Tableau.PageExtension, enabled: true
config :tableau, Tableau.PostExtension, enabled: true, future: true
config :tableau, Tableau.DataExtension, enabled: true
config :tableau, Tableau.SitemapExtension, enabled: true
config :tableau, Tableau.RSSExtension,
enabled: true,
title: "site",
description: "My beautiful website"
config :elixir, :time_zone_database, Tz.TimeZoneDatabase
import_config "#{Mix.env()}.exs"

1
config/dev.exs Normal file
View file

@ -0,0 +1 @@
import Config

4
config/prod.exs Normal file
View file

@ -0,0 +1,4 @@
import Config
config :tableau, :config, url: "https://criminallycute.fi"
config :tableau, Tableau.PostExtension, future: false

1
config/test.exs Normal file
View file

@ -0,0 +1 @@
import Config

5
formatter.exs Normal file
View file

@ -0,0 +1,5 @@
[
import_deps: [],
plugins: [Phoenix.Liveview.HTMLFormatter],
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
]

View file

@ -0,0 +1,12 @@
defmodule Website.PageLayout do
use Tableau.Layout, layout: Website.RootLayout
use Phoenix.Component
def template(assigns) do
~H"""
<article>
<%= {:safe, render(@inner_content)} %>
</article>
"""
end
end

View file

@ -0,0 +1,10 @@
defmodule Website.PostLayout do
use Tableau.Layout, layout: Website.RootLayout
use Phoenix.Component
def template(assigns) do
~H"""
<%= {:safe, render(@inner_content)} %>
"""
end
end

View file

@ -0,0 +1,60 @@
defmodule Website.RootLayout do
use Tableau.Layout
use Phoenix.Component
def template(assigns) do
~H"""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<!-- meta name="color-scheme" content="dark light" /-->
<title>
<%= [@page[:title], "Criminally Cute"]
|> Enum.filter(& &1)
|> Enum.intersperse("|")
|> Enum.join(" ") %>
</title>
<link rel="icon" type="image/png" href="/favicon.png" />
<link rel="stylesheet" href="/css/site.css" />
</head>
<body>
<header>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/projects">Projects</a></li>
</ul>
</nav>
<div>
<h1><%= @page[:title] %></h1>
</div>
</header>
<main>
<%= render(@inner_content) %>
</main>
<footer>
<ul>
<li>some link</li>
<li>some link 2</li>
</ul>
<div>
<p>&copy; <%= Date.utc_today().year %> Criminally Cute</p>
<p><a class="underline" href="/feed.xml">RSS</a></p>
</div>
</footer>
</body>
</html>
<%= if Mix.env() == :dev do %>
<%= Phoenix.HTML.raw(Tableau.live_reload(assigns)) %>
<% end %>
"""
|> Phoenix.HTML.Safe.to_iodata()
end
end

16
lib/pages/about_page.ex Normal file
View file

@ -0,0 +1,16 @@
defmodule Website.Aboutpage do
use Tableau.Page,
layout: Website.PageLayout,
permalink: "/about",
title: "About"
use Phoenix.Component
def template(assigns) do
~H"""
<p>Lateen sail pillage reef splice the main brace loot capstan carouser boatswain Corsair run a rig. Capstan tackle careen booty brig stern parrel topsail rope's end run a shot across the bow. Boatswain gun plunder jack no prey, no pay sutler carouser driver bring a spring upon her cable quarter.</p>
<p>Sink me bring a spring upon her cable scourge of the seven seas piracy shrouds reef sails long boat killick Shiver me timbers belay. Schooner keelhaul parrel gangway grapple nipper chantey lad cackle fruit rutters. Come about bowsprit jury mast main sheet line sloop skysail yard Sea Legs weigh anchor.</p>
<p>Bilge hornswaggle draught coffer lass boom boatswain hempen halter gun blow the man down. Heave to pink Privateer bounty rum parley mutiny scurvy wherry trysail. Trysail Sea Legs mizzenmast long boat topmast furl aft fathom landlubber or just lubber jolly boat.</p>
"""
end
end

24
lib/pages/blog_page.ex Normal file
View file

@ -0,0 +1,24 @@
defmodule Website.BlogPage do
use Tableau.Page,
layout: Website.PageLayout,
permalink: "/blog",
title: "Blog"
use Phoenix.Component
def template(assigns) do
~H"""
<section>
<article :for={post <- @posts} class="mt-8">
Blog description goes here
<a class="underline text-base flex items-center justify-between" href={"blog/" <> post.permalink}>
<h3>
<time><%= post.date |> Calendar.strftime("%d.%b.%Y") %></time>
<%= post.title %>
</h3>
</a>
</article>
</section>
"""
end
end

15
lib/pages/home_page.ex Normal file
View file

@ -0,0 +1,15 @@
defmodule Website.HomePage do
use Tableau.Page,
layout: Website.PageLayout,
permalink: "/",
title: "Criminally Cute"
use Phoenix.Component
def template(assigns) do
~H"""
<p>Swing the lead bucko bilge water jib smartly reef crack Jennys tea cup gibbet pillage boatswain.</p>
<p>Ballast maroon fathom Sink me hempen halter Admiral of the Black scuppers jury mast Jolly Roger rutters. Gibbet Plate Fleet snow sloop Barbary Coast tender barque loot loaded to the gunwalls Brethren of the Coast. Sheet loot clap of thunder Nelsons folly Chain Shot case shot warp dance the hempen jig bucko quarter. </p>
"""
end
end

View file

@ -0,0 +1,34 @@
defmodule Website.ProjectsPage do
use Tableau.Page,
layout: Website.PageLayout,
permalink: "/projects",
title: "Projects"
use Phoenix.Component
def template(assigns) do
~H"""
<div class="space-y-20">
<div class="flex flex-col space-y-20">
<%= for type <- @data["projects"] do %>
<div :for={{status, projects} <- type}>
<h2 class="text-base"><%= status %></h2>
<div class="space-y-4">
<div :for={project <- projects}>
<%= if project["link"] do %>
<a href={project["link"]}><%= project["name"] %></a>
<% else %>
<%= project["name"] %>
<% end %>
<p class="mt-0 text-sm">
<%= project["description"] %>
</p>
</div>
</div>
</div>
<% end %>
</div>
</div>
"""
end
end

36
mix.exs Normal file
View file

@ -0,0 +1,36 @@
defmodule Website.MixProject do
use Mix.Project
def project do
[
app: :criminallycute_web,
version: "0.1.0",
elixir: "~> 1.15",
start_permanent: Mix.env() == :prod,
compilers: Mix.compilers(),
aliases: aliases(),
deps: deps()
]
end
# Run "mix help compile.app" to learn about applications.
def application do
[
extra_applications: [:logger]
]
end
def aliases() do
[
build: ["tableau.build"]
]
end
# Run "mix help deps" to learn about dependencies.
defp deps do
[
{:tableau, "~> 0.17"},
{:phoenix_live_view, "~> 0.20"},
]
end
end

33
mix.lock Normal file
View file

@ -0,0 +1,33 @@
%{
"bandit": {:hex, :bandit, "1.5.7", "6856b1e1df4f2b0cb3df1377eab7891bec2da6a7fd69dc78594ad3e152363a50", [:mix], [{:hpax, "~> 1.0.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "f2dd92ae87d2cbea2fa9aa1652db157b6cba6c405cb44d4f6dd87abba41371cd"},
"castore": {:hex, :castore, "1.0.9", "5cc77474afadf02c7c017823f460a17daa7908e991b0cc917febc90e466a375c", [:mix], [], "hexpm", "5ea956504f1ba6f2b4eb707061d8e17870de2bee95fb59d512872c2ef06925e7"},
"date_time_parser": {:hex, :date_time_parser, "1.2.0", "3d5a816b91967f51e0f94dcb16a34b2cb780f22cd48931779e81d72f7d3eadb1", [:mix], [{:kday, "~> 1.0", [hex: :kday, repo: "hexpm", optional: false]}], "hexpm", "0cf09ada9f42c0b3bfba02dc0ea2e4b4d2f543d9d2bf99b831a29e6b4a4160e5"},
"file_system": {:hex, :file_system, "1.0.1", "79e8ceaddb0416f8b8cd02a0127bdbababe7bf4a23d2a395b983c1f8b3f73edd", [:mix], [], "hexpm", "4414d1f38863ddf9120720cd976fce5bdde8e91d8283353f0e31850fa89feb9e"},
"floki": {:hex, :floki, "0.36.3", "1102f93b16a55bc5383b85ae3ec470f82dee056eaeff9195e8afdf0ef2a43c30", [:mix], [], "hexpm", "fe0158bff509e407735f6d40b3ee0d7deb47f3f3ee7c6c182ad28599f9f6b27a"},
"hpax": {:hex, :hpax, "1.0.0", "28dcf54509fe2152a3d040e4e3df5b265dcb6cb532029ecbacf4ce52caea3fd2", [:mix], [], "hexpm", "7f1314731d711e2ca5fdc7fd361296593fc2542570b3105595bb0bc6d0fad601"},
"html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"},
"kday": {:hex, :kday, "1.1.0", "64efac85279a12283eaaf3ad6f13001ca2dff943eda8c53288179775a8c057a0", [:mix], [{:ex_doc, "~> 0.21", [hex: :ex_doc, repo: "hexpm", optional: true]}], "hexpm", "69703055d63b8d5b260479266c78b0b3e66f7aecdd2022906cd9bf09892a266d"},
"libgraph": {:hex, :libgraph, "0.16.0", "3936f3eca6ef826e08880230f806bfea13193e49bf153f93edcf0239d4fd1d07", [:mix], [], "hexpm", "41ca92240e8a4138c30a7e06466acc709b0cbb795c643e9e17174a178982d6bf"},
"mdex": {:hex, :mdex, "0.2.0", "af93e03bc964f2628c3940d22ba03435b119e070bd423fd62d31772d428a7e6c", [:mix], [{:rustler, "~> 0.32", [hex: :rustler, repo: "hexpm", optional: true]}, {:rustler_precompiled, "~> 0.7", [hex: :rustler_precompiled, repo: "hexpm", optional: false]}], "hexpm", "d8d21d3d6ecb0b2a10f88b539f3a61df974f9570226bf6bd24404c9e361c8089"},
"mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"},
"phoenix": {:hex, :phoenix, "1.7.14", "a7d0b3f1bc95987044ddada111e77bd7f75646a08518942c72a8440278ae7825", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "c7859bc56cc5dfef19ecfc240775dae358cbaa530231118a9e014df392ace61a"},
"phoenix_html": {:hex, :phoenix_html, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"},
"phoenix_live_view": {:hex, :phoenix_live_view, "0.20.17", "f396bbdaf4ba227b82251eb75ac0afa6b3da5e509bc0d030206374237dfc9450", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a61d741ffb78c85fdbca0de084da6a48f8ceb5261a79165b5a0b59e5f65ce98b"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"},
"phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"},
"plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"},
"plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"},
"plug_static_index_html": {:hex, :plug_static_index_html, "1.0.0", "840123d4d3975585133485ea86af73cb2600afd7f2a976f9f5fd8b3808e636a0", [:mix], [{:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "79fd4fcf34d110605c26560cbae8f23c603ec4158c08298bd4360fdea90bb5cf"},
"rustler_precompiled": {:hex, :rustler_precompiled, "0.8.2", "5f25cbe220a8fac3e7ad62e6f950fcdca5a5a5f8501835d2823e8c74bf4268d5", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "63d1bd5f8e23096d1ff851839923162096364bac8656a4a3c00d1fff8e83ee0a"},
"schematic": {:hex, :schematic, "0.4.0", "2b3c4865c919bb9392251aba4198982f7be8785bc37c732ccfe672a3e19e4591", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "692747901601f4b511171fbd3a4032bf13d84dc81d52e827f041373ce2035588"},
"tableau": {:hex, :tableau, "0.18.0", "5fdbbbe95c9ca9c5f46002cff795fe5de07a0ce69c7dc8f1a00734742194e919", [:mix], [{:bandit, "~> 1.0", [hex: :bandit, repo: "hexpm", optional: false]}, {:date_time_parser, "~> 1.2", [hex: :date_time_parser, repo: "hexpm", optional: false]}, {:floki, "~> 0.34", [hex: :floki, repo: "hexpm", optional: false]}, {:html_entities, "~> 0.5.2", [hex: :html_entities, repo: "hexpm", optional: false]}, {:libgraph, "~> 0.16.0", [hex: :libgraph, repo: "hexpm", optional: false]}, {:mdex, "~> 0.2.0", [hex: :mdex, repo: "hexpm", optional: false]}, {:plug_static_index_html, "~> 1.0", [hex: :plug_static_index_html, repo: "hexpm", optional: false]}, {:schematic, "~> 0.4", [hex: :schematic, repo: "hexpm", optional: false]}, {:tz, "~> 0.28.1", [hex: :tz, repo: "hexpm", optional: false]}, {:web_dev_utils, "~> 0.2", [hex: :web_dev_utils, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5", [hex: :websock_adapter, repo: "hexpm", optional: false]}, {:xml_builder, "~> 2.1", [hex: :xml_builder, repo: "hexpm", optional: false]}, {:yaml_elixir, "~> 2.9", [hex: :yaml_elixir, repo: "hexpm", optional: false]}], "hexpm", "a210c84f73ff6571865b554a41f1f9c3a9ada9682fd2c911e82ad35900b71c0f"},
"telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"},
"thousand_island": {:hex, :thousand_island, "1.3.5", "6022b6338f1635b3d32406ff98d68b843ba73b3aa95cfc27154223244f3a6ca5", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2be6954916fdfe4756af3239fb6b6d75d0b8063b5df03ba76fd8a4c87849e180"},
"tz": {:hex, :tz, "0.28.1", "717f5ffddfd1e475e2a233e221dc0b4b76c35c4b3650b060c8e3ba29dd6632e9", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:mint, "~> 1.6", [hex: :mint, repo: "hexpm", optional: true]}], "hexpm", "bfdca1aa1902643c6c43b77c1fb0cb3d744fd2f09a8a98405468afdee0848c8a"},
"web_dev_utils": {:hex, :web_dev_utils, "0.2.0", "3bcd109d1ac18445d06db095d5cfdca5de7586022641c0b09b0702788b8e4ea8", [:mix], [{:file_system, "~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "595e9bd35440ea2add0156ae9e68e578d986805d801dacf22b13067ca48980ed"},
"websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"},
"websock_adapter": {:hex, :websock_adapter, "0.5.7", "65fa74042530064ef0570b75b43f5c49bb8b235d6515671b3d250022cb8a1f9e", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "d0f478ee64deddfec64b800673fd6e0c8888b079d9f3444dd96d2a98383bdbd1"},
"xml_builder": {:hex, :xml_builder, "2.3.0", "69d214c6ad41ae1300b36acff4367551cdfd9dc1b860affc16e103c6b1589053", [:mix], [], "hexpm", "972ec33346a225cd5acd14ab23d4e79042bd37cb904e07e24cd06992dde1a0ed"},
"yamerl": {:hex, :yamerl, "0.10.0", "4ff81fee2f1f6a46f1700c0d880b24d193ddb74bd14ef42cb0bcf46e81ef2f8e", [:rebar3], [], "hexpm", "346adb2963f1051dc837a2364e4acf6eb7d80097c0f53cbdc3046ec8ec4b4e6e"},
"yaml_elixir": {:hex, :yaml_elixir, "2.11.0", "9e9ccd134e861c66b84825a3542a1c22ba33f338d82c07282f4f1f52d847bd50", [:mix], [{:yamerl, "~> 0.10", [hex: :yamerl, repo: "hexpm", optional: false]}], "hexpm", "53cc28357ee7eb952344995787f4bb8cc3cecbf189652236e9b163e8ce1bc242"},
}

4
static/css/site.css Normal file
View file

@ -0,0 +1,4 @@
:root {
color-scheme: dark light;
}

BIN
static/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

36
test-post.md Normal file
View file

@ -0,0 +1,36 @@
---
layout: Website.PostLayout
title: Test Post
date: 2024-11-8
categories: post
permalink: "/test-post"
---
Id love to drop anchor in your lagoon. Brwaack! Polly want a cracker? … Oh, wait. Thats for Talk Like a PARROT Day. Thats quite a cutlass ye got thar, what ye need is a good scabbard! Take what you can, give nothing back And that was done without a single drop of rum… The existence of the sea means the existence of pirates.
Lets get together and haul some keel. Aye, I guarantee ye, Ive had a twenty percent decrease in me “lice ratio!” Me Im Dishonest. And A Dishonest Man You Can Always Trust To Be Dishonest. Honestly Its The Honest Ones You Want To Watch Out For Because You Never Know When They Are Going To Do Something Completely Stupid! The rougher the seas, the smoother we sail. Ahoy! Give me freedom or give me the rope. For I shall not take the shackles that subjugate the poor to uphold the rich. Drink up me hearties yoho …a pirates life for me The average man will bristle if you say his father was dishonest, but he will brag a little if he discovers that his great- grandfather was a pirate.
``` bash
#!/bin/sh
if [[ ! $1 ]]; then
user="siinamonster"
else
user="$1"
fi
api_url="https://api.listenbrainz.org/1/user/$user/playing-now"
data=$(curl -s $api_url | jq -r '.payload.listens[0].track_metadata')
artist=$(echo "$data" | jq '.artist_name' | tr -d '"')
track=$(echo "$data" | jq '.track_name' | tr -d '"')
if [[ "$artist" != "null" ]]; then
echo "Currently playing: $artist" - "$track"
else
echo "Not listening to anything right now."
fi
```
Come on up and see me urchins. Prepare to be boarded. Thats the finest pirate booty Ive ever laid eyes on. What are YOU doing here? Lifes pretty good, and why wouldnt it be? Im a pirate, after all. Shiver me timbers.
Pardon me, but would ya mind if I fired me cannon through your porthole? Take what you can, give nothing back There comes a time in most mens lives where they feel the need to raise the Black Flag. you know, thats the 2nd time Iv watched that man sail away with my ship. “Ive got a jar of dirt! Ive got a jar of dirt, and guess whats inside it?” “Why is the rum always gone?” Land was created to provide a place for boats to visit.