Move web stuff out of line

This commit is contained in:
John Doty 2024-07-19 08:22:03 -07:00
parent 463abcb923
commit 1152ec3e36
2 changed files with 74 additions and 59 deletions

View file

@ -1,8 +1,5 @@
# https://simonwillison.net/2023/Sep/30/cli-tools-python/ # https://simonwillison.net/2023/Sep/30/cli-tools-python/
import asyncio import asyncio
import html
import http.server
import io
import logging import logging
import click import click
@ -11,6 +8,7 @@ from . import feed
from . import feedfinder from . import feedfinder
from . import database from . import database
from . import opml from . import opml
from . import web
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -249,59 +247,4 @@ def unsubscribe(url):
@cli.command("serve") @cli.command("serve")
def serve(): def serve():
class Handler(http.server.BaseHTTPRequestHandler): web.serve()
def do_GET(self):
db = database.Database.local()
feeds = db.load_all(feed_limit=10)
del db
feeds.sort(key=feed.sort_key, reverse=True)
buffer = io.StringIO()
buffer.write(
"""
<!doctype html>
<head>
<meta charset="utf8">
<title>Subscribed Feeds</title>
<style>
body { margin-left: 4rem; }
li.entry { display: inline; padding-right: 1rem; }
li.entry:before { content: '\\2022'; padding-right: 0.5rem; }
</style>
</head>
<h1>Feeds</h1>
"""
)
for f in feeds:
feed_title = html.escape(f.title)
if len(f.entries) > 0:
ago = f" ({f.entries[0].time_ago()})"
else:
ago = ""
buffer.write(f"<div class='feed'>")
buffer.write(f'<h2><a href="{f.link}">{feed_title}</a>{ago}</h2>')
if len(f.entries) > 0:
buffer.write(f"<ul>")
for entry in f.entries:
title = html.escape(entry.title)
buffer.write(
f'<li class="entry"><a href="{entry.link}">{title}</a> ({entry.time_ago()})</li>'
)
buffer.write(f"</ul>")
else:
buffer.write("<i>No entries...</i>")
buffer.write(f"</div>") # feed
buffer.flush()
text = buffer.getvalue()
response = text.encode("utf-8")
self.send_response(200)
self.send_header("content-type", "text/html")
self.send_header("content-length", str(len(response)))
self.end_headers()
self.wfile.write(response)
with http.server.HTTPServer(("", 8000), Handler) as server:
click.echo("Serving at http://127.0.0.1:8000/")
server.serve_forever()

72
cry/web.py Normal file
View file

@ -0,0 +1,72 @@
import html
import http.server
import io
from . import database
from . import feed
class Handler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
if self.path == "/":
return self.serve_feeds()
else:
self.send_response_only(404)
def serve_feeds(self):
db = database.Database.local()
feeds = db.load_all(feed_limit=10)
del db
feeds.sort(key=feed.sort_key, reverse=True)
buffer = io.StringIO()
buffer.write(
"""
<!doctype html>
<head>
<meta charset="utf8">
<title>Subscribed Feeds</title>
<style>
body { margin-left: 4rem; margin-right: 4rem; }
li.entry { display: inline; padding-right: 1rem; }
li.entry:before { content: '\\2022'; padding-right: 0.5rem; }
</style>
</head>
<h1>Feeds</h1>
"""
)
for f in feeds:
feed_title = html.escape(f.title)
if len(f.entries) > 0:
ago = f" ({f.entries[0].time_ago()})"
else:
ago = ""
buffer.write(f"<div class='feed'>")
buffer.write(f'<h2><a href="{f.link}">{feed_title}</a>{ago}</h2>')
if len(f.entries) > 0:
buffer.write(f"<ul>")
for entry in f.entries:
title = html.escape(entry.title)
buffer.write(
f'<li class="entry"><a href="{entry.link}">{title}</a> ({entry.time_ago()})</li>'
)
buffer.write(f"</ul>")
else:
buffer.write("<i>No entries...</i>")
buffer.write(f"</div>") # feed
buffer.flush()
text = buffer.getvalue()
response = text.encode("utf-8")
self.send_response(200)
self.send_header("content-type", "text/html")
self.send_header("content-length", str(len(response)))
self.end_headers()
self.wfile.write(response)
def serve():
with http.server.HTTPServer(("", 8000), Handler) as server:
print("Serving at http://127.0.0.1:8000/")
server.serve_forever()