Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Tatuya Kamada
gitlab-ce
Commits
bc3448fc
Commit
bc3448fc
authored
Jan 16, 2017
by
Douwe Maan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Improve spec
parent
37cabebe
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
163 additions
and
157 deletions
+163
-157
app/assets/javascripts/copy_as_gfm.js.es6
app/assets/javascripts/copy_as_gfm.js.es6
+4
-3
lib/banzai/pipeline/gfm_pipeline.rb
lib/banzai/pipeline/gfm_pipeline.rb
+4
-3
spec/features/copy_as_gfm_spec.rb
spec/features/copy_as_gfm_spec.rb
+155
-151
No files found.
app/assets/javascripts/copy_as_gfm.js.es6
View file @
bc3448fc
...
...
@@ -3,9 +3,10 @@
(() => {
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.
// The filters referenced in lib/banzai/pipeline/gfm_pipeline.rb convert GitLab Flavored Markdown (GFM) to HTML.
// These handlers consequently convert that same HTML to GFM to be copied to the clipboard.
// Every filter in lib/banzai/pipeline/gfm_pipeline.rb that generates HTML from GFM should have a handler here, in reverse order.
// The GFM-to-HTML-to-GFM cycle is tested in spec/features/copy_as_gfm_spec.rb.
InlineDiffFilter: {
'span.idiff.addition'(el, text) {
return `{+${text}+}`;
...
...
lib/banzai/pipeline/gfm_pipeline.rb
View file @
bc3448fc
module
Banzai
module
Pipeline
class
GfmPipeline
<
BasePipeline
# Every filter should have an entry in app/assets/javascripts/copy_as_gfm.js.es6,
# in reverse order.
# Should have test coverage in spec/features/copy_as_gfm_spec.rb.
# These filters convert GitLab Flavored Markdown (GFM) to HTML.
# The handlers defined in app/assets/javascripts/copy_as_gfm.js.es6 consequently convert that same HTML to GFM to be copied to the clipboard.
# Every filter that generates HTML from GFM should have a handler in app/assets/javascripts/copy_as_gfm.js.es6, in reverse order.
# The GFM-to-HTML-to-GFM cycle is tested in spec/features/copy_as_gfm_spec.rb.
def
self
.
filters
@filters
||=
FilterArray
[
Filter
::
SyntaxHighlightFilter
,
...
...
spec/features/copy_as_gfm_spec.rb
View file @
bc3448fc
...
...
@@ -13,17 +13,17 @@ describe 'Copy as GFM', feature: true, js: true do
visit
namespace_project_issue_path
(
@project
.
namespace
,
@project
,
@feat
.
issue
)
end
#
Should have an entry for every filter in lib/banzai/pipeline/gfm_pipeline.rb
#
and app/assets/javascripts/copy_as_gfm.js.es6
filters
=
{
'any filter'
=>
[
[
'crazy nesting'
,
'> 1. [x] **[$`2 + 2`$ {-=-}{+=+} 2^2 ~~:thumbsup:~~](http://google.com)**'
],
[
'real world example from the gitlab-ce README'
,
<<-
GFM
.
strip_heredoc
#
The filters referenced in lib/banzai/pipeline/gfm_pipeline.rb convert GitLab Flavored Markdown (GFM) to HTML.
#
The handlers defined in app/assets/javascripts/copy_as_gfm.js.es6 consequently convert that same HTML to GFM.
# To make sure these filters and handlers are properly aligned, this spec tests the GFM-to-HTML-to-GFM cycle
# by verifying (`html_to_gfm(gfm_to_html(gfm)) == gfm`) for a number of examples of GFM for every filter.
it
'supports nesting'
do
verify
'> 1. [x] **[$`2 + 2`$ {-=-}{+=+} 2^2 ~~:thumbsup:~~](http://google.com)**'
end
it
'supports a real world example from the gitlab-ce README'
do
verify
<<-
GFM
.
strip_heredoc
# GitLab
[![Build status](https://gitlab.com/gitlab-org/gitlab-ce/badges/master/build.svg)](https://gitlab.com/gitlab-org/gitlab-ce/commits/master)
...
...
@@ -52,78 +52,96 @@ describe 'Copy as GFM', feature: true, js: true do
- Completely free and open source (MIT Expat license)
GFM
]
],
'InlineDiffFilter'
=>
[
end
it
'supports InlineDiffFilter'
do
verify
(
'{-Deleted text-}'
,
'{+Added text+}'
],
'TaskListFilter'
=>
[
)
end
it
'supports TaskListFilter'
do
verify
(
'- [ ] Unchecked task'
,
'- [x] Checked task'
,
'1. [ ] Unchecked numbered task'
,
'1. [x] Checked numbered task'
],
'ReferenceFilter'
=>
[
[
'issue reference'
,
->
{
@feat
.
issue
.
to_reference
}],
[
'full issue reference'
,
->
{
@feat
.
issue
.
to_reference
(
full:
true
)
}],
[
'issue URL'
,
->
{
namespace_project_issue_url
(
@project
.
namespace
,
@project
,
@feat
.
issue
)
}],
[
'issue URL with note anchor'
,
->
{
namespace_project_issue_url
(
@project
.
namespace
,
@project
,
@feat
.
issue
,
anchor:
'note_123'
)
}],
[
'issue link'
,
->
{
"[Issue](
#{
namespace_project_issue_url
(
@project
.
namespace
,
@project
,
@feat
.
issue
)
}
)"
}],
[
'issue link with note anchor'
,
->
{
"[Issue](
#{
namespace_project_issue_url
(
@project
.
namespace
,
@project
,
@feat
.
issue
,
anchor:
'note_123'
)
}
)"
}],
],
'AutolinkFilter'
=>
[
'https://example.com'
],
'TableOfContentsFilter'
=>
[
'[[_TOC_]]'
],
'EmojiFilter'
=>
[
':thumbsup:'
],
'ImageLinkFilter'
=>
[
'![Image](https://example.com/image.png)'
],
'VideoLinkFilter'
=>
[
'![Video](https://example.com/video.mp4)'
],
'MathFilter'
=>
[
)
end
it
'supports ReferenceFilter'
do
verify
(
# issue reference
@feat
.
issue
.
to_reference
,
# full issue reference
@feat
.
issue
.
to_reference
(
full:
true
),
# issue URL
namespace_project_issue_url
(
@project
.
namespace
,
@project
,
@feat
.
issue
),
# issue URL with note anchor
namespace_project_issue_url
(
@project
.
namespace
,
@project
,
@feat
.
issue
,
anchor:
'note_123'
),
# issue link
"[Issue](
#{
namespace_project_issue_url
(
@project
.
namespace
,
@project
,
@feat
.
issue
)
}
)"
,
# issue link with note anchor
"[Issue](
#{
namespace_project_issue_url
(
@project
.
namespace
,
@project
,
@feat
.
issue
,
anchor:
'note_123'
)
}
)"
,
)
end
it
'supports AutolinkFilter'
do
verify
'https://example.com'
end
it
'supports TableOfContentsFilter'
do
verify
'[[_TOC_]]'
end
it
'supports EmojiFilter'
do
verify
':thumbsup:'
end
it
'supports ImageLinkFilter'
do
verify
'![Image](https://example.com/image.png)'
end
it
'supports VideoLinkFilter'
do
verify
'![Video](https://example.com/video.mp4)'
end
it
'supports MathFilter'
do
verify
(
'$`c = \pm\sqrt{a^2 + b^2}`$'
,
[
'math block'
,
# math block
<<-
GFM
.
strip_heredoc
```math
c =
\p
m
\s
qrt{a^2 + b^2}
```
GFM
]
],
'SyntaxHighlightFilter'
=>
[
[
'code block'
,
<<-
GFM
.
strip_heredoc
)
end
it
'supports SyntaxHighlightFilter'
do
verify
<<-
GFM
.
strip_heredoc
```ruby
def foo
bar
end
```
GFM
]
],
'MarkdownFilter'
=>
[
end
it
'supports MarkdownFilter'
do
verify
(
'`code`'
,
'`` code with ` ticks ``'
,
'> Quote'
,
[
'multiline quote'
,
# multiline quote
<<-
GFM
.
strip_heredoc
,
> Multiline
> Quote
>
> With multiple paragraphs
GFM
],
'![Image](https://example.com/image.png)'
,
...
...
@@ -132,39 +150,36 @@ describe 'Copy as GFM', feature: true, js: true do
'[Link](https://example.com)'
,
'- List item'
,
[
'multiline list item'
,
# multiline list item
<<-
GFM
.
strip_heredoc
,
- Multiline
List item
GFM
],
[
'nested lists'
,
# nested lists
<<-
GFM
.
strip_heredoc
,
- Nested
- Lists
GFM
],
'1. Numbered list item'
,
[
'multiline numbered list item'
,
# multiline numbered list item
<<-
GFM
.
strip_heredoc
,
1. Multiline
Numbered list item
GFM
],
[
'nested numbered list'
,
# nested numbered list
<<-
GFM
.
strip_heredoc
,
1. Nested
1. Numbered lists
GFM
],
'# Heading'
,
'## Heading'
,
...
...
@@ -183,38 +198,17 @@ describe 'Copy as GFM', feature: true, js: true do
'-----'
,
[
'table'
,
# table
<<-
GFM
.
strip_heredoc
,
| Centered | Right | Left |
| :------: | ----: | ---- |
| Foo | Bar | **Baz** |
| Foo | Bar | **Baz** |
GFM
]
]
}
filters
.
each
do
|
filter
,
examples
|
context
filter
do
examples
.
each
do
|
ex
|
if
ex
.
is_a?
(
String
)
desc
=
"'
#{
ex
}
'"
gfm
=
ex
else
desc
,
gfm
=
ex
)
end
it
"transforms
#{
desc
}
to HTML and back to GFM"
do
gfm
=
instance_exec
(
&
gfm
)
if
gfm
.
is_a?
(
Proc
)
html
=
markdown
(
gfm
)
gfm2
=
html_to_gfm
(
html
)
expect
(
gfm2
.
strip
).
to
eq
(
gfm
.
strip
)
end
end
end
end
alias_method
:gfm_to_html
,
:markdown
def
html_to_gfm
(
html
)
js
=
<<-
JS
.
strip_heredoc
...
...
@@ -227,6 +221,16 @@ describe 'Copy as GFM', feature: true, js: true do
page
.
evaluate_script
(
js
)
end
def
verify
(
*
gfms
)
aggregate_failures
do
gfms
.
each
do
|
gfm
|
html
=
gfm_to_html
(
gfm
)
output_gfm
=
html_to_gfm
(
html
)
expect
(
output_gfm
.
strip
).
to
eq
(
gfm
.
strip
)
end
end
end
# Fake a `current_user` helper
def
current_user
@feat
.
user
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment