redcarpet 1.17.2 → 2.0.0

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.
data/ext/redcarpet/html.h CHANGED
@@ -21,33 +21,47 @@
21
21
  #include "buffer.h"
22
22
  #include <stdlib.h>
23
23
 
24
+ struct html_renderopt {
25
+ struct {
26
+ int header_count;
27
+ int current_level;
28
+ } toc_data;
29
+
30
+ unsigned int flags;
31
+
32
+ /* extra callbacks */
33
+ void (*link_attributes)(struct buf *ob, const struct buf *url, void *self);
34
+ };
35
+
24
36
  typedef enum {
25
37
  HTML_SKIP_HTML = (1 << 0),
26
38
  HTML_SKIP_STYLE = (1 << 1),
27
39
  HTML_SKIP_IMAGES = (1 << 2),
28
40
  HTML_SKIP_LINKS = (1 << 3),
29
- HTML_EXPAND_TABS = (1 << 5),
30
- HTML_SAFELINK = (1 << 7),
31
- HTML_TOC = (1 << 8),
32
- HTML_HARD_WRAP = (1 << 9),
33
- HTML_GITHUB_BLOCKCODE = (1 << 10),
34
- HTML_USE_XHTML = (1 << 11),
35
- } render_mode;
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),
46
+ } html_render_mode;
36
47
 
37
- void
38
- upshtml_escape(struct buf *ob, const char *src, size_t size);
48
+ typedef enum {
49
+ HTML_TAG_NONE = 0,
50
+ HTML_TAG_OPEN,
51
+ HTML_TAG_CLOSE,
52
+ } html_tag;
39
53
 
40
- extern void
41
- upshtml_renderer(struct mkd_renderer *renderer, unsigned int render_flags);
54
+ int
55
+ sdhtml_is_tag(const uint8_t *tag_data, size_t tag_size, const char *tagname);
42
56
 
43
57
  extern void
44
- upshtml_toc_renderer(struct mkd_renderer *renderer);
58
+ sdhtml_renderer(struct sd_callbacks *callbacks, struct html_renderopt *options_ptr, unsigned int render_flags);
45
59
 
46
60
  extern void
47
- upshtml_free_renderer(struct mkd_renderer *renderer);
61
+ sdhtml_toc_renderer(struct sd_callbacks *callbacks, struct html_renderopt *options_ptr);
48
62
 
49
63
  extern void
50
- upshtml_smartypants(struct buf *ob, struct buf *text);
64
+ sdhtml_smartypants(struct buf *ob, const uint8_t *text, size_t size);
51
65
 
52
66
  #endif
53
67
 
@@ -0,0 +1,206 @@
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 = 24,
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
+ "style",
184
+ "iframe",
185
+ "h4",
186
+ "ins",
187
+ "", "", "",
188
+ "h3",
189
+ "", "", "", "",
190
+ "h2"
191
+ };
192
+
193
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
194
+ {
195
+ register int key = hash_block_tag (str, len);
196
+
197
+ if (key <= MAX_HASH_VALUE && key >= 0)
198
+ {
199
+ register const char *s = wordlist[key];
200
+
201
+ if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_strncmp (str, s, len) && s[len] == '\0')
202
+ return s;
203
+ }
204
+ }
205
+ return 0;
206
+ }
@@ -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, char previous_char, const char *text, size_t size);
31
- static size_t smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
32
- static size_t smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
33
- static size_t smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
34
- static size_t smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
35
- static size_t smartypants_cb__dash(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
36
- static size_t smartypants_cb__parens(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
37
- static size_t smartypants_cb__squote(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
38
- static size_t smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size);
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 *, char, const char *, size_t) =
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 char smartypants_cb_chars[] = {
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, 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(char c)
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, char previous_char, char next_char, char quote, int *is_open)
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, char previous_char, const char *text, size_t size)
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
- char t1 = tolower(text[1]);
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
- char t2 = tolower(text[2]);
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, char previous_char, const char *text, size_t size)
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
- char t1 = tolower(text[1]);
139
- char t2 = tolower(text[2]);
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, "&copy;");
@@ -153,24 +155,22 @@ 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, char previous_char, const char *text, size_t size)
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
- if (size >= 2) {
165
- if (text[1] == '-') {
166
- BUFPUTSL(ob, "&mdash;");
167
- return 1;
168
- }
166
+ if (size >= 3 && text[1] == '-' && text[2] == '-') {
167
+ BUFPUTSL(ob, "&mdash;");
168
+ return 2;
169
+ }
169
170
 
170
- if (word_boundary(previous_char) && word_boundary(text[1])) {
171
- BUFPUTSL(ob, "&ndash;");
172
- return 0;
173
- }
171
+ if (size >= 2 && text[1] == '-') {
172
+ BUFPUTSL(ob, "&ndash;");
173
+ return 1;
174
174
  }
175
175
 
176
176
  bufputc(ob, text[0]);
@@ -178,7 +178,7 @@ smartypants_cb__dash(struct buf *ob, struct smartypants_data *smrt, char previou
178
178
  }
179
179
 
180
180
  static size_t
181
- smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size)
181
+ smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
182
182
  {
183
183
  if (size >= 6 && memcmp(text, "&quot;", 6) == 0) {
184
184
  if (smartypants_quotes(ob, previous_char, size >= 7 ? text[6] : 0, 'd', &smrt->in_dquote))
@@ -193,7 +193,7 @@ smartypants_cb__amp(struct buf *ob, struct smartypants_data *smrt, char previous
193
193
  }
194
194
 
195
195
  static size_t
196
- smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size)
196
+ smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
197
197
  {
198
198
  if (size >= 3 && text[1] == '.' && text[2] == '.') {
199
199
  BUFPUTSL(ob, "&hellip;");
@@ -210,7 +210,7 @@ smartypants_cb__period(struct buf *ob, struct smartypants_data *smrt, char previ
210
210
  }
211
211
 
212
212
  static size_t
213
- smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size)
213
+ smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
214
214
  {
215
215
  if (size >= 2 && text[1] == '`') {
216
216
  if (smartypants_quotes(ob, previous_char, size >= 3 ? text[2] : 0, 'd', &smrt->in_dquote))
@@ -221,7 +221,7 @@ smartypants_cb__backtick(struct buf *ob, struct smartypants_data *smrt, char pre
221
221
  }
222
222
 
223
223
  static size_t
224
- smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size)
224
+ smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
225
225
  {
226
226
  if (word_boundary(previous_char) && size >= 3) {
227
227
  if (text[0] == '1' && text[1] == '/' && text[2] == '2') {
@@ -253,7 +253,7 @@ smartypants_cb__number(struct buf *ob, struct smartypants_data *smrt, char previ
253
253
  }
254
254
 
255
255
  static size_t
256
- smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size)
256
+ smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
257
257
  {
258
258
  if (!smartypants_quotes(ob, previous_char, size > 0 ? text[1] : 0, 'd', &smrt->in_dquote))
259
259
  BUFPUTSL(ob, "&quot;");
@@ -262,22 +262,72 @@ smartypants_cb__dquote(struct buf *ob, struct smartypants_data *smrt, char previ
262
262
  }
263
263
 
264
264
  static size_t
265
- smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt, char previous_char, const char *text, size_t size)
265
+ smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
266
266
  {
267
- size_t i = 0;
267
+ static const char *skip_tags[] = {
268
+ "pre", "code", "var", "samp", "kbd", "math", "script", "style"
269
+ };
270
+ static const size_t skip_tags_count = 8;
271
+
272
+ size_t tag, i = 0;
268
273
 
269
274
  while (i < size && text[i] != '>')
270
275
  i++;
271
276
 
277
+ for (tag = 0; tag < skip_tags_count; ++tag) {
278
+ if (sdhtml_is_tag(text, size, skip_tags[tag]) == HTML_TAG_OPEN)
279
+ break;
280
+ }
281
+
282
+ if (tag < skip_tags_count) {
283
+ for (;;) {
284
+ while (i < size && text[i] != '<')
285
+ i++;
286
+
287
+ if (i == size)
288
+ break;
289
+
290
+ if (sdhtml_is_tag(text + i, size - i, skip_tags[tag]) == HTML_TAG_CLOSE)
291
+ break;
292
+
293
+ i++;
294
+ }
295
+
296
+ while (i < size && text[i] != '>')
297
+ i++;
298
+ }
299
+
272
300
  bufput(ob, text, i + 1);
273
301
  return i;
274
302
  }
275
303
 
304
+ static size_t
305
+ smartypants_cb__escape(struct buf *ob, struct smartypants_data *smrt, uint8_t previous_char, const uint8_t *text, size_t size)
306
+ {
307
+ if (size < 2)
308
+ return 0;
309
+
310
+ switch (text[1]) {
311
+ case '\\':
312
+ case '"':
313
+ case '\'':
314
+ case '.':
315
+ case '-':
316
+ case '`':
317
+ bufputc(ob, text[1]);
318
+ return 1;
319
+
320
+ default:
321
+ bufputc(ob, '\\');
322
+ return 0;
323
+ }
324
+ }
325
+
276
326
  #if 0
277
327
  static struct {
278
- char c0;
279
- const char *pattern;
280
- const char *entity;
328
+ uint8_t c0;
329
+ const uint8_t *pattern;
330
+ const uint8_t *entity;
281
331
  int skip;
282
332
  } smartypants_subs[] = {
283
333
  { '\'', "'s>", "&rsquo;", 0 },
@@ -304,7 +354,7 @@ static struct {
304
354
  #endif
305
355
 
306
356
  void
307
- upshtml_smartypants(struct buf *ob, struct buf *text)
357
+ sdhtml_smartypants(struct buf *ob, const uint8_t *text, size_t size)
308
358
  {
309
359
  size_t i;
310
360
  struct smartypants_data smrt = {0, 0};
@@ -312,22 +362,22 @@ upshtml_smartypants(struct buf *ob, struct buf *text)
312
362
  if (!text)
313
363
  return;
314
364
 
315
- bufgrow(ob, text->size);
365
+ bufgrow(ob, size);
316
366
 
317
- for (i = 0; i < text->size; ++i) {
367
+ for (i = 0; i < size; ++i) {
318
368
  size_t org;
319
- char action = 0;
369
+ uint8_t action = 0;
320
370
 
321
371
  org = i;
322
- while (i < text->size && (action = smartypants_cb_chars[(unsigned char)text->data[i]]) == 0)
372
+ while (i < size && (action = smartypants_cb_chars[text[i]]) == 0)
323
373
  i++;
324
374
 
325
375
  if (i > org)
326
- bufput(ob, text->data + org, i - org);
376
+ bufput(ob, text + org, i - org);
327
377
 
328
- if (i < text->size) {
378
+ if (i < size) {
329
379
  i += smartypants_cb_ptrs[(int)action]
330
- (ob, &smrt, i ? text->data[i - 1] : 0, text->data + i, text->size - i);
380
+ (ob, &smrt, i ? text[i - 1] : 0, text + i, size - i);
331
381
  }
332
382
  }
333
383
  }