Spaces:
Running
Running
(function () { | |
'use strict'; | |
// http://pandoc.org/README.html#pandocs-markdown | |
var pandoc = [ | |
{ | |
filter: 'h1', | |
replacement: function (content, node) { | |
var underline = Array(content.length + 1).join('='); | |
return '\n\n' + content + '\n' + underline + '\n\n'; | |
} | |
}, | |
{ | |
filter: 'h2', | |
replacement: function (content, node) { | |
var underline = Array(content.length + 1).join('-'); | |
return '\n\n' + content + '\n' + underline + '\n\n'; | |
} | |
}, | |
{ | |
filter: 'sup', | |
replacement: function (content) { | |
return '^' + content + '^'; | |
} | |
}, | |
{ | |
filter: 'sub', | |
replacement: function (content) { | |
return '~' + content + '~'; | |
} | |
}, | |
{ | |
filter: 'br', | |
replacement: function () { | |
return '\\\n'; | |
} | |
}, | |
{ | |
filter: 'hr', | |
replacement: function () { | |
return '\n\n* * * * *\n\n'; | |
} | |
}, | |
{ | |
filter: ['em', 'i', 'cite', 'var'], | |
replacement: function (content) { | |
return '*' + content + '*'; | |
} | |
}, | |
{ | |
filter: function (node) { | |
var hasSiblings = node.previousSibling || node.nextSibling; | |
var isCodeBlock = node.parentNode.nodeName === 'PRE' && !hasSiblings; | |
var isCodeElem = node.nodeName === 'CODE' || | |
node.nodeName === 'KBD' || | |
node.nodeName === 'SAMP' || | |
node.nodeName === 'TT'; | |
return isCodeElem && !isCodeBlock; | |
}, | |
replacement: function (content) { | |
return '`' + content + '`'; | |
} | |
}, | |
{ | |
filter: function (node) { | |
return node.nodeName === 'A' && node.getAttribute('href'); | |
}, | |
replacement: function (content, node) { | |
var url = node.getAttribute('href'); | |
var titlePart = node.title ? ' "' + node.title + '"' : ''; | |
if (content === url) { | |
return '<' + url + '>'; | |
} else if (url === ('mailto:' + content)) { | |
return '<' + content + '>'; | |
} else { | |
return '[' + content + '](' + url + titlePart + ')'; | |
} | |
} | |
}, | |
{ | |
filter: 'li', | |
replacement: function (content, node) { | |
content = content.replace(/^\s+/, '').replace(/\n/gm, '\n '); | |
var prefix = '- '; | |
var parent = node.parentNode; | |
if (/ol/i.test(parent.nodeName)) { | |
var index = Array.prototype.indexOf.call(parent.children, node) + 1; | |
prefix = index + '. '; | |
while (prefix.length < 4) { | |
prefix += ' '; | |
} | |
} | |
return prefix + content; | |
} | |
} | |
]; | |
// http://pandoc.org/README.html#smart-punctuation | |
var escape = function (str) { | |
return str.replace(/[\u2018\u2019\u00b4]/g, "'") | |
.replace(/[\u201c\u201d\u2033]/g, '"') | |
.replace(/[\u2212\u2022\u00b7\u25aa]/g, '-') | |
.replace(/[\u2013\u2015]/g, '--') | |
.replace(/\u2014/g, '---') | |
.replace(/\u2026/g, '...') | |
.replace(/[ ]+\n/g, '\n') | |
.replace(/\s*\\\n/g, '\\\n') | |
.replace(/\s*\\\n\s*\\\n/g, '\n\n') | |
.replace(/\s*\\\n\n/g, '\n\n') | |
.replace(/\n-\n/g, '\n') | |
.replace(/\n\n\s*\\\n/g, '\n\n') | |
.replace(/\n\n\n*/g, '\n\n') | |
.replace(/[ ]+$/gm, '') | |
.replace(/^\s+|[\s\\]+$/g, ''); | |
}; | |
var convert = function (str) { | |
return escape(toMarkdown(str, { converters: pandoc, gfm: true })); | |
} | |
var insert = function (myField, myValue) { | |
if (document.selection) { | |
myField.focus(); | |
sel = document.selection.createRange(); | |
sel.text = myValue; | |
sel.select() | |
} else { | |
if (myField.selectionStart || myField.selectionStart == "0") { | |
var startPos = myField.selectionStart; | |
var endPos = myField.selectionEnd; | |
var beforeValue = myField.value.substring(0, startPos); | |
var afterValue = myField.value.substring(endPos, myField.value.length); | |
myField.value = beforeValue + myValue + afterValue; | |
myField.selectionStart = startPos + myValue.length; | |
myField.selectionEnd = startPos + myValue.length; | |
myField.focus() | |
} else { | |
myField.value += myValue; | |
myField.focus() | |
} | |
} | |
}; | |
// http://stackoverflow.com/questions/2176861/javascript-get-clipboard-data-on-paste-event-cross-browser | |
document.addEventListener('DOMContentLoaded', function () { | |
var info = document.querySelector('#info'); | |
var pastebin = document.querySelector('#pastebin'); | |
var output = document.querySelector('#output'); | |
var wrapper = document.querySelector('#wrapper'); | |
document.addEventListener('keydown', function (event) { | |
if (event.ctrlKey || event.metaKey) { | |
if (String.fromCharCode(event.which).toLowerCase() === 'v') { | |
pastebin.innerHTML = ''; | |
pastebin.focus(); | |
info.classList.add('hidden'); | |
wrapper.classList.add('hidden'); | |
} | |
} | |
}); | |
pastebin.addEventListener('paste', function () { | |
setTimeout(function () { | |
var html = pastebin.innerHTML; | |
var markdown = convert(html); | |
// output.value = markdown; | |
insert(output, markdown); | |
wrapper.classList.remove('hidden'); | |
output.focus(); | |
output.select(); | |
}, 200); | |
}); | |
}); | |
})(); | |