bachngocsach.vip chapter content copy

This script let you save the content of the reading chapter on bachngocsach.vip (vip.bachngocsach.com) from clipboard

目前为 2024-03-20 提交的版本。查看 最新版本

// ==UserScript==
// @name        bachngocsach.vip chapter content copy
// @name:en     bachngocsach.vip chapter content copy
// @namespace   Violentmonkey Scripts
// @match       https://bachngocsach.vip/*
// @match       https://vip.bachngocsach.com/*
// @grant       GM.setClipboard
// @version     1.0
// @author      Me
// @run-at       document-end
// @description This script let you save the content of the reading chapter on bachngocsach.vip (vip.bachngocsach.com) from clipboard
// @description:en This script let you save the content of the reading chapter on bachngocsach.vip (vip.bachngocsach.com) from clipboard
// ==/UserScript==

function getStyle(style) {
  if (!style || typeof style !== 'string') return false;
  let result = {};
  style.split('}').forEach(e => {
    let name = e.startsWith('.') ? e.slice(1, e.indexOf('{')) : e.slice(0, e.indexOf('{'));
    let order = parseInt(e.slice(e.indexOf(':') + 1));
    result[name] = order;
  });
  return result;
}

async function sleep(ms = 10) { return new Promise((res) => setTimeout(res, ms)) }

async function waitForKeyElements(selector = '#content', delayTime = 300, tries = 10) {
  return new Promise(async (res) => {
    for (let i = 0; i < tries; i++) {
      let result = document.querySelectorAll(selector);
      if (result.length > 0) res(result);
      await sleep(delayTime);
    }
    res(false);
  })
}

var oldUrl = '';
async function bnsVipChapter() {
  if (oldUrl == window.location.href) return false;
  let content = await waitForKeyElements('#id_chap_content');
  if (!content) return false;

  document.querySelector('#id_chap_content p:nth-child(2)').scrollIntoView();
  let style = await waitForKeyElements('#box-chapter-content style'); //return HTMLCollection or false
  if (style) style = getStyle(style[0].textContent);

  let txt = '';
  if (content.length > 0) {
    let goodText = document.querySelector('#chapter-id>div>div:nth-child(1)').textContent;
    let badText = document.querySelector('#chapter-id>div>div:nth-child(2)');

    let way = 'new';
    if (style) way = 'old';  //old,new
    let badPara = Array(badText.children.length);

    switch (way) {
      case 'old':
        for (const eights of badText.children) {
          let className = eights.className.toLowerCase();
          let badLine = Array(eights.children.length);
          for (const sixes of eights.children) badLine[style[sixes.tagName.toLowerCase()]] = sixes.textContent;
          badPara[style[className]] = badLine.join('');
        }
        break;

      case 'new':
        style = {};
        for (let eights of badText.children) {
          let className = eights.className.toLowerCase();
          style[className] = parseInt(getComputedStyle(eights).order);
          let badLine = Array(eights.children.length);
          for (let sixes of eights.children) {
            let tagName = sixes.tagName.toLowerCase();
            if (!style[tagName]) style[tagName] = parseInt(getComputedStyle(sixes).order);
            badLine[style[tagName]] = sixes.textContent;
          }
          badPara[style[className]] = badLine.join('');
        }
        break;
    }//end switch  
    badText = badPara.join('\n\n');
    txt = goodText.trim() + badText.trim();
  }
  GM.setClipboard(txt, 'text/plain');
  console.log(txt);
  document.querySelector('#app').scrollIntoView();
}

let rootObserver;
let chapterObserver;

async function rootObserve() {
  if (!chapterObserver &&
    /(^http(s)?:\/\/vip.bachngocsach.com\/(dich|sang-tac)\/)|(^http(s)?:\/\/bachngocsach.vip\/(dich|sang-tac)\/)/i.test(window.location.href)) {
    chapterObserver = new MutationObserver(chapterObserve);
    let target = document.querySelector('#box-chapter-content');
    if (target) chapterObserver.observe(target, { childList: true, subtree: true });
  }

  if (chapterObserver &&
    !/(^http(s)?:\/\/vip.bachngocsach.com\/(dich|sang-tac)\/)|(^http(s)?:\/\/bachngocsach.vip\/(dich|sang-tac)\/)/i.test(window.location.href)) {
    chapterObserver.disconnect();
    chapterObserver = undefined;
  }
}

async function chapterObserve(e) {
  if (oldUrl == window.location.href) return false;
  await bnsVipChapter();
  oldUrl = window.location.href;
  return true;
}

(async function () {
  await chapterObserve();
  rootObserver = new MutationObserver(rootObserve);
  rootObserver.observe(document.querySelector('#app:last-child'), { childList: true, subtree: true });
})();