汉字聚合查询

本工具旨在为用户提供关于当前正在搜索的汉字的其他网站链接。

// ==UserScript==
// @name         汉字聚合查询
// @namespace    http://martingrocery.top/
// @version      2025.03.19
// @description  本工具旨在为用户提供关于当前正在搜索的汉字的其他网站链接。
// @author       Martin的杂货铺
// @match        https://zi.tools/*
// @match        http://*.zisea.com/*
// @match        http://*.yedict.com/*
// @match        https://*.zdic.net/*
// @match        http://*.ccamc.org/*
// @match        https://*.ccamc.org/*
// @match        https://*.unicode.org/*
// @match        https://*.glyphwiki.org/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=zi.tools
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    function ord(char) {
      return char.codePointAt(0);
    }

    function hexToCharacter(hex) {
        hex = hex.replace(/^[U]\+|0x/gi, '')
        if (/[^0-9A-Fa-f]+/.test(hex)) {
            return null;
        }
        const codePoint = parseInt(hex, 16);

        try {
            return String.fromCodePoint(codePoint);
        } catch (e) {
            return null;
        }
    }


    function ziToolsMain() {
        const app = document.querySelector('#app');

        const observer = new MutationObserver((mutations) => {
          mutations.forEach((mutation) => {
            if (mutation.type === 'attributes' && mutation.attributeName === 'href') {
              let error = false;
              const url_path = window.location.pathname;
              const Match = url_path.match(regex);
              let character;
              if (Match === null) {
                error = true;
              } else {
                character = decodeURIComponent(url_path.match(regex)[1]);
                if ([...character].length !== 1 || character === null) {
                  error = true;
                }
              }
              if (!error) {
                if (document.querySelector('#mtgc-zi') !== null) {
                  document.querySelector('#mtgc-zi').innerHTML = linksZiTools(character);
                } else {
                  let MTGC_zi = document.createElement('div');
                  MTGC_zi.innerHTML = linksZiTools(character);
                  MTGC_zi.id = 'mtgc-zi';
                  app.appendChild(MTGC_zi);
                }
              } else {
                if (document.querySelector('#mtgc-zi') !== null) {
                  document.querySelector('#mtgc-zi').remove();
                }
              }
            }
          });
        });

        observer.observe(document.documentElement, { attributes: true, subtree: true });

        function linksZiTools(character) {
          return `
            <p>“${character}”在其他网站的信息</p>
            <ul>
              <li>
                <a href="http://zisea.com/zscontent.asp?uni=${ord(character).toString(16).toUpperCase()}" target="_blank">
                  字海网
                </a>
              </li>
              <li>
                <a href="http://ccamc.org/cjkv.php?cjkv=${encodeURIComponent(character)}" target="_blank">
                  古今文字集成
                </a>
              </li>
              <li>
                <a href="https://www.zdic.net/hans/${encodeURIComponent(character)}" target="_blank">
                  汉典
                </a>
              </li>
              <li>
                <a href="https://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=${encodeURIComponent(character)}" target="_blank">
                  Unihan Database
                </a>
              </li>
              <li>
                <a href="https://glyphwiki.org/wiki/u${ord(character).toString(16).toLowerCase()}" target="_blank">
                  GlyphWiki
                </a>
              </li>
            </ul>
          `
        }

        let MTGC_zi_style = document.createElement('style');

        const styleText = `
          #mtgc-zi {
            color: grey;
            position: fixed;
            bottom: 0.5rem;
            left: 0.5rem;
            width: 11rem;
            background-color: white;
            transition: left 0.5s ease-in-out;
            border: 2px solid #ba2a25;
            box-sizing: border-box;
            border-radius: 5px;
          }

          #mtgc-zi a::after {
            content: "";
            position: absolute;
            bottom: 0;
            left: 0;
            width: 0;
            height: 0.1rem;
            border-radius: 50rem;
            transition: width 0.25s ease-in-out;
            background-color: #ba2a25;
          }

          #mtgc-zi a:hover::after {
            width: 100%;
          }

          #mtgc-zi a {
            position: relative;
          }

          #mtgc-zi>* {
            margin-bottom: 0.5rem;
          }

          @media (max-width: 1200px) {
            #mtgc-zi {
              left: -11rem;
              border-radius: 5px 0 5px 5px;
            }

            #mtgc-zi::after {
              content: "其他网站";
              color: white;
              border-radius: 0 5px 5px 0;
              font-size: 0.7em;
              height: 5rem;
              width: 1rem;
              background-color: #ba2a25;
              position: absolute;
              right: -1rem;
              top: -2px;
              display: flex;
              flex-direction: column;
              justify-content: center;
              align-items: center;
              text-align: center;
            }

            #mtgc-zi:hover {
              left: 0.5rem;
            }
          }
        `;
        let MTGC_zi_style_text = document.createTextNode(styleText);
        MTGC_zi_style.appendChild(MTGC_zi_style_text);
        document.head.appendChild(MTGC_zi_style);

        let error = false;
        const regex = /\/zi\/(.*)(?=$|\?)/;
        const url_path = window.location.pathname;
        const Match = url_path.match(regex);
        let character;
        if (Match === null) {
          error = true;
        } else {
          character = decodeURIComponent(url_path.match(regex)[1]);
          if ([...character].length !== 1 || character === null) {
            error = true;
          }
        }
        if (!error) {
          if (document.querySelector('#mtgc-zi') !== null) {
            document.querySelector('#mtgc-zi').innerHTML = linksZiTools(character);
          } else {
            let MTGC_zi = document.createElement('div');
            MTGC_zi.innerHTML = linksZiTools(character);
            MTGC_zi.id = 'mtgc-zi';
            app.appendChild(MTGC_zi);
          }
        } else {
          if (document.querySelector('#mtgc-zi') !== null) {
            document.querySelector('#mtgc-zi').remove();
          }
        }
    }

    function ziseaMain() {
        if (window.location.pathname === "/zscontent.asp"){
            const urlParams = new URLSearchParams(window.location.search);
            const unicode = urlParams.get('uni');
            const td = document.querySelector('table:first-child td:nth-child(2)');
            const character = hexToCharacter(unicode);
            if (character) {
                td.innerHTML += `
                <br/>
                其他网站:<a href="https://zi.tools/zi/${encodeURIComponent(character)}" target="_blank">字统网</a>
                ·
                <a href="http://ccamc.org/cjkv.php?cjkv=${encodeURIComponent(character)}" target="_blank">古今文字集成</a>
                ·
                <a href="https://www.zdic.net/hans/${encodeURIComponent(character)}" target="_blank">汉典</a>
                ·
                <a href="https://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=${encodeURIComponent(character)}" target="_blank">Unihan Database</a>
                ·
                <a href="https://glyphwiki.org/wiki/u${encodeURIComponent(unicode.toLowerCase())}" target="_blank">GlyphWiki</a>
                `;
            } else {
                // something coming soon here
            }
        }
    }

    function zdicMain() {
        const regex = /^\/han[st]\/(.*)/;
        if (regex.test(window.location.pathname)){
            const Match = window.location.pathname.match(regex);
            const character = decodeURIComponent(Match[1]);
            console.log(window.location.pathname);
            if ([...character].length !== 1) {
                return;
            }
            let MTGC_zdic_style = document.createElement('style');
            const blockContent = document.createElement('div');


            const styleText = `
              #mtgc-zi {
                color: grey;
                position: fixed;
                bottom: 0.5rem;
                left: 0.5rem;
                width: 11rem;
                background-color: white;
                transition: left 0.5s ease-in-out;
                border: 2px solid #8b411c;
                box-sizing: border-box;
                border-radius: 5px;
              }

              #mtgc-zi a::after {
                content: "";
                position: absolute;
                bottom: 0;
                left: 0;
                width: 0;
                height: 0.1rem;
                border-radius: 50rem;
                transition: width 0.25s ease-in-out;
                background-color: #8b411c;
              }

              #mtgc-zi a:hover::after {
                width: 100%;
              }

              #mtgc-zi a {
                position: relative;
                text-decoration: none;
                color: #8b411c;
              }

              #mtgc-zi>* {
                margin-bottom: 0.5rem;
              }

              #mtgc-zi ul {
                list-style-type: disc;
                padding-left: 1.5em;
              }

              @media (max-width: 950px) {
                #mtgc-zi {
                  left: -11rem;
                  border-radius: 5px 0 5px 5px;
                }

                #mtgc-zi::after {
                  content: "其他网站";
                  color: white;
                  border-radius: 0 5px 5px 0;
                  font-size: 0.7em;
                  height: 5rem;
                  width: 1rem;
                  background-color: #8b411c;
                  position: absolute;
                  right: -1rem;
                  top: -2px;
                  display: flex;
                  flex-direction: column;
                  justify-content: center;
                  align-items: center;
                  text-align: center;
                  line-height: 1.5em;
                }

                #mtgc-zi:hover {
                  left: 0.5rem;
                }
              }
            `;
            let MTGC_zdic_style_text = document.createTextNode(styleText);
            MTGC_zdic_style.appendChild(MTGC_zdic_style_text);
            document.head.appendChild(MTGC_zdic_style);
            let MTGC_zi = document.createElement('div');
            MTGC_zi.innerHTML = linksZdic(character);
            MTGC_zi.id = 'mtgc-zi';
            document.body.appendChild(MTGC_zi);

            function linksZdic(character) {
              return `
                <p>“${character}”在其他网站的信息</p>
                <ul>
                  <li>
                    <a href="https://zi.tools/zi/${encodeURIComponent(character)}" target="_blank">
                      字统网
                    </a>
                  </li>
                  <li>
                    <a href="http://zisea.com/zscontent.asp?uni=${ord(character).toString(16).toUpperCase()}" target="_blank">
                      字海网
                    </a>
                  </li>
                  <li>
                    <a href="http://ccamc.org/cjkv.php?cjkv=${encodeURIComponent(character)}" target="_blank">
                      古今文字集成
                    </a>
                  </li>
                  <li>
                    <a href="https://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=${encodeURIComponent(character)}" target="_blank">
                      Unihan Database
                    </a>
                  </li>
                  <li>
                    <a href="https://glyphwiki.org/wiki/u${ord(character).toString(16).toLowerCase()}" target="_blank">
                      GlyphWiki
                    </a>
                  </li>
                </ul>
              `
            }
        }
    }

    function ccamcMain() {
        if (window.location.pathname === '/cjkv.php') {
            const urlParams = new URLSearchParams(window.location.search);
            const character = urlParams.get('cjkv');
            const emptyDiv = document.querySelector('.info .tab-pane:first-child>div:nth-child(2)>div.row:nth-child(7)');
            if (emptyDiv.innerHTML.trim() === "") {
                emptyDiv.remove();
            }
            document.querySelector('.info .tab-pane:first-child>div:nth-child(2)').innerHTML +=
            `
            <div class="row">
		        <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
		            <p class="title">其他网站直达链接</p>
		            <p style="font-weight: bold">
                        <a href="https://zi.tools/zi/${encodeURIComponent(character)}" target="_blank">字统网</a>
                        ·
                        <a href="http://zisea.com/zscontent.asp?uni=${ord(character).toString(16).toUpperCase()}" target="_blank">字海网</a>
                        ·
                        <a href="https://www.zdic.net/hans/${encodeURIComponent(character)}" target="_blank">汉典</a>
                        ·
                        <a href="https://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=${encodeURIComponent(character)}" target="_blank">Unihan Database</a>
                        ·
                        <a href="https://glyphwiki.org/wiki/u${ord(character).toString(16).toLowerCase()}" target="_blank">GlyphWiki</a>
                    </p>
                </div>
		    </div>
            <hr/>
            `
        }
    }

    function unihanMain() {
        if (window.location.pathname === '/cgi-bin/GetUnihanData.pl') {
            const urlParams = new URLSearchParams(window.location.search);
            const character = urlParams.get('codepoint');
            let copyright = document.querySelector('.contents > *:last-child');
            copyright.remove();
            let hr = document.querySelector('.contents > *:last-child');
            hr.remove();
            document.querySelector('.contents').innerHTML += `
            <p>
                Look up simplified Chinese character information using U+${ord(character).toString(16).toUpperCase()} at
                <a href="https://zi.tools/zi/${encodeURIComponent(character)}" target="_blank">Zi.TOOLS</a>
            </p>
            <p>
                Look up traditional Chinese character information using U+${ord(character).toString(16).toUpperCase()} at
                <a href="https://zi.tools/zi/${encodeURIComponent(character)}" target="_blank">Zi.TOOLS</a>
            </p>
            <p>
                Look up simplified Chinese character information using U+${ord(character).toString(16).toUpperCase()} at
                <a href="http://zisea.com/zscontent.asp?uni=${ord(character).toString(16).toUpperCase()}" target="_blank">ZISEA</a>
                /
                <a href="http://yedict.com/zscontent.asp?uni=${ord(character).toString(16).toUpperCase()}" target="_blank">YEDICT</a>
            </p>
            <p>
                Look up traditional Chinese character information using U+${ord(character).toString(16).toUpperCase()} at
                <a href="http://zisea.com/zscontent.asp?uni=${ord(character).toString(16).toUpperCase()}" target="_blank">ZISEA</a>
                /
                <a href="http://yedict.com/zscontent.asp?uni=${ord(character).toString(16).toUpperCase()}" target="_blank">YEDICT</a>
            </p>
            `;
            document.querySelector('.contents').appendChild(hr);
            document.querySelector('.contents').appendChild(copyright);
        }
    }

    function glyphWikiMain() {
        const regex = /^\/wiki\/u([0-9a-f]+?)(?:-.+)?$/;
        if (regex.test(window.location.pathname)) {
            const Match = window.location.pathname.match(regex);
            const unicode = decodeURIComponent(Match[1]);
            const character = hexToCharacter(unicode);
            if (!/\p{Script=Han}/gu.test(character)) {
                return;
            }
            let title = '';
            switch (window.location.hostname) {
                case 'glyphwiki.org':
                    title = '他のサイト';
                    break;
                case 'zhs.glyphwiki.org':
                    title = '其他网站';
                    break;
                case 'zht.glyphwiki.org':
                    title = '其他網站';
                    break;
                case 'en.glyphwiki.org':
                    title = 'other sites';
                    break;
                default:
                    title = 'unknown error occured'
            }
            const leftPane = document.querySelector('.left_pane');
            leftPane.innerHTML += `
            <div class="box">
                ${title}
                <div class="box_inside">
                    <ul>
                        <li>
                            <a href="https://zi.tools/zi/${encodeURIComponent(character)}" target="_blank">
                                字统网
                            </a>
                        </li>
                        <li>
                            <a href="http://zisea.com/zscontent.asp?uni=${ord(character).toString(16).toUpperCase()}">
                                字海网
                            </a>
                        </li>
                        <li>
                            <a href="http://ccamc.org/cjkv.php?cjkv=${encodeURIComponent(character)}">
                                古今文字集成
                            </a>
                        </li>
                        <li>
                            <a href="https://www.zdic.net/hans/${encodeURIComponent(character)}">
                                汉典
                            </a>
                        </li>
                        <li>
                            <a href="https://unicode.org/cgi-bin/GetUnihanData.pl?codepoint=${encodeURIComponent(character)}">
                                Unihan Database
                            </a>
                        </li>
                    </ul>
                </div>
            </div>
            `
        }
    }

    if (window.location.hostname === 'zi.tools') {
        ziToolsMain();
    }

    if (['zisea.com', 'www.zisea.com', "yedict.com", "www.yedict.com", ].includes(window.location.hostname)) {
        ziseaMain();
    }

    if (window.location.hostname === 'www.zdic.net') {
        zdicMain();
    }

    if (['ccamc.org', 'www.ccamc.org'].includes(window.location.hostname)){
        ccamcMain();
    }

    if (['unicode.org', 'www.unicode.org'].includes(window.location.hostname)) {
        unihanMain();
    }

    if (['glyphwiki.org', 'zhs.glyphwiki.org', 'zht.glyphwiki.org', 'en.glyphwiki.org'].includes(window.location.hostname)) {
        glyphWikiMain();
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址