From 5f27f8a16ebe2d6c29fb236176663a29a0e876e1 Mon Sep 17 00:00:00 2001 From: Carter McBride <18412686+carterworks@users.noreply.github.com> Date: Fri, 21 Jun 2024 16:05:49 -0600 Subject: [PATCH] Update the UI (#10) * Move the emoji * Convert to a grid layout * Ellipsize the feed urls * Add link to source on GitHub * Always be updating the relative time of the feed * Make "recent" within the last 8 hours * Sort the feeds alphabetically --- bun.lockb | Bin 70196 -> 69828 bytes config/template.html | 161 +++++++++++++++++++++++++++++++++++-------- package.json | 2 +- public/manifest.json | 30 ++++---- public/style.css | 19 ++++- src/index.ts | 87 +++++++++++++---------- src/renderer.ts | 7 +- 7 files changed, 217 insertions(+), 89 deletions(-) diff --git a/bun.lockb b/bun.lockb index 2b544528996eec2cd79d6294f8c964fbcba90af5..0f32659c2cff4e7fa37473024de5289b79f222d0 100755 GIT binary patch delta 11235 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 E1Aq%OkN^Mx delta 11448 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 ME4r-g=_{W3Cxt|AbN~PV diff --git a/config/template.html b/config/template.html index 414a0fa..67930a1 100644 --- a/config/template.html +++ b/config/template.html @@ -5,34 +5,132 @@ - 📰 Carter's RSS Feeds + Carter's RSS Feeds + -

Carter's RSS Feeds

- - {% for group, feeds in data %} -

{{ group }}

- {% for feed in feeds %} -
- {% endfor %} {% endfor %} {% if errors | length > 0 %} + + {% endfor %} + + {% if errors | length > 0 %}

Errors

There were errors trying to parse these feeds:

    @@ -41,15 +139,18 @@ {% endfor %}
{% endif %} - -
-
-

Last updated {{ now }}.

-

- Powered by - Bubo Reader (v{{ info.version }}), a project by George Mandis. ❤️ -

+ diff --git a/package.json b/package.json index 88ac0b2..824b921 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,8 @@ }, "license": "MIT", "dependencies": { + "@feelinglovelynow/get-relative-time": "^1.1.2", "chalk": "^5.2.0", - "javascript-time-ago": "^2.5.10", "node-fetch": "^3.3.1", "nunjucks": "^3.2.4", "rss-parser": "^3.13.0" diff --git a/public/manifest.json b/public/manifest.json index 060df0b..8c93e43 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,16 +1,18 @@ { - "name": "Carter's RSS Feeds", - "short_name": "Carter's RSS Feeds", - "start_url": ".", - "scope": ".", - "display": "standalone", - "background_color": "#FCF5E4", - "theme_color": "#FCF5E4", - "description": "Updates from RSS feeds that Carter likes", - "id": "/", - "icons": [{ - "sizes": "any", - "src": "news-emoji.svg", - "type": "image/svg+xml" - }] + "name": "Carter's RSS Feeds", + "short_name": "Carter's RSS Feeds", + "start_url": ".", + "scope": ".", + "display": "standalone", + "background_color": "#FCF5E4", + "theme_color": "#FCF5E4", + "description": "Updates from RSS feeds that Carter likes", + "id": "/", + "icons": [ + { + "sizes": "any", + "src": "news-emoji.svg", + "type": "image/svg+xml" + } + ] } diff --git a/public/style.css b/public/style.css index 20982a2..5092d7c 100644 --- a/public/style.css +++ b/public/style.css @@ -12,6 +12,17 @@ body { color: var(--color-text); } +main { + display: grid; + gap: 1em; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); +} + +section ul { + max-height: 250px; + overflow-y: auto; +} + .inline-icon { height: 1em; vertical-align: text-bottom; @@ -19,6 +30,7 @@ body { summary { cursor: pointer; + text-overflow: ellipsis; } summary, @@ -42,13 +54,18 @@ details:has(li.has-recent) { } } -details, + .errors li { word-break: break-all; } .feed-url { color: #aaa; + white-space: nowrap; + display: inline-block; + text-overflow: ellipsis; + width: 100%; + overflow: hidden; } .article-timestamp, diff --git a/src/index.ts b/src/index.ts index 1aa3e3b..7d8a414 100644 --- a/src/index.ts +++ b/src/index.ts @@ -72,9 +72,20 @@ const finishBuild: () => void = async () => { process.stdout.write("\nDone fetching everything!\n"); + // sort all the categories and the feeds alphabetically + const sortedFeeds: Feeds = {}; + const sortedKeys = Object.keys(contentFromAllFeeds).sort((a, b) => + a.localeCompare(b), + ); + for (const key of sortedKeys) { + sortedFeeds[key] = contentFromAllFeeds[key].sort((a, b) => + a.title.localeCompare(b.title), + ); + } + // generate the static HTML output from our template renderer const output = render({ - data: contentFromAllFeeds, + data: sortedFeeds, errors: errors, info: buboInfo, }); @@ -105,48 +116,48 @@ const processFeed = feed: string; startTime: number; }) => - async (response: Response): Promise => { - const body = await parseFeed(response); - //skip to the next one if this didn't work out - if (!body) return; + async (response: Response): Promise => { + const body = await parseFeed(response); + //skip to the next one if this didn't work out + if (!body) return; - try { - const contents: FeedItem = ( - typeof body === "string" ? await parser.parseString(body) : body - ) as FeedItem; + try { + const contents: FeedItem = ( + typeof body === "string" ? await parser.parseString(body) : body + ) as FeedItem; - contents.feed = feed; - contents.title = getTitle(contents); - contents.link = getLink(contents); + contents.feed = feed; + contents.title = getTitle(contents); + contents.link = getLink(contents); - // try to normalize date attribute naming - for (const item of contents.items) { - item.timestamp = getTimestamp(item); - item.title = getTitle(item); - item.link = getLink(item); - const timestamp = new Date(Number.parseInt(item.timestamp)); - const yesterday = new Date(); - yesterday.setDate(yesterday.getDate() - 1); - item.isRecent = timestamp > yesterday; + // try to normalize date attribute naming + for (const item of contents.items) { + item.timestamp = getTimestamp(item); + item.title = getTitle(item); + item.link = getLink(item); + const timestamp = new Date(Number.parseInt(item.timestamp)); + const eightHoursAgo = new Date(); + eightHoursAgo.setHours(eightHoursAgo.getHours() - 8); + item.isRecent = timestamp > eightHoursAgo; + } + + contents.hasRecent = contents.items.some((item) => item.isRecent); + + contentFromAllFeeds[group].push(contents as object); + process.stdout.write( + `${success("Successfully fetched:")} ${feed} - ${benchmark(startTime)}\n`, + ); + } catch (err) { + process.stdout.write( + `${error("Error processing:")} ${feed} - ${benchmark( + startTime, + )}\n${err}\n`, + ); + errors.push(`Error processing: ${feed}\n\t${err}`); } - contents.hasRecent = contents.items.some((item) => item.isRecent); - - contentFromAllFeeds[group].push(contents as object); - process.stdout.write( - `${success("Successfully fetched:")} ${feed} - ${benchmark(startTime)}\n`, - ); - } catch (err) { - process.stdout.write( - `${error("Error processing:")} ${feed} - ${benchmark( - startTime, - )}\n${err}\n`, - ); - errors.push(`Error processing: ${feed}\n\t${err}`); - } - - finishBuild(); - }; + finishBuild(); + }; // go through each group of feeds and process const processFeeds = () => { diff --git a/src/renderer.ts b/src/renderer.ts index 1dbda63..6ac0eeb 100644 --- a/src/renderer.ts +++ b/src/renderer.ts @@ -7,18 +7,15 @@ import nunjucks from "nunjucks"; const env: nunjucks.Environment = nunjucks.configure({ autoescape: true }); import { readFile } from "node:fs/promises"; +import { getRelativeTime } from "@feelinglovelynow/get-relative-time"; import type { Feeds, JSONValue } from "./@types/bubo"; -import TimeAgo from "javascript-time-ago"; -import en from "javascript-time-ago/locale/en"; -TimeAgo.addDefaultLocale(en); -const timeFormatter = new TimeAgo("en-US"); /** * Global filters for my Nunjucks templates */ env.addFilter("relative", (dateString): string => { const date: Date = new Date(Number.parseInt(dateString)); - return !Number.isNaN(date.getTime()) ? timeFormatter.format(date) : dateString; + return !Number.isNaN(date.getTime()) ? getRelativeTime(date) : dateString; }); env.addFilter("formatTime", (dateString): string => {
- - {{ feed.title }} - ({{ feed.feed }}) - - -