Added templating for render

This commit is contained in:
Tris Forster 2026-07-08 12:25:22 +10:00
parent 44549aaff3
commit af14c80803
5 changed files with 75 additions and 18 deletions

View File

@ -1,6 +1,6 @@
from pyn.common import parser, logger
from pyn.config import Config
from pyn import notes
from pyn import notes, templating
import sys
import os
@ -57,7 +57,7 @@ def cmd_del_note(config: Config, title: str, notebook: str, yes: bool) -> None:
del_note = group.add_parser("delete", aliases=["del"])
del_note.add_argument("--notebook", "-n", help="add to this notebook [general]")
del_note.add_argument("--yes", action="store_true", help="dont prompt for confirmation")
del_note.add_argument("title", help="title for note", nargs="?")
del_note.add_argument("title", help="title for note", nargs="*")
del_note.set_defaults(func=cmd_del_note)
### List notes
@ -89,7 +89,7 @@ def cmd_edit_note(config, title, notebook: str) -> None:
edit_note = group.add_parser("edit", aliases=["e"])
edit_note.add_argument("title", help="note title", nargs="?")
edit_note.add_argument("title", help="note title", nargs="*")
edit_note.add_argument("--notebook", "-n", help="limit to this notebook")
edit_note.set_defaults(func=cmd_edit_note)
@ -102,28 +102,24 @@ def cmd_show_note(config, title, notebook: str) -> None:
show_note = group.add_parser("show", aliases=["s", "cat"])
show_note.add_argument("title", help="note title", nargs="?")
show_note.add_argument("title", help="note title", nargs="*")
show_note.add_argument("--notebook", "-n", help="limit to this notebook")
show_note.set_defaults(func=cmd_show_note)
def cmd_render_note(config, title, notebook: str) -> None:
filename = notes.search_filenames(config, title, notebook)
import markdown
import tempfile
import subprocess
import time
with open(filename, "r", encoding="utf-8") as input_file:
text = input_file.read()
html = markdown.markdown(text)
with tempfile.NamedTemporaryFile(suffix=".html", delete=True) as f:
f.write(html.encode('utf-8'))
subprocess.run(['firefox', '--new-tab', f"file://{f.name}"])
time.sleep(1)
html = templating.render_note(text, title=filename.stem)
print(html)
render_note = group.add_parser("render")
render_note.add_argument("title", help="note title", nargs="?")
render_note.add_argument("title", help="note title", nargs="*")
render_note.add_argument("--notebook", "-n", help="limit to this notebook")
render_note.set_defaults(func=cmd_render_note)

View File

@ -77,19 +77,25 @@ def get_file_list(
dirs[:] = [d for d in dirs if d[0] != "."]
for filename in files:
yield d / filename
if filename.endswith(".md"):
yield d.relative_to(root) / filename
def search_filenames(
config: Config, title: str, notebook: str | None = None
config: Config, title: str | list[str], notebook: str | None = None
) -> pathlib.Path:
root = config.directory / notebook if notebook else config.directory
files = "\n".join((str(x) for x in get_file_list(config, notebook)))
if isinstance(title, list):
title = " ".join(title)
cmd = ["fzf", "-1", "-i"]
if title:
cmd.extend(["-q", title])
try:
output = subprocess.check_output(cmd, cwd=root)
output = subprocess.check_output(cmd, cwd=root, input=files.encode())
file_path = root / output.decode("utf-8").strip()
return file_path
except subprocess.CalledProcessError as e:

View File

@ -0,0 +1,43 @@
<!doctype html5>
<html>
<head>
<title>{{ title }}</title>
<style>
BODY {
font-family: Arial, Helvetica, sans-serif;
font-size: 10pt;
}
DIV.page {
margin: 20px;
}
HR {
color: #DDD;
}
H1, H2, H3 {
margin-bottom: 5px;
}
P {
margin-top: 2px;
margin-bottom: 2px;
}
H1 {
font-size: 16pt;
}
H2 {
font-size: 14pt;
}
H3 {
font-size: 12pt;
}
DIV.page P:first-of-type {
color: #999;
text-align: right;
}
</style>
</head>
<body>
<div class="page">
{{ content|safe }}
</div>
</body>
</html>

11
pyn/templating.py Normal file
View File

@ -0,0 +1,11 @@
from jinja2 import Environment, PackageLoader, select_autoescape
import markdown
env = Environment(loader=PackageLoader("pyn"), autoescape=select_autoescape())
def render_note(note: str, title: str = "") -> str:
content = markdown.markdown(note)
template = env.get_template("render_note.html")
return template.render(content=content, title=title)

View File

@ -8,7 +8,8 @@ authors = [
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"markdown (>=3.10.1,<4.0.0)"
"markdown (>=3.10.1,<4.0.0)",
"jinja2 (>=3.1.6,<4.0.0)"
]
[project.scripts]