commonmarker 0.23.6 → 1.0.0.pre
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 +4 -4
- data/README.md +70 -212
- data/commonmarker.gemspec +34 -31
- data/ext/commonmarker/Cargo.toml +12 -0
- data/ext/commonmarker/_util.rb +102 -0
- data/ext/commonmarker/extconf.rb +4 -5
- data/ext/commonmarker/src/comrak_options.rs +107 -0
- data/ext/commonmarker/src/lib.rs +27 -0
- data/lib/commonmarker/config.rb +58 -37
- data/lib/commonmarker/extension.rb +14 -0
- data/lib/commonmarker/renderer.rb +1 -127
- data/lib/commonmarker/version.rb +2 -2
- data/lib/commonmarker.rb +19 -32
- metadata +33 -177
- data/Rakefile +0 -109
- data/bin/commonmarker +0 -118
- data/ext/commonmarker/arena.c +0 -103
- data/ext/commonmarker/autolink.c +0 -456
- data/ext/commonmarker/autolink.h +0 -8
- data/ext/commonmarker/blocks.c +0 -1596
- data/ext/commonmarker/buffer.c +0 -278
- data/ext/commonmarker/buffer.h +0 -116
- data/ext/commonmarker/case_fold_switch.inc +0 -4327
- data/ext/commonmarker/chunk.h +0 -135
- data/ext/commonmarker/cmark-gfm-core-extensions.h +0 -54
- data/ext/commonmarker/cmark-gfm-extension_api.h +0 -736
- data/ext/commonmarker/cmark-gfm-extensions_export.h +0 -42
- data/ext/commonmarker/cmark-gfm.h +0 -817
- data/ext/commonmarker/cmark-gfm_export.h +0 -42
- data/ext/commonmarker/cmark-gfm_version.h +0 -7
- data/ext/commonmarker/cmark.c +0 -55
- data/ext/commonmarker/cmark_ctype.c +0 -44
- data/ext/commonmarker/cmark_ctype.h +0 -33
- data/ext/commonmarker/commonmark.c +0 -529
- data/ext/commonmarker/commonmarker.c +0 -1307
- data/ext/commonmarker/commonmarker.h +0 -16
- data/ext/commonmarker/config.h +0 -76
- data/ext/commonmarker/core-extensions.c +0 -27
- data/ext/commonmarker/entities.inc +0 -2138
- data/ext/commonmarker/ext_scanners.c +0 -879
- data/ext/commonmarker/ext_scanners.h +0 -24
- data/ext/commonmarker/footnotes.c +0 -63
- data/ext/commonmarker/footnotes.h +0 -27
- data/ext/commonmarker/houdini.h +0 -57
- data/ext/commonmarker/houdini_href_e.c +0 -100
- data/ext/commonmarker/houdini_html_e.c +0 -66
- data/ext/commonmarker/houdini_html_u.c +0 -149
- data/ext/commonmarker/html.c +0 -486
- data/ext/commonmarker/html.h +0 -27
- data/ext/commonmarker/inlines.c +0 -1716
- data/ext/commonmarker/inlines.h +0 -29
- data/ext/commonmarker/iterator.c +0 -159
- data/ext/commonmarker/iterator.h +0 -26
- data/ext/commonmarker/latex.c +0 -466
- data/ext/commonmarker/linked_list.c +0 -37
- data/ext/commonmarker/man.c +0 -278
- data/ext/commonmarker/map.c +0 -122
- data/ext/commonmarker/map.h +0 -41
- data/ext/commonmarker/node.c +0 -979
- data/ext/commonmarker/node.h +0 -125
- data/ext/commonmarker/parser.h +0 -58
- data/ext/commonmarker/plaintext.c +0 -235
- data/ext/commonmarker/plugin.c +0 -36
- data/ext/commonmarker/plugin.h +0 -34
- data/ext/commonmarker/references.c +0 -42
- data/ext/commonmarker/references.h +0 -26
- data/ext/commonmarker/registry.c +0 -63
- data/ext/commonmarker/registry.h +0 -24
- data/ext/commonmarker/render.c +0 -205
- data/ext/commonmarker/render.h +0 -62
- data/ext/commonmarker/scanners.c +0 -10508
- data/ext/commonmarker/scanners.h +0 -62
- data/ext/commonmarker/scanners.re +0 -341
- data/ext/commonmarker/strikethrough.c +0 -167
- data/ext/commonmarker/strikethrough.h +0 -9
- data/ext/commonmarker/syntax_extension.c +0 -149
- data/ext/commonmarker/syntax_extension.h +0 -34
- data/ext/commonmarker/table.c +0 -848
- data/ext/commonmarker/table.h +0 -12
- data/ext/commonmarker/tagfilter.c +0 -60
- data/ext/commonmarker/tagfilter.h +0 -8
- data/ext/commonmarker/tasklist.c +0 -156
- data/ext/commonmarker/tasklist.h +0 -8
- data/ext/commonmarker/utf8.c +0 -317
- data/ext/commonmarker/utf8.h +0 -35
- data/ext/commonmarker/xml.c +0 -181
- data/lib/commonmarker/node/inspect.rb +0 -47
- data/lib/commonmarker/node.rb +0 -83
- data/lib/commonmarker/renderer/html_renderer.rb +0 -252
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 85a99af1031da784a9618bc20f6cca8fae6a0e30418bab8b28321d284e2f0186
|
4
|
+
data.tar.gz: 0cc0fd0f0efe60f8c09ab8dd4fd8b242797e290842690f83291306765e08929a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8156096352b9519ce2e8dd1e2154152e2c3963ba6c3b4268cdbfea5314da6500eaf974613a1e1d5b9463ab256ca44fe17d165ce3a987288791ac0dffebc6287
|
7
|
+
data.tar.gz: 8ded44525de5d687f2488a60d6e7ba7fd2226ba973de9c6de5d9032b3b51bf49f249b0e0adf9685b2cea621326d2d41cf119426dd6fbded03dda3811ea7c5c03
|
data/README.md
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
-
#
|
1
|
+
# Commonmarker
|
2
2
|
|
3
|
-
|
3
|
+
> **Note**
|
4
|
+
> This README refers to the behavior in the new 1.0.0.pre gem.
|
4
5
|
|
5
|
-
Ruby wrapper for [
|
6
|
-
|
6
|
+
Ruby wrapper for Rust's [comrak](https://github.com/kivikakk/comrak) crate.
|
7
|
+
|
8
|
+
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
9
|
|
8
10
|
For more information on available extensions, see [the documentation below](#extensions).
|
9
11
|
|
@@ -27,232 +29,83 @@ Or install it yourself as:
|
|
27
29
|
|
28
30
|
Call `render_html` on a string to convert it to HTML:
|
29
31
|
|
30
|
-
```
|
31
|
-
require 'commonmarker'
|
32
|
-
CommonMarker.render_html('Hi *there*', :DEFAULT)
|
33
|
-
# <p>Hi <em>there</em></p>\n
|
34
|
-
```
|
35
|
-
|
36
|
-
The second argument is optional--[see below](#options) for more information.
|
37
|
-
|
38
|
-
### Generating a document
|
39
|
-
|
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
|
-
|
42
|
-
``` ruby
|
32
|
+
```ruby
|
43
33
|
require 'commonmarker'
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
doc.walk do |node|
|
49
|
-
puts node.type # [:document, :paragraph, :text, :emph, :text]
|
50
|
-
end
|
34
|
+
Commonmarker.to_html('"Hi *there*"', options: {
|
35
|
+
parse: { smart: true }
|
36
|
+
})
|
37
|
+
# <p>“Hi <em>there</em>”</p>\n
|
51
38
|
```
|
52
39
|
|
53
40
|
The second argument is optional--[see below](#options) for more information.
|
54
41
|
|
55
|
-
|
42
|
+
## Parse and Render Options
|
56
43
|
|
57
|
-
|
44
|
+
Commonmarker accepts the same options that comrak does, as a hash dictionary with symbol keys:
|
58
45
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
# parse the files specified on the command line
|
66
|
-
doc = CommonMarker.render_doc("# The site\n\n [GitHub](https://www.github.com)")
|
67
|
-
|
68
|
-
# Walk tree and print out URLs for links
|
69
|
-
doc.walk do |node|
|
70
|
-
if node.type == :link
|
71
|
-
printf("URL = %s\n", node.url)
|
72
|
-
end
|
73
|
-
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
|
85
|
-
|
86
|
-
# Transform links to regular text
|
87
|
-
doc.walk do |node|
|
88
|
-
if node.type == :link
|
89
|
-
node.insert_before(node.first_child)
|
90
|
-
node.delete
|
91
|
-
end
|
92
|
-
end
|
93
|
-
```
|
94
|
-
|
95
|
-
### Creating a custom renderer
|
96
|
-
|
97
|
-
You can also derive a class from CommonMarker's `HtmlRenderer` class. This produces slower output, but is far more customizable. For example:
|
98
|
-
|
99
|
-
``` ruby
|
100
|
-
class MyHtmlRenderer < CommonMarker::HtmlRenderer
|
101
|
-
def initialize
|
102
|
-
super
|
103
|
-
@headerid = 1
|
104
|
-
end
|
105
|
-
|
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
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
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
|
46
|
+
```ruby
|
47
|
+
Commonmarker.to_html('"Hi *there*"', options:{
|
48
|
+
parse: { smart: true },
|
49
|
+
render: { hardbreaks: false}
|
50
|
+
})
|
122
51
|
```
|
123
52
|
|
124
|
-
|
125
|
-
|
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.
|
53
|
+
Note that there is a distinction in comrak for "parse" options and "render" options, which are represented in the tables below.
|
127
54
|
|
128
55
|
### Parse options
|
129
56
|
|
130
|
-
| Name
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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))
|
57
|
+
| Name | Description | Default |
|
58
|
+
| --------------------- | ------------------------------------------------------------------------------------ | ------- |
|
59
|
+
| `smart` | Punctuation (quotes, full-stops and hyphens) are converted into 'smart' punctuation. | `false` |
|
60
|
+
| `default_info_string` | The default info string for fenced code blocks. | `""` |
|
140
61
|
|
141
62
|
### Render options
|
142
63
|
|
143
|
-
| Name
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
```
|
64
|
+
| Name | Description | Default |
|
65
|
+
| ----------------- | ------------------------------------------------------------------------------------------------------ | ------- |
|
66
|
+
| `hardbreaks` | [Soft line breaks](http://spec.commonmark.org/0.27/#soft-line-breaks) translate into hard line breaks. | `true` |
|
67
|
+
| `github_pre_lang` | GitHub-style `<pre lang="xyz">` is used for fenced code blocks with info tags. | `true` |
|
68
|
+
| `width` | The wrap column when outputting CommonMark. | `80` |
|
69
|
+
| `unsafe_` | Allow rendering of raw HTML and potentially dangerous links. | `false` |
|
70
|
+
| `escape` | Escape raw HTML instead of clobbering it. | `false` |
|
167
71
|
|
168
|
-
|
72
|
+
As well, there are several extensions which you can toggle in the same manner:
|
169
73
|
|
170
|
-
```
|
171
|
-
|
74
|
+
```ruby
|
75
|
+
Commonmarker.to_html('"Hi *there*"', options: {
|
76
|
+
extensions: { footnotes: true, description_lists: true },
|
77
|
+
render: { hardbreaks: false}
|
78
|
+
})
|
172
79
|
```
|
173
80
|
|
174
|
-
|
175
|
-
|
176
|
-
## Extensions
|
177
|
-
|
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/).
|
81
|
+
### Extension options
|
179
82
|
|
180
|
-
|
83
|
+
| Name | Description | Default |
|
84
|
+
| ------------------------ | ------------------------------------------------------------------------------------------------------------------- | ------- |
|
85
|
+
| `strikethrough` | Enables the [strikethrough extension](https://github.github.com/gfm/#strikethrough-extension-) from the GFM spec. | `true` |
|
86
|
+
| `tagfilter` | Enables the [tagfilter extension](https://github.github.com/gfm/#disallowed-raw-html-extension-) from the GFM spec. | `true` |
|
87
|
+
| `table` | Enables the [table extension](https://github.github.com/gfm/#tables-extension-) from the GFM spec. | `true` |
|
88
|
+
| `autolink` | Enables the [autolink extension](https://github.github.com/gfm/#autolinks-extension-) from the GFM spec. | `true` |
|
89
|
+
| `tasklist` | Enables the [task list extension](https://github.github.com/gfm/#task-list-items-extension-) from the GFM spec. | `true` |
|
90
|
+
| `superscript` | Enables the superscript Comrak extension. | `false` |
|
91
|
+
| `header_ids` | Enables the header IDs Comrak extension. from the GFM spec. | `""` |
|
92
|
+
| `footnotes` | Enables the footnotes extension per `cmark-gfm`. | `false` |
|
93
|
+
| `description_lists` | Enables the description lists extension.. | `false` |
|
94
|
+
| `front_matter_delimiter` | Enables the front matter extension. | `""` |
|
181
95
|
|
182
|
-
|
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.
|
96
|
+
For more information on these options, see [the comrak documentation](https://github.com/kivikakk/comrak#usage).
|
187
97
|
|
188
98
|
## Output formats
|
189
99
|
|
190
|
-
|
100
|
+
Commonmarker can currently only generate output in one format: HTML.
|
191
101
|
|
192
102
|
### HTML
|
193
103
|
|
194
|
-
The default output format, HTML, will be generated when calling `to_html` or using `--to=html` on the command line.
|
195
|
-
|
196
|
-
```ruby
|
197
|
-
doc = CommonMarker.render_doc('*Hello* world!', :DEFAULT)
|
198
|
-
puts(doc.to_html)
|
199
|
-
|
200
|
-
<p><em>Hello</em> world!</p>
|
201
|
-
```
|
202
|
-
|
203
|
-
### XML
|
204
|
-
|
205
|
-
XML will be generated when calling `to_xml` or using `--to=xml` on the command line.
|
206
|
-
|
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
|
-
```
|
222
|
-
|
223
|
-
### Plaintext
|
224
|
-
|
225
|
-
Plaintext will be generated when calling `to_plaintext` or using `--to=plaintext` on the command line.
|
226
|
-
|
227
104
|
```ruby
|
228
|
-
|
229
|
-
puts(
|
105
|
+
html = CommonMarker.to_html('*Hello* world!', :DEFAULT)
|
106
|
+
puts(html)
|
230
107
|
|
231
|
-
Hello world
|
232
|
-
```
|
233
|
-
|
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
|
245
|
-
|
246
|
-
doc = CommonMarker.render_doc(text, :DEFAULT)
|
247
|
-
puts(doc.to_commonmark)
|
248
|
-
|
249
|
-
1. I am a numeric list.
|
250
|
-
2. I continue the list.
|
251
|
-
|
252
|
-
<!-- end list -->
|
253
|
-
|
254
|
-
- Suddenly, an unordered list\!
|
255
|
-
- What fun\!
|
108
|
+
# <p><em>Hello</em> world!</p>
|
256
109
|
```
|
257
110
|
|
258
111
|
## Developing locally
|
@@ -264,7 +117,7 @@ script/bootstrap
|
|
264
117
|
bundle exec rake compile
|
265
118
|
```
|
266
119
|
|
267
|
-
If there were no errors, you're done! Otherwise, make sure to follow the
|
120
|
+
If there were no errors, you're done! Otherwise, make sure to follow the comrak dependency instructions.
|
268
121
|
|
269
122
|
## Benchmarks
|
270
123
|
|
@@ -273,16 +126,21 @@ Some rough benchmarks:
|
|
273
126
|
```
|
274
127
|
$ bundle exec rake benchmark
|
275
128
|
|
276
|
-
input size =
|
129
|
+
input size = 11064832 bytes
|
277
130
|
|
278
|
-
|
279
|
-
|
280
|
-
github-markdown
|
281
|
-
0.070000 0.010000 0.080000 ( 0.083535)
|
131
|
+
Warming up --------------------------------------
|
132
|
+
redcarpet 2.000 i/100ms
|
282
133
|
commonmarker with to_html
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
134
|
+
1.000 i/100ms
|
135
|
+
kramdown 1.000 i/100ms
|
136
|
+
Calculating -------------------------------------
|
137
|
+
redcarpet 22.317 (± 4.5%) i/s - 112.000 in 5.036374s
|
138
|
+
commonmarker with to_html
|
139
|
+
5.815 (± 0.0%) i/s - 30.000 in 5.168869s
|
140
|
+
kramdown 0.327 (± 0.0%) i/s - 2.000 in 6.121486s
|
141
|
+
|
142
|
+
Comparison:
|
143
|
+
redcarpet: 22.3 i/s
|
144
|
+
commonmarker with to_html: 5.8 i/s - 3.84x (± 0.00) slower
|
145
|
+
kramdown: 0.3 i/s - 68.30x (± 0.00) slower
|
288
146
|
```
|
data/commonmarker.gemspec
CHANGED
@@ -4,35 +4,38 @@ lib = File.expand_path("lib", __dir__)
|
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
5
|
require "commonmarker/version"
|
6
6
|
|
7
|
-
Gem::Specification.new do |
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = "commonmarker"
|
9
|
+
spec.version = Commonmarker::VERSION
|
10
|
+
spec.summary = "CommonMark parser and renderer. Written in Rust, wrapped in Ruby."
|
11
|
+
spec.description = "A fast, safe, extensible parser for CommonMark. This wraps the comrak Rust crate."
|
12
|
+
spec.authors = ["Garen Torikian", "Ashe Connor"]
|
13
|
+
spec.license = "MIT"
|
14
|
+
spec.homepage = "https://github.com/gjtorikian/commonmarker"
|
15
|
+
|
16
|
+
spec.required_ruby_version = "~> 3.1"
|
17
|
+
# https://github.com/rubygems/rubygems/pull/5852#issuecomment-1231118509
|
18
|
+
spec.required_rubygems_version = ">= 3.3.22"
|
19
|
+
|
20
|
+
spec.files = ["LICENSE.txt", "README.md", "commonmarker.gemspec"]
|
21
|
+
spec.files += Dir.glob("lib/**/*.rb")
|
22
|
+
spec.files += Dir.glob("ext/**/*.{rs,toml,lock,rb}")
|
23
|
+
spec.bindir = "exe"
|
24
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
25
|
+
|
26
|
+
spec.require_paths = ["lib"]
|
27
|
+
spec.extensions = ["ext/commonmarker/Cargo.toml"]
|
28
|
+
|
29
|
+
spec.metadata = {
|
30
|
+
"allowed_push_host" => "https://rubygems.org",
|
31
|
+
"funding_uri" => "https://github.com/sponsors/gjtorikian/",
|
32
|
+
"source_code_uri" => "https://github.com/gjtorikian/commonmarker",
|
33
|
+
"rubygems_mfa_required" => "true",
|
34
|
+
}
|
35
|
+
|
36
|
+
spec.add_dependency("rb_sys", "~> 0.9")
|
37
|
+
|
38
|
+
spec.add_development_dependency("rake", "~> 13.0")
|
39
|
+
spec.add_development_dependency("rake-compiler", "~> 1.2")
|
40
|
+
spec.add_development_dependency("rake-compiler-dock", "~> 1.2")
|
38
41
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
[package]
|
2
|
+
name = "commonmarker"
|
3
|
+
version = "1.0.0"
|
4
|
+
edition = "2021"
|
5
|
+
|
6
|
+
[dependencies]
|
7
|
+
magnus = { git = "https://github.com/gjtorikian/magnus", branch = "main" } # waiting for release with full rb-sys backend
|
8
|
+
comrak = "0.14.0"
|
9
|
+
|
10
|
+
[lib]
|
11
|
+
name = "commonmarker"
|
12
|
+
crate-type = ["cdylib"]
|
@@ -0,0 +1,102 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RUBY_MAJOR, RUBY_MINOR = RUBY_VERSION.split(".").collect(&:to_i)
|
4
|
+
|
5
|
+
PACKAGE_ROOT_DIR = File.expand_path(File.join(File.dirname(__FILE__), "..", ".."))
|
6
|
+
PACKAGE_EXT_DIR = File.join(PACKAGE_ROOT_DIR, "ext", "commonmarker")
|
7
|
+
|
8
|
+
OS = case os = RbConfig::CONFIG["host_os"].downcase
|
9
|
+
when /linux/
|
10
|
+
# The official ruby-alpine Docker containers pre-build Ruby. As a result,
|
11
|
+
# Ruby doesn't know that it's on a musl-based platform. `ldd` is the
|
12
|
+
# a more reliable way to detect musl.
|
13
|
+
# See https://github.com/skylightio/skylight-ruby/issues/92
|
14
|
+
if ENV["SKYLIGHT_MUSL"] || %x(ldd --version 2>&1).include?("musl")
|
15
|
+
"linux-musl"
|
16
|
+
else
|
17
|
+
"linux"
|
18
|
+
end
|
19
|
+
when /darwin/
|
20
|
+
"darwin"
|
21
|
+
when /freebsd/
|
22
|
+
"freebsd"
|
23
|
+
when /netbsd/
|
24
|
+
"netbsd"
|
25
|
+
when /openbsd/
|
26
|
+
"openbsd"
|
27
|
+
when /sunos|solaris/
|
28
|
+
"solaris"
|
29
|
+
when /mingw|mswin/
|
30
|
+
"windows"
|
31
|
+
else
|
32
|
+
os
|
33
|
+
end
|
34
|
+
|
35
|
+
# Normalize the platform CPU
|
36
|
+
ARCH = case cpu = RbConfig::CONFIG["host_cpu"].downcase
|
37
|
+
when /amd64|x86_64|x64/
|
38
|
+
"x86_64"
|
39
|
+
when /i?86|x86|i86pc/
|
40
|
+
"x86"
|
41
|
+
when /ppc|powerpc/
|
42
|
+
"powerpc"
|
43
|
+
when /^aarch/
|
44
|
+
"aarch"
|
45
|
+
when /^arm/
|
46
|
+
"arm"
|
47
|
+
else
|
48
|
+
cpu
|
49
|
+
end
|
50
|
+
|
51
|
+
def windows?
|
52
|
+
OS == "windows"
|
53
|
+
end
|
54
|
+
|
55
|
+
def solaris?
|
56
|
+
OS == solaries
|
57
|
+
end
|
58
|
+
|
59
|
+
def darwin?
|
60
|
+
OS == "darwin"
|
61
|
+
end
|
62
|
+
|
63
|
+
def macos?
|
64
|
+
darwin? || OS == "macos"
|
65
|
+
end
|
66
|
+
|
67
|
+
def openbsd?
|
68
|
+
OS == "openbsd"
|
69
|
+
end
|
70
|
+
|
71
|
+
def aix?
|
72
|
+
OS == "aix"
|
73
|
+
end
|
74
|
+
|
75
|
+
def nix?
|
76
|
+
!(windows? || solaris? || darwin?)
|
77
|
+
end
|
78
|
+
|
79
|
+
def x86_64?
|
80
|
+
ARCH == "x86_64"
|
81
|
+
end
|
82
|
+
|
83
|
+
def x86?
|
84
|
+
ARCH == "x86"
|
85
|
+
end
|
86
|
+
|
87
|
+
def abs_path(path)
|
88
|
+
File.join(PACKAGE_EXT_DIR, path)
|
89
|
+
end
|
90
|
+
|
91
|
+
def find_header_or_abort(header, *paths)
|
92
|
+
find_header(header, *paths) || abort("#{header} was expected in `#{paths.join(", ")}`, but it is missing.")
|
93
|
+
end
|
94
|
+
|
95
|
+
def find_library_or_abort(lib, func, *paths)
|
96
|
+
find_library(lib, func, *paths) || abort("#{lib} was expected in `#{paths.join(", ")}`, but it is missing.")
|
97
|
+
end
|
98
|
+
|
99
|
+
def concat_flags(*args)
|
100
|
+
args.compact.join(" ")
|
101
|
+
end
|
102
|
+
|
data/ext/commonmarker/extconf.rb
CHANGED
@@ -0,0 +1,107 @@
|
|
1
|
+
use comrak::ComrakOptions;
|
2
|
+
|
3
|
+
use magnus::{class, r_hash::ForEach, Error, RHash, Symbol, Value};
|
4
|
+
|
5
|
+
fn iterate_parse_options(comrak_options: &mut ComrakOptions, options_hash: RHash) {
|
6
|
+
options_hash.foreach(|key: Symbol, value: Value| {
|
7
|
+
if key.name().unwrap() == "smart" {
|
8
|
+
comrak_options.parse.smart = value.try_convert::<bool>()?;
|
9
|
+
}
|
10
|
+
if key.name().unwrap() == "default_info_string" {
|
11
|
+
comrak_options.parse.default_info_string = Some(value.try_convert::<String>().unwrap());
|
12
|
+
}
|
13
|
+
Ok(ForEach::Continue)
|
14
|
+
});
|
15
|
+
}
|
16
|
+
|
17
|
+
fn iterate_render_options(comrak_options: &mut ComrakOptions, options_hash: RHash) {
|
18
|
+
options_hash.foreach(|key: Symbol, value: Value| {
|
19
|
+
if key.name().unwrap() == "hardbreaks" {
|
20
|
+
comrak_options.render.hardbreaks = value.try_convert::<bool>()?;
|
21
|
+
}
|
22
|
+
|
23
|
+
if key.name().unwrap() == "github_pre_lang" {
|
24
|
+
comrak_options.render.github_pre_lang = value.try_convert::<bool>()?;
|
25
|
+
}
|
26
|
+
|
27
|
+
if key.name().unwrap() == "width" {
|
28
|
+
comrak_options.render.width = value.try_convert::<usize>()?;
|
29
|
+
}
|
30
|
+
|
31
|
+
if key.name().unwrap() == "unsafe_" {
|
32
|
+
comrak_options.render.unsafe_ = value.try_convert::<bool>()?;
|
33
|
+
}
|
34
|
+
|
35
|
+
if key.name().unwrap() == "escape" {
|
36
|
+
comrak_options.render.escape = value.try_convert::<bool>()?;
|
37
|
+
}
|
38
|
+
|
39
|
+
Ok(ForEach::Continue)
|
40
|
+
});
|
41
|
+
}
|
42
|
+
|
43
|
+
fn iterate_extension_options(comrak_options: &mut ComrakOptions, options_hash: RHash) {
|
44
|
+
options_hash.foreach(|key: Symbol, value: Value| {
|
45
|
+
if key.name().unwrap() == "strikethrough" {
|
46
|
+
comrak_options.extension.strikethrough = value.try_convert::<bool>()?;
|
47
|
+
}
|
48
|
+
|
49
|
+
if key.name().unwrap() == "tagfilter" {
|
50
|
+
comrak_options.extension.tagfilter = value.try_convert::<bool>()?;
|
51
|
+
}
|
52
|
+
|
53
|
+
if key.name().unwrap() == "table" {
|
54
|
+
comrak_options.extension.table = value.try_convert::<bool>()?;
|
55
|
+
}
|
56
|
+
|
57
|
+
if key.name().unwrap() == "autolink" {
|
58
|
+
comrak_options.extension.autolink = value.try_convert::<bool>()?;
|
59
|
+
}
|
60
|
+
|
61
|
+
if key.name().unwrap() == "tasklist" {
|
62
|
+
comrak_options.extension.tasklist = value.try_convert::<bool>()?;
|
63
|
+
}
|
64
|
+
|
65
|
+
if key.name().unwrap() == "superscript" {
|
66
|
+
comrak_options.extension.superscript = value.try_convert::<bool>()?;
|
67
|
+
}
|
68
|
+
|
69
|
+
if key.name().unwrap() == "header_ids" {
|
70
|
+
comrak_options.extension.header_ids = Some(value.try_convert::<String>().unwrap());
|
71
|
+
}
|
72
|
+
|
73
|
+
if key.name().unwrap() == "footnotes" {
|
74
|
+
comrak_options.extension.footnotes = value.try_convert::<bool>()?;
|
75
|
+
}
|
76
|
+
|
77
|
+
if key.name().unwrap() == "description_lists" {
|
78
|
+
comrak_options.extension.description_lists = value.try_convert::<bool>()?;
|
79
|
+
}
|
80
|
+
|
81
|
+
if key.name().unwrap() == "front_matter_delimiter" {
|
82
|
+
comrak_options.extension.front_matter_delimiter =
|
83
|
+
Some(value.try_convert::<String>().unwrap());
|
84
|
+
}
|
85
|
+
|
86
|
+
Ok(ForEach::Continue)
|
87
|
+
});
|
88
|
+
}
|
89
|
+
|
90
|
+
pub fn iterate_options_hash(
|
91
|
+
comrak_options: &mut ComrakOptions,
|
92
|
+
key: Symbol,
|
93
|
+
value: RHash,
|
94
|
+
) -> Result<ForEach, Error> {
|
95
|
+
assert!(value.is_kind_of(class::hash()));
|
96
|
+
|
97
|
+
if key.name().unwrap() == "parse" {
|
98
|
+
iterate_parse_options(comrak_options, value);
|
99
|
+
}
|
100
|
+
if key.name().unwrap() == "render" {
|
101
|
+
iterate_render_options(comrak_options, value);
|
102
|
+
}
|
103
|
+
if key.name().unwrap() == "extension" {
|
104
|
+
iterate_extension_options(comrak_options, value);
|
105
|
+
}
|
106
|
+
Ok(ForEach::Continue)
|
107
|
+
}
|