diff options
41 files changed, 1313 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cab8234 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +# Python-generated files +__pycache__/ +*.py[oc] +build/ +dist/ +wheels/ +*.egg-info + +# Virtual environments +.venv + +# outputs/artifacts +output/ diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..6324d40 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.14 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..964dd9d --- /dev/null +++ b/Makefile @@ -0,0 +1,89 @@ +PY?= +PELICAN?=pelican +PELICANOPTS= + +BASEDIR=$(CURDIR) +INPUTDIR=$(BASEDIR)/content +OUTPUTDIR=$(BASEDIR)/output +CONFFILE=$(BASEDIR)/pelicanconf.py +PUBLISHCONF=$(BASEDIR)/publishconf.py + +SSH_HOST=socnet-local +SSH_PORT=6926 +SSH_USER=daniel +SSH_TARGET_DIR=/var/www + + +DEBUG ?= 0 +ifeq ($(DEBUG), 1) + PELICANOPTS += -D +endif + +RELATIVE ?= 0 +ifeq ($(RELATIVE), 1) + PELICANOPTS += --relative-urls +endif + +SERVER ?= "0.0.0.0" + +PORT ?= 0 +ifneq ($(PORT), 0) + PELICANOPTS += -p $(PORT) +endif + + +help: + @echo 'Makefile for a pelican Web site ' + @echo ' ' + @echo 'Usage: ' + @echo ' make html (re)generate the web site ' + @echo ' make clean remove the generated files ' + @echo ' make regenerate regenerate files upon modification ' + @echo ' make publish generate using production settings ' + @echo ' make serve [PORT=8000] serve site at http://localhost:8000' + @echo ' make serve-global [SERVER=0.0.0.0] serve (as root) to $(SERVER):80 ' + @echo ' make devserver [PORT=8000] serve and regenerate together ' + @echo ' make devserver-global regenerate and serve on 0.0.0.0 ' + @echo ' make ssh_upload upload the web site via SSH ' + @echo ' make sftp_upload upload the web site via SFTP ' + @echo ' make rsync_upload upload the web site via rsync+ssh ' + @echo ' ' + @echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html ' + @echo 'Set the RELATIVE variable to 1 to enable relative urls ' + @echo ' ' + +html: + "$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +clean: + [ ! -d "$(OUTPUTDIR)" ] || rm -rf "$(OUTPUTDIR)" + +regenerate: + "$(PELICAN)" -r "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +serve: + "$(PELICAN)" -l "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +serve-global: + "$(PELICAN)" -l "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) -b $(SERVER) + +devserver: + "$(PELICAN)" -lr "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +devserver-global: + "$(PELICAN)" -lr "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) -b 0.0.0.0 + +publish: + "$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(PUBLISHCONF)" $(PELICANOPTS) + +ssh_upload: publish + scp -P $(SSH_PORT) -r "$(OUTPUTDIR)"/* "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)" + +sftp_upload: publish + printf 'put -r $(OUTPUTDIR)/*' | sftp -P $(SSH_PORT) $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) + +rsync_upload: publish + rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --include tags --cvs-exclude --delete "$(OUTPUTDIR)"/ "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)" + + +.PHONY: html help clean regenerate serve serve-global devserver devserver-global publish ssh_upload sftp_upload rsync_upload diff --git a/content/or-paradox.rst b/content/or-paradox.rst new file mode 100644 index 0000000..91e0489 --- /dev/null +++ b/content/or-paradox.rst @@ -0,0 +1,90 @@ +A paradox of logical implication +================================ + +:date: 2026-08-25 +:modified: 2026-08-25 +:lang: en +:slug: implication-paradox +:tags: logic, paradox +:category: Logic + +I remember an interaction I had with a friend's dad well into my undergraduate degree. One day when I was over he asked me what courses I was taking. He made a particular sound of intrigue when I mentioned *symbolic logic*. I recall what almost sounded like concern in his voice when he asked what it could possibly be about. I tried to explain proof systems, different kinds of logics, and how symbolic transformations could be used as proxies for deductive steps kind of like algebra. In the end I don't think I did a great job explaining. Instead, I got the impression that he walked away thinking that there were college professors making a career out of over-complicating what amounts to just reasoning good. + +The term "logic" is right up there with "common sense" as concepts people love to complain about. Well, at least the people I grew up around anyway. If I had a nickle for every time I heard a parent or role model say something like "common sense isn't so common anymore" or "this is obviously the logical thing to believe", I'd probably be retired by now. To be fair, it's not hard to see why people have such a simplistic view of the topic. Logos, after all, is taught right next to pathos and ethos as a way of convincing people you're right. It's the one where you cite papers and doctors and scientists and stuff (or wait maybe that's ethos). Heck, even Kant, the preeminent thinker of his time, famously noted in his *Critique of Pure Reason* that logic may well be considered complete since the work of Aristotle two millennia prior. + +Ironically, in the century after Kant a dramatic revolution in the study of logic would take place. It's an exciting time in history, but I'm not really going to talk about that here. Instead, I want share a particularly evocative example of why we might even need different logics in the first place. This example takes the form of perhaps my favorite logical paradox. First though, some notation. The symbol :math:`\land` corresponds to the word "and" as in "it is raining *and* I have an umbrella", the symbol :math:`\lor` corresponds to "or" in the same way, and :math:`\to` corresponds to implication or "if/then" as in "*if* it is raining, *then* it is cloudy". Now the for the paradox: + +Suppose we let :math:`P` denote the statement "I am in Paris", :math:`B` denote "I am in Berlin", :math:`F` denote "I am in France", and :math:`G` denote "I am in Germany". Barring some future geopolitical conflict, it shouldn't be particularly controversial to assert that the following sentence is true. + +.. math:: + (P \to F) \land (B \to G) + +In natural language this reads "if I am in Paris, then I'm in France and if I am in Berlin then I'm in Germany". So far so good, but asserting things is barely interesting on its own. Logic also enables us to reason from assertions. The most well known system of logic is often called "classical" logic since it is essentially just a modern re-telling of Aristotle's syllogistic reasoning from antiquity. Surprisingly, from our relatively straightforward assertion above, it's possible to conclude, using the rules of classical logic, that the following sentence must be true as a consequence. + +.. math:: + (P \to G) \lor (B \to F) + +Yep, you're reading that right, either "being in Paris implies one is in Germany" or "being in Berlin implies one is in France". I'll skip the discussion here, but I've included a natural deduction style proof at the bottom of this post [#]_. If you've seen these before, it's a relatively simple exercise to verify. Suffice it to say, this deduction is classically valid. + +But that can't be right, what gives here? Was Aristotle wrong? Is there some fundamental flaw in logic? Well fortunately no, the trick here is much more mundane, but not at all obvious. In fact, I've recounted this paradox to several of my math friends including some professors and I don't think a single one has ever figured out what's wrong on their own. Heck, I doubt I would have had I not first heard it in the context of so-called "relevance" logics, but I digress. + +The problem isn't with the deduction, it's with the interpretation. See classical logic is specifically suitable for math. The implication operation in classical logic has a very particular meaning based around a simple rule: The statement :math:`A\to B` is true precisely so long as :math:`B` isn't false whenever :math:`A` is true. To understand how this works, consider the utterance "if :math:`p` is a quadratic polynomial, then :math:`p` has 2 roots" [#]_. This statement clearly ought to be true: whenever :math:`p` is a quadratic polynomial, it will always (by the fundamental theorem of algebra) have 2 roots. + +The strange behavior pops up when the antecedent ":math:`p` is a quadratic polynomial" is false. In this case, as far as math is concerned, we don't care any more. Our sentence doesn't say anything about cubic polynomials or exponential functions, or integers substituted for the variable :math:`p`, we only care that :math:`p` has 2 roots whenever it's a quadratic polynomial. That's the full scope of the statement and we don't want the sentence to become false just because somebody plugged a non-quadratic function into :math:`p`. Because we only care that about what happens in the case where the antecedent is true, for the sake of mathematical deduction, we let the sentence default to true if the antecedent isn't satisfied. + +For purposes of mathematics, this approach to assigning meaning to "if/then" works perfectly well (I suppose unless your a staunch constructivist), but it doesn't really mesh nicely with all the different ways of understanding what "if/then" means. In English, we often use "if/then" to suggest a *counterfactual*, a consequence of some hypothetical state of affairs where the antecedent describes some alternative way things might be. That the English language does little to distinguish these usages is the crux of the paradox. + +Going back to the example: being in Paris precludes being in Berlin and vice-versa. Consequently, under the classical interpretation of "implies", one of the implication statements is vacuously true. If I happen to be in Paris, then I'm certainly not in Berlin so the statement "if I'm in Berlin, then I'm in France" is true by default, at least as far as classical logic is concerned. The implication simply doesn't apply to me since I'm not in Berlin. + +This is, of course, not how you likely first understood the formal statement :math:`(P \to G) \lor (B \to F)` and that's entirely my point. The typical interpretation of something like "If I'm in Paris then I'm in Germany" is as a counterfactual which should be false by nature of geography. Classical logic is not equipped to reason about hypothetical assumptions in this way and that's where other logics become useful. Different logics can capture different ways of assigning meaning to implication or can even introduce entirely different modes of reasoning. Temporal logics, for instance, have symbolism for describing truths that can change over time, while modal logics try to formalize the notion of "possibly true" or "conceivably true". There are relevance logics which introduce rules to insist that antecedents and consequents actually be related, and even quantum logics which try to formalize reasoning about how underlying quantum systems manifest into physical observations. The landscape of modern logic is actually quite diverse, and a lot of modern logical research focuses on classify these different systems into a family tree of sorts. + +Anyway, all this to say: if you ever run into someone insisting that some belief they hold is logical, try asking them which logic they're using. + +---- + + +.. [#] Here's the natural deduction proof of :math:`(P \to G) \lor (B \to F)` from :math:`(P \to F) \lor (B \to G)`: + +.. list-table:: + :header-rows: 1 + :align: center + :widths: 4 10 30 + + * - Line # + - Formula + - Justification + * - 1 + - :math:`(P \to F) \land (B \to G)` + - Premise + * - 2 + - :math:`\lnot\big((P \to G) \lor (B \to F)\big)` + - Assumption + * - 3 + - :math:`\lnot(P \to G) \land \lnot(B \to F)` + - De-Morgan; 2 + * - 4 + - :math:`\lnot(P \to G)` + - :math:`\land`-elim; 3 + * - 5 + - :math:`P` + - :math:`(\lnot \to)`-elim; 4 + * - 6 + - :math:`P \to F` + - :math:`\land`-elim; 1 + * - 7 + - :math:`F` + - :math:`\to`-elim; 5, 6 + * - 8 + - :math:`\lnot(B \to F)` + - :math:`\land`-elim; 3 + * - 9 + - :math:`\lnot F` + - :math:`(\lnot \to)`-elim; 8 + * - 10 + - :math:`F \land \lnot F` + - :math:`\land`-intro; 7, 9 + * - 11 + - :math:`(P \to G) \lor (B \to F)` + - RAA+DNE; 2, 10 + +.. [#] Yes, yes, I know my use of the term :math:`p` here technically brings us out of the realm of classical logic and into something more like predicate logic. diff --git a/content/pages/about.rst b/content/pages/about.rst new file mode 100644 index 0000000..8c1bc47 --- /dev/null +++ b/content/pages/about.rst @@ -0,0 +1,13 @@ +About Me +######## + +:date: 2026-08-19 +:modified: 2026-08-19 +:lang: en +:slug: about-me + +My name is Daniel Hader. + +I've been in love with computers since I was a kid. My grandmother loves to tell me that when I was just a couple years old, I would insist on sitting on her lap at the computer, moving the mouse around with hands that could barely reach the buttons. My parents generally encouraged me, buying me a desktop computer when I was around 6 or 7 along with a fantastic piece of software called *The Games Factory 2* just a little while later. TGF2 is a drag-and-drop game engine that acted as my introduction to the logic and control flow of programming. + +Throughout my teens I started to teach myself Java and C++. I remember watching a live stream where Notch, the Minecraft guy, made a small dungeon crawler in Java for a game jam. Through a sequence of arcane invokations of trigonometic functions and bitwise functionns, he somehow transformed an array of pixel data into 3D world. It was black magic to me. I remember actually printing his code out paper and going through with a pen tracing through it line by line. I was obsessed. Those are some of my most cherished memories and I emerged from that period of my life an enriched person having learned some of the dark arts for myself. diff --git a/content/test-page.md b/content/test-page.md new file mode 100644 index 0000000..761478c --- /dev/null +++ b/content/test-page.md @@ -0,0 +1,15 @@ +Title: Test Article +Date: 2026-08-14 +Category: Test + +This is a test page. I want to see how Pelican generates the page. + +What kinds of things does Pelican put around the sides of the website. + +As far as I know I have pretty fine grained control if I dig around in the CSS a bit. + +# Title (it is markdown after all) + +Does latex work? + +$\frac{1}{2} \Sum_{n=0}^\infty \frac{1}{n!}$
\ No newline at end of file diff --git a/pelicanconf.py b/pelicanconf.py new file mode 100644 index 0000000..df49286 --- /dev/null +++ b/pelicanconf.py @@ -0,0 +1,30 @@ +AUTHOR = 'Daniel Hader' +SITENAME = 'DanielHader.net' +SITESUBTITLE = "Where the dandelions once bloomed" +SITEURL = "" + +PATH = "content" + +TIMEZONE = 'America/Chicago' + +DEFAULT_LANG = 'en' + +# Theme and style settings +THEME = "themes/simple" + +# Feed generation is usually not desired when developing +FEED_ALL_ATOM = None +CATEGORY_FEED_ATOM = None +TRANSLATION_FEED_ATOM = None +AUTHOR_FEED_ATOM = None +AUTHOR_FEED_RSS = None + +# Blogroll +LINKS = [ + ("Aprilwalker.io", "http://aprilwalker.io/"), +] + +DEFAULT_PAGINATION = 20 + +# Uncomment following line if you want document-relative URLs when developing +# RELATIVE_URLS = True diff --git a/publishconf.py b/publishconf.py new file mode 100644 index 0000000..6f1308b --- /dev/null +++ b/publishconf.py @@ -0,0 +1,22 @@ +# This file is only used if you use `make publish` or +# explicitly specify it as your config file. + +import os +import sys + +sys.path.append(os.curdir) +from pelicanconf import * + +# If your site is available via HTTPS, make sure SITEURL begins with https:// +SITEURL = "" +RELATIVE_URLS = False + +FEED_ALL_ATOM = "feeds/all.atom.xml" +CATEGORY_FEED_ATOM = "feeds/{slug}.atom.xml" + +DELETE_OUTPUT_DIRECTORY = True + +# Following items are often useful when publishing + +# DISQUS_SITENAME = "" +# GOOGLE_ANALYTICS = "" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..c92d5a9 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,9 @@ +[project] +name = "website" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.14" +dependencies = [ + "pelican[markdown]>=4.12.0", +] diff --git a/tasks.py b/tasks.py new file mode 100644 index 0000000..525e9e0 --- /dev/null +++ b/tasks.py @@ -0,0 +1,150 @@ +import os +import shlex +import shutil +import sys + +from invoke import task +from invoke.main import program +from pelican import main as pelican_main +from pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer +from pelican.settings import DEFAULT_CONFIG, get_settings_from_file + +OPEN_BROWSER_ON_SERVE = True +SETTINGS_FILE_BASE = "pelicanconf.py" +SETTINGS = {} +SETTINGS.update(DEFAULT_CONFIG) +LOCAL_SETTINGS = get_settings_from_file(SETTINGS_FILE_BASE) +SETTINGS.update(LOCAL_SETTINGS) + +CONFIG = { + "settings_base": SETTINGS_FILE_BASE, + "settings_publish": "publishconf.py", + # Output path. Can be absolute or relative to tasks.py. Default: 'output' + "deploy_path": SETTINGS["OUTPUT_PATH"], + # Remote server configuration + "ssh_user": "daniel", + "ssh_host": "socnet-local", + "ssh_port": "6926", + "ssh_path": "/var/www", + # Host and port for `serve` + "host": "localhost", + "port": 8000, +} + + +@task +def clean(c): + """Remove generated files""" + if os.path.isdir(CONFIG["deploy_path"]): + shutil.rmtree(CONFIG["deploy_path"]) + os.makedirs(CONFIG["deploy_path"]) + + +@task +def build(c): + """Build local version of site""" + pelican_run("-s {settings_base}".format(**CONFIG)) + + +@task +def rebuild(c): + """`build` with the delete switch""" + pelican_run("-d -s {settings_base}".format(**CONFIG)) + + +@task +def regenerate(c): + """Automatically regenerate site upon file modification""" + pelican_run("-r -s {settings_base}".format(**CONFIG)) + + +@task +def serve(c): + """Serve site at http://$HOST:$PORT/ (default is localhost:8000)""" + + class AddressReuseTCPServer(RootedHTTPServer): + allow_reuse_address = True + + server = AddressReuseTCPServer( + CONFIG["deploy_path"], + (CONFIG["host"], CONFIG["port"]), + ComplexHTTPRequestHandler, + ) + + if OPEN_BROWSER_ON_SERVE: + # Open site in default browser + import webbrowser + + webbrowser.open("http://{host}:{port}".format(**CONFIG)) + + sys.stderr.write("Serving at {host}:{port} ...\n".format(**CONFIG)) + server.serve_forever() + + +@task +def reserve(c): + """`build`, then `serve`""" + build(c) + serve(c) + + +@task +def preview(c): + """Build production version of site""" + pelican_run("-s {settings_publish}".format(**CONFIG)) + +@task +def livereload(c): + """Automatically reload browser tab upon file modification.""" + from livereload import Server + + def cached_build(): + cmd = "-s {settings_base} -e CACHE_CONTENT=true LOAD_CONTENT_CACHE=true" + pelican_run(cmd.format(**CONFIG)) + + cached_build() + server = Server() + theme_path = SETTINGS["THEME"] + watched_globs = [ + CONFIG["settings_base"], + f"{theme_path}/templates/**/*.html", + ] + + content_file_extensions = [".md", ".rst"] + for extension in content_file_extensions: + content_glob = "{}/**/*{}".format(SETTINGS["PATH"], extension) + watched_globs.append(content_glob) + + static_file_extensions = [".css", ".js"] + for extension in static_file_extensions: + static_file_glob = f"{theme_path}/static/**/*{extension}" + watched_globs.append(static_file_glob) + + for glob in watched_globs: + server.watch(glob, cached_build) + + if OPEN_BROWSER_ON_SERVE: + # Open site in default browser + import webbrowser + + webbrowser.open("http://{host}:{port}".format(**CONFIG)) + + server.serve(host=CONFIG["host"], port=CONFIG["port"], root=CONFIG["deploy_path"]) + + +@task +def publish(c): + """Publish to production via rsync""" + pelican_run("-s {settings_publish}".format(**CONFIG)) + c.run( + 'rsync --delete --exclude ".DS_Store" -pthrvz -c ' + '-e "ssh -p {ssh_port}" ' + "{} {ssh_user}@{ssh_host}:{ssh_path}".format( + CONFIG["deploy_path"].rstrip("/") + "/", **CONFIG + ) + ) + + +def pelican_run(cmd): + cmd += " " + program.core.remainder # allows to pass-through args to pelican + pelican_main(shlex.split(cmd)) diff --git a/themes/simple/static/css/main.css b/themes/simple/static/css/main.css new file mode 100644 index 0000000..4c76d55 --- /dev/null +++ b/themes/simple/static/css/main.css @@ -0,0 +1,171 @@ +@import url("reset.css"); + +@font-face { + font-family: Gocake; + src: url("../fonts/gocake/Gocake.ttf"); +} + +@font-face { + font-family: Canela; + src: url("../fonts/canela/canela-Regular-TRIAL.otf"); +} + +@font-face { + font-family: Babel-Sans; + src: url("../fonts/babel_sans/BabelSans.ttf"); +} + +@font-face { + font-family: Aerial; + src: url("../fonts/aerial_2/Aerial_Demo.ttf"); +} + +body { + width: 100vw; + height: 100vh; + background-image: url("../images/background.jpg"); + background-repeat: no-repeat; + background-size: cover; + background-position: center; + background-attachment: fixed; + + font-family: "Aerial"; + line-height: 1.2; + + color: #aabbaf; +} + +a { + color: #99bb88; +} + +h1 { + font-size: 2em; +} + +#container { + width: 100%; + max-width: 980px; + margin: 20px auto 20px auto; +} + +#header { + position: relative; + background-color: rgba(20, 20, 20, 1.0); + background: + linear-gradient( + 180deg, + rgba(72, 72, 72, 0.9) 0%, + rgba(20, 20, 20, 0.95) 100% + ); + border-top: 1px solid #9e9e9e; + border-left: 1px solid #9e9e9e; + border-right: 1px solid #9e9e9e; + border-radius: 30px 30px 0 0; + +} + +#header hgroup { + padding: 20px 20px 10px 20px; +} + +#header::after { + content: ""; + position: absolute; + top: 4%; + left: 0.75em; + width: calc(100% - 1.5em); + height: 40%; + background: linear-gradient( + to bottom, + rgba(255, 255, 255, 0.3), + rgba(255, 255, 255, 0.05) + ); + border-radius: 30px 30px 30px 30px; +} + +#content { + display: flex; +} + +#navs { + display: flex; + flex-direction: column; + + width: 150px; + height: 100%; + padding: 10px 8px 10px 8px; + + border-top: 1px solid #666666; + border-left: 1px solid #666666; + border-right: 1px solid #666666; + background: rgba(30, 30, 30, 0.4); + /*background: linear-gradient(to bottom,rgba(80,80,80,.2),rgba(39,39,39,.1));*/ +} + +.nav { + border-radius: 8px 8px 4px 4px; + box-shadow: 2px 2px 3px rgba(0,0,0,.8); + margin-bottom: 12px; +} + +.nav nav { + display: flex; + flex-direction: column; + + background: rgba(0, 0, 0, .5); + + padding: 4px; + border-radius: 0 0 4px 4px; + border-left: 1px solid #666666; + border-right: 1px solid #666666; + border-bottom: 1px solid #666666; +} + +.nav header { + position: relative; + background-color: rgba(20, 20, 20, 1.0); + background: + linear-gradient( + 180deg, + rgba(72, 72, 72, 0.9) 0%, + rgba(20, 20, 20, 0.95) 100% + ); + + border-top: 1px solid #666666; + border-left: 1px solid #666666; + border-right: 1px solid #666666; + border-radius: 8px 8px 0 0; + + padding: 4px 0 4px 0; + font-weight: 600; + text-align: center; +} + +.nav header::after { + content: ""; + position: absolute; + top: 4%; + left: 2.5%; + width: 95%; + height: 40%; + background: linear-gradient( + to bottom, + rgba(255, 255, 255, 0.3), + rgba(255, 255, 255, 0.05) + ); + border-radius: 30px 30px 30px 30px; +} + +.nav-item { + border: 1px solid #0f0f0f; + border-radius: 5px; + + display: flex; + align-items: center; + margin: auto auto 1px; + width: 93%; + + position: relative; +} + diff --git a/themes/simple/static/css/reset.css b/themes/simple/static/css/reset.css new file mode 100644 index 0000000..10b3fde --- /dev/null +++ b/themes/simple/static/css/reset.css @@ -0,0 +1,52 @@ +/* + Name: Reset Stylesheet + Description: Resets browser's default CSS + Author: Eric Meyer + Author URI: https://meyerweb.com/eric/tools/css/reset/ +*/ + +/* v1.0 | 20080212 */ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + background: transparent; + border: 0; + font-size: 100%; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; +} + +body {line-height: 1;} + +ol, ul {list-style: none;} + +blockquote, q {quotes: none;} + +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +/* remember to define focus styles! */ +:focus { + outline: 0; +} + +/* remember to highlight inserts somehow! */ +ins {text-decoration: none;} +del {text-decoration: line-through;} + +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/themes/simple/static/fonts/aerial_2/Aerial_Demo.ttf b/themes/simple/static/fonts/aerial_2/Aerial_Demo.ttf Binary files differnew file mode 100644 index 0000000..c05902b --- /dev/null +++ b/themes/simple/static/fonts/aerial_2/Aerial_Demo.ttf diff --git a/themes/simple/static/fonts/babel_sans/BabelSans-Bold.ttf b/themes/simple/static/fonts/babel_sans/BabelSans-Bold.ttf Binary files differnew file mode 100644 index 0000000..b424125 --- /dev/null +++ b/themes/simple/static/fonts/babel_sans/BabelSans-Bold.ttf diff --git a/themes/simple/static/fonts/babel_sans/BabelSans-BoldOblique.ttf b/themes/simple/static/fonts/babel_sans/BabelSans-BoldOblique.ttf Binary files differnew file mode 100644 index 0000000..4eb381e --- /dev/null +++ b/themes/simple/static/fonts/babel_sans/BabelSans-BoldOblique.ttf diff --git a/themes/simple/static/fonts/babel_sans/BabelSans-Oblique.ttf b/themes/simple/static/fonts/babel_sans/BabelSans-Oblique.ttf Binary files differnew file mode 100644 index 0000000..1e373cf --- /dev/null +++ b/themes/simple/static/fonts/babel_sans/BabelSans-Oblique.ttf diff --git a/themes/simple/static/fonts/babel_sans/BabelSans.ttf b/themes/simple/static/fonts/babel_sans/BabelSans.ttf Binary files differnew file mode 100644 index 0000000..e0f41e7 --- /dev/null +++ b/themes/simple/static/fonts/babel_sans/BabelSans.ttf diff --git a/themes/simple/static/fonts/canela/canela-Bold-TRIAL.otf b/themes/simple/static/fonts/canela/canela-Bold-TRIAL.otf Binary files differnew file mode 100644 index 0000000..5388781 --- /dev/null +++ b/themes/simple/static/fonts/canela/canela-Bold-TRIAL.otf diff --git a/themes/simple/static/fonts/canela/canela-Light-TRIAL.otf b/themes/simple/static/fonts/canela/canela-Light-TRIAL.otf Binary files differnew file mode 100644 index 0000000..0d63838 --- /dev/null +++ b/themes/simple/static/fonts/canela/canela-Light-TRIAL.otf diff --git a/themes/simple/static/fonts/canela/canela-Regular-TRIAL.otf b/themes/simple/static/fonts/canela/canela-Regular-TRIAL.otf Binary files differnew file mode 100644 index 0000000..ca06acf --- /dev/null +++ b/themes/simple/static/fonts/canela/canela-Regular-TRIAL.otf diff --git a/themes/simple/static/fonts/gocake/Gocake.jpg b/themes/simple/static/fonts/gocake/Gocake.jpg Binary files differnew file mode 100644 index 0000000..4ddc512 --- /dev/null +++ b/themes/simple/static/fonts/gocake/Gocake.jpg diff --git a/themes/simple/static/fonts/gocake/Gocake.otf b/themes/simple/static/fonts/gocake/Gocake.otf Binary files differnew file mode 100644 index 0000000..561913e --- /dev/null +++ b/themes/simple/static/fonts/gocake/Gocake.otf diff --git a/themes/simple/static/fonts/gocake/Gocake.ttf b/themes/simple/static/fonts/gocake/Gocake.ttf Binary files differnew file mode 100644 index 0000000..50b1665 --- /dev/null +++ b/themes/simple/static/fonts/gocake/Gocake.ttf diff --git a/themes/simple/static/fonts/gocake/More Info.txt b/themes/simple/static/fonts/gocake/More Info.txt new file mode 100644 index 0000000..4e42afe --- /dev/null +++ b/themes/simple/static/fonts/gocake/More Info.txt @@ -0,0 +1,24 @@ +First of All,
+
+Thank you for download my product.
+This product 100% free for personal use & commercial use
+
+File include :
+
+1. Gocake.ttf
+2. Gocake.otf
+
+More Info :
+
+For Donation:
+paypal.me/jalkhurasan
+
+My OnlineShop:
+https://www.creativefabrica.com/ref/53/
+
+My Portofolio:
+https://www.behance.net/khurasan
+
+My web:
+www.khurasanstudio.com
\ No newline at end of file diff --git a/themes/simple/static/fonts/gocake/Read Me.pdf b/themes/simple/static/fonts/gocake/Read Me.pdf Binary files differnew file mode 100644 index 0000000..4e5ae0f --- /dev/null +++ b/themes/simple/static/fonts/gocake/Read Me.pdf diff --git a/themes/simple/static/images/background.jpg b/themes/simple/static/images/background.jpg Binary files differnew file mode 100755 index 0000000..4e435d7 --- /dev/null +++ b/themes/simple/static/images/background.jpg diff --git a/themes/simple/templates/archives.html b/themes/simple/templates/archives.html new file mode 100644 index 0000000..a61bf3c --- /dev/null +++ b/themes/simple/templates/archives.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME|striptags }} - Archives{% endblock %} + +{% block content %} + <h2>Archives for {{ SITENAME }}</h2> + + <dl> + {% for article in dates %} + <dt>{{ article.locale_date }}</dt> + <dd><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dd> + {% endfor %} + </dl> +{% endblock %} diff --git a/themes/simple/templates/article.html b/themes/simple/templates/article.html new file mode 100644 index 0000000..a01de10 --- /dev/null +++ b/themes/simple/templates/article.html @@ -0,0 +1,65 @@ +{% extends "base.html" %} +{% block html_lang %}{{ article.lang }}{% endblock %} + +{% block title %}{{ SITENAME|striptags }} - {{ article.title|striptags }}{% endblock %} + +{% block head %} + {{ super() }} + + {% import 'translations.html' as translations with context %} + {% if translations.entry_hreflang(article) %} + {{ translations.entry_hreflang(article) }} + {% endif %} + + {% if article.description %} + <meta name="description" content="{{article.description}}" /> + {% endif %} + + {% for tag in article.tags %} + <meta name="tags" content="{{tag}}" /> + {% endfor %} + +{% endblock %} + +{% block content %} + <article> + <header> + <h2> + <a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark" + title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a></h2> + {% import 'translations.html' as translations with context %} + {{ translations.translations_for(article) }} + </header> + {{ article.content }} + <footer> + <p>Published: <time datetime="{{ article.date.isoformat() }}"> + {{ article.locale_date }} + </time></p> + {% if article.modified %} + <p>Last updated: <time datetime="{{ article.modified.isoformat() }}"> + {{ article.locale_modified }} + </time></p> + {% endif %} + {% if article.authors %} + <address> + By {% for author in article.authors %} + <a href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a> + {% endfor %} + </address> + {% endif %} + {% if article.category %} + <p> + Category: <a href="{{ SITEURL }}/{{ article.category.url }}">{{ article.category }}</a> + </p> + {% endif %} + {% if article.tags %} + <p> + Tags: + {% for tag in article.tags %} + <a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a> + {% endfor %} + </p> + {% endif %} + </footer> + </article> +{% endblock %} diff --git a/themes/simple/templates/author.html b/themes/simple/templates/author.html new file mode 100644 index 0000000..06f871d --- /dev/null +++ b/themes/simple/templates/author.html @@ -0,0 +1,7 @@ +{% extends "index.html" %} + +{% block title %}{{ SITENAME|striptags }} - Articles by {{ author }}{% endblock %} + +{% block content_title %} + <h2>Articles by {{ author }}</h2> +{% endblock %} diff --git a/themes/simple/templates/authors.html b/themes/simple/templates/authors.html new file mode 100644 index 0000000..97a7457 --- /dev/null +++ b/themes/simple/templates/authors.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME|striptags }} - Authors{% endblock %} + +{% block content %} + <h2>Authors on {{ SITENAME }}</h2> + <ul> + {% for author, articles in authors|sort %} + <li><a href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a> ({{ articles|count }})</li> + {% endfor %} + </ul> +{% endblock %} diff --git a/themes/simple/templates/base.html b/themes/simple/templates/base.html new file mode 100644 index 0000000..f34054f --- /dev/null +++ b/themes/simple/templates/base.html @@ -0,0 +1,108 @@ +<!DOCTYPE html> +<html lang="{% block html_lang %}{{ DEFAULT_LANG }}{% endblock html_lang %}"> + <head> + {% block head %} + <title>{% block title %}{{ SITENAME|striptags }}{% endblock title %}</title> + <meta charset="utf-8" /> + <meta name="generator" content="Pelican" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + {% if SITESUBTITLE %} + <meta name="description" content="{{ SITESUBTITLE }}" /> + {% endif %} + {% if CSS_FILE %} + <link rel="stylesheet" href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/css/{{ CSS_FILE }}" /> + {% endif %} + {% if STYLESHEET_URL %} + <link rel="stylesheet" type="text/css" href="{{ STYLESHEET_URL }}" /> + {% endif %} + {% if FEED_ALL_ATOM %} + <link href="{{ FEED_DOMAIN }}/{% if FEED_ALL_ATOM_URL %}{{ FEED_ALL_ATOM_URL }}{% else %}{{ FEED_ALL_ATOM }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ SITENAME|striptags }} Full Atom Feed" /> + {% endif %} + {% if FEED_ALL_RSS %} + <link href="{{ FEED_DOMAIN }}/{% if FEED_ALL_RSS_URL %}{{ FEED_ALL_RSS_URL }}{% else %}{{ FEED_ALL_RSS }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME|striptags }} Full RSS Feed" /> + {% endif %} + {% if FEED_ATOM %} + <link href="{{ FEED_DOMAIN }}/{%if FEED_ATOM_URL %}{{ FEED_ATOM_URL }}{% else %}{{ FEED_ATOM }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ SITENAME|striptags }} Atom Feed" /> + {% endif %} + {% if FEED_RSS %} + <link href="{{ FEED_DOMAIN }}/{% if FEED_RSS_URL %}{{ FEED_RSS_URL }}{% else %}{{ FEED_RSS }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME|striptags }} RSS Feed" /> + {% endif %} + {% if CATEGORY_FEED_ATOM and category %} + <link href="{{ FEED_DOMAIN }}/{% if CATEGORY_FEED_ATOM_URL %}{{ CATEGORY_FEED_ATOM_URL.format(slug=category.slug) }}{% else %}{{ CATEGORY_FEED_ATOM.format(slug=category.slug) }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ category.slug.title() }} Category Atom Feed" /> + {% endif %} + {% if CATEGORY_FEED_RSS and category %} + <link href="{{ FEED_DOMAIN }}/{% if CATEGORY_FEED_RSS_URL %}{{ CATEGORY_FEED_RSS_URL.format(slug=category.slug) }}{% else %}{{ CATEGORY_FEED_RSS.format(slug=category.slug) }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ category.slug.title() }} Category RSS Feed" /> + {% endif %} + {% if TAG_FEED_ATOM and tag %} + <link href="{{ FEED_DOMAIN }}/{% if TAG_FEED_ATOM_URL %}{{ TAG_FEED_ATOM_URL.format(slug=tag.slug) }}{% else %}{{ TAG_FEED_ATOM.format(slug=tag.slug) }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ tag.slug.title() }} Tag Atom Feed" /> + {% endif %} + {% if TAG_FEED_RSS and tag %} + <link href="{{ FEED_DOMAIN }}/{% if TAG_FEED_RSS_URL %}{{ TAG_FEED_RSS_URL.format(slug=tag.slug) }}{% else %}{{ TAG_FEED_RSS.format(slug=tag.slug) }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ tag.slug.title() }} Tag RSS Feed" /> + {% endif %} + {% endblock head %} + </head> + + <body> + {% block body %} + <div id="container"> + <header id="header"> + {% block header %} + <hgroup> + <h1> + <a href="{{ SITEURL }}/">{{ SITENAME }}</a> + </h1> + {% if SITESUBTITLE %} + <p>{{ SITESUBTITLE }}</p>{% endif %}</hgroup> + {% endblock header %} + </header> + <div id="content"> + <aside> + <div id="navs"> + <div class="nav"> + <header> + <span class="nav-title">Website</span> + </header> + <nav aria-label="Navigation: Website"> + {% for title, link in MENUITEMS %} + <a class="nav-item" href="{{ link }}">{{ title }}</a></li> + {% endfor %} + {% if DISPLAY_PAGES_ON_MENU %} + {% for p in pages %} + <a class="nav-item" href="{{ SITEURL }}/{{ p.url }}" {% if p==page %} aria-current="page" {% endif %}>{{ p.title }}</a> + {% endfor %} + {% endif %} + {% if DISPLAY_CATEGORIES_ON_MENU %} + {% for cat, null in categories %} + <a class="nav-item" href="{{ SITEURL }}/{{ cat.url }}" {% if cat==category %} aria-current="page" {% endif %}>{{ cat}}</a> + {% endfor %} + {% endif %} + </nav> + </div> + <div class="nav"> + <header> + <span class="nav-title">Links</span> + </header> + <nav aria-label="Navigation: Links"> + {% for name, link in LINKS %} + <a class="nav-item" href="{{link}}">{{ name }}</a> + {% endfor %} + </nav> + </div> + </div> + </aside> + <main> + {% block content %} + {% endblock content %} + </main> + <footer> + {% block footer %} + <address> + Made with <a rel="nofollow" href="https://getpelican.com/">Pelican</a>, + </address> + {% endblock footer %} + </footer> + </div> + </div> + {% endblock body %} + </body> +</html> diff --git a/themes/simple/templates/categories.html b/themes/simple/templates/categories.html new file mode 100644 index 0000000..c723f8a --- /dev/null +++ b/themes/simple/templates/categories.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME|striptags }} - Categories{% endblock %} + +{% block content %} + <h2>Categories on {{ SITENAME }}</h2> + <ul> + {% for category, articles in categories|sort %} + <li><a href="{{ SITEURL }}/{{ category.url }}">{{ category }}</a> ({{ articles|count }})</li> + {% endfor %} + </ul> +{% endblock %} diff --git a/themes/simple/templates/category.html b/themes/simple/templates/category.html new file mode 100644 index 0000000..bfad391 --- /dev/null +++ b/themes/simple/templates/category.html @@ -0,0 +1,7 @@ +{% extends "index.html" %} + +{% block title %}{{ SITENAME|striptags }} - {{ category }} category{% endblock %} + +{% block content_title %} + <h2>Articles in the {{ category }} category</h2> +{% endblock %} diff --git a/themes/simple/templates/index.html b/themes/simple/templates/index.html new file mode 100644 index 0000000..100a720 --- /dev/null +++ b/themes/simple/templates/index.html @@ -0,0 +1,29 @@ +{% extends "base.html" %} +{% block content %} + {% block content_title %} + <h2>All articles</h2> + {% endblock %} + + + {% for article in articles_page.object_list %} + <article> + <header> <h2><a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark" title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a></h2> </header> + <section>{{ article.summary }}</section> + <footer> + <p>Published: <time datetime="{{ article.date.isoformat() }}"> {{ article.locale_date }} </time></p> + {%- if article.authors %} + <address>By + {% for author in article.authors %} + <a href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a> + {% endfor %} + </address> + {%- endif %} + </footer> + </article> + {% endfor %} + + {% if articles_page.has_other_pages() %} + {% include 'pagination.html' %} + {% endif %} + +{% endblock content %} diff --git a/themes/simple/templates/page.html b/themes/simple/templates/page.html new file mode 100644 index 0000000..4096e7a --- /dev/null +++ b/themes/simple/templates/page.html @@ -0,0 +1,33 @@ +{% extends "base.html" %} +{% block html_lang %}{{ page.lang }}{% endblock %} + +{% block title %}{{ SITENAME|striptags }} - {{ page.title|striptags }}{%endblock%} + +{% block head %} + {{ super() }} + + {% import 'translations.html' as translations with context %} + {% if translations.entry_hreflang(page) %} + {{ translations.entry_hreflang(page) }} + {% endif %} +{% endblock %} + +{% block content %} + <article> + <header> + <h2>{{ page.title }}</h2> + </header> + {% import 'translations.html' as translations with context %} + {{ translations.translations_for(page) }} + + {% block page_content %}{{ page.content }}{% endblock page_content %} + + {% if page.modified %} + <footer> + <p> + Last updated: {{ page.locale_modified }} + </p> + </footer> + {% endif %} + </article> +{% endblock %} diff --git a/themes/simple/templates/pagination.html b/themes/simple/templates/pagination.html new file mode 100644 index 0000000..9511fdb --- /dev/null +++ b/themes/simple/templates/pagination.html @@ -0,0 +1,17 @@ +{% if DEFAULT_PAGINATION %} + {% set first_page = articles_paginator.page(1) %} + {% set last_page = articles_paginator.page(articles_paginator.num_pages) %} + <nav> + <ul> + {% if articles_page.has_previous() %} + <li><a href="{{ SITEURL }}/{{ first_page.url }}">⟪</a></li> + <li><a href="{{ SITEURL }}/{{ articles_previous_page.url }}">⟨</a></li> + {% endif %} + <li>Page {{ articles_page.number }} / {{ articles_paginator.num_pages }}</li> + {% if articles_page.has_next() %} + <li><a href="{{ SITEURL }}/{{ articles_next_page.url }}">⟩</a></li> + <li><a href="{{ SITEURL }}/{{ last_page.url }}">⟫</a></li> + {% endif %} + </ul> + </nav> +{% endif %} diff --git a/themes/simple/templates/period_archives.html b/themes/simple/templates/period_archives.html new file mode 100644 index 0000000..181f493 --- /dev/null +++ b/themes/simple/templates/period_archives.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME|striptags }} - {{ period | reverse | join(' ') }} archives{% endblock %} + +{% block content %} + <h2>Archives for {{ period | reverse | join(' ') }}</h2> + + <dl> + {% for article in dates %} + <dt>{{ article.locale_date }}</dt> + <dd><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dd> + {% endfor %} + </dl> +{% endblock %} diff --git a/themes/simple/templates/tag.html b/themes/simple/templates/tag.html new file mode 100644 index 0000000..be21778 --- /dev/null +++ b/themes/simple/templates/tag.html @@ -0,0 +1,7 @@ +{% extends "index.html" %} + +{% block title %}{{ SITENAME|striptags }} - {{ tag }} tag{% endblock %} + +{% block content_title %} + <h2>Articles tagged with {{ tag }}</h2> +{% endblock %} diff --git a/themes/simple/templates/tags.html b/themes/simple/templates/tags.html new file mode 100644 index 0000000..b21e5b5 --- /dev/null +++ b/themes/simple/templates/tags.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME|striptags }} - Tags{% endblock %} + +{% block content %} + <h2>Tags for {{ SITENAME }}</h2> + <ul> + {% for tag, articles in tags|sort %} + <li><a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a> ({{ articles|count }})</li> + {% endfor %} + </ul> +{% endblock %} diff --git a/themes/simple/templates/translations.html b/themes/simple/templates/translations.html new file mode 100644 index 0000000..eed0703 --- /dev/null +++ b/themes/simple/templates/translations.html @@ -0,0 +1,16 @@ +{% macro translations_for(article) %} + {% if article.translations %} + Translations: + {% for translation in article.translations %} + <a href="{{ SITEURL }}/{{ translation.url }}" hreflang="{{ translation.lang }}">{{ translation.lang }}</a> + {% endfor %} + {% endif %} +{% endmacro %} + +{% macro entry_hreflang(entry) %} + {% if entry.translations %} + {% for translation in entry.translations %} + <link rel="alternate" hreflang="{{ translation.lang }}" href="{{ SITEURL }}/{{ translation.url }}"> + {% endfor %} + {% endif %} +{% endmacro %} @@ -0,0 +1,281 @@ +version = 1 +revision = 3 +requires-python = ">=3.14" + +[[package]] +name = "anyio" +version = "4.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload-time = "2026-07-12T20:29:07.082Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" }, +] + +[[package]] +name = "blinker" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460, upload-time = "2024-11-08T17:25:47.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" }, +] + +[[package]] +name = "docutils" +version = "0.23" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/39/a4/5180d9afc57e8fca05601dd652bdff19604c218814037fe90ffc7625a50a/docutils-0.23.tar.gz", hash = "sha256:746f5060322511280a1e50eb76846ed6bf2342984b2ac04dc42caa1a8d78799e", size = 2303823, upload-time = "2026-05-27T17:41:06.934Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/91/30151a39f7570f448ed84529390628a651d7f27c87d73c9b887f8189695e/docutils-0.23-py3-none-any.whl", hash = "sha256:25d013af9bf23bc1c7b2b093dff4208166c53a94786c9e447808335ef1185fea", size = 634701, upload-time = "2026-05-27T17:40:58.442Z" }, +] + +[[package]] +name = "feedgenerator" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b0/d2/f05e9f4628cb0df988de66f8a97dd52877490e6ebf8e7b41cd341bf2ad6b/feedgenerator-2.2.1.tar.gz", hash = "sha256:0eaa955f1f0bcb5b87ac195af740f06ff9fff4a40ed30b8a7c6bbebb264d4dd1", size = 20872, upload-time = "2025-08-17T19:36:53.48Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/08/6f74bef4663fb137fa10b493facce85bee8c055b67fbd9a7695d88e3d1a3/feedgenerator-2.2.1-py3-none-any.whl", hash = "sha256:0d8bb321e49dd43c916b659e137c1eab1b1c053dd4535a03ef8d47e5f3358ba5", size = 18495, upload-time = "2025-08-17T19:36:52.036Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "markdown" +version = "3.10.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/29/6f/da4c6aea59b3001f2e8c0ec7497475aadaf3b021c10cab5b2858f0f32b26/markdown-3.10.3.tar.gz", hash = "sha256:3589362618f743188b4d955b874402bc814f4f83f544dc207719f4baa7d9c45f", size = 372596, upload-time = "2026-07-30T19:05:29.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/69/4a5af2bc115a9a33fefe51709749de8262be3f9ba063d1753a837cdbc49c/markdown-3.10.3-py3-none-any.whl", hash = "sha256:fa6c92a00a4a3c98b22728c64a935ae1928250ae65058a6ded814d2cc29a4cea", size = 110757, upload-time = "2026-07-30T19:05:27.883Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "ordered-set" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/ca/bfac8bc689799bcca4157e0e0ced07e70ce125193fc2e166d2e685b7e2fe/ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8", size = 12826, upload-time = "2022-01-26T14:38:56.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/55/af02708f230eb77084a299d7b08175cff006dea4f2721074b92cdb0296c0/ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562", size = 7634, upload-time = "2022-01-26T14:38:48.677Z" }, +] + +[[package]] +name = "pelican" +version = "4.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blinker" }, + { name = "docutils" }, + { name = "feedgenerator" }, + { name = "jinja2" }, + { name = "ordered-set" }, + { name = "pygments" }, + { name = "python-dateutil" }, + { name = "rich" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, + { name = "unidecode" }, + { name = "watchfiles" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/8d/da26b77f0d9827d341bdedea357ccb5670717e3a9b4142e3e44c7f34db44/pelican-4.12.0.tar.gz", hash = "sha256:3983b5d2dc84c7bdf967154359077a2b78c0bbd2f7dcc55292133a7779609458", size = 1252907, upload-time = "2026-04-20T15:30:17.322Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/55/4adcce41a45f8f77e69d7e84ea447819dae1a78b4b9762a104599e5ec811/pelican-4.12.0-py3-none-any.whl", hash = "sha256:3697230f56cfcca9e98d3ac9ac26f655bb20cad807f7eacf156601e241f69ad8", size = 1358275, upload-time = "2026-04-20T15:30:15.383Z" }, +] + +[package.optional-dependencies] +markdown = [ + { name = "markdown" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +] + +[[package]] +name = "unidecode" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149, upload-time = "2025-04-24T08:45:03.798Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837, upload-time = "2025-04-24T08:45:01.609Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/41/5e1a4bb12aac5f1493fa1bdc11154eca3b258ca4eba65d39c473fe19d8e9/watchfiles-1.2.0.tar.gz", hash = "sha256:c995fba777f1ea992f090f9236e9284cf7a5d1a0130dd5a3d82c598cacd76838", size = 108252, upload-time = "2026-05-18T04:32:04.251Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/54/a9c7ea9a82a4ac65e7004c0a03920b5cdd2f9c3b678757d9cd425aa51d53/watchfiles-1.2.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b8c8358484d5fa12ef34f05b7f4168eaf1932f408725ff6d023c33ec17bd79d4", size = 400205, upload-time = "2026-05-18T04:32:05.153Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5d/c9ab3534374a4a67450696905d6ef16a04405448b8dc52bd752ae50423d4/watchfiles-1.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f04b092229ad2c50126dd3c922c8822e51e605993764a33058d4a791ab42281", size = 392508, upload-time = "2026-05-18T04:30:54.849Z" }, + { url = "https://files.pythonhosted.org/packages/26/ca/1ad30103535cf0cecd7b993e8d50edc5351b1820e38f2d22e3df58962feb/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a7ce236284f002a156f70add88efe5c70879cccbb658be0822c54b1306fc09d", size = 452448, upload-time = "2026-05-18T04:30:53.727Z" }, + { url = "https://files.pythonhosted.org/packages/37/a1/ceee2cdf2afbd715fa07758d39c9859513eae411b23196f7fd039e5feedd/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b9909cc2b48468b575eefa944919e1fe8a36c5849d5c7c168f80a8c1db69398e", size = 459605, upload-time = "2026-05-18T04:30:23.312Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f6/421e30fd1cb3907a84ed92ab3f1983e37ba2dca015e9a894a048418417a2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a37faaed405c67e28e6be45a1fa4f206ef5a2860f27c237db9fa30704c38242", size = 490757, upload-time = "2026-05-18T04:30:47.358Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/55ed1b97ed08be7bba6f9a541cac15f2a858e1d74d2b07b6da70a82aab00/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9649193aa27bd9ff2e80ff29bfaa93085496c7a3a377592823cc58b77ee88add", size = 568672, upload-time = "2026-05-18T04:30:38.915Z" }, + { url = "https://files.pythonhosted.org/packages/d1/cf/d8ae8a80dd7bafab395ea7681c10237311bbf34d37704a8c744e7cf31fc7/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e4ff8e37f99cf1da89e255e07c9c4b37c214038c4283707bdec308cb1b0ea1f", size = 464197, upload-time = "2026-05-18T04:30:09.914Z" }, + { url = "https://files.pythonhosted.org/packages/7c/8a/3076c496ca8dafe0e8cd03fcebdfc47be4b1174b4e5b24ff6e396e6b3af2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:054dc20fd2e3132b4c3883b4a00d72fd6e1f56fdaf89fccd12e8057d74cd74d7", size = 453181, upload-time = "2026-05-18T04:30:14.829Z" }, + { url = "https://files.pythonhosted.org/packages/e5/10/9745e17c98e7b8a86454df0a3c7b5686bd650383f1e9f26e4ebcbd6cc0c0/watchfiles-1.2.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e140ed30ebde76796b686e67c182cff10ea2fbab186fafd1560f74bb5a473a6e", size = 465109, upload-time = "2026-05-18T04:30:28.123Z" }, + { url = "https://files.pythonhosted.org/packages/8f/95/8ef4a95481d3e0cb52d62a06fa6e972e81424be2d9698b91a2fecca9904c/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:bb7e52ecf68ba46d22df23467b87cffeb2146908aa523ebfe803019618cfda06", size = 630653, upload-time = "2026-05-18T04:31:49.304Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e4/3b3bf36b0f829b50c6ebcb8d031583863c59f923d6a6af3d485e470d0fac/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:23282a321c8baf9b3a3c4afff673f9fe65eb7fdc2338d765ccad9d3d1916a5ba", size = 657838, upload-time = "2026-05-18T04:31:06.497Z" }, + { url = "https://files.pythonhosted.org/packages/21/b1/6cbbb50c1f3002ab568777d44aa21206dfb8807a840990c4037523b51812/watchfiles-1.2.0-cp314-cp314-win32.whl", hash = "sha256:c0db965c5f79aa49fe672d297cf1febc5ad149b658594944f49a54a2b96270a7", size = 275108, upload-time = "2026-05-18T04:30:06.891Z" }, + { url = "https://files.pythonhosted.org/packages/92/45/190ce6db8dcb4536682cf75d3889ff1a27182a58cb519d343cb6d9ea63d8/watchfiles-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:71283b39fd17e5408eb123bd37aeecfd9d54c81fc184421943208aadb879d103", size = 288441, upload-time = "2026-05-18T04:32:12.901Z" }, + { url = "https://files.pythonhosted.org/packages/74/0d/3eae1c2313ab08378431d907c3f8095ecca00f3eda33111cf4f0f2591799/watchfiles-1.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:c5c19526f4e54a00f2666a6c0e9e40d582c09e865055ea7378bf0009aab857b3", size = 280684, upload-time = "2026-05-18T04:31:26.902Z" }, + { url = "https://files.pythonhosted.org/packages/b1/75/fb64e6c25d6b5ca636d03df34ffb1c6e9873303e76d27967e045f8df088f/watchfiles-1.2.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d73a585accffa5ae39c17264c36ec3166d2fad7000c780f5ef83b2722afb9dd2", size = 398857, upload-time = "2026-05-18T04:32:17.108Z" }, + { url = "https://files.pythonhosted.org/packages/73/4e/9f7adf01754cbf81843722ccfec169d8f26c69778281a302855cecd2ee08/watchfiles-1.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae99b14c5f21e026e0e9d96f40e07d8570ebee6cafd9d8fc318354606daa7a28", size = 392413, upload-time = "2026-05-18T04:31:07.911Z" }, + { url = "https://files.pythonhosted.org/packages/47/c8/bec626bcc2d69f44b9acb24ce7d60ed7b16b73628eea747fcbd169d8edda/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4429f3b105524a10b72c3a819b091c495d2811d419c1e1e8df773a5a5974f831", size = 452409, upload-time = "2026-05-18T04:31:20.142Z" }, + { url = "https://files.pythonhosted.org/packages/00/b7/b6362068e81e7c556d155a34c35d40ac3ef42d747b06d7f6e5bf58e359c2/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43d818978d06062d9b22c4fab2ebe44cf5213d42dc8e62bda8c2760cfa2eeb33", size = 458827, upload-time = "2026-05-18T04:32:06.219Z" }, + { url = "https://files.pythonhosted.org/packages/67/f8/9a813fa42afb1e0b4625e75f0479826644d3ee8dc287e093799bc01f390c/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9f732dc58b2dbe69e464ccf8fff7a03b0dd0be439da4c0720d3558527d3d6b4", size = 490104, upload-time = "2026-05-18T04:31:56.034Z" }, + { url = "https://files.pythonhosted.org/packages/2f/bf/27dfb6094ca4c9aad21298b5525b6c53cb36121ee454331d05161e58d130/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f200104103feb097de4cab8fe4f5dd18a2026934c7dea98c55a2f5fd6d5a33b", size = 571360, upload-time = "2026-05-18T04:31:57.133Z" }, + { url = "https://files.pythonhosted.org/packages/fb/39/44a096d67270ea93df91d33877dbe91fbda3aa4f8ec2edf799d93eda8736/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63ac26eefbf4af1741247d6fb68b11c49a25b2f7413fbd318a83a12aaa9cf666", size = 464644, upload-time = "2026-05-18T04:30:57.33Z" }, + { url = "https://files.pythonhosted.org/packages/0e/80/c7472203bad6268e3ef1ad260739704847898938ad7ea8b63a5131f46b50/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c4997d4e4a55f0d02b6cde327322daf3a0400e5df6c6b15948994bf72497925", size = 454771, upload-time = "2026-05-18T04:30:48.736Z" }, + { url = "https://files.pythonhosted.org/packages/51/cf/3b10b268b4b7f0fc26e9debb5eef1998b515887840f444cd3ec80c688755/watchfiles-1.2.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:4c887eba18b7945ac73067a8b4a66f21cd46c2539b2bc68588f7be6c7eb6d26b", size = 463494, upload-time = "2026-05-18T04:31:33.826Z" }, + { url = "https://files.pythonhosted.org/packages/3d/3e/a4302545cd589262a0dc7d140e86f7688eba3f9c72776c27f7e23b8864c4/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:3416ff151bb6b5a8d8d11664974fbef4d9305b9b2957839ab5a270468fd8df30", size = 629383, upload-time = "2026-05-18T04:31:15.596Z" }, + { url = "https://files.pythonhosted.org/packages/db/99/d5649df0a9a410d45b7c882304d0b790903ac9b6e8f2cfd12114e0c6b9f2/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:0e831a271c035d89789cffc386b6aa1375f39f1cd25eb7ca0997e4970d152fc5", size = 656093, upload-time = "2026-05-18T04:31:58.707Z" }, + { url = "https://files.pythonhosted.org/packages/92/b9/362702539275019a54dd2e94511b31a9b89c5f9e6a21966de7eb692549fc/watchfiles-1.2.0-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:37a6721cdf3f65dbb13aa9503510ccb4451603ac837e44d265d7992a597e1374", size = 400109, upload-time = "2026-05-18T04:31:16.879Z" }, + { url = "https://files.pythonhosted.org/packages/8f/75/71d5ba62db781e5587bded1d944c675374bc4aa37ff33d5018d98e8b6538/watchfiles-1.2.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2b37d10b5a63bd4d87e18472d80fa525bd670586fae62e5dd580452764879b65", size = 392167, upload-time = "2026-05-18T04:31:28.058Z" }, + { url = "https://files.pythonhosted.org/packages/3c/01/c66dd95d0423fe30d31820e2d1d5bda773764131bbb6ac0cb1cf303ac328/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a105bc2283f67e8fbec74253ec2d94925de92ed72c0393f1206bf326b7b7b69", size = 452372, upload-time = "2026-05-18T04:31:00.836Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/2fe99557e72f85627c6a8eed50d889e8d101623e060a22ad75b875cb932d/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5327989a465505f05cfe06f04fa9d0c2fd5432bb243e10e6f012b1bdca3c8579", size = 459596, upload-time = "2026-05-18T04:31:34.96Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/d4acfa0023367428ed48351b3b9b267893037b6cadae55620c61c24bcfd4/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecb47f183a8025b2aa18b546725c3657e542112ae9c0613a2af79b4fa8d04ad7", size = 490869, upload-time = "2026-05-18T04:31:59.923Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5f/3164cbdce06c9fb95c4f7b9e2f9760b5e2797af43a9ecc317ef42a23a278/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8520a4ab0e37f770afc34459c4f8f7019e153f9124dc101c15538365875d1ab2", size = 571641, upload-time = "2026-05-18T04:32:00.948Z" }, + { url = "https://files.pythonhosted.org/packages/41/e6/85d3731c55e65cd7690f3f803d24c139588aaf863e4bf2148fe7a7fa1a19/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71cd71740ed2c15211ebb237ced4e39a1cdf6f80566e5fe95428da1626f4fde6", size = 464444, upload-time = "2026-05-18T04:30:34.298Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7d/562641012b8b09872742c3b8adf9629ec479fd78f8d68ae4a0c13da8add6/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f88af53d6ddaf72179ef613ddc905e6f4785f712b49b80b3bef9f3525e6194b4", size = 453593, upload-time = "2026-05-18T04:31:23.464Z" }, + { url = "https://files.pythonhosted.org/packages/56/fe/cb8ef3d6f929d14158fdaaad9925985b7310abc9384dcd4d82dd0016fb59/watchfiles-1.2.0-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:cee9d5efd929efdac5f7e58f72b3376f676b64050a91c5b99a7094c5b2317488", size = 465096, upload-time = "2026-05-18T04:31:30.384Z" }, + { url = "https://files.pythonhosted.org/packages/25/91/80908e835e100527a9267147b08c0eee1fa6ab0ffec15edc04d1d44885f7/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:b718bf356bbc15e559bd8ef41782b573b8ae0e3f177ab244b440568d7ea02cfb", size = 630638, upload-time = "2026-05-18T04:30:49.89Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/95ab2f256bb4af3cb2eb23b9317bda984ee6e0f11733a5c004a6c95b06e3/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:922c0e019fe68b3ae392965a766b02a71ba1168c932cebc3733cd52c5fe5b377", size = 657684, upload-time = "2026-05-18T04:31:32.027Z" }, +] + +[[package]] +name = "website" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "pelican", extra = ["markdown"] }, +] + +[package.metadata] +requires-dist = [{ name = "pelican", extras = ["markdown"], specifier = ">=4.12.0" }] |
