From 1c81d6fcd4e2e5a0c5cc18f15768f7267024123b Mon Sep 17 00:00:00 2001 From: John Doty Date: Fri, 22 Nov 2024 12:53:39 -0800 Subject: [PATCH] Use dominate --- cry/web.py | 73 +++++++++++++++++++++----------------------------- pdm.lock | 23 +++++++++++++--- pyproject.toml | 6 ++++- 3 files changed, 56 insertions(+), 46 deletions(-) diff --git a/cry/web.py b/cry/web.py index c2f265b..aaff074 100644 --- a/cry/web.py +++ b/cry/web.py @@ -1,8 +1,8 @@ import asyncio import contextlib import dataclasses +import dominate.tags as d import functools -import html import http.server import io import pathlib @@ -497,48 +497,37 @@ class Handler(http.server.BaseHTTPRequestHandler): feeds.sort(key=feed.sort_key, reverse=True) - buffer = io.StringIO() - buffer.write( - """ - - - - Subscribed Feeds - - -

Feeds

-
-
- -
-
- - - -
-
- """ - ) - for f in feeds: - feed_title = html.escape(f.title) - buffer.write(f"
") - buffer.write( - f'

{feed_title}

' - ) - if len(f.entries) > 0: - buffer.write(f"") - else: - buffer.write("No entries...") - buffer.write(f"
") # feed - buffer.flush() + document = d.html() + with document: + with d.head(): + d.meta(charset="utf8") + d.title("Subscribed Feeds") + d.link(rel="stylesheet", href="/style.css", type="text/css") + d.h1("Feeds") + with d.div(): + with d.form(method="post", action="/refresh"): + d.input_(type="submit", value="Refresh") + with d.form(method="post", action="/subscribe"): + d.label("Feed url:", fr="url") + d.input_(type="url", name="url") + d.input_(type="submit", value="Subscribe") - self.write_html(buffer.getvalue()) + for f in feeds: + with d.div(cls="feed"): + d.h2(d.a(f.title, href=f.link, target="_blank")) + if len(f.entries) > 0: + d.ul( + d.li( + d.a(entry.title, href=entry.link, target="_blank"), + f" ({entry.time_ago()})", + cls="entry", + ) + for entry in f.entries + ) + else: + d.i("No entries...") + + self.write_html(document.render()) def serve_subscribe_choose(self): try: diff --git a/pdm.lock b/pdm.lock index 7be8462..12f16dc 100644 --- a/pdm.lock +++ b/pdm.lock @@ -3,9 +3,12 @@ [metadata] groups = ["default", "test"] -strategy = ["cross_platform", "inherit_metadata"] -lock_version = "4.4.2" -content_hash = "sha256:0bb8351861012d463ce318bf45ed26567c8e4e69b76fbda2a01ffa9492d77653" +strategy = ["inherit_metadata"] +lock_version = "4.5.0" +content_hash = "sha256:600f614700867fb12dfa95f2cd65b2339a6b17aaaede34b3adf9770e8f5d8011" + +[[metadata.targets]] +requires_python = "==3.12.*" [[package]] name = "certifi" @@ -52,6 +55,7 @@ summary = "Composable command line interface toolkit" groups = ["default"] dependencies = [ "colorama; platform_system == \"Windows\"", + "importlib-metadata; python_version < \"3.8\"", ] files = [ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, @@ -70,6 +74,17 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "dominate" +version = "2.9.1" +requires_python = ">=3.4" +summary = "Dominate is a Python library for creating and manipulating HTML documents using an elegant DOM API." +groups = ["default"] +files = [ + {file = "dominate-2.9.1-py2.py3-none-any.whl", hash = "sha256:cb7b6b79d33b15ae0a6e87856b984879927c7c2ebb29522df4c75b28ffd9b989"}, + {file = "dominate-2.9.1.tar.gz", hash = "sha256:558284687d9b8aae1904e3d6051ad132dd4a8c0cf551b37ea4e7e42a31d19dc4"}, +] + [[package]] name = "feedparser" version = "6.0.11" @@ -147,9 +162,11 @@ summary = "pytest: simple powerful testing with Python" groups = ["test"] dependencies = [ "colorama; sys_platform == \"win32\"", + "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", "iniconfig", "packaging", "pluggy<2.0,>=1.5", + "tomli>=1; python_version < \"3.11\"", ] files = [ {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, diff --git a/pyproject.toml b/pyproject.toml index c27dca8..eb0cefe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,6 +18,7 @@ dependencies = [ "platformdirs>=4.2.2", "requests>=2.32.3", "click>=8.1.7", + "dominate>=2.9.1", ] [project.urls] @@ -26,7 +27,10 @@ Changelog = "https://github.com/decarabas/cry/releases" Issues = "https://github.com/decarabas/cry/issues" CI = "https://github.com/decarabas/cry/actions" -[project.entry-points.console_scripts] +[project.scripts] +cry = "cry.cli:cli" + +[project.entry_points.console_scripts] cry = "cry.cli:cli" [project.optional-dependencies]