Compare commits
2 Commits
17287cfcb3
...
0577a56127
Author | SHA1 | Date | |
---|---|---|---|
|
0577a56127 | ||
|
bf09a8ffbb |
@ -7,11 +7,6 @@ read URL
|
|||||||
|
|
||||||
articles=$(curl -s "$URL/articles.txt")
|
articles=$(curl -s "$URL/articles.txt")
|
||||||
|
|
||||||
# list=''
|
|
||||||
# while IFS= read article; do
|
|
||||||
# list+="$article "
|
|
||||||
# done < <(printf '%s' "$articles")
|
|
||||||
|
|
||||||
while :
|
while :
|
||||||
do
|
do
|
||||||
article=$(./tools/widgets/list_selector.py --desc="Select an article:" --result="line" -- $articles)
|
article=$(./tools/widgets/list_selector.py --desc="Select an article:" --result="line" -- $articles)
|
||||||
|
32
config.py
Normal file
32
config.py
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
from random import choice
|
||||||
|
|
||||||
|
## Title of the blog
|
||||||
|
## Used for default first navbar entry to "/" root.
|
||||||
|
##
|
||||||
|
title = "mjestečko"
|
||||||
|
|
||||||
|
## Shows on top of every page providing navigation.
|
||||||
|
## Every entry forms a <li><a> child element of <nav>,
|
||||||
|
## where each dictionary pair forms an attached xml property.
|
||||||
|
##
|
||||||
|
navbar = [
|
||||||
|
("source", { "href": "https://git.poto.cafe/veclavtalica/mjestecko" }),
|
||||||
|
("rss", { "href": "/feed.xml" }),
|
||||||
|
("about", { "href": "/articles/mjestečko.html" }),
|
||||||
|
("tracks", { "href": "https://modarchive.org/index.php?request=view_artist_modules&query=96070" }),
|
||||||
|
("mastodon", { "href": "https://poto.cafe/@veclavtalica", "rel": "me" }),
|
||||||
|
]
|
||||||
|
|
||||||
|
## Optional description that will be shown on top of the main page.
|
||||||
|
## Could be plain text or callable with no parameters.
|
||||||
|
##
|
||||||
|
description = lambda: f"Personal blog of one {choice(adjectives)} Veclav Talica."
|
||||||
|
adjectives = ["*wild*", "**wacky**", "very humble", "**most serious**"]
|
||||||
|
|
||||||
|
## Optional link to logo image that will appear on top of the main page.
|
||||||
|
##
|
||||||
|
logo = "/logo.png"
|
||||||
|
|
||||||
|
## Language specifier, used in RSS feed.
|
||||||
|
##
|
||||||
|
language = "en"
|
@ -7,7 +7,8 @@ import time, urllib.parse, re
|
|||||||
import os.path as path
|
import os.path as path
|
||||||
|
|
||||||
from article_utils import the_line_after_metadata, parse_metadata
|
from article_utils import the_line_after_metadata, parse_metadata
|
||||||
from page_shares import wrap_page, MONTHS
|
from page_builder import wrap_page
|
||||||
|
from date_descriptions import MONTHS
|
||||||
|
|
||||||
if len(argv) <= 1:
|
if len(argv) <= 1:
|
||||||
print("No file was supplied")
|
print("No file was supplied")
|
||||||
|
1
tools/config.py
Symbolic link
1
tools/config.py
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../config.py
|
24
tools/date_descriptions.py
Normal file
24
tools/date_descriptions.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
MONTHS = {
|
||||||
|
1: "January",
|
||||||
|
2: "February",
|
||||||
|
3: "March",
|
||||||
|
4: "April",
|
||||||
|
5: "May",
|
||||||
|
6: "June",
|
||||||
|
7: "July",
|
||||||
|
8: "August",
|
||||||
|
9: "September",
|
||||||
|
10: "October",
|
||||||
|
11: "November",
|
||||||
|
12: "December"
|
||||||
|
}
|
||||||
|
|
||||||
|
WEEKDAYS = {
|
||||||
|
0: "Monday",
|
||||||
|
1: "Tuesday",
|
||||||
|
2: "Wednesday",
|
||||||
|
3: "Thursday",
|
||||||
|
4: "Friday",
|
||||||
|
5: "Saturday",
|
||||||
|
6: "Sunday"
|
||||||
|
}
|
@ -7,9 +7,10 @@ from textwrap import indent
|
|||||||
import time, urllib.parse, re, subprocess
|
import time, urllib.parse, re, subprocess
|
||||||
|
|
||||||
from article_utils import parse_metadata
|
from article_utils import parse_metadata
|
||||||
from page_shares import ADJECTIVES
|
|
||||||
from rfc822 import stringify_date
|
from rfc822 import stringify_date
|
||||||
|
|
||||||
|
import config
|
||||||
|
|
||||||
if len(argv) <= 1:
|
if len(argv) <= 1:
|
||||||
print("No directory was supplied")
|
print("No directory was supplied")
|
||||||
exit(-1)
|
exit(-1)
|
||||||
@ -25,10 +26,10 @@ address = argv[2]
|
|||||||
# todo: Find the latest pubDate
|
# todo: Find the latest pubDate
|
||||||
feed = f"""<rss version="2.0">
|
feed = f"""<rss version="2.0">
|
||||||
<channel>
|
<channel>
|
||||||
<title>mjestečko</title>
|
<title>{config.title}</title>
|
||||||
<link>{address}</link>
|
<link>{address}</link>
|
||||||
<description>Personal blog of one {choice(ADJECTIVES)} Veclav Talica</description>
|
<description>{config.description() if callable(config.description) else config.description}</description>
|
||||||
<language>en</language>
|
<language>{config.language}</language>
|
||||||
<lastBuildDate>{stringify_date(time.gmtime(int(time.time())))}</lastBuildDate>
|
<lastBuildDate>{stringify_date(time.gmtime(int(time.time())))}</lastBuildDate>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
from sys import argv, exit
|
from sys import argv, exit
|
||||||
from random import choice, seed
|
from random import seed
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from article_utils import parse_article_directory, sort_titles_by_date
|
from article_utils import parse_article_directory, sort_titles_by_date
|
||||||
from page_shares import wrap_page, ADJECTIVES, MONTHS
|
from page_builder import wrap_page
|
||||||
|
from date_descriptions import MONTHS
|
||||||
|
|
||||||
|
import config
|
||||||
|
|
||||||
if len(argv) <= 1:
|
if len(argv) <= 1:
|
||||||
print("No directory was supplied")
|
print("No directory was supplied")
|
||||||
@ -13,15 +16,15 @@ if len(argv) <= 1:
|
|||||||
|
|
||||||
seed()
|
seed()
|
||||||
|
|
||||||
page_metadata = """Title: mjestečko
|
page_metadata = f"""Title: {config.title}
|
||||||
CSS: /style.css
|
CSS: /style.css
|
||||||
HTML header: <meta name="viewport" content="width=device-width, initial-scale=1">
|
HTML header: <meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
page = f"""![](/logo.png)
|
page = f"""![]({config.logo})
|
||||||
|
|
||||||
Personal blog of one {choice(ADJECTIVES)} Veclav Talica.
|
{config.description() if callable(config.description) else config.description}
|
||||||
|
|
||||||
### Articles ###
|
### Articles ###
|
||||||
|
|
||||||
|
43
tools/page_builder.py
Normal file
43
tools/page_builder.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import config
|
||||||
|
|
||||||
|
_navbar = config.navbar.copy()
|
||||||
|
_navbar.insert(0, ('<strong>' + config.title + '</strong>', {"href": "/"}))
|
||||||
|
_navbar.append(("tags", {"href": "/tags.html"}))
|
||||||
|
|
||||||
|
_navbar_lis = '\n'.join(f"""<li><a {' '.join(
|
||||||
|
f'{p}="{v}"' for p, v in e[1].items())}>{e[0]}</a></li>"""
|
||||||
|
for e in _navbar)
|
||||||
|
|
||||||
|
_head = f"""
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<nav class="custom-nav">
|
||||||
|
<ul>
|
||||||
|
{_navbar_lis}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
_footer = """
|
||||||
|
<footer>
|
||||||
|
<a href="#top">^ Return</a>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
_tail = """
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def mixin_tag(content: str, tag: str) -> str:
|
||||||
|
return f"""<{tag}>
|
||||||
|
|
||||||
|
{content}</{tag}>
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def wrap_page(page: str) -> str:
|
||||||
|
return _head + mixin_tag(page, "main") + _footer + _tail
|
@ -1,67 +0,0 @@
|
|||||||
|
|
||||||
HEAD_EMBED = """
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
<nav class="custom-nav">
|
|
||||||
<ul>
|
|
||||||
<li><a href="/"><strong>mjestečko</strong></a></li>
|
|
||||||
<li><a href="https://git.poto.cafe/veclavtalica/mjestecko">source</a></li>
|
|
||||||
<li><a href="/feed.xml">rss</a></li>
|
|
||||||
<li><a href="/articles/mjestečko.html">about</a></li>
|
|
||||||
<li><a href="https://modarchive.org/index.php?request=view_artist_modules&query=96070">tracks</a></li>
|
|
||||||
<li><a rel="me" href="https://poto.cafe/@veclavtalica">mastodon</a></li>
|
|
||||||
<li><a href="/tags.html">tags</a></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
NOTICE = """
|
|
||||||
<footer>
|
|
||||||
<a href="#top">^ Return</a>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
TAIL_EMBED = """
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
ADJECTIVES = ["*wild*", "**wacky**", "very humble", "**most serious**"]
|
|
||||||
|
|
||||||
MONTHS = {
|
|
||||||
1: "January",
|
|
||||||
2: "February",
|
|
||||||
3: "March",
|
|
||||||
4: "April",
|
|
||||||
5: "May",
|
|
||||||
6: "June",
|
|
||||||
7: "July",
|
|
||||||
8: "August",
|
|
||||||
9: "September",
|
|
||||||
10: "October",
|
|
||||||
11: "November",
|
|
||||||
12: "December"
|
|
||||||
}
|
|
||||||
|
|
||||||
WEEKDAYS = {
|
|
||||||
0: "Monday",
|
|
||||||
1: "Tuesday",
|
|
||||||
2: "Wednesday",
|
|
||||||
3: "Thursday",
|
|
||||||
4: "Friday",
|
|
||||||
5: "Saturday",
|
|
||||||
6: "Sunday"
|
|
||||||
}
|
|
||||||
|
|
||||||
def mixin_tag(content: str, tag: str) -> str:
|
|
||||||
return f"""<{tag}>
|
|
||||||
|
|
||||||
{content}</{tag}>
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
def wrap_page(page: str) -> str:
|
|
||||||
return HEAD_EMBED + mixin_tag(page, "main") + NOTICE + TAIL_EMBED
|
|
@ -1,4 +1,4 @@
|
|||||||
from page_shares import MONTHS, WEEKDAYS
|
from date_descriptions import MONTHS, WEEKDAYS
|
||||||
|
|
||||||
def stringify_date(date) -> str:
|
def stringify_date(date) -> str:
|
||||||
return f"{WEEKDAYS[date.tm_wday][:3]}, {date.tm_mday} {MONTHS[date.tm_mon][:3]} {date.tm_year} {date.tm_hour:02d}:{date.tm_min:02d}:{date.tm_sec:02d} GMT"
|
return f"{WEEKDAYS[date.tm_wday][:3]}, {date.tm_mday} {MONTHS[date.tm_mon][:3]} {date.tm_year} {date.tm_hour:02d}:{date.tm_min:02d}:{date.tm_sec:02d} GMT"
|
||||||
|
@ -8,8 +8,9 @@ from os import walk
|
|||||||
import os.path as path
|
import os.path as path
|
||||||
|
|
||||||
from article_utils import the_line_after_metadata, parse_metadata
|
from article_utils import the_line_after_metadata, parse_metadata
|
||||||
from page_shares import wrap_page
|
from page_builder import wrap_page
|
||||||
|
|
||||||
|
# todo: Reuse
|
||||||
tag_listing_header = """CSS: /style.css
|
tag_listing_header = """CSS: /style.css
|
||||||
HTML header: <meta name="viewport" content="width=device-width, initial-scale=1">
|
HTML header: <meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import curses
|
import curses
|
||||||
import signal
|
import signal
|
||||||
import atexit
|
|
||||||
import os, sys
|
import os, sys
|
||||||
from sys import argv, exit
|
from sys import argv, exit
|
||||||
|
|
||||||
@ -8,9 +7,6 @@ def handler(signum, frame):
|
|||||||
curses.endwin()
|
curses.endwin()
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
# def exit_handler():
|
|
||||||
# curses.endwin()
|
|
||||||
|
|
||||||
init = None
|
init = None
|
||||||
driver = None
|
driver = None
|
||||||
|
|
||||||
@ -28,7 +24,6 @@ def curses_wrapper(screen):
|
|||||||
|
|
||||||
def widget_wrapper(p_init, p_driver):
|
def widget_wrapper(p_init, p_driver):
|
||||||
signal.signal(signal.SIGINT, handler)
|
signal.signal(signal.SIGINT, handler)
|
||||||
# atexit.register(exit_handler)
|
|
||||||
|
|
||||||
global init, driver
|
global init, driver
|
||||||
init = p_init
|
init = p_init
|
||||||
|
Loading…
Reference in New Issue
Block a user