Ответы kompege | КЕГЭ

Добавляет кнопку "Ответы" рядом с количеством введенных ответов.

// ==UserScript==
// @name         Ответы kompege | КЕГЭ
// @namespace    https://greasyfork.org/users/843419
// @version      1.1
// @description  Добавляет кнопку "Ответы" рядом с количеством введенных ответов.
// @author       Zgoly
// @match        https://kompege.ru/variant*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=kompege.ru
// @grant        GM_addStyle
// @license      MIT
// ==/UserScript==

// Диалоговое окно
let modal = document.createElement('dialog')
document.body.appendChild(modal)
modal.addEventListener('click', (event) => {
    if (event.target === modal) {
        modal.close()
    }
})

// Функция для создания кнопки
const createButton = (text, action) => {
    let button = document.createElement('button')
    button.textContent = text
    button.className = 'button'
    button.addEventListener('click', action)
    return button
}

// Кнопки
let generateAnswersButton = createButton('Открыть страницу с ответами', () => {
    modal.close()
    let kimData = JSON.parse(window.localStorage.getItem('kimData'))
    let newDocument = open().document
    let newBody = newDocument.body

    let title = document.createElement('title')
    title.innerText = document.title + ' Ответы'
    newBody.appendChild(title)

    newBody.style.fontFamily = 'sans-serif'

    let mainTitle = document.createElement('h1')
    mainTitle.innerText = document.title + ' Ответы'
    newBody.appendChild(mainTitle)

    kimData.tasks.forEach(task => {
        let taskTitle = document.createElement('h2')
        taskTitle.innerText = 'Задание #' + task.number
        newBody.appendChild(taskTitle)

        newBody.innerHTML += task.text

        let answerTitle = document.createElement('h3')
        answerTitle.innerText = 'Ответ:' + task.key
        newBody.appendChild(answerTitle)

        newBody.appendChild(document.createElement('br'))
    })
})

let fillAnswersButton = createButton('Заполнить все ответы', () => {
    modal.close()
    let kimData = JSON.parse(window.localStorage.getItem('kimData'))
    kimData.tasks.forEach(task => task.answer = task.key)
    window.localStorage.setItem('kimData', JSON.stringify(kimData))
    window.location.reload()
})

let deleteAnswersButton = createButton('Удалить все ответы', () => {
    modal.close()
    let kimData = JSON.parse(window.localStorage.getItem('kimData'))
    kimData.tasks.forEach(task => task.answer = '')
    window.localStorage.setItem('kimData', JSON.stringify(kimData))
    window.location.reload()
})

let debugInfoButton = createButton('Отладочная информация', () => {
    modal.close()
    console.log(JSON.parse(window.localStorage.getItem('kimData')))
})

// Добавление кнопок в диалоговое окно
modal.appendChild(generateAnswersButton)
modal.appendChild(fillAnswersButton)
modal.appendChild(deleteAnswersButton)
modal.appendChild(debugInfoButton)

// Наблюдатель за изменениями в DOM
let observer = new MutationObserver(() => {
    let anscount = document.querySelector('.anscount')
    if (anscount) {
        observer.disconnect()
        let button = document.createElement('button')
        button.innerText = 'Ответы'
        button.className = 'button'
        button.addEventListener('click', () => {
            modal.showModal()
        })
        anscount.parentElement.appendChild(button)
    }
})
observer.observe(document.body, { childList: true, subtree: true })

// Стили
GM_addStyle(`
.button {
    background: #1e325a;
    color: #fff;
    transition: 0.2s;
    cursor: pointer;
    font-size: 16px;
    padding: 10px;
    border-radius: 5px;
    border: none;
    display: block;
    margin: 10px auto;
}
.button:hover {
    opacity: 0.75;
}
` );