From e04d8286f9fc4bdcf5ba7d6337aece430f1f8069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sof=C3=ADa=20Aritz?= Date: Wed, 6 Dec 2023 18:17:16 +0100 Subject: [PATCH] Initial commit --- .eleventy.js | 20 +++ README.md | 15 +-- package.json | 2 + src/_includes/base_page.njk | 77 +++++++++-- src/_includes/post.njk | 45 +++++++ src/contact.md | 25 ++++ src/contacto.md | 26 ++++ src/index.md | 21 ++- src/meta/archived.md | 15 +++ src/meta/index.md | 12 ++ src/meta/maintenance-tiers.md | 54 ++++++++ src/proyectos.md | 22 ++++ src/weblog/2023/11/updated-website.md | 50 +++++++ src/weblog/archived/firstpost.md | 19 +++ src/weblog/archived/note-taking-2.md | 101 ++++++++++++++ src/weblog/archived/note-taking-experiment.md | 117 +++++++++++++++++ src/weblog/en_index.njk | 30 +++++ src/weblog/index.njk | 28 ++++ src/weblog/tags.njk | 22 ++++ src/weblog/tags/archived.md | 7 + static/{ => assets}/css/base.css | 24 +++- static/assets/css/comments.css | 39 ++++++ static/assets/css/fonts.css | 34 +++++ static/assets/libraries/dompurify.js | 2 + .../archived/note-taking-2/diagram1.svg | 124 ++++++++++++++++++ .../note-creation.png | Bin 0 -> 18585 bytes .../note-taking-experimental/note-list.png | Bin 0 -> 37085 bytes .../password-prompt.png | Bin 0 -> 18289 bytes .../note-taking-experimental/top-buttons.png | Bin 0 -> 10879 bytes static/assets/weblog/comments.js | 43 ++++++ yarn.lock | 10 ++ 31 files changed, 947 insertions(+), 37 deletions(-) create mode 100644 src/_includes/post.njk create mode 100644 src/contact.md create mode 100644 src/contacto.md create mode 100644 src/meta/archived.md create mode 100644 src/meta/index.md create mode 100644 src/meta/maintenance-tiers.md create mode 100644 src/proyectos.md create mode 100644 src/weblog/2023/11/updated-website.md create mode 100755 src/weblog/archived/firstpost.md create mode 100755 src/weblog/archived/note-taking-2.md create mode 100755 src/weblog/archived/note-taking-experiment.md create mode 100644 src/weblog/en_index.njk create mode 100644 src/weblog/index.njk create mode 100644 src/weblog/tags.njk create mode 100644 src/weblog/tags/archived.md rename static/{ => assets}/css/base.css (64%) create mode 100644 static/assets/css/comments.css create mode 100644 static/assets/css/fonts.css create mode 100644 static/assets/libraries/dompurify.js create mode 100755 static/assets/weblog/archived/note-taking-2/diagram1.svg create mode 100755 static/assets/weblog/archived/note-taking-experimental/note-creation.png create mode 100755 static/assets/weblog/archived/note-taking-experimental/note-list.png create mode 100755 static/assets/weblog/archived/note-taking-experimental/password-prompt.png create mode 100755 static/assets/weblog/archived/note-taking-experimental/top-buttons.png create mode 100644 static/assets/weblog/comments.js diff --git a/.eleventy.js b/.eleventy.js index 1a1272b..bb8792b 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -1,15 +1,35 @@ +const { DateTime } = require("luxon") const markdownIt = require("markdown-it"); const markdownItAnchor = require("markdown-it-anchor"); +const timeToRead = require("eleventy-plugin-time-to-read") module.exports = function(eleventyConfig) { eleventyConfig.addPassthroughCopy({ "static": "/" }) + eleventyConfig.addPlugin(timeToRead, { + language: "en", + style: "long", + hours: "auto", + minutes: true, + }) + eleventyConfig.setLibrary("md", markdownIt({ html: true }).use(markdownItAnchor, { level: 2 })) + eleventyConfig.addFilter("relevantTags", tags => tags.filter(v => !["archived", "post"].includes(v))) + + eleventyConfig.addFilter("readableDate", dateObj => { + return DateTime.fromJSDate(dateObj, {zone: 'utc'}).setLocale("es-ES").toFormat("dd LLL yyyy"); + }) + + // https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-date-string + eleventyConfig.addFilter('htmlDateString', dateObj => { + return DateTime.fromJSDate(dateObj, {zone: 'utc'}).toFormat('yyyy-LL-dd'); + }) + return { passthroughFileCopy: true, dir: { diff --git a/README.md b/README.md index d2e261d..7af4082 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,5 @@ -# Eleventy Base +# sofi web -A template for creating [11ty](https://www.11ty.dev/docs/) websites. +My personal website :) -## Getting started - -Run `yarn` to resolve the dependencies. - -Make sure to check the following files and change them according to your needs: -* [src/_includes/base_page.njk](src/_includes/base_page.njk). This is the base page, you should change the title of the -page. -* [static/css/base.css](static/css/base.css). This is the base theme, you should at least change the colors. - -After changing the files, run `yarn serve` to serve the website. +[sofiaritz.com](https://sofiaritz.com) \ No newline at end of file diff --git a/package.json b/package.json index 9a4cea6..aa91861 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,8 @@ "private": true, "devDependencies": { "@11ty/eleventy": "^2.0.1", + "eleventy-plugin-time-to-read": "^1.3.0", + "luxon": "^3.4.4", "markdown-it": "^13.0.2", "markdown-it-anchor": "^8.6.7" }, diff --git a/src/_includes/base_page.njk b/src/_includes/base_page.njk index 9097866..80f74f8 100644 --- a/src/_includes/base_page.njk +++ b/src/_includes/base_page.njk @@ -5,25 +5,76 @@ - - {% if title %} {{ title }} - {% endif %}11ty base + + + + {% if styles %} + {% for style in styles %} + + {% endfor %} + {% endif %} + {% if title %} {{ title }} - {% endif %}sofi web -

11TY BASE

+

sofi web

-
{{ content | safe }}
+
+{% if scripts %} + {% for script in scripts %} + + {% endfor %} +{% endif %} \ No newline at end of file diff --git a/src/_includes/post.njk b/src/_includes/post.njk new file mode 100644 index 0000000..b766a35 --- /dev/null +++ b/src/_includes/post.njk @@ -0,0 +1,45 @@ +--- +layout: base_page.njk +scripts: ["/assets/weblog/comments.js", "/assets/libraries/dompurify.js"] +styles: ["/assets/css/comments.css"] +--- + +

{{ title }}

+
+ {% if date %} + | + {% endif %} + + {% if tags.includes("archived") %} + Archived post | + {% endif %} + + {% if tags %} + {% if tags.length > 1 %} + Tags: + {% else %} + Tag: + {% endif %} + {% set relTags = tags | relevantTags %} + {% for tag in relTags %} + {{ tag }} {% if loop.last == false %}·{% endif %} + {% endfor %} + | + {% endif %} + {{ content | timeToRead }} | + Comments +
+ + + +{{ content | safe }} + +{% if comment_status %} +
+
+
+

comments · post

+
+
+
+{% endif %} \ No newline at end of file diff --git a/src/contact.md b/src/contact.md new file mode 100644 index 0000000..dcb4671 --- /dev/null +++ b/src/contact.md @@ -0,0 +1,25 @@ +--- +layout: base_page.njk +title: contact +permalink: /en/contact.html +lang: "en" +--- + +# contact + +### direct contact + +* E-mail: [sofi@sofiaritz.com](mailto:sofi@sofiaritz.com) +* Matrix: [@sofiaritz:matrix.org](https://matrix.to/#/@sofiaritz:matrix.org) + +### social media + +* Forgejo: [sofia@git.sofiaritz.com](https://git.sofiaritz.com/sofia) +* Fediverse: [@me@sofiaritz.com](https://hachyderm.io/@sofiaritz) (@sofiaritz@hachyderm.io) + +### encryption and signing + +You can find my public PGP key at [/keys/pub.asc](/keys/pub.asc), it's also available at the +[Ubuntu keyservers](https://keyserver.ubuntu.com/). + +The fingerprint of the cert is: `4BB1 6A74 5DE1 C776 5CF3 8788 90B5 116E 3542 B28F`. \ No newline at end of file diff --git a/src/contacto.md b/src/contacto.md new file mode 100644 index 0000000..e36d893 --- /dev/null +++ b/src/contacto.md @@ -0,0 +1,26 @@ +--- +layout: base_page.njk +title: contacto +permalink: /contact.html +--- + +# contacto + +Si tienes interés en trabajar conmigo, visita mi [página de trabajo](https://work.sofiaritz.com/). + +### contacto directo + +* Correo electrónico: [sofi@sofiaritz.com](mailto:sofi@sofiaritz.com) +* Matrix: [@sofiaritz:matrix.org](https://matrix.to/#/@sofiaritz:matrix.org) + +### redes sociales + +* Forgejo: [sofia@git.sofiaritz.com](https://git.sofiaritz.com/sofia) +* Fediverse: [@me@sofiaritz.com](https://hachyderm.io/@sofiaritz) (@sofiaritz@hachyderm.io) + +### cifrado y firma + +Puedes encontrar mi clave PGP pública en [/keys/pub.asc](/keys/pub.asc), también disponible en los +[keyservers de Ubuntu](https://keyserver.ubuntu.com/). + +La huella digital del certificado es: `4BB1 6A74 5DE1 C776 5CF3 8788 90B5 116E 3542 B28F`. \ No newline at end of file diff --git a/src/index.md b/src/index.md index fd5dd1e..dbf0dce 100644 --- a/src/index.md +++ b/src/index.md @@ -2,12 +2,23 @@ layout: base_page.njk --- -# eleventy base +# inicio -This is a template for creating [11ty](https://www.11ty.dev/docs/) websites. +Soy Sofía, aunque la gente me suele llamar Sofi. -The default theme isn't beautiful, but it isn't meant to be. Head over to the `static/css/base.css` file and change -the colors to suit your style. +Pese a ser una estudiante estoy trabajando en algunos [proyectos](/proyectos) centrados en la creación de herramientas +para ayudar a desarrolladores crear sistemas más privados y seguros. Además de esto, colaboro en algunos proyectos cuyo +objetivo es devolver a los usuarios el control sobre sus datos. -Make sure to check the `src/_includes/base_page.njk` to change things like the title and stuff like that. +Trato de usar e impulsar el uso de [estándares abiertos](https://es.wikipedia.org/wiki/Est%C3%A1ndar_abierto) y +sistemas [descentralizados](https://es.wikipedia.org/wiki/Descentralizaci%C3%B3n), ya que se alinean con mis +[objetivos](https://work.sofiaritz.com/objetivos/) a la hora de crear software. +Además del mundo de la computación, tengo un especial interés en el mundo lingüístico, en especial en +las [lenguas construidas](https://es.wikipedia.org/wiki/Lengua_construida) y el +[Toki Pona](https://es.wikipedia.org/wiki/Toki_pona). + +En lo que respecta a las tecnologías que suelo manejar, todo depende del proyecto y sus especificaciones, pero tiendo +a centrarme en [Rust](https://es.wikipedia.org/wiki/Rust_(lenguaje_de_programaci%C3%B3n)) o [Zig](https://ziglang.org/) +y [JavaScript](https://es.wikipedia.org/wiki/JavaScript). Este es un indicador muy simple, pues cada lenguaje +tiene distintas ramificaciones, pero esta página de inicio no es el lugar para detallar el uso que le doy a cada uno. diff --git a/src/meta/archived.md b/src/meta/archived.md new file mode 100644 index 0000000..efd05d4 --- /dev/null +++ b/src/meta/archived.md @@ -0,0 +1,15 @@ +--- +layout: base_page.njk +title: archived +--- + +# archived pages + +Archived pages are left for historical purposes, but should be taken with a grain of salt. + +Archived pages _could_ contain the following problems: +* Their content is not up-to-date. +* Their content is not accurate. +* They do not represent my current views or opinions. +* They contain broken links, images, etc. + * If you find any of these, [contact me](/contacto), and I'll do my best to fix it. \ No newline at end of file diff --git a/src/meta/index.md b/src/meta/index.md new file mode 100644 index 0000000..43e92f6 --- /dev/null +++ b/src/meta/index.md @@ -0,0 +1,12 @@ +--- +layout: base_page.njk +title: meta +--- + +# meta + +The purpose of this page is to serve as an index to the various documents related to non-technical aspects of the +projects I maintain. + +* [archived pages](/meta/archived) +* [maintenance tiers](/meta/maintenance-tiers) \ No newline at end of file diff --git a/src/meta/maintenance-tiers.md b/src/meta/maintenance-tiers.md new file mode 100644 index 0000000..f180ee1 --- /dev/null +++ b/src/meta/maintenance-tiers.md @@ -0,0 +1,54 @@ +--- +layout: base_page.njk +title: maintenance tiers +--- + +# maintenance tiers + +Not all projects are treated equal. Some are in active development, others are finished, others are deprecated, etc. + +The purpose of this page is to show what does each tier mean. Some projects may not adhere to the descriptions here, +any deviation from this page _should_ be documented in the project itself. + +## active development + +**Recommendation:** feel free to use the project. + +* The project is not finished yet and new features will arrive in the future. +* The response time to issues and pull requests is good. +* New features are welcome after some public discussion. + +## finished + +**Recommendation:** feel free to use the project. + +* The project serves its purpose and does not need any more features. +* The response time to issues and pull requests is good, but those related to new features _may_ be rejected. +* Any unexpected behaviour will be fixed by myself (unless a pull request is sent by someone else). + +## low maintenance + +**Recommendation:** feel free to use the project. + +* The project serves its purpose and does not need any more features, but its relevance has decreased. +* The response time to issues and pull requests _can_ be worse. + * Pull requests related to new features _will_ be rejected. +* I will not work on any non-security issues, but will review and merge pull requests. +* Anyone can become a maintainer after [contacting me](/contacto). + +## deprecated + +**Recommendation:** switch to an alternative or start maintaining your own fork. + +* The project is not actively maintained anymore. +* I will not work on any issues, but I will review and merge pull requests related to security issues. +* Feel free to maintain your own fork. + +## decommissioned/archived + +**Recommendation:** switch to an alternative or start maintaining your own fork **as soon as possible**. + +* The project is not maintained at all. +* I will not work on any issues. +* Pull requests will not be reviewed nor merged. +* Feel free to maintain your own fork. \ No newline at end of file diff --git a/src/proyectos.md b/src/proyectos.md new file mode 100644 index 0000000..20a6a83 --- /dev/null +++ b/src/proyectos.md @@ -0,0 +1,22 @@ +--- +layout: base_page.njk +title: proyectos +--- + +# proyectos + +## GFonts + +[GFonts](https://git.sofiaritz.com/GFonts) es un proyecto cuyo objetivo es proveer una serie de herramientas que en +su conjunto ofrezcan una alternativa de código abierto y +[_autohospedada_](https://en.wikipedia.org/wiki/Self-hosting_(web_services)) de +[Google Fonts](https://fonts.google.com/). + +El proyecto sigue en desarrollo, y aún no existe un post que resuma los objetivos, motivaciones e ideas del proyecto +de una manera sistemática. Mientras tanto, puedes visitar la página en mi +[mirror de Google Fonts](https://cdn.sofiaritz.com/fonts/) para obtener más información. + +## otros + +Puedes visitar mi [instancia de Forgejo](https://git.sofiaritz.com/explore/repos) para ver más proyectos míos y también +mi [cuenta de GitHub](https://github.com/sofiaritz) para ver mis contribuciones a otros proyectos. \ No newline at end of file diff --git a/src/weblog/2023/11/updated-website.md b/src/weblog/2023/11/updated-website.md new file mode 100644 index 0000000..c46e1bd --- /dev/null +++ b/src/weblog/2023/11/updated-website.md @@ -0,0 +1,50 @@ +--- +layout: post.njk +title: Major update +intro: The first major update to this website and the start of a new era. +tags: + - meta + - website + - post + - en +date: 2023-11-28 +--- + +This website has received its first major update since +[Jan 2, 2023](https://git.sofiaritz.com/sofia/website/commit/cce91e6649575cb2ac5a19cbe4a058115df10a5a)! The design may +look familiar, but some things have changed: +1. The background is a _proper_ pattern now (I still can't recall where I got the old background from) +2. The [weblog index](/weblog) has been streamlined, and now it's the same for both the English and Spanish page. +3. I've added support for [tags](/weblog/tags/meta/)! +4. Some minor usability improvements. + +There are also new additions! Support for comments has been added using the Mastodon API. Graceful degradation has +played an important role in this remake, this website is fully viewable in the +[Nintendo 3DS Browser](https://en.wikipedia.org/wiki/NetFront) with some minor rendering glitches. + +The navbar has a new section: _links_, this section provides quick access to things like the +[Status page](https://status.sofiaritz.com/) and my [Forgejo instance](https://git.sofiaritz.com/explore/repos). + +## a new era + +This is not only a stylistic and QoL change. This major change is part of the +Common Unification Project, a project whose purpose is to develop a set of guidelines around styling, design process, +maintenance and governance of the projects I maintain. These guidelines will be slowly added to the +[_meta_ page](/meta). + +[Some projects](https://status.sofiaritz.com/) have also [been deprecated](/meta/maintenance-tiers/#deprecated), which +means that they may be [decommissioned](/meta/maintenance-tiers/#decommissioned%2Farchived) in the near future. + +This will allow me to focus on some projects that will be released to the public in the following months. + +## technicalities + +This website, like the previous version, uses [11ty](https://www.11ty.dev) to prerender all the pages. + +New weblog entries will follow the following path convention: `/weblog/YYYY/mm/`. Older posts have been +[archived](/meta/archived). + +## to be done + +There are still many things to be done, like RSS feeds, improved internationalization, and +[webmention](https://indieweb.org/Webmention) support. \ No newline at end of file diff --git a/src/weblog/archived/firstpost.md b/src/weblog/archived/firstpost.md new file mode 100755 index 0000000..cb6f82e --- /dev/null +++ b/src/weblog/archived/firstpost.md @@ -0,0 +1,19 @@ +--- +layout: post.njk +title: Primer post +intro: El nacimiento de mi weblog! :) +tags: + - meta + - archived + - es +date: 2023-03-12 +permalink: /weblog/firstpost/ +--- + +Este es el primer post del weblog! Aquí iré compartiendo ideas, ocurrencias y experiencias a medida que me mueva por +los mundos de Internet y la programación. + +Ahora mismo este weblog está parcialmente incompleto, pero dentro de poco añadiré las cosas que faltan para que esté +completamente a punto ([RSS](https://es.wikipedia.org/wiki/RSS), etiquetas, comentarios, etc). + +Cualquier sugerencia o idea para este weblog podéis [enviármela](/contact) sin problema! diff --git a/src/weblog/archived/note-taking-2.md b/src/weblog/archived/note-taking-2.md new file mode 100755 index 0000000..e43b23c --- /dev/null +++ b/src/weblog/archived/note-taking-2.md @@ -0,0 +1,101 @@ +--- +layout: post.njk +title: Note Taking (II). Retos +intro: Retos encontrados por el camino. +tags: + - rust + - experimentos + - note taking + - archived + - es +date: 2023-05-06 +permalink: /weblog/note-taking-2/ +--- + +Hace unos meses comencé a crear [Note Taking](https://git.sofiaritz.com/sofia/note-taking), una aplicación cuyo +propósito era la creación de un software que permitiera crear notas encriptadas de una manera sencilla y segura. + +Surgió como un prototipo [sobre el que fui iterando](/weblog/note-taking-experiment) hasta llegar a lo que es hoy día: +una plataforma relativamente estable, simple y segura para crear notas. + +Pese a que el concepto es sencillo, en la ejecución lo está todo. Y ahí se yace el propósito de este artículo: mostrar +los retos que me he encontrado en este camino. + +## seguridad + +La seguridad es sin duda uno de los apartados más importantes y complejos de este software. A día de hoy el sistema +utilizado es el siguiente: + + + +Este sistema actualmente funciona bien: +* Todas las contraseñas tienen una alta entropía gracias al uso de Argon2 (un [KDF](https://es.wikipedia.org/wiki/Funci%C3%B3n_de_derivaci%C3%B3n_de_clave)). +* [pwbox](https://github.com/exonum/pwbox-rs) se encarga de encriptar las notas usando el resultado derivado de la +contraseña original. + +Pero ello no implica que tenga algunos problemas, en especial **la imposibilidad de cambiar contraseñas**. + +## cambio de contraseñas + +En un software como este, es frecuente que el usuario quiera cambiar de contraseñas ocasionalmente por variadas razones: +cambio rutinario preventivo, contraseñas que han sido expuestas, etc. + +El sistema actual impide que esto sea posible, pues la contraseña es la base de la encriptación. A día de hoy para poder +cambiar la contraseña sería necesario ir nota por nota desencriptándola y reencriptándola. Esto es un proceso que puede +parecer [sencillo](https://git.sofiaritz.com/sofia/note-taking/src/commit/c97700b29aba660ffe7b6753266d6559a84b8d01/src/password/mod.rs#L59), +pero en cuanto el número de notas crece, una operación de este tipo se vuelve imposible de manejar. + +### posibles soluciones + +Existen varios caminos que se pueden tomar para solucionar esto, pero el que creo que va a ser utilizado va a ser el +siguiente: + +Cada nota contiene una clave única que es la utilizada para encriptar los contenidos de la misma. Esta clave única, +antes de ser almacenada en los _metadatos_ de la nota pasa por el sistema [descrito anteriormente](#seguridad). + +Esto permite lo siguiente: +* Cada nota tiene su clave única de encriptación, por lo tanto, un ataque de fuerza bruta directamente en la nota pierde +utilidad. +* El uso de una clave de encriptación única y permanente por nota permite que el cambio de la contraseña solo tenga que +afectar a un centenar de bits en lugar de varios miles de bits, pues únicamente habría que reencriptar la clave de +cada nota. + +## metadatos + +A día de hoy, todos los metadatos (título, metadatos explícitos, fecha, etc) están sin encriptar. Esto es algo bastante +delicado, pues muchas veces los metadatos son mucho más _dañinos_ de lo que nos podemos imaginar. + +Tengo pensado crear un archivo especial para las notas que pueda contener todas las notas de una manera centralizada +y segura. En un principio una nota tendría una estructura similar a la siguiente: + +* Longitud de la clave encriptada +* Clave encriptada +* Longitud de los metadatos +* Metadatos en JSON encriptados +* Longitud de la nota +* Nota encriptada +* Checksum de la nota + +Además de esto, el archivo estaría versionado y trataría de ser lo más escalable posible en lo que a futuros _metadatos +especiales_ (fecha, autor, etc) respecta. + +## riqueza + +A día de hoy las notas son simplemente texto plano. Otra de las cosas que tengo pensadas añadir es soporte básico de +Markdown (únicamente cosas como **negrita**, _cursiva_, ~~tachado~~, etc.) + +Me encantaría añadir soporte para imágenes, pero usando Markdown _estándar_ es peligroso para la seguridad de los +usuarios. Una alternativa sería aprovechar la creación de un archivo personalizado para añadir una sección de +información arbitraria que funcionara como un [diccionario](https://en.wikipedia.org/wiki/Associative_array), donde cada +conjunto de datos arbitrarios tuviera asociado un identificador único que pudiera ser referenciado en Markdown. + +Pese a ello, esto abre un gran vector de ataque que habría que cuidar, por tanto, el soporte de imágenes es algo que +seguramente tendrá que esperar. + +## conclusión + +Sin duda crear este software está siendo una experiencia bastante interesante que me está ayudando a aprender sobre +seguridad computacional y muchas otras cosas. + +A lo largo de los meses venideros trataré de implementar estas y más cosas, subiré una actualización cuando ello ocurra +:) diff --git a/src/weblog/archived/note-taking-experiment.md b/src/weblog/archived/note-taking-experiment.md new file mode 100755 index 0000000..22fb8ef --- /dev/null +++ b/src/weblog/archived/note-taking-experiment.md @@ -0,0 +1,117 @@ +--- +layout: post.njk +title: Note Taking. Notas encriptadas +intro: Un programa experimental para encriptar notas. +tags: + - rust + - experimentos + - note taking + - archived + - es +date: 2023-03-12 +permalink: /weblog/note-taking-experiment/ +--- + +## motivación + +Un día me di cuenta de que mi _setup_ para tomar notas era bastante engorroso: abría el bloc de notas, escribía, guardaba +el .txt, abría [Kleopatra](https://www.gpg4win.org/about.html), esperaba a que se cargara la base de datos, etc. + +No es difícil darse cuenta de que este sistema no era _el óptimo_. Por tanto, decidí embarcarme en la búsqueda de +algún programa que cumpliera los siguientes requisitos: +1. **Offline**. No quiero mis notas, encriptadas o no, viajando por lugares desconocidos. +2. **Seguro**. No quiero mis notas siendo expuestas por alguna vulnerabilidad o problema de diseño. +3. **Simple**. No quiero tener que dar mil vueltas para escribir un documento de 50 palabras. + +Y todo lo que encontraba no cumplía todos los requisitos: o tenía _sincronización en la nube_, o la interfaz era muy +compleja, etc. + +Por tanto, decidí que debía arreglar esto yo misma: y así surgió +[note taking](https://git.sofiaritz.com/sofia/note-taking). + +## idea + +He estado un par de semanas experimentando con un concepto relativamente simple: +_un programa que permita crear y almacenar notas encriptadas_. + +Este concepto es sencillo, pero la ejecución es lo importante. Me establecí una serie de objetivos que permitieran +poder tener una base sobre la que trabajar, y estos objetivos eran los siguientes: +- **Simple**. Una aplicación fácil de usar para todo el mundo, con y sin conocimientos. +- **Seguro**. Las notas no deben ser susceptibles de ataques de fuerza bruta y compañía. +- **Completo**. Se debe ofrecer una gran variedad de opciones y posibilidades a la hora de redactar y ver las notas. + +## funcionamiento + +note taking tiene un funcionamiento bastante sencillo. Cuando abres la aplicación ocurre lo siguiente: +1. Te pide que introduzcas la contraseña utilizada para encriptar la "_base de datos_". +2. Comprueba la contraseña utilizando notas existentes. +3. Si es correcta, carga todas las notas encriptadas en memoria para ser desencriptadas bajo demanda. + +Una vez has pasado esta etapa inicial, todo es muy intuitivo. Para añadir una nota haces click en el botón que dice +"_want to add one note?_", para desencriptar una nota haces click en el botón que dice "_decrypt note_", etc. + +Además de esto, el apartado de configuración actualmente tiene la opción de exportar las notas en formato JSON para +poder ser importadas por programas compatibles con el formato. En un futuro el apartado de configuración tendrá más +opciones, como importar notas, cambiar la contraseña y demás. + +## seguridad + +Recientemente, se cambió como se manejaban las contraseñas en note taking. Ahora mismo se sigue el siguiente sistema: +1. El usuario introduce la contraseña +2. La contraseña pasa por una función de derivación +([KDF](https://crypto.stackexchange.com/questions/40757/key-derivation-functions-kdf-what-are-they-what-are-their-main-purposes-and)) + 1. Se calcula el SHA256 de la contraseña, que se utilizará como + [_salt_](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#salting). + 2. Se usa [Argon2](https://en.wikipedia.org/wiki/Argon2) para crear el hash de la contraseña. + 3. Se codifica el resultado en hexadecimal. +3. Se utiliza [pwbox](https://docs.rs/pwbox/0.5.0/pwbox/) con la contraseña derivada. + +Este sistema evita que se puedan forzar las contraseñas: +1. Todas las contraseñas tienen gran entropía al salir del KDF. +2. El KDF tiene gran complejidad, lo que ralentiza los ataques de fuerza bruta. + +Además de esto, se utilizan ciertos sistemas para _sugerir_ al usuario el uso de contraseñas seguras. Un ejemplo de esto +es cómo se le muestran al usuario tanto la longitud como entropía de la contraseña introducida con un sistema de colores +bastante explícito que _invita_ al usuario a emplear contraseñas seguras. + +Todo esto se puede ver en mayor detalle en +[_Security of the encrypted notes_ · sofia@git.sofiaritz.com/note-taking#1](https://git.sofiaritz.com/sofia/note-taking/issues/1). + +## planes de futuro + +En el futuro me gustaría añadir un sistema "_Markdown_" básico para que se puedan añadir cosas como letra en cursiva, +negrita, imágenes, etc. + +Pese a que esto pueda parecer relativamente sencillo, especialmente teniendo en cuenta que +[ya existen librerías](https://crates.io/crates/egui_commonmark) que se encargan de esto, cosas como imágenes pueden +ser un gran vector de ataque para intentar desanonimizar u obtener información del usuario. Por tanto, esta clase de +decisiones deben ser tomadas con mucho estudio y cautela. + +Además de esto, me gustaría mejorar la privacidad de ciertos aspectos de las notas (metadatos, etc.) y expandir los +ajustes. + +## quiero probarlo! + +Ahora mismo [no estoy distribuyendo ejecutables](https://git.sofiaritz.com/sofia/note-taking/issues/2), pero es muy +fácil compilar el proyecto si ya tienes Rust y Cargo. + +Si ya tienes Rust y Cargo [instalados](https://www.rust-lang.org/tools/install) y +[actualizados](https://rust-lang.github.io/rustup/basics.html#keeping-rust-up-to-date), ejecuta los siguientes comandos: +1. `git clone https://git.sofiaritz.com/sofia/note-taking.git` +2. `cd note-taking` +3. `cargo run --release` + +(Si el último paso falla, puede que tengas que utilizar `cargo +nightly build --release`) + +## ideas? + +Cualquier idea es bienvenida! [Ponte en contacto conmigo](/contact) o abre una +[issue](https://git.sofiaritz.com/sofia/note-taking/issues) en el repositorio. :) + +## imágenes + +Captura de pantalla donde se muestra una entrada de texto con los valores de entropía y longitud a la derecha en color verde, indicando así valores aceptables. +Captura de pantalla donde se muestran los botones 'want to add one note?' y 'settings' +Captura de pantalla donde se muestra la lista de notas. En cada nota se muestra el título y su derecha la fecha. Bajo el título hay un botón que indica 'decrypt note' +Captura de pantalla donde se muestra el formulario de creación de notas, con diversas entradas de texto para el título, texto y metadatos. Al final hay un botón con el texto 'add note' + diff --git a/src/weblog/en_index.njk b/src/weblog/en_index.njk new file mode 100644 index 0000000..edf881a --- /dev/null +++ b/src/weblog/en_index.njk @@ -0,0 +1,30 @@ +--- +layout: base_page.njk +title: weblog +permalink: /en/weblog.html +lang: "en" +--- + +

weblog

+ +
+ English posts · + Spanish posts +
+ + + +
+

Archived

+
    + {% set taglist = collections["archived"] %} + {% for post in taglist | reverse %} +
  • {{ post.data.title }} {% if post.data.intro %}{{ post.data.intro }}{% endif %}
  • + {% endfor %} +
+
\ No newline at end of file diff --git a/src/weblog/index.njk b/src/weblog/index.njk new file mode 100644 index 0000000..18e4b73 --- /dev/null +++ b/src/weblog/index.njk @@ -0,0 +1,28 @@ +--- +layout: base_page.njk +title: weblog +--- + +

weblog

+ +
+ Entradas en español · + Entradas en inglés +
+ + + +
+

Archivado

+
    + {% set taglist = collections["archived"] %} + {% for post in taglist | reverse %} +
  • {{ post.data.title }} {% if post.data.intro %}{{ post.data.intro }}{% endif %}
  • + {% endfor %} +
+
\ No newline at end of file diff --git a/src/weblog/tags.njk b/src/weblog/tags.njk new file mode 100644 index 0000000..10546d2 --- /dev/null +++ b/src/weblog/tags.njk @@ -0,0 +1,22 @@ +--- +layout: base_page.njk +pagination: + data: collections + size: 1 + alias: tag + filter: + - archived +permalink: /weblog/tags/{{ tag }}/ +--- +

Tagged “{{ tag }}”

+ +

+ Note: Archived posts may not be listed. +

+ +
    + {% set taglist = collections[ tag ] %} + {% for post in taglist | reverse %} +
  1. {{ post.data.title }} {% if post.data.intro %}{{ post.data.intro }}{% endif %}
  2. + {% endfor %} +
\ No newline at end of file diff --git a/src/weblog/tags/archived.md b/src/weblog/tags/archived.md new file mode 100644 index 0000000..ea20710 --- /dev/null +++ b/src/weblog/tags/archived.md @@ -0,0 +1,7 @@ +--- +layout: base_page.njk +--- + +# Tagged “archived” + +[Archived](/meta/archived) posts are not listed here. \ No newline at end of file diff --git a/static/css/base.css b/static/assets/css/base.css similarity index 64% rename from static/css/base.css rename to static/assets/css/base.css index 5ab4ce9..d020b97 100644 --- a/static/css/base.css +++ b/static/assets/css/base.css @@ -4,10 +4,13 @@ line-height: 24px; font-weight: 400; - min-height: 100%; + min-height: 150vh; color: rgba(255, 255, 255, 0.9); - background: #29468c; + background-color: #2d1740; + background-image: radial-gradient(hsl(324, 80%, 55%) 0.75px, hsl(273, 48%, 20%) 0.75px), radial-gradient(hsl(324, 80%, 55%) 0.75px, hsl(273, 48%, 20%) 0.75px); + background-size: 25px 25px; + background-position: 10px 10px; font-synthesis: none; text-rendering: optimizeLegibility; @@ -17,7 +20,7 @@ } a { - color: #b8c3de; + color: #e74cac; } body { @@ -27,23 +30,29 @@ body { body > h1 { font-size: 50px; text-align: center; + font-family: "Nunito", "Rubik", Inter, Avenir, Helvetica, Arial, sans-serif; } body > h1 > a { color: #fafafa; text-decoration: underline; - text-decoration-color: #2c9ad5; + text-decoration-color: #d52c9c; } main { width: 40vw; - margin-bottom: 75px; + text-align: justify; + + padding: 1rem; + background-color: rgba(10, 10, 10, 0.35); + border-radius: 5px; } .page-container { display: flex; margin: 0 10px; gap: 15px; + flex-direction: row-reverse; justify-content: center; } @@ -76,8 +85,9 @@ nav div ul a { margin: 10px 0; transition: all 150ms; - background-color: #686b77; - border: solid 3px #2c9ad5; + background-color: #dc3f99; + border: solid 3px; + border-color: #f38cc2 #dc158d #dc158d #f38cc2; color: white; } diff --git a/static/assets/css/comments.css b/static/assets/css/comments.css new file mode 100644 index 0000000..c4b8612 --- /dev/null +++ b/static/assets/css/comments.css @@ -0,0 +1,39 @@ +.no-comments { + padding: 1rem 0; +} + +.comment { + border: #382e60 solid 1px; + border-radius: 7px; + margin: 10px 0; +} + +.comment-author { + display: flex; + gap: 5px; + padding: 5px; + background-color: hsl(273, 48%, 18%); +} + +.comment-author-image { + border-radius: 4px; + height: 50px; +} + +.comment-author-data { + display: flex; + flex-direction: column; +} + +.comment-author-data > a, .comment-author-link { + text-decoration: none; + color: #fafafa; +} + +.comment-author-data > a:hover, .comment-author-link:hover { + color: #e74cac; +} + +.comment-content { + padding: 3px 10px; +} \ No newline at end of file diff --git a/static/assets/css/fonts.css b/static/assets/css/fonts.css new file mode 100644 index 0000000..3f633e8 --- /dev/null +++ b/static/assets/css/fonts.css @@ -0,0 +1,34 @@ +@font-face { + font-family: "JetBrains Mono"; + src: url("https://cdn.sofiaritz.com/fonts/ofl/jetbrainsmono/JetBrainsMono-Italic[wght].ttf"); + font-style: italic; + font-weight: 300; +} + +@font-face { + font-family: "JetBrains Mono"; + src: url("https://cdn.sofiaritz.com/fonts/ofl/jetbrainsmono/JetBrainsMono[wght].ttf"); + font-style: normal; + font-weight: 300; +} + +@font-face { + font-family: "Rubik"; + src: url("https://cdn.sofiaritz.com/fonts/ofl/rubik/Rubik[wght].ttf"); + font-style: normal; + font-weight: 400 500; +} + +@font-face { + font-family: "Rubik"; + src: url("https://cdn.sofiaritz.com/fonts/ofl/rubik/Rubik-Italic[wght].ttf"); + font-style: italic; + font-weight: 400 500; +} + +@font-face { + font-family: "Nunito"; + src: url("https://cdn.sofiaritz.com/fonts/ofl/nunito/Nunito[wght].ttf"); + font-style: normal; + font-weight: 700; +} \ No newline at end of file diff --git a/static/assets/libraries/dompurify.js b/static/assets/libraries/dompurify.js new file mode 100644 index 0000000..374193f --- /dev/null +++ b/static/assets/libraries/dompurify.js @@ -0,0 +1,2 @@ +/*! @license DOMPurify 3.0.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.0.1/LICENSE */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,(function(){"use strict";function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e,n){return t=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},t(e,n)}function n(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function r(e,o,a){return r=n()?Reflect.construct:function(e,n,r){var o=[null];o.push.apply(o,n);var a=new(Function.bind.apply(e,o));return r&&t(a,r.prototype),a},r.apply(null,arguments)}function o(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,a=[],i=!0,l=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(a.push(r.value),!t||a.length!==t);i=!0);}catch(e){l=!0,o=e}finally{try{i||null==n.return||n.return()}finally{if(l)throw o}}return a}(e,t)||i(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e){return function(e){if(Array.isArray(e))return l(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||i(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(e,t){if(e){if("string"==typeof e)return l(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(e,t):void 0}}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n1?n-1:0),o=1;o=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,l=!0,c=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return l=e.done,e},e:function(e){c=!0,a=e},f:function(){try{l||null==n.return||n.return()}finally{if(c)throw a}}}}(c(e));try{for(r.s();!(t=r.n()).done;){var a=o(t.value,2),l=a[0],u=a[1];n[l]=u}}catch(e){r.e(e)}finally{r.f()}return n}function M(e,t){for(;null!==e;){var n=m(e,t);if(n){if(n.get)return R(n.get);if("function"==typeof n.value)return R(n.value)}e=f(e)}return function(e){return console.warn("fallback value for",e),null}}var I=p(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),U=p(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),F=p(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),z=p(["animate","color-profile","cursor","discard","fedropshadow","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),H=p(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),j=p(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),P=p(["#text"]),B=p(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),G=p(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),W=p(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),q=p(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),Y=d(/\{\{[\w\W]*|[\w\W]*\}\}/gm),$=d(/<%[\w\W]*|[\w\W]*%>/gm),K=d(/\${[\w\W]*}/gm),V=d(/^data-[\-\w.\u00B7-\uFFFF]/),X=d(/^aria-[\-\w]+$/),Z=d(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),J=d(/^(?:\w+script|data):/i),Q=d(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),ee=d(/^html$/i),te=function(){return"undefined"==typeof window?null:window},ne=function(t,n){if("object"!==e(t)||"function"!=typeof t.createPolicy)return null;var r=null,o="data-tt-policy-suffix";n.currentScript&&n.currentScript.hasAttribute(o)&&(r=n.currentScript.getAttribute(o));var a="dompurify"+(r?"#"+r:"");try{return t.createPolicy(a,{createHTML:function(e){return e},createScriptURL:function(e){return e}})}catch(e){return console.warn("TrustedTypes policy "+a+" could not be created."),null}};var re=function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:te(),r=function(e){return t(e)};if(r.version="3.0.1",r.removed=[],!n||!n.document||9!==n.document.nodeType)return r.isSupported=!1,r;var o=n.document,i=n.document,l=n.DocumentFragment,u=n.HTMLTemplateElement,s=n.Node,f=n.Element,m=n.NodeFilter,d=n.NamedNodeMap,h=void 0===d?n.NamedNodeMap||n.MozNamedAttrMap:d,y=n.HTMLFormElement,g=n.DOMParser,b=n.trustedTypes,v=f.prototype,R=M(v,"cloneNode"),re=M(v,"nextSibling"),oe=M(v,"childNodes"),ae=M(v,"parentNode");if("function"==typeof u){var ie=i.createElement("template");ie.content&&ie.content.ownerDocument&&(i=ie.content.ownerDocument)}var le=ne(b,o),ce=le?le.createHTML(""):"",ue=i,se=ue.implementation,fe=ue.createNodeIterator,me=ue.createDocumentFragment,pe=ue.getElementsByTagName,de=o.importNode,he={};r.isSupported="function"==typeof c&&"function"==typeof ae&&se&&void 0!==se.createHTMLDocument;var ye,ge,be=Y,ve=$,Te=K,Ne=V,Ae=X,Ee=J,we=Q,Se=Z,_e=null,xe=C({},[].concat(a(I),a(U),a(F),a(H),a(P))),ke=null,Oe=C({},[].concat(a(B),a(G),a(W),a(q))),De=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Re=null,Ce=null,Le=!0,Me=!0,Ie=!1,Ue=!0,Fe=!1,ze=!1,He=!1,je=!1,Pe=!1,Be=!1,Ge=!1,We=!0,qe=!1,Ye="user-content-",$e=!0,Ke=!1,Ve={},Xe=null,Ze=C({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Je=null,Qe=C({},["audio","video","img","source","image","track"]),et=null,tt=C({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),nt="http://www.w3.org/1998/Math/MathML",rt="http://www.w3.org/2000/svg",ot="http://www.w3.org/1999/xhtml",at=ot,it=!1,lt=null,ct=C({},[nt,rt,ot],w),ut=["application/xhtml+xml","text/html"],st="text/html",ft=null,mt=i.createElement("form"),pt=function(e){return e instanceof RegExp||e instanceof Function},dt=function(t){ft&&ft===t||(t&&"object"===e(t)||(t={}),t=L(t),ye=ye=-1===ut.indexOf(t.PARSER_MEDIA_TYPE)?st:t.PARSER_MEDIA_TYPE,ge="application/xhtml+xml"===ye?w:E,_e="ALLOWED_TAGS"in t?C({},t.ALLOWED_TAGS,ge):xe,ke="ALLOWED_ATTR"in t?C({},t.ALLOWED_ATTR,ge):Oe,lt="ALLOWED_NAMESPACES"in t?C({},t.ALLOWED_NAMESPACES,w):ct,et="ADD_URI_SAFE_ATTR"in t?C(L(tt),t.ADD_URI_SAFE_ATTR,ge):tt,Je="ADD_DATA_URI_TAGS"in t?C(L(Qe),t.ADD_DATA_URI_TAGS,ge):Qe,Xe="FORBID_CONTENTS"in t?C({},t.FORBID_CONTENTS,ge):Ze,Re="FORBID_TAGS"in t?C({},t.FORBID_TAGS,ge):{},Ce="FORBID_ATTR"in t?C({},t.FORBID_ATTR,ge):{},Ve="USE_PROFILES"in t&&t.USE_PROFILES,Le=!1!==t.ALLOW_ARIA_ATTR,Me=!1!==t.ALLOW_DATA_ATTR,Ie=t.ALLOW_UNKNOWN_PROTOCOLS||!1,Ue=!1!==t.ALLOW_SELF_CLOSE_IN_ATTR,Fe=t.SAFE_FOR_TEMPLATES||!1,ze=t.WHOLE_DOCUMENT||!1,Pe=t.RETURN_DOM||!1,Be=t.RETURN_DOM_FRAGMENT||!1,Ge=t.RETURN_TRUSTED_TYPE||!1,je=t.FORCE_BODY||!1,We=!1!==t.SANITIZE_DOM,qe=t.SANITIZE_NAMED_PROPS||!1,$e=!1!==t.KEEP_CONTENT,Ke=t.IN_PLACE||!1,Se=t.ALLOWED_URI_REGEXP||Se,at=t.NAMESPACE||ot,De=t.CUSTOM_ELEMENT_HANDLING||{},t.CUSTOM_ELEMENT_HANDLING&&pt(t.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(De.tagNameCheck=t.CUSTOM_ELEMENT_HANDLING.tagNameCheck),t.CUSTOM_ELEMENT_HANDLING&&pt(t.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(De.attributeNameCheck=t.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),t.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof t.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(De.allowCustomizedBuiltInElements=t.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Fe&&(Me=!1),Be&&(Pe=!0),Ve&&(_e=C({},a(P)),ke=[],!0===Ve.html&&(C(_e,I),C(ke,B)),!0===Ve.svg&&(C(_e,U),C(ke,G),C(ke,q)),!0===Ve.svgFilters&&(C(_e,F),C(ke,G),C(ke,q)),!0===Ve.mathMl&&(C(_e,H),C(ke,W),C(ke,q))),t.ADD_TAGS&&(_e===xe&&(_e=L(_e)),C(_e,t.ADD_TAGS,ge)),t.ADD_ATTR&&(ke===Oe&&(ke=L(ke)),C(ke,t.ADD_ATTR,ge)),t.ADD_URI_SAFE_ATTR&&C(et,t.ADD_URI_SAFE_ATTR,ge),t.FORBID_CONTENTS&&(Xe===Ze&&(Xe=L(Xe)),C(Xe,t.FORBID_CONTENTS,ge)),$e&&(_e["#text"]=!0),ze&&C(_e,["html","head","body"]),_e.table&&(C(_e,["tbody"]),delete Re.tbody),p&&p(t),ft=t)},ht=C({},["mi","mo","mn","ms","mtext"]),yt=C({},["foreignobject","desc","title","annotation-xml"]),gt=C({},["title","style","font","a","script"]),bt=C({},U);C(bt,F),C(bt,z);var vt=C({},H);C(vt,j);var Tt=function(e){var t=ae(e);t&&t.tagName||(t={namespaceURI:at,tagName:"template"});var n=E(e.tagName),r=E(t.tagName);return!!lt[e.namespaceURI]&&(e.namespaceURI===rt?t.namespaceURI===ot?"svg"===n:t.namespaceURI===nt?"svg"===n&&("annotation-xml"===r||ht[r]):Boolean(bt[n]):e.namespaceURI===nt?t.namespaceURI===ot?"math"===n:t.namespaceURI===rt?"math"===n&&yt[r]:Boolean(vt[n]):e.namespaceURI===ot?!(t.namespaceURI===rt&&!yt[r])&&(!(t.namespaceURI===nt&&!ht[r])&&(!vt[n]&&(gt[n]||!bt[n]))):!("application/xhtml+xml"!==ye||!lt[e.namespaceURI]))},Nt=function(e){A(r.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){e.remove()}},At=function(e,t){try{A(r.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){A(r.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!ke[e])if(Pe||Be)try{Nt(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},Et=function(e){var t,n;if(je)e=""+e;else{var r=S(e,/^[\r\n\t ]+/);n=r&&r[0]}"application/xhtml+xml"===ye&&at===ot&&(e=''+e+"");var o=le?le.createHTML(e):e;if(at===ot)try{t=(new g).parseFromString(o,ye)}catch(e){}if(!t||!t.documentElement){t=se.createDocument(at,"template",null);try{t.documentElement.innerHTML=it?ce:o}catch(e){}}var a=t.body||t.documentElement;return e&&n&&a.insertBefore(i.createTextNode(n),a.childNodes[0]||null),at===ot?pe.call(t,ze?"html":"body")[0]:ze?t.documentElement:a},wt=function(e){return fe.call(e.ownerDocument||e,e,m.SHOW_ELEMENT|m.SHOW_COMMENT|m.SHOW_TEXT,null,!1)},St=function(e){return e instanceof y&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof h)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},_t=function(t){return"object"===e(s)?t instanceof s:t&&"object"===e(t)&&"number"==typeof t.nodeType&&"string"==typeof t.nodeName},xt=function(e,t,n){he[e]&&T(he[e],(function(e){e.call(r,t,n,ft)}))},kt=function(e){var t;if(xt("beforeSanitizeElements",e,null),St(e))return Nt(e),!0;var n=ge(e.nodeName);if(xt("uponSanitizeElement",e,{tagName:n,allowedTags:_e}),e.hasChildNodes()&&!_t(e.firstElementChild)&&(!_t(e.content)||!_t(e.content.firstElementChild))&&O(/<[/\w]/g,e.innerHTML)&&O(/<[/\w]/g,e.textContent))return Nt(e),!0;if(!_e[n]||Re[n]){if(!Re[n]&&Dt(n)){if(De.tagNameCheck instanceof RegExp&&O(De.tagNameCheck,n))return!1;if(De.tagNameCheck instanceof Function&&De.tagNameCheck(n))return!1}if($e&&!Xe[n]){var o=ae(e)||e.parentNode,a=oe(e)||e.childNodes;if(a&&o)for(var i=a.length-1;i>=0;--i)o.insertBefore(R(a[i],!0),re(e))}return Nt(e),!0}return e instanceof f&&!Tt(e)?(Nt(e),!0):"noscript"!==n&&"noembed"!==n||!O(/<\/no(script|embed)/i,e.innerHTML)?(Fe&&3===e.nodeType&&(t=e.textContent,t=_(t,be," "),t=_(t,ve," "),t=_(t,Te," "),e.textContent!==t&&(A(r.removed,{element:e.cloneNode()}),e.textContent=t)),xt("afterSanitizeElements",e,null),!1):(Nt(e),!0)},Ot=function(e,t,n){if(We&&("id"===t||"name"===t)&&(n in i||n in mt))return!1;if(Me&&!Ce[t]&&O(Ne,t));else if(Le&&O(Ae,t));else if(!ke[t]||Ce[t]){if(!(Dt(e)&&(De.tagNameCheck instanceof RegExp&&O(De.tagNameCheck,e)||De.tagNameCheck instanceof Function&&De.tagNameCheck(e))&&(De.attributeNameCheck instanceof RegExp&&O(De.attributeNameCheck,t)||De.attributeNameCheck instanceof Function&&De.attributeNameCheck(t))||"is"===t&&De.allowCustomizedBuiltInElements&&(De.tagNameCheck instanceof RegExp&&O(De.tagNameCheck,n)||De.tagNameCheck instanceof Function&&De.tagNameCheck(n))))return!1}else if(et[t]);else if(O(Se,_(n,we,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==x(n,"data:")||!Je[e]){if(Ie&&!O(Ee,_(n,we,"")));else if(n)return!1}else;return!0},Dt=function(e){return e.indexOf("-")>0},Rt=function(t){var n,o,a,i;xt("beforeSanitizeAttributes",t,null);var l=t.attributes;if(l){var c={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:ke};for(i=l.length;i--;){var u=n=l[i],s=u.name,f=u.namespaceURI;if(o="value"===s?n.value:k(n.value),a=ge(s),c.attrName=a,c.attrValue=o,c.keepAttr=!0,c.forceKeepAttr=void 0,xt("uponSanitizeAttribute",t,c),o=c.attrValue,!c.forceKeepAttr&&(At(s,t),c.keepAttr))if(Ue||!O(/\/>/i,o)){Fe&&(o=_(o,be," "),o=_(o,ve," "),o=_(o,Te," "));var m=ge(t.nodeName);if(Ot(m,a,o)){if(!qe||"id"!==a&&"name"!==a||(At(s,t),o=Ye+o),le&&"object"===e(b)&&"function"==typeof b.getAttributeType)if(f);else switch(b.getAttributeType(m,a)){case"TrustedHTML":o=le.createHTML(o);break;case"TrustedScriptURL":o=le.createScriptURL(o)}try{f?t.setAttributeNS(f,s,o):t.setAttribute(s,o),N(r.removed)}catch(e){}}}else At(s,t)}xt("afterSanitizeAttributes",t,null)}},Ct=function e(t){var n,r=wt(t);for(xt("beforeSanitizeShadowDOM",t,null);n=r.nextNode();)xt("uponSanitizeShadowNode",n,null),kt(n)||(n.content instanceof l&&e(n.content),Rt(n));xt("afterSanitizeShadowDOM",t,null)};return r.sanitize=function(e){var t,n,a,i,c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if((it=!e)&&(e="\x3c!--\x3e"),"string"!=typeof e&&!_t(e)){if("function"!=typeof e.toString)throw D("toString is not a function");if("string"!=typeof(e=e.toString()))throw D("dirty is not a string, aborting")}if(!r.isSupported)return e;if(He||dt(c),r.removed=[],"string"==typeof e&&(Ke=!1),Ke){if(e.nodeName){var u=ge(e.nodeName);if(!_e[u]||Re[u])throw D("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof s)1===(n=(t=Et("\x3c!----\x3e")).ownerDocument.importNode(e,!0)).nodeType&&"BODY"===n.nodeName||"HTML"===n.nodeName?t=n:t.appendChild(n);else{if(!Pe&&!Fe&&!ze&&-1===e.indexOf("<"))return le&&Ge?le.createHTML(e):e;if(!(t=Et(e)))return Pe?null:Ge?ce:""}t&&je&&Nt(t.firstChild);for(var f=wt(Ke?e:t);a=f.nextNode();)kt(a)||(a.content instanceof l&&Ct(a.content),Rt(a));if(Ke)return e;if(Pe){if(Be)for(i=me.call(t.ownerDocument);t.firstChild;)i.appendChild(t.firstChild);else i=t;return(ke.shadowroot||ke.shadowrootmod)&&(i=de.call(o,i,!0)),i}var m=ze?t.outerHTML:t.innerHTML;return ze&&_e["!doctype"]&&t.ownerDocument&&t.ownerDocument.doctype&&t.ownerDocument.doctype.name&&O(ee,t.ownerDocument.doctype.name)&&(m="\n"+m),Fe&&(m=_(m,be," "),m=_(m,ve," "),m=_(m,Te," ")),le&&Ge?le.createHTML(m):m},r.setConfig=function(e){dt(e),He=!0},r.clearConfig=function(){ft=null,He=!1},r.isValidAttribute=function(e,t,n){ft||dt({});var r=ge(e),o=ge(t);return Ot(r,o,n)},r.addHook=function(e,t){"function"==typeof t&&(he[e]=he[e]||[],A(he[e],t))},r.removeHook=function(e){if(he[e])return N(he[e])},r.removeHooks=function(e){he[e]&&(he[e]=[])},r.removeAllHooks=function(){he={}},r}();return re})); diff --git a/static/assets/weblog/archived/note-taking-2/diagram1.svg b/static/assets/weblog/archived/note-taking-2/diagram1.svg new file mode 100755 index 0000000..81f58d7 --- /dev/null +++ b/static/assets/weblog/archived/note-taking-2/diagram1.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +S +H +A +2 +5 +6 +S +a +l +t +N +o +t +a +d +e +s +e +n +c +r +i +p +t +a +d +a +C +o +n +t +r +a +s +e +ñ +a +A +r +g +o +n +2 +p +w +b +o +x +N +o +t +a +e +n +c +r +i +p +t +a +d +a + + diff --git a/static/assets/weblog/archived/note-taking-experimental/note-creation.png b/static/assets/weblog/archived/note-taking-experimental/note-creation.png new file mode 100755 index 0000000000000000000000000000000000000000..c318521c954f0843f6168307bbb5658a69c16b43 GIT binary patch literal 18585 zcmY&<2UJr}^d=TWQHp{hAn;QW>7dfPq7*5iBcZF5geIL(MFd2e4UigofKUVykkC|` zfYgvgf&l@kF|<$vfqn76yJy#P)V%j5Gn1LQ_kQ<&-%Btt)@5VmV`XAuV$;{VZ^p!Q z{52EPG0D@XfIIic-^~F39rHKSy~k8Ncx4H=IO%rR=q?jeZR*(rXJ+8~%riY3e@*~!zt`_8tD=Pd8jp7o>}=jX@HU4D7_ zX|3(O{YhwGu-DEW{SJI(xv&BQM%_2qqNB{x()!+NuU z>5rs&RLahf`sV7`*w}1*%iK#g-b6J%ynN%JKmM4%{)O)EwpSfL3Bx&Nh51G*aBm!v zxo)!5HH@LeS`Tg5uphq4CWo8J-Y8g-z&%tp)GX#IeH^>eiNRp15RE;dn6PiM%KVqF zd^$Xg*mGg(hSgsGrmLaUfzcwLx)*plr&HJ%k-FZ{mb%>-}jYb*I+Z9XM`H;q+`Q5z`p-U zawM0vl%MHGfu(GlxHp7ErbyV_(#$!zGq9DVr8E6Xm2gQ%^gBrz(;Gk9@o=k{jjXdL zb`hn#?!21;!M1G@13uCtb-nRRf9?tPIe)ImRfCPDT+x{6|Eze9JPTF1nj3Iv>F~`W z9Oj`hI#<58Ldjhw*Kp4h`VAjR+ZQx{xJT1}B%Re5{xL7z#z8+`POdV&adbG;DpNe; z9$&%4@R$6I{=CV_Pj>Y#oEtWq8_L|>61KG#=a!18RS@B;&U4Ln?0aWnXWr{k;l?CZ z^;najW=X`kGHcp2wb1CA%6QZ$p}g<+Sh=~j!>HG{4csS(&FnTIk6+7V=NV-aa`4uU3*U=(dBob^{H`kAtoB1nzS`6N?^N!?`v$lF zD9I(%5M(tcCNPu#m@=>PChjkaOr|DK{2Fko#-7~2+ zC@GLl{^b45&#GPcM?L8FAMJhZ5(;(;nA9Q*jU_x!E@h+0Z)X2Ya#47EI838Mp}OwP zOPAt6zKoL6@;b?7h2K3KQ>MFX_Rj4^o0jR#9YNA`XMSu8L?A5k9v?Wa4Rj_sn8)jS z!8y@Zv!9b`@z09&_G6tbRInvQ53Z!Ux#QN0hjDY{(x8bEr!3c!Vi$*Xirfz)y^;&~ zU_I=D{r=huj%t`i8_MDRTKV3vg4u@LXkFPR5{w5oR6}D5l6E5{|5%RxVs>tVI+iTC z3l)3a+b?P%)~};MKOj+;($i$7J|}xLb5L)B$NHjtMLnCHi6rMJlB!F^4)$4_5Wel! zLCL;tRr_WLcdDC4<>;9Nu_K}nh4bOJux{mAMxm6Qf*Tn~tVMY9@ZDY6j*CyhZS zkT8w_qjE`)L+YDSjDizN!AqSeHx32`18k z|CxWe1GvHrH~p{43!wLUM`{vz4mqFF-^7`AqmKqkDJ&cVgzt4!&7n`HhA^>{eD{-& zr=WcDy$_`X99`t??=OX#X{}7W-MBCz-*U=28{v{ns<{9BG&q}TMDb~rj77;$(Q5x_{teHrDDBtp zjazcx`_SQbRnlOt>E_9mhw7vqXr4A#w;6l*ynO2}FQ1Pk2<2MP`CBmuiRy+YfyvMbY$bEZEQ$Ur!Vd2rP-oh=TYhFS)sbS0# znM{Rw7TW|Hw$NMz+81~RT6fP^)rCCAvRX}FzQU^dg;TUbYgwyOYlLIXnF2N65O8!y zMVIoY=vYQu9!upn#k+$GM&#o8h3sNwv#W)EqkK!5HCJ9948`j!3J(Qew&H(v+?t}6 zrs;K>uV-IE=%Hj1IVQ{&qrJ8=F8k2@`fhjS_F9xeF{mR(KJW~dkYdblhnWtk9-U6} z8EVe5I5#hsG%q-=v3EllVNln{gr$@MztHFp%&onst zQdiH73Y7R9WX->RQJVMmWC{>?{u%B8Ri@)_<~HEj^vWCe`AM41GX$oo26 zzYvED-F9r}Q{1%9FN1vOzq-rH0-Br1URxmRCYm5YFjk>9In=?uZ1%!D$3V-YH*YJf zd!fPuMRALt6Jaqy~ycS+QHW zrPNyophVrT;J<>9J!H~u$aFJ%@%0ardSFOsR?YA{_IrcA4~LPvb>pE?SyIRBK2w_+wjS3uMAl(+kAR@yUXEF;XsmDdY=x=Uhg*d9Hx|4gy@b zbh1vwBX#Z`ygUFF`lZ+pF2yBuQ^6)UEyBgo?M6$S<6er>-u@)kRe@>y4T%(*>vpxf%n zNM4tUSwpO&P~pE!(gQqAdD0-vwZzrk+c<>_-6I@YnhGzy+uBgo_nJ4}o=Rg~M%A2y zAj`xwHDcey4-aH`xsTaQq!8SpMCXrhMK-D4M0oL64>jY8_P(MQPIDs}Regr;J5Qd9 z!nKLPP`FUaU7`@VCuhh_Vahibnb5CpZ|0m3r=}t#Js0gN3U6CIw^TCmrVnMNcVzuO zAYRMV%h^uI7XI+&ei8*-%F4aI_xi5$LDHsr@LpCJy1Oz*Vj{`rCb|usf<56c`iJ-> zq6^xE{QdGcnZLNk{YKG|MSjazNI`<-Y=@kaN}nvHbM#)tx6GB7@xdEe={q}jb8iYA zVvTj9Uu@*F>8L^|T4;*LM+=3*hkm6ZVjx6Yd5JUbMv##7Sn|`35S7WoC`gtDX#BI_ zk672IH`CZN(B~RCI97A(y@605AsH4C3Lo|mHh9>s5w#>s8#*zZw2`l~M?K-cySaDn zXcW~U>)h0xbptJ-iG~zIOL@TZhAIPc18a`y4Q&YRuwb@4HuCHeXwNit*im)y<4rhX zSetB12CM3`EwJoX9=JPjhwq*o9jn{cT3VFJt;7~b?3L=rcaA#8X>R$1yxhc6$=8b^ za+ z2l=`jgs|4GlSq;Sz=>mAM(WM95`>7?7NqC*-Rs5CkMWx9+`AlI|IsxKZf;s@$ma+- zesjypYgiZ-?03JcW~3nzud?_Q@b7FjPNW4a_SNj(s{(m}!Ts11_L$Yn;|+3NLW9^% z_HjfgL>-Fh(DlwpzVPy>Zaq949+btArae-w9dC%u%NS9_eJ107RA3l*-3lsw5NX@Z2OQCrkpM5hc+K>C!M2yMO`bCh!X*W&z zAYpiHyg~L)!Fb#&K5PD$3ld~I?7I}ix_0wM)d`kibQn|D?=zZjFcFCfAHB`j z{T-iy;OR~vMeN0HuML%F%h;ybz$;2G9ipzJ>3B`n9TucUE!!IQATDai=Z5^)ig>yR zH@+?b&x+LPw@ZF!63oVhFg2K{!F2l}H|xp~`;HU>PE1-xC{p;woD?DOT0oM$8RRyk z@u#k4oP}6)uk-3;>*3Obfk^Nkv02+jFIeQx{5hgQJ3XV42T0RZzNT3_K*F~F>Yt!z zY2D&&V}k8wa5ElQg74%#v^b`Q@w*IMo{oMT-V);tenkMv08IJy#e`y4!dq8(LY^uj z(SOS(Y(#?brT7;eAzT)o7nl<;B@R#-hm%Z9T5iKduS-F2?>laTS8&4XwNjXjSgrFw zCsff>NvS4g?=^HAoSM-6ZI6uLnpS9=vjdU)#2W0atk28K9+Z~9Tb8rFo8O(o=xFPD zA7GG=lK2`&pXT7z?QNp&pFjBAqd6#z{a4)p*aSV*c6bC!b&cE{8}h_0%NJCQw~jtk z^O`^}Cg-zAQY`YyTfm#HBe%{CD6+POYr0iyPhSb>nwD!Tn?ojFy2|r7Cs=P)k zYYp%v1G$ZpPQjB6Uss5zuk%CM*(JdDp1F3a!g`=0+13uBy>08iW5ydn=9+B&Dr2V- z6WV!{!g;r7$V;1py&RfEx2Zk&(8SSJM^ydMI>*qsBfWiyctn3c^^;|FweJ1Rl!?RE zu$CnbistTI_BP$IB{P|gF@o4{2+mOFXtw6C?-1T|RO z2Xa5H*!eMENS0AH$;}+m6FKlyJ|{Fv$N0Xm`!|FaR! zLBgg4c4%Utt+jPOtzFRG;0zN}_YJGh zNjRsOu{`f;b+(Ao#aPM62Bk{y>aa9(eC(v0-rp78D`&VpW;=%+B-8%>>5Z=J$o$kL zSS|IbLgU=mIpXjkoDwFe<+ses#AFz>MG(e2)`y5Bwd>qEX%`c7lR|?bDMT9&%5o+T zkp|(JNHdq-T0wJvu7mOi_^=!hg`Vm_jFua+bpg~H`R(mNaN4I5sfepMe=w?VLyK z(T~UH#Z3}@Hyb)=IsFxRjbynDk-uOux%z4 z9W|1jj9A8~?oTD?Mc{CG#;eC(tb*^@>x+3c(e~(L1wcvqr-7Z&|GU5tdbyNd* zxOkd6KTvPq927wtkPICS(g>)e0HZx092I5X?3uNAY;@iC8eq}7(17Lf6I~UPJ3o*% z!1q+FuzU{~gDK!d@roVMk8gxeFDWrbLo_!}xDMth|H=uTgiQ+12di;iJtx9Bi_T&_W|Izdq%ZKfa}8$QVo z+|hcMm*;JcB~3ip8xk}5yS!W%dzQy_3V0&RJC+lAcu)=c)dH(01xHGBzxQKQ`5EJZ^j^~)YxTnPyh(5Jvefu`Tg+t9Mdlz6d}S@#gAiID zzUP;H+vT-@+Ru<*B?cM9xeUjZS;Jfv-1h1ed`sUxVB~><7g0`gt2Jc(v5y=ZDNmrv zu4%OT^9*bA?-yqe3f{!C3-r;FOjNQ4mvKn1uP>PKQ&T=CPMolD1jd&u+%@#IZb^8s znF+t+zjYlt!X~AT{gDE{tZH(wk{s+Fw*3FSNn(?2eNR)jGV3b07q-WB#^ z&va9+)J7fjL~VNSOor8LZEpV5Jm}Ee-2q$M2d0t2sRP^DQwQCXA+v0&rCRIT6F!ZO z^kwS?uL%VXKB4fnyZeMFx^)Sa(x2}6eeA4EixWs~{iXW;-+BjRNRL49 z(+FTjvJO{G&K;?>Wq;1}4`6HsNWy^FYh4e!N|;}S%|wJUuxZ|I-B#;X&u0Qwd3_}`}U)?uD*2IR?u9UH8Dj% z)pM#XV$w*lbWv_Smd9an3RmrR_4Nx4buLp#r+F_1HuugzdOc_a{W|ooaWRuA0>PiV z4Uj@wVSW-kscM35E8lV`%3VFPuLQ%2m?&XW`wsXUtsZ;b{63rH^MT?viUo`85cNKh z$+Su`U;8$?21c139)82}B2;Ha^N6Y$7DZBzpl=bvKJo68?-Hku4tLZqj}^gIFl6bP zk};#(p_4O!Kl$6VkXO%mn8#qG_&l~la?Dw|L9u!8GOg7P4$V#Tf#kAzlcD<-Y_riP zSn8^;bLT7*wV9(a*rx5Ym{88f(t`iY2pSvtUVtOq4qu4|93Ybj;+D{7hL;|@X2QU( z+9w%s*Ijf3viR3R4)`c5X>+_+_JHCWFOgYk_-j#w| zxW%nfrQoI7XAuz*harkix1pf~|0cWIhiEA7VVCN0CSxJyS0@v45eP&NeCKSA*M(Mr z2OQOSTcdj|r2Dj95=}{DDak za#`I}=HD>@TsOi#e7$R2@%OJ;MCSX>>=4>`J5tBD>=6p;@+UClNz)eIw!YzfXb<&1 zmV6)>x$7JS+PtqK0P`vxse=+iy1nE;2#>v7X)eoZjsDxK+*|#N0Uy#5CI{z-;H#^? zLW#%wW_wa6YNF`mq0QaVLw5PgIF}mYV0;1=ZZ! zce`Z%b|!GyWYiD2*;v5?mEm6fK81a_OmVndJ%^4bITW(_Wp0uQ#TqT$ie@PP?zrt?KHz2}*eSB&t6OBXF%_}PHPv&1s zRDS|&doNly7?w~tX6xP5RozB|+O~w$QpW3hPGCccWn-1Lje|X=7={mxSo_K{d34rs z_k}%dE-h%OBqLPi;Vi?1Aj<*RYWwDJk-7P7pN1_mVd6%H-AsqLCIE*fSF=2-YY7fv z0}~SiwiHx`jH3qh&_X^8YorLn050=WM?A+w@B5prjzuoG6*>N7w%3?(OkW`1HiEh zIf(d8cs1^QMLv>Lkc_FqTNh1xp!phcwBduYc6|K2c0c+1+v^%bU_^#}Q0CA?mb^#H zj~-Pq>uS5DyU7i)R{gCbw=1M1s`@q`&52^Ri5_%9`8@rAI6 zPzRP8a&775_<;iL__%)E;zN}+z+;cKd#FP)BR5BM^D;gXT&d+-$iQMh8R8&H!*cRI zMC>w_R#6gIwud>`==bV;XcNof6>_m<}u?-zjeo!&erfo!XO@D~9B}QZwUNfYG<2rL&72Lg;Xb(z~ z7gG-xQ(KxBL$6vodQY{Hg5LokVvv?JtWzm4GU3ziwc37kxOU8IYZ-SarXsuKR49=2 zf~BOWhs`~N!i2)620Z%(#0w6jz-+`0iLhp&s|tIsyzEu@?4x%U#Gk~|Q2hIqXP=$~0#x6MlpsOws zLe8%~kvnR>RvKtwJ5d6|9y0<u~i%P2FEh91XP1|?^+NJ2D0RlE_ohH zW4Y)^>{!60N01%5h^~aq^laaV$fx4hYkR~1F zHPJ8tK*1T+Bbw@wTubBtvLOk*;f;zVKovM>=t|gbFDUYH`#xzk9Hzh;TKsPtt>{qstSQ&IhuwV!UMduK zi&M5$HMMGsV$nLZB?E(^!XRxE|;?uNju_k4EOzPn2NTuwB=ebI@W?BdJ{*WFr$-c z{*(@sVcLSykxFv8x8~8_5WUAYN0;qrqhBVBD~h|p3?BJ+yHBEKcl)p&PX9r8@~Z)g z0~x@u8&;EYD>6}g21g@>S&iVV6zIe?I%ic?Ynm0c+<8{RzGG20zVEf@CrgTMk%!4_ zI7Ah;(zMWW<#1lHy_Vn@MOwHkpFIlI*gSEse@0i6_BIs}@c6kp9%CBifPZp9W%`$!E9 zOdR*DL1UL0 ztRMaP*|$i@WVSrBwi7li10B#Va$MNTGHQ1yniD`TE2clHE+)00kfywz=(cY0`dNDd znyfAVA0;QxY^`WXd~Ni=BeY`4qnI?OF?m~ns(wkp{fX3%N3ax^y0_-zaUz(?9BV)4hj;9tit$N- zKOaiji-}4MtUon>r|^fSRR*llg#{47 z6}R&0zG|VXydT^piqVjAo49|5e65!&7$neq>ccWF;{aK z?AcG|`BJ*_JVf4n@;tL`h3|I*4pMRvivVk1pko;-0bo4G{l4`G{I> za26F=YMcu_S{FK+Mkf)aKL~mG!yh2`Oo}!Liz%zM8+MKcXL2YT^$7bly>}p?PfCG0 zgEZq}f-|a+$VG}SeSS|hELWkTRof(>02S%H#8a|}DvKl3Xy^J>XeupMt1*icW#w~5 z$Bq>!kZ6#xNWxdG*(E07bz_SX1i5h2V|(h5GSvbP0uu|moqPJS<+3$PkdAE+wXvf$ zZh_X6yfGOGd+areVSS_>CBX7*k>l8MsgnsI0up*Fiq=(?TNZ~kZoq9MQuDD=4|Q2w z<{Xcu9)Cc8K@c0(W0`Qp`k-5Ew~+FAekH^rR~Y1ju~b^1RMedQQu$x^)%OB-z2?O&+6G`j`mW79^iNwhS|Yq*p9+MG}2%QD|B2(URYlY!(F1uMa{IO7P3S2z@4|HO)43KD0t zB7cF(&Lvrvc55S?$R5Z5`i)U&@2BQ?Y^`8fYIg z-dBpCr48mZ3CaSWeUJ1O)pFmSZ0(}2S%$XD8i=QrA3*pm+AO+Jj$^4%sq2t*H`3)Y zzpDI(^UUvvZPC3t`{x9xTeBv~A^Q~%8ZG_xcOUQ_&P)CnUx}btW_t9LI~9&E<>{bq zLE;NeSY5|R>$fils9VtQy0sk6$Q*ua+i6|hJ9Zx-6A&stnnYIN2~6$on|KsZVZy>$ zQhvg`%C)~D7lKbkws@!sxTA82O~!65s5>~cW7K|Q6j`+&Jn+w0maTo%<|=S?mn8&p z{mdc*^3C#QQkpG!JyC5$sd`E!Stq~=f7gKJht;MYXO$x9=lNvxuO6^YRbPNADk+eZ z4wVngw_dYEn&$D3+%|FG8_;geP4pHqhj;9 z`~4=fOz)HXs;jGTZ6ILPvPv4`?Gq*!ta+{TmByF;+XLz)Zd0LA# z8c+MF+b-Zi8f_>!w;}SFAHin7MfRmjDc}9v(FDZl2^J zH`U0Sw4sWO(LQnbDrcNpZVIIGi*guSM@6r$tj@Q5T@}?vle`_I5fF1Qh$gw zdgf*rf4e(_w^}G=ZR8*}k=$=aOuoUV-~PUQ+l4+0OYh3Dfy%H&(hO`BomcH3pOU@?R?@Z*^7nu*71 z)qb?P<<}zwTwc>8*p+{%vXG1e9cL7Ri!YFHg>G}AdSfvcL1`=RAah7ZIus9-V4l}U zv%JPoZFXuGVXrBl|J4n~fJB2b9WT@X!Itjr&<^X|M+*Pdz};emBQTF2>r2A}`6hrW z(?@j4|C_@fwze@!+=CkWCEzo63mtIp&b3#&NZQ-mH^8W_KGN+6eyc%;dkgyrxn)NK zx=%AjVgJ469#=Dcd%~;lgVrZhu^b_{9k;=?pKRm^yhy zHRwlkl|w60v&8fW%&3pB#7s2$>|k-Mq7Q0V?3#nB;C;Za`m!J~a^1JD#P9S9vHk4> z#nu)eL!ArIY1HJTL)hY1^hXiD%hnMyl@2ZC75p|8R<*E1t_lC&B+n0c?sLoF4p&4HdEes& z1~LcK6b|jvrR`P1;{%F4E(e;Q1$r7x;#c@}`EeujVX1oVxaE6*{9@$}OnxkXFkn9x zna?=Z{vBw7y-&UCKyCO{whQVehILvam5)OS)SNEmiF)`yR{4FUT~nVid(IDI^_$lb z`7)25`CB>$WX}A0pghqUrK`dy7pi>AQT9LZyUQGZLG!)ec%>cW$aw;|uhdvJYC^bK zF@j8=b(&-dZpDt%_@^y9kCAv;p7`@B6i1BN1f<*o>ABu^I zQIL~+T4E+fKF$PBj%*4F4&Fzq9bvWlx@?ulsoj~s@_T2 z5fo^ojhSg}ugpUHa9fR%_@t=s>-~a)l@L7j+{7!cGZ&8KT>5JZoZzB}XHik@xk|p@ zvfJ7;jtuX8aK{acJ{k*y18!&-wp?SrsWW8q!$w)|s-Ez_%B4tc4m{kreJOSb_+46W zm|xcdEt$+Bmu)U4D2sCe7Xa6^uwk{hypf@`aPKFuyi9t9ETs8*0&3BlAq~)a7hceh z*W8B-{pZc^Lfj-{oi(ge5o5-7ByRfAs!1U1__;pSj`Z~GZ-q)@EuB^Dm zvpd~`zzZYJGCBG6+JBxgz(LWE)1V`+Ly8lvKDv0uLCJNRY=Ld}-h}V=ThE+*w7Dch znZ0xgcra$bx)+Y;(`X_C^e0nhv7PjONkWNPZIuUuTN~zm=l6hc)2glpc&OD^WBTD< z0g`fOsBtpX1HV0PXrTh!{}_@m)q5dJxED=7)eaQmWj*#iMZ_6S)3D{>ZzfW3q@zJ1 z?VV936iwv3A2|auhC>S#-BdwzwoltQyMW45;3#RR0pl6hl$#@n>$5%d zw@O8Vsqcptv<)t_Esal5a>MX!vaBa@|C|^JDB>vi&l^s(MKl{_D-0<3O#UTp845Bd zGRQ8Qde?C_#a~V=>{r$zx0cGN7LXOim6S5hCm z>JWCY-b0Du&{#VJdfz<|#`!%spPlv^aTt;V(0H`++5ejxTbP$)`!;|ACh^Oc=Pap1 z8vB*OfQ^0mV_LOr*4bAkvQF4Z>$j@@5b@mH^xWN2DEt3S7VC3WgF}x(*b0qh$SOLF zZ4p#yt_)s5j_^+Ze5qB-_o9>YZaUHnh(+n9h^*_m3ix1Bu^C8aza6NVPykA+&Jp06 z1?8k2+kWli5Z8fb=(j*WN_PUx>%84ZB1F(ek@I6zAt2~m4On^+lR9a}SAOU~jAc^r zMq)sfkXWsecpYPVLg=#cK%OZ1h{F;2xHEYIohWtt%vK|DBpv z|98;2MVH^k30}dUe626tYg53eQz*}6GZ@`xEBg0}%iaL5N`%!J1J_!oxzFl9Zi2dx zI9lNtX8rP~EF1fl2_xA5*JmGon1Spv8>s>1v@#fu#x^qS*|TAQ*F9)}Fnv57ItdN` zF2VHshezn0{xbeYL?x=>o6}B(|Hp#$9|EK-(JDvp&FSALr>Wyi??Gl_O9Df7aA2t6 z-hgzQoysu<{c^jyhx*aih8T`(@%~=;WDOT#Vq*r8bw5Ki?&F9!jazee!KSERVupIy^mNXww?ge2fS&Sa7gg4Q7j1lubChoV+O;2=^HV;Vc+p`Rcs3l( zeRlc$D}bHtfJ5Isym9h%f!L+^kVOTc)A)@A5s}_S9rcRo8oQAveq{`>s3m^#H7mPB z2WXlREjm58Z}hS?GT;#;|06ZH?pXvd9VVS5i|fl{cib4hQN@^&EcrGs?mb>KbST`a zp5gb5%_J{T0QwtGAS_T!3t!)-XK9OFjW4XA0KaZz!9y$*|KeqY#qqFb2H*jBFn28ff0<=1Oahk)+6_Qb+xqST;=nBF)kLh(dG$v{_^R4S~xx1d$CI5Z0d?7x!}pdd>VDulFM3tAaKcO`|M~3oE*yCCfar z%ejmREK2$>459({JoL?H!2GeiZt@8|aaSKnW*7*{GKR0;1Qc5RGVPuWbOdaTD!`xu zWU;78C5<^Ta^#w#I$-nxIly*~Z_M>m7(B5|#F9Zn=oVBpWX%b{Y?jy?ulI!E8WD_` zBEWzR4)4o!eB1##J+gzEbtBjUX;u5My29s43Z#*x!n0Ql%2;H@toz^BAzPiu|9i}Z>a zrsNx7RQRH+px~+xgHJY>31L@SI>#`vgR}_!+nCfq5aX z3E(=P>%7|>Pf*5+xdSu(k552gUg;R)w#8$doRvkA-bco_M3XP5Kl(Gq@LxK@xQF9o zi+2p&bKkzKCR<>Ko`=JA3PA5Dk|cfdh?wDap9Y;J=#af;3RH@L%U zD3eDH|3B&|z8F8w>lz_~ku^oYn>S*Iop;|c_CDZqF|xUbl|)LH31HKG1KiQ_Ce^8q znh#A+RWiG(?syM{7QAJg_8*ydsu~*=$+wmNy<{h#>Pn~6Z2-*mygOhSMyR%*)L0(# z*U*=Q|B-|*p!`(7J2vNG`T*7beBD-Gv(i|42WR#?9(H*F~zx}R}l-Va81 zJ8W}91t^?MFa?1?jI?an?wv3mhnoZCn-m3go!5W2+F(q|;2jAISo`ZC)niHyfRM%pFy1dq1=-fi*$0(N5<;f0 z9*J3d_Ms}awuA;x`K@^6v87n%>= z(&CN~DS6l{el>rsT|ua*jLG!tZ-9VYXf*ekY#ASN0l2#T2KSL`jMTOM>cC3dzIRm4 zk8R2XeTA2ezx<(jbP-=J3y;f2Zt!Gns^;O(7!l@JKY+m`0=acW7M~U5!9X`eF@iaY zRV3}O{PSwtzS@7uOX4Qn%xIyA&9|*Uzk)Ac$EmNjP+PL+r}M&A)>jH!%J<`iA{Xz@ zGV|E|CS45Z*?Sf3hztOZtjIl@VGidjQIm7GiUIpNp20wbli^gOFyNRR9RI!mkD6o% zd%^&4tNw_a*_rkK2Z^;Iir$90$;ZWEDQh`HjkRHIiKTB8w5hl-{cqHYexZJ@$t02hU2GqmX&|M z&g_c)94#m49kV;A#ty4k(!QMF2=PCn@7Mw^me}aZ;Dq_idIl6fKsP?GRA5ZNK~$P3x@r@HPPhnrqJn*$phUjhAu>|#R#1v{8*B@j&ZGd z>pClUJI{Hd1p9+>D%%&Pw%*CrF;JAMv5Y_ls+SyZ6*^pt-zKd_27f+n!)ArLLioP}d+;g@&dD1BONZO{Z(?{>Ty){BL76(Fr z1Cu8K&6qcX`42Xyz*inl);@_R6qe(SNP%~ftIv*Yg|cSxB^MC^VX1XhzBjumpoK2Z zq&4Twsx1$C&yg#T)f?Fc7PjTh$iP--?s%L4zORF}MW&~?48UL9k09JOQ&AyRd)$;y z?L(v&bdSiVWu>|UN3q)^0`&3rD2*uxWmAR{IGS_K;^csu)(4yPcd`1bLvixG1lfTsHOPi`L9EJZ?3>eXK?2wP^h;}1r8;|IEMjUpPjmrwoh z@J19WPvgO{B5_WxC|Be1$}sTeKX4H65%3j6A%F~GC?8uCOgVn%0SY#nDL0;c{eUB+=Gdgk>-2}5g^XJ0kQLwWeW60QEIruHWDS z6;C4NPM)dyueMl+6 zXGRv_(@t-gqEvn~OzqQW4aLP+mU1x?;2Pyu;J${?A4p@VIyZO)e*{1mMNoawDypUvwQLt=vdmOmWN9 zsCT+)JUvF`X49npn2GFB&YywJwyh>13+>5(g*!oDIblNr@z`e%Maq*YPEJp#F zOPB)!D8-0N0V@DN(hr?7mPblx|6!k&^*CSyaSpJ#i!~+Y`JaJAhodiYvq*@M!g&v= z@8l46^^uWV+)U#3Mze03`VFSKu;4rqr_fQT!M^7zUsLyoI+tTK*3 zc9(0}pi$vRzvc(Bd+ZrTXcUtF@l+z>l5ihzi}HUW6=0-JK=JuXbuW@oG4&{bXmhME zk6I+h&8f4$v)ZWaKmT+}2fL=iOds%x#AdSyg+Eh*1HJ8{iXVqc7=-pUHB{8vGqlT2 zWI)zb5V6xdwdJ<@s`}zs`HT*Di$Br$tpuF)^2J4*Sr$ecalW3GUuKkCDM) z`Ni1ty^rSK*;HvBR%|tQwtvpSNqV>U{=d5>Jb9Pql6g$NtjShiS0BGFV`=nD(7LLm zci!p6*&LAKuC^&D0=`rntbb;V-ObI)tCbUg?6J1=BT(}_%C=a>5vvS7xONf#Dn z3tv@~1(lexF6PXy&*bHlNJaTh^55m-KO^wUiiAR)k83rauR3_}AZR*fK{3z%hNa6q zxnfzhMLyX%SeteMm-)uZNkpmp5;-el>v{qrlR&bkn-H zGy9l;oRujnLbhyL1=<18Aa(QSvo~fhJ^;sR7(6Z+FTD=zMTI@h1L?Wq;dOM;%X8^h zK{Is>6XWiI)YNzdy?AA`cP^-}y<+NTEGGLFfH-T=^8<+LH)##UkBcLT`jtL;goa~Q11j!8$TXK;N;6P zJ5UGn@T8!fIa7;HW(!Z20h^~Fnsit|<`~07@Q#m}D)UvsG(@f(QZ522HqhyOU(v^Z z4`>a8iss9Y7DpEWH`Qo?`trbmb5ZXwovCYMR<^8n0WB!@P+b~y)JriyXKI_yyf%;) zA^WE>Dx3vf`fZzQEyUBosucYg%T4(PN`~#cV(_sGT#j3D@-ma zEeDQlEB@vJ@|H}BF-^bsBU~>C(&guyx;8?m@Div^vN(nR&bi2SlOCVd0U09(?8@g| z%hh4&1o0+5S=Fh!&~Ux4N(879cKP^LXKU}hJL#gQBbUy)rUQzy%|8xr1ujIM`0dEQ YddnK2-fPp0K+($J>FVdQ&MBb@082Sb`Tzg` literal 0 HcmV?d00001 diff --git a/static/assets/weblog/archived/note-taking-experimental/note-list.png b/static/assets/weblog/archived/note-taking-experimental/note-list.png new file mode 100755 index 0000000000000000000000000000000000000000..bf37274a14ea67bbad7c963cd4f387405c2bbb0c GIT binary patch literal 37085 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 literal 0 HcmV?d00001 diff --git a/static/assets/weblog/archived/note-taking-experimental/password-prompt.png b/static/assets/weblog/archived/note-taking-experimental/password-prompt.png new file mode 100755 index 0000000000000000000000000000000000000000..3a40b952ff0e8024fba0e8817df406bf462c4423 GIT binary patch literal 18289 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

&4r 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 { + let el = document.getElementById("comment-section") + if (el == null) { + return + } + + let status_url = `https://hachyderm.io/api/v1/statuses/${el.getAttribute("data-status")}/context` + let comments = await (await fetch(status_url)).json() + + if (comments["descendants"] == null || comments["descendants"].length === 0) { + el.innerHTML = `

No comments yet
` + return + } + + for (let comment of comments["descendants"]) { + let date = new Date(comment.created_at).toLocaleDateString(navigator.language || "en-GB", { + day: "2-digit", + year: "numeric", + month: "long", + hour: "2-digit", + minute: "2-digit", + }) + let sanitize = DOMPurify.sanitize + let comment_html = + ` +
+ +
+ ${sanitize(comment.content)} +
+
+` + el.innerHTML += comment_html + } +})() \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index e353b04..577e2d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -459,6 +459,11 @@ ejs@^3.1.9: dependencies: jake "^10.8.5" +eleventy-plugin-time-to-read@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eleventy-plugin-time-to-read/-/eleventy-plugin-time-to-read-1.3.0.tgz#17701132491b522fa013fcc103a24eafe3b56082" + integrity sha512-EefxYZJviQbClwoQ+pXW0YsVoi3gzXJ3prJoOLO1g3n5dM17KyZh81/yyq5Inrdc2pxBz3CXsyo21kk43gK/Gg== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -856,6 +861,11 @@ luxon@^3.3.0: resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.3.tgz#8ddf0358a9492267ffec6a13675fbaab5551315d" integrity sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg== +luxon@^3.4.4: + version "3.4.4" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.4.tgz#cf20dc27dc532ba41a169c43fdcc0063601577af" + integrity sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA== + markdown-it-anchor@^8.6.7: version "8.6.7" resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634"