Paste-to-Markdown / clipboard2markdown.js
wassemgtk's picture
Upload 3 files
be19770
(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);
});
});
})();