gemini://woodpeckersnest.space/~schapps/journal/2024-08-02-good-news-friday-a-new-dawn-of-syndications.gmi
I have also added an initial support for twtxt to a Greasemonkey script.
https://greasyfork.org/scripts/465932-n ... eed-reader
About.
https://twtxt.readthedocs.io
This is the code in ECMAScript.
I would probably need to add support for Markdown.
Code: Select all
function renderTwtxt(txtFile) {
let lines = txtFile.trim().split('\n');
let metadata = {};
for (const line of lines) {
if (line.startsWith('#') && line.includes('=')) {
let newLine = line.replace('#','');
let keyValue = newLine.split('=');
let key = keyValue[0].trim();
let value = keyValue[1].trim();
metadata[key] = value;
}
}
let newDocument = createPage();
newDocument.title = metadata['nick'];
if (metadata['lang']) {
newDocument
.documentElement
.setAttribute('lang', metadata['lang']);
}
let feed = newDocument.createElement('div');
feed.id = 'feed';
let title = newDocument.createElement('h1');
if (metadata['nick']) {
title.textContent = metadata['nick'];
} else {
title.textContent = document.location.hostname;
}
title.id = 'title';
feed.append(title);
let subtitle = newDocument.createElement('h2');
if (metadata['description']) {
subtitle.textContent = metadata['description'];
} else {
subtitle.textContent = defaultSubtitle;
}
subtitle.id = 'subtitle';
feed.append(subtitle);
if (enableIcon) {
let iconPath = metadata['avatar'];
if (iconPath) {
let div = newDocument.createElement('div');
let logoLink = newDocument.createElement('a');
let logoImage = newDocument.createElement('img');
logoLink.className = 'homepage-link';
logoLink.id = 'logo';
logoImage.src = metadata['avatar'];
logoLink.append(logoImage);
div.append(logoLink);
feed.append(div);
}
}
let toc = newDocument.createElement('ol');
toc.id = 'toc';
feed.append(toc);
let articles = newDocument.createElement('div');
articles.id = 'articles';
feed.append(articles);
for (const line of lines.reverse()) {
if (!line.startsWith('#')) {
let twtEntry = line.split(' ');
let timestamp = twtEntry[0];
let message = twtEntry[1];
let items = lines.length;
let index = lines.indexOf(line) + 1;
let titleToc = newDocument.createElement('a');
let dateAsTitle = new Date(timestamp);
titleToc.textContent = dateAsTitle;
titleToc.href = `#newspaper-oujs-${index}`;
titleToc.title = titleToc.textContent;
let liElement = newDocument.createElement('li');
liElement.append(titleToc)
toc.append(liElement);
let entry = newDocument.createElement('div');
entry.className = 'entry';
let link = newDocument.createElement('a');
link.textContent = dateAsTitle;
link.href = '';
link.id = `newspaper-oujs-${index}`;
title = newDocument.createElement('h3');
title.className = 'title';
title.append(link);
entry.append(title);
let date = newDocument.createElement('div');
date.className = 'published';
date.textContent = dateAsTitle;
entry.append(date);
let text = newDocument.createElement('div');
text.className = 'content';
text.textContent = message;
entry.append(text);
articles.append(entry);
if (
index > minimumItemNumber &&
index < items &&
!ignoreMinimumItemNumber
)
{
let titleToc = newDocument.createElement('a');
titleToc.textContent = 'See all posts >';
titleToc.title = `This feed offers ${items} items`;
titleToc.className = 'expand';
toc.append(titleToc);
articles.append(titleToc.cloneNode(true));
break;
}
}
}
newDocument.body.append(feed);
newDocument = checkContentEmptiness(newDocument);
return newDocument;
}