Post-stream commit, got the basics working.
This commit is contained in:
parent
fcca99242f
commit
e2ed0a8c2f
32 changed files with 939 additions and 2 deletions
5
.formatter.exs
Normal file
5
.formatter.exs
Normal 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
26
.gitignore
vendored
Normal 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/
|
|
@ -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
5
_data/projects.yml
Normal 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
4
_pages/uses.dm
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
layout: Website.PostLayout
|
||||||
|
title: Uses
|
||||||
|
---
|
9
_posts/test-post.md
Normal file
9
_posts/test-post.md
Normal 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
99
_site/about/index.html
Normal 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>© 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
107
_site/blog/index.html
Normal 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>© 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
4
_site/css/site.css
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
:root {
|
||||||
|
color-scheme: dark light;
|
||||||
|
}
|
||||||
|
|
BIN
_site/favicon.png
Normal file
BIN
_site/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 239 KiB |
19
_site/feed.xml
Normal file
19
_site/feed.xml
Normal 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
98
_site/index.html
Normal 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>© 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
116
_site/projects/index.html
Normal 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>© 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
19
_site/sitemap.xml
Normal 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>
|
96
_site/test-post/index.html
Normal file
96
_site/test-post/index.html
Normal 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>© 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
37
config/config.exs
Normal 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
1
config/dev.exs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
import Config
|
4
config/prod.exs
Normal file
4
config/prod.exs
Normal 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
1
config/test.exs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
import Config
|
5
formatter.exs
Normal file
5
formatter.exs
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
[
|
||||||
|
import_deps: [],
|
||||||
|
plugins: [Phoenix.Liveview.HTMLFormatter],
|
||||||
|
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
|
||||||
|
]
|
12
lib/layouts/page_layout.ex
Normal file
12
lib/layouts/page_layout.ex
Normal 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
|
10
lib/layouts/post_layout.ex
Normal file
10
lib/layouts/post_layout.ex
Normal 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
|
60
lib/layouts/root_layout.ex
Normal file
60
lib/layouts/root_layout.ex
Normal 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>© <%= 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
16
lib/pages/about_page.ex
Normal 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
24
lib/pages/blog_page.ex
Normal 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
15
lib/pages/home_page.ex
Normal 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
|
34
lib/pages/projects_page.ex
Normal file
34
lib/pages/projects_page.ex
Normal 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
36
mix.exs
Normal 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
33
mix.lock
Normal 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
4
static/css/site.css
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
:root {
|
||||||
|
color-scheme: dark light;
|
||||||
|
}
|
||||||
|
|
BIN
static/favicon.png
Normal file
BIN
static/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 239 KiB |
36
test-post.md
Normal file
36
test-post.md
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
---
|
||||||
|
layout: Website.PostLayout
|
||||||
|
title: Test Post
|
||||||
|
date: 2024-11-8
|
||||||
|
categories: post
|
||||||
|
permalink: "/test-post"
|
||||||
|
---
|
||||||
|
|
||||||
|
I’d love to drop anchor in your lagoon. Brwaack! Polly want a cracker? … Oh, wait. That’s for Talk Like a PARROT Day. That’s 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.
|
||||||
|
|
||||||
|
Let’s get together and haul some keel. Aye, I guarantee ye, I’ve had a twenty percent decrease in me “lice ratio!” Me I’m 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. That’s the finest pirate booty I’ve ever laid eyes on. What are YOU doing here? Life’s pretty good, and why wouldn’t it be? I’m 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 men’s lives where they feel the need to raise the Black Flag. you know, thats the 2nd time I’v watched that man sail away with my ship. “I’ve got a jar of dirt! I’ve got a jar of dirt, and guess what’s inside it?” “Why is the rum always gone?” Land was created to provide a place for boats to visit.
|
Loading…
Reference in a new issue