diff options
Diffstat (limited to 'src/assets')
-rw-r--r-- | src/assets/assets.11tydata.json | 3 | ||||
-rw-r--r-- | src/assets/atom.njk | 26 | ||||
-rw-r--r-- | src/assets/error.md | 11 | ||||
-rw-r--r-- | src/assets/index.mjs | 13 | ||||
-rw-r--r-- | src/assets/json.njk | 30 | ||||
-rw-r--r-- | src/assets/manifest.njk | 29 | ||||
-rw-r--r-- | src/assets/prism.css | 130 | ||||
-rw-r--r-- | src/assets/robot.njk | 6 | ||||
-rw-r--r-- | src/assets/sitemap.njk | 14 | ||||
-rw-r--r-- | src/assets/sw.11tydata.json | 3 | ||||
-rw-r--r-- | src/assets/sw.mjs | 63 |
11 files changed, 328 insertions, 0 deletions
diff --git a/src/assets/assets.11tydata.json b/src/assets/assets.11tydata.json new file mode 100644 index 0000000..45b2b90 --- /dev/null +++ b/src/assets/assets.11tydata.json @@ -0,0 +1,3 @@ +{ + "eleventyExcludeFromCollections": true +}
\ No newline at end of file diff --git a/src/assets/atom.njk b/src/assets/atom.njk new file mode 100644 index 0000000..4e517ca --- /dev/null +++ b/src/assets/atom.njk @@ -0,0 +1,26 @@ +--- +permalink: /feed.xml +--- +<?xml version="1.0" encoding="utf-8"?> +<feed xmlns="http://www.w3.org/2005/Atom"> + <title>{{ metadata.title }}</title> + <subtitle>{{ metadata.description }}</subtitle> + <link href="{{ permalink | url | absoluteUrl(metadata.url) }}" rel="self"/> + <link href="{{ "/" | url | absoluteUrl(metadata.url) }}"/> + <updated>{{ collections.posts | getNewestCollectionItemDate | dateToRfc3339 }}</updated> + <id>{{ metadata.url }}</id> + <author> + <name>{{ metadata.author.name }}</name> + <email>{{ metadata.author.email }}</email> + </author> + {% for post in collections.posts %} + {% set absolutePostUrl %}{{ post.url | url | absoluteUrl(metadata.url) }}{% endset %} + <entry> + <title>{{ post.data.title }}</title> + <link href="{{ absolutePostUrl }}"/> + <updated>{{ post.date | dateToRfc3339 }}</updated> + <id>{{ '/' | url | absoluteUrl(metadata.url) }}</id> + <content type="html"><![CDATA[{{ post.templateContent | htmlToAbsoluteUrls( absolutePostUrl ) }}]]></content> + </entry> + {% endfor %} +</feed> diff --git a/src/assets/error.md b/src/assets/error.md new file mode 100644 index 0000000..65655f3 --- /dev/null +++ b/src/assets/error.md @@ -0,0 +1,11 @@ +--- +layout: base.njk +pagination: + data: err + size: 1 + alias: error +permalink: "/{{ error.code }}.html" +--- +# ERROR: {{ error.code }} {.err} + +{{ error.msg }} diff --git a/src/assets/index.mjs b/src/assets/index.mjs new file mode 100644 index 0000000..99a92fc --- /dev/null +++ b/src/assets/index.mjs @@ -0,0 +1,13 @@ +const main = async () => { + window.addEventListener('load', async () => { + if ('serviceWorker' in navigator) { + try { + var sw = await navigator.serviceWorker.register('/sw.js') + } catch { + console.log("Service Worker failed to register") + } + } + }) +} + +main() diff --git a/src/assets/json.njk b/src/assets/json.njk new file mode 100644 index 0000000..6d8c7ec --- /dev/null +++ b/src/assets/json.njk @@ -0,0 +1,30 @@ +--- +permalink: /feed.json +--- +{ + "version": "https://jsonfeed.org/version/1.1", + "title": "{{ metadata.title }}", + "language": "{{ metadata.language }}", + "home_page_url": "{{ "/" | url | absoluteUrl(metadata.url) }}", + "feed_url": "{{ permalink | url | absoluteUrl(metadata.url) }}", + "description": "{{ metadata.description }}", + "author": { + "name": "{{ metadata.author.name }}" + }, + "items": [ + {%- for post in collections.posts | reverse %} + {%- set absolutePostUrl %}{{ post.url | url | absoluteUrl(metadata.url) }}{% endset -%} + { + "id": "{{ absolutePostUrl }}", + "url": "{{ absolutePostUrl }}", + "title": "{{ post.data.title }}", + "content_html": {% if post.templateContent %}{{ post.templateContent | htmlToAbsoluteUrls(absolutePostUrl) | dump | safe }} + {% else %}""{% endif %}, + "date_published": "{{ post.date | rssDate }}" + } + {%- if not loop.last -%} + , + {%- endif -%} +{%- endfor %} +] +} diff --git a/src/assets/manifest.njk b/src/assets/manifest.njk new file mode 100644 index 0000000..3942d06 --- /dev/null +++ b/src/assets/manifest.njk @@ -0,0 +1,29 @@ +--- +permalink: /app.webmanifest +--- +{ + "$schema": "https://json.schemastore.org/web-manifest-combined.json", + "name": "{{ metadata.title }}", + + "lang": "en-GB", + "start_url": "{{ '/' | url }}", + "id": "{{ '/' | url }}", + "scope": "{{ '/' | url }}", + "display": "minimal-ui", + "background_color": "red", + "theme_color": "red", + "description": "{{ metadata.description }}", + "icons": [ + { + "src": "{{ '/favicon.ico' | url }}", + "sizes": "256x256", + "type": "image/vnd.microsoft.icon" + }, + { + "src": "{{ '/favicon.svg' | url }}", + "sizes": "any", + "type": "image/svg+xml" + } + ] + +} diff --git a/src/assets/prism.css b/src/assets/prism.css new file mode 100644 index 0000000..431fe8a --- /dev/null +++ b/src/assets/prism.css @@ -0,0 +1,130 @@ +code[class*="language-"],pre[class*="language-"] { + color: #f8f8f2; + background: none; + text-shadow: 0 1px rgba(0, 0, 0, 0.3); + font-family: monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + tab-size: 4; + hyphens: none; +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; + border-radius: 0.3em; +} + +:not(pre) > code[class*="language-"],pre[class*="language-"] { + background: #272822; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment,.token.prolog,.token.doctype,.token.cdata { + color: #8292a2; +} + +.token.punctuation { + color: #f8f8f2; +} + +.token.namespace { + opacity: .7; +} + +.token.property,.token.tag,.token.constant,.token.symbol,.token.deleted { + color: #f92672; +} + +.token.boolean,.token.number { + color: #ae81ff; +} + +.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted { + color: #a6e22e; +} + +.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string,.token.variable { + color: #f8f8f2; +} + +.token.atrule,.token.attr-value,.token.function,.token.class-name { + color: #e6db74; +} + +.token.keyword { + color: #66d9ef; +} + +.token.regex,.token.important { + color: #fd971f; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +@media screen and (prefers-color-scheme: dark){ + code[class*="language-"],pre[class*="language-"] { + color: black; + text-shadow: 0 1px white; + } + + :not(pre) > code[class*="language-"], pre[class*="language-"] { + background: #f5f2f0; + } + + .token.comment,.token.prolog,.token.doctype,.token.cdata { + color: slategray; + } + + .token.punctuation { + color: #999; + } + + .token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted { + color: #905; + } + + .token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted { + color: #690; + } + + .token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, .5); + } + + .token.atrule,.token.attr-value,.token.keyword { + color: #07a; + } + + .token.function,.token.class-name { + color: #DD4A68; + } + + .token.regex,.token.important,.token.variable { + color: #e90; + } +}
\ No newline at end of file diff --git a/src/assets/robot.njk b/src/assets/robot.njk new file mode 100644 index 0000000..dcaa728 --- /dev/null +++ b/src/assets/robot.njk @@ -0,0 +1,6 @@ +--- +permalink: /robot.txt +--- +User-agent: * +Allow: / +Sitemap: {{ "/"| url | absoluteUrl(metadata.url) }}/sitemap.xml
\ No newline at end of file diff --git a/src/assets/sitemap.njk b/src/assets/sitemap.njk new file mode 100644 index 0000000..910b238 --- /dev/null +++ b/src/assets/sitemap.njk @@ -0,0 +1,14 @@ +--- +permalink: /sitemap.xml +--- +<?xml version="1.0" encoding="utf-8"?> +<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> +{%- for page in collections.all %} + {% set absoluteUrl %}{{ page.url | url | absoluteUrl(metadata.url) }}{% endset %} + <url> + <loc>{{ absoluteUrl }}</loc> + <lastmod>{{ page.date | datefmt }}</lastmod> + </url> +{%- endfor %} +</urlset> + diff --git a/src/assets/sw.11tydata.json b/src/assets/sw.11tydata.json new file mode 100644 index 0000000..55b70b5 --- /dev/null +++ b/src/assets/sw.11tydata.json @@ -0,0 +1,3 @@ +{ + "permalink": "/sw.js" +}
\ No newline at end of file diff --git a/src/assets/sw.mjs b/src/assets/sw.mjs new file mode 100644 index 0000000..432e630 --- /dev/null +++ b/src/assets/sw.mjs @@ -0,0 +1,63 @@ +const cache_name = "v3" + +const install_sw = async event => { + const precache = async() => { + const cache = await caches.open(cache_name); + return cache.addAll([ + '/index.css', + '/prism.css', + '/index.js', + '/sw.js', + '/favicon.svg', + '/offline.html', + '/' + ]) + } + event.waitUntil(precache()) +} + +const activate_sw = async event => { + const cachepreserve = ['v3']; + + const invalidatecache = async() => { + const keys = await caches.keys() + Promise.all( + keys.map((key) => { + if (cachepreserve.indexOf(key) === -1) { + return caches.delete(key) + } + })) + } + event.waitUntil(invalidatecache()) +} + +const fetch_sw = async event => { + const cache_fetch = async() => { + if (event.request.method != 'GET') { + return + } + const cacheres = await caches.match(event.request) + if (cacheres !== undefined) { + return cacheres + } + try { + const response = await fetch(event.request) + const cache = await caches.open(cache_name) + cache.put(event.request, response.clone()) + return response + } catch { + return caches.match('/offline.html') + } + } + + event.respondWith(cache_fetch()) +} + +const main = async() => { + self.addEventListener('install', install_sw) + self.addEventListener('activate', activate_sw) + self.addEventListener('fetch', fetch_sw) + +} + +main()
\ No newline at end of file |