diff options
| author | tslil <tslil@posteo.de> | 2026-05-04 11:31:36 +0100 |
|---|---|---|
| committer | tslil <tslil@posteo.de> | 2026-05-04 11:31:52 +0100 |
| commit | 0d516a3a28a90af6aba02fe612e3cd79c5d05963 (patch) | |
| tree | dd905b3df5d196fe7be6bc24acd1b5b605f02ff1 | |
| parent | 8ef17e0185e07920ed9815c428981e605a08ee47 (diff) | |
note.py: simple webserver to serve note files
| -rwxr-xr-x | note.py | 73 |
1 files changed, 73 insertions, 0 deletions
@@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +import argparse +import re +from datetime import datetime +from pathlib import Path + +import bottle +from bottle import request, run + + +def latest_file(directory: Path) -> Path | None: + files = [p for p in directory.glob("*.md") if re.match(r"^\d{14}\.md$", p.name)] + return max(files, key=lambda p: p.stat().st_mtime) if files else None + + +def save(directory: Path, text: str) -> Path: + filename = f"{datetime.now():%Y%m%d%H%M%S}.md" + path = directory / filename + _ = path.write_text(text, encoding="utf-8") + return path + + +def make_page(directory: Path) -> str: + latest = latest_file(directory) + content = latest.read_text(encoding="utf-8") if latest else "" + filename = latest.name if latest else "(none)" + return f"""<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width, initial-scale=1"> +<title>notes</title> +<style> +body {{ max-width: 800px; margin: 2em auto; padding: 0 1em; font-family: system-ui, sans-serif; }} +.meta {{ color: #666; font-size: 0.85em; margin-bottom: 1em; }} +textarea {{ width: 100%; height: 75vh; font-family: monospace; font-size: 14px; padding: 0.5em; }} +button {{ padding: 0.4em 1.2em; margin-top: 0.5em; }} +</style> +</head> +<body> +<div class="meta">latest: {filename}</div> +<form method="POST" action="/save"> +<textarea name="text" spellcheck="true">{bottle.html_escape(content)}</textarea> +<br><button>save</button> +</form> +</body> +</html>""" + + +def main(): + parser = argparse.ArgumentParser(description="note server") + parser.add_argument("directory", type=Path, help="where to store .md files") + parser.add_argument("--host", default="127.0.0.1") + parser.add_argument("--port", type=int, default=8080) + args = parser.parse_args() + + args.directory.mkdir(parents=True, exist_ok=True) + + @bottle.route("/") + def index(): + return make_page(args.directory) + + @bottle.route("/save", method="POST") + def save_route(): + text = request.forms.get("text", "") + path = save(args.directory, text) + return make_page(args.directory) + + run(host=args.host, port=args.port) + + +if __name__ == "__main__": + main() |
