Add Nicopedia Menu

ニコニコ大百科の記事右側にメニューを追加します

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name            Add Nicopedia Menu
// @namespace       Add Nicopedia Menu
// @description     ニコニコ大百科の記事右側にメニューを追加します
// @author          sotoba
// @match           https://dic.nicovideo.jp/*
// @version         1.0.1-20181103
// @homepageURL     https://github.com/SotobatoNihu/AddNicopediaMenu
// @license         MIT License
// @grant           GM.getResourceUrl
// @resource        nicoIcon   https://dic.nicovideo.jp/oekaki/22690.png
// @resource        googleIcon   https://dic.nicovideo.jp/oekaki/15633.png
// @resource        wikiIcon   https://dic.nicovideo.jp/oekaki/17668.png
// @resource        yahooIcon   https://dic.nicovideo.jp/oekaki/17680.png
// @resource        seigaIcon   https://dic.nicovideo.jp/oekaki/122809.png
// @resource        ch2Icon   https://dic.nicovideo.jp/oekaki/167179.png
// @resource        pixivIcon   https://dic.nicovideo.jp/oekaki/109891.png
// @resource        ichibaIcon   https://dic.nicovideo.jp/oekaki/30296.png
// @resource        communityIcon   https://dic.nicovideo.jp/oekaki/9203.png
// @resource        commonsIcon   https://dic.nicovideo.jp/oekaki/16255.png
// ==/UserScript==

const MENUID = 'nicopedia-menu'

const drowMenu = async (word, width) => {

    const menuElem = document.getElementById(MENUID)

    //単語の空白をアンダーバーに
    const modifyWord = word.replace(' ', '_')

    //アイコンの描画に Greasemonkeyのキャッシュ機能を使用
    Promise.all([
        await GM.getResourceUrl("nicoIcon"),
        await GM.getResourceUrl("googleIcon"),
        await GM.getResourceUrl("wikiIcon"),
        await GM.getResourceUrl("yahooIcon"),
        await GM.getResourceUrl("seigaIcon"),
        await GM.getResourceUrl("ch2Icon"),
        await GM.getResourceUrl("pixivIcon"),
        await GM.getResourceUrl("ichibaIcon"),
        await GM.getResourceUrl("communityIcon"),
        await GM.getResourceUrl("commonsIcon")
    ]).then(Icons => {
        const nicoIcon = Icons[0]
        const googleIcon = Icons[1]
        const wikiIcon = Icons[2]
        const yahooIcon = Icons[3]
        const seigaIcon = Icons[4]
        const ch2Icon = Icons[5]
        const pixivIcon = Icons[6]
        const ichibaIcon = Icons[7]
        const communityIcon = Icons[8]
        const commonsIcon = Icons[9]

        // HTMLをベタ書き(アイコンデータは埋め込み)
        menuElem.innerHTML = `
<img src="/img/l_box_t.gif" class="border" style="width: ${width}px">
<ul>
    <li>
        <a href="https://www.nicovideo.jp/search/${modifyWord}">「${modifyWord}」でキーワード検索 <img title="キーワード検索" style="vertical-align: middle;" alt="niconico" src="${nicoIcon}" width="15" height="15"></a></br>
        <a href="https://www.nicovideo.jp/tag/${modifyWord}">「${modifyWord}」でタグ検索 <img title="タグ検索" style="vertical-align: middle;" alt="niconico" src="${nicoIcon}" width="15" height="15"></a>
    <li>外部サイトで検索</br>
        <a href="http://www.google.co.jp/search?hl=ja&q=${word}"><img title="Google" style="vertical-align: middle;" alt="google" src="${googleIcon}" width="15" height="15"></a> 
        <a href="http://ja.wikipedia.org/wiki/${word}"><img title="Wikipedia" style="vertical-align: middle;" alt="Wikipedia" src="${wikiIcon}"width="15" height="15"></a>  
        <a href="http://search.yahoo.co.jp/search?ei=UTF-8&p=${word}"><img title="Yahoo! Japan" style="vertical-align: middle;" alt="Yahoo!Japan"src="${yahooIcon}"width="17" height="15"></a>  
        <a href="http://find.2ch.net/?BBS=2ch&IE=UTF-8&TYPE=TITLE&STR=${word}"> <img title="2ch" style="vertical-align: middle;" alt="2ch"src="${ch2Icon}"width="15" height="15"></a>   /
        <a href="http://seiga.nicovideo.jp/search/illust/tag/${word}"><img title="静画" style="vertical-align: middle;" alt="ニコニコ静画" src="${seigaIcon}"width="15" height="15"></a> 
        <a href="http://www.pixiv.net/search.php?s_mode=s_tag&word=${word}"><img title="pixiv" style="vertical-align: middle;" alt="Pixiv" src="${pixivIcon}" width="15" height="15"></a> 
        <a href="http://search.pipa.jp/?KWD=${word}">2じげん</a> /
        </br>
        <a href="http://ichiba.nicovideo.jp/search/az/${word}"><img title="ニコニコ市場" style="vertical-align: middle;" alt="ニコニコ市場" src="${ichibaIcon}" width="15" height="15"></a> 
        <a href="http://com.nicovideo.jp/search/${word}?mode=s"><img title="ニコニココミュニティ" style="vertical-align: middle;" alt="ニコニココミュニティ" src="${communityIcon}" width="15" height="15"></a> 
        <a href="http://www.niconicommons.jp/search/${word}"><img title="ニコニ・コモンズ" style="vertical-align: middle;" alt="ニコニ・コモンズ" src="${commonsIcon}" width="15" height="15"></a>  /
    </li>
    <li>50音全記事 
         <a href="https://dic.nicovideo.jp/m/a/a"> 単語記事 </a> / <a href="https://dic.nicovideo.jp/m/a/l"> 生放送記事 </a> 
    </li>
    <li>最近更新された 
        <a href="https://dic.nicovideo.jp/m/u/a/1-"> 単語記事 </a> / <a href="https://dic.nicovideo.jp/m/u/v/1-"> 動画記事 </a> /  <a href="https://dic.nicovideo.jp/m/u/i/1-"> 商品記事 </a>  /  
        </br>
        <a href="https://dic.nicovideo.jp/m/u/u/1-"> ユーザ記事 </a> / <a href="https://dic.nicovideo.jp/m/u/c/1-"> コミュ記事 </a> /  <a href="https://dic.nicovideo.jp/m/u/l/1-"> 生放送記事 </a>  / 
        </br> 
        <a href="https://dic.nicovideo.jp/m/n/res/1-"> 書き込み </a> / <a href="https://dic.nicovideo.jp/m/n/oekaki/1-"> お絵カキコ </a> /  <a href="https://dic.nicovideo.jp/m/n/mml/1-"> ピコカキコ </a>  /  
    </li>
    <li>
         <a id="backgroud_default" style="display: none;" href="" onClick="maincss('/nd2.css');return false;">背景をデフォルトに戻す</a>
         <a id="backgroud_mokume" style="" href="" onClick="maincss('/ndx.css');return false;">背景を木目にする</a>
     </li>
     <li>
         <a id="use_flashpico" style="display: none;" href="" onClick="pikoplayer('flash');return false;">古いピコカキコ(flash版)を使う</a>
         <a id="use_htmlpico" style="" href="" onClick="pikoplayer('html5');return false;">新しいピコカキコ(html5版)を使う</a>
     </li>
    <li>
        <a href="https://dic.nicovideo.jp/">トップ</a> / <a href="https://dic.nicovideo.jp/p/my/">マイページ</a> / <a href="https://dic.nicovideo.jp/p/logout/">ログアウト</a> 
    </li>
</ul>
 <img src="/img/r_box_b2.gif" class="menu-border">
    `

        /**
         * pikoplayerIsは大百科で通常読み込まれる関数
         * pikoplayerIsを元に「ピコカキコ××を使う」の最初の表示を切り替える
         */
        if (pikoplayerIs('flash')) {
            document.getElementById('use_flashpico').style.display = 'none'
            document.getElementById('use_htmlpico').style.display = 'block'
        } else {
            document.getElementById('use_flashpico').style.display = 'block'
            document.getElementById('use_htmlpico').style.display = 'none'
        }

        /**
         * 現在のレイアウトを元に「背景を××にする」の最初の表示を切り替える
         */
        if (document.getElementById('header').style.backgroundRepeat === null) {
            document.getElementById('backgroud_mokume').style.display = 'none'
            document.getElementById('backgroud_default').style.display = 'block'
        } else {
            document.getElementById('backgroud_mokume').style.display = 'block'
            document.getElementById('backgroud_default').style.display = 'none'
        }

        /**
         * CSSの変更を監視し
         * ヘッダーのメニューにある「背景を××にする」の表示と連動する
         */
        const target = document.getElementById("maincss_ndx");
        const observeOption = {
            attributes: true,
            attributeFilter: ['style']
        };
        const observer = new MutationObserver(mutations => {
            if (mutations[0].target.style.cssText.length > 0) {
                document.getElementById('backgroud_mokume').style.display = 'none'
                document.getElementById('backgroud_default').style.display = 'block'
            } else {
                document.getElementById('backgroud_mokume').style.display = 'block'
                document.getElementById('backgroud_default').style.display = 'none'
            }
        });
        observer.observe(target, observeOption);
    })
}


// document.addEventListener('DOMContentLoaded', function () {
window.onload = function () {
    //もしメニューがない場合は作成
    if (document.getElementById(MENUID) === null) {
        const elm = document.createElement('div')
        elm.id = MENUID
        //右ペインの他メニューにクラスを合わせる
        elm.className = 'box'
        elm.style.height = 'auto'
        //空の要素を挿入
        document.getElementById('right-column').insertAdjacentElement('afterbegin', elm)
    }
    //記事名を取得
    const word = document.getElementById('search-box').value
    //横幅を取得
    const width = document.getElementById('right-column').offsetWidth
    //メニューを表示
    drowMenu(word, width)
}
// })