rdiscount 1.2.6.2

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/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
+ }