<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title>Projects Feed (Atom)</title>
  <link href="http://unindented.org/projects/atom/index.xml" rel="self" />
  <link href="http://unindented.org/" />
  <updated>2009-12-16T00:14:26+01:00</updated>
  <author>
    <name>Daniel Perez Alvarez</name>
    <email>daniel@unindented.org</email>
  </author>
  <id>http://unindented.org/</id>

  <entry>
    <id>tag:unindented.org,2009-11-28:1259434394</id>
    <title>Copong for iPhone</title>
    <updated>2009-11-28T19:53:14+01:00</updated>
    <link href="http://unindented.org/projects/copong-iphone/" rel="alternate" />
    <summary>A clone of the classic Pong video game, made with Cocos2D for iPhone.</summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>Not much to say, we all know Pong: two players, each controlling a paddle, hit a ball back and forth until one of them fails to return it:</p>

<p><img src="http://unindented.org/projects/copong-iphone/image-01.png" alt="Pong title screen" /></p>

<p><img src="http://unindented.org/projects/copong-iphone/image-02.png" alt="Pong in-game screen" /></p>

<h3>Behind the scenes</h3>

<p>My goal with this project was to learn a bit about iPhone game development. It uses <a href="http://www.cocos2d-iphone.org/">Cocos2D for iPhone</a>, an excellent open-source framework for building 2D games on the iPhone. I will certainly be returning to it for my next games.</p>

<p>Anyway, check out the source code for <a href="http://github.com/unindented/copong-iphone">Copong on GitHub</a>!</p>
</div>
    </content>
    <category term="Cocos2D" />
    <category term="iPhone" />
    <category term="Games" />
  </entry>
  <entry>
    <id>tag:unindented.org,2009-09-28:1254162058</id>
    <title>XSLT Tester Applet</title>
    <updated>2009-09-28T20:20:58+02:00</updated>
    <link href="http://unindented.org/projects/xslt-tester-applet/" rel="alternate" />
    <summary>A simple XSLT tester applet.</summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>Another applet, this one dedicated to my beloved XSLT. It allows you to quickly test your XSLT stylesheet against a XML document.</p>

<p>Run the <a href="http://unindented.org/projects/xslt-tester-applet/run/">XSLT Tester Applet</a> now!</p>

<h3>Behind the scenes</h3>

<p>Most of the code for this application is Swing-related stuff. The only two interesting pieces of code are those that deal with prettifying and transforming the XML document.</p>

<h4>Prettifying</h4>

<p>This method formats the XML so that it is easier to read, using the <a href="http://www.dom4j.org/">dom4j</a> library:</p>

<div class="highlight"><pre><span class="kd">public</span> <span class="kd">static</span> <span class="n">String</span> <span class="nf">prettify</span><span class="o">(</span><span class="kd">final</span> <span class="n">String</span> <span class="n">xml</span><span class="o">)</span>
<span class="o">{</span>
  <span class="n">StringWriter</span> <span class="n">output</span> <span class="o">=</span> <span class="k">new</span> <span class="n">StringWriter</span><span class="o">();</span>

  <span class="k">try</span>
  <span class="o">{</span>
    <span class="n">OutputFormat</span> <span class="n">format</span> <span class="o">=</span> <span class="n">OutputFormat</span><span class="o">.</span><span class="na">createPrettyPrint</span><span class="o">();</span>
    <span class="n">XMLWriter</span> <span class="n">writer</span> <span class="o">=</span> <span class="k">new</span> <span class="n">XMLWriter</span><span class="o">(</span><span class="n">output</span><span class="o">,</span> <span class="n">format</span><span class="o">);</span>

    <span class="n">Document</span> <span class="n">document</span> <span class="o">=</span> <span class="n">DocumentHelper</span><span class="o">.</span><span class="na">parseText</span><span class="o">(</span><span class="n">xml</span><span class="o">);</span>
    <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="n">document</span><span class="o">);</span>
    <span class="n">writer</span><span class="o">.</span><span class="na">flush</span><span class="o">();</span>
  <span class="o">}</span>
  <span class="k">catch</span> <span class="o">(</span><span class="n">Exception</span> <span class="n">e</span><span class="o">)</span>
  <span class="o">{</span>
    <span class="k">return</span> <span class="n">xml</span><span class="o">;</span>
  <span class="o">}</span>

  <span class="k">return</span> <span class="n">output</span><span class="o">.</span><span class="na">toString</span><span class="o">();</span>
<span class="o">}</span>
</pre></div>


<h4>Transforming</h4>

<p>This method applies a XSLT stylesheet to a XML document, using the <a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/xml/transform/Transformer.html">javax.xml.transform.Transformer</a> class:</p>

<div class="highlight"><pre><span class="kd">public</span> <span class="kd">static</span> <span class="n">String</span> <span class="nf">transform</span><span class="o">(</span><span class="kd">final</span> <span class="n">Source</span> <span class="n">xml</span><span class="o">,</span> <span class="kd">final</span> <span class="n">Source</span> <span class="n">xslt</span><span class="o">,</span>
  <span class="kd">final</span> <span class="n">Map</span> <span class="n">params</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">TransformerException</span>
<span class="o">{</span>
  <span class="n">TransformerFactory</span> <span class="n">factory</span> <span class="o">=</span> <span class="n">TransformerFactory</span><span class="o">.</span><span class="na">newInstance</span><span class="o">();</span>
  <span class="n">Transformer</span> <span class="n">transform</span> <span class="o">=</span> <span class="n">factory</span><span class="o">.</span><span class="na">newTransformer</span><span class="o">(</span><span class="n">xslt</span><span class="o">);</span>

  <span class="c1">// optional parameters for the XSLT</span>
  <span class="k">if</span> <span class="o">(</span><span class="n">params</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span>
  <span class="o">{</span>
    <span class="k">for</span> <span class="o">(</span><span class="n">Iterator</span> <span class="n">iter</span> <span class="o">=</span> <span class="n">params</span><span class="o">.</span><span class="na">entrySet</span><span class="o">().</span><span class="na">iterator</span><span class="o">();</span> <span class="n">iter</span><span class="o">.</span><span class="na">hasNext</span><span class="o">();)</span>
    <span class="o">{</span>
      <span class="n">Entry</span> <span class="n">param</span> <span class="o">=</span> <span class="o">(</span><span class="n">Entry</span><span class="o">)</span> <span class="n">iter</span><span class="o">.</span><span class="na">next</span><span class="o">();</span>
      <span class="n">transform</span><span class="o">.</span><span class="na">setParameter</span><span class="o">((</span><span class="n">String</span><span class="o">)</span> <span class="n">param</span><span class="o">.</span><span class="na">getKey</span><span class="o">(),</span> <span class="n">param</span><span class="o">.</span><span class="na">getValue</span><span class="o">());</span>
    <span class="o">}</span>
  <span class="o">}</span>

  <span class="n">StreamResult</span> <span class="n">result</span> <span class="o">=</span> <span class="k">new</span> <span class="n">StreamResult</span><span class="o">(</span><span class="k">new</span> <span class="n">StringWriter</span><span class="o">());</span>
  <span class="n">transform</span><span class="o">.</span><span class="na">transform</span><span class="o">(</span><span class="n">xml</span><span class="o">,</span> <span class="n">result</span><span class="o">);</span>

  <span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="na">getWriter</span><span class="o">().</span><span class="na">toString</span><span class="o">();</span>
<span class="o">}</span>
</pre></div>


<p>Check out the source code for the <a href="http://github.com/unindented/xslt-tester-applet">XSLT Tester Applet on GitHub</a>!</p>
</div>
    </content>
    <category term="XML" />
    <category term="XSLT" />
    <category term="Java" />
    <category term="Applet" />
  </entry>
  <entry>
    <id>tag:unindented.org,2009-09-24:1253745045</id>
    <title>Java Regex Tester Applet</title>
    <updated>2009-09-24T00:30:45+02:00</updated>
    <link href="http://unindented.org/projects/java-regex-tester-applet/" rel="alternate" />
    <summary>A simple regular expression tester applet.</summary>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>Out of my love for regular expressions comes this cool applet. It allows you to quickly test a regex before embedding it in your Java program.</p>

<p>Run the <a href="http://unindented.org/projects/java-regex-tester-applet/run/">Java Regex Tester Applet</a> now!</p>

<h3>Behind the scenes</h3>

<p>Most of the code for this application is Swing-related stuff. Probably the only interesting part is the one that deals with capturing regular expression groups. This snippet illustrates the process:</p>

<div class="highlight"><pre><span class="c1">// simple email regex</span>
<span class="n">String</span> <span class="n">regex</span> <span class="o">=</span> <span class="s">&quot;(?i)([A-Z0-9._%+-]+)@(([A-Z0-9.-]+)\\.([A-Z]{2,4}))&quot;</span><span class="o">;</span>
<span class="n">String</span> <span class="n">test</span> <span class="o">=</span> <span class="s">&quot;spam@unindented.org&quot;</span><span class="o">;</span>

<span class="c1">// compile regex</span>
<span class="n">Pattern</span> <span class="n">pattern</span> <span class="o">=</span> <span class="n">Pattern</span><span class="o">.</span><span class="na">compile</span><span class="o">(</span><span class="n">regex</span><span class="o">);</span>
<span class="c1">// and match test string against it</span>
<span class="n">Matcher</span> <span class="n">matcher</span> <span class="o">=</span> <span class="n">pattern</span><span class="o">.</span><span class="na">matcher</span><span class="o">(</span><span class="n">test</span><span class="o">);</span>

<span class="k">if</span> <span class="o">(</span><span class="n">matcher</span><span class="o">.</span><span class="na">find</span><span class="o">())</span>
<span class="o">{</span>
  <span class="n">StringBuffer</span> <span class="n">capture</span> <span class="o">=</span> <span class="k">new</span> <span class="n">StringBuffer</span><span class="o">();</span>
  <span class="k">do</span>
  <span class="o">{</span>
    <span class="c1">// group zero always stands for the entire expression</span>
    <span class="n">capture</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="n">matcher</span><span class="o">.</span><span class="na">group</span><span class="o">(</span><span class="mi">0</span><span class="o">)</span> <span class="o">+</span> <span class="s">&quot;\n&quot;</span><span class="o">);</span>
    <span class="c1">// remaining groups will be printed along with their index</span>
    <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">matcher</span><span class="o">.</span><span class="na">groupCount</span><span class="o">();</span> <span class="n">i</span><span class="o">++)</span>
    <span class="o">{</span>
      <span class="n">capture</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="n">i</span> <span class="o">+</span> <span class="s">&quot;. &quot;</span> <span class="o">+</span> <span class="n">matcher</span><span class="o">.</span><span class="na">group</span><span class="o">(</span><span class="n">i</span><span class="o">)</span> <span class="o">+</span> <span class="s">&quot;\n&quot;</span><span class="o">);</span>
    <span class="o">}</span>
    <span class="n">capture</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="s">&quot;\n&quot;</span><span class="o">);</span>
  <span class="o">}</span>
  <span class="k">while</span> <span class="o">(</span><span class="n">matcher</span><span class="o">.</span><span class="na">find</span><span class="o">());</span>

  <span class="c1">// output results</span>
  <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">capture</span><span class="o">.</span><span class="na">toString</span><span class="o">());</span>
<span class="o">}</span>
</pre></div>


<p>Which would output:</p>

<div class="highlight"><pre>spam@unindented.org
1. spam
2. unindented.org
3. unindented
4. org
</pre></div>


<p>Check the <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html">java.util.regex.Pattern</a> and <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Matcher.html">java.util.regex.Matcher</a> API specifications for in-depth information on regular expressions in Java.</p>

<p>And, of course, check out the source code for the <a href="http://github.com/unindented/java-regex-tester-applet">Java Regex Tester Applet on GitHub</a>!</p>
</div>
    </content>
    <category term="Regex" />
    <category term="Java" />
    <category term="Applet" />
  </entry>

</feed>

