arcology-fastapi/arcology-sites.org

5.4 KiB
Raw Permalink Blame History

Arcology Sites

Arcology is designed to allow a writer to publish writing from across their org-roam Knowledge Base to multiple domains, interlinking between them where necessary. Each site can provide its own CSS and maybe eventually its own page template and some minimal metadata, all of which are stored in dataclasses which are meant to be used as courtesy classes to store data for the HTML generator and link router.

import arcology.sites

site_name = "arcology"
arcology.sites.sites.get(site_name)
arcology.sites.doc
from dataclasses import dataclass
from typing import Optional, List
from enum import Enum

from arcology.config import Environment as Env
from arcology.config import get_settings

@dataclass
class Site():
  key: str
  domains: dict[Env, List[str]]
  title: str
  css_file: Optional[str]
  node_color: Optional[str]

  def get_domains(self, env: Env = get_settings().arcology_env):
    return self.domains.get(env, [])

sites = dict()
from functools import lru_cache
from typing import Optional

env = get_settings().arcology_env

@lru_cache(maxsize=16)
def host_to_site(host: str) -> Optional[Site]:
  for site in sites.values():
    domains = site.domains.get(env)
    if domains is None:
      raise Exception(f"no domains for site {site}+{env}?")
    if host in domains:
      return site

Arcology FastAPI Self-Hosting

Of course this thing self-hosts. :)

arcology = Site(
  key="arcology",
  domains={
    Env.prod: ["engine.arcology.garden"],
    Env.dev: ["engine.arcology.garden:8000"]
  },
  title="The Arcology Site Engine",
  css_file=None,
  node_color="#67b4f8"
)
sites["arcology"] = arcology

The Lion's Rear

lionsrear = Site(
  key="lionsrear",
  domains={
    Env.prod: ["thelionsrear.com"],
    Env.dev: ["dev.thelionsrear.com:8000"]
  },
  title="The Lion's Rear",
  css_file="/static/css/lionsrear.css",
  node_color="#87af87"
)
sites["lionsrear"] = lionsrear
:root {
  --alert: #CC6960;
  --primary: #707231;
  --secondary: #ebbe7b;
  --success: #67b4f8;
  --warning: #7e5c41;

  --white:       #87af87;
  --light-gray:  #cfdcc2;
  --medium-gray: #a0aa96;
  --dark-gray:   #82796C;
  --black:       #211F1C;
}

body {
  background-color: var(--white);
}

section.backlinks {
    padding: 0.5em;
    border-radius: 1em;
    background-color: var(--light-gray);
    margin-bottom: 2em;
    margin-top: 1em;
}

pre,code {
  font-weight: bold;
}

The Arcology Garden

garden = Site(
  key="garden",
  domains={
    Env.prod: ["arcology.garden"],
    Env.dev: ["dev.arcology.garden:8000"]
  },
  title="The Arcology Garden",
  css_file="/static/css/garden.css",
  node_color="#a6dc68"
)
sites["garden"] = garden
:root {
  --alert: #CC6960;
  --primary: #707231;
  --secondary: #ebbe7b;
  --success: #67b4f8;
  --warning: #7e5c41;


  --white: #fcf6ed;
  --light-gray: #f6e5cb;
  --medium-gray: #BAAD9B;
  --dark-gray: #82796C;
  --black: #211F1C;

  --bg: #a6dc68;
}

body {
  background-color: var(--bg);
}

The Complete Computing Environment

cce = Site(
  key="cce",
  domains={
    Env.prod: ["cce.whatthefuck.computer", "cce.rix.si"],
    Env.dev: ["dev.cce"],
  },
  title="The Complete Computing Environment",
  css_file="/static/css/cce.css",
  node_color="#cc6960"
)
sites["cce"] = cce
:root {
  --alert: #CC6960;
  --primary: #707231;
  --secondary: #ebbe7b;
  --success: #67b4f8;
  --warning: #7e5c41;

  --white: #fcfcfc;
  --light-gray: #dcdcec;
  --medium-gray: #cacada;
  --dark-gray: #808090;
  --black: #211F1C;
}

body {
  background-color: var(--dark-gray);
}

Topic Index the "fact site"

doc = Site(
  key="doc",
  domains={
    Env.prod: ["doc.rix.si"],
    Env.dev: ["dev.topics"],
  },
  title="rrix's fact site",
  css_file="/static/css/docsite.css",
  node_color="#ebbe7b"
)
sites["doc"] = doc
:root {
  --alert: #CC6960;
  --primary: #707231;
  --secondary: #ebbe7b;
  --success: #67b4f8;
  --warning: #7e5c41;

  --white: #fcfcfc;
  --light-gray: #dcdcec;
  --medium-gray: #cacada;
  --dark-gray: #808090;
  --black: #211F1C;
}

body {
  background-color: var(--medium-gray);
}

"local" site for development

local = Site(
  key="local",
  domains={
    Env.prod: [],
    Env.dev: ["localhost:8000"],
  },
  title="localhost",
  css_file="/static/css/docsite.css",
  node_color="#211F1C",
)
sites["local"] = local