summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouwe Maan <douwe@selenight.nl>2017-01-19 13:47:54 -0600
committerDouwe Maan <douwe@selenight.nl>2017-01-19 13:47:54 -0600
commitd89f56161297921f3f3ccdf0d186f39ff1c0a4d3 (patch)
treea04cf4f703850c0afb05b125c409d110c689407b
parent2b37e4c1995284a4871d6d7077b0884e95c2496e (diff)
downloadgitlab-ce-d89f56161297921f3f3ccdf0d186f39ff1c0a4d3.tar.gz
Improve support for linebreaks, tables and nested blockquotes in lists
-rw-r--r--app/assets/javascripts/copy_as_gfm.js.es617
-rw-r--r--spec/features/copy_as_gfm_spec.rb29
2 files changed, 31 insertions, 15 deletions
diff --git a/app/assets/javascripts/copy_as_gfm.js.es6 b/app/assets/javascripts/copy_as_gfm.js.es6
index 80e30fdf390..9cbeb782270 100644
--- a/app/assets/javascripts/copy_as_gfm.js.es6
+++ b/app/assets/javascripts/copy_as_gfm.js.es6
@@ -92,9 +92,6 @@
},
},
SanitizationFilter: {
- 'br'(el, text) {
- return '<br>';
- },
'dl'(el, text) {
let lines = text.trim().split('\n');
// Add two spaces to the front of subsequent list items lines,
@@ -127,6 +124,10 @@
},
},
MarkdownFilter: {
+ 'br'(el, text) {
+ // Two spaces at the end of a line are turned into a BR
+ return ' ';
+ },
'code'(el, text) {
let backtickCount = 1;
const backtickMatch = text.match(/`+/);
@@ -155,12 +156,12 @@
'li'(el, text) {
const lines = text.trim().split('\n');
const firstLine = `- ${lines.shift()}`;
- // Add two spaces to the front of subsequent list items lines,
+ // Add four spaces to the front of subsequent list items lines,
// or leave the line entirely blank.
const nextLines = lines.map((s) => {
if (s.trim().length === 0) return '';
- return ` ${s}`;
+ return ` ${s}`;
});
return `${firstLine}\n${nextLines.join('\n')}`;
@@ -213,7 +214,7 @@
},
'thead'(el, text) {
const cells = _.map(el.querySelectorAll('th'), (cell) => {
- let chars = CopyAsGFM.nodeToGFM(cell).trim().length;
+ let chars = CopyAsGFM.nodeToGFM(cell).trim().length + 2;
let before = '';
let after = '';
@@ -231,14 +232,14 @@
break;
}
- chars = Math.max(chars, 0);
+ chars = Math.max(chars, 3);
const middle = Array(chars + 1).join('-');
return before + middle + after;
});
- return `${text}| ${cells.join(' | ')} |`;
+ return `${text}|${cells.join('|')}|`;
},
'tr'(el, text) {
const cells = _.map(el.querySelectorAll('td, th'), cell => CopyAsGFM.nodeToGFM(cell).trim());
diff --git a/spec/features/copy_as_gfm_spec.rb b/spec/features/copy_as_gfm_spec.rb
index 86cb67d275a..6656d6a1e5d 100644
--- a/spec/features/copy_as_gfm_spec.rb
+++ b/spec/features/copy_as_gfm_spec.rb
@@ -236,8 +236,6 @@ describe 'Copy as GFM', feature: true, js: true do
it 'supports SanitizationFilter' do
verify(
<<-GFM.strip_heredoc
- BR: <br>
-
<sub>sub</sub>
<dl>
@@ -284,6 +282,8 @@ describe 'Copy as GFM', feature: true, js: true do
it 'supports MarkdownFilter' do
verify(
+ "Line with two spaces at the end \nto insert a linebreak",
+
'`code`',
'`` code with ` ticks ``',
@@ -308,7 +308,7 @@ describe 'Copy as GFM', feature: true, js: true do
# multiline list item
<<-GFM.strip_heredoc,
- Multiline
- List item
+ List item
GFM
# nested lists
@@ -316,7 +316,14 @@ describe 'Copy as GFM', feature: true, js: true do
- Nested
- - Lists
+ - Lists
+ GFM
+
+ # list with blockquote
+ <<-GFM.strip_heredoc,
+ - List
+
+ > Blockquote
GFM
'1. Numbered list item',
@@ -324,7 +331,7 @@ describe 'Copy as GFM', feature: true, js: true do
# multiline numbered list item
<<-GFM.strip_heredoc,
1. Multiline
- Numbered list item
+ Numbered list item
GFM
# nested numbered list
@@ -332,7 +339,7 @@ describe 'Copy as GFM', feature: true, js: true do
1. Nested
- 1. Numbered lists
+ 1. Numbered lists
GFM
'# Heading',
@@ -355,10 +362,18 @@ describe 'Copy as GFM', feature: true, js: true do
# table
<<-GFM.strip_heredoc,
| Centered | Right | Left |
- | :------: | ----: | ---- |
+ |:--------:|------:|------|
| Foo | Bar | **Baz** |
| Foo | Bar | **Baz** |
GFM
+
+ # table with empty heading
+ <<-GFM.strip_heredoc,
+ | | x | y |
+ |---|---|---|
+ | a | 1 | 0 |
+ | b | 0 | 1 |
+ GFM
)
end