rdiscount-dsc 1.6.9
Sign up to get free protection for your applications and to get access to all the features.
- data/BUILDING +34 -0
- data/COPYING +52 -0
- data/README.markdown +71 -0
- data/Rakefile +182 -0
- data/bin/rdiscount +19 -0
- data/ext/Csio.c +61 -0
- data/ext/amalloc.h +29 -0
- data/ext/basename.c +43 -0
- data/ext/config.h +23 -0
- data/ext/css.c +85 -0
- data/ext/cstring.h +77 -0
- data/ext/docheader.c +49 -0
- data/ext/dumptree.c +152 -0
- data/ext/emmatch.c +188 -0
- data/ext/extconf.rb +18 -0
- data/ext/generate.c +1642 -0
- data/ext/html5.c +24 -0
- data/ext/markdown.c +1215 -0
- data/ext/markdown.h +169 -0
- data/ext/mkdio.c +344 -0
- data/ext/mkdio.h +100 -0
- data/ext/rdiscount.c +106 -0
- data/ext/resource.c +157 -0
- data/ext/tags.c +123 -0
- data/ext/tags.h +19 -0
- data/ext/toc.c +101 -0
- data/ext/xml.c +82 -0
- data/lib/markdown.rb +1 -0
- data/lib/rdiscount.rb +87 -0
- data/man/markdown.7 +1020 -0
- data/man/rdiscount.1 +119 -0
- data/man/rdiscount.1.ronn +98 -0
- data/rdiscount-dsc.gemspec +57 -0
- data/test/benchmark.rb +56 -0
- data/test/benchmark.txt +306 -0
- data/test/markdown_test.rb +159 -0
- data/test/rdiscount_test.rb +111 -0
- metadata +88 -0
data/ext/mkdio.h
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
#ifndef _MKDIO_D
|
2
|
+
#define _MKDIO_D
|
3
|
+
|
4
|
+
#include <stdio.h>
|
5
|
+
|
6
|
+
typedef void MMIOT;
|
7
|
+
|
8
|
+
typedef unsigned int mkd_flag_t;
|
9
|
+
|
10
|
+
/* line builder for markdown()
|
11
|
+
*/
|
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 */
|
14
|
+
|
15
|
+
void mkd_basename(MMIOT*,char*);
|
16
|
+
|
17
|
+
void mkd_initialize();
|
18
|
+
void mkd_shlib_destructor();
|
19
|
+
|
20
|
+
/* compilation, debugging, cleanup
|
21
|
+
*/
|
22
|
+
int mkd_compile(MMIOT*, mkd_flag_t);
|
23
|
+
int mkd_cleanup(MMIOT*);
|
24
|
+
|
25
|
+
/* markup functions
|
26
|
+
*/
|
27
|
+
int mkd_dump(MMIOT*, FILE*, int, char*);
|
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);
|
31
|
+
int mkd_xhtmlpage(MMIOT*,int,FILE*);
|
32
|
+
|
33
|
+
/* header block access
|
34
|
+
*/
|
35
|
+
char* mkd_doc_title(MMIOT*);
|
36
|
+
char* mkd_doc_author(MMIOT*);
|
37
|
+
char* mkd_doc_date(MMIOT*);
|
38
|
+
|
39
|
+
/* compiled data access
|
40
|
+
*/
|
41
|
+
int mkd_document(MMIOT*, char**);
|
42
|
+
int mkd_toc(MMIOT*, char**);
|
43
|
+
int mkd_css(MMIOT*, char **);
|
44
|
+
int mkd_xml(char *, int, char **);
|
45
|
+
|
46
|
+
/* write-to-file functions
|
47
|
+
*/
|
48
|
+
int mkd_generatehtml(MMIOT*,FILE*);
|
49
|
+
int mkd_generatetoc(MMIOT*,FILE*);
|
50
|
+
int mkd_generatexml(char *, int,FILE*);
|
51
|
+
int mkd_generatecss(MMIOT*,FILE*);
|
52
|
+
#define mkd_style mkd_generatecss
|
53
|
+
int mkd_generateline(char *, int, FILE*, mkd_flag_t);
|
54
|
+
#define mkd_text mkd_generateline
|
55
|
+
|
56
|
+
/* url generator callbacks
|
57
|
+
*/
|
58
|
+
typedef char * (*mkd_callback_t)(const char*, const int, void*);
|
59
|
+
typedef void (*mkd_free_t)(char*, void*);
|
60
|
+
|
61
|
+
void mkd_e_url(void *, mkd_callback_t);
|
62
|
+
void mkd_e_flags(void *, mkd_callback_t);
|
63
|
+
void mkd_e_free(void *, mkd_free_t );
|
64
|
+
void mkd_e_data(void *, void *);
|
65
|
+
|
66
|
+
/* version#.
|
67
|
+
*/
|
68
|
+
extern char markdown_version[];
|
69
|
+
|
70
|
+
/* special flags for markdown() and mkd_text()
|
71
|
+
*/
|
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 */
|
94
|
+
#define MKD_EMBED MKD_NOLINKS|MKD_NOIMAGE|MKD_TAGTEXT
|
95
|
+
|
96
|
+
/* special flags for mkd_in() and mkd_string()
|
97
|
+
*/
|
98
|
+
|
99
|
+
|
100
|
+
#endif/*_MKDIO_D*/
|
data/ext/rdiscount.c
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include "ruby.h"
|
3
|
+
#include "mkdio.h"
|
4
|
+
|
5
|
+
static VALUE rb_cRDiscount;
|
6
|
+
|
7
|
+
static VALUE
|
8
|
+
rb_rdiscount_to_html(int argc, VALUE *argv, VALUE self)
|
9
|
+
{
|
10
|
+
/* grab char pointer to markdown input text */
|
11
|
+
char *res;
|
12
|
+
int szres;
|
13
|
+
VALUE encoding;
|
14
|
+
VALUE text = rb_funcall(self, rb_intern("text"), 0);
|
15
|
+
VALUE buf = rb_str_buf_new(1024);
|
16
|
+
Check_Type(text, T_STRING);
|
17
|
+
|
18
|
+
int flags = rb_rdiscount__get_flags(self);
|
19
|
+
|
20
|
+
MMIOT *doc = mkd_string(RSTRING_PTR(text), RSTRING_LEN(text), flags);
|
21
|
+
|
22
|
+
if ( mkd_compile(doc, flags) ) {
|
23
|
+
szres = mkd_document(doc, &res);
|
24
|
+
|
25
|
+
if ( szres != EOF ) {
|
26
|
+
rb_str_cat(buf, res, szres);
|
27
|
+
rb_str_cat(buf, "\n", 1);
|
28
|
+
}
|
29
|
+
}
|
30
|
+
mkd_cleanup(doc);
|
31
|
+
|
32
|
+
|
33
|
+
/* force the input encoding */
|
34
|
+
if ( rb_respond_to(text, rb_intern("encoding")) ) {
|
35
|
+
encoding = rb_funcall(text, rb_intern("encoding"), 0);
|
36
|
+
rb_funcall(buf, rb_intern("force_encoding"), 1, encoding);
|
37
|
+
}
|
38
|
+
|
39
|
+
return buf;
|
40
|
+
}
|
41
|
+
|
42
|
+
static VALUE
|
43
|
+
rb_rdiscount_toc_content(int argc, VALUE *argv, VALUE self)
|
44
|
+
{
|
45
|
+
char *res;
|
46
|
+
int szres;
|
47
|
+
|
48
|
+
int flags = rb_rdiscount__get_flags(self);
|
49
|
+
|
50
|
+
/* grab char pointer to markdown input text */
|
51
|
+
VALUE text = rb_funcall(self, rb_intern("text"), 0);
|
52
|
+
Check_Type(text, T_STRING);
|
53
|
+
|
54
|
+
/* allocate a ruby string buffer and wrap it in a stream */
|
55
|
+
VALUE buf = rb_str_buf_new(4096);
|
56
|
+
|
57
|
+
MMIOT *doc = mkd_string(RSTRING_PTR(text), RSTRING_LEN(text), flags);
|
58
|
+
|
59
|
+
if ( mkd_compile(doc, flags) ) {
|
60
|
+
szres = mkd_toc(doc, &res);
|
61
|
+
|
62
|
+
if ( szres != EOF ) {
|
63
|
+
rb_str_cat(buf, res, szres);
|
64
|
+
rb_str_cat(buf, "\n", 1);
|
65
|
+
}
|
66
|
+
}
|
67
|
+
mkd_cleanup(doc);
|
68
|
+
|
69
|
+
return buf;
|
70
|
+
}
|
71
|
+
|
72
|
+
int rb_rdiscount__get_flags(VALUE ruby_obj)
|
73
|
+
{
|
74
|
+
VALUE flags = rb_funcall(ruby_obj, rb_intern("flags"), 0);
|
75
|
+
return NUM2INT(rb_funcall(flags, rb_intern("to_i"), 0));
|
76
|
+
}
|
77
|
+
|
78
|
+
void Init_rdiscount()
|
79
|
+
{
|
80
|
+
rb_cRDiscount = rb_define_class("RDiscount", rb_cObject);
|
81
|
+
rb_define_const(rb_cRDiscount, "MKD_NOLINKS", INT2NUM(MKD_NOLINKS));
|
82
|
+
rb_define_const(rb_cRDiscount, "MKD_NOIMAGE", INT2NUM(MKD_NOIMAGE));
|
83
|
+
rb_define_const(rb_cRDiscount, "MKD_NOPANTS", INT2NUM(MKD_NOPANTS));
|
84
|
+
rb_define_const(rb_cRDiscount, "MKD_NOHTML", INT2NUM(MKD_NOHTML));
|
85
|
+
rb_define_const(rb_cRDiscount, "MKD_STRICT", INT2NUM(MKD_STRICT));
|
86
|
+
rb_define_const(rb_cRDiscount, "MKD_TAGTEXT", INT2NUM(MKD_TAGTEXT));
|
87
|
+
rb_define_const(rb_cRDiscount, "MKD_NO_EXT", INT2NUM(MKD_NO_EXT));
|
88
|
+
rb_define_const(rb_cRDiscount, "MKD_CDATA", INT2NUM(MKD_CDATA));
|
89
|
+
rb_define_const(rb_cRDiscount, "MKD_NOSUPERSCRIPT", INT2NUM(MKD_NOSUPERSCRIPT));
|
90
|
+
rb_define_const(rb_cRDiscount, "MKD_NORELAXED", INT2NUM(MKD_NORELAXED));
|
91
|
+
rb_define_const(rb_cRDiscount, "MKD_NOTABLES", INT2NUM(MKD_NOTABLES));
|
92
|
+
rb_define_const(rb_cRDiscount, "MKD_NOSTRIKETHROUGH", INT2NUM(MKD_NOSTRIKETHROUGH));
|
93
|
+
rb_define_const(rb_cRDiscount, "MKD_TOC", INT2NUM(MKD_TOC));
|
94
|
+
rb_define_const(rb_cRDiscount, "MKD_1_COMPAT", INT2NUM(MKD_1_COMPAT));
|
95
|
+
rb_define_const(rb_cRDiscount, "MKD_AUTOLINK", INT2NUM(MKD_AUTOLINK));
|
96
|
+
rb_define_const(rb_cRDiscount, "MKD_SAFELINK", INT2NUM(MKD_SAFELINK));
|
97
|
+
rb_define_const(rb_cRDiscount, "MKD_NOHEADER", INT2NUM(MKD_NOHEADER));
|
98
|
+
rb_define_const(rb_cRDiscount, "MKD_TABSTOP", INT2NUM(MKD_TABSTOP));
|
99
|
+
rb_define_const(rb_cRDiscount, "MKD_NODIVQUOTE", INT2NUM(MKD_NODIVQUOTE));
|
100
|
+
rb_define_const(rb_cRDiscount, "MKD_NOALPHALIST", INT2NUM(MKD_NOALPHALIST));
|
101
|
+
rb_define_const(rb_cRDiscount, "MKD_NODLIST", INT2NUM(MKD_NODLIST));
|
102
|
+
rb_define_method(rb_cRDiscount, "to_html", rb_rdiscount_to_html, -1);
|
103
|
+
rb_define_method(rb_cRDiscount, "toc_content", rb_rdiscount_toc_content, -1);
|
104
|
+
}
|
105
|
+
|
106
|
+
/* vim: set ts=4 sw=4: */
|
data/ext/resource.c
ADDED
@@ -0,0 +1,157 @@
|
|
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 <stdio.h>
|
8
|
+
#include <string.h>
|
9
|
+
#include <stdarg.h>
|
10
|
+
#include <stdlib.h>
|
11
|
+
#include <time.h>
|
12
|
+
#include <ctype.h>
|
13
|
+
|
14
|
+
#include "config.h"
|
15
|
+
|
16
|
+
#include "cstring.h"
|
17
|
+
#include "markdown.h"
|
18
|
+
#include "amalloc.h"
|
19
|
+
|
20
|
+
/* free a (single) line
|
21
|
+
*/
|
22
|
+
void
|
23
|
+
___mkd_freeLine(Line *ptr)
|
24
|
+
{
|
25
|
+
DELETE(ptr->text);
|
26
|
+
free(ptr);
|
27
|
+
}
|
28
|
+
|
29
|
+
|
30
|
+
/* free a list of lines
|
31
|
+
*/
|
32
|
+
void
|
33
|
+
___mkd_freeLines(Line *p)
|
34
|
+
{
|
35
|
+
if (p->next)
|
36
|
+
___mkd_freeLines(p->next);
|
37
|
+
___mkd_freeLine(p);
|
38
|
+
}
|
39
|
+
|
40
|
+
|
41
|
+
/* bye bye paragraph.
|
42
|
+
*/
|
43
|
+
void
|
44
|
+
___mkd_freeParagraph(Paragraph *p)
|
45
|
+
{
|
46
|
+
if (p->next)
|
47
|
+
___mkd_freeParagraph(p->next);
|
48
|
+
if (p->down)
|
49
|
+
___mkd_freeParagraph(p->down);
|
50
|
+
if (p->text)
|
51
|
+
___mkd_freeLines(p->text);
|
52
|
+
if (p->ident)
|
53
|
+
free(p->ident);
|
54
|
+
free(p);
|
55
|
+
}
|
56
|
+
|
57
|
+
|
58
|
+
/* bye bye footnote.
|
59
|
+
*/
|
60
|
+
void
|
61
|
+
___mkd_freefootnote(Footnote *f)
|
62
|
+
{
|
63
|
+
DELETE(f->tag);
|
64
|
+
DELETE(f->link);
|
65
|
+
DELETE(f->title);
|
66
|
+
}
|
67
|
+
|
68
|
+
|
69
|
+
/* bye bye footnotes.
|
70
|
+
*/
|
71
|
+
void
|
72
|
+
___mkd_freefootnotes(MMIOT *f)
|
73
|
+
{
|
74
|
+
int i;
|
75
|
+
|
76
|
+
if ( f->footnotes ) {
|
77
|
+
for (i=0; i < S(*f->footnotes); i++)
|
78
|
+
___mkd_freefootnote( &T(*f->footnotes)[i] );
|
79
|
+
DELETE(*f->footnotes);
|
80
|
+
free(f->footnotes);
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
|
85
|
+
/* initialize a new MMIOT
|
86
|
+
*/
|
87
|
+
void
|
88
|
+
___mkd_initmmiot(MMIOT *f, void *footnotes)
|
89
|
+
{
|
90
|
+
if ( f ) {
|
91
|
+
memset(f, 0, sizeof *f);
|
92
|
+
CREATE(f->in);
|
93
|
+
CREATE(f->out);
|
94
|
+
CREATE(f->Q);
|
95
|
+
if ( footnotes )
|
96
|
+
f->footnotes = footnotes;
|
97
|
+
else {
|
98
|
+
f->footnotes = malloc(sizeof f->footnotes[0]);
|
99
|
+
CREATE(*f->footnotes);
|
100
|
+
}
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
|
105
|
+
/* free the contents of a MMIOT, but leave the object alone.
|
106
|
+
*/
|
107
|
+
void
|
108
|
+
___mkd_freemmiot(MMIOT *f, void *footnotes)
|
109
|
+
{
|
110
|
+
if ( f ) {
|
111
|
+
DELETE(f->in);
|
112
|
+
DELETE(f->out);
|
113
|
+
DELETE(f->Q);
|
114
|
+
if ( f->footnotes != footnotes )
|
115
|
+
___mkd_freefootnotes(f);
|
116
|
+
memset(f, 0, sizeof *f);
|
117
|
+
}
|
118
|
+
}
|
119
|
+
|
120
|
+
|
121
|
+
/* free lines up to an barrier.
|
122
|
+
*/
|
123
|
+
void
|
124
|
+
___mkd_freeLineRange(Line *anchor, Line *stop)
|
125
|
+
{
|
126
|
+
Line *r = anchor->next;
|
127
|
+
|
128
|
+
if ( r != stop ) {
|
129
|
+
while ( r && (r->next != stop) )
|
130
|
+
r = r->next;
|
131
|
+
if ( r ) r->next = 0;
|
132
|
+
___mkd_freeLines(anchor->next);
|
133
|
+
}
|
134
|
+
anchor->next = 0;
|
135
|
+
}
|
136
|
+
|
137
|
+
|
138
|
+
/* clean up everything allocated in __mkd_compile()
|
139
|
+
*/
|
140
|
+
void
|
141
|
+
mkd_cleanup(Document *doc)
|
142
|
+
{
|
143
|
+
if ( doc && (doc->magic == VALID_DOCUMENT) ) {
|
144
|
+
if ( doc->ctx ) {
|
145
|
+
___mkd_freemmiot(doc->ctx, 0);
|
146
|
+
free(doc->ctx);
|
147
|
+
}
|
148
|
+
|
149
|
+
if ( doc->code) ___mkd_freeParagraph(doc->code);
|
150
|
+
if ( doc->title) ___mkd_freeLine(doc->title);
|
151
|
+
if ( doc->author) ___mkd_freeLine(doc->author);
|
152
|
+
if ( doc->date) ___mkd_freeLine(doc->date);
|
153
|
+
if ( T(doc->content) ) ___mkd_freeLines(T(doc->content));
|
154
|
+
memset(doc, 0, sizeof doc[0]);
|
155
|
+
free(doc);
|
156
|
+
}
|
157
|
+
}
|
data/ext/tags.c
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
/* block-level tags for passing html blocks through the blender
|
2
|
+
*/
|
3
|
+
#define __WITHOUT_AMALLOC 1
|
4
|
+
#include "cstring.h"
|
5
|
+
#include "tags.h"
|
6
|
+
|
7
|
+
STRING(struct kw) blocktags;
|
8
|
+
|
9
|
+
|
10
|
+
/* define a html block tag
|
11
|
+
*/
|
12
|
+
void
|
13
|
+
mkd_define_tag(char *id, int selfclose)
|
14
|
+
{
|
15
|
+
struct kw *p = &EXPAND(blocktags);
|
16
|
+
|
17
|
+
p->id = id;
|
18
|
+
p->size = strlen(id);
|
19
|
+
p->selfclose = selfclose;
|
20
|
+
}
|
21
|
+
|
22
|
+
|
23
|
+
/* case insensitive string sort (for qsort() and bsearch() of block tags)
|
24
|
+
*/
|
25
|
+
static int
|
26
|
+
casort(struct kw *a, struct kw *b)
|
27
|
+
{
|
28
|
+
if ( a->size != b->size )
|
29
|
+
return a->size - b->size;
|
30
|
+
return strncasecmp(a->id, b->id, b->size);
|
31
|
+
}
|
32
|
+
|
33
|
+
|
34
|
+
/* stupid cast to make gcc shut up about the function types being
|
35
|
+
* passed into qsort() and bsearch()
|
36
|
+
*/
|
37
|
+
typedef int (*stfu)(const void*,const void*);
|
38
|
+
|
39
|
+
|
40
|
+
/* sort the list of html block tags for later searching
|
41
|
+
*/
|
42
|
+
void
|
43
|
+
mkd_sort_tags()
|
44
|
+
{
|
45
|
+
qsort(T(blocktags), S(blocktags), sizeof(struct kw), (stfu)casort);
|
46
|
+
}
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
/* look for a token in the html block tag list
|
51
|
+
*/
|
52
|
+
struct kw*
|
53
|
+
mkd_search_tags(char *pat, int len)
|
54
|
+
{
|
55
|
+
struct kw key;
|
56
|
+
|
57
|
+
key.id = pat;
|
58
|
+
key.size = len;
|
59
|
+
|
60
|
+
return bsearch(&key, T(blocktags), S(blocktags), sizeof key, (stfu)casort);
|
61
|
+
}
|
62
|
+
|
63
|
+
|
64
|
+
static int populated = 0;
|
65
|
+
|
66
|
+
|
67
|
+
/* load in the standard collection of html tags that markdown supports
|
68
|
+
*/
|
69
|
+
void
|
70
|
+
mkd_prepare_tags()
|
71
|
+
{
|
72
|
+
|
73
|
+
#define KW(x) mkd_define_tag(x, 0)
|
74
|
+
#define SC(x) mkd_define_tag(x, 1)
|
75
|
+
|
76
|
+
if ( populated ) return;
|
77
|
+
populated = 1;
|
78
|
+
|
79
|
+
KW("STYLE");
|
80
|
+
KW("SCRIPT");
|
81
|
+
KW("ADDRESS");
|
82
|
+
KW("BDO");
|
83
|
+
KW("BLOCKQUOTE");
|
84
|
+
KW("CENTER");
|
85
|
+
KW("DFN");
|
86
|
+
KW("DIV");
|
87
|
+
KW("OBJECT");
|
88
|
+
KW("H1");
|
89
|
+
KW("H2");
|
90
|
+
KW("H3");
|
91
|
+
KW("H4");
|
92
|
+
KW("H5");
|
93
|
+
KW("H6");
|
94
|
+
KW("LISTING");
|
95
|
+
KW("NOBR");
|
96
|
+
KW("UL");
|
97
|
+
KW("P");
|
98
|
+
KW("OL");
|
99
|
+
KW("DL");
|
100
|
+
KW("PLAINTEXT");
|
101
|
+
KW("PRE");
|
102
|
+
KW("TABLE");
|
103
|
+
KW("WBR");
|
104
|
+
KW("XMP");
|
105
|
+
SC("HR");
|
106
|
+
SC("BR");
|
107
|
+
KW("IFRAME");
|
108
|
+
KW("MAP");
|
109
|
+
|
110
|
+
mkd_sort_tags();
|
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 */
|