protos-markdown 0.1.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 725d04f7f6f71d4cd033090733acba1127e4eee5917de42dcc284a8c087f0000
4
- data.tar.gz: b9d342cd4c13282f3828a385f991aba32d08ce1fe929d6a074b90b7f26440870
3
+ metadata.gz: ef97dcc38918f4650f93eecd010522e60f435326b1c5330855b277063bf91c2d
4
+ data.tar.gz: 45986e32975fb362c82c1c7428450d6a64b6237c1e722039b1bc91ca24d57d1e
5
5
  SHA512:
6
- metadata.gz: fbdb805c8651cbf0ec99bc4eb59b86f9001cffb80e8136ea2330a9ae25f2bf6107b949ea039178dda962f469a31a2609c6f083239dd888998e78fe5d3413a45d
7
- data.tar.gz: 67435c7bf853286c7ce68fc184ac78f51af806254bec68612a140c5494dc0162a459bf5fd0efd744e9b4d84c524a57bd923c2e6d700f2ece833e8048039ce5ca
6
+ metadata.gz: edde7fdbe9ed89febeb5fe007bd5f7a3bc382277fe68a02949f0054d68ac427daa281a208f66eae358b29479c4c782f9759206dde3ad1f32a51a5be3870e2102
7
+ data.tar.gz: f8baa177b747fea06e86452a221ad39042cec9a43c699f9159e4840c9e9170cd7c7950c8d97c05c468136112f94303fbca030f4671a6423ef6a1cdca1ce4ec28
data/README.md CHANGED
@@ -22,8 +22,8 @@ using the standard protos conventions:
22
22
 
23
23
  ```ruby
24
24
  class Markdown < Protos::Markdown
25
- def h1 = super(class: css[:title])
26
- def ul = super(class: "ml-4 pt-2")
25
+ def h1(**) = super(class: css[:title], **)
26
+ def ul(**) = super(class: "ml-4 pt-2", **)
27
27
 
28
28
  private
29
29
 
@@ -52,7 +52,7 @@ output = Markdown.new(content).call
52
52
  Which outputs the following html:
53
53
 
54
54
  ```html
55
- <h1 class="font-bold text-xl">Hello World</h1>
55
+ <h1 class="font-bold text-xl" id="hello-world">Hello World</h1>
56
56
  <ul class="ml-4 pt-2">
57
57
  <li>A</li>
58
58
  <li>B</li>
@@ -17,9 +17,15 @@ module Protos
17
17
  end
18
18
  end
19
19
 
20
- def self.parse(content)
21
- Markly
22
- .parse(content, flags: Markly::GITHUB_PRE_LANG, extensions: [:table])
20
+ def self.parse(content, markdown_options: {})
21
+ options = {
22
+ render: { gfm_quirks: true },
23
+ extension: { table: true },
24
+ **markdown_options
25
+ }
26
+
27
+ Commonmarker
28
+ .parse(content, options:)
23
29
  .then { |node| new(Node.new(node)) }
24
30
  end
25
31
 
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Protos
2
4
  class Markdown
3
5
  class Table < Protos::Table
4
- option :inside_header, default: -> { false }, reader: false
6
+ option :inside_header, default: -> { true }, reader: false
5
7
 
6
8
  def visit_table(node)
7
9
  visit_children(node)
@@ -28,11 +30,11 @@ module Protos
28
30
  end
29
31
 
30
32
  def visit_table_row(node)
31
- @inside_header = false
32
-
33
33
  row do
34
34
  visit_children(node)
35
35
  end
36
+
37
+ @inside_header = false
36
38
  end
37
39
 
38
40
  def visit_code(node)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "protos"
4
- require "markly"
4
+ require "commonmarker"
5
5
  require "rouge"
6
6
  require "delegate"
7
7
 
@@ -12,6 +12,27 @@ module Protos
12
12
  class Markdown < ::Protos::Component # rubocop:disable Metrics/ClassLength
13
13
  param :content, reader: false
14
14
  option :sanitize, default: -> { true }, reader: false
15
+ option :markdown_options, default: -> { {} }, reader: false
16
+
17
+ Heading = Data.define(:node) do
18
+ def id
19
+ text.downcase.gsub(/[^a-z0-9]+/, "-").chomp("-")
20
+ end
21
+
22
+ def text
23
+ buffer = +""
24
+ node.walk do |node|
25
+ buffer << node.string_content
26
+ rescue TypeError
27
+ # Ignore non-text nodes
28
+ end
29
+ buffer
30
+ end
31
+
32
+ def header_level
33
+ node.header_level
34
+ end
35
+ end
15
36
 
16
37
  def view_template
17
38
  return unless root
@@ -37,14 +58,16 @@ module Protos
37
58
  plain(node.string_content)
38
59
  end
39
60
 
40
- def visit_header(node)
41
- case node.header_level
42
- in 1 then h1 { visit_children(node) }
43
- in 2 then h2 { visit_children(node) }
44
- in 3 then h3 { visit_children(node) }
45
- in 4 then h4 { visit_children(node) }
46
- in 5 then h5 { visit_children(node) }
47
- in 6 then h6 { visit_children(node) }
61
+ def visit_heading(node)
62
+ heading = Heading.new(node)
63
+
64
+ case heading.header_level
65
+ in 1 then h1(id: heading.id) { visit_children(node) }
66
+ in 2 then h2(id: heading.id) { visit_children(node) }
67
+ in 3 then h3(id: heading.id) { visit_children(node) }
68
+ in 4 then h4(id: heading.id) { visit_children(node) }
69
+ in 5 then h5(id: heading.id) { visit_children(node) }
70
+ in 6 then h6(id: heading.id) { visit_children(node) }
48
71
  end
49
72
  end
50
73
 
@@ -80,12 +103,13 @@ module Protos
80
103
 
81
104
  def visit_list(node)
82
105
  case node.list_type
83
- when :ordered_list then ol { visit_children(node) }
84
- when :bullet_list then ul { visit_children(node) }
106
+ when :ordered then ol { visit_children(node) }
107
+ when :bullet then ul { visit_children(node) }
108
+ else raise ArgumentError, "Unknown list type: #{node.list_type}"
85
109
  end
86
110
  end
87
111
 
88
- def visit_list_item(node)
112
+ def visit_item(node)
89
113
  li { visit_children(node) }
90
114
  end
91
115
 
@@ -99,36 +123,44 @@ module Protos
99
123
  code_block(node.string_content, node.fence_info) do |**attributes|
100
124
  pre(**attributes) do
101
125
  code(class: "highlight language-#{node.fence_info}") do
102
- unsafe_raw lex(node.string_content, node.fence_info)
126
+ raw safe(lex(node.string_content, node.fence_info))
103
127
  end
104
128
  end
105
129
  end
106
130
  end
107
131
 
108
- def visit_hrule(_node)
132
+ def visit_thematic_break(_node)
109
133
  hr
110
134
  end
111
135
 
112
- def visit_blockquote(node)
136
+ def visit_block_quote(node)
113
137
  blockquote { visit_children(node) }
114
138
  end
115
139
 
116
140
  def visit_html(node)
117
141
  return if @sanitize
118
142
 
119
- unsafe_raw(node.string_content)
143
+ raw safe(node.string_content)
120
144
  end
121
145
 
122
- def visit_inline_html(node)
146
+ def visit_html_inline(node)
123
147
  return if @sanitize
124
148
 
125
- unsafe_raw(node.string_content)
149
+ raw safe(node.to_html(options: { render: { unsafe: true } }))
150
+ end
151
+
152
+ def visit_html_block(_node)
153
+ nil
154
+ end
155
+
156
+ def visit_escaped(node)
157
+ plain(node.first_child&.string_content)
126
158
  end
127
159
 
128
160
  private
129
161
 
130
162
  def root
131
- AST.parse(@content)
163
+ AST.parse(@content, markdown_options: @markdown_options)
132
164
  end
133
165
 
134
166
  def formatter
@@ -146,7 +178,7 @@ module Protos
146
178
  yield(**attributes)
147
179
  end
148
180
 
149
- def code_block(code, language, **attributes) # rubocop:disable Lint/UnusedMethodArgument, Metrics/ParameterLists
181
+ def code_block(code, language, **attributes) # rubocop:disable Lint/UnusedMethodArgument
150
182
  yield(**attributes)
151
183
  end
152
184
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "protos-markdown"
5
- spec.version = "0.1.1"
5
+ spec.version = "1.1.0"
6
6
  spec.authors = ["Nolan Tait"]
7
7
  spec.email = ["nolanjtait@gmail.com"]
8
8
 
@@ -30,9 +30,9 @@ Gem::Specification.new do |spec|
30
30
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
31
31
  spec.require_paths = ["lib"]
32
32
 
33
- spec.add_dependency "markly", "~> 0.7"
34
- spec.add_dependency "protos", ">= 0.4"
35
- spec.add_dependency "rouge", "~> 4.3"
33
+ spec.add_dependency "commonmarker", "~> 2.3"
34
+ spec.add_dependency "protos", "~> 1"
35
+ spec.add_dependency "rouge", "~> 4"
36
36
 
37
37
  spec.metadata["rubygems_mfa_required"] = "true"
38
38
  end
metadata CHANGED
@@ -1,57 +1,56 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protos-markdown
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nolan Tait
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2024-08-15 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: markly
13
+ name: commonmarker
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
- version: '0.7'
18
+ version: '2.3'
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - "~>"
25
24
  - !ruby/object:Gem::Version
26
- version: '0.7'
25
+ version: '2.3'
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: protos
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
- - - ">="
30
+ - - "~>"
32
31
  - !ruby/object:Gem::Version
33
- version: '0.4'
32
+ version: '1'
34
33
  type: :runtime
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
- - - ">="
37
+ - - "~>"
39
38
  - !ruby/object:Gem::Version
40
- version: '0.4'
39
+ version: '1'
41
40
  - !ruby/object:Gem::Dependency
42
41
  name: rouge
43
42
  requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
44
  - - "~>"
46
45
  - !ruby/object:Gem::Version
47
- version: '4.3'
46
+ version: '4'
48
47
  type: :runtime
49
48
  prerelease: false
50
49
  version_requirements: !ruby/object:Gem::Requirement
51
50
  requirements:
52
51
  - - "~>"
53
52
  - !ruby/object:Gem::Version
54
- version: '4.3'
53
+ version: '4'
55
54
  description: A markdown renderer with Phlex and Protos
56
55
  email:
57
56
  - nolanjtait@gmail.com
@@ -79,7 +78,6 @@ metadata:
79
78
  changelog_uri: https://github.com/inhouse-work/protos-markdown
80
79
  funding_uri: https://github.com/inhouse-work/protos-markdown
81
80
  rubygems_mfa_required: 'true'
82
- post_install_message:
83
81
  rdoc_options: []
84
82
  require_paths:
85
83
  - lib
@@ -94,8 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
92
  - !ruby/object:Gem::Version
95
93
  version: '0'
96
94
  requirements: []
97
- rubygems_version: 3.5.17
98
- signing_key:
95
+ rubygems_version: 3.6.7
99
96
  specification_version: 4
100
97
  summary: A markdown renderer with Phlex and Protos
101
98
  test_files: []