bluecloth 2.0.9 → 2.0.10
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.tar.gz.sig +0 -0
- data/ChangeLog +29 -2
- data/Rakefile +18 -15
- data/ext/VERSION +1 -1
- data/ext/bluecloth.c +26 -5
- data/ext/config.h +13 -2
- data/ext/css.c +14 -5
- data/ext/cstring.h +1 -1
- data/ext/docheader.c +13 -7
- data/ext/emmatch.c +1 -1
- data/ext/generate.c +134 -48
- data/ext/markdown.c +207 -94
- data/ext/markdown.h +37 -28
- data/ext/mkdio.c +39 -32
- data/ext/mkdio.h +34 -24
- data/ext/resource.c +3 -1
- data/ext/setup.c +47 -0
- data/ext/tags.c +15 -2
- data/ext/tags.h +1 -0
- data/lib/bluecloth.rb +65 -40
- data/rake/documentation.rb +9 -1
- data/rake/hg.rb +34 -3
- data/rake/packaging.rb +1 -1
- data/rake/publishing.rb +2 -9
- data/rake/testing.rb +53 -88
- data/spec/bluecloth/101_changes_spec.rb +17 -17
- data/spec/bluecloth/autolinks_spec.rb +1 -1
- data/spec/bluecloth/blockquotes_spec.rb +18 -18
- data/spec/bluecloth/code_spans_spec.rb +1 -1
- data/spec/bluecloth/emphasis_spec.rb +1 -1
- data/spec/bluecloth/entities_spec.rb +1 -1
- data/spec/bluecloth/hrules_spec.rb +1 -1
- data/spec/bluecloth/images_spec.rb +1 -1
- data/spec/bluecloth/inline_html_spec.rb +1 -1
- data/spec/bluecloth/links_spec.rb +1 -1
- data/spec/bluecloth/lists_spec.rb +1 -1
- data/spec/bluecloth/paragraphs_spec.rb +1 -1
- data/spec/bluecloth/titles_spec.rb +1 -1
- data/spec/bluecloth_spec.rb +13 -13
- data/spec/bugfix_spec.rb +6 -1
- data/spec/contributions_spec.rb +1 -1
- data/spec/discount_spec.rb +2 -2
- data/spec/lib/helpers.rb +1 -124
- data/spec/lib/matchers.rb +1 -1
- data/spec/markdowntest_spec.rb +1 -1
- metadata +10 -10
- metadata.gz.sig +0 -0
data/ext/markdown.h
CHANGED
@@ -76,23 +76,32 @@ typedef struct mmiot {
|
|
76
76
|
Qblock Q;
|
77
77
|
int isp;
|
78
78
|
STRING(Footnote) *footnotes;
|
79
|
-
|
80
|
-
#define
|
81
|
-
#define
|
82
|
-
#define
|
83
|
-
#define
|
84
|
-
#define
|
85
|
-
#define
|
86
|
-
#define
|
87
|
-
#define
|
88
|
-
#define
|
89
|
-
#define
|
90
|
-
#define
|
91
|
-
#define
|
92
|
-
#define
|
93
|
-
#define
|
94
|
-
#define
|
95
|
-
#define
|
79
|
+
DWORD flags;
|
80
|
+
#define MKD_NOLINKS 0x00000001
|
81
|
+
#define MKD_NOIMAGE 0x00000002
|
82
|
+
#define MKD_NOPANTS 0x00000004
|
83
|
+
#define MKD_NOHTML 0x00000008
|
84
|
+
#define MKD_STRICT 0x00000010
|
85
|
+
#define MKD_TAGTEXT 0x00000020
|
86
|
+
#define MKD_NO_EXT 0x00000040
|
87
|
+
#define MKD_CDATA 0x00000080
|
88
|
+
#define MKD_NOSUPERSCRIPT 0x00000100
|
89
|
+
#define MKD_NORELAXED 0x00000200
|
90
|
+
#define MKD_NOTABLES 0x00000400
|
91
|
+
#define MKD_NOSTRIKETHROUGH 0x00000800
|
92
|
+
#define MKD_TOC 0x00001000
|
93
|
+
#define MKD_1_COMPAT 0x00002000
|
94
|
+
#define MKD_AUTOLINK 0x00004000
|
95
|
+
#define MKD_SAFELINK 0x00008000
|
96
|
+
#define MKD_NOHEADER 0x00010000
|
97
|
+
#define MKD_TABSTOP 0x00020000
|
98
|
+
#define MKD_NODIVQUOTE 0x00040000
|
99
|
+
#define MKD_NOALPHALIST 0x00080000
|
100
|
+
#define MKD_NODLIST 0x00100000
|
101
|
+
#define IS_LABEL 0x08000000
|
102
|
+
#define USER_FLAGS 0x0FFFFFFF
|
103
|
+
#define INPUT_MASK (MKD_NOHEADER|MKD_TABSTOP)
|
104
|
+
|
96
105
|
Callback_data *cb;
|
97
106
|
} MMIOT;
|
98
107
|
|
@@ -107,7 +116,9 @@ typedef struct mmiot {
|
|
107
116
|
typedef struct document {
|
108
117
|
int magic; /* "I AM VALID" magic number */
|
109
118
|
#define VALID_DOCUMENT 0x19600731
|
110
|
-
Line *
|
119
|
+
Line *title;
|
120
|
+
Line *author;
|
121
|
+
Line *date;
|
111
122
|
ANCHOR(Line) content; /* uncompiled text, not valid after compile() */
|
112
123
|
Paragraph *code; /* intermediate code generated by compile() */
|
113
124
|
int compiled; /* set after mkd_compile() */
|
@@ -119,7 +130,7 @@ typedef struct document {
|
|
119
130
|
|
120
131
|
|
121
132
|
extern int mkd_firstnonblank(Line *);
|
122
|
-
extern int mkd_compile(Document *,
|
133
|
+
extern int mkd_compile(Document *, DWORD);
|
123
134
|
extern int mkd_document(Document *, char **);
|
124
135
|
extern int mkd_generatehtml(Document *, FILE *);
|
125
136
|
extern int mkd_css(Document *, char **);
|
@@ -128,19 +139,17 @@ extern int mkd_generatecss(Document *, FILE *);
|
|
128
139
|
extern int mkd_xml(char *, int , char **);
|
129
140
|
extern int mkd_generatexml(char *, int, FILE *);
|
130
141
|
extern void mkd_cleanup(Document *);
|
131
|
-
extern int mkd_line(char *, int, char **,
|
132
|
-
extern int mkd_generateline(char *, int, FILE*,
|
142
|
+
extern int mkd_line(char *, int, char **, DWORD);
|
143
|
+
extern int mkd_generateline(char *, int, FILE*, DWORD);
|
133
144
|
#define mkd_text mkd_generateline
|
134
145
|
extern void mkd_basename(Document*, char *);
|
135
|
-
extern void mkd_string_to_anchor(char*,int, void(*)(int,void*), void
|
136
|
-
|
137
|
-
extern Document *mkd_in(FILE *, int);
|
138
|
-
extern Document *mkd_string(char*,int, int);
|
146
|
+
extern void mkd_string_to_anchor(char*,int, void(*)(int,void*), void*, int);
|
139
147
|
|
140
|
-
|
141
|
-
|
142
|
-
#define INPUT_MASK (NO_HEADER|STD_TABSTOP)
|
148
|
+
extern Document *mkd_in(FILE *, DWORD);
|
149
|
+
extern Document *mkd_string(char*,int, DWORD);
|
143
150
|
|
151
|
+
extern void mkd_initialize();
|
152
|
+
extern void mkd_shlib_destructor();
|
144
153
|
|
145
154
|
/* internal resource handling functions.
|
146
155
|
*/
|
data/ext/mkdio.c
CHANGED
@@ -70,16 +70,14 @@ queue(Document* a, Cstring *line)
|
|
70
70
|
}
|
71
71
|
|
72
72
|
|
73
|
-
#ifdef PANDOC_HEADER
|
74
73
|
/* trim leading blanks from a header line
|
75
74
|
*/
|
76
75
|
static void
|
77
|
-
|
76
|
+
header_dle(Line *p)
|
78
77
|
{
|
79
78
|
CLIP(p->text, 0, 1);
|
80
79
|
p->dle = mkd_firstnonblank(p);
|
81
80
|
}
|
82
|
-
#endif
|
83
81
|
|
84
82
|
|
85
83
|
/* build a Document from any old input.
|
@@ -92,26 +90,22 @@ populate(getc_func getc, void* ctx, int flags)
|
|
92
90
|
Cstring line;
|
93
91
|
Document *a = new_Document();
|
94
92
|
int c;
|
95
|
-
#ifdef PANDOC_HEADER
|
96
93
|
int pandoc = 0;
|
97
|
-
#endif
|
98
94
|
|
99
95
|
if ( !a ) return 0;
|
100
96
|
|
101
|
-
a->tabstop = (flags &
|
97
|
+
a->tabstop = (flags & MKD_TABSTOP) ? 4 : TABSTOP;
|
102
98
|
|
103
99
|
CREATE(line);
|
104
100
|
|
105
101
|
while ( (c = (*getc)(ctx)) != EOF ) {
|
106
102
|
if ( c == '\n' ) {
|
107
|
-
#ifdef PANDOC_HEADER
|
108
103
|
if ( pandoc != EOF && pandoc < 3 ) {
|
109
104
|
if ( S(line) && (T(line)[0] == '%') )
|
110
105
|
pandoc++;
|
111
106
|
else
|
112
107
|
pandoc = EOF;
|
113
108
|
}
|
114
|
-
#endif
|
115
109
|
queue(a, &line);
|
116
110
|
S(line) = 0;
|
117
111
|
}
|
@@ -124,20 +118,19 @@ populate(getc_func getc, void* ctx, int flags)
|
|
124
118
|
|
125
119
|
DELETE(line);
|
126
120
|
|
127
|
-
|
128
|
-
if ( (pandoc == 3) && !(flags & NO_HEADER) ) {
|
121
|
+
if ( (pandoc == 3) && !(flags & (MKD_NOHEADER|MKD_STRICT)) ) {
|
129
122
|
/* the first three lines started with %, so we have a header.
|
130
123
|
* clip the first three lines out of content and hang them
|
131
124
|
* off header.
|
132
125
|
*/
|
133
|
-
|
134
|
-
|
135
|
-
a->
|
136
|
-
|
137
|
-
|
138
|
-
|
126
|
+
Line *headers = T(a->content);
|
127
|
+
|
128
|
+
a->title = headers; header_dle(a->title);
|
129
|
+
a->author= headers->next; header_dle(a->author);
|
130
|
+
a->date = headers->next->next; header_dle(a->date);
|
131
|
+
|
132
|
+
T(a->content) = headers->next->next->next;
|
139
133
|
}
|
140
|
-
#endif
|
141
134
|
|
142
135
|
return a;
|
143
136
|
}
|
@@ -146,7 +139,7 @@ populate(getc_func getc, void* ctx, int flags)
|
|
146
139
|
/* convert a file into a linked list
|
147
140
|
*/
|
148
141
|
Document *
|
149
|
-
mkd_in(FILE *f,
|
142
|
+
mkd_in(FILE *f, DWORD flags)
|
150
143
|
{
|
151
144
|
return populate((getc_func)fgetc, f, flags & INPUT_MASK);
|
152
145
|
}
|
@@ -174,7 +167,7 @@ strget(struct string_ctx *in)
|
|
174
167
|
/* convert a block of text into a linked list
|
175
168
|
*/
|
176
169
|
Document *
|
177
|
-
mkd_string(char *buf, int len,
|
170
|
+
mkd_string(char *buf, int len, DWORD flags)
|
178
171
|
{
|
179
172
|
struct string_ctx about;
|
180
173
|
|
@@ -194,7 +187,7 @@ mkd_generatehtml(Document *p, FILE *output)
|
|
194
187
|
int szdoc;
|
195
188
|
|
196
189
|
if ( (szdoc = mkd_document(p, &doc)) != EOF ) {
|
197
|
-
if ( p->ctx->flags &
|
190
|
+
if ( p->ctx->flags & MKD_CDATA )
|
198
191
|
mkd_generatexml(doc, szdoc, output);
|
199
192
|
else
|
200
193
|
fwrite(doc, szdoc, 1, output);
|
@@ -222,19 +215,32 @@ markdown(Document *document, FILE *out, int flags)
|
|
222
215
|
/* write out a Cstring, mangled into a form suitable for `<a href=` or `<a id=`
|
223
216
|
*/
|
224
217
|
void
|
225
|
-
mkd_string_to_anchor(char *s, int len, void(*outchar)(int,void*),
|
218
|
+
mkd_string_to_anchor(char *s, int len, void(*outchar)(int,void*),
|
219
|
+
void *out, int labelformat)
|
226
220
|
{
|
227
221
|
unsigned char c;
|
222
|
+
|
223
|
+
int i, size;
|
224
|
+
char *line;
|
225
|
+
|
226
|
+
size = mkd_line(s, len, &line, IS_LABEL);
|
228
227
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
(
|
228
|
+
if ( labelformat && size && !isalpha(line[0]) )
|
229
|
+
(*outchar)('L',out);
|
230
|
+
for ( i=0; i < size ; i++ ) {
|
231
|
+
c = line[i];
|
232
|
+
if ( labelformat ) {
|
233
|
+
if ( isalnum(c) || (c == '_') || (c == ':') || (c == '-') || (c == '.' ) )
|
234
|
+
(*outchar)(c, out);
|
235
|
+
else
|
236
|
+
(*outchar)('.',out);
|
237
|
+
}
|
235
238
|
else
|
236
|
-
(*outchar)(
|
239
|
+
(*outchar)(c,out);
|
237
240
|
}
|
241
|
+
|
242
|
+
if (line)
|
243
|
+
free(line);
|
238
244
|
}
|
239
245
|
|
240
246
|
|
@@ -253,7 +259,7 @@ mkd_parse_line(char *bfr, int size, MMIOT *f, int flags)
|
|
253
259
|
/* ___mkd_reparse() a line, returning it in malloc()ed memory
|
254
260
|
*/
|
255
261
|
int
|
256
|
-
mkd_line(char *bfr, int size, char **res,
|
262
|
+
mkd_line(char *bfr, int size, char **res, DWORD flags)
|
257
263
|
{
|
258
264
|
MMIOT f;
|
259
265
|
int len;
|
@@ -266,9 +272,10 @@ mkd_line(char *bfr, int size, char **res, int flags)
|
|
266
272
|
* should be an opaque method that transparently moves
|
267
273
|
* the pointer out of the embedded Cstring.
|
268
274
|
*/
|
275
|
+
EXPAND(f.out) = 0;
|
269
276
|
*res = T(f.out);
|
270
277
|
T(f.out) = 0;
|
271
|
-
S(f.out) = 0;
|
278
|
+
S(f.out) = ALLOCATED(f.out) = 0;
|
272
279
|
}
|
273
280
|
else {
|
274
281
|
*res = 0;
|
@@ -282,12 +289,12 @@ mkd_line(char *bfr, int size, char **res, int flags)
|
|
282
289
|
/* ___mkd_reparse() a line, writing it to a FILE
|
283
290
|
*/
|
284
291
|
int
|
285
|
-
mkd_generateline(char *bfr, int size, FILE *output,
|
292
|
+
mkd_generateline(char *bfr, int size, FILE *output, DWORD flags)
|
286
293
|
{
|
287
294
|
MMIOT f;
|
288
295
|
|
289
296
|
mkd_parse_line(bfr, size, &f, flags);
|
290
|
-
if ( flags &
|
297
|
+
if ( flags & MKD_CDATA )
|
291
298
|
mkd_generatexml(T(f.out), S(f.out), output);
|
292
299
|
else
|
293
300
|
fwrite(T(f.out), S(f.out), 1, output);
|
data/ext/mkdio.h
CHANGED
@@ -5,24 +5,29 @@
|
|
5
5
|
|
6
6
|
typedef void MMIOT;
|
7
7
|
|
8
|
+
typedef unsigned int mkd_flag_t;
|
9
|
+
|
8
10
|
/* line builder for markdown()
|
9
11
|
*/
|
10
|
-
MMIOT *mkd_in(FILE*,
|
11
|
-
MMIOT *mkd_string(char*,int,
|
12
|
+
MMIOT *mkd_in(FILE*,mkd_flag_t); /* assemble input from a file */
|
13
|
+
MMIOT *mkd_string(char*,int,mkd_flag_t); /* assemble input from a buffer */
|
12
14
|
|
13
15
|
void mkd_basename(MMIOT*,char*);
|
14
16
|
|
17
|
+
void mkd_initialize();
|
18
|
+
void mkd_shlib_destructor();
|
19
|
+
|
15
20
|
/* compilation, debugging, cleanup
|
16
21
|
*/
|
17
|
-
int mkd_compile(MMIOT*,
|
22
|
+
int mkd_compile(MMIOT*, mkd_flag_t);
|
18
23
|
int mkd_cleanup(MMIOT*);
|
19
24
|
|
20
25
|
/* markup functions
|
21
26
|
*/
|
22
27
|
int mkd_dump(MMIOT*, FILE*, int, char*);
|
23
|
-
int markdown(MMIOT*, FILE*,
|
24
|
-
int mkd_line(char *, int, char **,
|
25
|
-
void mkd_string_to_anchor(char *, int, int (*)(int,void*), void
|
28
|
+
int markdown(MMIOT*, FILE*, mkd_flag_t);
|
29
|
+
int mkd_line(char *, int, char **, mkd_flag_t);
|
30
|
+
void mkd_string_to_anchor(char *, int, int (*)(int,void*), void*, int);
|
26
31
|
int mkd_xhtmlpage(MMIOT*,int,FILE*);
|
27
32
|
|
28
33
|
/* header block access
|
@@ -45,7 +50,7 @@ int mkd_generatetoc(MMIOT*,FILE*);
|
|
45
50
|
int mkd_generatexml(char *, int,FILE*);
|
46
51
|
int mkd_generatecss(MMIOT*,FILE*);
|
47
52
|
#define mkd_style mkd_generatecss
|
48
|
-
int mkd_generateline(char *, int, FILE*,
|
53
|
+
int mkd_generateline(char *, int, FILE*, mkd_flag_t);
|
49
54
|
#define mkd_text mkd_generateline
|
50
55
|
|
51
56
|
/* url generator callbacks
|
@@ -64,27 +69,32 @@ extern char markdown_version[];
|
|
64
69
|
|
65
70
|
/* special flags for markdown() and mkd_text()
|
66
71
|
*/
|
67
|
-
#define MKD_NOLINKS
|
68
|
-
#define MKD_NOIMAGE
|
69
|
-
#define MKD_NOPANTS
|
70
|
-
#define MKD_NOHTML
|
71
|
-
#define MKD_STRICT
|
72
|
-
#define MKD_TAGTEXT
|
73
|
-
|
74
|
-
#define MKD_NO_EXT
|
75
|
-
#define MKD_CDATA
|
76
|
-
#define
|
77
|
-
#define
|
78
|
-
#define
|
79
|
-
#define
|
80
|
-
#define
|
81
|
-
#define
|
72
|
+
#define MKD_NOLINKS 0x00000001 /* don't do link processing, block <a> tags */
|
73
|
+
#define MKD_NOIMAGE 0x00000002 /* don't do image processing, block <img> */
|
74
|
+
#define MKD_NOPANTS 0x00000004 /* don't run smartypants() */
|
75
|
+
#define MKD_NOHTML 0x00000008 /* don't allow raw html through AT ALL */
|
76
|
+
#define MKD_STRICT 0x00000010 /* disable SUPERSCRIPT, RELAXED_EMPHASIS */
|
77
|
+
#define MKD_TAGTEXT 0x00000020 /* process text inside an html tag; no
|
78
|
+
* <em>, no <bold>, no html or [] expansion */
|
79
|
+
#define MKD_NO_EXT 0x00000040 /* don't allow pseudo-protocols */
|
80
|
+
#define MKD_CDATA 0x00000080 /* generate code for xml ![CDATA[...]] */
|
81
|
+
#define MKD_NOSUPERSCRIPT 0x00000100 /* no A^B */
|
82
|
+
#define MKD_NORELAXED 0x00000200 /* emphasis happens /everywhere/ */
|
83
|
+
#define MKD_NOTABLES 0x00000400 /* disallow tables */
|
84
|
+
#define MKD_NOSTRIKETHROUGH 0x00000800 /* forbid ~~strikethrough~~ */
|
85
|
+
#define MKD_TOC 0x00001000 /* do table-of-contents processing */
|
86
|
+
#define MKD_1_COMPAT 0x00002000 /* compatibility with MarkdownTest_1.0 */
|
87
|
+
#define MKD_AUTOLINK 0x00004000 /* make http://foo.com link even without <>s */
|
88
|
+
#define MKD_SAFELINK 0x00008000 /* paranoid check for link protocol */
|
89
|
+
#define MKD_NOHEADER 0x00010000 /* don't process header blocks */
|
90
|
+
#define MKD_TABSTOP 0x00020000 /* expand tabs to 4 spaces */
|
91
|
+
#define MKD_NODIVQUOTE 0x00040000 /* forbid >%class% blocks */
|
92
|
+
#define MKD_NOALPHALIST 0x00080000 /* forbid alphabetic lists */
|
93
|
+
#define MKD_NODLIST 0x00100000 /* forbid definition lists */
|
82
94
|
#define MKD_EMBED MKD_NOLINKS|MKD_NOIMAGE|MKD_TAGTEXT
|
83
95
|
|
84
96
|
/* special flags for mkd_in() and mkd_string()
|
85
97
|
*/
|
86
|
-
#define MKD_NOHEADER 0x0100 /* don't process header blocks */
|
87
|
-
#define MKD_TABSTOP 0x0200 /* expand tabs to 4 spaces */
|
88
98
|
|
89
99
|
|
90
100
|
#endif/*_MKDIO_D*/
|
data/ext/resource.c
CHANGED
@@ -147,7 +147,9 @@ mkd_cleanup(Document *doc)
|
|
147
147
|
}
|
148
148
|
|
149
149
|
if ( doc->code) ___mkd_freeParagraph(doc->code);
|
150
|
-
if ( doc->
|
150
|
+
if ( doc->title) ___mkd_freeLine(doc->title);
|
151
|
+
if ( doc->author) ___mkd_freeLine(doc->author);
|
152
|
+
if ( doc->date) ___mkd_freeLine(doc->date);
|
151
153
|
if ( T(doc->content) ) ___mkd_freeLines(T(doc->content));
|
152
154
|
memset(doc, 0, sizeof doc[0]);
|
153
155
|
free(doc);
|
data/ext/setup.c
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
/* markdown: a C implementation of John Gruber's Markdown markup language.
|
2
|
+
*
|
3
|
+
* Copyright (C) 2007 David L Parsons.
|
4
|
+
* The redistribution terms are provided in the COPYRIGHT file that must
|
5
|
+
* be distributed with this source code.
|
6
|
+
*/
|
7
|
+
#include "config.h"
|
8
|
+
|
9
|
+
#include <stdio.h>
|
10
|
+
#include <string.h>
|
11
|
+
#include <stdarg.h>
|
12
|
+
#include <stdlib.h>
|
13
|
+
#include <time.h>
|
14
|
+
#include <ctype.h>
|
15
|
+
|
16
|
+
#include "cstring.h"
|
17
|
+
#include "markdown.h"
|
18
|
+
#include "amalloc.h"
|
19
|
+
#include "tags.h"
|
20
|
+
|
21
|
+
static int need_to_setup = 1;
|
22
|
+
static int need_to_initrng = 1;
|
23
|
+
|
24
|
+
void
|
25
|
+
mkd_initialize()
|
26
|
+
{
|
27
|
+
|
28
|
+
if ( need_to_initrng ) {
|
29
|
+
need_to_initrng = 0;
|
30
|
+
INITRNG(time(0));
|
31
|
+
}
|
32
|
+
if ( need_to_setup ) {
|
33
|
+
need_to_setup = 0;
|
34
|
+
mkd_prepare_tags();
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
|
39
|
+
void
|
40
|
+
mkd_shlib_destructor()
|
41
|
+
{
|
42
|
+
if ( !need_to_setup ) {
|
43
|
+
need_to_setup = 1;
|
44
|
+
mkd_deallocate_tags();
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
data/ext/tags.c
CHANGED
@@ -61,6 +61,9 @@ mkd_search_tags(char *pat, int len)
|
|
61
61
|
}
|
62
62
|
|
63
63
|
|
64
|
+
static int populated = 0;
|
65
|
+
|
66
|
+
|
64
67
|
/* load in the standard collection of html tags that markdown supports
|
65
68
|
*/
|
66
69
|
void
|
@@ -70,8 +73,6 @@ mkd_prepare_tags()
|
|
70
73
|
#define KW(x) mkd_define_tag(x, 0)
|
71
74
|
#define SC(x) mkd_define_tag(x, 1)
|
72
75
|
|
73
|
-
static int populated = 0;
|
74
|
-
|
75
76
|
if ( populated ) return;
|
76
77
|
populated = 1;
|
77
78
|
|
@@ -108,3 +109,15 @@ mkd_prepare_tags()
|
|
108
109
|
|
109
110
|
mkd_sort_tags();
|
110
111
|
} /* mkd_prepare_tags */
|
112
|
+
|
113
|
+
|
114
|
+
/* destroy the blocktags list (for shared libraries)
|
115
|
+
*/
|
116
|
+
void
|
117
|
+
mkd_deallocate_tags()
|
118
|
+
{
|
119
|
+
if ( S(blocktags) > 0 ) {
|
120
|
+
populated = 0;
|
121
|
+
DELETE(blocktags);
|
122
|
+
}
|
123
|
+
} /* mkd_deallocate_tags */
|