diff options
author | Filipa Lacerda <filipa@gitlab.com> | 2017-05-24 20:45:55 +0000 |
---|---|---|
committer | Filipa Lacerda <filipa@gitlab.com> | 2017-05-24 20:45:55 +0000 |
commit | c846a8329ab24b551c1e6cc899434c0802769137 (patch) | |
tree | e7852c6ef3e165bc4924bc97847e00f336b1ae4e | |
parent | c013d23d6320487cf293891f7c6b213cab816980 (diff) | |
parent | f14bb942538c28850d4d971be48a0acfb06e1ad3 (diff) | |
download | gitlab-ce-c846a8329ab24b551c1e6cc899434c0802769137.tar.gz |
Merge branch 'dm-copy-gfm-when-parts-of-other-elements-are-selected' into 'master'
Copy as GFM even when parts of other elements are selected
See merge request !11521
-rw-r--r-- | app/assets/javascripts/copy_as_gfm.js | 22 | ||||
-rw-r--r-- | app/assets/javascripts/shortcuts_issuable.js | 8 | ||||
-rw-r--r-- | changelogs/unreleased/dm-copy-gfm-when-parts-of-other-elements-are-selected.yml | 4 | ||||
-rw-r--r-- | spec/features/copy_as_gfm_spec.rb | 19 |
4 files changed, 45 insertions, 8 deletions
diff --git a/app/assets/javascripts/copy_as_gfm.js b/app/assets/javascripts/copy_as_gfm.js index b479e854f7c..ba9d9a3e1f7 100644 --- a/app/assets/javascripts/copy_as_gfm.js +++ b/app/assets/javascripts/copy_as_gfm.js @@ -330,10 +330,26 @@ class CopyAsGFM { } static transformGFMSelection(documentFragment) { - // If the documentFragment contains more than just Markdown, don't copy as GFM. - if (documentFragment.querySelector('.md, .wiki')) return null; + const gfmEls = documentFragment.querySelectorAll('.md, .wiki'); + switch (gfmEls.length) { + case 0: { + return documentFragment; + } + case 1: { + return gfmEls[0]; + } + default: { + const allGfmEl = document.createElement('div'); + + for (let i = 0; i < gfmEls.length; i += 1) { + const lineEl = gfmEls[i]; + allGfmEl.appendChild(lineEl); + allGfmEl.appendChild(document.createTextNode('\n\n')); + } - return documentFragment; + return allGfmEl; + } + } } static transformCodeSelection(documentFragment) { diff --git a/app/assets/javascripts/shortcuts_issuable.js b/app/assets/javascripts/shortcuts_issuable.js index b07b3a4d3a5..dace03554e8 100644 --- a/app/assets/javascripts/shortcuts_issuable.js +++ b/app/assets/javascripts/shortcuts_issuable.js @@ -38,7 +38,7 @@ import './shortcuts_navigation'; } ShortcutsIssuable.prototype.replyWithSelectedText = function() { - var quote, documentFragment, selected, separator; + var quote, documentFragment, el, selected, separator; var replyField = $('.js-main-target-form #note_note'); documentFragment = window.gl.utils.getSelectedFragment(); @@ -47,10 +47,8 @@ import './shortcuts_navigation'; return; } - // If the documentFragment contains more than just Markdown, don't copy as GFM. - if (documentFragment.querySelector('.md, .wiki')) return; - - selected = window.gl.CopyAsGFM.nodeToGFM(documentFragment); + el = window.gl.CopyAsGFM.transformGFMSelection(documentFragment.cloneNode(true)); + selected = window.gl.CopyAsGFM.nodeToGFM(el); if (selected.trim() === "") { return; diff --git a/changelogs/unreleased/dm-copy-gfm-when-parts-of-other-elements-are-selected.yml b/changelogs/unreleased/dm-copy-gfm-when-parts-of-other-elements-are-selected.yml new file mode 100644 index 00000000000..ae916c30ff8 --- /dev/null +++ b/changelogs/unreleased/dm-copy-gfm-when-parts-of-other-elements-are-selected.yml @@ -0,0 +1,4 @@ +--- +title: Copy as GFM even when parts of other elements are selected +merge_request: +author: diff --git a/spec/features/copy_as_gfm_spec.rb b/spec/features/copy_as_gfm_spec.rb index 9318c56112b..740f60c05cc 100644 --- a/spec/features/copy_as_gfm_spec.rb +++ b/spec/features/copy_as_gfm_spec.rb @@ -78,6 +78,25 @@ describe 'Copy as GFM', feature: true, js: true do expect(output_gfm.strip).to eq(gfm.strip) end + aggregate_failures('an accidentally selected other element') do + gfm = 'Test comment with **Markdown!**' + + html = <<-HTML.strip_heredoc + <li class="note"> + <div class="md"> + <p> + Test comment with <strong>Markdown!</strong> + </p> + </div> + </li> + + <li class="note"></li> + HTML + + output_gfm = html_to_gfm(html) + expect(output_gfm.strip).to eq(gfm.strip) + end + verify( 'InlineDiffFilter', |