markdown 0.4.0 → 0.5.0.beta1
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/Manifest.txt +4 -1
- data/README.markdown +106 -27
- data/Rakefile +1 -1
- data/lib/markdown.rb +7 -5
- data/lib/markdown/cli/gen.rb +89 -0
- data/lib/markdown/cli/opts.rb +14 -0
- data/lib/markdown/cli/runner.rb +173 -0
- data/lib/markdown/version.rb +3 -0
- metadata +17 -10
- data/lib/markdown/gen.rb +0 -260
data/Manifest.txt
CHANGED
@@ -4,6 +4,9 @@ README.markdown
|
|
4
4
|
Rakefile
|
5
5
|
bin/markdown
|
6
6
|
lib/markdown.rb
|
7
|
+
lib/markdown/cli/gen.rb
|
8
|
+
lib/markdown/cli/opts.rb
|
9
|
+
lib/markdown/cli/runner.rb
|
7
10
|
lib/markdown/config.rb
|
8
11
|
lib/markdown/engines/bluecloth.rb
|
9
12
|
lib/markdown/engines/kramdown.rb
|
@@ -12,6 +15,6 @@ lib/markdown/engines/pandoc_ruby.rb
|
|
12
15
|
lib/markdown/engines/rdiscount.rb
|
13
16
|
lib/markdown/engines/redcarpet.rb
|
14
17
|
lib/markdown/engines/rpeg_markdown.rb
|
15
|
-
lib/markdown/
|
18
|
+
lib/markdown/version.rb
|
16
19
|
lib/markdown/wrapper.rb
|
17
20
|
test/test_kramdown.rb
|
data/README.markdown
CHANGED
@@ -1,71 +1,145 @@
|
|
1
|
-
# Markdown Engine Wrapper - Use Your Markdown Library of Choice
|
1
|
+
# Markdown Engine Wrapper - Use Your Markdown Library of Choice in Ruby
|
2
2
|
|
3
3
|
* [geraldb.github.com/markdown](http://geraldb.github.com/markdown)
|
4
4
|
|
5
|
-
## Description
|
6
|
-
|
7
5
|
The Markdown Engine Wrapper (`markdown`) Ruby gem lets you use
|
8
|
-
your markdown library of choice. Preconfigured markdown libraries include
|
6
|
+
your markdown library of choice. Preconfigured markdown libraries include
|
9
7
|
|
10
8
|
* `kramdown`
|
9
|
+
* `redcarpet`
|
11
10
|
* `bluecloth`
|
12
11
|
* `maruku`
|
13
12
|
* `rpeg-markdown`
|
14
13
|
* `rdiscount`
|
15
14
|
* `pandoc-ruby`
|
16
15
|
|
17
|
-
|
18
|
-
## Usage
|
16
|
+
## Usage - Ruby Code
|
19
17
|
|
20
18
|
require 'markdown'
|
21
19
|
|
22
20
|
Markdown.new( 'Hello World' ).to_html
|
21
|
+
|
22
|
+
# => "<p>Hello World</p>\n"
|
23
23
|
|
24
24
|
|
25
|
-
##
|
25
|
+
## Usage - Command Line
|
26
26
|
|
27
|
-
|
27
|
+
The `markdown` gem includes a little command line tool. Try `markdown -h` for details:
|
28
28
|
|
29
|
-
|
29
|
+
```
|
30
|
+
markdown - Lets you convert plain text documents to hypertext with your Markdown engine of choice
|
31
|
+
and preprocessing text filters.
|
30
32
|
|
33
|
+
Usage: markdown [options] files_or_dirs
|
34
|
+
-o, --output PATH Output Path
|
35
|
+
-v, --verbose Show debug trace
|
31
36
|
|
32
|
-
## Configuration - Markdown Engine Loading Order
|
33
37
|
|
34
|
-
|
38
|
+
Examples:
|
39
|
+
markdown # Process all documents in working folder (that is, .)
|
40
|
+
markdown quickref # Process document or folder using Markdown
|
41
|
+
markdown quickref.text # Process document using Markdown
|
42
|
+
markdown -o site quickref # Output documents to site folder
|
43
|
+
```
|
35
44
|
|
36
|
-
|
45
|
+
## Configuration - Markdown Engine Loading Order
|
37
46
|
|
38
|
-
To use your markdown engine of choice
|
39
|
-
|
47
|
+
The default (fallback) Markdown library is `kramdown`. To use your markdown engine of choice
|
48
|
+
configure the wrapper. The wrapper
|
49
|
+
uses the following lookup order to find the markdown engine:
|
40
50
|
|
41
|
-
1) `MARKDOWN_LIB`
|
51
|
+
### 1) `MARKDOWN_LIB` Environment Variable
|
42
52
|
|
43
53
|
Example:
|
44
54
|
|
45
55
|
set MARKDOWN_LIB=kramdown
|
46
56
|
|
47
|
-
2) `lib`
|
57
|
+
### 2) `lib` Property (in `./markdown.yml` or `~/markdown.yml`)
|
48
58
|
|
49
59
|
Example:
|
50
60
|
|
51
61
|
lib: kramdown
|
52
62
|
|
53
|
-
3) `libs`
|
63
|
+
### 3) `libs` Property (in `./markdown.yml` or `~/markdown.yml`)
|
54
64
|
|
55
65
|
Example:
|
56
66
|
|
57
67
|
libs:
|
58
|
-
-
|
68
|
+
- redcarpet
|
59
69
|
- kramdown
|
60
70
|
|
61
71
|
|
62
|
-
|
72
|
+
Markdown libraries in the list get loaded on a first-come first-serve principle,
|
73
|
+
that is, the first library `require`'d successfully will get used.
|
63
74
|
|
64
|
-
The Markdown Wrapper lets you configure different converter methods for each markdown engine. By default
|
65
|
-
the converter method *<lib>*_to_html gets used
|
66
|
-
(for example, the default converter for `kramdown` is `kramdown_to_html`).
|
67
75
|
|
68
|
-
|
76
|
+
|
77
|
+
## Configuration - Markdown Engine Options
|
78
|
+
|
79
|
+
You can also pass along options to your Markdown library. Example:
|
80
|
+
|
81
|
+
## Let's use the Redcarpet library
|
82
|
+
|
83
|
+
lib: redcarpet
|
84
|
+
|
85
|
+
redcarpet:
|
86
|
+
extensions:
|
87
|
+
- no_intra_emphasis
|
88
|
+
- fenced_code_blocks
|
89
|
+
- tables
|
90
|
+
- strikethrough
|
91
|
+
|
92
|
+
|
93
|
+
## Configuration -Filters (Command Line Only)
|
94
|
+
|
95
|
+
For the command line tool only you can configure preprocessing filters to
|
96
|
+
allow comments, Ruby helpers, and much more. Example:
|
97
|
+
|
98
|
+
## Let's use percent style comments
|
99
|
+
|
100
|
+
filters:
|
101
|
+
- comments-percent-style
|
102
|
+
|
103
|
+
Now the filter will strip comment lines starting with percent (that is, %). Example:
|
104
|
+
|
105
|
+
%%%%%%%%%%%%%%%%
|
106
|
+
% Some Headers
|
107
|
+
|
108
|
+
Title: Web Services REST-Style: Universal Identifiers, Formats & Protocols
|
109
|
+
|
110
|
+
Becomes
|
111
|
+
|
112
|
+
Title: Web Services REST-Style: Universal Identifiers, Formats & Protocols
|
113
|
+
|
114
|
+
before the text gets passed along to the markdown engine. The filter
|
115
|
+
also supports multiline comments with `%begin`|`comment`|`comments`/`%end` pairs. Example:
|
116
|
+
|
117
|
+
%begin
|
118
|
+
Using modern browser such as Firefox, Chrome and Safari you can
|
119
|
+
now theme your slide shows using using "loss-free" vector graphics
|
120
|
+
in plain old CSS. Thanks to gradient support in backgrounds in CSS3.
|
121
|
+
%end
|
122
|
+
|
123
|
+
or
|
124
|
+
|
125
|
+
%comment
|
126
|
+
Using modern browser such as Firefox, Chrome and Safari you can
|
127
|
+
now theme your slide shows using using "loss-free" vector graphics
|
128
|
+
in plain old CSS. Thanks to gradient support in backgrounds in CSS3.
|
129
|
+
%end
|
130
|
+
|
131
|
+
Note: As a shortcut using a single `%end` directive (that is, without a leading `%begin`)
|
132
|
+
will skip everything until the end of the document.
|
133
|
+
|
134
|
+
For more about filters see the [`textutils`](http://geraldb.github.com/textutils) gem.
|
135
|
+
|
136
|
+
|
137
|
+
## Configuration - Converters
|
138
|
+
|
139
|
+
The Markdown wrapper lets you configure different converter methods
|
140
|
+
for each markdown engine. By default
|
141
|
+
the converter method `<lib>_to_html` gets used
|
142
|
+
(for example, the default converter for `kramdown` is `kramdown_to_html`).
|
69
143
|
|
70
144
|
Example:
|
71
145
|
|
@@ -73,19 +147,24 @@ Example:
|
|
73
147
|
converter: pandoc-ruby-to-s5
|
74
148
|
|
75
149
|
|
150
|
+
## Install
|
151
|
+
|
152
|
+
Just install the gem:
|
153
|
+
|
154
|
+
$ gem install markdown
|
155
|
+
|
76
156
|
|
77
157
|
## Real World Usage
|
78
158
|
|
79
159
|
The [`slideshow`](http://slideshow.rubyforge.org) (also known as Slide Show (S9)) gem
|
80
160
|
that lets you create slide shows
|
81
|
-
and author slides in plain text using a wiki-style markup language that's easy-to-write and easy-to-read
|
82
|
-
ships with the `markdown` gem.
|
161
|
+
and author slides in plain text using a wiki-style markup language that's easy-to-write and easy-to-read.
|
83
162
|
|
84
163
|
|
85
164
|
## Alternatives
|
86
165
|
|
87
|
-
[`multi_markdown`](https://github.com/postmodern/multi_markdown) gem by Hal Brodigan
|
88
|
-
|
166
|
+
* [`multi_markdown`](https://github.com/postmodern/multi_markdown) gem by Hal Brodigan (aka postmodern)
|
167
|
+
* [`markdown_meta`](https://github.com/headius/markdown_meta) gem by Charles Oliver Nutter (aka headius)
|
89
168
|
|
90
169
|
## Questions? Comments?
|
91
170
|
|
data/Rakefile
CHANGED
data/lib/markdown.rb
CHANGED
@@ -28,6 +28,7 @@ require 'textutils' # text filters and helpers
|
|
28
28
|
|
29
29
|
# our own code
|
30
30
|
|
31
|
+
require 'markdown/version'
|
31
32
|
require 'markdown/config'
|
32
33
|
require 'markdown/engines/bluecloth'
|
33
34
|
require 'markdown/engines/kramdown'
|
@@ -37,16 +38,17 @@ require 'markdown/engines/rdiscount'
|
|
37
38
|
require 'markdown/engines/redcarpet'
|
38
39
|
require 'markdown/engines/rpeg_markdown'
|
39
40
|
require 'markdown/wrapper'
|
40
|
-
require 'markdown/gen'
|
41
41
|
|
42
|
+
require 'markdown/cli/gen'
|
43
|
+
require 'markdown/cli/opts'
|
44
|
+
require 'markdown/cli/runner'
|
42
45
|
|
43
|
-
module Markdown
|
44
46
|
|
45
|
-
|
47
|
+
module Markdown
|
46
48
|
|
47
49
|
# version string for generator meta tag (includes ruby version)
|
48
50
|
def self.banner
|
49
|
-
"
|
51
|
+
"markdown #{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
50
52
|
end
|
51
53
|
|
52
54
|
def self.main
|
@@ -59,7 +61,7 @@ module Markdown
|
|
59
61
|
args += markdownopt.split if markdownopt
|
60
62
|
args += ARGV.dup
|
61
63
|
|
62
|
-
|
64
|
+
Runner.new.run(args)
|
63
65
|
end
|
64
66
|
|
65
67
|
end # module Markdown
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Markdown
|
2
|
+
|
3
|
+
class Gen
|
4
|
+
|
5
|
+
include TextUtils::Filter # include filters such as comments_percent_style, etc. (see textutils gem)
|
6
|
+
|
7
|
+
attr_reader :logger
|
8
|
+
attr_reader :opts
|
9
|
+
|
10
|
+
def initialize( logger, opts )
|
11
|
+
@logger = logger
|
12
|
+
@opts = opts
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_doc( fn )
|
16
|
+
dirname = File.dirname( fn )
|
17
|
+
basename = File.basename( fn, '.*' )
|
18
|
+
extname = File.extname( fn )
|
19
|
+
|
20
|
+
logger.debug "dirname=#{dirname}, basename=#{basename}, extname=#{extname}"
|
21
|
+
|
22
|
+
if opts.output_path == '.'
|
23
|
+
# expand output path in current dir
|
24
|
+
outpath = File.expand_path( dirname )
|
25
|
+
else
|
26
|
+
# expand output path in user supplied dir and make sure output path exists
|
27
|
+
outpath = File.expand_path( opts.output_path )
|
28
|
+
FileUtils.makedirs( outpath ) unless File.directory? outpath
|
29
|
+
end
|
30
|
+
logger.debug "outpath=#{outpath}"
|
31
|
+
|
32
|
+
# todo: add a -c option to commandline? to let you set cwd?
|
33
|
+
|
34
|
+
|
35
|
+
# change working dir to sourcefile dir (that is, dirname); push working folder/dir
|
36
|
+
newcwd = File.expand_path( dirname )
|
37
|
+
oldcwd = File.expand_path( Dir.pwd )
|
38
|
+
|
39
|
+
unless newcwd == oldcwd
|
40
|
+
logger.debug "oldcwd=>#{oldcwd}<, newcwd=>#{newcwd}<"
|
41
|
+
Dir.chdir( newcwd )
|
42
|
+
end
|
43
|
+
|
44
|
+
inname = "#{basename}#{extname}"
|
45
|
+
outname = "#{basename}.html"
|
46
|
+
|
47
|
+
logger.debug "inname=#{inname}, outname=#{outname}"
|
48
|
+
|
49
|
+
puts "*** #{inname} (#{dirname}) => #{outname} (#{(opts.output_path == '.') ? dirname : opts.output_path})..."
|
50
|
+
|
51
|
+
content = File.read( inname )
|
52
|
+
|
53
|
+
# step 1) run (optional) preprocessing text filters
|
54
|
+
Markdown.filters.each do |filter|
|
55
|
+
mn = filter.tr( '-', '_' ).to_sym # construct method name (mn)
|
56
|
+
content = send( mn, content ) # call filter e.g. include_helper_hack( content )
|
57
|
+
end
|
58
|
+
|
59
|
+
# step 2) convert light-weight markup to hypertext
|
60
|
+
content = Markdown.new( content ).to_html
|
61
|
+
|
62
|
+
|
63
|
+
## todo: add Markdown.lib_options inspect/dump to banner
|
64
|
+
|
65
|
+
banner =<<EOS
|
66
|
+
<!-- ======================================================================
|
67
|
+
generated by #{Markdown.banner}
|
68
|
+
on #{Time.now} with Markdown engine '#{Markdown.lib}'
|
69
|
+
====================================================================== -->
|
70
|
+
EOS
|
71
|
+
|
72
|
+
out = File.new( File.join( outpath, outname ), "w+" )
|
73
|
+
#### out << banner
|
74
|
+
out << content
|
75
|
+
out.flush
|
76
|
+
out.close
|
77
|
+
|
78
|
+
## pop/restore working folder/dir
|
79
|
+
unless newcwd == oldcwd
|
80
|
+
logger.debug "oldcwd=>#{oldcwd}<, newcwd=>#{newcwd}<"
|
81
|
+
Dir.chdir( oldcwd )
|
82
|
+
end
|
83
|
+
|
84
|
+
end # method create_doc
|
85
|
+
|
86
|
+
|
87
|
+
|
88
|
+
end # class Gen
|
89
|
+
end # module Markdown
|
@@ -0,0 +1,173 @@
|
|
1
|
+
module Markdown
|
2
|
+
|
3
|
+
class Runner
|
4
|
+
|
5
|
+
attr_reader :logger
|
6
|
+
attr_reader :opts
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@logger = Logger.new(STDOUT)
|
10
|
+
@logger.level = Logger::INFO
|
11
|
+
@opts = Opts.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def has_markdown_extension?( fn )
|
15
|
+
dirname = File.dirname( fn )
|
16
|
+
basename = File.basename( fn, '.*' )
|
17
|
+
extname = File.extname( fn )
|
18
|
+
logger.debug "dirname=#{dirname}, basename=#{basename}, extname=#{extname}"
|
19
|
+
|
20
|
+
return false if extname.empty? # no extension
|
21
|
+
|
22
|
+
Markdown.extnames.include?( extname.downcase )
|
23
|
+
end
|
24
|
+
|
25
|
+
def find_file_with_markdown_extension( fn )
|
26
|
+
dirname = File.dirname( fn )
|
27
|
+
basename = File.basename( fn, '.*' )
|
28
|
+
extname = File.extname( fn )
|
29
|
+
logger.debug "dirname=#{dirname}, basename=#{basename}, extname=#{extname}"
|
30
|
+
|
31
|
+
Markdown.extnames.each do |e|
|
32
|
+
newname = File.join( dirname, "#{basename}#{e}" )
|
33
|
+
logger.debug "File.exists? #{newname}"
|
34
|
+
return newname if File.exists?( newname )
|
35
|
+
end # each extension (e)
|
36
|
+
|
37
|
+
nil # not found; return nil
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
def find_files( file_or_dir_or_pattern )
|
42
|
+
|
43
|
+
filtered_files = []
|
44
|
+
|
45
|
+
# assume pattern if includes * or ? or {} or []
|
46
|
+
if file_or_dir_or_pattern =~ /[*?{}\[\]]/
|
47
|
+
puts "searching glob pattern '#{file_or_dir_or_pattern}'..."
|
48
|
+
Dir.glob( file_or_dir_or_pattern ).each do |file|
|
49
|
+
if File.directory?( file ) # skip (sub)directories
|
50
|
+
puts " skipping folder '#{file}'..."
|
51
|
+
next
|
52
|
+
else
|
53
|
+
if has_markdown_extension?( file )
|
54
|
+
logger.debug " adding file '#{file}'..."
|
55
|
+
filtered_files << file
|
56
|
+
else
|
57
|
+
puts " skipping file '#{file}'..."
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
elsif File.directory?(file_or_dir_or_pattern)
|
62
|
+
puts "searching folder '#{file_or_dir_or_pattern}'..."
|
63
|
+
Dir.entries( file_or_dir_or_pattern ).each do |entry|
|
64
|
+
next if entry == '.' || entry == '..' # silently skip current and up dirs
|
65
|
+
|
66
|
+
if file_or_dir_or_pattern == '.'
|
67
|
+
file = entry
|
68
|
+
else # add dir (if not working dir)
|
69
|
+
file = File.join( file_or_dir_or_pattern, entry )
|
70
|
+
end
|
71
|
+
|
72
|
+
if File.directory?( file ) # skip (sub)directories
|
73
|
+
puts " skipping folder '#{file}'..."
|
74
|
+
next
|
75
|
+
else
|
76
|
+
if has_markdown_extension?( file )
|
77
|
+
logger.debug " adding file '#{file}'..."
|
78
|
+
filtered_files << file
|
79
|
+
else
|
80
|
+
puts " skipping file '#{file}'..."
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
else # assume it's a single file (check for missing extension)
|
85
|
+
if File.exists?( file_or_dir_or_pattern )
|
86
|
+
file = file_or_dir_or_pattern
|
87
|
+
if has_markdown_extension?( file )
|
88
|
+
logger.debug " adding file '#{file}'..."
|
89
|
+
filtered_files << file
|
90
|
+
else
|
91
|
+
puts " skipping file '#{file}'..."
|
92
|
+
end
|
93
|
+
else # check for existing file w/ missing extension
|
94
|
+
file = find_file_with_markdown_extension( file_or_dir_or_pattern )
|
95
|
+
if file.nil?
|
96
|
+
puts " skipping missing file '#{file_or_dir_or_pattern}{#{Markdown.extnames.join(',')}}'..."
|
97
|
+
else
|
98
|
+
logger.debug " adding file '#{file}'..."
|
99
|
+
filtered_files << file
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
filtered_files
|
105
|
+
end # find_files
|
106
|
+
|
107
|
+
|
108
|
+
def run( args )
|
109
|
+
opt=OptionParser.new do |cmd|
|
110
|
+
|
111
|
+
cmd.banner = "Usage: markdown [options] files_or_dirs"
|
112
|
+
|
113
|
+
cmd.on( '-o', '--output PATH', "Output Path (default is #{opts.output_path})" ) { |path| opts.output_path = path }
|
114
|
+
|
115
|
+
cmd.on( '-v', '--version', "Show version" ) do
|
116
|
+
puts Markdown.banner
|
117
|
+
exit
|
118
|
+
end
|
119
|
+
|
120
|
+
cmd.on( "--verbose", "Show debug trace" ) do
|
121
|
+
logger.datetime_format = "%H:%H:%S"
|
122
|
+
logger.level = Logger::DEBUG
|
123
|
+
end
|
124
|
+
|
125
|
+
## todo: add markdown.lib options (e.g. extensions,etc)
|
126
|
+
|
127
|
+
cmd.on_tail( "-h", "--help", "Show this message" ) do
|
128
|
+
puts <<EOS
|
129
|
+
|
130
|
+
markdown - Lets you convert plain text documents (#{Markdown.extnames.join(', ')}) to hypertext (.html) with your Markdown engine of choice (#{Markdown.lib}) and preprocessing text filters (#{Markdown.filters.join(', ')}).
|
131
|
+
|
132
|
+
#{cmd.help}
|
133
|
+
|
134
|
+
Examples:
|
135
|
+
markdown # Process all documents in working folder (that is, .)
|
136
|
+
markdown quickref # Process document or folder using Markdown
|
137
|
+
markdown quickref.text # Process document using Markdown
|
138
|
+
markdown -o site quickref # Output documents to site folder
|
139
|
+
|
140
|
+
Further information:
|
141
|
+
http://geraldb.github.com/markdown
|
142
|
+
|
143
|
+
EOS
|
144
|
+
exit
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
opt.parse!( args )
|
149
|
+
|
150
|
+
puts Markdown.banner
|
151
|
+
|
152
|
+
# force loading of config
|
153
|
+
Markdown.lib
|
154
|
+
|
155
|
+
logger.debug "args.length: #{args.length}"
|
156
|
+
logger.debug "args: >#{args.join(',')}<"
|
157
|
+
|
158
|
+
# if no file args given; default to working folder (that is, .)
|
159
|
+
args = ['.'] if args.length == 0
|
160
|
+
|
161
|
+
args.each do |arg|
|
162
|
+
files = find_files( arg )
|
163
|
+
files.each do |file|
|
164
|
+
Gen.new( logger, opts ).create_doc( file )
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
puts "Done."
|
169
|
+
|
170
|
+
end # method run
|
171
|
+
|
172
|
+
end # class Runner
|
173
|
+
end # module Markdown
|
metadata
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: markdown
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 123249068
|
5
|
+
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 5
|
9
9
|
- 0
|
10
|
-
|
10
|
+
- beta
|
11
|
+
- 1
|
12
|
+
version: 0.5.0.beta1
|
11
13
|
platform: ruby
|
12
14
|
authors:
|
13
15
|
- Gerald Bauer
|
@@ -15,7 +17,7 @@ autorequire:
|
|
15
17
|
bindir: bin
|
16
18
|
cert_chain: []
|
17
19
|
|
18
|
-
date: 2012-06-
|
20
|
+
date: 2012-06-18 00:00:00 Z
|
19
21
|
dependencies:
|
20
22
|
- !ruby/object:Gem::Dependency
|
21
23
|
name: props
|
@@ -110,6 +112,9 @@ files:
|
|
110
112
|
- Rakefile
|
111
113
|
- bin/markdown
|
112
114
|
- lib/markdown.rb
|
115
|
+
- lib/markdown/cli/gen.rb
|
116
|
+
- lib/markdown/cli/opts.rb
|
117
|
+
- lib/markdown/cli/runner.rb
|
113
118
|
- lib/markdown/config.rb
|
114
119
|
- lib/markdown/engines/bluecloth.rb
|
115
120
|
- lib/markdown/engines/kramdown.rb
|
@@ -118,7 +123,7 @@ files:
|
|
118
123
|
- lib/markdown/engines/rdiscount.rb
|
119
124
|
- lib/markdown/engines/redcarpet.rb
|
120
125
|
- lib/markdown/engines/rpeg_markdown.rb
|
121
|
-
- lib/markdown/
|
126
|
+
- lib/markdown/version.rb
|
122
127
|
- lib/markdown/wrapper.rb
|
123
128
|
- test/test_kramdown.rb
|
124
129
|
- .gemtest
|
@@ -143,12 +148,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
143
148
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
149
|
none: false
|
145
150
|
requirements:
|
146
|
-
- - "
|
151
|
+
- - ">"
|
147
152
|
- !ruby/object:Gem::Version
|
148
|
-
hash:
|
153
|
+
hash: 25
|
149
154
|
segments:
|
150
|
-
-
|
151
|
-
|
155
|
+
- 1
|
156
|
+
- 3
|
157
|
+
- 1
|
158
|
+
version: 1.3.1
|
152
159
|
requirements: []
|
153
160
|
|
154
161
|
rubyforge_project: markdown
|
data/lib/markdown/gen.rb
DELETED
@@ -1,260 +0,0 @@
|
|
1
|
-
module Markdown
|
2
|
-
|
3
|
-
|
4
|
-
class Opts
|
5
|
-
|
6
|
-
def output_path=(value)
|
7
|
-
@output_path = value
|
8
|
-
end
|
9
|
-
|
10
|
-
def output_path
|
11
|
-
@output_path ||= '.'
|
12
|
-
end
|
13
|
-
|
14
|
-
end # class Opts
|
15
|
-
|
16
|
-
|
17
|
-
class Gen
|
18
|
-
|
19
|
-
include TextUtils::Filter # include filters such as comments_percent_style, etc. (see textutils gem)
|
20
|
-
|
21
|
-
attr_reader :logger
|
22
|
-
attr_reader :opts
|
23
|
-
|
24
|
-
def initialize
|
25
|
-
@logger = Logger.new(STDOUT)
|
26
|
-
@logger.level = Logger::INFO
|
27
|
-
@opts = Opts.new
|
28
|
-
end
|
29
|
-
|
30
|
-
def create_doc( fn )
|
31
|
-
dirname = File.dirname( fn )
|
32
|
-
basename = File.basename( fn, '.*' )
|
33
|
-
extname = File.extname( fn )
|
34
|
-
|
35
|
-
logger.debug "dirname=#{dirname}, basename=#{basename}, extname=#{extname}"
|
36
|
-
|
37
|
-
if opts.output_path == '.'
|
38
|
-
# expand output path in current dir
|
39
|
-
outpath = File.expand_path( dirname )
|
40
|
-
else
|
41
|
-
# expand output path in user supplied dir and make sure output path exists
|
42
|
-
outpath = File.expand_path( opts.output_path )
|
43
|
-
FileUtils.makedirs( outpath ) unless File.directory? outpath
|
44
|
-
end
|
45
|
-
logger.debug "outpath=#{outpath}"
|
46
|
-
|
47
|
-
# todo: add a -c option to commandline? to let you set cwd?
|
48
|
-
|
49
|
-
|
50
|
-
# change working dir to sourcefile dir (that is, dirname); push working folder/dir
|
51
|
-
newcwd = File.expand_path( dirname )
|
52
|
-
oldcwd = File.expand_path( Dir.pwd )
|
53
|
-
|
54
|
-
unless newcwd == oldcwd
|
55
|
-
logger.debug "oldcwd=>#{oldcwd}<, newcwd=>#{newcwd}<"
|
56
|
-
Dir.chdir( newcwd )
|
57
|
-
end
|
58
|
-
|
59
|
-
inname = "#{basename}#{extname}"
|
60
|
-
outname = "#{basename}.html"
|
61
|
-
|
62
|
-
logger.debug "inname=#{inname}, outname=#{outname}"
|
63
|
-
|
64
|
-
puts "*** #{inname} (#{dirname}) => #{outname} (#{(opts.output_path == '.') ? dirname : opts.output_path})..."
|
65
|
-
|
66
|
-
content = File.read( inname )
|
67
|
-
|
68
|
-
# step 1) run (optional) preprocessing text filters
|
69
|
-
Markdown.filters.each do |filter|
|
70
|
-
mn = filter.tr( '-', '_' ).to_sym # construct method name (mn)
|
71
|
-
content = send( mn, content ) # call filter e.g. include_helper_hack( content )
|
72
|
-
end
|
73
|
-
|
74
|
-
# step 2) convert light-weight markup to hypertext
|
75
|
-
content = Markdown.new( content ).to_html
|
76
|
-
|
77
|
-
|
78
|
-
## todo: add Markdown.lib_options inspect/dump to banner
|
79
|
-
|
80
|
-
banner =<<EOS
|
81
|
-
<!-- ======================================================================
|
82
|
-
generated by #{Markdown.banner}
|
83
|
-
on #{Time.now} with Markdown engine '#{Markdown.lib}'
|
84
|
-
====================================================================== -->
|
85
|
-
EOS
|
86
|
-
|
87
|
-
out = File.new( File.join( outpath, outname ), "w+" )
|
88
|
-
#### out << banner
|
89
|
-
out << content
|
90
|
-
out.flush
|
91
|
-
out.close
|
92
|
-
|
93
|
-
## pop/restore working folder/dir
|
94
|
-
unless newcwd == oldcwd
|
95
|
-
logger.debug "oldcwd=>#{oldcwd}<, newcwd=>#{newcwd}<"
|
96
|
-
Dir.chdir( oldcwd )
|
97
|
-
end
|
98
|
-
|
99
|
-
end # method create_doc
|
100
|
-
|
101
|
-
|
102
|
-
def has_markdown_extension?( fn )
|
103
|
-
dirname = File.dirname( fn )
|
104
|
-
basename = File.basename( fn, '.*' )
|
105
|
-
extname = File.extname( fn )
|
106
|
-
logger.debug "dirname=#{dirname}, basename=#{basename}, extname=#{extname}"
|
107
|
-
|
108
|
-
return false if extname.empty? # no extension
|
109
|
-
|
110
|
-
Markdown.extnames.include?( extname.downcase )
|
111
|
-
end
|
112
|
-
|
113
|
-
def find_file_with_markdown_extension( fn )
|
114
|
-
dirname = File.dirname( fn )
|
115
|
-
basename = File.basename( fn, '.*' )
|
116
|
-
extname = File.extname( fn )
|
117
|
-
logger.debug "dirname=#{dirname}, basename=#{basename}, extname=#{extname}"
|
118
|
-
|
119
|
-
Markdown.extnames.each do |e|
|
120
|
-
newname = File.join( dirname, "#{basename}#{e}" )
|
121
|
-
logger.debug "File.exists? #{newname}"
|
122
|
-
return newname if File.exists?( newname )
|
123
|
-
end # each extension (e)
|
124
|
-
|
125
|
-
nil # not found; return nil
|
126
|
-
end
|
127
|
-
|
128
|
-
|
129
|
-
def find_files( file_or_dir_or_pattern )
|
130
|
-
|
131
|
-
filtered_files = []
|
132
|
-
|
133
|
-
# assume pattern if includes * or ? or {} or []
|
134
|
-
if file_or_dir_or_pattern =~ /[*?{}\[\]]/
|
135
|
-
puts "searching glob pattern '#{file_or_dir_or_pattern}'..."
|
136
|
-
Dir.glob( file_or_dir_or_pattern ).each do |file|
|
137
|
-
if File.directory?( file ) # skip (sub)directories
|
138
|
-
puts " skipping folder '#{file}'..."
|
139
|
-
next
|
140
|
-
else
|
141
|
-
if has_markdown_extension?( file )
|
142
|
-
logger.debug " adding file '#{file}'..."
|
143
|
-
filtered_files << file
|
144
|
-
else
|
145
|
-
puts " skipping file '#{file}'..."
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
149
|
-
elsif File.directory?(file_or_dir_or_pattern)
|
150
|
-
puts "searching folder '#{file_or_dir_or_pattern}'..."
|
151
|
-
Dir.entries( file_or_dir_or_pattern ).each do |entry|
|
152
|
-
next if entry == '.' || entry == '..' # silently skip current and up dirs
|
153
|
-
|
154
|
-
if file_or_dir_or_pattern == '.'
|
155
|
-
file = entry
|
156
|
-
else # add dir (if not working dir)
|
157
|
-
file = File.join( file_or_dir_or_pattern, entry )
|
158
|
-
end
|
159
|
-
|
160
|
-
if File.directory?( file ) # skip (sub)directories
|
161
|
-
puts " skipping folder '#{file}'..."
|
162
|
-
next
|
163
|
-
else
|
164
|
-
if has_markdown_extension?( file )
|
165
|
-
logger.debug " adding file '#{file}'..."
|
166
|
-
filtered_files << file
|
167
|
-
else
|
168
|
-
puts " skipping file '#{file}'..."
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
172
|
-
else # assume it's a single file (check for missing extension)
|
173
|
-
if File.exists?( file_or_dir_or_pattern )
|
174
|
-
file = file_or_dir_or_pattern
|
175
|
-
if has_markdown_extension?( file )
|
176
|
-
logger.debug " adding file '#{file}'..."
|
177
|
-
filtered_files << file
|
178
|
-
else
|
179
|
-
puts " skipping file '#{file}'..."
|
180
|
-
end
|
181
|
-
else # check for existing file w/ missing extension
|
182
|
-
file = find_file_with_markdown_extension( file_or_dir_or_pattern )
|
183
|
-
if file.nil?
|
184
|
-
puts " skipping missing file '#{file_or_dir_or_pattern}{#{Markdown.extnames.join(',')}}'..."
|
185
|
-
else
|
186
|
-
logger.debug " adding file '#{file}'..."
|
187
|
-
filtered_files << file
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
filtered_files
|
193
|
-
end # find_files
|
194
|
-
|
195
|
-
def run( args )
|
196
|
-
opt=OptionParser.new do |cmd|
|
197
|
-
|
198
|
-
cmd.banner = "Usage: markdown [options] files_or_dirs"
|
199
|
-
|
200
|
-
cmd.on( '-o', '--output PATH', 'Output Path' ) { |path| opts.output_path = path }
|
201
|
-
|
202
|
-
# todo: find different letter for debug trace switch (use v for version?)
|
203
|
-
cmd.on( "-v", "--verbose", "Show debug trace" ) do
|
204
|
-
logger.datetime_format = "%H:%H:%S"
|
205
|
-
logger.level = Logger::DEBUG
|
206
|
-
end
|
207
|
-
|
208
|
-
|
209
|
-
## todo: add markdown.lib options (e.g. extensions,etc)
|
210
|
-
|
211
|
-
usage =<<EOS
|
212
|
-
|
213
|
-
markdown - Lets you convert plain text documents (#{Markdown.extnames.join(', ')}) to hypertext (.html) with your Markdown engine of choice (#{Markdown.lib}) and preprocessing text filters (#{Markdown.filters.join(', ')}).
|
214
|
-
|
215
|
-
#{cmd.help}
|
216
|
-
|
217
|
-
Examples:
|
218
|
-
markdown # Process all documents in working folder (that is, .)
|
219
|
-
markdown quickref # Process document or folder using Markdown
|
220
|
-
markdown quickref.text # Process document using Markdown
|
221
|
-
markdown -o site quickref # Output documents to site folder
|
222
|
-
|
223
|
-
Further information:
|
224
|
-
http://geraldb.github.com/markdown
|
225
|
-
|
226
|
-
EOS
|
227
|
-
|
228
|
-
cmd.on_tail( "-h", "--help", "Show this message" ) do
|
229
|
-
puts usage
|
230
|
-
exit
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
opt.parse!( args )
|
235
|
-
|
236
|
-
puts Markdown.banner
|
237
|
-
|
238
|
-
# force loading of config
|
239
|
-
Markdown.lib
|
240
|
-
|
241
|
-
logger.debug "args.length: #{args.length}"
|
242
|
-
logger.debug "args: >#{args.join(',')}<"
|
243
|
-
|
244
|
-
# if no file args given; default to working folder (that is, .)
|
245
|
-
args = ['.'] if args.length == 0
|
246
|
-
|
247
|
-
args.each do |arg|
|
248
|
-
files = find_files( arg )
|
249
|
-
files.each do |file|
|
250
|
-
create_doc( file )
|
251
|
-
end
|
252
|
-
end
|
253
|
-
|
254
|
-
puts "Done."
|
255
|
-
|
256
|
-
end # method run
|
257
|
-
|
258
|
-
end # class Gen
|
259
|
-
|
260
|
-
end # module Markdown
|