rdiscount-dsc 1.6.9
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/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 */
|