您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
AtCoder公式のレーティングアイコンを非表示にできるようにする拡張機能
- // ==UserScript==
- // @name ac-hide-official-rating-icon
- // @namespace https://atcoder.jp/
- // @version 1.02
- // @description AtCoder公式のレーティングアイコンを非表示にできるようにする拡張機能
- // @author konchanksu
- // @license MIT
- // @match https://atcoder.jp/*
- // @grant none
- // ==/UserScript==
- const SHOW_RATING_ICON_FG = 'showRatingIconFg';
- const SHOW_RATING_ICON_STANDINGS_FG = 'showRatingIconProfileFg';
- const CHECKBOX_STATE_KEY = 'ac-hide-rating-icon-config';
- class LocalStorageController {
- constructor() {
- this.changeState = true;
- if (!localStorage.hasOwnProperty(CHECKBOX_STATE_KEY)) {
- this.saveRadioState({
- showRatingIconFg: false,
- showRatingIconProfileFg: false,
- });
- }
- }
- saveRadioState(flags) {
- this.changeState = true;
- localStorage.setItem(CHECKBOX_STATE_KEY, JSON.stringify(flags));
- }
- getRadioState() {
- if (this.changeState) {
- const jsonString = localStorage.getItem(CHECKBOX_STATE_KEY);
- const object = JSON.parse(jsonString);
- const needSave = !object.hasOwnProperty(SHOW_RATING_ICON_FG) ||
- !object.hasOwnProperty(SHOW_RATING_ICON_STANDINGS_FG);
- this.showRatingIconFg = object.hasOwnProperty(SHOW_RATING_ICON_FG)
- ? object[SHOW_RATING_ICON_FG]
- : true;
- this.showRatingIconProfileFg = object.hasOwnProperty(SHOW_RATING_ICON_STANDINGS_FG)
- ? object[SHOW_RATING_ICON_STANDINGS_FG]
- : true;
- if (needSave) {
- this.saveRadioState({
- showRatingIconFg: this.showRatingIconFg,
- showRatingIconProfileFg: this.showRatingIconProfileFg,
- });
- this.changeState = false;
- }
- }
- return {
- showRatingIconFg: this.showRatingIconFg,
- showRatingIconProfileFg: this.showRatingIconProfileFg,
- };
- }
- }
- const RATING_ICON_CLASSES = [
- 'user-rating-stage-l',
- 'user-rating-stage-m',
- 'user-rating-stage-s',
- ];
- const CURRENT_LANGUAGE = (() => {
- const dropdown_toggle = document.getElementsByClassName('dropdown-toggle');
- const isIncludeEn = Array.prototype.filter.call(dropdown_toggle, (element) => element.textContent.includes('English')).length !== 0;
- return isIncludeEn ? 'EN' : 'JA'; // default JA
- })();
- const IS_CURRENT_LANGUAGE_JA = CURRENT_LANGUAGE === 'JA';
- const CONFIG_DROPDOWN_JA = {
- title: ' ac-hide-icon 設定',
- radio: [
- {
- title: 'レーティングアイコンを非表示にしない',
- id: 'any',
- showRatingIconFg: true,
- showRatingIconProfileFg: true,
- },
- {
- title: 'プロフィールページのみ非表示にする',
- id: 'only-not-standings',
- showRatingIconFg: true,
- showRatingIconProfileFg: false,
- },
- {
- title: 'レーティングアイコンを全て非表示にする',
- id: 'all',
- showRatingIconFg: false,
- showRatingIconProfileFg: false,
- },
- ],
- };
- const CONFIG_DROPDOWN_EN = {
- title: ' ac-hide-icon',
- radio: [
- {
- title: 'show the rating icon',
- id: 'any',
- showRatingIconFg: true,
- showRatingIconProfileFg: true,
- },
- {
- title: 'hide the rating icon only on the profile page',
- id: 'only-not-standings',
- showRatingIconFg: true,
- showRatingIconProfileFg: false,
- },
- {
- title: 'hide the rating icon',
- id: 'all',
- showRatingIconFg: false,
- showRatingIconProfileFg: false,
- },
- ],
- };
- const CONFIG_DROPDOWN = IS_CURRENT_LANGUAGE_JA
- ? CONFIG_DROPDOWN_JA
- : CONFIG_DROPDOWN_EN;
- const MODAL_HTML_BASE = `<div id="modal-ac-hide-icon-settings" class="modal fade" tabindex="-1" role="dialog">
- <div class="modal-dialog" role="document">
- <div class="modal-content">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-label="Close">
- <span aria-hidden="true">×</span>
- </button>
- <h4 class="modal-title">
- ${CONFIG_DROPDOWN['title']}
- </h4>
- </div>
- <div class="modal-body">
- <div class="container-fluid">
- <div class="settings-row row" id="ac-hide-rating-icon-radio">
- </div>
- </div>
- </div>
- <div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">close</button>
- </div>
- </div>
- </div>`;
- const RADIO_HTML_BASE = (text, id) => `<div class="radio">
- <label>\
- <input type="radio" name="ac-hide-rating-icon-config" id="ac-hide-rating-icon-${id}" required> ${text}
- </label>
- </div>`;
- const localStorageController = new LocalStorageController();
- function isDropDownMenu() {
- return (document.getElementsByClassName('header-mypage_btn').length === 0 ||
- CURRENT_LANGUAGE === 'EN');
- }
- function createRadio() {
- const radioState = localStorageController.getRadioState();
- CONFIG_DROPDOWN['radio'].forEach((element) => {
- var _a;
- const { title, id, showRatingIconFg, showRatingIconProfileFg } = element;
- const radio = RADIO_HTML_BASE(title, id);
- (_a = document
- .querySelector('#ac-hide-rating-icon-radio')) === null || _a === void 0 ? void 0 : _a.insertAdjacentHTML('afterbegin', radio);
- const currentRadio = document.getElementById(`ac-hide-rating-icon-${id}`);
- currentRadio.addEventListener('click', () => {
- localStorageController.saveRadioState({
- showRatingIconFg,
- showRatingIconProfileFg,
- });
- currentRadio.checked = true;
- checkAndHideIcons();
- });
- if (radioState['showRatingIconFg'] === showRatingIconFg &&
- radioState['showRatingIconProfileFg'] === showRatingIconProfileFg) {
- currentRadio.checked = true;
- }
- });
- }
- function createModal() {
- var _a;
- (_a = document
- .querySelector('body')) === null || _a === void 0 ? void 0 : _a.insertAdjacentHTML('afterbegin', MODAL_HTML_BASE);
- createRadio();
- }
- function controlIcons(hideFg) {
- RATING_ICON_CLASSES.forEach((ratingIconClass) => {
- const ratingIcons = document.getElementsByClassName(ratingIconClass);
- Array.prototype.forEach.call(ratingIcons, (element) => {
- element.style.display = hideFg ? 'none' : 'unset';
- });
- });
- }
- function showHeaderSettingForDropDown() {
- const headerMyPageList = document.getElementsByClassName('dropdown-menu')[1];
- const newElement = createHeaderSettingElementForDropDown();
- const positionIndex = 6;
- if (positionIndex >= headerMyPageList.children.length) {
- headerMyPageList.appendChild(newElement);
- }
- else {
- headerMyPageList.insertBefore(newElement, headerMyPageList.children[positionIndex]);
- }
- }
- function showHeaderSetting() {
- const headerMyPageList = document.getElementsByClassName('header-mypage_list')[0];
- const newElement = createHeaderSettingElement();
- const positionIndex = 5;
- if (headerMyPageList) {
- if (positionIndex >= headerMyPageList.children.length) {
- headerMyPageList.appendChild(newElement);
- }
- else {
- headerMyPageList.insertBefore(newElement, headerMyPageList.children[positionIndex]);
- }
- }
- }
- function createGlyphicon() {
- const innerSpanTag = document.createElement('span');
- ['glyphicon', 'glyphicon-wrench'].forEach((tag) => innerSpanTag.classList.add(tag));
- return innerSpanTag;
- }
- function createIcon() {
- const innerITag = document.createElement('i');
- ['a-icon', 'a-icon-setting'].forEach((tag) => innerITag.classList.add(tag));
- return innerITag;
- }
- function createHeaderATag() {
- const aTag = document.createElement('a');
- const text = document.createTextNode(CONFIG_DROPDOWN['title']);
- aTag.appendChild(text);
- aTag.setAttribute('data-toggle', 'modal');
- aTag.setAttribute('data-target', '#modal-ac-hide-icon-settings');
- return aTag;
- }
- function createHeaderSettingElementForDropDown() {
- const element = document.createElement('li');
- const innerATag = createHeaderATag();
- const innerSpanTag = createGlyphicon();
- element.appendChild(innerATag);
- innerATag.insertBefore(innerSpanTag, innerATag.firstChild);
- return element;
- }
- function createHeaderSettingElement() {
- const element = document.createElement('li');
- const innerATag = createHeaderATag();
- const innerTag = IS_CURRENT_LANGUAGE_JA ? createIcon() : createGlyphicon();
- element.appendChild(innerATag);
- innerATag.insertBefore(innerTag, innerATag.firstChild);
- return element;
- }
- function observeLoadingHideClassForStandings(hide) {
- const target = document.getElementsByClassName('loading-hide');
- if (target) {
- const observer = new MutationObserver(() => {
- // 読み込み後は standings-tbody に順位情報が格納されるため、それを参照する
- observeStandings(hide);
- controlIcons(hide);
- });
- observer.observe(target[1], {
- childList: true,
- });
- observeStandings(hide);
- }
- }
- function observeStandings(hide) {
- const target = document.getElementById('standings-tbody');
- if (target) {
- const observer = new MutationObserver(() => {
- controlIcons(hide);
- });
- observer.observe(target, {
- childList: true,
- });
- }
- }
- function checkAndHideIcons() {
- const { showRatingIconFg, showRatingIconProfileFg } = localStorageController.getRadioState();
- const url = window.location.href;
- controlIcons(!showRatingIconFg ||
- (url.match(/.*users.*/) !== null && !showRatingIconProfileFg));
- if (url.match(/.*standings/g)) {
- observeLoadingHideClassForStandings(!showRatingIconFg);
- }
- }
- function main() {
- checkAndHideIcons();
- // 設定作る系
- createModal();
- if (isDropDownMenu()) {
- showHeaderSettingForDropDown();
- }
- else {
- showHeaderSetting();
- }
- }
- (function () {
- if (document.readyState === 'loading') {
- document.addEventListener('DOMContentLoaded', () => main());
- }
- else {
- main();
- }
- })();
- //# sourceMappingURL=index.js.map
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址