bluecloth 2.0.7-x86-mingw32 → 2.0.11pre158-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. data.tar.gz.sig +0 -0
  2. data/.gemtest +0 -0
  3. data/History.md +4 -0
  4. data/LICENSE +1 -1
  5. data/Manifest.txt +103 -0
  6. data/README.md +103 -0
  7. data/Rakefile +95 -301
  8. data/ext/VERSION +1 -1
  9. data/ext/bluecloth.c +69 -23
  10. data/ext/bluecloth.h +13 -2
  11. data/ext/config.h +13 -2
  12. data/ext/css.c +14 -5
  13. data/ext/cstring.h +4 -2
  14. data/ext/docheader.c +13 -7
  15. data/ext/emmatch.c +188 -0
  16. data/ext/extconf.rb +7 -9
  17. data/ext/generate.c +333 -293
  18. data/ext/html5.c +24 -0
  19. data/ext/markdown.c +326 -185
  20. data/ext/markdown.h +52 -29
  21. data/ext/mkdio.c +82 -41
  22. data/ext/mkdio.h +44 -23
  23. data/ext/resource.c +4 -2
  24. data/ext/setup.c +47 -0
  25. data/ext/tags.c +123 -0
  26. data/ext/tags.h +19 -0
  27. data/lib/1.8/bluecloth_ext.so +0 -0
  28. data/lib/1.9/bluecloth_ext.so +0 -0
  29. data/lib/bluecloth.rb +77 -42
  30. data/spec/bluecloth/101_changes_spec.rb +18 -21
  31. data/spec/bluecloth/TEMPLATE +36 -0
  32. data/spec/bluecloth/autolinks_spec.rb +4 -7
  33. data/spec/bluecloth/blockquotes_spec.rb +20 -23
  34. data/spec/bluecloth/code_spans_spec.rb +2 -5
  35. data/spec/bluecloth/emphasis_spec.rb +2 -5
  36. data/spec/bluecloth/entities_spec.rb +2 -5
  37. data/spec/bluecloth/hrules_spec.rb +2 -5
  38. data/spec/bluecloth/images_spec.rb +2 -5
  39. data/spec/bluecloth/inline_html_spec.rb +26 -66
  40. data/spec/bluecloth/links_spec.rb +1 -5
  41. data/spec/bluecloth/lists_spec.rb +2 -5
  42. data/spec/bluecloth/paragraphs_spec.rb +2 -5
  43. data/spec/bluecloth/titles_spec.rb +2 -5
  44. data/spec/bluecloth_spec.rb +36 -22
  45. data/spec/bugfix_spec.rb +90 -10
  46. data/spec/contributions_spec.rb +2 -3
  47. data/spec/discount_spec.rb +50 -10
  48. data/spec/lib/helpers.rb +18 -117
  49. data/spec/lib/matchers.rb +7 -18
  50. data/spec/markdowntest_spec.rb +3 -39
  51. metadata +257 -143
  52. metadata.gz.sig +0 -0
  53. data/ChangeLog +0 -387
  54. data/README +0 -81
  55. data/Rakefile.local +0 -41
  56. data/rake/191_compat.rb +0 -26
  57. data/rake/dependencies.rb +0 -76
  58. data/rake/helpers.rb +0 -435
  59. data/rake/hg.rb +0 -273
  60. data/rake/manual.rb +0 -782
  61. data/rake/packaging.rb +0 -123
  62. data/rake/publishing.rb +0 -274
  63. data/rake/rdoc.rb +0 -30
  64. data/rake/style.rb +0 -62
  65. data/rake/svn.rb +0 -668
  66. data/rake/testing.rb +0 -187
  67. data/rake/verifytask.rb +0 -64
data/Rakefile.local DELETED
@@ -1,41 +0,0 @@
1
- #!rake
2
-
3
- require 'rake/extensiontask'
4
-
5
- # C extension constants
6
- EXT_MAKEFILE = EXTDIR + 'Makefile'
7
- EXT_SOURCES = FileList[ EXTDIR + '*.c' ]
8
- EXT_SO = EXTDIR + "bluecloth_ext.#{CONFIG['DLEXT']}"
9
-
10
- GEMSPEC.extra_rdoc_files << 'LICENSE.discount'
11
- DOCFILES << 'LICENSE.discount'
12
-
13
-
14
- #####################################################################
15
- ### T A S K S
16
- #####################################################################
17
-
18
- # Make both the default task and the spec task depend on building the extension
19
- task :local => :compile
20
- task :spec => :compile
21
- namespace :spec do
22
- task :doc => [ :compile ]
23
- task :quiet => [ :compile ]
24
- task :html => [ :compile ]
25
- task :text => [ :compile ]
26
- end
27
-
28
- ENV['RUBY_CC_VERSION'] = '1.8.6:1.9.1'
29
-
30
- Rake::ExtensionTask.new do |ext|
31
- ext.name = 'bluecloth_ext'
32
- ext.gem_spec = GEMSPEC
33
- ext.ext_dir = 'ext'
34
- ext.lib_dir = 'lib'
35
- ext.source_pattern = "*.{c,h}"
36
- ext.cross_compile = true
37
- ext.cross_platform = %w[i386-mswin32 i386-mingw32]
38
- end
39
-
40
- CLEAN.include( "#{LIBDIR + '1.8'}", "#{LIBDIR + '1.9'}" )
41
-
data/rake/191_compat.rb DELETED
@@ -1,26 +0,0 @@
1
- # 1.9.1 fixes
2
-
3
-
4
- # Make Pathname compatible with 1.8.7 Pathname.
5
- unless Pathname.instance_methods.include?( :=~ )
6
- class Pathname
7
- def self::glob( *args ) # :yield: p
8
- args = args.collect {|p| p.to_s }
9
- if block_given?
10
- Dir.glob(*args) {|f| yield self.new(f) }
11
- else
12
- Dir.glob(*args).map {|f| self.new(f) }
13
- end
14
- end
15
-
16
- def =~( other )
17
- self.to_s =~ other
18
- end
19
-
20
- def to_str
21
- self.to_s
22
- end
23
- end
24
- end
25
-
26
-
data/rake/dependencies.rb DELETED
@@ -1,76 +0,0 @@
1
- #
2
- # Dependency-checking and Installation Rake Tasks
3
-
4
- #
5
-
6
- require 'rubygems/dependency_installer'
7
- require 'rubygems/source_index'
8
- require 'rubygems/requirement'
9
- require 'rubygems/doc_manager'
10
-
11
- ### Install the specified +gems+ if they aren't already installed.
12
- def install_gems( gems )
13
-
14
- defaults = Gem::DependencyInstaller::DEFAULT_OPTIONS.merge({
15
- :generate_rdoc => true,
16
- :generate_ri => true,
17
- :install_dir => Gem.dir,
18
- :format_executable => false,
19
- :test => false,
20
- :version => Gem::Requirement.default,
21
- })
22
-
23
- # Check for root
24
- if Process.euid != 0
25
- $stderr.puts "This probably won't work, as you aren't root, but I'll try anyway"
26
- end
27
-
28
- gemindex = Gem::SourceIndex.from_installed_gems
29
-
30
- gems.each do |gemname, reqstring|
31
- requirement = Gem::Requirement.new( reqstring )
32
- trace "requirement is: %p" % [ requirement ]
33
-
34
- trace "Searching for an installed #{gemname}..."
35
- specs = gemindex.find_name( gemname )
36
- trace "...found %d specs: %s" %
37
- [ specs.length, specs.collect {|s| "%s %s" % [s.name, s.version] }.join(', ') ]
38
-
39
- if spec = specs.find {|spec| requirement.satisfied_by?(spec.version) }
40
- log "Version %s of %s is already installed (needs %s); skipping..." %
41
- [ spec.version, spec.name, requirement ]
42
- next
43
- end
44
-
45
- rgv = Gem::Version.new( Gem::RubyGemsVersion )
46
- installer = nil
47
-
48
- log "Trying to install #{gemname.inspect} #{requirement}..."
49
- if rgv >= Gem::Version.new( '1.1.1' )
50
- installer = Gem::DependencyInstaller.new
51
- installer.install( gemname, requirement )
52
- else
53
- installer = Gem::DependencyInstaller.new( gemname )
54
- installer.install
55
- end
56
-
57
- installer.installed_gems.each do |spec|
58
- log "Installed: %s" % [ spec.full_name ]
59
- end
60
-
61
- end
62
- end
63
-
64
-
65
- ### Task: install runtime dependencies
66
- desc "Install runtime dependencies as gems"
67
- task :install_dependencies do
68
- install_gems( DEPENDENCIES )
69
- end
70
-
71
- ### Task: install gems for development tasks
72
- desc "Install development dependencies as gems"
73
- task :install_dev_dependencies do
74
- install_gems( DEVELOPMENT_DEPENDENCIES )
75
- end
76
-
data/rake/helpers.rb DELETED
@@ -1,435 +0,0 @@
1
- # encoding: utf-8
2
- #####################################################################
3
- ### G L O B A L H E L P E R F U N C T I O N S
4
- #####################################################################
5
-
6
-
7
- require 'pathname'
8
- require 'uri'
9
- require 'open3'
10
-
11
- begin
12
- require 'readline'
13
- include Readline
14
- rescue LoadError
15
- # Fall back to a plain prompt
16
- def readline( text )
17
- $stderr.print( text.chomp )
18
- return $stdin.gets
19
- end
20
- end
21
-
22
- # Set some ANSI escape code constants (Shamelessly stolen from Perl's
23
- # Term::ANSIColor by Russ Allbery <rra@stanford.edu> and Zenin <zenin@best.com>
24
- ANSI_ATTRIBUTES = {
25
- 'clear' => 0,
26
- 'reset' => 0,
27
- 'bold' => 1,
28
- 'dark' => 2,
29
- 'underline' => 4,
30
- 'underscore' => 4,
31
- 'blink' => 5,
32
- 'reverse' => 7,
33
- 'concealed' => 8,
34
-
35
- 'black' => 30, 'on_black' => 40,
36
- 'red' => 31, 'on_red' => 41,
37
- 'green' => 32, 'on_green' => 42,
38
- 'yellow' => 33, 'on_yellow' => 43,
39
- 'blue' => 34, 'on_blue' => 44,
40
- 'magenta' => 35, 'on_magenta' => 45,
41
- 'cyan' => 36, 'on_cyan' => 46,
42
- 'white' => 37, 'on_white' => 47
43
- }
44
-
45
-
46
- MULTILINE_PROMPT = <<-'EOF'
47
- Enter one or more values for '%s'.
48
- A blank line finishes input.
49
- EOF
50
-
51
-
52
- CLEAR_TO_EOL = "\e[K"
53
- CLEAR_CURRENT_LINE = "\e[2K"
54
-
55
-
56
- ### Output a logging message
57
- def log( *msg )
58
- output = colorize( msg.flatten.join(' '), 'cyan' )
59
- $stderr.puts( output )
60
- end
61
-
62
-
63
- ### Output a logging message if tracing is on
64
- def trace( *msg )
65
- return unless $trace
66
- output = colorize( msg.flatten.join(' '), 'yellow' )
67
- $stderr.puts( output )
68
- end
69
-
70
-
71
- ### Return the specified args as a string, quoting any that have a space.
72
- def quotelist( *args )
73
- return args.flatten.collect {|part| part =~ /\s/ ? part.inspect : part}
74
- end
75
-
76
-
77
- ### Run the specified command +cmd+ with system(), failing if the execution
78
- ### fails.
79
- def run( *cmd )
80
- cmd.flatten!
81
-
82
- if cmd.length > 1
83
- trace( quotelist(*cmd) )
84
- else
85
- trace( cmd )
86
- end
87
-
88
- if $dryrun
89
- $stderr.puts "(dry run mode)"
90
- else
91
- system( *cmd )
92
- unless $?.success?
93
- fail "Command failed: [%s]" % [cmd.join(' ')]
94
- end
95
- end
96
- end
97
-
98
-
99
- ### Run the given +cmd+ with the specified +args+ without interpolation by the shell and
100
- ### return anything written to its STDOUT.
101
- def read_command_output( cmd, *args )
102
- trace "Reading output from: %s" % [ cmd, quotelist(cmd, *args) ]
103
- output = IO.read( '|-' ) or exec cmd, *args
104
- return output
105
- end
106
-
107
-
108
- ### Run a subordinate Rake process with the same options and the specified +targets+.
109
- def rake( *targets )
110
- opts = ARGV.select {|arg| arg[0,1] == '-' }
111
- args = opts + targets.map {|t| t.to_s }
112
- run 'rake', '-N', *args
113
- end
114
-
115
-
116
- ### Open a pipe to a process running the given +cmd+ and call the given block with it.
117
- def pipeto( *cmd )
118
- $DEBUG = true
119
-
120
- cmd.flatten!
121
- log( "Opening a pipe to: ", cmd.collect {|part| part =~ /\s/ ? part.inspect : part} )
122
- if $dryrun
123
- $stderr.puts "(dry run mode)"
124
- else
125
- open( '|-', 'w+' ) do |io|
126
-
127
- # Parent
128
- if io
129
- yield( io )
130
-
131
- # Child
132
- else
133
- exec( *cmd )
134
- fail "Command failed: [%s]" % [cmd.join(' ')]
135
- end
136
- end
137
- end
138
- end
139
-
140
-
141
- ### Download the file at +sourceuri+ via HTTP and write it to +targetfile+.
142
- def download( sourceuri, targetfile=nil )
143
- oldsync = $stdout.sync
144
- $stdout.sync = true
145
- require 'open-uri'
146
-
147
- targetpath = Pathname.new( targetfile )
148
-
149
- log "Downloading %s to %s" % [sourceuri, targetfile]
150
- trace " connecting..."
151
- ifh = open( sourceuri ) do |ifh|
152
- trace " connected..."
153
- targetpath.open( File::WRONLY|File::TRUNC|File::CREAT, 0644 ) do |ofh|
154
- log "Downloading..."
155
- buf = ''
156
-
157
- while ifh.read( 16384, buf )
158
- until buf.empty?
159
- bytes = ofh.write( buf )
160
- buf.slice!( 0, bytes )
161
- end
162
- end
163
-
164
- log "Done."
165
- end
166
-
167
- end
168
-
169
- return targetpath
170
- ensure
171
- $stdout.sync = oldsync
172
- end
173
-
174
-
175
- ### Return the fully-qualified path to the specified +program+ in the PATH.
176
- def which( program )
177
- return nil unless ENV['PATH']
178
- ENV['PATH'].split(/:/).
179
- collect {|dir| Pathname.new(dir) + program }.
180
- find {|path| path.exist? && path.executable? }
181
- end
182
-
183
-
184
- ### Create a string that contains the ANSI codes specified and return it
185
- def ansi_code( *attributes )
186
- attributes.flatten!
187
- attributes.collect! {|at| at.to_s }
188
- # $stderr.puts "Returning ansicode for TERM = %p: %p" %
189
- # [ ENV['TERM'], attributes ]
190
- return '' unless /(?:vt10[03]|xterm(?:-color)?|linux|screen)/i =~ ENV['TERM']
191
- attributes = ANSI_ATTRIBUTES.values_at( *attributes ).compact.join(';')
192
-
193
- # $stderr.puts " attr is: %p" % [attributes]
194
- if attributes.empty?
195
- return ''
196
- else
197
- return "\e[%sm" % attributes
198
- end
199
- end
200
-
201
-
202
- ### Colorize the given +string+ with the specified +attributes+ and return it, handling
203
- ### line-endings, color reset, etc.
204
- def colorize( *args )
205
- string = ''
206
-
207
- if block_given?
208
- string = yield
209
- else
210
- string = args.shift
211
- end
212
-
213
- ending = string[/(\s)$/] || ''
214
- string = string.rstrip
215
-
216
- return ansi_code( args.flatten ) + string + ansi_code( 'reset' ) + ending
217
- end
218
-
219
-
220
- ### Output the specified <tt>msg</tt> as an ANSI-colored error message
221
- ### (white on red).
222
- def error_message( msg, details='' )
223
- $stderr.puts colorize( 'bold', 'white', 'on_red' ) { msg } + details
224
- end
225
- alias :error :error_message
226
-
227
-
228
- ### Highlight and embed a prompt control character in the given +string+ and return it.
229
- def make_prompt_string( string )
230
- return CLEAR_CURRENT_LINE + colorize( 'bold', 'green' ) { string + ' ' }
231
- end
232
-
233
-
234
- ### Output the specified <tt>prompt_string</tt> as a prompt (in green) and
235
- ### return the user's input with leading and trailing spaces removed. If a
236
- ### test is provided, the prompt will repeat until the test returns true.
237
- ### An optional failure message can also be passed in.
238
- def prompt( prompt_string, failure_msg="Try again." ) # :yields: response
239
- prompt_string.chomp!
240
- prompt_string << ":" unless /\W$/.match( prompt_string )
241
- response = nil
242
-
243
- begin
244
- prompt = make_prompt_string( prompt_string )
245
- response = readline( prompt ) || ''
246
- response.strip!
247
- if block_given? && ! yield( response )
248
- error_message( failure_msg + "\n\n" )
249
- response = nil
250
- end
251
- end while response.nil?
252
-
253
- return response
254
- end
255
-
256
-
257
- ### Prompt the user with the given <tt>prompt_string</tt> via #prompt,
258
- ### substituting the given <tt>default</tt> if the user doesn't input
259
- ### anything. If a test is provided, the prompt will repeat until the test
260
- ### returns true. An optional failure message can also be passed in.
261
- def prompt_with_default( prompt_string, default, failure_msg="Try again." )
262
- response = nil
263
-
264
- begin
265
- default ||= '~'
266
- response = prompt( "%s [%s]" % [ prompt_string, default ] )
267
- response = default.to_s if !response.nil? && response.empty?
268
-
269
- trace "Validating response %p" % [ response ]
270
-
271
- # the block is a validator. We need to make sure that the user didn't
272
- # enter '~', because if they did, it's nil and we should move on. If
273
- # they didn't, then call the block.
274
- if block_given? && response != '~' && ! yield( response )
275
- error_message( failure_msg + "\n\n" )
276
- response = nil
277
- end
278
- end while response.nil?
279
-
280
- return nil if response == '~'
281
- return response
282
- end
283
-
284
-
285
- ### Prompt for an array of values
286
- def prompt_for_multiple_values( label, default=nil )
287
- $stderr.puts( MULTILINE_PROMPT % [label] )
288
- if default
289
- $stderr.puts "Enter a single blank line to keep the default:\n %p" % [ default ]
290
- end
291
-
292
- results = []
293
- result = nil
294
-
295
- begin
296
- result = readline( make_prompt_string("> ") )
297
- if result.nil? || result.empty?
298
- results << default if default && results.empty?
299
- else
300
- results << result
301
- end
302
- end until result.nil? || result.empty?
303
-
304
- return results.flatten
305
- end
306
-
307
-
308
- ### Turn echo and masking of input on/off.
309
- def noecho( masked=false )
310
- require 'termios'
311
-
312
- rval = nil
313
- term = Termios.getattr( $stdin )
314
-
315
- begin
316
- newt = term.dup
317
- newt.c_lflag &= ~Termios::ECHO
318
- newt.c_lflag &= ~Termios::ICANON if masked
319
-
320
- Termios.tcsetattr( $stdin, Termios::TCSANOW, newt )
321
-
322
- rval = yield
323
- ensure
324
- Termios.tcsetattr( $stdin, Termios::TCSANOW, term )
325
- end
326
-
327
- return rval
328
- end
329
-
330
-
331
- ### Prompt the user for her password, turning off echo if the 'termios' module is
332
- ### available.
333
- def prompt_for_password( prompt="Password: " )
334
- return noecho( true ) do
335
- $stderr.print( prompt )
336
- ($stdin.gets || '').chomp
337
- end
338
- end
339
-
340
-
341
- ### Display a description of a potentially-dangerous task, and prompt
342
- ### for confirmation. If the user answers with anything that begins
343
- ### with 'y', yield to the block. If +abort_on_decline+ is +true+,
344
- ### any non-'y' answer will fail with an error message.
345
- def ask_for_confirmation( description, abort_on_decline=true )
346
- puts description
347
-
348
- answer = prompt_with_default( "Continue?", 'n' ) do |input|
349
- input =~ /^[yn]/i
350
- end
351
-
352
- if answer =~ /^y/i
353
- return yield
354
- elsif abort_on_decline
355
- error "Aborted."
356
- fail
357
- end
358
-
359
- return false
360
- end
361
- alias :prompt_for_confirmation :ask_for_confirmation
362
-
363
-
364
- ### Search line-by-line in the specified +file+ for the given +regexp+, returning the
365
- ### first match, or nil if no match was found. If the +regexp+ has any capture groups,
366
- ### those will be returned in an Array, else the whole matching line is returned.
367
- def find_pattern_in_file( regexp, file )
368
- rval = nil
369
-
370
- File.open( file, 'r' ).each do |line|
371
- if (( match = regexp.match(line) ))
372
- rval = match.captures.empty? ? match[0] : match.captures
373
- break
374
- end
375
- end
376
-
377
- return rval
378
- end
379
-
380
-
381
- ### Search line-by-line in the output of the specified +cmd+ for the given +regexp+,
382
- ### returning the first match, or nil if no match was found. If the +regexp+ has any
383
- ### capture groups, those will be returned in an Array, else the whole matching line
384
- ### is returned.
385
- def find_pattern_in_pipe( regexp, *cmd )
386
- output = []
387
-
388
- log( cmd.collect {|part| part =~ /\s/ ? part.inspect : part} )
389
- Open3.popen3( *cmd ) do |stdin, stdout, stderr|
390
- stdin.close
391
-
392
- output << stdout.gets until stdout.eof?
393
- output << stderr.gets until stderr.eof?
394
- end
395
-
396
- result = output.find { |line| regexp.match(line) }
397
- return $1 || result
398
- end
399
-
400
-
401
- ### Invoke the user's editor on the given +filename+ and return the exit code
402
- ### from doing so.
403
- def edit( filename )
404
- editor = ENV['EDITOR'] || ENV['VISUAL'] || DEFAULT_EDITOR
405
- system editor, filename
406
- unless $?.success? || editor =~ /vim/i
407
- fail "Editor exited uncleanly."
408
- end
409
- end
410
-
411
-
412
- ### Extract all the non Rake-target arguments from ARGV and return them.
413
- def get_target_args
414
- args = ARGV.reject {|arg| arg =~ /^-/ || Rake::Task.task_defined?(arg) }
415
- return args
416
- end
417
-
418
-
419
- ### Log a subdirectory change, execute a block, and exit the subdirectory
420
- def in_subdirectory( subdir )
421
- block = Proc.new
422
-
423
- log "Entering #{subdir}"
424
- Dir.chdir( subdir, &block )
425
- log "Leaving #{subdir}"
426
- end
427
-
428
-
429
- ### Make an easily-comparable version vector out of +ver+ and return it.
430
- def vvec( ver )
431
- return ver.split('.').collect {|char| char.to_i }.pack('N*')
432
- end
433
-
434
-
435
-