91 lines
2.3 KiB
Python
91 lines
2.3 KiB
Python
# [[file:../arcology-sitemaps.org::*Making SigmaJS Nodes][Making SigmaJS Nodes:1]]
|
|
import hashlib
|
|
|
|
from sqlmodel import Session, select
|
|
|
|
import arcology.arroyo as arroyo
|
|
from arcology.arroyo import Page
|
|
|
|
def make_loc_hash(page: Page, salt, max_q=700):
|
|
key = page.get_file() + str(salt)
|
|
hash = hashlib.sha224(key.encode("utf-8")).digest()
|
|
return int.from_bytes(hash, byteorder="big") % max_q
|
|
|
|
def nodes(engine):
|
|
# collect all pages
|
|
with Session(engine) as s:
|
|
pages = s.exec(select(Page)).all()
|
|
|
|
nodes = [
|
|
dict(
|
|
key=page.get_key(),
|
|
attributes=dict(
|
|
label=page.get_title(),
|
|
x=make_loc_hash(page, 1),
|
|
y=make_loc_hash(page, 2),
|
|
size=min((len(page.backlinks) + len(page.outlinks)) / 2, 10),
|
|
color=page.get_site().node_color,
|
|
href=page.get_arcology_key().to_url()
|
|
)
|
|
)
|
|
for page in pages
|
|
]
|
|
|
|
return nodes
|
|
# Making SigmaJS Nodes:1 ends here
|
|
|
|
# [[file:../arcology-sitemaps.org::*Making SigmaJS Edges][Making SigmaJS Edges:1]]
|
|
from sqlmodel import Session, select
|
|
|
|
import arcology.arroyo as arroyo
|
|
from arcology.arroyo import Link, engine
|
|
|
|
from arcology.parse import parse_sexp
|
|
|
|
# HACK: https://stackoverflow.com/questions/1151658/python-hashable-dicts
|
|
class hashabledict(dict):
|
|
def __hash__(self):
|
|
return hash(tuple(sorted(self.items())))
|
|
|
|
def edges(engine):
|
|
# collect all pages
|
|
with Session(engine) as s:
|
|
q_links = s.exec(select(Link)).all()
|
|
|
|
links = set()
|
|
for link in q_links:
|
|
source = link.source_page.get_key()
|
|
dest = link.dest_page.get_key()
|
|
links.add(
|
|
hashabledict(
|
|
key=f"{source}-{dest}",
|
|
source=source,
|
|
target=dest,
|
|
)
|
|
)
|
|
|
|
return list(links)
|
|
# Making SigmaJS Edges:1 ends here
|
|
|
|
# [[file:../arcology-sitemaps.org::*Making SigmaJS Edges][Making SigmaJS Edges:2]]
|
|
import functools
|
|
|
|
@functools.lru_cache(maxsize=20)
|
|
def sigma_lru(cache_key):
|
|
return dict(
|
|
# this is a different import of the same engine...
|
|
nodes=nodes(engine),
|
|
edges=edges(engine)
|
|
)
|
|
|
|
def sigma(engine):
|
|
with Session(engine) as session:
|
|
pages = session.exec(select(Page).order_by(Page.key))
|
|
hashes =[page.hash for page in pages]
|
|
|
|
cache_key = ''.join(
|
|
hashes
|
|
)
|
|
return sigma_lru(cache_key)
|
|
# Making SigmaJS Edges:2 ends here
|