ハーメルンの評価グラフを最も評価されたものを100%とした割合基準に再構成します。
// ==UserScript==
// @name Hameln RelativeGraph
// @namespace http://tampermonkey.net/
// @version 2025-01-03
// @description ハーメルンの評価グラフを最も評価されたものを100%とした割合基準に再構成します。
// @author Tomoki
// @match https://syosetu.org/?mode=ss_detail&nid=*
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
var rows = document.querySelectorAll('.table1.no_border')[0].querySelectorAll('table.table1 tr'); // 各評価バー部分のDOMを取得
var rate_list = []; // 評価数のコレクション
// * 評価数を取得して割合を計算
for(var i = 1; i < rows.length; i++){
var m = rows[i].children[0].textContent.match(/:(\d+)/); // 評価数を取得
if(m != null){
rate_list.push(Number(m[1]));
}
else{
rate_list.push(0);
}
}
const max = Math.max(...rate_list); // 評価の最大値(100%に相当する値)
const rate_percents = rate_list.map(x => Math.ceil(x / max * 100 * 100) / 100); // 各評価の割合(%付き文字列形式)小数点第三位切り上げ
// * 計算した割合を評価バーに適用
for(i = 1; i < rows.length; i++){
var bar = rows[i].children[1].children[0];
var bar_width = rate_percents[i - 1]; // rate_percentは作成の際、評価数と関係のないrows[0]を無視して作成している。その調整のため -1
if(rows[i].children[1].childElementCount >= 2){ // 評価バーの右隣に白色とか黒色とか、詰め物的な使い方がされてるバーがあるパターンがあるので、その対応
var right_bar = rows[i].children[1].children[1];
var right_width = 100 - bar_width;
// right_var の色調整 基準の100%以外は絶対右側空くはずなので(青→黒とかで右側が白色じゃないケースがある)
if(bar_width != 100){
right_bar.style.backgroundColor = "rgb(255, 255, 255)";
right_bar.style.border = "1px solid rgb(255, 255, 255)"; // 1pxとかsolidとかはたぶん固定値でいい。知らんけど
}
else{
right_bar.style.backgroundColor = bar.style.backgroundColor;
right_bar.style.border = bar.style.border;
// 左側のバーを100%にしてしまうと右側バーがすぐ下にズレて表示されるので、99と1にしておく。どうせ色同じなので見た目変わらん
bar_width = 99;
right_width = 1;
}
// 100%の評価バーが黒色だと左バーと右バーの境界線が見えてしまうので消去する(黒色だけ境界線の色がグレーに設定されるっぽい)
if(right_bar.style.backgroundColor != right_bar.style.borderColor){
bar.style.borderRight = 'none';
right_bar.style.borderLeft = 'none';
}
bar.style.width = bar_width + '%';
right_bar.style.width = right_width + '%';
}
else{ // 評価バー本体しか無いパターン
bar.style.width = bar_width + '%';
if(bar.style.float == 'right'){ // なんか評価バーのAlignmentが右のケースがあるので
bar.style.float = 'left';
}
}
}
})();