markdown 1.1.1 → 1.2.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.
- checksums.yaml +7 -0
- data/{History.markdown → HISTORY.md} +0 -0
- data/Manifest.txt +2 -20
- data/{README.markdown → README.md} +11 -48
- data/Rakefile +12 -14
- data/lib/markdown.rb +6 -38
- data/lib/markdown/config.rb +3 -1
- data/lib/markdown/engines/bluecloth.rb +2 -0
- data/lib/markdown/engines/kramdown.rb +4 -2
- data/lib/markdown/engines/maruku.rb +2 -0
- data/lib/markdown/engines/pandoc_ruby.rb +2 -0
- data/lib/markdown/engines/rdiscount.rb +2 -0
- data/lib/markdown/engines/redcarpet.rb +2 -0
- data/lib/markdown/engines/rpeg_markdown.rb +2 -0
- data/lib/markdown/version.rb +24 -2
- data/lib/markdown/wrapper.rb +3 -1
- data/test/helper.rb +0 -8
- data/test/test_kramdown.rb +1 -2
- data/test/test_redcarpet.rb +1 -1
- metadata +57 -61
- data/bin/markdown +0 -17
- data/lib/markdown/cli/gen.rb +0 -89
- data/lib/markdown/cli/opts.rb +0 -14
- data/lib/markdown/cli/runner.rb +0 -202
- data/lib/markdown/server.rb +0 -195
- data/lib/markdown/server/public/style.css +0 -112
- data/lib/markdown/server/views/_about.erb +0 -23
- data/lib/markdown/server/views/_debug.erb +0 -27
- data/lib/markdown/server/views/_libs.erb +0 -14
- data/lib/markdown/server/views/_libs_service.erb +0 -27
- data/lib/markdown/server/views/_notepad.erb +0 -96
- data/lib/markdown/server/views/_service.erb +0 -75
- data/lib/markdown/server/views/_version.erb +0 -6
- data/lib/markdown/server/views/debug.erb +0 -3
- data/lib/markdown/server/views/index.erb +0 -18
- data/lib/markdown/server/views/layout.erb +0 -16
- data/lib/markdown/server/views/notepad.erb +0 -8
- data/lib/markdown/server/views/service.erb +0 -10
data/bin/markdown
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
###################
|
4
|
-
# == DEV TIPS:
|
5
|
-
#
|
6
|
-
# For local testing run like:
|
7
|
-
#
|
8
|
-
# ruby -Ilib bin/markdown
|
9
|
-
#
|
10
|
-
# Set the executable bit in Linux. Example:
|
11
|
-
#
|
12
|
-
# % chmod a+x bin/markdown
|
13
|
-
#
|
14
|
-
|
15
|
-
require 'markdown'
|
16
|
-
|
17
|
-
Markdown.main
|
data/lib/markdown/cli/gen.rb
DELETED
@@ -1,89 +0,0 @@
|
|
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
|
data/lib/markdown/cli/opts.rb
DELETED
data/lib/markdown/cli/runner.rb
DELETED
@@ -1,202 +0,0 @@
|
|
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( '--about', "(Debug) Show more version info" ) do
|
121
|
-
puts
|
122
|
-
puts Markdown.banner
|
123
|
-
puts
|
124
|
-
|
125
|
-
# dump settings
|
126
|
-
Markdown.dump
|
127
|
-
puts
|
128
|
-
|
129
|
-
exit
|
130
|
-
end
|
131
|
-
|
132
|
-
cmd.on( "--verbose", "(Debug) Show debug trace" ) do
|
133
|
-
logger.datetime_format = "%H:%H:%S"
|
134
|
-
logger.level = Logger::DEBUG
|
135
|
-
end
|
136
|
-
|
137
|
-
## todo: add markdown.lib options (e.g. extensions,etc)
|
138
|
-
|
139
|
-
cmd.on_tail( "-h", "--help", "Show this message" ) do
|
140
|
-
puts <<EOS
|
141
|
-
|
142
|
-
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(', ')}).
|
143
|
-
|
144
|
-
#{cmd.help}
|
145
|
-
|
146
|
-
Examples:
|
147
|
-
markdown # Process all documents in working folder (that is, .)
|
148
|
-
markdown quickref # Process document or folder using Markdown
|
149
|
-
markdown quickref.text # Process document using Markdown
|
150
|
-
markdown -o site quickref # Output documents to site folder
|
151
|
-
|
152
|
-
Note:
|
153
|
-
markdown server # Starts builtin markdown server
|
154
|
-
# (aliases for server include serve, service, s)
|
155
|
-
|
156
|
-
|
157
|
-
Further information:
|
158
|
-
https://github.com/geraldb/markdown
|
159
|
-
|
160
|
-
EOS
|
161
|
-
exit
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
opt.parse!( args )
|
166
|
-
|
167
|
-
puts Markdown.banner
|
168
|
-
|
169
|
-
# force loading of config
|
170
|
-
Markdown.lib
|
171
|
-
|
172
|
-
Markdown.dump if logger.level == Logger::DEBUG # dump settings if verbose/debug flag on
|
173
|
-
|
174
|
-
|
175
|
-
logger.debug "args.length: #{args.length}"
|
176
|
-
logger.debug "args: >#{args.join(',')}<"
|
177
|
-
|
178
|
-
if args.length == 1 && ['server', 'serve', 'service', 's' ].include?( args[0] )
|
179
|
-
# start service/server
|
180
|
-
# NB: server (HTTP service) not included in standard default require
|
181
|
-
require 'markdown/server'
|
182
|
-
|
183
|
-
Markdown::Server.run!
|
184
|
-
else
|
185
|
-
|
186
|
-
# if no file args given; default to working folder (that is, .)
|
187
|
-
args = ['.'] if args.length == 0
|
188
|
-
|
189
|
-
args.each do |arg|
|
190
|
-
files = find_files( arg )
|
191
|
-
files.each do |file|
|
192
|
-
Gen.new( logger, opts ).create_doc( file )
|
193
|
-
end
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
puts 'Done. Bye.'
|
198
|
-
|
199
|
-
end # method run
|
200
|
-
|
201
|
-
end # class Runner
|
202
|
-
end # module Markdown
|
data/lib/markdown/server.rb
DELETED
@@ -1,195 +0,0 @@
|
|
1
|
-
######
|
2
|
-
# NB: use rackup to startup Sinatra service (see config.ru)
|
3
|
-
#
|
4
|
-
# e.g. config.ru:
|
5
|
-
# require './boot'
|
6
|
-
# run Markdown::Server
|
7
|
-
|
8
|
-
|
9
|
-
# 3rd party libs/gems
|
10
|
-
|
11
|
-
require 'sinatra/base'
|
12
|
-
|
13
|
-
|
14
|
-
# our own code
|
15
|
-
|
16
|
-
# require 'logutils'
|
17
|
-
# require 'logutils/db'
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
module Markdown
|
22
|
-
|
23
|
-
class Server < Sinatra::Base
|
24
|
-
|
25
|
-
def self.banner
|
26
|
-
"markdown-service #{Markdown::VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}] on Sinatra/#{Sinatra::VERSION} (#{ENV['RACK_ENV']})"
|
27
|
-
end
|
28
|
-
|
29
|
-
PUBLIC_FOLDER = "#{Markdown.root}/lib/markdown/server/public"
|
30
|
-
VIEWS_FOLDER = "#{Markdown.root}/lib/markdown/server/views"
|
31
|
-
|
32
|
-
puts "[debug] markdown-service - setting public folder to: #{PUBLIC_FOLDER}"
|
33
|
-
puts "[debug] markdown-service - setting views folder to: #{VIEWS_FOLDER}"
|
34
|
-
|
35
|
-
set :public_folder, PUBLIC_FOLDER # set up the static dir (with images/js/css inside)
|
36
|
-
set :views, VIEWS_FOLDER # set up the views dir
|
37
|
-
|
38
|
-
set :static, true # set up static file routing
|
39
|
-
|
40
|
-
|
41
|
-
##################
|
42
|
-
# Helpers
|
43
|
-
|
44
|
-
helpers do
|
45
|
-
def path_prefix
|
46
|
-
request.env['SCRIPT_NAME']
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
##############################################
|
51
|
-
# Controllers / Routing / Request Handlers
|
52
|
-
|
53
|
-
|
54
|
-
def welcome_markdown
|
55
|
-
<<EOS
|
56
|
-
# Header 1
|
57
|
-
|
58
|
-
## Header 2
|
59
|
-
|
60
|
-
### Header 3
|
61
|
-
|
62
|
-
Welcome to [Markdown](#{request.url}). We hope you **really** enjoy using this.
|
63
|
-
|
64
|
-
Just type some [markdown](http://daringfireball.net/projects/markdown) on the left and see it on the right. *Simple as that.*
|
65
|
-
|
66
|
-
> Quote goes here.
|
67
|
-
|
68
|
-
A list:
|
69
|
-
|
70
|
-
- One
|
71
|
-
- Two
|
72
|
-
- Three
|
73
|
-
|
74
|
-
Some inline code `to_html` and a preformatted code block:
|
75
|
-
|
76
|
-
```
|
77
|
-
Markdown.new( 'Hello Markdown!' ).to_html
|
78
|
-
```
|
79
|
-
EOS
|
80
|
-
end
|
81
|
-
|
82
|
-
|
83
|
-
get %r{/(service|services|srv|s)} do
|
84
|
-
erb :service
|
85
|
-
end
|
86
|
-
|
87
|
-
get %r{/(notepad|note|notes|n)} do
|
88
|
-
@welcome_markdown = welcome_markdown
|
89
|
-
@welcome_html = Markdown.new( @welcome_markdown ).to_html
|
90
|
-
|
91
|
-
erb :notepad
|
92
|
-
end
|
93
|
-
|
94
|
-
get '/' do
|
95
|
-
@welcome_markdown = welcome_markdown
|
96
|
-
@welcome_html = Markdown.new( @welcome_markdown ).to_html
|
97
|
-
|
98
|
-
erb :index
|
99
|
-
end
|
100
|
-
|
101
|
-
|
102
|
-
## todo: use 3rd party services from markdown.yml (lets you configure)
|
103
|
-
# e.g. http://johnmacfarlane.net/cgi-bin/pandoc-dingus?text=hi
|
104
|
-
|
105
|
-
|
106
|
-
def markdownify( params, opts={} )
|
107
|
-
pp params
|
108
|
-
text = params[:text]
|
109
|
-
lib = params[:lib] # optional
|
110
|
-
pp text
|
111
|
-
pp lib
|
112
|
-
|
113
|
-
# fix: use activesupport -> .present?
|
114
|
-
if lib.nil? == false && lib.empty? == false
|
115
|
-
Markdown.lib = lib
|
116
|
-
end
|
117
|
-
|
118
|
-
Markdown.new( text, opts ).to_html
|
119
|
-
end
|
120
|
-
|
121
|
-
|
122
|
-
# return hypertext (html)
|
123
|
-
get '/markdown' do
|
124
|
-
content_type 'text/html'
|
125
|
-
markdownify( params )
|
126
|
-
end
|
127
|
-
|
128
|
-
|
129
|
-
# return babelmark2/dingus-style json
|
130
|
-
get '/markdown/dingus' do
|
131
|
-
html = markdownify( params )
|
132
|
-
|
133
|
-
## todo: use converter for markdownify
|
134
|
-
lib = Markdown.lib
|
135
|
-
conv = Markdown.create_converter( lib )
|
136
|
-
|
137
|
-
data = {
|
138
|
-
name: lib,
|
139
|
-
html: html,
|
140
|
-
version: conv.version
|
141
|
-
}
|
142
|
-
|
143
|
-
json_or_jsonp( data.to_json )
|
144
|
-
end
|
145
|
-
|
146
|
-
# return html wrapped in json (follows babelfish2 dingus service api)
|
147
|
-
get '/dingus' do
|
148
|
-
html = markdownify( params, banner: false )
|
149
|
-
|
150
|
-
## todo: use converter for markdownify
|
151
|
-
lib = Markdown.lib
|
152
|
-
conv = Markdown.create_converter( lib )
|
153
|
-
|
154
|
-
data = {
|
155
|
-
name: lib,
|
156
|
-
html: html,
|
157
|
-
version: conv.version
|
158
|
-
}
|
159
|
-
|
160
|
-
json_or_jsonp( data.to_json )
|
161
|
-
end
|
162
|
-
|
163
|
-
|
164
|
-
get '/d*' do
|
165
|
-
erb :debug
|
166
|
-
end
|
167
|
-
|
168
|
-
|
169
|
-
### helper for json or jsonp response (depending on callback para)
|
170
|
-
|
171
|
-
private
|
172
|
-
def json_or_jsonp( json )
|
173
|
-
callback = params.delete('callback')
|
174
|
-
response = ''
|
175
|
-
|
176
|
-
if callback
|
177
|
-
content_type :js
|
178
|
-
response = "#{callback}(#{json})"
|
179
|
-
else
|
180
|
-
content_type :json
|
181
|
-
response = json
|
182
|
-
end
|
183
|
-
|
184
|
-
response
|
185
|
-
end
|
186
|
-
|
187
|
-
|
188
|
-
end # class Server
|
189
|
-
end # module Markdown
|
190
|
-
|
191
|
-
|
192
|
-
# say hello
|
193
|
-
puts Markdown::Server.banner
|
194
|
-
puts " default markdown engine: #{Markdown.lib}" # force loading of settings/config
|
195
|
-
puts " markdown engines: #{Markdown.libs.inspect}"
|