redcarpet 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of redcarpet might be problematic. Click here for more details.
- data/ext/markdown.c +78 -43
- data/ext/render.c +1 -1
- data/lib/redcarpet.rb +1 -1
- data/redcarpet.gemspec +2 -2
- data/test/redcarpet_test.rb +6 -0
- metadata +6 -6
data/ext/markdown.c
CHANGED
@@ -1062,35 +1062,44 @@ parse_blockcode(struct buf *ob, struct render *rndr,
|
|
1062
1062
|
/* parse_listitem • parsing of a single list item */
|
1063
1063
|
/* assuming initial prefix is already removed */
|
1064
1064
|
static size_t
|
1065
|
-
parse_listitem(struct buf *ob, struct render *rndr, char *data, size_t size, int *flags, int depth)
|
1065
|
+
parse_listitem(struct buf *ob, struct render *rndr, char *data, size_t size, int *flags, int depth)
|
1066
|
+
{
|
1066
1067
|
struct buf *work = 0, *inter = 0;
|
1067
1068
|
size_t beg = 0, end, pre, sublist = 0, orgpre = 0, i;
|
1068
1069
|
int in_empty = 0, has_inside_empty = 0;
|
1069
1070
|
|
1070
1071
|
/* keeping book of the first indentation prefix */
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1072
|
+
while (orgpre < 3 && orgpre < size && data[orgpre] == ' ')
|
1073
|
+
orgpre++;
|
1074
|
+
|
1074
1075
|
beg = prefix_uli(data, size);
|
1075
|
-
if (!beg)
|
1076
|
-
|
1076
|
+
if (!beg)
|
1077
|
+
beg = prefix_oli(data, size);
|
1078
|
+
|
1079
|
+
if (!beg)
|
1080
|
+
return 0;
|
1081
|
+
|
1077
1082
|
/* skipping to the beginning of the following line */
|
1078
1083
|
end = beg;
|
1079
|
-
while (end < size && data[end - 1] != '\n')
|
1084
|
+
while (end < size && data[end - 1] != '\n')
|
1085
|
+
end++;
|
1080
1086
|
|
1081
1087
|
/* getting working buffers */
|
1082
1088
|
if (rndr->work.size < rndr->work.asize) {
|
1083
1089
|
work = rndr->work.item[rndr->work.size ++];
|
1084
|
-
work->size = 0;
|
1085
|
-
else {
|
1090
|
+
work->size = 0;
|
1091
|
+
} else {
|
1086
1092
|
work = bufnew(WORK_UNIT);
|
1087
|
-
parr_push(&rndr->work, work);
|
1093
|
+
parr_push(&rndr->work, work);
|
1094
|
+
}
|
1095
|
+
|
1088
1096
|
if (rndr->work.size < rndr->work.asize) {
|
1089
1097
|
inter = rndr->work.item[rndr->work.size ++];
|
1090
|
-
inter->size = 0;
|
1091
|
-
else {
|
1098
|
+
inter->size = 0;
|
1099
|
+
} else {
|
1092
1100
|
inter = bufnew(WORK_UNIT);
|
1093
|
-
parr_push(&rndr->work, inter);
|
1101
|
+
parr_push(&rndr->work, inter);
|
1102
|
+
}
|
1094
1103
|
|
1095
1104
|
/* putting the first line into the working buffer */
|
1096
1105
|
bufput(work, data + beg, end - beg);
|
@@ -1098,45 +1107,55 @@ parse_listitem(struct buf *ob, struct render *rndr, char *data, size_t size, int
|
|
1098
1107
|
|
1099
1108
|
/* process the following lines */
|
1100
1109
|
while (beg < size) {
|
1101
|
-
end
|
1102
|
-
|
1110
|
+
end++;
|
1111
|
+
|
1112
|
+
while (end < size && data[end - 1] != '\n')
|
1113
|
+
end++;
|
1103
1114
|
|
1104
1115
|
/* process an empty line */
|
1105
1116
|
if (is_empty(data + beg, end - beg)) {
|
1106
1117
|
in_empty = 1;
|
1107
1118
|
beg = end;
|
1108
|
-
continue;
|
1119
|
+
continue;
|
1120
|
+
}
|
1109
1121
|
|
1110
1122
|
/* calculating the indentation */
|
1111
1123
|
i = 0;
|
1112
|
-
|
1113
|
-
|
1114
|
-
|
1115
|
-
if (end - beg > 3 && data[beg + 3] == ' ') { i = 4; } } } }
|
1124
|
+
while (i < 4 && beg + i < end && data[beg + i] == ' ')
|
1125
|
+
i++;
|
1126
|
+
|
1116
1127
|
pre = i;
|
1117
1128
|
if (data[beg] == '\t') { i = 1; pre = 8; }
|
1118
1129
|
|
1119
1130
|
/* checking for a new item */
|
1120
|
-
if ((prefix_uli(data + beg + i, end - beg - i)
|
1121
|
-
|
1122
|
-
|
1123
|
-
if (in_empty)
|
1131
|
+
if ((prefix_uli(data + beg + i, end - beg - i) &&
|
1132
|
+
!is_hrule(data + beg + i, end - beg - i)) ||
|
1133
|
+
prefix_oli(data + beg + i, end - beg - i)) {
|
1134
|
+
if (in_empty)
|
1135
|
+
has_inside_empty = 1;
|
1136
|
+
|
1124
1137
|
if (pre == orgpre) /* the following item must have */
|
1125
1138
|
break; /* the same indentation */
|
1126
|
-
if (!sublist) sublist = work->size; }
|
1127
1139
|
|
1140
|
+
if (!sublist)
|
1141
|
+
sublist = work->size;
|
1142
|
+
}
|
1128
1143
|
/* joining only indented stuff after empty lines */
|
1129
1144
|
else if (in_empty && i < 4 && data[beg] != '\t') {
|
1130
1145
|
*flags |= MKD_LI_END;
|
1131
|
-
break;
|
1146
|
+
break;
|
1147
|
+
}
|
1132
1148
|
else if (in_empty) {
|
1133
1149
|
bufputc(work, '\n');
|
1134
|
-
has_inside_empty = 1;
|
1150
|
+
has_inside_empty = 1;
|
1151
|
+
}
|
1152
|
+
|
1135
1153
|
in_empty = 0;
|
1136
1154
|
|
1137
1155
|
/* adding the line without prefix into the working buffer */
|
1138
1156
|
bufput(work, data + beg + i, end - beg - i);
|
1139
|
-
beg = end;
|
1157
|
+
beg = end;
|
1158
|
+
}
|
1140
1159
|
|
1141
1160
|
/* render of li contents */
|
1142
1161
|
if (has_inside_empty) *flags |= MKD_LI_BLOCK;
|
@@ -1161,6 +1180,7 @@ parse_listitem(struct buf *ob, struct render *rndr, char *data, size_t size, int
|
|
1161
1180
|
/* render of li itself */
|
1162
1181
|
if (rndr->make.listitem)
|
1163
1182
|
rndr->make.listitem(ob, inter, *flags, &rndr->make.render_options);
|
1183
|
+
|
1164
1184
|
rndr->work.size -= 2;
|
1165
1185
|
return beg;
|
1166
1186
|
}
|
@@ -1527,11 +1547,9 @@ static void expand_tabs(struct buf *ob, const char *line, size_t size)
|
|
1527
1547
|
if (i >= size)
|
1528
1548
|
break;
|
1529
1549
|
|
1530
|
-
|
1531
|
-
|
1532
|
-
while ((tab % 4) != 0) {
|
1550
|
+
do {
|
1533
1551
|
bufputc(ob, ' '); tab++;
|
1534
|
-
}
|
1552
|
+
} while (tab % 4);
|
1535
1553
|
|
1536
1554
|
i++;
|
1537
1555
|
}
|
@@ -1550,17 +1568,25 @@ markdown(struct buf *ob, struct buf *ib, const struct mkd_renderer *rndrer) {
|
|
1550
1568
|
rndr.make = *rndrer;
|
1551
1569
|
arr_init(&rndr.refs, sizeof (struct link_ref));
|
1552
1570
|
parr_init(&rndr.work);
|
1553
|
-
|
1554
|
-
|
1555
|
-
|
1556
|
-
|
1571
|
+
|
1572
|
+
for (i = 0; i < 256; i += 1)
|
1573
|
+
rndr.active_char[i] = 0;
|
1574
|
+
|
1575
|
+
if ((rndr.make.emphasis || rndr.make.double_emphasis || rndr.make.triple_emphasis) &&
|
1576
|
+
rndr.make.emph_chars) {
|
1557
1577
|
for (i = 0; rndr.make.emph_chars[i]; i += 1)
|
1558
|
-
rndr.active_char[(unsigned char)rndr.make.emph_chars[i]]
|
1559
|
-
|
1560
|
-
|
1561
|
-
if (rndr.make.
|
1578
|
+
rndr.active_char[(unsigned char)rndr.make.emph_chars[i]] = char_emphasis;
|
1579
|
+
}
|
1580
|
+
|
1581
|
+
if (rndr.make.codespan)
|
1582
|
+
rndr.active_char['`'] = char_codespan;
|
1583
|
+
|
1584
|
+
if (rndr.make.linebreak)
|
1585
|
+
rndr.active_char['\n'] = char_linebreak;
|
1586
|
+
|
1562
1587
|
if (rndr.make.image || rndr.make.link)
|
1563
1588
|
rndr.active_char['['] = char_link;
|
1589
|
+
|
1564
1590
|
rndr.active_char['<'] = char_langle_tag;
|
1565
1591
|
rndr.active_char['\\'] = char_escape;
|
1566
1592
|
rndr.active_char['&'] = char_entity;
|
@@ -1609,11 +1635,20 @@ markdown(struct buf *ob, struct buf *ib, const struct mkd_renderer *rndrer) {
|
|
1609
1635
|
for (i = 0; i < (size_t)rndr.refs.size; i += 1) {
|
1610
1636
|
bufrelease(lr[i].id);
|
1611
1637
|
bufrelease(lr[i].link);
|
1612
|
-
bufrelease(lr[i].title);
|
1638
|
+
bufrelease(lr[i].title);
|
1639
|
+
}
|
1640
|
+
|
1613
1641
|
arr_free(&rndr.refs);
|
1614
|
-
|
1642
|
+
|
1643
|
+
/* Do not assert this; a malformed Markdown
|
1644
|
+
* file will result in parts of the work queue not being
|
1645
|
+
* printed. We cannot crash the library in that case. Duh. */
|
1646
|
+
//assert(rndr.work.size == 0);
|
1647
|
+
|
1615
1648
|
for (i = 0; i < (size_t)rndr.work.asize; i += 1)
|
1616
1649
|
bufrelease(rndr.work.item[i]);
|
1617
|
-
|
1650
|
+
|
1651
|
+
parr_free(&rndr.work);
|
1652
|
+
}
|
1618
1653
|
|
1619
1654
|
/* vim: set filetype=c: */
|
data/ext/render.c
CHANGED
@@ -433,7 +433,7 @@ rndr_normal_text(struct buf *ob, struct buf *text, struct mkd_renderopt *options
|
|
433
433
|
/* Autolinking is not standarized in the Markdown spec.
|
434
434
|
* We only check for links after special characters, i.e.
|
435
435
|
* immediately after a space or a parenthesis */
|
436
|
-
if (i == 0 ||
|
436
|
+
if ((i == 0 || isspace(text->data[i - 1]) || text->data[i - 1] == '(') &&
|
437
437
|
is_safe_link(text->data + i, text->size - i)) {
|
438
438
|
size_t j = i + i;
|
439
439
|
|
data/lib/redcarpet.rb
CHANGED
data/redcarpet.gemspec
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'redcarpet'
|
3
|
-
s.version = '1.1.
|
3
|
+
s.version = '1.1.1'
|
4
4
|
s.summary = "Ruby bindings for libupskirt"
|
5
|
-
s.date = '2011-
|
5
|
+
s.date = '2011-04-02'
|
6
6
|
s.email = 'vicent@github.com'
|
7
7
|
s.homepage = 'http://github.com/tanoku/redcarpet'
|
8
8
|
s.has_rdoc = true
|
data/test/redcarpet_test.rb
CHANGED
@@ -103,4 +103,10 @@ class RedcarpetTest < Test::Unit::TestCase
|
|
103
103
|
Redcarpet.new(" [^a]: #{ "A" * 10000 }\n#{ "[^a][]" * 1000000 }\n").to_html.size
|
104
104
|
end
|
105
105
|
|
106
|
+
def test_link_syntax_is_not_processed_within_code_blocks
|
107
|
+
markdown = Markdown.new(" This is a code block\n This is a link [[1]] inside\n")
|
108
|
+
|
109
|
+
assert_equal "<pre><code>This is a code block\nThis is a link [[1]] inside\n</code></pre>\n",
|
110
|
+
markdown.to_html
|
111
|
+
end
|
106
112
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redcarpet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 17
|
5
|
+
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 1.1.
|
9
|
+
- 1
|
10
|
+
version: 1.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- "Natacha Port\xC3\xA9"
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-
|
19
|
+
date: 2011-04-02 00:00:00 +03:00
|
20
20
|
default_executable:
|
21
21
|
dependencies: []
|
22
22
|
|
@@ -79,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
79
79
|
requirements: []
|
80
80
|
|
81
81
|
rubyforge_project:
|
82
|
-
rubygems_version: 1.
|
82
|
+
rubygems_version: 1.3.7
|
83
83
|
signing_key:
|
84
84
|
specification_version: 3
|
85
85
|
summary: Ruby bindings for libupskirt
|