gitlab_kramdown 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b1300ec014cee9ac392ba0934415585953a90c1d
4
- data.tar.gz: 252c205835324990971e33f54a34e59bab01203e
3
+ metadata.gz: ce8545ba899795f6dc56a1719b4b34f61b2a4658
4
+ data.tar.gz: 18241d90cfb9fa02b4115fc5d4f1fb388d2896e1
5
5
  SHA512:
6
- metadata.gz: e87efac88a9b5c980a67a8c6f74da59cf4b0bfa07d95d0b148ccc6db536380bc10f8a5a40c9bd3de860fa35a20aa850b7a0f9ed003a2ee39cd254971f9bc794e
7
- data.tar.gz: aea0b96c06aaeba06ce712eb984b8ceb5eb754333ed321aef5ff1ef1c6372be97b406d5257a616e32be9adc6a29eb66207ad669c2e5f2b78b9cda1785a3cfde5
6
+ metadata.gz: 6813cb7bf833a30a9a19090caab8f4bf4b5e55d9f006c85cbc3f7bbaa42dd21a2e70f6f3b4236e642c9315b35a398799297ee45556b1df9a8c6a0aaa6a73c38e
7
+ data.tar.gz: 82fc613035d1a7a9864cb22142aeef407a76331d3be7c7ba7fecd2d7da2ea3b7e6ec5dc7bc00af731e2a0e13e200dd3551e6dbe4a0c6e348b3fe3c93d810e7ee
data/CHANGELOG.md CHANGED
@@ -6,6 +6,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.4.0] - 2018-04-12
10
+ ### Added
11
+ - URL auto-linking support
12
+
13
+ ### Changed
14
+ - Fixed many inconsistencies in references autolink
15
+
9
16
  ## [0.3.0] - 2018-03-23
10
17
  ### Added
11
18
  - Headers will include by default an anchor tag (you can disable with `linkable_headers: false`)
data/README.md CHANGED
@@ -11,7 +11,7 @@ This is a list of GitLab Flavored Markdown (GFM) extensions and their status of
11
11
  | [Newlines] | No |
12
12
  | [Multiple underscores in words] | _Kramdown_ |
13
13
  | [Headers with Anchors] | **Yes** |
14
- | [URL auto-linking] | No |
14
+ | [URL auto-linking] | **Yes** |
15
15
  | [Multiline Blockquote] | **Yes** |
16
16
  | [Code and Syntax Highlighting] | **Yes** |
17
17
  | [Inline Diff] | No |
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.4.0
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: gitlab_kramdown 0.3.0 ruby lib
5
+ # stub: gitlab_kramdown 0.4.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "gitlab_kramdown".freeze
9
- s.version = "0.3.0"
9
+ s.version = "0.4.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Gabriel Mazetto".freeze]
14
- s.date = "2018-03-23"
14
+ s.date = "2018-04-12"
15
15
  s.description = "GitLab Flavored Markdown extensions on top of Kramdown markup. Tries to be as close as possible to existing extensions.".freeze
16
16
  s.email = "brodock@gmail.com".freeze
17
17
  s.extra_rdoc_files = [
@@ -33,11 +33,14 @@ Gem::Specification.new do |s|
33
33
  "gitlab_kramdown.gemspec",
34
34
  "lib/gitlab_kramdown.rb",
35
35
  "lib/gitlab_kramdown/parser.rb",
36
+ "lib/gitlab_kramdown/parser/autolink.rb",
36
37
  "lib/gitlab_kramdown/parser/fenced_blockquote.rb",
37
38
  "lib/gitlab_kramdown/parser/fenced_codeblock.rb",
38
39
  "lib/gitlab_kramdown/parser/header.rb",
39
40
  "lib/gitlab_kramdown/parser/reference.rb",
40
41
  "lib/kramdown/parser/gitlab_kramdown.rb",
42
+ "spec/fixtures/autolink.html",
43
+ "spec/fixtures/autolink.text",
41
44
  "spec/fixtures/code_highlight.html",
42
45
  "spec/fixtures/code_highlight.text",
43
46
  "spec/fixtures/header.html",
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GitlabKramdown
4
+ module Parser
5
+ # URL auto-linking
6
+ #
7
+ # This parser implements URL auto-linking support for the most widely used schemas
8
+ #
9
+ # @see https://docs.gitlab.com/ee/user/markdown.html#url-auto-linking
10
+ module Autolink
11
+ PUNCTUATION_PAIRS = /['"][)\]}][(\[{]/
12
+ ACHARS = /[[:alnum:]]_/
13
+
14
+ AUTOLINK_START = %r{
15
+ (
16
+ (?<schema>mailto|https?|ftps?|irc|smb):[^\s>]+(?<!\?|!|\.|,|:)
17
+ |
18
+ [-.[[:alnum:]]_]+@[-[[:alnum:]]_]+(?:\.[-[[:alnum:]]_]+)*\.[a-z]+
19
+ )
20
+ }x
21
+
22
+ def self.included(klass)
23
+ klass.define_parser(:gitlab_autolink, AUTOLINK_START)
24
+ end
25
+
26
+ # Parse the autolink at the current location.
27
+ def parse_gitlab_autolink
28
+ start_line_number = @src.current_line_number
29
+ @src.pos += @src.matched_size
30
+
31
+ href = (@src[:schema].nil? ? "mailto:#{@src[0]}" : @src[0])
32
+ el = Kramdown::Element.new(:a, nil, { 'href' => href }, location: start_line_number)
33
+
34
+ add_text(@src[0].sub(/^mailto:/, ''), el)
35
+ @tree.children << el
36
+ end
37
+ end
38
+ end
39
+ end
@@ -9,23 +9,23 @@ module GitlabKramdown
9
9
  #
10
10
  # @see https://docs.gitlab.com/ee/user/markdown.html#special-gitlab-references
11
11
  module Reference
12
- PATH_REGEX_STR = '[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*'
12
+ PATH_REGEX = /[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*/
13
13
 
14
14
  NAMESPACE_FORMAT_REGEX = %r{
15
- (?:#{PATH_REGEX_STR}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])
15
+ (?:#{PATH_REGEX}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])
16
16
  (?<!\.git|\.atom)
17
17
  }x
18
18
 
19
19
  FULL_NAMESPACE_FORMAT_REGEX = %r{(#{NAMESPACE_FORMAT_REGEX}/)*#{NAMESPACE_FORMAT_REGEX}}
20
+ ALWAYS_FULL_NAMESPACE_FORMAT_REGEX = %r{(#{NAMESPACE_FORMAT_REGEX}/)+#{NAMESPACE_FORMAT_REGEX}}
20
21
 
21
22
  USER_GROUP_PATTERN = %r{
22
- (?<!\w)
23
23
  #{Regexp.escape('@')}
24
24
  (?<user>#{FULL_NAMESPACE_FORMAT_REGEX})
25
25
  }x
26
26
 
27
27
  PROJECT_COMMIT_PATTERN = %r{
28
- (?<namespace>#{FULL_NAMESPACE_FORMAT_REGEX})
28
+ (?<namespace>#{ALWAYS_FULL_NAMESPACE_FORMAT_REGEX})
29
29
  #{Regexp.escape('@')}
30
30
  (?<commit>[a-z0-9]+)
31
31
  (?!\.{3})
@@ -34,9 +34,9 @@ module GitlabKramdown
34
34
  PROJECT_COMMIT_DIFF_PATTERN = %r{
35
35
  (?<namespace>#{FULL_NAMESPACE_FORMAT_REGEX})
36
36
  #{Regexp.escape('@')}
37
- (?<commit_source>[a-z0-9]+)
37
+ (?<commit_source>[a-f0-9]+)
38
38
  \.{3}
39
- (?<commit_target>[a-z0-9]+)
39
+ (?<commit_target>[a-f0-9]+)
40
40
  }x
41
41
 
42
42
  PROJECT_ISSUE_PATTERN = %r{
@@ -80,6 +80,12 @@ module GitlabKramdown
80
80
  start_line_number = @src.current_line_number
81
81
  @src.pos += @src.matched_size
82
82
 
83
+ # should not start with anything that looks like project/namespace
84
+ if @src.pre_match.match?(/[a-zA-Z0-9_\-]\Z/)
85
+ add_text(@src[0])
86
+ return
87
+ end
88
+
83
89
  href = "#{@options[:gitlab_url]}/#{@src[:user]}"
84
90
 
85
91
  el = Kramdown::Element.new(:a, nil, { 'href' => href }, location: start_line_number)
@@ -9,5 +9,6 @@ module GitlabKramdown
9
9
  autoload :FencedCodeblock, 'gitlab_kramdown/parser/fenced_codeblock'
10
10
  autoload :Header, 'gitlab_kramdown/parser/header'
11
11
  autoload :Reference, 'gitlab_kramdown/parser/reference'
12
+ autoload :Autolink, 'gitlab_kramdown/parser/autolink'
12
13
  end
13
14
  end
@@ -13,6 +13,7 @@ module Kramdown
13
13
  include ::GitlabKramdown::Parser::FencedCodeblock
14
14
  include ::GitlabKramdown::Parser::Header
15
15
  include ::GitlabKramdown::Parser::Reference
16
+ include ::GitlabKramdown::Parser::Autolink
16
17
 
17
18
  def initialize(source, options)
18
19
  super
@@ -21,7 +22,8 @@ module Kramdown
21
22
  @options[:linkable_headers] = true if @options[:linkable_headers].nil?
22
23
  @id_counter = Hash.new(-1)
23
24
 
24
- prepend_span_parsers(:commit_diff, :commit, :user_group_mention, :issue, :merge_request, :snippet, :label)
25
+ prepend_span_parsers(:commit_diff, :commit, :user_group_mention,
26
+ :issue, :merge_request, :snippet, :label, :gitlab_autolink)
25
27
  prepend_block_parsers(:fenced_blockquote)
26
28
  replace_block_parser!(:codeblock_fenced, :codeblock_fenced_gitlab)
27
29
  replace_block_parser!(:atx_header, :atx_gitlab_header)
@@ -0,0 +1,21 @@
1
+ <h1 id="autolinks">Autolinks</h1>
2
+
3
+ <p>The following URLs will be autolinked:</p>
4
+
5
+ <ul>
6
+ <li><a href="https://www.google.com">https://www.google.com</a> ! This is google</li>
7
+ <li><a href="https://google.com/">https://google.com/</a></li>
8
+ <li><a href="ftp://ftp.us.debian.org/debian/">ftp://ftp.us.debian.org/debian/</a></li>
9
+ <li><a href="smb://foo/bar/baz">smb://foo/bar/baz</a></li>
10
+ <li><a href="irc://irc.freenode.net/gitlab">irc://irc.freenode.net/gitlab</a></li>
11
+ <li><a href="http://localhost:3000">http://localhost:3000</a></li>
12
+ <li>This is an email: <a href="mailto:john.doe@example.com">john.doe@example.com</a> .</li>
13
+ <li>URL with ampersand: <a href="http://www.example.com/?doit&amp;x=y">http://www.example.com/?doit&amp;x=y</a> !</li>
14
+ </ul>
15
+
16
+ <blockquote>
17
+ <p>It works even inside other blocks: <a href="https://www.google.com">https://www.google.com</a></p>
18
+ </blockquote>
19
+
20
+ <pre><code>Doesn't work inside code-blocks: https://www.google.com
21
+ </code></pre>
@@ -0,0 +1,18 @@
1
+ # Autolinks
2
+
3
+ The following URLs will be autolinked:
4
+
5
+ * https://www.google.com ! This is google
6
+ * https://google.com/
7
+ * ftp://ftp.us.debian.org/debian/
8
+ * smb://foo/bar/baz
9
+ * irc://irc.freenode.net/gitlab
10
+ * http://localhost:3000
11
+ * This is an email: john.doe@example.com .
12
+ * URL with ampersand: http://www.example.com/?doit&x=y !
13
+
14
+ > It works even inside other blocks: https://www.google.com
15
+
16
+ ```
17
+ Doesn't work inside code-blocks: https://www.google.com
18
+ ```
@@ -2,13 +2,15 @@
2
2
 
3
3
  <p>Group: <a href="https://gitlab.com/group_name">@group_name</a></p>
4
4
 
5
+ <p>Subgroup: <a href="https://gitlab.com/maingroup123/group_name">@maingroup123/group_name</a></p>
6
+
5
7
  <p>Project Issue: <a href="https://gitlab.com/group_name/project_name/issues/12345">group_name/project_name#12345</a></p>
6
8
 
7
9
  <p>Merge Request: <a href="https://gitlab.com/group_name/project_name/merge_requests/12345">group_name/project_name!12345</a></p>
8
10
 
9
11
  <p>Project Snippet: <a href="https://gitlab.com/group_name/project_name/snippets/12345">group_name/project_name$12345</a></p>
10
12
 
11
- <p>Project Commit: <a href="https://gitlab.com/group_name/project_name/commit/9ba12248">group_name/project_name@9ba12248</a></p>
13
+ <p>Project Commit: <a href="https://gitlab.com/group_name/project_name/commit/9ba12248">group_name/project_name@9ba12248</a> not to get confused by email: <a href="mailto:john.doe@example.com">john.doe@example.com</a></p>
12
14
 
13
15
  <p>Project Commit Range comparison: <a href="https://gitlab.com/group_name/project_name/compare/9ba12248...b19a04f5">group_name/project_name@9ba12248...b19a04f5</a></p>
14
16
 
@@ -2,13 +2,15 @@ User: @user_name
2
2
 
3
3
  Group: @group_name
4
4
 
5
+ Subgroup: @maingroup123/group_name
6
+
5
7
  Project Issue: group_name/project_name#12345
6
8
 
7
9
  Merge Request: group_name/project_name!12345
8
10
 
9
11
  Project Snippet: group_name/project_name$12345
10
12
 
11
- Project Commit: group_name/project_name@9ba12248
13
+ Project Commit: group_name/project_name@9ba12248 not to get confused by email: john.doe@example.com
12
14
 
13
15
  Project Commit Range comparison: group_name/project_name@9ba12248...b19a04f5
14
16
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab_kramdown
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gabriel Mazetto
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-23 00:00:00.000000000 Z
11
+ date: 2018-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kramdown
@@ -145,11 +145,14 @@ files:
145
145
  - gitlab_kramdown.gemspec
146
146
  - lib/gitlab_kramdown.rb
147
147
  - lib/gitlab_kramdown/parser.rb
148
+ - lib/gitlab_kramdown/parser/autolink.rb
148
149
  - lib/gitlab_kramdown/parser/fenced_blockquote.rb
149
150
  - lib/gitlab_kramdown/parser/fenced_codeblock.rb
150
151
  - lib/gitlab_kramdown/parser/header.rb
151
152
  - lib/gitlab_kramdown/parser/reference.rb
152
153
  - lib/kramdown/parser/gitlab_kramdown.rb
154
+ - spec/fixtures/autolink.html
155
+ - spec/fixtures/autolink.text
153
156
  - spec/fixtures/code_highlight.html
154
157
  - spec/fixtures/code_highlight.text
155
158
  - spec/fixtures/header.html