bluecloth 2.0.5-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. data/ChangeLog +784 -0
  2. data/LICENSE +27 -0
  3. data/LICENSE.discount +47 -0
  4. data/README +81 -0
  5. data/Rakefile +346 -0
  6. data/Rakefile.local +63 -0
  7. data/bin/bluecloth +84 -0
  8. data/ext/Csio.c +61 -0
  9. data/ext/VERSION +1 -0
  10. data/ext/amalloc.h +29 -0
  11. data/ext/bluecloth.c +377 -0
  12. data/ext/config.h +51 -0
  13. data/ext/css.c +76 -0
  14. data/ext/cstring.h +74 -0
  15. data/ext/docheader.c +43 -0
  16. data/ext/extconf.rb +48 -0
  17. data/ext/generate.c +1481 -0
  18. data/ext/markdown.c +970 -0
  19. data/ext/markdown.h +145 -0
  20. data/ext/mkdio.c +303 -0
  21. data/ext/mkdio.h +78 -0
  22. data/ext/resource.c +155 -0
  23. data/ext/version.c +28 -0
  24. data/ext/xml.c +82 -0
  25. data/ext/xmlpage.c +48 -0
  26. data/lib/bluecloth.rb +161 -0
  27. data/rake/191_compat.rb +26 -0
  28. data/rake/dependencies.rb +76 -0
  29. data/rake/helpers.rb +412 -0
  30. data/rake/hg.rb +214 -0
  31. data/rake/manual.rb +782 -0
  32. data/rake/packaging.rb +135 -0
  33. data/rake/publishing.rb +321 -0
  34. data/rake/rdoc.rb +30 -0
  35. data/rake/style.rb +62 -0
  36. data/rake/svn.rb +668 -0
  37. data/rake/testing.rb +187 -0
  38. data/rake/verifytask.rb +64 -0
  39. data/rake/win32.rb +190 -0
  40. data/spec/bluecloth/101_changes_spec.rb +141 -0
  41. data/spec/bluecloth/autolinks_spec.rb +49 -0
  42. data/spec/bluecloth/blockquotes_spec.rb +143 -0
  43. data/spec/bluecloth/code_spans_spec.rb +164 -0
  44. data/spec/bluecloth/emphasis_spec.rb +164 -0
  45. data/spec/bluecloth/entities_spec.rb +65 -0
  46. data/spec/bluecloth/hrules_spec.rb +90 -0
  47. data/spec/bluecloth/images_spec.rb +92 -0
  48. data/spec/bluecloth/inline_html_spec.rb +238 -0
  49. data/spec/bluecloth/links_spec.rb +171 -0
  50. data/spec/bluecloth/lists_spec.rb +294 -0
  51. data/spec/bluecloth/paragraphs_spec.rb +75 -0
  52. data/spec/bluecloth/titles_spec.rb +305 -0
  53. data/spec/bluecloth_spec.rb +250 -0
  54. data/spec/bugfix_spec.rb +136 -0
  55. data/spec/contributions_spec.rb +85 -0
  56. data/spec/data/antsugar.txt +34 -0
  57. data/spec/data/markdowntest/Amps and angle encoding.html +17 -0
  58. data/spec/data/markdowntest/Amps and angle encoding.text +21 -0
  59. data/spec/data/markdowntest/Auto links.html +18 -0
  60. data/spec/data/markdowntest/Auto links.text +13 -0
  61. data/spec/data/markdowntest/Backslash escapes.html +118 -0
  62. data/spec/data/markdowntest/Backslash escapes.text +120 -0
  63. data/spec/data/markdowntest/Blockquotes with code blocks.html +15 -0
  64. data/spec/data/markdowntest/Blockquotes with code blocks.text +11 -0
  65. data/spec/data/markdowntest/Code Blocks.html +18 -0
  66. data/spec/data/markdowntest/Code Blocks.text +14 -0
  67. data/spec/data/markdowntest/Code Spans.html +5 -0
  68. data/spec/data/markdowntest/Code Spans.text +5 -0
  69. data/spec/data/markdowntest/Hard-wrapped paragraphs with list-like lines.html +8 -0
  70. data/spec/data/markdowntest/Hard-wrapped paragraphs with list-like lines.text +8 -0
  71. data/spec/data/markdowntest/Horizontal rules.html +71 -0
  72. data/spec/data/markdowntest/Horizontal rules.text +67 -0
  73. data/spec/data/markdowntest/Inline HTML (Advanced).html +15 -0
  74. data/spec/data/markdowntest/Inline HTML (Advanced).text +15 -0
  75. data/spec/data/markdowntest/Inline HTML (Simple).html +72 -0
  76. data/spec/data/markdowntest/Inline HTML (Simple).text +69 -0
  77. data/spec/data/markdowntest/Inline HTML comments.html +13 -0
  78. data/spec/data/markdowntest/Inline HTML comments.text +13 -0
  79. data/spec/data/markdowntest/Links, inline style.html +11 -0
  80. data/spec/data/markdowntest/Links, inline style.text +12 -0
  81. data/spec/data/markdowntest/Links, reference style.html +52 -0
  82. data/spec/data/markdowntest/Links, reference style.text +71 -0
  83. data/spec/data/markdowntest/Links, shortcut references.html +9 -0
  84. data/spec/data/markdowntest/Links, shortcut references.text +20 -0
  85. data/spec/data/markdowntest/Literal quotes in titles.html +3 -0
  86. data/spec/data/markdowntest/Literal quotes in titles.text +7 -0
  87. data/spec/data/markdowntest/Markdown Documentation - Basics.html +314 -0
  88. data/spec/data/markdowntest/Markdown Documentation - Basics.text +306 -0
  89. data/spec/data/markdowntest/Markdown Documentation - Syntax.html +942 -0
  90. data/spec/data/markdowntest/Markdown Documentation - Syntax.text +888 -0
  91. data/spec/data/markdowntest/Nested blockquotes.html +9 -0
  92. data/spec/data/markdowntest/Nested blockquotes.text +5 -0
  93. data/spec/data/markdowntest/Ordered and unordered lists.html +148 -0
  94. data/spec/data/markdowntest/Ordered and unordered lists.text +131 -0
  95. data/spec/data/markdowntest/Strong and em together.html +7 -0
  96. data/spec/data/markdowntest/Strong and em together.text +7 -0
  97. data/spec/data/markdowntest/Tabs.html +25 -0
  98. data/spec/data/markdowntest/Tabs.text +21 -0
  99. data/spec/data/markdowntest/Tidyness.html +8 -0
  100. data/spec/data/markdowntest/Tidyness.text +5 -0
  101. data/spec/data/ml-announce.txt +17 -0
  102. data/spec/data/re-overflow.txt +67 -0
  103. data/spec/data/re-overflow2.txt +281 -0
  104. data/spec/discount_spec.rb +67 -0
  105. data/spec/lib/constants.rb +5 -0
  106. data/spec/lib/helpers.rb +137 -0
  107. data/spec/lib/matchers.rb +235 -0
  108. data/spec/markdowntest_spec.rb +79 -0
  109. metadata +329 -0
data/Rakefile.local ADDED
@@ -0,0 +1,63 @@
1
+ #!rake
2
+
3
+ # C extension constants
4
+ EXT_MAKEFILE = EXTDIR + 'Makefile'
5
+ EXT_SOURCES = FileList[ EXTDIR + '*.c' ]
6
+ EXT_SO = EXTDIR + "bluecloth_ext.#{CONFIG['DLEXT']}"
7
+
8
+ GEMSPEC.extra_rdoc_files << 'LICENSE.discount'
9
+ DOCFILES << 'LICENSE.discount'
10
+
11
+
12
+ #####################################################################
13
+ ### T A S K S
14
+ #####################################################################
15
+
16
+ # Make both the default task and the spec task depend on building the extension
17
+ task :local => :build
18
+ task :spec => :build
19
+ namespace :spec do
20
+ task :doc => [ :build ]
21
+ task :quiet => [ :build ]
22
+ task :html => [ :build ]
23
+ task :text => [ :build ]
24
+ end
25
+
26
+ desc "Make the Makefile for the C extension"
27
+ file EXT_MAKEFILE.to_s => EXT_SOURCES do
28
+ log "Configuring BlueCloth C extension"
29
+ in_subdirectory( EXTDIR ) do
30
+ ruby 'extconf.rb'
31
+ end
32
+ end
33
+ CLOBBER.include( EXTDIR + 'mkmf.log', EXTDIR + 'conftest.dSYM', EXT_SO )
34
+
35
+ desc "Build the C extension"
36
+ task :build => EXT_SO
37
+ file EXT_SO => [ EXT_MAKEFILE.to_s, *EXT_SOURCES ] do
38
+ in_subdirectory( EXTDIR ) do
39
+ sh 'make'
40
+ end
41
+ end
42
+
43
+ desc "Rebuild the C extension"
44
+ task :rebuild => [ :clobber, :build ]
45
+
46
+
47
+ task :clean do
48
+ if EXT_MAKEFILE.exist?
49
+ in_subdirectory( EXTDIR ) do
50
+ sh 'make clean'
51
+ end
52
+ end
53
+ end
54
+
55
+ task :clobber do
56
+ if EXT_MAKEFILE.exist?
57
+ in_subdirectory( EXTDIR ) do
58
+ sh 'make distclean'
59
+ end
60
+ end
61
+ end
62
+ CLOBBER.include( EXT_MAKEFILE )
63
+
data/bin/bluecloth ADDED
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/ruby
2
+ #
3
+ # = bluecloth
4
+ #
5
+ # Format one or more text files with the markdown formatter.
6
+ #
7
+ # = Synopsis
8
+ #
9
+ # bluecloth [OPTIONS] [FILES]
10
+ #
11
+ #
12
+ #
13
+
14
+ BEGIN {
15
+ require 'bluecloth'
16
+ require 'optparse'
17
+ }
18
+
19
+ DocumentWrapper = %{
20
+ <html>
21
+ <head><title>%s</title></head>
22
+ <body>
23
+ %s
24
+ </body>
25
+ </html>
26
+ }
27
+
28
+ def main
29
+ fragment = false
30
+ destination = '.'
31
+
32
+ ARGV.options do |oparser|
33
+
34
+ oparser.banner = "Usage: #$0 [OPTIONS] FILES"
35
+
36
+ # Debug mode
37
+ oparser.on( "--debug", "-d", TrueClass, "Turn debugging output on" ) {
38
+ $DEBUG = true
39
+ }
40
+
41
+ # 'Fragment' mode
42
+ oparser.on( "--fragment", "-f", TrueClass,
43
+ "Output HTML fragments instead of whole documents" ) {
44
+ fragment = true
45
+ }
46
+
47
+ # Output destination
48
+ #oparser.on( "--output=DESTINATION", "-o DESTINATION", String,
49
+ # "Write output to DESTINATION instead of the current directory" ) {|arg|
50
+ # destination = arg
51
+ #}
52
+
53
+ oparser.parse!
54
+ end
55
+
56
+ # Filter mode if no arguments
57
+ ARGV.push( "-" ) if ARGV.empty?
58
+
59
+ ARGV.each {|file|
60
+ if file == '-'
61
+ contents = $stdin.read
62
+ else
63
+ contents = File::read( file )
64
+ end
65
+
66
+ bc = BlueCloth::new( contents )
67
+ $stderr.puts "Using BlueCloth version #{BlueCloth::VERSION}"
68
+
69
+ if fragment
70
+ $stdout.puts bc.to_html
71
+ else
72
+ $stdout.puts DocumentWrapper % [ file, bc.to_html ]
73
+ end
74
+ }
75
+
76
+ rescue => err
77
+ $stderr.puts "Aborting: Fatal error: %s" % err.message
78
+ exit 255
79
+ end
80
+
81
+
82
+
83
+ main
84
+
data/ext/Csio.c ADDED
@@ -0,0 +1,61 @@
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), ALLOCATED(*iot)-S(*iot), fmt, ptr);
30
+ va_end(ptr);
31
+ } while ( siz > (ALLOCATED(*iot)-S(*iot)) );
32
+
33
+ S(*iot) += siz;
34
+ return siz;
35
+ }
36
+
37
+
38
+ /* write() into a cstring
39
+ */
40
+ int
41
+ Cswrite(Cstring *iot, char *bfr, int size)
42
+ {
43
+ RESERVE(*iot, size);
44
+ memcpy(T(*iot)+S(*iot), bfr, size);
45
+ S(*iot) += size;
46
+ return size;
47
+ }
48
+
49
+
50
+ /* reparse() into a cstring
51
+ */
52
+ void
53
+ Csreparse(Cstring *iot, char *buf, int size, int flags)
54
+ {
55
+ MMIOT f;
56
+ ___mkd_initmmiot(&f, 0);
57
+ ___mkd_reparse(buf, size, 0, &f);
58
+ ___mkd_emblock(&f);
59
+ SUFFIX(*iot, T(f.out), S(f.out));
60
+ ___mkd_freemmiot(&f, 0);
61
+ }
data/ext/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.4.4
data/ext/amalloc.h ADDED
@@ -0,0 +1,29 @@
1
+ /*
2
+ * debugging malloc()/realloc()/calloc()/free() that attempts
3
+ * to keep track of just what's been allocated today.
4
+ */
5
+ #ifndef AMALLOC_D
6
+ #define AMALLOC_D
7
+
8
+ #include "config.h"
9
+
10
+ #ifdef USE_AMALLOC
11
+
12
+ extern void *amalloc(int);
13
+ extern void *acalloc(int,int);
14
+ extern void *arealloc(void*,int);
15
+ extern void afree(void*);
16
+ extern void adump();
17
+
18
+ #define malloc amalloc
19
+ #define calloc acalloc
20
+ #define realloc arealloc
21
+ #define free afree
22
+
23
+ #else
24
+
25
+ #define adump() (void)1
26
+
27
+ #endif
28
+
29
+ #endif/*AMALLOC_D*/
data/ext/bluecloth.c ADDED
@@ -0,0 +1,377 @@
1
+ /*
2
+ * BlueCloth -- a Ruby implementation of Markdown
3
+ * $Id$
4
+ *
5
+ * = Authors
6
+ *
7
+ * - Michael Granger <ged@FaerieMUD.org>
8
+ *
9
+ * BlueCloth 2 is mostly just a wrapper around the Discount library
10
+ * written by David Loren Parsons <http://www.pell.portland.or.us/~orc>.
11
+ *
12
+ * = License
13
+ *
14
+ * Discount:
15
+ * Copyright (C) 2007 David Loren Parsons. All rights reserved.
16
+ *
17
+ * The Discount library is used under the licensing terms outlined in the
18
+ * COPYRIGHT.discount file included in the distribution.
19
+ *
20
+ * Ruby bits:
21
+ * See the LICENSE file included in the distribution.
22
+ *
23
+ */
24
+
25
+ #include "mkdio.h"
26
+ #include "ruby.h"
27
+
28
+ VALUE bluecloth_cBlueCloth;
29
+ VALUE bluecloth_default_opthash;
30
+
31
+
32
+ /* Get a Discount document for the specified text */
33
+ static MMIOT *
34
+ bluecloth_alloc( VALUE text, int flags ) {
35
+ MMIOT *document;
36
+
37
+ document = mkd_string( RSTRING_PTR(text), RSTRING_LEN(text), flags );
38
+ if ( !document )
39
+ rb_raise( rb_eRuntimeError, "Failed to create a BlueCloth object for: %s", RSTRING_PTR(text) );
40
+
41
+ return document;
42
+ }
43
+
44
+
45
+ /*
46
+ * GC Free function
47
+ */
48
+ static void
49
+ bluecloth_gc_free( MMIOT *document ) {
50
+ if ( document ) {
51
+ mkd_cleanup( document );
52
+ document = NULL;
53
+ }
54
+ }
55
+
56
+
57
+ /* --------------------------------------------------------------
58
+ * Utility functions
59
+ * -------------------------------------------------------------- */
60
+
61
+ #ifdef HAVE_STDARG_PROTOTYPES
62
+ #include <stdarg.h>
63
+ void
64
+ bluecloth_debug(const char *fmt, ...)
65
+ #else
66
+ #include <varargs.h>
67
+ void
68
+ bluecloth_debug( fmt, va_alist )
69
+ const char *fmt;
70
+ va_dcl
71
+ #endif
72
+ {
73
+ char buf[BUFSIZ], buf2[BUFSIZ];
74
+ va_list args;
75
+
76
+ if (!RTEST(ruby_debug)) return;
77
+
78
+ snprintf( buf, BUFSIZ, "Debug>>> %s", fmt );
79
+
80
+ #ifdef HAVE_STDARG_PROTOTYPES
81
+ va_start( args, fmt );
82
+ #else
83
+ va_start( args );
84
+ #endif
85
+ vsnprintf( buf2, BUFSIZ, buf, args );
86
+ fputs( buf2, stderr );
87
+ fputs( "\n", stderr );
88
+ fflush( stderr );
89
+ va_end( args );
90
+ }
91
+
92
+
93
+ /*
94
+ * Object validity checker. Returns the data pointer.
95
+ */
96
+ static MMIOT *
97
+ bluecloth_check_ptr( VALUE self ) {
98
+ Check_Type( self, T_DATA );
99
+
100
+ if ( !rb_obj_is_kind_of(self, bluecloth_cBlueCloth) ) {
101
+ rb_raise( rb_eTypeError, "wrong argument type %s (expected BlueCloth object)",
102
+ rb_class2name(CLASS_OF( self )) );
103
+ }
104
+
105
+ return DATA_PTR( self );
106
+ }
107
+
108
+
109
+ /*
110
+ * Fetch the data pointer and check it for sanity.
111
+ */
112
+ static MMIOT *
113
+ bluecloth_get_ptr( VALUE self ) {
114
+ MMIOT *ptr = bluecloth_check_ptr( self );
115
+
116
+ if ( !ptr )
117
+ rb_fatal( "Use of uninitialized BlueCloth object" );
118
+
119
+ return ptr;
120
+ }
121
+
122
+
123
+ /* --------------------------------------------------------------
124
+ * Class methods
125
+ * -------------------------------------------------------------- */
126
+
127
+ /*
128
+ * call-seq:
129
+ * BlueCloth.allocate -> object
130
+ *
131
+ * Allocate a new BlueCloth object.
132
+ *
133
+ */
134
+ static VALUE
135
+ bluecloth_s_allocate( VALUE klass ) {
136
+ return Data_Wrap_Struct( klass, NULL, bluecloth_gc_free, 0 );
137
+ }
138
+
139
+
140
+ /*
141
+ * call-seq:
142
+ * BlueCloth.discount_version -> string
143
+ *
144
+ * Return the version string of the Discount library BlueCloth was built on.
145
+ *
146
+ */
147
+ static VALUE
148
+ bluecloth_s_discount_version( VALUE klass ) {
149
+ return rb_str_new2( markdown_version );
150
+ }
151
+
152
+ /* --------------------------------------------------------------
153
+ * Instance methods
154
+ * -------------------------------------------------------------- */
155
+
156
+ /*
157
+ * call-seq:
158
+ * BlueCloth.new( string='', options=DEFAULT_OPTIONS ) -> object
159
+ *
160
+ * Create a new BlueCloth object that will process the given +string+. The +options+
161
+ * argument is a Hash that can be used to control the generated markup, and to
162
+ * enable/disable extensions. The supported options are:
163
+ *
164
+ * [:remove_links]
165
+ * Ignore links in Markdown, and escape A tags in the output. Defaults to +false+.
166
+ * [:remove_images]
167
+ * Ignore images in Markdown, and escape IMG tags in the output. Defaults to +false+.
168
+ * [:smartypants]
169
+ * Do Smartypants-style mangling of quotes, dashes, or ellipses. Defaults to +true+.
170
+ * [:pseudoprotocols]
171
+ * Support Discount's pseudo-protocol links. Defaults to +false+.
172
+ * [:pandoc_headers]
173
+ * Support the extraction of
174
+ * {Pandoc headers}[http://johnmacfarlane.net/pandoc/README.html#title-blocks], which
175
+ * can be fetched as a Hash via the #header method. Defaults to +false+.
176
+ * [:header_labels]
177
+ * Generate ID attributes for all headers. Defaults to +false+.
178
+ * [:escape_html]
179
+ * Escape all HTML in the input string. Defaults to +false+.
180
+ * [:strict_mode]
181
+ * Disables Discount's relaxed emphasis (ignores underscores in the middle of words) and
182
+ * superscript notation. Defaults to +true+.
183
+ *
184
+ */
185
+ static VALUE
186
+ bluecloth_initialize( int argc, VALUE *argv, VALUE self ) {
187
+ if ( !bluecloth_check_ptr(self) ) {
188
+ MMIOT *document;
189
+ VALUE text, textcopy, optflags, fullhash, opthash = Qnil;
190
+ int flags = 0;
191
+
192
+ rb_scan_args( argc, argv, "02", &text, &opthash );
193
+
194
+ /* Default empty string and options */
195
+ if ( argc == 0 ) {
196
+ text = rb_str_new( "", 0 );
197
+ }
198
+
199
+ /* One arg could be either the text or the opthash, so shift the args if appropriate */
200
+ else if ( argc == 1 && (TYPE(text) == T_HASH || TYPE(text) == T_FIXNUM) ) {
201
+ opthash = text;
202
+ text = rb_str_new( "", 0 );
203
+ }
204
+
205
+ /* Merge the options hash with the defaults and turn it into a flags int */
206
+ if ( NIL_P(opthash) ) opthash = rb_hash_new();
207
+ optflags = rb_funcall( bluecloth_cBlueCloth, rb_intern("flags_from_opthash"), 1, opthash );
208
+ fullhash = rb_funcall( bluecloth_cBlueCloth, rb_intern("opthash_from_flags"), 1, optflags );
209
+
210
+ flags = NUM2INT( optflags );
211
+ DATA_PTR( self ) = document = bluecloth_alloc( text, flags );
212
+ if ( !mkd_compile(document, flags) )
213
+ rb_raise( rb_eRuntimeError, "Failed to compile markdown" );
214
+
215
+ textcopy = rb_str_dup( text );
216
+ OBJ_FREEZE( textcopy );
217
+ rb_iv_set( self, "@text", textcopy );
218
+ OBJ_FREEZE( fullhash );
219
+ rb_iv_set( self, "@options", fullhash );
220
+
221
+ OBJ_INFECT( self, text );
222
+ }
223
+
224
+ return self;
225
+ }
226
+
227
+
228
+ /*
229
+ * call-seq:
230
+ * bluecloth.to_html -> string
231
+ *
232
+ * Transform the document into HTML.
233
+ *
234
+ */
235
+ static VALUE
236
+ bluecloth_to_html( VALUE self ) {
237
+ MMIOT *document = bluecloth_get_ptr( self );
238
+ char *output;
239
+ int length;
240
+ VALUE result = Qnil;
241
+
242
+ bluecloth_debug( "Compiling document %p", document );
243
+
244
+ if ( (length = mkd_document( document, &output )) != EOF ) {
245
+ bluecloth_debug( "Pointer to results: %p, length = %d", output, length );
246
+ result = rb_str_new( output, length );
247
+
248
+ OBJ_INFECT( result, self );
249
+ return result;
250
+ } else {
251
+ return Qnil;
252
+ }
253
+ }
254
+
255
+
256
+ char * (*header_functions[3])(MMIOT *) = {
257
+ mkd_doc_title,
258
+ mkd_doc_author,
259
+ mkd_doc_date
260
+ };
261
+
262
+ /*
263
+ * call-seq:
264
+ * bluecloth.header -> hash
265
+ *
266
+ * Return the hash of
267
+ * {Pandoc-style headers}[http://johnmacfarlane.net/pandoc/README.html#title-blocks]
268
+ * from the parsed document. If there were no headers, or the BlueCloth object was not
269
+ * constructed with the :pandoc_headers option enabled, an empty Hash is returned.
270
+ *
271
+ * markdown = "%title My Essay\n%author Me\n%date Today\n\nSome stuff..."
272
+ * bc = BlueCloth.new( markdown, :pandoc_headers => true )
273
+ * # =>
274
+ * bc.header
275
+ * # =>
276
+ */
277
+ static VALUE
278
+ bluecloth_header( VALUE self ) {
279
+ MMIOT *document = bluecloth_get_ptr( self );
280
+ char *field;
281
+ VALUE fieldstring, headers = rb_hash_new();
282
+
283
+ bluecloth_debug( "Fetching pandoc headers for document %p", document );
284
+
285
+ if ( (field = mkd_doc_title(document)) ) {
286
+ fieldstring = rb_str_new2( field );
287
+ OBJ_INFECT( fieldstring, self );
288
+ rb_hash_aset( headers, ID2SYM(rb_intern("title")), fieldstring );
289
+ }
290
+ if ( (field = mkd_doc_author(document)) ) {
291
+ fieldstring = rb_str_new2( field );
292
+ OBJ_INFECT( fieldstring, self );
293
+ rb_hash_aset( headers, ID2SYM(rb_intern("author")), fieldstring );
294
+ }
295
+ if ( (field = mkd_doc_date(document)) ) {
296
+ fieldstring = rb_str_new2( field );
297
+ OBJ_INFECT( fieldstring, self );
298
+ rb_hash_aset( headers, ID2SYM(rb_intern("date")), fieldstring );
299
+ }
300
+
301
+ return headers;
302
+ }
303
+
304
+
305
+
306
+ /* --------------------------------------------------------------
307
+ * Initializer
308
+ * -------------------------------------------------------------- */
309
+
310
+ void Init_bluecloth_ext( void ) {
311
+ bluecloth_cBlueCloth = rb_define_class( "BlueCloth", rb_cObject );
312
+
313
+ rb_define_alloc_func( bluecloth_cBlueCloth, bluecloth_s_allocate );
314
+ rb_define_singleton_method( bluecloth_cBlueCloth, "discount_version",
315
+ bluecloth_s_discount_version, 0 );
316
+
317
+ rb_define_method( bluecloth_cBlueCloth, "initialize", bluecloth_initialize, -1 );
318
+
319
+ rb_define_method( bluecloth_cBlueCloth, "to_html", bluecloth_to_html, 0 );
320
+ rb_define_method( bluecloth_cBlueCloth, "header", bluecloth_header, 0 );
321
+ rb_define_alias( bluecloth_cBlueCloth, "pandoc_header", "header" );
322
+
323
+ /* The original Markdown text the object was constructed with */
324
+ rb_define_attr( bluecloth_cBlueCloth, "text", 1, 0 );
325
+
326
+ /* The options hash that describes the options in effect when the object was created */
327
+ rb_define_attr( bluecloth_cBlueCloth, "options", 1, 0 );
328
+
329
+ /* --- Constants ----- */
330
+
331
+ /* Do not process `[]' and remove A tags from the output. */
332
+ rb_define_const( bluecloth_cBlueCloth, "MKD_NOLINKS", INT2FIX(MKD_NOLINKS) );
333
+
334
+ /* Do not process `![]' and remove IMG tags from the output. */
335
+ rb_define_const( bluecloth_cBlueCloth, "MKD_NOIMAGE", INT2FIX(MKD_NOIMAGE) );
336
+
337
+ /* Do not do Smartypants-style mangling of quotes, dashes, or ellipses. */
338
+ rb_define_const( bluecloth_cBlueCloth, "MKD_NOPANTS", INT2FIX(MKD_NOPANTS) );
339
+
340
+ /* Escape all opening angle brackets in the input text instead of allowing block-level HTML */
341
+ rb_define_const( bluecloth_cBlueCloth, "MKD_NOHTML", INT2FIX(MKD_NOHTML) );
342
+
343
+ /* disable SUPERSCRIPT, RELAXED_EMPHASIS */
344
+ rb_define_const( bluecloth_cBlueCloth, "MKD_STRICT", INT2FIX(MKD_STRICT) );
345
+
346
+ /* process text inside an html tag; no <em>, no <bold>, no html or [] expansion */
347
+ rb_define_const( bluecloth_cBlueCloth, "MKD_TAGTEXT", INT2FIX(MKD_TAGTEXT) );
348
+
349
+ /* don't allow pseudo-protocols */
350
+ rb_define_const( bluecloth_cBlueCloth, "MKD_NO_EXT", INT2FIX(MKD_NO_EXT) );
351
+
352
+ /* do table-of-contents processing */
353
+ rb_define_const( bluecloth_cBlueCloth, "MKD_TOC", INT2FIX(MKD_TOC) );
354
+
355
+ /* MarkdownTest 1.0 Compatibility Mode */
356
+ rb_define_const( bluecloth_cBlueCloth, "MKD_1_COMPAT", INT2FIX(MKD_1_COMPAT) );
357
+
358
+ /* MKD_NOLINKS|MKD_NOIMAGE|MKD_TAGTEXT */
359
+ rb_define_const( bluecloth_cBlueCloth, "MKD_EMBED", INT2FIX(MKD_EMBED) );
360
+
361
+ /* Create links for inline URIs */
362
+ rb_define_const( bluecloth_cBlueCloth, "MKD_AUTOLINK", INT2FIX(MKD_AUTOLINK) );
363
+
364
+ /* Be paranoid about link protocols */
365
+ rb_define_const( bluecloth_cBlueCloth, "MKD_SAFELINK", INT2FIX(MKD_SAFELINK) );
366
+
367
+
368
+ /* don't process header blocks */
369
+ rb_define_const( bluecloth_cBlueCloth, "MKD_NOHEADER", INT2FIX(MKD_NOHEADER) );
370
+
371
+
372
+ /* Make sure the Ruby side is loaded */
373
+ rb_require( "bluecloth" );
374
+
375
+ bluecloth_default_opthash = rb_const_get( bluecloth_cBlueCloth, rb_intern("DEFAULT_OPTIONS") );
376
+ }
377
+