Render twtxt Topic is solved

Talk about code development, features, specific bugs, enhancements, patches, and similar things.
Forum rules
Please keep everything here strictly on-topic.
This board is meant for Pale Moon source code development related subjects only like code snippets, patches, specific bugs, git, the repositories, etc.

This is not for tech support! Please do not post tech support questions in the "Development" board!
Please make sure not to use this board for support questions. Please post issues with specific websites, extensions, etc. in the relevant boards for those topics.

Please keep things on-topic as this forum will be used for reference for Pale Moon development. Expect topics that aren't relevant as such to be moved or deleted.
User avatar
Schimon
Apollo supporter
Apollo supporter
Posts: 35
Joined: 2024-12-09, 14:01

Render twtxt

Unread post by Schimon » 2025-04-11, 05:27

Render twtxt, as done with Atom and RSS.

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;
}

User avatar
jobbautista9
Keeps coming back
Keeps coming back
Posts: 952
Joined: 2020-11-03, 06:47
Location: Philippines

Re: Render twtxt

Unread post by jobbautista9 » 2025-04-11, 08:43

Browser extensions welcome
Image

:akko_derp:

XUL add-ons developer. You can find a list of add-ons I manage at http://rw.rs/~job/software.html.

User avatar
Moonchild
Pale Moon guru
Pale Moon guru
Posts: 37634
Joined: 2011-08-28, 17:27
Location: Motala, SE

Re: Render twtxt

Unread post by Moonchild » 2025-04-11, 09:38

Definitely something for extension space.

Also, I find it rather disingenuous that all the supposed "references" (on gemini) that you're peppering through your recent posts are self-published. It really doesn't count as a reference point if you're referring to your own articles. While I understand you have ideas you want to make known to a broader audience, I do suggest you first get some peer review on what you're proposing before starting to bother implementers with ideas that have not been fleshed out and vetted yet.
"A dead end street is a place to turn around and go into a new direction" - Anonymous
"Seek wisdom, not knowledge. Knowledge is of the past; wisdom is of the future." -- Native American proverb
"Linux makes everything difficult." -- Lyceus Anubite