diff options
author | Douwe Maan <douwe@selenight.nl> | 2017-01-16 16:44:46 -0500 |
---|---|---|
committer | Douwe Maan <douwe@selenight.nl> | 2017-01-16 17:15:39 -0500 |
commit | 37cabebe1661ab09eec6dfb74b7b09bc03e5f454 (patch) | |
tree | 59872a8973ad00d89f38ea2312ab1e31d5edee87 | |
parent | dbfa58e2da7f939734eee5a599b4014d6095dde3 (diff) | |
download | gitlab-ce-37cabebe1661ab09eec6dfb74b7b09bc03e5f454.tar.gz |
Address style feedback
-rw-r--r-- | app/assets/javascripts/copy_as_gfm.js.es6 | 293 |
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 " + ")"; + 'video'(el, text) { + return `})`; }, }, - "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 " + ")"; + 'img'(el, text) { + return `})`; }, - "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); } |