Greasy Fork

Kissmanga to MangaDex Migration Tool

A tool to help migrating follows to MangaDex from Kissmanga by adding "Find on MangaDex" buttons to your bookmarks list.

目前为 2018-02-04 提交的版本。查看 最新版本

// ==UserScript==
// @name         Kissmanga to MangaDex Migration Tool
// @description  A tool to help migrating follows to MangaDex from Kissmanga by adding "Find on MangaDex" buttons to your bookmarks list.
// @namespace    Violentmonkey Scripts
// @version      1.0.0
// @author       Hajile-Haji
// @match        http://kissmanga.com/BookmarkList
// @grant        none
// ==/UserScript==

(() => {
  'use strict';

  let d = document,
      style = d.createElement('style'),
      emailDiv = d.getElementById('divEmailNotify'),
      listHead = d.querySelector('.listing > tbody > tr.head'),
      listItems = d.querySelectorAll('.listing > tbody > tr:not(.head)'),
      closed = true,
      searchModal = d.createElement('div'),
      searchBack = d.createElement('a'),
      searchIframe = d.createElement('iframe'),
      searchUrl = 'https://mangadex.com/?page=search&title='

  listHead.appendChild(d.createElement('th'))
  
  listItems.forEach(item => {
    let seriesTitle = item.querySelectorAll('td')[0].innerText.trim(),
        button = d.createElement('button'),
        buttonText = 'Find on MangaDex',
        td = d.createElement('td')
    
    button.addEventListener('click', e => {
      e.preventDefault()
      e.stopPropagation()
      
      let btn = e.target
      
      btn.innerText = 'Searching...'
      btn.disabled = true
      
      openSearch(btn.dataset.title)
        .then(() => {
            btn.innerText = buttonText
            btn.disabled = null
        })
        .catch((e) => console.log(e))
    })
    
    button.type = 'button'
    button.classList.add('clean-button')
    button.innerText = buttonText
    button.dataset.title = seriesTitle
    td.appendChild(button)
    item.appendChild(td)
  })

  searchIframe.classList.add('migration-iframe')
  searchIframe.frameBorder = 0
  searchModal.classList.add('migration-modal', 'migration-modal--hide')
  searchModal.appendChild(searchIframe)

  searchModal.addEventListener('click', e => closeSearch())
  
  searchBack.innerText = '← Go back to bookmarks'
  searchBack.href = '#'
  
  searchBack.addEventListener('click', e => {
    e.preventDefault()
    closeSearch()
  })

  searchModal.appendChild(searchBack)

  d.body.appendChild(searchModal)
  
  function openSearch(title) {
    closed = false;
    searchIframe.src = searchUrl + encodeURIComponent(title)

    return new Promise((resolve, reject) => {
      searchIframe.addEventListener('load', e => {
        if (!closed) {
          resolve()
          searchModal.classList.remove('migration-modal--hide')
          setTimeout(() => searchModal.classList.add('migration-modal--show'), 10)
        }
      })

      searchIframe.addEventListener('error', e => {
        reject(e)
      })
    })
  }
  
  function closeSearch() {
    closed = true;
    searchModal.classList.remove('migration-modal--show')
    setTimeout(() => {
      searchModal.classList.add('migration-modal--hide')
      searchIframe.src = ''
    }, 300)
  }

  
  style.id = 'migrationToolStyle'
  style.innerText =
`
.clean-button {
  background: none repeat scroll 0 0 transparent;
  border: 0 none;
	color: #a8ff96;
  cursor: pointer;
  font-family: inherit;
  padding: 4px;
  white-space: nowrap;
}
.clean-button:hover {
  color: #FFF;
}
.migration-modal {
  align-items: center;
  background-color: rgba(0, 0, 0, 0.9);
  color: #FFF;
  display: flex;
  flex-flow: column nowrap;
  height: 100vh;
  justify-content: center;
  left: 0;
  opacity: 0;
  position: fixed;
  top: 0;
  transition: opacity 0.25s ease;
  width: 100vw;
  z-index: 999999999;
}
.migration-modal--hide {
  display: none;
}
.migration-modal--show {
  opacity: 1;
  transition: opacity 0.25s ease;
}
.migration-iframe {
	width: 800px;
	height: 80%;
}
.migration-modal a {
  display: inline-block;
  color: #FFF;
  margin-top: 10px;
}
.migration-modal a:hover {
  text-decoration: underline;
}
`
  d.head.appendChild(style)
})()