rdiscountwl 1.0.0.1
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.
- checksums.yaml +7 -0
- data/BUILDING +151 -0
- data/COPYING +33 -0
- data/README.markdown +73 -0
- data/Rakefile +224 -0
- data/bin/rdiscount +13 -0
- data/ext/Csio.c +61 -0
- data/ext/VERSION +1 -0
- data/ext/amalloc.c +135 -0
- data/ext/amalloc.h +29 -0
- data/ext/basename.c +43 -0
- data/ext/blocktags +33 -0
- data/ext/config.h +25 -0
- data/ext/css.c +87 -0
- data/ext/cstring.h +77 -0
- data/ext/docheader.c +49 -0
- data/ext/dumptree.c +151 -0
- data/ext/emmatch.c +188 -0
- data/ext/extconf.rb +49 -0
- data/ext/flags.c +91 -0
- data/ext/generate.c +1865 -0
- data/ext/github_flavoured.c +100 -0
- data/ext/html5.c +22 -0
- data/ext/markdown.c +1361 -0
- data/ext/markdown.h +238 -0
- data/ext/mkdio.c +360 -0
- data/ext/mkdio.h +122 -0
- data/ext/mktags.c +89 -0
- data/ext/pgm_options.c +146 -0
- data/ext/pgm_options.h +9 -0
- data/ext/rdiscount.c +150 -0
- data/ext/resource.c +159 -0
- data/ext/setup.c +39 -0
- data/ext/tags.c +94 -0
- data/ext/tags.h +19 -0
- data/ext/toc.c +114 -0
- data/ext/version.c +13 -0
- data/ext/xml.c +82 -0
- data/ext/xmlpage.c +46 -0
- data/lib/markdown.rb +1 -0
- data/lib/rdiscount.rb +108 -0
- data/man/markdown.7 +1020 -0
- data/man/rdiscount.1 +22 -0
- data/man/rdiscount.1.ronn +24 -0
- data/rdiscount.gemspec +71 -0
- data/test/benchmark.rb +56 -0
- data/test/benchmark.txt +306 -0
- data/test/markdown_test.rb +158 -0
- data/test/rdiscount_test.rb +276 -0
- metadata +99 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5cf4a08fc2c37e30426673510f7b439d449c0259aa7f1e44d29d9bb0ccdb8982
|
4
|
+
data.tar.gz: 72f862b4b48d71ce5f5928c5cd26d002b77fb9d48fd1ab30922a807ac79b9481
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ee42bb1796afd8e69375f57848787e739ccb8cc1d94d0d7ff859e39c605e1e8765301c42a53080f4f3bd2c5f769475fb543c26c13326baaaf6d9e2fa2c4bf844
|
7
|
+
data.tar.gz: 42e679b35f2398656d9521ea69a9d3d84fcccb8db56a8c35d0a94db9287b0446283a57308b01b7fc26d0c42776a8d34eb4704944dcc82ba8542f2034c0260e7f
|
data/BUILDING
ADDED
@@ -0,0 +1,151 @@
|
|
1
|
+
BUILDING rdiscount
|
2
|
+
==================
|
3
|
+
|
4
|
+
You'll be needing Ruby, rake, and a basic build environment.
|
5
|
+
|
6
|
+
Build the rdiscount extension for tests and local development:
|
7
|
+
|
8
|
+
$ rake build
|
9
|
+
|
10
|
+
Use your rdiscount working copy when running ruby programs:
|
11
|
+
|
12
|
+
$ export RUBYLIB=~/rdiscount/lib:$RUBYLIB
|
13
|
+
$ ruby some-program.rb
|
14
|
+
|
15
|
+
Gathering changes from an upstream discount clone requires first
|
16
|
+
grabbing the discount submodule into the root of the project and then running
|
17
|
+
the rake gather task to copy discount source files into the ext/ directory:
|
18
|
+
|
19
|
+
$ git submodule update --init
|
20
|
+
Submodule 'discount' (git://github.com/davidfstr/discount.git) registered for path 'discount'
|
21
|
+
Cloning into discount...
|
22
|
+
$ cd discount
|
23
|
+
$ ./configure.sh
|
24
|
+
$ make # ensure it compiles
|
25
|
+
$ cd ..
|
26
|
+
$ rake gather
|
27
|
+
$ rake build
|
28
|
+
|
29
|
+
|
30
|
+
UPGRADING Discount
|
31
|
+
==================
|
32
|
+
|
33
|
+
The most common maintenance task is upgrading the version of Discount that
|
34
|
+
RDiscount is using.
|
35
|
+
|
36
|
+
Before doing anything, make sure you can build the current (unmodified) version
|
37
|
+
of RDiscount. See the section above for details.
|
38
|
+
|
39
|
+
Update the Discount submodule to the desired version:
|
40
|
+
|
41
|
+
$ cd discount
|
42
|
+
$ git fetch
|
43
|
+
$ git checkout v2.0.7.x # insert desired version
|
44
|
+
$ cd ..
|
45
|
+
|
46
|
+
Copy the new Discount sources to the appropriate directories for RDiscount:
|
47
|
+
|
48
|
+
$ rake gather
|
49
|
+
|
50
|
+
Update rdiscount.gemspec to include all *.c, *.h, and *.rb files in
|
51
|
+
ext. This must be done manually. Here's a quick way to get the full list:
|
52
|
+
|
53
|
+
$ echo ext/*.c ext/*.h ext/*.rb ext/blocktags ext/VERSION | tr ' ' "\n" | sort
|
54
|
+
|
55
|
+
(There is an old Rakefile target called "rdiscount.gemspec" that looks like it
|
56
|
+
is designed to perform an update of these files, however I haven't tested it.)
|
57
|
+
|
58
|
+
Build the RDiscount gem. If you get errors related to missing files
|
59
|
+
in ext, make sure you updated the gemspec correctly in the previous step.
|
60
|
+
|
61
|
+
$ gem build rdiscount.gemspec
|
62
|
+
|
63
|
+
Install this new gem locally. It is recommended that you use RVM to
|
64
|
+
create an isolated installation environment. If you get an error after the line
|
65
|
+
"Building native extensions", see the troubleshooting section below.
|
66
|
+
|
67
|
+
$ rvm ruby@rdiscount --create # recommended; requires RVM
|
68
|
+
$ gem install rdiscount-*.gem
|
69
|
+
|
70
|
+
Make sure the gem can be imported:
|
71
|
+
|
72
|
+
$ ruby -e 'require "rdiscount"'
|
73
|
+
|
74
|
+
Make sure the tests (still) pass:
|
75
|
+
|
76
|
+
$ rake test
|
77
|
+
|
78
|
+
Worked? Swell! The hard part is past.
|
79
|
+
|
80
|
+
Check the Discount release notes to determine whether it has gained any new
|
81
|
+
features that should be exposed through the RDiscount Ruby interface
|
82
|
+
(lib/rdiscount.rb), such as new MKD_* flags or configure flags.
|
83
|
+
If so, update the Ruby interface.
|
84
|
+
|
85
|
+
If the ./configure.sh line needs to be changed to support new features,
|
86
|
+
you will need to port some #defines from discount/config.h to ext/config.h
|
87
|
+
manually to get RDiscount's embedded Discount to use the same configure flags.
|
88
|
+
|
89
|
+
For new Discount extensions via new MKD_* flags, you will need to update:
|
90
|
+
|
91
|
+
* lib/rdiscount.rb with new accessors and
|
92
|
+
* the rb_rdiscount__get_flags function in ext/rdiscount.c with new
|
93
|
+
accessor-to-flag mappings for each new extension.
|
94
|
+
|
95
|
+
You should also look for RDiscount-specific bugs & feature requests in the
|
96
|
+
GitHub tracker and fix a few.
|
97
|
+
|
98
|
+
If any bugs were fixed or features added be sure to also add new tests!
|
99
|
+
And don't forget to rerun the preexisting tests.
|
100
|
+
|
101
|
+
Update the CHANGELOG.
|
102
|
+
|
103
|
+
Update rdiscount.gemspec with the new RDiscount version number and date.
|
104
|
+
Also update the VERSION constant in lib/rdiscount.rb.
|
105
|
+
Push that change as the final commit with a message in the format
|
106
|
+
"2.0.7 release".
|
107
|
+
|
108
|
+
Tag the release commit:
|
109
|
+
|
110
|
+
$ git tag 2.0.7 # insert desired version
|
111
|
+
|
112
|
+
Rebuild the gem file and push it to RubyGems.
|
113
|
+
|
114
|
+
$ gem build rdiscount.gemspec
|
115
|
+
$ gem push rdiscount-NEW_VERSION.gem
|
116
|
+
|
117
|
+
Announce the new release! For releases with new features it is recommended to
|
118
|
+
write a full blog post.
|
119
|
+
|
120
|
+
|
121
|
+
Troubleshooting Native Extension Issues
|
122
|
+
---------------------------------------
|
123
|
+
|
124
|
+
The most likely place where errors will crop up is when you attempt to build
|
125
|
+
the C extension. If this happens, you will have to debug manually. Below are
|
126
|
+
a few recommended sanity checks:
|
127
|
+
|
128
|
+
Ensure the Makefile is generated correctly:
|
129
|
+
|
130
|
+
$ cd ext
|
131
|
+
$ ruby extconf.rb
|
132
|
+
|
133
|
+
Ensure make succeeds:
|
134
|
+
|
135
|
+
$ make
|
136
|
+
|
137
|
+
If you get linker errors related to there being duplicate symbols for _main,
|
138
|
+
you probably need to update the deploy target of the Rakefile to exclude
|
139
|
+
new *.c files from Discount that have a main function.
|
140
|
+
|
141
|
+
For issues related to config.h or extconf.rb, there was probably some
|
142
|
+
change to Discount's configure.sh that broke them. You will probably need
|
143
|
+
to update these files in ext/ manually.
|
144
|
+
|
145
|
+
For other errors, you'll have to investigate yourself. Common error classes:
|
146
|
+
* 'ext/configure.sh' fails:
|
147
|
+
- Create a patch to the upstream Discount.
|
148
|
+
* Some files missing from ext/ that are present in discount/:
|
149
|
+
- Update 'rake deploy' target to copy more files.
|
150
|
+
* Some files missing when `gem build` is run:
|
151
|
+
- Update gemspec to enumerate the correct files in ext/.
|
data/COPYING
ADDED
@@ -0,0 +1,33 @@
|
|
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
|
+
Redistribution and use in source and binary forms, with or without
|
10
|
+
modification, are permitted provided that the following conditions
|
11
|
+
are met:
|
12
|
+
|
13
|
+
1. Redistributions of works must retain the original copyright notice,
|
14
|
+
this list of conditions and the following disclaimer.
|
15
|
+
2. Redistributions in binary form must reproduce the original copyright
|
16
|
+
notice, this list of conditions and the following disclaimer in the
|
17
|
+
documentation and/or other materials provided with the distribution.
|
18
|
+
3. Neither my name (David L Parsons) nor the names of contributors to
|
19
|
+
this code may be used to endorse or promote products derived
|
20
|
+
from this work without specific prior written permission.
|
21
|
+
|
22
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
23
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
24
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
25
|
+
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
26
|
+
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
27
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
28
|
+
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
29
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
30
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
31
|
+
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
32
|
+
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
33
|
+
POSSIBILITY OF SUCH DAMAGE.
|
data/README.markdown
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
Discount Markdown Processor for Ruby
|
2
|
+
====================================
|
3
|
+
[](https://travis-ci.org/davidfstr/rdiscount)
|
4
|
+
[](https://ci.appveyor.com/project/DavidFoster/rdiscount/branch/master)
|
5
|
+
|
6
|
+
Discount is an implementation of John Gruber's Markdown markup language in C. It
|
7
|
+
implements all of the language described in [the markdown syntax document][1] and
|
8
|
+
passes the [Markdown 1.0 test suite][2].
|
9
|
+
|
10
|
+
CODE: `git clone git://github.com/davidfstr/rdiscount.git`
|
11
|
+
HOME: <http://dafoster.net/projects/rdiscount/>
|
12
|
+
DOCS: <http://rdoc.info/github/davidfstr/rdiscount/master/RDiscount>
|
13
|
+
BUGS: <http://github.com/davidfstr/rdiscount/issues>
|
14
|
+
|
15
|
+
Discount was developed by [David Loren Parsons][3]. The Ruby extension
|
16
|
+
is maintained by [David Foster][4].
|
17
|
+
|
18
|
+
[1]: http://daringfireball.net/projects/markdown/syntax
|
19
|
+
[2]: http://daringfireball.net/projects/downloads/MarkdownTest_1.0.zip
|
20
|
+
[3]: http://www.pell.portland.or.us/~orc
|
21
|
+
[4]: https://github.com/davidfstr
|
22
|
+
|
23
|
+
INSTALL, HACKING
|
24
|
+
----------------
|
25
|
+
|
26
|
+
New releases of RDiscount are published to [RubyGems][]:
|
27
|
+
|
28
|
+
$ [sudo] gem install rdiscount
|
29
|
+
|
30
|
+
The RDiscount sources are available via Git:
|
31
|
+
|
32
|
+
$ git clone git://github.com/davidfstr/rdiscount.git
|
33
|
+
$ cd rdiscount
|
34
|
+
$ rake --tasks
|
35
|
+
|
36
|
+
See the file [BUILDING][] for hacking instructions.
|
37
|
+
|
38
|
+
[RubyGems]: https://rubygems.org/gems/rdiscount
|
39
|
+
[BUILDING]: https://github.com/davidfstr/rdiscount/blob/master/BUILDING
|
40
|
+
|
41
|
+
USAGE
|
42
|
+
-----
|
43
|
+
|
44
|
+
RDiscount implements the basic protocol popularized by RedCloth and adopted
|
45
|
+
by BlueCloth:
|
46
|
+
|
47
|
+
require 'rdiscount'
|
48
|
+
markdown = RDiscount.new("Hello World!")
|
49
|
+
puts markdown.to_html
|
50
|
+
|
51
|
+
Additional processing options can be turned on when creating the
|
52
|
+
RDiscount object:
|
53
|
+
|
54
|
+
markdown = RDiscount.new("Hello World!", :smart, :filter_html)
|
55
|
+
|
56
|
+
Inject RDiscount into your BlueCloth-using code by replacing your bluecloth
|
57
|
+
require statements with the following:
|
58
|
+
|
59
|
+
begin
|
60
|
+
require 'rdiscount'
|
61
|
+
BlueCloth = RDiscount
|
62
|
+
rescue LoadError
|
63
|
+
require 'bluecloth'
|
64
|
+
end
|
65
|
+
|
66
|
+
COPYING
|
67
|
+
-------
|
68
|
+
|
69
|
+
Discount is free software; it is released under a BSD-style license
|
70
|
+
that allows you to do as you wish with it as long as you don't attempt
|
71
|
+
to claim it as your own work. RDiscount adopts Discount's license
|
72
|
+
verbatim. See the file `COPYING` for more information.
|
73
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,224 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'rake/clean'
|
3
|
+
require 'digest/md5'
|
4
|
+
|
5
|
+
task :default => :test
|
6
|
+
|
7
|
+
# ==========================================================
|
8
|
+
# Ruby Extension
|
9
|
+
# ==========================================================
|
10
|
+
|
11
|
+
DLEXT = RbConfig::MAKEFILE_CONFIG['DLEXT']
|
12
|
+
RUBYDIGEST = Digest::MD5.hexdigest(`ruby --version`)
|
13
|
+
|
14
|
+
file "ext/ruby-#{RUBYDIGEST}" do |f|
|
15
|
+
rm_f FileList["ext/ruby-*"]
|
16
|
+
touch f.name
|
17
|
+
end
|
18
|
+
CLEAN.include "ext/ruby-*"
|
19
|
+
|
20
|
+
file 'ext/Makefile' => FileList['ext/*.{c,h,rb}', "ext/ruby-#{RUBYDIGEST}"] do
|
21
|
+
chdir('ext') { ruby 'extconf.rb' }
|
22
|
+
end
|
23
|
+
CLEAN.include 'ext/Makefile', 'ext/mkmf.log'
|
24
|
+
|
25
|
+
file "ext/rdiscount.#{DLEXT}" => FileList["ext/Makefile"] do |f|
|
26
|
+
sh 'cd ext && make clean && make && rm -rf conftest.dSYM'
|
27
|
+
end
|
28
|
+
CLEAN.include 'ext/*.{o,bundle,so,dll}'
|
29
|
+
|
30
|
+
file "lib/rdiscount.#{DLEXT}" => "ext/rdiscount.#{DLEXT}" do |f|
|
31
|
+
cp f.prerequisites, "lib/", :preserve => true
|
32
|
+
end
|
33
|
+
|
34
|
+
desc 'Build the rdiscount extension'
|
35
|
+
task :build => "lib/rdiscount.#{DLEXT}"
|
36
|
+
|
37
|
+
# ==========================================================
|
38
|
+
# Manual
|
39
|
+
# ==========================================================
|
40
|
+
|
41
|
+
file 'man/rdiscount.1' => 'man/rdiscount.1.ronn' do
|
42
|
+
sh "ronn --manual=RUBY -b man/rdiscount.1.ronn"
|
43
|
+
end
|
44
|
+
CLOBBER.include 'man/rdiscount.1'
|
45
|
+
|
46
|
+
desc 'Build manpages'
|
47
|
+
task :man => 'man/rdiscount.1'
|
48
|
+
|
49
|
+
# ==========================================================
|
50
|
+
# Testing
|
51
|
+
# ==========================================================
|
52
|
+
|
53
|
+
require 'rake/testtask'
|
54
|
+
Rake::TestTask.new('test:unit') do |t|
|
55
|
+
t.test_files = FileList['test/*_test.rb']
|
56
|
+
t.ruby_opts += ['-rubygems'] if defined? Gem
|
57
|
+
end
|
58
|
+
task 'test:unit' => [:build]
|
59
|
+
|
60
|
+
desc 'Run conformance tests (MARKDOWN_TEST_VER=1.0)'
|
61
|
+
task 'test:conformance' => [:build] do |t|
|
62
|
+
script = "#{pwd}/bin/rdiscount"
|
63
|
+
test_version = ENV['MARKDOWN_TEST_VER'] || '1.0.3'
|
64
|
+
lib_dir = "#{pwd}/lib"
|
65
|
+
chdir("test/MarkdownTest_#{test_version}") do
|
66
|
+
result = `RUBYLIB=#{lib_dir} ./MarkdownTest.pl --script='#{script}' --tidy`
|
67
|
+
print result
|
68
|
+
fail unless result.include? "; 0 failed."
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
desc 'Run version 1.0 conformance suite'
|
73
|
+
task 'test:conformance:1.0' => [:build] do |t|
|
74
|
+
ENV['MARKDOWN_TEST_VER'] = '1.0'
|
75
|
+
Rake::Task['test:conformance'].invoke
|
76
|
+
end
|
77
|
+
|
78
|
+
desc 'Run 1.0.3 conformance suite'
|
79
|
+
task 'test:conformance:1.0.3' => [:build] do |t|
|
80
|
+
ENV['MARKDOWN_TEST_VER'] = '1.0.3'
|
81
|
+
Rake::Task['test:conformance'].invoke
|
82
|
+
end
|
83
|
+
|
84
|
+
desc 'Run unit and conformance tests'
|
85
|
+
task :test => %w[test:unit test:conformance]
|
86
|
+
|
87
|
+
desc 'Run benchmarks'
|
88
|
+
task :benchmark => :build do |t|
|
89
|
+
$:.unshift 'lib'
|
90
|
+
load 'test/benchmark.rb'
|
91
|
+
end
|
92
|
+
|
93
|
+
# ==========================================================
|
94
|
+
# Documentation
|
95
|
+
# ==========================================================
|
96
|
+
|
97
|
+
desc 'Generate API documentation'
|
98
|
+
task :doc => 'doc/index.html'
|
99
|
+
|
100
|
+
file 'doc/index.html' => FileList['lib/*.rb'] do |f|
|
101
|
+
sh((<<-end).gsub(/\s+/, ' '))
|
102
|
+
hanna --charset utf8 --fmt html --inline-source --line-numbers \
|
103
|
+
--main RDiscount --op doc --title 'RDiscount API Documentation' \
|
104
|
+
#{f.prerequisites.join(' ')}
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
CLEAN.include 'doc'
|
109
|
+
|
110
|
+
# ==========================================================
|
111
|
+
# Update package's Discount sources
|
112
|
+
# ==========================================================
|
113
|
+
|
114
|
+
desc 'Gather required discount sources into extension directory'
|
115
|
+
task :gather => 'discount/markdown.h' do |t|
|
116
|
+
# Files unique to /ext that should not be overridden
|
117
|
+
rdiscount_ext_files = [
|
118
|
+
"config.h",
|
119
|
+
"extconf.rb",
|
120
|
+
"rdiscount.c",
|
121
|
+
]
|
122
|
+
|
123
|
+
# Files in /discount that have a main function and should not be copied to /ext
|
124
|
+
discount_c_files_with_main_function = [
|
125
|
+
"main.c",
|
126
|
+
"makepage.c",
|
127
|
+
"mkd2html.c",
|
128
|
+
"theme.c",
|
129
|
+
]
|
130
|
+
|
131
|
+
# Ensure configure.sh was run
|
132
|
+
if not File.exists? 'discount/mkdio.h'
|
133
|
+
abort "discount/mkdio.h not found. Did you run ./configure.sh in the discount directory?"
|
134
|
+
end
|
135
|
+
|
136
|
+
# Delete all *.c and *.h files from ext that are not specific to RDiscount.
|
137
|
+
Dir.chdir("ext") do
|
138
|
+
c_files_to_delete = Dir["*.c"].select { |e| !rdiscount_ext_files.include? e }
|
139
|
+
h_files_to_delete = Dir["*.h"].select { |e| !rdiscount_ext_files.include? e }
|
140
|
+
|
141
|
+
rm (c_files_to_delete + h_files_to_delete),
|
142
|
+
:verbose => true
|
143
|
+
end
|
144
|
+
|
145
|
+
# Copy all *.c and *.h files from discount -> ext except those that
|
146
|
+
# RDiscount overrides. Also exclude Discount files with main functions.
|
147
|
+
Dir.chdir("discount") do
|
148
|
+
c_files_to_copy = Dir["*.c"].select { |e|
|
149
|
+
(!rdiscount_ext_files.include? e) &&
|
150
|
+
(!discount_c_files_with_main_function.include? e)
|
151
|
+
}
|
152
|
+
h_files_to_copy = Dir["*.h"].select { |e| !rdiscount_ext_files.include? e }
|
153
|
+
|
154
|
+
cp (c_files_to_copy + h_files_to_copy), '../ext/',
|
155
|
+
:preserve => true,
|
156
|
+
:verbose => true
|
157
|
+
end
|
158
|
+
|
159
|
+
# Copy special files from discount -> ext
|
160
|
+
cp 'discount/blocktags', 'ext/'
|
161
|
+
cp 'discount/VERSION', 'ext/'
|
162
|
+
|
163
|
+
# Copy man page
|
164
|
+
cp 'discount/markdown.7', 'man/'
|
165
|
+
end
|
166
|
+
|
167
|
+
file 'discount/markdown.h' do |t|
|
168
|
+
abort "The discount submodule is required. See the file BUILDING for getting set up."
|
169
|
+
end
|
170
|
+
|
171
|
+
# PACKAGING =================================================================
|
172
|
+
|
173
|
+
require 'rubygems'
|
174
|
+
$spec = eval(File.read('rdiscount.gemspec'))
|
175
|
+
|
176
|
+
def package(ext='')
|
177
|
+
"pkg/rdiscount-#{$spec.version}" + ext
|
178
|
+
end
|
179
|
+
|
180
|
+
desc 'Build packages'
|
181
|
+
task :package => %w[.gem .tar.gz].map {|e| package(e)}
|
182
|
+
|
183
|
+
desc 'Build and install as local gem'
|
184
|
+
task :install => package('.gem') do
|
185
|
+
sh "gem install #{package('.gem')}"
|
186
|
+
end
|
187
|
+
|
188
|
+
directory 'pkg/'
|
189
|
+
|
190
|
+
file package('.gem') => %w[pkg/ rdiscount.gemspec] + $spec.files do |f|
|
191
|
+
sh "gem build rdiscount.gemspec"
|
192
|
+
mv File.basename(f.name), f.name
|
193
|
+
end
|
194
|
+
|
195
|
+
file package('.tar.gz') => %w[pkg/] + $spec.files do |f|
|
196
|
+
sh "git archive --format=tar HEAD | gzip > #{f.name}"
|
197
|
+
end
|
198
|
+
|
199
|
+
# GEMSPEC HELPERS ==========================================================
|
200
|
+
|
201
|
+
def source_version
|
202
|
+
line = File.read('lib/rdiscount.rb')[/^\s*VERSION = .*/]
|
203
|
+
line.match(/.*VERSION = '(.*)'/)[1]
|
204
|
+
end
|
205
|
+
|
206
|
+
file 'rdiscount.gemspec' => FileList['Rakefile','lib/rdiscount.rb'] do |f|
|
207
|
+
# read spec file and split out manifest section
|
208
|
+
spec = File.read(f.name)
|
209
|
+
head, manifest, tail = spec.split(" # = MANIFEST =\n")
|
210
|
+
head.sub!(/\.version = '.*'/, ".version = '#{source_version}'")
|
211
|
+
head.sub!(/\.date = '.*'/, ".date = '#{Date.today.to_s}'")
|
212
|
+
# determine file list from git ls-files
|
213
|
+
files = `git ls-files`.
|
214
|
+
split("\n").
|
215
|
+
sort.
|
216
|
+
reject{ |file| file =~ /^\./ || file =~ /^test\/MarkdownTest/ }.
|
217
|
+
map{ |file| " #{file}" }.
|
218
|
+
join("\n")
|
219
|
+
# piece file back together and write...
|
220
|
+
manifest = " s.files = %w[\n#{files}\n ]\n"
|
221
|
+
spec = [head,manifest,tail].join(" # = MANIFEST =\n")
|
222
|
+
File.open(f.name, 'w') { |io| io.write(spec) }
|
223
|
+
puts "updated #{f.name}"
|
224
|
+
end
|
data/bin/rdiscount
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Usage: rdiscount [<file>...]
|
3
|
+
# Convert one or more Markdown files to HTML and write to standard output. With
|
4
|
+
# no <file> or when <file> is '-', read Markdown source text from standard input.
|
5
|
+
if ARGV.include?('--help')
|
6
|
+
File.read(__FILE__).split("\n").grep(/^# /).each do |line|
|
7
|
+
puts line[2..-1]
|
8
|
+
end
|
9
|
+
exit 0
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'rdiscount'
|
13
|
+
STDOUT.write(RDiscount.new(ARGF.read).to_html)
|
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, 0);
|
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
|
+
2.2.0
|
data/ext/amalloc.c
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
/*
|
2
|
+
* debugging malloc()/realloc()/calloc()/free() that attempts
|
3
|
+
* to keep track of just what's been allocated today.
|
4
|
+
*/
|
5
|
+
|
6
|
+
#include <stdio.h>
|
7
|
+
#include <stdlib.h>
|
8
|
+
|
9
|
+
#define MAGIC 0x1f2e3d4c
|
10
|
+
|
11
|
+
struct alist { int magic, size, index; int *end; struct alist *next, *last; };
|
12
|
+
|
13
|
+
static struct alist list = { 0, 0, 0, 0 };
|
14
|
+
|
15
|
+
static int mallocs=0;
|
16
|
+
static int reallocs=0;
|
17
|
+
static int frees=0;
|
18
|
+
|
19
|
+
static int index = 0;
|
20
|
+
|
21
|
+
static void
|
22
|
+
die(char *msg, int index)
|
23
|
+
{
|
24
|
+
fprintf(stderr, msg, index);
|
25
|
+
abort();
|
26
|
+
}
|
27
|
+
|
28
|
+
|
29
|
+
void *
|
30
|
+
acalloc(int count, int size)
|
31
|
+
{
|
32
|
+
struct alist *ret;
|
33
|
+
|
34
|
+
if ( size > 1 ) {
|
35
|
+
count *= size;
|
36
|
+
size = 1;
|
37
|
+
}
|
38
|
+
|
39
|
+
if ( ret = calloc(count + sizeof(struct alist) + sizeof(int), size) ) {
|
40
|
+
ret->magic = MAGIC;
|
41
|
+
ret->size = size * count;
|
42
|
+
ret->index = index ++;
|
43
|
+
ret->end = (int*)(count + (char*) (ret + 1));
|
44
|
+
*(ret->end) = ~MAGIC;
|
45
|
+
if ( list.next ) {
|
46
|
+
ret->next = list.next;
|
47
|
+
ret->last = &list;
|
48
|
+
ret->next->last = ret;
|
49
|
+
list.next = ret;
|
50
|
+
}
|
51
|
+
else {
|
52
|
+
ret->last = ret->next = &list;
|
53
|
+
list.next = list.last = ret;
|
54
|
+
}
|
55
|
+
++mallocs;
|
56
|
+
return ret+1;
|
57
|
+
}
|
58
|
+
return 0;
|
59
|
+
}
|
60
|
+
|
61
|
+
|
62
|
+
void*
|
63
|
+
amalloc(int size)
|
64
|
+
{
|
65
|
+
return acalloc(size,1);
|
66
|
+
}
|
67
|
+
|
68
|
+
|
69
|
+
void
|
70
|
+
afree(void *ptr)
|
71
|
+
{
|
72
|
+
struct alist *p2 = ((struct alist*)ptr)-1;
|
73
|
+
|
74
|
+
if ( p2->magic == MAGIC ) {
|
75
|
+
if ( ! (p2->end && *(p2->end) == ~MAGIC) )
|
76
|
+
die("goddam: corrupted memory block %d in free()!\n", p2->index);
|
77
|
+
p2->last->next = p2->next;
|
78
|
+
p2->next->last = p2->last;
|
79
|
+
++frees;
|
80
|
+
free(p2);
|
81
|
+
}
|
82
|
+
else
|
83
|
+
free(ptr);
|
84
|
+
}
|
85
|
+
|
86
|
+
|
87
|
+
void *
|
88
|
+
arealloc(void *ptr, int size)
|
89
|
+
{
|
90
|
+
struct alist *p2 = ((struct alist*)ptr)-1;
|
91
|
+
struct alist save;
|
92
|
+
|
93
|
+
if ( p2->magic == MAGIC ) {
|
94
|
+
if ( ! (p2->end && *(p2->end) == ~MAGIC) )
|
95
|
+
die("goddam: corrupted memory block %d in realloc()!\n", p2->index);
|
96
|
+
save.next = p2->next;
|
97
|
+
save.last = p2->last;
|
98
|
+
p2 = realloc(p2, sizeof(int) + sizeof(*p2) + size);
|
99
|
+
|
100
|
+
if ( p2 ) {
|
101
|
+
p2->size = size;
|
102
|
+
p2->end = (int*)(size + (char*) (p2 + 1));
|
103
|
+
*(p2->end) = ~MAGIC;
|
104
|
+
p2->next->last = p2;
|
105
|
+
p2->last->next = p2;
|
106
|
+
++reallocs;
|
107
|
+
return p2+1;
|
108
|
+
}
|
109
|
+
else {
|
110
|
+
save.next->last = save.last;
|
111
|
+
save.last->next = save.next;
|
112
|
+
return 0;
|
113
|
+
}
|
114
|
+
}
|
115
|
+
return realloc(ptr, size);
|
116
|
+
}
|
117
|
+
|
118
|
+
|
119
|
+
void
|
120
|
+
adump()
|
121
|
+
{
|
122
|
+
struct alist *p;
|
123
|
+
|
124
|
+
|
125
|
+
for ( p = list.next; p && (p != &list); p = p->next ) {
|
126
|
+
fprintf(stderr, "allocated: %d byte%s\n", p->size, (p->size==1) ? "" : "s");
|
127
|
+
fprintf(stderr, " [%.*s]\n", p->size, (char*)(p+1));
|
128
|
+
}
|
129
|
+
|
130
|
+
if ( getenv("AMALLOC_STATISTICS") ) {
|
131
|
+
fprintf(stderr, "%d malloc%s\n", mallocs, (mallocs==1)?"":"s");
|
132
|
+
fprintf(stderr, "%d realloc%s\n", reallocs, (reallocs==1)?"":"s");
|
133
|
+
fprintf(stderr, "%d free%s\n", frees, (frees==1)?"":"s");
|
134
|
+
}
|
135
|
+
}
|