[DRE-commits] r4989 - in trunk/libbuilder-ruby/debian: . patches

Marc Dequènes duck at alioth.debian.org
Sun Mar 21 15:55:35 UTC 2010


Author: duck
Date: 2010-03-21 15:55:34 +0000 (Sun, 21 Mar 2010)
New Revision: 4989

Added:
   trunk/libbuilder-ruby/debian/patches/pre-2.2.0
   trunk/libbuilder-ruby/debian/patches/tolsen
Removed:
   trunk/libbuilder-ruby/debian/patches/ruby_1.9
Modified:
   trunk/libbuilder-ruby/debian/changelog
   trunk/libbuilder-ruby/debian/libbuilder-ruby1.8.docs
   trunk/libbuilder-ruby/debian/patches/series
   trunk/libbuilder-ruby/debian/rules
Log:
[evol/fix] new patches (fixes+ruby1.9 from tolsen, fixes from git), preliminary ruby-1.9 patch removed, build fix (DEB_RUBY_REAL_LIB_PACKAGES undeclared)

Modified: trunk/libbuilder-ruby/debian/changelog
===================================================================
--- trunk/libbuilder-ruby/debian/changelog	2010-03-21 10:10:10 UTC (rev 4988)
+++ trunk/libbuilder-ruby/debian/changelog	2010-03-21 15:55:34 UTC (rev 4989)
@@ -7,12 +7,16 @@
   * Added Vcs-* fields.
 
   [ Marc Dequènes (Duck) ]
+  * Added patches:
+    + pre-2.2.0: various fixes from git
+    + tolsen: fixes from the Tim Olsen's fork
   * Switched to dpkg-source 3.0 (quilt) format.
   * Switched to compat level 7.
   * Increased Standards-Version to 3.8.4 (no changes).
-  * Added support for Ruby 1.9.1 (with a patch from Sam Ruby).
+  * Added support for Ruby 1.9.1 (with a patch from Sam Ruby, included
+    in the tolsen patch).
 
- -- Marc Dequènes (Duck) <Duck at DuckCorp.org>  Sun, 21 Mar 2010 11:07:55 +0100
+ -- Marc Dequènes (Duck) <Duck at DuckCorp.org>  Sun, 21 Mar 2010 16:41:45 +0100
 
 libbuilder-ruby (2.1.2-1) unstable; urgency=low
 

Modified: trunk/libbuilder-ruby/debian/libbuilder-ruby1.8.docs
===================================================================
--- trunk/libbuilder-ruby/debian/libbuilder-ruby1.8.docs	2010-03-21 10:10:10 UTC (rev 4988)
+++ trunk/libbuilder-ruby/debian/libbuilder-ruby1.8.docs	2010-03-21 15:55:34 UTC (rev 4989)
@@ -1,2 +1,2 @@
-README
+README.rdoc
 doc/releases/builder-2.1.1.rdoc

Added: trunk/libbuilder-ruby/debian/patches/pre-2.2.0
===================================================================
--- trunk/libbuilder-ruby/debian/patches/pre-2.2.0	                        (rev 0)
+++ trunk/libbuilder-ruby/debian/patches/pre-2.2.0	2010-03-21 15:55:34 UTC (rev 4989)
@@ -0,0 +1,3723 @@
+Index: builder-2.1.2/builder.blurb
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/builder.blurb	2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,27 @@
++name: builder
++document: http://builder.rubyforge.org
++download: http://rubyforge.org/frs/?group_id=415
++description: >
++    <p>This package contains Builder, a simple ruby library for
++    building XML document quickly and easily.</p>
++
++    <p>Here's an example:</p>
++
++    <pre>
++      xml = Builder::XmlMarkup.new(:indent=>2)
++      xml.person {
++        xml.first_name("Jim")
++        xml.last_name("Weirich")
++      }
++      puts xml.target!
++    </pre>
++
++    <p>Produces:</p>
++    
++    <pre>
++      &lt;person&gt;
++        &lt;first_name&gt;Jim&lt;/first_name&gt;
++        &lt;last_name&gt;Weirich&lt;/last_name&gt;
++      &lt;/person&gt;
++    </pre>
++
+Index: builder-2.1.2/CHANGES
+===================================================================
+--- builder-2.1.2.orig/CHANGES	2007-06-15 07:01:59.000000000 +0200
++++ builder-2.1.2/CHANGES	2010-03-21 16:37:51.000000000 +0100
+@@ -1,12 +1,16 @@
+ = Change Log
+ 
++== Version 2.2.0
++
++* Applied patch from Thijs van der Vossen to allow UTF-8 encoded
++  output when the encoding is UTF-8 and $KCODE is UTF8.
++
+ == Version 2.1.2
+ 
+ * Fixed bug where private methods in kernel could leak through using
+   tag!().  Thanks to Hagen Overdick for finding and diagnosing this
+   bug.
+ 
+-
+ == Version 2.1.1
+ 
+ * Fixed typo in XmlMarkup class docs (ident => indent). (from Martin
+Index: builder-2.1.2/doc/jamis.rb
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/doc/jamis.rb	2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,591 @@
++module RDoc
++module Page
++
++FONTS = "\"Bitstream Vera Sans\", Verdana, Arial, Helvetica, sans-serif"
++
++STYLE = <<CSS
++a {
++  color: #00F;
++  text-decoration: none;
++}
++
++a:hover {
++  color: #77F;
++  text-decoration: underline;
++}
++
++body, td, p {
++  font-family: %fonts%;
++  background: #FFF;
++  color: #000;
++  margin: 0px;
++  font-size: small;
++}
++
++#content {
++  margin: 2em;
++}
++
++#description p {
++  margin-bottom: 0.5em;
++}
++
++.sectiontitle {
++  margin-top: 1em;
++  margin-bottom: 1em;
++  padding: 0.5em;
++  padding-left: 2em;
++  background: #005;
++  color: #FFF;
++  font-weight: bold;
++  border: 1px dotted black;
++}
++
++.attr-rw {
++  padding-left: 1em;
++  padding-right: 1em;
++  text-align: center;
++  color: #055;
++}
++
++.attr-name {
++  font-weight: bold;
++}
++
++.attr-desc {
++}
++
++.attr-value {
++  font-family: monospace;
++}
++
++.file-title-prefix {
++  font-size: large;
++}
++
++.file-title {
++  font-size: large;
++  font-weight: bold;
++  background: #005;
++  color: #FFF;
++}
++
++.banner {
++  background: #005;
++  color: #FFF;
++  border: 1px solid black;
++  padding: 1em;
++}
++
++.banner td {
++  background: transparent;
++  color: #FFF;
++}
++
++h1 a, h2 a, .sectiontitle a, .banner a {
++  color: #FF0;
++}
++
++h1 a:hover, h2 a:hover, .sectiontitle a:hover, .banner a:hover {
++  color: #FF7;
++}
++
++.dyn-source {
++  display: none;
++  background: #FFE;
++  color: #000;
++  border: 1px dotted black;
++  margin: 0.5em 2em 0.5em 2em;
++  padding: 0.5em;
++}
++
++.dyn-source .cmt {
++  color: #00F;
++  font-style: italic;
++}
++
++.dyn-source .kw {
++  color: #070;
++  font-weight: bold;
++}
++
++.method {
++  margin-left: 1em;
++  margin-right: 1em;
++  margin-bottom: 1em;
++}
++
++.description pre {
++  padding: 0.5em;
++  border: 1px dotted black;
++  background: #FFE;
++}
++
++.method .title {
++  font-family: monospace;
++  font-size: large;
++  border-bottom: 1px dashed black;
++  margin-bottom: 0.3em;
++  padding-bottom: 0.1em;
++}
++
++.method .description, .method .sourcecode {
++  margin-left: 1em;
++}
++
++.description p, .sourcecode p {
++  margin-bottom: 0.5em;
++}
++
++.method .sourcecode p.source-link {
++  text-indent: 0em;
++  margin-top: 0.5em;
++}
++
++.method .aka {
++  margin-top: 0.3em;
++  margin-left: 1em;
++  font-style: italic;
++  text-indent: 2em;
++}
++
++h1 {
++  padding: 1em;
++  border: 1px solid black;
++  font-size: x-large;
++  font-weight: bold;
++  color: #FFF;
++  background: #007;
++}
++
++h2 {
++  padding: 0.5em 1em 0.5em 1em;
++  border: 1px solid black;
++  font-size: large;
++  font-weight: bold;
++  color: #FFF;
++  background: #009;
++}
++
++h3, h4, h5, h6 {
++  padding: 0.2em 1em 0.2em 1em;
++  border: 1px dashed black;
++  color: #000;
++  background: #AAF;
++}
++
++.sourcecode > pre {
++  padding: 0.5em;
++  border: 1px dotted black;
++  background: #FFE;
++}
++
++CSS
++
++XHTML_PREAMBLE = %{<?xml version="1.0" encoding="%charset%"?>
++<!DOCTYPE html 
++     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
++     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
++}
++
++HEADER = XHTML_PREAMBLE + <<ENDHEADER
++<html>
++  <head>
++    <title>%title%</title>
++    <meta http-equiv="Content-Type" content="text/html; charset=%charset%" />
++    <link rel="stylesheet" href="%style_url%" type="text/css" media="screen" />
++
++    <script language="JavaScript" type="text/javascript">
++    // <![CDATA[
++
++        function toggleSource( id )
++        {
++          var elem
++          var link
++
++          if( document.getElementById )
++          {
++            elem = document.getElementById( id )
++            link = document.getElementById( "l_" + id )
++          }
++          else if ( document.all )
++          {
++            elem = eval( "document.all." + id )
++            link = eval( "document.all.l_" + id )
++          }
++          else
++            return false;
++
++          if( elem.style.display == "block" )
++          {
++            elem.style.display = "none"
++            link.innerHTML = "show source"
++          }
++          else
++          {
++            elem.style.display = "block"
++            link.innerHTML = "hide source"
++          }
++        }
++
++        function openCode( url )
++        {
++          window.open( url, "SOURCE_CODE", "width=400,height=400,scrollbars=yes" )
++        }
++      // ]]>
++    </script>
++  </head>
++
++  <body>
++ENDHEADER
++
++FILE_PAGE = <<HTML
++<table border='0' cellpadding='0' cellspacing='0' width="100%" class='banner'>
++  <tr><td>
++    <table width="100%" border='0' cellpadding='0' cellspacing='0'><tr>
++      <td class="file-title" colspan="2"><span class="file-title-prefix">File</span><br />%short_name%</td>
++      <td align="right">
++        <table border='0' cellspacing="0" cellpadding="2">
++          <tr>
++            <td>Path:</td>
++            <td>%full_path%
++IF:cvsurl
++				&nbsp;(<a href="%cvsurl%">CVS</a>)
++ENDIF:cvsurl
++            </td>
++          </tr>
++          <tr>
++            <td>Modified:</td>
++            <td>%dtm_modified%</td>
++          </tr>
++        </table>
++      </td></tr>
++    </table>
++  </td></tr>
++</table><br>
++HTML
++
++###################################################################
++
++CLASS_PAGE = <<HTML
++<table width="100%" border='0' cellpadding='0' cellspacing='0' class='banner'><tr>
++  <td class="file-title"><span class="file-title-prefix">%classmod%</span><br />%full_name%</td>
++  <td align="right">
++    <table cellspacing=0 cellpadding=2>
++      <tr valign="top">
++        <td>In:</td>
++        <td>
++START:infiles
++HREF:full_path_url:full_path:
++IF:cvsurl
++&nbsp;(<a href="%cvsurl%">CVS</a>)
++ENDIF:cvsurl
++END:infiles
++        </td>
++      </tr>
++IF:parent
++    <tr>
++      <td>Parent:</td>
++      <td>
++IF:par_url
++        <a href="%par_url%">
++ENDIF:par_url
++%parent%
++IF:par_url
++         </a>
++ENDIF:par_url
++     </td>
++   </tr>
++ENDIF:parent
++         </table>
++        </td>
++        </tr>
++      </table>
++HTML
++
++###################################################################
++
++METHOD_LIST = <<HTML
++  <div id="content">
++IF:diagram
++  <table cellpadding='0' cellspacing='0' border='0' width="100%"><tr><td align="center">
++    %diagram%
++  </td></tr></table>
++ENDIF:diagram
++
++IF:description
++  <div class="description">%description%</div>
++ENDIF:description
++
++IF:requires
++  <div class="sectiontitle">Required Files</div>
++  <ul>
++START:requires
++  <li>HREF:aref:name:</li>
++END:requires
++  </ul>
++ENDIF:requires
++
++IF:toc
++  <div class="sectiontitle">Contents</div>
++  <ul>
++START:toc
++  <li><a href="#%href%">%secname%</a></li>
++END:toc
++  </ul>
++ENDIF:toc
++
++IF:methods
++  <div class="sectiontitle">Methods</div>
++  <ul>
++START:methods
++  <li>HREF:aref:name:</li>
++END:methods
++  </ul>
++ENDIF:methods
++
++IF:includes
++<div class="sectiontitle">Included Modules</div>
++<ul>
++START:includes
++  <li>HREF:aref:name:</li>
++END:includes
++</ul>
++ENDIF:includes
++
++START:sections
++IF:sectitle
++<div class="sectiontitle"><a nem="%secsequence%">%sectitle%</a></div>
++IF:seccomment
++<div class="description">
++%seccomment%
++</div>
++ENDIF:seccomment
++ENDIF:sectitle
++
++IF:classlist
++  <div class="sectiontitle">Classes and Modules</div>
++  %classlist%
++ENDIF:classlist
++
++IF:constants
++  <div class="sectiontitle">Constants</div>
++  <table border='0' cellpadding='5'>
++START:constants
++  <tr valign='top'>
++    <td class="attr-name">%name%</td>
++    <td>=</td>
++    <td class="attr-value">%value%</td>
++  </tr>
++IF:desc
++  <tr valign='top'>
++    <td>&nbsp;</td>
++    <td colspan="2" class="attr-desc">%desc%</td>
++  </tr>
++ENDIF:desc
++END:constants
++  </table>
++ENDIF:constants
++
++IF:attributes
++  <div class="sectiontitle">Attributes</div>
++  <table border='0' cellpadding='5'>
++START:attributes
++  <tr valign='top'>
++    <td class='attr-rw'>
++IF:rw
++[%rw%]
++ENDIF:rw
++    </td>
++    <td class='attr-name'>%name%</td>
++    <td class='attr-desc'>%a_desc%</td>
++  </tr>
++END:attributes
++  </table>
++ENDIF:attributes
++
++IF:method_list
++START:method_list
++IF:methods
++<div class="sectiontitle">%type% %category% methods</div>
++START:methods
++<div class="method">
++  <div class="title">
++IF:callseq
++    <a name="%aref%"></a><b>%callseq%</b>
++ENDIF:callseq
++IFNOT:callseq
++    <a name="%aref%"></a><b>%name%</b>%params%
++ENDIF:callseq
++IF:codeurl
++[ <a href="javascript:openCode('%codeurl%')">source</a> ]
++ENDIF:codeurl
++  </div>
++IF:m_desc
++  <div class="description">
++  %m_desc%
++  </div>
++ENDIF:m_desc
++IF:aka
++<div class="aka">
++  This method is also aliased as
++START:aka
++  <a href="%aref%">%name%</a>
++END:aka
++</div>
++ENDIF:aka
++IF:sourcecode
++<div class="sourcecode">
++  <p class="source-link">[ <a href="javascript:toggleSource('%aref%_source')" id="l_%aref%_source">show source</a> ]</p>
++  <div id="%aref%_source" class="dyn-source">
++<pre>
++%sourcecode%
++</pre>
++  </div>
++</div>
++ENDIF:sourcecode
++</div>
++END:methods
++ENDIF:methods
++END:method_list
++ENDIF:method_list
++END:sections
++</div>
++HTML
++
++FOOTER = <<ENDFOOTER
++  </body>
++</html>
++ENDFOOTER
++
++BODY = HEADER + <<ENDBODY
++  !INCLUDE! <!-- banner header -->
++
++  <div id="bodyContent">
++    #{METHOD_LIST}
++  </div>
++
++  #{FOOTER}
++ENDBODY
++
++########################## Source code ##########################
++
++SRC_PAGE = XHTML_PREAMBLE + <<HTML
++<html>
++<head><title>%title%</title>
++<meta http-equiv="Content-Type" content="text/html; charset=%charset%">
++<style>
++.ruby-comment    { color: green; font-style: italic }
++.ruby-constant   { color: #4433aa; font-weight: bold; }
++.ruby-identifier { color: #222222;  }
++.ruby-ivar       { color: #2233dd; }
++.ruby-keyword    { color: #3333FF; font-weight: bold }
++.ruby-node       { color: #777777; }
++.ruby-operator   { color: #111111;  }
++.ruby-regexp     { color: #662222; }
++.ruby-value      { color: #662222; font-style: italic }
++  .kw { color: #3333FF; font-weight: bold }
++  .cmt { color: green; font-style: italic }
++  .str { color: #662222; font-style: italic }
++  .re  { color: #662222; }
++</style>
++</head>
++<body bgcolor="white">
++<pre>%code%</pre>
++</body>
++</html>
++HTML
++
++########################## Index ################################
++
++FR_INDEX_BODY = <<HTML
++!INCLUDE!
++HTML
++
++FILE_INDEX = XHTML_PREAMBLE + <<HTML
++<html>
++<head>
++<meta http-equiv="Content-Type" content="text/html; charset=%charset%">
++<style>
++<!--
++  body {
++    background-color: #EEE;
++    font-family: #{FONTS}; 
++    color: #000;
++    margin: 0px;
++  }
++  .banner {
++    background: #005;
++    color: #FFF;
++    padding: 0.2em;
++    font-size: small;
++    font-weight: bold;
++    text-align: center;
++  }
++  .entries {
++    margin: 0.25em 1em 0 1em;
++    font-size: x-small;
++  }
++  a {
++    color: #00F;
++    text-decoration: none;
++    white-space: nowrap;
++  }
++  a:hover {
++    color: #77F;
++    text-decoration: underline;
++  }
++-->
++</style>
++<base target="docwin">
++</head>
++<body>
++<div class="banner">%list_title%</div>
++<div class="entries">
++START:entries
++<a href="%href%">%name%</a><br>
++END:entries
++</div>
++</body></html>
++HTML
++
++CLASS_INDEX = FILE_INDEX
++METHOD_INDEX = FILE_INDEX
++
++INDEX = XHTML_PREAMBLE + <<HTML
++<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
++<head>
++  <title>%title%</title>
++  <meta http-equiv="Content-Type" content="text/html; charset=%charset%">
++</head>
++
++<frameset cols="20%,*">
++    <frameset rows="15%,35%,50%">
++        <frame src="fr_file_index.html"   title="Files" name="Files" />
++        <frame src="fr_class_index.html"  name="Classes" />
++        <frame src="fr_method_index.html" name="Methods" />
++    </frameset>
++IF:inline_source
++      <frame  src="%initial_page%" name="docwin">
++ENDIF:inline_source
++IFNOT:inline_source
++    <frameset rows="80%,20%">
++      <frame  src="%initial_page%" name="docwin">
++      <frame  src="blank.html" name="source">
++    </frameset>
++ENDIF:inline_source
++    <noframes>
++          <body bgcolor="white">
++            Click <a href="html/index.html">here</a> for a non-frames
++            version of this page.
++          </body>
++    </noframes>
++</frameset>
++
++</html>
++HTML
++
++end
++end
++
++
+Index: builder-2.1.2/.gitignore
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/.gitignore	2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,2 @@
++html
++.DS_Store
+Index: builder-2.1.2/lib/blankslate.rb
+===================================================================
+--- builder-2.1.2.orig/lib/blankslate.rb	2007-05-31 19:19:47.000000000 +0200
++++ builder-2.1.2/lib/blankslate.rb	2010-03-21 16:37:51.000000000 +0100
+@@ -36,13 +36,9 @@
+     # Redefine a previously hidden method so that it may be called on a blank
+     # slate object.
+     def reveal(name)
+-      bound_method = nil
+-      unbound_method = find_hidden_method(name)
+-      fail "Don't know how to reveal method '#{name}'" unless unbound_method
+-      define_method(name) do |*args|
+-        bound_method ||= unbound_method.bind(self)
+-        bound_method.call(*args)
+-      end
++      hidden_method = find_hidden_method(name)
++      fail "Don't know how to reveal method '#{name}'" unless hidden_method
++      define_method(name, hidden_method)
+     end
+   end
+   
+Index: builder-2.1.2/lib/builder/css.rb
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/lib/builder/css.rb	2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,250 @@
++#!/usr/bin/env ruby
++#--
++# Copyright 2004, 2005 by Jim Weirich  (jim at weirichhouse.org).
++# Copyright       2005 by Scott Barron (scott at elitists.net).
++# All rights reserved.
++#
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#
++# Much of this is taken from Jim's work in xmlbase.rb and xmlmarkup.rb.
++# Documentation has also been copied and pasted and modified to reflect
++# that we're building CSS here instead of XML.  Jim is conducting the
++# orchestra here and I'm just off in the corner playing a flute.
++#++
++
++# Provide a flexible and easy to use Builder for creating Cascading
++# Style Sheets (CSS).
++
++
++require 'builder/blankslate'
++
++module Builder
++
++  # Create a Cascading Style Sheet (CSS) using Ruby.
++  #
++  # Example usage:
++  #
++  #   css = Builder::CSS.new
++  #
++  #   text_color      = '#7F7F7F'
++  #   preferred_fonts = 'Helvetica, Arial, sans_serif'
++  #
++  #   css.comment! 'This is our stylesheet'
++  #   css.body {
++  #     background_color '#FAFAFA'
++  #     font_size        'small'
++  #     font_family      preferred_fonts
++  #     color            text_color
++  #   }
++  #
++  #   css.id!('navbar') {
++  #     width            '500px'
++  #   }
++  #
++  #   css.class!('navitem') {
++  #     color            'red'
++  #   }
++  #
++  #   css.a :hover {
++  #     text_decoration  'underline'
++  #   }
++  #
++  #   css.div(:id => 'menu') {
++  #     background       'green'
++  #   }
++  #
++  #   css.div(:class => 'foo') {
++  #     background       'red'
++  #   }
++  #
++  # This will yield the following stylesheet:
++  #
++  #   /* This is our stylesheet */
++  #   body {
++  #     background_color: #FAFAFA;
++  #     font_size:        small;
++  #     font_family:      Helvetica, Arial, sans_serif;
++  #     color:            #7F7F7F;
++  #   }
++  #
++  #   #navbar {
++  #     width:            500px;
++  #   }
++  #
++  #   .navitem {
++  #     color:            red;
++  #   }
++  #
++  #   a:hover {
++  #     text_decoration:  underline;
++  #   }
++  #
++  #   div#menu {
++  #     background:       green;
++  #   }
++  #
++  #   div.foo {
++  #     background:       red;
++  #   }
++  #
++  class CSS < BlankSlate
++    
++    # Create a CSS builder.
++    #
++    # out::     Object receiving the markup.1  +out+ must respond to
++    #           <tt><<</tt>.
++    # indent::  Number of spaces used for indentation (0 implies no
++    #           indentation and no line breaks).
++    #
++    def initialize(indent=2)
++      @indent      = indent
++      @target      = []
++      @parts       = []
++      @library     = {}
++    end
++
++    def +(part)
++      _join_with_op! '+'
++      self
++    end
++
++    def >>(part)
++      _join_with_op! ''
++      self
++    end
++
++    def >(part)
++      _join_with_op! '>'
++      self
++    end
++
++    def |(part)
++      _join_with_op! ','
++      self
++    end
++
++    # Return the target of the builder
++    def target!
++      @target * ''
++    end
++
++    # Create a comment string in the output.
++    def comment!(comment_text)
++      @target << "/* #{comment_text} */\n"
++    end
++
++    def id!(arg, &block)
++      _start_container('#'+arg.to_s, nil, block_given?)
++      _css_block(block) if block
++      _unify_block
++      self
++    end
++
++    def class!(arg, &block)
++      _start_container('.'+arg.to_s, nil, block_given?)
++      _css_block(block) if block
++      _unify_block
++      self
++    end
++
++    def store!(sym, &block)
++      @library[sym] = block.to_proc
++    end
++
++    def group!(*args, &block)
++      args.each do |arg|
++        if arg.is_a?(Symbol)
++          instance_eval(&@library[arg])
++        else
++          instance_eval(&arg)
++        end
++        _text ', ' unless arg == args.last
++      end
++      if block
++        _css_block(block)
++        _unify_block
++      end
++    end
++
++    def method_missing(sym, *args, &block)
++      sym = "#{sym}:#{args.shift}" if args.first.kind_of?(Symbol)
++      if block
++        _start_container(sym, args.first)
++        _css_block(block)
++        _unify_block
++      elsif @in_block
++        _indent
++        _css_line(sym, *args)
++        _newline
++        return self
++      else
++        _start_container(sym, args.first, false)
++        _unify_block
++      end
++      self
++    end
++
++    # "Cargo culted" from Jim who also "cargo culted" it.  See xmlbase.rb.
++    def nil?
++      false
++    end
++
++    private
++    def _unify_block
++      @target << @parts * ''
++      @parts = []
++    end
++    
++    def _join_with_op!(op)
++      rhs, lhs = @target.pop, @target.pop
++      @target << "#{lhs} #{op} #{rhs}"
++    end
++    
++    def _text(text)
++      @parts << text
++    end
++
++    def _css_block(block)
++      _newline
++      _nested_structures(block)
++      _end_container
++      _end_block
++    end
++
++    def _end_block
++      _newline
++      _newline
++    end
++    
++    def _newline
++      _text "\n"
++    end
++    
++    def _indent
++      _text ' ' * @indent
++    end
++
++    def _nested_structures(block)
++      @in_block = true
++      self.instance_eval(&block)
++      @in_block = false
++    end
++
++    def _start_container(sym, atts = {}, with_bracket = true)
++      selector = sym.to_s
++      selector << ".#{atts[:class]}" if atts && atts[:class]
++      selector << '#' + "#{atts[:id]}" if atts && atts[:id]
++      @parts << "#{selector}#{with_bracket ? ' {' : ''}"
++    end
++
++    def _end_container
++      @parts << "}"
++    end
++
++    def _css_line(sym, *args)
++      _text("#{sym.to_s.gsub('_','-')}: #{args * ' '};")
++    end
++  end
++end
+Index: builder-2.1.2/lib/builder/xchar.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/xchar.rb	2006-12-24 20:29:01.000000000 +0100
++++ builder-2.1.2/lib/builder/xchar.rb	2010-03-21 16:37:51.000000000 +0100
+@@ -10,7 +10,7 @@
+ 
+ module Builder
+   def self.check_for_name_collision(klass, method_name, defined_constant=nil)
+-    if klass.instance_methods.include?(method_name)
++    if klass.instance_methods.include?(method_name.to_s)
+       fail RuntimeError,
+ 	"Name Collision: Method '#{method_name}' is already defined in #{klass}"
+     end
+@@ -89,11 +89,13 @@
+ class Fixnum
+   XChar = Builder::XChar if ! defined?(XChar)
+ 
+-  # XML escaped version of chr
+-  def xchr
++  # XML escaped version of chr. When <tt>escape</tt> is set to false
++  # the CP1252 fix is still applied but utf-8 characters are not
++  # converted to character entities.
++  def xchr(escape=true)
+     n = XChar::CP1252[self] || self
+     case n when *XChar::VALID
+-      XChar::PREDEFINED[n] or (n<128 ? n.chr : "&##{n};")
++      XChar::PREDEFINED[n] or (n<128 ? n.chr : (escape ? "&##{n};" : [n].pack('U*')))
+     else
+       '*'
+     end
+@@ -106,9 +108,11 @@
+ # to_s.
+ #
+ class String
+-  # XML escaped version of to_s
+-  def to_xs
+-    unpack('U*').map {|n| n.xchr}.join # ASCII, UTF-8
++  # XML escaped version of to_s. When <tt>escape</tt> is set to false
++  # the CP1252 fix is still applied but utf-8 characters are not
++  # converted to character entities.
++  def to_xs(escape=true)
++    unpack('U*').map {|n| n.xchr(escape)}.join # ASCII, UTF-8
+   rescue
+     unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252
+   end
+Index: builder-2.1.2/lib/builder/xmlbase.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/xmlbase.rb	2007-06-15 07:00:31.000000000 +0200
++++ builder-2.1.2/lib/builder/xmlbase.rb	2010-03-21 16:37:51.000000000 +0100
+@@ -13,19 +13,22 @@
+ 
+     # Create an XML markup builder.
+     #
+-    # out::     Object receiving the markup.  +out+ must respond to
+-    #           <tt><<</tt>.
+-    # indent::  Number of spaces used for indentation (0 implies no
+-    #           indentation and no line breaks).
+-    # initial:: Level of initial indentation.
+-    #
+-    def initialize(indent=0, initial=0)
++    # out::      Object receiving the markup.  +out+ must respond to
++    #            <tt><<</tt>.
++    # indent::   Number of spaces used for indentation (0 implies no
++    #            indentation and no line breaks).
++    # initial::  Level of initial indentation.
++    # encoding:: When <tt>encoding</tt> and $KCODE are set to 'utf-8'
++    #            characters aren't converted to character entities in
++    #            the output stream.
++    def initialize(indent=0, initial=0, encoding='utf-8')
+       @indent = indent
+       @level  = initial
++      @encoding = encoding.downcase
+     end
+     
+     # Create a tag named +sym+.  Other than the first argument which
+-    # is the tag name, the arguements are the same as the tags
++    # is the tag name, the arguments are the same as the tags
+     # implemented via <tt>method_missing</tt>.
+     def tag!(sym, *args, &block)
+       method_missing(sym.to_sym, *args, &block)
+@@ -74,7 +77,7 @@
+     end
+ 
+     # Append text to the output target.  Escape any markup.  May be
+-    # used within the markup brakets as:
++    # used within the markup brackets as:
+     #
+     #   builder.p { |b| b.br; b.text! "HI" }   #=>  <p><br/>HI</p>
+     def text!(text)
+@@ -82,7 +85,7 @@
+     end
+     
+     # Append text to the output target without escaping any markup.
+-    # May be used within the markup brakets as:
++    # May be used within the markup brackets as:
+     #
+     #   builder.p { |x| x << "<br/>HI" }   #=>  <p><br/>HI</p>
+     #
+@@ -112,7 +115,7 @@
+     
+     require 'builder/xchar'
+     def _escape(text)
+-      text.to_xs
++      text.to_xs((@encoding != 'utf-8' or $KCODE != 'UTF8'))
+     end
+ 
+     def _escape_quote(text)
+Index: builder-2.1.2/lib/builder/xmlmarkup.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/xmlmarkup.rb	2007-02-15 22:01:48.000000000 +0100
++++ builder-2.1.2/lib/builder/xmlmarkup.rb	2010-03-21 16:37:51.000000000 +0100
+@@ -23,14 +23,14 @@
+   # Examples will demonstrate this easier than words.  In the
+   # following, +xm+ is an +XmlMarkup+ object.
+   #
+-  #   xm.em("emphasized")             # => <em>emphasized</em>
+-  #   xm.em { xmm.b("emp & bold") }   # => <em><b>emph &amp; bold</b></em>
++  #   xm.em("emphasized")            # => <em>emphasized</em>
++  #   xm.em { xm.b("emp & bold") }   # => <em><b>emph &amp; bold</b></em>
+   #   xm.a("A Link", "href"=>"http://onestepback.org")
+-  #                                   # => <a href="http://onestepback.org">A Link</a>
+-  #   xm.div { br }                    # => <div><br/></div>
++  #                                  # => <a href="http://onestepback.org">A Link</a>
++  #   xm.div { xm.br }               # => <div><br/></div>
+   #   xm.target("name"=>"compile", "option"=>"fast")
+-  #                                   # => <target option="fast" name="compile"\>
+-  #                                   # NOTE: order of attributes is not specified.
++  #                                  # => <target option="fast" name="compile"\>
++  #                                  # NOTE: order of attributes is not specified.
+   #
+   #   xm.instruct!                   # <?xml version="1.0" encoding="UTF-8"?>
+   #   xm.html {                      # <html>
+@@ -163,8 +163,9 @@
+     # option hash.
+     #
+     # :target=><em>target_object</em>::
+-    #    Object receiving the markup.  +out+ must respond to the
+-    #    <tt><<</tt> operator.  The default is a plain string target.
++    #    Object receiving the markup.  +target_object+ must respond to
++    #    the <tt><<(<em>a_string</em>)</tt> operator and return
++    #    itself.  The default target is a plain string target.
+     #    
+     # :indent=><em>indentation</em>::
+     #    Number of spaces used for indentation.  The default is no
+@@ -174,7 +175,7 @@
+     #    Amount of initial indentation (specified in levels, not
+     #    spaces).
+     #    
+-    # :escape_attrs=><b>OBSOLETE</em>::
++    # :escape_attrs=><em>OBSOLETE</em>::
+     #    The :escape_attrs option is no longer supported by builder
+     #    (and will be quietly ignored).  String attribute values are
+     #    now automatically escaped.  If you need unescaped attribute
+@@ -235,18 +236,22 @@
+     #    xml.instruct! :aaa, :bbb=>"ccc"
+     #        #=> <?aaa bbb="ccc"?>
+     #
++    # Note: If the encoding is setup to "UTF-8" and the value of
++    # $KCODE is "UTF8", then builder will emit UTF-8 encoded strings
++    # rather than the entity encoding normally used.
+     def instruct!(directive_tag=:xml, attrs={})
+       _ensure_no_block block_given?
+       if directive_tag == :xml
+         a = { :version=>"1.0", :encoding=>"UTF-8" }
+         attrs = a.merge attrs
++	@encoding = attrs[:encoding].downcase
+       end
+       _special(
+-      "<?#{directive_tag}",
+-      "?>",
+-      nil,
+-      attrs,
+-      [:version, :encoding, :standalone])
++        "<?#{directive_tag}",
++        "?>",
++        nil,
++        attrs,
++        [:version, :encoding, :standalone])
+     end
+ 
+     # Insert a CDATA section into the XML markup.
+Index: builder-2.1.2/Rakefile
+===================================================================
+--- builder-2.1.2.orig/Rakefile	2007-06-15 07:06:26.000000000 +0200
++++ builder-2.1.2/Rakefile	2010-03-21 16:37:51.000000000 +0100
+@@ -21,7 +21,7 @@
+ 
+ CLOBBER.include('pkg')
+ 
+-CURRENT_VERSION = '2.1.2'
++CURRENT_VERSION = '2.2.0'
+ PKG_VERSION = ENV['REL'] ? ENV['REL'] : CURRENT_VERSION
+ 
+ SRC_RB = FileList['lib/**/*.rb']
+@@ -49,7 +49,7 @@
+ rd = Rake::RDocTask.new("rdoc") { |rdoc|
+   rdoc.rdoc_dir = 'html'
+   rdoc.title    = "Builder for Markup"
+-  rdoc.options << '--line-numbers' << '--inline-source' << '--main' << 'README'
++  rdoc.options << '--line-numbers' << '--inline-source' << '--main' << 'README.rdoc'
+   rdoc.rdoc_files.include('lib/**/*.rb', '[A-Z]*', 'doc/**/*.rdoc')
+   rdoc.template = 'doc/jamis.rb'
+ }
+@@ -99,7 +99,7 @@
+     s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
+     s.rdoc_options <<
+       '--title' <<  'Builder -- Easy XML Building' <<
+-      '--main' << 'README' <<
++      '--main' << 'README.rdoc' <<
+       '--line-numbers'
+     
+     s.author = "Jim Weirich"
+@@ -130,7 +130,7 @@
+     s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
+     s.rdoc_options <<
+       '--title' <<  'BlankSlate -- Base Class for building proxies.' <<
+-      '--main' << 'README' <<
++      '--main' << 'README.rdoc' <<
+       '--line-numbers'
+     
+     s.author = "Jim Weirich"
+@@ -158,6 +158,40 @@
+   FileList['**/*.rb'].egrep /\bDBG|\bbreakpoint\b/
+ end
+   
++
++# RCov ---------------------------------------------------------------
++begin
++  require 'rcov/rcovtask'
++
++  Rcov::RcovTask.new do |t|
++    t.libs << "test"
++    t.rcov_opts = [
++      '-xRakefile', '--text-report'
++    ]
++    t.test_files = FileList[
++      'test/test*.rb'
++    ]
++    t.output_dir = 'coverage'
++    t.verbose = true
++  end
++rescue LoadError
++  # No rcov available
++end
++
++# Tags file ----------------------------------------------------------
++
++namespace "tags" do
++  desc "Create a TAGS file"
++  task :emacs => "TAGS"
++  
++  TAGS = 'xctags -e'
++  
++  file "TAGS" => SRC_RB do
++    puts "Makings TAGS"
++    sh "#{TAGS} #{SRC_RB}", :verbose => false
++  end
++end
++  
+ # --------------------------------------------------------------------
+ # Creating a release
+ 
+@@ -235,7 +269,7 @@
+     if ENV['RELTEST']
+       announce "Release Task Testing, skipping commiting of new version"
+     else
+-      sh %{cvs commit -m "Updated to version #{PKG_VERSION}" Rakefile}
++      sh "cvs commit -m \"Updated to version #{PKG_VERSION}\" Rakefile"
+     end
+   end
+ end
+@@ -259,5 +293,3 @@
+   fail "Unabled to write to #{dest_dir}" unless File.writable?(dest_dir)
+   install "doc/jamis.rb", dest_dir, :verbose => true
+ end
+-
+-require 'scripts/publish'
+Index: builder-2.1.2/rakelib/publish.rake
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/rakelib/publish.rake	2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,17 @@
++# Optional publish task for Rake
++
++require 'rake/contrib/sshpublisher'
++require 'rake/contrib/rubyforgepublisher'
++
++publisher = Rake::CompositePublisher.new
++publisher.add Rake::RubyForgePublisher.new('builder', 'jimweirich')
++publisher.add Rake::SshFilePublisher.new(
++  'linode',
++  'htdocs/software/builder',
++  '.',
++  'builder.blurb')
++
++desc "Publish the Documentation to RubyForge."
++task :publish => [:rdoc] do
++  publisher.upload
++end
+Index: builder-2.1.2/README
+===================================================================
+--- builder-2.1.2.orig/README	2006-12-24 20:29:01.000000000 +0100
++++ /dev/null	1970-01-01 00:00:00.000000000 +0000
+@@ -1,210 +0,0 @@
+-= Project: Builder
+-
+-== Goal
+-
+-Provide a simple way to create XML markup and data structures.
+-
+-== Classes
+-
+-Builder::XmlMarkup:: Generate XML markup notiation
+-Builder::XmlEvents:: Generate XML events (i.e. SAX-like)
+-
+-<b>Notes</b>:: 
+-
+-* An <tt>Builder::XmlTree</tt> class to generate XML tree
+-  (i.e. DOM-like) structures is also planned, but not yet implemented.
+-  Also, the events builder is currently lagging the markup builder in
+-  features.
+-
+-== Usage
+-
+-  require 'rubygems'	
+-  require_gem 'builder', '~> 2.0'
+-
+-  builder = Builder::XmlMarkup.new
+-  xml = builder.person { |b| b.name("Jim"); b.phone("555-1234") }
+-  xml #=> <person><name>Jim</name><phone>555-1234</phone></person>
+-
+-or
+-
+-  require 'rubygems'	
+-  require_gem 'builder'
+-
+-  builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)
+-  builder.person { |b| b.name("Jim"); b.phone("555-1234") }
+-  #
+-  # Prints:
+-  # <person>
+-  #   <name>Jim</name>
+-  #   <phone>555-1234</phone>
+-  # </person>
+-
+-== Compatibility
+-
+-=== Version 2.0.0 Compatibility Changes
+-
+-Version 2.0.0 introduces automatically escaped attribute values for
+-the first time.  Versions prior to 2.0.0 did not insert escape
+-characters into attribute values in the XML markup.  This allowed
+-attribute values to explicitly reference entities, which was
+-occasionally used by a small number of developers.  Since strings
+-could always be explicitly escaped by hand, this was not a major
+-restriction in functionality.
+-
+-However, it did suprise most users of builder.  Since the body text is
+-normally escaped, everybody expected the attribute values to be
+-escaped as well.  Escaped attribute values were the number one support
+-request on the 1.x Builder series.
+-
+-Starting with Builder version 2.0.0, all attribute values expressed as
+-strings will be processed and the appropriate characters will be
+-escaped (e.g. "&" will be tranlated to "&amp;").  Attribute values
+-that are expressed as Symbol values will not be processed for escaped
+-characters and will be unchanged in output. (Yes, this probably counts
+-as Symbol abuse, but the convention is convenient and flexible).
+-
+-Example:
+-
+-  xml = Builder::XmlMarkup.new
+-  xml.sample(:escaped=>"This&That", :unescaped=>:"Here&amp;There")
+-  xml.target!  =>
+-    <sample escaped="This&amp;That" unescaped="Here&amp;There"/>
+-
+-=== Version 1.0.0 Compatibility Changes
+-
+-Version 1.0.0 introduces some changes that are not backwards
+-compatible with earlier releases of builder.  The main areas of
+-incompatibility are:
+-
+-* Keyword based arguments to +new+ (rather than positional based).  It
+-  was found that a developer would often like to specify indentation
+-  without providing an explicit target, or specify a target without
+-  indentation.  Keyword based arguments handle this situation nicely.
+-
+-* Builder must now be an explicit target for markup tags.  Instead of
+-  writing
+-
+-    xml_markup = Builder::XmlMarkup.new
+-    xml_markup.div { strong("text") }
+-
+-  you need to write
+-
+-    xml_markup = Builder::XmlMarkup.new
+-    xml_markup.div { xml_markup.strong("text") }
+-
+-* The builder object is passed as a parameter to all nested markup
+-  blocks.  This allows you to create a short alias for the builder
+-  object that can be used within the block.  For example, the previous
+-  example can be written as:
+-
+-    xml_markup = Builder::XmlMarkup.new
+-    xml_markup.div { |xml| xml.strong("text") }
+-
+-* If you have both a pre-1.0 and a post-1.0 gem of builder installed,
+-  you can choose which version to use through the RubyGems
+-  +require_gem+ facility.
+-
+-    require_gem 'builder', "~> 0.0"   # Gets the old version
+-    require_gem 'builder', "~> 1.0"   # Gets the new version
+-
+-== Features
+-
+-* XML Comments are supported ...
+-
+-    xml_markup.comment! "This is a comment"
+-      #=>  <!-- This is a comment -->
+-
+-* XML processing instructions are supported ...
+-
+-    xml_markup.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
+-      #=>  <?xml version="1.0" encoding="UTF-8"?>
+-   
+-  If the processing instruction is omitted, it defaults to "xml".
+-  When the processing instruction is "xml", the defaults attributes
+-  are:
+-  
+-  <b>version</b>:: 1.0
+-  <b>encoding</b>:: "UTF-8"
+-
+-* XML entity declarations are now supported to a small degree.
+-
+-    xml_markup.declare! :DOCTYPE, :chapter, :SYSTEM, "../dtds/chapter.dtd"
+-      #=>  <!DOCTYPE chapter SYSTEM "../dtds/chapter.dtd">
+-
+-  The parameters to a declare! method must be either symbols or
+-  strings. Symbols are inserted without quotes, and strings are
+-  inserted with double quotes.  Attribute-like arguments in hashes are
+-  not allowed.
+-
+-  If you need to have an argument to declare! be inserted without
+-  quotes, but the arguement does not conform to the typical Ruby
+-  syntax for symbols, then use the :"string" form to specify a symbol.
+-
+-  For example:
+-
+-    xml_markup.declare! :ELEMENT, :chapter, :"(title,para+)"
+-      #=>  <!ELEMENT chapter (title,para+)>
+-
+-  Nested entity declarations are allowed.  For example:
+-
+-    @xml_markup.declare! :DOCTYPE, :chapter do |x|
+-      x.declare! :ELEMENT, :chapter, :"(title,para+)"
+-      x.declare! :ELEMENT, :title, :"(#PCDATA)"
+-      x.declare! :ELEMENT, :para, :"(#PCDATA)"
+-    end
+-
+-    #=>
+-
+-    <!DOCTYPE chapter [
+-      <!ELEMENT chapter (title,para+)>
+-      <!ELEMENT title (#PCDATA)>
+-      <!ELEMENT para (#PCDATA)>
+-    ]>
+-
+-* Some support for XML namespaces is now available.  If the first
+-  argument to a tag call is a symbol, it will be joined to the tag to
+-  produce a namespace:tag combination.  It is easier to show this than
+-  describe it.
+-
+-   xml.SOAP :Envelope do ... end
+-
+-  Just put a space before the colon in a namespace to produce the
+-  right form for builder (e.g. "<tt>SOAP:Envelope</tt>" =>
+-  "<tt>xml.SOAP :Envelope</tt>")
+-
+-* String attribute values are <em>now</em> escaped by default by
+-  Builder (<b>NOTE:</b> this is _new_ behavior as of version 2.0).
+-
+-  However, occasionally you need to use entities in attribute values.
+-  Using a symbols (rather than a string) for an attribute value will
+-  cause Builder to not run its quoting/escaping algorithm on that
+-  particular value.
+-
+-  (<b>Note:</b> The +escape_attrs+ option for builder is now
+-  obsolete).
+-
+-  Example:
+-
+-    xml = Builder::XmlMarkup.new
+-    xml.sample(:escaped=>"This&That", :unescaped=>:"Here&amp;There")
+-    xml.target!  =>
+-      <sample escaped="This&amp;That" unescaped="Here&amp;There"/>
+-
+-* UTF-8 Support
+-
+-  Builder correctly translates UTF-8 characters into valid XML.  (New
+-  in version 2.0.0).  Thanks to Sam Ruby for the translation code.
+-
+-  Example:
+-
+-    xml = Builder::Markup.new
+-    xml.sample("Iñtërnâtiônàl")
+-    xml.target!  =>
+-      "<sample>I&#241;t&#235;rn&#226;ti&#244;n&#224;l</sample>"
+-
+-== Contact
+-
+-Author::     Jim Weirich
+-Email::      jim at weirichhouse.org
+-Home Page::  http://onestepback.org
+-License::    MIT Licence (http://www.opensource.org/licenses/mit-license.html)
+Index: builder-2.1.2/README.rdoc
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/README.rdoc	2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,232 @@
++= Project: Builder
++
++== Goal
++
++Provide a simple way to create XML markup and data structures.
++
++== Classes
++
++Builder::XmlMarkup:: Generate XML markup notiation
++Builder::XmlEvents:: Generate XML events (i.e. SAX-like)
++
++<b>Notes</b>:: 
++
++* An <tt>Builder::XmlTree</tt> class to generate XML tree
++  (i.e. DOM-like) structures is also planned, but not yet implemented.
++  Also, the events builder is currently lagging the markup builder in
++  features.
++
++== Usage
++
++  require 'rubygems'	
++  require_gem 'builder', '~> 2.0'
++
++  builder = Builder::XmlMarkup.new
++  xml = builder.person { |b| b.name("Jim"); b.phone("555-1234") }
++  xml #=> <person><name>Jim</name><phone>555-1234</phone></person>
++
++or
++
++  require 'rubygems'	
++  require_gem 'builder'
++
++  builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)
++  builder.person { |b| b.name("Jim"); b.phone("555-1234") }
++  #
++  # Prints:
++  # <person>
++  #   <name>Jim</name>
++  #   <phone>555-1234</phone>
++  # </person>
++
++== Compatibility
++
++=== Version 2.0.0 Compatibility Changes
++
++Version 2.0.0 introduces automatically escaped attribute values for
++the first time.  Versions prior to 2.0.0 did not insert escape
++characters into attribute values in the XML markup.  This allowed
++attribute values to explicitly reference entities, which was
++occasionally used by a small number of developers.  Since strings
++could always be explicitly escaped by hand, this was not a major
++restriction in functionality.
++
++However, it did suprise most users of builder.  Since the body text is
++normally escaped, everybody expected the attribute values to be
++escaped as well.  Escaped attribute values were the number one support
++request on the 1.x Builder series.
++
++Starting with Builder version 2.0.0, all attribute values expressed as
++strings will be processed and the appropriate characters will be
++escaped (e.g. "&" will be tranlated to "&amp;").  Attribute values
++that are expressed as Symbol values will not be processed for escaped
++characters and will be unchanged in output. (Yes, this probably counts
++as Symbol abuse, but the convention is convenient and flexible).
++
++Example:
++
++  xml = Builder::XmlMarkup.new
++  xml.sample(:escaped=>"This&That", :unescaped=>:"Here&amp;There")
++  xml.target!  =>
++    <sample escaped="This&amp;That" unescaped="Here&amp;There"/>
++
++=== Version 1.0.0 Compatibility Changes
++
++Version 1.0.0 introduces some changes that are not backwards
++compatible with earlier releases of builder.  The main areas of
++incompatibility are:
++
++* Keyword based arguments to +new+ (rather than positional based).  It
++  was found that a developer would often like to specify indentation
++  without providing an explicit target, or specify a target without
++  indentation.  Keyword based arguments handle this situation nicely.
++
++* Builder must now be an explicit target for markup tags.  Instead of
++  writing
++
++    xml_markup = Builder::XmlMarkup.new
++    xml_markup.div { strong("text") }
++
++  you need to write
++
++    xml_markup = Builder::XmlMarkup.new
++    xml_markup.div { xml_markup.strong("text") }
++
++* The builder object is passed as a parameter to all nested markup
++  blocks.  This allows you to create a short alias for the builder
++  object that can be used within the block.  For example, the previous
++  example can be written as:
++
++    xml_markup = Builder::XmlMarkup.new
++    xml_markup.div { |xml| xml.strong("text") }
++
++* If you have both a pre-1.0 and a post-1.0 gem of builder installed,
++  you can choose which version to use through the RubyGems
++  +require_gem+ facility.
++
++    require_gem 'builder', "~> 0.0"   # Gets the old version
++    require_gem 'builder', "~> 1.0"   # Gets the new version
++
++== Features
++
++* XML Comments are supported ...
++
++    xml_markup.comment! "This is a comment"
++      #=>  <!-- This is a comment -->
++
++* XML processing instructions are supported ...
++
++    xml_markup.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
++      #=>  <?xml version="1.0" encoding="UTF-8"?>
++   
++  If the processing instruction is omitted, it defaults to "xml".
++  When the processing instruction is "xml", the defaults attributes
++  are:
++  
++  <b>version</b>:: 1.0
++  <b>encoding</b>:: "UTF-8"
++
++  (NOTE: if the encoding is set to "UTF-8" and $KCODE is set to
++  "UTF8", then Builder will emit UTF-8 encoded strings rather than
++  encoding non-ASCII characters as entities.)
++
++* XML entity declarations are now supported to a small degree.
++
++    xml_markup.declare! :DOCTYPE, :chapter, :SYSTEM, "../dtds/chapter.dtd"
++      #=>  <!DOCTYPE chapter SYSTEM "../dtds/chapter.dtd">
++
++  The parameters to a declare! method must be either symbols or
++  strings. Symbols are inserted without quotes, and strings are
++  inserted with double quotes.  Attribute-like arguments in hashes are
++  not allowed.
++
++  If you need to have an argument to declare! be inserted without
++  quotes, but the arguement does not conform to the typical Ruby
++  syntax for symbols, then use the :"string" form to specify a symbol.
++
++  For example:
++
++    xml_markup.declare! :ELEMENT, :chapter, :"(title,para+)"
++      #=>  <!ELEMENT chapter (title,para+)>
++
++  Nested entity declarations are allowed.  For example:
++
++    @xml_markup.declare! :DOCTYPE, :chapter do |x|
++      x.declare! :ELEMENT, :chapter, :"(title,para+)"
++      x.declare! :ELEMENT, :title, :"(#PCDATA)"
++      x.declare! :ELEMENT, :para, :"(#PCDATA)"
++    end
++
++    #=>
++
++    <!DOCTYPE chapter [
++      <!ELEMENT chapter (title,para+)>
++      <!ELEMENT title (#PCDATA)>
++      <!ELEMENT para (#PCDATA)>
++    ]>
++
++* Some support for XML namespaces is now available.  If the first
++  argument to a tag call is a symbol, it will be joined to the tag to
++  produce a namespace:tag combination.  It is easier to show this than
++  describe it.
++
++   xml.SOAP :Envelope do ... end
++
++  Just put a space before the colon in a namespace to produce the
++  right form for builder (e.g. "<tt>SOAP:Envelope</tt>" =>
++  "<tt>xml.SOAP :Envelope</tt>")
++
++* String attribute values are <em>now</em> escaped by default by
++  Builder (<b>NOTE:</b> this is _new_ behavior as of version 2.0).
++
++  However, occasionally you need to use entities in attribute values.
++  Using a symbols (rather than a string) for an attribute value will
++  cause Builder to not run its quoting/escaping algorithm on that
++  particular value.
++
++  (<b>Note:</b> The +escape_attrs+ option for builder is now
++  obsolete).
++
++  Example:
++
++    xml = Builder::XmlMarkup.new
++    xml.sample(:escaped=>"This&That", :unescaped=>:"Here&amp;There")
++    xml.target!  =>
++      <sample escaped="This&amp;That" unescaped="Here&amp;There"/>
++
++* UTF-8 Support
++
++  Builder correctly translates UTF-8 characters into valid XML.  (New
++  in version 2.0.0).  Thanks to Sam Ruby for the translation code.
++
++  Example:
++
++    xml = Builder::Markup.new
++    xml.sample("Iñtërnâtiônàl")
++    xml.target!  =>
++      "<sample>I&#241;t&#235;rn&#226;ti&#244;n&#224;l</sample>"
++
++  You can get UTF-8 encoded output by making sure that the XML
++  encoding is set to "UTF-8" and that the $KCODE variable is set to
++  "UTF8".
++
++    $KCODE = 'UTF8'
++    xml = Builder::Markup.new
++    xml.instruct!(:xml, :encoding => "UTF-8")
++    xml.sample("Iñtërnâtiônàl")
++    xml.target!  =>
++      "<sample>Iñtërnâtiônàl</sample>"
++
++== Links
++
++Documents::      http://builder.rubyforge.org/
++Github Clone::   git://github.com/jimweirich/builder.git
++Issue Tracking:: http://www.pivotaltracker.com/projects/29210
++Bug Reports::    http://onestepback.org/cgi-bin/bugs.cgi?project=builder
++
++== Contact
++
++Author::         Jim Weirich
++Email::          jim at weirichhouse.org
++Home Page::      http://onestepback.org
++License::        MIT Licence (http://www.opensource.org/licenses/mit-license.html)
+Index: builder-2.1.2/scripts/publish.rb
+===================================================================
+--- builder-2.1.2.orig/scripts/publish.rb	2006-12-24 20:29:01.000000000 +0100
++++ /dev/null	1970-01-01 00:00:00.000000000 +0000
+@@ -1,17 +0,0 @@
+-# Optional publish task for Rake
+-
+-require 'rake/contrib/sshpublisher'
+-require 'rake/contrib/rubyforgepublisher'
+-
+-publisher = Rake::CompositePublisher.new
+-publisher.add Rake::RubyForgePublisher.new('builder', 'jimweirich')
+-publisher.add Rake::SshFilePublisher.new(
+-  'umlcoop',
+-  'htdocs/software/builder',
+-  '.',
+-  'builder.blurb')
+-
+-desc "Publish the Documentation to RubyForge."
+-task :publish => [:rdoc] do
+-  publisher.upload
+-end
+Index: builder-2.1.2/TAGS
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/TAGS	2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,96 @@
++
++lib/blankslate.rb,455
++class BlankSlateBlankSlate17,621
++    def hide(name)hide22,788
++    def find_hidden_method(name)find_hidden_method31,1032
++    def reveal(name)reveal38,1268
++module KernelKernel55,1902
++    def method_added(name)method_added61,2078
++class ObjectObject73,2357
++    def method_added(name)method_added79,2532
++    def find_hidden_method(name)find_hidden_method86,2693
++class ModuleModule99,3124
++  def append_features(mod)append_features101,3197
++
++lib/builder/blankslate.rb,30
++module BuilderBuilder18,555
++
++lib/builder/css.rb,1102
++module BuilderBuilder23,757
++  class CSS < BlankSlateCSS92,2139
++    def initialize(indent=2)initialize101,2424
++    def +(part)+108,2562
++    def >>(part)>>113,2623
++    def >(part)>118,2684
++    def |(part)|123,2745
++    def target!target!129,2845
++    def comment!(comment_text)comment!134,2934
++    def id!(arg, &block)id!138,3017
++    def class!(arg, &block)class!145,3170
++    def store!(sym, &block)store!152,3326
++    def group!(*args, &block)group!156,3399
++    def method_missing(sym, *args, &block)method_missing171,3712
++    def nil?nil?190,4216
++    def _unify_block_unify_block195,4262
++    def _join_with_op!(op)_join_with_op!200,4343
++    def _text(text)_text205,4464
++    def _css_block(block)_css_block209,4514
++    def _end_block_end_block216,4634
++    def _newline_newline221,4696
++    def _indent_indent225,4743
++    def _nested_structures(block)_nested_structures229,4794
++    def _start_container(sym, atts = {}, with_bracket = true)_start_container235,4917
++    def _end_container_end_container242,5192
++    def _css_line(sym, *args)_css_line246,5244
++
++lib/builder/xchar.rb,342
++module BuilderBuilder11,321
++  def self.check_for_name_collision(klass, method_name, defined_constant=nil)check_for_name_collision12,336
++module BuilderBuilder26,798
++  module XChar # :nodoc:XChar32,997
++class FixnumFixnum89,2948
++  def xchr(escape=true)xchr95,3179
++class StringString110,3542
++  def to_xs(escape=true)to_xs114,3727
++
++lib/builder/xmlbase.rb,639
++module BuilderBuilder5,51
++  class IllegalBlockError < RuntimeError; endIllegalBlockError8,97
++  class XmlBase < BlankSlateXmlBase12,264
++    def initialize(indent=0, initial=0, encoding='utf-8')initialize24,777
++    def tag!(sym, *args, &block)tag!33,1109
++    def method_missing(sym, *args, &block)method_missing40,1366
++    def text!(text)text!83,2417
++    def <<(text)<<100,3077
++    def nil?nil?110,3508
++    def _escape(text)_escape117,3587
++    def _escape_quote(text)_escape_quote121,3679
++    def _newline_newline125,3768
++    def _indent_indent130,3844
++    def _nested_structures(block)_nested_structures135,3955
++
++lib/builder/xmlevents.rb,216
++module BuilderBuilder14,315
++  class XmlEvents < XmlMarkupXmlEvents48,1598
++    def text!(text)text!49,1628
++    def _start_tag(sym, attrs, end_too=false)_start_tag53,1682
++    def _end_tag(sym)_end_tag58,1804
++
++lib/builder/xmlmarkup.rb,776
++module BuilderBuilder16,425
++  class XmlMarkup < XmlBaseXmlMarkup160,5942
++    def initialize(options={})initialize186,7059
++    def target!target!194,7284
++    def comment!(comment_text)comment!198,7323
++    def declare!(inst, *args, &block)declare!209,7619
++    def instruct!(directive_tag=:xml, attrs={})instruct!242,8497
++    def cdata!(text)cdata!264,9081
++    def _text(text)_text275,9405
++    def _special(open, close, data=nil, attrs=nil, order=[])_special280,9495
++    def _start_tag(sym, attrs, end_too=false)_start_tag291,9829
++    def _end_tag(sym)_end_tag299,10028
++    def _insert_attributes(attrs, order=[])_insert_attributes304,10137
++    def _attr_value(value)_attr_value315,10452
++    def _ensure_no_block(got_block)_ensure_no_block324,10597
++
++lib/builder.rb,0
+Index: builder-2.1.2/test/performance.rb
+===================================================================
+--- builder-2.1.2.orig/test/performance.rb	2006-12-24 20:29:01.000000000 +0100
++++ builder-2.1.2/test/performance.rb	2010-03-21 16:37:51.000000000 +0100
+@@ -1,5 +1,15 @@
+ #!/usr/bin/env ruby
+ 
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
+ require 'builder/xmlmarkup'
+ require 'benchmark'
+ 
+Index: builder-2.1.2/test/preload.rb
+===================================================================
+--- builder-2.1.2.orig/test/preload.rb	2006-12-24 20:29:01.000000000 +0100
++++ builder-2.1.2/test/preload.rb	2010-03-21 16:37:51.000000000 +0100
+@@ -1,5 +1,15 @@
+ #!/usr/bin/env ruby
+ 
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
+ # We are defining method_added in Kernel and Object so that when
+ # BlankSlate overrides them later, we can verify that it correctly
+ # calls the older hooks.
+Index: builder-2.1.2/test/test_blankslate.rb
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/test/test_blankslate.rb	2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,218 @@
++#!/usr/bin/env ruby
++
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
++require 'test/unit'
++require 'test/preload'
++require 'builder/blankslate'
++require 'stringio'
++
++# Methods to be introduced into the Object class late.
++module LateObject
++  def late_object
++    33
++  end
++  def LateObject.included(mod)
++    # Modules defining an included method should not prevent blank
++    # slate erasure!
++  end
++end
++
++# Methods to be introduced into the Kernel module late.
++module LateKernel
++  def late_kernel
++    44
++  end
++  def LateKernel.included(mod)
++    # Modules defining an included method should not prevent blank
++    # slate erasure!
++  end
++end
++
++# Introduce some late methods (both module and direct) into the Kernel
++# module.
++module Kernel
++  include LateKernel
++
++  def late_addition
++    1234
++  end
++
++  def double_late_addition
++    11
++  end
++
++  def double_late_addition
++    22
++  end
++end
++
++
++# Introduce some late methods (both module and direct) into the Object
++# class.
++class Object 
++  include LateObject
++  def another_late_addition
++    4321
++  end
++end
++
++# Introduce some late methods by inclusion.
++module GlobalModule
++ def global_inclusion
++   42
++ end
++end
++include GlobalModule
++
++def direct_global
++  43
++end
++
++######################################################################
++# Test case for blank slate.
++#
++class TestBlankSlate < Test::Unit::TestCase
++  def setup
++    @bs = BlankSlate.new
++  end
++
++  def test_undefined_methods_remain_undefined
++    assert_raise(NoMethodError) { @bs.no_such_method }
++    assert_raise(NoMethodError) { @bs.nil? }
++  end
++
++
++  # NOTE: NameError is acceptable because the lack of a '.' means that
++  # Ruby can't tell if it is a method or a local variable.
++  def test_undefined_methods_remain_undefined_during_instance_eval
++    assert_raise(NoMethodError, NameError)  do
++      @bs.instance_eval do nil? end
++    end
++    assert_raise(NoMethodError, NameError)  do
++      @bs.instance_eval do no_such_method end
++    end
++  end
++
++  def test_private_methods_are_undefined
++    assert_raise(NoMethodError) do
++      @bs.puts "HI"
++    end
++  end
++  
++  def test_targetted_private_methods_are_undefined_during_instance_eval
++    assert_raise(NoMethodError, NameError) do
++      @bs.instance_eval do self.puts "HI" end
++    end
++  end
++  
++  def test_untargetted_private_methods_are_defined_during_instance_eval
++    oldstdout = $stdout
++    $stdout = StringIO.new
++    @bs.instance_eval do 
++      puts "HI"
++    end
++  ensure
++    $stdout = oldstdout
++  end
++  
++  def test_methods_added_late_to_kernel_remain_undefined
++    assert_equal 1234, nil.late_addition
++    assert_raise(NoMethodError) { @bs.late_addition }
++  end
++
++  def test_methods_added_late_to_object_remain_undefined
++    assert_equal 4321, nil.another_late_addition
++    assert_raise(NoMethodError) { @bs.another_late_addition }
++  end
++  
++  def test_methods_added_late_to_global_remain_undefined
++    assert_equal 42, global_inclusion
++    assert_raise(NoMethodError) { @bs.global_inclusion }
++  end
++
++  def test_preload_method_added
++    assert Kernel.k_added_names.include?(:late_addition)
++    assert Object.o_added_names.include?(:another_late_addition)
++  end
++
++  def test_method_defined_late_multiple_times_remain_undefined
++    assert_equal 22, nil.double_late_addition
++    assert_raise(NoMethodError) { @bs.double_late_addition }
++  end
++
++  def test_late_included_module_in_object_is_ok
++    assert_equal 33, 1.late_object
++    assert_raise(NoMethodError) { @bs.late_object }
++  end
++
++  def test_late_included_module_in_kernel_is_ok
++    assert_raise(NoMethodError) { @bs.late_kernel }
++  end
++
++  def test_revealing_previously_hidden_methods_are_callable
++    with_to_s = Class.new(BlankSlate) do
++      reveal :to_s
++    end
++    assert_match /^#<.*>$/, with_to_s.new.to_s
++  end
++
++  def test_revealing_previously_hidden_methods_are_callable_with_block
++    Object.class_eval <<-EOS
++      def given_block(&block)
++        block
++      end   
++    EOS
++  
++    with_given_block = Class.new(BlankSlate) do
++      reveal :given_block
++    end
++    assert_not_nil with_given_block.new.given_block {}
++  end
++
++  def test_revealing_a_hidden_method_twice_is_ok
++    with_to_s = Class.new(BlankSlate) do
++      reveal :to_s
++      reveal :to_s
++    end
++    assert_match /^#<.*>$/, with_to_s.new.to_s
++  end
++
++  def test_revealing_unknown_hidden_method_is_an_error
++    assert_raises(RuntimeError) do
++      Class.new(BlankSlate) do
++        reveal :xyz
++      end
++    end
++  end
++
++  def test_global_includes_still_work
++    assert_nothing_raised do
++      assert_equal 42, global_inclusion
++      assert_equal 42, Object.new.global_inclusion
++      assert_equal 42, "magic number".global_inclusion
++      assert_equal 43, direct_global
++    end
++  end
++
++  def test_reveal_should_not_bind_to_an_instance
++    with_object_id = Class.new(BlankSlate) do
++      reveal(:object_id)
++    end
++
++    obj1 = with_object_id.new
++    obj2 = with_object_id.new
++
++    assert obj1.object_id != obj2.object_id, 
++       "Revealed methods should not be bound to a particular instance"
++  end
++end
++
+Index: builder-2.1.2/test/testblankslate.rb
+===================================================================
+--- builder-2.1.2.orig/test/testblankslate.rb	2007-05-31 19:19:46.000000000 +0200
++++ /dev/null	1970-01-01 00:00:00.000000000 +0000
+@@ -1,183 +0,0 @@
+-#!/usr/bin/env ruby
+-
+-require 'test/unit'
+-require 'test/preload'
+-require 'builder/blankslate'
+-require 'stringio'
+-
+-# Methods to be introduced into the Object class late.
+-module LateObject
+-  def late_object
+-    33
+-  end
+-  def LateObject.included(mod)
+-    # Modules defining an included method should not prevent blank
+-    # slate erasure!
+-  end
+-end
+-
+-# Methods to be introduced into the Kernel module late.
+-module LateKernel
+-  def late_kernel
+-    44
+-  end
+-  def LateKernel.included(mod)
+-    # Modules defining an included method should not prevent blank
+-    # slate erasure!
+-  end
+-end
+-
+-# Introduce some late methods (both module and direct) into the Kernel
+-# module.
+-module Kernel
+-  include LateKernel
+-
+-  def late_addition
+-    1234
+-  end
+-
+-  def double_late_addition
+-    11
+-  end
+-
+-  def double_late_addition
+-    22
+-  end
+-end
+-
+-
+-# Introduce some late methods (both module and direct) into the Object
+-# class.
+-class Object 
+-  include LateObject
+-  def another_late_addition
+-    4321
+-  end
+-end
+-
+-# Introduce some late methods by inclusion.
+-module GlobalModule
+- def global_inclusion
+-   42
+- end
+-end
+-include GlobalModule
+-
+-def direct_global
+-  43
+-end
+-
+-######################################################################
+-# Test case for blank slate.
+-#
+-class TestBlankSlate < Test::Unit::TestCase
+-  def setup
+-    @bs = BlankSlate.new
+-  end
+-
+-  def test_undefined_methods_remain_undefined
+-    assert_raise(NoMethodError) { @bs.no_such_method }
+-    assert_raise(NoMethodError) { @bs.nil? }
+-  end
+-
+-
+-  # NOTE: NameError is acceptable because the lack of a '.' means that
+-  # Ruby can't tell if it is a method or a local variable.
+-  def test_undefined_methods_remain_undefined_during_instance_eval
+-    assert_raise(NoMethodError, NameError)  do
+-      @bs.instance_eval do nil? end
+-    end
+-    assert_raise(NoMethodError, NameError)  do
+-      @bs.instance_eval do no_such_method end
+-    end
+-  end
+-
+-  def test_private_methods_are_undefined
+-    assert_raise(NoMethodError) do
+-      @bs.puts "HI"
+-    end
+-  end
+-  
+-  def test_targetted_private_methods_are_undefined_during_instance_eval
+-    assert_raise(NoMethodError, NameError) do
+-      @bs.instance_eval do self.puts "HI" end
+-    end
+-  end
+-  
+-  def test_untargetted_private_methods_are_defined_during_instance_eval
+-    oldstdout = $stdout
+-    $stdout = StringIO.new
+-    @bs.instance_eval do 
+-      puts "HI"
+-    end
+-  ensure
+-    $stdout = oldstdout
+-  end
+-  
+-  def test_methods_added_late_to_kernel_remain_undefined
+-    assert_equal 1234, nil.late_addition
+-    assert_raise(NoMethodError) { @bs.late_addition }
+-  end
+-
+-  def test_methods_added_late_to_object_remain_undefined
+-    assert_equal 4321, nil.another_late_addition
+-    assert_raise(NoMethodError) { @bs.another_late_addition }
+-  end
+-  
+-  def test_methods_added_late_to_global_remain_undefined
+-    assert_equal 42, global_inclusion
+-    assert_raise(NoMethodError) { @bs.global_inclusion }
+-  end
+-
+-  def test_preload_method_added
+-    assert Kernel.k_added_names.include?(:late_addition)
+-    assert Object.o_added_names.include?(:another_late_addition)
+-  end
+-
+-  def test_method_defined_late_multiple_times_remain_undefined
+-    assert_equal 22, nil.double_late_addition
+-    assert_raise(NoMethodError) { @bs.double_late_addition }
+-  end
+-
+-  def test_late_included_module_in_object_is_ok
+-    assert_equal 33, 1.late_object
+-    assert_raise(NoMethodError) { @bs.late_object }
+-  end
+-
+-  def test_late_included_module_in_kernel_is_ok
+-    assert_raise(NoMethodError) { @bs.late_kernel }
+-  end
+-
+-  def test_revealing_previously_hidden_methods_are_callable
+-    with_to_s = Class.new(BlankSlate) do
+-      reveal :to_s
+-    end
+-    assert_match /^#<.*>$/, with_to_s.new.to_s
+-  end
+-
+-  def test_revealing_a_hidden_method_twice_is_ok
+-    with_to_s = Class.new(BlankSlate) do
+-      reveal :to_s
+-      reveal :to_s
+-    end
+-    assert_match /^#<.*>$/, with_to_s.new.to_s
+-  end
+-
+-  def test_revealing_unknown_hidden_method_is_an_error
+-    assert_raises(RuntimeError) do
+-      Class.new(BlankSlate) do
+-        reveal :xyz
+-      end
+-    end
+-  end
+-
+-  def test_global_includes_still_work
+-    assert_nothing_raised do
+-      assert_equal 42, global_inclusion
+-      assert_equal 42, Object.new.global_inclusion
+-      assert_equal 42, "magic number".global_inclusion
+-      assert_equal 43, direct_global
+-    end
+-  end
+-end
+-
+Index: builder-2.1.2/test/test_cssbuilder.rb
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/test/test_cssbuilder.rb	2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,125 @@
++#!/usr/bin/env ruby
++
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
++require 'test/unit'
++require 'test/preload'
++require 'builder'
++require 'builder/css'
++
++class TestCSS < Test::Unit::TestCase
++  def setup
++    @css = Builder::CSS.new
++  end
++
++  def test_create
++    assert_not_nil @css
++  end
++
++  def test_no_block
++    @css.body
++    assert_equal 'body', @css.target!
++  end
++
++  def test_block
++    @css.body {
++      color 'green'
++    }
++    assert_equal "body {\n  color: green;\n}\n\n", @css.target!
++  end
++    
++  def test_id
++    @css.id!('nav') { color 'green' }
++    assert_equal "#nav {\n  color: green;\n}\n\n", @css.target!
++  end
++
++  def test_class
++    @css.class!('nav') { color 'green' }
++    assert_equal ".nav {\n  color: green;\n}\n\n", @css.target!
++  end
++
++  def test_elem_with_id
++    @css.div(:id => 'nav') { color 'green' }
++    assert_equal "div#nav {\n  color: green;\n}\n\n", @css.target!
++  end
++
++  def test_elem_with_class
++    @css.div(:class => 'nav') { color 'green' }
++    assert_equal "div.nav {\n  color: green;\n}\n\n", @css.target!
++  end
++
++  def test_comment
++    @css.comment!('foo')
++    assert_equal "/* foo */\n", @css.target!
++  end
++
++  def test_selector
++    @css.a(:hover) { color 'green' }
++    assert_equal "a:hover {\n  color: green;\n}\n\n", @css.target!
++  end
++
++  def test_plus
++    @css.h1 + @css.span
++    assert_equal "h1 + span", @css.target!
++  end
++
++  def test_plus_with_block
++    @css.h1 + @css.span { color 'green' }
++    assert_equal "h1 + span {\n  color: green;\n}\n\n", @css.target!
++  end
++
++  def test_contextual
++    @css.h1 >> @css.span
++    assert_equal "h1  span", @css.target!
++  end
++
++  def test_contextual_with_block
++    @css.h1 >> @css.span { color 'green' }
++    assert_equal "h1  span {\n  color: green;\n}\n\n", @css.target!
++  end
++
++  def test_child
++    @css.h1 > @css.span
++    assert_equal "h1 > span", @css.target!
++  end
++
++  def test_child_with_block
++    @css.h1 > @css.span { color 'green' }
++    assert_equal "h1 > span {\n  color: green;\n}\n\n", @css.target!
++  end
++
++  def test_multiple_op
++    @css.h1 + @css.span + @css.span
++    assert_equal "h1 + span + span", @css.target!
++  end
++
++  def test_all
++    @css.h1 | @css.h2 { color 'green' }
++    assert_equal "h1 , h2 {\n  color: green;\n}\n\n", @css.target!
++  end
++
++  def test_all_with_atts
++    @css.h1(:class => 'foo') | @css.h2(:class => 'bar') { color 'green' }
++    assert_equal "h1.foo , h2.bar {\n  color: green;\n}\n\n", @css.target!
++  end
++
++  def test_multiple_basic
++    @css.body { color 'green' }
++    @css.h1   { color 'green' }
++    assert_equal "body {\n  color: green;\n}\n\nh1 {\n  color: green;\n}\n\n", @css.target!
++  end
++
++  def test_multiple_ops
++    @css.body { color 'green' }
++    @css.body > @css.h1 { color 'green' }
++    assert_equal "body {\n  color: green;\n}\n\nbody > h1 {\n  color: green;\n}\n\n", @css.target!
++  end
++end
+Index: builder-2.1.2/test/test_eventbuilder.rb
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/test/test_eventbuilder.rb	2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,150 @@
++#!/usr/bin/env ruby
++
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
++require 'test/unit'
++require 'test/preload'
++require 'builder'
++require 'builder/xmlevents'
++
++class TestEvents < Test::Unit::TestCase
++
++  class Target
++    attr_reader :events
++
++    def initialize
++      @events = []
++    end
++
++    def start_tag(tag, attrs)
++      @events << [:start_tag, tag, attrs]
++    end
++
++    def end_tag(tag)
++      @events << [:end_tag, tag]
++    end
++    
++    def text(string)
++      @events << [:text, string]
++    end
++    
++  end
++
++
++  def setup
++    @target = Target.new
++    @xml = Builder::XmlEvents.new(:target=>@target)
++  end
++
++  def test_simple
++    @xml.one
++    expect [:start_tag, :one, nil]
++    expect [:end_tag, :one]
++    expect_done
++  end
++
++  def test_nested
++    @xml.one { @xml.two }
++    expect [:start_tag, :one, nil]
++    expect [:start_tag, :two, nil]
++    expect [:end_tag, :two]
++    expect [:end_tag, :one]
++    expect_done
++  end
++
++  def test_text
++    @xml.one("a")
++    expect [:start_tag, :one, nil]
++    expect [:text, "a"]
++    expect [:end_tag, :one]
++    expect_done
++  end
++
++  def test_special_text
++    @xml.one("H&R")
++    expect [:start_tag, :one, nil]
++    expect [:text, "H&R"]
++    expect [:end_tag, :one]
++    expect_done
++  end
++
++  def test_text_with_entity
++    @xml.one("H&amp;R")
++    expect [:start_tag, :one, nil]
++    expect [:text, "H&amp;R"]
++    expect [:end_tag, :one]
++    expect_done
++  end
++
++  def test_attributes
++    @xml.a(:b=>"c", :x=>"y")
++    expect [:start_tag, :a, {:x => "y", :b => "c"}]
++    expect [:end_tag, :a]
++    expect_done
++  end
++
++  def test_moderately_complex
++    @xml.tag! "address-book" do |x|
++      x.entry :id=>"1" do
++	x.name {
++	  x.first "Bill"
++	  x.last "Smith"
++	}
++	x.address "Cincinnati"
++      end
++      x.entry :id=>"2" do
++	x.name {
++	  x.first "John"
++	  x.last "Doe"
++	}
++	x.address "Columbus"
++      end
++    end
++    expect [:start_tag, "address-book".intern, nil]
++    expect [:start_tag, :entry, {:id => "1"}]
++    expect [:start_tag, :name, nil]
++    expect [:start_tag, :first, nil]
++    expect [:text, "Bill"]
++    expect [:end_tag, :first]
++    expect [:start_tag, :last, nil]
++    expect [:text, "Smith"]
++    expect [:end_tag, :last]
++    expect [:end_tag, :name]
++    expect [:start_tag, :address, nil]
++    expect [:text, "Cincinnati"]
++    expect [:end_tag, :address]
++    expect [:end_tag, :entry]
++    expect [:start_tag, :entry, {:id => "2"}]
++    expect [:start_tag, :name, nil]
++    expect [:start_tag, :first, nil]
++    expect [:text, "John"]
++    expect [:end_tag, :first]
++    expect [:start_tag, :last, nil]
++    expect [:text, "Doe"]
++    expect [:end_tag, :last]
++    expect [:end_tag, :name]
++    expect [:start_tag, :address, nil]
++    expect [:text, "Columbus"]
++    expect [:end_tag, :address]
++    expect [:end_tag, :entry]
++    expect [:end_tag, "address-book".intern]
++    expect_done
++  end
++
++  def expect(value)
++    assert_equal value, @target.events.shift
++  end
++
++  def expect_done
++    assert_nil @target.events.shift
++  end
++
++end
+Index: builder-2.1.2/test/testeventbuilder.rb
+===================================================================
+--- builder-2.1.2.orig/test/testeventbuilder.rb	2006-12-24 20:29:01.000000000 +0100
++++ /dev/null	1970-01-01 00:00:00.000000000 +0000
+@@ -1,133 +0,0 @@
+-class TestEvents < Test::Unit::TestCase
+-
+-  class Target
+-    attr_reader :events
+-
+-    def initialize
+-      @events = []
+-    end
+-
+-    def start_tag(tag, attrs)
+-      @events << [:start_tag, tag, attrs]
+-    end
+-
+-    def end_tag(tag)
+-      @events << [:end_tag, tag]
+-    end
+-    
+-    def text(string)
+-      @events << [:text, string]
+-    end
+-    
+-  end
+-
+-
+-  def setup
+-    @target = Target.new
+-    @xml = Builder::XmlEvents.new(:target=>@target)
+-  end
+-
+-  def test_simple
+-    @xml.one
+-    expect [:start_tag, :one, nil]
+-    expect [:end_tag, :one]
+-    expect_done
+-  end
+-
+-  def test_nested
+-    @xml.one { @xml.two }
+-    expect [:start_tag, :one, nil]
+-    expect [:start_tag, :two, nil]
+-    expect [:end_tag, :two]
+-    expect [:end_tag, :one]
+-    expect_done
+-  end
+-
+-  def test_text
+-    @xml.one("a")
+-    expect [:start_tag, :one, nil]
+-    expect [:text, "a"]
+-    expect [:end_tag, :one]
+-    expect_done
+-  end
+-
+-  def test_special_text
+-    @xml.one("H&R")
+-    expect [:start_tag, :one, nil]
+-    expect [:text, "H&R"]
+-    expect [:end_tag, :one]
+-    expect_done
+-  end
+-
+-  def test_text_with_entity
+-    @xml.one("H&amp;R")
+-    expect [:start_tag, :one, nil]
+-    expect [:text, "H&amp;R"]
+-    expect [:end_tag, :one]
+-    expect_done
+-  end
+-
+-  def test_attributes
+-    @xml.a(:b=>"c", :x=>"y")
+-    expect [:start_tag, :a, {:x => "y", :b => "c"}]
+-    expect [:end_tag, :a]
+-    expect_done
+-  end
+-
+-  def test_moderately_complex
+-    @xml.tag! "address-book" do |x|
+-      x.entry :id=>"1" do
+-	x.name {
+-	  x.first "Bill"
+-	  x.last "Smith"
+-	}
+-	x.address "Cincinnati"
+-      end
+-      x.entry :id=>"2" do
+-	x.name {
+-	  x.first "John"
+-	  x.last "Doe"
+-	}
+-	x.address "Columbus"
+-      end
+-    end
+-    expect [:start_tag, "address-book".intern, nil]
+-    expect [:start_tag, :entry, {:id => "1"}]
+-    expect [:start_tag, :name, nil]
+-    expect [:start_tag, :first, nil]
+-    expect [:text, "Bill"]
+-    expect [:end_tag, :first]
+-    expect [:start_tag, :last, nil]
+-    expect [:text, "Smith"]
+-    expect [:end_tag, :last]
+-    expect [:end_tag, :name]
+-    expect [:start_tag, :address, nil]
+-    expect [:text, "Cincinnati"]
+-    expect [:end_tag, :address]
+-    expect [:end_tag, :entry]
+-    expect [:start_tag, :entry, {:id => "2"}]
+-    expect [:start_tag, :name, nil]
+-    expect [:start_tag, :first, nil]
+-    expect [:text, "John"]
+-    expect [:end_tag, :first]
+-    expect [:start_tag, :last, nil]
+-    expect [:text, "Doe"]
+-    expect [:end_tag, :last]
+-    expect [:end_tag, :name]
+-    expect [:start_tag, :address, nil]
+-    expect [:text, "Columbus"]
+-    expect [:end_tag, :address]
+-    expect [:end_tag, :entry]
+-    expect [:end_tag, "address-book".intern]
+-    expect_done
+-  end
+-
+-  def expect(value)
+-    assert_equal value, @target.events.shift
+-  end
+-
+-  def expect_done
+-    assert_nil @target.events.shift
+-  end
+-
+-end
+Index: builder-2.1.2/test/test_markupbuilder.rb
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/test/test_markupbuilder.rb	2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,505 @@
++#!/usr/bin/env ruby
++
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
++require 'test/unit'
++require 'test/preload'
++require 'builder'
++require 'builder/xmlmarkup'
++
++class TestMarkup < Test::Unit::TestCase
++  def setup
++    @xml = Builder::XmlMarkup.new
++  end
++
++  def test_create
++    assert_not_nil @xml
++  end
++
++  def test_simple
++    @xml.simple
++    assert_equal "<simple/>", @xml.target!
++  end
++
++  def test_value
++    @xml.value("hi")
++    assert_equal "<value>hi</value>", @xml.target!
++  end
++
++  def test_nested
++    @xml.outer { |x| x.inner("x") }
++    assert_equal "<outer><inner>x</inner></outer>", @xml.target!
++  end
++
++  def test_attributes
++    @xml.ref(:id => 12)
++    assert_equal %{<ref id="12"/>}, @xml.target!
++  end
++
++  def test_string_attributes_are_quoted_by_default
++    @xml.ref(:id => "H&R")
++    assert_equal %{<ref id="H&amp;R"/>}, @xml.target!
++  end
++
++  def test_symbol_attributes_are_unquoted_by_default
++    @xml.ref(:id => :"H&amp;R")
++    assert_equal %{<ref id="H&amp;R"/>}, @xml.target!
++  end
++
++  def test_attributes_quoted_can_be_turned_on
++    @xml = Builder::XmlMarkup.new
++    @xml.ref(:id => "<H&R \"block\">")
++    assert_equal %{<ref id="&lt;H&amp;R &quot;block&quot;&gt;"/>}, @xml.target!
++  end
++
++  def test_mixed_attribute_quoting_with_nested_builders
++    x = Builder::XmlMarkup.new(:target=>@xml)
++    @xml.ref(:id=>:"H&amp;R") {
++      x.element(:tag=>"Long&Short")
++    }
++    assert_equal "<ref id=\"H&amp;R\"><element tag=\"Long&amp;Short\"/></ref>",
++      @xml.target!
++  end
++
++  def test_multiple_attributes
++    @xml.ref(:id => 12, :name => "bill")
++    assert_match %r{^<ref( id="12"| name="bill"){2}/>$}, @xml.target!
++  end
++
++  def test_attributes_with_text
++    @xml.a("link", :href=>"http://onestepback.org")
++    assert_equal %{<a href="http://onestepback.org">link</a>}, @xml.target!
++  end
++  
++  def test_complex
++    @xml.body(:bg=>"#ffffff") { |x|
++      x.title("T", :style=>"red")
++    }
++    assert_equal %{<body bg="#ffffff"><title style="red">T</title></body>}, @xml.target!
++  end
++
++  def test_funky_symbol
++    @xml.tag!("non-ruby-token", :id=>1) { |x| x.ok }
++    assert_equal %{<non-ruby-token id="1"><ok/></non-ruby-token>}, @xml.target!
++  end
++
++  def test_tag_can_handle_private_method
++    @xml.tag!("loop", :id=>1) { |x| x.ok }
++    assert_equal %{<loop id="1"><ok/></loop>}, @xml.target!
++  end
++
++  def test_no_explicit_marker
++    @xml.p { |x| x.b("HI") }
++    assert_equal "<p><b>HI</b></p>", @xml.target!
++  end
++
++  def test_reference_local_vars
++    n = 3
++    @xml.ol { |x| n.times { x.li(n) } }
++    assert_equal "<ol><li>3</li><li>3</li><li>3</li></ol>", @xml.target!
++  end
++
++  def test_reference_methods
++    @xml.title { |x| x.a { x.b(name) } }
++    assert_equal "<title><a><b>bob</b></a></title>", @xml.target!
++  end
++
++  def test_append_text
++    @xml.p { |x| x.br; x.text! "HI" }
++    assert_equal "<p><br/>HI</p>", @xml.target!    
++  end
++  
++  def test_ambiguous_markup
++    ex = assert_raises(ArgumentError) {
++      @xml.h1("data1") { b }
++    }
++    assert_match /\btext\b/, ex.message
++    assert_match /\bblock\b/, ex.message
++  end
++
++  def test_capitalized_method
++    @xml.P { |x| x.B("hi"); x.BR(); x.EM { x.text! "world" } }
++    assert_equal "<P><B>hi</B><BR/><EM>world</EM></P>", @xml.target!
++  end
++
++  def test_escaping
++    @xml.div { |x| x.text! "<hi>"; x.em("H&R Block") }
++    assert_equal %{<div>&lt;hi&gt;<em>H&amp;R Block</em></div>}, @xml.target!
++  end
++
++  def test_non_escaping
++    @xml.div("ns:xml"=>:"&xml;") { |x| x << "<h&i>"; x.em("H&R Block") }
++    assert_equal %{<div ns:xml="&xml;"><h&i><em>H&amp;R Block</em></div>}, @xml.target!
++  end
++
++  def test_return_value
++    str = @xml.x("men")
++    assert_equal @xml.target!, str
++  end
++
++  def test_stacked_builders
++    b = Builder::XmlMarkup.new( :target => @xml )
++    b.div { @xml.span { @xml.a("text", :href=>"ref") } }
++    assert_equal "<div><span><a href=\"ref\">text</a></span></div>", @xml.target!
++  end
++
++  def name
++    "bob"
++  end
++end
++
++class TestAttributeEscaping < Test::Unit::TestCase
++
++  def setup
++    @xml = Builder::XmlMarkup.new
++  end
++
++  def test_element_gt
++    @xml.title('1<2')
++    assert_equal '<title>1&lt;2</title>', @xml.target!
++  end
++
++  def test_element_amp
++    @xml.title('AT&T')
++    assert_equal '<title>AT&amp;T</title>', @xml.target!
++  end
++
++  def test_element_amp2
++    @xml.title('&amp;')
++    assert_equal '<title>&amp;amp;</title>', @xml.target!
++  end
++
++  def test_attr_less
++    @xml.a(:title => '2>1')
++    assert_equal '<a title="2&gt;1"/>', @xml.target!
++  end
++
++  def test_attr_amp
++    @xml.a(:title => 'AT&T')
++    assert_equal '<a title="AT&amp;T"/>', @xml.target!
++  end
++
++  def test_attr_quot
++    @xml.a(:title => '"x"')
++    assert_equal '<a title="&quot;x&quot;"/>', @xml.target!
++  end
++
++end
++
++class TestNameSpaces < Test::Unit::TestCase
++  def setup
++    @xml = Builder::XmlMarkup.new(:indent=>2)
++  end
++
++  def test_simple_name_spaces
++    @xml.rdf :RDF
++    assert_equal "<rdf:RDF/>\n", @xml.target!
++  end
++
++  def test_long
++    xml = Builder::XmlMarkup.new(:indent=>2)
++    xml.instruct!
++    xml.rdf :RDF, 
++      "xmlns:rdf" => :"&rdf;",
++      "xmlns:rdfs" => :"&rdfs;",
++      "xmlns:xsd" => :"&xsd;",
++      "xmlns:owl" => :"&owl;" do
++      xml.owl :Class, :'rdf:ID'=>'Bird' do
++	xml.rdfs :label, 'bird'
++	xml.rdfs :subClassOf do
++	  xml.owl :Restriction do
++	    xml.owl :onProperty, 'rdf:resource'=>'#wingspan'
++	    xml.owl :maxCardinality,1,'rdf:datatype'=>'&xsd;nonNegativeInteger'
++	  end
++	end
++      end
++    end
++    assert_match /^<\?xml/, xml.target!
++    assert_match /\n<rdf:RDF/m, xml.target!
++    assert_match /xmlns:rdf="&rdf;"/m, xml.target!
++    assert_match /<owl:Restriction>/m, xml.target!
++  end
++  
++end
++
++class TestDeclarations < Test::Unit::TestCase
++  def setup
++    @xml = Builder::XmlMarkup.new(:indent=>2)
++  end
++
++  def test_declare
++    @xml.declare! :element
++    assert_equal "<!element>\n", @xml.target!
++  end
++
++  def test_bare_arg
++    @xml.declare! :element, :arg
++    assert_equal"<!element arg>\n", @xml.target!
++  end
++
++  def test_string_arg
++    @xml.declare! :element, "string"
++    assert_equal"<!element \"string\">\n", @xml.target!
++  end
++
++  def test_mixed_args
++    @xml.declare! :element, :x, "y", :z, "-//OASIS//DTD DocBook XML//EN"
++    assert_equal "<!element x \"y\" z \"-//OASIS//DTD DocBook XML//EN\">\n", @xml.target!
++  end
++
++  def test_nested_declarations
++    @xml = Builder::XmlMarkup.new
++    @xml.declare! :DOCTYPE, :chapter do |x|
++      x.declare! :ELEMENT, :chapter, "(title,para+)".intern
++    end
++    assert_equal "<!DOCTYPE chapter [<!ELEMENT chapter (title,para+)>]>", @xml.target!
++  end
++
++  def test_nested_indented_declarations
++    @xml.declare! :DOCTYPE, :chapter do |x|
++      x.declare! :ELEMENT, :chapter, "(title,para+)".intern
++    end
++    assert_equal "<!DOCTYPE chapter [\n  <!ELEMENT chapter (title,para+)>\n]>\n", @xml.target!
++  end
++
++  def test_complex_declaration
++    @xml.declare! :DOCTYPE, :chapter do |x|
++      x.declare! :ELEMENT, :chapter, "(title,para+)".intern
++      x.declare! :ELEMENT, :title, "(#PCDATA)".intern
++      x.declare! :ELEMENT, :para, "(#PCDATA)".intern
++    end
++    expected = %{<!DOCTYPE chapter [
++  <!ELEMENT chapter (title,para+)>
++  <!ELEMENT title (#PCDATA)>
++  <!ELEMENT para (#PCDATA)>
++]>
++}
++    assert_equal expected, @xml.target!
++  end
++end
++
++
++class TestSpecialMarkup < Test::Unit::TestCase
++  def setup
++    @xml = Builder::XmlMarkup.new(:indent=>2)
++  end
++
++  def test_comment
++    @xml.comment!("COMMENT")
++    assert_equal "<!-- COMMENT -->\n", @xml.target!
++  end
++
++  def test_indented_comment
++    @xml.p { @xml.comment! "OK" }
++    assert_equal "<p>\n  <!-- OK -->\n</p>\n", @xml.target!
++  end
++
++  def test_instruct
++    @xml.instruct! :abc, :version=>"0.9"
++    assert_equal "<?abc version=\"0.9\"?>\n", @xml.target!
++  end
++
++  def test_indented_instruct
++    @xml.p { @xml.instruct! :xml }
++    assert_match %r{<p>\n  <\?xml version="1.0" encoding="UTF-8"\?>\n</p>\n},
++      @xml.target!
++  end
++
++  def test_instruct_without_attributes
++    @xml.instruct! :zz
++    assert_equal "<?zz?>\n", @xml.target!
++  end
++
++  def test_xml_instruct
++    @xml.instruct!
++    assert_match /^<\?xml version="1.0" encoding="UTF-8"\?>$/, @xml.target!
++  end
++
++  def test_xml_instruct_with_overrides
++    @xml.instruct! :xml, :encoding=>"UCS-2"
++    assert_match /^<\?xml version="1.0" encoding="UCS-2"\?>$/, @xml.target!
++  end
++
++  def test_xml_instruct_with_standalong
++    @xml.instruct! :xml, :encoding=>"UCS-2", :standalone=>"yes"
++    assert_match /^<\?xml version="1.0" encoding="UCS-2" standalone="yes"\?>$/, @xml.target!
++  end
++
++  def test_no_blocks
++    assert_raises(Builder::IllegalBlockError) do
++      @xml.instruct! { |x| x.hi }
++    end
++    assert_raises(Builder::IllegalBlockError) do
++      @xml.comment!(:element) { |x| x.hi }
++    end
++  end
++
++  def test_cdata
++    @xml.cdata!("TEST")
++    assert_equal "<![CDATA[TEST]]>\n", @xml.target!
++  end
++
++  def test_cdata_with_ampersand
++    @xml.cdata!("TEST&CHECK")
++    assert_equal "<![CDATA[TEST&CHECK]]>\n", @xml.target!
++  end
++end
++
++class TestIndentedXmlMarkup < Test::Unit::TestCase
++  def setup
++    @xml = Builder::XmlMarkup.new(:indent=>2)
++  end
++
++  def test_one_level
++    @xml.ol { |x| x.li "text" }
++    assert_equal "<ol>\n  <li>text</li>\n</ol>\n", @xml.target!
++  end
++
++  def test_two_levels
++    @xml.p { |x|
++      x.ol { x.li "text" }
++      x.br
++    }
++    assert_equal "<p>\n  <ol>\n    <li>text</li>\n  </ol>\n  <br/>\n</p>\n", @xml.target!
++  end
++
++  def test_initial_level
++    @xml = Builder::XmlMarkup.new(:indent=>2, :margin=>4)
++    @xml.name { |x| x.first("Jim") }
++    assert_equal "        <name>\n          <first>Jim</first>\n        </name>\n", @xml.target!
++  end
++
++  class TestUtfMarkup < Test::Unit::TestCase
++    def setup
++      @old_kcode = $KCODE
++    end
++
++    def teardown
++      $KCODE = @old_kcode
++    end
++
++    def test_use_entities_if_no_encoding_is_given_and_kcode_is_none
++      $KCODE = 'NONE'
++      xml = Builder::XmlMarkup.new
++      xml.p("\xE2\x80\x99")
++      assert_match(%r(<p>&#8217;</p>), xml.target!) #
++    end
++
++    def test_use_entities_if_encoding_is_utf_but_kcode_is_not
++      $KCODE = 'NONE'
++      xml = Builder::XmlMarkup.new
++      xml.instruct!(:xml, :encoding => 'UTF-8')
++      xml.p("\xE2\x80\x99")
++      assert_match(%r(<p>&#8217;</p>), xml.target!) #
++    end
++
++    def test_use_entities_if_kcode_is_utf_but_encoding_is_something_else
++      $KCODE = 'UTF8'
++      xml = Builder::XmlMarkup.new
++      xml.instruct!(:xml, :encoding => 'UTF-16')
++      xml.p("\xE2\x80\x99")
++      assert_match(%r(<p>&#8217;</p>), xml.target!) #
++    end
++
++    def test_use_utf8_if_encoding_defaults_and_kcode_is_utf8
++      $KCODE = 'UTF8'
++      xml = Builder::XmlMarkup.new
++      xml.p("\xE2\x80\x99")
++      assert_equal "<p>\xE2\x80\x99</p>", xml.target!
++    end
++
++    def test_use_utf8_if_both_encoding_and_kcode_are_utf8
++      $KCODE = 'UTF8'
++      xml = Builder::XmlMarkup.new
++      xml.instruct!(:xml, :encoding => 'UTF-8')
++      xml.p("\xE2\x80\x99")
++      assert_match(%r(<p>\xE2\x80\x99</p>), xml.target!)
++    end
++
++    def test_use_utf8_if_both_encoding_and_kcode_are_utf8_with_lowercase
++      $KCODE = 'UTF8'
++      xml = Builder::XmlMarkup.new
++      xml.instruct!(:xml, :encoding => 'utf-8')
++      xml.p("\xE2\x80\x99")
++      assert_match(%r(<p>\xE2\x80\x99</p>), xml.target!)
++    end
++  end
++
++  class TestXmlEvents < Test::Unit::TestCase
++    def setup
++      @handler = EventHandler.new
++      @xe = Builder::XmlEvents.new(:target=>@handler)
++    end
++
++    def test_simple
++      @xe.p
++      assert_equal [:start, :p, nil], @handler.events.shift
++      assert_equal [:end, :p], @handler.events.shift
++    end
++
++    def test_text
++      @xe.p("HI")
++      assert_equal [:start, :p, nil], @handler.events.shift
++      assert_equal [:text, "HI"], @handler.events.shift
++      assert_equal [:end, :p], @handler.events.shift
++    end
++
++    def test_attributes
++      @xe.p("id"=>"2")
++      ev = @handler.events.shift
++      assert_equal [:start, :p], ev[0,2]
++      assert_equal "2", ev[2]['id']
++      assert_equal [:end, :p], @handler.events.shift
++    end
++
++    def test_indented
++      @xml = Builder::XmlEvents.new(:indent=>2, :target=>@handler)
++      @xml.p { |x| x.b("HI") }
++      assert_equal [:start, :p, nil], @handler.events.shift
++      assert_equal "\n  ", pop_text
++      assert_equal [:start, :b, nil], @handler.events.shift
++      assert_equal "HI", pop_text
++      assert_equal [:end, :b], @handler.events.shift
++      assert_equal "\n", pop_text
++      assert_equal [:end, :p], @handler.events.shift
++    end
++
++    def pop_text
++      result = ''
++      while ! @handler.events.empty? && @handler.events[0][0] == :text
++	result << @handler.events[0][1]
++	@handler.events.shift
++      end
++      result
++    end
++
++    class EventHandler
++      attr_reader :events
++      def initialize
++	@events = []
++      end
++      
++      def start_tag(sym, attrs)
++	@events << [:start, sym, attrs]
++      end
++
++      def end_tag(sym)
++	@events << [:end, sym]
++      end
++
++      def text(txt)
++	@events << [:text, txt]
++      end
++    end
++  end
++
++end
++
+Index: builder-2.1.2/test/testmarkupbuilder.rb
+===================================================================
+--- builder-2.1.2.orig/test/testmarkupbuilder.rb	2007-06-15 06:58:44.000000000 +0200
++++ /dev/null	1970-01-01 00:00:00.000000000 +0000
+@@ -1,449 +0,0 @@
+-#!/usr/bin/env ruby
+-
+-#--
+-# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
+-# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
+-# All rights reserved.
+-
+-# Permission is granted for use, copying, modification, distribution,
+-# and distribution of modified versions of this work as long as the
+-# above copyright notice is included.
+-#++
+-
+-require 'test/unit'
+-require 'test/preload'
+-require 'builder'
+-require 'builder/xmlmarkup'
+-
+-class TestMarkup < Test::Unit::TestCase
+-  def setup
+-    @xml = Builder::XmlMarkup.new
+-  end
+-
+-  def test_create
+-    assert_not_nil @xml
+-  end
+-
+-  def test_simple
+-    @xml.simple
+-    assert_equal "<simple/>", @xml.target!
+-  end
+-
+-  def test_value
+-    @xml.value("hi")
+-    assert_equal "<value>hi</value>", @xml.target!
+-  end
+-
+-  def test_nested
+-    @xml.outer { |x| x.inner("x") }
+-    assert_equal "<outer><inner>x</inner></outer>", @xml.target!
+-  end
+-
+-  def test_attributes
+-    @xml.ref(:id => 12)
+-    assert_equal %{<ref id="12"/>}, @xml.target!
+-  end
+-
+-  def test_string_attributes_are_quoted_by_default
+-    @xml.ref(:id => "H&R")
+-    assert_equal %{<ref id="H&amp;R"/>}, @xml.target!
+-  end
+-
+-  def test_symbol_attributes_are_unquoted_by_default
+-    @xml.ref(:id => :"H&amp;R")
+-    assert_equal %{<ref id="H&amp;R"/>}, @xml.target!
+-  end
+-
+-  def test_attributes_quoted_can_be_turned_on
+-    @xml = Builder::XmlMarkup.new
+-    @xml.ref(:id => "<H&R \"block\">")
+-    assert_equal %{<ref id="&lt;H&amp;R &quot;block&quot;&gt;"/>}, @xml.target!
+-  end
+-
+-  def test_mixed_attribute_quoting_with_nested_builders
+-    x = Builder::XmlMarkup.new(:target=>@xml)
+-    @xml.ref(:id=>:"H&amp;R") {
+-      x.element(:tag=>"Long&Short")
+-    }
+-    assert_equal "<ref id=\"H&amp;R\"><element tag=\"Long&amp;Short\"/></ref>",
+-      @xml.target!
+-  end
+-
+-  def test_multiple_attributes
+-    @xml.ref(:id => 12, :name => "bill")
+-    assert_match %r{^<ref( id="12"| name="bill"){2}/>$}, @xml.target!
+-  end
+-
+-  def test_attributes_with_text
+-    @xml.a("link", :href=>"http://onestepback.org")
+-    assert_equal %{<a href="http://onestepback.org">link</a>}, @xml.target!
+-  end
+-  
+-  def test_complex
+-    @xml.body(:bg=>"#ffffff") { |x|
+-      x.title("T", :style=>"red")
+-    }
+-    assert_equal %{<body bg="#ffffff"><title style="red">T</title></body>}, @xml.target!
+-  end
+-
+-  def test_funky_symbol
+-    @xml.tag!("non-ruby-token", :id=>1) { |x| x.ok }
+-    assert_equal %{<non-ruby-token id="1"><ok/></non-ruby-token>}, @xml.target!
+-  end
+-
+-  def test_tag_can_handle_private_method
+-    @xml.tag!("loop", :id=>1) { |x| x.ok }
+-    assert_equal %{<loop id="1"><ok/></loop>}, @xml.target!
+-  end
+-
+-  def test_no_explicit_marker
+-    @xml.p { |x| x.b("HI") }
+-    assert_equal "<p><b>HI</b></p>", @xml.target!
+-  end
+-
+-  def test_reference_local_vars
+-    n = 3
+-    @xml.ol { |x| n.times { x.li(n) } }
+-    assert_equal "<ol><li>3</li><li>3</li><li>3</li></ol>", @xml.target!
+-  end
+-
+-  def test_reference_methods
+-    @xml.title { |x| x.a { x.b(name) } }
+-    assert_equal "<title><a><b>bob</b></a></title>", @xml.target!
+-  end
+-
+-  def test_append_text
+-    @xml.p { |x| x.br; x.text! "HI" }
+-    assert_equal "<p><br/>HI</p>", @xml.target!    
+-  end
+-  
+-  def test_ambiguous_markup
+-    ex = assert_raises(ArgumentError) {
+-      @xml.h1("data1") { b }
+-    }
+-    assert_match /\btext\b/, ex.message
+-    assert_match /\bblock\b/, ex.message
+-  end
+-
+-  def test_capitalized_method
+-    @xml.P { |x| x.B("hi"); x.BR(); x.EM { x.text! "world" } }
+-    assert_equal "<P><B>hi</B><BR/><EM>world</EM></P>", @xml.target!
+-  end
+-
+-  def test_escaping
+-    @xml.div { |x| x.text! "<hi>"; x.em("H&R Block") }
+-    assert_equal %{<div>&lt;hi&gt;<em>H&amp;R Block</em></div>}, @xml.target!
+-  end
+-
+-  def test_non_escaping
+-    @xml.div("ns:xml"=>:"&xml;") { |x| x << "<h&i>"; x.em("H&R Block") }
+-    assert_equal %{<div ns:xml="&xml;"><h&i><em>H&amp;R Block</em></div>}, @xml.target!
+-  end
+-
+-  def test_return_value
+-    str = @xml.x("men")
+-    assert_equal @xml.target!, str
+-  end
+-
+-  def test_stacked_builders
+-    b = Builder::XmlMarkup.new( :target => @xml )
+-    b.div { @xml.span { @xml.a("text", :href=>"ref") } }
+-    assert_equal "<div><span><a href=\"ref\">text</a></span></div>", @xml.target!
+-  end
+-
+-  def name
+-    "bob"
+-  end
+-end
+-
+-class TestAttributeEscaping < Test::Unit::TestCase
+-
+-  def setup
+-    @xml = Builder::XmlMarkup.new
+-  end
+-
+-  def test_element_gt
+-    @xml.title('1<2')
+-    assert_equal '<title>1&lt;2</title>', @xml.target!
+-  end
+-
+-  def test_element_amp
+-    @xml.title('AT&T')
+-    assert_equal '<title>AT&amp;T</title>', @xml.target!
+-  end
+-
+-  def test_element_amp2
+-    @xml.title('&amp;')
+-    assert_equal '<title>&amp;amp;</title>', @xml.target!
+-  end
+-
+-  def test_attr_less
+-    @xml.a(:title => '2>1')
+-    assert_equal '<a title="2&gt;1"/>', @xml.target!
+-  end
+-
+-  def test_attr_amp
+-    @xml.a(:title => 'AT&T')
+-    assert_equal '<a title="AT&amp;T"/>', @xml.target!
+-  end
+-
+-  def test_attr_quot
+-    @xml.a(:title => '"x"')
+-    assert_equal '<a title="&quot;x&quot;"/>', @xml.target!
+-  end
+-
+-end
+-
+-class TestNameSpaces < Test::Unit::TestCase
+-  def setup
+-    @xml = Builder::XmlMarkup.new(:indent=>2)
+-  end
+-
+-  def test_simple_name_spaces
+-    @xml.rdf :RDF
+-    assert_equal "<rdf:RDF/>\n", @xml.target!
+-  end
+-
+-  def test_long
+-    xml = Builder::XmlMarkup.new(:indent=>2)
+-    xml.instruct!
+-    xml.rdf :RDF, 
+-      "xmlns:rdf" => :"&rdf;",
+-      "xmlns:rdfs" => :"&rdfs;",
+-      "xmlns:xsd" => :"&xsd;",
+-      "xmlns:owl" => :"&owl;" do
+-      xml.owl :Class, :'rdf:ID'=>'Bird' do
+-	xml.rdfs :label, 'bird'
+-	xml.rdfs :subClassOf do
+-	  xml.owl :Restriction do
+-	    xml.owl :onProperty, 'rdf:resource'=>'#wingspan'
+-	    xml.owl :maxCardinality,1,'rdf:datatype'=>'&xsd;nonNegativeInteger'
+-	  end
+-	end
+-      end
+-    end
+-    assert_match /^<\?xml/, xml.target!
+-    assert_match /\n<rdf:RDF/m, xml.target!
+-    assert_match /xmlns:rdf="&rdf;"/m, xml.target!
+-    assert_match /<owl:Restriction>/m, xml.target!
+-  end
+-  
+-end
+-
+-class TestDeclarations < Test::Unit::TestCase
+-  def setup
+-    @xml = Builder::XmlMarkup.new(:indent=>2)
+-  end
+-
+-  def test_declare
+-    @xml.declare! :element
+-    assert_equal "<!element>\n", @xml.target!
+-  end
+-
+-  def test_bare_arg
+-    @xml.declare! :element, :arg
+-    assert_equal"<!element arg>\n", @xml.target!
+-  end
+-
+-  def test_string_arg
+-    @xml.declare! :element, "string"
+-    assert_equal"<!element \"string\">\n", @xml.target!
+-  end
+-
+-  def test_mixed_args
+-    @xml.declare! :element, :x, "y", :z, "-//OASIS//DTD DocBook XML//EN"
+-    assert_equal "<!element x \"y\" z \"-//OASIS//DTD DocBook XML//EN\">\n", @xml.target!
+-  end
+-
+-  def test_nested_declarations
+-    @xml = Builder::XmlMarkup.new
+-    @xml.declare! :DOCTYPE, :chapter do |x|
+-      x.declare! :ELEMENT, :chapter, "(title,para+)".intern
+-    end
+-    assert_equal "<!DOCTYPE chapter [<!ELEMENT chapter (title,para+)>]>", @xml.target!
+-  end
+-
+-  def test_nested_indented_declarations
+-    @xml.declare! :DOCTYPE, :chapter do |x|
+-      x.declare! :ELEMENT, :chapter, "(title,para+)".intern
+-    end
+-    assert_equal "<!DOCTYPE chapter [\n  <!ELEMENT chapter (title,para+)>\n]>\n", @xml.target!
+-  end
+-
+-  def test_complex_declaration
+-    @xml.declare! :DOCTYPE, :chapter do |x|
+-      x.declare! :ELEMENT, :chapter, "(title,para+)".intern
+-      x.declare! :ELEMENT, :title, "(#PCDATA)".intern
+-      x.declare! :ELEMENT, :para, "(#PCDATA)".intern
+-    end
+-    expected = %{<!DOCTYPE chapter [
+-  <!ELEMENT chapter (title,para+)>
+-  <!ELEMENT title (#PCDATA)>
+-  <!ELEMENT para (#PCDATA)>
+-]>
+-}
+-    assert_equal expected, @xml.target!
+-  end
+-end
+-
+-
+-class TestSpecialMarkup < Test::Unit::TestCase
+-  def setup
+-    @xml = Builder::XmlMarkup.new(:indent=>2)
+-  end
+-
+-  def test_comment
+-    @xml.comment!("COMMENT")
+-    assert_equal "<!-- COMMENT -->\n", @xml.target!
+-  end
+-
+-  def test_indented_comment
+-    @xml.p { @xml.comment! "OK" }
+-    assert_equal "<p>\n  <!-- OK -->\n</p>\n", @xml.target!
+-  end
+-
+-  def test_instruct
+-    @xml.instruct! :abc, :version=>"0.9"
+-    assert_equal "<?abc version=\"0.9\"?>\n", @xml.target!
+-  end
+-
+-  def test_indented_instruct
+-    @xml.p { @xml.instruct! :xml }
+-    assert_match %r{<p>\n  <\?xml version="1.0" encoding="UTF-8"\?>\n</p>\n},
+-      @xml.target!
+-  end
+-
+-  def test_instruct_without_attributes
+-    @xml.instruct! :zz
+-    assert_equal "<?zz?>\n", @xml.target!
+-  end
+-
+-  def test_xml_instruct
+-    @xml.instruct!
+-    assert_match /^<\?xml version="1.0" encoding="UTF-8"\?>$/, @xml.target!
+-  end
+-
+-  def test_xml_instruct_with_overrides
+-    @xml.instruct! :xml, :encoding=>"UCS-2"
+-    assert_match /^<\?xml version="1.0" encoding="UCS-2"\?>$/, @xml.target!
+-  end
+-
+-  def test_xml_instruct_with_standalong
+-    @xml.instruct! :xml, :encoding=>"UCS-2", :standalone=>"yes"
+-    assert_match /^<\?xml version="1.0" encoding="UCS-2" standalone="yes"\?>$/, @xml.target!
+-  end
+-
+-  def test_no_blocks
+-    assert_raises(Builder::IllegalBlockError) do
+-      @xml.instruct! { |x| x.hi }
+-    end
+-    assert_raises(Builder::IllegalBlockError) do
+-      @xml.comment!(:element) { |x| x.hi }
+-    end
+-  end
+-
+-  def test_cdata
+-    @xml.cdata!("TEST")
+-    assert_equal "<![CDATA[TEST]]>\n", @xml.target!
+-  end
+-
+-  def test_cdata_with_ampersand
+-    @xml.cdata!("TEST&CHECK")
+-    assert_equal "<![CDATA[TEST&CHECK]]>\n", @xml.target!
+-  end
+-end
+-
+-class TestIndentedXmlMarkup < Test::Unit::TestCase
+-  def setup
+-    @xml = Builder::XmlMarkup.new(:indent=>2)
+-  end
+-
+-  def test_one_level
+-    @xml.ol { |x| x.li "text" }
+-    assert_equal "<ol>\n  <li>text</li>\n</ol>\n", @xml.target!
+-  end
+-
+-  def test_two_levels
+-    @xml.p { |x|
+-      x.ol { x.li "text" }
+-      x.br
+-    }
+-    assert_equal "<p>\n  <ol>\n    <li>text</li>\n  </ol>\n  <br/>\n</p>\n", @xml.target!
+-  end
+-
+-  def test_initial_level
+-    @xml = Builder::XmlMarkup.new(:indent=>2, :margin=>4)
+-    @xml.name { |x| x.first("Jim") }
+-    assert_equal "        <name>\n          <first>Jim</first>\n        </name>\n", @xml.target!
+-  end
+-
+-  class TestXmlEvents < Test::Unit::TestCase
+-    def setup
+-      @handler = EventHandler.new
+-      @xe = Builder::XmlEvents.new(:target=>@handler)
+-    end
+-
+-    def test_simple
+-      @xe.p
+-      assert_equal [:start, :p, nil], @handler.events.shift
+-      assert_equal [:end, :p], @handler.events.shift
+-    end
+-
+-    def test_text
+-      @xe.p("HI")
+-      assert_equal [:start, :p, nil], @handler.events.shift
+-      assert_equal [:text, "HI"], @handler.events.shift
+-      assert_equal [:end, :p], @handler.events.shift
+-    end
+-
+-    def test_attributes
+-      @xe.p("id"=>"2")
+-      ev = @handler.events.shift
+-      assert_equal [:start, :p], ev[0,2]
+-      assert_equal "2", ev[2]['id']
+-      assert_equal [:end, :p], @handler.events.shift
+-    end
+-
+-    def test_indented
+-      @xml = Builder::XmlEvents.new(:indent=>2, :target=>@handler)
+-      @xml.p { |x| x.b("HI") }
+-      assert_equal [:start, :p, nil], @handler.events.shift
+-      assert_equal "\n  ", pop_text
+-      assert_equal [:start, :b, nil], @handler.events.shift
+-      assert_equal "HI", pop_text
+-      assert_equal [:end, :b], @handler.events.shift
+-      assert_equal "\n", pop_text
+-      assert_equal [:end, :p], @handler.events.shift
+-    end
+-
+-    def pop_text
+-      result = ''
+-      while ! @handler.events.empty? && @handler.events[0][0] == :text
+-	result << @handler.events[0][1]
+-	@handler.events.shift
+-      end
+-      result
+-    end
+-
+-    class EventHandler
+-      attr_reader :events
+-      def initialize
+-	@events = []
+-      end
+-      
+-      def start_tag(sym, attrs)
+-	@events << [:start, sym, attrs]
+-      end
+-
+-      def end_tag(sym)
+-	@events << [:end, sym]
+-      end
+-
+-      def text(txt)
+-	@events << [:text, txt]
+-      end
+-    end
+-  end
+-
+-end
+-
+Index: builder-2.1.2/test/test_namecollision.rb
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/test/test_namecollision.rb	2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,39 @@
++#!/usr/bin/env ruby
++
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
++require 'test/unit'
++require 'builder/xchar'
++
++class TestNameCollisions < Test::Unit::TestCase
++  module Collide
++    def xchr
++    end
++  end
++
++  def test_no_collision
++    assert_nothing_raised do
++      Builder.check_for_name_collision(Collide, :not_defined)
++    end
++  end
++
++  def test_collision
++    assert_raise RuntimeError do
++      Builder.check_for_name_collision(Collide, "xchr")
++    end
++  end
++
++  def test_collision_with_symbol
++    assert_raise RuntimeError do
++      Builder.check_for_name_collision(Collide, :xchr)
++    end
++  end
++end
+Index: builder-2.1.2/test/test_xchar.rb
+===================================================================
+--- builder-2.1.2.orig/test/test_xchar.rb	2006-12-24 20:29:01.000000000 +0100
++++ builder-2.1.2/test/test_xchar.rb	2010-03-21 16:37:51.000000000 +0100
+@@ -1,5 +1,17 @@
+ #!/usr/bin/env ruby
+ 
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
++#!/usr/bin/env ruby
++
+ require 'test/unit'
+ require 'builder/xchar'
+ 
+@@ -34,4 +46,11 @@
+     assert_equal '&#8217;', "\xE2\x80\x99".to_xs # right single quote
+     assert_equal '&#169;',  "\xC2\xA9".to_xs     # copy
+   end
++ 
++  def test_utf8_verbatim
++    assert_equal "\xE2\x80\x99", "\xE2\x80\x99".to_xs(false)  # right single quote
++    assert_equal "\xC2\xA9",  "\xC2\xA9".to_xs(false)         # copy
++    assert_equal "\xC2\xA9&amp;\xC2\xA9",
++      "\xC2\xA9&\xC2\xA9".to_xs(false)                        # copy with ampersand
++  end
+ end

Deleted: trunk/libbuilder-ruby/debian/patches/ruby_1.9
===================================================================
--- trunk/libbuilder-ruby/debian/patches/ruby_1.9	2010-03-21 10:10:10 UTC (rev 4988)
+++ trunk/libbuilder-ruby/debian/patches/ruby_1.9	2010-03-21 15:55:34 UTC (rev 4989)
@@ -1,597 +0,0 @@
-Index: test/test_blankslate.rb
-===================================================================
---- test/test_blankslate.rb	(revision 110)
-+++ test/test_blankslate.rb	(working copy)
-@@ -71,6 +71,13 @@
- # Test case for blank slate.
- #
- class TestBlankSlate < Test::Unit::TestCase
-+  if Object::const_defined?(:BasicObject)
-+    def self.suite
-+      # skip tests if :BasicObject is present
-+      Test::Unit::TestSuite.new(name)
-+    end
-+  end
-+
-   def setup
-     @bs = BlankSlate.new
-   end
-Index: test/test_xchar.rb
-===================================================================
---- test/test_xchar.rb	(revision 110)
-+++ test/test_xchar.rb	(working copy)
-@@ -3,7 +3,28 @@
- require 'test/unit'
- require 'builder/xchar'
- 
-+if String.method_defined?(:encode)
-+  class String
-+    ENCODING_BINARY = Encoding.find('BINARY')
-+
-+    # shim method for testing purposes
-+    def to_xs(escape=true)
-+      raise NameError.new('to_xs') unless caller[0].index(__FILE__)
-+
-+      result = Builder::XChar.encode(self)
-+      if escape
-+        result.gsub(/[^\u0000-\u007F]/) {|c| "&##{c.ord};"}
-+      else
-+        # really only useful for testing purposes
-+        result.force_encoding(ENCODING_BINARY)
-+      end
-+    end
-+  end
-+end
-+
- class TestXmlEscaping < Test::Unit::TestCase
-+  REPLACEMENT_CHAR = Builder::XChar::REPLACEMENT_CHAR.to_xs
-+
-   def test_ascii
-     assert_equal 'abc', 'abc'.to_xs
-   end
-@@ -15,9 +36,9 @@
-   end
- 
-   def test_invalid
--    assert_equal '*', "\x00".to_xs               # null
--    assert_equal '*', "\x0C".to_xs               # form feed
--    assert_equal '*', "\xEF\xBF\xBF".to_xs       # U+FFFF
-+    assert_equal REPLACEMENT_CHAR, "\x00".to_xs               # null
-+    assert_equal REPLACEMENT_CHAR, "\x0C".to_xs               # form feed
-+    assert_equal REPLACEMENT_CHAR, "\xEF\xBF\xBF".to_xs       # U+FFFF
-   end
- 
-   def test_iso_8859_1
-Index: test/test_markupbuilder.rb
-===================================================================
---- test/test_markupbuilder.rb	(revision 110)
-+++ test/test_markupbuilder.rb	(working copy)
-@@ -118,7 +118,7 @@
-   end
-   
-   def test_ambiguous_markup
--    ex = assert_raises(ArgumentError) {
-+    ex = assert_raise(ArgumentError) {
-       @xml.h1("data1") { b }
-     }
-     assert_match /\btext\b/, ex.message
-@@ -228,6 +228,22 @@
-     assert_match /<owl:Restriction>/m, xml.target!
-   end
-   
-+  def test_ensure
-+    xml = Builder::XmlMarkup.new
-+    xml.html do
-+      xml.body do
-+       begin
-+         xml.p do
-+           raise Exception.new('boom')
-+         end
-+       rescue Exception => e
-+         xml.pre e
-+       end
-+      end
-+    end
-+    assert_match %r{<p>},  xml.target!
-+    assert_match %r{</p>}, xml.target!
-+  end
- end
- 
- class TestDeclarations < Test::Unit::TestCase
-@@ -334,10 +350,10 @@
-   end
- 
-   def test_no_blocks
--    assert_raises(Builder::IllegalBlockError) do
-+    assert_raise(Builder::IllegalBlockError) do
-       @xml.instruct! { |x| x.hi }
-     end
--    assert_raises(Builder::IllegalBlockError) do
-+    assert_raise(Builder::IllegalBlockError) do
-       @xml.comment!(:element) { |x| x.hi }
-     end
-   end
-@@ -378,58 +394,83 @@
-   end
- 
-   class TestUtfMarkup < Test::Unit::TestCase
--    def setup
--      @old_kcode = $KCODE
--    end
-+    if ! String.method_defined?(:encode)
-+      def setup
-+        @old_kcode = $KCODE
-+      end
- 
--    def teardown
--      $KCODE = @old_kcode
--    end
-+      def teardown
-+        $KCODE = @old_kcode
-+      end
- 
--    def test_use_entities_if_no_encoding_is_given_and_kcode_is_none
--      $KCODE = 'NONE'
--      xml = Builder::XmlMarkup.new
--      xml.p("\xE2\x80\x99")
--      assert_match(%r(<p>&#8217;</p>), xml.target!) #
-+      def test_use_entities_if_no_encoding_is_given_and_kcode_is_none
-+        $KCODE = 'NONE'
-+        xml = Builder::XmlMarkup.new
-+        xml.p("\xE2\x80\x99")
-+        assert_match(%r(<p>&#8217;</p>), xml.target!) #
-+      end
-+
-+      def test_use_entities_if_encoding_is_utf_but_kcode_is_not
-+        $KCODE = 'NONE'
-+        xml = Builder::XmlMarkup.new
-+        xml.instruct!(:xml, :encoding => 'UTF-8')
-+        xml.p("\xE2\x80\x99")
-+        assert_match(%r(<p>&#8217;</p>), xml.target!) #
-+      end
-+    else
-+      # change in behavior.  As there is no $KCODE anymore, the default
-+      # moves from "does not understand utf-8" to "supports utf-8".
-+
-+      def test_use_entities_if_no_encoding_is_given_and_kcode_is_none
-+        xml = Builder::XmlMarkup.new
-+        xml.p("\xE2\x80\x99")
-+        assert_match("<p>\u2019</p>", xml.target!) #
-+      end
-+
-+      def test_use_entities_if_encoding_is_utf_but_kcode_is_not
-+        xml = Builder::XmlMarkup.new
-+        xml.instruct!(:xml, :encoding => 'UTF-8')
-+        xml.p("\xE2\x80\x99")
-+        assert_match("<p>\u2019</p>", xml.target!) #
-+      end
-     end
- 
--    def test_use_entities_if_encoding_is_utf_but_kcode_is_not
--      $KCODE = 'NONE'
--      xml = Builder::XmlMarkup.new
--      xml.instruct!(:xml, :encoding => 'UTF-8')
--      xml.p("\xE2\x80\x99")
--      assert_match(%r(<p>&#8217;</p>), xml.target!) #
-+    def encode string, encoding
-+      if !String.method_defined?(:encode)
-+        $KCODE = encoding
-+        string
-+      elsif encoding == 'UTF8'
-+        string.force_encoding('UTF-8')
-+      else
-+        string
-+      end
-     end
- 
-     def test_use_entities_if_kcode_is_utf_but_encoding_is_something_else
--      $KCODE = 'UTF8'
-       xml = Builder::XmlMarkup.new
-       xml.instruct!(:xml, :encoding => 'UTF-16')
--      xml.p("\xE2\x80\x99")
-+      xml.p(encode("\xE2\x80\x99", 'UTF8'))
-       assert_match(%r(<p>&#8217;</p>), xml.target!) #
-     end
- 
-     def test_use_utf8_if_encoding_defaults_and_kcode_is_utf8
--      $KCODE = 'UTF8'
-       xml = Builder::XmlMarkup.new
--      xml.p("\xE2\x80\x99")
--      assert_equal "<p>\xE2\x80\x99</p>", xml.target!
-+      xml.p(encode("\xE2\x80\x99",'UTF8'))
-+      assert_equal encode("<p>\xE2\x80\x99</p>",'UTF8'), xml.target!
-     end
- 
-     def test_use_utf8_if_both_encoding_and_kcode_are_utf8
--      $KCODE = 'UTF8'
-       xml = Builder::XmlMarkup.new
-       xml.instruct!(:xml, :encoding => 'UTF-8')
--      xml.p("\xE2\x80\x99")
--      assert_match(%r(<p>\xE2\x80\x99</p>), xml.target!)
-+      xml.p(encode("\xE2\x80\x99",'UTF8'))
-+      assert_match encode("<p>\xE2\x80\x99</p>",'UTF8'), xml.target!
-     end
- 
-     def test_use_utf8_if_both_encoding_and_kcode_are_utf8_with_lowercase
--      $KCODE = 'UTF8'
-       xml = Builder::XmlMarkup.new
-       xml.instruct!(:xml, :encoding => 'utf-8')
--      xml.p("\xE2\x80\x99")
--      assert_match(%r(<p>\xE2\x80\x99</p>), xml.target!)
-+      xml.p(encode("\xE2\x80\x99",'UTF8'))
-+      assert_match encode("<p>\xE2\x80\x99</p>",'UTF8'), xml.target!
-     end
-   end
- 
-Index: Rakefile
-===================================================================
---- Rakefile	(revision 110)
-+++ Rakefile	(working copy)
-@@ -68,7 +68,7 @@
- 
- BLANKSLATE_FILES = FileList[
-   'lib/blankslate.rb',
--  'test/testblankslate.rb'
-+  'test/test_blankslate.rb'
- ]
- 
- if ! defined?(Gem)
-Index: lib/builder/blankslate.rb
-===================================================================
---- lib/builder/blankslate.rb	(revision 110)
-+++ lib/builder/blankslate.rb	(working copy)
-@@ -8,13 +8,16 @@
- # above copyright notice is included.
- #++
- 
--require 'blankslate'
--
- ######################################################################
- # BlankSlate has been promoted to a top level name and is now
- # available as a standalone gem.  We make the name available in the
- # Builder namespace for compatibility.
- #
- module Builder
--  BlankSlate = ::BlankSlate
-+  if Object::const_defined?(:BasicObject)
-+    BlankSlate = ::BasicObject
-+  else
-+    require 'blankslate'
-+    BlankSlate = ::BlankSlate
-+  end
- end
-Index: lib/builder/xmlmarkup.rb
-===================================================================
---- lib/builder/xmlmarkup.rb	(revision 110)
-+++ lib/builder/xmlmarkup.rb	(working copy)
-@@ -195,7 +195,7 @@
-     end
- 
-     def comment!(comment_text)
--      _ensure_no_block block_given?
-+      _ensure_no_block ::Kernel::block_given?
-       _special("<!-- ", " -->", comment_text, nil)
-     end
- 
-@@ -210,13 +210,13 @@
-       @target << "<!#{inst}"
-       args.each do |arg|
-         case arg
--        when String
-+        when ::String
-           @target << %{ "#{arg}"} # " WART
--        when Symbol
-+        when ::Symbol
-           @target << " #{arg}"
-         end
-       end
--      if block_given?
-+      if ::Kernel::block_given?
-         @target << " ["
-         _newline
-         _nested_structures(block)
-@@ -239,7 +239,7 @@
-     # $KCODE is "UTF8", then builder will emit UTF-8 encoded strings
-     # rather than the entity encoding normally used.
-     def instruct!(directive_tag=:xml, attrs={})
--      _ensure_no_block block_given?
-+      _ensure_no_block ::Kernel::block_given?
-       if directive_tag == :xml
-         a = { :version=>"1.0", :encoding=>"UTF-8" }
-         attrs = a.merge attrs
-@@ -261,7 +261,7 @@
-     #        #=> <![CDATA[text to be included in cdata]]>
-     #
-     def cdata!(text)
--      _ensure_no_block block_given?
-+      _ensure_no_block ::Kernel::block_given?
-       _special("<![CDATA[", "]]>", text, nil)
-     end
-     
-@@ -313,7 +313,7 @@
- 
-     def _attr_value(value)
-       case value
--      when Symbol
-+      when ::Symbol
-         value.to_s
-       else
-         _escape_quote(value.to_s)
-@@ -322,8 +322,9 @@
- 
-     def _ensure_no_block(got_block)
-       if got_block
--        fail IllegalBlockError,
--        "Blocks are not allowed on XML instructions"
-+        ::Kernel::raise IllegalBlockError.new(
-+          "Blocks are not allowed on XML instructions"
-+        )
-       end
-     end
- 
-Index: lib/builder/xchar.rb
-===================================================================
---- lib/builder/xchar.rb	(revision 110)
-+++ lib/builder/xchar.rb	(working copy)
-@@ -10,14 +10,14 @@
- 
- module Builder
-   def self.check_for_name_collision(klass, method_name, defined_constant=nil)
--    if klass.instance_methods.include?(method_name.to_s)
-+    if klass.method_defined?(method_name.to_s)
-       fail RuntimeError,
- 	"Name Collision: Method '#{method_name}' is already defined in #{klass}"
-     end
-   end
- end
- 
--if ! defined?(Builder::XChar)
-+if ! defined?(Builder::XChar) and ! String.method_defined?(:encode)
-   Builder.check_for_name_collision(String, "to_xs")
-   Builder.check_for_name_collision(Fixnum, "xchr")
- end
-@@ -78,42 +78,120 @@
-       (0xE000..0xFFFD),
-       (0x10000..0x10FFFF)
-     ]
-+
-+    # http://www.fileformat.info/info/unicode/char/fffd/index.htm
-+    REPLACEMENT_CHAR =
-+      if String.method_defined?(:encode)
-+        "\uFFFD"
-+      elsif $KCODE == 'UTF8'
-+        "\xEF\xBF\xBD"
-+      else
-+        '*'
-+      end
-   end
- 
- end
- 
- 
--######################################################################
--# Enhance the Fixnum class with a XML escaped character conversion.
--#
--class Fixnum
--  XChar = Builder::XChar if ! defined?(XChar)
-+if String.method_defined?(:encode)
-+  module Builder
-+    module XChar # :nodoc:
-+      CP1252_DIFFERENCES, UNICODE_EQUIVALENT = Builder::XChar::CP1252.each.
-+        inject([[],[]]) {|(domain,range),(key,value)|
-+          [domain << key,range << value]
-+        }.map {|seq| seq.pack('U*').force_encoding('utf-8')}
-+  
-+      XML_PREDEFINED = Regexp.new('[' +
-+        Builder::XChar::PREDEFINED.keys.pack('U*').force_encoding('utf-8') +
-+      ']')
-+  
-+      INVALID_XML_CHAR = Regexp.new('[^'+
-+        Builder::XChar::VALID.map { |item|
-+          case item
-+          when Fixnum
-+            [item].pack('U').force_encoding('utf-8')
-+          when Range
-+            [item.first, '-'.ord, item.last].pack('UUU').force_encoding('utf-8')
-+          end
-+        }.join +
-+      ']')
-+  
-+      ENCODING_BINARY = Encoding.find('BINARY')
-+      ENCODING_UTF8   = Encoding.find('UTF-8')
-+      ENCODING_ISO1   = Encoding.find('ISO-8859-1')
- 
--  # XML escaped version of chr. When <tt>escape</tt> is set to false
--  # the CP1252 fix is still applied but utf-8 characters are not
--  # converted to character entities.
--  def xchr(escape=true)
--    n = XChar::CP1252[self] || self
--    case n when *XChar::VALID
--      XChar::PREDEFINED[n] or (n<128 ? n.chr : (escape ? "&##{n};" : [n].pack('U*')))
--    else
--      '*'
-+      # convert a string to valid UTF-8, compensating for a number of
-+      # common errors.
-+      def XChar.unicode(string)
-+        if string.encoding == ENCODING_BINARY
-+          if string.ascii_only?
-+            string
-+          else
-+            string = string.clone.force_encoding(ENCODING_UTF8)
-+            if string.valid_encoding?
-+              string
-+            else
-+              string.encode(ENCODING_UTF8, ENCODING_ISO1)
-+            end
-+          end
-+
-+        elsif string.encoding == ENCODING_UTF8
-+          if string.valid_encoding?
-+            string
-+          else
-+            string.encode(ENCODING_UTF8, ENCODING_ISO1)
-+          end
-+
-+        else
-+          string.encode(ENCODING_UTF8)
-+        end
-+      end
-+
-+      # encode a string per XML rules
-+      def XChar.encode(string)
-+        unicode(string).
-+          tr(CP1252_DIFFERENCES, UNICODE_EQUIVALENT).
-+          gsub(INVALID_XML_CHAR, REPLACEMENT_CHAR).
-+          gsub(XML_PREDEFINED) {|c| PREDEFINED[c.ord]}
-+      end
-     end
-   end
--end
- 
-+else
- 
--######################################################################
--# Enhance the String class with a XML escaped character version of
--# to_s.
--#
--class String
--  # XML escaped version of to_s. When <tt>escape</tt> is set to false
--  # the CP1252 fix is still applied but utf-8 characters are not
--  # converted to character entities.
--  def to_xs(escape=true)
--    unpack('U*').map {|n| n.xchr(escape)}.join # ASCII, UTF-8
--  rescue
--    unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252
-+  ######################################################################
-+  # Enhance the Fixnum class with a XML escaped character conversion.
-+  #
-+  class Fixnum
-+    XChar = Builder::XChar if ! defined?(XChar)
-+  
-+    # XML escaped version of chr. When <tt>escape</tt> is set to false
-+    # the CP1252 fix is still applied but utf-8 characters are not
-+    # converted to character entities.
-+    def xchr(escape=true)
-+      n = XChar::CP1252[self] || self
-+      case n when *XChar::VALID
-+        XChar::PREDEFINED[n] or 
-+          (n<128 ? n.chr : (escape ? "&##{n};" : [n].pack('U*')))
-+      else
-+        Builder::XChar::REPLACEMENT_CHAR
-+      end
-+    end
-   end
-+  
-+
-+  ######################################################################
-+  # Enhance the String class with a XML escaped character version of
-+  # to_s.
-+  #
-+  class String
-+    # XML escaped version of to_s. When <tt>escape</tt> is set to false
-+    # the CP1252 fix is still applied but utf-8 characters are not
-+    # converted to character entities.
-+    def to_xs(escape=true)
-+      unpack('U*').map {|n| n.xchr(escape)}.join # ASCII, UTF-8
-+    rescue
-+      unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252
-+    end
-+  end
- end
-Index: lib/builder/css.rb
-===================================================================
---- lib/builder/css.rb	(revision 110)
-+++ lib/builder/css.rb	(working copy)
-@@ -136,14 +136,14 @@
-     end
- 
-     def id!(arg, &block)
--      _start_container('#'+arg.to_s, nil, block_given?)
-+      _start_container('#'+arg.to_s, nil, ::Kernel.block_given?)
-       _css_block(block) if block
-       _unify_block
-       self
-     end
- 
-     def class!(arg, &block)
--      _start_container('.'+arg.to_s, nil, block_given?)
-+      _start_container('.'+arg.to_s, nil, ::Kernel.block_given?)
-       _css_block(block) if block
-       _unify_block
-       self
-@@ -169,7 +169,7 @@
-     end
- 
-     def method_missing(sym, *args, &block)
--      sym = "#{sym}:#{args.shift}" if args.first.kind_of?(Symbol)
-+      sym = "#{sym}:#{args.shift}" if args.first.kind_of?(::Symbol)
-       if block
-         _start_container(sym, args.first)
-         _css_block(block)
-Index: lib/builder/xmlbase.rb
-===================================================================
---- lib/builder/xmlbase.rb	(revision 110)
-+++ lib/builder/xmlbase.rb	(working copy)
-@@ -40,10 +40,10 @@
-     def method_missing(sym, *args, &block)
-       text = nil
-       attrs = nil
--      sym = "#{sym}:#{args.shift}" if args.first.kind_of?(Symbol)
-+      sym = "#{sym}:#{args.shift}" if args.first.kind_of?(::Symbol)
-       args.each do |arg|
-         case arg
--        when Hash
-+        when ::Hash
-           attrs ||= {}
-           attrs.merge!(arg)
-         else
-@@ -53,15 +53,19 @@
-       end
-       if block
-         unless text.nil?
--          raise ArgumentError, "XmlMarkup cannot mix a text argument with a block"
-+          ::Kernel::raise ::ArgumentError,
-+            "XmlMarkup cannot mix a text argument with a block"
-         end
-         _indent
-         _start_tag(sym, attrs)
-         _newline
--        _nested_structures(block)
--        _indent
--        _end_tag(sym)
--        _newline
-+        begin
-+          _nested_structures(block)
-+        ensure
-+          _indent
-+          _end_tag(sym)
-+          _newline
-+        end
-       elsif text.nil?
-         _indent
-         _start_tag(sym, attrs, true)
-@@ -114,8 +118,22 @@
-     private
-     
-     require 'builder/xchar'
--    def _escape(text)
--      text.to_xs((@encoding != 'utf-8' or $KCODE != 'UTF8'))
-+    if ::String.method_defined?(:encode)
-+      def _escape(text)
-+        result = XChar.encode(text)
-+        begin
-+          result.encode(@encoding)
-+        rescue
-+          # if the encoding can't be supported, use numeric character references
-+          result.
-+            gsub(/[^\u0000-\u007F]/) {|c| "&##{c.ord};"}.
-+            force_encoding('ascii')
-+        end
-+      end
-+    else
-+      def _escape(text)
-+        text.to_xs((@encoding != 'utf-8' or $KCODE != 'UTF8'))
-+      end
-     end
- 
-     def _escape_quote(text)

Modified: trunk/libbuilder-ruby/debian/patches/series
===================================================================
--- trunk/libbuilder-ruby/debian/patches/series	2010-03-21 10:10:10 UTC (rev 4988)
+++ trunk/libbuilder-ruby/debian/patches/series	2010-03-21 15:55:34 UTC (rev 4989)
@@ -1 +1,2 @@
-ruby_1.9
+pre-2.2.0
+tolsen

Added: trunk/libbuilder-ruby/debian/patches/tolsen
===================================================================
--- trunk/libbuilder-ruby/debian/patches/tolsen	                        (rev 0)
+++ trunk/libbuilder-ruby/debian/patches/tolsen	2010-03-21 15:55:34 UTC (rev 4989)
@@ -0,0 +1,829 @@
+Index: builder-2.1.2/lib/builder/blankslate.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/blankslate.rb	2006-12-24 20:29:01.000000000 +0100
++++ builder-2.1.2/lib/builder/blankslate.rb	2010-03-21 16:38:02.000000000 +0100
+@@ -8,13 +8,16 @@
+ # above copyright notice is included.
+ #++
+ 
+-require 'blankslate'
+-
+ ######################################################################
+ # BlankSlate has been promoted to a top level name and is now
+ # available as a standalone gem.  We make the name available in the
+ # Builder namespace for compatibility.
+ #
+ module Builder
+-  BlankSlate = ::BlankSlate
++  if Object::const_defined?(:BasicObject)
++    BlankSlate = ::BasicObject
++  else
++    require 'blankslate'
++    BlankSlate = ::BlankSlate
++  end
+ end
+Index: builder-2.1.2/lib/builder/css.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/css.rb	2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/lib/builder/css.rb	2010-03-21 16:38:02.000000000 +0100
+@@ -136,14 +136,14 @@
+     end
+ 
+     def id!(arg, &block)
+-      _start_container('#'+arg.to_s, nil, block_given?)
++      _start_container('#'+arg.to_s, nil, ::Kernel.block_given?)
+       _css_block(block) if block
+       _unify_block
+       self
+     end
+ 
+     def class!(arg, &block)
+-      _start_container('.'+arg.to_s, nil, block_given?)
++      _start_container('.'+arg.to_s, nil, ::Kernel.block_given?)
+       _css_block(block) if block
+       _unify_block
+       self
+@@ -169,7 +169,7 @@
+     end
+ 
+     def method_missing(sym, *args, &block)
+-      sym = "#{sym}:#{args.shift}" if args.first.kind_of?(Symbol)
++      sym = "#{sym}:#{args.shift}" if args.first.kind_of?(::Symbol)
+       if block
+         _start_container(sym, args.first)
+         _css_block(block)
+Index: builder-2.1.2/lib/builder/xchar.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/xchar.rb	2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/lib/builder/xchar.rb	2010-03-21 16:38:02.000000000 +0100
+@@ -10,14 +10,14 @@
+ 
+ module Builder
+   def self.check_for_name_collision(klass, method_name, defined_constant=nil)
+-    if klass.instance_methods.include?(method_name.to_s)
++    if klass.method_defined?(method_name.to_s)
+       fail RuntimeError,
+ 	"Name Collision: Method '#{method_name}' is already defined in #{klass}"
+     end
+   end
+ end
+ 
+-if ! defined?(Builder::XChar)
++if ! defined?(Builder::XChar) and ! String.method_defined?(:encode)
+   Builder.check_for_name_collision(String, "to_xs")
+   Builder.check_for_name_collision(Fixnum, "xchr")
+ end
+@@ -78,42 +78,120 @@
+       (0xE000..0xFFFD),
+       (0x10000..0x10FFFF)
+     ]
++
++    # http://www.fileformat.info/info/unicode/char/fffd/index.htm
++    REPLACEMENT_CHAR =
++      if String.method_defined?(:encode)
++        "\uFFFD"
++      elsif $KCODE == 'UTF8'
++        "\xEF\xBF\xBD"
++      else
++        '*'
++      end
+   end
+ 
+ end
+ 
+ 
+-######################################################################
+-# Enhance the Fixnum class with a XML escaped character conversion.
+-#
+-class Fixnum
+-  XChar = Builder::XChar if ! defined?(XChar)
+-
+-  # XML escaped version of chr. When <tt>escape</tt> is set to false
+-  # the CP1252 fix is still applied but utf-8 characters are not
+-  # converted to character entities.
+-  def xchr(escape=true)
+-    n = XChar::CP1252[self] || self
+-    case n when *XChar::VALID
+-      XChar::PREDEFINED[n] or (n<128 ? n.chr : (escape ? "&##{n};" : [n].pack('U*')))
+-    else
+-      '*'
++if String.method_defined?(:encode)
++  module Builder
++    module XChar # :nodoc:
++      CP1252_DIFFERENCES, UNICODE_EQUIVALENT = Builder::XChar::CP1252.each.
++        inject([[],[]]) {|(domain,range),(key,value)|
++          [domain << key,range << value]
++        }.map {|seq| seq.pack('U*').force_encoding('utf-8')}
++  
++      XML_PREDEFINED = Regexp.new('[' +
++        Builder::XChar::PREDEFINED.keys.pack('U*').force_encoding('utf-8') +
++      ']')
++  
++      INVALID_XML_CHAR = Regexp.new('[^'+
++        Builder::XChar::VALID.map { |item|
++          case item
++          when Fixnum
++            [item].pack('U').force_encoding('utf-8')
++          when Range
++            [item.first, '-'.ord, item.last].pack('UUU').force_encoding('utf-8')
++          end
++        }.join +
++      ']')
++  
++      ENCODING_BINARY = Encoding.find('BINARY')
++      ENCODING_UTF8   = Encoding.find('UTF-8')
++      ENCODING_ISO1   = Encoding.find('ISO-8859-1')
++
++      # convert a string to valid UTF-8, compensating for a number of
++      # common errors.
++      def XChar.unicode(string)
++        if string.encoding == ENCODING_BINARY
++          if string.ascii_only?
++            string
++          else
++            string = string.clone.force_encoding(ENCODING_UTF8)
++            if string.valid_encoding?
++              string
++            else
++              string.encode(ENCODING_UTF8, ENCODING_ISO1)
++            end
++          end
++
++        elsif string.encoding == ENCODING_UTF8
++          if string.valid_encoding?
++            string
++          else
++            string.encode(ENCODING_UTF8, ENCODING_ISO1)
++          end
++
++        else
++          string.encode(ENCODING_UTF8)
++        end
++      end
++
++      # encode a string per XML rules
++      def XChar.encode(string)
++        unicode(string).
++          tr(CP1252_DIFFERENCES, UNICODE_EQUIVALENT).
++          gsub(INVALID_XML_CHAR, REPLACEMENT_CHAR).
++          gsub(XML_PREDEFINED) {|c| PREDEFINED[c.ord]}
++      end
+     end
+   end
+-end
+ 
++else
+ 
+-######################################################################
+-# Enhance the String class with a XML escaped character version of
+-# to_s.
+-#
+-class String
+-  # XML escaped version of to_s. When <tt>escape</tt> is set to false
+-  # the CP1252 fix is still applied but utf-8 characters are not
+-  # converted to character entities.
+-  def to_xs(escape=true)
+-    unpack('U*').map {|n| n.xchr(escape)}.join # ASCII, UTF-8
+-  rescue
+-    unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252
++  ######################################################################
++  # Enhance the Fixnum class with a XML escaped character conversion.
++  #
++  class Fixnum
++    XChar = Builder::XChar if ! defined?(XChar)
++  
++    # XML escaped version of chr. When <tt>escape</tt> is set to false
++    # the CP1252 fix is still applied but utf-8 characters are not
++    # converted to character entities.
++    def xchr(escape=true)
++      n = XChar::CP1252[self] || self
++      case n when *XChar::VALID
++        XChar::PREDEFINED[n] or 
++          (n<128 ? n.chr : (escape ? "&##{n};" : [n].pack('U*')))
++      else
++        Builder::XChar::REPLACEMENT_CHAR
++      end
++    end
++  end
++  
++
++  ######################################################################
++  # Enhance the String class with a XML escaped character version of
++  # to_s.
++  #
++  class String
++    # XML escaped version of to_s. When <tt>escape</tt> is set to false
++    # the CP1252 fix is still applied but utf-8 characters are not
++    # converted to character entities.
++    def to_xs(escape=true)
++      unpack('U*').map {|n| n.xchr(escape)}.join # ASCII, UTF-8
++    rescue
++      unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252
++    end
+   end
+ end
+Index: builder-2.1.2/lib/builder/xmlbase.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/xmlbase.rb	2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/lib/builder/xmlbase.rb	2010-03-21 16:38:02.000000000 +0100
+@@ -40,10 +40,10 @@
+     def method_missing(sym, *args, &block)
+       text = nil
+       attrs = nil
+-      sym = "#{sym}:#{args.shift}" if args.first.kind_of?(Symbol)
++      sym = "#{sym}:#{args.shift}" if args.first.kind_of?(::Symbol)
+       args.each do |arg|
+         case arg
+-        when Hash
++        when ::Hash
+           attrs ||= {}
+           attrs.merge!(arg)
+         else
+@@ -53,15 +53,19 @@
+       end
+       if block
+         unless text.nil?
+-          raise ArgumentError, "XmlMarkup cannot mix a text argument with a block"
++          ::Kernel::raise ::ArgumentError,
++            "XmlMarkup cannot mix a text argument with a block"
+         end
+         _indent
+         _start_tag(sym, attrs)
+         _newline
+-        _nested_structures(block)
+-        _indent
+-        _end_tag(sym)
+-        _newline
++        begin
++          _nested_structures(block)
++        ensure
++          _indent
++          _end_tag(sym)
++          _newline
++        end
+       elsif text.nil?
+         _indent
+         _start_tag(sym, attrs, true)
+@@ -114,8 +118,22 @@
+     private
+     
+     require 'builder/xchar'
+-    def _escape(text)
+-      text.to_xs((@encoding != 'utf-8' or $KCODE != 'UTF8'))
++    if ::String.method_defined?(:encode)
++      def _escape(text)
++        result = XChar.encode(text)
++        begin
++          result.encode(@encoding)
++        rescue
++          # if the encoding can't be supported, use numeric character references
++          result.
++            gsub(/[^\u0000-\u007F]/) {|c| "&##{c.ord};"}.
++            force_encoding('ascii')
++        end
++      end
++    else
++      def _escape(text)
++        text.to_xs((@encoding != 'utf-8' or $KCODE != 'UTF8'))
++      end
+     end
+ 
+     def _escape_quote(text)
+Index: builder-2.1.2/lib/builder/xmlmarkup.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/xmlmarkup.rb	2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/lib/builder/xmlmarkup.rb	2010-03-21 16:38:02.000000000 +0100
+@@ -196,7 +196,7 @@
+     end
+ 
+     def comment!(comment_text)
+-      _ensure_no_block block_given?
++      _ensure_no_block ::Kernel::block_given?
+       _special("<!-- ", " -->", comment_text, nil)
+     end
+ 
+@@ -211,13 +211,13 @@
+       @target << "<!#{inst}"
+       args.each do |arg|
+         case arg
+-        when String
++        when ::String
+           @target << %{ "#{arg}"} # " WART
+-        when Symbol
++        when ::Symbol
+           @target << " #{arg}"
+         end
+       end
+-      if block_given?
++      if ::Kernel::block_given?
+         @target << " ["
+         _newline
+         _nested_structures(block)
+@@ -240,7 +240,7 @@
+     # $KCODE is "UTF8", then builder will emit UTF-8 encoded strings
+     # rather than the entity encoding normally used.
+     def instruct!(directive_tag=:xml, attrs={})
+-      _ensure_no_block block_given?
++      _ensure_no_block ::Kernel::block_given?
+       if directive_tag == :xml
+         a = { :version=>"1.0", :encoding=>"UTF-8" }
+         attrs = a.merge attrs
+@@ -262,7 +262,7 @@
+     #        #=> <![CDATA[text to be included in cdata]]>
+     #
+     def cdata!(text)
+-      _ensure_no_block block_given?
++      _ensure_no_block ::Kernel::block_given?
+       _special("<![CDATA[", "]]>", text, nil)
+     end
+     
+@@ -314,7 +314,7 @@
+ 
+     def _attr_value(value)
+       case value
+-      when Symbol
++      when ::Symbol
+         value.to_s
+       else
+         _escape_quote(value.to_s)
+@@ -323,8 +323,9 @@
+ 
+     def _ensure_no_block(got_block)
+       if got_block
+-        fail IllegalBlockError,
+-        "Blocks are not allowed on XML instructions"
++        ::Kernel::raise IllegalBlockError.new(
++          "Blocks are not allowed on XML instructions"
++        )
+       end
+     end
+ 
+Index: builder-2.1.2/Rakefile
+===================================================================
+--- builder-2.1.2.orig/Rakefile	2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/Rakefile	2010-03-21 16:38:02.000000000 +0100
+@@ -68,7 +68,7 @@
+ 
+ BLANKSLATE_FILES = FileList[
+   'lib/blankslate.rb',
+-  'test/testblankslate.rb'
++  'test/test_blankslate.rb'
+ ]
+ 
+ if ! defined?(Gem)
+Index: builder-2.1.2/test/test_blankslate.rb
+===================================================================
+--- builder-2.1.2.orig/test/test_blankslate.rb	2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/test/test_blankslate.rb	2010-03-21 16:38:02.000000000 +0100
+@@ -80,126 +80,132 @@
+ ######################################################################
+ # Test case for blank slate.
+ #
+-class TestBlankSlate < Test::Unit::TestCase
+-  def setup
+-    @bs = BlankSlate.new
+-  end
+ 
+-  def test_undefined_methods_remain_undefined
+-    assert_raise(NoMethodError) { @bs.no_such_method }
+-    assert_raise(NoMethodError) { @bs.nil? }
+-  end
++# skip tests if :BasicObject is present
++unless Object::const_defined?(:BasicObject)
+ 
++  class TestBlankSlate < Test::Unit::TestCase
+ 
+-  # NOTE: NameError is acceptable because the lack of a '.' means that
+-  # Ruby can't tell if it is a method or a local variable.
+-  def test_undefined_methods_remain_undefined_during_instance_eval
+-    assert_raise(NoMethodError, NameError)  do
+-      @bs.instance_eval do nil? end
++    def setup
++      @bs = BlankSlate.new
+     end
+-    assert_raise(NoMethodError, NameError)  do
+-      @bs.instance_eval do no_such_method end
++
++    def test_undefined_methods_remain_undefined
++      assert_raise(NoMethodError) { @bs.no_such_method }
++      assert_raise(NoMethodError) { @bs.nil? }
+     end
+-  end
+ 
+-  def test_private_methods_are_undefined
+-    assert_raise(NoMethodError) do
+-      @bs.puts "HI"
++
++    # NOTE: NameError is acceptable because the lack of a '.' means that
++    # Ruby can't tell if it is a method or a local variable.
++    def test_undefined_methods_remain_undefined_during_instance_eval
++      assert_raise(NoMethodError, NameError)  do
++        @bs.instance_eval do nil? end
++      end
++      assert_raise(NoMethodError, NameError)  do
++        @bs.instance_eval do no_such_method end
++      end
+     end
+-  end
+-  
+-  def test_targetted_private_methods_are_undefined_during_instance_eval
+-    assert_raise(NoMethodError, NameError) do
+-      @bs.instance_eval do self.puts "HI" end
++
++    def test_private_methods_are_undefined
++      assert_raise(NoMethodError) do
++        @bs.puts "HI"
++      end
+     end
+-  end
+-  
+-  def test_untargetted_private_methods_are_defined_during_instance_eval
+-    oldstdout = $stdout
+-    $stdout = StringIO.new
+-    @bs.instance_eval do 
+-      puts "HI"
++    
++    def test_targetted_private_methods_are_undefined_during_instance_eval
++      assert_raise(NoMethodError, NameError) do
++        @bs.instance_eval do self.puts "HI" end
++      end
++    end
++    
++    def test_untargetted_private_methods_are_defined_during_instance_eval
++      oldstdout = $stdout
++      $stdout = StringIO.new
++      @bs.instance_eval do 
++        puts "HI"
++      end
++    ensure
++      $stdout = oldstdout
++    end
++    
++    def test_methods_added_late_to_kernel_remain_undefined
++      assert_equal 1234, nil.late_addition
++      assert_raise(NoMethodError) { @bs.late_addition }
+     end
+-  ensure
+-    $stdout = oldstdout
+-  end
+-  
+-  def test_methods_added_late_to_kernel_remain_undefined
+-    assert_equal 1234, nil.late_addition
+-    assert_raise(NoMethodError) { @bs.late_addition }
+-  end
+ 
+-  def test_methods_added_late_to_object_remain_undefined
+-    assert_equal 4321, nil.another_late_addition
+-    assert_raise(NoMethodError) { @bs.another_late_addition }
+-  end
+-  
+-  def test_methods_added_late_to_global_remain_undefined
+-    assert_equal 42, global_inclusion
+-    assert_raise(NoMethodError) { @bs.global_inclusion }
+-  end
++    def test_methods_added_late_to_object_remain_undefined
++      assert_equal 4321, nil.another_late_addition
++      assert_raise(NoMethodError) { @bs.another_late_addition }
++    end
++    
++    def test_methods_added_late_to_global_remain_undefined
++      assert_equal 42, global_inclusion
++      assert_raise(NoMethodError) { @bs.global_inclusion }
++    end
+ 
+-  def test_preload_method_added
+-    assert Kernel.k_added_names.include?(:late_addition)
+-    assert Object.o_added_names.include?(:another_late_addition)
+-  end
++    def test_preload_method_added
++      assert Kernel.k_added_names.include?(:late_addition)
++      assert Object.o_added_names.include?(:another_late_addition)
++    end
+ 
+-  def test_method_defined_late_multiple_times_remain_undefined
+-    assert_equal 22, nil.double_late_addition
+-    assert_raise(NoMethodError) { @bs.double_late_addition }
+-  end
++    def test_method_defined_late_multiple_times_remain_undefined
++      assert_equal 22, nil.double_late_addition
++      assert_raise(NoMethodError) { @bs.double_late_addition }
++    end
+ 
+-  def test_late_included_module_in_object_is_ok
+-    assert_equal 33, 1.late_object
+-    assert_raise(NoMethodError) { @bs.late_object }
+-  end
++    def test_late_included_module_in_object_is_ok
++      assert_equal 33, 1.late_object
++      assert_raise(NoMethodError) { @bs.late_object }
++    end
+ 
+-  def test_late_included_module_in_kernel_is_ok
+-    assert_raise(NoMethodError) { @bs.late_kernel }
+-  end
++    def test_late_included_module_in_kernel_is_ok
++      assert_raise(NoMethodError) { @bs.late_kernel }
++    end
+ 
+-  def test_revealing_previously_hidden_methods_are_callable
+-    with_to_s = Class.new(BlankSlate) do
+-      reveal :to_s
++    def test_revealing_previously_hidden_methods_are_callable
++      with_to_s = Class.new(BlankSlate) do
++        reveal :to_s
++      end
++      assert_match /^#<.*>$/, with_to_s.new.to_s
+     end
+-    assert_match /^#<.*>$/, with_to_s.new.to_s
+-  end
+ 
+-  def test_revealing_previously_hidden_methods_are_callable_with_block
+-    Object.class_eval <<-EOS
++    def test_revealing_previously_hidden_methods_are_callable_with_block
++      Object.class_eval <<-EOS
+       def given_block(&block)
+         block
+       end   
+-    EOS
+-  
+-    with_given_block = Class.new(BlankSlate) do
+-      reveal :given_block
++      EOS
++      
++      with_given_block = Class.new(BlankSlate) do
++        reveal :given_block
++      end
++      assert_not_nil with_given_block.new.given_block {}
+     end
+-    assert_not_nil with_given_block.new.given_block {}
+-  end
+ 
+-  def test_revealing_a_hidden_method_twice_is_ok
+-    with_to_s = Class.new(BlankSlate) do
+-      reveal :to_s
+-      reveal :to_s
++    def test_revealing_a_hidden_method_twice_is_ok
++      with_to_s = Class.new(BlankSlate) do
++        reveal :to_s
++        reveal :to_s
++      end
++      assert_match /^#<.*>$/, with_to_s.new.to_s
+     end
+-    assert_match /^#<.*>$/, with_to_s.new.to_s
+-  end
+ 
+-  def test_revealing_unknown_hidden_method_is_an_error
+-    assert_raises(RuntimeError) do
+-      Class.new(BlankSlate) do
+-        reveal :xyz
++    def test_revealing_unknown_hidden_method_is_an_error
++      assert_raises(RuntimeError) do
++        Class.new(BlankSlate) do
++          reveal :xyz
++        end
+       end
+     end
+-  end
+ 
+-  def test_global_includes_still_work
+-    assert_nothing_raised do
+-      assert_equal 42, global_inclusion
+-      assert_equal 42, Object.new.global_inclusion
+-      assert_equal 42, "magic number".global_inclusion
+-      assert_equal 43, direct_global
++    def test_global_includes_still_work
++      assert_nothing_raised do
++        assert_equal 42, global_inclusion
++        assert_equal 42, Object.new.global_inclusion
++        assert_equal 42, "magic number".global_inclusion
++        assert_equal 43, direct_global
++      end
+     end
+   end
+ 
+Index: builder-2.1.2/test/test_markupbuilder.rb
+===================================================================
+--- builder-2.1.2.orig/test/test_markupbuilder.rb	2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/test/test_markupbuilder.rb	2010-03-21 16:38:03.000000000 +0100
+@@ -108,7 +108,7 @@
+   end
+ 
+   def test_reference_methods
+-    @xml.title { |x| x.a { x.b(name) } }
++    @xml.title { |x| x.a { x.b("bob") } }
+     assert_equal "<title><a><b>bob</b></a></title>", @xml.target!
+   end
+ 
+@@ -118,7 +118,7 @@
+   end
+   
+   def test_ambiguous_markup
+-    ex = assert_raises(ArgumentError) {
++    ex = assert_raise(ArgumentError) {
+       @xml.h1("data1") { b }
+     }
+     assert_match /\btext\b/, ex.message
+@@ -151,9 +151,6 @@
+     assert_equal "<div><span><a href=\"ref\">text</a></span></div>", @xml.target!
+   end
+ 
+-  def name
+-    "bob"
+-  end
+ end
+ 
+ class TestAttributeEscaping < Test::Unit::TestCase
+@@ -228,6 +225,22 @@
+     assert_match /<owl:Restriction>/m, xml.target!
+   end
+   
++  def test_ensure
++    xml = Builder::XmlMarkup.new
++    xml.html do
++      xml.body do
++       begin
++         xml.p do
++           raise Exception.new('boom')
++         end
++       rescue Exception => e
++         xml.pre e
++       end
++      end
++    end
++    assert_match %r{<p>},  xml.target!
++    assert_match %r{</p>}, xml.target!
++  end
+ end
+ 
+ class TestDeclarations < Test::Unit::TestCase
+@@ -334,10 +347,10 @@
+   end
+ 
+   def test_no_blocks
+-    assert_raises(Builder::IllegalBlockError) do
++    assert_raise(Builder::IllegalBlockError) do
+       @xml.instruct! { |x| x.hi }
+     end
+-    assert_raises(Builder::IllegalBlockError) do
++    assert_raise(Builder::IllegalBlockError) do
+       @xml.comment!(:element) { |x| x.hi }
+     end
+   end
+@@ -378,58 +391,83 @@
+   end
+ 
+   class TestUtfMarkup < Test::Unit::TestCase
+-    def setup
+-      @old_kcode = $KCODE
+-    end
++    if ! String.method_defined?(:encode)
++      def setup
++        @old_kcode = $KCODE
++      end
+ 
+-    def teardown
+-      $KCODE = @old_kcode
+-    end
++      def teardown
++        $KCODE = @old_kcode
++      end
+ 
+-    def test_use_entities_if_no_encoding_is_given_and_kcode_is_none
+-      $KCODE = 'NONE'
+-      xml = Builder::XmlMarkup.new
+-      xml.p("\xE2\x80\x99")
+-      assert_match(%r(<p>&#8217;</p>), xml.target!) #
++      def test_use_entities_if_no_encoding_is_given_and_kcode_is_none
++        $KCODE = 'NONE'
++        xml = Builder::XmlMarkup.new
++        xml.p("\xE2\x80\x99")
++        assert_match(%r(<p>&#8217;</p>), xml.target!) #
++      end
++
++      def test_use_entities_if_encoding_is_utf_but_kcode_is_not
++        $KCODE = 'NONE'
++        xml = Builder::XmlMarkup.new
++        xml.instruct!(:xml, :encoding => 'UTF-8')
++        xml.p("\xE2\x80\x99")
++        assert_match(%r(<p>&#8217;</p>), xml.target!) #
++      end
++    else
++      # change in behavior.  As there is no $KCODE anymore, the default
++      # moves from "does not understand utf-8" to "supports utf-8".
++
++      def test_use_entities_if_no_encoding_is_given_and_kcode_is_none
++        xml = Builder::XmlMarkup.new
++        xml.p("\xE2\x80\x99")
++        assert_match("<p>\u2019</p>", xml.target!) #
++      end
++
++      def test_use_entities_if_encoding_is_utf_but_kcode_is_not
++        xml = Builder::XmlMarkup.new
++        xml.instruct!(:xml, :encoding => 'UTF-8')
++        xml.p("\xE2\x80\x99")
++        assert_match("<p>\u2019</p>", xml.target!) #
++      end
+     end
+ 
+-    def test_use_entities_if_encoding_is_utf_but_kcode_is_not
+-      $KCODE = 'NONE'
+-      xml = Builder::XmlMarkup.new
+-      xml.instruct!(:xml, :encoding => 'UTF-8')
+-      xml.p("\xE2\x80\x99")
+-      assert_match(%r(<p>&#8217;</p>), xml.target!) #
++    def encode string, encoding
++      if !String.method_defined?(:encode)
++        $KCODE = encoding
++        string
++      elsif encoding == 'UTF8'
++        string.force_encoding('UTF-8')
++      else
++        string
++      end
+     end
+ 
+     def test_use_entities_if_kcode_is_utf_but_encoding_is_something_else
+-      $KCODE = 'UTF8'
+       xml = Builder::XmlMarkup.new
+       xml.instruct!(:xml, :encoding => 'UTF-16')
+-      xml.p("\xE2\x80\x99")
++      xml.p(encode("\xE2\x80\x99", 'UTF8'))
+       assert_match(%r(<p>&#8217;</p>), xml.target!) #
+     end
+ 
+     def test_use_utf8_if_encoding_defaults_and_kcode_is_utf8
+-      $KCODE = 'UTF8'
+       xml = Builder::XmlMarkup.new
+-      xml.p("\xE2\x80\x99")
+-      assert_equal "<p>\xE2\x80\x99</p>", xml.target!
++      xml.p(encode("\xE2\x80\x99",'UTF8'))
++      assert_equal encode("<p>\xE2\x80\x99</p>",'UTF8'), xml.target!
+     end
+ 
+     def test_use_utf8_if_both_encoding_and_kcode_are_utf8
+-      $KCODE = 'UTF8'
+       xml = Builder::XmlMarkup.new
+       xml.instruct!(:xml, :encoding => 'UTF-8')
+-      xml.p("\xE2\x80\x99")
+-      assert_match(%r(<p>\xE2\x80\x99</p>), xml.target!)
++      xml.p(encode("\xE2\x80\x99",'UTF8'))
++      assert_match encode("<p>\xE2\x80\x99</p>",'UTF8'), xml.target!
+     end
+ 
+     def test_use_utf8_if_both_encoding_and_kcode_are_utf8_with_lowercase
+-      $KCODE = 'UTF8'
+       xml = Builder::XmlMarkup.new
+       xml.instruct!(:xml, :encoding => 'utf-8')
+-      xml.p("\xE2\x80\x99")
+-      assert_match(%r(<p>\xE2\x80\x99</p>), xml.target!)
++      xml.p(encode("\xE2\x80\x99",'UTF8'))
++      assert_match encode("<p>\xE2\x80\x99</p>",'UTF8'), xml.target!
+     end
+   end
+ 
+Index: builder-2.1.2/test/test_xchar.rb
+===================================================================
+--- builder-2.1.2.orig/test/test_xchar.rb	2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/test/test_xchar.rb	2010-03-21 16:38:03.000000000 +0100
+@@ -15,7 +15,28 @@
+ require 'test/unit'
+ require 'builder/xchar'
+ 
++if String.method_defined?(:encode)
++  class String
++    ENCODING_BINARY = Encoding.find('BINARY')
++
++    # shim method for testing purposes
++    def to_xs(escape=true)
++      raise NameError.new('to_xs') unless caller[0].index(__FILE__)
++
++      result = Builder::XChar.encode(self)
++      if escape
++        result.gsub(/[^\u0000-\u007F]/) {|c| "&##{c.ord};"}
++      else
++        # really only useful for testing purposes
++        result.force_encoding(ENCODING_BINARY)
++      end
++    end
++  end
++end
++
+ class TestXmlEscaping < Test::Unit::TestCase
++  REPLACEMENT_CHAR = Builder::XChar::REPLACEMENT_CHAR.to_xs
++
+   def test_ascii
+     assert_equal 'abc', 'abc'.to_xs
+   end
+@@ -27,9 +48,9 @@
+   end
+ 
+   def test_invalid
+-    assert_equal '*', "\x00".to_xs               # null
+-    assert_equal '*', "\x0C".to_xs               # form feed
+-    assert_equal '*', "\xEF\xBF\xBF".to_xs       # U+FFFF
++    assert_equal REPLACEMENT_CHAR, "\x00".to_xs               # null
++    assert_equal REPLACEMENT_CHAR, "\x0C".to_xs               # form feed
++    assert_equal REPLACEMENT_CHAR, "\xEF\xBF\xBF".to_xs       # U+FFFF
+   end
+ 
+   def test_iso_8859_1

Modified: trunk/libbuilder-ruby/debian/rules
===================================================================
--- trunk/libbuilder-ruby/debian/rules	2010-03-21 10:10:10 UTC (rev 4988)
+++ trunk/libbuilder-ruby/debian/rules	2010-03-21 15:55:34 UTC (rev 4989)
@@ -3,6 +3,7 @@
 # CDBS file to build the Builder Ruby package.
 
 include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/ruby-pkg-tools/1/class/ruby-common.mk
 
 $(patsubst %,install/%,$(DEB_RUBY_REAL_LIB_PACKAGES)) :: install/% :
 	mkdir -p debian/libbuilder-ruby$(cdbs_ruby_ver)/usr/lib/ruby/$(cdbs_ruby_ver)




More information about the Pkg-ruby-extras-commits mailing list