<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -36,7 +36,7 @@ e = Echoe.new('RedCloth', RedCloth::VERSION.to_s) do |p|
     when /java/
       self.files += ['lib/redcloth_scan.jar']
     else
-      self.files += %w[attributes inline scan].map {|f| &quot;ext/redcloth_scan/redcloth_#{f}.c&quot;}
+      self.files += %w[attributes inline scan bbcode].map {|f| &quot;ext/redcloth_scan/redcloth_#{f}.c&quot;}
     end
     
     self.require_paths &lt;&lt; &quot;lib/case_sensitive_require&quot;</diff>
      <filename>Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -7,45 +7,22 @@
 
   machine redcloth_bbcode;
   
-  action cat2html { CAT(html); }
-  action failed4html { rb_str_append(block,failed_start); rb_str_append(block,rb_funcall(self, rb_intern(&quot;escape&quot;), 1, html)); fgoto main; }
-  
   bbchars = (default - space - &quot;]&quot; - &quot;[&quot;)+ ;
   bbmtext = ( bbchars (mspace bbchars)* ) ;
   
-  b   = &quot;[b]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/b]&quot; ;
-  i   = &quot;[i]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/i]&quot; ;
-  u   = &quot;[u]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/u]&quot; ;
-  s   = &quot;[s]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/s]&quot; ;
-  del = &quot;[del]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/del]&quot; ;
-  ins = &quot;[ins]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/ins]&quot; ;
-  sub = &quot;[sub]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/sub]&quot; ;
-  sup = &quot;[sup]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/sup]&quot; ;
-  notextile = &quot;[notextile]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/notextile]&quot; ;
-  innercolor = (&quot;#&quot;[0-9a-fA-F]{3}|&quot;#&quot;[0-9a-fA-F]{6}|&quot;aqua&quot;|&quot;black&quot;|&quot;blue&quot;|&quot;fuchsia&quot;|&quot;gray&quot;|&quot;green&quot;|&quot;lime&quot;|&quot;maroon&quot;|&quot;navy&quot;|&quot;olive&quot;|&quot;purple&quot;|&quot;red&quot;|&quot;silver&quot;|&quot;teal&quot;|&quot;white&quot;|&quot;yellow&quot;|&quot;orange&quot;|&quot;cyan&quot;|&quot;magenta&quot;|&quot;grey&quot;) %{ STORE(&quot;color&quot;); };
-  color = (&quot;[color=&quot; &gt;X innercolor &gt;A &quot;]&quot; mtext &gt;A %T :&gt; &quot;[/color]&quot;) ;
-  innersize = space* ( (digit? &quot;.&quot;? digit{1,2} (&quot;em&quot;|&quot;pt&quot;|&quot;px&quot;|&quot;%&quot;)? )|(&quot;xx-small&quot;|&quot;x-small&quot;|&quot;small&quot;|&quot;medium&quot;|&quot;large&quot;|&quot;x-large&quot;|&quot;xx-large&quot;|&quot;smaller&quot;|&quot;larger&quot;)) %{ STORE(&quot;size&quot;); } space* ;
-  size = (&quot;[size=&quot; &gt;X innersize &gt;A &quot;]&quot; mtext &gt;A %T :&gt; &quot;[/size]&quot;)  ;
-  inneralign = space* (&quot;left&quot;|&quot;center&quot;|&quot;right&quot;) %{ STORE(&quot;align&quot;); } space* ;
-  align = (&quot;[align=&quot; &gt;X inneralign &gt;A &quot;]&quot; mtext &gt;A %T :&gt; &quot;[/align]&quot;)  ;
-  acronym = (&quot;[acronym=&quot; &gt;X bbmtext %{ STORE(&quot;title&quot;); } &gt;A &quot;]&quot; mtext &gt;A %T :&gt; &quot;[/acronym]&quot;) ;
-  
-  link = &quot;[url]&quot; &gt;X uri %{ STORE(&quot;href&quot;); } &gt;A :&gt; &quot;[/url]&quot; ;
-  link2 = &quot;[url=&quot;&gt;X uri %{ STORE(&quot;href&quot;); } &gt;A &quot;]&quot; mtext %{ STORE(&quot;name&quot;); } &gt;A :&gt; &quot;[/url]&quot; ;
+  action bb_cat2html { CAT(html); }
+  action bb_failed4html { rb_str_append(block,failed_start); rb_str_append(block,rb_funcall(self, rb_intern(&quot;escape&quot;), 1, html)); fgoto main; }
   
-  img = &quot;[img]&quot; &gt;X uri %{ STORE(&quot;src&quot;); } &gt;A :&gt; &quot;[/img]&quot; ;
-  img2 = &quot;[img=&quot;&gt;X uri %{ STORE(&quot;src&quot;); } &gt;A &quot;]&quot; mtext %{ STORE(&quot;title&quot;); } &gt;A :&gt; &quot;[/img]&quot; ;
+  bb_pre_tag_start = &quot;[pre&quot; [^\]]* &quot;]&quot; (space* &quot;[code]&quot;)? ;
+  bb_pre_tag_end = (&quot;[/code]&quot; space*)? &quot;[/pre]&quot; LF? ;
   
-  pre_tag_start = &quot;[pre&quot; [^\]]* &quot;]&quot; (space* &quot;[code]&quot;)? ;
-  pre_tag_end = (&quot;[/code]&quot; space*)? &quot;[/pre]&quot; LF? ;
+  bb_quote_title = &quot; title&quot;? &quot;=&quot; bbmtext %{ STORE(&quot;cite&quot;); } &gt;A;
+  bb_quote_tag_start = (&quot;[quote&quot; bb_quote_title? &quot;]&quot;) ;
+  bb_quote_tag_end =  &quot;[/quote]&quot; LF? ;
   
-  quote_title = &quot; title&quot;? &quot;=&quot; bbmtext %{ STORE(&quot;cite&quot;); } &gt;A;
-  quote_tag_start = (&quot;[quote&quot; quote_title? &quot;]&quot;) ;
-  quote_tag_end =  &quot;[/quote]&quot; LF? ;
-  
-  spoiler_title = &quot; title&quot;? &quot;=&quot; bbmtext %{ STORE(&quot;title&quot;); } &gt;A;
-  spoiler_tag_start = (&quot;[spoiler&quot; spoiler_title? &quot;]&quot;) ;
-  spoiler_tag_end =  &quot;[/spoiler]&quot; LF? ;
+  bb_spoiler_title = &quot; title&quot;? &quot;=&quot; bbmtext %{ STORE(&quot;title&quot;); } &gt;A;
+  bb_spoiler_tag_start = (&quot;[spoiler&quot; bb_spoiler_title? &quot;]&quot;) ;
+  bb_spoiler_tag_end =  &quot;[/spoiler]&quot; LF? ;
   
   dim_digit = [0-9.]+ ;
   prime = (&quot;'&quot; | '&quot;')?;
@@ -54,48 +31,41 @@
   
   other_phrase = phrase -- dim_noactions;
   
-  pre_tag := |*
-    pre_tag_end         { rb_str_append(block,rb_str_new2(&quot;&lt;pre&gt;&lt;code&gt;&quot;)); rb_str_append(block,rb_funcall(self, rb_intern(&quot;escape_pre&quot;), 1, html)); rb_str_append(block,rb_str_new2(&quot;&lt;/code&gt;&lt;/pre&gt;&quot;)); BBDONE(); fgoto main; };
+  bb_pre_tag := |*
+    bb_pre_tag_end {
+      rb_str_append(block,rb_str_new2(&quot;&lt;pre&gt;&lt;code&gt;&quot;));
+      rb_str_append(block,rb_funcall(self, rb_intern(&quot;escape_pre&quot;), 1, html));
+      rb_str_append(block,rb_str_new2(&quot;&lt;/code&gt;&lt;/pre&gt;&quot;));
+      BBDONE();
+      fgoto main; 
+    };
     #LF                  { rb_str_append(html,rb_str_new2(&quot;&lt;br/&gt;&quot;)); };
-    default =&gt; cat2html;
-    EOF =&gt; failed4html;
+    default =&gt; bb_cat2html;
+    #EOF =&gt; bb_failed4html;
   *|;
   
-  quote_tag := |*
-    quote_tag_end { rb_hash_aset(regs, ID2SYM(rb_intern(&quot;text&quot;)), redcloth_transform2(self,html)); rb_str_append(block,rb_funcall(self, rb_intern(&quot;bbquote&quot;), 1, regs)); BBDONE(); fgoto main;};
-    default =&gt; cat2html;
-    EOF =&gt; failed4html;
+  bb_quote_tag := |*
+    bb_quote_tag_end { 
+      rb_hash_aset(regs, ID2SYM(rb_intern(&quot;text&quot;)), redcloth_transform2(self,html));
+      rb_str_append(block,rb_funcall(self, rb_intern(&quot;bbquote&quot;), 1, regs));
+      BBDONE();
+      fgoto main;
+    };
+    default =&gt; bb_cat2html;
+    #EOF =&gt; bb_failed4html;
   *|;
   
-  spoiler_tag := |*
-    spoiler_tag_end { rb_hash_aset(regs, ID2SYM(rb_intern(&quot;text&quot;)), redcloth_transform2(self,html)); rb_str_append(block,rb_funcall(self, rb_intern(&quot;bbspoiler&quot;), 1, regs)); BBDONE(); fgoto main;};
-    default =&gt; cat2html;
-    EOF =&gt; failed4html;
+  bb_spoiler_tag := |*
+    bb_spoiler_tag_end { rb_hash_aset(regs, ID2SYM(rb_intern(&quot;text&quot;)), redcloth_transform2(self,html)); rb_str_append(block,rb_funcall(self, rb_intern(&quot;bbspoiler&quot;), 1, regs)); BBDONE(); fgoto main;};
+    default =&gt; bb_cat2html;
+    #EOF =&gt; bb_failed4html;
   *|;
   
   main := |*
-  
-    b   { PASS(block, &quot;text&quot;, &quot;strong&quot;); };
-    i   { PASS(block, &quot;text&quot;, &quot;em&quot;); };
-    u   { PASS(block, &quot;text&quot;, &quot;ins&quot;); };
-    s   { PASS(block, &quot;text&quot;, &quot;del&quot;); };
-    del { PASS(block, &quot;text&quot;, &quot;del&quot;); };
-    ins { PASS(block, &quot;text&quot;, &quot;ins&quot;); };
-    sub { PASS(block, &quot;text&quot;, &quot;sub&quot;); };
-    sup { PASS(block, &quot;text&quot;, &quot;sup&quot;); };
-    notextile =&gt; ignore;
-    color   { PASS(block, &quot;text&quot;, &quot;color&quot;); };
-    size    { PASS(block, &quot;text&quot;, &quot;bbsize&quot;); };
-    align   { PASS(block, &quot;text&quot;, &quot;align&quot;); };
-    acronym { PASS(block, &quot;text&quot;, &quot;acronym&quot;); };
-    link    { PASS(block, &quot;name&quot;, &quot;link&quot;); };
-    link2   { PASS(block, &quot;name&quot;, &quot;link&quot;); };
-    img     { PASS(block, &quot;name&quot;, &quot;image&quot;); };
-    img2    { PASS(block, &quot;name&quot;, &quot;image&quot;); };
     
-    pre_tag_start     { ASET(&quot;type&quot;, &quot;notextile&quot;); rb_str_append(failed_start,rb_str_new(ts,te-ts)); fgoto pre_tag; };
-    quote_tag_start   { rb_str_append(failed_start,rb_str_new(ts,te-ts)); fgoto quote_tag; };
-    spoiler_tag_start { rb_str_append(failed_start,rb_str_new(ts,te-ts)); fgoto spoiler_tag; };
+    bb_pre_tag_start     { ASET(&quot;type&quot;, &quot;notextile&quot;); rb_str_append(failed_start,rb_str_new(ts,te-ts)); fgoto bb_pre_tag; };
+    bb_quote_tag_start   { rb_str_append(failed_start,rb_str_new(ts,te-ts)); fgoto bb_quote_tag; };
+    bb_spoiler_tag_start { rb_str_append(failed_start,rb_str_new(ts,te-ts)); fgoto bb_spoiler_tag; };
     
     other_phrase =&gt; cat;
     PUNCT =&gt; cat;</diff>
      <filename>ext/redcloth_scan/redcloth_bbcode.rl</filename>
    </modified>
    <modified>
      <diff>@@ -6,6 +6,9 @@
 %%{
 
   machine redcloth_inline;
+  
+  action bb_cat2html { CAT(html); }
+  action bb_failed4html { rb_str_append(block,failed_start); rb_str_append(block,rb_funcall(self, rb_intern(&quot;escape&quot;), 1, html)); fgoto main; }
 
   # links
   mtext_noquotes = mtext -- '&quot;' ;
@@ -88,7 +91,36 @@
   copyright = ( &quot;[&quot; cee &quot;]&quot; | &quot;(&quot; cee &quot;)&quot; ) ;
   entity = ( &quot;&amp;&quot; %A ( '#' digit+ | ( alpha ( alpha | digit )+ ) ) %T ';' ) &gt;X ;
   
-  zomgtest = &quot;&amp;&quot; (&quot;amp;&quot;|[gl]&quot;t;&quot;);
+  # bbcode
+  
+  bbchars = (default - space - &quot;]&quot; - &quot;[&quot;)+ ;
+  bbmtext = ( bbchars (mspace bbchars)* ) ;
+  
+  bb_b   = &quot;[b]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/b]&quot; ;
+  bb_i   = &quot;[i]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/i]&quot; ;
+  bb_u   = &quot;[u]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/u]&quot; ;
+  bb_s   = &quot;[s]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/s]&quot; ;
+  bb_del = &quot;[del]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/del]&quot; ;
+  bb_ins = &quot;[ins]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/ins]&quot; ;
+  bb_sub = &quot;[sub]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/sub]&quot; ;
+  bb_sup = &quot;[sup]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/sup]&quot; ;
+  bb_notextile = &quot;[notextile]&quot; &gt;X mtext &gt;A %T :&gt; &quot;[/notextile]&quot; ;
+  bb_innercolor = (&quot;#&quot;[0-9a-fA-F]{3}|&quot;#&quot;[0-9a-fA-F]{6}|&quot;aqua&quot;|&quot;black&quot;|&quot;blue&quot;|&quot;fuchsia&quot;|&quot;gray&quot;|&quot;green&quot;|&quot;lime&quot;|&quot;maroon&quot;|&quot;navy&quot;|&quot;olive&quot;|&quot;purple&quot;|&quot;red&quot;|&quot;silver&quot;|&quot;teal&quot;|&quot;white&quot;|&quot;yellow&quot;|&quot;orange&quot;|&quot;cyan&quot;|&quot;magenta&quot;|&quot;grey&quot;) %{ STORE(&quot;color&quot;); };
+  bb_color = (&quot;[color=&quot; &gt;X bb_innercolor &gt;A &quot;]&quot; mtext &gt;A %T :&gt; &quot;[/color]&quot;) ;
+  bb_innersize = space* ( (digit? &quot;.&quot;? digit{1,2} (&quot;em&quot;|&quot;pt&quot;|&quot;px&quot;|&quot;%&quot;)? )|(&quot;xx-small&quot;|&quot;x-small&quot;|&quot;small&quot;|&quot;medium&quot;|&quot;large&quot;|&quot;x-large&quot;|&quot;xx-large&quot;|&quot;smaller&quot;|&quot;larger&quot;)) %{ STORE(&quot;size&quot;); } space* ;
+  bb_size = (&quot;[size=&quot; &gt;X bb_innersize &gt;A &quot;]&quot; mtext &gt;A %T :&gt; &quot;[/size]&quot;)  ;
+  bb_inneralign = space* (&quot;left&quot;|&quot;center&quot;|&quot;right&quot;) %{ STORE(&quot;align&quot;); } space* ;
+  bb_align = (&quot;[align=&quot; &gt;X bb_inneralign &gt;A &quot;]&quot; mtext &gt;A %T :&gt; &quot;[/align]&quot;)  ;
+  bb_acronym = (&quot;[acronym=&quot; &gt;X bbmtext %{ STORE(&quot;title&quot;); } &gt;A &quot;]&quot; mtext &gt;A %T :&gt; &quot;[/acronym]&quot;) ;
+  
+  bb_link = &quot;[url]&quot; &gt;X uri %{ STORE(&quot;href&quot;); } &gt;A :&gt; &quot;[/url]&quot; ;
+  bb_link2 = &quot;[url=&quot;&gt;X uri %{ STORE(&quot;href&quot;); } &gt;A &quot;]&quot; mtext %{ STORE(&quot;name&quot;); } &gt;A :&gt; &quot;[/url]&quot; ;
+  
+  bb_img = &quot;[img]&quot; &gt;X uri %{ STORE(&quot;src&quot;); } &gt;A :&gt; &quot;[/img]&quot; ;
+  bb_img2 = &quot;[img=&quot;&gt;X uri %{ STORE(&quot;src&quot;); } &gt;A &quot;]&quot; mtext %{ STORE(&quot;title&quot;); } &gt;A :&gt; &quot;[/img]&quot; ;
+  
+  bb_pre_tag_start = &quot;[pre&quot; [^\]]* &quot;]&quot; (space* &quot;[code]&quot;)? ;
+  bb_pre_tag_end = (&quot;[/code]&quot; space*)? &quot;[/pre]&quot; LF? ;
   
   # info
   redcloth_version = &quot;[RedCloth::VERSION]&quot; ;
@@ -104,10 +136,17 @@
     bbcode_ignore_end { CAT(block); fgoto main; };
     default =&gt; cat;
   *|;
+  
+  bb_pre_tag := |*
+    bb_pre_tag_end         { rb_str_append(block,rb_str_new2(&quot;&lt;pre&gt;&lt;code&gt;&quot;)); rb_str_append(block,rb_funcall(self, rb_intern(&quot;escape_pre&quot;), 1, html)); rb_str_append(block,rb_str_new2(&quot;&lt;/code&gt;&lt;/pre&gt;&quot;)); BBDONE(); fgoto main; };
+    #LF                  { rb_str_append(html,rb_str_new2(&quot;&lt;br/&gt;&quot;)); };
+    default =&gt; bb_cat2html;
+    EOF =&gt; bb_failed4html;
+  *|;
 
   main := |*
   
-    bbcode_ignore_start =&gt; { CAT(block); fgoto bbcode_ignore; };
+    #bbcode_ignore_start =&gt; { CAT(block); fgoto bbcode_ignore; };
     
     image { UNLESS_DISABLED_INLINE(block,image,INLINE(block, &quot;image&quot;);) };
     
@@ -136,6 +175,26 @@
     quote1 { UNLESS_DISABLED_INLINE(block,quote1,PASS(block, &quot;text&quot;, &quot;quote1&quot;);) };
     quote2 { UNLESS_DISABLED_INLINE(block,quote2,PASS(block, &quot;text&quot;, &quot;quote2&quot;);) };
     multi_paragraph_quote { UNLESS_DISABLED_INLINE(block,multi_paragraph_quote,PASS(block, &quot;text&quot;, &quot;multi_paragraph_quote&quot;);) };
+
+    bb_b   { PASS(block, &quot;text&quot;, &quot;strong&quot;); };
+    bb_i   { PASS(block, &quot;text&quot;, &quot;em&quot;); };
+    bb_u   { PASS(block, &quot;text&quot;, &quot;ins&quot;); };
+    bb_s   { PASS(block, &quot;text&quot;, &quot;del&quot;); };
+    bb_del { PASS(block, &quot;text&quot;, &quot;del&quot;); };
+    bb_ins { PASS(block, &quot;text&quot;, &quot;ins&quot;); };
+    bb_sub { PASS(block, &quot;text&quot;, &quot;sub&quot;); };
+    bb_sup { PASS(block, &quot;text&quot;, &quot;sup&quot;); };
+    bb_notextile =&gt; ignore;
+    bb_color   { PASS(block, &quot;text&quot;, &quot;color&quot;); };
+    bb_size    { PASS(block, &quot;text&quot;, &quot;bbsize&quot;); };
+    bb_align   { PASS(block, &quot;text&quot;, &quot;align&quot;); };
+    bb_acronym { PASS(block, &quot;text&quot;, &quot;acronym&quot;); };
+    bb_link    { PASS(block, &quot;name&quot;, &quot;link&quot;); };
+    bb_link2   { PASS(block, &quot;name&quot;, &quot;link&quot;); };
+    bb_img     { PASS(block, &quot;name&quot;, &quot;image&quot;); };
+    bb_img2    { PASS(block, &quot;name&quot;, &quot;image&quot;); };
+    
+    bb_pre_tag_start     { ASET(&quot;type&quot;, &quot;notextile&quot;); rb_str_append(failed_start,rb_str_new(ts,te-ts)); fgoto bb_pre_tag; };
     
     ellipsis { UNLESS_DISABLED_INLINE(block,ellipsis,INLINE(block, &quot;ellipsis&quot;);) };
     emdash { UNLESS_DISABLED_INLINE(block,emdash,INLINE(block, &quot;emdash&quot;);) };</diff>
      <filename>ext/redcloth_scan/redcloth_inline.rl</filename>
    </modified>
    <modified>
      <diff>@@ -48,6 +48,9 @@ redcloth_transform(self, p, pe, refs)
   char listm[10] = &quot;&quot;;
   VALUE refs_found = rb_hash_new();
   
+  VALUE failed_start = rb_str_new2(&quot;&quot;);
+  char *failed_start_point_p = NULL, *failed_start_point_ts = NULL, *failed_start_point_te = NULL;
+  
   %% write init;
 
   %% write exec;
@@ -72,8 +75,8 @@ redcloth_transform2(self, str)
   StringValue(str);
   //str = redcloth_bbcode2(self, str, rb_hash_new());
   rb_funcall(self, rb_intern(&quot;before_transform&quot;), 1, str);
-  str = redcloth_transform(self, RSTRING_PTR(str), RSTRING_PTR(str) + RSTRING_LEN(str) + 1, Qnil); 
-  return redcloth_bbcode2(self, str, rb_hash_new());
+  //str = redcloth_transform(self, RSTRING_PTR(str), RSTRING_PTR(str) + RSTRING_LEN(str) + 1, Qnil); 
+  return redcloth_transform(self, RSTRING_PTR(str), RSTRING_PTR(str) + RSTRING_LEN(str) + 1, Qnil); 
 }
 
 /*</diff>
      <filename>ext/redcloth_scan/redcloth_scan.c.rl</filename>
    </modified>
    <modified>
      <diff>@@ -6,6 +6,9 @@
 %%{
 
   machine redcloth_scan;
+  
+  action bb_cat2html { CAT(html); }
+  action bb_failed4html { rb_str_append(block,failed_start); rb_str_append(block,rb_funcall(self, rb_intern(&quot;escape&quot;), 1, html)); fgoto main; }
 
   # blocks
   notextile_tag_start = &quot;&lt;notextile&gt;&quot; ;
@@ -68,10 +71,24 @@
   bbcode_ignore_start = &quot;[&quot; (&quot;pre&quot;|&quot;quote&quot;|&quot;spoiler&quot;);
   bbcode_ignore_end   = &quot;[/&quot; (&quot;pre&quot;|&quot;quote&quot;|&quot;spoiler&quot;) &quot;]&quot;;
   
+  bbchars = (default - space - &quot;]&quot; - &quot;[&quot;)+ ;
+  bbmtext = ( bbchars (mspace bbchars)* ) ;
+  
   bbcode_ignore := |*
     bbcode_ignore_end { CAT(block); fgoto block; };
     default =&gt; cat;
   *|;
+  
+  bb_pre_tag_start = &quot;[pre&quot; [^\]]* &quot;]&quot; (space* &quot;[code]&quot;)? ;
+  bb_pre_tag_end = (&quot;[/code]&quot; space*)? &quot;[/pre]&quot; LF? ;
+  
+  bb_quote_title = &quot; title&quot;? &quot;=&quot; bbmtext %{ STORE(&quot;cite&quot;); } &gt;A;
+  bb_quote_tag_start = (&quot;[quote&quot; bb_quote_title? &quot;]&quot;) ;
+  bb_quote_tag_end =  &quot;[/quote]&quot; LF? ;
+  
+  bb_spoiler_title = &quot; title&quot;? &quot;=&quot; bbmtext %{ STORE(&quot;title&quot;); } &gt;A;
+  bb_spoiler_tag_start = (&quot;[spoiler&quot; bb_spoiler_title? &quot;]&quot;) ;
+  bb_spoiler_tag_end =  &quot;[/spoiler]&quot; LF? ;
 
   # info
   redcloth_version = (&quot;RedCloth&quot; &gt;A (&quot;::&quot; | &quot; &quot; ) &quot;VERSION&quot;i &quot;:&quot;? &quot; &quot;)? %{STORE(&quot;prefix&quot;);} &quot;RedCloth::VERSION&quot; (LF* EOF | double_return) ;
@@ -238,8 +255,42 @@
   *|;
   
   bb_pre_tag := |*
-    pre_tag_end         { CAT(block); fgoto block; };
-    default =&gt; esc_pre;
+    bb_pre_tag_end {
+      rb_hash_aset(regs, ID2SYM(rb_intern(&quot;text&quot;)), rb_funcall(self, rb_intern(&quot;escape_pre&quot;), 1, block));
+      rb_str_append(html,rb_funcall(self, rb_intern(&quot;bb_block_pre&quot;), 1, regs));
+      extend = Qnil;
+      CLEAR(block);
+      CLEAR_REGS();
+      fgoto main;
+    };
+    default =&gt; cat;
+    EOF =&gt; { CLEAR(block); CLEAR_REGS(); RESET_TYPE(); rb_str_append(block,failed_start); p = failed_start_point_p; ts = failed_start_point_ts; te = failed_start_point_te; fgoto block; };
+  *|;
+  
+  bb_quote_tag := |*
+    bb_quote_tag_end {
+      rb_hash_aset(regs, ID2SYM(rb_intern(&quot;text&quot;)), redcloth_transform2(self,block));
+      rb_str_append(html,rb_funcall(self, rb_intern(&quot;bbquote&quot;), 1, regs));
+      extend = Qnil;
+      CLEAR(block);
+      CLEAR_REGS();
+      fgoto main;
+    };
+    default =&gt; cat;
+    EOF =&gt; { CLEAR(block); CLEAR_REGS(); RESET_TYPE(); rb_str_append(block,failed_start); p = failed_start_point_p; ts = failed_start_point_ts; te = failed_start_point_te; fgoto block; };
+  *|;
+  
+  bb_spoiler_tag := |*
+    bb_spoiler_tag_end {
+      rb_hash_aset(regs, ID2SYM(rb_intern(&quot;text&quot;)), redcloth_transform2(self,block));
+      rb_str_append(html,rb_funcall(self, rb_intern(&quot;bb_block_spoiler&quot;), 1, regs));
+      extend = Qnil;
+      CLEAR(block);
+      CLEAR_REGS();
+      fgoto main;
+    };
+    default =&gt; cat;
+    EOF =&gt; { CLEAR(block); CLEAR_REGS(); RESET_TYPE(); rb_str_append(block,failed_start); p = failed_start_point_p; ts = failed_start_point_ts; te = failed_start_point_te; fgoto block; };
   *|;
 
   block := |*
@@ -256,7 +307,7 @@
       } 
     };
     #pre_tag_start       { CAT(block); fgoto bb_pre_tag; };
-    bbcode_ignore_start =&gt; { CAT(block); fgoto bbcode_ignore; };
+    #bbcode_ignore_start =&gt; { CAT(block); fgoto bbcode_ignore; };
     double_return next_block_start { 
       if (IS_NOT_EXTENDED()) { 
         ADD_BLOCK(); 
@@ -308,6 +359,10 @@
 
   main := |*
     #bbcode_ignore_start =&gt; { CAT(block); fgoto bbcode_ignore; };
+    bb_pre_tag_start     { ASET(&quot;type&quot;, &quot;notextile&quot;); rb_str_append(failed_start,rb_str_new(ts,te-ts)); failed_start_point_p = p; failed_start_point_ts = ts; failed_start_point_te = te; fgoto bb_pre_tag; };
+    bb_quote_tag_start   { rb_str_append(failed_start,rb_str_new(ts,te-ts)); failed_start_point_p = p; failed_start_point_ts = ts; failed_start_point_te = te; fgoto bb_quote_tag; };
+    bb_spoiler_tag_start { rb_str_append(failed_start,rb_str_new(ts,te-ts)); failed_start_point_p = p; failed_start_point_ts = ts; failed_start_point_te = te; fgoto bb_spoiler_tag; };
+    
     noparagraph_line_start  { ASET(&quot;type&quot;, &quot;ignored_line&quot;); fgoto noparagraph_line; };
     notextile_tag_start { ASET(&quot;type&quot;, &quot;notextile&quot;); fgoto notextile_tag; };
     notextile_block_start { ASET(&quot;type&quot;, &quot;notextile&quot;); fgoto notextile_block; };</diff>
      <filename>ext/redcloth_scan/redcloth_scan.rl</filename>
    </modified>
    <modified>
      <diff>@@ -175,13 +175,24 @@ module RedCloth::Formatters::HTML
   def bbquote(opts)
     quote = &quot;&lt;blockquote&gt;&quot;
     quote += &quot;&lt;cite&gt;#{opts[:cite]}&lt;/cite&gt;&quot; if opts[:cite]
-    quote += opts[:text]+&quot;&lt;/blockquote&gt;&quot;
+    quote += &quot;#{opts[:text]}&lt;/blockquote&gt;\n&quot;
+  end
+  
+  def bb_block_pre(opts)
+    #quote = &quot;&lt;blockquote&gt;&quot;
+    #quote += &quot;&lt;cite&gt;#{opts[:cite]}&lt;/cite&gt;&quot; if opts[:cite]
+    #quote += opts[:text]+&quot;&lt;/blockquote&gt;\n&quot;
+    &quot;&lt;pre&gt;&lt;code&gt;#{opts[:text]}&lt;/code&gt;&lt;/pre&gt;\n&quot;
   end
   
   def bbspoiler(opts)
     &quot;&lt;span class=\&quot;spoiler\&quot; style=\&quot;color:#FFF;background:#FFF;\&quot; title=\&quot;#{opts[:title] || &quot;Show Spoiler&quot;}\&quot;&gt;#{opts[:text]}&lt;/span&gt;&quot;
   end
   
+  def bb_block_spoiler(opts)
+    &quot;&lt;div class=\&quot;spoiler_container\&quot;&gt;&lt;div class=\&quot;spoileroncontainer\&quot;&gt;&lt;button type=\&quot;button\&quot; class=\&quot;button spoileron\&quot; title=\&quot;Click to show the spoiler.\&quot;&gt;#{opts[:title] || &quot;Show Spoiler&quot;}&lt;/button&gt;&lt;/div&gt;&lt;div class=\&quot;spoiler\&quot;&gt;&lt;div class=\&quot;spoileroffcontainer\&quot;&gt;&lt;button type=\&quot;button\&quot; class=\&quot;button spoileroff\&quot; title=\&quot;Click to hide the spoiler.\&quot;&gt;hide spoiler&lt;/button&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class=\&quot;spoilertext\&quot;&gt;#{opts[:text]}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&quot;
+  end
+  
   def bbpre(opts)
     &quot;&lt;pre#{pba(opts)}&gt;&lt;code&gt;#{opts[:text]}&lt;/code&gt;&lt;/pre&gt;\n&quot;
   end</diff>
      <filename>lib/redcloth/formatters/html.rb</filename>
    </modified>
    <modified>
      <diff>@@ -106,15 +106,13 @@ in: |-
   I made a joke about your mother!
 bbcode: |-
   &lt;p&gt;Here&amp;#8217;s my code!&lt;/p&gt;
-  [pre]classZomg&lt;br /&gt;
-  include AModule&lt;br /&gt;
-  &lt;p&gt;&lt;br /&gt;&lt;br /&gt;
-    def urmom&lt;br /&gt;&lt;br /&gt;
-      p &amp;quot;is fat&amp;quot; &amp;lt;b&amp;gt;some html&amp;lt;/b&amp;gt;&lt;br /&gt;&lt;br /&gt;
-    end&lt;br /&gt;&lt;br /&gt;
-  end[/pr]&lt;br /&gt;&lt;br /&gt;
-  &lt;br /&gt;&lt;br /&gt;
-  I made a joke about your mother!&lt;/p&gt;
+  &lt;p&gt;[pre]class Zomg&lt;br /&gt;
+    include AModule&lt;/p&gt;
+  def urmom
+  p &amp;#8220;is fat&amp;#8221; &amp;lt;b&amp;gt;some html&amp;lt;/b&amp;gt;
+  end
+  &lt;p&gt;end[/pr]&lt;/p&gt;
+  &lt;p&gt;I made a joke about your mother!&lt;/p&gt;
 ---
 name: Textile does not render inside a preformatted tag
 in: |-
@@ -147,7 +145,7 @@ bbcode: '&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;test&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;'
 ---
 name: malformed quote tag
 in: '[quote][b]test[/b][/quot]'
-bbcode: '&lt;p&gt;[quote][b]test[/b][/quot]&lt;/p&gt;'
+bbcode: '&lt;p&gt;[quote]&lt;strong&gt;test&lt;/strong&gt;[/quot]&lt;/p&gt;'
 ---
 name: MrAccident's Textile List and BBCode Quote HTML Break
 in: |-
@@ -155,7 +153,12 @@ in: |-
   [quote]
 
   [/quote]
-bbcode: &quot;&lt;ul&gt;\n\t&lt;li&gt;test&lt;br /&gt;\n&lt;blockquote&gt;&lt;/blockquote&gt;&lt;/li&gt;\n&lt;/ul&gt;&quot;
+bbcode: |-
+  &lt;ul&gt;
+  	&lt;li&gt;test&lt;br /&gt;
+  [quote]&lt;/li&gt;
+  &lt;/ul&gt;
+  &lt;p&gt;[/quote]&lt;/p&gt;
 ---
 in: '[quote title=test][b]test[/b][/quote]'
 bbcode: '&lt;blockquote&gt;&lt;cite&gt;test&lt;/cite&gt;&lt;p&gt;&lt;strong&gt;test&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;'
@@ -193,7 +196,7 @@ bbcode: '&lt;p&gt;I like big sized things like &lt;span style=&quot;font-size:.7em;&quot;&gt;you know
 ---
 name: align tag
 in: '[align=center]I am a centered title![/align]'
-bbcode: '&lt;div style=&quot;text-align:center;&quot;&gt;I am a centered title!&lt;/div&gt;'
+bbcode: '&lt;p&gt;&lt;div style=&quot;text-align:center;&quot;&gt;I am a centered title!&lt;/div&gt;&lt;/p&gt;'
 ---
 name: align tag with more junk
 in: |-
@@ -201,7 +204,7 @@ in: |-
   
   Some other text
 bbcode: |-
-  &lt;div style=&quot;text-align:right;&quot;&gt;I am a righted title!&lt;/div&gt;
+  &lt;p&gt;&lt;div style=&quot;text-align:right;&quot;&gt;I am a righted title!&lt;/div&gt;&lt;/p&gt;
   &lt;p&gt;Some other text&lt;/p&gt;
 ---
 name: acronym tag
@@ -230,11 +233,11 @@ bbcode: '&lt;p&gt;Hey guys, &lt;img src=&quot;http://fangamer.com/image.jpg&quot; title=&quot;my blog&quot; a
 ---
 name: spoiler tag
 in: '[spoiler]test[/spoiler]'
-bbcode: &quot;&lt;p&gt;&lt;span class=\&quot;spoiler\&quot; style=\&quot;color:#FFF;background:#FFF;\&quot; title=\&quot;Show Spoiler\&quot;&gt;&lt;p&gt;test&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;&quot;
+bbcode: &quot;&lt;div class=\&quot;spoiler_container\&quot;&gt;&lt;div class=\&quot;spoileroncontainer\&quot;&gt;&lt;button type=\&quot;button\&quot; class=\&quot;button spoileron\&quot; title=\&quot;Click to show the spoiler.\&quot;&gt;Show Spoiler&lt;/button&gt;&lt;/div&gt;&lt;div class=\&quot;spoiler\&quot;&gt;&lt;div class=\&quot;spoileroffcontainer\&quot;&gt;&lt;button type=\&quot;button\&quot; class=\&quot;button spoileroff\&quot; title=\&quot;Click to hide the spoiler.\&quot;&gt;hide spoiler&lt;/button&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class=\&quot;spoilertext\&quot;&gt;&lt;p&gt;test&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&quot;
 ---
 name: spoiler tag with title
 in: '[spoiler=About Your Mother]She does not sit in the house, she sits AROUND the house![/spoiler]'
-bbcode: &quot;&lt;p&gt;&lt;span class=\&quot;spoiler\&quot; style=\&quot;color:#FFF;background:#FFF;\&quot; title=\&quot;About Your Mother\&quot;&gt;&lt;p&gt;She does not sit in the house, she sits AROUND the house!&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;&quot;
+bbcode: &quot;&lt;div class=\&quot;spoiler_container\&quot;&gt;&lt;div class=\&quot;spoileroncontainer\&quot;&gt;&lt;button type=\&quot;button\&quot; class=\&quot;button spoileron\&quot; title=\&quot;Click to show the spoiler.\&quot;&gt;About Your Mother&lt;/button&gt;&lt;/div&gt;&lt;div class=\&quot;spoiler\&quot;&gt;&lt;div class=\&quot;spoileroffcontainer\&quot;&gt;&lt;button type=\&quot;button\&quot; class=\&quot;button spoileroff\&quot; title=\&quot;Click to hide the spoiler.\&quot;&gt;hide spoiler&lt;/button&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class=\&quot;spoilertext\&quot;&gt;&lt;p&gt;She does not sit in the house, she sits AROUND the house!&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&quot;
 ---
 #this line requires the nasty hack because of nested HTML tags inside nested Textile
 name: spoiler tag with pre tag of code
@@ -247,13 +250,13 @@ in: |-
     end
   end[/pre][/spoiler]
 bbcode: |-
-  &lt;p&gt;&lt;span class=&quot;spoiler&quot; style=&quot;color:#FFF;background:#FFF;&quot; title=&quot;Some Ruby Code&quot;&gt;&lt;pre&gt;&lt;code&gt;class Zomg
+  &lt;div class=&quot;spoiler_container&quot;&gt;&lt;div class=&quot;spoileroncontainer&quot;&gt;&lt;button type=&quot;button&quot; class=&quot;button spoileron&quot; title=&quot;Click to show the spoiler.&quot;&gt;Some Ruby Code&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;spoiler&quot;&gt;&lt;div class=&quot;spoileroffcontainer&quot;&gt;&lt;button type=&quot;button&quot; class=&quot;button spoileroff&quot; title=&quot;Click to hide the spoiler.&quot;&gt;hide spoiler&lt;/button&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class=&quot;spoilertext&quot;&gt;&lt;pre&gt;&lt;code&gt;class Zomg
     include AModule
 
     def urmom
       p &quot;is lulz&quot; &amp;lt;b&amp;gt;some html&amp;lt;/b&amp;gt;
     end
-  end&lt;/code&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/p&gt;
+  end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
 ---
 name: quote tag with spoiler of pre tag of code
 in: |-
@@ -265,13 +268,13 @@ in: |-
     end
   end[/pre][/spoiler][/quote]
 bbcode: |-
-  &lt;blockquote&gt;&lt;cite&gt;dudeddue!&lt;/cite&gt;&lt;p&gt;&lt;span class=&quot;spoiler&quot; style=&quot;color:#FFF;background:#FFF;&quot; title=&quot;Some Ruby Code&quot;&gt;&lt;pre&gt;&lt;code&gt;class Zomg
+  &lt;blockquote&gt;&lt;cite&gt;dudeddue!&lt;/cite&gt;&lt;div class=&quot;spoiler_container&quot;&gt;&lt;div class=&quot;spoileroncontainer&quot;&gt;&lt;button type=&quot;button&quot; class=&quot;button spoileron&quot; title=&quot;Click to show the spoiler.&quot;&gt;Some Ruby Code&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;spoiler&quot;&gt;&lt;div class=&quot;spoileroffcontainer&quot;&gt;&lt;button type=&quot;button&quot; class=&quot;button spoileroff&quot; title=&quot;Click to hide the spoiler.&quot;&gt;hide spoiler&lt;/button&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class=&quot;spoilertext&quot;&gt;&lt;pre&gt;&lt;code&gt;class Zomg
     include AModule
 
     def urmom
       p &quot;is lulz&quot; &amp;lt;b&amp;gt;some html&amp;lt;/b&amp;gt;
     end
-  end&lt;/code&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;
+  end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;
 ---
 name: mixed up quote tag with spoiler of pre tag of code
 in: |-
@@ -283,10 +286,10 @@ in: |-
     end
   end[/pre][/quote][/spoiler]
 bbcode: |-
-  &lt;blockquote&gt;&lt;cite&gt;dudeddue!&lt;/cite&gt;&lt;p&gt;[spoiler=Some Ruby Code][pre]class Zomg&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
-    include AModule&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
-  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
-    def urmom&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
-      p &amp;quot;is lulz&amp;quot; &amp;lt;b&amp;gt;some html&amp;lt;/b&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
-    end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
-  end[/pre]&lt;/p&gt;&lt;p&gt;&lt;/blockquote&gt;[/spoiler]&lt;/p&gt;
\ No newline at end of file
+  &lt;blockquote&gt;&lt;cite&gt;dudeddue!&lt;/cite&gt;&lt;p&gt;[spoiler=Some Ruby Code][pre]class Zomg&lt;br /&gt;
+    include AModule&lt;/p&gt;
+  def urmom
+  p &amp;#8220;is lulz&amp;#8221; &amp;lt;b&amp;gt;some html&amp;lt;/b&amp;gt;
+  end
+  &lt;p&gt;end[/pre]&lt;/p&gt;&lt;/blockquote&gt;
+  &lt;p&gt;[/spoiler]&lt;/p&gt;
\ No newline at end of file</diff>
      <filename>test/bbcode.yml</filename>
    </modified>
    <modified>
      <diff>@@ -47,7 +47,7 @@ class TestRestrictions &lt; Test::Unit::TestCase
   end
   
   generate_formatter_tests('bbcode') do |doc|
-    RedCloth.new(doc['in'], [:bbcode]).to_html
+    RedCloth.new(doc['in'], [:bbcode,:filter_html]).to_html
   end
   
 end</diff>
      <filename>test/test_restrictions.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>9cfbaeb4a6cca267a3cb5fa88d54b4cd36d927cf</id>
    </parent>
  </parents>
  <author>
    <name>Ryan Alyea</name>
    <email>ryan@ROFISH-3.local</email>
  </author>
  <url>http://github.com/ROFISH/redcloth/commit/b067a5f75865c9b59279a64d609c7218e36a4ed4</url>
  <id>b067a5f75865c9b59279a64d609c7218e36a4ed4</id>
  <committed-date>2009-01-08T22:56:52-08:00</committed-date>
  <authored-date>2009-01-08T22:56:52-08:00</authored-date>
  <message>Converted the BBCode scripts to inside the redcloth methods for MUCH better support.</message>
  <tree>507782dd6725dc5a9da80c326b16888e71815fa7</tree>
  <committer>
    <name>Ryan Alyea</name>
    <email>ryan@ROFISH-3.local</email>
  </committer>
</commit>
