mato 2.1.2 → 2.3.1

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
  SHA256:
3
- metadata.gz: 96f1b60efb3bcd7510d87d0d87a0d545f7d9f5f65b8abb0543b7150fc62ab3f1
4
- data.tar.gz: 3761d309afd64f7642e8ad6cb75d01f9935e6cafe48278b81512726b2d49e453
3
+ metadata.gz: 59902decca423364fc185eef127151622e9348e7ce4ed5a90bab8ca1d44dfbf3
4
+ data.tar.gz: bd618687101adb2f9f9e1d6a4ac5a25baafa44018fa7bff2869e19703ec0375d
5
5
  SHA512:
6
- metadata.gz: '00090b55259a7d93d0ff4f83541c4aa9fd4ac314447161b179c53c0c8eb6142a494371c8ab48bc8063d68bacab19be5fcae343be504a1c3ddf9a586c5e603784'
7
- data.tar.gz: eb898f49f4dc12f399d5090793721a83f4aeb19a97d06e0db7815198d65dc18998e6c43a8b86c592332b97d34cd39445330664f9ce2b1e78b813661c0137ea69
6
+ metadata.gz: 25752490aeb9a2a7d7926a8037dac4138836b5c2582dbe3894e5761566cc9c60c15e14f9ed70a457d78dc96346961d9d795c188671c7055bfc612d596c5163a3
7
+ data.tar.gz: 8eb1dd626ad5147fb8e1d0050a3650a1207860227cc4f88a79220a87a68f8040e9bf0c5be890b5af248fe5542b2c55b04b06c1357e098cfab1cb409903c48559
@@ -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.3
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
- Metrics/AbcSize:
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/TrailingCommaInLiteral:
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
@@ -1,8 +1,9 @@
1
- sudo: false
2
1
  language: ruby
3
2
  rvm:
4
- - 2.3
5
3
  - 2.4
4
+ - 2.5
5
+ - 2.6
6
+ - 2.7
6
7
  - ruby-head
7
8
 
8
9
  matrix:
@@ -1,5 +1,33 @@
1
1
  # The revision history of Mato
2
2
 
3
+ ## v2.3.1 - 2020/07/15
4
+
5
+ * Allow loose task list. [#24](https://github.com/bitjourney/mato/pull/24)
6
+
7
+ ## v2.3.0 - 2020/06/16
8
+
9
+ * 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)
10
+
11
+ ## v2.2.0 - 2020/05/08
12
+
13
+ https://github.com/bitjourney/mato/compare/v2.1.4...v2.2.0
14
+
15
+ * BREAKING: Drop support for Ruby 2.3
16
+ * Display code block as plan text if Rouge raises an error [#21](https://github.com/bitjourney/mato/pull/21)
17
+
18
+
19
+ ## v2.1.4 - 2019/4/11
20
+
21
+ https://github.com/bitjourney/mato/compare/v2.1.3...v2.1.4
22
+
23
+ * Fix broken mention link process in case of including unexpected text
24
+
25
+ ## v2.1.3 - 2019/1/15
26
+
27
+ https://github.com/bitjourney/mato/compare/v2.1.2...v2.1.3
28
+
29
+ * Fix anchor in case of heading which is only special characters
30
+
3
31
  ## v2.1.2 - 2018/10/23
4
32
 
5
33
  https://github.com/bitjourney/mato/compare/v2.1.1...v2.1.2
data/Gemfile CHANGED
@@ -12,4 +12,6 @@ gem "m"
12
12
  gem "minitest"
13
13
  gem "minitest-power_assert"
14
14
  gem "rake", ">= 10.0"
15
- gem "rubocop"
15
+ gem 'rr'
16
+ gem "rubocop", '>= 0.78.0'
17
+ gem 'rubocop-performance'
@@ -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
@@ -80,16 +80,19 @@ module Mato
80
80
 
81
81
  def append_text_filter(text_filter, timeout: nil, on_timeout: nil, on_error: nil)
82
82
  raise "text_filter must respond to call()" unless text_filter.respond_to?(:call)
83
+
83
84
  text_filters.push(wrap(text_filter, timeout: timeout, on_timeout: on_timeout, on_error: on_error))
84
85
  end
85
86
 
86
87
  def append_markdown_filter(markdown_filter, timeout: nil, on_timeout: nil, on_error: nil)
87
88
  raise "markdown_filter must respond to call()" unless markdown_filter.respond_to?(:call)
89
+
88
90
  markdown_filters.push(wrap(markdown_filter, timeout: timeout, on_timeout: on_timeout, on_error: on_error))
89
91
  end
90
92
 
91
93
  def append_html_filter(html_filter, timeout: nil, on_timeout: nil, on_error: nil)
92
94
  raise "html_filter must respond to call()" unless html_filter.respond_to?(:call)
95
+
93
96
  html_filters.push(wrap(html_filter, timeout: timeout, on_timeout: on_timeout, on_error: on_error))
94
97
  end
95
98
 
@@ -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.reverse.each do |node|
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
@@ -1,4 +1,3 @@
1
-
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require_relative './renderers/html_renderer'
@@ -17,6 +17,7 @@ module Mato
17
17
  def call(doc)
18
18
  doc.children.each do |node|
19
19
  next unless STANDALONE_INLINE_ELEMENTS.include?(node.name)
20
+
20
21
  parent = Nokogiri::HTML.fragment('<p/>')
21
22
  parent.child.add_child(node.dup)
22
23
  node.replace(parent)
@@ -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
- document = Nokogiri::HTML.fragment(%{<div class="code-frame"/>})
61
-
62
- div = document.at('div')
63
- div.add_child(label_fragment(filename || language || lexer.tag)) if filename || !lexer.is_a?(Rouge::Lexers::PlainText)
64
- div.add_child(%{<pre class="highlight"><code data-lang="#{lexer.tag}">#{format(lexer, source)}</code></pre>})
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 = "[x] "
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
@@ -23,7 +26,7 @@ module Mato
23
26
 
24
27
  # @param [Nokogiri::XML::Node] li
25
28
  def weave(li)
26
- text_node = li.xpath('.//text()').first
29
+ text_node = li.xpath('./p[1]/text()').first || li.xpath('.//text()').first
27
30
  checked = has_checked_mark?(text_node)
28
31
  unchecked = has_unchecked_mark?(text_node)
29
32
 
@@ -37,18 +40,34 @@ module Mato
37
40
  end
38
41
 
39
42
  def has_checked_mark?(text_node)
40
- text_node&.content&.start_with?(CHECKED_MARK)
43
+ text_node&.content&.match?(checked_mark)
41
44
  end
42
45
 
43
46
  def has_unchecked_mark?(text_node)
44
- text_node&.content&.start_with?(UNCHECKED_MARK)
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(CHECKED_MARK, '')
52
+ content.sub(checked_mark, '')
50
53
  else
51
- content.sub(UNCHECKED_MARK, '')
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
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mato
4
- VERSION = "2.1.2"
4
+ VERSION = "2.3.1"
5
5
  end
@@ -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,7 +25,7 @@ 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.3"
28
+ spec.required_ruby_version = ">= 2.4"
24
29
 
25
30
  spec.add_runtime_dependency "commonmarker", ">= 0.18.1"
26
31
  spec.add_runtime_dependency "nokogiri", ">= 1.6"
@@ -0,0 +1,4 @@
1
+ linter:
2
+ rubocop:
3
+ gems:
4
+ - "rubocop-performance"
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.1.2
4
+ version: 2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - FUJI Goro
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-10-24 00:00:00.000000000 Z
11
+ date: 2020-07-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: commonmarker
@@ -89,11 +89,16 @@ 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
- post_install_message:
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
101
+ post_install_message:
97
102
  rdoc_options: []
98
103
  require_paths:
99
104
  - lib
@@ -101,16 +106,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
101
106
  requirements:
102
107
  - - ">="
103
108
  - !ruby/object:Gem::Version
104
- version: '2.3'
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
- rubyforge_project:
112
- rubygems_version: 2.7.6
113
- signing_key:
116
+ rubygems_version: 3.2.0.pre1
117
+ signing_key:
114
118
  specification_version: 4
115
119
  summary: MArkdown TOolkit
116
120
  test_files: []