Compare commits
2 Commits
cee335e644
...
98deb9809d
Author | SHA1 | Date |
---|---|---|
Ryan Rix | 98deb9809d | |
Ryan Rix | c4a0eff570 |
285
arcology.org
285
arcology.org
|
@ -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/>
|
||||
© 02023 <a href="https://arcology.garden/people/rrix">Ryan Rix</a> <<a href="mailto:site@whatthefuck.computer">site@whatthefuck.computer</a>>
|
||||
|
@ -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">→</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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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>
|
||||
• <a class="internal" href="https://thelionsrear.com">Life</a>
|
||||
• <a class="internal" href="https://arcology.garden">Tech</a>
|
||||
• <a class="internal" href="https://cce.whatthefuck.computer">Emacs</a>
|
||||
• <a class="internal" href="https://engine.arcology.garden">Arcology</a>
|
||||
•
|
||||
</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>
|
||||
• <a class="internal" href="https://thelionsrear.com">Life</a>
|
||||
• <a class="internal" href="https://arcology.garden">Tech</a>
|
||||
• <a class="internal" href="https://cce.whatthefuck.computer">Emacs</a>
|
||||
• <a class="internal" href="https://engine.arcology.garden">Arcology</a>
|
||||
•
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="content">
|
||||
{% block content %}{% endblock %}
|
||||
</div>
|
||||
</header>
|
||||
{# Arcology Site Templates:3 ends here #}
|
||||
|
||||
<footer>
|
||||
<hr/>
|
||||
© 02023 <a href="https://arcology.garden/people/rrix">Ryan Rix</a> <<a href="mailto:site@whatthefuck.computer">site@whatthefuck.computer</a>>
|
||||
{# [[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/>
|
||||
© 02023 <a href="https://arcology.garden/people/rrix">Ryan Rix</a> <<a href="mailto:site@whatthefuck.computer">site@whatthefuck.computer</a>>
|
||||
|
||||
<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">←</a>
|
||||
<a href="https://fediring.net/">Fediring</a>
|
||||
<a href="https://fediring.net/next?host=arcology.garden">→</a>
|
||||
</p>
|
||||
<p>
|
||||
<a href="/sitemap/">View the Site Map</a>
|
||||
</p>
|
||||
|
||||
<!--
|
||||
<p>
|
||||
<a href="https://fediring.net/previous?host=arcology.garden">←</a>
|
||||
<a href="https://fediring.net/">Fediring</a>
|
||||
<a href="https://fediring.net/next?host=arcology.garden">→</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 #}
|
||||
|
|
|
@ -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 #}
|
||||
|
|
|
@ -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]]
|
||||
|
|
14
flake.lock
14
flake.lock
|
@ -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": {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue