rdiscount 2.0.7.3 → 2.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/ext/markdown.h CHANGED
@@ -23,10 +23,20 @@ typedef struct footnote {
23
23
  * that all tabs will be expanded to spaces!], and a pointer to
24
24
  * the next line.
25
25
  */
26
+ typedef enum { chk_text, chk_code,
27
+ chk_hr, chk_dash,
28
+ chk_tilde, chk_backtick,
29
+ chk_equal } line_type;
26
30
  typedef struct line {
27
31
  Cstring text;
28
32
  struct line *next;
29
- int dle;
33
+ int dle; /* leading indent on the line */
34
+ int flags; /* special attributes for this line */
35
+ #define PIPECHAR 0x01 /* line contains a | */
36
+ #define CHECKED 0x02
37
+
38
+ line_type kind;
39
+ int count;
30
40
  } Line;
31
41
 
32
42
 
@@ -71,6 +81,12 @@ typedef struct callback_data {
71
81
  } Callback_data;
72
82
 
73
83
 
84
+ struct escaped {
85
+ char *text;
86
+ struct escaped *up;
87
+ } ;
88
+
89
+
74
90
  /* a magic markdown io thing holds all the data structures needed to
75
91
  * do the backend processing of a markdown document
76
92
  */
@@ -80,6 +96,7 @@ typedef struct mmiot {
80
96
  Qblock Q;
81
97
  int isp;
82
98
  int reference;
99
+ struct escaped *esc;
83
100
  char *ref_prefix;
84
101
  STRING(Footnote) *footnotes;
85
102
  DWORD flags;
@@ -105,6 +122,7 @@ typedef struct mmiot {
105
122
  #define MKD_NOALPHALIST 0x00080000
106
123
  #define MKD_NODLIST 0x00100000
107
124
  #define MKD_EXTRA_FOOTNOTE 0x00200000
125
+ #define MKD_NOSTYLE 0x00400000
108
126
  #define IS_LABEL 0x08000000
109
127
  #define USER_FLAGS 0x0FFFFFFF
110
128
  #define INPUT_MASK (MKD_NOHEADER|MKD_TABSTOP)
@@ -137,6 +155,16 @@ typedef struct document {
137
155
  } Document;
138
156
 
139
157
 
158
+ /*
159
+ * economy FILE-type structure for pulling characters out of a
160
+ * fixed-length string.
161
+ */
162
+ struct string_stream {
163
+ const char *data; /* the unread data */
164
+ int size; /* and how much is there? */
165
+ } ;
166
+
167
+
140
168
  extern int mkd_firstnonblank(Line *);
141
169
  extern int mkd_compile(Document *, DWORD);
142
170
  extern int mkd_document(Document *, char **);
@@ -156,7 +184,10 @@ typedef int (*mkd_sta_function_t)(const int,const void*);
156
184
  extern void mkd_string_to_anchor(char*,int, mkd_sta_function_t, void*, int);
157
185
 
158
186
  extern Document *mkd_in(FILE *, DWORD);
159
- extern Document *mkd_string(char*,int, DWORD);
187
+ extern Document *mkd_string(const char*,int, DWORD);
188
+
189
+ extern Document *gfm_in(FILE *, DWORD);
190
+ extern Document *gfm_string(const char*,int, DWORD);
160
191
 
161
192
  extern void mkd_initialize();
162
193
  extern void mkd_shlib_destructor();
@@ -174,8 +205,14 @@ extern void ___mkd_initmmiot(MMIOT *, void *);
174
205
  extern void ___mkd_freemmiot(MMIOT *, void *);
175
206
  extern void ___mkd_freeLineRange(Line *, Line *);
176
207
  extern void ___mkd_xml(char *, int, FILE *);
177
- extern void ___mkd_reparse(char *, int, int, MMIOT*);
208
+ extern void ___mkd_reparse(char *, int, int, MMIOT*, char*);
178
209
  extern void ___mkd_emblock(MMIOT*);
179
210
  extern void ___mkd_tidy(Cstring *);
180
211
 
212
+ extern Document *__mkd_new_Document();
213
+ extern void __mkd_enqueue(Document*, Cstring *);
214
+ extern void __mkd_header_dle(Line *);
215
+
216
+ extern int __mkd_io_strget(struct string_stream *);
217
+
181
218
  #endif/*_MARKDOWN_D*/
data/ext/mkdio.c CHANGED
@@ -18,13 +18,13 @@ typedef ANCHOR(Line) LineAnchor;
18
18
 
19
19
  /* create a new blank Document
20
20
  */
21
- static Document*
22
- new_Document()
21
+ Document*
22
+ __mkd_new_Document()
23
23
  {
24
24
  Document *ret = calloc(sizeof(Document), 1);
25
25
 
26
26
  if ( ret ) {
27
- if (( ret->ctx = calloc(sizeof(MMIOT), 1) )) {
27
+ if ( ret->ctx = calloc(sizeof(MMIOT), 1) ) {
28
28
  ret->magic = VALID_DOCUMENT;
29
29
  return ret;
30
30
  }
@@ -34,10 +34,11 @@ new_Document()
34
34
  }
35
35
 
36
36
 
37
- /* add a line to the markdown input chain
37
+ /* add a line to the markdown input chain, expanding tabs and
38
+ * noting the presence of special characters as we go.
38
39
  */
39
- static void
40
- queue(Document* a, Cstring *line)
40
+ void
41
+ __mkd_enqueue(Document* a, Cstring *line)
41
42
  {
42
43
  Line *p = calloc(sizeof *p, 1);
43
44
  unsigned char c;
@@ -60,6 +61,8 @@ queue(Document* a, Cstring *line)
60
61
  } while ( ++xp % a->tabstop );
61
62
  }
62
63
  else if ( c >= ' ' ) {
64
+ if ( c == '|' )
65
+ p->flags |= PIPECHAR;
63
66
  EXPAND(p->text) = c;
64
67
  ++xp;
65
68
  }
@@ -72,8 +75,8 @@ queue(Document* a, Cstring *line)
72
75
 
73
76
  /* trim leading blanks from a header line
74
77
  */
75
- static void
76
- header_dle(Line *p)
78
+ void
79
+ __mkd_header_dle(Line *p)
77
80
  {
78
81
  CLIP(p->text, 0, 1);
79
82
  p->dle = mkd_firstnonblank(p);
@@ -88,7 +91,7 @@ Document *
88
91
  populate(getc_func getc, void* ctx, int flags)
89
92
  {
90
93
  Cstring line;
91
- Document *a = new_Document();
94
+ Document *a = __mkd_new_Document();
92
95
  int c;
93
96
  int pandoc = 0;
94
97
 
@@ -106,7 +109,7 @@ populate(getc_func getc, void* ctx, int flags)
106
109
  else
107
110
  pandoc = EOF;
108
111
  }
109
- queue(a, &line);
112
+ __mkd_enqueue(a, &line);
110
113
  S(line) = 0;
111
114
  }
112
115
  else if ( isprint(c) || isspace(c) || (c & 0x80) )
@@ -114,7 +117,7 @@ populate(getc_func getc, void* ctx, int flags)
114
117
  }
115
118
 
116
119
  if ( S(line) )
117
- queue(a, &line);
120
+ __mkd_enqueue(a, &line);
118
121
 
119
122
  DELETE(line);
120
123
 
@@ -125,9 +128,9 @@ populate(getc_func getc, void* ctx, int flags)
125
128
  */
126
129
  Line *headers = T(a->content);
127
130
 
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
+ a->title = headers; __mkd_header_dle(a->title);
132
+ a->author= headers->next; __mkd_header_dle(a->author);
133
+ a->date = headers->next->next; __mkd_header_dle(a->date);
131
134
 
132
135
  T(a->content) = headers->next->next->next;
133
136
  }
@@ -147,14 +150,8 @@ mkd_in(FILE *f, DWORD flags)
147
150
 
148
151
  /* return a single character out of a buffer
149
152
  */
150
- struct string_ctx {
151
- char *data; /* the unread data */
152
- int size; /* and how much is there? */
153
- } ;
154
-
155
-
156
- static int
157
- strget(struct string_ctx *in)
153
+ int
154
+ __mkd_io_strget(struct string_stream *in)
158
155
  {
159
156
  if ( !in->size ) return EOF;
160
157
 
@@ -167,14 +164,14 @@ strget(struct string_ctx *in)
167
164
  /* convert a block of text into a linked list
168
165
  */
169
166
  Document *
170
- mkd_string(char *buf, int len, DWORD flags)
167
+ mkd_string(const char *buf, int len, DWORD flags)
171
168
  {
172
- struct string_ctx about;
169
+ struct string_stream about;
173
170
 
174
171
  about.data = buf;
175
172
  about.size = len;
176
173
 
177
- return populate((getc_func)strget, &about, flags & INPUT_MASK);
174
+ return populate((getc_func)__mkd_io_strget, &about, flags & INPUT_MASK);
178
175
  }
179
176
 
180
177
 
@@ -225,7 +222,7 @@ mkd_string_to_anchor(char *s, int len, mkd_sta_function_t outchar,
225
222
 
226
223
  size = mkd_line(s, len, &line, IS_LABEL);
227
224
 
228
- if ( labelformat && size && !isalpha(line[0]) )
225
+ if ( labelformat && (size>0) && !isalpha(line[0]) )
229
226
  (*outchar)('L',out);
230
227
  for ( i=0; i < size ; i++ ) {
231
228
  c = line[i];
@@ -233,7 +230,7 @@ mkd_string_to_anchor(char *s, int len, mkd_sta_function_t outchar,
233
230
  if ( isalnum(c) || (c == '_') || (c == ':') || (c == '-') || (c == '.' ) )
234
231
  (*outchar)(c, out);
235
232
  else
236
- (*outchar)('.',out);
233
+ (*outchar)('.', out);
237
234
  }
238
235
  else
239
236
  (*outchar)(c,out);
@@ -251,7 +248,7 @@ mkd_parse_line(char *bfr, int size, MMIOT *f, int flags)
251
248
  {
252
249
  ___mkd_initmmiot(f, 0);
253
250
  f->flags = flags & USER_FLAGS;
254
- ___mkd_reparse(bfr, size, 0, f);
251
+ ___mkd_reparse(bfr, size, 0, f, 0);
255
252
  ___mkd_emblock(f);
256
253
  }
257
254
 
data/ext/mkdio.h CHANGED
@@ -10,7 +10,12 @@ typedef unsigned int mkd_flag_t;
10
10
  /* line builder for markdown()
11
11
  */
12
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 */
13
+ MMIOT *mkd_string(const char*,int,mkd_flag_t); /* assemble input from a buffer */
14
+
15
+ /* line builder for github flavoured markdown
16
+ */
17
+ MMIOT *gfm_in(FILE*,mkd_flag_t); /* assemble input from a file */
18
+ MMIOT *gfm_string(const char*,int,mkd_flag_t); /* assemble input from a buffer */
14
19
 
15
20
  void mkd_basename(MMIOT*,char*);
16
21
 
@@ -21,7 +26,7 @@ void mkd_shlib_destructor();
21
26
  /* compilation, debugging, cleanup
22
27
  */
23
28
  int mkd_compile(MMIOT*, mkd_flag_t);
24
- int mkd_cleanup(MMIOT*);
29
+ void mkd_cleanup(MMIOT*);
25
30
 
26
31
  /* markup functions
27
32
  */
@@ -84,6 +89,7 @@ void mkd_ref_prefix(MMIOT*, char*);
84
89
  #define MKD_TAGTEXT 0x00000020 /* process text inside an html tag; no
85
90
  * <em>, no <bold>, no html or [] expansion */
86
91
  #define MKD_NO_EXT 0x00000040 /* don't allow pseudo-protocols */
92
+ #define MKD_NOEXT MKD_NO_EXT /* ^^^ (aliased for user convenience) */
87
93
  #define MKD_CDATA 0x00000080 /* generate code for xml ![CDATA[...]] */
88
94
  #define MKD_NOSUPERSCRIPT 0x00000100 /* no A^B */
89
95
  #define MKD_NORELAXED 0x00000200 /* emphasis happens /everywhere/ */
@@ -99,6 +105,7 @@ void mkd_ref_prefix(MMIOT*, char*);
99
105
  #define MKD_NOALPHALIST 0x00080000 /* forbid alphabetic lists */
100
106
  #define MKD_NODLIST 0x00100000 /* forbid definition lists */
101
107
  #define MKD_EXTRA_FOOTNOTE 0x00200000 /* enable markdown extra-style footnotes */
108
+ #define MKD_NOSTYLE 0x00400000 /* don't extract <style> blocks */
102
109
  #define MKD_EMBED MKD_NOLINKS|MKD_NOIMAGE|MKD_TAGTEXT
103
110
 
104
111
  /* special flags for mkd_in() and mkd_string()
data/ext/mktags.c ADDED
@@ -0,0 +1,89 @@
1
+ /* block-level tags for passing html blocks through the blender
2
+ */
3
+ #include <stdio.h>
4
+
5
+ #define __WITHOUT_AMALLOC 1
6
+ #include "cstring.h"
7
+ #include "tags.h"
8
+
9
+ STRING(struct kw) blocktags;
10
+
11
+
12
+ /* define a html block tag
13
+ */
14
+ static void
15
+ define_one_tag(char *id, int selfclose)
16
+ {
17
+ struct kw *p = &EXPAND(blocktags);
18
+
19
+ p->id = id;
20
+ p->size = strlen(id);
21
+ p->selfclose = selfclose;
22
+ }
23
+
24
+
25
+ /* case insensitive string sort (for qsort() and bsearch() of block tags)
26
+ */
27
+ static int
28
+ casort(struct kw *a, struct kw *b)
29
+ {
30
+ if ( a->size != b->size )
31
+ return a->size - b->size;
32
+ return strncasecmp(a->id, b->id, b->size);
33
+ }
34
+
35
+
36
+ /* stupid cast to make gcc shut up about the function types being
37
+ * passed into qsort() and bsearch()
38
+ */
39
+ typedef int (*stfu)(const void*,const void*);
40
+
41
+
42
+ /* load in the standard collection of html tags that markdown supports
43
+ */
44
+ main()
45
+ {
46
+ int i;
47
+
48
+ #define KW(x) define_one_tag(x, 0)
49
+ #define SC(x) define_one_tag(x, 1)
50
+
51
+ KW("STYLE");
52
+ KW("SCRIPT");
53
+ KW("ADDRESS");
54
+ KW("BDO");
55
+ KW("BLOCKQUOTE");
56
+ KW("CENTER");
57
+ KW("DFN");
58
+ KW("DIV");
59
+ KW("OBJECT");
60
+ KW("H1");
61
+ KW("H2");
62
+ KW("H3");
63
+ KW("H4");
64
+ KW("H5");
65
+ KW("H6");
66
+ KW("LISTING");
67
+ KW("NOBR");
68
+ KW("UL");
69
+ KW("P");
70
+ KW("OL");
71
+ KW("DL");
72
+ KW("PLAINTEXT");
73
+ KW("PRE");
74
+ KW("TABLE");
75
+ KW("WBR");
76
+ KW("XMP");
77
+ SC("HR");
78
+ KW("IFRAME");
79
+ KW("MAP");
80
+
81
+ qsort(T(blocktags), S(blocktags), sizeof(struct kw), (stfu)casort);
82
+
83
+ printf("static struct kw blocktags[] = {\n");
84
+ for (i=0; i < S(blocktags); i++)
85
+ printf(" { \"%s\", %d, %d },\n", T(blocktags)[i].id, T(blocktags)[i].size, T(blocktags)[i].selfclose );
86
+ printf("};\n\n");
87
+ printf("#define NR_blocktags %d\n", S(blocktags));
88
+ exit(0);
89
+ }
data/ext/pgm_options.c ADDED
@@ -0,0 +1,138 @@
1
+ /* markdown: a C implementation of John Gruber's Markdown markup language.
2
+ *
3
+ * Copyright (C) 2007-2011 David L Parsons.
4
+ * The redistribution terms are provided in the COPYRIGHT file that must
5
+ * be distributed with this source code.
6
+ */
7
+
8
+ #include <stdio.h>
9
+ #include <stdlib.h>
10
+ #include <limits.h>
11
+ #include <unistd.h>
12
+ #include <mkdio.h>
13
+ #include <errno.h>
14
+ #include <string.h>
15
+ #include <stdarg.h>
16
+
17
+ #include "config.h"
18
+ #include "amalloc.h"
19
+
20
+ #if HAVE_LIBGEN_H
21
+ #include <libgen.h>
22
+ #endif
23
+
24
+ static struct _opt {
25
+ char *name;
26
+ char *desc;
27
+ int off;
28
+ int skip;
29
+ int sayenable;
30
+ mkd_flag_t flag;
31
+ } opts[] = {
32
+ { "tabstop", "default (4-space) tabstops", 0, 0, 1, MKD_TABSTOP },
33
+ { "image", "images", 1, 0, 1, MKD_NOIMAGE },
34
+ { "links", "links", 1, 0, 1, MKD_NOLINKS },
35
+ { "relax", "emphasis inside words", 1, 1, 1, MKD_STRICT },
36
+ { "strict", "emphasis inside words", 0, 0, 1, MKD_STRICT },
37
+ { "tables", "tables", 1, 0, 1, MKD_NOTABLES },
38
+ { "header", "pandoc-style headers", 1, 0, 1, MKD_NOHEADER },
39
+ { "html", "raw html", 1, 0, 1, MKD_NOHTML },
40
+ { "ext", "extended protocols", 1, 0, 1, MKD_NO_EXT },
41
+ { "cdata", "generate cdata", 0, 0, 0, MKD_CDATA },
42
+ { "smarty", "smartypants", 1, 0, 1, MKD_NOPANTS },
43
+ { "pants", "smartypants", 1, 1, 1, MKD_NOPANTS },
44
+ { "toc", "tables of contents", 0, 0, 1, MKD_TOC },
45
+ { "autolink", "autolinking", 0, 0, 1, MKD_AUTOLINK },
46
+ { "safelink", "safe links", 0, 0, 1, MKD_SAFELINK },
47
+ { "strikethrough", "strikethrough", 1, 0, 1, MKD_NOSTRIKETHROUGH },
48
+ { "del", "strikethrough", 1, 1, 1, MKD_NOSTRIKETHROUGH },
49
+ { "superscript", "superscript", 1, 0, 1, MKD_NOSUPERSCRIPT },
50
+ { "emphasis", "emphasis inside words", 0, 0, 1, MKD_NORELAXED },
51
+ { "divquote", ">%class% blockquotes", 1, 0, 1, MKD_NODIVQUOTE },
52
+ { "alphalist", "alpha lists", 1, 0, 1, MKD_NOALPHALIST },
53
+ { "definitionlist","definition lists", 1, 0, 1, MKD_NODLIST },
54
+ { "1.0", "markdown 1.0 compatibility", 0, 0, 1, MKD_1_COMPAT },
55
+ { "footnotes", "markdown extra footnotes", 0, 0, 1, MKD_EXTRA_FOOTNOTE },
56
+ { "footnote", "markdown extra footnotes", 0, 1, 1, MKD_EXTRA_FOOTNOTE },
57
+ { "style", "extract style blocks", 1, 0, 1, MKD_NOSTYLE },
58
+ } ;
59
+
60
+ #define NR(x) (sizeof x / sizeof x[0])
61
+
62
+
63
+ typedef int (*stfu)(const void *, const void *);
64
+
65
+ int
66
+ sort_by_name(struct _opt *a, struct _opt *b)
67
+ {
68
+ return strcmp(a->name,b->name);
69
+ }
70
+
71
+ int
72
+ sort_by_flag(struct _opt *a, struct _opt *b)
73
+ {
74
+ return a->flag - b->flag;
75
+ }
76
+
77
+
78
+ void
79
+ show_flags(int byname)
80
+ {
81
+ int i;
82
+
83
+ if ( byname ) {
84
+ qsort(opts, NR(opts), sizeof(opts[0]), (stfu)sort_by_name);
85
+
86
+ for (i=0; i < NR(opts); i++)
87
+ if ( ! opts[i].skip )
88
+ fprintf(stderr, "%16s : %s\n", opts[i].name, opts[i].desc);
89
+ }
90
+ else {
91
+ qsort(opts, NR(opts), sizeof(opts[0]), (stfu)sort_by_flag);
92
+
93
+ for (i=0; i < NR(opts); i++)
94
+ if ( ! opts[i].skip ) {
95
+ fprintf(stderr, "%08lx : ", (long)opts[i].flag);
96
+ if ( opts[i].sayenable )
97
+ fprintf(stderr, opts[i].off ? "disable " : "enable ");
98
+ fprintf(stderr, "%s\n", opts[i].desc);
99
+ }
100
+ }
101
+ }
102
+
103
+
104
+ int
105
+ set_flag(mkd_flag_t *flags, char *optionstring)
106
+ {
107
+ int i;
108
+ int enable;
109
+ char *arg;
110
+
111
+ for ( arg = strtok(optionstring, ","); arg; arg = strtok(NULL, ",") ) {
112
+ if ( *arg == '+' || *arg == '-' )
113
+ enable = (*arg++ == '+') ? 1 : 0;
114
+ else if ( strncasecmp(arg, "no", 2) == 0 ) {
115
+ arg += 2;
116
+ enable = 0;
117
+ }
118
+ else
119
+ enable = 1;
120
+
121
+ for ( i=0; i < NR(opts); i++ )
122
+ if ( strcasecmp(arg, opts[i].name) == 0 )
123
+ break;
124
+
125
+ if ( i < NR(opts) ) {
126
+ if ( opts[i].off )
127
+ enable = !enable;
128
+
129
+ if ( enable )
130
+ *flags |= opts[i].flag;
131
+ else
132
+ *flags &= ~opts[i].flag;
133
+ }
134
+ else
135
+ return 0;
136
+ }
137
+ return 1;
138
+ }