break down functions into smaller blocks

This commit is contained in:
stev 2023-09-20 22:21:12 +02:00
parent 961e9bc1e3
commit e3b5feb09b
2 changed files with 92 additions and 53 deletions

View file

@ -22,25 +22,32 @@ def gen_gmi():
make_footer(GMI_FOOTER, DIR_SOURCE) make_footer(GMI_FOOTER, DIR_SOURCE)
logging.info(" Done!") logging.info(" Done!")
def make_index(listing: list[Path]): def make_index(list_files: list[Path]):
logging.info(" Populating gemlog index ...") logging.info(" Populating gemlog index ...")
title, date = "", "" gmi_files = (DIR_SOURCE / "gemlog").rglob(r'*.gmi')
files = (DIR_SOURCE / "gemlog").rglob(r'*.gmi') gmi_files = [ \
files = [ \ file for file in gmi_files \
file for file in files \ if re.search(r'\d\d\d\d.*\.gmi', file.as_posix()) \
if re.search(r'\d\d\d\d.*\.gmi', file.as_posix()) \
] ]
articles = "" articles = create_articles_index(gmi_files)
for file in files[::-1]: write_index_to_files(list_files, articles)
def create_articles_index(gmi_files: list[Path]):
articles = []
for file in gmi_files[::-1]:
title, date = find_title_date(file) title, date = find_title_date(file)
logging.info(f" \u2713 {date} {title.strip()}") logging.info(f" \u2713 {date} {title.strip()}")
articles += f"=> /gemlog/{file.stem}.gmi {date} - {title}" articles.append(f"=> /gemlog/{file.stem}.gmi {date} - {title}")
return ''.join(articles)
for path in listing: def write_index_to_files(list_files: list, articles: str):
separator = "## logs\n"
size = len(separator)
for path in list_files:
with open(path, "r+") as file: with open(path, "r+") as file:
line = file.readline(9) line = file.readline(size)
while line != "## logs\n": while line != separator:
line = file.readline(9) line = file.readline(size)
file.seek(0, 1) file.seek(0, 1)
if not path.match(r"gemlog/index.gmi"): if not path.match(r"gemlog/index.gmi"):
file.write("=> /gemlog/index.gmi all gemlogs here\n") file.write("=> /gemlog/index.gmi all gemlogs here\n")
@ -93,48 +100,66 @@ def gmi2html(file: str):
with open(file, 'r') as gemlog: with open(file, 'r') as gemlog:
contents, title = process_file(gemlog) contents, title = process_file(gemlog)
with open(DIR_HELPER / "header-part.html", "r") as header_file: with open(DIR_HELPER / "header-part.html", "r") as header_file:
header_content = header_file.read() header = header_file.read()
header_content = re.sub("PAGETITLE", f"{title}", header_content) header = re.sub("PAGETITLE", f"{title}", header)
with open(DIR_HELPER / "footer-part.html", "r") as footer_file: with open(DIR_HELPER / "footer-part.html", "r") as footer_file:
footer_content = footer_file.read() footer = footer_file.read()
with open(new_file_path, "w") as new_file: with open(new_file_path, "w") as new_file:
new_file.write(header_content) new_file.write(header)
new_file.write(contents) new_file.write(contents)
new_file.write(footer_content) new_file.write(footer)
def process_file(ifile: TextIOWrapper): def process_file(ifile: TextIOWrapper):
in_preformated = False in_preformated = False
in_list = False in_list = False
contents = "" contents = []
title = "" title = ""
for line in ifile: for line in ifile:
if line == "---\n": if line == "---\n":
break break
elif line[:2] == "# ": elif not title and line[:2] == "# ":
title = line[2:-1] title = line[2:-1]
newline = line newline = line
if in_preformated: newline, in_preformated, skip = process_preformated(newline, in_preformated)
newline, n = re.subn(r'^```.*', "</pre>", newline) if skip:
in_preformated = False if n else True contents.append(newline)
contents += newline.lstrip()
continue continue
else:
newline, n = re.subn(r'^```.*', "<pre>", newline)
if n:
in_preformated = True
continue
if re.match(r'^[a-zA-Z]', newline):
newline = "<p>" + newline.strip() + "</p>\n"
newline, in_list = process_list(newline, in_list) newline, in_list = process_list(newline, in_list)
newline = re.sub(r'^=> (?P<url>[^ ]*) ?(?P<text>.*)\n', repl_url, newline) newline = make_paragraph(newline)
newline = re.sub(r'^(#+) (.*)', repl_heading, newline) newline = process_url(newline)
newline = process_heading(newline)
newline = process_inline(newline) newline = process_inline(newline)
contents += newline contents.append(newline)
return contents, title return ''.join(contents), title
def process_url(line: str):
return re.sub(r'^=> (?P<url>[^ ]*) ?(?P<text>.*)\n', _repl_url, line)
def process_heading(line: str):
return re.sub(r'^(#+) (.*)', _repl_heading, line)
def process_preformated(line: str, in_preformated: bool):
skip = False
if in_preformated:
newline, n = re.subn(r'^```.*', "</pre>", line)
in_preformated = False if n else True
skip = True
newline = newline.lstrip()
else:
newline, n = re.subn(r'^```.*', "<pre>", line)
if n:
in_preformated = True
skip = True
return newline, in_preformated, skip
def make_paragraph(line: str):
if re.match(r'(^[a-zA-Z]|^\*\w|^~)', line):
line = "<p>" + line.strip() + "</p>\n"
return line
def process_list(line: str, in_list: bool): def process_list(line: str, in_list: bool):
try: try:
@ -160,13 +185,13 @@ def process_inline(line: str):
line = re.sub(pattern, repl, line) line = re.sub(pattern, repl, line)
return line return line
def repl_url(matchobj: re.Match): def _repl_url(matchobj: re.Match):
url, text = matchobj.groupdict().values() url, text = matchobj.groupdict().values()
if not re.findall(r'(http|gemini)', url): if not re.findall(r'(http|gemini)', url):
url = re.sub(r'gmi$', r'html', url) url = re.sub(r'gmi$', r'html', url)
return f'<a href="{url}">=> {text if text else url}</a><br>\n' return f'<a href="{url}">=> {text if text else url}</a><br>\n'
def repl_heading(matchobj: re.Match): def _repl_heading(matchobj: re.Match):
x = len(matchobj.group(1)) x = len(matchobj.group(1))
return f"<h{x}>{matchobj.string.strip()}</h{x}>" return f"<h{x}>{matchobj.string.strip()}</h{x}>"

View file

@ -1,16 +1,24 @@
import re
from gmirator.generate import ( from gmirator.generate import (
process_file, make_paragraph,
process_heading,
process_list, process_list,
process_inline, process_inline,
repl_url, process_url
repl_heading
) )
############################
### generate gmi section ###
############################
def test_process_file(): def test_make_footer():
pass pass
def test_find_title_date():
pass
#############################
### generate html section ###
#############################
def test_process_list_legit_item(): def test_process_list_legit_item():
test_str = "* this is a list item" test_str = "* this is a list item"
assert process_list(test_str, True) == (f"<li>{test_str[2:]}</li>", True) assert process_list(test_str, True) == (f"<li>{test_str[2:]}</li>", True)
@ -31,28 +39,34 @@ def test_process_list_empty_line():
def test_process_inline(): def test_process_inline():
assert process_inline("*Hello* ~~world~~!") == "<em>Hello</em> <s>world</s>!" assert process_inline("*Hello* ~~world~~!") == "<em>Hello</em> <s>world</s>!"
def test_repl_url_external_gmi_url(): def test_process_url_external_gmi_url():
external_url = "=> gemini://domain/gempage.gmi\n" external_url = "=> gemini://domain/gempage.gmi\n"
new_url = re.sub(r'^=> (?P<url>[^ ]*) ?(?P<text>.*)\n', repl_url, external_url) new_url = process_url(external_url)
assert new_url == '<a href="gemini://domain/gempage.gmi">=> gemini://domain/gempage.gmi</a><br>\n' assert new_url == '<a href="gemini://domain/gempage.gmi">=> gemini://domain/gempage.gmi</a><br>\n'
def test_repl_url_internal_gmi_url(): def test_process_url_internal_gmi_url():
external_url = "=> /gempage.gmi title\n" internal_url = "=> /gempage.gmi title\n"
new_url = re.sub(r'^=> (?P<url>[^ ]*) ?(?P<text>.*)\n', repl_url, external_url) new_url = process_url(internal_url)
assert new_url == '<a href="/gempage.html">=> title</a><br>\n' assert new_url == '<a href="/gempage.html">=> title</a><br>\n'
def test_repl_heading(): def test_process_heading():
line = "# this is h1 title" line = "# this is h1 title"
html_h1 = re.sub(r'^(#+) (.*)', repl_heading, line) html_h1 = process_heading(line)
line = "## this is h2 title" line = "## this is h2 title"
html_h2 = re.sub(r'^(#+) (.*)', repl_heading, line) html_h2 = process_heading(line)
line = "### this is h3 title" line = "### this is h3 title"
html_h3 = re.sub(r'^(#+) (.*)', repl_heading, line) html_h3 = process_heading(line)
assert html_h1 == "<h1># this is h1 title</h1>" assert html_h1 == "<h1># this is h1 title</h1>"
assert html_h2 == "<h2>## this is h2 title</h2>" assert html_h2 == "<h2>## this is h2 title</h2>"
assert html_h3 == "<h3>### this is h3 title</h3>" assert html_h3 == "<h3>### this is h3 title</h3>"
def test_repl_heading_h4(): def test_process_heading_h4():
line = "#### this is h4 title" line = "#### this is h4 title"
html_h4 = re.sub(r'^(#+) (.*)', repl_heading, line) html_h4 = process_heading(line)
assert html_h4 == "<h4>#### this is h4 title</h4>" assert html_h4 == "<h4>#### this is h4 title</h4>"
def test_make_paragraph():
line = "hello world!"
assert make_paragraph(line) == "<p>hello world!</p>\n"
line = "*hello world!*"
assert make_paragraph(line) == "<p>*hello world!*</p>\n"