wikitext 1.12 → 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.
@@ -1,4 +1,4 @@
1
- // Copyright 2007-2009 Wincent Colaiuta. All rights reserved.
1
+ // Copyright 2007-2010 Wincent Colaiuta. All rights reserved.
2
2
  //
3
3
  // Redistribution and use in source and binary forms, with or without
4
4
  // modification, are permitted provided that the following conditions are met:
@@ -33,6 +33,9 @@
33
33
  #define IN_EITHER_OF(type1, type2) ary_includes2(parser->scope, type1, type2)
34
34
  #define IN_ANY_OF(type1, type2, type3) ary_includes3(parser->scope, type1, type2, type3)
35
35
 
36
+ // output styles
37
+ enum { HTML_OUTPUT, XML_OUTPUT };
38
+
36
39
  // poor man's object orientation in C:
37
40
  // instead of passing around multiple parameters between functions in the parser
38
41
  // we pack everything into a struct and pass around only a pointer to that
@@ -50,6 +53,7 @@ typedef struct
50
53
  VALUE external_link_class; // CSS class applied to external links
51
54
  VALUE mailto_class; // CSS class applied to email (mailto) links
52
55
  VALUE img_prefix; // path prepended when emitting img tags
56
+ int output_style; // HTML_OUTPUT (default) or XML_OUTPUT
53
57
  int base_indent; // controlled by the :indent option to Wikitext::Parser#parse
54
58
  int current_indent; // fluctuates according to currently nested structures
55
59
  int base_heading_level;
@@ -83,8 +87,8 @@ const char strong_start[] = "<strong>";
83
87
  const char strong_end[] = "</strong>";
84
88
  const char em_start[] = "<em>";
85
89
  const char em_end[] = "</em>";
86
- const char tt_start[] = "<tt>";
87
- const char tt_end[] = "</tt>";
90
+ const char code_start[] = "<code>";
91
+ const char code_end[] = "</code>";
88
92
  const char ol_start[] = "<ol>";
89
93
  const char ol_end[] = "</ol>";
90
94
  const char ul_start[] = "<ul>";
@@ -125,7 +129,8 @@ const char escaped_blockquote[] = "&gt; ";
125
129
  const char ext_link_end[] = "]";
126
130
  const char literal_img_start[] = "{{";
127
131
  const char img_start[] = "<img src=\"";
128
- const char img_end[] = "\" />";
132
+ const char img_end_xml[] = "\" />";
133
+ const char img_end_html[] = "\">";
129
134
  const char img_alt[] = "\" alt=\"";
130
135
  const char pre_class_start[] = "<pre class=\"";
131
136
  const char pre_class_end[] = "-syntax\">";
@@ -150,6 +155,7 @@ parser_t *parser_new(void)
150
155
  parser->external_link_class = Qnil; // caller should set up
151
156
  parser->mailto_class = Qnil; // caller should set up
152
157
  parser->img_prefix = Qnil; // caller should set up
158
+ parser->output_style = HTML_OUTPUT;
153
159
  parser->base_indent = 0;
154
160
  parser->current_indent = 0;
155
161
  parser->base_heading_level = 0;
@@ -310,13 +316,16 @@ void wiki_append_hyperlink(parser_t *parser, VALUE link_prefix, str_t *link_targ
310
316
 
311
317
  void wiki_append_img(parser_t *parser, char *token_ptr, int token_len)
312
318
  {
313
- str_append(parser->output, img_start, sizeof(img_start) - 1); // <img src="
314
- if (!NIL_P(parser->img_prefix) && *token_ptr != '/') // len always > 0
319
+ str_append(parser->output, img_start, sizeof(img_start) - 1); // <img src="
320
+ if (!NIL_P(parser->img_prefix) && *token_ptr != '/') // len always > 0
315
321
  str_append_string(parser->output, parser->img_prefix);
316
322
  str_append(parser->output, token_ptr, token_len);
317
- str_append(parser->output, img_alt, sizeof(img_alt) - 1); // " alt="
323
+ str_append(parser->output, img_alt, sizeof(img_alt) - 1); // " alt="
318
324
  str_append(parser->output, token_ptr, token_len);
319
- str_append(parser->output, img_end, sizeof(img_end) - 1); // " />
325
+ if (parser->output_style == XML_OUTPUT)
326
+ str_append(parser->output, img_end_xml, sizeof(img_end_xml) - 1); // " />
327
+ else
328
+ str_append(parser->output, img_end_html, sizeof(img_end_html) - 1); // ">
320
329
  }
321
330
 
322
331
  // will emit indentation only if we are about to emit any of:
@@ -422,7 +431,7 @@ void wiki_pop_from_stack(parser_t *parser, str_t *target)
422
431
 
423
432
  case TT:
424
433
  case TT_START:
425
- str_append(target, tt_end, sizeof(tt_end) - 1);
434
+ str_append(target, code_end, sizeof(code_end) - 1);
426
435
  break;
427
436
 
428
437
  case OL:
@@ -992,6 +1001,7 @@ VALUE Wikitext_parser_initialize(int argc, VALUE *argv, VALUE self)
992
1001
  VALUE mailto_class = rb_str_new2("mailto");
993
1002
  VALUE internal_link_prefix = rb_str_new2("/wiki/");
994
1003
  VALUE img_prefix = rb_str_new2("/images/");
1004
+ VALUE output_style = ID2SYM(rb_intern("html"));
995
1005
  VALUE space_to_underscore = Qtrue;
996
1006
  VALUE minimum_fulltext_token_length = INT2NUM(3);
997
1007
  VALUE base_heading_level = INT2NUM(0);
@@ -1007,6 +1017,7 @@ VALUE Wikitext_parser_initialize(int argc, VALUE *argv, VALUE self)
1007
1017
  mailto_class = OVERRIDE_IF_SET(mailto_class);
1008
1018
  internal_link_prefix = OVERRIDE_IF_SET(internal_link_prefix);
1009
1019
  img_prefix = OVERRIDE_IF_SET(img_prefix);
1020
+ output_style = OVERRIDE_IF_SET(output_style);
1010
1021
  space_to_underscore = OVERRIDE_IF_SET(space_to_underscore);
1011
1022
  minimum_fulltext_token_length = OVERRIDE_IF_SET(minimum_fulltext_token_length);
1012
1023
  base_heading_level = OVERRIDE_IF_SET(base_heading_level);
@@ -1019,6 +1030,7 @@ VALUE Wikitext_parser_initialize(int argc, VALUE *argv, VALUE self)
1019
1030
  rb_iv_set(self, "@mailto_class", mailto_class);
1020
1031
  rb_iv_set(self, "@internal_link_prefix", internal_link_prefix);
1021
1032
  rb_iv_set(self, "@img_prefix", img_prefix);
1033
+ rb_iv_set(self, "@output_style", output_style);
1022
1034
  rb_iv_set(self, "@space_to_underscore", space_to_underscore);
1023
1035
  rb_iv_set(self, "@minimum_fulltext_token_length", minimum_fulltext_token_length);
1024
1036
  rb_iv_set(self, "@base_heading_level", base_heading_level);
@@ -1032,6 +1044,17 @@ VALUE Wikitext_parser_profiling_parse(VALUE self, VALUE string)
1032
1044
  return Qnil;
1033
1045
  }
1034
1046
 
1047
+ // convert a Ruby object (:xml, :html etc) into an int output style
1048
+ int Wikitext_output_style(VALUE output)
1049
+ {
1050
+ if (TYPE(output) == T_SYMBOL)
1051
+ {
1052
+ if (SYM2ID(output) == rb_intern("xml"))
1053
+ return XML_OUTPUT;
1054
+ }
1055
+ return HTML_OUTPUT; // fall back to default
1056
+ }
1057
+
1035
1058
  VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
1036
1059
  {
1037
1060
  // process arguments
@@ -1042,6 +1065,16 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
1042
1065
  return Qnil;
1043
1066
  string = StringValue(string);
1044
1067
 
1068
+ // access these once per parse
1069
+ VALUE line_ending = rb_iv_get(self, "@line_ending");
1070
+ line_ending = StringValue(line_ending);
1071
+ VALUE link_class = rb_iv_get(self, "@external_link_class");
1072
+ link_class = NIL_P(link_class) ? Qnil : StringValue(link_class);
1073
+ VALUE mailto_class = rb_iv_get(self, "@mailto_class");
1074
+ mailto_class = NIL_P(mailto_class) ? Qnil : StringValue(mailto_class);
1075
+ VALUE prefix = rb_iv_get(self, "@internal_link_prefix");
1076
+ int output_style = Wikitext_output_style(rb_iv_get(self, "@output_style"));
1077
+
1045
1078
  // process options hash
1046
1079
  int base_indent = 0;
1047
1080
  int base_heading_level = NUM2INT(rb_iv_get(self, "@base_heading_level"));
@@ -1069,6 +1102,11 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
1069
1102
  if (rb_funcall(options, has_key, 1, id) == Qtrue)
1070
1103
  base_heading_level = NUM2INT(rb_hash_aref(options, id));
1071
1104
 
1105
+ // :output_style => :html/:xml
1106
+ id = ID2SYM(rb_intern("output_style"));
1107
+ if (rb_funcall(options, has_key, 1, id) == Qtrue)
1108
+ output_style = Wikitext_output_style(rb_hash_aref(options, id));
1109
+
1072
1110
  // :link_proc => lambda { |link_target| ... }
1073
1111
  id = ID2SYM(rb_intern("link_proc"));
1074
1112
  if (rb_funcall(options, has_key, 1, id) == Qtrue)
@@ -1086,15 +1124,6 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
1086
1124
  long len = RSTRING_LEN(string);
1087
1125
  char *pe = p + len;
1088
1126
 
1089
- // access these once per parse
1090
- VALUE line_ending = rb_iv_get(self, "@line_ending");
1091
- line_ending = StringValue(line_ending);
1092
- VALUE link_class = rb_iv_get(self, "@external_link_class");
1093
- link_class = NIL_P(link_class) ? Qnil : StringValue(link_class);
1094
- VALUE mailto_class = rb_iv_get(self, "@mailto_class");
1095
- mailto_class = NIL_P(mailto_class) ? Qnil : StringValue(mailto_class);
1096
- VALUE prefix = rb_iv_get(self, "@internal_link_prefix");
1097
-
1098
1127
  // set up parser struct to make passing parameters a little easier
1099
1128
  parser_t *parser = parser_new();
1100
1129
  GC_WRAP_PARSER(parser, parser_gc);
@@ -1106,6 +1135,7 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
1106
1135
  parser->line_ending = str_new_from_string(line_ending);
1107
1136
  parser->base_indent = base_indent;
1108
1137
  parser->base_heading_level = base_heading_level;
1138
+ parser->output_style = output_style;
1109
1139
 
1110
1140
  // this simple looping design leads to a single enormous function,
1111
1141
  // but it's faster than doing actual recursive descent and also secure in the face of
@@ -1608,7 +1638,7 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
1608
1638
  wiki_pop_from_stack_up_to(parser, output, EM_START, true);
1609
1639
  else
1610
1640
  {
1611
- // no EM_START in scope, so must interpret the TT_END without any special meaning
1641
+ // no EM_START in scope, so must interpret the EM_END without any special meaning
1612
1642
  wiki_pop_excess_elements(parser);
1613
1643
  wiki_start_para_if_necessary(parser);
1614
1644
  str_append(output, escaped_em_end, sizeof(escaped_em_end) - 1);
@@ -1636,7 +1666,7 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
1636
1666
  // this is a new opening
1637
1667
  wiki_pop_excess_elements(parser);
1638
1668
  wiki_start_para_if_necessary(parser);
1639
- str_append(output, tt_start, sizeof(tt_start) - 1);
1669
+ str_append(output, code_start, sizeof(code_start) - 1);
1640
1670
  ary_push(parser->scope, TT);
1641
1671
  ary_push(parser->line, TT);
1642
1672
  }
@@ -1658,7 +1688,7 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
1658
1688
  {
1659
1689
  wiki_pop_excess_elements(parser);
1660
1690
  wiki_start_para_if_necessary(parser);
1661
- str_append(output, tt_start, sizeof(tt_start) - 1);
1691
+ str_append(output, code_start, sizeof(code_start) - 1);
1662
1692
  ary_push(parser->scope, TT_START);
1663
1693
  ary_push(parser->line, TT_START);
1664
1694
  }
@@ -29,6 +29,36 @@ VALUE cWikitextParser = 0; // class Wikitext::Parser
29
29
  VALUE eWikitextParserError = 0; // class Wikitext::Parser::Error
30
30
  VALUE cWikitextParserToken = 0; // class Wikitext::Parser::Token
31
31
 
32
+ // In order to replicate this Ruby code:
33
+ //
34
+ // ActiveSupport.on_load(:action_view) do
35
+ // require 'wikitext/rails_template_handler'
36
+ // end
37
+ //
38
+ // here in C we have to jump through some hoops using the following two
39
+ // functions.
40
+ //
41
+ // First we have wikitext_on_load_block(), which is a function which defines
42
+ // the "block" of code that we want to have evaluated.
43
+ //
44
+ // To actually pass this block in to the ActiveSupport::on_load method we
45
+ // need the help of an intermediate helper function,
46
+ // wikitext_block_forwarder(), which we invoke with the aid of rb_iterate()
47
+ // later on.
48
+ //
49
+ // This works because the rb_funcall() function in wikitext_block_forwarder()
50
+ // propagates the block through to the called method.
51
+ VALUE wikitext_on_load_block(VALUE yielded, VALUE other)
52
+ {
53
+ return rb_require("wikitext/rails_template_handler");
54
+ }
55
+
56
+ VALUE wikitext_block_forwarder(VALUE receiver)
57
+ {
58
+ return rb_funcall(receiver, rb_intern("on_load"), 1,
59
+ ID2SYM(rb_intern("action_view")));
60
+ }
61
+
32
62
  void Init_wikitext()
33
63
  {
34
64
  // Wikitext
@@ -53,6 +83,7 @@ void Init_wikitext()
53
83
  rb_define_attr(cWikitextParser, "space_to_underscore", Qtrue, Qtrue);
54
84
  rb_define_attr(cWikitextParser, "minimum_fulltext_token_length", Qtrue, Qtrue);
55
85
  rb_define_attr(cWikitextParser, "base_heading_level", Qtrue, Qtrue);
86
+ rb_define_attr(cWikitextParser, "output_style", Qtrue, Qtrue);
56
87
 
57
88
  // Wikitext::Parser::Error
58
89
  eWikitextParserError = rb_define_class_under(cWikitextParser, "Error", rb_eException);
@@ -69,4 +100,24 @@ void Init_wikitext()
69
100
  rb_define_attr(cWikitextParserToken, "code_point", Qtrue, Qfalse);
70
101
  rb_define_attr(cWikitextParserToken, "token_type", Qtrue, Qfalse);
71
102
  rb_define_attr(cWikitextParserToken, "string_value", Qtrue, Qfalse);
103
+
104
+ // check to see if ::ActiveSupport is defined
105
+ if (rb_funcall(rb_cObject, rb_intern("const_defined?"), 1,
106
+ ID2SYM(rb_intern("ActiveSupport"))) == Qtrue)
107
+ {
108
+ // we are running under Rails
109
+ rb_require("wikitext/nil_class");
110
+ rb_require("wikitext/string");
111
+
112
+ // now check for Rails version
113
+ VALUE active_support = rb_const_get(rb_cObject,
114
+ rb_intern("ActiveSupport"));
115
+ if (rb_respond_to(active_support, rb_intern("on_load")))
116
+ // running under Rails 3
117
+ rb_iterate(wikitext_block_forwarder, active_support,
118
+ wikitext_on_load_block, Qnil);
119
+ else
120
+ // running under Rails 2
121
+ rb_require("wikitext/rails_template_handler");
122
+ }
72
123
  }
@@ -0,0 +1,50 @@
1
+ # Copyright 2008-2010 Wincent Colaiuta. All rights reserved.
2
+ #
3
+ # Redistribution and use in source and binary forms, with or without
4
+ # modification, are permitted provided that the following conditions are met:
5
+ #
6
+ # 1. Redistributions of source code must retain the above copyright notice,
7
+ # this list of conditions and the following disclaimer.
8
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
9
+ # this list of conditions and the following disclaimer in the documentation
10
+ # and/or other materials provided with the distribution.
11
+
12
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
13
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
16
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
17
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
18
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
19
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
20
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
21
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
22
+ # POSSIBILITY OF SUCH DAMAGE.
23
+
24
+ class String
25
+ # This is an example preprocessing method that will be called by the
26
+ # String#to_wikitext method prior to feeding the markup into the parser.
27
+ # In this case we take input like this:
28
+ #
29
+ # For more info see issue #125, which was filed last week.
30
+ #
31
+ # And transform it into:
32
+ #
33
+ # For more info see [/issues/125 issue #125], which was filed last week.
34
+ #
35
+ # Which in turn is translated into the following HTML by the parser:
36
+ #
37
+ # <p>For more info see <a href="/issues/125">issue #125</a>, which was
38
+ # filed last week.</p>
39
+ #
40
+ # Obviously this file is an example designed to work with a specific
41
+ # application and is optional, so will only come into play if explicitly
42
+ # required. To provide different behavior, simply define a new definition of
43
+ # String#wikitext_preprocess.
44
+ #
45
+ # For now this is done in pure Ruby; if speed became a concern we could
46
+ # provide a fast Ragel C extension to do it instead.
47
+ def wikitext_preprocess
48
+ gsub /\b(bug|issue|request|ticket) #(\d+)/i, '[/issues/\2 \1 #\2]'
49
+ end
50
+ end
@@ -24,12 +24,35 @@
24
24
  require 'wikitext/nil_class'
25
25
  require 'wikitext/string'
26
26
 
27
- module Wikitext
28
- class TemplateHandler
29
- def self.call template
30
- 'template.source.w'
31
- end
32
- end
33
- end
34
-
35
- ActionView::Template.register_template_handler :wikitext, Wikitext::TemplateHandler
27
+ module ActionView
28
+ class Template
29
+ module Handlers
30
+
31
+ begin
32
+
33
+ # assume Rails 3
34
+ class Wikitext < Handler
35
+ include Compilable
36
+
37
+ def compile template
38
+ "'" + template.source.w.gsub("'", "\\\\'") + "'"
39
+ end
40
+ end # class Wikitext
41
+
42
+ rescue NameError
43
+
44
+ # fall back to Rails 2
45
+ class Wikitext
46
+ def self.call template
47
+ 'template.source.w'
48
+ end
49
+ end # class Wikitext
50
+
51
+ end
52
+
53
+ end # module Handlers
54
+ end # class Template
55
+ end # module ActionView
56
+
57
+ ActionView::Template.register_template_handler :wikitext,
58
+ ActionView::Template::Handlers::Wikitext
@@ -26,18 +26,10 @@ require 'wikitext/parser'
26
26
  class String
27
27
  def to_wikitext options = {}
28
28
  default_options = { :indent => false }
29
- html = Wikitext::Parser.shared_parser.parse wikitext_preprocess,
29
+ markup = respond_to?(:wikitext_preprocess) ? wikitext_preprocess : self
30
+ html = Wikitext::Parser.shared_parser.parse markup,
30
31
  default_options.merge(options)
31
32
  html.respond_to?(:html_safe) ? html.html_safe : html
32
33
  end
33
34
  alias :w :to_wikitext
34
-
35
- private
36
-
37
- # for now do this in pure Ruby
38
- # if speed later becomes a concern can whip up a Ragel C extension to do it
39
- # TODO: make this customizable (accept a lambda that performs preprocessing)
40
- def wikitext_preprocess
41
- gsub /\b(bug|issue|request|ticket) #(\d+)/i, '[/issues/\2 \1 #\2]'
42
- end
43
35
  end
@@ -22,5 +22,5 @@
22
22
  # POSSIBILITY OF SUCH DAMAGE.
23
23
 
24
24
  module Wikitext
25
- VERSION = '1.12'
25
+ VERSION = '2.0'
26
26
  end # module Wikitext
@@ -21,11 +21,9 @@
21
21
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
22
22
  # POSSIBILITY OF SUCH DAMAGE.
23
23
 
24
- # Avoid Rails bug #2266 by not requiring during "rake gems:build"
25
- # See: https://rails.lighthouseapp.com/projects/8994/tickets/2266
24
+ # this file evaluated automatically under Rails 2
26
25
  unless $gems_build_rake_task
27
- libdir = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'wikitext'))
28
- require File.join(libdir, 'nil_class')
29
- require File.join(libdir, 'string')
30
- require File.join(libdir, 'rails')
26
+ # avoid Rails bug #2266 by not requiring during "rake gems:build"
27
+ # see: https://rails.lighthouseapp.com/projects/8994/tickets/2266
28
+ require 'wikitext'
31
29
  end
@@ -194,7 +194,7 @@ describe Wikitext::Parser, 'standard blockquotes (">" in first column)' do
194
194
  END
195
195
  expected = dedent <<-END
196
196
  <blockquote>
197
- <p>link to <a href="/wiki/something">something</a>, and <em>other</em> <tt>styled</tt> <strong>spans</strong>.</p>
197
+ <p>link to <a href="/wiki/something">something</a>, and <em>other</em> <code>styled</code> <strong>spans</strong>.</p>
198
198
  </blockquote>
199
199
  END
200
200
  @parser.parse(input).should == expected
@@ -243,7 +243,7 @@ describe Wikitext::Parser, 'standard blockquotes (">" in first column)' do
243
243
  <li>a</li>
244
244
  <li>list</li>
245
245
  </ul>
246
- <p>outer para with <em>styled</em> <tt>stuff</tt> in it</p>
246
+ <p>outer para with <em>styled</em> <code>stuff</code> in it</p>
247
247
  <blockquote>
248
248
  <p>inner blockquote</p>
249
249
  <ol>
@@ -268,7 +268,7 @@ describe Wikitext::Parser, 'standard blockquotes (">" in first column)' do
268
268
  END
269
269
  expected = dedent <<-END
270
270
  <blockquote>
271
- <p>some <tt>styled</tt></p>
271
+ <p>some <code>styled</code></p>
272
272
  </blockquote>
273
273
  END
274
274
  @parser.parse(input).should == expected
@@ -117,12 +117,12 @@ describe Wikitext::Parser, 'external links' do
117
117
  end
118
118
 
119
119
  it 'should format a link with <tt></tt> tags in the link text' do
120
- expected = %Q{<p><a href="http://google.com/" class="external">Google <tt>SOC</tt></a></p>\n}
120
+ expected = %Q{<p><a href="http://google.com/" class="external">Google <code>SOC</code></a></p>\n}
121
121
  @parser.parse("[http://google.com/ Google <tt>SOC</tt>]").should == expected
122
122
  end
123
123
 
124
124
  it 'should automatically close unmatched <tt> tags in the link text' do
125
- expected = %Q{<p><a href="http://google.com/" class="external">Google <tt>SOC</tt></a></p>\n}
125
+ expected = %Q{<p><a href="http://google.com/" class="external">Google <code>SOC</code></a></p>\n}
126
126
  @parser.parse("[http://google.com/ Google <tt>SOC]").should == expected
127
127
  end
128
128
 
@@ -194,7 +194,7 @@ describe Wikitext::Parser, 'external links' do
194
194
  @parser.parse("foo '']'' bar").should == "<p>foo <em>]</em> bar</p>\n" # in EM scope
195
195
  @parser.parse("foo ''']''' bar").should == "<p>foo <strong>]</strong> bar</p>\n" # in STRONG scope
196
196
  @parser.parse("foo ''''']''''' bar").should == "<p>foo <strong><em>]</em></strong> bar</p>\n" # in STRONG_EM scope
197
- @parser.parse('foo <tt>]</tt> bar').should == "<p>foo <tt>]</tt> bar</p>\n" # in TT scope
197
+ @parser.parse('foo <tt>]</tt> bar').should == "<p>foo <code>]</code> bar</p>\n" # in TT scope
198
198
  @parser.parse('= foo ] bar =').should == "<h1>foo ] bar</h1>\n" # in H1 scope
199
199
  @parser.parse('== foo ] bar ==').should == "<h2>foo ] bar</h2>\n" # in H2 scope
200
200
  @parser.parse('=== foo ] bar ===').should == "<h3>foo ] bar</h3>\n" # in H3 scope
@@ -30,15 +30,48 @@ describe Wikitext::Parser, 'embedding img tags' do
30
30
  end
31
31
 
32
32
  it 'should convert valid markup into inline image tags' do
33
- @parser.parse('{{foo.png}}').should == %Q{<p><img src="/images/foo.png" alt="foo.png" /></p>\n}
33
+ expected = %Q{<p><img src="/images/foo.png" alt="foo.png"></p>\n}
34
+ @parser.parse('{{foo.png}}').should == expected
35
+ end
36
+
37
+ it 'should produce XML output if passed option at parse time' do
38
+ expected = %Q{<p><img src="/images/foo.png" alt="foo.png" /></p>\n}
39
+ @parser.parse('{{foo.png}}', :output_style => :xml).should == expected
40
+ end
41
+
42
+ it 'should produce XML output if set via instance variable' do
43
+ expected = %Q{<p><img src="/images/foo.png" alt="foo.png" /></p>\n}
44
+ parser = Wikitext::Parser.new
45
+ parser.output_style = :xml
46
+ parser.parse('{{foo.png}}').should == expected
47
+ end
48
+
49
+ it 'should produce XML output if option set during initialization' do
50
+ expected = %Q{<p><img src="/images/foo.png" alt="foo.png" /></p>\n}
51
+ parser = Wikitext::Parser.new :output_style => :xml
52
+ parser.parse('{{foo.png}}').should == expected
53
+ end
54
+
55
+ it 'should produce HTML output if passed unrecognized output style' do
56
+ expected = %Q{<p><img src="/images/foo.png" alt="foo.png"></p>\n}
57
+
58
+ # the _only_ recognized override is :xml (case-sensitive)
59
+ @parser.parse('{{foo.png}}', :output_style => :html).should == expected
60
+ @parser.parse('{{foo.png}}', :output_style => false).should == expected
61
+ @parser.parse('{{foo.png}}', :output_style => nil).should == expected
62
+ @parser.parse('{{foo.png}}', :output_style => 42).should == expected
63
+ @parser.parse('{{foo.png}}', :output_style => 'XML').should == expected
64
+ @parser.parse('{{foo.png}}', :output_style => :XML).should == expected
34
65
  end
35
66
 
36
67
  it 'should appear embedded in an inline flow' do
37
- @parser.parse('before {{foo.png}} after').should == %Q{<p>before <img src="/images/foo.png" alt="foo.png" /> after</p>\n}
68
+ expected = %Q{<p>before <img src="/images/foo.png" alt="foo.png"> after</p>\n}
69
+ @parser.parse('before {{foo.png}} after').should == expected
38
70
  end
39
71
 
40
72
  it 'should allow images in subdirectories' do
41
- @parser.parse('{{foo/bar.png}}').should == %Q{<p><img src="/images/foo/bar.png" alt="foo/bar.png" /></p>\n}
73
+ expected = %Q{<p><img src="/images/foo/bar.png" alt="foo/bar.png"></p>\n}
74
+ @parser.parse('{{foo/bar.png}}').should == expected
42
75
  end
43
76
 
44
77
  it 'should pass through empty image tags unchanged' do
@@ -46,14 +79,14 @@ describe Wikitext::Parser, 'embedding img tags' do
46
79
  end
47
80
 
48
81
  it 'should not append prefix if img src starts with a slash' do
49
- @parser.parse('{{/foo.png}}').should ==
50
- %Q{<p><img src="/foo.png" alt="/foo.png" /></p>\n}
82
+ expected = %Q{<p><img src="/foo.png" alt="/foo.png"></p>\n}
83
+ @parser.parse('{{/foo.png}}').should == expected
51
84
  end
52
85
 
53
86
  it 'should work in BLOCKQUOTE blocks' do
54
87
  expected = dedent <<-END
55
88
  <blockquote>
56
- <p><img src="/images/foo.png" alt="foo.png" /></p>
89
+ <p><img src="/images/foo.png" alt="foo.png"></p>
57
90
  </blockquote>
58
91
  END
59
92
  @parser.parse('> {{foo.png}}').should == expected
@@ -67,9 +100,9 @@ describe Wikitext::Parser, 'embedding img tags' do
67
100
  END
68
101
  expected = dedent <<-END
69
102
  <ul>
70
- <li><img src="/images/foo.png" alt="foo.png" /></li>
71
- <li><img src="/images/bar.png" alt="bar.png" /></li>
72
- <li><img src="/images/baz.png" alt="baz.png" /></li>
103
+ <li><img src="/images/foo.png" alt="foo.png"></li>
104
+ <li><img src="/images/bar.png" alt="bar.png"></li>
105
+ <li><img src="/images/baz.png" alt="baz.png"></li>
73
106
  </ul>
74
107
  END
75
108
  @parser.parse(input).should == expected
@@ -83,36 +116,42 @@ describe Wikitext::Parser, 'embedding img tags' do
83
116
  END
84
117
  expected = dedent <<-END
85
118
  <ol>
86
- <li><img src="/images/foo.png" alt="foo.png" /></li>
87
- <li><img src="/images/bar.png" alt="bar.png" /></li>
88
- <li><img src="/images/baz.png" alt="baz.png" /></li>
119
+ <li><img src="/images/foo.png" alt="foo.png"></li>
120
+ <li><img src="/images/bar.png" alt="bar.png"></li>
121
+ <li><img src="/images/baz.png" alt="baz.png"></li>
89
122
  </ol>
90
123
  END
91
124
  @parser.parse(input).should == expected
92
125
  end
93
126
 
94
127
  it 'should work in <h1> headings' do
95
- @parser.parse('= {{foo.png}} =').should == %Q{<h1><img src="/images/foo.png" alt="foo.png" /></h1>\n}
128
+ expected = %Q{<h1><img src="/images/foo.png" alt="foo.png"></h1>\n}
129
+ @parser.parse('= {{foo.png}} =').should == expected
96
130
  end
97
131
 
98
132
  it 'should work in <h2> headings' do
99
- @parser.parse('== {{foo.png}} ==').should == %Q{<h2><img src="/images/foo.png" alt="foo.png" /></h2>\n}
133
+ expected = %Q{<h2><img src="/images/foo.png" alt="foo.png"></h2>\n}
134
+ @parser.parse('== {{foo.png}} ==').should == expected
100
135
  end
101
136
 
102
137
  it 'should work in <h3> headings' do
103
- @parser.parse('=== {{foo.png}} ===').should == %Q{<h3><img src="/images/foo.png" alt="foo.png" /></h3>\n}
138
+ expected = %Q{<h3><img src="/images/foo.png" alt="foo.png"></h3>\n}
139
+ @parser.parse('=== {{foo.png}} ===').should == expected
104
140
  end
105
141
 
106
142
  it 'should work in <h4> headings' do
107
- @parser.parse('==== {{foo.png}} ====').should == %Q{<h4><img src="/images/foo.png" alt="foo.png" /></h4>\n}
143
+ expected = %Q{<h4><img src="/images/foo.png" alt="foo.png"></h4>\n}
144
+ @parser.parse('==== {{foo.png}} ====').should == expected
108
145
  end
109
146
 
110
147
  it 'should work in <h5> headings' do
111
- @parser.parse('===== {{foo.png}} =====').should == %Q{<h5><img src="/images/foo.png" alt="foo.png" /></h5>\n}
148
+ expected = %Q{<h5><img src="/images/foo.png" alt="foo.png"></h5>\n}
149
+ @parser.parse('===== {{foo.png}} =====').should == expected
112
150
  end
113
151
 
114
152
  it 'should work in <h6> headings' do
115
- @parser.parse('====== {{foo.png}} ======').should == %Q{<h6><img src="/images/foo.png" alt="foo.png" /></h6>\n}
153
+ expected = %Q{<h6><img src="/images/foo.png" alt="foo.png"></h6>\n}
154
+ @parser.parse('====== {{foo.png}} ======').should == expected
116
155
  end
117
156
 
118
157
  it 'should pass single curly braces through unaltered' do
@@ -124,23 +163,27 @@ describe Wikitext::Parser, 'embedding img tags' do
124
163
  end
125
164
 
126
165
  it 'should have no effect inside PRE_START blocks' do
127
- @parser.parse('<pre>{{foo.png}}</pre>').should == %Q{<pre>{{foo.png}}</pre>\n}
166
+ expected = %Q{<pre>{{foo.png}}</pre>\n}
167
+ @parser.parse('<pre>{{foo.png}}</pre>').should == expected
128
168
  end
129
169
 
130
170
  it 'should have no effect inside NO_WIKI spans' do
131
- @parser.parse('<nowiki>{{foo.png}}</nowiki>').should == %Q{<p>{{foo.png}}</p>\n}
171
+ expected = %Q{<p>{{foo.png}}</p>\n}
172
+ @parser.parse('<nowiki>{{foo.png}}</nowiki>').should == expected
132
173
  end
133
174
 
134
175
  it 'should be passed through in internal link targets' do
135
- @parser.parse('[[{{foo.png}}]]').should == %Q{<p><a href="/wiki/%7b%7bfoo.png%7d%7d">{{foo.png}}</a></p>\n}
176
+ expected = %Q{<p><a href="/wiki/%7b%7bfoo.png%7d%7d">{{foo.png}}</a></p>\n}
177
+ @parser.parse('[[{{foo.png}}]]').should == expected
136
178
  end
137
179
 
138
180
  it 'should be passed through in internal link text' do
139
- @parser.parse('[[article|{{foo.png}}]]').should == %Q{<p><a href="/wiki/article">{{foo.png}}</a></p>\n}
181
+ expected = %Q{<p><a href="/wiki/article">{{foo.png}}</a></p>\n}
182
+ @parser.parse('[[article|{{foo.png}}]]').should == expected
140
183
  end
141
184
 
142
185
  it 'should not be allowed as an external link target' do
143
- expected = %Q{<p>[<img src="/images/foo.png" alt="foo.png" /> the link]</p>\n}
186
+ expected = %Q{<p>[<img src="/images/foo.png" alt="foo.png"> the link]</p>\n}
144
187
  @parser.parse('[{{foo.png}} the link]').should == expected
145
188
  end
146
189
 
@@ -150,7 +193,8 @@ describe Wikitext::Parser, 'embedding img tags' do
150
193
  end
151
194
 
152
195
  it 'should not allow embedded quotes' do
153
- @parser.parse('{{"fun".png}}').should == %Q{<p>{{&quot;fun&quot;.png}}</p>\n}
196
+ expected = %Q{<p>{{&quot;fun&quot;.png}}</p>\n}
197
+ @parser.parse('{{"fun".png}}').should == expected
154
198
  end
155
199
 
156
200
  it 'should not allow embedded spaces' do
@@ -163,31 +207,37 @@ describe Wikitext::Parser, 'embedding img tags' do
163
207
 
164
208
  it 'should allow overrides of the image prefix at initialization time' do
165
209
  parser = Wikitext::Parser.new(:img_prefix => '/gfx/')
166
- parser.parse('{{foo.png}}').should == %Q{<p><img src="/gfx/foo.png" alt="foo.png" /></p>\n}
210
+ expected = %Q{<p><img src="/gfx/foo.png" alt="foo.png"></p>\n}
211
+ parser.parse('{{foo.png}}').should == expected
167
212
  end
168
213
 
169
214
  it 'should suppress the image prefix if passed an empty string at initialization time' do
170
215
  parser = Wikitext::Parser.new(:img_prefix => '')
171
- parser.parse('{{foo.png}}').should == %Q{<p><img src="foo.png" alt="foo.png" /></p>\n}
216
+ expected = %Q{<p><img src="foo.png" alt="foo.png"></p>\n}
217
+ parser.parse('{{foo.png}}').should == expected
172
218
  end
173
219
 
174
220
  it 'should suppress image prefix if passed nil at initialization time' do
175
221
  parser = Wikitext::Parser.new(:img_prefix => nil)
176
- parser.parse('{{foo.png}}').should == %Q{<p><img src="foo.png" alt="foo.png" /></p>\n}
222
+ expected = %Q{<p><img src="foo.png" alt="foo.png"></p>\n}
223
+ parser.parse('{{foo.png}}').should == expected
177
224
  end
178
225
 
179
226
  it 'should allow overrides of the image prefix after initialization' do
180
227
  @parser.img_prefix = '/gfx/'
181
- @parser.parse('{{foo.png}}').should == %Q{<p><img src="/gfx/foo.png" alt="foo.png" /></p>\n}
228
+ expected = %Q{<p><img src="/gfx/foo.png" alt="foo.png"></p>\n}
229
+ @parser.parse('{{foo.png}}').should == expected
182
230
  end
183
231
 
184
232
  it 'should suppress image if prefix set to an empty string after initialization' do
185
233
  @parser.img_prefix = ''
186
- @parser.parse('{{foo.png}}').should == %Q{<p><img src="foo.png" alt="foo.png" /></p>\n}
234
+ expected = %Q{<p><img src="foo.png" alt="foo.png"></p>\n}
235
+ @parser.parse('{{foo.png}}').should == expected
187
236
  end
188
237
 
189
238
  it 'should suppress image if prefix set to nil after initialization' do
190
239
  @parser.img_prefix = nil
191
- @parser.parse('{{foo.png}}').should == %Q{<p><img src="foo.png" alt="foo.png" /></p>\n}
240
+ expected = %Q{<p><img src="foo.png" alt="foo.png"></p>\n}
241
+ @parser.parse('{{foo.png}}').should == expected
192
242
  end
193
243
  end
@@ -186,14 +186,14 @@ describe Wikitext::Parser, 'with large slab of input text' do
186
186
  syntax as you can see.</pre>
187
187
  </blockquote>
188
188
  <h2>another heading</h2>
189
- <p>paragraph within <em>multiple <strong>styles</strong></em> and <tt>tt span</tt></p>
189
+ <p>paragraph within <em>multiple <strong>styles</strong></em> and <code>tt span</code></p>
190
190
  <p>similar, but with <strong>styles in <em>different</em> order</strong></p>
191
191
  <p>again, a <strong>different <em>order</em></strong></p>
192
192
  <ul>
193
193
  <li>list item 1 [<a href="http://google.com/" class="external">http://google.com/</a> unterminated
194
194
  <ul>
195
195
  <li>nested list item 1 with [[bad link</li>
196
- <li>nested list item 2 with unclosed <tt>span</tt></li>
196
+ <li>nested list item 2 with unclosed <code>span</code></li>
197
197
  <li>nested list item 3</li>
198
198
  </ul>
199
199
  </li>
@@ -204,7 +204,7 @@ describe Wikitext::Parser, 'with large slab of input text' do
204
204
  which would '''otherwise''' have &lt;tt&gt;special&lt;/tt&gt; meaning
205
205
  although explicit entities &copy; are passed through unchanged</pre>
206
206
  <p>a normal paragraph again</p>
207
- <p><img src="/images/an_image.png" alt="an_image.png" /></p>
207
+ <p><img src="/images/an_image.png" alt="an_image.png"></p>
208
208
  <blockquote>
209
209
  <p>This is another blockquote which demonstrates that we can nest other structures inside of it. For example, here we have a code sample:</p>
210
210
  <pre>line 1
@@ -216,7 +216,7 @@ describe Wikitext::Parser, 'with large slab of input text' do
216
216
  <li>a</li>
217
217
  <li>list</li>
218
218
  </ul>
219
- <p>And here is a link to <a href="/wiki/something">something</a>, and some <em>other</em> <tt>styled</tt> <strong>spans</strong>.</p>
219
+ <p>And here is a link to <a href="/wiki/something">something</a>, and some <em>other</em> <code>styled</code> <strong>spans</strong>.</p>
220
220
  <blockquote>
221
221
  <p>Finally we have a nested blockquote.</p>
222
222
  <ol>
@@ -34,7 +34,7 @@ describe Wikitext::Parser, 'internal links (space to underscore off)' do
34
34
  @parser.parse("foo '']]'' bar").should == "<p>foo <em>]]</em> bar</p>\n" # in EM scope
35
35
  @parser.parse("foo ''']]''' bar").should == "<p>foo <strong>]]</strong> bar</p>\n" # in STRONG scope
36
36
  @parser.parse("foo ''''']]''''' bar").should == "<p>foo <strong><em>]]</em></strong> bar</p>\n" # in STRONG_EM scope
37
- @parser.parse('foo <tt>]]</tt> bar').should == "<p>foo <tt>]]</tt> bar</p>\n" # in TT scope
37
+ @parser.parse('foo <tt>]]</tt> bar').should == "<p>foo <code>]]</code> bar</p>\n" # in TT scope
38
38
  @parser.parse('= foo ]] bar =').should == "<h1>foo ]] bar</h1>\n" # in H1 scope
39
39
  @parser.parse('== foo ]] bar ==').should == "<h2>foo ]] bar</h2>\n" # in H2 scope
40
40
  @parser.parse('=== foo ]] bar ===').should == "<h3>foo ]] bar</h3>\n" # in H3 scope
@@ -314,12 +314,12 @@ describe Wikitext::Parser, 'internal links (space to underscore off)' do
314
314
  end
315
315
 
316
316
  it 'should allow tt markup in the custom link text' do
317
- expected = %Q{<p><a href="/wiki/foo">bar <tt>baz</tt></a></p>\n}
317
+ expected = %Q{<p><a href="/wiki/foo">bar <code>baz</code></a></p>\n}
318
318
  @parser.parse('[[foo|bar <tt>baz</tt>]]').should == expected
319
319
  end
320
320
 
321
321
  it 'should automatically close unclosed tt markup in the custom link text' do
322
- expected = %Q{<p><a href="/wiki/foo">bar <tt>baz</tt></a></p>\n}
322
+ expected = %Q{<p><a href="/wiki/foo">bar <code>baz</code></a></p>\n}
323
323
  @parser.parse('[[foo|bar <tt>baz]]').should == expected
324
324
  end
325
325
 
@@ -579,7 +579,7 @@ describe Wikitext::Parser, 'internal links (space to underscore on)' do
579
579
  @parser.parse("foo '']]'' bar").should == "<p>foo <em>]]</em> bar</p>\n" # in EM scope
580
580
  @parser.parse("foo ''']]''' bar").should == "<p>foo <strong>]]</strong> bar</p>\n" # in STRONG scope
581
581
  @parser.parse("foo ''''']]''''' bar").should == "<p>foo <strong><em>]]</em></strong> bar</p>\n" # in STRONG_EM scope
582
- @parser.parse('foo <tt>]]</tt> bar').should == "<p>foo <tt>]]</tt> bar</p>\n" # in TT scope
582
+ @parser.parse('foo <tt>]]</tt> bar').should == "<p>foo <code>]]</code> bar</p>\n" # in TT scope
583
583
  @parser.parse('= foo ]] bar =').should == "<h1>foo ]] bar</h1>\n" # in H1 scope
584
584
  @parser.parse('== foo ]] bar ==').should == "<h2>foo ]] bar</h2>\n" # in H2 scope
585
585
  @parser.parse('=== foo ]] bar ===').should == "<h3>foo ]] bar</h3>\n" # in H3 scope
@@ -854,12 +854,12 @@ describe Wikitext::Parser, 'internal links (space to underscore on)' do
854
854
  end
855
855
 
856
856
  it 'should allow tt markup in the custom link text' do
857
- expected = %Q{<p><a href="/wiki/foo">bar <tt>baz</tt></a></p>\n}
857
+ expected = %Q{<p><a href="/wiki/foo">bar <code>baz</code></a></p>\n}
858
858
  @parser.parse('[[foo|bar <tt>baz</tt>]]').should == expected
859
859
  end
860
860
 
861
861
  it 'should automatically close unclosed tt markup in the custom link text' do
862
- expected = %Q{<p><a href="/wiki/foo">bar <tt>baz</tt></a></p>\n}
862
+ expected = %Q{<p><a href="/wiki/foo">bar <code>baz</code></a></p>\n}
863
863
  @parser.parse('[[foo|bar <tt>baz]]').should == expected
864
864
  end
865
865
 
@@ -35,7 +35,7 @@ describe Wikitext::Parser do
35
35
  original_prefix = '/images/'
36
36
  parser.img_prefix = original_prefix
37
37
  parser.img_prefix.should == original_prefix
38
- parser.parse('{{foo.png}}').should == %Q{<p><img src="/images/foo.png" alt="foo.png" /></p>\n}
38
+ parser.parse('{{foo.png}}').should == %Q{<p><img src="/images/foo.png" alt="foo.png"></p>\n}
39
39
 
40
40
  # second pass
41
41
  parser = Wikitext::Parser.shared_parser
@@ -43,6 +43,6 @@ describe Wikitext::Parser do
43
43
  new_prefix = '/totally-different-prefix/'
44
44
  parser.img_prefix = new_prefix
45
45
  parser.img_prefix.should == new_prefix
46
- parser.parse('{{bar.png}}').should == %Q{<p><img src="/totally-different-prefix/bar.png" alt="bar.png" /></p>\n}
46
+ parser.parse('{{bar.png}}').should == %Q{<p><img src="/totally-different-prefix/bar.png" alt="bar.png"></p>\n}
47
47
  end
48
48
  end
@@ -420,7 +420,7 @@ describe Wikitext::Parser, 'parsing PRE_START/PRE_END blocks' do
420
420
 
421
421
  # `
422
422
  expected = dedent <<-END
423
- <p>hello <tt>my </tt></p>
423
+ <p>hello <code>my </code></p>
424
424
  <pre>world</pre>
425
425
  END
426
426
  @parser.parse("hello `my <pre>world</pre>").should == expected
@@ -448,7 +448,7 @@ describe Wikitext::Parser, 'parsing PRE_START/PRE_END blocks' do
448
448
 
449
449
  # <tt>
450
450
  expected = dedent <<-END
451
- <p>hello <tt>my </tt></p>
451
+ <p>hello <code>my </code></p>
452
452
  <pre>world</pre>
453
453
  END
454
454
  @parser.parse("hello <tt>my <pre>world</pre>").should == expected
@@ -1,4 +1,4 @@
1
- # Copyright 2009 Wincent Colaiuta. All rights reserved.
1
+ # Copyright 2009-2010 Wincent Colaiuta. All rights reserved.
2
2
  #
3
3
  # Redistribution and use in source and binary forms, with or without
4
4
  # modification, are permitted provided that the following conditions are met:
@@ -29,10 +29,12 @@ require 'wopen3'
29
29
  require 'ostruct'
30
30
 
31
31
  module RailsSpecs
32
- TRASH_PATH = Pathname.new(__FILE__).dirname + 'trash'
33
- CLONE_PATH = TRASH_PATH + 'rails.git'
34
- RAILS_PATH = CLONE_PATH + 'railties' + 'bin' + 'rails'
35
- EDGE_APP_PATH = TRASH_PATH + 'edge-app'
32
+ TRASH_PATH = Pathname.new(__FILE__).dirname + 'trash'
33
+ CLONE_PATH = TRASH_PATH + 'rails.git'
34
+ RAILS2_BIN_PATH = CLONE_PATH + 'railties' + 'bin' + 'rails'
35
+ RAILS3_BIN_PATH = CLONE_PATH + 'bin' + 'rails'
36
+ WIKITEXT_GEM_PATH = TRASH_PATH + '..' + '..'
37
+ SUCCESSFUL_TEST_RESULT = /1 tests, 3 assertions, 0 failures, 0 errors/
36
38
 
37
39
  def run cmd, *args
38
40
  result = OpenStruct.new
@@ -51,7 +53,7 @@ module RailsSpecs
51
53
  status = $?.exitstatus
52
54
  if status != 0
53
55
  command_string = ([cmd] + args).join(' ')
54
- puts "*** COMMAND #{command_string} EXITED WITH NON-ZERO EXIT STATUS (#{status})"
56
+ puts "\n*** COMMAND #{command_string} EXITED WITH NON-ZERO EXIT STATUS (#{status})"
55
57
  puts "*** STDOUT FOR COMMAND #{command_string}:", result.stdout
56
58
  puts "*** STDERR FOR COMMAND #{command_string}:", result.stderr
57
59
  raise "non-zero exit status (#{status}) for '#{cmd}'"
@@ -70,14 +72,20 @@ module RailsSpecs
70
72
  end
71
73
 
72
74
  def app_path version
75
+ version = 'edge' if version.nil?
76
+ version = "v#{version}" if version =~ /\A3\./
73
77
  TRASH_PATH + "#{version}-app"
74
78
  end
75
79
 
76
- def create_base_app_and_symlinks app, &block
80
+ def create_rails2_app version
81
+ app = app_path version
77
82
  clone
78
83
  FileUtils.rm_r(app) if File.exist?(app)
79
- yield
80
- run 'ruby', RAILS_PATH, app
84
+ FileUtils.cd CLONE_PATH do
85
+ run 'git', 'checkout', '-f', "v#{version}"
86
+ run 'git', 'clean', '-f'
87
+ end
88
+ run 'ruby', RAILS2_BIN_PATH, app
81
89
  vendor = app + 'vendor'
82
90
  gems = vendor + 'gems'
83
91
  FileUtils.cd vendor do
@@ -89,13 +97,22 @@ module RailsSpecs
89
97
  end
90
98
  end
91
99
 
92
- def create_release_app version
93
- create_base_app_and_symlinks app_path(version) do
94
- FileUtils.cd CLONE_PATH do
95
- run 'git', 'checkout', "v#{version}"
96
- run 'git', 'clean', '-f'
100
+ # if version is nil will create an "Edge" app
101
+ def create_rails3_app version
102
+ app = app_path version
103
+ clone
104
+ FileUtils.rm_r(app) if File.exist?(app)
105
+ FileUtils.cd CLONE_PATH do
106
+ if version
107
+ run 'git', 'checkout', '-f', "v#{version}"
108
+ else # "Edge"
109
+ run 'git', 'checkout', '-f', 'master'
110
+ run 'git', 'merge', 'origin/master'
97
111
  end
112
+ run 'git', 'clean', '-f'
98
113
  end
114
+ run 'ruby', RAILS3_BIN_PATH, 'new', app, '--skip-activerecord', '--dev'
115
+ create_gemfile app
99
116
  end
100
117
 
101
118
  def insert text, after, infile
@@ -112,10 +129,25 @@ module RailsSpecs
112
129
  raise "text '#{after}' not found" unless found
113
130
  end
114
131
 
132
+ # Rails 2 only
115
133
  def add_text_to_initializer text, infile
116
134
  insert text, 'Rails::Initializer.run do', infile
117
135
  end
118
136
 
137
+ # Rails 3 only
138
+ def add_text_to_routes text, infile
139
+ insert text, 'Application.routes.draw', infile
140
+ end
141
+
142
+ def create_gemfile app
143
+ File.open(app + 'Gemfile', 'w') do |f|
144
+ f.write <<-GEMFILE
145
+ gem 'rails', :path => "#{CLONE_PATH.realpath}"
146
+ gem 'wikitext', :path => "#{WIKITEXT_GEM_PATH.realpath}"
147
+ GEMFILE
148
+ end
149
+ end
150
+
119
151
  def create_controller app
120
152
  File.open(app + 'app' + 'controllers' + 'wiki_controller.rb', 'w') do |f|
121
153
  f.write 'class WikiController < ApplicationController; end'
@@ -150,16 +182,7 @@ TEST
150
182
  end
151
183
  end
152
184
 
153
- def create_edge_app
154
- create_base_app_and_symlinks EDGE_APP_PATH do
155
- FileUtils.cd CLONE_PATH do
156
- run 'git', 'checkout', 'master'
157
- run 'git', 'merge', 'origin/master'
158
- run 'git', 'clean', '-f'
159
- end
160
- end
161
- end
162
-
185
+ # Rails 2 only
163
186
  def update_environment app
164
187
  environment = app + 'config' + 'environment.rb'
165
188
  add_text_to_initializer " config.gem 'wikitext', :version => '#{Wikitext::VERSION}'", environment
@@ -168,21 +191,32 @@ TEST
168
191
  end
169
192
  end
170
193
 
171
- def setup_release_app version
172
- create_release_app version
173
- path = app_path(version)
194
+ # Rails 3 only
195
+ def update_routes app
196
+ routes = app + 'config' + 'routes.rb'
197
+ add_text_to_routes 'match "/wiki" => "wiki#index"', routes
198
+ end
199
+
200
+ def setup_rails2_app version
201
+ create_rails2_app version
202
+ path = app_path version
174
203
  update_environment path
175
204
  create_controller path
176
205
  create_template path
177
206
  create_test path
178
207
  end
179
208
 
209
+ def setup_rails3_app version = nil
210
+ create_rails3_app version
211
+ path = app_path version
212
+ update_routes path
213
+ create_controller path
214
+ create_template path
215
+ create_test path
216
+ end
217
+
180
218
  def setup_edge_app
181
- create_edge_app
182
- update_environment EDGE_APP_PATH
183
- create_controller EDGE_APP_PATH
184
- create_template EDGE_APP_PATH
185
- create_test EDGE_APP_PATH
219
+ setup_rails3_app
186
220
  end
187
221
 
188
222
  def run_integration_test app
@@ -192,29 +226,63 @@ TEST
192
226
  end
193
227
  end # module RailsSpecs
194
228
 
195
- describe 'Template handler in Rails 2.2.2' do
229
+ describe 'Template handler in Rails 2.3.0' do
196
230
  include RailsSpecs
197
- version = '2.2.2'
198
231
 
199
- before(:all) do
200
- setup_release_app version
201
- @path = app_path(version)
232
+ before :all do
233
+ setup_rails2_app '2.3.0'
234
+ @path = app_path '2.3.0'
202
235
  end
203
236
 
204
237
  it 'should process the template using the wikitext module' do
205
- run_integration_test(@path).should =~ /1 tests, 3 assertions, 0 failures, 0 errors/
238
+ pending 'Rack::Lint::LintError'
239
+ # Rack::Lint::LintError: a header value must be a String, but the value of
240
+ # 'Set-Cookie' is a Array
241
+ run_integration_test(@path).should =~ RailsSpecs::SUCCESSFUL_TEST_RESULT
242
+ end
243
+ end
244
+
245
+ # test other Rails 2 versions
246
+ %w{2.2.2 2.2.3 2.3.1 2.3.2 2.3.2.1 2.3.3 2.3.3.1 2.3.4 2.3.5 2.3.6
247
+ 2.3.7 2.3.8}.each do |version|
248
+ describe "Template handler in Rails #{version}" do
249
+ include RailsSpecs
250
+
251
+ before :all do
252
+ setup_rails2_app version
253
+ @path = app_path version
254
+ end
255
+
256
+ it 'should process the template using the wikitext module' do
257
+ run_integration_test(@path).should =~ RailsSpecs::SUCCESSFUL_TEST_RESULT
258
+ end
259
+ end
260
+ end
261
+
262
+ %w{3.0.0.beta4}.each do |version|
263
+ describe "Template handler in Rails #{version}" do
264
+ include RailsSpecs
265
+
266
+ before :all do
267
+ setup_rails3_app version
268
+ @path = app_path version
269
+ end
270
+
271
+ it 'should process the template using the wikitext module' do
272
+ run_integration_test(@path).should =~ RailsSpecs::SUCCESSFUL_TEST_RESULT
273
+ end
206
274
  end
207
275
  end
208
276
 
209
277
  describe 'Template handler in Edge Rails' do
210
278
  include RailsSpecs
211
279
 
212
- before(:all) do
280
+ before :all do
213
281
  setup_edge_app
214
- @path = RailsSpecs::EDGE_APP_PATH
282
+ @path = app_path nil
215
283
  end
216
284
 
217
285
  it 'should process the template using the wikitext module' do
218
- run_integration_test(@path).should =~ /1 tests, 3 assertions, 0 failures, 0 errors/
286
+ run_integration_test(@path).should =~ RailsSpecs::SUCCESSFUL_TEST_RESULT
219
287
  end
220
288
  end
@@ -31,21 +31,23 @@ describe Wikitext::Parser, 'parsing <tt> spans' do
31
31
  end
32
32
 
33
33
  it 'should recognize paired <tt> and </tt> tags' do
34
- @parser.parse('foo <tt>bar</tt> baz').should == "<p>foo <tt>bar</tt> baz</p>\n"
34
+ # note how in version 2.0 and above, we output <code> tags instead of <tt>
35
+ # tags, seeing as the latter have been removed from HTML5
36
+ @parser.parse('foo <tt>bar</tt> baz').should == "<p>foo <code>bar</code> baz</p>\n"
35
37
  end
36
38
 
37
39
  it 'should recognize <tt> tags case-insensitively' do
38
- @parser.parse('foo <TT>bar</tT> baz').should == "<p>foo <tt>bar</tt> baz</p>\n"
39
- @parser.parse('foo <tT>bar</Tt> baz').should == "<p>foo <tt>bar</tt> baz</p>\n"
40
- @parser.parse('foo <Tt>bar</TT> baz').should == "<p>foo <tt>bar</tt> baz</p>\n"
40
+ @parser.parse('foo <TT>bar</tT> baz').should == "<p>foo <code>bar</code> baz</p>\n"
41
+ @parser.parse('foo <tT>bar</Tt> baz').should == "<p>foo <code>bar</code> baz</p>\n"
42
+ @parser.parse('foo <Tt>bar</TT> baz').should == "<p>foo <code>bar</code> baz</p>\n"
41
43
  end
42
44
 
43
45
  it 'should automatically insert missing closing tags' do
44
- @parser.parse('foo <tt>bar').should == "<p>foo <tt>bar</tt></p>\n"
46
+ @parser.parse('foo <tt>bar').should == "<p>foo <code>bar</code></p>\n"
45
47
  end
46
48
 
47
49
  it 'should automatically close unclosed spans upon hitting newline' do
48
- @parser.parse("foo <tt>bar\nbaz").should == "<p>foo <tt>bar</tt> baz</p>\n"
50
+ @parser.parse("foo <tt>bar\nbaz").should == "<p>foo <code>bar</code> baz</p>\n"
49
51
  end
50
52
 
51
53
  it 'should convert unexpected closing tags into entities' do
@@ -53,11 +55,11 @@ describe Wikitext::Parser, 'parsing <tt> spans' do
53
55
  end
54
56
 
55
57
  it 'should handle (illegal) nested <tt> spans' do
56
- @parser.parse('foo <tt>bar <tt>inner</tt></tt> baz').should == "<p>foo <tt>bar &lt;tt&gt;inner</tt>&lt;/tt&gt; baz</p>\n"
58
+ @parser.parse('foo <tt>bar <tt>inner</tt></tt> baz').should == "<p>foo <code>bar &lt;tt&gt;inner</code>&lt;/tt&gt; baz</p>\n"
57
59
  end
58
60
 
59
61
  it 'should handle (illegal) interleaved spans' do
60
- @parser.parse("foo <tt>bar '''inner</tt> baz'''").should == "<p>foo <tt>bar <strong>inner</strong></tt> baz<strong></strong></p>\n"
62
+ @parser.parse("foo <tt>bar '''inner</tt> baz'''").should == "<p>foo <code>bar <strong>inner</strong></code> baz<strong></strong></p>\n"
61
63
  end
62
64
 
63
65
  it 'should have no effect inside <pre> blocks' do
@@ -69,7 +71,7 @@ describe Wikitext::Parser, 'parsing <tt> spans' do
69
71
  end
70
72
 
71
73
  it 'should have no effect if a backtick span is already open' do
72
- @parser.parse('foo `<tt>bar</tt>` baz').should == "<p>foo <tt>&lt;tt&gt;bar&lt;/tt&gt;</tt> baz</p>\n"
74
+ @parser.parse('foo `<tt>bar</tt>` baz').should == "<p>foo <code>&lt;tt&gt;bar&lt;/tt&gt;</code> baz</p>\n"
73
75
  end
74
76
  end
75
77
 
@@ -79,19 +81,19 @@ describe Wikitext::Parser, 'parsing backtick spans' do
79
81
  end
80
82
 
81
83
  it 'should recognize paired backticks' do
82
- @parser.parse('foo `bar` baz').should == "<p>foo <tt>bar</tt> baz</p>\n"
84
+ @parser.parse('foo `bar` baz').should == "<p>foo <code>bar</code> baz</p>\n"
83
85
  end
84
86
 
85
87
  it 'should automatically insert missing closing backtick' do
86
- @parser.parse('foo `bar').should == "<p>foo <tt>bar</tt></p>\n"
88
+ @parser.parse('foo `bar').should == "<p>foo <code>bar</code></p>\n"
87
89
  end
88
90
 
89
91
  it 'should automatically close unclosed spans upon hitting newline' do
90
- @parser.parse("foo `bar\nbaz").should == "<p>foo <tt>bar</tt> baz</p>\n"
92
+ @parser.parse("foo `bar\nbaz").should == "<p>foo <code>bar</code> baz</p>\n"
91
93
  end
92
94
 
93
95
  it 'should handle (illegal) interleaved spans' do
94
- @parser.parse("foo `bar '''inner` baz'''").should == "<p>foo <tt>bar <strong>inner</strong></tt> baz<strong></strong></p>\n"
96
+ @parser.parse("foo `bar '''inner` baz'''").should == "<p>foo <code>bar <strong>inner</strong></code> baz<strong></strong></p>\n"
95
97
  end
96
98
 
97
99
  it 'should have no effect inside <pre> blocks' do
@@ -103,7 +105,7 @@ describe Wikitext::Parser, 'parsing backtick spans' do
103
105
  end
104
106
 
105
107
  it 'should have no effect if a <tt> span is already open' do
106
- @parser.parse('foo <tt>`bar`</tt> baz').should == "<p>foo <tt>`bar`</tt> baz</p>\n"
108
+ @parser.parse('foo <tt>`bar`</tt> baz').should == "<p>foo <code>`bar`</code> baz</p>\n"
107
109
  end
108
110
  end
109
111
 
@@ -223,7 +223,7 @@ describe Wikitext::Parser, 'parsing unordered lists' do
223
223
  END
224
224
  expected = dedent <<-END
225
225
  <ul>
226
- <li><tt>hello</tt></li>
226
+ <li><code>hello</code></li>
227
227
  <li>world</li>
228
228
  </ul>
229
229
  END
@@ -237,7 +237,7 @@ describe Wikitext::Parser, 'parsing unordered lists' do
237
237
  END
238
238
  expected = dedent <<-END
239
239
  <ul>
240
- <li><tt>hello</tt></li>
240
+ <li><code>hello</code></li>
241
241
  <li>world</li>
242
242
  </ul>
243
243
  END
metadata CHANGED
@@ -3,9 +3,9 @@ name: wikitext
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
- - 1
7
- - 12
8
- version: "1.12"
6
+ - 2
7
+ - 0
8
+ version: "2.0"
9
9
  platform: ruby
10
10
  authors:
11
11
  - Wincent Colaiuta
@@ -13,7 +13,7 @@ autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
15
 
16
- date: 2010-06-09 00:00:00 +02:00
16
+ date: 2010-06-13 00:00:00 +02:00
17
17
  default_executable:
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
@@ -29,7 +29,7 @@ dependencies:
29
29
  type: :development
30
30
  version_requirements: *id001
31
31
  - !ruby/object:Gem::Dependency
32
- name: wopen3
32
+ name: thor
33
33
  prerelease: false
34
34
  requirement: &id002 !ruby/object:Gem::Requirement
35
35
  requirements:
@@ -40,6 +40,18 @@ dependencies:
40
40
  version: "0"
41
41
  type: :development
42
42
  version_requirements: *id002
43
+ - !ruby/object:Gem::Dependency
44
+ name: wopen3
45
+ prerelease: false
46
+ requirement: &id003 !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ segments:
51
+ - 0
52
+ version: "0"
53
+ type: :development
54
+ version_requirements: *id003
43
55
  description: " Wikitext is a fast wikitext-to-HTML translator written in C.\n"
44
56
  email: win@wincent.com
45
57
  executables:
@@ -67,7 +79,8 @@ files:
67
79
  - ext/depend
68
80
  - lib/wikitext/nil_class.rb
69
81
  - lib/wikitext/parser.rb
70
- - lib/wikitext/rails.rb
82
+ - lib/wikitext/preprocess.rb
83
+ - lib/wikitext/rails_template_handler.rb
71
84
  - lib/wikitext/string.rb
72
85
  - lib/wikitext/version.rb
73
86
  - rails/init.rb