您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Percentage Rings around numbers which show grades (for with userstyles)
// ==UserScript== // @id HabrPercentageRing // @name Habr Percentage Ring // @version 11.2014.11.11 // @namespace github.com/spmbt // @author spmbt0 // @contributor KOLANICH // @description Percentage Rings around numbers which show grades (for with userstyles) // @icon http://habrahabr.ru/favicon.ico // @update 0.81 bug + подгонка эллипсов // @include /^https?://(m\.|webcache\.googleusercontent\.com\/search\?q=cache(:|%3A|%3a)(http(:|%3A|%3a)(\/|%2F|%2f)(\/|%2F|%2f))?)?(habrahabr|geektimes).ru(?!\/special|\/api)/ // @include http://habrahabr.ru* // @exclude http://habrahabr.ru/api* // @radius 14 // @magic_offsets [46, 99, 26, 56, 14, 18, 9, 12, 17, 43, 11, 4] // @delay 2999 // @pos_vote_color #1b1 // @neg_vote_color #a24 // ==/UserScript== // работает автономно или как модуль для HabrAjax "use strict"; const mo=new Int8Array(JSON.parse(GM_getMetadata("magic_offsets")[0])); const r2=GM_getMetadata("radius")[0]; const baseOpacity=0.25; const pvc=GM_getMetadata("pos_vote_color")[0]; const nvc=GM_getMetadata("neg_vote_color")[0]; function writePercRound(aP, aM) { var aPM = Number(aP) + Number(aM); if (aPM == 0) return document.createElement('div'); var c = document.createElement('canvas'), ell = 1 - 1 / 3.6; c.width = c.height = r2 * 2; c.style.backgroundColor = 'transparent'; c.style.position = 'absolute'; c.style.left = (-r2 + mo[7]) + 'px'; c.style.top = (-r2 + 1 + 8) + 'px'; var q = c.getContext("2d"), log = Math.log(aPM) / 1.6 + 1; c.style.opacity = baseOpacity + log * 0.1; c.style.zIndex = 1; q.lineWidth = log; q.strokeStyle = pvc; var perc = (0.5 - aM / aPM) * Math.PI, perc2 = (0.5 + aM / aPM) * Math.PI; q.beginPath(); q.scale(1, ell); q.arc(r2, r2 / ell, r2 - 1, perc, perc2 + 2 * (perc == perc2 && aP != 0) * Math.PI, aP == 0 || aM != 0); q.stroke(); q.beginPath(); q.strokeStyle = nvc; q.arc(r2, r2 / ell, r2 - 1, perc, perc2 + 2 * (perc == perc2 && aM != 0) * Math.PI, !1); q.stroke(); return c; } function setUpdateHandlers (oP,oPM, oPP) { var ff = function () { setTimeout(function () { habrPercentageRing(oP) }, GM_getMetadata("delay")[0]) }; oPM && oPM.addEventListener('click', ff, !1); oPP && oPP.addEventListener('click', ff, !1); }; function getPositionCenter(obj) { // var x = 0, y = 0, w2 = Math.floor(obj.offsetWidth / 2), h2 = Math.floor(obj.offsetHeight / 2); while (obj) { x += obj.offsetLeft; y += obj.offsetTop; obj = obj.offsetParent; } return {x : x, y : y, w2 : w2, h2 : h2}; }; function habrPercentageRing(blck) { var marks = blck && blck.childNodes && blck.querySelectorAll('.mark'), isC2 = blck && / c2/.test(blck.className), isQa = /\/qa\//.test(location.href); function $q(q, f) { return (f || document).querySelector(q) }; if (!marks) return; for (var i in marks) { var o = marks[i], oP = o.parentNode; if (!o || !o.attributes) continue; o.style.position = 'relative'; if (/\/users\//.test(location.href)) { oP.style.marginRight = mo[4]+'px'; oP.style.marginTop = '2px'; } var oXS = $q('span', o); if (oXS && oXS.getAttribute('title')) { let oXSt = oXS.getAttribute('title').match(/[\d\.]+/g), oC = $q('canvas', o); if (oC) oC.parentNode.removeChild(oC); if (oXSt && oXSt.length && !$q('canvas', o)) { var aP = oXSt[1], aM = oXSt[2]; let c = writePercRound(aP, aM); //getPositionCenter(o); var oPM = $q('.minus', oP), oPP = $q('.plus', oP), oPPI = /infopanel/.test(oP.parentNode.className); if (oPM && (-aP - aM)) oPM.style.left = (oPPI ? mo[0] : mo[2] + 6 * (Math.abs(aP - aM) > mo[6])) + 'px'; oXS.style.left = '-1px'; if (oPPI) { //new layout c.style.left = (Math.abs(aP - aM) > mo[1] ? -r2 + mo[8] : (aP == aM ? -r2 + 3 : -r2 + mo[10] - mo[11] * (Math.abs(aP - aM) <= mo[6]))) + 'px'; c.style.top = '-5px'; } else if (oP.parentNode.parentNode.className == 'entry-info vote_holder') { //old layout c.style.left = (Math.abs(aP - aM) > mo[1] ? -r2 + mo[3] : (aP == aM ? -r2 + mo[9] : -r2 + mo[0] + mo[11] * (Math.abs(aP - aM) > mo[6]))) + 'px'; c.style.top = isC2 ? '-6px' : '-4px'; } else { //comments c.style.left = (Math.abs(aP - aM) > mo[1] ? -r2 + mo[5] : (aP == aM ? -r2 + 8 : -r2 + mo[6] + mo[11] * (Math.abs(aP - aM) > mo[6]))) - (isC2 && !isQa ? 3 : 0) + 'px'; oXS.style.top = 0; oXS.style.left = (aP == aM ? 7 : -1) + 'px'; c.style.top = isC2 ? '-8px' : '-6px'; } oXS.style.position = 'relative'; o.insertBefore(c, oXS); if (oPPI && Math.abs(aP - aM) > mo[1]) o.style.left = (-mo[6])+'px'; oXS.style.zIndex = 2; setUpdateHandlers(oP,oPM, oPP); } } } }; habrPercentageRing(document); window.addEventListener('chgDom', function (ev) { //проверить блок по событию от модулей (Fx6+, Chrome,Safari) habrPercentageRing(ev.detail); }, !1);