pixeltrix-rdiscount 1.2.11 → 1.3.4

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/Rakefile CHANGED
@@ -1,43 +1,75 @@
1
1
  require 'rake/clean'
2
- require 'rake/packagetask'
3
- require 'rake/gempackagetask'
4
2
 
5
- task :default => 'test:unit'
3
+ task :default => :test
6
4
 
7
- DLEXT = Config::CONFIG['DLEXT']
8
- VERS = '1.2.11'
9
-
10
- spec =
11
- Gem::Specification.new do |s|
12
- s.name = "rdiscount"
13
- s.version = VERS
14
- s.summary = "Fast Implementation of Gruber's Markdown in C"
15
- s.files = FileList['README.markdown','COPYING','Rakefile','test/**','{lib,ext}/**.rb','ext/*.{c,h}']
16
- s.bindir = 'bin'
17
- s.require_path = 'lib'
18
- s.has_rdoc = true
19
- s.extra_rdoc_files = ['COPYING']
20
- s.test_files = FileList['test/*_test.rb']
21
- s.extensions = ['ext/extconf.rb']
22
-
23
- s.author = 'Ryan Tomayko'
24
- s.email = 'r@tomayko.com'
25
- s.homepage = 'http://github.com/rtomayko/rdiscount'
26
- s.rubyforge_project = 'wink'
27
- end
5
+ # PACKAGING =================================================================
28
6
 
29
- Rake::GemPackageTask.new(spec) do |p|
30
- p.gem_spec = spec
31
- p.need_tar_gz = true
32
- p.need_tar = false
33
- p.need_zip = false
7
+ # Load the gemspec using the same limitations as github
8
+ $spec =
9
+ begin
10
+ require 'rubygems/specification'
11
+ data = File.read('rdiscount.gemspec')
12
+ spec = nil
13
+ Thread.new { spec = eval("$SAFE = 3\n#{data}") }.join
14
+ spec
34
15
  end
35
16
 
17
+ def package(ext='')
18
+ "pkg/rdiscount-#{$spec.version}" + ext
19
+ end
20
+
21
+ desc 'Build packages'
22
+ task :package => %w[.gem .tar.gz].map {|e| package(e)}
23
+
24
+ desc 'Build and install as local gem'
25
+ task :install => package('.gem') do
26
+ sh "gem install #{package('.gem')}"
27
+ end
28
+
29
+ directory 'pkg/'
30
+
31
+ file package('.gem') => %w[pkg/ rdiscount.gemspec] + $spec.files do |f|
32
+ sh "gem build rdiscount.gemspec"
33
+ mv File.basename(f.name), f.name
34
+ end
35
+
36
+ file package('.tar.gz') => %w[pkg/] + $spec.files do |f|
37
+ sh "git archive --format=tar HEAD | gzip > #{f.name}"
38
+ end
39
+
40
+ # GEMSPEC HELPERS ==========================================================
41
+
42
+ def source_version
43
+ line = File.read('lib/rdiscount.rb')[/^\s*VERSION = .*/]
44
+ line.match(/.*VERSION = '(.*)'/)[1]
45
+ end
46
+
47
+ file 'rdiscount.gemspec' => FileList['Rakefile','lib/rdiscount.rb'] do |f|
48
+ # read spec file and split out manifest section
49
+ spec = File.read(f.name)
50
+ head, manifest, tail = spec.split(" # = MANIFEST =\n")
51
+ head.sub!(/\.version = '.*'/, ".version = '#{source_version}'")
52
+ head.sub!(/\.date = '.*'/, ".date = '#{Date.today.to_s}'")
53
+ # determine file list from git ls-files
54
+ files = `git ls-files`.
55
+ split("\n").
56
+ sort.
57
+ reject{ |file| file =~ /^\./ || file =~ /^test\/MarkdownTest/ }.
58
+ map{ |file| " #{file}" }.
59
+ join("\n")
60
+ # piece file back together and write...
61
+ manifest = " s.files = %w[\n#{files}\n ]\n"
62
+ spec = [head,manifest,tail].join(" # = MANIFEST =\n")
63
+ File.open(f.name, 'w') { |io| io.write(spec) }
64
+ puts "updated #{f.name}"
65
+ end
36
66
 
37
67
  # ==========================================================
38
68
  # Ruby Extension
39
69
  # ==========================================================
40
70
 
71
+ DLEXT = Config::CONFIG['DLEXT']
72
+
41
73
  file 'ext/Makefile' => FileList['ext/{*.c,*.h,*.rb}'] do
42
74
  chdir('ext') { ruby 'extconf.rb' }
43
75
  end
@@ -55,7 +87,6 @@ end
55
87
  desc 'Build the rdiscount extension'
56
88
  task :build => "lib/rdiscount.#{DLEXT}"
57
89
 
58
-
59
90
  # ==========================================================
60
91
  # Testing
61
92
  # ==========================================================
@@ -68,14 +99,17 @@ end
68
99
  desc 'Run conformance tests (MARKDOWN_TEST_VER=1.0)'
69
100
  task 'test:conformance' => [:build] do |t|
70
101
  script = "#{pwd}/bin/rdiscount"
71
- test_version = ENV['MARKDOWN_TEST_VER'] || '1.0'
102
+ test_version = ENV['MARKDOWN_TEST_VER'] || '1.0.3'
72
103
  chdir("test/MarkdownTest_#{test_version}") do
73
104
  sh "./MarkdownTest.pl --script='#{script}' --tidy"
74
105
  end
75
106
  end
76
107
 
77
108
  desc 'Run version 1.0 conformance suite'
78
- task 'test:conformance:1.0' => 'test:conformance'
109
+ task 'test:conformance:1.0' => [:build] do |t|
110
+ ENV['MARKDOWN_TEST_VER'] = '1.0'
111
+ Rake::Task['test:conformance'].invoke
112
+ end
79
113
 
80
114
  desc 'Run 1.0.3 conformance suite'
81
115
  task 'test:conformance:1.0.3' => [:build] do |t|
@@ -119,13 +153,11 @@ CLEAN.include 'doc'
119
153
  # Rubyforge
120
154
  # ==========================================================
121
155
 
122
- PKGNAME = "pkg/rdiscount-#{VERS}"
123
-
124
156
  desc 'Publish new release to rubyforge'
125
- task :release => [ "#{PKGNAME}.gem", "#{PKGNAME}.tar.gz" ] do |t|
157
+ task :release => [package('.gem'), package('.tar.gz')] do |t|
126
158
  sh <<-end
127
- rubyforge add_release wink rdiscount #{VERS} #{PKGNAME}.gem &&
128
- rubyforge add_file wink rdiscount #{VERS} #{PKGNAME}.tar.gz
159
+ rubyforge add_release wink rdiscount #{$spec.version} #{package('.gem')} &&
160
+ rubyforge add_file wink rdiscount #{$spec.version} #{package('.tar.gz')}
129
161
  end
130
162
  end
131
163
 
@@ -143,7 +175,7 @@ task :gather => 'discount' do |t|
143
175
  files =
144
176
  FileList[
145
177
  'discount/{markdown,mkdio,amalloc,cstring}.h',
146
- 'discount/{markdown,docheader,dumptree,generate,mkdio,resource}.c'
178
+ 'discount/{markdown,docheader,dumptree,generate,mkdio,resource,toc,Csio}.c'
147
179
  ]
148
180
  cp files, 'ext/',
149
181
  :preserve => true,
@@ -0,0 +1,49 @@
1
+ #include <stdio.h>
2
+ #include <string.h>
3
+ #include <stdarg.h>
4
+ #include "cstring.h"
5
+ #include "markdown.h"
6
+ #include "amalloc.h"
7
+
8
+
9
+ /* putc() into a cstring
10
+ */
11
+ void
12
+ Csputc(int c, Cstring *iot)
13
+ {
14
+ EXPAND(*iot) = c;
15
+ }
16
+
17
+
18
+ /* printf() into a cstring
19
+ */
20
+ int
21
+ Csprintf(Cstring *iot, char *fmt, ...)
22
+ {
23
+ va_list ptr;
24
+ int siz=100;
25
+
26
+ do {
27
+ RESERVE(*iot, siz);
28
+ va_start(ptr, fmt);
29
+ siz = vsnprintf(T(*iot)+S(*iot), ALL(*iot)-S(*iot), fmt, ptr);
30
+ va_end(ptr);
31
+ } while ( siz > (ALL(*iot)-S(*iot)) );
32
+
33
+ S(*iot) += siz;
34
+ return siz;
35
+ }
36
+
37
+
38
+ /* reparse() into a cstring
39
+ */
40
+ void
41
+ Csreparse(Cstring *iot, char *buf, int size, int flags)
42
+ {
43
+ MMIOT f;
44
+ ___mkd_initmmiot(&f, 0);
45
+ ___mkd_reparse(buf, size, 0, &f);
46
+ ___mkd_emblock(&f);
47
+ SUFFIX(*iot, T(f.out), S(f.out));
48
+ ___mkd_freemmiot(&f, 0);
49
+ }
@@ -50,6 +50,7 @@
50
50
  */
51
51
  #define T(x) (x).text
52
52
  #define S(x) (x).size
53
+ #define ALL(x) (x).alloc
53
54
 
54
55
  /* abstract anchor type that defines a list base
55
56
  * with a function that attaches an element to
@@ -65,4 +66,8 @@
65
66
 
66
67
  typedef STRING(char) Cstring;
67
68
 
69
+ extern void Csputc(int, Cstring *);
70
+ extern int Csprintf(Cstring *, char *, ...);
71
+ extern void Csreparse(Cstring *, char *, int, int);
72
+
68
73
  #endif/*_CSTRING_D*/
@@ -4,11 +4,5 @@ dir_config('rdiscount')
4
4
 
5
5
  HAVE_RANDOM = have_func('random')
6
6
  HAVE_SRANDOM = have_func('srandom')
7
- HAVE_FUNOPEN = have_func('funopen')
8
- HAVE_FOPENCOOKIE = have_func('fopencookie')
9
-
10
- unless HAVE_FUNOPEN || HAVE_FOPENCOOKIE
11
- fail "No funopen or fopencookie support available."
12
- end
13
7
 
14
8
  create_makefile('rdiscount')
@@ -26,6 +26,7 @@ typedef int (*stfu)(const void*,const void*);
26
26
 
27
27
 
28
28
  /* forward declarations */
29
+ static int iscodeblock(MMIOT*);
29
30
  static void code(int, MMIOT*);
30
31
  static void text(MMIOT *f);
31
32
  static Paragraph *display(Paragraph*, MMIOT*);
@@ -74,6 +75,31 @@ cursor(MMIOT *f)
74
75
  }
75
76
 
76
77
 
78
+ static int
79
+ isthisspace(MMIOT *f, int i)
80
+ {
81
+ int c = peek(f, i);
82
+
83
+ return isspace(c) || (c == EOF);
84
+ }
85
+
86
+
87
+ static int
88
+ isthisalnum(MMIOT *f, int i)
89
+ {
90
+ int c = peek(f, i);
91
+
92
+ return (c != EOF) && isalnum(c);
93
+ }
94
+
95
+
96
+ static int
97
+ isthisnonword(MMIOT *f, int i)
98
+ {
99
+ return isthisspace(f, i) || ispunct(peek(f,i));
100
+ }
101
+
102
+
77
103
  /* return/set the current cursor position
78
104
  */
79
105
  #define mmiotseek(f,x) (f->isp = x)
@@ -251,10 +277,10 @@ emmatch(MMIOT *f, int go)
251
277
  }
252
278
 
253
279
 
254
- /* emblock()
280
+ /* ___mkd_emblock()
255
281
  */
256
- static void
257
- emblock(MMIOT *f)
282
+ void
283
+ ___mkd_emblock(MMIOT *f)
258
284
  {
259
285
  int i;
260
286
  block *p;
@@ -275,8 +301,8 @@ emblock(MMIOT *f)
275
301
 
276
302
  /* generate html from a markup fragment
277
303
  */
278
- static void
279
- reparse(char *bfr, int size, int flags, MMIOT *f)
304
+ void
305
+ ___mkd_reparse(char *bfr, int size, int flags, MMIOT *f)
280
306
  {
281
307
  MMIOT sub;
282
308
 
@@ -290,7 +316,7 @@ reparse(char *bfr, int size, int flags, MMIOT *f)
290
316
  S(sub.in)--;
291
317
 
292
318
  text(&sub);
293
- emblock(&sub);
319
+ ___mkd_emblock(&sub);
294
320
 
295
321
  Qwrite(T(sub.out), S(sub.out), f);
296
322
 
@@ -313,6 +339,8 @@ puturl(char *s, int size, MMIOT *f)
313
339
  Qstring("&amp;", f);
314
340
  else if ( c == '<' )
315
341
  Qstring("&lt;", f);
342
+ else if ( isalnum(c) || ispunct(c) )
343
+ Qchar(c, f);
316
344
  else
317
345
  Qchar(c, f);
318
346
  }
@@ -469,12 +497,14 @@ linkykey(int image, Footnote *val, MMIOT *f)
469
497
  {
470
498
  Footnote *ret;
471
499
  Cstring mylabel;
500
+ int here;
472
501
 
473
502
  memset(val, 0, sizeof *val);
474
503
 
475
504
  if ( (T(val->tag) = linkylabel(f, &S(val->tag))) == 0 )
476
505
  return 0;
477
506
 
507
+ here = mmiottell(f);
478
508
  eatspace(f);
479
509
  switch ( pull(f) ) {
480
510
  case '(':
@@ -489,14 +519,21 @@ linkykey(int image, Footnote *val, MMIOT *f)
489
519
 
490
520
  return peek(f,0) == ')';
491
521
 
492
- case '[':
522
+ case '[': /* footnote links /as defined in the standard/ */
523
+ default: /* footnote links -- undocumented extension */
493
524
  /* footnote link */
494
525
  mylabel = val->tag;
495
- if ( (T(val->tag) = linkylabel(f, &S(val->tag))) == 0 )
496
- return 0;
526
+ if ( peek(f,0) == '[' ) {
527
+ if ( (T(val->tag) = linkylabel(f, &S(val->tag))) == 0 )
528
+ return 0;
497
529
 
498
- if ( !S(val->tag) )
499
- val->tag = mylabel;
530
+ if ( !S(val->tag) )
531
+ val->tag = mylabel;
532
+ }
533
+ else if ( f->flags & MKD_1_COMPAT )
534
+ break;
535
+ else
536
+ mmiotseek(f,here);
500
537
 
501
538
  ret = bsearch(val, T(*f->footnotes), S(*f->footnotes),
502
539
  sizeof *val, (stfu)__mkd_footsort);
@@ -576,7 +613,7 @@ linkylinky(int image, MMIOT *f)
576
613
  Footnote link;
577
614
  linkytype *tag;
578
615
 
579
- if ( !(linkykey(image, &link, f) && S(link.tag)) ) {
616
+ if ( !linkykey(image, &link, f) ) {
580
617
  mmiotseek(f, start);
581
618
  return 0;
582
619
  }
@@ -605,12 +642,12 @@ linkylinky(int image, MMIOT *f)
605
642
 
606
643
  if ( S(link.title) ) {
607
644
  Qstring(" title=\"", f);
608
- reparse(T(link.title), S(link.title), INSIDE_TAG, f);
645
+ ___mkd_reparse(T(link.title), S(link.title), INSIDE_TAG, f);
609
646
  Qchar('"', f);
610
647
  }
611
648
 
612
649
  Qstring(tag->text_pfx, f);
613
- reparse(T(link.tag), S(link.tag), tag->flags, f);
650
+ ___mkd_reparse(T(link.tag), S(link.tag), tag->flags, f);
614
651
  Qstring(tag->text_sfx, f);
615
652
  }
616
653
  else
@@ -659,11 +696,11 @@ forbidden_tag(MMIOT *f)
659
696
  if ( f->flags & DENY_HTML )
660
697
  return 1;
661
698
 
662
- if ( c == 'A' && (f->flags & DENY_A) && !isalnum(peek(f,2)) )
699
+ if ( c == 'A' && (f->flags & DENY_A) && !isthisalnum(f,2) )
663
700
  return 1;
664
701
  if ( c == 'I' && (f->flags & DENY_IMG)
665
702
  && strncasecmp(cursor(f)+1, "MG", 2) == 0
666
- && !isalnum(peek(f,4)) )
703
+ && !isthisalnum(f,4) )
667
704
  return 1;
668
705
  return 0;
669
706
  }
@@ -743,22 +780,6 @@ maybe_tag_or_link(MMIOT *f)
743
780
  } /* maybe_tag_or_link */
744
781
 
745
782
 
746
- static int
747
- isthisspace(MMIOT *f, int i)
748
- {
749
- int c = peek(f, i);
750
-
751
- return isspace(c) || (c == EOF);
752
- }
753
-
754
-
755
- static int
756
- isthisnonword(MMIOT *f, int i)
757
- {
758
- return isthisspace(f, i) || ispunct(peek(f,i));
759
- }
760
-
761
-
762
783
  /* smartyquote code that's common for single and double quotes
763
784
  */
764
785
  static int
@@ -873,7 +894,7 @@ smartypants(int c, int *flags, MMIOT *f)
873
894
  break;
874
895
  else if ( c == '\'' && peek(f, j+1) == '\'' ) {
875
896
  Qstring("&ldquo;", f);
876
- reparse(cursor(f)+1, j-2, 0, f);
897
+ ___mkd_reparse(cursor(f)+1, j-2, 0, f);
877
898
  Qstring("&rdquo;", f);
878
899
  shift(f,j+1);
879
900
  return 1;
@@ -928,7 +949,8 @@ text(MMIOT *f)
928
949
  Qchar(c, f);
929
950
  break;
930
951
  #if SUPERSCRIPT
931
- case '^': if ( isthisspace(f,-1) || isthisspace(f,1) )
952
+ /* A^B -> A<sup>B</sup> */
953
+ case '^': if ( (f->flags & (STRICT|INSIDE_TAG)) || isthisspace(f,-1) || isthisspace(f,1) )
932
954
  Qchar(c,f);
933
955
  else {
934
956
  char *sup = cursor(f);
@@ -938,18 +960,17 @@ text(MMIOT *f)
938
960
  ++len;
939
961
  }
940
962
  shift(f,len);
941
- reparse(sup, len, 0, f);
963
+ ___mkd_reparse(sup, len, 0, f);
942
964
  Qstring("</sup>", f);
943
965
  }
944
966
  break;
945
967
  #endif
946
968
  case '_':
947
969
  #if RELAXED_EMPHASIS
948
- /* If RELAXED_EMPHASIS, underscores don't count when
949
- * they're in the middle of a word.
950
- */
951
- if ( (isthisspace(f,-1) && isthisspace(f,1))
952
- || (isalnum(peek(f,-1)) && isalnum(peek(f,1))) ) {
970
+ /* Underscores don't count if they're in the middle of a word */
971
+ if ( (!(f->flags & STRICT))
972
+ && ((isthisspace(f,-1) && isthisspace(f,1))
973
+ || (isthisalnum(f,-1) && isthisalnum(f,1))) ){
953
974
  Qchar(c, f);
954
975
  break;
955
976
  }
@@ -964,7 +985,7 @@ text(MMIOT *f)
964
985
  }
965
986
  break;
966
987
 
967
- case '`': if ( tag_text(f) )
988
+ case '`': if ( tag_text(f) || !iscodeblock(f) )
968
989
  Qchar(c, f);
969
990
  else {
970
991
  Qstring("<code>", f);
@@ -1003,7 +1024,7 @@ text(MMIOT *f)
1003
1024
  break;
1004
1025
 
1005
1026
  case '&': j = (peek(f,1) == '#' ) ? 2 : 1;
1006
- while ( isalnum(peek(f,j)) )
1027
+ while ( isthisalnum(f,j) )
1007
1028
  ++j;
1008
1029
 
1009
1030
  if ( peek(f,j) != ';' )
@@ -1016,9 +1037,31 @@ text(MMIOT *f)
1016
1037
  break;
1017
1038
  }
1018
1039
  }
1040
+ /* truncate the input string after we've finished processing it */
1041
+ S(f->in) = f->isp = 0;
1019
1042
  } /* text */
1020
1043
 
1021
1044
 
1045
+ static int
1046
+ iscodeblock(MMIOT *f)
1047
+ {
1048
+ int i=1, single = 1, c;
1049
+
1050
+ if ( peek(f,i) == '`' ) {
1051
+ single=0;
1052
+ i++;
1053
+ }
1054
+ while ( (c=peek(f,i)) != EOF ) {
1055
+ if ( (c == '`') && (single || peek(f,i+1) == '`') )
1056
+ return 1;
1057
+ else if ( c == '\\' )
1058
+ i++;
1059
+ i++;
1060
+ }
1061
+ return 0;
1062
+
1063
+ }
1064
+
1022
1065
  static int
1023
1066
  endofcode(int escape, int offset, MMIOT *f)
1024
1067
  {
@@ -1072,7 +1115,13 @@ code(int escape, MMIOT *f)
1072
1115
  static void
1073
1116
  printheader(Paragraph *pp, MMIOT *f)
1074
1117
  {
1075
- Qprintf(f, "<h%d>", pp->hnumber);
1118
+ Qprintf(f, "<h%d", pp->hnumber);
1119
+ if ( f->flags & TOC ) {
1120
+ Qprintf(f, " id=\"", pp->hnumber);
1121
+ mkd_string_to_anchor(T(pp->text->text), S(pp->text->text), Qchar, f);
1122
+ Qchar('"', f);
1123
+ }
1124
+ Qchar('>', f);
1076
1125
  push(T(pp->text->text), S(pp->text->text), f);
1077
1126
  text(f);
1078
1127
  Qprintf(f, "</h%d>", pp->hnumber);
@@ -1094,6 +1143,7 @@ printblock(Paragraph *pp, MMIOT *f)
1094
1143
  push("<br/>\n", 6, f);
1095
1144
  }
1096
1145
  else {
1146
+ ___mkd_tidy(t);
1097
1147
  push(T(t->text), S(t->text), f);
1098
1148
  if ( t->next )
1099
1149
  push("\n", 1, f);
@@ -1149,19 +1199,21 @@ printhtml(Line *t, MMIOT *f)
1149
1199
 
1150
1200
 
1151
1201
  static void
1152
- htmlify(Paragraph *p, char *block, MMIOT *f)
1202
+ htmlify(Paragraph *p, char *block, char *arguments, MMIOT *f)
1153
1203
  {
1154
- emblock(f);
1155
- if ( block ) Qprintf(f, "<%s>", block);
1156
- emblock(f);
1204
+ ___mkd_emblock(f);
1205
+ if ( block )
1206
+ Qprintf(f, arguments ? "<%s %s>" : "<%s>", block, arguments);
1207
+ ___mkd_emblock(f);
1157
1208
 
1158
1209
  while (( p = display(p, f) )) {
1159
- emblock(f);
1210
+ ___mkd_emblock(f);
1160
1211
  Qstring("\n\n", f);
1161
1212
  }
1162
1213
 
1163
- if ( block ) Qprintf(f, "</%s>", block);
1164
- emblock(f);
1214
+ if ( block )
1215
+ Qprintf(f, "</%s>", block);
1216
+ ___mkd_emblock(f);
1165
1217
  }
1166
1218
 
1167
1219
 
@@ -1177,11 +1229,11 @@ definitionlist(Paragraph *p, MMIOT *f)
1177
1229
  for ( ; p ; p = p->next) {
1178
1230
  for ( tag = p->text; tag; tag = tag->next ) {
1179
1231
  Qstring("<dt>", f);
1180
- reparse(T(tag->text), S(tag->text), 0, f);
1232
+ ___mkd_reparse(T(tag->text), S(tag->text), 0, f);
1181
1233
  Qstring("</dt>\n", f);
1182
1234
  }
1183
1235
 
1184
- htmlify(p->down, "dd", f);
1236
+ htmlify(p->down, "dd", p->ident, f);
1185
1237
  }
1186
1238
 
1187
1239
  Qstring("</dl>", f);
@@ -1194,10 +1246,13 @@ static void
1194
1246
  listdisplay(int typ, Paragraph *p, MMIOT* f)
1195
1247
  {
1196
1248
  if ( p ) {
1197
- Qprintf(f, "<%cl>\n", (typ==UL)?'u':'o');
1249
+ Qprintf(f, "<%cl", (typ==UL)?'u':'o');
1250
+ if ( typ == AL )
1251
+ Qprintf(f, " type=a");
1252
+ Qprintf(f, ">\n");
1198
1253
 
1199
1254
  for ( ; p ; p = p->next ) {
1200
- htmlify(p->down, "li", f);
1255
+ htmlify(p->down, "li", p->ident, f);
1201
1256
  Qchar('\n', f);
1202
1257
  }
1203
1258
 
@@ -1227,11 +1282,12 @@ display(Paragraph *p, MMIOT *f)
1227
1282
  break;
1228
1283
 
1229
1284
  case QUOTE:
1230
- htmlify(p->down, "blockquote", f);
1285
+ htmlify(p->down, p->ident ? "div" : "blockquote", p->ident, f);
1231
1286
  break;
1232
1287
 
1233
1288
  case UL:
1234
1289
  case OL:
1290
+ case AL:
1235
1291
  listdisplay(p->typ, p->down, f);
1236
1292
  break;
1237
1293
 
@@ -1288,7 +1344,7 @@ mkd_document(Document *p, char **res)
1288
1344
  {
1289
1345
  if ( p && p->compiled ) {
1290
1346
  if ( ! p->html ) {
1291
- htmlify(p->code, 0, p->ctx);
1347
+ htmlify(p->code, 0, 0, p->ctx);
1292
1348
  p->html = 1;
1293
1349
  }
1294
1350
 
@@ -1299,7 +1355,7 @@ mkd_document(Document *p, char **res)
1299
1355
  }
1300
1356
 
1301
1357
 
1302
- /* public interface for reparse()
1358
+ /* public interface for ___mkd_reparse()
1303
1359
  */
1304
1360
  int
1305
1361
  mkd_text(char *bfr, int size, FILE *output, int flags)
@@ -1309,8 +1365,8 @@ mkd_text(char *bfr, int size, FILE *output, int flags)
1309
1365
  ___mkd_initmmiot(&f, 0);
1310
1366
  f.flags = flags & USER_FLAGS;
1311
1367
 
1312
- reparse(bfr, size, 0, &f);
1313
- emblock(&f);
1368
+ ___mkd_reparse(bfr, size, 0, &f);
1369
+ ___mkd_emblock(&f);
1314
1370
  if ( flags & CDATA_OUTPUT )
1315
1371
  ___mkd_xml(T(f.out), S(f.out), output);
1316
1372
  else