markdown 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +7 -0
  2. data/{History.markdown → HISTORY.md} +0 -0
  3. data/Manifest.txt +2 -20
  4. data/{README.markdown → README.md} +11 -48
  5. data/Rakefile +12 -14
  6. data/lib/markdown.rb +6 -38
  7. data/lib/markdown/config.rb +3 -1
  8. data/lib/markdown/engines/bluecloth.rb +2 -0
  9. data/lib/markdown/engines/kramdown.rb +4 -2
  10. data/lib/markdown/engines/maruku.rb +2 -0
  11. data/lib/markdown/engines/pandoc_ruby.rb +2 -0
  12. data/lib/markdown/engines/rdiscount.rb +2 -0
  13. data/lib/markdown/engines/redcarpet.rb +2 -0
  14. data/lib/markdown/engines/rpeg_markdown.rb +2 -0
  15. data/lib/markdown/version.rb +24 -2
  16. data/lib/markdown/wrapper.rb +3 -1
  17. data/test/helper.rb +0 -8
  18. data/test/test_kramdown.rb +1 -2
  19. data/test/test_redcarpet.rb +1 -1
  20. metadata +57 -61
  21. data/bin/markdown +0 -17
  22. data/lib/markdown/cli/gen.rb +0 -89
  23. data/lib/markdown/cli/opts.rb +0 -14
  24. data/lib/markdown/cli/runner.rb +0 -202
  25. data/lib/markdown/server.rb +0 -195
  26. data/lib/markdown/server/public/style.css +0 -112
  27. data/lib/markdown/server/views/_about.erb +0 -23
  28. data/lib/markdown/server/views/_debug.erb +0 -27
  29. data/lib/markdown/server/views/_libs.erb +0 -14
  30. data/lib/markdown/server/views/_libs_service.erb +0 -27
  31. data/lib/markdown/server/views/_notepad.erb +0 -96
  32. data/lib/markdown/server/views/_service.erb +0 -75
  33. data/lib/markdown/server/views/_version.erb +0 -6
  34. data/lib/markdown/server/views/debug.erb +0 -3
  35. data/lib/markdown/server/views/index.erb +0 -18
  36. data/lib/markdown/server/views/layout.erb +0 -16
  37. data/lib/markdown/server/views/notepad.erb +0 -8
  38. data/lib/markdown/server/views/service.erb +0 -10
@@ -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
@@ -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
@@ -1,14 +0,0 @@
1
- module Markdown
2
-
3
- class Opts
4
-
5
- def output_path=(value)
6
- @output_path = value
7
- end
8
-
9
- def output_path
10
- @output_path || '.'
11
- end
12
-
13
- end # class Opts
14
- end # module Markdown
@@ -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
@@ -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}"