Compare commits

...

2 Commits

Author SHA1 Message Date
Ryan Rix 98deb9809d atom rendering from Arroyo 2024-01-17 00:38:27 -08:00
Ryan Rix c4a0eff570 web templates more betterer 2024-01-17 00:38:22 -08:00
8 changed files with 379 additions and 232 deletions

View File

@ -145,6 +145,12 @@ class Page(models.Model):
def collect_keywords(self):
return self.file.keyword_set
def collect_references(self):
return [
reference
for heading in self.file.heading_set.all()
for reference in heading.reference_set.all()
]
def collect_links(self):
link_objs = self.file.outbound_links.all()
@ -255,6 +261,12 @@ class Feed(models.Model):
title = models.CharField(max_length=512)
visibility = models.CharField(max_length=512, choices=POST_VISIBILITY)
def to_atom(self, links):
opts = native.ExportOptions(
link_retargets=links
)
return native.atomize_file(self.file.path, opts)
@classmethod
def create_from_arroyo(cls, doc: native.Document) -> Feed | None:
route_key = next(iter(doc.collect_keywords("ARCOLOGY_FEED")), None)
@ -473,9 +485,139 @@ def org_page(request, key):
backlinks=the_page.collect_backlinks(),
keywords=the_page.collect_keywords().all(),
references=the_page.collect_references(),
))
#+end_src
*** Rendering the page
The =page= template extends the app template defined below, which provides four blocks to inject content in to:
#+begin_src jinja2 :tangle arcology/templates/arcology/page.html
{% extends "arcology/app.html" %}
#+end_src
the tab title is assembled from the page and site title:
#+begin_src jinja2 :tangle arcology/templates/arcology/page.html
{% block title %}{{ head_title }}{% endblock %}
#+end_src
If the site has any feeds, they're injected in to the =<head>= along with any particular web-crawler rules.
#+begin_src jinja2 :tangle arcology/templates/arcology/page.html
{% block extra_head %}
{% for feed in feeds %}
<link rel="alternate" type="application/atom+xml" href="{{ feed.url }}" title="{{ feed.title }}" />
{% endfor %}
{% if page.allow_crawl is none or page.allow_crawl is '"nil"' %}
<meta name="robots" content="noarchive noimageindex noindex nofollow"/>
{% else %}
<meta name="robots" content=""/>
{% endif %}
{% endblock %}
#+end_src
The main content block contains the =<main>= generated by the native parser, and a sidebar containing backlinks, and page metadata.
#+begin_src jinja2 :tangle arcology/templates/arcology/page.html
{% block content %}
{{ html_content | safe }}
<section class="sidebar">
{% if backlinks|length > 0 %}
<div class="backlinks">
<h3>Pages Linking Here</h3>
<ul class="backlinks">
{% for backlink in backlinks %}
<li>{{ backlink.to_backlink_html|safe }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% if references|length > 0 %}
<div class="references">
<h3>External References</h3>
<ul class="references">
{% for ref in references %}
<li><a href="{{ ref.ref }}">{{ref.ref}}</a></li>
{% endfor %}
</ul>
</div>
{% endif %}
{% if keywords|length > 0 %}
<div class="keywords">
<h3>Page Metadata Keywords</h3>
<ul class="keywords">
{% for keyword in keywords %}
<pre>#+{{ keyword.keyword }}: {{ keyword.value }}</pre>
{% endfor %}
</ul>
</div>
{% endif %}
</section>
{% endblock %}
#+end_src
Most of the page CSS is defined below, but the content CSS is here, nearer the actual implementation of the flexbox:
#+begin_src css :tangle static/arcology/css/app.css :mkdirp yes
.content {
margin-left: auto;
margin-right: auto;
padding: 1em;
padding-top: 0;
display: flex;
flex-flow: row wrap;
max-width: 120ch;
}
.content > section, main {
display: inline-block;
flex-grow: 1;
flex-shrink: 1;
flex-basis: 40em;
padding: 1em;
overflow: auto;
}
.content > section.sidebar {
flex-grow: 0;
flex-shrink: 1;
flex-basis: 30ch;
}
#+end_src
The sidebar itself is a vertical flexbox, pushing everything but the backlinks towards the bottom of the page.
#+begin_src css :tangle static/arcology/css/app.css :mkdirp yes
section.sidebar {
display: flex;
flex-flow: column wrap;
}
section.sidebar > div.backlinks {
flex-grow: 1;
}
#+end_src
Here are some [[https://medium.com/@massimo.cassandro/flexbox-separators-b284d6d7b747][hacks]] to put a line between the main content flexbox and the sidebar. I'm not sure I'll keep this, but it's nice to have a delimeter.
#+begin_src css :tangle static/arcology/css/app.css :mkdirp yes
.content::before {
align-self: stretch;
content: '';
border: 1px dotted var(--medium-gray);
margin-top: 1em;
margin-bottom: 1em;
}
.content > *:first-child {
order: -1;
}
#+end_src
** NEXT sitemap
this is maybe its own django app...
@ -483,7 +625,7 @@ this is maybe its own django app...
#+begin_src python :tangle arcology/views.py
def sitemap(request):
# query links etc to create a JSON doc for SigmaJS
return HttpResponse("sitemap")
return HttpResponse(b"sitemap")
#+end_src
** NEXT feed
@ -492,12 +634,21 @@ all the pandoc based feed generator stuff will need to be recreated or
bodged in, and all that probably should go in its own django app.
#+begin_src python :tangle arcology/views.py
async def feed(request, key):
def feed(request, key):
site = Site.from_request(request)
full_key = f"{site.key}/{key}"
if site.key == "localhost":
full_key = key
new_site_key = key.split("/")[0]
site = Site.objects.filter(key=new_site_key).first()
else:
full_key = f"{site.key}/{key}"
logger.warn(site)
the_feed = Feed.objects.get(route_key=full_key)
return HttpResponse(f"feed for {the_feed.file.path}")
the_feed = get_object_or_404(Feed, route_key=full_key)
links = the_feed.file.page_set.first().collect_links()
feed_xml = the_feed.to_atom(links)
return HttpResponse(feed_xml,content_type="application/atom+xml")
#+end_src
** Per-Site link color CSS endpoint
@ -505,7 +656,7 @@ async def feed(request, key):
:ID: 20231229T215425.830707
:END:
This endpoint generates a dynamic CSS file that colorizes internal URLs based on the [[id:20231229T164611.256424][The Arcology's Site List]]. It does something [[https://twitter.com/gotMLK7/status/1675994399086641152][extremely wicked]] to make the page links less jarring until you hover over them by faking an alpha-channel in to the color.
This endpoint generates a dynamic CSS file that colorizes internal URLs based on the [[id:20231229T164611.256424][The Arcology's Site List]] which is stored in the database. It does something [[https://twitter.com/gotMLK7/status/1675994399086641152][extremely wicked]] to make the page links less jarring until you hover over them by faking an alpha-channel in to the color.
#+begin_src python :tangle arcology/views.py
def site_css(request):
@ -540,14 +691,23 @@ def site_css(request):
** Arcology Site Templates
Okay, now comes the fun part; we have HTML rendering of the org pages themselves working, now to put them on a page looking slick. Idk what to do here; I kind of want to just Tufte-CSS-ify this thing, while still maintaining subtle color-themeing and my typographic choices. Oughta just try to sketch this out first, but I'm gonna just set up the scaffolding for injecting Site specific variables and a basic HTML template that the org docs can be dropped in to.
In short, there are four blocks that the page template and other templates will use to embed content in the rendered web page:
- =title= is the =<title>= element, the name of the tab.
- =h1= is the displayed site/page title and only needs to be extended if some page wants to do something strange (like site index pages only showing the site title)
- =extra_head= is inside =<head>= and can be used to stuff more metadata in there
- =content= is where the content goes.
for now it's largely lifted from [[id:arcology/fastapi/base.html.j2][Base HTML Template]] and [[id:arcology/fastapi/page.html.j2][Page HTML Templates]] from the FastAPI prototype.
for now it's largely lifted from [[id:arcology/fastapi/base.html.j2][Base HTML Template]] and [[id:arcology/fastapi/page.html.j2][Page HTML Templates]] from the FastAPI prototype with some nips and tucks to make it more streamlined and legible.
#+begin_src jinja2 :tangle arcology/templates/arcology/app.html :mkdirp yes
<!DOCTYPE html>
<html>
<head>
#+end_src
The base template provides some basic information and loads the CSS sheets necessary to make things look nice, along with some page and author metadata. It provides a template block =extra_head= so that child templates can shove more =<head>= elements in here.
#+begin_src jinja2 :tangle arcology/templates/arcology/app.html :mkdirp yes
{% load static %}
<link rel="stylesheet" href="{% static 'arcology/css/app.css' %}"/>
<link rel="stylesheet" href="{% static 'arcology/css/vulf.css' %}"/>
@ -562,6 +722,11 @@ for now it's largely lifted from [[id:arcology/fastapi/base.html.j2][Base HTML T
<title>{% block title %}{{head_title | default:"The Arcology Project" }}{% endblock %}</title>
{% block extra_head %}{% endblock %}
</head>
#+end_src
The body consists of a header which has the site and page title (which can be overridden for example in the =index= handler to only show the site title) and links to the other sites. These should be loaded from the DB eventually.
#+begin_src jinja2 :tangle arcology/templates/arcology/app.html :mkdirp yes
<body>
<header>
<div class="header-content">
@ -578,11 +743,19 @@ for now it's largely lifted from [[id:arcology/fastapi/base.html.j2][Base HTML T
</div>
</div>
</header>
#+end_src
The =content= block is used in child templates to hide a =<main>=; the =content= div *should* be a main element instead but [[id:20231023T115950.248543][The arroyo_rs Native Org Parser]] wants to output a =<main>= and i'm not going to stop it, so the div is there to make the body's flexbox layout work.
#+begin_src jinja2 :tangle arcology/templates/arcology/app.html :mkdirp yes
<div class="content">
{% block content %}{% endblock %}
</div>
#+end_src
A footer contains the oh-so-important copyright notice and a limited privacy policy which I should update before I ship this, along with links to the sitemap and to [[https://fediring.net][my fediring neighbors]].
#+begin_src jinja2 :tangle arcology/templates/arcology/app.html :mkdirp yes
<footer>
<hr/>
&copy; 02023 <a href="https://arcology.garden/people/rrix">Ryan Rix</a> &lt;<a href="mailto:site@whatthefuck.computer">site@whatthefuck.computer</a>&gt;
@ -617,7 +790,11 @@ for now it's largely lifted from [[id:arcology/fastapi/base.html.j2][Base HTML T
<a href="https://fediring.net/">Fediring</a>
<a href="https://fediring.net/next?host=arcology.garden">&rarr;</a>
</p>
#+end_src
The FastaAPI site had a "boredom mode" which would disable fonts and colors because some nerds were mean to me. This one will not have that until some nerds are mean to me.
#+begin_src jinja2 :tangle arcology/templates/arcology/app.html :mkdirp yes
<!--
<p>
<input type="checkbox" id="boredom-mode"><label for="boredom-mode">I do not like your aesthetic sensibilities!!</label>
@ -632,48 +809,6 @@ for now it's largely lifted from [[id:arcology/fastapi/base.html.j2][Base HTML T
</html>
#+end_src
And each page:
#+begin_src jinja2 :tangle arcology/templates/arcology/page.html
{% extends "arcology/app.html" %}
{% block title %}{{ head_title }}{% endblock %}
{% block head %}
{% for feed in feeds %}
<link rel="alternate" type="application/atom+xml" href="{{ feed.url }}" title="{{ feed.title }}" />
{% endfor %}
{% if page.allow_crawl is none or page.allow_crawl is '"nil"' %}
<meta name="robots" content="noarchive noimageindex noindex nofollow"/>
{% else %}
<meta name="robots" content=""/>
{% endif %}
{% endblock %}
{% block content %}
{{ html_content | safe }}
<section class="sidebar">
<div class="backlinks">
<h3>Pages Linking Here</h3>
<ul class="backlinks">
{% for backlink in backlinks %}
<li>{{ backlink.to_backlink_html|safe }}</li>
{% endfor %}
</ul>
</div>
<div class="keywords">
<h3>Page Metadata Keywords</h3>
<ul class="keywords">
{% for keyword in keywords %}
<li><pre>{{ keyword.keyword }} = {{ keyword.value }}</pre></li>
{% endfor %}
</ul>
</div>
</section>
{% endblock %}
#+end_src
*** CSS
:PROPERTIES:
@ -700,6 +835,7 @@ header {
background-color: var(--light-gray);
border-radius: 0.25em;
margin-top: 0;
border-bottom: 2px solid var(--dark-gray);
}
header > .header-content {
@ -719,42 +855,6 @@ header h2:before {
}
#+end_src
#+begin_src css :tangle static/arcology/css/app.css :mkdirp yes
.content {
margin-left: auto;
margin-right: auto;
padding: 1em;
padding-top: 0;
display: flex;
flex-flow: row wrap;
max-width: 120ch;
}
.content > section, main {
display: inline-block;
flex-grow: 1;
flex-shrink: 1;
flex-basis: 40em;
padding: 1em;
overflow: auto;
}
.content > section.sidebar {
flex-grow: 0;
flex-shrink: 1;
flex-basis: 30ch;
}
section.sidebar {
display: flex;
flex-flow: column wrap;
}
section.sidebar > div.backlinks {
flex-grow: 1;
}
#+end_src
#+begin_src css :tangle static/arcology/css/app.css :mkdirp yes
footer {
margin-left: auto;
@ -769,20 +869,7 @@ footer a {
}
#+end_src
Some [[https://medium.com/@massimo.cassandro/flexbox-separators-b284d6d7b747][hacks]].
#+begin_src css :tangle static/arcology/css/app.css :mkdirp yes
.content::before {
align-self: stretch;
content: '';
border: 1px dotted var(--medium-gray);
margin-top: 1em;
margin-bottom: 1em;
}
.content > *:first-child {
order: -1;
}
a {
color: var(--primary);
}

View File

@ -79,6 +79,12 @@ class Page(models.Model):
def collect_keywords(self):
return self.file.keyword_set
def collect_references(self):
return [
reference
for heading in self.file.heading_set.all()
for reference in heading.reference_set.all()
]
def collect_links(self):
link_objs = self.file.outbound_links.all()
@ -148,6 +154,12 @@ class Feed(models.Model):
title = models.CharField(max_length=512)
visibility = models.CharField(max_length=512, choices=POST_VISIBILITY)
def to_atom(self, links):
opts = native.ExportOptions(
link_retargets=links
)
return native.atomize_file(self.file.path, opts)
@classmethod
def create_from_arroyo(cls, doc: native.Document) -> Feed | None:
route_key = next(iter(doc.collect_keywords("ARCOLOGY_FEED")), None)

View File

@ -1,78 +1,90 @@
{# [[file:../../../arcology.org::*Templates][Templates:1]] #}
{# [[file:../../../arcology.org::*Arcology Site Templates][Arcology Site Templates:1]] #}
<!DOCTYPE html>
<html>
<head>
{% load static %}
<link rel="stylesheet" href="{% static 'arcology/css/app.css' %}"/>
<link rel="stylesheet" href="{% static 'arcology/css/vulf.css' %}"/>
<link rel="stylesheet" href="{% static 'arcology/css/default-colors.css' %}"/>
<link rel="stylesheet" href="{% url 'site-css' %}"/>
{% if site and site.css_file %}
<link rel="stylesheet" href="{% static site.css_file %}"/>
{% endif %}
<meta name="author" content="Ryan Rix"/>
<meta name="generator" content="Arcology Site Engine https://engine.arcology.garden/"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{% block title %}{{head_title | default:"The Arcology Project" }}{% endblock %}</title>
{% block extra_head %}{% endblock %}
</head>
<body>
<header>
<div class="header-content">
{% block h1 %}
<h1><a href='/'>{{ site.title }}</a></h1>
<h2>{{ page.title }}</h2>
{% endblock %}
<div>
&bull; <a class="internal" href="https://thelionsrear.com">Life</a>
&bull; <a class="internal" href="https://arcology.garden">Tech</a>
&bull; <a class="internal" href="https://cce.whatthefuck.computer">Emacs</a>
&bull; <a class="internal" href="https://engine.arcology.garden">Arcology</a>
&bull;
</div>
{# Arcology Site Templates:1 ends here #}
{# [[file:../../../arcology.org::*Arcology Site Templates][Arcology Site Templates:2]] #}
{% load static %}
<link rel="stylesheet" href="{% static 'arcology/css/app.css' %}"/>
<link rel="stylesheet" href="{% static 'arcology/css/vulf.css' %}"/>
<link rel="stylesheet" href="{% static 'arcology/css/default-colors.css' %}"/>
<link rel="stylesheet" href="{% url 'site-css' %}"/>
{% if site and site.css_file %}
<link rel="stylesheet" href="{% static site.css_file %}"/>
{% endif %}
<meta name="author" content="Ryan Rix"/>
<meta name="generator" content="Arcology Site Engine https://engine.arcology.garden/"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{% block title %}{{head_title | default:"The Arcology Project" }}{% endblock %}</title>
{% block extra_head %}{% endblock %}
</head>
{# Arcology Site Templates:2 ends here #}
{# [[file:../../../arcology.org::*Arcology Site Templates][Arcology Site Templates:3]] #}
<body>
<header>
<div class="header-content">
{% block h1 %}
<h1><a href='/'>{{ site.title }}</a></h1>
<h2>{{ page.title }}</h2>
{% endblock %}
<div>
&bull; <a class="internal" href="https://thelionsrear.com">Life</a>
&bull; <a class="internal" href="https://arcology.garden">Tech</a>
&bull; <a class="internal" href="https://cce.whatthefuck.computer">Emacs</a>
&bull; <a class="internal" href="https://engine.arcology.garden">Arcology</a>
&bull;
</div>
</header>
<div class="content">
{% block content %}{% endblock %}
</div>
</header>
{# Arcology Site Templates:3 ends here #}
<footer>
<hr/>
&copy; 02023 <a href="https://arcology.garden/people/rrix">Ryan Rix</a> &lt;<a href="mailto:site@whatthefuck.computer">site@whatthefuck.computer</a>&gt;
{# [[file:../../../arcology.org::*Arcology Site Templates][Arcology Site Templates:4]] #}
<div class="content">
{% block content %}{% endblock %}
</div>
{# Arcology Site Templates:4 ends here #}
<br/>
{# [[file:../../../arcology.org::*Arcology Site Templates][Arcology Site Templates:5]] #}
<footer>
<hr/>
&copy; 02023 <a href="https://arcology.garden/people/rrix">Ryan Rix</a> &lt;<a href="mailto:site@whatthefuck.computer">site@whatthefuck.computer</a>&gt;
<p>
Care has been taken to publish accurate information to
long-lived URLs, but context and content as well as URLs may
change without notice.
</p>
<br/>
<p>
This site collects no personal information from visitors, nor
stores any identifying tokens. If you or your personal
information ended up in public notes please email me for
correction or removal. A single bit cookie may be stored on
your device if you choose to change appearance settings below.
</p>
<p>
Care has been taken to publish accurate information to
long-lived URLs, but context and content as well as URLs may
change without notice.
</p>
<p>
Email me with questions, comments, insights, kind criticism.
blow horn, good luck.
</p>
<p>
This site collects no personal information from visitors, nor
stores any identifying tokens. If you or your personal
information ended up in public notes please email me for
correction or removal. A single bit cookie may be stored on
your device if you choose to change appearance settings below.
</p>
<p>
<a href="/sitemap/">View the Site Map</a>
</p>
<p>
Email me with questions, comments, insights, kind criticism.
blow horn, good luck.
</p>
<p>
<a href="https://fediring.net/previous?host=arcology.garden">&larr;</a>
<a href="https://fediring.net/">Fediring</a>
<a href="https://fediring.net/next?host=arcology.garden">&rarr;</a>
</p>
<p>
<a href="/sitemap/">View the Site Map</a>
</p>
<!--
<p>
<a href="https://fediring.net/previous?host=arcology.garden">&larr;</a>
<a href="https://fediring.net/">Fediring</a>
<a href="https://fediring.net/next?host=arcology.garden">&rarr;</a>
</p>
{# Arcology Site Templates:5 ends here #}
{# [[file:../../../arcology.org::*Arcology Site Templates][Arcology Site Templates:6]] #}
<!--
<p>
<input type="checkbox" id="boredom-mode"><label for="boredom-mode">I do not like your aesthetic sensibilities!!</label>
</p>
@ -84,4 +96,4 @@
</footer>
</body>
</html>
{# Templates:1 ends here #}
{# Arcology Site Templates:6 ends here #}

View File

@ -1,9 +1,13 @@
{# [[file:../../../arcology.org::*Templates][Templates:2]] #}
{# [[file:../../../arcology.org::*Rendering the page][Rendering the page:1]] #}
{% extends "arcology/app.html" %}
{# Rendering the page:1 ends here #}
{# [[file:../../../arcology.org::*Rendering the page][Rendering the page:2]] #}
{% block title %}{{ head_title }}{% endblock %}
{# Rendering the page:2 ends here #}
{% block head %}
{# [[file:../../../arcology.org::*Rendering the page][Rendering the page:3]] #}
{% block extra_head %}
{% for feed in feeds %}
<link rel="alternate" type="application/atom+xml" href="{{ feed.url }}" title="{{ feed.title }}" />
{% endfor %}
@ -13,11 +17,14 @@
<meta name="robots" content=""/>
{% endif %}
{% endblock %}
{# Rendering the page:3 ends here #}
{# [[file:../../../arcology.org::*Rendering the page][Rendering the page:4]] #}
{% block content %}
{{ html_content | safe }}
<section class="sidebar">
{% if backlinks|length > 0 %}
<div class="backlinks">
<h3>Pages Linking Here</h3>
<ul class="backlinks">
@ -26,15 +33,29 @@
{% endfor %}
</ul>
</div>
{% endif %}
{% if references|length > 0 %}
<div class="references">
<h3>External References</h3>
<ul class="references">
{% for ref in references %}
<li><a href="{{ ref.ref }}">{{ref.ref}}</a></li>
{% endfor %}
</ul>
</div>
{% endif %}
{% if keywords|length > 0 %}
<div class="keywords">
<h3>Page Metadata Keywords</h3>
<ul class="keywords">
{% for keyword in keywords %}
<li><pre>{{ keyword.keyword }} = {{ keyword.value }}</pre></li>
<pre>#+{{ keyword.keyword }}: {{ keyword.value }}</pre>
{% endfor %}
</ul>
</div>
{% endif %}
</section>
{% endblock %}
{# Templates:2 ends here #}
{# Rendering the page:4 ends here #}

View File

@ -43,22 +43,32 @@ def org_page(request, key):
backlinks=the_page.collect_backlinks(),
keywords=the_page.collect_keywords().all(),
references=the_page.collect_references(),
))
# org-page:1 ends here
# [[file:../arcology.org::*sitemap][sitemap:1]]
def sitemap(request):
# query links etc to create a JSON doc for SigmaJS
return HttpResponse("sitemap")
return HttpResponse(b"sitemap")
# sitemap:1 ends here
# [[file:../arcology.org::*feed][feed:1]]
async def feed(request, key):
def feed(request, key):
site = Site.from_request(request)
full_key = f"{site.key}/{key}"
if site.key == "localhost":
full_key = key
new_site_key = key.split("/")[0]
site = Site.objects.filter(key=new_site_key).first()
else:
full_key = f"{site.key}/{key}"
logger.warn(site)
the_feed = Feed.objects.get(route_key=full_key)
return HttpResponse(f"feed for {the_feed.file.path}")
the_feed = get_object_or_404(Feed, route_key=full_key)
links = the_feed.file.page_set.first().collect_links()
feed_xml = the_feed.to_atom(links)
return HttpResponse(feed_xml,content_type="application/atom+xml")
# feed:1 ends here
# [[file:../arcology.org::*Per-Site link color CSS endpoint][Per-Site link color CSS endpoint:1]]

View File

@ -6,11 +6,11 @@
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1703908423,
"narHash": "sha256-55zlSQULXCmUf88tPSGc/g7RiYnuCo14eaP1kcA6V00=",
"lastModified": 1705480217,
"narHash": "sha256-1Xx88iGThODMczFLVj06CuhfFfL8cXPbGrlg0gV7Ees=",
"ref": "refs/heads/main",
"rev": "26a7bfe085b01fff19b287191e4f2b989d363667",
"revCount": 129,
"rev": "aacd62b4f67144634a0bb6b14e72fae690380348",
"revCount": 138,
"type": "git",
"url": "https://code.rix.si/rrix/arroyo"
},
@ -42,11 +42,11 @@
"systems": "systems_2"
},
"locked": {
"lastModified": 1701680307,
"narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
"lastModified": 1705309234,
"narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
"rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
"type": "github"
},
"original": {

View File

@ -240,7 +240,7 @@ These will be the "public" interfaces for the generators, a set of Emacs functio
output))
(defun arroyo-generate-imports-formatted (format-fn output)
(thread-last (arroyo-generat-imports "home-manager" "server")
(thread-last (arroyo-generate-imports "home-manager" "server")
(s-split "\n")
(-map format-fn)
(butlast)

View File

@ -1,39 +1,4 @@
/* [[file:../../../arcology.org::*CSS][CSS:1]] */
body {
font-family: "Vulf Mono", monospace;
font-style: italic;
font-size: medium;
background-color: var(--white);
color: var(--black);
margin: 0;
}
/* CSS:1 ends here */
/* [[file:../../../arcology.org::*CSS][CSS:2]] */
header {
background-color: var(--light-gray);
border-radius: 0.25em;
margin-top: 0;
}
header > .header-content {
padding: 1em;
max-width: 120ch;
margin-left: auto;
margin-right: auto;
}
header h1, header h2 {
margin-top: 0;
display: inline;
}
header h2:before {
content: " — ";
}
/* CSS:2 ends here */
/* [[file:../../../arcology.org::*CSS][CSS:3]] */
/* [[file:../../../arcology.org::*Rendering the page][Rendering the page:5]] */
.content {
margin-left: auto;
margin-right: auto;
@ -58,18 +23,69 @@ header h2:before {
flex-shrink: 1;
flex-basis: 30ch;
}
/* Rendering the page:5 ends here */
/* [[file:../../../arcology.org::*Rendering the page][Rendering the page:6]] */
section.sidebar {
display: flex;
flex-flow: column wrap;
}
section.sidebar > div.backlinks {
flex-grow: 1;
flex-grow: 1;
}
/* CSS:3 ends here */
/* Rendering the page:6 ends here */
/* [[file:../../../arcology.org::*CSS][CSS:4]] */
/* [[file:../../../arcology.org::*Rendering the page][Rendering the page:7]] */
.content::before {
align-self: stretch;
content: '';
border: 1px dotted var(--medium-gray);
margin-top: 1em;
margin-bottom: 1em;
}
.content > *:first-child {
order: -1;
}
/* Rendering the page:7 ends here */
/* [[file:../../../arcology.org::*CSS][CSS:1]] */
body {
font-family: "Vulf Mono", monospace;
font-style: italic;
font-size: medium;
background-color: var(--white);
color: var(--black);
margin: 0;
}
/* CSS:1 ends here */
/* [[file:../../../arcology.org::*CSS][CSS:2]] */
header {
background-color: var(--light-gray);
border-radius: 0.25em;
margin-top: 0;
border-bottom: 2px solid var(--dark-gray);
}
header > .header-content {
padding: 1em;
max-width: 120ch;
margin-left: auto;
margin-right: auto;
}
header h1, header h2 {
margin-top: 0;
display: inline;
}
header h2:before {
content: " — ";
}
/* CSS:2 ends here */
/* [[file:../../../arcology.org::*CSS][CSS:3]] */
footer {
margin-left: auto;
margin-right: auto;
@ -81,20 +97,9 @@ footer {
footer a {
font-weight: 500;
}
/* CSS:4 ends here */
/* [[file:../../../arcology.org::*CSS][CSS:5]] */
.content::before {
align-self: stretch;
content: '';
border: 1px dotted var(--medium-gray);
margin-top: 1em;
margin-bottom: 1em;
}
.content > *:first-child {
order: -1;
}
/* CSS:3 ends here */
/* [[file:../../../arcology.org::*CSS][CSS:4]] */
a {
color: var(--primary);
}
@ -102,4 +107,4 @@ a {
a::visited {
color: var(--secondary);
}
/* CSS:5 ends here */
/* CSS:4 ends here */