commonmarker 0.23.10 → 1.1.1

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.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +1220 -0
  3. data/Cargo.toml +7 -0
  4. data/README.md +217 -170
  5. data/ext/commonmarker/Cargo.toml +20 -0
  6. data/ext/commonmarker/extconf.rb +3 -6
  7. data/ext/commonmarker/src/lib.rs +183 -0
  8. data/ext/commonmarker/src/node.rs +1095 -0
  9. data/ext/commonmarker/src/options.rs +165 -0
  10. data/ext/commonmarker/src/plugins/syntax_highlighting.rs +74 -0
  11. data/ext/commonmarker/src/plugins.rs +3 -0
  12. data/ext/commonmarker/src/utils.rs +8 -0
  13. data/lib/commonmarker/config.rb +90 -40
  14. data/lib/commonmarker/constants.rb +7 -0
  15. data/lib/commonmarker/extension.rb +14 -0
  16. data/lib/commonmarker/node/ast.rb +8 -0
  17. data/lib/commonmarker/node/inspect.rb +14 -4
  18. data/lib/commonmarker/node.rb +29 -47
  19. data/lib/commonmarker/renderer.rb +1 -127
  20. data/lib/commonmarker/utils.rb +22 -0
  21. data/lib/commonmarker/version.rb +2 -2
  22. data/lib/commonmarker.rb +27 -25
  23. metadata +38 -186
  24. data/Rakefile +0 -109
  25. data/bin/commonmarker +0 -118
  26. data/commonmarker.gemspec +0 -38
  27. data/ext/commonmarker/arena.c +0 -104
  28. data/ext/commonmarker/autolink.c +0 -508
  29. data/ext/commonmarker/autolink.h +0 -8
  30. data/ext/commonmarker/blocks.c +0 -1622
  31. data/ext/commonmarker/buffer.c +0 -278
  32. data/ext/commonmarker/buffer.h +0 -116
  33. data/ext/commonmarker/case_fold_switch.inc +0 -4327
  34. data/ext/commonmarker/chunk.h +0 -135
  35. data/ext/commonmarker/cmark-gfm-core-extensions.h +0 -54
  36. data/ext/commonmarker/cmark-gfm-extension_api.h +0 -737
  37. data/ext/commonmarker/cmark-gfm-extensions_export.h +0 -42
  38. data/ext/commonmarker/cmark-gfm.h +0 -833
  39. data/ext/commonmarker/cmark-gfm_export.h +0 -42
  40. data/ext/commonmarker/cmark-gfm_version.h +0 -7
  41. data/ext/commonmarker/cmark.c +0 -55
  42. data/ext/commonmarker/cmark_ctype.c +0 -44
  43. data/ext/commonmarker/cmark_ctype.h +0 -33
  44. data/ext/commonmarker/commonmark.c +0 -514
  45. data/ext/commonmarker/commonmarker.c +0 -1308
  46. data/ext/commonmarker/commonmarker.h +0 -16
  47. data/ext/commonmarker/config.h +0 -76
  48. data/ext/commonmarker/core-extensions.c +0 -27
  49. data/ext/commonmarker/entities.inc +0 -2138
  50. data/ext/commonmarker/ext_scanners.c +0 -879
  51. data/ext/commonmarker/ext_scanners.h +0 -24
  52. data/ext/commonmarker/footnotes.c +0 -63
  53. data/ext/commonmarker/footnotes.h +0 -27
  54. data/ext/commonmarker/houdini.h +0 -57
  55. data/ext/commonmarker/houdini_href_e.c +0 -100
  56. data/ext/commonmarker/houdini_html_e.c +0 -66
  57. data/ext/commonmarker/houdini_html_u.c +0 -149
  58. data/ext/commonmarker/html.c +0 -502
  59. data/ext/commonmarker/html.h +0 -27
  60. data/ext/commonmarker/inlines.c +0 -1788
  61. data/ext/commonmarker/inlines.h +0 -29
  62. data/ext/commonmarker/iterator.c +0 -159
  63. data/ext/commonmarker/iterator.h +0 -26
  64. data/ext/commonmarker/latex.c +0 -468
  65. data/ext/commonmarker/linked_list.c +0 -37
  66. data/ext/commonmarker/man.c +0 -274
  67. data/ext/commonmarker/map.c +0 -129
  68. data/ext/commonmarker/map.h +0 -44
  69. data/ext/commonmarker/node.c +0 -1045
  70. data/ext/commonmarker/node.h +0 -167
  71. data/ext/commonmarker/parser.h +0 -59
  72. data/ext/commonmarker/plaintext.c +0 -218
  73. data/ext/commonmarker/plugin.c +0 -36
  74. data/ext/commonmarker/plugin.h +0 -34
  75. data/ext/commonmarker/references.c +0 -43
  76. data/ext/commonmarker/references.h +0 -26
  77. data/ext/commonmarker/registry.c +0 -63
  78. data/ext/commonmarker/registry.h +0 -24
  79. data/ext/commonmarker/render.c +0 -213
  80. data/ext/commonmarker/render.h +0 -62
  81. data/ext/commonmarker/scanners.c +0 -14056
  82. data/ext/commonmarker/scanners.h +0 -70
  83. data/ext/commonmarker/scanners.re +0 -341
  84. data/ext/commonmarker/strikethrough.c +0 -167
  85. data/ext/commonmarker/strikethrough.h +0 -9
  86. data/ext/commonmarker/syntax_extension.c +0 -149
  87. data/ext/commonmarker/syntax_extension.h +0 -34
  88. data/ext/commonmarker/table.c +0 -917
  89. data/ext/commonmarker/table.h +0 -12
  90. data/ext/commonmarker/tagfilter.c +0 -60
  91. data/ext/commonmarker/tagfilter.h +0 -8
  92. data/ext/commonmarker/tasklist.c +0 -156
  93. data/ext/commonmarker/tasklist.h +0 -8
  94. data/ext/commonmarker/utf8.c +0 -317
  95. data/ext/commonmarker/utf8.h +0 -35
  96. data/ext/commonmarker/xml.c +0 -182
  97. data/lib/commonmarker/renderer/html_renderer.rb +0 -256
data/Cargo.toml ADDED
@@ -0,0 +1,7 @@
1
+ # This Cargo.toml is here to let externals tools (IDEs, etc.) know that this is
2
+ # a Rust project. Your extensions depedencies should be added to the Cargo.toml
3
+ # in the ext/ directory.
4
+
5
+ [workspace]
6
+ members = ["ext/commonmarker"]
7
+ resolver = "2"
data/README.md CHANGED
@@ -1,11 +1,10 @@
1
- # CommonMarker
1
+ # Commonmarker
2
2
 
3
- ![Build Status](https://github.com/gjtorikian/commonmarker/workflows/CI/badge.svg) [![Gem Version](https://badge.fury.io/rb/commonmarker.svg)](http://badge.fury.io/rb/commonmarker)
3
+ Ruby wrapper for Rust's [comrak](https://github.com/kivikakk/comrak) crate.
4
4
 
5
- Ruby wrapper for [libcmark-gfm](https://github.com/github/cmark),
6
- GitHub's fork of the reference parser for CommonMark. It passes all of the C tests, and is therefore spec-complete. It also includes extensions to the CommonMark spec as documented in the [GitHub Flavored Markdown spec](http://github.github.com/gfm/), such as support for tables, strikethroughs, and autolinking.
5
+ It passes all of the CommonMark test suite, and is therefore spec-complete. It also includes extensions to the CommonMark spec as documented in the [GitHub Flavored Markdown spec](http://github.github.com/gfm/), such as support for tables, strikethroughs, and autolinking.
7
6
 
8
- For more information on available extensions, see [the documentation below](#extensions).
7
+ For more information on available extensions, see [the documentation below](#extension-options).
9
8
 
10
9
  ## Installation
11
10
 
@@ -25,45 +24,75 @@ Or install it yourself as:
25
24
 
26
25
  ### Converting to HTML
27
26
 
28
- Call `render_html` on a string to convert it to HTML:
27
+ Call `to_html` on a string to convert it to HTML:
29
28
 
30
- ``` ruby
29
+ ```ruby
31
30
  require 'commonmarker'
32
- CommonMarker.render_html('Hi *there*', :DEFAULT)
33
- # <p>Hi <em>there</em></p>\n
31
+ Commonmarker.to_html('"Hi *there*"', options: {
32
+ parse: { smart: true }
33
+ })
34
+ # => <p>“Hi <em>there</em>”</p>\n
34
35
  ```
35
36
 
36
- The second argument is optional--[see below](#options) for more information.
37
+ (The second argument is optional--[see below](#options-and-plugins) for more information.)
37
38
 
38
39
  ### Generating a document
39
40
 
40
- You can also parse a string to receive a `Document` node. You can then print that node to HTML, iterate over the children, and other fun node stuff. For example:
41
+ You can also parse a string to receive a `:document` node. You can then print that node to HTML, iterate over the children, and do other fun node stuff. For example:
41
42
 
42
- ``` ruby
43
+ ```ruby
43
44
  require 'commonmarker'
44
45
 
45
- doc = CommonMarker.render_doc('*Hello* world', :DEFAULT)
46
- puts(doc.to_html) # <p>Hi <em>there</em></p>\n
46
+ doc = Commonmarker.parse("*Hello* world", options: {
47
+ parse: { smart: true }
48
+ })
49
+ puts(doc.to_html) # => <p><em>Hello</em> world</p>\n
47
50
 
48
51
  doc.walk do |node|
49
- puts node.type # [:document, :paragraph, :text, :emph, :text]
52
+ puts node.type # => [:document, :paragraph, :emph, :text, :text]
50
53
  end
51
54
  ```
52
55
 
53
- The second argument is optional--[see below](#options) for more information.
56
+ (The second argument is optional--[see below](#options-and-plugins) for more information.)
57
+
58
+ When it comes to modifying the document, you can perform the following operations:
59
+
60
+ - `insert_before`
61
+ - `insert_after`
62
+ - `prepend_child`
63
+ - `append_child`
64
+ - `delete`
54
65
 
55
- #### Example: walking the AST
66
+ You can also get the source position of a node by calling `source_position`:
67
+
68
+ ```ruby
69
+ doc = Commonmarker.parse("*Hello* world")
70
+ puts doc.first_child.first_child.source_position
71
+ # => {:start_line=>1, :start_column=>1, :end_line=>1, :end_column=>7}
72
+ ```
73
+
74
+ You can also modify the following attributes:
75
+
76
+ - `url`
77
+ - `title`
78
+ - `header_level`
79
+ - `list_type`
80
+ - `list_start`
81
+ - `list_tight`
82
+ - `fence_info`
83
+
84
+ #### Example: Walking the AST
56
85
 
57
86
  You can use `walk` or `each` to iterate over nodes:
58
87
 
59
88
  - `walk` will iterate on a node and recursively iterate on a node's children.
60
89
  - `each` will iterate on a node and its children, but no further.
61
90
 
62
- ``` ruby
91
+ ```ruby
63
92
  require 'commonmarker'
64
93
 
65
- # parse the files specified on the command line
66
- doc = CommonMarker.render_doc("# The site\n\n [GitHub](https://www.github.com)")
94
+ # parse some string
95
+ doc = Commonmarker.parse("# The site\n\n [GitHub](https://www.github.com)")
67
96
 
68
97
  # Walk tree and print out URLs for links
69
98
  doc.walk do |node|
@@ -71,17 +100,7 @@ doc.walk do |node|
71
100
  printf("URL = %s\n", node.url)
72
101
  end
73
102
  end
74
-
75
- # Capitalize all regular text in headers
76
- doc.walk do |node|
77
- if node.type == :header
78
- node.each do |subnode|
79
- if subnode.type == :text
80
- subnode.string_content = subnode.string_content.upcase
81
- end
82
- end
83
- end
84
- end
103
+ # => URL = https://www.github.com
85
104
 
86
105
  # Transform links to regular text
87
106
  doc.walk do |node|
@@ -90,169 +109,186 @@ doc.walk do |node|
90
109
  node.delete
91
110
  end
92
111
  end
112
+ # => <h1><a href=\"#the-site\"></a>The site</h1>\n<p>GitHub</p>\n
93
113
  ```
94
114
 
95
- ### Creating a custom renderer
115
+ #### Example: Converting a document back into raw CommonMark
96
116
 
97
- You can also derive a class from CommonMarker's `HtmlRenderer` class. This produces slower output, but is far more customizable. For example:
117
+ You can use `to_commonmark` on a node to render it as raw text:
98
118
 
99
- ``` ruby
100
- class MyHtmlRenderer < CommonMarker::HtmlRenderer
101
- def initialize
102
- super
103
- @headerid = 1
104
- end
119
+ ```ruby
120
+ require 'commonmarker'
121
+
122
+ # parse some string
123
+ doc = Commonmarker.parse("# The site\n\n [GitHub](https://www.github.com)")
105
124
 
106
- def header(node)
107
- block do
108
- out("<h", node.header_level, " id=\"", @headerid, "\">",
109
- :children, "</h", node.header_level, ">")
110
- @headerid += 1
111
- end
125
+ # Transform links to regular text
126
+ doc.walk do |node|
127
+ if node.type == :link
128
+ node.insert_before(node.first_child)
129
+ node.delete
112
130
  end
113
131
  end
114
132
 
115
- myrenderer = MyHtmlRenderer.new
116
- puts myrenderer.render(doc)
117
-
118
- # Print any warnings to STDERR
119
- renderer.warnings.each do |w|
120
- STDERR.write("#{w}\n")
121
- end
133
+ doc.to_commonmark
134
+ # => # The site\n\nGitHub\n
122
135
  ```
123
136
 
124
- ## Options
137
+ ## Options and plugins
125
138
 
126
- CommonMarker accepts the same options that CMark does, as symbols. Note that there is a distinction in CMark for "parse" options and "render" options, which are represented in the tables below.
139
+ ### Options
127
140
 
128
- ### Parse options
141
+ Commonmarker accepts the same parse, render, and extensions options that comrak does, as a hash dictionary with symbol keys:
129
142
 
130
- | Name | Description
131
- | ----------------------------- | -----------
132
- | `:DEFAULT` | The default parsing system.
133
- | `:SOURCEPOS` | Include source position in nodes
134
- | `:UNSAFE` | Allow raw/custom HTML and unsafe links.
135
- | `:VALIDATE_UTF8` | Replace illegal sequences with the replacement character `U+FFFD`.
136
- | `:SMART` | Use smart punctuation (curly quotes, etc.).
137
- | `:LIBERAL_HTML_TAG` | Support liberal parsing of inline HTML tags.
138
- | `:FOOTNOTES` | Parse footnotes.
139
- | `:STRIKETHROUGH_DOUBLE_TILDE` | Parse strikethroughs by double tildes (compatibility with [redcarpet](https://github.com/vmg/redcarpet))
143
+ ```ruby
144
+ Commonmarker.to_html('"Hi *there*"', options:{
145
+ parse: { smart: true },
146
+ render: { hardbreaks: false}
147
+ })
148
+ ```
140
149
 
141
- ### Render options
150
+ Note that there is a distinction in comrak for "parse" options and "render" options, which are represented in the tables below.
142
151
 
143
- | Name | Description |
144
- | ------------------ | ----------- |
145
- | `:DEFAULT` | The default rendering system. |
146
- | `:SOURCEPOS` | Include source position in rendered HTML. |
147
- | `:HARDBREAKS` | Treat `\n` as hardbreaks (by adding `<br/>`). |
148
- | `:UNSAFE` | Allow raw/custom HTML and unsafe links. |
149
- | `:NOBREAKS` | Translate `\n` in the source to a single whitespace. |
150
- | `:VALIDATE_UTF8` | Replace illegal sequences with the replacement character `U+FFFD`. |
151
- | `:SMART` | Use smart punctuation (curly quotes, etc.). |
152
- | `:GITHUB_PRE_LANG` | Use GitHub-style `<pre lang>` for fenced code blocks. |
153
- | `:LIBERAL_HTML_TAG` | Support liberal parsing of inline HTML tags. |
154
- | `:FOOTNOTES` | Render footnotes. |
155
- | `:STRIKETHROUGH_DOUBLE_TILDE` | Parse strikethroughs by double tildes (compatibility with [redcarpet](https://github.com/vmg/redcarpet)) |
156
- | `:TABLE_PREFER_STYLE_ATTRIBUTES` | Use `style` insted of `align` for table cells. |
157
- | `:FULL_INFO_STRING` | Include full info strings of code blocks in separate attribute. |
158
-
159
- ### Passing options
160
-
161
- To apply a single option, pass it in as a symbol argument:
162
-
163
- ``` ruby
164
- CommonMarker.render_doc("\"Hello,\" said the spider.", :SMART)
165
- # <p>“Hello,” said the spider.</p>\n
166
- ```
152
+ ### Parse options
167
153
 
168
- To have multiple options applied, pass in an array of symbols:
154
+ | Name | Description | Default |
155
+ | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------- |
156
+ | `smart` | Punctuation (quotes, full-stops and hyphens) are converted into 'smart' punctuation. | `false` |
157
+ | `default_info_string` | The default info string for fenced code blocks. | `""` |
158
+ | `relaxed_autolinks` | Enable relaxing of the autolink extension parsing, allowing links to be recognized when in brackets, as well as permitting any url scheme. | `false` |
169
159
 
170
- ``` ruby
171
- CommonMarker.render_html("\"'Shelob' is my name.\"", [:HARDBREAKS, :SOURCEPOS])
172
- ```
160
+ ### Render options
173
161
 
174
- For more information on these options, see [the CMark documentation](https://git.io/v7nh1).
162
+ | Name | Description | Default |
163
+ | -------------------- | ------------------------------------------------------------------------------------------------------ | ------- |
164
+ | `hardbreaks` | [Soft line breaks](http://spec.commonmark.org/0.27/#soft-line-breaks) translate into hard line breaks. | `true` |
165
+ | `github_pre_lang` | GitHub-style `<pre lang="xyz">` is used for fenced code blocks with info tags. | `true` |
166
+ | `width` | The wrap column when outputting CommonMark. | `80` |
167
+ | `unsafe` | Allow rendering of raw HTML and potentially dangerous links. | `false` |
168
+ | `escape` | Escape raw HTML instead of clobbering it. | `false` |
169
+ | `sourcepos` | Include source position attribute in HTML and XML output. | `false` |
170
+ | `escaped_char_spans` | Wrap escaped characters in span tags | `true` |
175
171
 
176
- ## Extensions
172
+ As well, there are several extensions which you can toggle in the same manner:
177
173
 
178
- Both `render_html` and `render_doc` take an optional third argument defining the extensions you want enabled as your CommonMark document is being processed. The documentation for these extensions are [defined in this spec](https://github.github.com/gfm/), and the rationale is provided [in this blog post](https://githubengineering.com/a-formal-spec-for-github-markdown/).
174
+ ```ruby
175
+ Commonmarker.to_html('"Hi *there*"', options: {
176
+ extension: { footnotes: true, description_lists: true },
177
+ render: { hardbreaks: false}
178
+ })
179
+ ```
179
180
 
180
- The available extensions are:
181
+ ### Extension options
182
+
183
+ | Name | Description | Default |
184
+ | --------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------- |
185
+ | `strikethrough` | Enables the [strikethrough extension](https://github.github.com/gfm/#strikethrough-extension-) from the GFM spec. | `true` |
186
+ | `tagfilter` | Enables the [tagfilter extension](https://github.github.com/gfm/#disallowed-raw-html-extension-) from the GFM spec. | `true` |
187
+ | `table` | Enables the [table extension](https://github.github.com/gfm/#tables-extension-) from the GFM spec. | `true` |
188
+ | `autolink` | Enables the [autolink extension](https://github.github.com/gfm/#autolinks-extension-) from the GFM spec. | `true` |
189
+ | `tasklist` | Enables the [task list extension](https://github.github.com/gfm/#task-list-items-extension-) from the GFM spec. | `true` |
190
+ | `superscript` | Enables the superscript Comrak extension. | `false` |
191
+ | `header_ids` | Enables the header IDs Comrak extension. from the GFM spec. | `""` |
192
+ | `footnotes` | Enables the footnotes extension per `cmark-gfm`. | `false` |
193
+ | `description_lists` | Enables the description lists extension. | `false` |
194
+ | `front_matter_delimiter` | Enables the front matter extension. | `""` |
195
+ | `shortcodes` | Enables the shortcodes extension. | `true` |
196
+ | `multiline_block_quotes` | Enables the multiline block quotes extension. | `false` |
197
+ | `math_dollars`, `math_code` | Enables the math extension. | `false` |
198
+
199
+ For more information on these options, see [the comrak documentation](https://github.com/kivikakk/comrak#usage).
200
+
201
+ ### Plugins
202
+
203
+ In addition to the possibilities provided by generic CommonMark rendering, Commonmarker also supports plugins as a means of
204
+ providing further niceties.
205
+
206
+ #### Syntax Highlighter Plugin
207
+
208
+ The library comes with [a set of pre-existing themes](https://docs.rs/syntect/5.0.0/syntect/highlighting/struct.ThemeSet.html#implementations) for highlighting code:
209
+
210
+ - `"base16-ocean.dark"`
211
+ - `"base16-eighties.dark"`
212
+ - `"base16-mocha.dark"`
213
+ - `"base16-ocean.light"`
214
+ - `"InspiredGitHub"`
215
+ - `"Solarized (dark)"`
216
+ - `"Solarized (light)"`
217
+
218
+ ````ruby
219
+ code = <<~CODE
220
+ ```ruby
221
+ def hello
222
+ puts "hello"
223
+ end
224
+ ```
225
+ CODE
181
226
 
182
- * `:table` - This provides support for tables.
183
- * `:tasklist` - This provides support for task list items.
184
- * `:strikethrough` - This provides support for strikethroughs.
185
- * `:autolink` - This provides support for automatically converting URLs to anchor tags.
186
- * `:tagfilter` - This escapes [several "unsafe" HTML tags](https://github.github.com/gfm/#disallowed-raw-html-extension-), causing them to not have any effect.
227
+ # pass in a theme name from a pre-existing set
228
+ puts Commonmarker.to_html(code, plugins: { syntax_highlighter: { theme: "InspiredGitHub" } })
187
229
 
188
- ## Output formats
230
+ # <pre style="background-color:#ffffff;" lang="ruby"><code>
231
+ # <span style="font-weight:bold;color:#a71d5d;">def </span><span style="font-weight:bold;color:#795da3;">hello
232
+ # </span><span style="color:#62a35c;">puts </span><span style="color:#183691;">&quot;hello&quot;
233
+ # </span><span style="font-weight:bold;color:#a71d5d;">end
234
+ # </span>
235
+ # </code></pre>
236
+ ````
189
237
 
190
- Like CMark, CommonMarker can generate output in several formats: HTML, XML, plaintext, and commonmark are currently supported.
238
+ By default, the plugin uses the `"base16-ocean.dark"` theme to syntax highlight code.
191
239
 
192
- ### HTML
240
+ To disable this plugin, set the value to `nil`:
193
241
 
194
- The default output format, HTML, will be generated when calling `to_html` or using `--to=html` on the command line.
242
+ ````ruby
243
+ code = <<~CODE
244
+ ```ruby
245
+ def hello
246
+ puts "hello"
247
+ end
248
+ ```
249
+ CODE
195
250
 
196
- ```ruby
197
- doc = CommonMarker.render_doc('*Hello* world!', :DEFAULT)
198
- puts(doc.to_html)
251
+ Commonmarker.to_html(code, plugins: { syntax_highlighter: nil })
199
252
 
200
- <p><em>Hello</em> world!</p>
201
- ```
253
+ # <pre lang="ruby"><code>def hello
254
+ # puts &quot;hello&quot;
255
+ # end
256
+ # </code></pre>
257
+ ````
202
258
 
203
- ### XML
259
+ To output CSS classes instead of `style` attributes, set the `theme` key to `""`:
204
260
 
205
- XML will be generated when calling `to_xml` or using `--to=xml` on the command line.
261
+ ````ruby
262
+ code = <<~CODE
263
+ ```ruby
264
+ def hello
265
+ puts "hello"
266
+ end
267
+ CODE
206
268
 
207
- ```ruby
208
- doc = CommonMarker.render_doc('*Hello* world!', :DEFAULT)
209
- puts(doc.to_xml)
210
-
211
- <?xml version="1.0" encoding="UTF-8"?>
212
- <!DOCTYPE document SYSTEM "CommonMark.dtd">
213
- <document xmlns="http://commonmark.org/xml/1.0">
214
- <paragraph>
215
- <emph>
216
- <text xml:space="preserve">Hello</text>
217
- </emph>
218
- <text xml:space="preserve"> world!</text>
219
- </paragraph>
220
- </document>
221
- ```
269
+ Commonmarker.to_html(code, plugins: { syntax_highlighter: { theme: "" } })
222
270
 
223
- ### Plaintext
271
+ # <pre class="syntax-highlighting"><code><span class="source ruby"><span class="meta function ruby"><span class="keyword control def ruby">def</span></span><span class="meta function ruby"> # <span class="entity name function ruby">hello</span></span>
272
+ # <span class="support function builtin ruby">puts</span> <span class="string quoted double ruby"><span class="punctuation definition string begin ruby">&quot;</span>hello<span class="punctuation definition string end ruby">&quot;</span></span>
273
+ # <span class="keyword control ruby">end</span>\n</span></code></pre>
274
+ ````
224
275
 
225
- Plaintext will be generated when calling `to_plaintext` or using `--to=plaintext` on the command line.
276
+ To use a custom theme, you can provide a `path` to a directory containing `.tmtheme` files to load:
226
277
 
227
278
  ```ruby
228
- doc = CommonMarker.render_doc('*Hello* world!', :DEFAULT)
229
- puts(doc.to_plaintext)
230
-
231
- Hello world!
279
+ Commonmarker.to_html(code, plugins: { syntax_highlighter: { theme: "Monokai", path: "./themes" } })
232
280
  ```
233
281
 
234
- ### Commonmark
235
-
236
- Commonmark will be generated when calling `to_commonmark` or using `--to=commonmark` on the command line.
237
-
238
- ``` ruby
239
- text = <<-TEXT
240
- 1. I am a numeric list.
241
- 2. I continue the list.
242
- * Suddenly, an unordered list!
243
- * What fun!
244
- TEXT
282
+ ## Output formats
245
283
 
246
- doc = CommonMarker.render_doc(text, :DEFAULT)
247
- puts(doc.to_commonmark)
284
+ Commonmarker can currently only generate output in one format: HTML.
248
285
 
249
- 1. I am a numeric list.
250
- 2. I continue the list.
286
+ ### HTML
251
287
 
252
- <!-- end list -->
288
+ ```ruby
289
+ puts Commonmarker.to_html('*Hello* world!')
253
290
 
254
- - Suddenly, an unordered list\!
255
- - What fun\!
291
+ # <p><em>Hello</em> world!</p>
256
292
  ```
257
293
 
258
294
  ## Developing locally
@@ -264,25 +300,36 @@ script/bootstrap
264
300
  bundle exec rake compile
265
301
  ```
266
302
 
267
- If there were no errors, you're done! Otherwise, make sure to follow the CMark dependency instructions.
303
+ If there were no errors, you're done! Otherwise, make sure to follow the comrak dependency instructions.
268
304
 
269
305
  ## Benchmarks
270
306
 
271
- Some rough benchmarks:
272
-
273
307
  ```
274
- $ bundle exec rake benchmark
275
-
276
- input size = 11063727 bytes
277
-
278
- redcarpet
279
- 0.070000 0.020000 0.090000 ( 0.079641)
280
- github-markdown
281
- 0.070000 0.010000 0.080000 ( 0.083535)
282
- commonmarker with to_html
283
- 0.100000 0.010000 0.110000 ( 0.111947)
284
- commonmarker with ruby HtmlRenderer
285
- 1.830000 0.030000 1.860000 ( 1.866203)
286
- kramdown
287
- 4.610000 0.070000 4.680000 ( 4.678398)
308
+ bundle exec rake benchmark
309
+ input size = 11064832 bytes
310
+
311
+ ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]
312
+ Warming up --------------------------------------
313
+ Markly.render_html 1.000 i/100ms
314
+ Markly::Node#to_html 1.000 i/100ms
315
+ Commonmarker.to_html 1.000 i/100ms
316
+ Commonmarker::Node.to_html
317
+ 1.000 i/100ms
318
+ Kramdown::Document#to_html
319
+ 1.000 i/100ms
320
+ Calculating -------------------------------------
321
+ Markly.render_html 15.606 (±25.6%) i/s - 71.000 in 5.047132s
322
+ Markly::Node#to_html 15.692 (±25.5%) i/s - 72.000 in 5.095810s
323
+ Commonmarker.to_html 4.482 (± 0.0%) i/s - 23.000 in 5.137680s
324
+ Commonmarker::Node.to_html
325
+ 5.092 (±19.6%) i/s - 25.000 in 5.072220s
326
+ Kramdown::Document#to_html
327
+ 0.379 (± 0.0%) i/s - 2.000 in 5.277770s
328
+
329
+ Comparison:
330
+ Markly::Node#to_html: 15.7 i/s
331
+ Markly.render_html: 15.6 i/s - same-ish: difference falls within error
332
+ Commonmarker::Node.to_html: 5.1 i/s - 3.08x slower
333
+ Commonmarker.to_html: 4.5 i/s - 3.50x slower
334
+ Kramdown::Document#to_html: 0.4 i/s - 41.40x slower
288
335
  ```
@@ -0,0 +1,20 @@
1
+ [package]
2
+ name = "commonmarker"
3
+ version = "1.0.0"
4
+ edition = "2021"
5
+ rust-version = "1.75.0"
6
+ publish = false
7
+
8
+ [dependencies]
9
+ magnus = { version = "0.6", features = ["rb-sys"] }
10
+ rb-sys = { version = "*", default-features = false, features = [
11
+ "stable-api-compiled-fallback",
12
+ ] }
13
+ comrak = { version = "0.23", features = ["shortcodes"] }
14
+ syntect = { version = "5.2", features = ["plist-load"] }
15
+ typed-arena = "2.0"
16
+ rctree = "0.6"
17
+
18
+ [lib]
19
+ name = "commonmarker"
20
+ crate-type = ["cdylib"]
@@ -1,7 +1,4 @@
1
- # frozen_string_literal: true
1
+ require "mkmf"
2
+ require "rb_sys/mkmf"
2
3
 
3
- require 'mkmf'
4
-
5
- $CFLAGS << ' -std=c99'
6
-
7
- create_makefile('commonmarker/commonmarker')
4
+ create_rust_makefile("commonmarker/commonmarker")