Ability to jump between lists by clicking links under post details

This commit is contained in:
dakedres 2024-02-10 02:50:47 -07:00
parent 7e1e753c6e
commit b29b7e6405

91
lib.js
View File

@ -176,7 +176,7 @@ export const processRss = (source, fromDate, reducerCallback) => {
} }
for(let item of items) { for(let item of items) {
let post = processRssItem(source, item, reducerCallback) let post = createPost(source, item, reducerCallback)
if(post && post.date > fromDate) { if(post && post.date > fromDate) {
source.posts.push(post) source.posts.push(post)
@ -186,7 +186,7 @@ export const processRss = (source, fromDate, reducerCallback) => {
return source return source
} }
export const processRssItem = (source, item, reducerCallback) => { export const createPost = (source, item, reducerCallback) => {
let description = new JSDOM(item.querySelector('description').textContent).window.document let description = new JSDOM(item.querySelector('description').textContent).window.document
let dateString = item.querySelector('pubDate').textContent let dateString = item.querySelector('pubDate').textContent
let link = item.querySelector('link').textContent let link = item.querySelector('link').textContent
@ -201,7 +201,8 @@ export const processRssItem = (source, item, reducerCallback) => {
date: new Date(dateString).valueOf() ?? 0, date: new Date(dateString).valueOf() ?? 0,
link, link,
guid, guid,
title title,
occurances: []
} }
return reducerCallback(post) return reducerCallback(post)
@ -247,10 +248,10 @@ export const extractImages = (post, cache = true) => {
// |/ | |-' |/|/ // |/ | |-' |/|/
// ' ' `-' ' ' // ' ' `-' ' '
export const writePages = (list, { pageSize, header = '', directory, batch }) => { export const createPages = (list, { pageSize }) => {
let posts = [] let posts = []
let pages = []
let lastPageLink = 'about:blank' let lastPageLink = 'about:blank'
let pageIndex = 0
list.posts.sort((a, b) => b.date - a.date) list.posts.sort((a, b) => b.date - a.date)
@ -258,22 +259,37 @@ export const writePages = (list, { pageSize, header = '', directory, batch }) =>
posts.push(list.posts[i]) posts.push(list.posts[i])
if(i % pageSize == 0) { if(i % pageSize == 0) {
let title = getPageTitle(list, pageIndex) let title = getPageTitle(list, pages.length)
let html = renderPage(title, posts.reverse(), header, renderNextPageLink(lastPageLink)) let filename = i < pageSize ? getFinalPageFilename(list) : getPageFilename(list, pages.length)
let filename = i < pageSize ? getFinalPageFilename(list) : getPageFilename(list, pageIndex) let page = {
let promise = write(Path.join(directory, filename), html) filename,
title,
posts: posts.reverse(),
lastPageLink
}
batch.add(promise.then(annotate(`Created "${title}" (${filename})`))) for(let i = 0; i < page.posts.length; i++) {
page.posts[i].occurances.push({
index: i,
list,
page
})
}
pages.push(page)
posts = [] posts = []
lastPageLink = filename lastPageLink = filename
pageIndex++
} }
} }
// lock.lists[list.name] = { return pages
// pageIndex, }
// lastPostDate: posts[0]?.date ?? lastPostDate
// } export const writePage = (page, { header = '', directory, batch }) => {
let html = renderPage(page.title, page.posts, header, renderNextPageLink(page.lastPageLink))
let promise = write(Path.join(directory, page.filename), html)
batch.add(promise.then(annotate(`Created "${page.title}" (${page.filename})`)))
} }
export const getFinalPageFilename = list => export const getFinalPageFilename = list =>
@ -311,12 +327,8 @@ ${footer}
</body> </body>
</html>` </html>`
export const renderPost = post => { export const renderPost = (post, index) => {
let date = new Date(post.date) let details = []
let details = [
[ 'source', `<a href="${post.source.hostname}">${post.source.hostname}</a>` ]
]
if(post.title) if(post.title)
details.push([ 'title', `"${post.title}"` ]) details.push([ 'title', `"${post.title}"` ])
@ -324,17 +336,22 @@ export const renderPost = post => {
if(post.categories && post.categories.length > 0) if(post.categories && post.categories.length > 0)
details.push([ 'categories', post.categories.map(name => `<mark>${name}</mark>`).join(', ') ]) details.push([ 'categories', post.categories.map(name => `<mark>${name}</mark>`).join(', ') ])
details.push([ 'source', `<a href="${post.source.hostname}">${post.source.hostname}</a>` ])
details.push([ 'lists', post.occurances.map(occ => `<a href="${occ.page.filename}#${occ.index}">${occ.list.displayName}</a>`).join(', ') ])
return `\ return `\
<section id="${index}">
${post.images.map(renderImage).join('\n')} ${post.images.map(renderImage).join('\n')}
<details> <details>
<summary><b>${post.source.displayName}</b> ${renderDate(date)} <a href="${post.link}">open</a></summary> <summary><b>${post.source.displayName}</b> ${renderDate(new Date(post.date))} <a href="${post.link}">open</a></summary>
<ul> <ul>
${details.map(args => renderPostDetail(...args)).join('\n')} ${details.map(args => renderPostDetail(...args)).join('\n')}
<ul> <ul>
</details> </details>
<hr>` <hr>
</section>`
} }
export const renderPostDetail = (name, value) => export const renderPostDetail = (name, value) =>
@ -411,7 +428,7 @@ export const downloadImages = (images, getImagePath, courtesyWait, { directory,
return out return out
} }
export const pullImages = (post, renderer, discardPostIfNoImages = false, getPostId = postIdFromPathname) => { export const pullImages = (post, view, discardPostIfNoImages = false, getPostId = postIdFromPathname) => {
let images = extractImages(post) let images = extractImages(post)
if(!discardPostIfNoImages || images.length > 0) { if(!discardPostIfNoImages || images.length > 0) {
@ -419,7 +436,7 @@ export const pullImages = (post, renderer, discardPostIfNoImages = false, getPos
images, images,
buildImagePathHandler(post.source, getPostId(post)), buildImagePathHandler(post.source, getPostId(post)),
post.source.courtesyWait, post.source.courtesyWait,
renderer view
) )
return post return post
} }
@ -458,12 +475,6 @@ export const fetchRssFromInstances = async (source, lock) => {
return source return source
} }
// const addPostsToLock = (source, renderer) => {
// (renderer.lock.sources[source.name] ??= {})
// .postData = source.posts.map(post => post.description)
// }
export const populateSource = (source, postReducerCallback, lock) => { export const populateSource = (source, postReducerCallback, lock) => {
let sourceLock = lock.sources[source.name] ??= {} let sourceLock = lock.sources[source.name] ??= {}
@ -474,7 +485,7 @@ export const populateSource = (source, postReducerCallback, lock) => {
for(let itemText of sourceLock.items) { for(let itemText of sourceLock.items) {
let item = new JSDOM(itemText, { contentType: 'text/xml' }).window.document.documentElement let item = new JSDOM(itemText, { contentType: 'text/xml' }).window.document.documentElement
source.posts.push(processRssItem(source, item, postReducerCallback)) source.posts.push(createPost(source, item, postReducerCallback))
} }
} }
@ -505,20 +516,24 @@ export const lockSources = (sources, lock) => {
sources.forEach(source => lockSource(source, lock)) sources.forEach(source => lockSource(source, lock))
} }
export const writeView = (sources, feeds, renderer) => { export const writeView = (sources, feeds, view) => {
renderer.header = renderNav(feeds, sources) view.header = renderNav(feeds, sources)
let pages = []
for(let feed of feeds) { for(let feed of feeds) {
writePages(feed, renderer) pages = pages.concat(createPages(feed, view))
} }
for(let source of sources) { for(let source of sources) {
writePages(source, renderer) pages = pages.concat(createPages(source, view))
} }
writeStylesheet(Path.join(import.meta.dirname, 'assets/style.css'), renderer) for(let page of pages) {
} writePage(page, view)
}
writeStylesheet(Path.join(import.meta.dirname, 'assets/style.css'), view)
}
// | | ,- // | | ,-
// ;-. | ,-: |- | ,-. ;-. ;-.-. ,-. // ;-. | ,-: |- | ,-. ;-. ;-.-. ,-.