Compare commits
No commits in common. "c21e3e2a9b86be058e9472d4d9744993ea201584" and "ffd264f5e61fc16fb2461efb193f8b19ffe3c38d" have entirely different histories.
c21e3e2a9b
...
ffd264f5e6
|
@ -1 +0,0 @@
|
|||
export default new Map();
|
|
@ -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')]]);
|
||||
|
|
@ -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");
|
||||
}
|
|
@ -1,2 +0,0 @@
|
|||
/// <reference types="astro/client" />
|
||||
/// <reference path="content.d.ts" />
|
|
@ -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] }],
|
||||
[]
|
||||
);
|
||||
}
|
|
@ -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/
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
{
|
||||
"recommendations": ["astro-build.astro-vscode", "unifiedjs.vscode-mdx"],
|
||||
"unwantedRecommendations": []
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"cSpell.words": ["astro", "astrojs", "tsconfigs"]
|
||||
}
|
|
@ -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.
|
68
README.md
|
@ -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/).
|
|
@ -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()],
|
||||
});
|
|
@ -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">I’ve 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 Hudson’s Swift Coding Challenges book and I’m 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 & 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 it’s 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 didn’t 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">© 2023 Robert McGovern. Powered by <a href="https://jekyllrb.com" rel="nofollow">Jekyll</a> & <a href="https://mademistakes.com/work/minimal-mistakes-jekyll-theme/" rel="nofollow">Minimal Mistakes</a>.</div>
|
||||
---
|
||||
> <div class="page__footer-copyright">© %2023 Robert McGovern. Powered by <a href="https://jekyllrb.com" rel="nofollow">Jekyll</a> & <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>
|
|
@ -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;
|
||||
});
|
||||
};
|
|
@ -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
|
74
package.json
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 21 KiB |
|
@ -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 |
|
@ -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
|
||||
|
|
@ -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"
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
}
|
|
@ -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
|
|
@ -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],
|
||||
]);
|
||||
|
||||
```
|
|
@ -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.
|
||||
|
||||
##
|
|
@ -0,0 +1,25 @@
|
|||
---
|
||||
title: CSS Properties, or I have a problem.
|
||||
tags: [webdev, css]
|
||||
category: programming
|
||||
eleventyExcludeFromCollections: true
|
||||
---
|
||||
|
||||
|
||||
|
||||
Frontend Mentor
|
||||
|
||||
I’ve be rattling off some Frontend Mentor challenges recently. Aiming to finish all the newbie challenges before moving onto Junior and onwards.
|
||||
|
||||
One thing I’ve noticed is that I’ve really embraced CSS properties, probably too much so :)
|
||||
|
||||
In my last couple of challenges I’ve 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, you’re just tweaking the variables passed in.
|
||||
|
||||
|
||||
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
```
|
||||
|
|
@ -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?
|
||||
???
|
|
@ -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
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
layout: single
|
||||
title: pretty-terminal-configs
|
||||
eleventyExcludeFromCollections: true
|
||||
---
|
|
@ -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
|
|
@ -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
|
|
@ -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>
|
|
@ -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
|
||||
|
|
@ -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.
|
|
@ -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.
|
|
@ -0,0 +1,3 @@
|
|||
<!-- start custom analytics snippet -->
|
||||
|
||||
<!-- end custom analytics snippet -->
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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 %}
|
|
@ -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>
|
|
@ -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>
|
||||
-->
|
|
@ -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>
|
|
@ -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>
|
|
@ -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]-->
|
|
@ -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 %}
|
|
@ -0,0 +1,3 @@
|
|||
<!-- start custom comments snippet -->
|
||||
|
||||
<!-- end custom comments snippet -->
|
|
@ -0,0 +1,3 @@
|
|||
<!-- start custom comments scripts -->
|
||||
|
||||
<!-- end custom comments scripts -->
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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>
|
|
@ -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>
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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>
|
|
@ -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>
|
|
@ -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 -%}
|
|
@ -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>
|
|
@ -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>
|
|
@ -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">© 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> & <a href="https://mademistakes.com/work/minimal-mistakes-jekyll-theme/" rel="nofollow">Minimal Mistakes</a>.</div>
|
|
@ -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 -->
|
|
@ -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>
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -0,0 +1,3 @@
|
|||
<!-- start custom header snippets -->
|
||||
<div id="progress-bar"></div>
|
||||
<!-- end custom header snippets -->
|
|
@ -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>
|
|
@ -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>
|
|
@ -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' }} ↑</a>
|
||||
</section>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
|
@ -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>
|
|
@ -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>
|
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
# Jekyll layout that compresses HTML
|
||||
# v3.1.0
|
||||
# http://jch.penibelst.de/
|
||||
# © 2014–2015 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 %}
|
|
@ -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>
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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' }} ↑</a>
|
||||
</section>
|
||||
{% endfor %}
|
||||
{% endcomment %}
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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' }} ↑</a>
|
||||
</section>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
|
@ -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>
|
|
@ -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>
|