Wiki to XML using Ant

Folks,

I have been working hard for the past few days, so that I could write an Ant task that could simplify the task of converting WikiCreole Markup to XML format. This conversion was made possible due to the efforts of Martin Junghans and Dirk Riehle. They did research on this subject. As a result, they created an EBNF grammar and an XML interchange format (Creole 1.0).

Brief History

A fried of mine had checkout the sources from SourceForge, this year. Firstly, he used ANTLR to generate the Lexer and Parser files from given grammar file, using a system that had atleast 2 GB RAM.

He re-used the code and made few new classes, just for the sake of running the project and checking the workflow. It worked, sample files having wikicreole markup content were converted to XML format using the XML Schema, defined in Riehle’s and Martin’s second research paper.

CreoleTask

As I want to create support for the same in the NetBeans IDE. The NetBeans IDE makes good use of Ant and Maven, so I wanted to create a task of my own that will take care of the necessary classes that are required to make it possible to convert Wiki to XML. Today, I spent time learning about writing Ant Tasks and this is what I got;

public class CreoleTask extends Task {

 private String gLoc = "creole10.g";
 private String wikipage;

 @Override
 public void execute() throws BuildException {
   ParserHandler ph = new ParserHandler(new Grammar(gLoc));
   if (wikipage == null) {
     throw new BuildException("File not found..");
   }
   wikipage = wikipage.replace('/', '\\');
   log("Importing wikipage " + this.wikipage);
   ph.parseWp(this.wikipage);
 }

 public void setWikipage(String wikipage) {
   this.wikipage = wikipage;
 }
}

Now, what I need is the JAR that contains CreoleTask.class. So, I created a Java Application using NetBeans IDE and opened its build.xml;

<project name="CreoleAnt" default="default" basedir=".">
    <description>Builds, tests, and runs the project CreoleAnt.</description>
    <import file="nbproject/build-impl.xml"/>
</project>

This file contains comments as well;

There exist several targets which are by default empty and which can be used for execution of your tasks. These targets are usually executed before and after some main targets.

I have done this before, i.e. I override an empty target to deploy war file on build. Today, I overriden target -post-jar and added the following;

    <property name="wiki.dir" value="${basedir}/wikipages"/>    

    <target name="-post-jar" depends="-init-project">
        <antcall target="-xml-to-creole"/>
    </target>

    <target name="-xml-to-creole">
        <taskdef name="creole" classname="creole.ant.CreoleTask"
        classpath="${dist.jar}"/>
        <creole wikipage="${wiki.dir}/description"/>
    </target>

As you can see, I added a dependency on target -init-project, that’s because I wanted to reuse the property created in project.properties by NetBeans IDE. In my case, I reused  dist.jar property and created new one, wiki.dir. So, I have kept few samples in wikipages directory under the basedir, i.e. project’s root directory. Now, I define a task with the name creole which maps to CreoleTask.

Attribute wikipage maps to setter method of private variable wikipage. Its not a bean class, so its not necessary that the setter method relates to the private members. As shown above, I have passed ${wiki.dir}/description.txt as parameter to the setter method and that’s used by execute method. This method is overriden to run your own code. Its called automatically by Ant, whenever there’s tag present for the defined task.

Its just the beginning, exploration continues!

<property name=”wiki.dir” value=”${basedir}/wikipages”/><target name=”-post-jar” depends=”-init-project”>
<antcall target=”-creole-to-html”/>
</target><target name=”-xml-to-creole”>
<taskdef name=”creole” classname=”creole.ant.CreoleTask”
classpath=”${dist.jar}”/>
<creole wikipage=”${wiki.dir}/description”/>
</target>
Advertisements

SVN, Batch Scripts and NetBeans Platform

Wrote a single-line batch program to add the sources of NetBeans Platform to the local working copy at my system. Recently, I had downloaded the sources for NetBeans Platform 6.0, 6.1, 6.5 and 6.7.  Now, I want to commit and tag these sources at PrayogShala. So, I extracted the zip files and checkout the project’s root (let it be denoted by SVNROOT_DIR) on my system.

As I have SVN repository, so I can add any file/folder locally using svn add to become part of the working copy (SVNROOT_DIR). This way, when I will commit using svn commit, I will be able to commit all the locally added files.

Batch Program

This is easily done using IDE’s like NetBeans IDE. However, I was in no mood to run the IDE and open 50+ projects. Then, individually commit them. So, I thought of creating a batch program for this purpose. The batch program should be run from within the working copy, as the svn add command will work only under working copy.

for /d %%X in (%1\*) do svn add %%X

Look simple, isn’t it? Well, it isn’t for a newbie like me. I had to refer internet to learn some batch programming for the purpose. Hence, I was able to code the above. You can refer to one more batch program, I wrote last month for different purpose. Although, its still related to NetBeans IDE.

Explanation

This program loops (for … in … do) through the immediate sub-directories (%%X) of the root passed as runtime argument (%1). Then, each sub-directory is added (svn add) to the working copy.

For instance, I extracted the zip file for NetBeans Platform 6.5 under C:\nb65 directory. Then, this directory will be passed as runtime argument to the batch program. As, this directory would have sources for all the netbeans module projects. Now, svn add command will automatically scan and add any files/folders found under each module project’s directory.

Further Usage

Well, one can tweak the above batch program to create a text file, that will list full-path-name of all the files, under those directories.

for /d %%X in (%1\*) do echo %%X >> list_of_files.txt

Update (July 18th)

I have created another batch file, named it nbsvn.bat

svn add %1
svn commit -m "Tagging %1 of NB 6.5" %1

When I tried to commit all the added folders at one go, I had problems. So, I changed the method, I have created the SVNROOT_DIR and added all the modules once again. Now, I will run the above script for every module found inside the SVNROOT_DIR.

for /d %%X in (%1\*) do call nbsvn %%X

Hope this helps..

Namaskar Duniya..

Namastey..

This is the first entry for this blog, so it won’t be as descriptive or helpful, as rest would be. I will be continuing few blog series, I had started on my popular blog with title N, Varun over here. Also, I will feature all the latest news about the FOSS projects, I am working on. Here’s brief overview about them;

NBRCP Kolektiv (@ Kenai)

This project is basically a container for projects I would create for all the experiments I would like to carry out with NetBeans Platform, NetBeans IDE and possibly enhance my skills.

PrayogShala (@ SourceForge)

This will the place where I will carry out all the experimentation by making use of Version Control Systems, Issue Trackers and various other technologies to possibly enhance my skills.

Other News
http://nbguru.wordpress.com/2009/06/30/james-gosling-nbdt-honorary-member/

Stay tuned for more action..