SikDang Template Loader

2021. 7. 10. 오전 3:20:30

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         SikDang Template Loader
// @namespace    http://tampermonkey.net/
// @version      1.1
// @author       6173~
// @match        https://arca.live/b/*/write
// @icon         https://www.google.com/s2/favicons?domain=arca.live
// @grant        none
// @description  2021. 7. 10. 오전 3:20:30
// ==/UserScript==

// 고정 탬플릿

const TEMPLATE = {

  '요청': 'https://arca.live/b/smpeople/29695511',

  '미번': 'https://arca.live/b/smpeople/29696978',

  '번역': 'https://arca.live/b/smpeople/29697375'

};

 

// 고정 탬플릿 fetch로 불러오기

const fetchTemplate = async (category) => {

  // 커스텀 양식 불러오기

  let currentTemplate = localStorage.getItem("ARCA_CUSTOM_FORM_FOR_PATH_" + location.pathname + "_AND_FOR_CATEGORY_" + category)

  if(currentTemplate) return currentTemplate

  // 기본 양식 불러오기

  if(!TEMPLATE[category]) return '';

  return await fetch(TEMPLATE[category])

    .then(res => res.text())

    .then(html => new DOMParser().parseFromString(html, 'text/html'))

    .then(dom => dom.querySelector("div.fr-view.article-content > table").outerHTML); // 해당 게시글에서 table만 불러오기

}



// 탬플릿 불러오기

const loadTemplate = async (category) => {

  const template = await fetchTemplate(category);

  const editorBox = document.querySelector('.write-body .fr-element');

  let formDiv = editorBox.querySelector("#smpeople-article-form")

  if (!template && formDiv) {

    editorBox.removeChild(formDiv);

  } else {

    if (!formDiv) {

      let formElement = document.createElement("div");

      formElement.setAttribute("id", "smpeople-article-form")

      editorBox.appendChild(formElement)

      formDiv = editorBox.querySelector("#smpeople-article-form")

    }

  formDiv.innerHTML = template;

  }

};



// 탬플릿 붙여넣기

const attachTemplate = () => {

  const tabs = document.querySelectorAll('.sub-row span');

  tabs.forEach(tab => {

    const button = tab.querySelector('input');

    const label = tab.querySelector('label');

    

    if(button && label) {

      button.addEventListener('click', e => {

        loadTemplate(label.innerText);

      });

    }

  });

}



// onload시 한번 실행

let loaded = false

window.addEventListener('load', e => {

  if(!loaded) {

    attachTemplate();

    customForm();

    loaded = true

  }

});



// 커스텀 양식 함수

function customForm() {

  // 커스텀 양식 저장

  let makeFormBtn = document.createElement("div")

  makeFormBtn.setAttribute("class", "btn btn-arca")

  makeFormBtn.setAttribute("id", "makeFormBtn")

  makeFormBtn.setAttribute("style", "margin:0 5px")

  makeFormBtn.append("양식 저장")

  makeFormBtn.onclick = function() {

    let doCustom = confirm("본 게시글을 양식으로 저장하시겠습니까?\n현재 선택된 탭에 본 게시글이 양식으로 설정되며,\n기존 양식을 덮어쓰게 됩니다.")

    if (doCustom) {

      checkRadio("category").then((category) => {

        let customForm = document.querySelector('.write-body .fr-element').innerHTML

        localStorage.setItem("ARCA_CUSTOM_FORM_FOR_PATH_" + location.pathname + "_AND_FOR_CATEGORY_" + category, String(customForm))

      })

    }

  }

  // 커스텀 양식 삭제

  let deleteFormBtn = document.createElement("div")

  deleteFormBtn.setAttribute("class", "btn btn-arca")

  deleteFormBtn.setAttribute("id", "deleteFormBtn")

  deleteFormBtn.setAttribute("style", "margin:0 5px")

  deleteFormBtn.append("양식 삭제")

  deleteFormBtn.onclick = function() {

    let doCustom = confirm("현재 선택된 탭에 설정된 양식을 삭제하시겠습니까?\n단, 기본 양식은 삭제되지 않습니다.")

    if (doCustom) {

      checkRadio("category").then((category) => {

        localStorage.removeItem("ARCA_CUSTOM_FORM_FOR_PATH_" + location.pathname + "_AND_FOR_CATEGORY_" + category)

      })

    }

  }

  // 글머리 div에 버튼 추가

  let articleRow = document.querySelector("#article_write_form > div:nth-child(5)")

  articleRow.appendChild(makeFormBtn)

  articleRow.appendChild(deleteFormBtn)

  

}



// 라디오버튼 체크 함수

function checkRadio(name) {

  return new Promise((resolve, reject) => {

    var radios = document.getElementsByName(name);

    for (let i = 0, length = radios.length; i < length; i++) {

      if (radios[i].checked) {

        resolve(radios[i].value)

      }

    }

  })

}