public dir
This commit is contained in:
parent
4199667148
commit
635a607a03
10 changed files with 81 additions and 67 deletions
17
.build.yml
17
.build.yml
|
@ -1,17 +0,0 @@
|
||||||
---
|
|
||||||
image: alpine/edge
|
|
||||||
oauth: pages.sr.ht/PAGES:RW
|
|
||||||
packages:
|
|
||||||
- hut
|
|
||||||
- python3
|
|
||||||
- py3-markdown
|
|
||||||
environment:
|
|
||||||
site: cfebs.srht.site
|
|
||||||
dest: cfebs.com
|
|
||||||
tasks:
|
|
||||||
- package: |
|
|
||||||
cd $site
|
|
||||||
python3 ./main.py
|
|
||||||
tar -cvz . > ../site.tar.gz
|
|
||||||
- upload: |
|
|
||||||
hut pages publish -d $dest site.tar.gz
|
|
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -1,4 +1,7 @@
|
||||||
index.html
|
index.html
|
||||||
posts/*.html
|
posts/*.html
|
||||||
index.xml
|
index.xml
|
||||||
|
public/posts/*.html
|
||||||
|
public/*.html
|
||||||
|
public/*.xml
|
||||||
__pycache__/
|
__pycache__/
|
||||||
|
|
119
main.py
119
main.py
|
@ -11,18 +11,20 @@ from string import Template
|
||||||
import markdown
|
import markdown
|
||||||
from markdown.extensions.toc import TocExtension
|
from markdown.extensions.toc import TocExtension
|
||||||
|
|
||||||
destpath_re = re.compile(r'\.md$')
|
destpath_re = re.compile(r"\.md$")
|
||||||
logging.basicConfig(encoding='utf-8', level=logging.INFO)
|
logging.basicConfig(encoding="utf-8", level=logging.INFO)
|
||||||
|
|
||||||
cpu_count = os.cpu_count()
|
cpu_count = os.cpu_count()
|
||||||
|
|
||||||
|
|
||||||
def convert(text):
|
def convert(text):
|
||||||
md = markdown.Markdown(extensions=['extra', 'meta', TocExtension(anchorlink=True)])
|
md = markdown.Markdown(extensions=["extra", "meta", TocExtension(anchorlink=True)])
|
||||||
res = md.convert(text)
|
res = md.convert(text)
|
||||||
return res, md.Meta
|
return res, md.Meta
|
||||||
|
|
||||||
|
|
||||||
def render_post(fpath):
|
def render_post(fpath):
|
||||||
destpath = destpath_re.sub('.html', fpath)
|
destpath = destpath_re.sub(".html", fpath)
|
||||||
logging.info("opening %s for parsing, dest %s", fpath, destpath)
|
logging.info("opening %s for parsing, dest %s", fpath, destpath)
|
||||||
# from: https://python-markdown.github.io/reference/
|
# from: https://python-markdown.github.io/reference/
|
||||||
with open(fpath, "r", encoding="utf-8") as input_file:
|
with open(fpath, "r", encoding="utf-8") as input_file:
|
||||||
|
@ -32,37 +34,41 @@ def render_post(fpath):
|
||||||
logging.info("parsing %s", fpath)
|
logging.info("parsing %s", fpath)
|
||||||
out, meta = convert(text)
|
out, meta = convert(text)
|
||||||
|
|
||||||
title = meta.get('title')[0]
|
title = meta.get("title")[0]
|
||||||
date = meta.get('date')[0]
|
date = meta.get("date")[0]
|
||||||
draft = False
|
draft = False
|
||||||
if meta.get('draft'):
|
if meta.get("draft"):
|
||||||
draft = True
|
draft = True
|
||||||
|
|
||||||
title_out, _ = convert('# ' + title)
|
title_out, _ = convert("# " + title)
|
||||||
out = title_out + out
|
out = title_out + out
|
||||||
|
|
||||||
logging.info("writing to %s", destpath)
|
logging.info("writing to %s", destpath)
|
||||||
render_template('index.html.tmpl', destpath, {'content': out, 'more_title': ' - ' + title})
|
render_template(
|
||||||
|
"index.html.tmpl", destpath, {"content": out, "more_title": " - " + title}
|
||||||
|
)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'title': title,
|
"title": title,
|
||||||
'date': date,
|
"date": date,
|
||||||
'fpath': fpath,
|
"fpath": fpath,
|
||||||
'destpath': destpath,
|
"destpath": destpath,
|
||||||
'draft': draft,
|
"draft": draft,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def render_posts():
|
def render_posts():
|
||||||
files = glob.glob('posts/*.md')
|
files = glob.glob("posts/*.md")
|
||||||
logging.info('found post files %s', files)
|
logging.info("found post files %s", files)
|
||||||
posts = []
|
posts = []
|
||||||
logging.info('starting render posts with cpu_count: %d', cpu_count)
|
logging.info("starting render posts with cpu_count: %d", cpu_count)
|
||||||
with Pool(processes=cpu_count) as pool:
|
with Pool(processes=cpu_count) as pool:
|
||||||
posts = pool.map(render_post, files)
|
posts = pool.map(render_post, files)
|
||||||
|
|
||||||
logging.info("render_posts result: %s", posts)
|
logging.info("render_posts result: %s", posts)
|
||||||
return posts
|
return posts
|
||||||
|
|
||||||
|
|
||||||
def posts_list_html(posts):
|
def posts_list_html(posts):
|
||||||
post_tpl = """<li>
|
post_tpl = """<li>
|
||||||
<a href="{href}">{title}</a>
|
<a href="{href}">{title}</a>
|
||||||
|
@ -70,25 +76,36 @@ def posts_list_html(posts):
|
||||||
</li>"""
|
</li>"""
|
||||||
out = '<ul class="blog-posts-list">'
|
out = '<ul class="blog-posts-list">'
|
||||||
for post in posts:
|
for post in posts:
|
||||||
disp_date = datetime.datetime.fromisoformat(post.get('date')).strftime('%Y-%m-%d')
|
disp_date = datetime.datetime.fromisoformat(post.get("date")).strftime(
|
||||||
out += post_tpl.format(href=post.get('destpath'),
|
"%Y-%m-%d"
|
||||||
title=post.get('title'),
|
)
|
||||||
date=post.get('date'),
|
out += post_tpl.format(
|
||||||
disp_date=disp_date)
|
href=post.get("destpath"),
|
||||||
return out + '</ul>'
|
title=post.get("title"),
|
||||||
|
date=post.get("date"),
|
||||||
|
disp_date=disp_date,
|
||||||
|
)
|
||||||
|
return out + "</ul>"
|
||||||
|
|
||||||
|
|
||||||
def render_template(tpl_fname, out_fname, subs):
|
def render_template(tpl_fname, out_fname, subs):
|
||||||
with open(tpl_fname, 'r', encoding='utf-8') as inf:
|
with open(tpl_fname, "r", encoding="utf-8") as inf:
|
||||||
tmpl = Template(inf.read())
|
tmpl = Template(inf.read())
|
||||||
|
|
||||||
out = tmpl.substitute(subs)
|
out = tmpl.substitute(subs)
|
||||||
|
|
||||||
with open(out_fname, 'w', encoding='utf-8') as outf:
|
out_fname = os.path.join("public/", out_fname)
|
||||||
|
|
||||||
|
with open(out_fname, "w", encoding="utf-8") as outf:
|
||||||
outf.write(out)
|
outf.write(out)
|
||||||
|
|
||||||
|
|
||||||
def render_index(posts):
|
def render_index(posts):
|
||||||
content_html = posts_list_html(posts)
|
content_html = posts_list_html(posts)
|
||||||
render_template('index.html.tmpl', 'index.html', {'content': content_html, 'more_title': ''})
|
render_template(
|
||||||
|
"index.html.tmpl", "index.html", {"content": content_html, "more_title": ""}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def rss_post_xml(post):
|
def rss_post_xml(post):
|
||||||
tpl = """
|
tpl = """
|
||||||
|
@ -100,53 +117,57 @@ def rss_post_xml(post):
|
||||||
<description>{description}</description>
|
<description>{description}</description>
|
||||||
</item>
|
</item>
|
||||||
"""
|
"""
|
||||||
link = "https://cfebs.com/" + post['destpath']
|
link = "https://cfebs.com/" + post["destpath"]
|
||||||
|
|
||||||
with open(post['fpath'], 'r', encoding='utf-8') as inf:
|
with open(post["fpath"], "r", encoding="utf-8") as inf:
|
||||||
text = inf.read()
|
text = inf.read()
|
||||||
|
|
||||||
|
|
||||||
converted, _ = convert(text)
|
converted, _ = convert(text)
|
||||||
|
|
||||||
pubdate = email.utils.format_datetime(datetime.datetime.fromisoformat(post['date']))
|
pubdate = email.utils.format_datetime(datetime.datetime.fromisoformat(post["date"]))
|
||||||
subs = {
|
subs = {
|
||||||
'title': post['title'],
|
"title": post["title"],
|
||||||
'link': link,
|
"link": link,
|
||||||
'pubdate': pubdate,
|
"pubdate": pubdate,
|
||||||
'description': converted
|
"description": converted,
|
||||||
}
|
}
|
||||||
|
|
||||||
for k,v in subs.items():
|
for k, v in subs.items():
|
||||||
subs[k] = html.escape(v)
|
subs[k] = html.escape(v)
|
||||||
|
|
||||||
return tpl.format(**subs)
|
return tpl.format(**subs)
|
||||||
|
|
||||||
|
|
||||||
def render_rss_index(posts):
|
def render_rss_index(posts):
|
||||||
items = ''
|
items = ""
|
||||||
for post in posts[:5]:
|
for post in posts[:5]:
|
||||||
items += rss_post_xml(post)
|
items += rss_post_xml(post)
|
||||||
|
|
||||||
subs = {
|
subs = {
|
||||||
'site_title': 'cfebs.com',
|
"site_title": "cfebs.com",
|
||||||
'site_link': 'https://cfebs.com',
|
"site_link": "https://cfebs.com",
|
||||||
'self_full_link': 'https://cfebs.com/index.xml',
|
"self_full_link": "https://cfebs.com/index.xml",
|
||||||
'description': 'Recent content from cfebs.com',
|
"description": "Recent content from cfebs.com",
|
||||||
'last_build_date': email.utils.format_datetime(datetime.datetime.now()),
|
"last_build_date": email.utils.format_datetime(datetime.datetime.now()),
|
||||||
}
|
}
|
||||||
for k,v in subs.items():
|
for k, v in subs.items():
|
||||||
subs[k] = html.escape(v)
|
subs[k] = html.escape(v)
|
||||||
|
|
||||||
subs['items'] = items
|
subs["items"] = items
|
||||||
render_template('index.xml.tmpl', 'index.xml', subs)
|
render_template("index.xml.tmpl", "index.xml", subs)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
os.makedirs("public/posts/", exist_ok=True)
|
||||||
posts = render_posts()
|
posts = render_posts()
|
||||||
logging.info('rendered posts: %s', posts)
|
logging.info("rendered posts: %s", posts)
|
||||||
posts = filter(lambda p: not p['draft'], posts)
|
posts = filter(lambda p: not p["draft"], posts)
|
||||||
sorted_posts = sorted(posts,
|
sorted_posts = sorted(
|
||||||
key=lambda p: datetime.datetime.fromisoformat(p['date']), reverse=True)
|
posts, key=lambda p: datetime.datetime.fromisoformat(p["date"]), reverse=True
|
||||||
|
)
|
||||||
render_index(sorted_posts)
|
render_index(sorted_posts)
|
||||||
render_rss_index(sorted_posts)
|
render_rss_index(sorted_posts)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
0
chalk.min.css → public/chalk.min.css
vendored
0
chalk.min.css → public/chalk.min.css
vendored
7
public/grayscale-dark.min.css
vendored
Normal file
7
public/grayscale-dark.min.css
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/*!
|
||||||
|
Theme: Grayscale Dark
|
||||||
|
Author: Alexandre Gavioli (https://github.com/Alexx2/)
|
||||||
|
License: ~ MIT (or more permissive) [via base16-schemes-source]
|
||||||
|
Maintainer: @highlightjs/core-team
|
||||||
|
Version: 2021.09.0
|
||||||
|
*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#b9b9b9;background:#101010}.hljs ::selection,.hljs::selection{background-color:#464646;color:#b9b9b9}.hljs-comment{color:#525252}.hljs-tag{color:#ababab}.hljs-operator,.hljs-punctuation,.hljs-subst{color:#b9b9b9}.hljs-operator{opacity:.7}.hljs-bullet,.hljs-deletion,.hljs-name,.hljs-selector-tag,.hljs-template-variable,.hljs-variable{color:#7c7c7c}.hljs-attr,.hljs-link,.hljs-literal,.hljs-number,.hljs-symbol,.hljs-variable.constant_{color:#999}.hljs-class .hljs-title,.hljs-title,.hljs-title.class_{color:#a0a0a0}.hljs-strong{font-weight:700;color:#a0a0a0}.hljs-addition,.hljs-code,.hljs-string,.hljs-title.class_.inherited__{color:#8e8e8e}.hljs-built_in,.hljs-doctag,.hljs-keyword.hljs-atrule,.hljs-quote,.hljs-regexp{color:#868686}.hljs-attribute,.hljs-function .hljs-title,.hljs-section,.hljs-title.function_,.ruby .hljs-property{color:#686868}.diff .hljs-meta,.hljs-keyword,.hljs-template-tag,.hljs-type{color:#747474}.hljs-emphasis{color:#747474;font-style:italic}.hljs-meta,.hljs-meta .hljs-keyword,.hljs-meta .hljs-string{color:#5e5e5e}.hljs-meta .hljs-keyword,.hljs-meta-keyword{font-weight:700}
|
0
highlight.min.js → public/highlight.min.js
vendored
0
highlight.min.js → public/highlight.min.js
vendored
Before Width: | Height: | Size: 673 KiB After Width: | Height: | Size: 673 KiB |
Loading…
Reference in a new issue