summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouwe Maan <douwe@selenight.nl>2017-01-16 16:44:46 -0500
committerDouwe Maan <douwe@selenight.nl>2017-01-16 17:15:39 -0500
commit37cabebe1661ab09eec6dfb74b7b09bc03e5f454 (patch)
tree59872a8973ad00d89f38ea2312ab1e31d5edee87
parentdbfa58e2da7f939734eee5a599b4014d6095dde3 (diff)
downloadgitlab-ce-37cabebe1661ab09eec6dfb74b7b09bc03e5f454.tar.gz
Address style feedback
-rw-r--r--app/assets/javascripts/copy_as_gfm.js.es6293
1 files changed, 150 insertions, 143 deletions
diff --git a/app/assets/javascripts/copy_as_gfm.js.es6 b/app/assets/javascripts/copy_as_gfm.js.es6
index 4827f7b7420..f9098c7041c 100644
--- a/app/assets/javascripts/copy_as_gfm.js.es6
+++ b/app/assets/javascripts/copy_as_gfm.js.es6
@@ -1,192 +1,195 @@
/* eslint-disable class-methods-use-this */
+/*jshint esversion: 6 */
(() => {
const gfmRules = {
// Should have an entry for every filter in lib/banzai/pipeline/gfm_pipeline.rb,
// in reverse order.
// Should have test coverage in spec/features/copy_as_gfm_spec.rb.
- "InlineDiffFilter": {
- "span.idiff.addition": function(el, text) {
- return "{+" + text + "+}";
+ InlineDiffFilter: {
+ 'span.idiff.addition'(el, text) {
+ return `{+${text}+}`;
},
- "span.idiff.deletion": function(el, text) {
- return "{-" + text + "-}";
+ 'span.idiff.deletion'(el, text) {
+ return `{-${text}-}`;
},
},
- "TaskListFilter": {
- "input[type=checkbox].task-list-item-checkbox": function(el, text) {
- return '[' + (el.checked ? 'x' : ' ') + ']';
+ TaskListFilter: {
+ 'input[type=checkbox].task-list-item-checkbox'(el, text) {
+ return `[${el.checked ? 'x' : ' '}]`;
}
},
- "ReferenceFilter": {
- "a.gfm:not([data-link=true])": function(el, text) {
- return el.getAttribute('data-original') || text;
+ ReferenceFilter: {
+ 'a.gfm:not([data-link=true])'(el, text) {
+ return el.dataset.original || text;
},
},
- "AutolinkFilter": {
- "a": function(el, text) {
- if (text != el.getAttribute("href")) {
- // Fall back to handler for MarkdownFilter
- return false;
- }
+ AutolinkFilter: {
+ 'a'(el, text) {
+ // Fallback on the regular MarkdownFilter's `a` handler.
+ if (text !== el.getAttribute('href')) return false;
return text;
},
},
- "TableOfContentsFilter": {
- "ul.section-nav": function(el, text) {
- return "[[_TOC_]]";
+ TableOfContentsFilter: {
+ 'ul.section-nav'(el, text) {
+ return '[[_TOC_]]';
},
},
- "EmojiFilter": {
- "img.emoji": function(el, text) {
- return el.getAttribute("alt");
+ EmojiFilter: {
+ 'img.emoji'(el, text) {
+ return el.getAttribute('alt');
},
},
- "ImageLinkFilter": {
- "a.no-attachment-icon": function(el, text) {
+ ImageLinkFilter: {
+ 'a.no-attachment-icon'(el, text) {
return text;
},
},
- "VideoLinkFilter": {
- ".video-container": function(el, text) {
- var videoEl = el.querySelector('video');
- if (!videoEl) {
- return false;
- }
+ VideoLinkFilter: {
+ '.video-container'(el, text) {
+ let videoEl = el.querySelector('video');
+ if (!videoEl) return false;
return CopyAsGFM.nodeToGFM(videoEl);
},
- "video": function(el, text) {
- return "![" + el.getAttribute('data-title') + "](" + el.getAttribute("src") + ")";
+ 'video'(el, text) {
+ return `![${el.dataset.title}](${el.getAttribute('src')})`;
},
},
- "MathFilter": {
- "pre.code.math[data-math-style='display']": function(el, text) {
- return "```math\n" + text.trim() + "\n```";
+ MathFilter: {
+ 'pre.code.math[data-math-style=display]'(el, text) {
+ return '```math\n' + text.trim() + '\n```';
},
- "code.code.math[data-math-style='inline']": function(el, text) {
- return "$`" + text + "`$";
+ 'code.code.math[data-math-style=inline]'(el, text) {
+ return '$`' + text + '`$';
},
- "span.katex-display span.katex-mathml": function(el, text) {
- var mathAnnotation = el.querySelector('annotation[encoding="application/x-tex"]');
- if (!mathAnnotation) {
- return false;
- }
+ 'span.katex-display span.katex-mathml'(el, text) {
+ let mathAnnotation = el.querySelector('annotation[encoding="application/x-tex"]');
+ if (!mathAnnotation) return false;
- return "```math\n" + CopyAsGFM.nodeToGFM(mathAnnotation) + "\n```";
+ return '```math\n' + CopyAsGFM.nodeToGFM(mathAnnotation) + '\n```';
},
- "span.katex-mathml": function(el, text) {
- var mathAnnotation = el.querySelector('annotation[encoding="application/x-tex"]');
- if (!mathAnnotation) {
- return false;
- }
+ 'span.katex-mathml'(el, text) {
+ let mathAnnotation = el.querySelector('annotation[encoding="application/x-tex"]');
+ if (!mathAnnotation) return false;
- return "$`" + CopyAsGFM.nodeToGFM(mathAnnotation) + "`$";
+ return '$`' + CopyAsGFM.nodeToGFM(mathAnnotation) + '`$';
},
- "span.katex-html": function(el, text) {
- return "";
+ 'span.katex-html'(el, text) {
+ // We don't want to include the content of this element in the copied text.
+ return '';
},
- 'annotation[encoding="application/x-tex"]': function(el, text) {
+ 'annotation[encoding="application/x-tex"]'(el, text) {
return text.trim();
}
},
- "SyntaxHighlightFilter": {
- "pre.code.highlight": function(el, text) {
- var lang = el.getAttribute("lang");
- if (lang == "text") {
- lang = "";
+ SyntaxHighlightFilter: {
+ 'pre.code.highlight'(el, text) {
+ let lang = el.getAttribute('lang');
+ if (lang === 'text') {
+ lang = '';
}
- return "```" + lang + "\n" + text.trim() + "\n```";
+ return '```' + lang + '\n' + text.trim() + '\n```';
},
- "pre > code": function(el, text) {
+ 'pre > code'(el, text) {
// Don't wrap code blocks in ``
return text;
},
},
- "MarkdownFilter": {
- "code": function(el, text) {
- var backtickCount = 1;
- var backtickMatch = text.match(/`+/);
+ MarkdownFilter: {
+ 'code'(el, text) {
+ let backtickCount = 1;
+ let backtickMatch = text.match(/`+/);
if (backtickMatch) {
backtickCount = backtickMatch[0].length + 1;
}
- var backticks = new Array(backtickCount + 1).join('`');
- var spaceOrNoSpace = backtickCount > 1 ? " " : "";
+ let backticks = new Array(backtickCount + 1).join('`');
+ let spaceOrNoSpace = backtickCount > 1 ? ' ' : '';
return backticks + spaceOrNoSpace + text + spaceOrNoSpace + backticks;
},
- "blockquote": function(el, text) {
- return text.trim().split('\n').map(function(s) { return ('> ' + s).trim(); }).join('\n');
+ 'blockquote'(el, text) {
+ return text.trim().split('\n').map((s) => (`> ${s}`).trim()).join('\n');
},
- "img": function(el, text) {
- return "![" + el.getAttribute("alt") + "](" + el.getAttribute("src") + ")";
+ 'img'(el, text) {
+ return `![${el.getAttribute('alt')}](${el.getAttribute('src')})`;
},
- "a.anchor": function(el, text) {
+ 'a.anchor'(el, text) {
+ // Don't render a Markdown link for the anchor link inside a heading
return text;
},
- "a": function(el, text) {
- return "[" + text + "](" + el.getAttribute("href") + ")";
- },
- "li": function(el, text) {
- var lines = text.trim().split('\n');
- var firstLine = '- ' + lines.shift();
- var nextLines = lines.map(function(s) { return (' ' + s).replace(/\s+$/, ''); });
+ 'a'(el, text) {
+ return `[${text}](${el.getAttribute('href')})`;
+ },
+ 'li'(el, text) {
+ let lines = text.trim().split('\n');
+ let firstLine = '- ' + lines.shift();
+ // Add two spaces to the front of subsequent list items lines, or leave the line entirely blank.
+ let nextLines = lines.map(function(s) {
+ if (s.trim().length === 0) {
+ return '';
+ } else {
+ return ` ${s}`;
+ }
+ });
- return firstLine + '\n' + nextLines.join('\n');
+ return `${firstLine}\n${nextLines.join('\n')}`;
},
- "ul": function(el, text) {
+ 'ul'(el, text) {
return text;
},
- "ol": function(el, text) {
+ 'ol'(el, text) {
+ // LIs get a `- ` prefix by default, which we replace by `1. ` for ordered lists.
return text.replace(/^- /mg, '1. ');
},
- "h1": function(el, text) {
- return '# ' + text.trim();
+ 'h1'(el, text) {
+ return `# ${text.trim()}`;
},
- "h2": function(el, text) {
- return '## ' + text.trim();
+ 'h2'(el, text) {
+ return `## ${text.trim()}`;
},
- "h3": function(el, text) {
- return '### ' + text.trim();
+ 'h3'(el, text) {
+ return `### ${text.trim()}`;
},
- "h4": function(el, text) {
- return '#### ' + text.trim();
+ 'h4'(el, text) {
+ return `#### ${text.trim()}`;
},
- "h5": function(el, text) {
- return '##### ' + text.trim();
+ 'h5'(el, text) {
+ return `##### ${text.trim()}`;
},
- "h6": function(el, text) {
- return '###### ' + text.trim();
+ 'h6'(el, text) {
+ return `###### ${text.trim()}`;
},
- "strong": function(el, text) {
- return '**' + text + '**';
+ 'strong'(el, text) {
+ return `**${text}**`;
},
- "em": function(el, text) {
- return '_' + text + '_';
+ 'em'(el, text) {
+ return `_${text}_`;
},
- "del": function(el, text) {
- return '~~' + text + '~~';
+ 'del'(el, text) {
+ return `~~${text}~~`;
},
- "sup": function(el, text) {
- return '^' + text;
+ 'sup'(el, text) {
+ return `^${text}`;
},
- "hr": function(el, text) {
+ 'hr'(el, text) {
return '-----';
},
- "table": function(el, text) {
- var theadText = CopyAsGFM.nodeToGFM(el.querySelector('thead'));
- var tbodyText = CopyAsGFM.nodeToGFM(el.querySelector('tbody'));
+ 'table'(el, text) {
+ let theadText = CopyAsGFM.nodeToGFM(el.querySelector('thead'));
+ let tbodyText = CopyAsGFM.nodeToGFM(el.querySelector('tbody'));
return theadText + tbodyText;
},
- "thead": function(el, text) {
- var cells = _.map(el.querySelectorAll('th'), function(cell) {
- var chars = CopyAsGFM.nodeToGFM(cell).trim().length;
+ 'thead'(el, text) {
+ let cells = _.map(el.querySelectorAll('th'), function(cell) {
+ let chars = CopyAsGFM.nodeToGFM(cell).trim().length;
- var before = '';
- var after = '';
+ let before = '';
+ let after = '';
switch (cell.style.textAlign) {
case 'center':
before = ':';
@@ -201,17 +204,18 @@
chars = Math.max(chars, 0);
- var middle = new Array(chars + 1).join('-');
+ let middle = new Array(chars + 1).join('-');
return before + middle + after;
});
- return text + '| ' + cells.join(' | ') + ' |';
+
+ return text + `| ${cells.join(' | ')} |`;
},
- "tr": function(el, text) {
- var cells = _.map(el.querySelectorAll('td, th'), function(cell) {
+ 'tr'(el, text) {
+ let cells = _.map(el.querySelectorAll('td, th'), function(cell) {
return CopyAsGFM.nodeToGFM(cell).trim();
});
- return '| ' + cells.join(' | ') + ' |';
+ return `| ${cells.join(' | ')} |`;
},
}
};
@@ -223,29 +227,29 @@
}
handleCopy(e) {
- var clipboardData = e.originalEvent.clipboardData;
+ let clipboardData = e.originalEvent.clipboardData;
if (!clipboardData) return;
if (!window.getSelection) return;
- var selection = window.getSelection();
+ let selection = window.getSelection();
if (!selection.rangeCount || selection.rangeCount === 0) return;
- var selectedDocument = selection.getRangeAt(0).cloneContents();
+ let selectedDocument = selection.getRangeAt(0).cloneContents();
if (!selectedDocument) return;
e.preventDefault();
clipboardData.setData('text/plain', selectedDocument.textContent);
- var gfm = CopyAsGFM.nodeToGFM(selectedDocument);
+ let gfm = CopyAsGFM.nodeToGFM(selectedDocument);
clipboardData.setData('text/x-gfm', gfm);
}
handlePaste(e) {
- var clipboardData = e.originalEvent.clipboardData;
+ let clipboardData = e.originalEvent.clipboardData;
if (!clipboardData) return;
-
- var gfm = clipboardData.getData('text/x-gfm');
+
+ let gfm = clipboardData.getData('text/x-gfm');
if (!gfm) return;
e.preventDefault();
@@ -255,36 +259,39 @@
insertText(target, text) {
// Firefox doesn't support `document.execCommand('insertText', false, text);` on textareas
- var selectionStart = target.selectionStart;
- var selectionEnd = target.selectionEnd;
- var value = target.value;
- var textBefore = value.substring(0, selectionStart);
- var textAfter = value.substring(selectionEnd, value.length);
- var newText = textBefore + text + textAfter;
+
+ let selectionStart = target.selectionStart;
+ let selectionEnd = target.selectionEnd;
+ let value = target.value;
+
+ let textBefore = value.substring(0, selectionStart);
+ let textAfter = value.substring(selectionEnd, value.length);
+ let newText = textBefore + text + textAfter;
+
target.value = newText;
target.selectionStart = target.selectionEnd = selectionStart + text.length;
}
static nodeToGFM(node) {
- if (node.nodeType == Node.TEXT_NODE) {
+ if (node.nodeType === Node.TEXT_NODE) {
return node.textContent;
}
- var text = this.innerGFM(node);
+ let text = this.innerGFM(node);
- if (node.nodeType == Node.DOCUMENT_FRAGMENT_NODE) {
+ if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
return text;
}
- for (var filter in gfmRules) {
- var rules = gfmRules[filter];
+ for (let filter in gfmRules) {
+ let rules = gfmRules[filter];
- for (var selector in rules) {
- var func = rules[selector];
+ for (let selector in rules) {
+ let func = rules[selector];
if (!node.matches(selector)) continue;
- var result = func(node, text);
+ let result = func(node, text);
if (result === false) continue;
return result;
@@ -295,16 +302,16 @@
}
static innerGFM(parentNode) {
- var nodes = parentNode.childNodes;
+ let nodes = parentNode.childNodes;
- var clonedParentNode = parentNode.cloneNode(true);
- var clonedNodes = Array.prototype.slice.call(clonedParentNode.childNodes, 0);
+ let clonedParentNode = parentNode.cloneNode(true);
+ let clonedNodes = Array.prototype.slice.call(clonedParentNode.childNodes, 0);
- for (var i = 0; i < nodes.length; i++) {
- var node = nodes[i];
- var clonedNode = clonedNodes[i];
+ for (let i = 0; i < nodes.length; i++) {
+ let node = nodes[i];
+ let clonedNode = clonedNodes[i];
- var text = this.nodeToGFM(node);
+ let text = this.nodeToGFM(node);
clonedNode.parentNode.replaceChild(document.createTextNode(text), clonedNode);
}