]> git.wincent.com - wikitext.git/commitdiff
Accept "indent" value of "false" to disable indentation entirely
authorWincent Colaiuta <win@wincent.com>
Wed, 6 May 2009 22:54:26 +0000 (00:54 +0200)
committerWincent Colaiuta <win@wincent.com>
Wed, 6 May 2009 22:54:26 +0000 (00:54 +0200)
This produces slightly more compact HTML output and is intended to
match the output of Haml's "ugly" mode.

Signed-off-by: Wincent Colaiuta <win@wincent.com>
doc/rdoc.rb
ext/parser.c
spec/indentation_spec.rb

index f11211ff8d3cc657b6fe897b1212c6192a511040..cb299b5234a080f338a5c68546dea5c29e9cf9c6 100644 (file)
@@ -222,10 +222,19 @@ module Wikitext
     # Parses and transforms the UTF-8 wikitext markup input string into
     # HTML. Raises a Wikitext::Parser::Error if passed invalid UTF-8.
     # You can customize some aspects of the transformation by setting
-    # attributes on the parser instance before calling this method.
+    # attributes on the parser instance before calling this method
+    # (see the attributes documentation for the Parser class),
+    # or by passing in an (optional) options hash.
     #
-    # See the attributes documentation for the Parser class.
-    def parse string
+    # Options that can be overridden at parse-time include:
+    #
+    # +indent+::              A non-negative number (to add an arbitrary
+    #                         amount of indentation to all lines in the
+    #                         output) or false (to disable indentation
+    #                         entirely).
+    # +base_heading_level+::  An integer between 0 and 6 denoting the
+    #                         current "heading level" (documented above).
+    def parse string, options = {}
       # This is just a placeholder.
       # See parser.c for the C source code to this method.
     end
index 50c427036ad0730bdd373096c38a430f9beb90ba..a7592677dce39c5184ce36bcd571547723a6fda3 100644 (file)
@@ -271,6 +271,8 @@ void _Wikitext_append_img(parser_t *parser, char *token_ptr, int token_len)
 // each time we enter one of those spans must ++ the indentation level
 void _Wikitext_indent(parser_t *parser)
 {
+    if (parser->base_indent == -1) // indentation disabled
+        return;
     int space_count = parser->current_indent + parser->base_indent;
     if (space_count > 0)
     {
@@ -290,6 +292,8 @@ void _Wikitext_indent(parser_t *parser)
 
 void _Wikitext_dedent(parser_t *parser, VALUE emit)
 {
+    if (parser->base_indent == -1) // indentation disabled
+        return;
     parser->current_indent -= 2;
     if (emit != Qtrue)
         return;
@@ -990,9 +994,15 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
         // :indent => 0 (or more)
         if (rb_funcall(options, rb_intern("has_key?"), 1, ID2SYM(rb_intern("indent"))) == Qtrue)
         {
-            base_indent = NUM2INT(rb_hash_aref(options, ID2SYM(rb_intern("indent"))));
-            if (base_indent < 0)
-                base_indent = 0;
+            VALUE indent = rb_hash_aref(options, ID2SYM(rb_intern("indent")));
+            if (indent == Qfalse)
+                base_indent = -1; // indentation disabled
+            else
+            {
+                base_indent = NUM2INT(indent);
+                if (base_indent < 0)
+                    base_indent = 0;
+            }
         }
 
         // :base_heading_level => 0/1/2/3/4/5/6
index 8b34dde8de4f98260cffb00a06303fba61532e5a..f906cd93a38bc5868dbf4d1ad9f1cbef52cd84e5 100755 (executable)
@@ -31,6 +31,10 @@ def indent spaces, string
   string.gsub /^/, ' ' * spaces
 end
 
+def nodent string
+  string.gsub /^ */, ''
+end
+
 describe Wikitext::Parser, 'indentation' do
   before do
     @parser         = Wikitext::Parser.new
@@ -43,34 +47,38 @@ describe Wikitext::Parser, 'indentation' do
   end
 
   it 'should default to no additional indentation' do
-    @parser.parse('* foo').should == @default_output
+    @parser.parse(@input).should == @default_output
   end
 
   it 'should add additional indentation as indicated by the "indent" option' do
-    @parser.parse('* foo', :indent => 1).should == indent(1, @default_output)
-    @parser.parse('* foo', :indent => 2).should == indent(2, @default_output)
-    @parser.parse('* foo', :indent => 3).should == indent(3, @default_output)
-    @parser.parse('* foo', :indent => 4).should == indent(4, @default_output)
-    @parser.parse('* foo', :indent => 5).should == indent(5, @default_output)
-    @parser.parse('* foo', :indent => 6).should == indent(6, @default_output)
+    @parser.parse(@input, :indent => 1).should == indent(1, @default_output)
+    @parser.parse(@input, :indent => 2).should == indent(2, @default_output)
+    @parser.parse(@input, :indent => 3).should == indent(3, @default_output)
+    @parser.parse(@input, :indent => 4).should == indent(4, @default_output)
+    @parser.parse(@input, :indent => 5).should == indent(5, @default_output)
+    @parser.parse(@input, :indent => 6).should == indent(6, @default_output)
+  end
+
+  it 'should perform no indentation when "indent" is "false"' do
+    @parser.parse(@input, :indent => false).should == nodent(@default_output)
   end
 
   it 'should complain if the "indent" option is nil' do
-    lambda { @parser.parse('* foo', :indent => nil) }.should raise_error(TypeError)
+    lambda { @parser.parse(@input, :indent => nil) }.should raise_error(TypeError)
   end
 
   it 'should complain if the "indent" options is not an integer' do
-    lambda { @parser.parse('* foo', :indent => 'bar') }.should raise_error(TypeError)
-    lambda { @parser.parse('* foo', :indent => /baz/) }.should raise_error(TypeError)
+    lambda { @parser.parse(@input, :indent => 'bar') }.should raise_error(TypeError)
+    lambda { @parser.parse(@input, :indent => /baz/) }.should raise_error(TypeError)
   end
 
   it 'should treat a negative "indent" as though it were zero' do
-    @parser.parse('* foo', :indent => -4).should == @default_output
+    @parser.parse(@input, :indent => -4).should == @default_output
   end
 
   it 'should coerce a float "indent" into an integer' do
-    @parser.parse('* foo', :indent => 0.0).should == @default_output
-    @parser.parse('* foo', :indent => 2.0).should == <<-END
+    @parser.parse(@input, :indent => 0.0).should == @default_output
+    @parser.parse(@input, :indent => 2.0).should == <<-END
   <ul>
     <li>foo</li>
   </ul>