bluecloth 2.0.6.pre120-x86-mswin32

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.
Files changed (112) hide show
  1. data/ChangeLog +363 -0
  2. data/LICENSE +27 -0
  3. data/LICENSE.discount +47 -0
  4. data/README +81 -0
  5. data/Rakefile +349 -0
  6. data/Rakefile.local +43 -0
  7. data/bin/bluecloth +84 -0
  8. data/ext/Csio.c +61 -0
  9. data/ext/VERSION +1 -0
  10. data/ext/amalloc.h +29 -0
  11. data/ext/bluecloth.c +391 -0
  12. data/ext/bluecloth.h +19 -0
  13. data/ext/config.h +55 -0
  14. data/ext/css.c +76 -0
  15. data/ext/cstring.h +75 -0
  16. data/ext/docheader.c +43 -0
  17. data/ext/extconf.rb +52 -0
  18. data/ext/generate.c +1602 -0
  19. data/ext/markdown.c +1078 -0
  20. data/ext/markdown.h +146 -0
  21. data/ext/mkdio.c +303 -0
  22. data/ext/mkdio.h +79 -0
  23. data/ext/resource.c +155 -0
  24. data/ext/version.c +28 -0
  25. data/ext/xml.c +82 -0
  26. data/ext/xmlpage.c +48 -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 +164 -0
  30. data/rake/191_compat.rb +26 -0
  31. data/rake/dependencies.rb +76 -0
  32. data/rake/helpers.rb +434 -0
  33. data/rake/hg.rb +273 -0
  34. data/rake/manual.rb +782 -0
  35. data/rake/packaging.rb +126 -0
  36. data/rake/publishing.rb +269 -0
  37. data/rake/rdoc.rb +30 -0
  38. data/rake/style.rb +62 -0
  39. data/rake/svn.rb +668 -0
  40. data/rake/testing.rb +187 -0
  41. data/rake/verifytask.rb +64 -0
  42. data/rake/win32.rb +190 -0
  43. data/spec/bluecloth/101_changes_spec.rb +141 -0
  44. data/spec/bluecloth/autolinks_spec.rb +49 -0
  45. data/spec/bluecloth/blockquotes_spec.rb +145 -0
  46. data/spec/bluecloth/code_spans_spec.rb +164 -0
  47. data/spec/bluecloth/emphasis_spec.rb +164 -0
  48. data/spec/bluecloth/entities_spec.rb +65 -0
  49. data/spec/bluecloth/hrules_spec.rb +90 -0
  50. data/spec/bluecloth/images_spec.rb +92 -0
  51. data/spec/bluecloth/inline_html_spec.rb +238 -0
  52. data/spec/bluecloth/links_spec.rb +171 -0
  53. data/spec/bluecloth/lists_spec.rb +294 -0
  54. data/spec/bluecloth/paragraphs_spec.rb +75 -0
  55. data/spec/bluecloth/titles_spec.rb +305 -0
  56. data/spec/bluecloth_spec.rb +281 -0
  57. data/spec/bugfix_spec.rb +172 -0
  58. data/spec/contributions_spec.rb +85 -0
  59. data/spec/data/antsugar.txt +34 -0
  60. data/spec/data/markdowntest/Amps and angle encoding.html +17 -0
  61. data/spec/data/markdowntest/Amps and angle encoding.text +21 -0
  62. data/spec/data/markdowntest/Auto links.html +18 -0
  63. data/spec/data/markdowntest/Auto links.text +13 -0
  64. data/spec/data/markdowntest/Backslash escapes.html +118 -0
  65. data/spec/data/markdowntest/Backslash escapes.text +120 -0
  66. data/spec/data/markdowntest/Blockquotes with code blocks.html +15 -0
  67. data/spec/data/markdowntest/Blockquotes with code blocks.text +11 -0
  68. data/spec/data/markdowntest/Code Blocks.html +18 -0
  69. data/spec/data/markdowntest/Code Blocks.text +14 -0
  70. data/spec/data/markdowntest/Code Spans.html +5 -0
  71. data/spec/data/markdowntest/Code Spans.text +5 -0
  72. data/spec/data/markdowntest/Hard-wrapped paragraphs with list-like lines.html +8 -0
  73. data/spec/data/markdowntest/Hard-wrapped paragraphs with list-like lines.text +8 -0
  74. data/spec/data/markdowntest/Horizontal rules.html +71 -0
  75. data/spec/data/markdowntest/Horizontal rules.text +67 -0
  76. data/spec/data/markdowntest/Inline HTML (Advanced).html +15 -0
  77. data/spec/data/markdowntest/Inline HTML (Advanced).text +15 -0
  78. data/spec/data/markdowntest/Inline HTML (Simple).html +72 -0
  79. data/spec/data/markdowntest/Inline HTML (Simple).text +69 -0
  80. data/spec/data/markdowntest/Inline HTML comments.html +13 -0
  81. data/spec/data/markdowntest/Inline HTML comments.text +13 -0
  82. data/spec/data/markdowntest/Links, inline style.html +11 -0
  83. data/spec/data/markdowntest/Links, inline style.text +12 -0
  84. data/spec/data/markdowntest/Links, reference style.html +52 -0
  85. data/spec/data/markdowntest/Links, reference style.text +71 -0
  86. data/spec/data/markdowntest/Links, shortcut references.html +9 -0
  87. data/spec/data/markdowntest/Links, shortcut references.text +20 -0
  88. data/spec/data/markdowntest/Literal quotes in titles.html +3 -0
  89. data/spec/data/markdowntest/Literal quotes in titles.text +7 -0
  90. data/spec/data/markdowntest/Markdown Documentation - Basics.html +314 -0
  91. data/spec/data/markdowntest/Markdown Documentation - Basics.text +306 -0
  92. data/spec/data/markdowntest/Markdown Documentation - Syntax.html +942 -0
  93. data/spec/data/markdowntest/Markdown Documentation - Syntax.text +888 -0
  94. data/spec/data/markdowntest/Nested blockquotes.html +9 -0
  95. data/spec/data/markdowntest/Nested blockquotes.text +5 -0
  96. data/spec/data/markdowntest/Ordered and unordered lists.html +148 -0
  97. data/spec/data/markdowntest/Ordered and unordered lists.text +131 -0
  98. data/spec/data/markdowntest/Strong and em together.html +7 -0
  99. data/spec/data/markdowntest/Strong and em together.text +7 -0
  100. data/spec/data/markdowntest/Tabs.html +25 -0
  101. data/spec/data/markdowntest/Tabs.text +21 -0
  102. data/spec/data/markdowntest/Tidyness.html +8 -0
  103. data/spec/data/markdowntest/Tidyness.text +5 -0
  104. data/spec/data/ml-announce.txt +17 -0
  105. data/spec/data/re-overflow.txt +67 -0
  106. data/spec/data/re-overflow2.txt +281 -0
  107. data/spec/discount_spec.rb +184 -0
  108. data/spec/lib/constants.rb +5 -0
  109. data/spec/lib/helpers.rb +137 -0
  110. data/spec/lib/matchers.rb +235 -0
  111. data/spec/markdowntest_spec.rb +79 -0
  112. metadata +205 -0
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/ruby
2
+
3
+ module BlueCloth::TestConstants
4
+
5
+ end
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/ruby
2
+ # encoding: utf-8
3
+
4
+ require 'spec'
5
+ require 'bluecloth'
6
+
7
+
8
+ module BlueCloth::SpecHelpers
9
+
10
+ ###############
11
+ module_function
12
+ ###############
13
+
14
+ end
15
+
16
+
17
+ # Override the badly-formatted output of the RSpec HTML formatter
18
+ require 'spec/runner/formatter/html_formatter'
19
+
20
+ class Spec::Runner::Formatter::HtmlFormatter
21
+ def example_failed( example, counter, failure )
22
+ failure_style = failure.pending_fixed? ? 'pending_fixed' : 'failed'
23
+
24
+ unless @header_red
25
+ @output.puts " <script type=\"text/javascript\">makeRed('rspec-header');</script>"
26
+ @header_red = true
27
+ end
28
+
29
+ unless @example_group_red
30
+ css_class = 'example_group_%d' % [current_example_group_number||0]
31
+ @output.puts " <script type=\"text/javascript\">makeRed('#{css_class}');</script>"
32
+ @example_group_red = true
33
+ end
34
+
35
+ move_progress()
36
+
37
+ @output.puts " <dd class=\"spec #{failure_style}\">",
38
+ " <span class=\"failed_spec_name\">#{h(example.description)}</span>",
39
+ " <div class=\"failure\" id=\"failure_#{counter}\">"
40
+ if failure.exception
41
+ backtrace = format_backtrace( failure.exception.backtrace )
42
+ message = failure.exception.message
43
+
44
+ @output.puts " <div class=\"message\"><code>#{h message}</code></div>",
45
+ " <div class=\"backtrace\"><pre>#{backtrace}</pre></div>"
46
+ end
47
+
48
+ if extra = extra_failure_content( failure )
49
+ @output.puts( extra )
50
+ end
51
+
52
+ @output.puts " </div>",
53
+ " </dd>"
54
+ @output.flush
55
+ end
56
+
57
+
58
+ alias_method :default_global_styles, :global_styles
59
+
60
+ def global_styles
61
+ css = default_global_styles()
62
+ css << %Q{
63
+ /* Stuff added by #{__FILE__} */
64
+
65
+ /* Overrides */
66
+ #rspec-header {
67
+ -webkit-box-shadow: #333 0 2px 5px;
68
+ margin-bottom: 1em;
69
+ }
70
+
71
+ .example_group dt {
72
+ -webkit-box-shadow: #333 0 2px 3px;
73
+ }
74
+
75
+ /* Style for log output */
76
+ dd.log-message {
77
+ background: #eee;
78
+ padding: 0 2em;
79
+ margin: 0.2em 1em;
80
+ border-bottom: 1px dotted #999;
81
+ border-top: 1px dotted #999;
82
+ text-indent: -1em;
83
+ }
84
+
85
+ /* Parts of the message */
86
+ dd.log-message .log-time {
87
+ font-weight: bold;
88
+ }
89
+ dd.log-message .log-time:after {
90
+ content: ": ";
91
+ }
92
+ dd.log-message .log-level {
93
+ font-variant: small-caps;
94
+ border: 1px solid #ccc;
95
+ padding: 1px 2px;
96
+ }
97
+ dd.log-message .log-name {
98
+ font-size: 1.2em;
99
+ color: #1e51b2;
100
+ }
101
+ dd.log-message .log-name:before { content: "«"; }
102
+ dd.log-message .log-name:after { content: "»"; }
103
+
104
+ dd.log-message .log-message-text {
105
+ padding-left: 4px;
106
+ font-family: Monaco, "Andale Mono", "Vera Sans Mono", mono;
107
+ }
108
+
109
+
110
+ /* Distinguish levels */
111
+ dd.log-message.debug { color: #666; }
112
+ dd.log-message.info {}
113
+
114
+ dd.log-message.warn,
115
+ dd.log-message.error {
116
+ background: #ff9;
117
+ }
118
+ dd.log-message.error .log-level,
119
+ dd.log-message.error .log-message-text {
120
+ color: #900;
121
+ }
122
+ dd.log-message.fatal {
123
+ background: #900;
124
+ color: white;
125
+ font-weight: bold;
126
+ border: 0;
127
+ }
128
+ dd.log-message.fatal .log-name {
129
+ color: white;
130
+ }
131
+ }
132
+
133
+ return css
134
+ end
135
+ end
136
+
137
+
@@ -0,0 +1,235 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bluecloth'
4
+ require 'diff/lcs'
5
+ require 'diff/lcs/callbacks'
6
+ require 'spec/lib/constants'
7
+ require 'rbconfig'
8
+
9
+
10
+ ### Fixturing functions
11
+ module BlueCloth::Matchers
12
+
13
+ ### Matcher for comparing output of a BlueCloth-generated HTML fragment against a known-good
14
+ ### string.
15
+ class TransformMatcher
16
+
17
+ ### Create a new matcher for the given +html+
18
+ def initialize( html )
19
+ @html = html
20
+ end
21
+
22
+ ### Strip tab indentation from the expected HTML output.
23
+ def without_indentation
24
+ if indent = @html[/\A\t+/]
25
+ indent.gsub!( /\A\n/m, '' )
26
+ @html.gsub!( /^#{indent}/m, '' )
27
+ end
28
+
29
+ return self
30
+ end
31
+
32
+
33
+ ### Returns true if the HTML generated by the given +bluecloth+ object matches the
34
+ ### expected HTML, comparing only the salient document structures.
35
+ def matches?( bluecloth )
36
+ @bluecloth = bluecloth
37
+ @output_html = bluecloth.to_html.gsub( /\n\n\n/, "\n\n" )
38
+ return @output_html.strip == @html.strip
39
+ end
40
+
41
+ ### Build a failure message for the matching case.
42
+ def failure_message
43
+ if self.should_output_html?
44
+ patch = self.make_html_patch( @html, @output_html )
45
+ return %{
46
+ <p>Expected the generated html:<br />
47
+ <pre><code>#@output_html</code></pre>
48
+ to be the same as:<br />
49
+ <pre><code>#@html</code></pre>
50
+ </p>
51
+ <p>Diffs:</p>
52
+ #{patch}
53
+ }
54
+ else
55
+ patch = self.make_patch( @html, @output_html )
56
+ return ("Expected the generated html:\n\n %p\n\nto be the same as:\n\n" +
57
+ " %p\n\nDiffs:\n\n%s") % [ @output_html, @html, patch ]
58
+ end
59
+ end
60
+
61
+ ### Build a failure message for the non-matching case.
62
+ def negative_failure_message
63
+ return "Expected the generated html:\n\n %p\n\nnot to be the same as:\n\n %p\n\n" %
64
+ [ @output_html, @html ]
65
+ end
66
+
67
+
68
+ ### Returns true if it appears HTML output should be used instead of plain-text. This
69
+ ### will be true if running from TextMate or if the HTML_LOGGING environment variable
70
+ ### is set.
71
+ def should_output_html?
72
+ return false
73
+ # return ENV['HTML_LOGGING'] ||
74
+ # (ENV['TM_FILENAME'] && ENV['TM_FILENAME'] =~ /_spec\.rb/)
75
+ end
76
+
77
+
78
+ ### Compute a patch between the given +expected+ output and the +actual+ output
79
+ ### and return it as a string.
80
+ def make_patch( expected, actual )
81
+ diffs = Diff::LCS.sdiff( expected.split("\n"), actual.split("\n"),
82
+ Diff::LCS::ContextDiffCallbacks )
83
+
84
+ maxcol = diffs.flatten.
85
+ collect {|d| [d.old_element.to_s.length, d.new_element.to_s.length ] }.
86
+ flatten.max || 0
87
+ maxcol += 4
88
+
89
+ patch = " %#{maxcol}s | %s\n" % [ "Expected", "Actual" ]
90
+ patch << diffs.collect do |changeset|
91
+ changeset.collect do |change|
92
+ "%s [%03d, %03d]: %#{maxcol}s | %-#{maxcol}s" % [
93
+ change.action,
94
+ change.old_position,
95
+ change.new_position,
96
+ change.old_element.inspect,
97
+ change.new_element.inspect,
98
+ ]
99
+ end.join("\n")
100
+ end.join("\n---\n")
101
+ end
102
+
103
+ ### Compute a patch similar to #make_patch, but output HTML instead of plain text.
104
+ def make_html_patch( expected, actual )
105
+ diffs = Diff::LCS.sdiff( expected.split("\n"), actual.split("\n"),
106
+ Diff::LCS::ContextDiffCallbacks )
107
+
108
+ patch = %{
109
+ <table>
110
+ <caption>Diffs</caption>
111
+ <thead>
112
+ <tr><th>Op</th><th>Pos</th><th>Expected</th><th>Actual</th></tr>
113
+ </thead>
114
+ <tbody>
115
+ }
116
+ patch << diffs.collect do |changeset|
117
+ changeset.collect do |change|
118
+ "<tr><td>%s</td><td>[%03d, %03d]</td><td>%s</td><td>%s</td></tr>" % [
119
+ change.action,
120
+ change.old_position,
121
+ change.new_position,
122
+ change.old_element.inspect,
123
+ change.new_element.inspect,
124
+ ]
125
+ end.join("\n")
126
+ end.join( "</tbody><tbody>" )
127
+ patch << %{</tbody></table>\n}
128
+ end
129
+
130
+ end
131
+
132
+ ### Variant of the regular TransformMatcher that normalizes the two strings using the 'tidy'
133
+ ### library before comparing.
134
+ class TidyTransformMatcher < TransformMatcher
135
+
136
+ TIDY_OPTIONS = {}
137
+ @tidy = nil
138
+
139
+ ### Fetch the class-global Tidy object, creating it if necessary
140
+ def self::tidy_object
141
+ unless @tidy
142
+ require 'tidy'
143
+ soext = Config::CONFIG['LIBRUBY_ALIASES'].sub( /.*\./, '' )
144
+ Tidy.path = "libtidy.#{soext}"
145
+ @tidy = Tidy.new( TIDY_OPTIONS )
146
+ end
147
+
148
+ return @tidy
149
+ end
150
+
151
+
152
+ ### Set the matcher's expected output to a tidied version of the input +html+.
153
+ def initialize( html )
154
+ @html = self.class.tidy_object.clean( html )
155
+ end
156
+
157
+
158
+ ### Returns true if the HTML generated by the given +bluecloth+ object matches the
159
+ ### expected HTML after normalizing them both with 'tidy'.
160
+ def matches?( bluecloth )
161
+ @bluecloth = bluecloth
162
+ @output_html = self.class.tidy_object.clean( bluecloth.to_html )
163
+ return @output_html == @html
164
+ end
165
+
166
+ end
167
+
168
+
169
+ class TransformRegexpMatcher
170
+
171
+ ### Create a new matcher for the given +regexp+
172
+ def initialize( regexp )
173
+ @regexp = regexp
174
+ end
175
+
176
+ ### Returns true if the regexp associated with this matcher matches the output generated
177
+ ### by the specified +bluecloth+ object.
178
+ def matches?( bluecloth )
179
+ @bluecloth = bluecloth
180
+ @output_html = bluecloth.to_html
181
+ return @output_html =~ @regexp
182
+ end
183
+
184
+ ### Build a failure message for the matching case.
185
+ def failure_message
186
+ return "Expected the generated html:\n\n %pto match the regexp:\n\n%p\n\n" %
187
+ [ @output_html, @regexp ]
188
+ end
189
+
190
+
191
+ ### Build a failure message for the negative matching case.
192
+ def negative_failure_message
193
+ return "Expected the generated html:\n\n %pnot to match the regexp:\n\n%p\n\n" %
194
+ [ @output_html, @regexp ]
195
+ end
196
+ end
197
+
198
+
199
+ ### Create a new BlueCloth object out of the given +string+ and +options+ and
200
+ ### return it.
201
+ def the_markdown( string, *options )
202
+ return BlueCloth.new( string, *options )
203
+ end
204
+
205
+
206
+ ### Strip indentation from the given +string+, create a new BlueCloth object
207
+ ### out of the result and any +options+, and return it.
208
+ def the_indented_markdown( string, *options )
209
+ if indent = string[/\A\t+/]
210
+ indent.gsub!( /\A\n/m, '' )
211
+ $stderr.puts "Source indent is: %p" % [ indent ] if $DEBUG
212
+ string.gsub!( /^#{indent}/m, '' )
213
+ end
214
+
215
+ return BlueCloth.new( string, *options )
216
+ end
217
+
218
+
219
+ ### Generate a matcher that expects to equal the given +html+.
220
+ def be_transformed_into( html )
221
+ return BlueCloth::Matchers::TransformMatcher.new( html )
222
+ end
223
+
224
+ ### Generate a matcher that expects to match a normalized version of the specified +html+.
225
+ def be_transformed_into_normalized_html( html )
226
+ return BlueCloth::Matchers::TidyTransformMatcher.new( html )
227
+ end
228
+
229
+ ### Generate a matcher that expects to match the given +regexp+.
230
+ def be_transformed_into_html_matching( regexp )
231
+ return BlueCloth::Matchers::TransformMatcher.new( regexp )
232
+ end
233
+
234
+ end # module BlueCloth::Matchers
235
+
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ BEGIN {
4
+ require 'pathname'
5
+ basedir = Pathname.new( __FILE__ ).dirname.parent
6
+
7
+ libdir = basedir + 'lib'
8
+ extdir = basedir + 'ext'
9
+
10
+ $LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
11
+ $LOAD_PATH.unshift( extdir ) unless $LOAD_PATH.include?( extdir )
12
+ }
13
+
14
+ require 'spec'
15
+ require 'bluecloth'
16
+
17
+ require 'spec/lib/helpers'
18
+ require 'spec/lib/constants'
19
+ require 'spec/lib/matchers'
20
+
21
+ require 'rbconfig'
22
+ require 'dl'
23
+
24
+
25
+ #####################################################################
26
+ ### C O N T E X T S
27
+ #####################################################################
28
+
29
+ describe BlueCloth, "-- MarkdownTest 1.0.3: " do
30
+ include BlueCloth::TestConstants,
31
+ BlueCloth::Matchers
32
+
33
+ before( :all ) do
34
+ soext = Config::CONFIG['LIBRUBY_ALIASES'].sub( /.*\./, '' )
35
+ @dlname = "libtidy.#{soext}"
36
+
37
+ begin
38
+ DL.dlopen( @dlname )
39
+ rescue RuntimeError => err
40
+ @have_libtidy = false
41
+ @tidy_error = err.message
42
+ rescue DL::DLError => err
43
+ @have_libtidy = false
44
+ @tidy_error = err.message
45
+ else
46
+ @have_libtidy = true
47
+ @tidy_error = nil
48
+ end
49
+
50
+ begin
51
+ require 'tidy'
52
+ rescue LoadError, NameError => err
53
+ @have_libtidy = false
54
+ @tidy_error = err.message
55
+ end
56
+
57
+ end
58
+
59
+ before( :each ) do
60
+ pending( "These tests require the tidy library: #@tidy_error" ) unless @have_libtidy
61
+ end
62
+
63
+
64
+ markdowntest_dir = Pathname.new( __FILE__ ).dirname + 'data/markdowntest'
65
+ pattern = markdowntest_dir + '*.text'
66
+ Pathname.glob( pattern.to_s ).each do |textfile|
67
+ resultfile = Pathname.new( textfile.to_s.sub(/\.text/, '.html') )
68
+
69
+ it textfile.basename( '.text' ) do
70
+ markdown = textfile.read
71
+ expected = resultfile.read
72
+ options = { :smartypants => false }
73
+
74
+ the_markdown( markdown, options ).should be_transformed_into_normalized_html( expected )
75
+ end
76
+ end
77
+
78
+ end
79
+