nathanhoad-moredown 1.0.0

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.markdown ADDED
@@ -0,0 +1,66 @@
1
+ Discount Markdown Processor for Ruby (with some extras)
2
+ =======================================================
3
+
4
+ Discount is an implementation of John Gruber's Markdown markup language in C. It
5
+ implements all of the language described in [the markdown syntax document][1] and
6
+ passes the [Markdown 1.0 test suite][2].
7
+
8
+ Discount was developed by [David Loren Parsons][3]. The Ruby extension was
9
+ developed by [Ryan Tomayko][4] and extended by [Nathan Hoad][5].
10
+
11
+ [1]: http://daringfireball.net/projects/markdown/syntax
12
+ [2]: http://daringfireball.net/projects/downloads/MarkdownTest_1.0.zip
13
+ [3]: http://www.pell.portland.or.us/~orc
14
+ [4]: http://tomayko.com/
15
+ [5]: http://nathanhoad.net/
16
+
17
+ Installation, Hacking
18
+ ---------------------
19
+
20
+ The Moredown gem can be installed from Github:
21
+
22
+ $ gem sources -a http://gems.github.com
23
+ $ [sudo] gem install nathanhoad-moredown
24
+
25
+ The Moredown sources are available via Git:
26
+
27
+ $ git clone git://github.com/nathanhoad/moredown.git
28
+ $ cd moredown
29
+ $ rake --tasks
30
+
31
+ For more information, see [the project page](http://github.com/nathanhoad/moredown).
32
+
33
+ Usage
34
+ -----
35
+
36
+ Moredown can be used in any way that RDiscount can be (see below). In addition, Moredown
37
+ implements some extra syntax options via a static formatting method:
38
+
39
+ require 'nathanhoad-moredown'
40
+ html = Moredown.text_to_html("Hello World!")
41
+
42
+ RDiscount implements the basic protocol popularized by RedCloth and adopted
43
+ by BlueCloth:
44
+
45
+ require 'nathanhoad-moredown'
46
+ markdown = Moredown.new("Hello World!")
47
+ puts markdown.to_html
48
+
49
+ Inject Moredown into your BlueCloth-using code by replacing your bluecloth
50
+ require statements with the following:
51
+
52
+ begin
53
+ require 'nathanhoad-moredown'
54
+ BlueCloth = Moredown
55
+ rescue LoadError
56
+ require 'bluecloth'
57
+ end
58
+
59
+
60
+ COPYING
61
+ -------
62
+
63
+ Discount is free software; it is released under a BSD-style license
64
+ that allows you to do as you wish with it as long as you don't attempt
65
+ to claim it as your own work. RDiscount adopts Discount's license
66
+ verbatim. See the file `COPYING` for more information.
data/Rakefile ADDED
@@ -0,0 +1,183 @@
1
+ require 'rake/clean'
2
+
3
+ task :default => :test
4
+
5
+ # PACKAGING =================================================================
6
+
7
+ # Load the gemspec using the same limitations as github
8
+ $spec =
9
+ begin
10
+ require 'rubygems/specification'
11
+ data = File.read('moredown.gemspec')
12
+ spec = nil
13
+ Thread.new { spec = eval("$SAFE = 3\n#{data}") }.join
14
+ spec
15
+ end
16
+
17
+ def package(ext='')
18
+ "pkg/moredown-#{$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/ moredown.gemspec] + $spec.files do |f|
32
+ sh "gem build moredown.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/moredown.rb')[/^\s*VERSION = .*/]
44
+ line.match(/.*VERSION = '(.*)'/)[1]
45
+ end
46
+
47
+ file 'moredown.gemspec' => FileList['Rakefile','lib/moredown.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
66
+
67
+ # ==========================================================
68
+ # Ruby Extension
69
+ # ==========================================================
70
+
71
+ DLEXT = Config::CONFIG['DLEXT']
72
+
73
+ file 'ext/Makefile' => FileList['ext/{*.c,*.h,*.rb}'] do
74
+ chdir('ext') { ruby 'extconf.rb' }
75
+ end
76
+ CLEAN.include 'ext/Makefile', 'ext/mkmf.log'
77
+
78
+ file "ext/rdiscount.#{DLEXT}" => FileList['ext/Makefile', 'ext/*.{c,h,rb}'] do |f|
79
+ sh 'cd ext && make'
80
+ end
81
+ CLEAN.include 'ext/*.{o,bundle,so,dll}'
82
+
83
+ file "lib/rdiscount.#{DLEXT}" => "ext/rdiscount.#{DLEXT}" do |f|
84
+ cp f.prerequisites, "lib/", :preserve => true
85
+ end
86
+
87
+ desc 'Build the rdiscount extension'
88
+ task :build => "lib/rdiscount.#{DLEXT}"
89
+
90
+ # ==========================================================
91
+ # Testing
92
+ # ==========================================================
93
+
94
+ desc 'Run unit tests'
95
+ task 'test:unit' => [:build] do |t|
96
+ sh 'testrb test/moredown_test.rb test/markdown_test.rb test/rdiscount_test.rb'
97
+ end
98
+
99
+ desc 'Run conformance tests (MARKDOWN_TEST_VER=1.0)'
100
+ task 'test:conformance' => [:build] do |t|
101
+ script = "#{pwd}/bin/rdiscount"
102
+ test_version = ENV['MARKDOWN_TEST_VER'] || '1.0.3'
103
+ chdir("test/MarkdownTest_#{test_version}") do
104
+ sh "./MarkdownTest.pl --script='#{script}' --tidy"
105
+ end
106
+ end
107
+
108
+ desc 'Run version 1.0 conformance suite'
109
+ task 'test:conformance:1.0' => [:build] do |t|
110
+ ENV['MARKDOWN_TEST_VER'] = '1.0'
111
+ Rake::Task['test:conformance'].invoke
112
+ end
113
+
114
+ desc 'Run 1.0.3 conformance suite'
115
+ task 'test:conformance:1.0.3' => [:build] do |t|
116
+ ENV['MARKDOWN_TEST_VER'] = '1.0.3'
117
+ Rake::Task['test:conformance'].invoke
118
+ end
119
+
120
+ desc 'Run unit and conformance tests'
121
+ task :test => %w[test:unit test:conformance]
122
+
123
+ desc 'Run benchmarks'
124
+ task :benchmark => :build do |t|
125
+ $:.unshift 'lib'
126
+ load 'test/benchmark.rb'
127
+ end
128
+
129
+ # ==========================================================
130
+ # Documentation
131
+ # ==========================================================
132
+
133
+ desc 'Generate API documentation'
134
+ task :doc => 'doc/index.html'
135
+
136
+ file 'doc/index.html' => FileList['lib/*.rb'] do |f|
137
+ sh((<<-end).gsub(/\s+/, ' '))
138
+ hanna --charset utf8 \
139
+ --fmt html \
140
+ --inline-source \
141
+ --line-numbers \
142
+ --main Moredown \
143
+ --op doc \
144
+ --title 'Moredown API Documentation' \
145
+ #{f.prerequisites.join(' ')}
146
+ end
147
+ end
148
+
149
+ CLEAN.include 'doc'
150
+
151
+ # ==========================================================
152
+ # Update package's Discount sources
153
+ # ==========================================================
154
+
155
+ desc 'Gather required discount sources into extension directory'
156
+ task :gather => 'discount' do |t|
157
+ files =
158
+ FileList[
159
+ 'discount/{markdown,mkdio,amalloc,cstring}.h',
160
+ 'discount/{markdown,docheader,dumptree,generate,mkdio,resource,toc,Csio}.c'
161
+ ]
162
+ cp files, 'ext/',
163
+ :preserve => true,
164
+ :verbose => true
165
+ end
166
+
167
+ # best. task. ever.
168
+ file 'discount' do |f|
169
+ STDERR.puts((<<-TEXT).gsub(/^ +/, ''))
170
+ Sorry, this operation requires a human. Tell your human to:
171
+
172
+ Grab a discount tarball from:
173
+ http://www.pell.portland.or.us/~orc/Code/discount/
174
+
175
+ Extract here with something like:
176
+ tar xvzf discount-1.2.9.tar.gz
177
+
178
+ Create a discount symlink pointing at the version directory:
179
+ ln -hsf discount-1.2.9 discount
180
+
181
+ TEXT
182
+ fail "discount sources required."
183
+ end
data/bin/rdiscount ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $: << File.expand_path(File.dirname(__FILE__) + "/../lib")
4
+ require 'rdiscount'
5
+ STDOUT.write(RDiscount.new(ARGF.read).to_html)
data/ext/Csio.c ADDED
@@ -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
+ }
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,9 @@
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)
9
+ #define RELAXED_EMPHASIS 1
data/ext/cstring.h ADDED
@@ -0,0 +1,73 @@
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
+ #define ALL(x) (x).alloc
54
+
55
+ /* abstract anchor type that defines a list base
56
+ * with a function that attaches an element to
57
+ * the end of the list.
58
+ *
59
+ * the list base field is named .text so that the T()
60
+ * macro will work with it.
61
+ */
62
+ #define ANCHOR(t) struct { t *text, *end; }
63
+
64
+ #define ATTACH(t, p) ( (t).text ?( ((t).end->next = (p)), ((t).end = (p)) ) \
65
+ :( ((t).text = (t).end = (p)) ) )
66
+
67
+ typedef STRING(char) Cstring;
68
+
69
+ extern void Csputc(int, Cstring *);
70
+ extern int Csprintf(Cstring *, char *, ...);
71
+ extern void Csreparse(Cstring *, char *, int, int);
72
+
73
+ #endif/*_CSTRING_D*/