commonmarker 0.23.4 → 0.23.6
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of commonmarker might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Rakefile +56 -55
- data/commonmarker.gemspec +26 -27
- data/ext/commonmarker/autolink.c +34 -3
- data/ext/commonmarker/cmark-gfm_version.h +2 -2
- data/ext/commonmarker/commonmarker.c +1 -0
- data/ext/commonmarker/inlines.c +29 -4
- data/ext/commonmarker/scanners.c +2438 -2450
- data/lib/commonmarker/config.rb +3 -3
- data/lib/commonmarker/node/inspect.rb +8 -18
- data/lib/commonmarker/node.rb +6 -6
- data/lib/commonmarker/renderer/html_renderer.rb +37 -37
- data/lib/commonmarker/renderer.rb +5 -5
- data/lib/commonmarker/version.rb +1 -1
- data/lib/commonmarker.rb +9 -9
- metadata +4 -57
- data/lib/commonmarker/errors.rb +0 -12
- data/test/benchmark.rb +0 -39
- data/test/fixtures/curly.md +0 -1
- data/test/fixtures/dingus.md +0 -10
- data/test/fixtures/strong.md +0 -1
- data/test/fixtures/table.md +0 -10
- data/test/test_attributes.rb +0 -24
- data/test/test_basics.rb +0 -35
- data/test/test_commands.rb +0 -72
- data/test/test_commonmark.rb +0 -36
- data/test/test_doc.rb +0 -130
- data/test/test_encoding.rb +0 -23
- data/test/test_extensions.rb +0 -116
- data/test/test_footnotes.rb +0 -60
- data/test/test_gc.rb +0 -47
- data/test/test_helper.rb +0 -71
- data/test/test_linebreaks.rb +0 -15
- data/test/test_maliciousness.rb +0 -262
- data/test/test_node.rb +0 -89
- data/test/test_options.rb +0 -37
- data/test/test_pathological_inputs.rb +0 -94
- data/test/test_plaintext.rb +0 -46
- data/test/test_renderer.rb +0 -47
- data/test/test_smartpunct.rb +0 -27
- data/test/test_spec.rb +0 -30
- data/test/test_tasklists.rb +0 -43
- data/test/test_xml.rb +0 -107
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf9a7803972a4a9111e93837c8e47265ba83f10b3abd5cff73ec7375d862ef28
|
4
|
+
data.tar.gz: a292683b676b06e8cb4a190e5bb60c5bc3e474c5d3b631701f7fab1f176d9a5f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0884ee35781e71e96cbe7b87c4d8e885b13882e8b67fc594fe53a615410a00ed4599d7a99eab9347ca8f272fd93be31b06bea890a7b0c41a1a1407a717e4f3d2'
|
7
|
+
data.tar.gz: ee9024ba7ee8b0143185ab41466b00b51349b55b70e12443ee11d68e640591ddab0e8073481e4cc19818fa56f82e1efbd29eaf0690203b4192b9602525169d06
|
data/Rakefile
CHANGED
@@ -1,108 +1,109 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
3
|
+
require "date"
|
4
|
+
require "rake/clean"
|
5
|
+
require "rake/extensiontask"
|
6
|
+
require "digest/md5"
|
7
7
|
|
8
|
-
host_os = RbConfig::CONFIG[
|
9
|
-
require
|
8
|
+
host_os = RbConfig::CONFIG["host_os"]
|
9
|
+
require "devkit" if host_os == "mingw32"
|
10
10
|
|
11
11
|
task default: [:test]
|
12
12
|
|
13
13
|
# Gem Spec
|
14
|
-
gem_spec = Gem::Specification.load(
|
14
|
+
gem_spec = Gem::Specification.load("commonmarker.gemspec")
|
15
15
|
|
16
16
|
# Ruby Extension
|
17
|
-
Rake::ExtensionTask.new(
|
18
|
-
ext.lib_dir = File.join(
|
17
|
+
Rake::ExtensionTask.new("commonmarker", gem_spec) do |ext|
|
18
|
+
ext.lib_dir = File.join("lib", "commonmarker")
|
19
19
|
end
|
20
20
|
|
21
21
|
# Packaging
|
22
|
-
require
|
22
|
+
require "bundler/gem_tasks"
|
23
23
|
|
24
24
|
# Testing
|
25
|
-
require
|
25
|
+
require "rake/testtask"
|
26
26
|
|
27
|
-
Rake::TestTask.new(
|
28
|
-
t.libs <<
|
29
|
-
t.libs <<
|
30
|
-
t.pattern =
|
27
|
+
Rake::TestTask.new("test:unit") do |t|
|
28
|
+
t.libs << "lib"
|
29
|
+
t.libs << "test"
|
30
|
+
t.pattern = "test/test_*.rb"
|
31
31
|
t.verbose = true
|
32
32
|
t.warning = false
|
33
33
|
end
|
34
34
|
|
35
|
-
|
35
|
+
desc "Run unit tests"
|
36
|
+
task "test:unit" => :compile
|
36
37
|
|
37
|
-
desc
|
38
|
-
task test:
|
38
|
+
desc "Run unit and conformance tests"
|
39
|
+
task test: ["test:unit"]
|
39
40
|
|
40
|
-
require
|
41
|
+
require "rubocop/rake_task"
|
41
42
|
|
42
43
|
RuboCop::RakeTask.new(:rubocop)
|
43
44
|
|
44
|
-
desc
|
45
|
+
desc "Run benchmarks"
|
45
46
|
task :benchmark do
|
46
|
-
if ENV[
|
47
|
-
|
48
|
-
|
49
|
-
langs =
|
47
|
+
if ENV["FETCH_PROGIT"]
|
48
|
+
%x(rm -rf test/progit)
|
49
|
+
%x(git clone https://github.com/progit/progit.git test/progit)
|
50
|
+
langs = ["ar", "az", "be", "ca", "cs", "de", "en", "eo", "es", "es-ni", "fa", "fi", "fr", "hi", "hu", "id", "it", "ja", "ko", "mk", "nl", "no-nb", "pl", "pt-br", "ro", "ru", "sr", "th", "tr", "uk", "vi", "zh", "zh-tw"]
|
50
51
|
langs.each do |lang|
|
51
|
-
|
52
|
+
%x(cat test/progit/#{lang}/*/*.markdown >> test/benchinput.md)
|
52
53
|
end
|
53
54
|
end
|
54
|
-
$LOAD_PATH.unshift
|
55
|
-
load
|
55
|
+
$LOAD_PATH.unshift("lib")
|
56
|
+
load "test/benchmark.rb"
|
56
57
|
end
|
57
58
|
|
58
|
-
desc
|
59
|
+
desc "Match C style of cmark"
|
59
60
|
task :format do
|
60
|
-
sh
|
61
|
+
sh "clang-format -style llvm -i ext/commonmarker/*.c ext/commonmarker/*.h"
|
61
62
|
end
|
62
63
|
|
63
64
|
# Documentation
|
64
|
-
require
|
65
|
+
require "rdoc/task"
|
65
66
|
|
66
|
-
desc
|
67
|
+
desc "Generate API documentation"
|
67
68
|
RDoc::Task.new do |rd|
|
68
|
-
rd.rdoc_dir =
|
69
|
-
rd.main =
|
70
|
-
rd.rdoc_files.include
|
71
|
-
|
72
|
-
rd.options <<
|
73
|
-
rd.options <<
|
74
|
-
rd.options <<
|
75
|
-
rd.options <<
|
76
|
-
rd.options <<
|
69
|
+
rd.rdoc_dir = "docs"
|
70
|
+
rd.main = "README.md"
|
71
|
+
rd.rdoc_files.include("README.md", "lib/**/*.rb", "ext/commonmarker/commonmarker.c")
|
72
|
+
|
73
|
+
rd.options << "--markup tomdoc"
|
74
|
+
rd.options << "--inline-source"
|
75
|
+
rd.options << "--line-numbers"
|
76
|
+
rd.options << "--all"
|
77
|
+
rd.options << "--fileboxes"
|
77
78
|
end
|
78
79
|
|
79
|
-
desc
|
80
|
+
desc "Generate the documentation and run a web server"
|
80
81
|
task serve: [:rdoc] do
|
81
|
-
require
|
82
|
+
require "webrick"
|
82
83
|
|
83
|
-
puts
|
84
|
+
puts "Navigate to http://localhost:3000 to see the docs"
|
84
85
|
|
85
|
-
server = WEBrick::HTTPServer.new
|
86
|
-
server.mount
|
87
|
-
trap(
|
86
|
+
server = WEBrick::HTTPServer.new(Port: 3000)
|
87
|
+
server.mount("/", WEBrick::HTTPServlet::FileHandler, "docs")
|
88
|
+
trap("INT") { server.stop }
|
88
89
|
server.start
|
89
90
|
end
|
90
91
|
|
91
|
-
desc
|
92
|
+
desc "Generate and publish docs to gh-pages"
|
92
93
|
task publish: [:rdoc] do
|
93
|
-
require
|
94
|
-
require
|
94
|
+
require "tmpdir"
|
95
|
+
require "shellwords"
|
95
96
|
|
96
97
|
Dir.mktmpdir do |tmp|
|
97
98
|
system "mv docs/* #{tmp}"
|
98
|
-
system
|
99
|
-
system
|
99
|
+
system "git checkout origin/gh-pages"
|
100
|
+
system "rm -rf *"
|
100
101
|
system "mv #{tmp}/* ."
|
101
102
|
message = Shellwords.escape("Site updated at #{Time.now.utc}")
|
102
|
-
system
|
103
|
+
system "git add ."
|
103
104
|
system "git commit -am #{message}"
|
104
|
-
system
|
105
|
-
system
|
106
|
-
system
|
105
|
+
system "git push origin gh-pages --force"
|
106
|
+
system "git checkout master"
|
107
|
+
system "echo yolo"
|
107
108
|
end
|
108
109
|
end
|
data/commonmarker.gemspec
CHANGED
@@ -1,39 +1,38 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
lib = File.expand_path(
|
3
|
+
lib = File.expand_path("lib", __dir__)
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require
|
5
|
+
require "commonmarker/version"
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
|
-
s.name =
|
8
|
+
s.name = "commonmarker"
|
9
9
|
s.version = CommonMarker::VERSION
|
10
|
-
s.summary =
|
11
|
-
s.description =
|
12
|
-
s.authors = [
|
13
|
-
s.homepage =
|
14
|
-
s.license =
|
10
|
+
s.summary = "CommonMark parser and renderer. Written in C, wrapped in Ruby."
|
11
|
+
s.description = "A fast, safe, extensible parser for CommonMark. This wraps the official libcmark library."
|
12
|
+
s.authors = ["Garen Torikian", "Ashe Connor"]
|
13
|
+
s.homepage = "https://github.com/gjtorikian/commonmarker"
|
14
|
+
s.license = "MIT"
|
15
15
|
|
16
|
-
s.files =
|
17
|
-
s.files += Dir.glob(
|
18
|
-
s.files += Dir.glob(
|
19
|
-
s.
|
20
|
-
s.extensions = ['ext/commonmarker/extconf.rb']
|
16
|
+
s.files = ["LICENSE.txt", "README.md", "Rakefile", "commonmarker.gemspec", "bin/commonmarker"]
|
17
|
+
s.files += Dir.glob("lib/**/*.rb")
|
18
|
+
s.files += Dir.glob("ext/commonmarker/*.*")
|
19
|
+
s.extensions = ["ext/commonmarker/extconf.rb"]
|
21
20
|
|
22
|
-
s.executables = [
|
23
|
-
s.require_paths =
|
24
|
-
s.required_ruby_version = [
|
21
|
+
s.executables = ["commonmarker"]
|
22
|
+
s.require_paths = ["lib", "ext"]
|
23
|
+
s.required_ruby_version = [">= 2.6", "< 4.0"]
|
25
24
|
|
26
|
-
s.metadata[
|
25
|
+
s.metadata["rubygems_mfa_required"] = "true"
|
27
26
|
|
28
|
-
s.rdoc_options += [
|
27
|
+
s.rdoc_options += ["-x", "ext/commonmarker/cmark/.*"]
|
29
28
|
|
30
|
-
s.add_development_dependency
|
31
|
-
s.add_development_dependency
|
32
|
-
s.add_development_dependency
|
33
|
-
s.add_development_dependency
|
34
|
-
s.add_development_dependency
|
35
|
-
s.add_development_dependency
|
36
|
-
s.add_development_dependency
|
37
|
-
s.add_development_dependency
|
38
|
-
s.add_development_dependency
|
29
|
+
s.add_development_dependency("awesome_print")
|
30
|
+
s.add_development_dependency("json", "~> 2.3")
|
31
|
+
s.add_development_dependency("minitest", "~> 5.6")
|
32
|
+
s.add_development_dependency("minitest-focus", "~> 1.1")
|
33
|
+
s.add_development_dependency("rake")
|
34
|
+
s.add_development_dependency("rake-compiler", "~> 0.9")
|
35
|
+
s.add_development_dependency("rdoc", "~> 6.2")
|
36
|
+
s.add_development_dependency("rubocop")
|
37
|
+
s.add_development_dependency("rubocop-standard")
|
39
38
|
end
|
data/ext/commonmarker/autolink.c
CHANGED
@@ -269,6 +269,22 @@ static cmark_node *match(cmark_syntax_extension *ext, cmark_parser *parser,
|
|
269
269
|
// inline was finished in inlines.c.
|
270
270
|
}
|
271
271
|
|
272
|
+
static bool validate_protocol(char protocol[], uint8_t *data, int rewind) {
|
273
|
+
size_t len = strlen(protocol);
|
274
|
+
|
275
|
+
// Check that the protocol matches
|
276
|
+
for (int i = 1; i <= len; i++) {
|
277
|
+
if (data[-rewind - i] != protocol[len - i]) {
|
278
|
+
return false;
|
279
|
+
}
|
280
|
+
}
|
281
|
+
|
282
|
+
char prev_char = data[-rewind - len - 1];
|
283
|
+
|
284
|
+
// Make sure the character before the protocol is non-alphanumeric
|
285
|
+
return !cmark_isalnum(prev_char);
|
286
|
+
}
|
287
|
+
|
272
288
|
static void postprocess_text(cmark_parser *parser, cmark_node *text, int offset, int depth) {
|
273
289
|
// postprocess_text can recurse very deeply if there is a very long line of
|
274
290
|
// '@' only. Stop at a reasonable depth to ensure it cannot crash.
|
@@ -278,6 +294,8 @@ static void postprocess_text(cmark_parser *parser, cmark_node *text, int offset,
|
|
278
294
|
uint8_t *data = text->as.literal.data,
|
279
295
|
*at;
|
280
296
|
size_t size = text->as.literal.len;
|
297
|
+
bool auto_mailto = true;
|
298
|
+
bool is_xmpp = false;
|
281
299
|
int rewind, max_rewind,
|
282
300
|
nb = 0, np = 0, ns = 0;
|
283
301
|
|
@@ -304,8 +322,18 @@ static void postprocess_text(cmark_parser *parser, cmark_node *text, int offset,
|
|
304
322
|
if (strchr(".+-_", c) != NULL)
|
305
323
|
continue;
|
306
324
|
|
307
|
-
if (c
|
308
|
-
|
325
|
+
if (strchr(":", c) != NULL) {
|
326
|
+
if (validate_protocol("mailto:", data, rewind)) {
|
327
|
+
auto_mailto = false;
|
328
|
+
continue;
|
329
|
+
}
|
330
|
+
|
331
|
+
if (validate_protocol("xmpp:", data, rewind)) {
|
332
|
+
auto_mailto = false;
|
333
|
+
is_xmpp = true;
|
334
|
+
continue;
|
335
|
+
}
|
336
|
+
}
|
309
337
|
|
310
338
|
break;
|
311
339
|
}
|
@@ -325,6 +353,8 @@ static void postprocess_text(cmark_parser *parser, cmark_node *text, int offset,
|
|
325
353
|
nb++;
|
326
354
|
else if (c == '.' && link_end < size - 1 && cmark_isalnum(data[link_end + 1]))
|
327
355
|
np++;
|
356
|
+
else if (c == '/' && is_xmpp)
|
357
|
+
continue;
|
328
358
|
else if (c != '-' && c != '_')
|
329
359
|
break;
|
330
360
|
}
|
@@ -347,7 +377,8 @@ static void postprocess_text(cmark_parser *parser, cmark_node *text, int offset,
|
|
347
377
|
cmark_node *link_node = cmark_node_new_with_mem(CMARK_NODE_LINK, parser->mem);
|
348
378
|
cmark_strbuf buf;
|
349
379
|
cmark_strbuf_init(parser->mem, &buf, 10);
|
350
|
-
|
380
|
+
if (auto_mailto)
|
381
|
+
cmark_strbuf_puts(&buf, "mailto:");
|
351
382
|
cmark_strbuf_put(&buf, data - rewind, (bufsize_t)(link_end + rewind));
|
352
383
|
link_node->as.link.url = cmark_chunk_buf_detach(&buf);
|
353
384
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#ifndef CMARK_GFM_VERSION_H
|
2
2
|
#define CMARK_GFM_VERSION_H
|
3
3
|
|
4
|
-
#define CMARK_GFM_VERSION ((0 << 24) | (29 << 16) | (0 << 8) |
|
5
|
-
#define CMARK_GFM_VERSION_STRING "0.29.0.gfm.
|
4
|
+
#define CMARK_GFM_VERSION ((0 << 24) | (29 << 16) | (0 << 8) | 6)
|
5
|
+
#define CMARK_GFM_VERSION_STRING "0.29.0.gfm.6"
|
6
6
|
|
7
7
|
#endif
|
@@ -1255,6 +1255,7 @@ __attribute__((visibility("default"))) void Init_commonmarker() {
|
|
1255
1255
|
rb_define_singleton_method(module, "extensions", rb_extensions, 0);
|
1256
1256
|
rb_eNodeError = rb_define_class_under(module, "NodeError", rb_eStandardError);
|
1257
1257
|
rb_cNode = rb_define_class_under(module, "Node", rb_cObject);
|
1258
|
+
rb_undef_alloc_func(rb_cNode);
|
1258
1259
|
rb_define_singleton_method(rb_cNode, "markdown_to_html", rb_markdown_to_html,
|
1259
1260
|
3);
|
1260
1261
|
rb_define_singleton_method(rb_cNode, "markdown_to_xml", rb_markdown_to_xml,
|
data/ext/commonmarker/inlines.c
CHANGED
@@ -41,6 +41,8 @@ typedef struct bracket {
|
|
41
41
|
bool image;
|
42
42
|
bool active;
|
43
43
|
bool bracket_after;
|
44
|
+
bool in_bracket_image0;
|
45
|
+
bool in_bracket_image1;
|
44
46
|
} bracket;
|
45
47
|
|
46
48
|
typedef struct subject{
|
@@ -516,6 +518,8 @@ static void push_bracket(subject *subj, bool image, cmark_node *inl_text) {
|
|
516
518
|
bracket *b = (bracket *)subj->mem->calloc(1, sizeof(bracket));
|
517
519
|
if (subj->last_bracket != NULL) {
|
518
520
|
subj->last_bracket->bracket_after = true;
|
521
|
+
b->in_bracket_image0 = subj->last_bracket->in_bracket_image0;
|
522
|
+
b->in_bracket_image1 = subj->last_bracket->in_bracket_image1;
|
519
523
|
}
|
520
524
|
b->image = image;
|
521
525
|
b->active = true;
|
@@ -524,6 +528,11 @@ static void push_bracket(subject *subj, bool image, cmark_node *inl_text) {
|
|
524
528
|
b->previous_delimiter = subj->last_delim;
|
525
529
|
b->position = subj->pos;
|
526
530
|
b->bracket_after = false;
|
531
|
+
if (image) {
|
532
|
+
b->in_bracket_image1 = true;
|
533
|
+
} else {
|
534
|
+
b->in_bracket_image0 = true;
|
535
|
+
}
|
527
536
|
subj->last_bracket = b;
|
528
537
|
}
|
529
538
|
|
@@ -1254,6 +1263,17 @@ match:
|
|
1254
1263
|
}
|
1255
1264
|
opener = opener->previous;
|
1256
1265
|
}
|
1266
|
+
bool in_bracket_image1 = false;
|
1267
|
+
if (opener) {
|
1268
|
+
in_bracket_image1 = opener->in_bracket_image1;
|
1269
|
+
}
|
1270
|
+
bracket *opener2 = subj->last_bracket;
|
1271
|
+
while (opener2 != opener) {
|
1272
|
+
if (opener2->image) {
|
1273
|
+
opener2->in_bracket_image1 = in_bracket_image1;
|
1274
|
+
}
|
1275
|
+
opener2 = opener2->previous;
|
1276
|
+
}
|
1257
1277
|
}
|
1258
1278
|
|
1259
1279
|
return NULL;
|
@@ -1662,10 +1682,15 @@ cmark_chunk *cmark_inline_parser_get_chunk(cmark_inline_parser *parser) {
|
|
1662
1682
|
}
|
1663
1683
|
|
1664
1684
|
int cmark_inline_parser_in_bracket(cmark_inline_parser *parser, int image) {
|
1665
|
-
|
1666
|
-
|
1667
|
-
|
1668
|
-
|
1685
|
+
bracket *b = parser->last_bracket;
|
1686
|
+
if (!b) {
|
1687
|
+
return 0;
|
1688
|
+
}
|
1689
|
+
if (image != 0) {
|
1690
|
+
return b->in_bracket_image1;
|
1691
|
+
} else {
|
1692
|
+
return b->in_bracket_image0;
|
1693
|
+
}
|
1669
1694
|
}
|
1670
1695
|
|
1671
1696
|
void cmark_node_unput(cmark_node *node, int n) {
|