Compare commits
1 Commits
develop
...
dev/global
Author | SHA1 | Date | |
---|---|---|---|
|
6d621ffc3c |
@ -22,6 +22,7 @@ import shutil
|
|||||||
import traceback
|
import traceback
|
||||||
import time
|
import time
|
||||||
import re
|
import re
|
||||||
|
import sqlite3
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
from bs4 import BeautifulSoup as bs4
|
from bs4 import BeautifulSoup as bs4
|
||||||
@ -63,6 +64,7 @@ JINJA_ENV = jinja2.Environment(
|
|||||||
autoescape=jinja2.select_autoescape()
|
autoescape=jinja2.select_autoescape()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
PARSER_NAMESPACE = 'codigoparallevar.com/blog'
|
||||||
WATCH = True
|
WATCH = True
|
||||||
if os.getenv('WATCH_AND_REBUILD', '1') == '0':
|
if os.getenv('WATCH_AND_REBUILD', '1') == '0':
|
||||||
WATCH = False
|
WATCH = False
|
||||||
@ -176,6 +178,12 @@ def get_out_path(front_matter):
|
|||||||
return out_path
|
return out_path
|
||||||
|
|
||||||
|
|
||||||
|
def create_db(path):
|
||||||
|
db = sqlite3.connect(path)
|
||||||
|
db.execute('CREATE VIRTUAL TABLE IF NOT EXISTS note_search USING fts5(note_id, title, body, top_level_title, is_done, is_todo, parser_namespace, url, tokenize="trigram");')
|
||||||
|
db.execute('DELETE FROM note_search WHERE parser_namespace = ?;', (PARSER_NAMESPACE,))
|
||||||
|
return db
|
||||||
|
|
||||||
def load_all(top_dir_relative):
|
def load_all(top_dir_relative):
|
||||||
top = os.path.abspath(top_dir_relative)
|
top = os.path.abspath(top_dir_relative)
|
||||||
|
|
||||||
@ -456,10 +464,39 @@ def render_rss(docs, dest_top):
|
|||||||
f.write(result)
|
f.write(result)
|
||||||
|
|
||||||
|
|
||||||
def regen_all(source_top, dest_top, docs=None):
|
def regen_all(source_top, dest_top, docs=None, db=None):
|
||||||
if docs is None:
|
if docs is None:
|
||||||
docs = load_all(source_top)
|
docs = load_all(source_top)
|
||||||
|
|
||||||
|
cur = db.cursor()
|
||||||
|
cleaned_db = False
|
||||||
|
|
||||||
|
try:
|
||||||
|
cur.execute('DELETE FROM note_search WHERE parser_namespace = ?;', (PARSER_NAMESPACE,))
|
||||||
|
cleaned_db = True
|
||||||
|
except sqlite3.OperationalError as err:
|
||||||
|
if WATCH:
|
||||||
|
logging.warning("Error pre-cleaning DB, search won't be updated")
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
|
# Save posts to DB
|
||||||
|
for (doc, front_matter, out_path) in docs.values():
|
||||||
|
cur.execute('''INSERT INTO note_search(note_id, title, body, top_level_title, is_done, is_todo, parser_namespace, url) VALUES (?, ?, ?, ?, ?, ?, ?, ?);''',
|
||||||
|
(
|
||||||
|
out_path,
|
||||||
|
front_matter['title'],
|
||||||
|
doc,
|
||||||
|
front_matter['title'],
|
||||||
|
False,
|
||||||
|
False,
|
||||||
|
PARSER_NAMESPACE,
|
||||||
|
out_path + '/index.html',
|
||||||
|
))
|
||||||
|
|
||||||
|
cur.close()
|
||||||
|
db.commit()
|
||||||
|
|
||||||
# Render posts
|
# Render posts
|
||||||
for (doc, front_matter, out_path) in docs.values():
|
for (doc, front_matter, out_path) in docs.values():
|
||||||
doc_full_path = os.path.join(dest_top, out_path)
|
doc_full_path = os.path.join(dest_top, out_path)
|
||||||
@ -513,7 +550,8 @@ def main(source_top, dest_top):
|
|||||||
## Initial load
|
## Initial load
|
||||||
t0 = time.time()
|
t0 = time.time()
|
||||||
logging.info("Initial load...")
|
logging.info("Initial load...")
|
||||||
docs = regen_all(source_top, dest_top)
|
db = create_db(os.path.join(dest_top, '..', 'db.sqlite3'))
|
||||||
|
docs = regen_all(source_top, dest_top, db=db)
|
||||||
logging.info("Initial load completed in {:.2f}s".format(time.time() - t0))
|
logging.info("Initial load completed in {:.2f}s".format(time.time() - t0))
|
||||||
|
|
||||||
if not WATCH:
|
if not WATCH:
|
||||||
@ -557,7 +595,7 @@ def main(source_top, dest_top):
|
|||||||
if is_static_resource:
|
if is_static_resource:
|
||||||
logging.info("Updated static resources in {:.2f}s".format(time.time() - t0))
|
logging.info("Updated static resources in {:.2f}s".format(time.time() - t0))
|
||||||
else:
|
else:
|
||||||
docs = regen_all(source_top, dest_top, docs)
|
docs = regen_all(source_top, dest_top, docs, db=db)
|
||||||
logging.info("Updated all in {:.2f}s".format(time.time() - t0))
|
logging.info("Updated all in {:.2f}s".format(time.time() - t0))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
@ -46,14 +46,14 @@ IMG_EXTENSIONS = set([
|
|||||||
"gif",
|
"gif",
|
||||||
])
|
])
|
||||||
SKIPPED_TAGS = set(['attach'])
|
SKIPPED_TAGS = set(['attach'])
|
||||||
DEFAULT_SUBPATH = "public"
|
PARSER_NAMESPACE = 'codigoparallevar.com/notes'
|
||||||
|
|
||||||
WATCH = True
|
WATCH = True
|
||||||
if os.getenv('WATCH_AND_REBUILD', '1') == '0':
|
if os.getenv('WATCH_AND_REBUILD', '1') == '0':
|
||||||
WATCH = False
|
WATCH = False
|
||||||
|
|
||||||
MIN_HIDDEN_HEADLINE_LEVEL = 2
|
MIN_HIDDEN_HEADLINE_LEVEL = 2
|
||||||
INDEX_ID = os.getenv("INDEX_ID", "ea48ec1d-f9d4-4fb7-b39a-faa7b6e2ba95")
|
INDEX_ID = "ea48ec1d-f9d4-4fb7-b39a-faa7b6e2ba95"
|
||||||
SITE_NAME = "Código para llevar"
|
SITE_NAME = "Código para llevar"
|
||||||
|
|
||||||
MONITORED_EVENT_TYPES = (
|
MONITORED_EVENT_TYPES = (
|
||||||
@ -89,11 +89,9 @@ def is_git_path(path):
|
|||||||
return any([chunk == ".git" for chunk in path.split(os.sep)])
|
return any([chunk == ".git" for chunk in path.split(os.sep)])
|
||||||
|
|
||||||
def create_db(path):
|
def create_db(path):
|
||||||
if os.path.exists(path):
|
|
||||||
os.unlink(path)
|
|
||||||
|
|
||||||
db = sqlite3.connect(path)
|
db = sqlite3.connect(path)
|
||||||
db.execute('CREATE VIRTUAL TABLE note_search USING fts5(note_id, title, body, top_level_title, is_done, is_todo, tokenize="trigram");')
|
db.execute('CREATE VIRTUAL TABLE IF NOT EXISTS note_search USING fts5(note_id, title, body, top_level_title, is_done, is_todo, parser_namespace, url tokenize="trigram");')
|
||||||
|
db.execute('DELETE FROM note_search WHERE parser_namespace = ?;', (PARSER_NAMESPACE,))
|
||||||
return db
|
return db
|
||||||
|
|
||||||
def load_all(top_dir_relative):
|
def load_all(top_dir_relative):
|
||||||
@ -121,13 +119,13 @@ def load_all(top_dir_relative):
|
|||||||
logging.info("Collected {} files".format(len(docs)))
|
logging.info("Collected {} files".format(len(docs)))
|
||||||
return docs
|
return docs
|
||||||
|
|
||||||
def regen_all(src_top, dest_top, subpath, *, docs=None, db=None):
|
def regen_all(src_top, dest_top, *, docs=None, db=None):
|
||||||
files_generated = 0
|
files_generated = 0
|
||||||
cur = db.cursor()
|
cur = db.cursor()
|
||||||
cleaned_db = False
|
cleaned_db = False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
cur.execute('DELETE FROM note_search;')
|
cur.execute('DELETE FROM note_search WHERE parser_namespace = ?;', (PARSER_NAMESPACE,))
|
||||||
cleaned_db = True
|
cleaned_db = True
|
||||||
except sqlite3.OperationalError as err:
|
except sqlite3.OperationalError as err:
|
||||||
if WATCH:
|
if WATCH:
|
||||||
@ -151,7 +149,7 @@ def regen_all(src_top, dest_top, subpath, *, docs=None, db=None):
|
|||||||
changed = False
|
changed = False
|
||||||
headlines = list(doc.getAllHeadlines())
|
headlines = list(doc.getAllHeadlines())
|
||||||
related = None
|
related = None
|
||||||
if not relpath.startswith(subpath + "/"):
|
if not relpath.startswith("public/"):
|
||||||
# print("Skip:", relpath)
|
# print("Skip:", relpath)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@ -263,7 +261,7 @@ def regen_all(src_top, dest_top, subpath, *, docs=None, db=None):
|
|||||||
topLevelHeadline = topLevelHeadline.parent
|
topLevelHeadline = topLevelHeadline.parent
|
||||||
|
|
||||||
# Save for full-text-search
|
# Save for full-text-search
|
||||||
cur.execute('''INSERT INTO note_search(note_id, title, body, top_level_title, is_done, is_todo) VALUES (?, ?, ?, ?, ?, ?);''',
|
cur.execute('''INSERT INTO note_search(note_id, title, body, top_level_title, is_done, is_todo, parser_namespace, url) VALUES (?, ?, ?, ?, ?, ?, ?, ?);''',
|
||||||
(
|
(
|
||||||
headline.id,
|
headline.id,
|
||||||
headline.title.get_text(),
|
headline.title.get_text(),
|
||||||
@ -271,6 +269,8 @@ def regen_all(src_top, dest_top, subpath, *, docs=None, db=None):
|
|||||||
topLevelHeadline.title.get_text(),
|
topLevelHeadline.title.get_text(),
|
||||||
headline.is_done,
|
headline.is_done,
|
||||||
headline.is_todo,
|
headline.is_todo,
|
||||||
|
PARSER_NAMESPACE,
|
||||||
|
headline.id + '.node.html',
|
||||||
))
|
))
|
||||||
|
|
||||||
# Update graph, replace document ids with headline ids
|
# Update graph, replace document ids with headline ids
|
||||||
@ -350,15 +350,15 @@ def regen_all(src_top, dest_top, subpath, *, docs=None, db=None):
|
|||||||
dirs_exist_ok=True)
|
dirs_exist_ok=True)
|
||||||
|
|
||||||
|
|
||||||
def main(src_top, dest_top, subpath):
|
def main(src_top, dest_top):
|
||||||
notifier = inotify.adapters.InotifyTrees([src_top, STATIC_PATH])
|
notifier = inotify.adapters.InotifyTrees([src_top, STATIC_PATH])
|
||||||
|
|
||||||
## Initial load
|
## Initial load
|
||||||
t0 = time.time()
|
t0 = time.time()
|
||||||
|
|
||||||
os.makedirs(dest_top, exist_ok=True)
|
os.makedirs(dest_top, exist_ok=True)
|
||||||
db = create_db(os.path.join(dest_top, 'db.sqlite3'))
|
db = create_db(os.path.join(dest_top, '..', 'db.sqlite3'))
|
||||||
docs = regen_all(src_top, dest_top, subpath=subpath, db=db)
|
docs = regen_all(src_top, dest_top, db=db)
|
||||||
|
|
||||||
if not WATCH:
|
if not WATCH:
|
||||||
logging.info("Build completed in {:.2f}s".format(time.time() - t0))
|
logging.info("Build completed in {:.2f}s".format(time.time() - t0))
|
||||||
@ -376,7 +376,7 @@ def main(src_top, dest_top, subpath):
|
|||||||
print("CHANGED: {}".format(filepath))
|
print("CHANGED: {}".format(filepath))
|
||||||
t0 = time.time()
|
t0 = time.time()
|
||||||
try:
|
try:
|
||||||
docs = regen_all(src_top, dest_top, subpath=subpath, docs=docs, db=db)
|
docs = regen_all(src_top, dest_top, docs=docs, db=db)
|
||||||
except:
|
except:
|
||||||
logging.error(traceback.format_exc())
|
logging.error(traceback.format_exc())
|
||||||
logging.error("Loading new templates failed 😿")
|
logging.error("Loading new templates failed 😿")
|
||||||
@ -826,13 +826,9 @@ def save_changes(doc):
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
if len(sys.argv) not in (3, 4):
|
if len(sys.argv) != 3:
|
||||||
print("Usage: {} SOURCE_TOP DEST_TOP <SUBPATH>".format(sys.argv[0]))
|
print("Usage: {} SOURCE_TOP DEST_TOP".format(sys.argv[0]))
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
logging.basicConfig(level=logging.INFO, format="%(levelname)-8s %(message)s")
|
logging.basicConfig(level=logging.INFO, format="%(levelname)-8s %(message)s")
|
||||||
subpath = DEFAULT_SUBPATH
|
exit(main(sys.argv[1], sys.argv[2]))
|
||||||
|
|
||||||
if len(sys.argv) == 4:
|
|
||||||
subpath = sys.argv[3]
|
|
||||||
exit(main(sys.argv[1], sys.argv[2], subpath=subpath))
|
|
||||||
|
@ -1,85 +1,82 @@
|
|||||||
/* Dark mode. */
|
pre { line-height: 125%; }
|
||||||
@media (prefers-color-scheme: dark) {
|
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
|
||||||
pre { line-height: 125%; }
|
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
|
||||||
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
|
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
|
||||||
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
|
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
|
||||||
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
|
.hll { background-color: #49483e }
|
||||||
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
|
.c { color: #75715e } /* Comment */
|
||||||
.hll { background-color: #49483e }
|
.err { color: #960050; background-color: #1e0010 } /* Error */
|
||||||
.c { color: #75715e } /* Comment */
|
.esc { color: #f8f8f2 } /* Escape */
|
||||||
.err { color: #960050; background-color: #1e0010 } /* Error */
|
.g { color: #f8f8f2 } /* Generic */
|
||||||
.esc { color: #f8f8f2 } /* Escape */
|
.k { color: #66d9ef } /* Keyword */
|
||||||
.g { color: #f8f8f2 } /* Generic */
|
.l { color: #ae81ff } /* Literal */
|
||||||
.k { color: #66d9ef } /* Keyword */
|
.n { color: #f8f8f2 } /* Name */
|
||||||
.l { color: #ae81ff } /* Literal */
|
.o { color: #f92672 } /* Operator */
|
||||||
.n { color: #f8f8f2 } /* Name */
|
.x { color: #f8f8f2 } /* Other */
|
||||||
.o { color: #f92672 } /* Operator */
|
.p { color: #f8f8f2 } /* Punctuation */
|
||||||
.x { color: #f8f8f2 } /* Other */
|
.ch { color: #75715e } /* Comment.Hashbang */
|
||||||
.p { color: #f8f8f2 } /* Punctuation */
|
.cm { color: #75715e } /* Comment.Multiline */
|
||||||
.ch { color: #75715e } /* Comment.Hashbang */
|
.cp { color: #75715e } /* Comment.Preproc */
|
||||||
.cm { color: #75715e } /* Comment.Multiline */
|
.cpf { color: #75715e } /* Comment.PreprocFile */
|
||||||
.cp { color: #75715e } /* Comment.Preproc */
|
.c1 { color: #75715e } /* Comment.Single */
|
||||||
.cpf { color: #75715e } /* Comment.PreprocFile */
|
.cs { color: #75715e } /* Comment.Special */
|
||||||
.c1 { color: #75715e } /* Comment.Single */
|
.gd { color: #f92672 } /* Generic.Deleted */
|
||||||
.cs { color: #75715e } /* Comment.Special */
|
.ge { color: #f8f8f2; font-style: italic } /* Generic.Emph */
|
||||||
.gd { color: #f92672 } /* Generic.Deleted */
|
.gr { color: #f8f8f2 } /* Generic.Error */
|
||||||
.ge { color: #f8f8f2; font-style: italic } /* Generic.Emph */
|
.gh { color: #f8f8f2 } /* Generic.Heading */
|
||||||
.gr { color: #f8f8f2 } /* Generic.Error */
|
.gi { color: #a6e22e } /* Generic.Inserted */
|
||||||
.gh { color: #f8f8f2 } /* Generic.Heading */
|
.go { color: #66d9ef } /* Generic.Output */
|
||||||
.gi { color: #a6e22e } /* Generic.Inserted */
|
.gp { color: #f92672; font-weight: bold } /* Generic.Prompt */
|
||||||
.go { color: #66d9ef } /* Generic.Output */
|
.gs { color: #f8f8f2; font-weight: bold } /* Generic.Strong */
|
||||||
.gp { color: #f92672; font-weight: bold } /* Generic.Prompt */
|
.gu { color: #75715e } /* Generic.Subheading */
|
||||||
.gs { color: #f8f8f2; font-weight: bold } /* Generic.Strong */
|
.gt { color: #f8f8f2 } /* Generic.Traceback */
|
||||||
.gu { color: #75715e } /* Generic.Subheading */
|
.kc { color: #66d9ef } /* Keyword.Constant */
|
||||||
.gt { color: #f8f8f2 } /* Generic.Traceback */
|
.kd { color: #66d9ef } /* Keyword.Declaration */
|
||||||
.kc { color: #66d9ef } /* Keyword.Constant */
|
.kn { color: #f92672 } /* Keyword.Namespace */
|
||||||
.kd { color: #66d9ef } /* Keyword.Declaration */
|
.kp { color: #66d9ef } /* Keyword.Pseudo */
|
||||||
.kn { color: #f92672 } /* Keyword.Namespace */
|
.kr { color: #66d9ef } /* Keyword.Reserved */
|
||||||
.kp { color: #66d9ef } /* Keyword.Pseudo */
|
.kt { color: #66d9ef } /* Keyword.Type */
|
||||||
.kr { color: #66d9ef } /* Keyword.Reserved */
|
.ld { color: #e6db74 } /* Literal.Date */
|
||||||
.kt { color: #66d9ef } /* Keyword.Type */
|
.m { color: #ae81ff } /* Literal.Number */
|
||||||
.ld { color: #e6db74 } /* Literal.Date */
|
.s { color: #e6db74 } /* Literal.String */
|
||||||
.m { color: #ae81ff } /* Literal.Number */
|
.na { color: #a6e22e } /* Name.Attribute */
|
||||||
.s { color: #e6db74 } /* Literal.String */
|
.nb { color: #f8f8f2 } /* Name.Builtin */
|
||||||
.na { color: #a6e22e } /* Name.Attribute */
|
.nc { color: #a6e22e } /* Name.Class */
|
||||||
.nb { color: #f8f8f2 } /* Name.Builtin */
|
.no { color: #66d9ef } /* Name.Constant */
|
||||||
.nc { color: #a6e22e } /* Name.Class */
|
.nd { color: #a6e22e } /* Name.Decorator */
|
||||||
.no { color: #66d9ef } /* Name.Constant */
|
.ni { color: #f8f8f2 } /* Name.Entity */
|
||||||
.nd { color: #a6e22e } /* Name.Decorator */
|
.ne { color: #a6e22e } /* Name.Exception */
|
||||||
.ni { color: #f8f8f2 } /* Name.Entity */
|
.nf { color: #a6e22e } /* Name.Function */
|
||||||
.ne { color: #a6e22e } /* Name.Exception */
|
.nl { color: #f8f8f2 } /* Name.Label */
|
||||||
.nf { color: #a6e22e } /* Name.Function */
|
.nn { color: #f8f8f2 } /* Name.Namespace */
|
||||||
.nl { color: #f8f8f2 } /* Name.Label */
|
.nx { color: #a6e22e } /* Name.Other */
|
||||||
.nn { color: #f8f8f2 } /* Name.Namespace */
|
.py { color: #f8f8f2 } /* Name.Property */
|
||||||
.nx { color: #a6e22e } /* Name.Other */
|
.nt { color: #f92672 } /* Name.Tag */
|
||||||
.py { color: #f8f8f2 } /* Name.Property */
|
.nv { color: #f8f8f2 } /* Name.Variable */
|
||||||
.nt { color: #f92672 } /* Name.Tag */
|
.ow { color: #f92672 } /* Operator.Word */
|
||||||
.nv { color: #f8f8f2 } /* Name.Variable */
|
.w { color: #f8f8f2 } /* Text.Whitespace */
|
||||||
.ow { color: #f92672 } /* Operator.Word */
|
.mb { color: #ae81ff } /* Literal.Number.Bin */
|
||||||
.w { color: #f8f8f2 } /* Text.Whitespace */
|
.mf { color: #ae81ff } /* Literal.Number.Float */
|
||||||
.mb { color: #ae81ff } /* Literal.Number.Bin */
|
.mh { color: #ae81ff } /* Literal.Number.Hex */
|
||||||
.mf { color: #ae81ff } /* Literal.Number.Float */
|
.mi { color: #ae81ff } /* Literal.Number.Integer */
|
||||||
.mh { color: #ae81ff } /* Literal.Number.Hex */
|
.mo { color: #ae81ff } /* Literal.Number.Oct */
|
||||||
.mi { color: #ae81ff } /* Literal.Number.Integer */
|
.sa { color: #e6db74 } /* Literal.String.Affix */
|
||||||
.mo { color: #ae81ff } /* Literal.Number.Oct */
|
.sb { color: #e6db74 } /* Literal.String.Backtick */
|
||||||
.sa { color: #e6db74 } /* Literal.String.Affix */
|
.sc { color: #e6db74 } /* Literal.String.Char */
|
||||||
.sb { color: #e6db74 } /* Literal.String.Backtick */
|
.dl { color: #e6db74 } /* Literal.String.Delimiter */
|
||||||
.sc { color: #e6db74 } /* Literal.String.Char */
|
.sd { color: #e6db74 } /* Literal.String.Doc */
|
||||||
.dl { color: #e6db74 } /* Literal.String.Delimiter */
|
.s2 { color: #e6db74 } /* Literal.String.Double */
|
||||||
.sd { color: #e6db74 } /* Literal.String.Doc */
|
.se { color: #ae81ff } /* Literal.String.Escape */
|
||||||
.s2 { color: #e6db74 } /* Literal.String.Double */
|
.sh { color: #e6db74 } /* Literal.String.Heredoc */
|
||||||
.se { color: #ae81ff } /* Literal.String.Escape */
|
.si { color: #e6db74 } /* Literal.String.Interpol */
|
||||||
.sh { color: #e6db74 } /* Literal.String.Heredoc */
|
.sx { color: #e6db74 } /* Literal.String.Other */
|
||||||
.si { color: #e6db74 } /* Literal.String.Interpol */
|
.sr { color: #e6db74 } /* Literal.String.Regex */
|
||||||
.sx { color: #e6db74 } /* Literal.String.Other */
|
.s1 { color: #e6db74 } /* Literal.String.Single */
|
||||||
.sr { color: #e6db74 } /* Literal.String.Regex */
|
.ss { color: #e6db74 } /* Literal.String.Symbol */
|
||||||
.s1 { color: #e6db74 } /* Literal.String.Single */
|
.bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
|
||||||
.ss { color: #e6db74 } /* Literal.String.Symbol */
|
.fm { color: #a6e22e } /* Name.Function.Magic */
|
||||||
.bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
|
.vc { color: #f8f8f2 } /* Name.Variable.Class */
|
||||||
.fm { color: #a6e22e } /* Name.Function.Magic */
|
.vg { color: #f8f8f2 } /* Name.Variable.Global */
|
||||||
.vc { color: #f8f8f2 } /* Name.Variable.Class */
|
.vi { color: #f8f8f2 } /* Name.Variable.Instance */
|
||||||
.vg { color: #f8f8f2 } /* Name.Variable.Global */
|
.vm { color: #f8f8f2 } /* Name.Variable.Magic */
|
||||||
.vi { color: #f8f8f2 } /* Name.Variable.Instance */
|
.il { color: #ae81ff } /* Literal.Number.Integer.Long */
|
||||||
.vm { color: #f8f8f2 } /* Name.Variable.Magic */
|
|
||||||
.il { color: #ae81ff } /* Literal.Number.Integer.Long */
|
|
||||||
}
|
|
||||||
|
@ -6,13 +6,11 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<style>
|
<style>
|
||||||
body {
|
body {
|
||||||
background-color: white;
|
|
||||||
font-family: sans-serif;
|
font-family: sans-serif;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
max-width: 100ex;
|
max-width: 100ex;
|
||||||
padding: 0 1ex;
|
padding: 0 1ex;
|
||||||
color: black;
|
|
||||||
}
|
}
|
||||||
.header h1 {
|
.header h1 {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@ -47,7 +45,7 @@
|
|||||||
border-right: 1px solid #000;
|
border-right: 1px solid #000;
|
||||||
}
|
}
|
||||||
@media (prefers-color-scheme: dark) {
|
@media (prefers-color-scheme: dark) {
|
||||||
body {
|
html {
|
||||||
background-color: #1d1f21;
|
background-color: #1d1f21;
|
||||||
color: #fafafe;
|
color: #fafafe;
|
||||||
}
|
}
|
||||||
@ -74,12 +72,6 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="links">
|
<div class="links">
|
||||||
<a href="/notes">
|
|
||||||
<section>
|
|
||||||
<h2>Notes</h2>
|
|
||||||
<p>Some publicly-visible notes from a sort of knowledge graph that I use as information dump.</p>
|
|
||||||
</section>
|
|
||||||
</a>
|
|
||||||
<section>
|
<section>
|
||||||
<h2><a href="/blog">Blog</a></h2>
|
<h2><a href="/blog">Blog</a></h2>
|
||||||
<p>
|
<p>
|
||||||
@ -108,24 +100,12 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<a href="/notes">
|
||||||
<h2>Talks / Slides</h2>
|
<section>
|
||||||
<p>
|
<h2>Notes</h2>
|
||||||
<ul>
|
<p>Some publicly-visible notes from a sort of knowledge graph that I use as information dump.</p>
|
||||||
<li>
|
</section>
|
||||||
Malleable Software
|
</a>
|
||||||
(<a href="/slides/hackliza2024/software-maleable/software-maleable.odp">galician, </a>
|
|
||||||
for <a href="https://hackliza.gal">Hackliza</a>
|
|
||||||
<a href="/slides/hackliza2024/software-maleable/software-maleable.pdf">[PDF]</a>
|
|
||||||
<a href="/slides/hackliza2024/software-maleable/software-maleable.odp">[ODP]</a>)
|
|
||||||
(<a href="/slides/eslibre2024/software-maleable.odp">spanish,</a>
|
|
||||||
for <a href="https://eslib.re/2024/">esLibre 2024</a>
|
|
||||||
<a href="/slides/eslibre2024/software-maleable.pdf">[PDF]</a>
|
|
||||||
<a href="/slides/eslibre2024/software-maleable.odp">[ODP]</a>).
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</p>
|
|
||||||
</section>
|
|
||||||
<!-- section>
|
<!-- section>
|
||||||
<h2>Projects</h2>
|
<h2>Projects</h2>
|
||||||
<p>
|
<p>
|
||||||
@ -136,7 +116,7 @@
|
|||||||
<section id="social">
|
<section id="social">
|
||||||
<h2>Find me</h2>
|
<h2>Find me</h2>
|
||||||
<p>
|
<p>
|
||||||
<a href="https://social.codigoparallevar.com/@kenkeiras">ActivityPub</a>
|
<a href="https://social.codigoparallevar.com/@kenkeiras">Mastodon</a>
|
||||||
<a href="https://github.com/kenkeiras">GitHub</a>
|
<a href="https://github.com/kenkeiras">GitHub</a>
|
||||||
<a href="https://gitlab.com/kenkeiras">GitLab</a>
|
<a href="https://gitlab.com/kenkeiras">GitLab</a>
|
||||||
<a href="https://programaker.com/users/kenkeiras">PrograMaker</a>
|
<a href="https://programaker.com/users/kenkeiras">PrograMaker</a>
|
||||||
|
@ -10,8 +10,6 @@ body {
|
|||||||
max-width: 80ex;
|
max-width: 80ex;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
padding: 0.5ex 1ex;
|
padding: 0.5ex 1ex;
|
||||||
background-color: white;
|
|
||||||
color: black;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
body.blog {
|
body.blog {
|
||||||
@ -334,11 +332,6 @@ h1.title .state.todo-True {
|
|||||||
h1.title .state.todo-False {
|
h1.title .state.todo-False {
|
||||||
background-color: rgba(0,255,0,0.25);
|
background-color: rgba(0,255,0,0.25);
|
||||||
}
|
}
|
||||||
h1.title .state.todo-True.state-SOMETIME {
|
|
||||||
background-color: #ddd;
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
h1.title .tags {
|
h1.title .tags {
|
||||||
float: right;
|
float: right;
|
||||||
@ -375,7 +368,6 @@ a.internal::after {
|
|||||||
}
|
}
|
||||||
a.external::after {
|
a.external::after {
|
||||||
content: ' ↗';
|
content: ' ↗';
|
||||||
vertical-align: top;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Markup */
|
/* Markup */
|
||||||
@ -588,7 +580,7 @@ tr.__table-separator {
|
|||||||
|
|
||||||
/* Dark mode. */
|
/* Dark mode. */
|
||||||
@media (prefers-color-scheme: dark) {
|
@media (prefers-color-scheme: dark) {
|
||||||
html, body {
|
html {
|
||||||
background-color: #1d1f21;
|
background-color: #1d1f21;
|
||||||
color: #fafafe;
|
color: #fafafe;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user