Compare commits

..

No commits in common. "c21e3e2a9b86be058e9472d4d9744993ea201584" and "ffd264f5e61fc16fb2461efb193f8b19ffe3c38d" have entirely different histories.

340 changed files with 50780 additions and 11247 deletions

View File

@ -1 +0,0 @@
export default new Map();

View File

@ -1,4 +0,0 @@
export default new Map([
['src/content/blog/using-mdx.mdx', () => import('astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fblog%2Fusing-mdx.mdx&astroContentModuleFlag=true')]]);

201
.astro/content.d.ts vendored
View File

@ -1,201 +0,0 @@
declare module 'astro:content' {
interface Render {
'.mdx': Promise<{
Content: import('astro').MarkdownInstance<{}>['Content'];
headings: import('astro').MarkdownHeading[];
remarkPluginFrontmatter: Record<string, any>;
components: import('astro').MDXInstance<{}>['components'];
}>;
}
}
declare module 'astro:content' {
export interface RenderResult {
Content: import('astro/runtime/server/index.js').AstroComponentFactory;
headings: import('astro').MarkdownHeading[];
remarkPluginFrontmatter: Record<string, any>;
}
interface Render {
'.md': Promise<RenderResult>;
}
export interface RenderedContent {
html: string;
metadata?: {
imagePaths: Array<string>;
[key: string]: unknown;
};
}
}
declare module 'astro:content' {
type Flatten<T> = T extends { [K: string]: infer U } ? U : never;
export type CollectionKey = keyof AnyEntryMap;
export type CollectionEntry<C extends CollectionKey> = Flatten<AnyEntryMap[C]>;
export type ContentCollectionKey = keyof ContentEntryMap;
export type DataCollectionKey = keyof DataEntryMap;
type AllValuesOf<T> = T extends any ? T[keyof T] : never;
type ValidContentEntrySlug<C extends keyof ContentEntryMap> = AllValuesOf<
ContentEntryMap[C]
>['slug'];
/** @deprecated Use `getEntry` instead. */
export function getEntryBySlug<
C extends keyof ContentEntryMap,
E extends ValidContentEntrySlug<C> | (string & {}),
>(
collection: C,
// Note that this has to accept a regular string too, for SSR
entrySlug: E,
): E extends ValidContentEntrySlug<C>
? Promise<CollectionEntry<C>>
: Promise<CollectionEntry<C> | undefined>;
/** @deprecated Use `getEntry` instead. */
export function getDataEntryById<C extends keyof DataEntryMap, E extends keyof DataEntryMap[C]>(
collection: C,
entryId: E,
): Promise<CollectionEntry<C>>;
export function getCollection<C extends keyof AnyEntryMap, E extends CollectionEntry<C>>(
collection: C,
filter?: (entry: CollectionEntry<C>) => entry is E,
): Promise<E[]>;
export function getCollection<C extends keyof AnyEntryMap>(
collection: C,
filter?: (entry: CollectionEntry<C>) => unknown,
): Promise<CollectionEntry<C>[]>;
export function getEntry<
C extends keyof ContentEntryMap,
E extends ValidContentEntrySlug<C> | (string & {}),
>(entry: {
collection: C;
slug: E;
}): E extends ValidContentEntrySlug<C>
? Promise<CollectionEntry<C>>
: Promise<CollectionEntry<C> | undefined>;
export function getEntry<
C extends keyof DataEntryMap,
E extends keyof DataEntryMap[C] | (string & {}),
>(entry: {
collection: C;
id: E;
}): E extends keyof DataEntryMap[C]
? Promise<DataEntryMap[C][E]>
: Promise<CollectionEntry<C> | undefined>;
export function getEntry<
C extends keyof ContentEntryMap,
E extends ValidContentEntrySlug<C> | (string & {}),
>(
collection: C,
slug: E,
): E extends ValidContentEntrySlug<C>
? Promise<CollectionEntry<C>>
: Promise<CollectionEntry<C> | undefined>;
export function getEntry<
C extends keyof DataEntryMap,
E extends keyof DataEntryMap[C] | (string & {}),
>(
collection: C,
id: E,
): E extends keyof DataEntryMap[C]
? Promise<DataEntryMap[C][E]>
: Promise<CollectionEntry<C> | undefined>;
/** Resolve an array of entry references from the same collection */
export function getEntries<C extends keyof ContentEntryMap>(
entries: {
collection: C;
slug: ValidContentEntrySlug<C>;
}[],
): Promise<CollectionEntry<C>[]>;
export function getEntries<C extends keyof DataEntryMap>(
entries: {
collection: C;
id: keyof DataEntryMap[C];
}[],
): Promise<CollectionEntry<C>[]>;
export function render<C extends keyof AnyEntryMap>(
entry: AnyEntryMap[C][string],
): Promise<RenderResult>;
export function reference<C extends keyof AnyEntryMap>(
collection: C,
): import('astro/zod').ZodEffects<
import('astro/zod').ZodString,
C extends keyof ContentEntryMap
? {
collection: C;
slug: ValidContentEntrySlug<C>;
}
: {
collection: C;
id: keyof DataEntryMap[C];
}
>;
// Allow generic `string` to avoid excessive type errors in the config
// if `dev` is not running to update as you edit.
// Invalid collection names will be caught at build time.
export function reference<C extends string>(
collection: C,
): import('astro/zod').ZodEffects<import('astro/zod').ZodString, never>;
type ReturnTypeOrOriginal<T> = T extends (...args: any[]) => infer R ? R : T;
type InferEntrySchema<C extends keyof AnyEntryMap> = import('astro/zod').infer<
ReturnTypeOrOriginal<Required<ContentConfig['collections'][C]>['schema']>
>;
type ContentEntryMap = {
"blog": {
"first-post.md": {
id: "first-post.md";
slug: "first-post";
body: string;
collection: "blog";
data: InferEntrySchema<"blog">
} & { render(): Render[".md"] };
"markdown-style-guide.md": {
id: "markdown-style-guide.md";
slug: "markdown-style-guide";
body: string;
collection: "blog";
data: InferEntrySchema<"blog">
} & { render(): Render[".md"] };
"second-post.md": {
id: "second-post.md";
slug: "second-post";
body: string;
collection: "blog";
data: InferEntrySchema<"blog">
} & { render(): Render[".md"] };
"third-post.md": {
id: "third-post.md";
slug: "third-post";
body: string;
collection: "blog";
data: InferEntrySchema<"blog">
} & { render(): Render[".md"] };
"using-mdx.mdx": {
id: "using-mdx.mdx";
slug: "using-mdx";
body: string;
collection: "blog";
data: InferEntrySchema<"blog">
} & { render(): Render[".mdx"] };
};
};
type DataEntryMap = {
};
type AnyEntryMap = ContentEntryMap & DataEntryMap;
export type ContentConfig = typeof import("../src/content/config.js");
}

File diff suppressed because one or more lines are too long

2
.astro/types.d.ts vendored
View File

@ -1,2 +0,0 @@
/// <reference types="astro/client" />
/// <reference path="content.d.ts" />

477
.eleventy.js Normal file
View File

@ -0,0 +1,477 @@
const siteURL = "https://tarasis.net";
const fs = require("fs-extra");
const sass = require("sass");
const { promisify } = require("util");
const sassRender = promisify(sass.render);
const postcss = require("postcss");
const autoprefixer = require("autoprefixer");
const markdownIt = require("markdown-it");
const markdownItRenderer = new markdownIt();
const markdownItAnchor = require("markdown-it-anchor");
const pluginTOC = require("eleventy-plugin-toc");
const moment = require("moment");
const description = require("eleventy-plugin-description");
const pluginRss = require("@11ty/eleventy-plugin-rss");
const UpgradeHelper = require("@11ty/eleventy-upgrade-help");
const xmlFiltersPlugin = require("eleventy-xml-plugin");
const yaml = require("js-yaml");
const syntaxHighlight = require("eleventy-plugin-syntaxhighlight-chroma");
const highlight = require("chroma-highlight");
const eleventySass = require("@11tyrocks/eleventy-plugin-sass-lightningcss");
const inspect = require("node:util").inspect;
const path = require("path");
module.exports.config = {
pathPrefix: "/",
};
module.exports = async function (eleventyConfig) {
// const urlFilter = await import("@11ty/eleventy/src/Filters/Url");
const indexify = (url) => url.replace(/(\/[^.]*)$/, "$1index.html");
let pathPrefix = "/";
eleventyConfig.addDataExtension("yaml", (contents) => yaml.load(contents));
eleventyConfig.addDataExtension("yml", (contents) => yaml.load(contents));
// eleventyConfig.addPlugin(UpgradeHelper);
eleventyConfig.addPlugin(pluginRss);
//Blog excerpts
eleventyConfig.addPlugin(description);
// Eleventy Navigation (https://www.11ty.dev/docs/plugins/navigation/)
eleventyConfig.addPlugin(require("@11ty/eleventy-navigation"));
// Eleventy RSS Feed (https://www.11ty.dev/docs/plugins/rss/)
eleventyConfig.addPlugin(require("@11ty/eleventy-plugin-rss"));
// Filter to generate a Table of Contents from page content
eleventyConfig.addPlugin(pluginTOC, {
tags: ["h2", "h3"],
wrapper: "div",
});
// TODO https://www.npmjs.com/package/eleventy-plugin-meta-generator
// Eleventy Syntax Highlighting (https://www.11ty.dev/docs/plugins/syntaxhighlight/)
// eleventyConfig.addPlugin(require("@11ty/eleventy-plugin-syntaxhighlight"));
eleventyConfig.addPlugin(syntaxHighlight, {
theme: "base16-snazzy",
lexerOverrides: {
njk: "vue",
liquid: "vue",
},
});
// eleventyConfig.addPlugin(syntaxHighlight, {
// alwaysWrapLineHighlights: true,
// // Change which Eleventy template formats use syntax highlighters
// // templateFormats: ["*"], // default
// // Use only a subset of template types (11ty.js added in v4.0.0)
// // templateFormats: ["liquid", "njk", "md", "11ty.js"],
// // init callback lets you customize Prism
// // init: function({ Prism }) {
// // Prism.languages.myCustomLanguage = /* */;
// // },
// // Added in 3.1.1, add HTML attributes to the <pre> or <code> tags
// preAttributes: {
// tabindex: 0,
// // Added in 4.1.0 you can use callback functions too
// "data-language": function({ language, content, options }) {
// return language;
// }
// },
// codeAttributes: {},
// });
// assert(typeof highlight === "function");
// eleventyConfig.addPlugin(highlight);
// eleventyConfig.addMarkdownHighlighter(
// highlight(
// `--formatter html --html-only --html-inline-styles --lexer typescript --style base16-snazzy`
// )
// );
eleventyConfig.addPlugin(xmlFiltersPlugin);
// eleventyConfig.addPlugin(eleventySass);
// Custom Collections
eleventyConfig.addCollection("pages", (collection) =>
collection.getFilteredByGlob("./src/_pages/**/*")
);
eleventyConfig.addCollection("posts", (collection) => {
availablePages = collection
.getFilteredByGlob("./src/_posts/**/*")
.filter(
(item) => item.data.draft !== true && item.date <= new Date()
)
.reverse()
.map((cur, i, all) => {
cur.data["siblings"] = {
next: all[i - 1],
prev: all[i + 1],
};
return cur;
});
return availablePages;
});
eleventyConfig.addCollection("projects", (collection) =>
collection
.getFilteredByGlob("./src/projects/**/*")
.sort((a, b) => a.data.weight - b.data.weight)
);
// eleventyConfig.addCollection("posts", function (collectionApi) {
// return collectionApi.getFilteredByGlob("./src/_posts/**/*.md");
// });
eleventyConfig.addCollection("drafts", (collection) =>
collection
.getFilteredByGlob("./src/_drafts/**/*")
.sort((a, b) => a.data.weight - b.data.weight)
);
eleventyConfig.addCollection("tags", (collection) => {
let tags = new Set();
collection.getAll().forEach((item) => {
if ("tags" in item.data) {
if (item.data.tags != undefined) {
for (const tag of item.data.tags) {
tags.add(tag);
}
}
}
});
return [...tags];
});
eleventyConfig.addCollection("categories", (collection) => {
let categories = new Set();
collection.getAll().forEach((item) => {
if ("category" in item.data) {
if (item.data.category != undefined) {
for (const category of item.data.category) {
categories.add(category);
}
}
}
});
return [...categories];
});
// Filters
// eleventyConfig.addFilter("markdownify", (str) => {
// return markdownItRenderer.renderInline(str);
// });
eleventyConfig.addFilter("markdownify", (string) => {
return md.renderInline(string);
});
eleventyConfig.addNunjucksFilter("markdownify", (str) => md.render(str));
eleventyConfig.addFilter("jsonify", (variable) => JSON.stringify(variable));
eleventyConfig.addFilter("slugify", (str) =>
require("slugify")(str, {
lower: true,
replacement: "-",
remove: /[*+~.·,()''`´%!?¿:@]/g,
})
);
eleventyConfig.addFilter("where", (array, key, value) =>
array.filter((item) => {
const keys = key.split(".");
const reducedKey = keys.reduce((object, key) => object[key], item);
return reducedKey === value ? item : false;
})
);
eleventyConfig.addFilter("date", (date, format = "") =>
require("moment")(date).format(format)
);
eleventyConfig.addLiquidFilter("toUTCString", (date) => {
const utc = date.toUTCString();
return moment.utc(utc).format("MMMM Do YYYY");
});
eleventyConfig.addFilter("number_of_words", numberOfWords);
// eleventyConfig.addShortcode("where_exp", function (item, exp) {
// console.log(exp);
// return eval(exp);
// });
eleventyConfig.addFilter("where_exp", function (value) {
// where_exp function
return value.hidden != true;
});
eleventyConfig.addFilter("inspect", function (obj = {}) {
return inspect(obj, { sorted: true });
});
eleventyConfig.addFilter("debugger", (...args) => {
console.log(...args);
debugger;
});
eleventyConfig.addFilter("group_by", groupBy);
eleventyConfig.addLayoutAlias(
"archive-taxonomy",
"layouts/archive-taxonomy.html"
);
eleventyConfig.addLayoutAlias("archive", "layouts/archive.html");
eleventyConfig.addLayoutAlias("categories", "layouts/categories.html");
eleventyConfig.addLayoutAlias("category", "layouts/category.html");
eleventyConfig.addLayoutAlias("collection", "layouts/collection.html");
eleventyConfig.addLayoutAlias("compress", "layouts/compress.html");
eleventyConfig.addLayoutAlias("default", "layouts/default.html");
eleventyConfig.addLayoutAlias("home", "layouts/home.html");
eleventyConfig.addLayoutAlias("posts", "layouts/posts.html");
eleventyConfig.addLayoutAlias("search", "layouts/search.html");
eleventyConfig.addLayoutAlias("single", "layouts/single.html");
eleventyConfig.addLayoutAlias("splash", "layouts/splash.html");
eleventyConfig.addLayoutAlias("tag", "layouts/tag.html");
eleventyConfig.addLayoutAlias("tags", "layouts/tags.html");
eleventyConfig.addLayoutAlias("gallery", "layouts/gallery");
eleventyConfig.addLayoutAlias("drafts", "layouts/drafts");
// Passthrough copy
// don't use .gitignore (allows compiling sass to css into a monitored folder WITHOUT committing it to repo)
eleventyConfig.setUseGitIgnore(false);
//Copy CNAME
eleventyConfig.addPassthroughCopy("src/CNAME");
// Processing configuration
eleventyConfig.addPassthroughCopy("src/favicon.ico");
eleventyConfig.addPassthroughCopy("src/admin");
eleventyConfig.addPassthroughCopy("src/assets");
// eleventyConfig.addPassthroughCopy({ "src/_sass": "assets/css" });
let availablePages = [];
eleventyConfig.addShortcode("post_url", (slug) => {
let collection = availablePages;
try {
if (collection.length < 1) {
throw "Collection appears to be empty";
}
if (!Array.isArray(collection)) {
throw "Collection is an invalid type - it must be an array!";
}
if (typeof slug !== "string") {
throw "Slug is an invalid type - it must be a string!";
}
const found = collection.find((p) => p.fileSlug == slug);
if (found === 0 || found === undefined) {
throw `${slug} not found in specified collection.`;
} else {
return found.url;
}
} catch (e) {
console.error(
`RMCG:An error occurred while searching for the url to ${slug}. Details:`,
e
);
}
});
// Set section
// Configure BrowserSync to serve the 404 page for missing files
// eleventyConfig.setBrowserSyncConfig({
// callbacks: {
// ready: (_err, browserSync) => {
// const content_404 = fs.readFileSync("dist/404.html");
// browserSync.addMiddleware("*", (_req, res) => {
// // render the 404 content instead of redirecting
// res.write(content_404);
// res.end();
// });
// },
// },
// });
eleventyConfig.setServerOptions({
// Default values are shown:
// Whether the live reload snippet is used
liveReload: true,
watch: ["dist/assets/css/main.css"],
});
// eleventyConfig.setBrowserSyncConfig({
// files: "./dist/assets/css/*.css",
// });
// Merge Data (https://www.11ty.dev/docs/data-deep-merge/)
eleventyConfig.setDataDeepMerge(true);
eleventyConfig.setFrontMatterParsingOptions({
excerpt: true,
});
eleventyConfig.setLibrary("md", markdownIt().use(markdownItAnchor));
eleventyConfig.setLiquidOptions({
// dynamicPartials: false,
// strictVariables: false,
// strictFilters: false,
jekyllInclude: true,
});
// Markdown Configuration
const md = require("markdown-it")({
html: true,
breaks: true,
linkify: true,
});
eleventyConfig.setLibrary(
"md",
md
.use(require("markdown-it-attrs"))
.use(require("markdown-it-container"), "", {
validate: () => true,
render: (tokens, idx) => {
if (tokens[idx].nesting === 1) {
const classList = tokens[idx].info.trim();
return `<div ${classList && `class="${classList}"`}>`;
} else {
return `</div>`;
}
},
})
.use(require("markdown-it-fontawesome"))
.use(require("markdown-it-footnote"))
);
// override markdown-it-footnote anchor template to use a different unicode character
md.renderer.rules.footnote_anchor = (tokens, idx, options, env, slf) => {
var id = slf.rules.footnote_anchor_name(tokens, idx, options, env, slf);
if (tokens[idx].meta.subId > 0) {
id += ":" + tokens[idx].meta.subId;
}
/* ⇑ with escape code to prevent display as Apple Emoji on iOS */
return (
' <a href="#fnref' +
id +
'" class="footnote-backref">\u21d1\uFE0E</a>'
);
};
//for upgrade sanity
//eleventyConfig.addPlugin(UpgradeHelper);
// eleventyConfig.addWatchTarget("./assets/css/");
// eleventyConfig.addTransform(
// "sass",
// async function sassTransform(content, outputPath) {
// if (outputPath?.endsWith(".css")) {
// const { css } = await sassRender({
// data: content,
// outputStyle: "compressed",
// precision: 3,
// });
// return css;
// }
// return content;
// }
// );
// eleventyConfig.addWatchTarget("dist/assets/css/*.css");
const { EleventyHtmlBasePlugin } = await import("@11ty/eleventy");
eleventyConfig.addPlugin(EleventyHtmlBasePlugin);
eleventyConfig.addFilter("relative_url", relativeURLALT2);
eleventyConfig.addFilter("absolute_url", absoluteUrl);
return {
templateFormats: ["html", "liquid", "md", "njk"],
pathPrefix,
environment: "production",
// absolute_url: "https://tarasis.net/",
passthroughFileCopy: true,
dir: {
input: "src",
includes: "_includes",
data: "_data",
output: "dist",
// input: "./", // Equivalent to Jekyll's source property
// output: "./_site", // Equivalent to Jekyll's destination property
},
};
};
function numberOfWords(content) {
return content.split(/\s+/g).length;
}
// Cheat till I can go through
function relativeURLALT2(url) {
if (!url.startsWith("/")) {
throw new Error("URL is already relative");
}
return url;
}
function absoluteUrl(url) {
if (url !== undefined) {
return siteURL + url;
} else {
return siteURL;
}
}
function groupBy(array, key) {
const get = (entry) => key.split(".").reduce((acc, key) => acc[key], entry);
const map = array.reduce((acc, entry) => {
const value = get(entry);
if (typeof acc[value] === "undefined") {
acc[value] = [];
}
acc[value].push(entry);
return acc;
}, {});
return Object.keys(map).reduce(
(acc, key) => [...acc, { name: key, items: map[key] }],
[]
);
}

23
.gitignore vendored
View File

@ -87,26 +87,3 @@ Network Trash Folder
Temporary Items
.apdisk
# build output
dist/
# generated types
.astro/
# dependencies
node_modules/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store
# jetbrains setting folder
.idea/

View File

@ -1,4 +0,0 @@
{
"recommendations": ["astro-build.astro-vscode", "unifiedjs.vscode-mdx"],
"unwantedRecommendations": []
}

35
.vscode/launch.json vendored
View File

@ -1,11 +1,28 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "edge",
"version": "stable",
"request": "launch",
"name": "Launch Edge against localhost",
"url": "http://localhost:8080",
"webRoot": "${workspaceFolder}"
},
{
"name": "11ty",
"type": "node",
"request": "launch",
"program": "${workspaceRoot}/node_modules/.bin/eleventy",
"stopOnEntry": false,
"args": ["--watch"],
"cwd": "${workspaceRoot}",
"console": "internalConsole"
}
]
}

View File

@ -1,3 +0,0 @@
{
"cSpell.words": ["astro", "astrojs", "tsconfigs"]
}

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 Robert McGovern
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -1,68 +0,0 @@
# Astro Starter Kit: Blog
```sh
npm create astro@latest -- --template blog
```
[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/blog)
[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/blog)
[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/blog/devcontainer.json)
> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun!
![blog](https://github.com/withastro/astro/assets/2244813/ff10799f-a816-4703-b967-c78997e8323d)
Features:
- ✅ Minimal styling (make it your own!)
- ✅ 100/100 Lighthouse performance
- ✅ SEO-friendly with canonical URLs and OpenGraph data
- ✅ Sitemap support
- ✅ RSS Feed support
- ✅ Markdown & MDX support
## 🚀 Project Structure
Inside of your Astro project, you'll see the following folders and files:
```text
├── public/
├── src/
│   ├── components/
│   ├── content/
│   ├── layouts/
│   └── pages/
├── astro.config.mjs
├── README.md
├── package.json
└── tsconfig.json
```
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.
The `src/content/` directory contains "collections" of related Markdown and MDX documents. Use `getCollection()` to retrieve posts from `src/content/blog/`, and type-check your frontmatter using an optional schema. See [Astro's Content Collections docs](https://docs.astro.build/en/guides/content-collections/) to learn more.
Any static assets, like images, can be placed in the `public/` directory.
## 🧞 Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
| :------------------------ | :----------------------------------------------- |
| `npm install` | Installs dependencies |
| `npm run dev` | Starts local dev server at `localhost:4321` |
| `npm run build` | Build your production site to `./dist/` |
| `npm run preview` | Preview your build locally, before deploying |
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
| `npm run astro -- --help` | Get help using the Astro CLI |
## 👀 Want to learn more?
Check out [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).
## Credit
This theme is based off of the lovely [Bear Blog](https://github.com/HermanMartinus/bearblog/).

View File

@ -1,11 +0,0 @@
// @ts-check
import { defineConfig } from 'astro/config';
import mdx from '@astrojs/mdx';
import sitemap from '@astrojs/sitemap';
// https://astro.build/config
export default defineConfig({
site: 'https://example.com',
integrations: [mdx(), sitemap()],
});

742
diff-index Normal file
View File

@ -0,0 +1,742 @@
0a1
>
13d13
<
19a20,21
> <meta property="article:author" content="Robert McGovern">
>
22c24
< <meta property="og:type" content="website">
---
> <meta property="og:type" content="article">
26c28
< <meta property="og:url" content="http://localhost:4000/">
---
> <meta property="og:url" content="index.html">
33c35
< <meta property="og:image" content="http://localhost:4000/assets/images/bio-photo.jpg">
---
> <meta property="og:image" content="index.html">
40c42
< <meta name="twitter:url" content="http://localhost:4000/">
---
> <meta name="twitter:url" content="index.html">
43,46c45,46
< <meta name="twitter:card" content="summary">
<
< <meta name="twitter:image" content="http://localhost:4000/assets/images/bio-photo.jpg">
<
---
> <meta name="twitter:card" content="summary_large_image">
> <meta name="twitter:image" content="index.html">
52a53
> <meta property="article:published_time" content="2020-03-05T11:10:24+00:00">
56a58
>
62c64
< <link rel="canonical" href="http://localhost:4000/">
---
> <link rel="canonical" href="index.html">
66d67
< <link rel="next" href="http://localhost:4000/page2/">
68d68
<
75c75
< "url": "http://localhost:4000/"
---
> "url": "index.html"
90c90
< <link href="/feed.xml" type="application/atom+xml" rel="alternate" title="TDN: RMCG Feed">
---
> <link href="feed.xml" type="application/atom+xml" rel="alternate" title="TDN: RMCG Feed">
101c101
< <link rel="stylesheet" href="/assets/css/main.css">
---
> <link rel="stylesheet" href="assets/css/main.css">
107c107
< <script src="/assets/js/progress.js"></script>
---
> <script src="assets/js/progress.js"></script>
109c109
< <script src="/assets/js/scroll-to-top.js"></script>
---
> <script src="assets/js/scroll-to-top.js"></script>
118c118
< <body class="layout--home">
---
> <body class="layout--">
138c138
< <a class="site-logo" href="/"><img src="/assets/images/apple-touch-icon.png" alt="TDN: RMCG"></a>
---
> <a class="site-logo" href="index.html"><img src="assets/images/apple-touch-icon.png" alt="TDN: RMCG"></a>
140c140
< <a class="site-title" href="/">
---
> <a class="site-title" href="index.html">
144,152c144
< <ul class="visible-links"><li class="masthead__menu-item">
< <a href="/year-archive/">Posts</a>
< </li><li class="masthead__menu-item">
< <a href="/tags/">Tags</a>
< </li><li class="masthead__menu-item">
< <a href="/categories/">Categories</a>
< </li><li class="masthead__menu-item">
< <a href="/about/">About</a>
< </li></ul>
---
> <ul class="visible-links"></ul>
174a167
>
177,178d169
< <div class="sidebar sticky">
<
181,331d171
< <div itemscope itemtype="https://schema.org/Person">
<
<
< <div class="author__avatar">
<
< <img src="/assets/images/bio-photo.jpg" alt="Robert McGovern" itemprop="image">
<
< </div>
<
<
< <div class="author__content">
<
< <h3 class="author__name" itemprop="name">Robert McGovern</h3>
<
<
< <div class="author__bio" itemprop="description">
< <p>Wannabe field researcher for the Hitchhikers Guide to the Galaxy</p>
<
< </div>
<
< </div>
<
< <div class="author__urls-wrapper">
< <button class="btn btn--inverse">Follow</button>
< <ul class="author__urls social-icons">
<
< <li itemprop="homeLocation" itemscope itemtype="https://schema.org/Place">
< <i class="fas fa-fw fa-map-marker-alt" aria-hidden="true"></i> <span itemprop="name">ZZ9 Plural Z Alpha</span>
< </li>
<
<
<
<
<
< <li><a href="https://tarasis.net" rel="nofollow noopener noreferrer"><i class="fas fa-fw fa-link" aria-hidden="true"></i><span class="label">Website</span></a></li>
<
<
<
< <li><a href="mailto:rob@tarasis.net" rel="nofollow noopener noreferrer"><i class="fas fa-fw fa-envelope-square" aria-hidden="true"></i><span class="label">Email</span></a></li>
<
<
<
< <li><a href="https://www.linkedin.com/in/robertmcgovern/" rel="nofollow noopener noreferrer"><i class="fab fa-fw fa-linkedin" aria-hidden="true"></i><span class="label">Linkedin</span></a></li>
<
<
<
< <li><a href="https://github.com/tarasis" rel="nofollow noopener noreferrer"><i class="fab fa-fw fa-github" aria-hidden="true"></i><span class="label">Github</span></a></li>
<
<
<
< <li><a href="https://twitter.com/tarasis" rel="nofollow noopener noreferrer"><i class="fab fa-fw fa-twitter-square" aria-hidden="true"></i><span class="label">Twitter</span></a></li>
<
<
<
< <li><a href="https://www.facebook.com/tarasis" rel="nofollow noopener noreferrer"><i class="fab fa-fw fa-facebook" aria-hidden="true"></i><span class="label">Facebook</span></a></li>
<
<
<
< <li><a href="https://instagram.com/tarasis" rel="nofollow noopener noreferrer"><i class="fab fa-fw fa-instagram" aria-hidden="true"></i><span class="label">Instagram</span></a></li>
<
<
<
< <li><a href="https://www.flickr.com/photos/tarasis/" rel="nofollow noopener noreferrer"><i class="fab fa-fw fa-flickr" aria-hidden="true"></i><span class="label">Flickr</span></a></li>
<
<
<
< <li><a href="https://www.youtube.com/user/tarasis" rel="nofollow noopener noreferrer"><i class="fab fa-fw fa-youtube" aria-hidden="true"></i><span class="label">Youtube</span></a></li>
<
<
<
< <li><a href="https://soundcloud.com/tarasis" rel="nofollow noopener noreferrer"><i class="fab fa-fw fa-soundcloud" aria-hidden="true"></i><span class="label">Soundcloud</span></a></li>
<
<
<
< <li><a href="https://www.last.fm/user/tarasis" rel="nofollow noopener noreferrer"><i class="fab fa-fw fa-lastfm" aria-hidden="true"></i><span class="label">Last.FM</span></a></li>
<
<
<
< <li><a href="https://www.reddit.com/user/tarasis" rel="nofollow noopener noreferrer"><i class="fab fa-fw fa-reddit" aria-hidden="true"></i><span class="label">Reddit</span></a></li>
<
<
<
< <li><a href="https://www.pinterest.com/tarasis/" rel="nofollow noopener noreferrer"><i class="fab fa-fw fa-pinterest" aria-hidden="true"></i><span class="label">Pinterest</span></a></li>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
< <!--
< <li>
< <a href="http://link-to-whatever-social-network.com/user/" itemprop="sameAs" rel="nofollow noopener noreferrer">
< <i class="fas fa-fw" aria-hidden="true"></i> Custom Social Profile Link
< </a>
< </li>
< -->
< </ul>
< </div>
< </div>
<
<
< </div>
<
<
<
338d177
< <h3 class="archive__subtitle">Recent posts</h3>
340a180
> <h3 class="archive__subtitle">Recent Posts</h3>
343d182
< <div class="entries-list">
345d183
<
349,384c187
< <div class="list__item">
< <article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
<
< <h2 class="archive__item-title no_toc" itemprop="headline">
<
< <a href="/2022/10/15/frontend-mentor-challenge-deployment/" rel="permalink">What happens when I finish a Frontend Mentor Challenge (or how I build and deploy an 11ty site)
< </a>
<
< </h2>
<
<
< <p class="page__meta">
<
<
<
<
<
<
<
<
< <span class="page__meta-readtime">
< <i class="far fa-clock" aria-hidden="true"></i>
<
< 4 minute read
<
< </span>
<
< </p>
<
<
< <p class="archive__item-excerpt" itemprop="description">Ive been doing challenges from Frontend Mentor as a means to practice frontend web development. Specifically working with plain HTML, CSS and JavaScript.
<
< R...</p>
< </article>
< </div>
<
---
> <div class="entries-list">
386,421d188
<
<
<
<
< <div class="list__item">
< <article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
<
< <h2 class="archive__item-title no_toc" itemprop="headline">
<
< <a href="/2020/05/27/camino-de-santiago/" rel="permalink">A short look back on my Camino de Santiago journey
< </a>
<
< </h2>
<
<
< <p class="page__meta">
<
<
<
<
<
<
<
<
< <span class="page__meta-readtime">
< <i class="far fa-clock" aria-hidden="true"></i>
<
< 3 minute read
<
< </span>
<
< </p>
<
<
< <p class="archive__item-excerpt" itemprop="description">A year ago tomorrow I began the most gruelling, yet immensely satisfying, journey of my life. I set off from my home in Buchholz in der Nordheide Germany, to...</p>
< </article>
424,425d190
<
<
429,812d193
< <div class="list__item">
< <article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
<
< <h2 class="archive__item-title no_toc" itemprop="headline">
<
< <a href="/2020/04/21/learning-web-development/" rel="permalink">Learning Web Development
< </a>
<
< </h2>
<
<
< <p class="page__meta">
<
<
<
<
<
<
<
<
< <span class="page__meta-readtime">
< <i class="far fa-clock" aria-hidden="true"></i>
<
< 2 minute read
<
< </span>
<
< </p>
<
<
< <p class="archive__item-excerpt" itemprop="description">I mentioned in the goals post, one of the things I am aiming to do is to start learning web development.
<
< I was well aware that what falls under the banner o...</p>
< </article>
< </div>
<
<
<
<
<
<
< <div class="list__item">
< <article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
<
< <h2 class="archive__item-title no_toc" itemprop="headline">
<
< <a href="/2020/04/20/swift-coding-challenge-2/" rel="permalink">Swift Coding Challenges: Challenge 2
< </a>
<
< </h2>
<
<
< <p class="page__meta">
<
<
<
<
<
<
<
<
< <span class="page__meta-readtime">
< <i class="far fa-clock" aria-hidden="true"></i>
<
< 1 minute read
<
< </span>
<
< </p>
<
<
< <p class="archive__item-excerpt" itemprop="description">Second one within 13 hours, good lord, that would never do.
<
< So this challenge was to test if a string matched against the reverse of itself. Basically a pal...</p>
< </article>
< </div>
<
<
<
<
<
<
< <div class="list__item">
< <article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
<
< <h2 class="archive__item-title no_toc" itemprop="headline">
<
< <a href="/2020/04/20/swift-coding-challenges/" rel="permalink">Swift Coding Challenges: Challenge 1
< </a>
<
< </h2>
<
<
< <p class="page__meta">
<
<
<
<
<
<
<
<
< <span class="page__meta-readtime">
< <i class="far fa-clock" aria-hidden="true"></i>
<
< less than 1 minute read
<
< </span>
<
< </p>
<
<
< <p class="archive__item-excerpt" itemprop="description">As an effort to improve and challenge myself I got a copy of Paul Hudsons Swift Coding Challenges book and Im going to work through it and post my thoughts...</p>
< </article>
< </div>
<
<
<
<
<
<
< <div class="list__item">
< <article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
<
< <h2 class="archive__item-title no_toc" itemprop="headline">
<
< <a href="/2020/04/17/goals/" rel="permalink">Goals
< </a>
<
< </h2>
<
<
< <p class="page__meta">
<
<
<
<
<
<
<
<
< <span class="page__meta-readtime">
< <i class="far fa-clock" aria-hidden="true"></i>
<
< 6 minute read
<
< </span>
<
< </p>
<
<
< <p class="archive__item-excerpt" itemprop="description">Long time, no write.
<
< A lot has changed in my life, not least of which is that I am no longer a stay at home dad or living in Germany. For now I am back home...</p>
< </article>
< </div>
<
<
<
<
<
<
< <div class="list__item">
< <article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
<
< <h2 class="archive__item-title no_toc" itemprop="headline">
<
< <a href="/2019/06/17/Day21/" rel="permalink">Day 21
< </a>
<
< </h2>
<
<
< <p class="page__meta">
<
<
<
<
<
<
<
<
< <span class="page__meta-readtime">
< <i class="far fa-clock" aria-hidden="true"></i>
<
< 2 minute read
<
< </span>
<
< </p>
<
<
< <p class="archive__item-excerpt" itemprop="description">Day 21 of trip
<
< Day Frómista to Carrión de los Condes. 18.88km according to app. 19.18km with Phone GPS (minor detour). Was walking quickly. Which Fitbit doe...</p>
< </article>
< </div>
<
<
<
<
<
<
< <div class="list__item">
< <article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
<
< <h2 class="archive__item-title no_toc" itemprop="headline">
<
< <a href="/2019/06/15/Day19/" rel="permalink">Day 19
< </a>
<
< </h2>
<
<
< <p class="page__meta">
<
<
<
<
<
<
<
<
< <span class="page__meta-readtime">
< <i class="far fa-clock" aria-hidden="true"></i>
<
< 3 minute read
<
< </span>
<
< </p>
<
<
< <p class="archive__item-excerpt" itemprop="description">Day 19 of trip
<
< Day 16 of walk.
<
< Today was Hornillos del Camino to Castrojeriz (19.47km)
<
< Weather: cool, grey and minimal sun (nice to walk in)
<
< Terrain: lig...</p>
< </article>
< </div>
<
<
<
<
<
<
< <div class="list__item">
< <article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
<
< <h2 class="archive__item-title no_toc" itemprop="headline">
<
< <a href="/2019/06/14/Day-2018/" rel="permalink">Day 18 - drawn to stop
< </a>
<
< </h2>
<
<
< <p class="page__meta">
<
<
<
<
<
<
<
<
< <span class="page__meta-readtime">
< <i class="far fa-clock" aria-hidden="true"></i>
<
< 4 minute read
<
< </span>
<
< </p>
<
<
< <p class="archive__item-excerpt" itemprop="description">Day 18
<
< Burgos to Hornillos del Camino ~22km
<
< Weather was pleasant but cool
<
< Terrain most flat, gravel &amp; roads
<
< Woke up at 3am freezing and no blanket to...</p>
< </article>
< </div>
<
<
<
<
<
<
< <div class="list__item">
< <article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
<
< <h2 class="archive__item-title no_toc" itemprop="headline">
<
< <a href="/2019/06/13/Day-2017/" rel="permalink">Day 17
< </a>
<
< </h2>
<
<
< <p class="page__meta">
<
<
<
<
<
<
<
<
< <span class="page__meta-readtime">
< <i class="far fa-clock" aria-hidden="true"></i>
<
< 3 minute read
<
< </span>
<
< </p>
<
<
< <p class="archive__item-excerpt" itemprop="description">Day 17
<
< So its day 17 of the trip and day 14 of the Camino (day 12 if you take out 2 rest days)
<
< Woke at 6 pretty impressed that I didnt hear the 2 women i...</p>
< </article>
< </div>
<
<
< </div>
<
<
< <nav class="pagination">
<
< <ul>
<
<
< <li><a href="#" class="disabled"><span aria-hidden="true">Previous</span></a></li>
<
<
<
<
< <li><a href="#" class="disabled current">1</a></li>
<
<
<
<
<
<
<
<
<
<
<
<
<
<
< <li><a href="/page2/">2</a></li>
<
<
<
<
<
<
<
< <li><a href="/page3/">3</a></li>
<
<
<
<
< <li><a href="/page2/">Next</a></li>
<
< </ul>
< </nav>
<
<
<
841,842d221
< <li><strong>Follow:</strong></li>
<
869c248
< <li><a href="/feed.xml"><i class="fas fa-fw fa-rss-square" aria-hidden="true"></i> Feed</a></li>
---
> <li><a href="feed.xml"><i class="fas fa-fw fa-rss-square" aria-hidden="true"></i> Feed</a></li>
874c253
< <div class="page__footer-copyright">&copy; 2023 Robert McGovern. Powered by <a href="https://jekyllrb.com" rel="nofollow">Jekyll</a> &amp; <a href="https://mademistakes.com/work/minimal-mistakes-jekyll-theme/" rel="nofollow">Minimal Mistakes</a>.</div>
---
> <div class="page__footer-copyright">&copy; %2023 Robert McGovern. Powered by <a href="https://jekyllrb.com" rel="nofollow">Jekyll</a> &amp; <a href="https://mademistakes.com/work/minimal-mistakes-jekyll-theme/" rel="nofollow">Minimal Mistakes</a>.</div>
880c259
< <script src="/assets/js/main.min.js"></script>
---
> <script src="assets/js/main.min.js"></script>
884a264
>
886,889c266,268
< <script src="/assets/js/lunr/lunr.min.js"></script>
< <script src="/assets/js/lunr/lunr-store.js"></script>
< <script src="/assets/js/lunr/lunr-en.js"></script>
<
---
> <script src="assets/js/lunr/lunr.min.js"></script>
> <script src="assets/js/lunr/lunr-store.js"></script>
> <script src="assets/js/lunr/lunr-en.js"></script>

View File

@ -0,0 +1,60 @@
// Credits 🙇 for original ideas to:
// Fork of https://github.com/vimtor/eleventy-plugin-external-links
// css.gg SVG icon https://github.com/astrit/css.gg/blob/master/icons/svg/external.svg
const { parse, HTMLElement } = require("node-html-parser");
const { extname } = require("path");
module.exports = eleventyConfig => {
const options = {
name: "external-links",
regex: new RegExp("^(([a-z]+:)|(//))", "i"),
target: "_blank",
rel: "noopener noreferrer nofollow",
extensions: [".html"],
};
eleventyConfig.addTransform(options.name, (content, outputPath) => {
if (outputPath && options.extensions.includes(extname(outputPath))) {
const root = parse(content);
const links = root.querySelectorAll("a");
links
.filter(link => {
const href = link.getAttribute("href");
return (
href &&
options.regex.test(href) &&
!link.getAttribute("rel") &&
!link.getAttribute("target")
);
})
.forEach(link => {
link.setAttribute("target", options.target);
link.setAttribute("rel", options.rel);
const srText = new HTMLElement("span", { class: "sr-only" });
srText.textContent = "(opens in a new window)";
const icon = new HTMLElement(
"svg",
{},
`viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"`
);
icon.set_content(`
<path
d="M15.6396 7.02527H12.0181V5.02527H19.0181V12.0253H17.0181V8.47528L12.1042 13.3892L10.6899 11.975L15.6396 7.02527Z"
fill="currentColor"
/>
<path
d="M10.9819 6.97473H4.98193V18.9747H16.9819V12.9747H14.9819V16.9747H6.98193V8.97473H10.9819V6.97473Z"
fill="currentColor"
/>`);
link.appendChild(srText);
link.appendChild(icon);
});
return root.toString();
}
return content;
});
};

76
inspect.output Normal file

File diff suppressed because one or more lines are too long

1316
itemdata.txt Normal file

File diff suppressed because it is too large Load Diff

17
notes.md Normal file
View File

@ -0,0 +1,17 @@
Notes from transitioning blog from Jekyll to 11ty, but still using Jekyll theme Minimal Mistakes.
Just to see if it reduces that cpu usage. Nope.
Removed from site.json
```
"post_template": "post",
"page_template": "page",
"draft_template": "draft"
```
hacked pathPrefix into relativeURLAlt function because for some reason it isn't being picked up from the above return.
author_profile.html for adding mastodon
invalid date format https://github.com/11ty/eleventy/issues/413

15507
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,20 +1,66 @@
{
"name": "v5.tarasis.net",
"type": "module",
"version": "0.0.1",
"name": "tarasis.net",
"version": "2.0.0",
"description": "Second generation of site using 11ty for building but using Jekyll theme Minimal Mistakes (with mods to make it work)",
"main": "index.js",
"scripts": {
"dev": "astro dev",
"start": "astro dev",
"build": "astro check && astro build",
"preview": "astro preview",
"astro": "astro"
"build:sass": "sass --load-path=src/_sass --style=compressed dist/assets/css/tocompile.scss dist/assets/css/main.css",
"watch:sass": "npm run build:sass -- --watch",
"watch:eleventy": "eleventy --serve --ignore-initial --incremental",
"build:eleventy": "eleventy",
"clean": "rm -rf dist",
"postbuild": "",
"start": "npm-run-all clean build:eleventy build:sass --parallel watch:*",
"build": "npm-run-all clean build:eleventy build:sass",
"debug": "DEBUG=Eleventy:* eleventy"
},
"repository": {
"type": "git",
"url": "forgejo@git.tarasis.net:tarasis/tarasis.net.git"
},
"keywords": [
"website",
"blog",
"11ty",
"jekyll"
],
"author": "Robert McGovern et all",
"license": "MIT",
"devDependencies": {
"@11ty/eleventy": "^3.0.0"
},
"dependencies": {
"@astrojs/check": "^0.9.4",
"@astrojs/mdx": "^4.0.0-beta.3",
"@astrojs/rss": "^4.0.9",
"@astrojs/sitemap": "^3.2.1",
"astro": "^5.0.0-beta.6",
"typescript": "^5.6.2"
"@11ty/eleventy-navigation": "^0.3.5",
"@11ty/eleventy-plugin-rss": "^1.2.0",
"@11ty/eleventy-plugin-syntaxhighlight": "^4.2.0",
"@11ty/eleventy-upgrade-help": "^3.0.1",
"@11tyrocks/eleventy-plugin-sass-lightningcss": "^1.0.0",
"autoprefixer": "^10.4.13",
"chroma-highlight": "^2.4.2",
"const": "^1.0.0",
"eleventy-load": "^0.3.1",
"eleventy-load-css": "^0.3.0",
"eleventy-load-file": "^0.1.0",
"eleventy-load-html": "^0.1.1",
"eleventy-load-sass": "^0.1.2",
"eleventy-plugin-description": "^0.1.5",
"eleventy-plugin-syntaxhighlight-chroma": "^0.0.1",
"eleventy-plugin-toc": "^1.1.5",
"eleventy-xml-plugin": "^0.1.0",
"fs-extra": "^11.1.0",
"js-yaml": "^4.1.0",
"lightningcss-cli": "^1.18.0",
"markdown-it": "^13.0.1",
"markdown-it-anchor": "^8.6.6",
"markdown-it-attrs": "^4.1.6",
"markdown-it-container": "^3.0.0",
"markdown-it-fontawesome": "^0.3.0",
"markdown-it-footnote": "^3.0.3",
"markdownify": "^0.1.0",
"moment": "^2.29.4",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.21",
"sass": "^1.57.1",
"slugify": "^1.6.5"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128">
<path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" />
<style>
path { fill: #000; }
@media (prefers-color-scheme: dark) {
path { fill: #FFF; }
}
</style>
</svg>

Before

Width:  |  Height:  |  Size: 749 B

Binary file not shown.

Binary file not shown.

33
src/.eleventyignore Normal file
View File

@ -0,0 +1,33 @@
*.sublime-project
*.sublime-workspace
vendor
.asset-cache
.bundle
.jekyll-assets-cache
.sass-cache
assets/js/plugins
assets/js/_main.js
assets/js/vendor
Capfile
CHANGELOG
CHANGELOG.md
config
Gemfile
Gruntfile.js
gulpfile.js
LICENSE
log
node_modules
package.json
package-lock.json
Rakefile
README
README.md
tmp
test
docs
_site
#index.html
#/docs # ignore Minimal Mistakes /docs
#test # ignore Minimal Mistakes /test

46
src/Gemfile Normal file
View File

@ -0,0 +1,46 @@
source "https://rubygems.org"
# Hello! This is where you manage which Jekyll version is used to run.
# When you want to use a different version, change it below, save the
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
#
# bundle exec jekyll serve
#
# This will help ensure the proper Jekyll version is running.
# Happy Jekylling!
gem "jekyll", "~> 4.0"
# This is the default theme for new Jekyll sites. You may change this to anything you like.
#gem "minima", "~> 2.0"
# Web editor for the Jekyll site
#gem "jekyll-admin", group: :jekyll_plugins
gem "liquid-c"
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
# uncomment the line below. To upgrade, run `bundle update github-pages`.
# gem "github-pages", group: :jekyll_plugins
# If you have any plugins, put them here!
group :jekyll_plugins do
gem "jekyll-feed", "~> 0.6"
gem "jekyll-archives"
gem "jekyll-include-cache"
gem "jekyll-gist"
gem "jekyll-compose"
gem "jemoji"
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
#gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby]
# Performance-booster for watching directories on Windows
gem "wdm", "~> 0.1.0" if Gem.win_platform?
# Theme to use
gem "minimal-mistakes-jekyll"
gem "webrick", "~> 1.7"
gem "faraday-retry", "~> 2.0"

138
src/Gemfile.lock Normal file
View File

@ -0,0 +1,138 @@
GEM
remote: https://rubygems.org/
specs:
activesupport (7.0.4.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
addressable (2.8.1)
public_suffix (>= 2.0.2, < 6.0)
colorator (1.1.0)
concurrent-ruby (1.1.10)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
eventmachine (1.2.7)
faraday (2.7.4)
faraday-net_http (>= 2.0, < 3.1)
ruby2_keywords (>= 0.0.4)
faraday-net_http (3.0.2)
faraday-retry (2.0.0)
faraday (~> 2.0)
ffi (1.15.5)
forwardable-extended (2.6.0)
gemoji (4.0.1)
google-protobuf (3.21.12)
html-pipeline (2.14.3)
activesupport (>= 2)
nokogiri (>= 1.4)
http_parser.rb (0.8.0)
i18n (1.12.0)
concurrent-ruby (~> 1.0)
jekyll (4.3.2)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 1.0)
jekyll-sass-converter (>= 2.0, < 4.0)
jekyll-watch (~> 2.0)
kramdown (~> 2.3, >= 2.3.1)
kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0)
mercenary (>= 0.3.6, < 0.5)
pathutil (~> 0.9)
rouge (>= 3.0, < 5.0)
safe_yaml (~> 1.0)
terminal-table (>= 1.8, < 4.0)
webrick (~> 1.7)
jekyll-archives (2.2.1)
jekyll (>= 3.6, < 5.0)
jekyll-compose (0.12.0)
jekyll (>= 3.7, < 5.0)
jekyll-feed (0.17.0)
jekyll (>= 3.7, < 5.0)
jekyll-gist (1.5.0)
octokit (~> 4.2)
jekyll-include-cache (0.2.1)
jekyll (>= 3.7, < 5.0)
jekyll-paginate (1.1.0)
jekyll-sass-converter (3.0.0)
sass-embedded (~> 1.54)
jekyll-sitemap (1.4.0)
jekyll (>= 3.7, < 5.0)
jekyll-watch (2.2.1)
listen (~> 3.0)
jemoji (0.13.0)
gemoji (>= 3, < 5)
html-pipeline (~> 2.2)
jekyll (>= 3.0, < 5.0)
kramdown (2.4.0)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.4)
liquid-c (4.0.1)
liquid (>= 3.0.0)
listen (3.8.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)
mini_portile2 (2.8.1)
minimal-mistakes-jekyll (4.24.0)
jekyll (>= 3.7, < 5.0)
jekyll-feed (~> 0.1)
jekyll-gist (~> 1.5)
jekyll-include-cache (~> 0.1)
jekyll-paginate (~> 1.1)
jekyll-sitemap (~> 1.3)
minitest (5.17.0)
nokogiri (1.14.0)
mini_portile2 (~> 2.8.0)
racc (~> 1.4)
octokit (4.25.1)
faraday (>= 1, < 3)
sawyer (~> 0.9)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (5.0.1)
racc (1.6.2)
rake (13.0.6)
rb-fsevent (0.11.2)
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.2.5)
rouge (4.0.1)
ruby2_keywords (0.0.5)
safe_yaml (1.0.5)
sass-embedded (1.57.1)
google-protobuf (~> 3.21)
rake (>= 10.0.0)
sawyer (0.9.2)
addressable (>= 2.3.5)
faraday (>= 0.17.3, < 3)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
tzinfo (2.0.5)
concurrent-ruby (~> 1.0)
unicode-display_width (2.4.2)
webrick (1.7.0)
PLATFORMS
ruby
DEPENDENCIES
faraday-retry (~> 2.0)
jekyll (~> 4.0)
jekyll-archives
jekyll-compose
jekyll-feed (~> 0.6)
jekyll-gist
jekyll-include-cache
jemoji
liquid-c
minimal-mistakes-jekyll
webrick (~> 1.7)
BUNDLED WITH
2.4.4

376
src/_config.yml Normal file
View File

@ -0,0 +1,376 @@
# Welcome to Jekyll!
#
# This config file is meant for settings that affect your whole blog, values
# which you are expected to set up once and rarely edit after that. If you find
# yourself editing this file very often, consider using Jekyll's data files
# feature for the data you need to update frequently.
#
# For technical reasons, this file is *NOT* reloaded automatically when you use
# 'bundle exec jekyll serve'. If you change this file, please restart the server process.
theme: "minimal-mistakes-jekyll"
minimal_mistakes_skin: "neon" # "default" "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise"
# Site settings
# These are used to personalize your new site. If you look in the HTML files,
# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.
# You can create any custom variable you would like, and they will be accessible
# in the templates via {{ site.myvariable }}.
#title: TDN
#email: rob@tarasis.net
#description: >- # this means to ignore newlines until "baseurl:"
# The musings of Robert McGovern, basically just lots of rambling.
#baseurl: "" # the subpath of your site, e.g. /blog
#url: "" # the base hostname & protocol for your site, e.g. http://example.com
#twitter_username: tarasis
#github_username: tarasis
# Site Settings
locale: "en-US"
title: "TDN: RMCG"
title_separator: "-"
name: "Robert McGovern"
description: "Random Things"
url: "https://tarasis.net" # the base hostname & protocol for your site e.g. "https://mmistakes.github.io"
baseurl: ""
repository: # GitHub username/repo-name e.g. "mmistakes/minimal-mistakes"
teaser: #"/assets/images/500x300.png" # path of fallback teaser image, e.g. "/assets/images/500x300.png"
logo: "/assets/images/apple-touch-icon.png" # path of logo image to display in the masthead, e.g. "/assets/images/88x88.png"
masthead_title: "" # overrides the website title displayed in the masthead, use " " for no title
subtitle: "👨‍💻 🚶‍♂️ 💭 🤯" #"Rambles of a chaotic mind" #optional subtitle
breadcrumbs: false # true, false (default)
breadcrumb_home_label: "Home"
breadcrumb_separator: ">"
words_per_minute: 200
head_scripts:
- /assets/js/progress.js
- /assets/js/scroll-to-top.js
comments:
provider: "disqus" # false (default), "disqus", "discourse", "facebook", "google-plus", "staticman", "utterances", "custom"
disqus:
shortname: "tarasis" # https://help.disqus.com/customer/portal/articles/466208-what-s-a-shortname-
discourse:
server: # https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963 , e.g.: meta.discourse.org
facebook:
# https://developers.facebook.com/docs/plugins/comments
appid:
num_posts: # 5 (default)
colorscheme: # "light" (default), "dark"
utterances:
theme: # "github-light" (default), "github-dark"
issue_term: # "pathname" (default)
staticman:
allowedFields: ["name", "email", "url", "message"]
branch: # "master", "gh-pages"
commitMessage: "New comment by {fields.name}"
filename: comment-{@timestamp}
format: "yml"
moderation: true
path: "_data/comments/{options.slug}"
requiredFields: ["name", "email", "message"]
transforms:
email: "md5"
generatedFields:
date:
type: "date"
options:
format: "iso8601" # "iso8601" (default), "timestamp-seconds", "timestamp-milliseconds"
endpoint: # URL of your own deployment with trailing slash, will fallback to the public instance
atom_feed:
path: # blank (default) uses feed.xml
search: true # true, false (default)
search_full_content: true # true, false (default)
search_provider: "lunr" # "algolia"
algolia:
application_id: "F5FF4IDLYX"
index_name: "tarasis-blog"
search_only_api_key: "ed656902b5bdd356f885bf9d99635fc1"
powered_by: true
# SEO Related
google_site_verification:
bing_site_verification:
yandex_site_verification:
# Social Sharing
twitter:
username: "tarasis"
facebook:
username: "tarasis"
app_id:
publisher:
og_image: "/assets/images/bio-photo.jpg"
# For specifying social profiles
# - https://developers.google.com/structured-data/customize/social-profiles
social:
type: # Person or Organization (defaults to Person)
name: # If the user or organization name differs from the site's name
links: # An array of links to social media profiles
# Analytics
analytics:
provider: false # false (default), "google", "google-universal", "custom"
google:
tracking_id:
# Site Author
author:
name: "Robert McGovern"
avatar: "/assets/images/bio-photo.jpg"
bio: "Wannabe field researcher for the Hitchhikers Guide to the Galaxy"
location: "ZZ9 Plural Z Alpha"
links:
- label: "Website"
icon: "fas fa-fw fa-link"
url: "https://tarasis.net"
- label: "Email"
icon: "fas fa-fw fa-envelope-square"
url: "mailto:rob@tarasis.net"
- label: "Linkedin"
icon: "fab fa-fw fa-linkedin"
url: "https://www.linkedin.com/in/robertmcgovern/"
- label: "Github"
icon: "fab fa-fw fa-github"
url: "https://github.com/tarasis"
- label: "Twitter"
icon: "fab fa-fw fa-twitter-square"
url: "https://twitter.com/tarasis"
- label: "Facebook"
icon: "fab fa-fw fa-facebook"
url: "https://www.facebook.com/tarasis"
- label: "Instagram"
icon: "fab fa-fw fa-instagram"
url: "https://instagram.com/tarasis"
- label: "Flickr"
icon: "fab fa-fw fa-flickr"
url: "https://www.flickr.com/photos/tarasis/"
- label: "Youtube"
icon: "fab fa-fw fa-youtube"
url: "https://www.youtube.com/user/tarasis"
- label: "Soundcloud"
icon: "fab fa-fw fa-soundcloud"
url: "https://soundcloud.com/tarasis"
- label: "Last.FM"
icon: "fab fa-fw fa-lastfm"
url: "https://www.last.fm/user/tarasis"
- label: "Reddit"
icon: "fab fa-fw fa-reddit"
url: "https://www.reddit.com/user/tarasis"
- label: "Pinterest"
icon: "fab fa-fw fa-pinterest"
url: "https://www.pinterest.com/tarasis/"
# Site Footer
footer:
links:
- label: "Email"
icon: "fas fa-fw fa-envelope-square"
url: "mailto:rob@tarasis.net"
- label: "Twitter"
icon: "fab fa-fw fa-twitter-square"
url: "https://twitter.com/tarasis"
- label: "Facebook"
icon: "fab fa-fw fa-facebook"
url: "https://www.facebook.com/tarasis"
- label: "GitHub"
icon: "fab fa-fw fa-github"
url: "https://github.com/tarasis"
- label: "Instagram"
icon: "fab fa-fw fa-instagram"
url: "https://instagram.com/tarasis"
# Reading Files
include:
- .htaccess
- _pages
exclude:
- "*.sublime-project"
- "*.sublime-workspace"
- vendor
- .asset-cache
- .bundle
- .jekyll-assets-cache
- .jekyll-cache
- .sass-cache
- assets/js/plugins
- assets/js/_main.js
- assets/js/vendor
- Capfile
- CHANGELOG
- config
- Gemfile
- Gruntfile.js
- gulpfile.js
- LICENSE
- log
- node_modules
- package.json
- Rakefile
- README
- tmp
keep_files:
- .git
- .svn
encoding: "utf-8"
markdown_ext: "markdown,mkdown,mkdn,mkd,md"
# Liquid
strict_front_matter: true
liquid:
error_mode: strict
# Conversion
markdown: kramdown
highlighter: rouge
lsi: false
excerpt_separator: "<!--more-->"
incremental: false
# Markdown Processing
kramdown:
input: GFM
hard_wrap: false
auto_ids: true
footnote_nr: 1
entity_output: as_char
toc_levels: 1..6
smart_quotes: lsquo,rsquo,ldquo,rdquo
enable_coderay: false
# Sass/SCSS
sass:
sass_dir: _sass
style: compressed # http://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style
# Outputting
permalink: /:year/:month/:day/:title/ # default value
# permalink: /:categories/:title/
paginate: 10 # amount of posts to show
paginate_path: /page:num/
timezone: # http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
# Plugins (previously gems:)
plugins:
- jekyll-archives
- jekyll-paginate
- jekyll-sitemap
- jekyll-gist
- jekyll-feed
- jemoji
- jekyll-include-cache
- jekyll-gist
# mimic GitHub Pages with --safe
whitelist:
- jekyll-archives
- jekyll-paginate
- jekyll-sitemap
- jekyll-gist
- jekyll-feed
- jemoji
- jekyll-include-cache
- jekyll-gist
# Archives
# Type
# - GitHub Pages compatible archive pages built with Liquid ~> type: liquid (default)
# - Jekyll Archives plugin archive pages ~> type: jekyll-archives
# Path (examples)
# - Archive page should exist at path when using Liquid method or you can
# expect broken links (especially with breadcrumbs enabled)
# - <base_path>/tags/my-awesome-tag/index.html ~> path: /tags/
# - <base_path/categories/my-awesome-category/index.html ~> path: /categories/
# - <base_path/my-awesome-category/index.html ~> path: /
category_archive:
type: liquid
path: /categories/
tag_archive:
type: liquid
path: /tags/
# https://github.com/jekyll/jekyll-archives
#jekyll-archives:
# enabled:
# - categories
# - tags
# layouts:
# category: archive-taxonomy
# tag: archive-taxonomy
# permalinks:
# category: /categories/:name/
# tag: /tags/:name/
# HTML Compression
# - http://jch.penibelst.de/
compress_html:
clippings: all
ignore:
envs: development
# Collections
collections:
recipes:
output: true
permalink: /:collection/:path/
pets:
output: true
permalink: /:collection/:path/
portfolio:
output: true
permalink: /:collection/:path/
# Defaults
defaults:
# _posts
- scope:
path: ""
type: posts
values:
layout: single
classes: wide
author_profile: true
read_time: true
share: true
related: true
comments: true
# _pages
- scope:
path: "_pages"
type: pages
values:
layout: single
author_profile: true
# _recipes
- scope:
path: ""
type: recipes
values:
layout: single
author_profile: true
share: true
# _portfolio
#- scope:
# path: ""
# type: portfolio
# values:
# layout: single
# author_profile: false
# share: true
# Octopress Configs
# Default extension for new posts and pages
post_ext: markdown
page_ext: html
# Default templates for posts and pages
# Found in _templates/
post_layout: single
page_layout: page
# Format titles with titlecase?
titlecase: true
# Change default template file (in _templates/)
post_template: post
page_template: page
draft_template: draft

7
src/_data/authors.yml Normal file
View File

@ -0,0 +1,7 @@
robert_mcgovern:
name: Robert McGovern
web: https://tarasis.net
email: rob@tarasis.net
bio: ""
avatar: bio-photo-2.jpg
twitter: tarasis

16
src/_data/navigation.yml Normal file
View File

@ -0,0 +1,16 @@
# main links
main:
# - title: "Posts"
# url: /year-archive/
- title: "Tags"
url: /tags/
- title: "Categories"
url: /categories/
# - title: "Pages"
# url: /page-archive/
# - title: "Collections"
# url: /collection-archive/
- title: "About"
url: /about/
#- title: "External Link"
# url: https://google.com

345
src/_data/site.json Normal file
View File

@ -0,0 +1,345 @@
{
"theme": "minimal-mistakes-jekyll",
"minimal_mistakes_skin": "neon",
"locale": "en-US",
"title": "TDN: RMCG",
"title_separator": "-",
"name": "Robert McGovern",
"description": "Random Things",
"url": "https://tarasis.net",
"baseurl": "",
"repository": null,
"teaser": null,
"logo": "/assets/images/apple-touch-icon.png",
"masthead_title": "",
"subtitle": "👨‍💻 🚶‍♂️ 💭 🤯",
"breadcrumbs": false,
"breadcrumb_home_label": "Home",
"breadcrumb_separator": ">",
"words_per_minute": 200,
"head_scripts": [
"/assets/js/progress.js",
"/assets/js/scroll-to-top.js",
"/assets/js/copy-code-button.js"
],
"comments": {
"provider": "disqus",
"disqus": {
"shortname": "tarasis"
},
"discourse": {
"server": null
},
"facebook": {
"appid": null,
"num_posts": null,
"colorscheme": null
},
"utterances": {
"theme": null,
"issue_term": null
}
},
"staticman": {
"allowedFields": [
"name",
"email",
"url",
"message"
],
"branch": null,
"commitMessage": "New comment by {fields.name}",
"filename": "comment-{@timestamp}",
"format": "yml",
"moderation": true,
"path": "_data/comments/{options.slug}",
"requiredFields": [
"name",
"email",
"message"
],
"transforms": {
"email": "md5"
},
"generatedFields": {
"date": {
"type": "date",
"options": {
"format": "iso8601"
}
}
},
"endpoint": null
},
"atom_feed": {
"path": null
},
"search": false,
"search_full_content": true,
"search_provider": "lunr",
"algolia": {
"application_id": "F5FF4IDLYX",
"index_name": "tarasis-blog",
"search_only_api_key": "ed656902b5bdd356f885bf9d99635fc1",
"powered_by": true
},
"google_site_verification": null,
"bing_site_verification": null,
"yandex_site_verification": null,
"twitter": {
"username": "tarasis"
},
"facebook": {
"username": "tarasis",
"app_id": null,
"publisher": null
},
"og_image": "/assets/images/bio-photo.jpg",
"social": {
"type": null,
"name": null,
"links": null
},
"analytics": {
"provider": false,
"google": {
"tracking_id": null
}
},
"author": {
"name": "Robert McGovern",
"avatar": "/assets/images/bio-photo.jpg",
"bio": "Wannabe field researcher for the Hitchhikers Guide to the Galaxy",
"location": "ZZ9 Plural Z Alpha",
"links": [
{
"label": "Website",
"icon": "fas fa-fw fa-link",
"url": "https://tarasis.net"
},
{
"label": "Email",
"icon": "fas fa-fw fa-envelope-square",
"url": "mailto:rob@tarasis.net"
},
{
"label": "Linkedin",
"icon": "fab fa-fw fa-linkedin",
"url": "https://www.linkedin.com/in/robertmcgovern/"
},
{
"label": "Github",
"icon": "fab fa-fw fa-github",
"url": "https://github.com/tarasis"
},
{
"label": "Twitter",
"icon": "fab fa-fw fa-twitter-square",
"url": "https://twitter.com/tarasis"
},
{
"label": "Mastodon",
"icon": "fab fa-fw fa-mastodon",
"url": "https://social.tarasis.net/@tarasis"
},
{
"label": "Facebook",
"icon": "fab fa-fw fa-facebook",
"url": "https://www.facebook.com/tarasis"
},
{
"label": "Instagram",
"icon": "fab fa-fw fa-instagram",
"url": "https://instagram.com/tarasis"
},
{
"label": "Flickr",
"icon": "fab fa-fw fa-flickr",
"url": "https://www.flickr.com/photos/tarasis/"
},
{
"label": "Youtube",
"icon": "fab fa-fw fa-youtube",
"url": "https://www.youtube.com/user/tarasis"
},
{
"label": "Soundcloud",
"icon": "fab fa-fw fa-soundcloud",
"url": "https://soundcloud.com/tarasis"
},
{
"label": "Last.FM",
"icon": "fab fa-fw fa-lastfm",
"url": "https://www.last.fm/user/tarasis"
},
{
"label": "Reddit",
"icon": "fab fa-fw fa-reddit",
"url": "https://www.reddit.com/user/tarasis"
},
{
"label": "Pinterest",
"icon": "fab fa-fw fa-pinterest",
"url": "https://www.pinterest.com/tarasis/"
}
]
},
"footer": {
"links": [
{
"label": "RSS for Dev Posts",
"icon": "fas fa-fw fa-rss-square",
"url": "/feed-dev.xml"
},
{
"label": "Email",
"icon": "fas fa-fw fa-envelope-square",
"url": "mailto:rob@tarasis.net"
}
]
},
"include": [
".htaccess",
"_pages"
],
"exclude": [
"*.sublime-project",
"*.sublime-workspace",
"vendor",
".asset-cache",
".bundle",
".jekyll-assets-cache",
".jekyll-cache",
".sass-cache",
"assets/js/plugins",
"assets/js/_main.js",
"assets/js/vendor",
"Capfile",
"CHANGELOG",
"config",
"Gemfile",
"Gruntfile.js",
"gulpfile.js",
"LICENSE",
"log",
"node_modules",
"package.json",
"Rakefile",
"README",
"tmp"
],
"keep_files": [
".git",
".svn"
],
"encoding": "utf-8",
"markdown_ext": "markdown,mkdown,mkdn,mkd,md",
"strict_front_matter": true,
"liquid": {
"error_mode": "strict"
},
"markdown": "kramdown",
"highlighter": "rouge",
"lsi": false,
"excerpt_separator": "<!--more-->",
"incremental": false,
"kramdown": {
"input": "GFM",
"hard_wrap": false,
"auto_ids": true,
"footnote_nr": 1,
"entity_output": "as_char",
"toc_levels": "1..6",
"smart_quotes": "lsquo,rsquo,ldquo,rdquo",
"enable_coderay": false
},
"sass": {
"sass_dir": "_sass",
"style": "compressed"
},
"permalink": "/:year/:month/:day/:title/",
"paginate": 10,
"paginate_path": "/page:num/",
"timezone": null,
"plugins": [
"jekyll-archives",
"jekyll-paginate",
"jekyll-sitemap",
"jekyll-gist",
"jekyll-feed",
"jemoji",
"jekyll-include-cache",
"jekyll-gist"
],
"whitelist": [
"jekyll-archives",
"jekyll-paginate",
"jekyll-sitemap",
"jekyll-gist",
"jekyll-feed",
"jemoji",
"jekyll-include-cache",
"jekyll-gist"
],
"category_archive": {
"type": "liquid",
"path": "/categories/"
},
"tag_archive": {
"type": "liquid",
"path": "/tags/"
},
"compress_html": {
"clippings": "all",
"ignore": {
"envs": "development"
}
},
"collections": {
"recipes": {
"output": true,
"permalink": "/:collection/:path/"
},
"pets": {
"output": true,
"permalink": "/:collection/:path/"
},
"portfolio": {
"output": true,
"permalink": "/:collection/:path/"
}
},
"defaults": {
"posts": {
"path": "_posts",
"type": "posts",
"layout": "single",
"classes": "wide",
"author_profile": true,
"read_time": true,
"share": true,
"related": true,
"comments": true,
"sidebar": true,
"show_date": true
},
"pages": {
"path": "_pages",
"type": "pages",
"layout": "single",
"author_profile": true
},
"recipies": {
"path": "",
"type": "recipes",
"layout": "single",
"author_profile": true,
"share": true
}
},
"post_ext": "markdown",
"page_ext": "html",
"post_layout": "single",
"page_layout": "page",
"titlecase": true
}

1969
src/_data/ui-text.yml Normal file

File diff suppressed because it is too large Load Diff

24
src/_drafts/an-ending.md Normal file
View File

@ -0,0 +1,24 @@
---
layout: single
author_profile: true
read_time: true
share: true
related: true
title: 'An End of Sorts'
tag: [Life, Work]
eleventyExcludeFromCollections: true
---
Lets be clear up front: ITS MY **FAULT**.
...
Whats my fault? Well this is the beginning of the end; an end to my marriage of 20 years, an end to a relationship that has been going nearly 23 years, an end to being a stay at home parent, an end to my children's stability and an end to so much more.
No more easy life of not working and old looking after the kids and badly looking after the house.
Ahead are a ton of decisions to be made like where to live, how to be there for the kids, how things will split, who gets the [Thermomix]() and so on.
Why? Because I had grown too far from Bob. I ...
unfinished

223
src/_drafts/cashregister.md Normal file
View File

@ -0,0 +1,223 @@
---
title: Cash Register Challenge on freeCodeCamp
tags: [webdev, javascript, freecodecamp]
category: programming
eleventyExcludeFromCollections: true
layout: single
---
I've been (slowly) working through the JavaScript module on [freeCodeCamp](https://freecodecamp.org) for a while now, and have recently been doing the certificate challenges. The last of which is the "Cash Register" challenge where you are to write a function that takes a price, a payment amount and an array that contains the cash in the drawer.
I found a couple of things strange about the challenge
| Currency Unit | Amount |
| ------------------- | ------------------ |
| Penny | $0.01 (PENNY) |
| Nickel | $0.05 (NICKEL) |
| Dime | $0.1 (DIME) |
| Quarter | $0.25 (QUARTER) |
| Dollar | $1 (ONE) |
| Five Dollars | $5 (FIVE) |
| Ten Dollars | $10 (TEN) |
| Twenty Dollars | $20 (TWENTY) |
| One-hundred Dollars | $100 (ONE HUNDRED) |
Example of the cash in drawer array:
```javascript
[
["PENNY", 1.01],
["NICKEL", 2.05],
["DIME", 3.1],
["QUARTER", 4.25],
["ONE", 90],
["FIVE", 55],
["TEN", 20],
["TWENTY", 60],
["ONE HUNDRED", 100]
]
```
Sample input to function,
```javascript
checkCashRegister(3.26, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])
```
and the expected return object
```javascript
{status: "OPEN", change: [["TWENTY", 60], ["TEN", 20], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.5], ["DIME", 0.2], ["PENNY", 0.04]]}
```
Why is this weird? Well it was drilled into me back in college (1991/1992), to NEVER use floating point values for currency. Its inpercise (especially in JavaScript) and this challenge just doubles down on it.
I'd much rather see that there are 101 PENNIES that 1.01 in PENNIES. I find it faster to say give 4 pennies as change than 0.04 pennies.
Final **solution**
```javascript
function checkCashRegister(price, cash, cid) {
/*
First step, adjust amounts into pennies.
Learnt long ago to never use floats
for currency.
*/
let adjustmentAmount = 100;
let adjustedPrice = price * adjustmentAmount;
let adjustedCashGiven = cash * adjustmentAmount;
// Reverse cid, need to make new array as using = is just a reference
let cashInDrawer = Array.from(cid);
cashInDrawer.reverse();
// total of all the cash in drawer
let totalCashInDrawer = 0;
// in the array the denomination comes in an array with two parts, name and value
const availableCashInDrawer = cashInDrawer.map((denomination) => {
const adjustedAmount = Math.round(denomination[1] * adjustmentAmount);
totalCashInDrawer += adjustedAmount;
return [denomination[0], adjustedAmount];
});
// console.log(
// "Total Cash in Drawer",
// totalCashInDrawer,
// " -- $",
// totalCashInDrawer / adjustmentAmount
// );
let currencyValues = {
"ONE HUNDRED": 10000,
TWENTY: 2000,
TEN: 1000,
FIVE: 500,
ONE: 100,
QUARTER: 25,
DIME: 10,
NICKEL: 5,
PENNY: 1,
};
// console.log(currencyValue);
// Now how much change is required?
const changeRequired = adjustedCashGiven - adjustedPrice;
// console.log(`Change Required ${changeRequired}`);
// Two options, either set up the default object as
// change["status"] = "INSUFFICIENT_FUNDS";
// change["change"] = [];
// which would remove two if checks below, OR leave it empty
// and be explicit in the code
let change = {};
// Simplest case first.
// If no change required
if (changeRequired == 0) {
change["status"] = "CLOSED";
change["change"] = cid;
// if the change required is more than the available cash in the drawer
} else if (changeRequired > totalCashInDrawer) {
change["status"] = "INSUFFICIENT_FUNDS";
change["change"] = [];
} else {
let workingChange = changeRequired;
let changeWithCash = {};
availableCashInDrawer.forEach((denomination) => {
// console.log(denomination);
while (true) {
const denominationName = denomination[0];
const denominationValue = denomination[1];
let currencyVal = currencyValues[denominationName];
if (
workingChange >= currencyValues[denominationName] &&
denominationValue >= currencyVal
) {
denomination[1] -= currencyVal;
workingChange -= currencyVal;
let val = currencyVal / adjustmentAmount;
if (changeWithCash[denominationName]) {
changeWithCash[denominationName] += val;
} else {
changeWithCash[denominationName] = val;
}
} else {
break;
}
}
});
// If we have calculated the change correctly, and there was exactly that
// amount in the drawer, return closed and the cid (required for challenge)
if (workingChange === 0 && changeRequired == totalCashInDrawer) {
change["status"] = "CLOSED";
change["change"] = cid;
// otherwise if we have calculated change correctly, open the drawer and show what amount
// to give.
} else if (workingChange === 0) {
change["status"] = "OPEN";
change["change"] = Object.entries(changeWithCash);
// Otherwise we have enough money in the cash drawer but not the right denominations to
// give change, so return insufficent funds.
} else {
change["status"] = "INSUFFICIENT_FUNDS";
change["change"] = [];
}
}
console.log(change);
return change;
}
checkCashRegister(19.5, 20, [
["PENNY", 1.01],
["NICKEL", 2.05],
["DIME", 3.1],
["QUARTER", 4.25],
["ONE", 90],
["FIVE", 55],
["TEN", 20],
["TWENTY", 60],
["ONE HUNDRED", 100],
]); // {status: "OPEN", change: [["QUARTER", 0.5]]}
checkCashRegister(20, 20, [
["PENNY", 1.01],
["NICKEL", 2.05],
["DIME", 3.1],
["QUARTER", 4.25],
["ONE", 90],
["FIVE", 55],
["TEN", 20],
["TWENTY", 60],
["ONE HUNDRED", 100],
]); //{ status: 'CLOSED', change: [ [ 'PENNY', 1.01 ], [ 'NICKEL', 2.05 ], [ 'DIME', 3.1 ], [ 'QUARTER', 4.25 ], [ 'ONE', 90 ], [ 'FIVE', 55 ], [ 'TEN', 20 ], [ 'TWENTY', 60 ], [ 'ONE HUNDRED', 100 ] ] }
checkCashRegister(19.5, 20, [
["PENNY", 0.01],
["NICKEL", 0],
["DIME", 0],
["QUARTER", 0],
["ONE", 0],
["FIVE", 0],
["TEN", 0],
["TWENTY", 0],
["ONE HUNDRED", 0],
]); // {status: "INSUFFICIENT_FUNDS", change: []}
checkCashRegister(19.5, 20, [
["PENNY", 0.5],
["NICKEL", 0],
["DIME", 0],
["QUARTER", 0],
["ONE", 0],
["FIVE", 0],
["TEN", 0],
["TWENTY", 0],
["ONE HUNDRED", 0],
]);
```

View File

@ -0,0 +1,24 @@
---
title: Introducing eleventy-plugin-syntaxhighlighting-chroma
tags: [webdev, site]
category: [site, webdev]
date: 2023-02-11
eleventyExcludeFromCollections: true
excerpt: An introduction to the 11ty plugin.
---
To do
[] - Introduce Project
[] - Why did I make it
[] - how to use it
[] - examples
[] - future
One of the things I wanted to do with the revamp of the blog was to make an effort to do more technical writing.
[11ty]() provides its own [plugin](https://github.com/11ty/eleventy-plugin-syntaxhighlight) for syntax highlighting using the [PrismJS]() library. However it doesn't support all the plugins that PrismJS provides. Also missing is support for line numbers, there is an [open issue]() about that, and also [issues](https://github.com/11ty/eleventy-plugin-syntaxhighlight/issues/32) about using a different highlight engine; mentioned are [torchlight](https://torchlight.dev), [shiki](https://github.com/shikijs/shiki).
Someone has already written an 11ty plugin, [eleventy-plugin-highlightjs](https://github.com/b-kelly/eleventy-plugin-highlightjs) using HighlightJS.
##

View File

@ -0,0 +1,25 @@
---
title: CSS Properties, or I have a problem.
tags: [webdev, css]
category: programming
eleventyExcludeFromCollections: true
---
Frontend Mentor
Ive be rattling off some Frontend Mentor challenges recently. Aiming to finish all the newbie challenges before moving onto Junior and onwards.
One thing Ive noticed is that Ive really embraced CSS properties, probably too much so :)
In my last couple of challenges Ive had upwards of 50 properties. They cover typography, Colors, positioning, styling and padding / margins.
For instance in this [Product] challenge …
The theory being that it makes it easy to retheme or to switch up details for the desktop version compared to the mobile version without having to redo X, Y or Z classes.
To me it makes sense. The code stays the same, youre just tweaking the variables passed in.

27
src/_drafts/filtering.md Normal file
View File

@ -0,0 +1,27 @@
---
title: Filtering
tags: [webdev, javascript]
category: programming
eleventyExcludeFromCollections: true
---
I was watching the video [How To Create A Search Bar In JavaScript](https://www.youtube.com/watch?v=TlP5WIxVirU) by [Web Dev Simplified](https://www.youtube.com/channel/UCFbNIlppjAuEX4znoulh0Cw) to learn how to do a search bar in JavaScript.
What I realised as I was coding along, was that the video was reallymore about filtering data than what I might think of as a search bar. Which is fine, and totally not wrong, but I do find some of Kyle's choices suspect / curious.
For instance he uses data attributes for selecting elements from the html, and runs `toLowerCase()` on strings every single time you type a character. The latter to my mind seems incredibly wasteful.
```javascript
searchInput.addEventListener("input", (event) => {
const value = event.target.value.toLowerCase();
users.forEach((user) => {
const isVisible =
user.name.toLowerCase().includes(value) ||
user.email.toLowerCase().includes(value);
user.element.classList.toggle("hide", !isVisible);
});
});
```

View File

@ -0,0 +1,39 @@
---
layout: single
author_profile: true
read_time: true
share: true
related: true
title: Frontend Mentor Review
tags: [webdev, programming]
category: Programming
eleventyExcludeFromCollections: true
---
1. What Frontend Mentor is
Site that provides differing levels of challenges
Owned by Matt Studdert
You build your solution to the challenge using any means that you wish (straight HTML/CSS/JavaScript, or React, Svelte and so on)
1. What do you get
base files
style sheet
paid: figma and sketch
1. on completing a challenge
You submit the challenge
Other people can then see your solution
slide to compare desktop version against the design image
see any questions you have asked
can provide comments
points
1. Peer review
Other people who either go directly to your challenge page, or have completed the challenge themselves can see your solution
they can provide comments, like your solution, bookmark it
1. My thoughts & experience
what do I like
find it very useful
great for building your skills
what do I dislike
it can be like the blind leading the blind. Its odd to be offering advice / tips when you are learning and likewise from others
sometimes no comments or advice
improvements?
???

View File

@ -0,0 +1,20 @@
---
layout: single
title: Numerical Brain Teasers review
tags: [dev, review, puzzles]
category: [dev, review, puzzles]
eleventyExcludeFromCollections: true
---
1. book by Erica Sadun - Numerical Brain Teasers published by Prag Prog
1. Born out of puzzles on Prag Prog Twitter feed
1. Price $9 for eBook (also Physically available)
1. 12 different types of puzzles
1. Each type has:
a sample
a description
a little history
ways to solve
addiotnla puzzles to solve
1. Some samples are available on the website
1. Thoughts

View File

@ -0,0 +1,5 @@
---
layout: single
title: pretty-terminal-configs
eleventyExcludeFromCollections: true
---

View File

@ -0,0 +1,12 @@
---
layout: single
author_profile: true
read_time: true
share: true
related: true
title: 'Superheroes'
tag: [Movies, TV, Comics]
eleventyExcludeFromCollections: true
---
Test

View File

@ -0,0 +1,17 @@
---
title: Swift Coding Challenge 3 and 4
tags:
- programming
- ios
- swift
- coding-challenges
category: coding-challenges
eleventyExcludeFromCollections: true
---
# Challenge 3
Take two strings, random order of letters and compare if they contain the same letters
This was very quickly done. I remembered about ``sorted``
# Challenge 4

211
src/_drafts/swiftui.md Normal file
View File

@ -0,0 +1,211 @@
---
layout: single
author_profile: true
read_time: true
share: true
related: true
title: SwiftUI
tags: [swiftui,programming,ios, swift]
category: Programming
eleventyExcludeFromCollections: true
---
Its been a long while since I sat and did programming, but between a life situation and the new technology from Apple for creating user interfaces (SwiftUI), I've been inspired to pickup again an idea I've been kicking around for 10 years.
<!--more-->
SwiftUI simplifies designing interfaces
Provides a fast means of iterating design
Able to quickly see results
Easy to mock in data
Buggy.
Filled 3 bugs so far.
Swift:
{% highlight swift %}
override public func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
currentTouchPosition = touches.first?.location(in: self)
NSObject.cancelPreviousPerformRequests(withTarget: self)
}
{% endhighlight %}
Swift:
```swift
def print_hi(name)
puts "Hi, #{name}"
end
print_hi('Tom')
#=> prints 'Hi, Tom' to STDOUT.
```
Bash:
```bash
#!/usr/bin/env bash
set -e # halt script on error
echo
echo "------------------------------------------------------------------------------------------------------------------------"
if [ "$TRAVIS_PULL_REQUEST" != "false" -a "$TRAVIS_BRANCH" == "comments" ]; then
echo
echo "Building site for pull request for $TRAVIS_BRANCH..."
bundle exec jekyll build --config _config.yml --source . --destination ./docs
echo "Site built into /docs"
echo
echo "Proofing links"
bundle exec htmlproofer ./docs --disable-external --allow_hash_href
echo "Proofing links complete"
echo
echo "------------------------------------------------------------------------------------------------------------------------"
exit 0
elif [ "$TRAVIS_BRANCH" == "master" ]; then
echo
echo "Building site for $TRAVIS_BRANCH..."
bundle exec jekyll build --config _config.yml --source . --destination ./docs
echo "Site built into /docs"
echo
echo "Proofing links"
bundle exec htmlproofer ./docs --disable-external --allow_hash_href
echo "Proofing links complete"
echo
echo "------------------------------------------------------------------------------------------------------------------------"
exit 0
else
echo
echo "Build not triggered internally"
echo
echo "------------------------------------------------------------------------------------------------------------------------"
exit 0
fi
```
Ruby:
{% highlight ruby %}
require "gem"
number = 0
regexp = /[abc]/
# This is a comment
class Person
attr_accessor :name
def initialize(attributes = {})
@name = attributes[:name]
end
def self.greet
"hello"
end
end
person1 = Person.new(:name => "Chris")
puts "#{Person::greet} #{person1.name}\n"
{% endhighlight %}
html:
```html
<!DOCTYPE html>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1 id="heading">Heading</h1>
<p class="class">This is an example paragraph.</p>
</body>
</html>
```
css:
```css
.highlight pre {
width: 100%;
}
.highlight .hll {
background-color: $base06;
}
.highlight {
.c {
/* Comment */
color: $base04;
}
}
```
Javascript:
```javascript
$(document).ready(function() {
// FitVids init
$("#main").fitVids();
// Sticky sidebar
var stickySideBar = function() {
var show =
$(".author__urls-wrapper button").length === 0
? $(window).width() > 1024 // width should match $large Sass variable
: !$(".author__urls-wrapper button").is(":visible");
if (show) {
// fix
$(".sidebar").addClass("sticky");
} else {
// unfix
$(".sidebar").removeClass("sticky");
}
};
}
```
notice
{: .notice}
primary
{: .notice--primary}
info
{: .notice--info}
warning
{: .notice--warning}
success
{: .notice--success}
danger
{: .notice--danger}
TIP: Unless you are wed to the theme, don't try porting it. Really. Headaches await. 🤯
{: .notice--warning}
**success**
{: .notice--success}
<div class="notice--success" markdown="1">
<h3> Headline for the Notice</h3>
<br>
Text for the notice
</div>

View File

@ -0,0 +1,67 @@
---
title: terminal-colors
tags:
- programming
category: programming
eleventyExcludeFromCollections: true
---
Color ... I have a problem ...
Or Colour if you're from the UK and associated territories.
Seriously, I legitimately have a problem. I need color when I am working with source code, the terminal or when I am reading computer books (like images, or source code).
I can't explain what it is, but I don't take in the information as well when its monochrome, or minimally highlighted. The more colour, the better I understand it.
For example, this is the default terminal file listing on macOS:
<image of directory listing and source code without highlighting>
and source code from a book:
<source code without highlighting>
The last couple of days I've been exploring how to add more colour to the terminal for file listings and when looking at looking at the content of files.
I'm happy to say there are some apps and settings that make the terminal nirvana like for me.
Improving the colours used by 'ls'
The version of 'ls' provided by Apple in macOS is rather limited in the colours it can display. By that I mean you can't assign particular filetypes their own colours. You are limited (https://www.cyberciti.biz/faq/apple-mac-osx-terminal-color-ls-output-option/) to what can have coloured and the number of colours:
Directories, symbolic links, sockets, pipes, executables, and characters.
Enter GNU ls which is able to display many more colours (256, or 24bit). You can specify different colours for different extensions. Meaning you could have colours for music files (.mp3, .m4a), video files (.avi, .mov, .mp4), office documents (.doc, .xls) and so on.
<sample of ls with tweaked LS_COLOR>
Download a regularly updated list of colours from link https://github.com/trapd00r/LS_COLORS
[NOTE] You can't use the provided scripts on macOS without first installing 'coreutils' (via Homebrew) and then tweaking the shellscripts to use those.
Alternatives to 'ls'
There are two decent alternatives to 'ls' available on GitHub. These improve on its output providing output as grids and trees, and in one case icons.
Both are written in rust
lsd
sdfsdfsd https://github.com/Peltoche/lsd
exa
dsfsfsd https://github.com/ogham/exa // https://the.exa.website
Alternative to 'cat'
bat https://github.com/sharkdp/bat
Last but not least 'delta'
https://github.com/dandavison/delta

16
src/_drafts/vps.md Normal file
View File

@ -0,0 +1,16 @@
---
layout: single
title: Reviews of VPSs
tags: [dev, review, site]
category: [dev, review, site]
eleventyExcludeFromCollections: true
---
1. what is a VPS
1. pricing
1. Bang for Buck
1. HostHatch
1. VirMach
1. CrunchBits
1. Oracle
1.

12
src/_drafts/writeup.md Normal file
View File

@ -0,0 +1,12 @@
---
title: Writeup
tags: [camino,caminodesantiago,jakobsweg,life]
category: personal
eleventyExcludeFromCollections: true
---
Its been a long while since I posted. I fell behind on my Camino posts, although I continued to take notes for a while, before I ended up giving up on those too.
So this is a bit of a write up of the remaining time and life since.
<!--more-->
A lot has happened since I finished the Camino Frances.

View File

@ -0,0 +1,3 @@
<!-- start custom analytics snippet -->
<!-- end custom analytics snippet -->

View File

@ -0,0 +1,9 @@
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id={{ site.analytics.google.tracking_id }}"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '{{ site.analytics.google.tracking_id }}', { 'anonymize_ip': {{ site.analytics.google.anonymize_ip | default: false }}});
</script>

View File

@ -0,0 +1,7 @@
<script>
window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date;
ga('create','{{ site.analytics.google.tracking_id }}','auto');
ga('set', 'anonymizeIp', {{ site.analytics.google.anonymize_ip | default: false }});
ga('send','pageview')
</script>
<script src="https://www.google-analytics.com/analytics.js" async></script>

View File

@ -0,0 +1,14 @@
<script>
var _gaq = _gaq || [];
_gaq.push(['_setAccount', '{{ site.analytics.google.tracking_id }}']);
{% if site.analytics.google.anonymize_ip == true %}
_gaq.push(['_gat._anonymizeIp']);
{% endif %}
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>

View File

@ -0,0 +1,14 @@
{% if jekyll.environment == 'production' and site.analytics.provider and page.analytics != false %}
{% case site.analytics.provider %}
{% when "google" %}
{% include /analytics-providers/google.html %}
{% when "google-universal" %}
{% include /analytics-providers/google-universal.html %}
{% when "google-gtag" %}
{% include /analytics-providers/google-gtag.html %}
{% when "custom" %}
{% include /analytics-providers/custom.html %}
{% endcase %}
{% endif %}

View File

@ -0,0 +1,40 @@
{% if include.aPost.data.title.header.teaser %}
{% capture teaser %}{{ include.aPost.data.title.header.teaser }}{% endcapture %}
{% else %}
{% assign teaser = site.teaser %}
{% endif %}
{% if include.aPost.data.id %}
{% assign title = include.aPost.data.title | markdownify | remove: "<p>" | remove: "</p>" %}
{% else %}
{% assign title = include.aPost.data.title %}
{% endif %}
<div class="{{ include.type | default: 'list' }}__item">
<article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
{% if include.type == "grid" and teaser %}
<div class="archive__item-teaser">
<img src="{{ teaser | relative_url }}" alt="">
</div>
{% endif %}
<h2 class="archive__item-title no_toc" itemprop="headline">
{% if include.aPost.data.link %}
<a href="{{ include.aPost.data.link }}">{{ title }}</a> <a href="{{ include.aPost.data.page.url | relative_url }}" rel="permalink"><i class="fas fa-link" aria-hidden="true" title="permalink"></i><span class="sr-only">Permalink</span></a>
{% else %}
<a href="{{ include.aPost.data.page.url | relative_url }}" rel="permalink">{{ title }}</a>
{% endif %}
</h2>
<!-- RMCG consider removing truncate from first 2 where we've explicitly provided a excerpt -->
{% include page__meta.html type=include.type content=include.aPost.data.content %}
{% if include.aPost.data.page.excerpt %}
<p class="archive__item-excerpt" itemprop="description">{{ include.aPost.data.page.excerpt | markdownify | strip_html | truncate: 160 }}</p>
{% elsif include.aPost.data.excerpt %}
<p class="archive__item-excerpt" itemprop="description">{{ include.aPost.data.excerpt | markdownify | strip_html | truncate: 160 }}</p>
{% else %}
<!-- RMCG - Result of this isn't perfect but it works, so now all posts show an excerpt of sorts -->
<p class="archive__item-excerpt" itemprop="description">{{ include.aPost.template._cacheRenderedPromise |
markdownify | strip_html | truncate: 160 }}</p>
{% endif %}
</article>
</div>

View File

@ -0,0 +1,7 @@
<!--
<li>
<a href="http://link-to-whatever-social-network.com/user/" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fas fa-fw" aria-hidden="true"></i> Custom Social Profile Link
</a>
</li>
-->

View File

@ -0,0 +1,252 @@
{% assign author = page.author | default: page.authors[0] | default: site.author %}
{% assign author = authors[author] | default: author %}
<div itemscope itemtype="https://schema.org/Person">
{% if author.avatar %}
<div class="author__avatar">
{% if author.home %}
<a href="{{ author.home | relative_url }}">
<img src="{{ author.avatar | relative_url }}" alt="{{ author.name }}" itemprop="image">
</a>
{% else %}
<img src="{{ author.avatar | relative_url }}" alt="{{ author.name }}" itemprop="image">
{% endif %}
</div>
{% endif %}
<div class="author__content">
{% if author.home %}
<a href="{{ author.home | relative_url }}"><h3 class="author__name" itemprop="name">{{ author.name }}</h3></a>
{% else %}
<h3 class="author__name" itemprop="name">{{ author.name }}</h3>
{% endif %}
{% if author.bio %}
<div class="author__bio" itemprop="description">
{{ author.bio | markdownify }}
</div>
{% endif %}
</div>
<div class="author__urls-wrapper">
<button class="btn btn--inverse">{{ ui-text[site.locale].follow_label | remove: ":" | default: "Follow" }}</button>
<ul class="author__urls social-icons">
{% if author.location %}
<li itemprop="homeLocation" itemscope itemtype="https://schema.org/Place">
<i class="fas fa-fw fa-map-marker-alt" aria-hidden="true"></i> <span itemprop="name">{{ author.location }}</span>
</li>
{% endif %}
{% if author.links %}
{% for link in author.links %}
{% if link.label and link.url %}
<li><a href="{{ link.url }}" rel="nofollow noopener noreferrer"><i class="{{ link.icon | default: 'fas fa-link' }}" aria-hidden="true"></i><span class="label">{{ link.label }}</span></a></li>
{% endif %}
{% endfor %}
{% endif %}
{% if author.uri %}
<li>
<a href="{{ author.uri }}" itemprop="url">
<i class="fas fa-fw fa-link" aria-hidden="true"></i><span class="label">{{ ui-text[site.locale].website_label | default: "Website" }}</span>
</a>
</li>
{% endif %}
{% if author.email %}
<li>
<a href="mailto:{{ author.email }}">
<meta itemprop="email" content="{{ author.email }}" />
<i class="fas fa-fw fa-envelope-square" aria-hidden="true"></i><span class="label">{{ ui-text[site.locale].email_label | default: "Email" }}</span>
</a>
</li>
{% endif %}
{% if author.keybase %}
<li>
<a href="https://keybase.io/{{ author.keybase }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fas fa-fw fa-key" aria-hidden="true"></i><span class="label">Keybase</span>
</a>
</li>
{% endif %}
{% if author.twitter %}
<li>
<a href="https://twitter.com/{{ author.twitter }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-twitter-square" aria-hidden="true"></i><span class="label">Twitter</span>
</a>
</li>
{% endif %}
{% if author.facebook %}
<li>
<a href="https://www.facebook.com/{{ author.facebook }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-facebook-square" aria-hidden="true"></i><span class="label">Facebook</span>
</a>
</li>
{% endif %}
{% if author.linkedin %}
<li>
<a href="https://www.linkedin.com/in/{{ author.linkedin }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-linkedin" aria-hidden="true"></i><span class="label">LinkedIn</span>
</a>
</li>
{% endif %}
{% if author.xing %}
<li>
<a href="https://www.xing.com/profile/{{ author.xing }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-xing-square" aria-hidden="true"></i><span class="label">XING</span>
</a>
</li>
{% endif %}
{% if author.instagram %}
<li>
<a href="https://instagram.com/{{ author.instagram }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-instagram" aria-hidden="true"></i><span class="label">Instagram</span>
</a>
</li>
{% endif %}
{% if author.tumblr %}
<li>
<a href="https://{{ author.tumblr }}.tumblr.com" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-tumblr-square" aria-hidden="true"></i><span class="label">Tumblr</span>
</a>
</li>
{% endif %}
{% if author.bitbucket %}
<li>
<a href="https://bitbucket.org/{{ author.bitbucket }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-bitbucket" aria-hidden="true"></i><span class="label">Bitbucket</span>
</a>
</li>
{% endif %}
{% if author.github %}
<li>
<a href="https://github.com/{{ author.github }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-github" aria-hidden="true"></i><span class="label">GitHub</span>
</a>
</li>
{% endif %}
{% if author.gitlab %}
<li>
<a href="https://gitlab.com/{{ author.gitlab }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-gitlab" aria-hidden="true"></i><span class="label">GitLab</span>
</a>
</li>
{% endif %}
{% if author.stackoverflow %}
<li>
<a href="https://stackoverflow.com/users/{{ author.stackoverflow }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-stack-overflow" aria-hidden="true"></i><span class="label">Stack Overflow</span>
</a>
</li>
{% endif %}
{% if author.lastfm %}
<li>
<a href="https://last.fm/user/{{ author.lastfm }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-lastfm-square" aria-hidden="true"></i><span class="label">Last.fm</span>
</a>
</li>
{% endif %}
{% if author.dribbble %}
<li>
<a href="https://dribbble.com/{{ author.dribbble }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-dribbble" aria-hidden="true"></i><span class="label">Dribbble</span>
</a>
</li>
{% endif %}
{% if author.pinterest %}
<li>
<a href="https://www.pinterest.com/{{ author.pinterest }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-pinterest" aria-hidden="true"></i><span class="label">Pinterest</span>
</a>
</li>
{% endif %}
{% if author.foursquare %}
<li>
<a href="https://foursquare.com/{{ author.foursquare }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-foursquare" aria-hidden="true"></i><span class="label">Foursquare</span>
</a>
</li>
{% endif %}
{% if author.steam %}
<li>
<a href="https://steamcommunity.com/id/{{ author.steam }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-steam" aria-hidden="true"></i><span class="label">Steam</span>
</a>
</li>
{% endif %}
{% if author.youtube %}
{% if author.youtube contains "://" %}
<li>
<a href="{{ author.youtube }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-youtube" aria-hidden="true"></i><span class="label">YouTube</span>
</a>
</li>
{% elsif author.youtube %}
<li>
<a href="https://www.youtube.com/user/{{ author.youtube }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-youtube" aria-hidden="true"></i><span class="label">YouTube</span>
</a>
</li>
{% endif %}
{% endif %}
{% if author.soundcloud %}
<li>
<a href="https://soundcloud.com/{{ author.soundcloud }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-soundcloud" aria-hidden="true"></i><span class="label">SoundCloud</span>
</a>
</li>
{% endif %}
{% if author.weibo %}
<li>
<a href="https://www.weibo.com/{{ author.weibo }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-weibo" aria-hidden="true"></i><span class="label">Weibo</span>
</a>
</li>
{% endif %}
{% if author.flickr %}
<li>
<a href="https://www.flickr.com/{{ author.flickr }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-flickr" aria-hidden="true"></i><span class="label">Flickr</span>
</a>
</li>
{% endif %}
{% if author.codepen %}
<li>
<a href="https://codepen.io/{{ author.codepen }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-codepen" aria-hidden="true"></i><span class="label">CodePen</span>
</a>
</li>
{% endif %}
{% if author.vine %}
<li>
<a href="https://vine.co/u/{{ author.vine }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
<i class="fab fa-fw fa-vine" aria-hidden="true"></i><span class="label">{{ ui-text[site.locale].email_label | default: "Email" }}</span>
</a>
</li>
{% endif %}
{% include author-profile-custom-links.html %}
</ul>
</div>
</div>

View File

@ -0,0 +1,39 @@
{% case site.category_archive.type %}
{% when "liquid" %}
{% assign path_type = "#" %}
{% when "jekyll-archives" %}
{% assign path_type = nil %}
{% endcase %}
{% if page.collection != 'posts' %}
{% assign path_type = nil %}
{% assign crumb_path = '/' %}
{% else %}
{% assign crumb_path = site.category_archive.path %}
{% endif %}
<nav class="breadcrumbs">
<ol itemscope itemtype="https://schema.org/BreadcrumbList">
{% assign crumbs = page.url | split: '/' %}
{% assign i = 1 %}
{% for crumb in crumbs offset: 1 %}
{% if forloop.first %}
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href="{{ site.url }}{{ site.baseurl }}/" itemprop="item"><span itemprop="name">{{ ui-text[site.locale].breadcrumb_home_label | default: "Home" }}</span></a>
<meta itemprop="position" content="{{ i }}" />
</li>
<span class="sep">{{ ui-text[site.locale].breadcrumb_separator | default: "/" }}</span>
{% endif %}
{% if forloop.last %}
<li class="current">{{ page.title }}</li>
{% else %}
{% assign i = i | plus: 1 %}
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href="{{ crumb | downcase | replace: '%20', '-' | prepend: path_type | prepend: crumb_path | relative_url }}" itemprop="item"><span itemprop="name">{{ crumb | replace: '-', ' ' | replace: '%20', ' ' | capitalize }}</span></a>
<meta itemprop="position" content="{{ i }}" />
</li>
<span class="sep">{{ ui-text[site.locale].breadcrumb_separator | default: "/" }}</span>
{% endif %}
{% endfor %}
</ol>
</nav>

View File

@ -0,0 +1,3 @@
<!--[if lt IE 9]>
<div class="notice--danger align-center" style="margin: 0;">You are using an <strong>outdated</strong> browser. Please <a href="https://browsehappy.com/">upgrade your browser</a> to improve your experience.</div>
<![endif]-->

View File

@ -0,0 +1,19 @@
{% case site.category_archive.type %}
{% when "liquid" %}
{% assign path_type = "#" %}
{% when "jekyll-archives" %}
{% assign path_type = nil %}
{% endcase %}
{% if site.category_archive.path %}
{% assign categories_sorted = page.categories | sort_natural %}
<p class="page__taxonomy">
<strong><i class="fas fa-fw fa-folder-open" aria-hidden="true"></i> {{ ui-text[site.locale].categories_label | default: "Categories:" }} </strong>
<span itemprop="keywords">
{% for category_word in categories_sorted %}
<a href="{{ category_word | slugify | prepend: path_type | prepend: site.category_archive.path | relative_url }}" class="page__taxonomy-item" rel="tag">{{ category_word }}</a>{% unless forloop.last %}<span class="sep">, </span>{% endunless %}
{% endfor %}
</span>
</p>
{% endif %}

View File

@ -0,0 +1,3 @@
<!-- start custom comments snippet -->
<!-- end custom comments snippet -->

View File

@ -0,0 +1,3 @@
<!-- start custom comments scripts -->
<!-- end custom comments scripts -->

View File

@ -0,0 +1,13 @@
{% if site.comments.discourse.server %}
{% capture canonical %}{% if site.permalink contains '.html' %}{{ page.url | absolute_url }}{% else %}{{ page.url | absolute_url | remove:'index.html' | strip_slash }}{% endif %}{% endcapture %}
<script type="text/javascript">
DiscourseEmbed = { discourseUrl: '//{{ site.comments.discourse.server }}/',
discourseEmbedUrl: '{{ canonical }}' };
(function () {
var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
})();
</script>
<noscript>Please enable JavaScript to view the comments powered by <a href="https://www.discourse.org/">Discourse.</a></noscript>
{% endif %}

View File

@ -0,0 +1,15 @@
{% if site.comments.disqus.shortname %}
<script>
var disqus_config = function () {
this.page.url = "{{ page.url | absolute_url }}"; /* Replace PAGE_URL with your page's canonical URL variable */
this.page.identifier = "{{ page.id }}"; /* Replace PAGE_IDENTIFIER with your page's unique identifier variable */
};
(function() { /* DON'T EDIT BELOW THIS LINE */
var d = document, s = d.createElement('script');
s.src = 'https://{{ site.comments.disqus.shortname }}.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
{% endif %}

View File

@ -0,0 +1,8 @@
<div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.5{% if site.comments.facebook.appid %}&appId={{ site.comments.facebook.appid }}{% endif %}";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

View File

@ -0,0 +1,24 @@
<script>
'use strict';
(function () {
var commentContainer = document.querySelector('#giscus-comments');
if (!commentContainer) {
return;
}
var script = document.createElement('script');
script.setAttribute('src', 'https://giscus.app/client.js');
script.setAttribute('data-repo', '{{ site.repository | downcase }}');
script.setAttribute('data-repo-id', '{{ site.comments.giscus.repo_id }}');
script.setAttribute('data-category', '{{ site.comments.giscus.category_name }}');
script.setAttribute('data-category-id', '{{ site.comments.giscus.category_id }}');
script.setAttribute('data-mapping', '{{ site.comments.giscus.discussion_term | default: "pathname" }}');
script.setAttribute('data-reactions-enabled', '{{ site.comments.giscus.reactions_enabled | default: 1 }}');
script.setAttribute('data-theme', '{{ site.comments.giscus.theme | default: "light" }}');
script.setAttribute('crossorigin', 'anonymous');
commentContainer.appendChild(script);
})();
</script>

View File

@ -0,0 +1,20 @@
{% if site.comments.provider and comments or site.defaults.posts.comments %}
{% case site.comments.provider %}
{% when "disqus" %}
{% include comments-providers/disqus.html %}
{% when "discourse" %}
{% include comments-providers/discourse.html %}
{% when "facebook" %}
{% include comments-providers/facebook.html %}
{% when "staticman" %}
{% include comments-providers/staticman.html %}
{% when "staticman_v2" %}
{% include comments-providers/staticman_v2.html %}
{% when "utterances" %}
{% include comments-providers/utterances.html %}
{% when "giscus" %}
{% include comments-providers/giscus.html %}
{% when "custom" %}
{% include comments-providers/custom_scripts.html %}
{% endcase %}
{% endif %}

View File

@ -0,0 +1,40 @@
{% if site.repository and site.staticman.branch %}
<script>
(function ($) {
$('#new_comment').submit(function () {
var form = this;
$(form).addClass('disabled');
$('#comment-form-submit').html('<i class="fas fa-spinner fa-spin fa-fw"></i> {{ ui-text[site.locale].loading_label | default: "Loading..." }}');
$.ajax({
type: $(this).attr('method'),
url: $(this).attr('action'),
data: $(this).serialize(),
contentType: 'application/x-www-form-urlencoded',
success: function (data) {
$('#comment-form-submit').html('{{ ui-text[site.locale].comment_btn_submitted | default: "Submitted" }}');
$('.page__comments-form .js-notice').removeClass('notice--danger');
$('.page__comments-form .js-notice').addClass('notice--success');
showAlert('{{ ui-text[site.locale].comment_success_msg | default: "Thanks for your comment! It will show on the site once it has been approved." }}');
},
error: function (err) {
console.log(err);
$('#comment-form-submit').html('{{ ui-text[site.locale].comment_btn_submit | default: "Submit Comment" }}');
$('.page__comments-form .js-notice').removeClass('notice--success');
$('.page__comments-form .js-notice').addClass('notice--danger');
showAlert('{{ ui-text[site.locale].comment_error_msg | default: "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again." }}');
$(form).removeClass('disabled');
}
});
return false;
});
function showAlert(message) {
$('.page__comments-form .js-notice').removeClass('hidden');
$('.page__comments-form .js-notice-text').html(message);
}
})(jQuery);
</script>
{% endif %}

View File

@ -0,0 +1,40 @@
{% if site.repository and site.comments.staticman.branch %}
<script>
(function ($) {
$('#new_comment').submit(function () {
var form = this;
$(form).addClass('disabled');
$('#comment-form-submit').html('<i class="fas fa-spinner fa-spin fa-fw"></i> {{ ui-text[site.locale].loading_label | default: "Loading..." }}');
$.ajax({
type: $(this).attr('method'),
url: $(this).attr('action'),
data: $(this).serialize(),
contentType: 'application/x-www-form-urlencoded',
success: function (data) {
$('#comment-form-submit').html('{{ ui-text[site.locale].comment_btn_submitted | default: "Submitted" }}');
$('.page__comments-form .js-notice').removeClass('notice--danger');
$('.page__comments-form .js-notice').addClass('notice--success');
showAlert('{{ ui-text[site.locale].comment_success_msg | default: "Thanks for your comment! It will show on the site once it has been approved." }}');
},
error: function (err) {
console.log(err);
$('#comment-form-submit').html('{{ ui-text[site.locale].comment_btn_submit | default: "Submit Comment" }}');
$('.page__comments-form .js-notice').removeClass('notice--success');
$('.page__comments-form .js-notice').addClass('notice--danger');
showAlert('{{ ui-text[site.locale].comment_error_msg | default: "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again." }}');
$(form).removeClass('disabled');
}
});
return false;
});
function showAlert(message) {
$('.page__comments-form .js-notice').removeClass('hidden');
$('.page__comments-form .js-notice-text').html(message);
}
})(jQuery);
</script>
{% endif %}

View File

@ -0,0 +1,20 @@
<script>
'use strict';
(function() {
var commentContainer = document.querySelector('#utterances-comments');
if (!commentContainer) {
return;
}
var script = document.createElement('script');
script.setAttribute('src', 'https://utteranc.es/client.js');
script.setAttribute('repo', '{{ site.repository }}');
script.setAttribute('issue-term', '{{ site.comments.utterances.issue_term | default: "pathname" }}');
script.setAttribute('theme', '{{ site.comments.utterances.theme | default: "github-light" }}');
script.setAttribute('crossorigin', 'anonymous');
commentContainer.appendChild(script);
})();
</script>

162
src/_includes/comments.html Normal file
View File

@ -0,0 +1,162 @@
<div class="page__comments">
{% capture comments_label %}{{ ui-text[site.locale].comments_label | default: "Comments" }}{% endcapture %}
{% case site.comments.provider %}
{% when "discourse" %}
<h4 class="page__comments-title">{{ comments_label }}</h4>
<section id="discourse-comments"></section>
{% when "disqus" %}
<h4 class="page__comments-title">{{ comments_label }}</h4>
<section id="disqus_thread"></section>
{% when "facebook" %}
<h4 class="page__comments-title">{{ comments_label }}</h4>
<section class="fb-comments" data-href="{{ page.url | absolute_url }}" data-mobile="true" data-num-posts="{{ site.comments.facebook.num_posts | default: 5 }}" data-width="100%" data-colorscheme="{{ site.comments.facebook.colorscheme | default: 'light' }}"></section>
{% when "staticman_v2" %}
<section id="static-comments">
{% if site.repository and site.comments.staticman.branch %}
<!-- Start static comments -->
<div class="js-comments">
{% if site.data.comments[page.slug] %}
<h4 class="page__comments-title">{{ ui-text[site.locale].comments_title | default: "Comments" }}</h4>
{% assign comments = site.data.comments[page.slug] | sort %}
{% for comment in comments %}
{% assign email = comment[1].email %}
{% assign name = comment[1].name %}
{% assign url = comment[1].url %}
{% assign date = comment[1].date %}
{% assign message = comment[1].message %}
{% include comment.html index=forloop.index email=email name=name url=url date=date message=message %}
{% endfor %}
{% endif %}
</div>
<!-- End static comments -->
<!-- Start new comment form -->
<div class="page__comments-form">
<h4 class="page__comments-title">{{ ui-text[site.locale].comments_label | default: "Leave a Comment" }}</h4>
<p class="small">{{ ui-text[site.locale].comment_form_info | default: "Your email address will not be published. Required fields are marked" }} <span class="required">*</span></p>
<form id="new_comment" class="page__comments-form js-form form" method="post" action="{{ site.comments.staticman.endpoint }}{{ site.repository }}/{{ site.comments.staticman.branch }}/comments">
<div class="form__spinner">
<i class="fas fa-spinner fa-spin fa-3x fa-fw"></i>
<span class="sr-only">{{ ui-text[site.locale].loading_label | default: "Loading..." }}</span>
</div>
<div class="form-group">
<label for="comment-form-message">{{ ui-text[site.locale].comment_form_comment_label | default: "Comment" }} <small class="required">*</small></label>
<textarea type="text" rows="3" id="comment-form-message" name="fields[message]" tabindex="1"></textarea>
<div class="small help-block"><a href="https://daringfireball.net/projects/markdown/">{{ ui-text[site.locale].comment_form_md_info | default: "Markdown is supported." }}</a></div>
</div>
<div class="form-group">
<label for="comment-form-name">{{ ui-text[site.locale].comment_form_name_label | default: "Name" }} <small class="required">*</small></label>
<input type="text" id="comment-form-name" name="fields[name]" tabindex="2" />
</div>
<div class="form-group">
<label for="comment-form-email">{{ ui-text[site.locale].comment_form_email_label | default: "Email address" }} <small class="required">*</small></label>
<input type="email" id="comment-form-email" name="fields[email]" tabindex="3" />
</div>
<div class="form-group">
<label for="comment-form-url">{{ ui-text[site.locale].comment_form_website_label | default: "Website (optional)" }}</label>
<input type="url" id="comment-form-url" name="fields[url]" tabindex="4"/>
</div>
<div class="form-group hidden" style="display: none;">
<input type="hidden" name="options[slug]" value="{{ page.slug }}">
<label for="comment-form-location">Not used. Leave blank if you are a human.</label>
<input type="text" id="comment-form-location" name="fields[hidden]" autocomplete="off"/>
{% if site.reCaptcha.siteKey %}<input type="hidden" name="options[reCaptcha][siteKey]" value="{{ site.reCaptcha.siteKey }}">{% endif %}
{% if site.reCaptcha.secret %}<input type="hidden" name="options[reCaptcha][secret]" value="{{ site.reCaptcha.secret }}">{% endif %}
</div>
<!-- Start comment form alert messaging -->
<p class="hidden js-notice">
<strong class="js-notice-text"></strong>
</p>
<!-- End comment form alert messaging -->
{% if site.reCaptcha.siteKey %}
<div class="form-group">
<div class="g-recaptcha" data-sitekey="{{ site.reCaptcha.siteKey }}"></div>
</div>
{% endif %}
<div class="form-group">
<button type="submit" id="comment-form-submit" tabindex="5" class="btn btn--primary btn--large">{{ ui-text[site.locale].comment_btn_submit | default: "Submit Comment" }}</button>
</div>
</form>
</div>
<!-- End new comment form -->
{% if site.reCaptcha.siteKey %}<script async src="https://www.google.com/recaptcha/api.js"></script>{% endif %}
{% endif %}
</section>
{% when "staticman" %}
<section id="static-comments">
{% if site.repository and site.staticman.branch %}
<!-- Start static comments -->
<div class="js-comments">
{% if site.data.comments[page.slug] %}
<h4 class="page__comments-title">{{ ui-text[site.locale].comments_title | default: "Comments" }}</h4>
{% assign comments = site.data.comments[page.slug] | sort %}
{% for comment in comments %}
{% assign email = comment[1].email %}
{% assign name = comment[1].name %}
{% assign url = comment[1].url %}
{% assign date = comment[1].date %}
{% assign message = comment[1].message %}
{% include comment.html index=forloop.index email=email name=name url=url date=date message=message %}
{% endfor %}
{% endif %}
</div>
<!-- End static comments -->
<!-- Start new comment form -->
<div class="page__comments-form">
<h4 class="page__comments-title">{{ ui-text[site.locale].comments_label | default: "Leave a Comment" }}</h4>
<p class="small">{{ ui-text[site.locale].comment_form_info | default: "Your email address will not be published. Required fields are marked" }} <span class="required">*</span></p>
<form id="new_comment" class="page__comments-form js-form form" method="post" action="https://api.staticman.net/v1/entry/{{ site.repository }}/{{ site.staticman.branch }}">
<div class="form__spinner">
<i class="fas fa-spinner fa-spin fa-3x fa-fw"></i>
<span class="sr-only">{{ ui-text[site.locale].loading_label | default: "Loading..." }}</span>
</div>
<div class="form-group">
<label for="comment-form-message">{{ ui-text[site.locale].comment_form_comment_label | default: "Comment" }} <small class="required">*</small></label>
<textarea type="text" rows="3" id="comment-form-message" name="fields[message]" tabindex="1"></textarea>
<div class="small help-block"><a href="https://daringfireball.net/projects/markdown/">{{ ui-text[site.locale].comment_form_md_info | default: "Markdown is supported." }}</a></div>
</div>
<div class="form-group">
<label for="comment-form-name">{{ ui-text[site.locale].comment_form_name_label | default: "Name" }} <small class="required">*</small></label>
<input type="text" id="comment-form-name" name="fields[name]" tabindex="2" />
</div>
<div class="form-group">
<label for="comment-form-email">{{ ui-text[site.locale].comment_form_email_label | default: "Email address" }} <small class="required">*</small></label>
<input type="email" id="comment-form-email" name="fields[email]" tabindex="3" />
</div>
<div class="form-group">
<label for="comment-form-url">{{ ui-text[site.locale].comment_form_website_label | default: "Website (optional)" }}</label>
<input type="url" id="comment-form-url" name="fields[url]" tabindex="4"/>
</div>
<div class="form-group hidden" style="display: none;">
<input type="hidden" name="options[slug]" value="{{ page.slug }}">
<label for="comment-form-location">Not used. Leave blank if you are a human.</label>
<input type="text" id="comment-form-location" name="fields[hidden]" autocomplete="off"/>
</div>
<!-- Start comment form alert messaging -->
<p class="hidden js-notice">
<strong class="js-notice-text"></strong>
</p>
<!-- End comment form alert messaging -->
<div class="form-group">
<button type="submit" id="comment-form-submit" tabindex="5" class="btn btn--primary btn--large">{{ ui-text[site.locale].comment_btn_submit | default: "Submit Comment" }}</button>
</div>
</form>
</div>
<!-- End new comment form -->
{% endif %}
</section>
{% when "utterances" %}
<h4 class="page__comments-title">{{ comments_label }}</h4>
<section id="utterances-comments"></section>
{% when "giscus" %}
<h4 class="page__comments-title">{{ comments_label }}</h4>
<section id="giscus-comments"></section>
{% when "custom" %}
{% include /comments-providers/custom.html %}
{% endcase %}
</div>

View File

@ -0,0 +1,15 @@
{% assign entries = site[include.collection] %}
{% if include.sort_by %}
{% assign entries = entries | sort: include.sort_by %}
{% endif %}
{% if include.sort_order == 'reverse' %}
{% assign entries = entries | reverse %}
{% endif %}
{%- for post in entries -%}
{%- unless post.hidden -%}
{% include archive-single.html %}
{%- endunless -%}
{%- endfor -%}

View File

@ -0,0 +1,41 @@
{% if include.id %}
{% assign feature_row = page[include.id] %}
{% else %}
{% assign feature_row = page.feature_row %}
{% endif %}
<div class="feature__wrapper">
{% for f in feature_row %}
<div class="feature__item{% if include.type %}--{{ include.type }}{% endif %}">
<div class="archive__item">
{% if f.image_path %}
<div class="archive__item-teaser">
<img src="{{ f.image_path | relative_url }}"
alt="{% if f.alt %}{{ f.alt }}{% endif %}">
{% if f.image_caption %}
<span class="archive__item-caption">{{ f.image_caption | markdownify | remove: "<p>" | remove: "</p>" }}</span>
{% endif %}
</div>
{% endif %}
<div class="archive__item-body">
{% if f.title %}
<h2 class="archive__item-title">{{ f.title }}</h2>
{% endif %}
{% if f.excerpt %}
<div class="archive__item-excerpt">
{{ f.excerpt | markdownify }}
</div>
{% endif %}
{% if f.url %}
<p><a href="{{ f.url | relative_url }}" class="btn {{ f.btn_class }}">{{ f.btn_label | default: ui-text[site.locale].more_label | default: "Learn More" }}</a></p>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>

View File

@ -0,0 +1,9 @@
<figure class="{{ include.class }}">
<img src="{{ include.image_path | relative_url }}"
alt="{% if include.alt %}{{ include.alt }}{% endif %}">
{%- if include.caption -%}
<figcaption>
{{ include.caption | markdownify | remove: "<p>" | remove: "</p>" }}
</figcaption>
{%- endif -%}
</figure>

26
src/_includes/footer.html Normal file
View File

@ -0,0 +1,26 @@
<div class="page__footer-follow">
<ul class="social-icons">
{% if ui-text[site.locale].follow_label %}
<li><strong>{{ ui-text[site.locale].follow_label }}</strong></li>
{% endif %}
{% unless site.atom_feed.hide %}
<li>
<a href="{% if site.atom_feed.path %}{{ site.atom_feed.path }}{% else %}{{ '/feed.xml' | relative_url }}{% endif %}">
<i class="fas fa-fw fa-rss-square" aria-hidden="true"></i>
{{ ui-text[site.locale].feed_label | default: "Feed" }}
</a>
</li>
{% endunless %}
{% if site.footer.links %}
{% for link in site.footer.links %}
{% if link.label and link.url %}
<li><a href="{{ link.url }}" rel="nofollow noopener noreferrer"><i class="{{ link.icon | default: 'fas fa-link' }}" aria-hidden="true"></i> {{ link.label }}</a></li>
{% endif %}
{% endfor %}
{% endif %}
</ul>
</div>
<div class="page__footer-copyright">&copy; 2019 - {{ site.time | date: 'Y' }} {{ site.name | default: site.title }}. {{ ui-text[site.locale].powered_by | default: "Powered by" }} <a href="https://11ty.dev" rel="nofollow">Elevety / 11ty</a> &amp; <a href="https://mademistakes.com/work/minimal-mistakes-jekyll-theme/" rel="nofollow">Minimal Mistakes</a>.</div>

View File

@ -0,0 +1,7 @@
<!-- start custom footer snippets -->
<button id='scroll-to-top'></button>
<a rel="me" href="https://social.tarasis.net/@tarasis">For Mastodon verification</a>
<link href="https://github.com/tarasis" rel="me">
<link href="https://social.tarasis.net/@tarasis" rel="me">
<!-- end custom footer snippets -->

View File

@ -0,0 +1,35 @@
{% if include.id %}
{% assign gallery = page[include.id] %}
{% else %}
{% assign gallery = page.gallery %}
{% endif %}
{% if include.layout %}
{% assign gallery_layout = include.layout %}
{% else %}
{% if gallery.size == 2 %}
{% assign gallery_layout = 'half' %}
{% elsif gallery.size >= 3 %}
{% assign gallery_layout = 'third' %}
{% else %}
{% assign gallery_layout = '' %}
{% endif %}
{% endif %}
<figure class="{{ gallery_layout }} {{ include.class }}">
{% for img in gallery %}
{% if img.url %}
<a href="{{ img.url | relative_url }}"
{% if img.title %}title="{{ img.title }}"{% endif %}>
<img src="{{ img.image_path | relative_url }}"
alt="{% if img.alt %}{{ img.alt }}{% endif %}">
</a>
{% else %}
<img src="{{ img.image_path | relative_url }}"
alt="{% if img.alt %}{{ img.alt }}{% endif %}">
{% endif %}
{% endfor %}
{% if include.caption %}
<figcaption>{{ include.caption | markdownify | remove: "<p>" | remove: "</p>" }}</figcaption>
{% endif %}
</figure>

View File

@ -0,0 +1,47 @@
<!--
# Jekyll Group-By-Array 0.1.0
# https://github.com/mushishi78/jekyll-group-by-array
# © 2015 Max White <mushishi78@gmail.com>
# MIT License
-->
<!-- Initialize -->
{% assign __empty_array = '' | split: ',' %}
{% assign group_names = __empty_array %}
{% assign group_items = __empty_array %}
<!-- Map -->
{% assign __names = include.collection | map: include.field %}
<!-- Flatten -->
{% assign __names = __names | join: ',' | join: ',' | split: ',' %}
<!-- Uniq -->
{% assign __names = __names | sort %}
{% for name in __names %}
<!-- If not equal to previous then it must be unique as sorted -->
{% unless name == previous %}
<!-- Push to group_names -->
{% assign group_names = group_names | push: name %}
{% endunless %}
{% assign previous = name %}
{% endfor %}
<!-- group_items -->
{% for name in group_names %}
<!-- Collect if contains -->
{% assign __item = __empty_array %}
{% for __element in include.collection %}
{% if __element[include.field] contains name %}
{% assign __item = __item | push: __element %}
{% endif %}
{% endfor %}
<!-- Push to group_items -->
{% assign group_items = group_items | push: __item %}
{% endfor %}

28
src/_includes/head.html Normal file
View File

@ -0,0 +1,28 @@
<meta charset="utf-8">
{% include seo.html %}
{% unless site.atom_feed.hide %}
<link href="{% if site.atom_feed.path %}{{ site.atom_feed.path }}{% else %}{{ '/feed.xml' | relative_url }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ site.title }} Feed">
{% endunless %}
<!-- https://t.co/dKP3o1e -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script>
document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/g, '') + ' js ';
</script>
<!-- For all browsers -->
<link rel="stylesheet" href="{{ '/assets/css/main.css' | relative_url }}">
<!-- <link href="https://unpkg.com/prismjs@1.20.0/themes/prism-okaidia.css" rel="stylesheet"> -->
<link rel="stylesheet" href="/assets/css/colddark-theme.css">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5/css/all.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5/css/all.min.css"></noscript>
{% if site.head_scripts %}
{% for script in site.head_scripts %}
<script src="{{ script | relative_url }}"></script>
{% endfor %}
{% endif %}

View File

@ -0,0 +1,3 @@
<!-- start custom header snippets -->
<div id="progress-bar"></div>
<!-- end custom header snippets -->

View File

@ -0,0 +1,29 @@
---
layout: default
author_profile: false
---
{% if header.overlay_color or header.overlay_image or header.image %}
{% include page__hero.html %}
{% elsif header.video.id and header.video.provider %}
{% include page__hero_video.html %}
{% endif %}
{% if url != "/" and site.breadcrumbs %}
{% unless paginator %}
{% include breadcrumbs.html %}
{% endunless %}
{% endif %}
<div id="main" role="main">
{% include sidebar.html %}
<div class="archive">
{% unless header.overlay_color or header.overlay_image %}
<h1 id="page-title" class="page__title">{{ title }}</h1>
{% endunless %}
{% for post in posts %}
{% include archive-single.html %}
{% endfor %}
</div>
</div>

View File

@ -0,0 +1,26 @@
---
layout: default
---
{% if header.overlay_color or header.overlay_image or header.image %}
{% include page__hero.html %}
{% elsif header.video.id and header.video.provider %}
{% include page__hero_video.html %}
{% endif %}
{% if page.url != "/" and site.breadcrumbs %}
{% unless paginator %}
{% include breadcrumbs.html %}
{% endunless %}
{% endif %}
<div id="main" role="main">
{% include sidebar.html %}
<div class="archive">
{% unless header.overlay_color or header.overlay_image %}
<h1 id="page-title" class="page__title">{{ title }}</h1>
{% endunless %}
{{ content }}
</div>
</div>

View File

@ -0,0 +1,41 @@
---
layout: archive
---
{% assign categories_max = 0 %}
{% for category in collections.categories %}
{% if collections[category].size > categories_max %}
{% assign categories_max = collections[category].size %}
{% endif %}
{% endfor %}
<ul class="taxonomy__index">
{% for i in (1..categories_max) reversed %}
{% for category in collections.categories %}
{% if collections[category].size == i %}
<li>
<a href="#{{ category | slugify }}">
<strong>{{ category }}</strong> <span class="taxonomy__count">{{ i }}</span>
</a>
</li>
{% endif %}
{% endfor %}
{% endfor %}
</ul>
{% assign entries_layout = entries_layout | default: 'list' %}
{% for i in (1..categories_max) reversed %}
{% for category in collections.categories %}
{% if collections[category].size == i %}
<section id="{{ category | slugify | downcase }}" class="taxonomy__section">
<h2 class="archive__subtitle">{{ category }}</h2>
<div class="entries-{{ entries_layout }}">
{% for post in collections[category] %}
{% include archive-single.html type=entries_layout aPost=post%}
{% endfor %}
</div>
<a href="#page-title" class="back-to-top">{{ ui-text[site.locale].back_to_top | default: 'Back to Top' }} &uarr;</a>
</section>
{% endif %}
{% endfor %}
{% endfor %}

View File

@ -0,0 +1,10 @@
---
layout: archive
---
{{ content }}
{% assign entries_layout = page.entries_layout | default: 'list' %}
<div class="entries-{{ entries_layout }}">
{% include posts-category.html taxonomy=page.taxonomy type=entries_layout %}
</div>

View File

@ -0,0 +1,10 @@
---
layout: archive
---
{{ content }}
{% assign entries_layout = page.entries_layout | default: 'list' %}
<div class="entries-{{ entries_layout }}">
{% include documents-collection.html collection=page.collection sort_by=page.sort_by sort_order=page.sort_order type=entries_layout %}
</div>

View File

@ -0,0 +1,10 @@
---
# Jekyll layout that compresses HTML
# v3.1.0
# http://jch.penibelst.de/
# © 20142015 Anatol Broder
# MIT License
---
{% capture _LINE_FEED %}
{% endcapture %}{% if site.compress_html.ignore.envs contains jekyll.environment or site.compress_html.ignore.envs == "all" %}{{ content }}{% else %}{% capture _content %}{{ content }}{% endcapture %}{% assign _profile = site.compress_html.profile %}{% if site.compress_html.endings == "all" %}{% assign _endings = "html head body li dt dd optgroup option colgroup caption thead tbody tfoot tr td th" | split: " " %}{% else %}{% assign _endings = site.compress_html.endings %}{% endif %}{% for _element in _endings %}{% capture _end %}</{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _end %}{% endfor %}{% if _profile and _endings %}{% assign _profile_endings = _content | size | plus: 1 %}{% endif %}{% for _element in site.compress_html.startings %}{% capture _start %}<{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _start %}{% endfor %}{% if _profile and site.compress_html.startings %}{% assign _profile_startings = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.comments == "all" %}{% assign _comments = "<!-- -->" | split: " " %}{% else %}{% assign _comments = site.compress_html.comments %}{% endif %}{% if _comments.size == 2 %}{% capture _comment_befores %}.{{ _content }}{% endcapture %}{% assign _comment_befores = _comment_befores | split: _comments.first %}{% for _comment_before in _comment_befores %}{% if forloop.first %}{% continue %}{% endif %}{% capture _comment_outside %}{% if _carry %}{{ _comments.first }}{% endif %}{{ _comment_before }}{% endcapture %}{% capture _comment %}{% unless _carry %}{{ _comments.first }}{% endunless %}{{ _comment_outside | split: _comments.last | first }}{% if _comment_outside contains _comments.last %}{{ _comments.last }}{% assign _carry = false %}{% else %}{% assign _carry = true %}{% endif %}{% endcapture %}{% assign _content = _content | remove_first: _comment %}{% endfor %}{% if _profile %}{% assign _profile_comments = _content | size | plus: 1 %}{% endif %}{% endif %}{% assign _pre_befores = _content | split: "<pre" %}{% assign _content = "" %}{% for _pre_before in _pre_befores %}{% assign _pres = _pre_before | split: "</pre>" %}{% assign _pres_after = "" %}{% if _pres.size != 0 %}{% if site.compress_html.blanklines %}{% assign _lines = _pres.last | split: _LINE_FEED %}{% capture _pres_after %}{% for _line in _lines %}{% assign _trimmed = _line | split: " " | join: " " %}{% if _trimmed != empty or forloop.last %}{% unless forloop.first %}{{ _LINE_FEED }}{% endunless %}{{ _line }}{% endif %}{% endfor %}{% endcapture %}{% else %}{% assign _pres_after = _pres.last | split: " " | join: " " %}{% endif %}{% endif %}{% capture _content %}{{ _content }}{% if _pre_before contains "</pre>" %}<pre{{ _pres.first }}</pre>{% endif %}{% unless _pre_before contains "</pre>" and _pres.size == 1 %}{{ _pres_after }}{% endunless %}{% endcapture %}{% endfor %}{% if _profile %}{% assign _profile_collapse = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.clippings == "all" %}{% assign _clippings = "html head title base link meta style body article section nav aside h1 h2 h3 h4 h5 h6 hgroup header footer address p hr blockquote ol ul li dl dt dd figure figcaption main div table caption colgroup col tbody thead tfoot tr td th" | split: " " %}{% else %}{% assign _clippings = site.compress_html.clippings %}{% endif %}{% for _element in _clippings %}{% assign _edges = " <e;<e; </e>;</e>;</e> ;</e>" | replace: "e", _element | split: ";" %}{% assign _content = _content | replace: _edges[0], _edges[1] | replace: _edges[2], _edges[3] | replace: _edges[4], _edges[5] %}{% endfor %}{% if _profile and _clippings %}{% assign _profile_clippings = _content | size | plus: 1 %}{% endif %}{{ _content }}{% if _profile %} <table id="compress_html_profile_{{ site.time | date: "%Y%m%d" }}" class="compress_html_profile"> <thead> <tr> <td>Step <td>Bytes <tbody> <tr> <td>raw <td>{{ content | size }}{% if _profile_endings %} <tr> <td>endings <td>{{ _profile_endings }}{% endif %}{% if _profile_startings %} <tr> <td>startings <td>{{ _profile_startings }}{% endif %}{% if _profile_comments %} <tr> <td>comments <td>{{ _profile_comments }}{% endif %}{% if _profile_collapse %} <tr> <td>collapse <td>{{ _profile_collapse }}{% endif %}{% if _profile_clippings %} <tr> <td>clippings <td>{{ _profile_clippings }}{% endif %} </table>{% endif %}{% endif %}

View File

@ -0,0 +1,39 @@
---
---
<!doctype html>
<!--
Minimal Mistakes Jekyll Theme 4.24.0 by Michael Rose
Copyright 2013-2020 Michael Rose - mademistakes.com | @mmistakes
Free for personal and commercial use under the MIT license
https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE
-->
<html lang="{{ site.locale | slice: 0,2 | default: "en" }}" class="no-js">
<head>
{% include head.html %}
{% include head/custom.html %}
</head>
<body class="layout--{{ layout | default: site.defaults.posts.layout }}{% if classes or site.defaults.posts.classes %}{{ classes | default: site.defaults.posts.classes | join: ' ' | prepend: ' ' }}{% endif %}">
{% include skip-links.html %}
{% include browser-upgrade.html %}
{% include masthead.html %}
<div class="initial-content">
{{ content }}
</div>
{% if site.search == true %}
<div class="search-content">
{% include search/search_form.html %}
</div>
{% endif %}
<div id="footer" class="page__footer">
<footer>
{% include footer/custom.html %}
{% include footer.html %}
</footer>
</div>
</body>
</html>

View File

@ -0,0 +1,11 @@
---
layout: archive
---
TEST
{{collections.drafts.size}}
{% for post in collections.drafts %}
{% include archive-single.html type=entries_layout, aPost=post %}
{% endfor %}

View File

@ -0,0 +1,25 @@
---
layout: archive
paginator:
data: collections.posts
size: 2
---
<h3 class="archive__subtitle">{{ ui-text[site.locale].recent_posts | default: "Recent Posts" }}</h3>
{% if paginator %}
{% assign posts = collections.posts %}
{% else %}
{% assign posts = site.posts %}
{% endif %}
{% assign entries_layout = page.entries_layout | default: 'list' %}
<div class="entries-{{ entries_layout }}">
{% for post in posts %}
{% include archive-single.html type=entries_layout aPost=post %}
{% endfor %}
</div>
{% include paginator.html %}

View File

@ -0,0 +1,21 @@
{% if paginationNextUrl or paginationPrevUrl %}
<hr />
<div class="inner-wrapper">
<footer class="[ pagination ] [ pad-bottom-900 ]">
<nav class="[ pagination__nav ] [ box-flex space-between align-center ]">
{% if paginationPrevUrl %}
<a href="{{ paginationPrevUrl }}" class="{{ paginationLinkTokens }}" data-direction="backwards">
<span>{{ paginationPrevText if paginationPrevText else 'Previous' }}</span>
{% include "icons/arrow.svg" %}
</a>
{% endif %}
{% if paginationNextUrl %}
<a href="{{ paginationNextUrl }}" class="{{ paginationLinkTokens }}" data-direction="forwards">
<span>{{ paginationNextText if paginationNextText else 'Next' }}</span>
{% include "icons/arrow.svg" %}
</a>
{% endif %}
</nav>
</footer>
</div>
{% endif %}

View File

@ -0,0 +1,36 @@
---
layout: archive
---
{{ content }}
{% assign sortedPosts = collections.posts | group_by: "date" %}
{{ sortedPosts | inspect }}
{% comment %}
<ul class="taxonomy__index">
{% assign postsInYear = site.posts | where_exp: "item", "item.hidden != true" | group_by_exp: 'post', 'post.date | date: "%Y"' %}
{% for year in postsInYear %}
<li>
<a href="#{{ year.name }}">
<strong>{{ year.name }}</strong> <span class="taxonomy__count">{{ year.items | size }}</span>
</a>
</li>
{% endfor %}
</ul>
{% assign entries_layout = page.entries_layout | default: 'list' %}
{% assign postsByYear = site.posts | where_exp: "item", "item.hidden != true" | group_by_exp: 'post', 'post.date | date: "%Y"' %}
{% for year in postsByYear %}
<section id="{{ year.name }}" class="taxonomy__section">
<h2 class="archive__subtitle">{{ year.name }}</h2>
<div class="entries-{{ entries_layout }}">
{% for post in year.items %}
{% include archive-single.html type=entries_layout %}
{% endfor %}
</div>
<a href="#page-title" class="back-to-top">{{ ui-text[site.locale].back_to_top | default: 'Back to Top' }} &uarr;</a>
</section>
{% endfor %}
{% endcomment %}

View File

@ -0,0 +1,42 @@
---
layout: default
---
{% if page.header.overlay_color or page.header.overlay_image or page.header.image %}
{% include page__hero.html %}
{% endif %}
{% if page.url != "/" and site.breadcrumbs %}
{% unless paginator %}
{% include breadcrumbs.html %}
{% endunless %}
{% endif %}
<div id="main" role="main">
{% include sidebar.html %}
<div class="archive">
{% unless page.header.overlay_color or page.header.overlay_image %}
<h1 id="page-title" class="page__title">{{ page.title }}</h1>
{% endunless %}
{{ content }}
{%- assign search_provider = site.search_provider | default: "lunr" -%}
{%- case search_provider -%}
{%- when "lunr" -%}
<input type="text" id="search" class="search-input" placeholder="{{ ui-text[site.locale].search_placeholder_text | default: 'Enter your search term...' }}" />
<div id="results" class="results"></div>
{%- when "google" -%}
<form onsubmit="return googleCustomSearchExecute();" id="cse-search-box-form-id">
<input type="text" id="cse-search-input-box-id" class="search-input" placeholder="{{ ui-text[site.locale].search_placeholder_text | default: 'Enter your search term...' }}" />
</form>
<div id="results" class="results">
<gcse:searchresults-only></gcse:searchresults-only>
</div>
{%- when "algolia" -%}
<div class="search-searchbar"></div>
<div class="search-hits"></div>
{%- endcase -%}
</div>
</div>

View File

@ -0,0 +1,105 @@
---
layout: default
---
{% if header.overlay_color or header.overlay_image or header.image %}
{% include page__hero.html %}
{% elsif header.video.id and header.video.provider %}
{% include page__hero_video.html %}
{% endif %}
{% if page.url != "/" and site.breadcrumbs %}
{% unless paginator %}
{% include breadcrumbs.html %}
{% endunless %}
{% endif %}
<div id="main" role="main">
{% include sidebar.html %}
<article class="page" itemscope itemtype="https://schema.org/CreativeWork">
{% if title %}<meta itemprop="headline" content="{{ title | markdownify | strip_html | strip_newlines | escape_once }}">{% endif %}
{% if excerpt %}<meta itemprop="description" content="{{ excerpt | markdownify | strip_html | strip_newlines | escape_once }}">{% endif %}
{% if date %}<meta itemprop="datePublished" content="{{ date | date_to_xmlschema }}">{% endif %}
{% if last_modified_at %}<meta itemprop="dateModified" content="{{ last_modified_at | date_to_xmlschema }}">{% endif %}
<div class="page__inner-wrap">
{% unless header.overlay_color or header.overlay_image %}
<header>
{% if title %}<h1 id="page-title" class="page__title" itemprop="headline">{{ title | markdownify | remove: "<p>" | remove: "</p>" }}</h1>{% endif %}
{% include page__meta.html %}
</header>
{% endunless %}
<section class="page__content" itemprop="text">
{% if toc %}
<aside class="sidebar__right {% if toc_sticky %}sticky{% endif %}">
<nav class="toc">
<header><h4 class="nav__title"><i class="fas fa-{{ page.toc_icon | default: 'file-alt' }}"></i> {{ toc_label | default: ui-text[site.locale].toc_label | default: "On this page" }}</h4></header>
{% include toc.html sanitize=true html=content h_min=1 h_max=6 class="toc__menu" %}
</nav>
</aside>
{% endif %}
{% assign Content = content %}
{% assign withoutDivStart = '<pre ' %}
{% assign withDivStart = '<div class="highlight codeblock"><pre ' %}
{% assign withoutDivEnd = '</code></pre>' %}
{% assign withDivEnd = '</code></pre></div>' %}
{% if content contains withoutDivStart %}
{% assign Content = content | replace: withoutDivStart, withDivStart %}
{% assign Content = Content | replace: withoutDivEnd, withDivEnd %}
{% endif %}
{{ Content }}
{% if page.link %}<div><a href="{{ page.link }}" class="btn btn--primary">{{ ui-text[site.locale].ext_link_label | default: "Direct Link" }}</a></div>{% endif %}
</section>
<footer class="page__meta">
{% if ui-text[site.locale].meta_label %}
<h4 class="page__meta-title">{{ ui-text[site.locale].meta_label }}</h4>
{% endif %}
{% include page__taxonomy.html %}
{% include page__date.html %}
</footer>
{% if share or site.defaults.posts.share %}{% include social-share.html %}{% endif %}
{% include post_pagination.html siblings=siblings %}
</div>
{% comment %}
{% if environment == 'production' and site.comments.provider and comments or site.defaults.post.comments %}
{% endcomment %}
{% if site.comments.provider and comments or site.defaults.posts.comments %}
{% include comments.html %}
{% include comments-providers/scripts.html %}
{% endif %}
</article>
{% comment %}<!-- only show related on a post page when `related: true` -->{% endcomment %}
{% if id and related and site.related_posts.size > 0 %}
<div class="page__related">
<h4 class="page__related-title">{{ ui-text[site.locale].related_label | default: "You May Also Enjoy" }}</h4>
<div class="grid__wrapper">
{% for post in site.related_posts limit:4 %}
{% include archive-single.html type="grid" %}
{% endfor %}
</div>
</div>
{% comment %}<!-- otherwise show recent posts if no related when `related: true` -->{% endcomment %}
{% elsif id and related %}
<div class="page__related">
<h4 class="page__related-title">{{ ui-text[site.locale].related_label | default: "You May Also Enjoy" }}</h4>
<div class="grid__wrapper">
{% for post in collections.posts limit:4 %}
{% if post.id == page.id %}
{% continue %}
{% endif %}
{% include archive-single.html type="grid" %}
{% endfor %}
</div>
</div>
{% endif %}
</div>

View File

@ -0,0 +1,22 @@
---
layout: default
---
{% if header.overlay_color or header.overlay_image or header.image %}
{% include page__hero.html %}
{% elsif header.video.id and header.video.provider %}
{% include page__hero_video.html %}
{% endif %}
<div id="main" role="main">
<article class="splash" itemscope itemtype="https://schema.org/CreativeWork">
{% if title %}<meta itemprop="headline" content="{{ title | markdownify | strip_html | strip_newlines | escape_once }}">{% endif %}
{% if page.excerpt %}<meta itemprop="description" content="{{ page.excerpt | markdownify | strip_html | strip_newlines | escape_once }}">{% endif %}
{% if page.date %}<meta itemprop="datePublished" content="{{ page.date | date_to_xmlschema }}">{% endif %}
{% if page.last_modified_at %}<meta itemprop="dateModified" content="{{ page.last_modified_at | date_to_xmlschema }}">{% endif %}
<section class="page__content" itemprop="text">
{{ content }}
</section>
</article>
</div>

View File

@ -0,0 +1,10 @@
---
layout: archive
---
{{ content }}
{% assign entries_layout = page.entries_layout | default: 'list' %}
<div class="entries-{{ entries_layout }}">
{% include posts-tag.html taxonomy=page.taxonomy type=entries_layout %}
</div>

View File

@ -0,0 +1,45 @@
---
layout: archive
---
{{ content }}
{% assign tags_max = 0 %}
{% for tag in collections.tags %}
{% if collections[tag].size > tags_max %}
{% assign tags_max = collections[tag].size %}
{% endif %}
{% endfor %}
<ul class="taxonomy__index">
{% for i in (1..tags_max) reversed %}
{% for tag in collections.tags %}
{% if collections[tag].size == i %}
<li>
<a href="#{{ tag | slugify }}">
<strong>{{ tag }}</strong> <span class="taxonomy__count">{{ i }}</span>
</a>
</li>
{% endif %}
{% endfor %}
{% endfor %}
</ul>
{% assign entries_layout = page.entries_layout | default: 'list' %}
{% for i in (1..tags_max) reversed %}
{% for tag in collections.tags %}
{% if collections[tag].size == i %}
<section id="{{ tag | slugify | downcase }}" class="taxonomy__section">
<h2 class="archive__subtitle">{{ tag }}</h2>
<div class="entries-{{ entries_layout }}">
{% for post in collections[tag] %}
{% include archive-single.html type=entries_layout, aPost=post %}
{% endfor %}
</div>
<a href="#page-title" class="back-to-top">{{ ui-text[site.locale].back_to_top | default: 'Back to Top' }} &uarr;</a>
</section>
{% endif %}
{% endfor %}
{% endfor %}

View File

@ -0,0 +1,35 @@
{% capture logo_path %}{{ site.logo }}{% endcapture %}
<div class="masthead">
<div class="masthead__inner-wrap">
<div class="masthead__menu">
<nav id="site-nav" class="greedy-nav">
{% unless logo_path == empty %}
<a class="site-logo" href="{{ '/' | relative_url }}"><img src="{{ logo_path | relative_url }}" alt="{{ site.masthead_title | default: site.title }}"></a>
{% endunless %}
<a class="site-title" href="{{ '/' | relative_url }}">
{{ site.masthead_title | default: site.title }}
{% if site.subtitle %}<span class="site-subtitle">{{ site.subtitle }}</span>{% endif %}
</a>
<ul class="visible-links">
{%- for link in navigation.main -%}
<li class="masthead__menu-item">
<a href="{{ link.url | relative_url }}"{% if link.description %} title="{{ link.description }}"{% endif %}>{{ link.title }}</a>
</li>
{%- endfor -%}
</ul>
{% if site.search == true %}
<button class="search__toggle" type="button">
<span class="visually-hidden">{{ ui-text[site.locale].search_label | default: "Toggle search" }}</span>
<i class="fas fa-search"></i>
</button>
{% endif %}
<button class="greedy-nav__toggle hidden" type="button">
<span class="visually-hidden">{{ ui-text[site.locale].menu_label | default: "Toggle menu" }}</span>
<div class="navicon"></div>
</button>
<ul class="hidden-links hidden"></ul>
</nav>
</div>
</div>
</div>

View File

@ -0,0 +1,26 @@
{% assign navigation = site.data.navigation[include.nav] %}
<nav class="nav__list">
{% if page.sidebar.title %}<h3 class="nav__title" style="padding-left: 0;">{{ page.sidebar.title }}</h3>{% endif %}
<input id="ac-toc" name="accordion-toc" type="checkbox" />
<label for="ac-toc">{{ ui-text[site.locale].menu_label | default: "Toggle Menu" }}</label>
<ul class="nav__items">
{% for nav in navigation %}
<li>
{% if nav.url %}
<a href="{{ nav.url | relative_url }}"><span class="nav__sub-title">{{ nav.title }}</span></a>
{% else %}
<span class="nav__sub-title">{{ nav.title }}</span>
{% endif %}
{% if nav.children != null %}
<ul>
{% for child in nav.children %}
<li><a href="{{ child.url | relative_url }}"{% if child.url == page.url %} class="active"{% endif %}>{{ child.title }}</a></li>
{% endfor %}
</ul>
{% endif %}
</li>
{% endfor %}
</ul>
</nav>

Some files were not shown because too many files have changed in this diff Show More