rdiscount 1.2.6.2

Sign up to get free protection for your applications and to get access to all the features.
data/COPYING ADDED
@@ -0,0 +1,52 @@
1
+ The core Discount C sources are
2
+ Copyright (C) 2007 David Loren Parsons.
3
+
4
+ The Discount Ruby extension sources are
5
+ Copyright (C) 2008 Ryan Tomayko.
6
+
7
+ All rights reserved.
8
+
9
+ Permission is hereby granted, free of charge, to any person
10
+ obtaining a copy of this software and associated documentation files
11
+ (the "Software"), to deal in the Software without restriction,
12
+ including without limitation the rights to use, copy, modify, merge,
13
+ publish, distribute, sublicence, and/or sell copies of the Software,
14
+ and to permit persons to whom the Software is furnished to do so,
15
+ subject to the following conditions:
16
+
17
+ 1. Redistributions of source code must retain the above copyright
18
+ notice, this list of conditions, and the following disclaimer.
19
+
20
+ 2. Redistributions in binary form must reproduce the above
21
+ copyright notice, this list of conditions and the following
22
+ disclaimer in the documentation and/or other materials provided
23
+ with the distribution, and in the same place and form as other
24
+ copyright, license and disclaimer information.
25
+
26
+ 3. The end-user documentation included with the redistribution, if
27
+ any, must include the following acknowledgment:
28
+
29
+ This product includes software developed by
30
+ David Loren Parsons <http://www.pell.portland.or.us/~orc>
31
+
32
+ in the same place and form as other third-party acknowledgments.
33
+ Alternately, this acknowledgment may appear in the software
34
+ itself, in the same form and location as other such third-party
35
+ acknowledgments.
36
+
37
+ 4. Except as contained in this notice, the name of David Loren
38
+ Parsons shall not be used in advertising or otherwise to promote
39
+ the sale, use or other dealings in this Software without prior
40
+ written authorization from David Loren Parsons.
41
+
42
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
43
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
44
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
45
+ IN NO EVENT SHALL DAVID LOREN PARSONS BE LIABLE FOR ANY DIRECT,
46
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
47
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
48
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
50
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
51
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
52
+ OF THE POSSIBILITY OF SUCH DAMAGE.
data/README ADDED
@@ -0,0 +1,54 @@
1
+ = RDiscount - Discount Markdown For Ruby
2
+
3
+ Discount is an implementation of John Gruber's Markdown markup
4
+ language in C. It implements all of the language as described in
5
+ <http://daringfireball.net/projects/markdown/syntax>
6
+ and passes the Markdown test suite at
7
+ <http://daringfireball.net/projects/downloads/MarkdownTest_1.0.zip>
8
+
9
+ Discount was developed by
10
+ {David Loren Parsons}[http://www.pell.portland.or.us/~orc]. The
11
+ RDiscount extension was developed by {Ryan Tomayko}[http://tomayko.com/].
12
+
13
+ == Installation, Hacking
14
+
15
+ RDiscount Gem releases are published to RubyForge and can be installed as
16
+ follows:
17
+
18
+ $ [sudo] gem install rdiscount
19
+
20
+ The RDiscount sources are available via Git:
21
+
22
+ $ git clone git://github.com/rtomayko/rdiscount.git
23
+ $ cd rdiscount
24
+ $ rake --tasks
25
+
26
+ For more information, see:
27
+
28
+ http://github.com/rtomayko/rdiscount
29
+
30
+ == Usage
31
+
32
+ RDiscount implements the basic protocol popularized by RedCloth and adopted
33
+ by BlueCloth:
34
+
35
+ require 'rdiscount'
36
+ markdown = RDiscount.new("Hello World!")
37
+ puts markdown.to_html
38
+
39
+ Inject RDiscount into your BlueCloth-using code by replacing your bluecloth
40
+ require statements with the following:
41
+
42
+ begin
43
+ require 'rdiscount'
44
+ BlueCloth = RDiscount
45
+ rescue LoadError
46
+ require 'bluecloth'
47
+ end
48
+
49
+ == License
50
+
51
+ Discount is free software; it is released under a BSD-style license
52
+ that allows you to do as you wish with it as long as you don't attempt
53
+ to claim it as your own work. RDiscount adopts Discount's license
54
+ verbatim. See the file COPYING for more information.
data/Rakefile ADDED
@@ -0,0 +1,169 @@
1
+ require 'rake/clean'
2
+ require 'rake/packagetask'
3
+ require 'rake/gempackagetask'
4
+
5
+ task :default => 'test:unit'
6
+
7
+ DLEXT = Config::CONFIG['DLEXT']
8
+ VERS = '1.2.6.2'
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','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 = ['README', '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
28
+
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
34
+ end
35
+
36
+
37
+ # ==========================================================
38
+ # Ruby Extension
39
+ # ==========================================================
40
+
41
+ file 'ext/Makefile' => FileList['ext/{*.c,*.h,*.rb}'] do
42
+ chdir('ext') { ruby 'extconf.rb' }
43
+ end
44
+ CLEAN.include 'ext/Makefile', 'ext/mkmf.log'
45
+
46
+ file "ext/rdiscount.#{DLEXT}" => FileList['ext/Makefile', 'ext/*.{c,h,rb}'] do |f|
47
+ sh 'cd ext && make'
48
+ end
49
+ CLEAN.include 'ext/*.{o,bundle,so,dll}'
50
+
51
+ file "lib/rdiscount.#{DLEXT}" => "ext/rdiscount.#{DLEXT}" do |f|
52
+ cp f.prerequisites, "lib/", :preserve => true
53
+ end
54
+
55
+ desc 'Build the rdiscount extension'
56
+ task :build => "lib/rdiscount.#{DLEXT}"
57
+
58
+
59
+ # ==========================================================
60
+ # Testing
61
+ # ==========================================================
62
+
63
+ desc 'Run unit tests'
64
+ task 'test:unit' => [:build] do |t|
65
+ ruby 'test/rdiscount_test.rb'
66
+ end
67
+
68
+ desc 'Run conformance tests (MARKDOWN_TEST_VER=1.0)'
69
+ task 'test:conformance' => [:build] do |t|
70
+ script = "#{pwd}/bin/rdiscount"
71
+ test_version = ENV['MARKDOWN_TEST_VER'] || '1.0'
72
+ chdir("test/MarkdownTest_#{test_version}") do
73
+ sh "./MarkdownTest.pl --script='#{script}' --tidy"
74
+ end
75
+ end
76
+
77
+ desc 'Run version 1.0 conformance suite'
78
+ task 'test:conformance:1.0' => 'test:conformance'
79
+
80
+ desc 'Run 1.0.3 conformance suite'
81
+ task 'test:conformance:1.0.3' => [:build] do |t|
82
+ ENV['MARKDOWN_TEST_VER'] = '1.0.3'
83
+ Rake::Task['test:conformance'].invoke
84
+ end
85
+
86
+ desc 'Run unit and conformance tests'
87
+ task :test => %w[test:unit test:conformance]
88
+
89
+ desc 'Run benchmarks'
90
+ task :benchmark => :build do |t|
91
+ $:.unshift 'lib'
92
+ load 'test/benchmark.rb'
93
+ end
94
+
95
+ # ==========================================================
96
+ # Documentation
97
+ # ==========================================================
98
+
99
+ desc 'Generate API documentation'
100
+ task :doc => 'doc/index.html'
101
+
102
+ file 'doc/index.html' => FileList['lib/rdiscount.rb','README'] do |f|
103
+ sh((<<-end).gsub(/\s+/, ' '))
104
+ hanna --charset utf8 \
105
+ --fmt html \
106
+ --inline-source \
107
+ --line-numbers \
108
+ --main RDiscount \
109
+ --op doc \
110
+ --title 'RDiscount API Documentation' \
111
+ #{f.prerequisites.join(' ')}
112
+ end
113
+ end
114
+
115
+ CLEAN.include 'doc'
116
+
117
+
118
+ # ==========================================================
119
+ # Rubyforge
120
+ # ==========================================================
121
+
122
+ PKGNAME = "pkg/rdiscount-#{VERS}"
123
+
124
+ desc 'Publish new release to rubyforge'
125
+ task :release => [ "#{PKGNAME}.gem", "#{PKGNAME}.tar.gz" ] do |t|
126
+ sh <<-end
127
+ rubyforge add_release wink rdiscount #{VERS} #{PKGNAME}.gem &&
128
+ rubyforge add_file wink rdiscount #{VERS} #{PKGNAME}.tar.gz
129
+ end
130
+ end
131
+
132
+
133
+ # ==========================================================
134
+ # Discount Submodule
135
+ # ==========================================================
136
+
137
+ namespace :submodule do
138
+ desc 'Init the upstream submodule'
139
+ task :init do |t|
140
+ unless File.exist? 'discount/markdown.c'
141
+ rm_rf 'discount'
142
+ sh 'git submodule init discount'
143
+ sh 'git submodule update discount'
144
+ end
145
+ end
146
+
147
+ desc 'Update the discount submodule'
148
+ task :update => :init do
149
+ sh 'git submodule update discount' unless File.symlink?('discount')
150
+ end
151
+
152
+ file 'discount/markdown.c' do
153
+ Rake::Task['submodule:init'].invoke
154
+ end
155
+ task :exist => 'discount/markdown.c'
156
+ end
157
+
158
+ desc 'Gather required discount sources into extension directory'
159
+ task :gather => 'submodule:exist' do |t|
160
+ files =
161
+ FileList[
162
+ 'discount/{markdown,mkdio,amalloc,cstring}.h',
163
+ 'discount/{markdown,docheader,dumptree,generate,mkdio,resource}.c'
164
+ ]
165
+ cp files, 'ext/',
166
+ :preserve => true,
167
+ :verbose => true
168
+ end
169
+
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/config.h ADDED
@@ -0,0 +1,8 @@
1
+
2
+ /* rdiscount extension configuration */
3
+
4
+ #undef USE_AMALLOC
5
+
6
+ #define TABSTOP 4
7
+ #define COINTOSS() (random()&1)
8
+ #define INITRNG(x) srandom((unsigned int)x)
data/ext/cstring.h ADDED
@@ -0,0 +1,68 @@
1
+ /* two template types: STRING(t) which defines a pascal-style string
2
+ * of element (t) [STRING(char) is the closest to the pascal string],
3
+ * and ANCHOR(t) which defines a baseplate that a linked list can be
4
+ * built up from. [The linked list /must/ contain a ->next pointer
5
+ * for linking the list together with.]
6
+ */
7
+ #ifndef _CSTRING_D
8
+ #define _CSTRING_D
9
+
10
+ #include <string.h>
11
+ #include <stdlib.h>
12
+
13
+ #include "amalloc.h"
14
+
15
+ /* expandable Pascal-style string.
16
+ */
17
+ #define STRING(type) struct { type *text; int size, alloc; }
18
+
19
+ #define CREATE(x) T(x) = (void*)(S(x) = (x).alloc = 0)
20
+ #define EXPAND(x) (S(x)++)[(S(x) < (x).alloc) \
21
+ ? (T(x)) \
22
+ : (T(x) = T(x) ? realloc(T(x), sizeof T(x)[0] * ((x).alloc += 100)) \
23
+ : malloc(sizeof T(x)[0] * ((x).alloc += 100)) )]
24
+
25
+ #define DELETE(x) (x).alloc ? (free(T(x)), S(x) = (x).alloc = 0) \
26
+ : ( S(x) = 0 )
27
+ #define CLIP(t,i,sz) \
28
+ ( ((i) >= 0) && ((sz) > 0) && (((i)+(sz)) <= S(t)) ) ? \
29
+ (memmove(&T(t)[i], &T(t)[i+sz], (S(t)-(i+sz)+1)*sizeof(T(t)[0])), \
30
+ S(t) -= (sz)) : -1
31
+
32
+ #define RESERVE(x, sz) T(x) = ((x).alloc > S(x) + (sz) \
33
+ ? T(x) \
34
+ : T(x) \
35
+ ? realloc(T(x), sizeof T(x)[0] * ((x).alloc = 100+(sz)+S(x))) \
36
+ : malloc(sizeof T(x)[0] * ((x).alloc = 100+(sz)+S(x))))
37
+ #define SUFFIX(t,p,sz) \
38
+ memcpy(((S(t) += (sz)) - (sz)) + \
39
+ (T(t) = T(t) ? realloc(T(t), sizeof T(t)[0] * ((t).alloc += sz)) \
40
+ : malloc(sizeof T(t)[0] * ((t).alloc += sz))), \
41
+ (p), sizeof(T(t)[0])*(sz))
42
+
43
+ #define PREFIX(t,p,sz) \
44
+ RESERVE( (t), (sz) ); \
45
+ if ( S(t) ) { memmove(T(t)+(sz), T(t), S(t)); } \
46
+ memcpy( T(t), (p), (sz) ); \
47
+ S(t) += (sz)
48
+
49
+ /* reference-style links (and images) are stored in an array
50
+ */
51
+ #define T(x) (x).text
52
+ #define S(x) (x).size
53
+
54
+ /* abstract anchor type that defines a list base
55
+ * with a function that attaches an element to
56
+ * the end of the list.
57
+ *
58
+ * the list base field is named .text so that the T()
59
+ * macro will work with it.
60
+ */
61
+ #define ANCHOR(t) struct { t *text, *end; }
62
+
63
+ #define ATTACH(t, p) ( (t).text ?( ((t).end->next = (p)), ((t).end = (p)) ) \
64
+ :( ((t).text = (t).end = (p)) ) )
65
+
66
+ typedef STRING(char) Cstring;
67
+
68
+ #endif/*_CSTRING_D*/
data/ext/docheader.c ADDED
@@ -0,0 +1,43 @@
1
+ /*
2
+ * docheader -- get values from the document header
3
+ *
4
+ * Copyright (C) 2007 David L Parsons.
5
+ * The redistribution terms are provided in the COPYRIGHT file that must
6
+ * be distributed with this source code.
7
+ */
8
+ #include "config.h"
9
+ #include <stdio.h>
10
+ #include <stdlib.h>
11
+ #include <ctype.h>
12
+
13
+ #include "cstring.h"
14
+ #include "markdown.h"
15
+ #include "amalloc.h"
16
+
17
+ #define afterdle(t) (T((t)->text) + (t)->dle)
18
+
19
+ char *
20
+ mkd_doc_title(Document *doc)
21
+ {
22
+ if ( doc && doc->headers )
23
+ return afterdle(doc->headers);
24
+ return 0;
25
+ }
26
+
27
+
28
+ char *
29
+ mkd_doc_author(Document *doc)
30
+ {
31
+ if ( doc && doc->headers && doc->headers->next )
32
+ return afterdle(doc->headers->next);
33
+ return 0;
34
+ }
35
+
36
+
37
+ char *
38
+ mkd_doc_date(Document *doc)
39
+ {
40
+ if ( doc && doc->headers && doc->headers->next && doc->headers->next->next )
41
+ return afterdle(doc->headers->next->next);
42
+ return 0;
43
+ }
data/ext/dumptree.c ADDED
@@ -0,0 +1,147 @@
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 "markdown.h"
9
+ #include "cstring.h"
10
+ #include "amalloc.h"
11
+
12
+ struct frame {
13
+ int indent;
14
+ char c;
15
+ };
16
+
17
+ typedef STRING(struct frame) Stack;
18
+
19
+ static char *
20
+ Pptype(int typ)
21
+ {
22
+ switch (typ) {
23
+ case WHITESPACE: return "whitespace";
24
+ case CODE : return "code";
25
+ case QUOTE : return "quote";
26
+ case MARKUP : return "markup";
27
+ case HTML : return "html";
28
+ case DL : return "dl";
29
+ case UL : return "ul";
30
+ case OL : return "ol";
31
+ case LISTITEM : return "item";
32
+ case HDR : return "header";
33
+ case HR : return "HR";
34
+ default : return "mystery node!";
35
+ }
36
+ }
37
+
38
+ static void
39
+ pushpfx(int indent, char c, Stack *sp)
40
+ {
41
+ struct frame *q = &EXPAND(*sp);
42
+
43
+ q->indent = indent;
44
+ q->c = c;
45
+ }
46
+
47
+
48
+ static void
49
+ poppfx(Stack *sp)
50
+ {
51
+ S(*sp)--;
52
+ }
53
+
54
+
55
+ static void
56
+ changepfx(Stack *sp, char c)
57
+ {
58
+ char ch;
59
+
60
+ if ( !S(*sp) ) return;
61
+
62
+ ch = T(*sp)[S(*sp)-1].c;
63
+
64
+ if ( ch == '+' || ch == '|' )
65
+ T(*sp)[S(*sp)-1].c = c;
66
+ }
67
+
68
+
69
+ static void
70
+ printpfx(Stack *sp, FILE *f)
71
+ {
72
+ int i;
73
+ char c;
74
+
75
+ if ( !S(*sp) ) return;
76
+
77
+ c = T(*sp)[S(*sp)-1].c;
78
+
79
+ if ( c == '+' || c == '-' ) {
80
+ fprintf(f, "--%c", c);
81
+ T(*sp)[S(*sp)-1].c = (c == '-') ? ' ' : '|';
82
+ }
83
+ else
84
+ for ( i=0; i < S(*sp); i++ ) {
85
+ if ( i )
86
+ fprintf(f, " ");
87
+ fprintf(f, "%*s%c", T(*sp)[i].indent + 2, " ", T(*sp)[i].c);
88
+ if ( T(*sp)[i].c == '`' )
89
+ T(*sp)[i].c = ' ';
90
+ }
91
+ fprintf(f, "--");
92
+ }
93
+
94
+
95
+ static void
96
+ dumptree(Paragraph *pp, Stack *sp, FILE *f)
97
+ {
98
+ int count;
99
+ Line *p;
100
+ int d;
101
+ static char *Begin[] = { 0, "P", "center" };
102
+
103
+ while ( pp ) {
104
+ if ( !pp->next )
105
+ changepfx(sp, '`');
106
+ printpfx(sp, f);
107
+
108
+ d = fprintf(f, "[%s", Pptype(pp->typ));
109
+ if ( pp->align )
110
+ d += fprintf(f, ", <%s>", Begin[pp->align]);
111
+
112
+ for (count=0, p=pp->text; p; ++count, (p = p->next) )
113
+ ;
114
+
115
+ if ( count )
116
+ d += fprintf(f, ", %d line%s", count, (count==1)?"":"s");
117
+
118
+ d += fprintf(f, "]");
119
+
120
+ if ( pp->down ) {
121
+ pushpfx(d, pp->down->next ? '+' : '-', sp);
122
+ dumptree(pp->down, sp, f);
123
+ poppfx(sp);
124
+ }
125
+ else fputc('\n', f);
126
+ pp = pp->next;
127
+ }
128
+ }
129
+
130
+
131
+ int
132
+ mkd_dump(Document *doc, FILE *out, int flags, char *title)
133
+ {
134
+ Stack stack;
135
+
136
+ if (mkd_compile(doc, flags) ) {
137
+
138
+ CREATE(stack);
139
+ pushpfx(fprintf(out, "%s", title), doc->code->next ? '+' : '-', &stack);
140
+ dumptree(doc->code, &stack, out);
141
+ DELETE(stack);
142
+
143
+ mkd_cleanup(doc);
144
+ return 0;
145
+ }
146
+ return -1;
147
+ }