// ==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))