redcarpet 2.0.0b3 → 2.0.0b4
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.
Potentially problematic release.
This version of redcarpet might be problematic. Click here for more details.
- data/README.markdown +39 -5
- data/Rakefile +2 -2
- data/ext/redcarpet/autolink.c +12 -12
- data/ext/redcarpet/autolink.h +4 -4
- data/ext/redcarpet/buffer.c +123 -218
- data/ext/redcarpet/buffer.h +49 -112
- data/ext/redcarpet/html.c +83 -117
- data/ext/redcarpet/html.h +9 -10
- data/ext/redcarpet/html_blocks.h +205 -0
- data/ext/redcarpet/html_smartypants.c +63 -39
- data/ext/redcarpet/markdown.c +456 -377
- data/ext/redcarpet/markdown.h +43 -29
- data/ext/redcarpet/rc_markdown.c +60 -34
- data/ext/redcarpet/rc_render.c +29 -35
- data/ext/redcarpet/redcarpet.h +4 -3
- data/ext/redcarpet/stack.c +81 -0
- data/ext/redcarpet/stack.h +21 -0
- data/lib/redcarpet.rb +4 -23
- data/redcarpet.gemspec +6 -4
- data/test/redcarpet_test.rb +39 -43
- metadata +56 -33
- data/ext/redcarpet/array.c +0 -300
- data/ext/redcarpet/array.h +0 -147
data/ext/redcarpet/html.h
CHANGED
@@ -30,7 +30,7 @@ struct html_renderopt {
|
|
30
30
|
unsigned int flags;
|
31
31
|
|
32
32
|
/* extra callbacks */
|
33
|
-
void (*link_attributes)(struct buf *ob, struct buf *url, void *self);
|
33
|
+
void (*link_attributes)(struct buf *ob, const struct buf *url, void *self);
|
34
34
|
};
|
35
35
|
|
36
36
|
typedef enum {
|
@@ -38,12 +38,11 @@ typedef enum {
|
|
38
38
|
HTML_SKIP_STYLE = (1 << 1),
|
39
39
|
HTML_SKIP_IMAGES = (1 << 2),
|
40
40
|
HTML_SKIP_LINKS = (1 << 3),
|
41
|
-
HTML_EXPAND_TABS = (1 <<
|
42
|
-
HTML_SAFELINK = (1 <<
|
43
|
-
HTML_TOC = (1 <<
|
44
|
-
HTML_HARD_WRAP = (1 <<
|
45
|
-
|
46
|
-
HTML_USE_XHTML = (1 << 11),
|
41
|
+
HTML_EXPAND_TABS = (1 << 4),
|
42
|
+
HTML_SAFELINK = (1 << 5),
|
43
|
+
HTML_TOC = (1 << 6),
|
44
|
+
HTML_HARD_WRAP = (1 << 7),
|
45
|
+
HTML_USE_XHTML = (1 << 8),
|
47
46
|
} html_render_mode;
|
48
47
|
|
49
48
|
typedef enum {
|
@@ -53,10 +52,10 @@ typedef enum {
|
|
53
52
|
} html_tag;
|
54
53
|
|
55
54
|
void
|
56
|
-
sdhtml_escape(struct buf *ob, const
|
55
|
+
sdhtml_escape(struct buf *ob, const uint8_t *src, size_t size);
|
57
56
|
|
58
57
|
int
|
59
|
-
sdhtml_tag(const
|
58
|
+
sdhtml_tag(const uint8_t *tag_data, size_t tag_size, const char *tagname);
|
60
59
|
|
61
60
|
extern void
|
62
61
|
sdhtml_renderer(struct sd_callbacks *callbacks, struct html_renderopt *options_ptr, unsigned int render_flags);
|
@@ -65,7 +64,7 @@ extern void
|
|
65
64
|
sdhtml_toc_renderer(struct sd_callbacks *callbacks, struct html_renderopt *options_ptr);
|
66
65
|
|
67
66
|
extern void
|
68
|
-
sdhtml_smartypants(struct buf *ob,
|
67
|
+
sdhtml_smartypants(struct buf *ob, const uint8_t *text, size_t size);
|
69
68
|
|
70
69
|
#endif
|
71
70
|
|
@@ -0,0 +1,205 @@
|
|
1
|
+
/* C code produced by gperf version 3.0.3 */
|
2
|
+
/* Command-line: gperf -N find_block_tag -H hash_block_tag -C -c -E --ignore-case html_block_names.txt */
|
3
|
+
/* Computed positions: -k'1-2' */
|
4
|
+
|
5
|
+
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
|
6
|
+
&& ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
|
7
|
+
&& (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
|
8
|
+
&& ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
|
9
|
+
&& ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
|
10
|
+
&& ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
|
11
|
+
&& ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
|
12
|
+
&& ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
|
13
|
+
&& ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
|
14
|
+
&& ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
|
15
|
+
&& ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
|
16
|
+
&& ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
|
17
|
+
&& ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
|
18
|
+
&& ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
|
19
|
+
&& ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
|
20
|
+
&& ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
|
21
|
+
&& ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
|
22
|
+
&& ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
|
23
|
+
&& ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
|
24
|
+
&& ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
|
25
|
+
&& ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
|
26
|
+
&& ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
|
27
|
+
&& ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
|
28
|
+
/* The character set is not based on ISO-646. */
|
29
|
+
error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
|
30
|
+
#endif
|
31
|
+
|
32
|
+
/* maximum key range = 37, duplicates = 0 */
|
33
|
+
|
34
|
+
#ifndef GPERF_DOWNCASE
|
35
|
+
#define GPERF_DOWNCASE 1
|
36
|
+
static unsigned char gperf_downcase[256] =
|
37
|
+
{
|
38
|
+
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
39
|
+
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
|
40
|
+
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
|
41
|
+
45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
|
42
|
+
60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
|
43
|
+
107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
|
44
|
+
122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
|
45
|
+
105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
|
46
|
+
120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
|
47
|
+
135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
|
48
|
+
150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
|
49
|
+
165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
|
50
|
+
180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
|
51
|
+
195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
|
52
|
+
210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
|
53
|
+
225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
|
54
|
+
240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
|
55
|
+
255
|
56
|
+
};
|
57
|
+
#endif
|
58
|
+
|
59
|
+
#ifndef GPERF_CASE_STRNCMP
|
60
|
+
#define GPERF_CASE_STRNCMP 1
|
61
|
+
static int
|
62
|
+
gperf_case_strncmp (s1, s2, n)
|
63
|
+
register const char *s1;
|
64
|
+
register const char *s2;
|
65
|
+
register unsigned int n;
|
66
|
+
{
|
67
|
+
for (; n > 0;)
|
68
|
+
{
|
69
|
+
unsigned char c1 = gperf_downcase[(unsigned char)*s1++];
|
70
|
+
unsigned char c2 = gperf_downcase[(unsigned char)*s2++];
|
71
|
+
if (c1 != 0 && c1 == c2)
|
72
|
+
{
|
73
|
+
n--;
|
74
|
+
continue;
|
75
|
+
}
|
76
|
+
return (int)c1 - (int)c2;
|
77
|
+
}
|
78
|
+
return 0;
|
79
|
+
}
|
80
|
+
#endif
|
81
|
+
|
82
|
+
#ifdef __GNUC__
|
83
|
+
__inline
|
84
|
+
#else
|
85
|
+
#ifdef __cplusplus
|
86
|
+
inline
|
87
|
+
#endif
|
88
|
+
#endif
|
89
|
+
static unsigned int
|
90
|
+
hash_block_tag (str, len)
|
91
|
+
register const char *str;
|
92
|
+
register unsigned int len;
|
93
|
+
{
|
94
|
+
static const unsigned char asso_values[] =
|
95
|
+
{
|
96
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
97
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
98
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
99
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
100
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
101
|
+
8, 30, 25, 20, 15, 10, 38, 38, 38, 38,
|
102
|
+
38, 38, 38, 38, 38, 38, 0, 38, 0, 38,
|
103
|
+
5, 5, 5, 15, 0, 38, 38, 0, 15, 10,
|
104
|
+
0, 38, 38, 15, 0, 5, 38, 38, 38, 38,
|
105
|
+
38, 38, 38, 38, 38, 38, 38, 38, 0, 38,
|
106
|
+
0, 38, 5, 5, 5, 15, 0, 38, 38, 0,
|
107
|
+
15, 10, 0, 38, 38, 15, 0, 5, 38, 38,
|
108
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
109
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
110
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
111
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
112
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
113
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
114
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
115
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
116
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
117
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
118
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
119
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
120
|
+
38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
|
121
|
+
38, 38, 38, 38, 38, 38, 38
|
122
|
+
};
|
123
|
+
register int hval = len;
|
124
|
+
|
125
|
+
switch (hval)
|
126
|
+
{
|
127
|
+
default:
|
128
|
+
hval += asso_values[(unsigned char)str[1]+1];
|
129
|
+
/*FALLTHROUGH*/
|
130
|
+
case 1:
|
131
|
+
hval += asso_values[(unsigned char)str[0]];
|
132
|
+
break;
|
133
|
+
}
|
134
|
+
return hval;
|
135
|
+
}
|
136
|
+
|
137
|
+
#ifdef __GNUC__
|
138
|
+
__inline
|
139
|
+
#ifdef __GNUC_STDC_INLINE__
|
140
|
+
__attribute__ ((__gnu_inline__))
|
141
|
+
#endif
|
142
|
+
#endif
|
143
|
+
const char *
|
144
|
+
find_block_tag (str, len)
|
145
|
+
register const char *str;
|
146
|
+
register unsigned int len;
|
147
|
+
{
|
148
|
+
enum
|
149
|
+
{
|
150
|
+
TOTAL_KEYWORDS = 23,
|
151
|
+
MIN_WORD_LENGTH = 1,
|
152
|
+
MAX_WORD_LENGTH = 10,
|
153
|
+
MIN_HASH_VALUE = 1,
|
154
|
+
MAX_HASH_VALUE = 37
|
155
|
+
};
|
156
|
+
|
157
|
+
static const char * const wordlist[] =
|
158
|
+
{
|
159
|
+
"",
|
160
|
+
"p",
|
161
|
+
"dl",
|
162
|
+
"div",
|
163
|
+
"math",
|
164
|
+
"table",
|
165
|
+
"",
|
166
|
+
"ul",
|
167
|
+
"del",
|
168
|
+
"form",
|
169
|
+
"blockquote",
|
170
|
+
"figure",
|
171
|
+
"ol",
|
172
|
+
"fieldset",
|
173
|
+
"",
|
174
|
+
"h1",
|
175
|
+
"",
|
176
|
+
"h6",
|
177
|
+
"pre",
|
178
|
+
"", "",
|
179
|
+
"script",
|
180
|
+
"h5",
|
181
|
+
"noscript",
|
182
|
+
"", "",
|
183
|
+
"iframe",
|
184
|
+
"h4",
|
185
|
+
"ins",
|
186
|
+
"", "", "",
|
187
|
+
"h3",
|
188
|
+
"", "", "", "",
|
189
|
+
"h2"
|
190
|
+
};
|
191
|
+
|
192
|
+
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
193
|
+
{
|
194
|
+
register int key = hash_block_tag (str, len);
|
195
|
+
|
196
|
+
if (key <= MAX_HASH_VALUE && key >= 0)
|
197
|
+
{
|
198
|
+
register const char *s = wordlist[key];
|
199
|
+
|
200
|
+
if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_strncmp (str, s, len) && s[len] == '\0')
|
201
|
+
return s;
|
202
|
+
}
|
203
|
+
}
|
204
|
+
return 0;
|
205
|
+
}
|
@@ -27,18 +27,19 @@ struct smartypants_data {
|
|
27
27
|
int in_dquote;
|
28
28
|
};
|
29
29
|
|
30
|
-
static size_t smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt,
|
31
|
-
static size_t smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt,
|
32
|
-
static size_t smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt,
|
33
|
-
static size_t smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt,
|
34
|
-
static size_t smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt,
|
35
|
-
static size_t smartypants_cb__dash(struct buf *ob, struct smartypants_data *smrt,
|
36
|
-
static size_t smartypants_cb__parens(struct buf *ob, struct smartypants_data *smrt,
|
37
|
-
static size_t smartypants_cb__squote(struct buf *ob, struct smartypants_data *smrt,
|
38
|
-
static size_t smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt,
|
30
|
+
static size_t smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
|
31
|
+
static size_t smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
|
32
|
+
static size_t smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
|
33
|
+
static size_t smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
|
34
|
+
static size_t smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
|
35
|
+
static size_t smartypants_cb__dash(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
|
36
|
+
static size_t smartypants_cb__parens(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
|
37
|
+
static size_t smartypants_cb__squote(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
|
38
|
+
static size_t smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
|
39
|
+
static size_t smartypants_cb__escape(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size);
|
39
40
|
|
40
41
|
static size_t (*smartypants_cb_ptrs[])
|
41
|
-
(struct buf *, struct smartypants_data *,
|
42
|
+
(struct buf *, struct smartypants_data *, uint8_t, const uint8_t *, size_t) =
|
42
43
|
{
|
43
44
|
NULL, /* 0 */
|
44
45
|
smartypants_cb__dash, /* 1 */
|
@@ -50,15 +51,16 @@ static size_t (*smartypants_cb_ptrs[])
|
|
50
51
|
smartypants_cb__number, /* 7 */
|
51
52
|
smartypants_cb__ltag, /* 8 */
|
52
53
|
smartypants_cb__backtick, /* 9 */
|
54
|
+
smartypants_cb__escape, /* 10 */
|
53
55
|
};
|
54
56
|
|
55
|
-
static const
|
57
|
+
static const uint8_t smartypants_cb_chars[] = {
|
56
58
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
57
59
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
58
60
|
0, 0, 4, 0, 0, 0, 5, 3, 2, 0, 0, 0, 0, 1, 6, 0,
|
59
61
|
0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0,
|
60
62
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
61
|
-
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
63
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
|
62
64
|
9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
63
65
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
64
66
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
@@ -72,13 +74,13 @@ static const char smartypants_cb_chars[] = {
|
|
72
74
|
};
|
73
75
|
|
74
76
|
static inline int
|
75
|
-
word_boundary(
|
77
|
+
word_boundary(uint8_t c)
|
76
78
|
{
|
77
79
|
return c == 0 || isspace(c) || ispunct(c);
|
78
80
|
}
|
79
81
|
|
80
82
|
static int
|
81
|
-
smartypants_quotes(struct buf *ob,
|
83
|
+
smartypants_quotes(struct buf *ob, uint8_t previous_char, uint8_t next_char, uint8_t quote, int *is_open)
|
82
84
|
{
|
83
85
|
char ent[8];
|
84
86
|
|
@@ -95,10 +97,10 @@ smartypants_quotes(struct buf *ob, char previous_char, char next_char, char quot
|
|
95
97
|
}
|
96
98
|
|
97
99
|
static size_t
|
98
|
-
smartypants_cb__squote(struct buf *ob, struct smartypants_data *smrt,
|
100
|
+
smartypants_cb__squote(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
|
99
101
|
{
|
100
102
|
if (size >= 2) {
|
101
|
-
|
103
|
+
uint8_t t1 = tolower(text[1]);
|
102
104
|
|
103
105
|
if (t1 == '\'') {
|
104
106
|
if (smartypants_quotes(ob, previous_char, size >= 3 ? text[2] : 0, 'd', &smrt->in_dquote))
|
@@ -112,7 +114,7 @@ smartypants_cb__squote(struct buf *ob, struct smartypants_data *smrt, char previ
|
|
112
114
|
}
|
113
115
|
|
114
116
|
if (size >= 3) {
|
115
|
-
|
117
|
+
uint8_t t2 = tolower(text[2]);
|
116
118
|
|
117
119
|
if (((t1 == 'r' && t2 == 'e') ||
|
118
120
|
(t1 == 'l' && t2 == 'l') ||
|
@@ -132,11 +134,11 @@ smartypants_cb__squote(struct buf *ob, struct smartypants_data *smrt, char previ
|
|
132
134
|
}
|
133
135
|
|
134
136
|
static size_t
|
135
|
-
smartypants_cb__parens(struct buf *ob, struct smartypants_data *smrt,
|
137
|
+
smartypants_cb__parens(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
|
136
138
|
{
|
137
139
|
if (size >= 3) {
|
138
|
-
|
139
|
-
|
140
|
+
uint8_t t1 = tolower(text[1]);
|
141
|
+
uint8_t t2 = tolower(text[2]);
|
140
142
|
|
141
143
|
if (t1 == 'c' && t2 == ')') {
|
142
144
|
BUFPUTSL(ob, "©");
|
@@ -153,13 +155,13 @@ smartypants_cb__parens(struct buf *ob, struct smartypants_data *smrt, char previ
|
|
153
155
|
return 3;
|
154
156
|
}
|
155
157
|
}
|
156
|
-
|
158
|
+
|
157
159
|
bufputc(ob, text[0]);
|
158
160
|
return 0;
|
159
161
|
}
|
160
162
|
|
161
163
|
static size_t
|
162
|
-
smartypants_cb__dash(struct buf *ob, struct smartypants_data *smrt,
|
164
|
+
smartypants_cb__dash(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
|
163
165
|
{
|
164
166
|
if (size >= 3 && text[1] == '-' && text[2] == '-') {
|
165
167
|
BUFPUTSL(ob, "—");
|
@@ -176,7 +178,7 @@ smartypants_cb__dash(struct buf *ob, struct smartypants_data *smrt, char previou
|
|
176
178
|
}
|
177
179
|
|
178
180
|
static size_t
|
179
|
-
smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt,
|
181
|
+
smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
|
180
182
|
{
|
181
183
|
if (size >= 6 && memcmp(text, """, 6) == 0) {
|
182
184
|
if (smartypants_quotes(ob, previous_char, size >= 7 ? text[6] : 0, 'd', &smrt->in_dquote))
|
@@ -191,7 +193,7 @@ smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt, char previous
|
|
191
193
|
}
|
192
194
|
|
193
195
|
static size_t
|
194
|
-
smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt,
|
196
|
+
smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
|
195
197
|
{
|
196
198
|
if (size >= 3 && text[1] == '.' && text[2] == '.') {
|
197
199
|
BUFPUTSL(ob, "…");
|
@@ -208,7 +210,7 @@ smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt, char previ
|
|
208
210
|
}
|
209
211
|
|
210
212
|
static size_t
|
211
|
-
smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt,
|
213
|
+
smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
|
212
214
|
{
|
213
215
|
if (size >= 2 && text[1] == '`') {
|
214
216
|
if (smartypants_quotes(ob, previous_char, size >= 3 ? text[2] : 0, 'd', &smrt->in_dquote))
|
@@ -219,7 +221,7 @@ smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt, char pre
|
|
219
221
|
}
|
220
222
|
|
221
223
|
static size_t
|
222
|
-
smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt,
|
224
|
+
smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
|
223
225
|
{
|
224
226
|
if (word_boundary(previous_char) && size >= 3) {
|
225
227
|
if (text[0] == '1' && text[1] == '/' && text[2] == '2') {
|
@@ -251,7 +253,7 @@ smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt, char previ
|
|
251
253
|
}
|
252
254
|
|
253
255
|
static size_t
|
254
|
-
smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt,
|
256
|
+
smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
|
255
257
|
{
|
256
258
|
if (!smartypants_quotes(ob, previous_char, size > 0 ? text[1] : 0, 'd', &smrt->in_dquote))
|
257
259
|
BUFPUTSL(ob, """);
|
@@ -260,7 +262,7 @@ smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt, char previ
|
|
260
262
|
}
|
261
263
|
|
262
264
|
static size_t
|
263
|
-
smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt,
|
265
|
+
smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
|
264
266
|
{
|
265
267
|
static const char *skip_tags[] = {"pre", "code", "kbd", "script"};
|
266
268
|
static const size_t skip_tags_count = 4;
|
@@ -297,11 +299,33 @@ smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt, char previou
|
|
297
299
|
return i;
|
298
300
|
}
|
299
301
|
|
302
|
+
static size_t
|
303
|
+
smartypants_cb__escape(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
|
304
|
+
{
|
305
|
+
if (size < 2)
|
306
|
+
return 0;
|
307
|
+
|
308
|
+
switch (text[1]) {
|
309
|
+
case '\\':
|
310
|
+
case '"':
|
311
|
+
case '\'':
|
312
|
+
case '.':
|
313
|
+
case '-':
|
314
|
+
case '`':
|
315
|
+
bufputc(ob, text[1]);
|
316
|
+
return 1;
|
317
|
+
|
318
|
+
default:
|
319
|
+
bufputc(ob, '\\');
|
320
|
+
return 0;
|
321
|
+
}
|
322
|
+
}
|
323
|
+
|
300
324
|
#if 0
|
301
325
|
static struct {
|
302
|
-
|
303
|
-
const
|
304
|
-
const
|
326
|
+
uint8_t c0;
|
327
|
+
const uint8_t *pattern;
|
328
|
+
const uint8_t *entity;
|
305
329
|
int skip;
|
306
330
|
} smartypants_subs[] = {
|
307
331
|
{ '\'', "'s>", "’", 0 },
|
@@ -328,7 +352,7 @@ static struct {
|
|
328
352
|
#endif
|
329
353
|
|
330
354
|
void
|
331
|
-
sdhtml_smartypants(struct buf *ob,
|
355
|
+
sdhtml_smartypants(struct buf *ob, const uint8_t *text, size_t size)
|
332
356
|
{
|
333
357
|
size_t i;
|
334
358
|
struct smartypants_data smrt = {0, 0};
|
@@ -336,22 +360,22 @@ sdhtml_smartypants(struct buf *ob, struct buf *text)
|
|
336
360
|
if (!text)
|
337
361
|
return;
|
338
362
|
|
339
|
-
bufgrow(ob,
|
363
|
+
bufgrow(ob, size);
|
340
364
|
|
341
|
-
for (i = 0; i <
|
365
|
+
for (i = 0; i < size; ++i) {
|
342
366
|
size_t org;
|
343
|
-
|
367
|
+
uint8_t action = 0;
|
344
368
|
|
345
369
|
org = i;
|
346
|
-
while (i <
|
370
|
+
while (i < size && (action = smartypants_cb_chars[text[i]]) == 0)
|
347
371
|
i++;
|
348
372
|
|
349
373
|
if (i > org)
|
350
|
-
bufput(ob, text
|
374
|
+
bufput(ob, text + org, i - org);
|
351
375
|
|
352
|
-
if (i <
|
376
|
+
if (i < size) {
|
353
377
|
i += smartypants_cb_ptrs[(int)action]
|
354
|
-
(ob, &smrt, i ? text
|
378
|
+
(ob, &smrt, i ? text[i - 1] : 0, text + i, size - i);
|
355
379
|
}
|
356
380
|
}
|
357
381
|
}
|