atcoder-refactor

Rewrites variable names in AtCoder problem statements.

2020-06-15 기준 버전입니다. 최신 버전을 확인하세요.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         atcoder-refactor
// @namespace    https://github.com/yoshrc
// @version      0.1
// @description  Rewrites variable names in AtCoder problem statements.
// @author       yoshrc
// @match        https://atcoder.jp/contests/*/tasks/*
// @grant        none
// ==/UserScript==

// TODO
// - Inline edit like IDE's multiselection instead of popup
// - Save variable name mapping in localStorage

(function() {
    'use strict';

    const ID_ATTR = 'data-atcoder-refactor-id';

    const isAlpha = str => str.match(/^[A-Za-z]+$/);

    const rewriteVariables = id => {
        // TODO: Use current variable name instead of id
        const newName = prompt('Variable Name', id);
        document.querySelectorAll(`[${ID_ATTR}=${id}]`).forEach(varElem => {
            varElem.textContent = newName;
        })
    }

    // TODO: Use MathJax hook instead of wait 1000ms
    setTimeout(() => {
        document.querySelectorAll('.mjx-char').forEach(varElem => {
            const varId = varElem.textContent;
            if (!isAlpha(varId)) {
                return;
            }

            varElem.setAttribute(ID_ATTR, varId);
            varElem.onclick = () => rewriteVariables(varId);
        });
    }, 1000);
})();