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); | |
| }); | |
| }); | |
| })(); | |