百度百科内链助手

内链一键去重、内链列表检查

目前为 2020-10-23 提交的版本。查看 最新版本

// ==UserScript==
// @name        百度百科内链助手
// @namespace   Violentmonkey Scripts
// @match       https://baike.baidu.com/editor/*
// @grant       none
// @version     1.0
// @author      lincong1987
// @description 内链一键去重、内链列表检查
// @inject-into content
// @require https://unpkg.com/jquery@3.5.1/dist/jquery.js
// @license      MIT
// ==/UserScript==

(function ($) {

  var neilians = []
  var neiliansMap = {}
  var neilianTree = []
  var checkEditorLoadIndex = 0
  var $us_neilian_toolbar__body__header
  var $onekeyUnique
  var $refresh
  var $us_neilian_list
  var $us_neilian_toolbar_tooltip
  var $us_neilian_toolbar_tooltip__inner
  var $auto_refresh
  var autoRefreshKey = 'xxoo-xxoo-auto-refresh'
  var autoRefresh = localStorage.getItem(autoRefreshKey)
  var $us_neilian_toolbar_toast

  if (typeof autoRefresh === 'undefined') {
    autoRefresh = 'false'
    localStorage.setItem(autoRefreshKey, 'false')
  }

  var $neilianToolbar = `

    <div class='us_neilian_toolbar' id='us_neilian_toolbar'>


      <div class='us_neilian_toolbar__header' ti="内链助手">
        内链助手

        <span class="us_neilian_toolbar__header-onekey-unique">
          一键去重 <i class="icon baike_icon_picall baike_icon_picall-icon_shanchu"></i></span>
        <span class="us_neilian_toolbar__header-auto-refresh">
            <input type="checkbox" id="us_neilian_toolbar__header-auto-refresh" >
        </span>
        <span class="us_neilian_toolbar__header-refresh">
          <i class="icon baike_icon_picall baike_icon_picall-icon_youzhuan"></i></span>

      </div>


      <div class="us_neilian_toolbar__body">
        <div class="us_neilian_toolbar__body__header">共 <em class="total">0</em> 条内链, 内有重复内链 <em class="unique">0</em> 条</div>
        <div class="us_neilian_toolbar__body__body">

          <div class="us_neilian_toolbar__body__body__thead">
            <span style="width: 42px" class="us_neilian_toolbar__body__body__thead__status">状态</span>
            <span style="" class="us_neilian_toolbar__body__body__thead__name">名称</span>
            <span style="width: 74px" class="us_neilian_toolbar__body__body__thead__action">操作</span>
          </div>
          <ul class="us_neilian_toolbar__body__list" id='us_neilian_list'>

        
          

          </ul>
        </div>
      </div>


    </div>
        `

  function getAllNeilians () {

    neilians = []
    neiliansMap = {}
    neilianTree = []

    // <a href="#" data-lemmaid="210064">湖北省</a>
    var neilianOrder = 0
    $('#J-center-container a').each(function (i, n) {
      var $a = $(this)

      if ($a.closest('.reference-list').length > 0) {
        return
      }

      var $el = $(n)
      var name = $el.text()
      var id = $el.data('lemmaid')

      if (neiliansMap[name]) {
        neiliansMap[name].index += 1

      } else {

        neiliansMap[name] = {
          index: 1,
          name: name,
          neilians: [],
          order: neilianOrder++,
        }

      }

      var neilain = {
        id: id,
        name: name,

        index: neiliansMap[name].index,
        globalIndex: i,

        $el: $el,
      }

      // neiliansMap[name].neilians.push(neilain)

      neilians.push(neilain)

    })

    hideTooltip()
    setHeader()
    renderNeilianList()

    if (autoRefresh === 'true') {
      setTimeout(function () {
        getAllNeilians()
      }, 10 * 1000)
    }

  }

  function appendStyle () {
    $('head').append(`<style>





/*!
* xxx.css
* (c) 2020 lincong1987
*/.us_neilian_toolbar_toast{position:fixed;z-index:9999999999;top:-100px;left:50%;transition:all,1s;width:300px;height:40px;line-height:40px;background:#e6f7ff;border-radius:4px;font-size:13px;color:#0284fe;text-align:center;box-shadow:0 2px 2px 0 rgba(0,0,0,0.5);margin-left:-150px}.us_neilian_toolbar_toast--hide{top:-100px}.us_neilian_toolbar_toast--show{top:100px}.us_neilian_toolbar_tooltip{position:absolute;z-index:9999999999;height:0;top:-10px;left:-30px;transition:all,1s}.us_neilian_toolbar_tooltip .icon{color:#fb544e;display:block;font-size:12px;position:absolute;right:-94px;top:-28px;cursor:pointer}.us_neilian_toolbar_tooltip__inner{position:absolute;top:-32px;left:-10px;height:24px;width:100px;background:transparent;border-radius:4px;box-shadow:0 2px 2px 0 rgba(0,0,0,0.5);font-size:12px;line-height:24px;padding:0 8px}.us_neilian_toolbar_tooltip__inner:after{position:absolute;display:block;content:"";width:0;height:0;top:23px;left:10px;border:7px solid transparent;border-bottom-color:transparent;border-left-color:transparent;border-right-color:transparent}.us_neilian_toolbar_tooltip.us_neilian_toolbar_tooltip--ok .icon{color:#fff;right:-78px;top:-25px}.us_neilian_toolbar_tooltip.us_neilian_toolbar_tooltip--ok .us_neilian_toolbar_tooltip__inner{background:#0284fe;color:#fff;width:80px}.us_neilian_toolbar_tooltip.us_neilian_toolbar_tooltip--ok .us_neilian_toolbar_tooltip__inner:after{border-top-color:#0284fe}.us_neilian_toolbar_tooltip.us_neilian_toolbar_tooltip--warn .icon{color:#fb544e;right:-60px;top:-25px}.us_neilian_toolbar_tooltip.us_neilian_toolbar_tooltip--warn .us_neilian_toolbar_tooltip__inner{color:#fb544e;background:#fef2f1;width:60px}.us_neilian_toolbar_tooltip.us_neilian_toolbar_tooltip--warn .us_neilian_toolbar_tooltip__inner:after{border-top-color:#fef2f1}.us_neilian_toolbar{box-sizing:border-box;height:600px;background:#fff;margin-bottom:10px;box-shadow:0 2px 2px 0 rgba(0,0,0,0.05)}.us_neilian_toolbar *{box-sizing:border-box}.us_neilian_toolbar__header{font-size:16px;color:#333;font-weight:bolder;position:relative;padding-left:22px;height:50px;line-height:50px;border-bottom:1px solid #e0e0e0}.us_neilian_toolbar__header-onekey-unique,.us_neilian_toolbar__header-auto-refresh,.us_neilian_toolbar__header-refresh{top:10px;right:80px;font-size:12px;position:absolute;font-weight:400;cursor:pointer;height:27px;line-height:27px;padding:0 8px;border-radius:4px;border:1px solid #e0e0e0;transition:all,.4s}.us_neilian_toolbar__header-onekey-unique .icon.baike_icon_picall,.us_neilian_toolbar__header-auto-refresh .icon.baike_icon_picall,.us_neilian_toolbar__header-refresh .icon.baike_icon_picall{font-size:12px}.us_neilian_toolbar__header-onekey-unique:hover,.us_neilian_toolbar__header-auto-refresh:hover,.us_neilian_toolbar__header-refresh:hover{color:#fff;background:#459df5;border:1px solid #459df5;transition:background,.4s;text-shadow:0 1px 3px #6c6c6c;top:11px}.us_neilian_toolbar__header-auto-refresh{right:46px}.us_neilian_toolbar__header-refresh{right:12px}.us_neilian_toolbar__header-refresh .icon.baike_icon_picall{font-size:12px}.us_neilian_toolbar__body__header{font-size:12px;color:#3f3f3f;line-height:1;padding:12px 0 12px 12px}.us_neilian_toolbar__body__header em{color:#459df5;font-weight:bold;font-style:normal}.us_neilian_toolbar__body__header em.unique{color:#ffa500}.us_neilian_toolbar__body__body__thead{display:table;width:100%;height:30px;line-height:30px;background:#f2f2f2}.us_neilian_toolbar__body__body__thead span{display:table-cell;text-align:center;font-size:12px}.us_neilian_toolbar__body__list{overflow:auto;height:470px}.us_neilian_toolbar__body__list__item{font-size:14px;color:#333;cursor:pointer;position:relative;overflow:hidden;clear:both;border-bottom:1px dashed #69b1f7 4a;padding:6px 0;transition:background,.4s;font-size:12px}.us_neilian_toolbar__body__list__item:nth-of-type(2n-1){background:rgba(105,177,247,0.05)}.us_neilian_toolbar__body__list__item:hover{background:rgba(105,177,247,0.5)}.us_neilian_toolbar__body__list__item__index{float:left;width:30px;text-align:center}.us_neilian_toolbar__body__list__item__status{float:left;height:30px;text-align:left}.us_neilian_toolbar__body__list__item__status i{font-size:12px}.us_neilian_toolbar__body__list__item__status.ok{color:#51c400}.us_neilian_toolbar__body__list__item__status.warn{color:#fb544e}.us_neilian_toolbar__body__list__item__status.error{color:#fb544e}.us_neilian_toolbar__body__list__item__name{float:left;width:160px;text-align:left;padding:0 6px;color:#338de6;cursor:pointer}.us_neilian_toolbar__body__list__item__action{float:left;width:36px}.us_neilian_toolbar__body__list__item__action__container{clear:both;position:relative}.us_neilian_toolbar__body__list__item__action__container .open,.us_neilian_toolbar__body__list__item__action__container .dis-link{text-align:center;width:36px;font-size:12px;border:1px solid #459df5;color:#459df5;border-radius:3px;transition:all,.4s;display:inline-block;float:left;margin-bottom:5px}.us_neilian_toolbar__body__list__item__action__container .open:hover,.us_neilian_toolbar__body__list__item__action__container .dis-link:hover{color:#fff;background:#459df5;border:1px solid #459df5;text-shadow:0 1px 3px #6c6c6c;transform:scale(1.1)}.us_neilian_toolbar__body__list__item__action__container .open i,.us_neilian_toolbar__body__list__item__action__container .dis-link i{font-size:12px}.us_neilian_toolbar__body__list__item__action__container .dis-link{color:#fb544e;border:1px solid #fb544e}.us_neilian_toolbar__body__list__item__action__container .dis-link:hover{color:#fff;background:#fb544e;border:1px solid #fb544e;text-shadow:0 1px 3px #6c6c6c}/*# sourceMappingURL=xxx.css.map */



      </style>`)
  }

  function renderNeilianList () {

    var $neilians = []

    $.each(neilians, function (i, n) {
      $neilians.push(` 
      
      <li class="us_neilian_toolbar__body__list__item" data-index="${n.globalIndex}">
              <span class="us_neilian_toolbar__body__list__item__index">${n.globalIndex +
      1}</span>
              
              
              <span class="us_neilian_toolbar__body__list__item__status ${n.index >
      1 ? 'warn' : 'ok'}">
                <i class="icon baike_icon_picall 
                ${n.index > 1
        ? 'baike_icon_picall-gantanhao'
        : 'baike_icon_picall-icon_tupianxuanzhong-copy'}
                "></i>
              </span>
              
              
              <div class="us_neilian_toolbar__body__list__item__name"  >${n.index} - ${n.name}</div>


              <div class="us_neilian_toolbar__body__list__item__action">
                <div class="us_neilian_toolbar__body__list__item__action__container">
                  <a href="javascript:;" class="dis-link" data-index="${n.globalIndex}" >
                    取消
                  </a>
                  <a  class="open" href="https://baike.baidu.com/item/${n.name}${n.id
        ? ('/' + n.id)
        : ''}"
                      target="_blank">
                    打开
                  </a>
                </div>
              </div>
            </li>
      `)
    })

    $us_neilian_list.html($neilians.join('\n'))

    //showToast(`内链助手工具初始化成功`)
  }

  function checkEditorLoad () {

    checkEditorLoadIndex++

    if (checkEditorLoadIndex > 60) {
      alert('内链助手工具初始化 E1 失败,请刷新页面!')
      return
    }

    if ($('#J-lemma-main-content').length > 0) {

      setTimeout(function () {

        $('body').append(`

        <div id="us_neilian_toolbar_toast" class="us_neilian_toolbar_toast">内链助手: 已更新</div>
        <div id='us_neilian_toolbar_tooltip' class='us_neilian_toolbar_tooltip'>
            <div class='us_neilian_toolbar_tooltip__inner' id="us_neilian_toolbar_tooltip__inner"></div>
            <i class="icon baike_icon_picall baike_icon_picall-icon_guanbi"></i>
        </div>
        `)

        $us_neilian_toolbar_tooltip = $('#us_neilian_toolbar_tooltip')

        $us_neilian_toolbar_tooltip__inner =
          $('#us_neilian_toolbar_tooltip__inner')
        $('.right-content').prepend($neilianToolbar)

        $us_neilian_toolbar__body__header =
          $('.us_neilian_toolbar__body__header')

        $onekeyUnique = $('.us_neilian_toolbar__header-onekey-unique')
        $refresh = $('.us_neilian_toolbar__header-refresh')
        $us_neilian_list = $('#us_neilian_list')

        $us_neilian_toolbar_toast = $('#us_neilian_toolbar_toast')

        $auto_refresh = $('#us_neilian_toolbar__header-auto-refresh')

        $auto_refresh.prop('checked', autoRefresh === 'true')

        bindEvent()

        getAllNeilians()

        showToast(`内链助手 初始化成功`)

        runRemoveNeilianTask()
      }, 0)

      return
    }

    setTimeout(function () {
      checkEditorLoad()
    }, 1000)
  }

  function setHeader () {

    var unique = 0
    for (var key in neiliansMap) {
      if (neiliansMap[key].index > 1) {
        unique += 1
      }
    }

    $us_neilian_toolbar__body__header.html(
      `共 <em class="total">${neilians.length}</em> 条内链, 内有重复内链 <em class="unique">${unique}</em> 条`)
  }

  function bindEvent () {

    $onekeyUnique.on('click', function (e) {
      var $target = $(e.target)

      var num = 0
      $.each(neilians, function (i, neilian) {
        if (neilian.index > 1) {
          num += 1
          removeNeilian(neilian)
        }

      })

      showToast(`共删除 ${num} 个内链`)

      getAllNeilians()

    })

    $refresh.on('click', function (e) {
      var $target = $(e.target)

      showToast(`刷新内链`)
      getAllNeilians()
    })

    $auto_refresh.on('click', function (e) {

      setTimeout(function () {
        var checked = $auto_refresh.prop('checked')

        autoRefresh = 'true'
        localStorage.setItem(autoRefreshKey, 'true')

        if (checked) {
          getAllNeilians()
        }
      }, 160)

    })

    $us_neilian_list.on('click', '.us_neilian_toolbar__body__list__item__name',
      function (e) {
        var $target = $(e.target).
          closest('.us_neilian_toolbar__body__list__item')

        var index = $target.data('index')

        if (neilians[index].index > 1) {
          $us_neilian_toolbar_tooltip.removeClass(
            'us_neilian_toolbar_tooltip--ok').
            addClass('us_neilian_toolbar_tooltip--warn')
          $us_neilian_toolbar_tooltip__inner.html(
            `第 ${neilians[index].index} 个`)
        } else {
          $us_neilian_toolbar_tooltip.removeClass(
            'us_neilian_toolbar_tooltip--warn').
            addClass('us_neilian_toolbar_tooltip--ok')
          $us_neilian_toolbar_tooltip__inner.html(`很有精神!`)
        }

        var offset = neilians[index].$el.offset()

        $us_neilian_toolbar_tooltip.css(offset)

        $('html').scrollTop(offset.top - 200)
      }).
      on('click', '.dis-link', function (e) {
        var $target = $(e.target)

        var index = $target.data('index')

        removeNeilian(neilians[index])

        showToast(`已删除第 ${neilians[index].index} 个 [${neilians[index].name}]`)

        getAllNeilians()
      })

    $us_neilian_toolbar_tooltip.on('click', function () {
      hideTooltip()
    })

    // $us_neilian_list.on('mousemove', function (e) {
    //
    //   var $target = $(e.target);
    //   if($target.)
    //
    // })

  }

  function hideTooltip () {
    $us_neilian_toolbar_tooltip.css({
      top: -30,
    })
  }

  function showToast (msg) {
    $us_neilian_toolbar_toast.text(msg).
      addClass('us_neilian_toolbar_toast--show')
    setTimeout(function () {
      $us_neilian_toolbar_toast.removeClass('us_neilian_toolbar_toast--show')
    }, 3000)
  }

  function runRemoveNeilianTask () {

    console.log(removeNeilianTasks)

    if (removeNeilianTasks.length > 0) {

      var needRemoveNeilian = removeNeilianTasks[0]

      var range = document.createRange()
      range.selectNodeContents(needRemoveNeilian.$el.get(0))
      var selection = window.getSelection()
      selection.removeAllRanges()
      selection.addRange(range)

      setTimeout(function () {
        var $icon = $('#J-editor-top-bar').
          find('.baike_icon_word-lianjie')
        var $button = $icon.closest('button')
        if ($button.hasClass('active')) {
          $button.trigger('click')
          showToast(`一键去重 ${needRemoveNeilian.name}`)
        }

        removeNeilianTasks.shift()

      }, 300)
    }

    setTimeout(function () {
      runRemoveNeilianTask()
    }, 500)

  }

  var removeNeilianTasks = []

  function removeNeilian (neilian) {

    removeNeilianTasks.push(neilian)

    // neilian.$el.after(neilian.name).remove()

  }

  $(function () {

    // $(".right-content").append($neilianToolbar);

    appendStyle()
    checkEditorLoad()

    //renderNeilianList()

  })

})($.noConflict(true))