mato 2.1.1 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +37 -27
- data/.travis.yml +3 -2
- data/CHANGELOG.md +30 -0
- data/Gemfile +3 -1
- data/lib/mato/anchor_builder.rb +7 -1
- data/lib/mato/config.rb +4 -0
- data/lib/mato/converter.rb +1 -1
- data/lib/mato/document.rb +0 -1
- data/lib/mato/html_filters/bare_inline_element.rb +1 -0
- data/lib/mato/html_filters/mention_link.rb +5 -1
- data/lib/mato/html_filters/syntax_highlight.rb +24 -5
- data/lib/mato/html_filters/task_list.rb +26 -7
- data/lib/mato/version.rb +1 -1
- data/mato.gemspec +7 -2
- data/sider.yml +4 -0
- metadata +12 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7985e295c016bbc58c5cc8accc3c81e33e8351a13ed23e9ccc9bb55fe083a01
|
4
|
+
data.tar.gz: d18bb43005111174d922335385453ae4779d449a6efe75431693930fc72309f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '08a8c3e69c1af3426109ff111846d3eba57fd91ff3095a606b9c3bae412b7b8947782017143dd894d161872b2907f3084611fe8bfb27e8e900f392bb321e09f5'
|
7
|
+
data.tar.gz: a4dc40fb37b6db9c12e5011e9ea3391d155e78ecbd922d6021a73d2d00ccdb7bc56708e2a17f972d604674accec01ad792f7535abfb385caceb192997179663f
|
data/.rubocop.yml
CHANGED
@@ -1,11 +1,16 @@
|
|
1
1
|
# See also https://github.com/onk/onkcop/blob/master/config/rubocop.yml
|
2
|
+
require:
|
3
|
+
- rubocop-performance
|
2
4
|
|
3
5
|
AllCops:
|
4
|
-
TargetRubyVersion: 2.
|
6
|
+
TargetRubyVersion: 2.4
|
5
7
|
DisplayCopNames: true
|
6
8
|
Exclude:
|
7
9
|
- bin/**/*
|
8
10
|
|
11
|
+
Metrics:
|
12
|
+
Enabled: false
|
13
|
+
|
9
14
|
Lint/UnusedBlockArgument:
|
10
15
|
Enabled: false
|
11
16
|
|
@@ -21,31 +26,7 @@ Layout/MultilineMethodCallIndentation:
|
|
21
26
|
Layout/EmptyLinesAroundClassBody:
|
22
27
|
Enabled: false
|
23
28
|
|
24
|
-
|
25
|
-
Max: 35
|
26
|
-
|
27
|
-
Metrics/PerceivedComplexity:
|
28
|
-
Max: 10
|
29
|
-
|
30
|
-
Metrics/CyclomaticComplexity:
|
31
|
-
Max: 10
|
32
|
-
|
33
|
-
Metrics/ClassLength:
|
34
|
-
Enabled: false
|
35
|
-
|
36
|
-
Metrics/BlockLength:
|
37
|
-
Enabled: false
|
38
|
-
|
39
|
-
Metrics/LineLength:
|
40
|
-
Enabled: false
|
41
|
-
|
42
|
-
Metrics/MethodLength:
|
43
|
-
Max: 45
|
44
|
-
|
45
|
-
Metrics/ModuleLength:
|
46
|
-
Enabled: false
|
47
|
-
|
48
|
-
Metrics/ParameterLists:
|
29
|
+
Layout/LineLength:
|
49
30
|
Enabled: false
|
50
31
|
|
51
32
|
Style/RescueStandardError:
|
@@ -63,6 +44,12 @@ Style/Documentation:
|
|
63
44
|
Naming/FileName:
|
64
45
|
Enabled: false
|
65
46
|
|
47
|
+
Naming/MethodParameterName:
|
48
|
+
Enabled: false
|
49
|
+
|
50
|
+
Naming/RescuedExceptionsVariableName:
|
51
|
+
Enabled: false
|
52
|
+
|
66
53
|
Style/GuardClause:
|
67
54
|
Enabled: false
|
68
55
|
|
@@ -90,7 +77,10 @@ Style/SignalException:
|
|
90
77
|
Style/StringLiterals:
|
91
78
|
Enabled: false
|
92
79
|
|
93
|
-
Style/
|
80
|
+
Style/TrailingCommaInArrayLiteral:
|
81
|
+
EnforcedStyleForMultiline: comma
|
82
|
+
|
83
|
+
Style/TrailingCommaInHashLiteral:
|
94
84
|
EnforcedStyleForMultiline: comma
|
95
85
|
|
96
86
|
Style/TrailingCommaInArguments:
|
@@ -117,6 +107,9 @@ Style/AsciiComments:
|
|
117
107
|
Style/EmptyMethod:
|
118
108
|
EnforcedStyle: expanded
|
119
109
|
|
110
|
+
Style/RaiseArgs:
|
111
|
+
Enabled: false
|
112
|
+
|
120
113
|
Naming/VariableNumber:
|
121
114
|
Enabled: false
|
122
115
|
|
@@ -143,3 +136,20 @@ Style/NonNilCheck:
|
|
143
136
|
|
144
137
|
Performance/RedundantBlockCall:
|
145
138
|
Enabled: false
|
139
|
+
|
140
|
+
# Configure pending cops
|
141
|
+
|
142
|
+
Layout/SpaceAroundMethodCallOperator:
|
143
|
+
Enabled: true
|
144
|
+
Lint/RaiseException:
|
145
|
+
Enabled: true
|
146
|
+
Lint/StructNewOverride:
|
147
|
+
Enabled: true
|
148
|
+
Style/ExponentialNotation:
|
149
|
+
Enabled: true
|
150
|
+
Style/HashEachMethods:
|
151
|
+
Enabled: true
|
152
|
+
Style/HashTransformKeys:
|
153
|
+
Enabled: true
|
154
|
+
Style/HashTransformValues:
|
155
|
+
Enabled: true
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,35 @@
|
|
1
1
|
# The revision history of Mato
|
2
2
|
|
3
|
+
## v2.3.0 - 2020/06/16
|
4
|
+
|
5
|
+
* Add `convert_empty_task_list` option to TaskList filter to convert task list event if the text is empty. [#23](https://github.com/bitjourney/mato/pull/23)
|
6
|
+
|
7
|
+
## v2.2.0 - 2020/05/08
|
8
|
+
|
9
|
+
https://github.com/bitjourney/mato/compare/v2.1.4...v2.2.0
|
10
|
+
|
11
|
+
* BREAKING: Drop support for Ruby 2.3
|
12
|
+
* Display code block as plan text if Rouge raises an error [#21](https://github.com/bitjourney/mato/pull/21)
|
13
|
+
|
14
|
+
|
15
|
+
## v2.1.4 - 2019/4/11
|
16
|
+
|
17
|
+
https://github.com/bitjourney/mato/compare/v2.1.3...v2.1.4
|
18
|
+
|
19
|
+
* Fix broken mention link process in case of including unexpected text
|
20
|
+
|
21
|
+
## v2.1.3 - 2019/1/15
|
22
|
+
|
23
|
+
https://github.com/bitjourney/mato/compare/v2.1.2...v2.1.3
|
24
|
+
|
25
|
+
* Fix anchor in case of heading which is only special characters
|
26
|
+
|
27
|
+
## v2.1.2 - 2018/10/23
|
28
|
+
|
29
|
+
https://github.com/bitjourney/mato/compare/v2.1.1...v2.1.2
|
30
|
+
|
31
|
+
* Add UNSAFE to DEFAULT_MARKDOWN_RENDER_OPTIONS
|
32
|
+
|
3
33
|
## v2.1.1 - 2018/02/22
|
4
34
|
|
5
35
|
https://github.com/bitjourney/mato/compare/v2.1.0...v2.1.1
|
data/Gemfile
CHANGED
data/lib/mato/anchor_builder.rb
CHANGED
@@ -44,7 +44,13 @@ module Mato
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def make_anchor_id_prefix(text)
|
47
|
-
ERB::Util.url_encode(text.downcase.gsub(/[^\p{Word}\- ]/u, "").tr(" ", "-"))
|
47
|
+
prefix = ERB::Util.url_encode(text.downcase.gsub(/[^\p{Word}\- ]/u, "").tr(" ", "-"))
|
48
|
+
|
49
|
+
if prefix.empty?
|
50
|
+
"user-content" # GitHub compatible
|
51
|
+
else
|
52
|
+
prefix
|
53
|
+
end
|
48
54
|
end
|
49
55
|
end
|
50
56
|
end
|
data/lib/mato/config.rb
CHANGED
@@ -18,6 +18,7 @@ module Mato
|
|
18
18
|
:DEFAULT,
|
19
19
|
:HARDBREAKS, # convert "\n" as <br/>
|
20
20
|
:TABLE_PREFER_STYLE_ATTRIBUTES,
|
21
|
+
:UNSAFE,
|
21
22
|
# :SOURCEPOS, // TODO: enable it after assertions are supported
|
22
23
|
].freeze
|
23
24
|
|
@@ -79,16 +80,19 @@ module Mato
|
|
79
80
|
|
80
81
|
def append_text_filter(text_filter, timeout: nil, on_timeout: nil, on_error: nil)
|
81
82
|
raise "text_filter must respond to call()" unless text_filter.respond_to?(:call)
|
83
|
+
|
82
84
|
text_filters.push(wrap(text_filter, timeout: timeout, on_timeout: on_timeout, on_error: on_error))
|
83
85
|
end
|
84
86
|
|
85
87
|
def append_markdown_filter(markdown_filter, timeout: nil, on_timeout: nil, on_error: nil)
|
86
88
|
raise "markdown_filter must respond to call()" unless markdown_filter.respond_to?(:call)
|
89
|
+
|
87
90
|
markdown_filters.push(wrap(markdown_filter, timeout: timeout, on_timeout: on_timeout, on_error: on_error))
|
88
91
|
end
|
89
92
|
|
90
93
|
def append_html_filter(html_filter, timeout: nil, on_timeout: nil, on_error: nil)
|
91
94
|
raise "html_filter must respond to call()" unless html_filter.respond_to?(:call)
|
95
|
+
|
92
96
|
html_filters.push(wrap(html_filter, timeout: timeout, on_timeout: on_timeout, on_error: on_error))
|
93
97
|
end
|
94
98
|
|
data/lib/mato/converter.rb
CHANGED
@@ -48,7 +48,7 @@ module Mato
|
|
48
48
|
node.sourcepos[:start_column] == 1 &&
|
49
49
|
node.parent.type == :paragraph &&
|
50
50
|
node.parent.parent.type == :document
|
51
|
-
end.
|
51
|
+
end.reverse_each do |node|
|
52
52
|
replacement = node.string_content.gsub(/\A(#+)(?=\S)/, '\1 ')
|
53
53
|
|
54
54
|
if node.string_content != replacement
|
data/lib/mato/document.rb
CHANGED
@@ -37,7 +37,9 @@ module Mato
|
|
37
37
|
next if text_node.content == candidate_html
|
38
38
|
|
39
39
|
candidate_fragment = text_node.replace(candidate_html)
|
40
|
-
candidate_fragment.css('span').each do |mention_element|
|
40
|
+
candidate_fragment.css('span.mention-candidate').each do |mention_element|
|
41
|
+
next unless mention_element.child
|
42
|
+
|
41
43
|
(candidate_map[mention_element.child.content] ||= []) << mention_element
|
42
44
|
end
|
43
45
|
|
@@ -50,6 +52,8 @@ module Mato
|
|
50
52
|
# cleanup
|
51
53
|
candidates.each do |candidate_fragment|
|
52
54
|
candidate_fragment.css('span.mention-candidate').each do |node|
|
55
|
+
next unless node.child
|
56
|
+
|
53
57
|
node.replace(node.child.content)
|
54
58
|
end
|
55
59
|
end
|
@@ -5,6 +5,12 @@
|
|
5
5
|
module Mato
|
6
6
|
module HtmlFilters
|
7
7
|
class SyntaxHighlight
|
8
|
+
class RougeError < StandardError
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(on_rouge_error: ->(ex) { warn ex })
|
12
|
+
@on_rouge_error = on_rouge_error
|
13
|
+
end
|
8
14
|
|
9
15
|
# @param [Nokogiri::HTML::DocumentFragment] doc
|
10
16
|
def call(doc)
|
@@ -57,11 +63,21 @@ module Mato
|
|
57
63
|
|
58
64
|
lexer = guess_lexer(language, filename, source)
|
59
65
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
66
|
+
begin
|
67
|
+
document = Nokogiri::HTML.fragment(%{<div class="code-frame"/>})
|
68
|
+
div = document.at('div')
|
69
|
+
div.add_child(label_fragment(filename || language || lexer.tag)) if filename || !lexer.is_a?(Rouge::Lexers::PlainText)
|
70
|
+
div.add_child(%{<pre class="highlight"><code data-lang="#{lexer.tag}">#{format(lexer, source)}</code></pre>})
|
71
|
+
rescue => ex
|
72
|
+
if ex.is_a?(RougeError) && !lexer.is_a?(Rouge::Lexers::PlainText)
|
73
|
+
# Retry highlighting with PlainText lexer if Rouge raises an error.
|
74
|
+
# It avoids to affect the error to whole of converting.
|
75
|
+
lexer = Rouge::Lexers::PlainText.new
|
76
|
+
retry
|
77
|
+
else
|
78
|
+
raise ex
|
79
|
+
end
|
80
|
+
end
|
65
81
|
|
66
82
|
document
|
67
83
|
end
|
@@ -79,6 +95,9 @@ module Mato
|
|
79
95
|
def format(lexer, source)
|
80
96
|
tokens = lexer.lex(source)
|
81
97
|
formatter.format(tokens)
|
98
|
+
rescue => ex
|
99
|
+
@on_rouge_error.call(ex)
|
100
|
+
raise RougeError.new
|
82
101
|
end
|
83
102
|
end
|
84
103
|
end
|
@@ -3,15 +3,18 @@
|
|
3
3
|
module Mato
|
4
4
|
module HtmlFilters
|
5
5
|
class TaskList
|
6
|
-
CHECKED_MARK =
|
7
|
-
UNCHECKED_MARK =
|
6
|
+
CHECKED_MARK = /\A\[x\] /
|
7
|
+
UNCHECKED_MARK = /\A\[ \] /
|
8
|
+
CHECKED_MARK_FOR_EMPTY_TASK_LIST = /\A\[x\] ?/
|
9
|
+
UNCHECKED_MARK_FOR_EMPTY_TASK_LIST = /\A\[ \] ?/
|
8
10
|
|
9
11
|
DEFAULT_TASK_LIST_CLASS = "task-list-item"
|
10
12
|
DEFAULT_CHECKBOX_CLASS = "task-list-item-checkbox"
|
11
13
|
|
12
|
-
def initialize(task_list_class: DEFAULT_TASK_LIST_CLASS, checkbox_class: DEFAULT_CHECKBOX_CLASS)
|
14
|
+
def initialize(task_list_class: DEFAULT_TASK_LIST_CLASS, checkbox_class: DEFAULT_CHECKBOX_CLASS, convert_empty_task_list: false)
|
13
15
|
@task_list_class = task_list_class
|
14
16
|
@checkbox_class = checkbox_class
|
17
|
+
@convert_empty_task_list = convert_empty_task_list
|
15
18
|
end
|
16
19
|
|
17
20
|
# @param [Nokogiri::HTML::DocumentFragment] doc
|
@@ -37,18 +40,34 @@ module Mato
|
|
37
40
|
end
|
38
41
|
|
39
42
|
def has_checked_mark?(text_node)
|
40
|
-
text_node&.content&.
|
43
|
+
text_node&.content&.match?(checked_mark)
|
41
44
|
end
|
42
45
|
|
43
46
|
def has_unchecked_mark?(text_node)
|
44
|
-
text_node&.content&.
|
47
|
+
text_node&.content&.match?(unchecked_mark)
|
45
48
|
end
|
46
49
|
|
47
50
|
def trim_mark(content, checked)
|
48
51
|
if checked
|
49
|
-
content.sub(
|
52
|
+
content.sub(checked_mark, '')
|
50
53
|
else
|
51
|
-
content.sub(
|
54
|
+
content.sub(unchecked_mark, '')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def checked_mark
|
59
|
+
if @convert_empty_task_list
|
60
|
+
CHECKED_MARK_FOR_EMPTY_TASK_LIST
|
61
|
+
else
|
62
|
+
CHECKED_MARK
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def unchecked_mark
|
67
|
+
if @convert_empty_task_list
|
68
|
+
UNCHECKED_MARK_FOR_EMPTY_TASK_LIST
|
69
|
+
else
|
70
|
+
UNCHECKED_MARK
|
52
71
|
end
|
53
72
|
end
|
54
73
|
|
data/lib/mato/version.rb
CHANGED
data/mato.gemspec
CHANGED
@@ -13,6 +13,11 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.homepage = "https://github.com/bitjourney/mato"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
17
|
+
spec.metadata["source_code_uri"] = spec.homepage
|
18
|
+
spec.metadata["changelog_uri"] = 'https://github.com/bitjourney/mato/blob/master/CHANGELOG.md'
|
19
|
+
spec.metadata['bug_tracker_uri'] = 'https://github.com/bitjourney/mato/issues'
|
20
|
+
|
16
21
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
22
|
f.match(%r{^(?:test|spec|features|example)/})
|
18
23
|
end
|
@@ -20,9 +25,9 @@ Gem::Specification.new do |spec|
|
|
20
25
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
26
|
spec.require_paths = ["lib"]
|
22
27
|
|
23
|
-
spec.required_ruby_version = ">= 2.
|
28
|
+
spec.required_ruby_version = ">= 2.4"
|
24
29
|
|
25
|
-
spec.add_runtime_dependency "commonmarker", ">= 0.
|
30
|
+
spec.add_runtime_dependency "commonmarker", ">= 0.18.1"
|
26
31
|
spec.add_runtime_dependency "nokogiri", ">= 1.6"
|
27
32
|
spec.add_runtime_dependency "rouge", ">= 3.0.0"
|
28
33
|
end
|
data/sider.yml
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mato
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- FUJI Goro
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: commonmarker
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.18.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.18.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: nokogiri
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -89,10 +89,15 @@ files:
|
|
89
89
|
- lib/mato/timeout.rb
|
90
90
|
- lib/mato/version.rb
|
91
91
|
- mato.gemspec
|
92
|
+
- sider.yml
|
92
93
|
homepage: https://github.com/bitjourney/mato
|
93
94
|
licenses:
|
94
95
|
- MIT
|
95
|
-
metadata:
|
96
|
+
metadata:
|
97
|
+
homepage_uri: https://github.com/bitjourney/mato
|
98
|
+
source_code_uri: https://github.com/bitjourney/mato
|
99
|
+
changelog_uri: https://github.com/bitjourney/mato/blob/master/CHANGELOG.md
|
100
|
+
bug_tracker_uri: https://github.com/bitjourney/mato/issues
|
96
101
|
post_install_message:
|
97
102
|
rdoc_options: []
|
98
103
|
require_paths:
|
@@ -101,15 +106,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
101
106
|
requirements:
|
102
107
|
- - ">="
|
103
108
|
- !ruby/object:Gem::Version
|
104
|
-
version: '2.
|
109
|
+
version: '2.4'
|
105
110
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
111
|
requirements:
|
107
112
|
- - ">="
|
108
113
|
- !ruby/object:Gem::Version
|
109
114
|
version: '0'
|
110
115
|
requirements: []
|
111
|
-
|
112
|
-
rubygems_version: 2.7.6
|
116
|
+
rubygems_version: 3.2.0.pre1
|
113
117
|
signing_key:
|
114
118
|
specification_version: 4
|
115
119
|
summary: MArkdown TOolkit
|