From 9793dce7a5c4e86ad129b917dc66843aa62049b3 Mon Sep 17 00:00:00 2001 From: noah Date: Thu, 21 Dec 2023 03:36:24 -0600 Subject: [PATCH] Skeleton project wiand structure with confifgs, boilerplate functions, and licensing info --- .editorconfig | 9 ++ .gitignore | 3 + .vscode/settings.json | 5 + LICENSE.md | 53 +++++++++ _includes/layouts/base.njk | 89 ++++++++++++++ _includes/layouts/home.njk | 5 + _includes/layouts/post.njk | 28 +++++ _includes/postslist.njk | 9 ++ content/css/prism-base16-monokai.dark.css | 89 ++++++++++++++ content/files/index.njk | 28 +++++ content/images/logos/TheSchricks.png | Bin 0 -> 33076 bytes eleventy.config.drafts.js | 50 ++++++++ eleventy.config.images.js | 34 ++++++ eleventy.config.js | 139 ++++++++++++++++++++++ package.json | 32 +++++ 15 files changed, 573 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 LICENSE.md create mode 100644 _includes/layouts/base.njk create mode 100644 _includes/layouts/home.njk create mode 100644 _includes/layouts/post.njk create mode 100644 _includes/postslist.njk create mode 100644 content/css/prism-base16-monokai.dark.css create mode 100644 content/files/index.njk create mode 100644 content/images/logos/TheSchricks.png create mode 100644 eleventy.config.drafts.js create mode 100644 eleventy.config.images.js create mode 100644 eleventy.config.js create mode 100644 package.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..4d8715f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +indent_style = tab +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +charset = utf-8 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ab338d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +_site/ +node_modules/ +package-lock.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..94f4350 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "cSpell.ignoreWords": [ + "TheSchricks" + ] +} \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..a469e0c --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,53 @@ +# Articles + +All files under the `/content/files` directory (and likewise, the corresponding and respective files in /_site) are licensed under +[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/). The attribution requirement is appropriately met under the following conditions as specified by the license: + +1. Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made . You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. +Whereby the following terms shall mean: +- Appropriate credit — If supplied, you must provide the name of the creator and attribution parties, a copyright notice, a license notice, a disclaimer notice, and a link to the material. CC licenses prior to Version 4.0 also require you to provide the title of the material if supplied, and may have other slight differences. +- Indicate if changes were made — You must indicate if you modified the material and retain an indication of previous modifications. +2. NonCommercial — You may not use the material for commercial purposes. +3. ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. +4. No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. +Whereby "technological measures" shall mean: +- The license prohibits application of effective technological measures, defined with reference to Article 11 of the WIPO Copyright Treaty. + +# Images + +## Images +All files under the `/content/images/site/` directory (and likewise, the corresponding and respective files in /_site) are copyrighted to Noah L. Schrick. All rights reserved. + +## Screenshots + +No licensing is provided for any files under `/content/images/screenshots` (and likewise, the corresponding and respective files in /_site) due to potential conflicts with copyright claims with the publisher, developer, artist, or other in any relevant screenshot. + +## Logos + +All files under the `/content/images/logos` directory (and likewise, the corresponding and respective files in /public) are copyrighted to their respective holders. + +# Other files + +All other files not mentioned are licensed under the MIT License. + +## MIT License + +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. + diff --git a/_includes/layouts/base.njk b/_includes/layouts/base.njk new file mode 100644 index 0000000..19d028e --- /dev/null +++ b/_includes/layouts/base.njk @@ -0,0 +1,89 @@ + + + + + + {{ renderData.title or title or metadata.title }} + + + + + + + + + + + + + + + + + +
+
+ {%- for entry in collections.all | eleventyNavigation %} + {{ entry.title}} + {%- endfor %} +
+
+
+ + +
+
+
    +
  1. Edit the _data/metadata.json with your blog’s information.
  2. +
  3. (Optional) Edit .eleventy.js with your configuration preferences.
  4. +
  5. Delete this message from _includes/layouts/base.njk.
  6. +
+

This is an Eleventy project created from the eleventy-base-blog repo.

+
+ + {{ content | safe }} +
+ + +
+ + + + + + +

Powered by w3.css

+ +
+ + + + \ No newline at end of file diff --git a/_includes/layouts/home.njk b/_includes/layouts/home.njk new file mode 100644 index 0000000..cf8dc9c --- /dev/null +++ b/_includes/layouts/home.njk @@ -0,0 +1,5 @@ +--- +layout: layouts/base.njk +--- + +{{ content | safe }} \ No newline at end of file diff --git a/_includes/layouts/post.njk b/_includes/layouts/post.njk new file mode 100644 index 0000000..6237584 --- /dev/null +++ b/_includes/layouts/post.njk @@ -0,0 +1,28 @@ +--- +layout: layouts/base.njk +--- +{# Only include the syntax highlighter CSS on blog posts #} +{%- css %}{% include "node_modules/prismjs/themes/prism-okaidia.css" %}{% endcss %} +{%- css %}{% include "public/css/prism-diff.css" %}{%- endcss %} +

{{ title }}

+ + + +{{ content | safe }} + +{%- if collections.posts %} +{%- set previousPost = collections.posts | getPreviousCollectionItem %} +{%- set nextPost = collections.posts | getNextCollectionItem %} +{%- if nextPost or previousPost %} + +{%- endif %} +{%- endif %} \ No newline at end of file diff --git a/_includes/postslist.njk b/_includes/postslist.njk new file mode 100644 index 0000000..1af346f --- /dev/null +++ b/_includes/postslist.njk @@ -0,0 +1,9 @@ +{%- css %}.postlist { counter-reset: start-from {{ (postslistCounter or postslist.length) + 1 }} }{% endcss %} +
    +{% for post in postslist | reverse %} +
  1. + {% if post.data.title %}{{ post.data.title }}{% else %}{{ post.url }}{% endif %} + +
  2. +{% endfor %} +
\ No newline at end of file diff --git a/content/css/prism-base16-monokai.dark.css b/content/css/prism-base16-monokai.dark.css new file mode 100644 index 0000000..c60b1b4 --- /dev/null +++ b/content/css/prism-base16-monokai.dark.css @@ -0,0 +1,89 @@ +code[class*="language-"], pre[class*="language-"] { + font-size: 14px; + line-height: 1.375; + direction: ltr; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; + background: #272822; + color: #f8f8f2; +} +pre[class*="language-"] { + padding: 1.5em 0; + margin: .5em 0; + overflow: auto; +} +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; +} +.token.comment, .token.prolog, .token.doctype, .token.cdata { + color: #75715e; +} +.token.punctuation { + color: #f8f8f2; +} +.token.namespace { + opacity: .7; +} +.token.operator, .token.boolean, .token.number { + color: #fd971f; +} +.token.property { + color: #f4bf75; +} +.token.tag { + color: #66d9ef; +} +.token.string { + color: #a1efe4; +} +.token.selector { + color: #ae81ff; +} +.token.attr-name { + color: #fd971f; +} +.token.entity, .token.url, .language-css .token.string, .style .token.string { + color: #a1efe4; +} +.token.attr-value, .token.keyword, .token.control, .token.directive, .token.unit { + color: #a6e22e; +} +.token.statement, .token.regex, .token.atrule { + color: #a1efe4; +} +.token.placeholder, .token.variable { + color: #66d9ef; +} +.token.deleted { + text-decoration: line-through; +} +.token.inserted { + border-bottom: 1px dotted #f9f8f5; + text-decoration: none; +} +.token.italic { + font-style: italic; +} +.token.important, .token.bold { + font-weight: bold; +} +.token.important { + color: #f92672; +} +.token.entity { + cursor: help; +} +pre > code.highlight { + outline: 0.4em solid #f92672; + outline-offset: .4em; +} \ No newline at end of file diff --git a/content/files/index.njk b/content/files/index.njk new file mode 100644 index 0000000..0174b26 --- /dev/null +++ b/content/files/index.njk @@ -0,0 +1,28 @@ +--- +layout: layouts/home.njk +eleventyNavigation: + key: Home + order: 1 +numberOfLatestPostsToShow: 3 +--- +{% set postsCount = collections.posts | length %} +{% set latestPostsCount = postsCount | min(numberOfLatestPostsToShow) %} +

Latest {{ latestPostsCount }} Post{% if latestPostsCount != 1 %}s{% endif %}

+ +{% set postslist = collections.posts | head(-1 * numberOfLatestPostsToShow) %} +{% set postslistCounter = postsCount %} +{% include "postslist.njk" %} + +{% set morePosts = postsCount - numberOfLatestPostsToShow %} +{% if morePosts > 0 %} +

{{ morePosts }} more post{% if morePosts != 1 %}s{% endif %} can be found in the archive.

+{% endif %} + +{# List every content page in the project #} +{# + +#} \ No newline at end of file diff --git a/content/images/logos/TheSchricks.png b/content/images/logos/TheSchricks.png new file mode 100644 index 0000000000000000000000000000000000000000..5a8406ce24605931dee4afe8afff0c36e2f3f292 GIT binary patch literal 33076 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 I$}fZe5AMn2ng9R* literal 0 HcmV?d00001 diff --git a/eleventy.config.drafts.js b/eleventy.config.drafts.js new file mode 100644 index 0000000..95ad60a --- /dev/null +++ b/eleventy.config.drafts.js @@ -0,0 +1,50 @@ +function eleventyComputedPermalink() { + // When using `addGlobalData` and you *want* to return a function, you must nest functions like this. + // `addGlobalData` acts like a global data file and runs the top level function it receives. + return (data) => { + // Always skip during non-watch/serve builds + if(data.draft && !process.env.BUILD_DRAFTS) { + return false; + } + + return data.permalink; + } +}; + +function eleventyComputedExcludeFromCollections() { + // When using `addGlobalData` and you *want* to return a function, you must nest functions like this. + // `addGlobalData` acts like a global data file and runs the top level function it receives. + return (data) => { + // Always exclude from non-watch/serve builds + if(data.draft && !process.env.BUILD_DRAFTS) { + return true; + } + + return data.eleventyExcludeFromCollections; + } +}; + +module.exports.eleventyComputedPermalink = eleventyComputedPermalink; +module.exports.eleventyComputedExcludeFromCollections = eleventyComputedExcludeFromCollections; + +module.exports = eleventyConfig => { + eleventyConfig.addGlobalData("eleventyComputed.permalink", eleventyComputedPermalink); + eleventyConfig.addGlobalData("eleventyComputed.eleventyExcludeFromCollections", eleventyComputedExcludeFromCollections); + + let logged = false; + eleventyConfig.on("eleventy.before", ({runMode}) => { + let text = "Excluding"; + // Only show drafts in serve/watch modes + if(runMode === "serve" || runMode === "watch") { + process.env.BUILD_DRAFTS = true; + text = "Including"; + } + + // Only log once. + if(!logged) { + console.log( `[11ty/eleventy-base-blog] ${text} drafts.` ); + } + + logged = true; + }); +} \ No newline at end of file diff --git a/eleventy.config.images.js b/eleventy.config.images.js new file mode 100644 index 0000000..eb435cb --- /dev/null +++ b/eleventy.config.images.js @@ -0,0 +1,34 @@ +const path = require("path"); +const eleventyImage = require("@11ty/eleventy-img"); + +module.exports = eleventyConfig => { + function relativeToInputPath(inputPath, relativeFilePath) { + let split = inputPath.split("/"); + split.pop(); + + return path.resolve(split.join(path.sep), relativeFilePath); + } + + // Eleventy Image shortcode + // https://www.11ty.dev/docs/plugins/image/ + eleventyConfig.addAsyncShortcode("image", async function imageShortcode(src, alt, widths, sizes) { + // Full list of formats here: https://www.11ty.dev/docs/plugins/image/#output-formats + // Warning: Avif can be resource-intensive so take care! + let formats = ["avif", "webp", "auto"]; + let file = relativeToInputPath(this.page.inputPath, src); + let metadata = await eleventyImage(file, { + widths: widths || ["auto"], + formats, + outputDir: path.join(eleventyConfig.dir.output, "img"), // Advanced usage note: `eleventyConfig.dir` works here because we’re using addPlugin. + }); + + // TODO loading=eager and fetchpriority=high + let imageAttributes = { + alt, + sizes, + loading: "lazy", + decoding: "async", + }; + return eleventyImage.generateHTML(metadata, imageAttributes); + }); +}; \ No newline at end of file diff --git a/eleventy.config.js b/eleventy.config.js new file mode 100644 index 0000000..d35612f --- /dev/null +++ b/eleventy.config.js @@ -0,0 +1,139 @@ +const { DateTime } = require("luxon"); +const markdownItAnchor = require("markdown-it-anchor"); + +const pluginRss = require("@11ty/eleventy-plugin-rss"); +const pluginSyntaxHighlight = require("@11ty/eleventy-plugin-syntaxhighlight"); +const pluginBundle = require("@11ty/eleventy-plugin-bundle"); +const pluginNavigation = require("@11ty/eleventy-navigation"); +const { EleventyHtmlBasePlugin } = require("@11ty/eleventy"); + +const pluginDrafts = require("./eleventy.config.drafts.js"); +const pluginImages = require("./eleventy.config.images.js"); + +module.exports = function(eleventyConfig) { + // Copy the contents of the `public` folder to the output folder + // For example, `./public/css/` ends up in `_site/css/` + eleventyConfig.addPassthroughCopy({ + "./public/": "/", + "./node_modules/prismjs/themes/prism-okaidia.css": "/css/prism-okaidia.css" + }); + + // Run Eleventy when these files change: + // https://www.11ty.dev/docs/watch-serve/#add-your-own-watch-targets + + // Watch content images for the image pipeline. + eleventyConfig.addWatchTarget("content/**/*.{svg,webp,png,jpeg}"); + + // App plugins + eleventyConfig.addPlugin(pluginDrafts); + eleventyConfig.addPlugin(pluginImages); + + // Official plugins + eleventyConfig.addPlugin(pluginRss); + eleventyConfig.addPlugin(pluginSyntaxHighlight, { + preAttributes: { tabindex: 0 } + }); + eleventyConfig.addPlugin(pluginNavigation); + eleventyConfig.addPlugin(EleventyHtmlBasePlugin); + eleventyConfig.addPlugin(pluginBundle); + + // Filters + eleventyConfig.addFilter("readableDate", (dateObj, format, zone) => { + // Formatting tokens for Luxon: https://moment.github.io/luxon/#/formatting?id=table-of-tokens + return DateTime.fromJSDate(dateObj, { zone: zone || "utc" }).toFormat(format || "dd LLLL yyyy"); + }); + + eleventyConfig.addFilter('htmlDateString', (dateObj) => { + // dateObj input: https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-date-string + return DateTime.fromJSDate(dateObj, {zone: 'utc'}).toFormat('yyyy-LL-dd'); + }); + + // Get the first `n` elements of a collection. + eleventyConfig.addFilter("head", (array, n) => { + if(!Array.isArray(array) || array.length === 0) { + return []; + } + if( n < 0 ) { + return array.slice(n); + } + + return array.slice(0, n); + }); + + // Return the smallest number argument + eleventyConfig.addFilter("min", (...numbers) => { + return Math.min.apply(null, numbers); + }); + + // Return all the tags used in a collection + eleventyConfig.addFilter("getAllTags", collection => { + let tagSet = new Set(); + for(let item of collection) { + (item.data.tags || []).forEach(tag => tagSet.add(tag)); + } + return Array.from(tagSet); + }); + + eleventyConfig.addFilter("filterTagList", function filterTagList(tags) { + return (tags || []).filter(tag => ["all", "nav", "post", "posts"].indexOf(tag) === -1); + }); + + // Customize Markdown library settings: + eleventyConfig.amendLibrary("md", mdLib => { + mdLib.use(markdownItAnchor, { + permalink: markdownItAnchor.permalink.ariaHidden({ + placement: "after", + class: "header-anchor", + symbol: "#", + ariaHidden: false, + }), + level: [1,2,3,4], + slugify: eleventyConfig.getFilter("slugify") + }); + }); + + // Features to make your build faster (when you need them) + + // If your passthrough copy gets heavy and cumbersome, add this line + // to emulate the file copy on the dev server. Learn more: + // https://www.11ty.dev/docs/copy/#emulate-passthrough-copy-during-serve + + // eleventyConfig.setServerPassthroughCopyBehavior("passthrough"); + + return { + // Control which files Eleventy will process + // e.g.: *.md, *.njk, *.html, *.liquid + templateFormats: [ + "md", + "njk", + "html", + "liquid", + ], + + // Pre-process *.md files with: (default: `liquid`) + markdownTemplateEngine: "njk", + + // Pre-process *.html files with: (default: `liquid`) + htmlTemplateEngine: "njk", + + // These are all optional: + dir: { + input: "content", // default: "." + includes: "../_includes", // default: "_includes" + data: "../_data", // default: "_data" + output: "_site" + }, + + // ----------------------------------------------------------------- + // Optional items: + // ----------------------------------------------------------------- + + // If your site deploys to a subdirectory, change `pathPrefix`. + // Read more: https://www.11ty.dev/docs/config/#deploy-to-a-subdirectory-with-a-path-prefix + + // When paired with the HTML plugin https://www.11ty.dev/docs/plugins/html-base/ + // it will transform any absolute URLs in your HTML to include this + // folder name and does **not** affect where things go in the output folder. + pathPrefix: "/", + }; +}; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..be2c036 --- /dev/null +++ b/package.json @@ -0,0 +1,32 @@ +{ + "name": "TheSchricks", + "version": "1.0.0", + "description": "First iteration site using Eleventy site generator.", + "scripts": { + "build": "npx @11ty/eleventy", + "build-ghpages": "npx @11ty/eleventy --pathprefix=/eleventy-base-blog/", + "start": "npx @11ty/eleventy --serve --quiet", + "debug": "DEBUG=Eleventy* npx @11ty/eleventy", + "debugstart": "DEBUG=Eleventy* npx @11ty/eleventy --serve --quiet", + "benchmark": "DEBUG=Eleventy:Benchmark* npx @11ty/eleventy" + }, + "repository": { + "type": "git", + "url": "git://git.theschricks.com/noah/Website.git" + }, + "engines": { + "node": ">=14" + }, + "homepage": "https://git.theschricks.com/noah/Website#readme", + "author": "Noah L. Schrick", + "devDependencies": { + "@11ty/eleventy": "^2.0.1", + "@11ty/eleventy-img": "^3.1.8", + "@11ty/eleventy-navigation": "^0.3.5", + "@11ty/eleventy-plugin-bundle": "^1.0.5", + "@11ty/eleventy-plugin-rss": "^1.2.0", + "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0", + "luxon": "^3.4.4", + "markdown-it-anchor": "^8.6.7" + } +}