RSS feed list

  • /*
     * @title RSS feed list
     * @description RSSフィードのリンクを一覧表示する
     * @include http://*
     * @include https://*
     * @license Unlicense
     */
    
    (() => {
      const selectors = ['atom+xml', 'rdf+xml', 'rss+xml', 'xml'].map((type) => {
        return `link[rel="alternate"][href][type="application/${type}"]`;
      });
      const links = [...document.querySelectorAll(selectors.join(','))];
      const feeds = links.map((link) => ({
        title: link.title || 'Feed',
        href: link.href,
      }));
    
      const container = document.createElement('div');
      container.style.cssText = `
        z-index: 5999999;
        position: fixed;
        top: 0;
        right: 0;
        border-radius: 0 0 0 5px;
        padding: 10px 20px;
        background-color: rgba(0, 0, 0, 0.75);
        line-height: 1.5;
        text-align: left;
      `;
      const list = container.appendChild(document.createElement('ul'));
      list.style.cssText = `
        list-style: none;
        max-width: 50vw;
        margin: 0;
        padding: 0;
      `;
      if (feeds.length > 0) {
        for (let feed of feeds) {
          const item = list.appendChild(document.createElement('li'));
          const anchor = item.appendChild(document.createElement('a'));
          anchor.style.cssText = `
            display: block;
            overflow: hidden;
            white-space: nowrap;
            text-overflow: ellipsis;
            color: #fff;
          `;
          anchor.target = '_blank';
          anchor.href = feed.href;
          anchor.textContent = anchor.title = feed.title;
        }
      } else {
        const item = list.appendChild(document.createElement('li'));
        item.style.cssText = `
          color: #fff;
        `;
        item.textContent = `No feeds found`;
      }
    
      document.body.appendChild(container);
      if (feeds.length > 0) {
        container.querySelector('a').focus();
      }
    
      document.addEventListener('click', function handleClick(e) {
        if (!container.contains(e.target)) {
          container.remove();
          document.removeEventListener('click', handleClick);
        }
      });
    })();
    
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2019/01/06 14:32:17 - 2019-01-06