diff --git a/.eleventy.js b/.eleventy.js index cdc7481ad953f6ea1fd8363158ba487ac69d24c5..5426c05f2decf67d40b91238fa33dc7f22a73eaf 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -1,6 +1,5 @@ const _fs = require("fs"); const _markdown = require("markdown-it"); -const _markdownAnchor = require("markdown-it-anchor"); const _yaml = require("js-yaml"); const _moment = require("moment"); @@ -13,22 +12,22 @@ module.exports = function(eleventyConfig) { eleventyConfig.addLayoutAlias("base", "layouts/base.liquid"); eleventyConfig.addLayoutAlias("page", "layouts/page.liquid"); + eleventyConfig.addPassthroughCopy("favicon.ico"); eleventyConfig.addPassthroughCopy("assets"); eleventyConfig.addPassthroughCopy({"assets/images": "images"}); eleventyConfig.addPassthroughCopy({"assets/files": "files"}); - eleventyConfig.addPassthroughCopy("browserconfig.xml"); - eleventyConfig.addPassthroughCopy("manifest.json"); - eleventyConfig.addPassthroughCopy("favicon.ico"); - const markdownItRenderer = new _markdown({ html: true }).use( - require('markdown-it-highlightjs') - ); + const markdownItRenderer = new _markdown({ html: true }) + .use(require('markdown-it-prism'), { plugins: ["autoloader"] }) + .use(require("markdown-it-anchor")); eleventyConfig.addFilter("markdownify", function(str) { if (typeof str === 'string') return markdownItRenderer.render(str); }); + eleventyConfig.setLibrary("md", markdownItRenderer); + eleventyConfig.addFilter("where", function(array, prop, value) { return (array || []).filter((item) => item[prop] == value); }); diff --git a/_data/git.js b/_data/git.js index 7235587eb493fee9114ae6928c619be9b264ec24..631ca79aa08311994406ad6c040f2b6e95977e23 100644 --- a/_data/git.js +++ b/_data/git.js @@ -53,11 +53,13 @@ async function getRepoProject(repo) { } catch (e) {} let screenshots = (meta.screenshots || []).map((url) => `${rawUrl}/${url}`); + let icon = meta.icon ? `${rawUrl}/${meta.icon}` : null; let project = { id: id.toLowerCase(), repo, title, + icon, screenshots, readme, hasWiki: false diff --git a/_data/meta.json b/_data/meta.json index e29e21fa6ee3704e6a52442d87c0b800f8e9883d..d798d5941f54177946cb03975933389b940ce944 100644 --- a/_data/meta.json +++ b/_data/meta.json @@ -1,8 +1,10 @@ { + "domainurl": "https://jfenn.me", "name": "James Fenn", "email": "me@jfenn.me", "description": "Writer of bad puns and slightly better software. This website contains information about my adventures in programming, current projects, and me.", - "icon": "/assets/images/logo.png", + "icon": "/images/me.jpg", + "image": "/images/headers/snowytrees.jpg", "links": { "twitter": "https://twitter.com/fennifith", "fediverse": "https://is.a.horrific.dev/@james", diff --git a/_includes/footer.liquid b/_includes/footer.liquid index 71602ab4599f5bde4a65821780124992a3655281..580fac7a30e659972645746a49f06d59b9698b37 100644 --- a/_includes/footer.liquid +++ b/_includes/footer.liquid @@ -1,7 +1,7 @@ diff --git a/_includes/head.liquid b/_includes/head.liquid index cc9619929a8d4669d173aab81fa4c3799b6cadde..98174ddcd9a78e677711eea71409c8ec9e93a321 100644 --- a/_includes/head.liquid +++ b/_includes/head.liquid @@ -10,11 +10,17 @@ {% assign head_description = meta.description %} {% if description %} -{% assign head_description = description %} +{% assign head_description = description | xml_escape %} {% elsif renderData.description %} -{% assign head_description = renderData.description %} +{% assign head_description = renderData.description | xml_escape %} {% endif %} +{% assign head_icon = meta.domainurl | append: meta.icon %} +{% if icon %}{% assign head_icon = icon %}{% endif %} + +{% assign head_image = meta.domainurl | append: meta.image %} +{% if image %}{% assign head_image = image %}{% endif %} + @@ -26,23 +32,18 @@ - + - - - - - - - - - - - - - + + + + + + + + @@ -55,11 +56,19 @@ - + + - + + + + + + + + diff --git a/_includes/layouts/default.liquid b/_includes/layouts/default.liquid index 1f3410f9c2721e68513a93f3637fe48a064f9dc5..179c9a52d973ac187b481c60598c46176fd1df21 100644 --- a/_includes/layouts/default.liquid +++ b/_includes/layouts/default.liquid @@ -3,15 +3,8 @@ {% include head.liquid %} - {{ content | safe }} - - - - - - diff --git a/_includes/layouts/project.liquid b/_includes/layouts/project.liquid index 7f75f8482f44bc55eddc1a2629d6833e24352700..47f365b97a08a8c95630801ce8e3341294a0eeb9 100644 --- a/_includes/layouts/project.liquid +++ b/_includes/layouts/project.liquid @@ -1,8 +1,14 @@ --- -layout: base --- + -{% assign project = git.projects | where: 'id', page.fileSlug | first %} + + + {% assign project = git.projects | where: 'id', page.fileSlug | first %} + {% include head, title: project.title, description: project.repo.description, icon: project.icon %} + + + {% include nav %}
@@ -62,7 +68,7 @@ layout: base
{% if project.hasWiki %} -
+
@@ -78,11 +84,64 @@ layout: base
{% endif %} -{% assign sections = content | split: '
' %} -{% for section in sections %} -
-
- {{ section | safe }} +{% if tags contains "project-deprecated" %} +
+
+
+
+ error_outline +
+
+
This project is deprecated!
+

Pull requests may still be accepted, but I am no longer actively maintaining it and proper functionality is not guaranteed.

+

If you would like to fork this project and continue development, please contact me so I can link to your fork from this page.

+
+
+{% endif %} + +{% capture lastSection %} +
+
+ source +
+
+

Open Source

+

Browse the source code, suggest changes, or develop it yourself!

+ Git Repo chevron_right +
+
+ +
+ +
+ {{ project.readme | markdownify }} +
+
+{% endcapture %} + +{% assign contents = content | split: '===' %} +{% if contents.size > 1 %} +{% assign sections = content | append: '===' | append: lastSection | split: '===' %} +{% else %} +{% assign sections = lastSection | split: '===' %} +{% endif %} + +{% for section in sections %} +
+
+ {{ section | safe }} +
+
{% endfor %} + +{% include footer %} + + + diff --git a/_includes/newsletter.liquid b/_includes/newsletter.liquid new file mode 100644 index 0000000000000000000000000000000000000000..520db4f9fe1a23b8aa6659285b4aa0a4632c1cc1 --- /dev/null +++ b/_includes/newsletter.liquid @@ -0,0 +1,6 @@ +
+
+

Stay up to date!

+ +
+
diff --git a/assets/css/styles.scss b/assets/css/styles.scss index ee11f097d178508b54c70273769087c6e1fa5dbc..1b371ef5482dbd300f02d17962fd7f0018f4bd03 100644 --- a/assets/css/styles.scss +++ b/assets/css/styles.scss @@ -33,6 +33,14 @@ a:focus > code { filter: contrast(0) brightness(2); } +pre > code { + line-height: 1.25rem !important; +} + +pre > code * { + font-size: 0.8571428571rem !important; +} + * { animation: none !important; } diff --git a/assets/images/ic/markdown-mark.svg b/assets/images/ic/markdown-mark.svg new file mode 100644 index 0000000000000000000000000000000000000000..ddd8fe856a26f803978ee8b9db2984667e34d324 --- /dev/null +++ b/assets/images/ic/markdown-mark.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..75bb666852c7ad8dcb7b59292aedc204d97a9d0b Binary files /dev/null and b/favicon.ico differ diff --git a/meta/ieconfig.njk b/meta/ieconfig.njk new file mode 100644 index 0000000000000000000000000000000000000000..4517ba1eb1167bc9c2fcee771d650eb51cb05533 --- /dev/null +++ b/meta/ieconfig.njk @@ -0,0 +1,14 @@ +--- +permalink: /ieconfig.xml +eleventyExcludeFromCollections: true +--- + + + + + + + #FFFFFF + + + diff --git a/meta/keybase.njk b/meta/keybase.njk new file mode 100644 index 0000000000000000000000000000000000000000..8ccffd3525f7c53b8f3a678c84912c1a9edba7e0 --- /dev/null +++ b/meta/keybase.njk @@ -0,0 +1,60 @@ +--- +permalink: /keybase.txt +eleventyExcludeFromCollections: true +--- +================================================================== +https://keybase.io/jafenn +-------------------------------------------------------------------- + +I hereby claim: + + * I am an admin of https://jfenn.me + * I am jafenn (https://keybase.io/jafenn) on keybase. + * I have a public key ASAqbtXJuDtfshrI2lXMoTYs_cTyYm_RQzLAKySvcfRS1Ao + +To do so, I am signing this object: + +{ + "body": { + "key": { + "eldest_kid": "01202a6ed5c9b83b5fb21ac8da55cca1362cfdc4f2626fd14332c02b24af71f452d40a", + "host": "keybase.io", + "kid": "01202a6ed5c9b83b5fb21ac8da55cca1362cfdc4f2626fd14332c02b24af71f452d40a", + "uid": "e6494057cbb6c22d574adfd416516a19", + "username": "jafenn" + }, + "merkle_root": { + "ctime": 1533769511, + "hash": "aea95ec3905ce46e2b9a61f5e7db541dae328e76ee19906f1f56f77a9a39ad2a86302bf4e353bc6432520eaf7772db293a8f4b1d6698473f74101c2ab049cfa3", + "hash_meta": "dcee4f3e0ee1753dd71013901dc84b1ee1d03ca9b049a890ac1371b022f247cf", + "seqno": 3429213 + }, + "service": { + "entropy": "LQFOrJFJvKWCupiCN7DT8NEe", + "hostname": "jfenn.me", + "protocol": "https:" + }, + "type": "web_service_binding", + "version": 2 + }, + "client": { + "name": "keybase.io go client", + "version": "2.3.0" + }, + "ctime": 1533769536, + "expire_in": 504576000, + "prev": "4f89596d003467aadd9d20385d17be293fb955c3d45bb00d2657a23bb9fa99d0", + "seqno": 9, + "tag": "signature" +} + +which yields the signature: + +hKRib2R5hqhkZXRhY2hlZMOpaGFzaF90eXBlCqNrZXnEIwEgKm7Vybg7X7IayNpVzKE2LP3E8mJv0UMywCskr3H0UtQKp3BheWxvYWTESpcCCcQgT4lZbQA0Z6rdnSA4XRe+KT+5VcPUW7ANJleiO7n6mdDEIPdFYV0ArW3Bwf1tjHExw/2mdCDNwhB8V4mGc7uVBy2DAgHCo3NpZ8RAY4GFT1Vm3SAuveWp/kYx7QWBBPrYF5JH9KWD1DPOHthHvoBsL7gcqtfnXV25QFaKnoSnM4YMv/D4/juUFog+BahzaWdfdHlwZSCkaGFzaIKkdHlwZQildmFsdWXEIFJHLG3y/i8AdDuvEz6LYH8f8x5mLRZDmxTe9V/UJRJXo3RhZ80CAqd2ZXJzaW9uAQ== + +And finally, I am proving ownership of this host by posting or +appending to this document. + +View my publicly-auditable identity here: https://keybase.io/jafenn + +================================================================== \ No newline at end of file diff --git a/meta/manifest.json b/meta/manifest.json deleted file mode 100644 index 4426dc61551b7bd0ef739881da7850864b6b35e1..0000000000000000000000000000000000000000 --- a/meta/manifest.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "James Fenn", - "short_name": "James Fenn", - "start_url": "/", - "background_color": "#FFFFFF", - "display": "standalone", - "theme_color": "#000000" -} diff --git a/meta/manifest.njk b/meta/manifest.njk new file mode 100644 index 0000000000000000000000000000000000000000..3b6c217e5beab645f9de0b4f976acd11ccde8d34 --- /dev/null +++ b/meta/manifest.njk @@ -0,0 +1,25 @@ +--- +permalink: /manifest.json +eleventyExcludeFromCollections: true +--- +{ + "name": "James Fenn", + "short_name": "James Fenn", + "icons": [{ + "src": "/images/favicon-96.png", + "sizes": "96x96", + "type": "image/png" + }, { + "src": "/images/favicon-144.png", + "sizes": "144x144", + "type": "image/png" + }, { + "src": "/images/favicon-192.png", + "sizes": "192x192", + "type": "image/png" + }], + "start_url": "/", + "background_color": "#FFFFFF", + "display": "standalone", + "theme_color": "#000000" +} diff --git a/meta/robots.njk b/meta/robots.njk new file mode 100644 index 0000000000000000000000000000000000000000..e59cbc9cc6804cbf7a6bf1f2e48ca723b5b2e3ea --- /dev/null +++ b/meta/robots.njk @@ -0,0 +1,10 @@ +--- +permalink: /robots.txt +eleventyExcludeFromCollections: true +--- +User-agent: * +Disallow: +Disallow: /links/* +Disallow: /redirects/* +Disallow: /about/* +Sitemap: https://jfenn.me/sitemap.xml diff --git a/meta/sitemap.njk b/meta/sitemap.njk new file mode 100644 index 0000000000000000000000000000000000000000..914b1d8295645bc072ba6b75c018cd8e9fec28ee --- /dev/null +++ b/meta/sitemap.njk @@ -0,0 +1,14 @@ +--- +permalink: /sitemap.xml +eleventyExcludeFromCollections: true +--- + + + {% for page in collections.all %} + + {{ site.url }}{{ page.url | url }} + {{ page.date.toISOString() }} + {{ page.data.changeFreq if page.data.changeFreq else "monthly" }} + + {% endfor %} + diff --git a/meta/sw.js.njk b/meta/sw.js.njk new file mode 100644 index 0000000000000000000000000000000000000000..c35babab50046972eae8b3ea7822a1298fa4b03c --- /dev/null +++ b/meta/sw.js.njk @@ -0,0 +1,57 @@ +--- +permalink: /sw.js +eleventyExcludeFromCollections: true +--- +importScripts('https://storage.googleapis.com/workbox-cdn/releases/3.6.1/workbox-sw.js'); + +if (workbox) { + workbox.precaching.precacheAndRoute([]); + + // Cache the Google Fonts stylesheets with a stale while revalidate strategy. + workbox.routing.registerRoute( + /^https:\/\/fonts\.googleapis\.com/, + workbox.strategies.staleWhileRevalidate({ + cacheName: 'google-fonts-stylesheets', + }), + ); + + // Cache the Google Fonts webfont files with a cache first strategy for 1 year. + workbox.routing.registerRoute( + /^https:\/\/fonts\.gstatic\.com/, + workbox.strategies.cacheFirst({ + cacheName: 'google-fonts-webfonts', + plugins: [ + new workbox.cacheableResponse.Plugin({ + statuses: [0, 200], + }), + new workbox.expiration.Plugin({ + maxAgeSeconds: 60 * 60 * 24 * 365, + }), + ], + }), + ); + + workbox.routing.registerRoute( + // Cache CSS files + /.*\.css/, + workbox.strategies.staleWhileRevalidate({ + cacheName: 'css-cache', + }) + ); + + workbox.routing.registerRoute( + // Cache image files + /.*\.(?:png|jpg|jpeg|svg|gif)/, + workbox.strategies.cacheFirst({ + cacheName: 'image-cache', + plugins: [ + new workbox.expiration.Plugin({ + maxEntries: 100, + maxAgeSeconds: 7 * 24 * 60 * 60, + }) + ], + }) + ); +} else { + console.log("Workbox didn't load..."); +} diff --git a/package.json b/package.json index 1750fb550f25b3d02836c29c2984f503509a44d1..f3ba14b64916c75e559db4f38b47def3190d6f85 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "js-yaml": "^3.14.0", "markdown-it": "^10.0.0", "markdown-it-anchor": "^5.2.5", - "markdown-it-highlightjs": "^3.2.0", + "markdown-it-prism": "^2.1.3", "moment": "^2.27.0", "node-fetch": "^2.6.0", "nodegit": "^0.27.0", diff --git a/pages/404.html b/pages/404.html new file mode 100644 index 0000000000000000000000000000000000000000..8ed76d3e26ee88c58bdfc78f141ba3fa4642f8ce --- /dev/null +++ b/pages/404.html @@ -0,0 +1,11 @@ +--- +layout: default +title: FOUR HUNDRED AND FOUR +permalink: /404.html +--- + +
+

Error 404

+

Unfortunately, the page you're looking for doesn't exist. Maybe you made a typo, or maybe the page was moved or deleted.

+

Homepage

+
diff --git a/pages/blog/index.html b/pages/blog/index.html index a4022db8dd75a706000c528ac2836fcbf0b59918..58362897a6572910b6669cde8944fd0956cc4a6e 100644 --- a/pages/blog/index.html +++ b/pages/blog/index.html @@ -24,7 +24,7 @@ permalink: /blog/
{% assign year = "" %} -{% for blog in collections.blog %} +{% for blog in collections.blog reversed %} {% assign year2 = blog.date | date: "%Y" %} {% if year != year2 %} {% assign year = year2 %} diff --git a/pages/blog/rss.njk b/pages/blog/rss.njk index b5b618b60076e45b2495ad7b3a62a77428a300c8..2e88ef363d43311482206db4b82b56f0e2f3d225 100644 --- a/pages/blog/rss.njk +++ b/pages/blog/rss.njk @@ -21,7 +21,7 @@ metadata: {{ meta.name }} {{ meta.email }} - {%- for post in collections.blog %} + {%- for post in collections.blog -%} {% set absolutePostUrl %}{{ post.url | url | absoluteUrl(metadata.url) }}{% endset %} {{ post.data.title }} diff --git a/pages/index.html b/pages/index.html index b63c3a9b97f49d1fe6ba2688b988f426d4c76285..b70924b979b1555d458e5ccceabe40cbff1b2553 100644 --- a/pages/index.html +++ b/pages/index.html @@ -22,7 +22,7 @@ permalink: / {% assign links = "twitter fediverse github linkedin" | split: " " %} {% for link in links %} - + {% endfor %} diff --git a/pages/licenses.md b/pages/licenses.md deleted file mode 100644 index 3ec07485949cc772c03b8cf82341586a933232e8..0000000000000000000000000000000000000000 --- a/pages/licenses.md +++ /dev/null @@ -1,279 +0,0 @@ ---- -layout: page -permalink: /licenses/ ---- - -
- -# Open Source Licenses - -This page lists all (I hope) of the open source projects that are used to create, update, and maintain my personal site. - -## [11ty](https://11ty.dev/) - -``` -MIT License - -Copyright (c) 2020 Zach Leatherman @zachleat - -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. -``` - -## [NodeJS](https://nodejs.org/) - -``` -Copyright Node.js contributors. All rights reserved. - -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. -``` - -## [then-request](https://github.com/then/then-request) - -A request library that returns promises. - -``` -Copyright (c) 2014 Forbes Lindesay - -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. -``` - -## [cheerio](https://github.com/cheeriojs/cheerio) - -A fast, flexible, and lean implementation of core jQuery designed specifically for the server. - -``` -MIT License - -Copyright (c) 2016 Matt Mueller - -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. -``` - -## [instant.page](https://github.com/instantpage/instant.page) - -A small library that preloads linked pages before a user clicks on them. - -``` -MIT License - -Copyright (C) 2019 Alexandre Dieulot - -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. -``` - -## [lozad.js](https://github.com/ApoorvSaxena/lozad.js) - -Highly performant, light and configurable lazy loader in pure JS with no dependencies for images, iframes and more, using the IntersectionObserver API. - -``` - -The MIT License (MIT) - -Copyright (c) 2017 Apoorv Saxena - -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. -``` - -## [git-clone](https://github.com/jaz303/git-clone) - -A NodeJS interface to clone a git repository via shell commands. - -``` -Copyright 2014 Jason Frame - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN -NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -``` - -## [mdjavadoc](https://github.com/TheAndroidMaster/mdjavadoc) - -A script that generates markdown javadocs primarily for use in Jekyll and GitHub Pages. - -``` -MIT License - -Copyright (c) 2018 James Fenn - -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. -``` - -## [js-yaml](https://github.com/nodeca/js-yaml) - -An implementation of [YAML](http://yaml.org/), a human-friendly data serialization language, for JavaScript. - -``` -(The MIT License) - -Copyright (C) 2011-2015 by Vitaly Puzrin - -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. -``` - -## [Highlight.js](https://highlightjs.org/) - -Highlight.js is a syntax highlighter written in JavaScript. It works in the browser as well as on the server. It works with pretty much any markup, doesn’t depend on any framework, and has automatic language detection. - -``` -Copyright (c) 2006, Ivan Sagalaev -All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of highlight.js nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -``` - -
diff --git a/pages/links.njk b/pages/links.njk index b9bf14d7d2f232ef0cfc2b2a9b0269616cf1e396..018f80b50d95f5225f650bdc3c226a844d6af9da 100644 --- a/pages/links.njk +++ b/pages/links.njk @@ -3,6 +3,7 @@ pagination: data: meta.links size: 1 permalink: "links/{{ pagination.items[0] }}.html" +eleventyExcludeFromCollections: true --- diff --git a/pages/now.md b/pages/now.md index 92575b2fad9c1a525b13af1c17ba3d7cf9964b7a..145f625190cbe392ff5e453e0585335cf8f9f6d9 100644 --- a/pages/now.md +++ b/pages/now.md @@ -1,11 +1,12 @@ --- -layout: page +layout: base permalink: /now/ --- -
+
+
-This is a [now page](https://nownownow.com/about). It's a simple way to describe everything currently happening in my life. Last updated on 2020-12-08. +This is a [now page](https://nownownow.com/about). It's a simple way to share everything currently happening in my life. I last updated it on 2020-12-08. ## What am I doing now? @@ -13,6 +14,12 @@ This is a [now page](https://nownownow.com/about). It's a simple way to describe - taking CS classes at the [University of Pittsburgh](https://www.pitt.edu/) - building websites, software, and website-managing software for [Trevian International](https://trevian.xyz/) - [playing Minecraft](https://minecraft.horrific.dev/) with a group of friends and pondering [confusing redstone mechanics](https://minecraft.gamepedia.com/Tutorials/Quasi-connectivity) -- organizing things at [horrific.dev](https://horrific.dev/) +- sipping chai tea and listening to [65daysofstatic](https://65daysofstatic.bandcamp.com/music) + +### Groups I'm involved with + +[Unicorn Utterances](https://unicorn-utterances.com/) is a collaborative blog site that provides helpful resources for a variety of computer science-related topics. + +[Horrific.Dev](https://horrific.dev/) is a small collective of individual developers and enthusiasts with a focus on independent services, software, and technology.
diff --git a/pages/policies.html b/pages/policies.html new file mode 100644 index 0000000000000000000000000000000000000000..bfa657739c56e184644f6a57ca8fcfd46a1a8f10 --- /dev/null +++ b/pages/policies.html @@ -0,0 +1,408 @@ +--- +permalink: /policies/ +--- + + + + + + + + + + Privacy Policies + + + + + + + + + + + + + + + + + + + + + + + +
+

Privacy Policies

+ + arrow_back View All + +
+
+

+
+ James Fenn built the ${name} service as a ${price} and ${oss} ${type}. This service is + provided by James Fenn at no cost and is intended for use as is. +

+ This page is used to inform ${type} users of my policies regarding the collection, use, + and disclosure of any personal information that this ${type} collects during the use of + my service. +

+ If you choose to use my service, then you agree to the collection and use of information + in relation to this policy. The personal information that I collect is used to provide + and improve the service. I will not use or share your information with any party except + as described in this privacy policy. +

Information Collection and Use

+ For a better experience during the use of my service, I may ask that you provide me with + certain personally identifiable information described below. The information that I request + is ${use}. +
    + ${data::
  • I may request your ${info} in order to ${inorderto}.
  • ::} +
+

Cookies

+ Cookies are files with a small amount of data that are commonly used as anonymous unique + identifiers. These are sent to your browser from websites that you visit and are stored on your + device's internal memory. +

+ This service ${cookies:usage}. These "cookies" are ${cookies:use}. You have the option to either + accept or refuse these cookies and know when a cookie is being sent to your device. If you choose + to refuse these cookies, you will not be invited to my annual bake sale. +

Security

+ I value your trust in providing me with yor personal information, and as such I am striving to use + commercially acceptable means of protecting it. However, please be aware that no method of transmission + over the internet or method of electronic storage is 100% secure, and I cannot guarantee its absolute + security. +

+ Additionally, in the event that someone in my near vicinity visits the webpage located at + https://youtu.be/dQw4w9WgXcQ with their speakers at their + interpretation of "full blast", I may abandon any security maintenance activities that I happen to + be in the process of performing in order to substitute that with my interpretation of "appreciating my jam". +

Links to Other Services

+ This service may contain links to other websites and applications not developed by me. If you open a + third-party link, you will be directed to that service. Note that these services are not operated by + me. Therefore, I strongly advise you to review the Privacy Policy of these services. I have no control + over and assume no responsibility for the content, privacy policies, or practices of any third-party sites + or services. +

Children's Privacy

+ This privacy policy does not address anyone under the age of 13. I do not knowingly collect personally + identifiable information from children under 13. In the case that I discover that a child under 13 has + provided me with personal information, any relevant information will be immediately removed from my + servers. If you are a parent or guardian and you are aware that your child has provided me with personal + information, please contact me so that I am able to perform the necessary actions. +

Changes to this Privacy Policy

+ I may update this privacy policy from time to time. Thus, you are advised to review this page periodically + for any changes. I will notify you of any changes by posting the new privacy policy on this page. These changes + are effective immediately after they are posted on this page. +

Contact Me

+ If you have any questions about this privacy policy, please do not hesitate to contact me at + policies@jfenn.me. +
+
+
+ This privacy policy was last updated on ${lastUpdated}. +
+
+ + + + + diff --git a/pages/projects/index.html b/pages/projects/index.html index e3db31f5085da0e745a23d3670c182b19504ad49..f9728ceedcd77e2cd39745edcb0d4ec3e402169a 100644 --- a/pages/projects/index.html +++ b/pages/projects/index.html @@ -13,8 +13,7 @@ permalink: /projects/

Actually, there is a lot of discourse about how such "indie software" should - be shared with the community, and I've been experimenting with my own - solutions. You can read more about that here. + be shared with the community. You can read more about that here.

diff --git a/pages/projects/project.html b/pages/projects/project.html deleted file mode 100644 index c503d136c482efe66e436f6c0937315532ad9370..0000000000000000000000000000000000000000 --- a/pages/projects/project.html +++ /dev/null @@ -1,85 +0,0 @@ ---- -layout: base -pagination: - data: git.projects - size: 1 -permalink: "projects2/{{ pagination.items[0].id }}/index.html" ---- - -{% for project in pagination.items %} -
-
-

{{ project.title }}

-

{{ project.repo.description }}

-
- - -
-
-
-
- {% if project.hasWiki %} -
-
- - book - Wiki - -
- Find helpful information about this project - tutorials, guides, documentation, and more! -
-
-
- {% endif %} -
-
- - people - Contributing - -
- Interested in working with this project or volunteering to help? Get started here! -
-
-
-
-
- - email - Contact Me - -
- Have any questions or concerns? Don't hesitate to reach out! (prompt replies not guaranteed) -
-
-
-
-
-
- -
-
- {{ project.readme | markdownify }} -
-
-{% endfor %} diff --git a/pages/projects/wiki.html b/pages/projects/wiki.html index 7383454dd6df08c8863ec59d5ab256ffa21df35e..f9a1e63a9b50edc9c6c01e79fe87aad004e99674 100644 --- a/pages/projects/wiki.html +++ b/pages/projects/wiki.html @@ -3,6 +3,7 @@ layout: base pagination: data: git.wikis size: 1 + addAllPagesToCollections: true permalink: "projects/{{ pagination.items[0].id }}/wiki/{{ pagination.items[0].page }}.html" --- diff --git a/projects/attribouter.html b/projects/attribouter.html index a3cb75fc69fcfa6826c061f609c8248d4198ff1c..aca0e45538569ac87ecc67ce5dd0856068032325 100644 --- a/projects/attribouter.html +++ b/projects/attribouter.html @@ -4,11 +4,9 @@ tags: project-tool ---
-
- -
-
- +
+ +

Contributor Profiles

@@ -16,14 +14,12 @@ tags: project-tool
-
+===
-
- -
-
- +
+ +

License Information

@@ -31,14 +27,12 @@ tags: project-tool
-
+===
-
- -
-
- +
+ +

Night Theme

@@ -46,7 +40,7 @@ tags: project-tool
-
+===
diff --git a/projects/git-rest-wrapper.html b/projects/git-rest-wrapper.html index 7d868c483be204dc3d12593566b23b8f14848d2b..1e577bec5c0a83d90a448a8850bc5abf94ddf5f9 100644 --- a/projects/git-rest-wrapper.html +++ b/projects/git-rest-wrapper.html @@ -9,17 +9,22 @@ tags: project-tool

Written in Kotlin, the library has seamless compatibility with JavaScript, NodeJS, JVM, and Android platforms.

-
+===
-
{
+{% capture codeblock %}
+```json
+{
     "id": "user",
 	"name": "User Human",
 	"url": "https://code.horrific.dev/user",
 	"avatarUrl": "https://example.com/photo.png",
 	"websiteUrl": "https://example.com"
-}
+} +``` +{% endcapture %} +{{ codeblock | markdownify }}

Consistent data representation

@@ -27,7 +32,7 @@ tags: project-tool
-
+===
diff --git a/projects/ktordocs.html b/projects/ktordocs.html index c0868a29b8779d99024ed91fbe3d596722f5d1a2..694c5544fe9b5b14da6a3d0b8ec12b6d77e69148 100644 --- a/projects/ktordocs.html +++ b/projects/ktordocs.html @@ -9,18 +9,23 @@ tags: project-tool

Provide comprehensive API documentation with minimal effort!

-
+===
-
get("/api/v1/example") {
+{% capture codeblock %}
+```kt
+get("/api/v1/example") {
     docs {
         title = "Hello World"
         desc = "Says hello to the world."
     }
 
     call.respondText("Hello world!")
-}
+} +``` +{% endcapture %} +{{ codeblock | markdownify }}

Minimal API

@@ -28,11 +33,11 @@ tags: project-tool
-
+===
- +

Markdown Support

diff --git a/projects/metronome.html b/projects/metronome.html index 0f0988d841a8f22b5fdd468cd115ee269070fe64..0a15e43182fd127bbb3935a1e071c8d403f78862 100644 --- a/projects/metronome.html +++ b/projects/metronome.html @@ -3,6 +3,17 @@ layout: layouts/project tags: project-app --- -Hello +

Tempo Slider

+

Swipe in either direction to change the tempo, or press the arrows for a more precise adjustment.

+

Emphasized Beats

+

Use the +/- buttons to add or remove beats, then select them to add emphasis.

+

Multiple Sounds

+

Use the dropdown menu at the top of the screen to select a sound.

+ +

Bookmarks

+

Press the bookmark icon in the bottom right of the screen to save a tempo for easy access.

+ +

Themes

+

Change the theme of the application with the dropdown at the bottom of the about section.