Initial setup and content

master
Keith Irwin 2021-06-17 17:02:30 -06:00
parent 8e547e13bc
commit 60d6e78343
Signed by: ki9
GPG Key ID: DF773B3F4A88DA86
33 changed files with 132 additions and 770 deletions

View File

@ -1,7 +1,7 @@
root = true
[*]
indent_style = space
indent_style = tab
indent_size = 2
end_of_line = lf
insert_final_newline = true

View File

@ -1,64 +1,63 @@
const { DateTime } = require("luxon");
const fs = require("fs");
const pluginRss = require("@11ty/eleventy-plugin-rss");
const pluginSyntaxHighlight = require("@11ty/eleventy-plugin-syntaxhighlight");
const pluginNavigation = require("@11ty/eleventy-navigation");
const markdownIt = require("markdown-it");
const markdownItAnchor = require("markdown-it-anchor");
const { DateTime } = require('luxon')
const fs = require('fs')
const pluginRss = require('@11ty/eleventy-plugin-rss')
const pluginNavigation = require('@11ty/eleventy-navigation')
const markdownIt = require('markdown-it')
const markdownItAnchor = require('markdown-it-anchor')
module.exports = function(eleventyConfig) {
// Add plugins
eleventyConfig.addPlugin(pluginRss);
eleventyConfig.addPlugin(pluginSyntaxHighlight);
eleventyConfig.addPlugin(pluginNavigation);
eleventyConfig.addPlugin(pluginRss)
eleventyConfig.addPlugin(pluginNavigation)
// https://www.11ty.dev/docs/data-deep-merge/
eleventyConfig.setDataDeepMerge(true);
eleventyConfig.setDataDeepMerge(true)
// Alias `layout: post` to `layout: layouts/post.njk`
eleventyConfig.addLayoutAlias("post", "layouts/post.njk");
eleventyConfig.addLayoutAlias('post', 'layouts/post.njk')
eleventyConfig.addFilter("readableDate", dateObj => {
return DateTime.fromJSDate(dateObj, {zone: 'utc'}).toFormat("dd LLL yyyy");
});
eleventyConfig.addFilter('readableDate', dateObj => {
return DateTime.fromJSDate(dateObj, {zone: 'utc'}).toFormat('dd LLL yyyy')
})
// https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-date-string
eleventyConfig.addFilter('htmlDateString', (dateObj) => {
return DateTime.fromJSDate(dateObj, {zone: 'utc'}).toFormat('yyyy-LL-dd');
});
return DateTime.fromJSDate(dateObj, {zone: 'utc'}).toFormat('yyyy-LL-dd')
})
// Get the first `n` elements of a collection.
eleventyConfig.addFilter("head", (array, n) => {
eleventyConfig.addFilter('head', (array, n) => {
if( n < 0 ) {
return array.slice(n);
return array.slice(n)
}
return array.slice(0, n);
});
return array.slice(0, n)
})
// Return the smallest number argument
eleventyConfig.addFilter("min", (...numbers) => {
return Math.min.apply(null, numbers);
});
eleventyConfig.addFilter('min', (...numbers) => {
return Math.min.apply(null, numbers)
})
eleventyConfig.addFilter("filterTagList", tags => {
eleventyConfig.addFilter('filterTagList', tags => {
// should match the list in tags.njk
return (tags || []).filter(tag => ["all", "nav", "post", "posts"].indexOf(tag) === -1);
return (tags || []).filter(tag => ['all', 'nav', 'post', 'posts'].indexOf(tag) === -1)
})
// Create an array of all tags
eleventyConfig.addCollection("tagList", function(collection) {
let tagSet = new Set();
eleventyConfig.addCollection('tagList', function(collection) {
let tagSet = new Set()
collection.getAll().forEach(item => {
(item.data.tags || []).forEach(tag => tagSet.add(tag));
});
(item.data.tags || []).forEach(tag => tagSet.add(tag))
})
return [...tagSet];
});
return [...tagSet]
})
// Copy the `img` and `css` folders to the output
eleventyConfig.addPassthroughCopy("img");
eleventyConfig.addPassthroughCopy("css");
// ki9: passthrough done by template languages, see below
//eleventyConfig.addPassthroughCopy('img')
//eleventyConfig.addPassthroughCopy('css')
// Customize Markdown library and settings:
let markdownLibrary = markdownIt({
@ -69,26 +68,26 @@ module.exports = function(eleventyConfig) {
permalink: true,
permalinkClass: "direct-link",
permalinkSymbol: "#"
});
eleventyConfig.setLibrary("md", markdownLibrary);
})
eleventyConfig.setLibrary("md", markdownLibrary)
// Override Browsersync defaults (used only with --serve)
eleventyConfig.setBrowserSyncConfig({
callbacks: {
ready: function(err, browserSync) {
const content_404 = fs.readFileSync('_dist/404.html');
const content_404 = fs.readFileSync('_dist/404.html')
browserSync.addMiddleware("*", (req, res) => {
// Provides the 404 content without redirect.
res.writeHead(404, {"Content-Type": "text/html; charset=UTF-8"});
res.write(content_404);
res.end();
});
res.writeHead(404, {"Content-Type": "text/html charset=UTF-8"})
res.write(content_404)
res.end()
})
},
},
ui: false,
ghostMode: false
});
})
return {
// Control which files Eleventy will process
@ -96,39 +95,44 @@ module.exports = function(eleventyConfig) {
templateFormats: [
"md",
"njk",
"html",
"liquid"
'html',
'liquid',
'css',
'png',
'jpg',
'gif',
'js',
],
// -----------------------------------------------------------------
// If your site deploys to a subdirectory, change `pathPrefix`.
// Dont worry about leading and trailing slashes, we normalize these.
// If you dont have a subdirectory, use "" or "/" (they do the same thing)
// If you dont have a subdirectory, use "" or "/' (they do the same thing)
// This is only used for link URLs (it does not affect your file structure)
// Best paired with the `url` filter: https://www.11ty.dev/docs/filters/url/
// You can also pass this in on the command line using `--pathprefix`
// Optional (default is shown)
pathPrefix: "/",
pathPrefix: '/',
// -----------------------------------------------------------------
// Pre-process *.md files with: (default: `liquid`)
markdownTemplateEngine: "njk",
markdownTemplateEngine: 'njk',
// Pre-process *.html files with: (default: `liquid`)
htmlTemplateEngine: "njk",
htmlTemplateEngine: 'njk',
// Opt-out of pre-processing global data JSON files: (default: `liquid`)
dataTemplateEngine: false,
// These are all optional (defaults are shown):
dir: {
input: "_src",
includes: "_includes",
data: "_data",
output: "_dist"
input: '_src',
includes: '_includes',
data: '_data',
output: '_dist'
}
};
};
}
}

View File

@ -1,14 +0,0 @@
language: node_js
node_js:
- 12
before_script:
- npm install @11ty/eleventy -g
script: eleventy --pathprefix="/eleventy-base-blog/"
deploy:
local-dir: _dist
provider: pages
skip-cleanup: true
github-token: $GITHUB_TOKEN # Set in travis-ci.org dashboard, marked secure
keep-history: true
on:
branch: master

View File

@ -73,6 +73,6 @@ DEBUG=* npx eleventy
* The blog post feed template is in `feed/feed.njk`. This is also a good example of using a global data files in that it uses `_data/metadata.json`.
* This example uses three layouts:
* `_includes/layouts/base.njk`: the top level HTML structure
* `_includes/layouts/home.njk`: the home page template (wrapped into `base.njk`)
* `_includes/base.njk`: the home page template (wrapped into `base.njk`)
* `_includes/layouts/post.njk`: the blog post template (wrapped into `base.njk`)
* `_includes/postlist.njk` is a Nunjucks include and is a reusable component used to display a list of all the posts. `index.njk` has an example of how to use it.

View File

@ -1,5 +1,5 @@
---
layout: layouts/home.njk
layout: base.njk
permalink: 404.html
eleventyExcludeFromCollections: true
---

View File

@ -2,16 +2,5 @@
"title": "Galactic Fortress 4",
"url": "https://www.gf4.pw/",
"language": "en",
"description": "Galactic Fortress 4 is a private virtual hackerspace.",
"feed": {
"subtitle": "Galactic Fortress 4 is a private virtual hackerspace.",
"filename": "feed.xml",
"path": "/feed/feed.xml",
"id": "https://www.gf4.pw/"
},
"jsonfeed": {
"path": "/feed/feed.json",
"url": "https://www.gf4.pw/feed/feed.json"
}
"description": "Galactic Fortress 4 is a private virtual hackerspace."
}

17
_src/_includes/base.njk Normal file
View File

@ -0,0 +1,17 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title or metadata.title }}</title>
<meta name="description" content="{{ description or metadata.description }}">
<link rel="stylesheet" href="{{ 'base.css' | url }}">
<link rel="alternate" href="{{ metadata.feed.path | url }}" type="application/atom+xml" title="{{ metadata.title }}">
<link rel="alternate" href="{{ metadata.jsonfeed.path | url }}" type="application/json" title="{{ metadata.title }}">
</head>
<body>
<main>
{{ content | safe }}
</main>
</body>
</html>

View File

@ -1,45 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title or metadata.title }}</title>
<meta name="description" content="{{ description or metadata.description }}">
<link rel="stylesheet" href="{{ '/css/index.css' | url }}">
<link rel="stylesheet" href="{{ '/css/prism-base16-monokai.dark.css' | url }}">
<link rel="alternate" href="{{ metadata.feed.path | url }}" type="application/atom+xml" title="{{ metadata.title }}">
<link rel="alternate" href="{{ metadata.jsonfeed.path | url }}" type="application/json" title="{{ metadata.title }}">
</head>
<body>
<header>
<h1 class="home"><a href="{{ '/' | url }}">{{ metadata.title }}</a></h1>
{#- Read more about `eleventy-navigation` at https://www.11ty.dev/docs/plugins/navigation/ #}
<ul class="nav">
{%- for entry in collections.all | eleventyNavigation %}
<li class="nav-item{% if entry.url == page.url %} nav-item-active{% endif %}"><a href="{{ entry.url | url }}">{{ entry.title }}</a></li>
{%- endfor %}
</ul>
</header>
<main{% if templateClass %} class="{{ templateClass }}"{% endif %}>
<!-- Delete this message -->
<div class="warning">
<ol>
<li>Edit the <code>_data/metadata.json</code> with your blogs information.</li>
<li>(Optional) Edit <code>.eleventy.js</code> with your <a href="https://www.11ty.dev/docs/config/">configuration preferences</a>.</li>
<li>Delete this message from <code>_includes/layouts/base.njk</code>.</li>
</ol>
<p><em>This is an <a href="https://www.11ty.dev/">Eleventy project</a> created from the <a href="https://github.com/11ty/eleventy-base-blog"><code>eleventy-base-blog</code> repo</a>.</em></p>
</div>
<!-- Stop deleting -->
{{ content | safe }}
</main>
<footer></footer>
<!-- Current page: {{ page.url | url }} -->
</body>
</html>

View File

@ -1,5 +0,0 @@
---
layout: layouts/base.njk
templateClass: tmpl-home
---
{{ content | safe }}

View File

@ -1,23 +0,0 @@
---
layout: layouts/base.njk
templateClass: tmpl-post
---
<h1>{{ title }}</h1>
<time datetime="{{ page.date | htmlDateString }}">{{ page.date | readableDate }}</time>
{%- for tag in tags | filterTagList -%}
{%- set tagUrl %}/tags/{{ tag | slug }}/{% endset -%}
<a href="{{ tagUrl | url }}" class="post-tag">{{ tag }}</a>
{%- endfor %}
{{ content | safe }}
{%- set nextPost = collections.posts | getNextCollectionItem(page) %}
{%- set previousPost = collections.posts | getPreviousCollectionItem(page) %}
{%- if nextPost or previousPost %}
<hr>
<ul>
{%- if nextPost %}<li>Next: <a href="{{ nextPost.url | url }}">{{ nextPost.data.title }}</a></li>{% endif %}
{%- if previousPost %}<li>Previous: <a href="{{ previousPost.url | url }}">{{ previousPost.data.title }}</a></li>{% endif %}
</ul>
{%- endif %}

View File

@ -1,12 +0,0 @@
<ol reversed class="postlist" style="counter-reset: start-from {{ (postslistCounter or postslist.length) + 1 }}">
{% for post in postslist | reverse %}
<li class="postlist-item{% if post.url == url %} postlist-item-active{% endif %}">
<a href="{{ post.url | url }}" class="postlist-link">{% if post.data.title %}{{ post.data.title }}{% else %}<code>{{ post.url }}</code>{% endif %}</a>
<time class="postlist-date" datetime="{{ post.date | htmlDateString }}">{{ post.date | readableDate }}</time>
{% for tag in post.data.tags | filterTagList %}
{% set tagUrl %}/tags/{{ tag | slug }}/{% endset %}
<a href="{{ tagUrl | url }}" class="post-tag">{{ tag }}</a>
{% endfor %}
</li>
{% endfor %}
</ol>

View File

@ -1,10 +0,0 @@
---
layout: layouts/post.njk
title: About Me
templateClass: tmpl-post
eleventyNavigation:
key: About Me
order: 3
---
I am a person that writes stuff.

View File

@ -1,12 +0,0 @@
---
layout: layouts/home.njk
permalink: /posts/
eleventyNavigation:
key: Archive
order: 2
---
<h1>Archive</h1>
{% set postslist = collections.posts %}
{% include "postslist.njk" %}

13
_src/base.css Normal file
View File

@ -0,0 +1,13 @@
html {
margin: 0;
color: #a8d;
background-color: #020202;
}
body {
margin: 1vw;
font-size: calc(1em + 1vw);
}
main {
margin: 3vw;
font-family: monospace;
}

View File

@ -1,247 +0,0 @@
/* Colors */
:root {
--lightgray: #e0e0e0;
--gray: #C0C0C0;
--darkgray: #333;
--navy: #17050F;
--blue: #082840;
--white: #fff;
}
/* Global stylesheet */
* {
box-sizing: border-box;
}
html,
body {
padding: 0;
margin: 0;
font-family: -apple-system, system-ui, sans-serif;
color: var(--darkgray);
background-color: var(--white);
}
p:last-child {
margin-bottom: 0;
}
p,
.tmpl-post li,
img {
max-width: 37.5em; /* 600px /16 */
}
p,
.tmpl-post li {
line-height: 1.45;
}
a[href] {
color: var(--blue);
}
a[href]:visited {
color: var(--navy);
}
main {
padding: 1rem;
}
main :first-child {
margin-top: 0;
}
header {
border-bottom: 1px dashed var(--lightgray);
}
header:after {
content: "";
display: table;
clear: both;
}
table {
margin: 1em 0;
}
table td,
table th {
padding-right: 1em;
}
pre,
code {
font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace;
line-height: 1.5;
}
pre {
font-size: 14px;
line-height: 1.375;
direction: ltr;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
-moz-tab-size: 2;
-o-tab-size: 2;
tab-size: 2;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
padding: 1em;
margin: .5em 0;
background-color: #f6f6f6;
}
code {
word-break: break-all;
}
.highlight-line {
display: block;
padding: 0.125em 1em;
text-decoration: none; /* override del, ins, mark defaults */
color: inherit; /* override del, ins, mark defaults */
}
/* allow highlighting empty lines */
.highlight-line:empty:before {
content: " ";
}
/* avoid double line breaks when using display: block; */
.highlight-line + br {
display: none;
}
.highlight-line-isdir {
color: #b0b0b0;
background-color: #222;
}
.highlight-line-active {
background-color: #444;
background-color: hsla(0, 0%, 27%, .8);
}
.highlight-line-add {
background-color: #45844b;
}
.highlight-line-remove {
background-color: #902f2f;
}
/* Header */
.home {
padding: 0 1rem;
float: left;
margin: 1rem 0; /* 16px /16 */
font-size: 1em; /* 16px /16 */
}
.home :link:not(:hover) {
text-decoration: none;
}
/* Nav */
.nav {
padding: 0;
list-style: none;
float: left;
margin-left: 1em;
}
.nav-item {
display: inline-block;
margin-right: 1em;
}
.nav-item a[href]:not(:hover) {
text-decoration: none;
}
.nav-item-active {
font-weight: 700;
text-decoration: underline;
}
/* Posts list */
.postlist {
list-style: none;
padding: 0;
}
.postlist-item {
display: flex;
flex-wrap: wrap;
align-items: baseline;
counter-increment: start-from -1;
line-height: 1.8;
}
.postlist-item:before {
display: inline-block;
pointer-events: none;
content: "" counter(start-from, decimal-leading-zero) ". ";
line-height: 100%;
text-align: right;
}
.postlist-date,
.postlist-item:before {
font-size: 0.8125em; /* 13px /16 */
color: var(--darkgray);
}
.postlist-date {
word-spacing: -0.5px;
}
.postlist-link {
padding-left: .25em;
padding-right: .25em;
text-underline-position: from-font;
text-underline-offset: 0;
text-decoration-thickness: 1px;
}
.postlist-item-active .postlist-link {
font-weight: bold;
}
.tmpl-home .postlist-link {
font-size: 1.1875em; /* 19px /16 */
font-weight: 700;
}
/* Tags */
.post-tag {
display: inline-flex;
align-items: center;
justify-content: center;
text-transform: uppercase;
font-size: 0.6875em; /* 11px /16 */
padding: 0.09090909090909em 0.3636363636364em; /* 1px 4px /11 */
margin-left: 0.8em; /* 8px /10 */
color: var(--darkgray);
border: 1px solid var(--gray);
border-radius: 0.25em; /* 3px /12 */
text-decoration: none;
line-height: 1.8;
}
a[href].post-tag,
a[href].post-tag:visited {
color: inherit;
}
a[href].post-tag:hover,
a[href].post-tag:focus {
background-color: var(--lightgray);
}
.postlist-item > .post-tag {
align-self: center;
}
/* Warning */
.warning {
background-color: #ffc;
padding: 1em 0.625em; /* 16px 10px /16 */
}
.warning ol:only-child {
margin: 0;
}
/* Direct Links / Markdown Headers */
.direct-link {
font-family: sans-serif;
text-decoration: none;
font-style: normal;
margin-left: .1em;
}
a[href].direct-link,
a[href].direct-link:visited {
color: transparent;
}
a[href].direct-link:focus,
a[href].direct-link:focus:visited,
:hover > a[href].direct-link,
:hover > a[href].direct-link:visited {
color: #aaa;
}

View File

@ -1,89 +0,0 @@
code[class*="language-"], pre[class*="language-"] {
font-size: 14px;
line-height: 1.375;
direction: ltr;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
-moz-tab-size: 2;
-o-tab-size: 2;
tab-size: 2;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
background: #272822;
color: #f8f8f2;
}
pre[class*="language-"] {
padding: 1.5em 0;
margin: .5em 0;
overflow: auto;
}
:not(pre) > code[class*="language-"] {
padding: .1em;
border-radius: .3em;
}
.token.comment, .token.prolog, .token.doctype, .token.cdata {
color: #75715e;
}
.token.punctuation {
color: #f8f8f2;
}
.token.namespace {
opacity: .7;
}
.token.operator, .token.boolean, .token.number {
color: #fd971f;
}
.token.property {
color: #f4bf75;
}
.token.tag {
color: #66d9ef;
}
.token.string {
color: #a1efe4;
}
.token.selector {
color: #ae81ff;
}
.token.attr-name {
color: #fd971f;
}
.token.entity, .token.url, .language-css .token.string, .style .token.string {
color: #a1efe4;
}
.token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit {
color: #a6e22e;
}
.token.statement, .token.regex, .token.atrule {
color: #a1efe4;
}
.token.placeholder, .token.variable {
color: #66d9ef;
}
.token.deleted {
text-decoration: line-through;
}
.token.inserted {
border-bottom: 1px dotted #f9f8f5;
text-decoration: none;
}
.token.italic {
font-style: italic;
}
.token.important, .token.bold {
font-weight: bold;
}
.token.important {
color: #f92672;
}
.token.entity {
cursor: help;
}
pre > code.highlight {
outline: 0.4em solid #f92672;
outline-offset: .4em;
}

View File

@ -1,29 +0,0 @@
---
# Metadata comes from _data/metadata.json
permalink: "{{ metadata.feed.path }}"
eleventyExcludeFromCollections: true
---
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>{{ metadata.title }}</title>
<subtitle>{{ metadata.feed.subtitle }}</subtitle>
{% set absoluteUrl %}{{ metadata.feed.path | url | absoluteUrl(metadata.url) }}{% endset %}
<link href="{{ absoluteUrl }}" rel="self"/>
<link href="{{ metadata.url }}"/>
<updated>{{ collections.posts | rssLastUpdatedDate }}</updated>
<id>{{ metadata.feed.id }}</id>
<author>
<name>{{ metadata.author.name }}</name>
<email>{{ metadata.author.email }}</email>
</author>
{%- for post in collections.posts | reverse %}
{% set absolutePostUrl %}{{ post.url | url | absoluteUrl(metadata.url) }}{% endset %}
<entry>
<title>{{ post.data.title }}</title>
<link href="{{ absolutePostUrl }}"/>
<updated>{{ post.date | rssDate }}</updated>
<id>{{ absolutePostUrl }}</id>
<content type="html">{{ post.templateContent | htmlToAbsoluteUrls(absolutePostUrl) }}</content>
</entry>
{%- endfor %}
</feed>

View File

@ -1,6 +0,0 @@
---
permalink: feed/.htaccess
eleventyExcludeFromCollections: true
---
# For Apache, to show `{{ metadata.feed.filename }}` when browsing to directory /feed/ (hide the file!)
DirectoryIndex {{ metadata.feed.filename }}

View File

@ -1,32 +0,0 @@
---
# Metadata comes from _data/metadata.json
permalink: "{{ metadata.jsonfeed.path }}"
eleventyExcludeFromCollections: true
---
{
"version": "https://jsonfeed.org/version/1.1",
"title": "{{ metadata.title }}",
"language": "{{ metadata.language }}",
"home_page_url": "{{ metadata.url }}",
"feed_url": "{{ metadata.jsonfeed.url }}",
"description": "{{ metadata.description }}",
"author": {
"name": "{{ metadata.author.name }}",
"url": "{{ metadata.author.url }}"
},
"items": [
{%- for post in collections.posts | reverse %}
{%- set absolutePostUrl %}{{ post.url | url | absoluteUrl(metadata.url) }}{% endset -%}
{
"id": "{{ absolutePostUrl }}",
"url": "{{ absolutePostUrl }}",
"title": "{{ post.data.title }}",
"content_html": {% if post.templateContent %}{{ post.templateContent | htmlToAbsoluteUrls(absolutePostUrl) | dump | safe }}{% else %}""{% endif %},
"date_published": "{{ post.date | rssDate }}"
}
{%- if not loop.last -%}
,
{%- endif -%}
{%- endfor %}
]
}

34
_src/gf4.ca.crt Normal file
View File

@ -0,0 +1,34 @@
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----

View File

View File

@ -1,14 +1,10 @@
---
layout: layouts/home.njk
eleventyNavigation:
key: Home
order: 1
title: Galactic Fortress 4
layout: base.njk
---
{% set maxPosts = collections.posts.length | min(3) %}
<h1>Latest {% if maxPosts == 1 %}Post{% else %}{{ maxPosts }} Posts{% endif %}</h1>
{% set postslist = collections.posts | head(-3) %}
{% set postslistCounter = collections.posts | length %}
{% include "postslist.njk" %}
<h1>{{title}}</h1>
<p>More posts can be found in <a href="{{ '/posts/' | url }}">the archive</a>.</p>
<p><b>GF4</b> is a virtual private hackerspace. We are nerds, sharing computer resources and hosted services on a shared virtual private network. </p>
<p>We host a matrix server and an Urban Terror server on <code>gf4.pw</code>. You can usually find us there. </p>

View File

@ -1,24 +0,0 @@
---
pagination:
data: collections.all
size: 20
alias: entries
layout: layouts/home.njk
permalink: /page-list/{% if pagination.pageNumber > 0 %}{{ pagination.pageNumber }}/{% endif %}
---
<table>
<thead>
<tr>
<th>URL</th>
<th>Page Title</th>
</tr>
</thead>
<tbody>
{%- for entry in entries %}
<tr>
<td><a href="{{ entry.url }}"><code>{{ entry.url }}</code></a></td>
<td>{{ entry.data.title }}</td>
</tr>
{%- endfor %}
</tbody>
</table>

View File

@ -1,26 +0,0 @@
---
title: This is my first post.
description: This is a post on My Blog about agile frameworks.
date: 2018-05-01
tags:
- another tag
layout: layouts/post.njk
---
Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment.
Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring.
## Section Header
Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line.
``` text/2-3
// this is a command
function myCommand() {
let counter = 0;
counter++;
}
// Test with a line break above this line.
console.log('Test');
```

View File

@ -1,15 +0,0 @@
---
title: This is my fourth post.
description: This is a post on My Blog about touchpoints and circling wagons.
date: 2018-09-30
tags: second tag
layout: layouts/post.njk
---
Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment.
Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring.
## Section Header
Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line.

View File

@ -1,5 +0,0 @@
{
"tags": [
"posts"
]
}

View File

@ -1,18 +0,0 @@
---
title: This is my second post.
description: This is a post on My Blog about leveraging agile frameworks.
date: 2018-07-04
tags:
- number 2
layout: layouts/post.njk
---
Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment.
## Section Header
<a href="{{ '/posts/firstpost/' | url }}">First post</a>
<a href="{{ '/posts/thirdpost/' | url }}">Third post</a>
Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring.
Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line.

View File

@ -1,28 +0,0 @@
---
title: This is my third post.
description: This is a post on My Blog about win-win survival strategies.
date: 2018-08-24
tags:
- second tag
layout: layouts/post.njk
---
Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment.
``` js/2/4
// this is a command
function myCommand() {
let counter = 0;
counter++;
}
// Test with a line break above this line.
console.log('Test');
```
Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring.
## Section Header
Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line.

View File

@ -1,14 +0,0 @@
---
permalink: /sitemap.xml
eleventyExcludeFromCollections: true
---
<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{%- for page in collections.all %}
{% set absoluteUrl %}{{ page.url | url | absoluteUrl(metadata.url) }}{% endset %}
<url>
<loc>{{ absoluteUrl }}</loc>
<lastmod>{{ page.date | htmlDateString }}</lastmod>
</url>
{%- endfor %}
</urlset>

View File

@ -1,10 +0,0 @@
---
permalink: /tags/
layout: layouts/home.njk
---
<h1>Tags</h1>
{% for tag in collections.tagList | filterTagList %}
{% set tagUrl %}/tags/{{ tag | slug }}/{% endset %}
<a href="{{ tagUrl | url }}" class="post-tag">{{ tag }}</a>
{% endfor %}

View File

@ -1,23 +0,0 @@
---
pagination:
data: collections
size: 1
alias: tag
filter:
- all
- nav
- post
- posts
- tagList
addAllPagesToCollections: true
layout: layouts/home.njk
eleventyComputed:
title: Tagged “{{ tag }}”
permalink: /tags/{{ tag | slug }}/
---
<h1>Tagged “{{ tag }}”</h1>
{% set postslist = collections[ tag ] %}
{% include "postslist.njk" %}
<p>See <a href="{{ '/tags/' | url }}">all tags</a>.</p>

View File

@ -1,3 +0,0 @@
[build]
publish = "_dist"
command = "DEBUG=* eleventy"

View File

@ -27,7 +27,6 @@
"@11ty/eleventy": "^0.12.1",
"@11ty/eleventy-navigation": "^0.1.6",
"@11ty/eleventy-plugin-rss": "^1.1.1",
"@11ty/eleventy-plugin-syntaxhighlight": "^3.1.0",
"luxon": "^1.26.0",
"markdown-it": "^12.0.4",
"markdown-it-anchor": "^7.1.0"