├── src ├── index.md ├── about.md └── posts │ ├── asecondpost.md │ └── recursing0.md ├── inc └── head.html ├── README.md ├── themes ├── ihwd │ ├── readme.md │ ├── resources │ │ └── assets │ │ │ ├── ihwd.css │ │ │ └── et-book.css │ └── templates │ │ └── node.ibis ├── graphite │ ├── resources │ │ └── assets │ │ │ ├── fonts │ │ │ ├── CrimsonText-Bold.ttf │ │ │ ├── CrimsonText-Bold.woff2 │ │ │ ├── CrimsonText-Italic.ttf │ │ │ ├── CrimsonText-Regular.ttf │ │ │ ├── CrimsonText-BoldItalic.ttf │ │ │ ├── CrimsonText-Italic.woff2 │ │ │ ├── CrimsonText-Regular.woff2 │ │ │ ├── CrimsonText-SemiBold.ttf │ │ │ ├── CrimsonText-SemiBold.woff2 │ │ │ ├── CrimsonText-BoldItalic.woff2 │ │ │ ├── CrimsonText-SemiBoldItalic.ttf │ │ │ ├── CrimsonText-SemiBoldItalic.woff2 │ │ │ └── OFL.txt │ │ │ ├── fonts.css │ │ │ ├── pygments.css │ │ │ └── graphite.css │ ├── license.txt │ ├── readme.md │ └── templates │ │ └── node.ibis └── debug │ ├── readme.md │ ├── license.txt │ ├── resources │ ├── debug.css │ └── pygments.css │ └── templates │ └── node.ibis ├── pyproject.toml ├── config.py ├── docs ├── posts.html ├── about.html ├── assets │ ├── ihwd.css │ └── et-book.css ├── index.html └── posts │ ├── asecondpost.html │ └── recursing0.html ├── LICENSE ├── ext └── list_posts.py ├── notes.md ├── .gitignore └── uv.lock /src/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: pietroppeter's blog 3 | list_posts: true 4 | --- 5 | -------------------------------------------------------------------------------- /inc/head.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # blog 2 | 3 | A personal blog 4 | 5 | built with [ark] 6 | 7 | [ark]: https://www.dmulholl.com/docs/ark/master/ 8 | -------------------------------------------------------------------------------- /themes/ihwd/readme.md: -------------------------------------------------------------------------------- 1 | - basic web design from the 90s 2 | - ihwd stands for i-heart-web-design 3 | - inspired by https://jgthms.com/web-design-in-4-minutes/ 4 | -------------------------------------------------------------------------------- /themes/graphite/resources/assets/fonts/CrimsonText-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pietroppeter/blog/main/themes/graphite/resources/assets/fonts/CrimsonText-Bold.ttf -------------------------------------------------------------------------------- /themes/graphite/resources/assets/fonts/CrimsonText-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pietroppeter/blog/main/themes/graphite/resources/assets/fonts/CrimsonText-Bold.woff2 -------------------------------------------------------------------------------- /themes/graphite/resources/assets/fonts/CrimsonText-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pietroppeter/blog/main/themes/graphite/resources/assets/fonts/CrimsonText-Italic.ttf -------------------------------------------------------------------------------- /themes/graphite/resources/assets/fonts/CrimsonText-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pietroppeter/blog/main/themes/graphite/resources/assets/fonts/CrimsonText-Regular.ttf -------------------------------------------------------------------------------- /themes/graphite/resources/assets/fonts/CrimsonText-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pietroppeter/blog/main/themes/graphite/resources/assets/fonts/CrimsonText-BoldItalic.ttf -------------------------------------------------------------------------------- /themes/graphite/resources/assets/fonts/CrimsonText-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pietroppeter/blog/main/themes/graphite/resources/assets/fonts/CrimsonText-Italic.woff2 -------------------------------------------------------------------------------- /themes/graphite/resources/assets/fonts/CrimsonText-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pietroppeter/blog/main/themes/graphite/resources/assets/fonts/CrimsonText-Regular.woff2 -------------------------------------------------------------------------------- /themes/graphite/resources/assets/fonts/CrimsonText-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pietroppeter/blog/main/themes/graphite/resources/assets/fonts/CrimsonText-SemiBold.ttf -------------------------------------------------------------------------------- /themes/graphite/resources/assets/fonts/CrimsonText-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pietroppeter/blog/main/themes/graphite/resources/assets/fonts/CrimsonText-SemiBold.woff2 -------------------------------------------------------------------------------- /themes/graphite/resources/assets/fonts/CrimsonText-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pietroppeter/blog/main/themes/graphite/resources/assets/fonts/CrimsonText-BoldItalic.woff2 -------------------------------------------------------------------------------- /themes/graphite/resources/assets/fonts/CrimsonText-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pietroppeter/blog/main/themes/graphite/resources/assets/fonts/CrimsonText-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /themes/graphite/resources/assets/fonts/CrimsonText-SemiBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pietroppeter/blog/main/themes/graphite/resources/assets/fonts/CrimsonText-SemiBoldItalic.woff2 -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "blog" 3 | version = "0.1.0" 4 | description = "A personal blog" 5 | readme = "README.md" 6 | requires-python = ">=3.12" 7 | dependencies = [ 8 | "ark>=7.3.0", 9 | ] 10 | -------------------------------------------------------------------------------- /src/about.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: About pietroppeter's blog 3 | --- 4 | This is a personal blog. Whose personal blog? [pietroppeter](https://github.com/pietroppeter/)'s. 5 | 6 | Here is the [source](https://github.com/pietroppeter/blog) of this blog. 7 | -------------------------------------------------------------------------------- /themes/debug/readme.md: -------------------------------------------------------------------------------- 1 | # Ark Debug Theme 2 | 3 | [1]: https://github.com/dmulholl/ark 4 | 5 | This [Ark][1] theme is designed as a debugging tool, useful when building themes or plugins. 6 | It displays all the page data available for use in template files. 7 | -------------------------------------------------------------------------------- /themes/debug/license.txt: -------------------------------------------------------------------------------- 1 | Permission to use, copy, modify, and/or distribute this software for any purpose 2 | with or without fee is hereby granted. 3 | 4 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 5 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 6 | FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 7 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS 8 | OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 9 | TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF 10 | THIS SOFTWARE. 11 | -------------------------------------------------------------------------------- /themes/graphite/license.txt: -------------------------------------------------------------------------------- 1 | Permission to use, copy, modify, and/or distribute this software for any purpose 2 | with or without fee is hereby granted. 3 | 4 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 5 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 6 | FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 7 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS 8 | OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 9 | TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF 10 | THIS SOFTWARE. 11 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | # ------------------------- # 2 | # Site Configuration File # 3 | # ------------------------- # 4 | 5 | # Variables set here will be available in template files under a `site` attribute, 6 | # e.g. {{ site.title }}. 7 | 8 | # Choose the theme to use when building your site. This variable should specify 9 | # the name of a theme directory in your site's 'lib' folder. 10 | theme = "ihwd" # I ❤️ web design 11 | 12 | # Site title. 13 | title = "pietroppeter's personal blog" 14 | 15 | # Site tagline. 16 | tagline = "recursing" 17 | 18 | lib_dir = "themes" 19 | out_dir = "docs" 20 | res_dir = "resources" 21 | 22 | # adds in head the et_font 23 | use_et_font = False 24 | -------------------------------------------------------------------------------- /docs/posts.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | pietroppeter's personal blog 7 | 8 | 9 | 10 | 11 | 12 | 13 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /src/posts/asecondpost.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "A second post" 3 | date: 2024-09-14 4 | is_post: true 5 | --- 6 | Today at [Open Source Saturday #54](https://www.meetup.com/open-source-saturday-milano/events/302710633/?eventOrigin=home_page_upcoming_events$inPerson) 7 | I implemented (badly) the minimal functionality required to be able to publish a second blogpost, 8 | to list all posts and to support a very minimal navigation (and an essential about page). 9 | 10 | If you want a description in English on what is Open Source Saturday format read about it in [Loris's blogpost](https://kristoff.it/blog/zig-day/). He was sitting next to me today. 11 | 12 | Before today there was [a single post here](@root/posts/recursing0.html), with no nav and nothing else. 13 | 14 | ![Image of meme with a farmer: "it ain't much, but it's honest work"](https://i.kym-cdn.com/entries/icons/facebook/000/028/021/work.jpg) 15 | -------------------------------------------------------------------------------- /docs/about.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | About pietroppeter's blog 7 | 8 | 9 | 10 | 11 | 12 | 13 | 19 |
20 |

About pietroppeter's blog

21 | 22 |

This is a personal blog. Whose personal blog? pietroppeter's.

23 |

Here is the source of this blog.

24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Pietro Peterlongo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /docs/assets/ihwd.css: -------------------------------------------------------------------------------- 1 | /* ihwd theme 2 | 3 | ihwd stands for I Heart Web Design 4 | Inspired by Jeremy Thomas "Web design in 4 minutes" 5 | */ 6 | 7 | /* center text and limit width */ 8 | body { 9 | margin: 0 auto; 10 | max-width: 50em; 11 | } 12 | 13 | /* font family: improve appeal and readability of text */ 14 | body { 15 | font-family: Georgia, Times, serif; 16 | } 17 | 18 | /* spacing: within and around */ 19 | body { 20 | line-height: 1.5em; 21 | padding: 2em 1em; 22 | } 23 | /* in the original top margin and padding of 2em 24 | is added to h2. not doing it here */ 25 | 26 | /* color and contrast */ 27 | body { 28 | color: #555; 29 | } 30 | 31 | h2, em, strong { 32 | color: #333; 33 | } 34 | 35 | /* Primary color - from Elm */ 36 | a { 37 | color: rgb(12, 145, 216); 38 | } 39 | 40 | /* not doing colors for code snippets or secondary colors */ 41 | 42 | /* minimal navbar */ 43 | nav ul { 44 | display: flex; 45 | justify-content: center; 46 | list-style: none; 47 | padding: 0; 48 | margin: 0; 49 | } 50 | 51 | nav li { 52 | margin: 0 10px; 53 | } 54 | 55 | nav li:not(:last-child)::after { 56 | content: "•"; 57 | margin-left: 10px; 58 | } 59 | 60 | img { 61 | width: 100%; 62 | } -------------------------------------------------------------------------------- /themes/ihwd/resources/assets/ihwd.css: -------------------------------------------------------------------------------- 1 | /* ihwd theme 2 | 3 | ihwd stands for I Heart Web Design 4 | Inspired by Jeremy Thomas "Web design in 4 minutes" 5 | */ 6 | 7 | /* center text and limit width */ 8 | body { 9 | margin: 0 auto; 10 | max-width: 50em; 11 | } 12 | 13 | /* font family: improve appeal and readability of text */ 14 | body { 15 | font-family: Georgia, Times, serif; 16 | } 17 | 18 | /* spacing: within and around */ 19 | body { 20 | line-height: 1.5em; 21 | padding: 2em 1em; 22 | } 23 | /* in the original top margin and padding of 2em 24 | is added to h2. not doing it here */ 25 | 26 | /* color and contrast */ 27 | body { 28 | color: #555; 29 | } 30 | 31 | h2, em, strong { 32 | color: #333; 33 | } 34 | 35 | /* Primary color - from Elm */ 36 | a { 37 | color: rgb(12, 145, 216); 38 | } 39 | 40 | /* not doing colors for code snippets or secondary colors */ 41 | 42 | /* minimal navbar */ 43 | nav ul { 44 | display: flex; 45 | justify-content: center; 46 | list-style: none; 47 | padding: 0; 48 | margin: 0; 49 | } 50 | 51 | nav li { 52 | margin: 0 10px; 53 | } 54 | 55 | nav li:not(:last-child)::after { 56 | content: "•"; 57 | margin-left: 10px; 58 | } 59 | 60 | img { 61 | width: 100%; 62 | } -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | pietroppeter's blog 7 | 8 | 9 | 10 | 11 | 12 | 13 | 19 |
20 |

pietroppeter's blog

21 | 22 | 23 | 24 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /themes/graphite/readme.md: -------------------------------------------------------------------------------- 1 | # Graphite 2 | 3 | [1]: https://github.com/dmulholl/ark 4 | [2]: https://fonts.google.com/specimen/Crimson+Text 5 | 6 | A simple [Ark][1] theme designed for generating project documentation. 7 | 8 | This theme will display the following attributes from the site's configuration 9 | file in the site header: 10 | 11 | * `title` 12 | * `tagline` 13 | * `version` 14 | 15 | It supports the following includes: 16 | 17 | * `menu` 18 | 19 | This file will be used to construct the theme's main menu. It should contain 20 | a list of links, optionally with nested sub-lists. 21 | 22 | * `head` 23 | 24 | If a `head.html` file is present in the includes folder its content will be 25 | included at the end of each page's `` section. This file can be used 26 | to add custom CSS or JavaScript to a site without directly editing the 27 | theme's template files. 28 | 29 | * `foot` 30 | 31 | If a `foot.html` file is present in the includes folder its content will 32 | be included at the end of each page's `` section. This file can be 33 | used to add custom JavaScript to a site without directly editing the 34 | theme's template files. 35 | 36 | This theme is distributed under the following license: 37 | 38 | * All code is released under the Zero-Clause BSD license (0BSD). 39 | * The bundled [Crimson Text][2] font is distributed under the SIL Open Font 40 | License. 41 | -------------------------------------------------------------------------------- /themes/ihwd/templates/node.ibis: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{ node.meta_title || node.title || site.title }} 7 | 8 | {% if site.use_et_font %}{% endif %} 9 | {% if node.meta_description %}{% endif %} 10 | {{ inc.head }} 11 | 12 | 13 | 19 |
20 | {% if node.meta.title %}

{{ node.meta.title }}

{% endif%} 21 | {% if node.meta.date %}

{{ node.meta.date }}

{% endif%} 22 | {{ node.html }} 23 | {% if node.meta.list_posts %} 24 | 32 | {% endif %} 33 | 34 | 35 | -------------------------------------------------------------------------------- /docs/posts/asecondpost.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | A second post 7 | 8 | 9 | 10 | 11 | 12 | 13 | 19 |
20 |

A second post

21 |

2024-09-14

22 |

Today at Open Source Saturday #54 23 | I implemented (badly) the minimal functionality required to be able to publish a second blogpost, 24 | to list all posts and to support a very minimal navigation (and an essential about page).

25 |

If you want a description in English on what is Open Source Saturday format read about it in Loris's blogpost. He was sitting next to me today.

26 |

Before today there was a single post here, with no nav and nothing else.

27 |

Image of meme with a farmer: "it ain't much, but it's honest work"

28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /ext/list_posts.py: -------------------------------------------------------------------------------- 1 | ## 2 | # This extension automatically generates a list of posts sorted by date (reverse sort) 3 | # each element of the list is a dict with entries title, date and node url 4 | # the list is appended to page_data during rendering 5 | # a node is added to the list if it has a is_post (set to true), title and date metadata 6 | # the idea is to use this only when the page is a homepage to list all posts 7 | # 8 | # the implementation for this extension is derived from automenu bundled extension 9 | import ark 10 | 11 | 12 | # We generate the list once and cache it for future use. 13 | cached_posts = None 14 | 15 | 16 | # Register a callback to add an 'posts' attribute to each page-data dictionary. 17 | @ark.events.register(ark.events.Event.RENDER_PAGE) 18 | def add_posts(page_data): 19 | global cached_posts 20 | if cached_posts is None: 21 | cached_posts = make_posts() 22 | page_data['posts'] = cached_posts 23 | 24 | 25 | def make_posts(): 26 | root = ark.nodes.root() 27 | all_nodes = collect_all_nodes(root) 28 | posts = [ 29 | dict(title=node.meta["title"], date=node.meta["date"], url=node.url) 30 | for node in all_nodes 31 | if ("title" in node.meta) and ("date" in node.meta) and ("is_post" in node.meta) and (node.meta["is_post"]) 32 | ] 33 | posts.sort(key=lambda p: p["date"], reverse=True) 34 | return posts 35 | 36 | 37 | def collect_all_nodes(root): 38 | if root is None: 39 | return [] 40 | 41 | # Start by adding the root node itself 42 | nodes = [root] 43 | 44 | # Recursively collect all nodes from the children 45 | for child in root.children: 46 | nodes.extend(collect_all_nodes(child)) 47 | 48 | return nodes 49 | -------------------------------------------------------------------------------- /docs/assets/et-book.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | @font-face { 4 | font-family: "et-book"; 5 | src: url("et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot"); 6 | src: url("et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot?#iefix") format("embedded-opentype"), url("et-book/et-book-roman-line-figures/et-book-roman-line-figures.woff") format("woff"), url("et-book/et-book-roman-line-figures/et-book-roman-line-figures.ttf") format("truetype"), url("et-book/et-book-roman-line-figures/et-book-roman-line-figures.svg#etbookromanosf") format("svg"); 7 | font-weight: normal; 8 | font-style: normal 9 | } 10 | 11 | @font-face { 12 | font-family: "et-book"; 13 | src: url("et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot"); 14 | src: url("et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot?#iefix") format("embedded-opentype"), url("et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.woff") format("woff"), url("et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.ttf") format("truetype"), url("et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.svg#etbookromanosf") format("svg"); 15 | font-weight: normal; 16 | font-style: italic 17 | } 18 | 19 | @font-face { 20 | font-family: "et-book"; 21 | src: url("et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot"); 22 | src: url("et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot?#iefix") format("embedded-opentype"), url("et-book/et-book-bold-line-figures/et-book-bold-line-figures.woff") format("woff"), url("et-book/et-book-bold-line-figures/et-book-bold-line-figures.ttf") format("truetype"), url("et-book/et-book-bold-line-figures/et-book-bold-line-figures.svg#etbookromanosf") format("svg"); 23 | font-weight: bold; 24 | font-style: normal 25 | } -------------------------------------------------------------------------------- /themes/ihwd/resources/assets/et-book.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | @font-face { 4 | font-family: "et-book"; 5 | src: url("et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot"); 6 | src: url("et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot?#iefix") format("embedded-opentype"), url("et-book/et-book-roman-line-figures/et-book-roman-line-figures.woff") format("woff"), url("et-book/et-book-roman-line-figures/et-book-roman-line-figures.ttf") format("truetype"), url("et-book/et-book-roman-line-figures/et-book-roman-line-figures.svg#etbookromanosf") format("svg"); 7 | font-weight: normal; 8 | font-style: normal 9 | } 10 | 11 | @font-face { 12 | font-family: "et-book"; 13 | src: url("et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot"); 14 | src: url("et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot?#iefix") format("embedded-opentype"), url("et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.woff") format("woff"), url("et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.ttf") format("truetype"), url("et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.svg#etbookromanosf") format("svg"); 15 | font-weight: normal; 16 | font-style: italic 17 | } 18 | 19 | @font-face { 20 | font-family: "et-book"; 21 | src: url("et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot"); 22 | src: url("et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot?#iefix") format("embedded-opentype"), url("et-book/et-book-bold-line-figures/et-book-bold-line-figures.woff") format("woff"), url("et-book/et-book-bold-line-figures/et-book-bold-line-figures.ttf") format("truetype"), url("et-book/et-book-bold-line-figures/et-book-bold-line-figures.svg#etbookromanosf") format("svg"); 23 | font-weight: bold; 24 | font-style: normal 25 | } -------------------------------------------------------------------------------- /themes/graphite/templates/node.ibis: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{ node.meta_title || node.title || site.title }} 7 | 8 | 9 | 10 | {% if node.meta_description %} 11 | 12 | {% endif %} 13 | {{ inc.head }} 14 | 15 | 16 |
17 |

{{ site.title || "Site Title" }}

18 | {% if site.tagline %} 19 |

{{ site.tagline.strip() }}

20 | {% endif %} 21 | {% if site.version %} 22 |

{{ site.version.strip() }}

23 | {% endif %} 24 | 33 |
34 |
35 |
36 |

{{ node.title }}

37 | {% if node.subtitle %} 38 |

{{ node.subtitle }}

39 | {% endif %} 40 |
41 |
42 | {{ node.html }} 43 |
44 | {{ inc.foot }} 45 | 46 | 47 | -------------------------------------------------------------------------------- /notes.md: -------------------------------------------------------------------------------- 1 | ## 2024-09-14 2 | 3 | during [![Open Source Saturday](https://img.shields.io/badge/%E2%9D%A4%EF%B8%8F-open%20source%20saturday-F64060.svg)](https://www.meetup.com/it-IT/Open-Source-Saturday-Milano/) 4 | 5 | - clean up blog.egg-info folder (who added it?) [x] 6 | - exclude et_font css in head [x] 7 | - how do I exclude the asset? how do I exclude a directory in src? or a path, conditionally? 8 | - learning ark 9 | - use a head template? yes, since I will need to include in two types of template (home and post) 10 | - plan what to change in order to list posts! 11 | - check how the blog theme does it 12 | - here is a blog theme: https://github.com/dmulholl/twentyfifteen 13 | - which is based on this blog plugin: https://github.com/dmulholl/holly 14 | - mmh, I do not want to use a plugin (and I do not think I need it, do I?) 15 | - mmh, maybe I need it! it seems I cannot 16 | - I can with a hack (double loop on children) [x] 17 | - minimal nav between posts (aka home) and about page [x] 18 | - how to style it? I need a class but I cannot have a class from md 19 | - change nav.md to nav.html and styled with minimal styling [x] 20 | - list posts [x] 21 | - add date [x] 22 | - use title and date in blogpost and node template [x] 23 | 24 | ordering of posts is very hacky! it is based on alphabetical list in folder posts 25 | 26 | ## 2024-09-07 27 | 28 | - setup with uv [x] 29 | 30 | ## 2023-10-30 31 | 32 | ### leftover for next post 33 | 34 | - [ ] use a blog theme (posts) 35 | - [ ] deploy with CI 36 | - [ ] style code snippets 37 | 38 | ### ihwd theme + post recursing0 39 | 40 | - content0: content written in Toceno (minus schedule) 41 | - ihwd0: center text and limit width 42 | - content1: fix text and links. fix wording of rules 43 | - colors, spacing and that's about it 44 | - [x] ah the date! 45 | - I was not able to do it with the theme 46 | - [ ] et-font? no later 47 | 48 | # learning ark 49 | 50 | - issue: site.py clashes with PyLance :/ (can change to config.py!) 51 | - lib is ignored but maybe it shouldn't? unignored partially (and changed to themes) 52 | - should I remove the menu in inc? done 53 | - should I rename out to docs? done 54 | 55 | ### setup 56 | 57 | -------------------------------------------------------------------------------- /themes/debug/resources/debug.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-size: 100%; 3 | } 4 | 5 | body { 6 | margin: 0 auto; 7 | padding: 50px; 8 | font-family: "Georgia", serif; 9 | font-size: 14px; 10 | line-height: 1.5; 11 | color: #333; 12 | background-color: #f8f8f8; 13 | } 14 | 15 | #wrap { 16 | max-width: 800px; 17 | background-color: #fff; 18 | padding: 80px; 19 | margin: 0 auto; 20 | border: 1px solid #ccc; 21 | } 22 | 23 | h1 { 24 | margin: 0 0 40px; 25 | padding: 0; 26 | font-weight: normal; 27 | line-height: 1.2; 28 | padding: 16px 0; 29 | font-size: 24px; 30 | border-top: 1px solid #ccc; 31 | border-bottom: 1px solid #ccc; 32 | } 33 | 34 | h1 a { 35 | float: right; 36 | text-decoration: none; 37 | padding-right: 20px; 38 | } 39 | 40 | ul, ol { 41 | margin: 36px 0px; 42 | padding: 0 0 0 16px; 43 | } 44 | 45 | ul ul, ol ol, ul ol, ol ul { 46 | margin: 0 8px; 47 | } 48 | 49 | li { 50 | margin: 0; 51 | padding: 0; 52 | } 53 | 54 | pre { 55 | font-size: 13px; 56 | font-family: monospace; 57 | color: #222; 58 | background-color: #f8f8f8; 59 | margin: 32px 0; 60 | padding: 18px 24px; 61 | border-top: 1px solid #ccc; 62 | border-bottom: 1px solid #ccc; 63 | overflow: auto; 64 | } 65 | 66 | .button { 67 | background-color: #eee; 68 | cursor: pointer; 69 | padding: 20px; 70 | width: 100%; 71 | border: none; 72 | text-align: left; 73 | outline: none; 74 | font-size: 16px; 75 | font-family: "Georgia", serif; 76 | margin-top: 5px; 77 | } 78 | 79 | .active, .button:hover { 80 | background-color: #ccc; 81 | } 82 | 83 | .menu { 84 | padding: 0 20px; 85 | } 86 | 87 | .panel { 88 | padding: 0 20px; 89 | background-color: white; 90 | max-height: 0; 91 | overflow: hidden; 92 | transition: max-height 0.2s ease-out; 93 | } 94 | 95 | .panel.last pre { 96 | margin-bottom: 0; 97 | } 98 | 99 | .button:after { 100 | content: '\02795'; /* Unicode character for "plus" sign (+) */ 101 | font-size: 10px; 102 | color: red; 103 | float: right; 104 | margin-left: 5px; 105 | } 106 | 107 | .active:after { 108 | content: "\2796"; /* Unicode character for "minus" sign (-) */ 109 | } 110 | -------------------------------------------------------------------------------- /themes/graphite/resources/assets/fonts.css: -------------------------------------------------------------------------------- 1 | /** 2 | * ------------------------------------------------------------------------- 3 | * Google fonts served locally. 4 | * ------------------------------------------------------------------------- 5 | */ 6 | 7 | @font-face { 8 | font-family: 'Crimson Text'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: local('Crimson Text Regular'), 12 | local('CrimsonText-Regular'), 13 | url(fonts/CrimsonText-Regular.woff2) format('woff2'), 14 | url(fonts/CrimsonText-Regular.ttf) format('truetype'); 15 | } 16 | 17 | @font-face { 18 | font-family: 'Crimson Text'; 19 | font-style: italic; 20 | font-weight: 400; 21 | src: local('Crimson Text Italic'), 22 | local('CrimsonText-Italic'), 23 | url(fonts/CrimsonText-Italic.woff2) format('woff2'), 24 | url(fonts/CrimsonText-Italic.ttf) format('truetype'); 25 | } 26 | 27 | @font-face { 28 | font-family: 'Crimson Text'; 29 | font-style: normal; 30 | font-weight: 700; 31 | src: local('Crimson Text Bold'), 32 | local('CrimsonText-Bold'), 33 | url(fonts/CrimsonText-Bold.woff2) format('woff2'), 34 | url(fonts/CrimsonText-Bold.ttf) format('truetype'); 35 | } 36 | 37 | /* 38 | The fonts below are packaged with the theme and can be uncommented 39 | if needed. 40 | */ 41 | 42 | /* 43 | @font-face { 44 | font-family: 'Crimson Text'; 45 | font-style: italic; 46 | font-weight: 700; 47 | src: local('Crimson Text Bold Italic'), 48 | local('CrimsonText-BoldItalic'), 49 | url(fonts/CrimsonText-BoldItalic.woff2) format('woff2'), 50 | url(fonts/CrimsonText-BoldItalic.ttf) format('truetype'); 51 | } 52 | 53 | @font-face { 54 | font-family: 'Crimson Text'; 55 | font-style: normal; 56 | font-weight: 600; 57 | src: local('Crimson Text SemiBold'), 58 | local('CrimsonText-SemiBold'), 59 | url(fonts/CrimsonText-SemiBold.woff2) format('woff2'), 60 | url(fonts/CrimsonText-SemiBold.ttf) format('truetype'); 61 | } 62 | 63 | @font-face { 64 | font-family: 'Crimson Text'; 65 | font-style: italic; 66 | font-weight: 600; 67 | src: local('Crimson Text SemiBold Italic'), 68 | local('CrimsonText-SemiBoldItalic'), 69 | url(fonts/CrimsonText-SemiBoldItalic.woff2) format('woff2'), 70 | url(fonts/CrimsonText-SemiBoldItalic.ttf) format('truetype'); 71 | } 72 | */ 73 | -------------------------------------------------------------------------------- /themes/debug/templates/node.ibis: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debugging: {{ site.title || "Mystery Site" }} 6 | 7 | 8 | 9 | 10 |
11 |

12 | {$ node $} 13 | {% if node.parent %} 14 | 15 | {% endif %} 16 |

17 | 18 | {% if inc.menu %} 19 | 22 | {% endif %} 23 | 24 | 25 |
26 | {{ automenu }} 27 |
28 | 29 | 30 |
31 | 38 |
39 | 40 | 41 |
42 |
{{ node.meta|pprint|pygmentize('python') }}
43 |
44 | 45 | 46 |
47 |
{{ node.text.strip()|escape }}
48 |
49 | 50 | 51 |
52 |
{{ node.html|escape }}
53 |
54 | 55 | 56 |
57 |
{{ context.data.stack|index(2)|pprint|pygmentize('python') }}
58 |
59 |
60 | 61 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /src/posts/recursing0.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Recursing: step 0" 3 | date: 2023-10-30 4 | is_post: true 5 | --- 6 | 7 | Yesterday was my last day as “Happily Unemployed” (_felicemente disoccupato_). 8 | 9 | Roughly 4 months ago I resigned. I was close to reaching 9 years of growth and joys and sorrows (of life, one would say) at the same company. It has been a very nice _percorso_ (a better word is [camino] from Spanish, 'path' comes in third). I have met a number of beautiful people there. It was time for a change. 10 | 11 | Shortly before resigning I watched an interview of [Salvatore] Sanfilippo where he states the following four rules that have helped him conduct himself throughout the years (my wording): 12 | 13 | 1. **_Nulla die sine linea_**: do not let a day pass without writing a line of code. Meaningful code that takes your project forward. If you consistently do this (e.g. for 2 hours a day for years) you can move mountains. 14 | 2. **Technical Excellence**: I should strive for going deep on the topic I am working on. For example, if I work with Deep Learning I should be able to compute derivative of the error of activation functions, I should be able to write a neural network from scratch and not only being able to use the framework (which I should use when doing actuall stuff). 15 | 3. **Work on something that matters**: find places who write code that is important, try to stay in teams with people that are better than you 16 | 4. **Be a decent human being**: you should always give credit to others for everything they have given to you. If an idea comes from someone else, say it in the meeting. If someone is doing something wrong and it is not that important, do not mention it. If it is important maybe write an email in private with kind tones. 17 | 18 | These rules look like a nice tool for thought to keep in mind. 19 | 20 | This last month of October, actually this last 4 weeks of being happily unemployed, have been a special period. I focused on resting, taking care of myself and my family and prepare for the next steps. I have met even more people through some wonderful tech communities. I was surprised by how many things you have to do when you do not actually have anything you *really* **have to** do. Of course I planned for more than I could chew, took a hit and realized I should just enjoy this period. I did. This last week was nothing short of amazing. 21 | 22 | Today I start [recursing]. 23 | 24 | I will say more about that, but the most practical matter at the moment is that I will need to change my schedule. I will have to be working with other people mostly in the late afternoon and in the evening. This is the first challenge. 25 | 26 | Have a good day y’all! 😊 27 | 28 | [camino]: https://masspoetry.org/machado-cullen-the-favorite-poem-project/ 29 | [Salvatore]: https://www.youtube.com/live/SZo2lH9DE5U?si=WBbtHUcVFoZWXnk2&t=5552 30 | [recursing]: https://www.recurse.com 31 | -------------------------------------------------------------------------------- /docs/posts/recursing0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Recursing: step 0 7 | 8 | 9 | 10 | 11 | 12 | 13 | 19 |
20 |

Recursing: step 0

21 |

2023-10-30

22 |

Yesterday was my last day as “Happily Unemployed” (felicemente disoccupato).

23 |

Roughly 4 months ago I resigned. I was close to reaching 9 years of growth and joys and sorrows (of life, one would say) at the same company. It has been a very nice percorso (a better word is camino from Spanish, 'path' comes in third). I have met a number of beautiful people there. It was time for a change.

24 |

Shortly before resigning I watched an interview of Salvatore Sanfilippo where he states the following four rules that have helped him conduct himself throughout the years (my wording):

25 |
    26 |
  1. Nulla die sine linea: do not let a day pass without writing a line of code. Meaningful code that takes your project forward. If you consistently do this (e.g. for 2 hours a day for years) you can move mountains.
  2. 27 |
  3. Technical Excellence: I should strive for going deep on the topic I am working on. For example, if I work with Deep Learning I should be able to compute derivative of the error of activation functions, I should be able to write a neural network from scratch and not only being able to use the framework (which I should use when doing actuall stuff).
  4. 28 |
  5. Work on something that matters: find places who write code that is important, try to stay in teams with people that are better than you
  6. 29 |
  7. Be a decent human being: you should always give credit to others for everything they have given to you. If an idea comes from someone else, say it in the meeting. If someone is doing something wrong and it is not that important, do not mention it. If it is important maybe write an email in private with kind tones.
  8. 30 |
31 |

These rules look like a nice tool for thought to keep in mind.

32 |

This last month of October, actually this last 4 weeks of being happily unemployed, have been a special period. I focused on resting, taking care of myself and my family and prepare for the next steps. I have met even more people through some wonderful tech communities. I was surprised by how many things you have to do when you do not actually have anything you really have to do. Of course I planned for more than I could chew, took a hit and realized I should just enjoy this period. I did. This last week was nothing short of amazing.

33 |

Today I start recursing.

34 |

I will say more about that, but the most practical matter at the moment is that I will need to change my schedule. I will have to be working with other people mostly in the late afternoon and in the evening. This is the first challenge.

35 |

Have a good day y’all! 😊

36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # copied from https://github.com/github/gitignore/blob/main/Python.gitignore 2 | # Byte-compiled / optimized / DLL files 3 | __pycache__/ 4 | *.py[cod] 5 | *$py.class 6 | 7 | # C extensions 8 | *.so 9 | 10 | # Distribution / packaging 11 | .Python 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | 19 | #lib/ # <- ark uses this 20 | # ignore ark default themes: 21 | lib/debug/ 22 | lib/graphite/ 23 | # ark build folder 24 | out/ 25 | 26 | lib64/ 27 | parts/ 28 | sdist/ 29 | var/ 30 | wheels/ 31 | share/python-wheels/ 32 | *.egg-info/ 33 | .installed.cfg 34 | *.egg 35 | MANIFEST 36 | 37 | # PyInstaller 38 | # Usually these files are written by a python script from a template 39 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 40 | *.manifest 41 | *.spec 42 | 43 | # Installer logs 44 | pip-log.txt 45 | pip-delete-this-directory.txt 46 | 47 | # Unit test / coverage reports 48 | htmlcov/ 49 | .tox/ 50 | .nox/ 51 | .coverage 52 | .coverage.* 53 | .cache 54 | nosetests.xml 55 | coverage.xml 56 | *.cover 57 | *.py,cover 58 | .hypothesis/ 59 | .pytest_cache/ 60 | cover/ 61 | 62 | # Translations 63 | *.mo 64 | *.pot 65 | 66 | # Django stuff: 67 | *.log 68 | local_settings.py 69 | db.sqlite3 70 | db.sqlite3-journal 71 | 72 | # Flask stuff: 73 | instance/ 74 | .webassets-cache 75 | 76 | # Scrapy stuff: 77 | .scrapy 78 | 79 | # Sphinx documentation 80 | docs/_build/ 81 | 82 | # PyBuilder 83 | .pybuilder/ 84 | target/ 85 | 86 | # Jupyter Notebook 87 | .ipynb_checkpoints 88 | 89 | # IPython 90 | profile_default/ 91 | ipython_config.py 92 | 93 | # pyenv 94 | # For a library or package, you might want to ignore these files since the code is 95 | # intended to run in multiple environments; otherwise, check them in: 96 | # .python-version 97 | 98 | # pipenv 99 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 100 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 101 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 102 | # install all needed dependencies. 103 | #Pipfile.lock 104 | 105 | # poetry 106 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 107 | # This is especially recommended for binary packages to ensure reproducibility, and is more 108 | # commonly ignored for libraries. 109 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 110 | #poetry.lock 111 | 112 | # pdm 113 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 114 | #pdm.lock 115 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 116 | # in version control. 117 | # https://pdm.fming.dev/#use-with-ide 118 | .pdm.toml 119 | 120 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 121 | __pypackages__/ 122 | 123 | # Celery stuff 124 | celerybeat-schedule 125 | celerybeat.pid 126 | 127 | # SageMath parsed files 128 | *.sage.py 129 | 130 | # Environments 131 | .env 132 | .venv 133 | env/ 134 | venv/ 135 | ENV/ 136 | env.bak/ 137 | venv.bak/ 138 | 139 | # Spyder project settings 140 | .spyderproject 141 | .spyproject 142 | 143 | # Rope project settings 144 | .ropeproject 145 | 146 | # mkdocs documentation 147 | /site 148 | 149 | # mypy 150 | .mypy_cache/ 151 | .dmypy.json 152 | dmypy.json 153 | 154 | # Pyre type checker 155 | .pyre/ 156 | 157 | # pytype static type analyzer 158 | .pytype/ 159 | 160 | # Cython debug symbols 161 | cython_debug/ 162 | 163 | # PyCharm 164 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 165 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 166 | # and can be added to the global gitignore or merged into this file. For a more nuclear 167 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 168 | #.idea/ -------------------------------------------------------------------------------- /themes/graphite/resources/assets/fonts/OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2010, Sebastian Kosch (sebastian@aldusleaf.org), 2 | with Reserved Font Name "Crimson" and "Crimson Text". 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | http://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /themes/debug/resources/pygments.css: -------------------------------------------------------------------------------- 1 | /* 2 | Syntax highlighting styles for Pygmentized code samples. 3 | */ 4 | 5 | pre .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ 6 | pre .c { color: #8f5902; font-style: italic } /* Comment */ 7 | pre .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ 8 | pre .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ 9 | pre .cp { color: #8f5902 } /* Comment.Preproc */ 10 | pre .cs { color: #8f5902; font-style: italic } /* Comment.Special */ 11 | pre .g { color: #222222 } /* Generic */ 12 | pre .gd { color: #a40000 } /* Generic.Deleted */ 13 | pre .ge { color: #222222; font-style: italic } /* Generic.Emph */ 14 | pre .gr { color: #ef2929 } /* Generic.Error */ 15 | pre .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 16 | pre .gi { color: #00A000 } /* Generic.Inserted */ 17 | pre .go { color: #222222; font-style: italic } /* Generic.Output */ 18 | pre .gp { color: #8f5902 } /* Generic.Prompt */ 19 | pre .gs { color: #222222; font-weight: bold } /* Generic.Strong */ 20 | pre .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 21 | pre .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ 22 | pre .il { color: #000088 } /* Literal.Number.Integer.Long */ 23 | pre .k { color: #204a87; font-weight: bold } /* Keyword */ 24 | pre .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */ 25 | pre .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */ 26 | pre .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */ 27 | pre .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */ 28 | pre .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */ 29 | pre .kt { color: #204a87; font-weight: bold } /* Keyword.Type */ 30 | pre .l { color: #222222 } /* Literal */ 31 | pre .ld { color: #222222 } /* Literal.Date */ 32 | pre .m { color: #000088 } /* Literal.Number */ 33 | pre .mf { color: #000088 } /* Literal.Number.Float */ 34 | pre .mh { color: #000088 } /* Literal.Number.Hex */ 35 | pre .mi { color: #000088 } /* Literal.Number.Integer */ 36 | pre .mo { color: #000088 } /* Literal.Number.Oct */ 37 | pre .n { color: #222222 } /* Name */ 38 | pre .na { color: #8f5902 } /* Name.Attribute */ 39 | pre .nb { color: #204a87 } /* Name.Builtin */ 40 | pre .nc { color: #222222 } /* Name.Class */ 41 | pre .no { color: #222222 } /* Name.Constant */ 42 | pre .nd { color: #000088 } /* Name.Decorator */ 43 | pre .ni { color: #ce5c00 } /* Name.Entity */ 44 | pre .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ 45 | pre .nf { color: #222222 } /* Name.Function */ 46 | pre .nl { color: #f57900 } /* Name.Label */ 47 | pre .nn { color: #222222 } /* Name.Namespace */ 48 | pre .nt { color: #204a87; font-weight: bold } /* Name.Tag */ 49 | pre .nv { color: #222222 } /* Name.Variable */ 50 | pre .nx { color: #222222 } /* Name.Other */ 51 | pre .o { color: #000088 } /* Operator */ 52 | pre .ow { color: #204a87; font-weight: bold } /* Operator.Word */ 53 | pre .p { color: #222222 } /* Punctuation */ 54 | pre .py { color: #222222 } /* Name.Property */ 55 | pre .s { color: #880000 } /* Literal.String */ 56 | pre .s1 { color: #880000 } /* Literal.String.Single */ 57 | pre .s2 { color: #880000 } /* Literal.String.Double */ 58 | pre .sb { color: #880000 } /* Literal.String.Backtick */ 59 | pre .sc { color: #880000 } /* Literal.String.Char */ 60 | pre .sd { color: #880000; font-style: italic } /* Literal.String.Doc */ 61 | pre .se { color: #880000 } /* Literal.String.Escape */ 62 | pre .sh { color: #880000 } /* Literal.String.Heredoc */ 63 | pre .si { color: #880000 } /* Literal.String.Interpol */ 64 | pre .sr { color: #880000 } /* Literal.String.Regex */ 65 | pre .ss { color: #880000 } /* Literal.String.Symbol */ 66 | pre .sx { color: #880000 } /* Literal.String.Other */ 67 | pre .vc { color: #222222 } /* Name.Variable.Class */ 68 | pre .vg { color: #222222 } /* Name.Variable.Global */ 69 | pre .vi { color: #222222 } /* Name.Variable.Instance */ 70 | pre .x { color: #222222 } /* Other */ 71 | 72 | pre .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */ 73 | pre .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ 74 | -------------------------------------------------------------------------------- /themes/graphite/resources/assets/pygments.css: -------------------------------------------------------------------------------- 1 | /** 2 | * ------------------------------------------------------------------------- 3 | * Pygments Theme 4 | * ------------------------------------------------------------------------- 5 | */ 6 | 7 | pre .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ 8 | pre .c { color: #8f5902 } /* Comment */ 9 | pre .c1 { color: #8f5902 } /* Comment.Single */ 10 | pre .cm { color: #8f5902 } /* Comment.Multiline */ 11 | pre .cp { color: #540e8a; font-weight: bold } /* Comment.Preproc */ 12 | pre .cs { color: #8f5902 } /* Comment.Special */ 13 | pre .g { color: #222222 } /* Generic */ 14 | pre .gd { color: #a40000 } /* Generic.Deleted */ 15 | pre .ge { color: #222222 } /* Generic.Emph */ 16 | pre .gr { color: #ef2929 } /* Generic.Error */ 17 | pre .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 18 | pre .gi { color: #00A000 } /* Generic.Inserted */ 19 | pre .go { color: #222222 } /* Generic.Output */ 20 | pre .gp { color: #8f5902 } /* Generic.Prompt */ 21 | pre .gs { color: #222222; font-weight: bold } /* Generic.Strong */ 22 | pre .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 23 | pre .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ 24 | pre .il { color: #000088 } /* Literal.Number.Integer.Long */ 25 | pre .k { color: #204a87; font-weight: bold } /* Keyword */ 26 | pre .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */ 27 | pre .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */ 28 | pre .kn { color: #540e8a; font-weight: bold } /* Keyword.Namespace */ 29 | pre .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */ 30 | pre .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */ 31 | pre .kt { color: #204a87; font-weight: bold } /* Keyword.Type */ 32 | pre .l { color: #222222 } /* Literal */ 33 | pre .ld { color: #222222 } /* Literal.Date */ 34 | pre .m { color: #000088 } /* Literal.Number */ 35 | pre .mf { color: #000088 } /* Literal.Number.Float */ 36 | pre .mh { color: #000088 } /* Literal.Number.Hex */ 37 | pre .mi { color: #000088 } /* Literal.Number.Integer */ 38 | pre .mo { color: #000088 } /* Literal.Number.Oct */ 39 | pre .mb { color: #000088 } /* Literal.Number.Bin */ 40 | pre .n { color: #222222 } /* Name */ 41 | pre .na { color: #8f5902 } /* Name.Attribute */ 42 | pre .nb { color: #204a87 } /* Name.Builtin */ 43 | pre .nc { color: #222222 } /* Name.Class */ 44 | pre .no { color: #222222 } /* Name.Constant */ 45 | pre .nd { color: #000088 } /* Name.Decorator */ 46 | pre .ni { color: #ce5c00 } /* Name.Entity */ 47 | pre .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ 48 | pre .nf { color: #222222 } /* Name.Function */ 49 | pre .nl { color: #880000 } /* Name.Label */ 50 | pre .nn { color: #222222 } /* Name.Namespace */ 51 | pre .nt { color: #204a87; font-weight: bold } /* Name.Tag */ 52 | pre .nv { color: #222222 } /* Name.Variable */ 53 | pre .nx { color: #222222 } /* Name.Other */ 54 | pre .o { color: #000088 } /* Operator */ 55 | pre .ow { color: #204a87; font-weight: bold } /* Operator.Word */ 56 | pre .p { color: #222222 } /* Punctuation */ 57 | pre .py { color: #222222 } /* Name.Property */ 58 | pre .s { color: #880000 } /* Literal.String */ 59 | pre .s1 { color: #880000 } /* Literal.String.Single */ 60 | pre .s2 { color: #880000 } /* Literal.String.Double */ 61 | pre .sb { color: #880000 } /* Literal.String.Backtick */ 62 | pre .sc { color: #880000 } /* Literal.String.Char */ 63 | pre .sd { color: #880000 } /* Literal.String.Doc */ 64 | pre .se { color: #880000 } /* Literal.String.Escape */ 65 | pre .sh { color: #880000 } /* Literal.String.Heredoc */ 66 | pre .si { color: #880000 } /* Literal.String.Interpol */ 67 | pre .sr { color: #880000 } /* Literal.String.Regex */ 68 | pre .ss { color: #880000 } /* Literal.String.Symbol */ 69 | pre .sx { color: #880000 } /* Literal.String.Other */ 70 | pre .vc { color: #222222 } /* Name.Variable.Class */ 71 | pre .vg { color: #222222 } /* Name.Variable.Global */ 72 | pre .vi { color: #222222 } /* Name.Variable.Instance */ 73 | pre .x { color: #222222 } /* Other */ 74 | 75 | pre .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */ 76 | pre .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ 77 | -------------------------------------------------------------------------------- /themes/graphite/resources/assets/graphite.css: -------------------------------------------------------------------------------- 1 | /** 2 | * ------------------------------------------------------------------------- 3 | * Micro Reset 4 | * ------------------------------------------------------------------------- 5 | */ 6 | 7 | *, *:before, *:after { 8 | box-sizing: inherit; 9 | } 10 | 11 | html { 12 | box-sizing: border-box; 13 | font-size: 100%; 14 | -webkit-text-size-adjust: none; 15 | text-size-adjust: none; 16 | } 17 | 18 | body { 19 | margin: 0; 20 | padding: 0; 21 | } 22 | 23 | form, fieldset, legend { 24 | margin: 0; 25 | padding: 0; 26 | } 27 | 28 | button, input, select, textarea, label { 29 | margin: 0; 30 | padding: 0; 31 | font-family: inherit; 32 | font-size: inherit; 33 | } 34 | 35 | img { 36 | border: 0; 37 | max-width: 100%; 38 | } 39 | 40 | /** 41 | * ------------------------------------------------------------------------- 42 | * Typography 43 | * ------------------------------------------------------------------------- 44 | */ 45 | 46 | body { 47 | font-size: 17px; 48 | color: black; 49 | font-family: 'Crimson Text', Georgia, serif; 50 | line-height: 1.75; 51 | } 52 | 53 | h1 { 54 | padding: 0; 55 | margin: 80px 0 30px; 56 | line-height: 1.25; 57 | text-align: center; 58 | font-size: 32px; 59 | font-weight: normal; 60 | } 61 | 62 | h2 { 63 | padding: 0; 64 | margin: 80px 0 30px; 65 | line-height: 1.25; 66 | text-align: center; 67 | font-size: 22px; 68 | font-weight: bold; 69 | } 70 | 71 | h2.underline { 72 | padding: 0; 73 | margin: 80px 0 35px; 74 | line-height: 1.25; 75 | text-align: left; 76 | font-size: 22px; 77 | font-weight: bold; 78 | padding-bottom: 5px; 79 | border-bottom: 1px solid #ccc; 80 | } 81 | 82 | h3, h4, h5, h6 { 83 | padding: 0; 84 | margin: 80px 0 30px; 85 | line-height: 1.25; 86 | text-align: left; 87 | font-size: 19px; 88 | font-weight: bold; 89 | } 90 | 91 | p { 92 | margin: 25px 0; 93 | padding: 0; 94 | overflow-wrap: break-word; 95 | } 96 | 97 | blockquote { 98 | margin: 40px 0px; 99 | padding: 0 20px; 100 | border-left: 3px solid #ddd; 101 | font-style: italic; 102 | } 103 | 104 | .blockquote-caption { 105 | margin: -10px 20px 40px; 106 | text-align: right; 107 | } 108 | 109 | abbr[title] { 110 | border-bottom: 1px dotted; 111 | cursor: help; 112 | } 113 | 114 | sup, sub { 115 | font-size: 75%; 116 | line-height: 0; 117 | position: relative; 118 | vertical-align: baseline; 119 | } 120 | 121 | sup { 122 | bottom: 1.5ex; 123 | padding: 0 0.5ex; 124 | } 125 | 126 | sub { 127 | top: .5ex; 128 | } 129 | 130 | /** 131 | * Code 132 | */ 133 | 134 | pre, code { 135 | font-size: 13px; 136 | font-family: Consolas, monospace; 137 | } 138 | 139 | code { 140 | margin: 0 2px; 141 | padding: 1px 5px; 142 | white-space: nowrap; 143 | border: 1px solid #e8e8e8; 144 | border-radius: 3px; 145 | background-color: #f8f8f8; 146 | } 147 | 148 | pre { 149 | margin: 40px 0; 150 | padding: 16px 20px; 151 | border-top: 1px dotted #bbb; 152 | border-bottom: 1px dotted #bbb; 153 | background-color: #f8f8f8; 154 | overflow: auto; 155 | line-height: 1.4; 156 | } 157 | 158 | /* Markdown renderers tend to wrap code blocks in
 ... 
blocks. */ 159 | pre code { 160 | margin: 0; 161 | padding: 0; 162 | white-space: pre; 163 | border: none; 164 | border-radius: 0; 165 | background-color: #f8f8f8; 166 | } 167 | 168 | h1 code { 169 | font-size: 26px; 170 | } 171 | 172 | dt pre { 173 | margin: 0 2px; 174 | padding: 1px 5px; 175 | border: 1px solid #e8e8e8; 176 | border-radius: 3px; 177 | background-color: #f8f8f8; 178 | } 179 | 180 | /** 181 | * Lists 182 | */ 183 | 184 | ul, ol { 185 | margin: 35px 0; 186 | padding: 0 0 0 20px; 187 | } 188 | 189 | ul ul, ol ol, ul ol, ol ul { 190 | margin: 10px 10px; 191 | } 192 | 193 | li { 194 | margin: 4px 0; 195 | padding: 0; 196 | } 197 | 198 | dl { 199 | margin: 40px 0; 200 | padding: 0; 201 | } 202 | 203 | dt { 204 | margin: 45px 0 25px; 205 | padding: 0; 206 | font-weight: bold; 207 | } 208 | 209 | dd { 210 | margin: 25px 0px; 211 | padding: 0 25px; 212 | border-left: 1px solid #ddd; 213 | } 214 | 215 | /** 216 | * Links 217 | */ 218 | 219 | a { 220 | color: black; 221 | text-decoration: none; 222 | padding-bottom: 2px; 223 | border-bottom: 1px solid; 224 | } 225 | 226 | sup a { 227 | border-bottom: none; 228 | } 229 | 230 | dt a { 231 | padding-bottom: 0; 232 | } 233 | 234 | 235 | /** 236 | * Miscellanea 237 | */ 238 | 239 | hr { 240 | display: block; 241 | height: 1px; 242 | border: 0; 243 | border-top: 1px solid; 244 | margin: 60px auto; 245 | padding: 0; 246 | max-width: 300px; 247 | } 248 | 249 | img { 250 | margin: 40px auto; 251 | display: block; 252 | } 253 | 254 | /** 255 | * ------------------------------------------------------------------------- 256 | * Layout 257 | * ------------------------------------------------------------------------- 258 | */ 259 | 260 | body { 261 | width: 960px; 262 | margin: 0 auto; 263 | padding: 40px 0; 264 | } 265 | 266 | .masthead { 267 | width: 360px; 268 | padding: 20px 50px; 269 | float: left; 270 | } 271 | 272 | .main { 273 | width: 600px; 274 | padding: 32px 50px 40px 50px; 275 | margin-left: 360px; 276 | border-left: 3px solid black; 277 | min-height: calc(100vh - 80px); 278 | } 279 | 280 | /** 281 | * ------------------------------------------------------------------------- 282 | * Masthead 283 | * ------------------------------------------------------------------------- 284 | */ 285 | 286 | .masthead h1 { 287 | margin-top: 0; 288 | margin-bottom: 34px; 289 | padding: 0; 290 | text-align: right; 291 | font-size: 46px; 292 | line-height: 58px; 293 | } 294 | 295 | .masthead h1 a { 296 | border-bottom: none; 297 | } 298 | 299 | .masthead .tagline { 300 | font-style: italic; 301 | text-align: right; 302 | } 303 | 304 | .masthead .version { 305 | font-style: italic; 306 | text-align: right; 307 | } 308 | 309 | .masthead .menu { 310 | margin-right: 20px; 311 | direction: rtl; 312 | } 313 | 314 | .masthead .menu a { 315 | direction: ltr; 316 | } 317 | 318 | .masthead .menu ul ul { 319 | list-style: none; 320 | margin-left: 10px; 321 | margin-right: 10px; 322 | } 323 | 324 | .masthead .menu li li::before { 325 | content: "•\00a\000a0\00a0" 326 | } 327 | 328 | #menu-check { 329 | display: none; 330 | } 331 | 332 | #menu-label { 333 | display: none; 334 | } 335 | 336 | /** 337 | * ------------------------------------------------------------------------- 338 | * Main 339 | * ------------------------------------------------------------------------- 340 | */ 341 | 342 | .main .title h1 { 343 | margin-top: 0; 344 | margin-bottom: 40px; 345 | } 346 | 347 | .main .title .subtitle { 348 | font-style: italic; 349 | text-align: center; 350 | width: 90%; 351 | margin-left: auto; 352 | margin-right: auto; 353 | } 354 | 355 | .main .title hr { 356 | margin: 50px auto 60px; 357 | } 358 | 359 | .main > :last-child { 360 | margin-bottom: 0; 361 | } 362 | 363 | /** 364 | * Info Boxes 365 | */ 366 | 367 | .infobox, .alertbox { 368 | margin: 40px 20px; 369 | border: 1px solid; 370 | padding: 0 25px; 371 | border-radius: 3px; 372 | border-color: #bbb; 373 | background-color: #f8f8f8; 374 | } 375 | 376 | .infobox.blue, .alertbox.info { 377 | border-color: #bac6d3; 378 | background-color: #e2eef9; 379 | } 380 | 381 | .infobox.yellow, .alertbox.warning { 382 | border-color: #dfd8c2; 383 | background-color: #fff9ea; 384 | } 385 | 386 | .infobox.red, .alertbox.error { 387 | border-color: #d2b2b2; 388 | background-color: #fcdede; 389 | } 390 | 391 | .infobox.green, .alertbox.success { 392 | border-color: #B2C2AB; 393 | background-color: #DEF2D6; 394 | } 395 | 396 | /** 397 | * Footnotes 398 | */ 399 | 400 | .footnote a::before { 401 | content: "["; 402 | } 403 | 404 | .footnote a::after { 405 | content: "]"; 406 | } 407 | 408 | .footnote a { 409 | border: none; 410 | } 411 | 412 | .footnotes dt { 413 | display: table-cell; 414 | width: 30px; 415 | text-align: right; 416 | font-weight: normal; 417 | } 418 | 419 | .footnotes dt a { 420 | padding: 0; 421 | border: none; 422 | } 423 | 424 | .footnotes dt a::before { 425 | content: "["; 426 | } 427 | 428 | .footnotes dt a::after { 429 | content: "]"; 430 | } 431 | 432 | .footnotes dd { 433 | display: table-cell; 434 | padding-left: 20px; 435 | padding-right: 0px; 436 | border: none 437 | } 438 | 439 | .footnotes dd :first-child { 440 | margin-top: 0; 441 | } 442 | 443 | .footnotes div:last-child dd :last-child { 444 | margin-bottom: 0; 445 | } 446 | 447 | .footnotes pre { 448 | margin: 30px 0; 449 | } 450 | 451 | /** 452 | * Tables 453 | */ 454 | 455 | table { 456 | font-size: 16px; 457 | border-collapse: collapse; 458 | border-spacing: 0; 459 | margin: 50px 0px; 460 | width: 100%; 461 | } 462 | 463 | thead, tfoot { 464 | background-color: #f8f8f8; 465 | } 466 | 467 | th, td { 468 | border: 1px solid #ccc; 469 | padding: 14px 20px; 470 | text-align: left; 471 | } 472 | 473 | /** 474 | * Utility Styles 475 | */ 476 | 477 | .small { 478 | font-size: 16px; 479 | } 480 | 481 | .left { 482 | text-align: left; 483 | } 484 | 485 | .right { 486 | text-align: right; 487 | } 488 | 489 | .center { 490 | text-align: center; 491 | } 492 | 493 | .justify { 494 | text-align: justify; 495 | } 496 | 497 | .bold { 498 | font-weight: bold; 499 | } 500 | 501 | .italic { 502 | font-style: italic; 503 | } 504 | 505 | .indent { 506 | padding-left: 30px; 507 | padding-right: 30px; 508 | } 509 | 510 | .unselectable { 511 | -webkit-user-select: none; 512 | -moz-user-select: none; 513 | -ms-user-select: none; 514 | user-select: none; 515 | } 516 | 517 | /** 518 | * Custom Classes 519 | */ 520 | 521 | body.extra-deflist-vspace dt { 522 | margin-top: 80px; 523 | } 524 | 525 | /** 526 | * ------------------------------------------------------------------------- 527 | * Media Queries 528 | * ------------------------------------------------------------------------- 529 | */ 530 | 531 | /* Tablet screens and smaller. */ 532 | 533 | @media screen and (max-width: 960px) { 534 | body { 535 | width: auto; 536 | max-width: 680px; 537 | padding-top: 60px; 538 | } 539 | 540 | .masthead { 541 | width: auto; 542 | float: none; 543 | padding: 60px 20px 60px 20px; 544 | text-align: center; 545 | margin-left: 40px; 546 | margin-right: 40px; 547 | border-top: 3px solid black; 548 | border-bottom: 3px solid black; 549 | } 550 | 551 | .main { 552 | width: auto; 553 | padding: 40px 40px; 554 | margin-left: 0; 555 | border-left: none; 556 | min-height: auto; 557 | } 558 | 559 | .masthead h1 { 560 | text-align: center; 561 | } 562 | 563 | .masthead .tagline { 564 | text-align: center; 565 | max-width: 450px; 566 | margin-left: auto; 567 | margin-right: auto; 568 | display: none; 569 | } 570 | 571 | .homepage .masthead .tagline { 572 | display: block; 573 | } 574 | 575 | .masthead .version { 576 | text-align: center; 577 | } 578 | 579 | .masthead .menu { 580 | direction: ltr; 581 | max-width: 300px; 582 | margin-left: auto; 583 | margin-right: auto; 584 | } 585 | 586 | .masthead .menu ul { 587 | text-align: left; 588 | margin: 0; 589 | padding: 0; 590 | } 591 | 592 | .masthead .menu ul ul { 593 | margin: 0; 594 | } 595 | 596 | .masthead .menu li { 597 | border-bottom: 1px solid; 598 | list-style: none; 599 | margin: 0; 600 | padding: 0; 601 | } 602 | 603 | .masthead .menu li:first-child { 604 | border-top: 1px solid; 605 | } 606 | 607 | .masthead .menu li li:last-child { 608 | border-bottom: none; 609 | } 610 | 611 | .masthead .menu a { 612 | display: block; 613 | padding: 15px 20px; 614 | border-bottom: none; 615 | } 616 | 617 | .masthead .menu li li a { 618 | padding-left: 30px; 619 | } 620 | 621 | .masthead .menu li li::before { 622 | content: none; 623 | } 624 | 625 | .masthead .menu li li a::before { 626 | content: "•\00a0\00a0\00a0"; 627 | } 628 | 629 | #menu-label { 630 | display: inline-block; 631 | padding: 0 20px; 632 | height: 50px; 633 | border: 1px solid #ddd; 634 | cursor: pointer; 635 | line-height: 50px; 636 | color: #333; 637 | font-size: 20px; 638 | margin-top: 10px; 639 | } 640 | 641 | #menu-label:hover, #menu-label:focus { 642 | border: 1px solid #888; 643 | } 644 | 645 | #menu-label .icon { 646 | padding-right: 8px; 647 | width: 30px; 648 | } 649 | 650 | #menu-check ~ label .close-icon { 651 | display: none; 652 | } 653 | 654 | #menu-check ~ label .open-icon { 655 | display: inline-block; 656 | } 657 | 658 | #menu-check:checked ~ label .close-icon { 659 | display: inline-block; 660 | } 661 | 662 | #menu-check:checked ~ label .open-icon { 663 | display: none; 664 | } 665 | 666 | #menu-check ~ ul { 667 | display: none; 668 | } 669 | 670 | #menu-check:checked ~ ul { 671 | display: block; 672 | margin-top: 50px; 673 | margin-bottom: 0; 674 | } 675 | } 676 | 677 | /* Landscape phone screens and smaller. */ 678 | 679 | @media screen and (max-width: 720px) { 680 | } 681 | 682 | /* Portrait phone screens. */ 683 | 684 | @media screen and (max-width: 480px) { 685 | body { 686 | font-size: 16px; 687 | padding-top: 40px; 688 | } 689 | 690 | h1 { 691 | font-size: 28px; 692 | } 693 | 694 | h2 { 695 | font-size: 18px; 696 | } 697 | 698 | h3, h4, h5, h6 { 699 | font-size: 16px; 700 | } 701 | 702 | h1 code { 703 | font-size: 24px; 704 | } 705 | 706 | pre, code { 707 | font-size: 12px; 708 | } 709 | 710 | .small { 711 | font-size: 15px; 712 | } 713 | 714 | .main .title .subtitle { 715 | width: auto; 716 | } 717 | } 718 | -------------------------------------------------------------------------------- /uv.lock: -------------------------------------------------------------------------------- 1 | version = 1 2 | requires-python = ">=3.12" 3 | 4 | [[package]] 5 | name = "argslib" 6 | version = "2.1.0" 7 | source = { registry = "https://pypi.org/simple" } 8 | sdist = { url = "https://files.pythonhosted.org/packages/03/7b/399c9d1d9f2d49e3e76da2507e190888d5a8814a0c3f7a596c64ca5440a8/argslib-2.1.0.tar.gz", hash = "sha256:a22d725aceda4e78123c91c6af448e8d60da435e9af2562211f8b13e4f656f9a", size = 3943 } 9 | wheels = [ 10 | { url = "https://files.pythonhosted.org/packages/3c/5c/3171d0a280030e78987ee8a30220771c2ccf0381d1035fd542a534c6ca04/argslib-2.1.0-py3-none-any.whl", hash = "sha256:3c1bdab36d06e71d5bb8319ee2854c81df54f7a614f12c12a5e470fbcf1cdbe0", size = 3972 }, 11 | ] 12 | 13 | [[package]] 14 | name = "ark" 15 | version = "7.3.0" 16 | source = { registry = "https://pypi.org/simple" } 17 | dependencies = [ 18 | { name = "argslib" }, 19 | { name = "colorama" }, 20 | { name = "ibis" }, 21 | { name = "jinja2" }, 22 | { name = "markdown" }, 23 | { name = "pygments" }, 24 | { name = "pyyaml" }, 25 | { name = "shortcodes" }, 26 | { name = "syntext" }, 27 | ] 28 | sdist = { url = "https://files.pythonhosted.org/packages/1f/d6/9625233cab75036cb45152bbd5022aba67e5813289cafb902fbe8a0016a5/ark-7.3.0.tar.gz", hash = "sha256:96df77597687ebef9960cc0b9bbf29df4527381aa59754a36a1761506474d8c8", size = 449677 } 29 | wheels = [ 30 | { url = "https://files.pythonhosted.org/packages/6b/20/11b5a9a6357609c29056e330be3850ecb06aab7f55966b8b3ead83b26848/ark-7.3.0-py3-none-any.whl", hash = "sha256:51c7423947cbfc642eb26a80da98ca793e761e3c5dc17ea6fc0cb25a69eff4f9", size = 461155 }, 31 | ] 32 | 33 | [[package]] 34 | name = "blog" 35 | version = "0.1.0" 36 | source = { editable = "." } 37 | dependencies = [ 38 | { name = "ark" }, 39 | ] 40 | 41 | [package.metadata] 42 | requires-dist = [{ name = "ark", specifier = ">=7.3.0" }] 43 | 44 | [[package]] 45 | name = "colorama" 46 | version = "0.4.6" 47 | source = { registry = "https://pypi.org/simple" } 48 | sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } 49 | wheels = [ 50 | { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, 51 | ] 52 | 53 | [[package]] 54 | name = "ibis" 55 | version = "3.3.0" 56 | source = { registry = "https://pypi.org/simple" } 57 | sdist = { url = "https://files.pythonhosted.org/packages/29/51/2706c69d679c9101a0e7333f4e5d3b3a7bc5eb0b52ed13685eaf88bd10d7/ibis-3.3.0.tar.gz", hash = "sha256:bb6d74a46c101aaeee0a98ee4da2bac78d6d5abd96a9a2954fb25c1ce6762ec2", size = 14477 } 58 | wheels = [ 59 | { url = "https://files.pythonhosted.org/packages/aa/92/81563612f829f24389b6aa7895a4841a77c57bf304bd9e4dc866039a7f23/ibis-3.3.0-py3-none-any.whl", hash = "sha256:9e93aa77c28dc797b03805c794964be341eab859552a016ae8a5deafb5160d75", size = 16028 }, 60 | ] 61 | 62 | [[package]] 63 | name = "jinja2" 64 | version = "3.1.4" 65 | source = { registry = "https://pypi.org/simple" } 66 | dependencies = [ 67 | { name = "markupsafe" }, 68 | ] 69 | sdist = { url = "https://files.pythonhosted.org/packages/ed/55/39036716d19cab0747a5020fc7e907f362fbf48c984b14e62127f7e68e5d/jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", size = 240245 } 70 | wheels = [ 71 | { url = "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d", size = 133271 }, 72 | ] 73 | 74 | [[package]] 75 | name = "markdown" 76 | version = "3.7" 77 | source = { registry = "https://pypi.org/simple" } 78 | sdist = { url = "https://files.pythonhosted.org/packages/54/28/3af612670f82f4c056911fbbbb42760255801b3068c48de792d354ff4472/markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2", size = 357086 } 79 | wheels = [ 80 | { url = "https://files.pythonhosted.org/packages/3f/08/83871f3c50fc983b88547c196d11cf8c3340e37c32d2e9d6152abe2c61f7/Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803", size = 106349 }, 81 | ] 82 | 83 | [[package]] 84 | name = "markupsafe" 85 | version = "2.1.5" 86 | source = { registry = "https://pypi.org/simple" } 87 | sdist = { url = "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", size = 19384 } 88 | wheels = [ 89 | { url = "https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", size = 18215 }, 90 | { url = "https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", size = 14069 }, 91 | { url = "https://files.pythonhosted.org/packages/51/b5/5d8ec796e2a08fc814a2c7d2584b55f889a55cf17dd1a90f2beb70744e5c/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", size = 29452 }, 92 | { url = "https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", size = 28462 }, 93 | { url = "https://files.pythonhosted.org/packages/2d/75/fd6cb2e68780f72d47e6671840ca517bda5ef663d30ada7616b0462ad1e3/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", size = 27869 }, 94 | { url = "https://files.pythonhosted.org/packages/b0/81/147c477391c2750e8fc7705829f7351cf1cd3be64406edcf900dc633feb2/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", size = 33906 }, 95 | { url = "https://files.pythonhosted.org/packages/8b/ff/9a52b71839d7a256b563e85d11050e307121000dcebc97df120176b3ad93/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", size = 32296 }, 96 | { url = "https://files.pythonhosted.org/packages/88/07/2dc76aa51b481eb96a4c3198894f38b480490e834479611a4053fbf08623/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", size = 33038 }, 97 | { url = "https://files.pythonhosted.org/packages/96/0c/620c1fb3661858c0e37eb3cbffd8c6f732a67cd97296f725789679801b31/MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", size = 16572 }, 98 | { url = "https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", size = 17127 }, 99 | ] 100 | 101 | [[package]] 102 | name = "pygments" 103 | version = "2.18.0" 104 | source = { registry = "https://pypi.org/simple" } 105 | sdist = { url = "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", size = 4891905 } 106 | wheels = [ 107 | { url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 }, 108 | ] 109 | 110 | [[package]] 111 | name = "pyyaml" 112 | version = "6.0.2" 113 | source = { registry = "https://pypi.org/simple" } 114 | sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } 115 | wheels = [ 116 | { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, 117 | { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, 118 | { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, 119 | { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, 120 | { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, 121 | { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, 122 | { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, 123 | { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, 124 | { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, 125 | { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, 126 | { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, 127 | { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, 128 | { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, 129 | { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, 130 | { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, 131 | { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, 132 | { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, 133 | { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, 134 | ] 135 | 136 | [[package]] 137 | name = "shortcodes" 138 | version = "5.4.0" 139 | source = { registry = "https://pypi.org/simple" } 140 | sdist = { url = "https://files.pythonhosted.org/packages/00/91/8331b970558348d9d346df4cdb0ab058e159cd0b1ba5245464df02a5502b/shortcodes-5.4.0.tar.gz", hash = "sha256:f3fe78edc71db62c0155c0cde593172dcd5b18bdb1b0c980ae79283a44bf5d29", size = 4148 } 141 | wheels = [ 142 | { url = "https://files.pythonhosted.org/packages/7c/34/9e8722e1d74ad62b48c32334e7669b9baa78b664a8702ef467cb283800b3/shortcodes-5.4.0-py3-none-any.whl", hash = "sha256:775903803f179fcf6a04530e4f8dba108cc9507956656c05527a84df2b545d1a", size = 4112 }, 143 | ] 144 | 145 | [[package]] 146 | name = "syntext" 147 | version = "3.1.2" 148 | source = { registry = "https://pypi.org/simple" } 149 | dependencies = [ 150 | { name = "pygments" }, 151 | ] 152 | sdist = { url = "https://files.pythonhosted.org/packages/6a/21/f10cf93609a7fa8faffb9a15458d17fd8618c57d83a8942997e8ed22c0a1/syntext-3.1.2.tar.gz", hash = "sha256:1b2e64ba321c9d68a9789576d737928643701e2be7f58704de7bc4058cd9d6a2", size = 14743 } 153 | wheels = [ 154 | { url = "https://files.pythonhosted.org/packages/ab/a6/7649971ae84144214f4cc9413e28fbe3ea505acb5e349ce5b9282464cc4a/syntext-3.1.2-py3-none-any.whl", hash = "sha256:fe4d825f3bbabab0678f3b81183b49d1c474a10867b829e020c4213706945d6b", size = 17133 }, 155 | ] 156 | --------------------------------------------------------------------------------