Last active
June 3, 2018 14:12
-
-
Save GHolk/f9247cbd7e9e3a8c799069c07159f5d5 to your computer and use it in GitHub Desktop.
monkey patching bookmode for hackmd
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name monkey hackmd toc | |
// @namespace http://gholk.github.io | |
// @version 9 | |
// @grant none | |
// @match https://hackmd.io/* | |
// @match https://hackmd.ccns.ncku.edu.tw/* | |
// ==/UserScript== | |
/* this script monkey patch the hackmd easy content table, | |
* in hackmd right top menu list **Monkey Book** option. | |
* | |
* for example: <https://hackmd.io/ip2nlTQcRLyQhDz0nah-pQ?view> | |
*/ | |
function parseDocument(doc) { | |
const copy = doc.cloneNode(true) | |
removeOther(copy) | |
copy.id = 'monkey-content-table' | |
copy.removeAttribute('class') | |
copy.removeAttribute('style') | |
copy.querySelectorAll('a').forEach(a => a.target = 'monkey-hackmd-window') | |
return copy | |
function removeOther(doc) { | |
const removeList = [] | |
for (const element of copy.children) { | |
if (!['UL', 'H2'].includes(element.tagName)) { | |
removeList.push(element) | |
} | |
} | |
removeList.forEach(node => node.remove()) | |
doc.querySelectorAll('h2 a').forEach(a => a.remove()) | |
} | |
} | |
const monkeyCss = ` | |
#monkey-content-table { | |
padding: 0 0.6em; | |
position: absolute; | |
left: 0; | |
bottom: 0; | |
height: 100%; | |
width: 20%; | |
overflow-x: hidden; | |
overflow-y: auto; | |
background: white; | |
font-size: 16px; | |
z-index: 2000; | |
} | |
#monkey-content-table ul { | |
list-style: none; | |
padding-left: 0.5em; | |
} | |
#monkey-content-table a { | |
color: gray; | |
} | |
#monkey-content-table h2 { | |
border-bottom: solid 2px #EEE; | |
padding-bottom: 0.3em; | |
} | |
#monkey-hackmd-window { | |
position: absolute; | |
right: 0; | |
bottom: 0; | |
width: 80%; | |
height: 100%; | |
background: white; | |
z-index: 2000; | |
} | |
` | |
function monkeyIframe() { | |
const iframe = document.createElement('iframe') | |
iframe.id = iframe.name = 'monkey-hackmd-window' | |
document.body.appendChild(iframe) | |
return iframe | |
} | |
function monkeyPatchToc() { | |
const doc = document.getElementById('doc') | |
const copy = parseDocument(doc) | |
const style = document.createElement('style') | |
style.textContent = monkeyCss | |
document.body.appendChild(style) | |
document.body.appendChild(copy) | |
monkeyIframe() | |
} | |
function monkeyPatchButton() { | |
const query = '.navbar-right li:nth-child(3) .dropdown-menu' | |
const ul = document.querySelector(query) | |
const li = createItem() | |
ul.appendChild(li) | |
function createItem() { | |
const li = document.createElement('li') | |
li.setAttribute('role', 'presentation') | |
li.innerHTML = `<a role="menuitem" class="ui-extra-book" tabindex="-1"><i class="fa fa-book fa-fw"></i> Monkey Book</a>` | |
li.onclick = monkeyPatchToc | |
return li | |
} | |
} | |
monkeyPatchButton() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment