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
1
Merge Requests
1
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
nexedi
gitlab-ce
Commits
189c5347
Commit
189c5347
authored
Apr 10, 2015
by
Robert Speicher
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add name-based referencing to LabelReferenceFilter
parent
c1c1ef52
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
130 additions
and
26 deletions
+130
-26
lib/gitlab/markdown/label_reference_filter.rb
lib/gitlab/markdown/label_reference_filter.rb
+35
-8
spec/lib/gitlab/markdown/label_reference_filter_spec.rb
spec/lib/gitlab/markdown/label_reference_filter_spec.rb
+95
-18
No files found.
lib/gitlab/markdown/label_reference_filter.rb
View file @
189c5347
...
...
@@ -13,25 +13,34 @@ module Gitlab
class
LabelReferenceFilter
<
HTML
::
Pipeline
::
Filter
# Public: Find label references in text
#
# LabelReferenceFilter.references_in(text) do |match,
label
|
# "<a href=...>#{
label
}</a>"
# LabelReferenceFilter.references_in(text) do |match,
id, name
|
# "<a href=...>#{
Label.find(id)
}</a>"
# end
#
# text - String text to search.
#
# Yields the String match and the Integer label ID.
# Yields the String match, an optional Integer label ID, and an optional
# String label name.
#
# Returns a String replaced with the return of the block.
def
self
.
references_in
(
text
)
text
.
gsub
(
LABEL_PATTERN
)
do
|
match
|
yield
match
,
$~
[
:label
].
to_i
yield
match
,
$~
[
:label
_id
].
to_i
,
$~
[
:label_name
]
end
end
# Pattern used to extract label references from text
#
# This pattern supports cross-project references.
LABEL_PATTERN
=
/~(?<label>\d+)/
# TODO (rspeicher): Limit to double quotes (meh) or disallow single quotes in label names (bad).
LABEL_PATTERN
=
%r{
~(
(?<label_id>
\d
+) | # Integer-based label ID, or
(?<label_name>
[^'"&
\?
,
\s
]+ | # String-based single-word label title
['"][^&
\?
,]+['"] # String-based multi-word label surrounded in quotes
)
)
}x
# Don't look for references in text nodes that are children of these
# elements.
...
...
@@ -68,8 +77,10 @@ module Gitlab
def
label_link_filter
(
text
)
project
=
context
[
:project
]
self
.
class
.
references_in
(
text
)
do
|
match
,
id
|
if
label
=
project
.
labels
.
find_by
(
id:
id
)
self
.
class
.
references_in
(
text
)
do
|
match
,
id
,
name
|
params
=
label_params
(
id
,
name
)
if
label
=
project
.
labels
.
find_by
(
params
)
url
=
url_for_label
(
project
,
label
)
klass
=
"gfm gfm-label
#{
context
[
:reference_class
]
}
"
.
strip
...
...
@@ -92,6 +103,22 @@ module Gitlab
LabelsHelper
.
render_colored_label
(
label
)
end
# Parameters to pass to `Label.find_by` based on the given arguments
#
# id - Integer ID to pass. If present, returns {id: id}
# name - String name to pass. If `id` is absent, finds by name without
# surrounding quotes.
#
# Returns a Hash.
def
label_params
(
id
,
name
)
if
id
>
0
{
id:
id
}
else
# TODO (rspeicher): Don't strip single quotes if we decide to only use double quotes for surrounding.
{
name:
name
.
tr
(
'\'"'
,
''
)
}
end
end
def
project
context
[
:project
]
end
...
...
spec/lib/gitlab/markdown/label_reference_filter_spec.rb
View file @
189c5347
...
...
@@ -21,24 +21,6 @@ module Gitlab::Markdown
end
end
it
'links to a valid reference'
do
doc
=
filter
(
"See
#{
reference
}
"
)
expect
(
doc
.
css
(
'a'
).
first
.
attr
(
'href'
)).
to
eq
urls
.
namespace_project_issues_url
(
project
.
namespace
,
project
,
label_name:
label
.
name
)
end
it
'links with adjacent text'
do
doc
=
filter
(
"Label (
#{
reference
}
.)"
)
expect
(
doc
.
to_html
).
to
match
(
%r(
\(
<a.+><span.+>
#{
label
.
name
}
</span></a>
\.\)
)
)
end
it
'ignores invalid label IDs'
do
exp
=
act
=
"Label ~
#{
label
.
id
+
1
}
"
expect
(
filter
(
act
).
to_html
).
to
eq
exp
end
it
'includes default classes'
do
doc
=
filter
(
"Label
#{
reference
}
"
)
expect
(
doc
.
css
(
'a'
).
first
.
attr
(
'class'
)).
to
eq
'gfm gfm-label'
...
...
@@ -68,5 +50,100 @@ module Gitlab::Markdown
expect
(
doc
.
css
(
'a span'
).
first
.
attr
(
'style'
)).
to
match
(
/\Abackground-color: #\h{6}; color: #\h{6}\z/
)
end
end
context
'Integer-based references'
do
it
'links to a valid reference'
do
doc
=
filter
(
"See
#{
reference
}
"
)
expect
(
doc
.
css
(
'a'
).
first
.
attr
(
'href'
)).
to
eq
urls
.
namespace_project_issues_url
(
project
.
namespace
,
project
,
label_name:
label
.
name
)
end
it
'links with adjacent text'
do
doc
=
filter
(
"Label (
#{
reference
}
.)"
)
expect
(
doc
.
to_html
).
to
match
(
%r(
\(
<a.+><span.+>
#{
label
.
name
}
</span></a>
\.\)
)
)
end
it
'ignores invalid label IDs'
do
exp
=
act
=
"Label ~
#{
label
.
id
+
1
}
"
expect
(
filter
(
act
).
to_html
).
to
eq
exp
end
end
context
'String-based single-word references'
do
let
(
:label
)
{
create
(
:label
,
name:
'gfm'
,
project:
project
)
}
let
(
:reference
)
{
"~
#{
label
.
name
}
"
}
it
'links to a valid reference'
do
doc
=
filter
(
"See
#{
reference
}
"
)
expect
(
doc
.
css
(
'a'
).
first
.
attr
(
'href'
)).
to
eq
urls
.
namespace_project_issues_url
(
project
.
namespace
,
project
,
label_name:
label
.
name
)
expect
(
doc
.
text
).
to
eq
'See gfm'
end
it
'links with adjacent text'
do
skip
'FIXME (rspeicher): This will fail, because a period and parentheses are both currently valid in label names.'
doc
=
filter
(
"Label (
#{
reference
}
.)"
)
expect
(
doc
.
to_html
).
to
match
(
%r(
\(
<a.+><span.+>
#{
label
.
name
}
</span></a>
\.\)
)
)
end
it
'ignores invalid label names'
do
exp
=
act
=
"Label ~
#{
label
.
name
.
reverse
}
"
expect
(
filter
(
act
).
to_html
).
to
eq
exp
end
end
context
'String-based multi-word references in quotes'
do
let
(
:label
)
{
create
(
:label
,
name:
'gfm references'
,
project:
project
)
}
context
'in single quotes'
do
let
(
:reference
)
{
"~'
#{
label
.
name
}
'"
}
it
'links to a valid reference'
do
doc
=
filter
(
"See
#{
reference
}
"
)
expect
(
doc
.
css
(
'a'
).
first
.
attr
(
'href'
)).
to
eq
urls
.
namespace_project_issues_url
(
project
.
namespace
,
project
,
label_name:
label
.
name
)
expect
(
doc
.
text
).
to
eq
'See gfm references'
end
it
'links with adjacent text'
do
doc
=
filter
(
"Label (
#{
reference
}
.)"
)
expect
(
doc
.
to_html
).
to
match
(
%r(
\(
<a.+><span.+>
#{
label
.
name
}
</span></a>
\.\)
)
)
end
it
'ignores invalid label names'
do
exp
=
act
=
"Label ~'
#{
label
.
name
.
reverse
}
'"
expect
(
filter
(
act
).
to_html
).
to
eq
exp
end
end
context
'in double quotes'
do
let
(
:reference
)
{
%(~"#{label.name}")
}
it
'links to a valid reference'
do
doc
=
filter
(
"See
#{
reference
}
"
)
expect
(
doc
.
css
(
'a'
).
first
.
attr
(
'href'
)).
to
eq
urls
.
namespace_project_issues_url
(
project
.
namespace
,
project
,
label_name:
label
.
name
)
expect
(
doc
.
text
).
to
eq
'See gfm references'
end
it
'links with adjacent text'
do
doc
=
filter
(
"Label (
#{
reference
}
.)"
)
expect
(
doc
.
to_html
).
to
match
(
%r(
\(
<a.+><span.+>
#{
label
.
name
}
</span></a>
\.\)
)
)
end
it
'ignores invalid label names'
do
exp
=
act
=
%(Label ~"#{label.name.reverse}")
expect
(
filter
(
act
).
to_html
).
to
eq
exp
end
end
end
end
end
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