Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
gitlab-foss
提交
b039a169
G
gitlab-foss
项目概览
李少辉-开发者
/
gitlab-foss
通知
15
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gitlab-foss
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b039a169
编写于
8月 14, 2012
作者:
R
Robert Speicher
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
GFM refactor: Move the actual parsing to a class under the Gitlab module
上级
e31a9dd2
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
101 addition
and
59 deletion
+101
-59
app/helpers/gitlab_markdown_helper.rb
app/helpers/gitlab_markdown_helper.rb
+3
-59
lib/gitlab/markdown.rb
lib/gitlab/markdown.rb
+98
-0
未找到文件。
app/helpers/gitlab_markdown_helper.rb
浏览文件 @
b039a169
module
GitlabMarkdownHelper
REFERENCE_PATTERN
=
%r{
([^
\w
&;])? # Prefix (1)
( # Reference (2)
@([
\w\.
_]+) | # User name (3)
[#!$](
\d
+) | # Issue/MR/Snippet ID (4)
[
\h
]{6,40} # Commit ID (2)
)
([^
\w
&;])? # Suffix (5)
}x
.
freeze
def
gfm
(
text
,
html_options
=
{})
return
text
if
text
.
nil?
return
text
if
@project
.
nil?
...
...
@@ -22,21 +12,10 @@ module GitlabMarkdownHelper
"{gfm-extraction-
#{
md5
}
}"
end
text
.
gsub!
(
REFERENCE_PATTERN
)
do
|
match
|
vals
=
{
prefix:
$1
,
reference:
$2
,
user_name:
$3
,
reference_id:
$4
,
suffix:
$5
}
# TODO: add popups with additional information
if
ref_link
=
reference_link
(
vals
,
html_options
)
sprintf
(
'%s%s%s'
,
vals
[
:prefix
],
ref_link
,
vals
[
:suffix
])
else
match
end
end
parser
=
Gitlab
::
Markdown
.
new
(
@project
,
html_options
)
text
=
parser
.
parse
(
text
)
# Insert pre block extractions
text
.
gsub!
(
/\{gfm-extraction-(\h{32})\}/
)
do
...
...
@@ -71,39 +50,4 @@ module GitlabMarkdownHelper
@__renderer
.
render
(
text
).
html_safe
end
private
def
reference_link
(
vals
,
html_options
)
# TODO: add popups with additional information
case
vals
[
:reference
]
# team member: @foo
when
/^@/
user
=
@project
.
users
.
where
(
name:
vals
[
:user_name
]).
first
member
=
@project
.
users_projects
.
where
(
user_id:
user
).
first
if
user
link_to
(
"@
#{
user
.
name
}
"
,
project_team_member_path
(
@project
,
member
),
html_options
.
merge
(
class:
"gfm gfm-team_member
#{
html_options
[
:class
]
}
"
))
if
member
# issue: #123
when
/^#/
issue
=
@project
.
issues
.
where
(
id:
vals
[
:reference_id
]).
first
link_to
(
"#
#{
issue
.
id
}
"
,
project_issue_path
(
@project
,
issue
),
html_options
.
merge
(
title:
"Issue:
#{
issue
.
title
}
"
,
class:
"gfm gfm-issue
#{
html_options
[
:class
]
}
"
))
if
issue
# merge request: !123
when
/^!/
merge_request
=
@project
.
merge_requests
.
where
(
id:
vals
[
:reference_id
]).
first
link_to
(
"!
#{
merge_request
.
id
}
"
,
project_merge_request_path
(
@project
,
merge_request
),
html_options
.
merge
(
title:
"Merge Request:
#{
merge_request
.
title
}
"
,
class:
"gfm gfm-merge_request
#{
html_options
[
:class
]
}
"
))
if
merge_request
# snippet: $123
when
/^\$/
snippet
=
@project
.
snippets
.
where
(
id:
vals
[
:reference_id
]).
first
link_to
(
"$
#{
snippet
.
id
}
"
,
project_snippet_path
(
@project
,
snippet
),
html_options
.
merge
(
title:
"Snippet:
#{
snippet
.
title
}
"
,
class:
"gfm gfm-snippet
#{
html_options
[
:class
]
}
"
))
if
snippet
# commit: 123456...
when
/^\h/
commit
=
@project
.
commit
(
vals
[
:reference
])
link_to
(
vals
[
:reference
],
project_commit_path
(
@project
,
id:
commit
.
id
),
html_options
.
merge
(
title:
"Commit:
#{
commit
.
author_name
}
-
#{
CommitDecorator
.
new
(
commit
).
title
}
"
,
class:
"gfm gfm-commit
#{
html_options
[
:class
]
}
"
))
if
commit
end
end
end
lib/gitlab/markdown.rb
0 → 100644
浏览文件 @
b039a169
module
Gitlab
# Custom parsing for Gitlab-flavored Markdown
#
# Examples
#
# >> m = Markdown.new(...)
#
# >> m.parse("Hey @david, can you fix this?")
# => "Hey <a href="/gitlab/team_members/1">@david</a>, can you fix this?"
#
# >> m.parse("Commit 35d5f7c closes #1234")
# => "Commit <a href="/gitlab/commits/35d5f7c">35d5f7c</a> closes <a href="/gitlab/issues/1234">#1234</a>"
class
Markdown
include
Rails
.
application
.
routes
.
url_helpers
include
ActionView
::
Helpers
REFERENCE_PATTERN
=
%r{
([^
\w
&;])? # Prefix (1)
( # Reference (2)
@([
\w\.
_]+) # User name (3)
|[#!$](
\d
+) # Issue/MR/Snippet ID (4)
|([
\h
]{6,40}) # Commit ID (5)
)
([^
\w
&;])? # Suffix (6)
}x
.
freeze
attr_reader
:html_options
def
initialize
(
project
,
html_options
=
{})
@project
=
project
@html_options
=
html_options
end
def
parse
(
text
)
text
.
gsub
(
REFERENCE_PATTERN
)
do
|
match
|
prefix
=
$1
||
''
reference
=
$2
identifier
=
$3
||
$4
||
$5
suffix
=
$6
||
''
if
ref_link
=
reference_link
(
reference
,
identifier
)
prefix
+
ref_link
+
suffix
else
match
end
end
end
private
# Private: Dispatches to a dedicated processing method based on reference
#
# reference - Object reference ("@1234", "!567", etc.)
# identifier - Object identifier (Issue ID, SHA hash, etc.)
#
# Returns string rendered by the processing method
def
reference_link
(
reference
,
identifier
)
case
reference
when
/^@/
then
reference_user
(
identifier
)
when
/^#/
then
reference_issue
(
identifier
)
when
/^!/
then
reference_merge_request
(
identifier
)
when
/^\$/
then
reference_snippet
(
identifier
)
when
/^\h/
then
reference_commit
(
identifier
)
end
end
def
reference_user
(
identifier
)
if
user
=
@project
.
users
.
where
(
name:
identifier
).
first
member
=
@project
.
users_projects
.
where
(
user_id:
user
).
first
link_to
(
"@
#{
user
.
name
}
"
,
project_team_member_path
(
@project
,
member
),
html_options
.
merge
(
class:
"gfm gfm-team_member
#{
html_options
[
:class
]
}
"
))
if
member
end
end
def
reference_issue
(
identifier
)
if
issue
=
@project
.
issues
.
where
(
id:
identifier
).
first
link_to
(
"#
#{
issue
.
id
}
"
,
project_issue_path
(
@project
,
issue
),
html_options
.
merge
(
title:
"Issue:
#{
issue
.
title
}
"
,
class:
"gfm gfm-issue
#{
html_options
[
:class
]
}
"
))
end
end
def
reference_merge_request
(
identifier
)
if
merge_request
=
@project
.
merge_requests
.
where
(
id:
identifier
).
first
link_to
(
"!
#{
merge_request
.
id
}
"
,
project_merge_request_path
(
@project
,
merge_request
),
html_options
.
merge
(
title:
"Merge Request:
#{
merge_request
.
title
}
"
,
class:
"gfm gfm-merge_request
#{
html_options
[
:class
]
}
"
))
end
end
def
reference_snippet
(
identifier
)
if
snippet
=
@project
.
snippets
.
where
(
id:
identifier
).
first
link_to
(
"$
#{
snippet
.
id
}
"
,
project_snippet_path
(
@project
,
snippet
),
html_options
.
merge
(
title:
"Snippet:
#{
snippet
.
title
}
"
,
class:
"gfm gfm-snippet
#{
html_options
[
:class
]
}
"
))
end
end
def
reference_commit
(
identifier
)
if
commit
=
@project
.
commit
(
identifier
)
link_to
(
identifier
,
project_commit_path
(
@project
,
id:
commit
.
id
),
html_options
.
merge
(
title:
"Commit:
#{
commit
.
author_name
}
-
#{
CommitDecorator
.
new
(
commit
).
title
}
"
,
class:
"gfm gfm-commit
#{
html_options
[
:class
]
}
"
))
end
end
end
end
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录