wikitext 1.12 → 2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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