You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ivy-commits@incubator.apache.org by xa...@apache.org on 2007/03/27 07:08:51 UTC

svn commit: r522796 - in /incubator/ivy/core/trunk: build-release.xml build.properties build.xml doc/toc.json doc/xooki/xooki.js

Author: xavier
Date: Tue Mar 27 00:08:50 2007
New Revision: 522796

URL: http://svn.apache.org/viewvc?view=rev&rev=522796
Log:
review release management:
- extract in a separate build file (build-release.xml)
- upgrade xooki version (featuring batch generation)
- include doc batch generation
- review what is packaged in distributions (src and bin)

Added:
    incubator/ivy/core/trunk/build-release.xml
Modified:
    incubator/ivy/core/trunk/build.properties
    incubator/ivy/core/trunk/build.xml
    incubator/ivy/core/trunk/doc/toc.json
    incubator/ivy/core/trunk/doc/xooki/xooki.js

Added: incubator/ivy/core/trunk/build-release.xml
URL: http://svn.apache.org/viewvc/incubator/ivy/core/trunk/build-release.xml?view=auto&rev=522796
==============================================================================
--- incubator/ivy/core/trunk/build-release.xml (added)
+++ incubator/ivy/core/trunk/build-release.xml Tue Mar 27 00:08:50 2007
@@ -0,0 +1,134 @@
+<project name="IvyRelease" default="snapshot" xmlns:ivy="antlib:fr.jayasoft.ivy.ant">
+	<import file="build.xml"/>
+
+	<target name="generate-doc">
+		<!-- requires java 6 jdk in path and Apache Ant 1.7 -->
+        <copy todir="${doc.build.dir}">
+	        <fileset dir="${doc.src.dir}" includes="images/**,style/**,samples/**" />
+        </copy>
+        <script language="javascript"><![CDATA[
+          importClass(java.io.File);
+        
+	      fs = project.createDataType("fileset");
+	      fs.setDir( new File(project.getProperty("doc.src.dir")) );
+	      fs.setIncludes("**/*.html");
+	      fs.setExcludes("template.html,"
+	      				+"*Template.html,"
+	      				+"conflict-solving-algo.html,"
+	      				+"doc/use.html,"
+	      				+"doc/reference.html,"
+	      				+"samples/**,"
+	      				+"reports/**,"
+	      				+"xooki/**,"
+	      				+"presentations/**,"
+	      				+"test/**");
+	
+	      // Get the files (array) of that fileset
+	      ds = fs.getDirectoryScanner(project);
+	      srcFiles = ds.getIncludedFiles();
+	
+	      // iterate over that array
+	      for (i=0; i<srcFiles.length; i++) {
+	
+	        // get the values via Java API
+	        var file = new File(fs.getDir(project), srcFiles[i]);
+	        
+			var basedir = file.getParent();
+			var filename = file.getName();
+			var filepath = srcFiles[i].substring(0, srcFiles[i].lastIndexOf(project.getProperty("file.separator"))+1);
+        
+	        exec = project.createTask("exec");
+	        exec.setDir(new File(basedir));
+	        exec.setExecutable("jrunscript");
+	        exec.createArg().setValue(project.getProperty("doc.src.dir")+"/xooki/xooki.js");
+	        exec.createArg().setValue("-noddtree");
+	        exec.createArg().setValue(filename);
+	        exec.createArg().setValue(project.getProperty("doc.build.dir")+"/"+filepath);
+	        exec.perform();
+		  }
+        ]]></script>
+	</target>
+
+	<target name="all-doc" depends="javadoc, generate-doc" />
+	
+	<target name="snapshot-src" depends="default-version,all-doc">
+		<mkdir dir="${distrib.dir}"/>
+		<zip destfile="${distrib.dir}/ivy-${build.version}-src.zip">
+			<zipfileset dir="${doc.build.dir}" prefix="ivy-${build.version}/doc"/>
+			<zipfileset dir="${src.dir}" prefix="ivy-${build.version}/src/java"/>
+			<zipfileset dir="${basedir}/src/example" prefix="ivy-${build.version}/src/example"/>
+			<zipfileset dir="${test.dir}" prefix="ivy-${build.version}/test/java"/>
+			<zipfileset dir="${basedir}/test/repositories" prefix="ivy-${build.version}/test/repositories"/>
+			<zipfileset dir="${basedir}/test/buildlist" prefix="ivy-${build.version}/test/buildlist"/>
+			<zipfileset dir="${basedir}/test/triggers" prefix="ivy-${build.version}/test/triggers"/>
+			<zipfileset dir="${basedir}/test/xsl" prefix="ivy-${build.version}/test/xsl"/>
+			<zipfileset dir="${src.dir}/org/apache/ivy/plugins/parser/xml" includes="ivy.xsd" fullpath="ivy-${build.version}/ivy.xsd"/>
+			<zipfileset dir="${basedir}" includes="DISCLAIMER" fullpath="ivy-${build.version}/DISCLAIMER"/>
+			<zipfileset dir="${basedir}" includes="LICENSE" fullpath="ivy-${build.version}/LICENSE"/>
+			<zipfileset dir="${basedir}" includes="CHANGES.txt" fullpath="ivy-${build.version}/CHANGES.txt"/>
+			<zipfileset dir="${basedir}" includes="RELEASE_NOTES" fullpath="ivy-${build.version}/RELEASE_NOTES"/>
+			<zipfileset dir="${basedir}" includes="ivysettings.xml" fullpath="ivy-${build.version}/ivysettings.xml"/>
+			<zipfileset dir="${basedir}" includes="build.properties" fullpath="ivy-${build.version}/build.properties"/>
+			<zipfileset dir="${basedir}" includes="ivy.xml" fullpath="ivy-${build.version}/ivy.xml"/>
+
+			<zipfileset dir="${basedir}" includes="build.xml" fullpath="ivy-${build.version}/build.xml"/>
+		</zip>
+	</target>
+
+	<target name="snapshot-bin" depends="default-version, jar, all-doc">
+		<mkdir dir="${distrib.dir}"/>
+		<ivy:deliver 
+			deliverpattern="${distrib.dir}/ivy.xml" 
+			pubrevision="${build.version}" 
+			pubdate="${pubdate}"
+		    status="${status}"/>
+		<zip destfile="${distrib.dir}/ivy-${build.version}-bin.zip">
+			<zipfileset dir="${doc.build.dir}" prefix="ivy-${build.version}/doc"/>
+			<zipfileset dir="${basedir}/src/example" prefix="ivy-${build.version}/src/example"/>
+			<zipfileset dir="${basedir}" includes="DISCLAIMER" fullpath="ivy-${build.version}/DISCLAIMER"/>
+			<zipfileset dir="${basedir}" includes="LICENSE" fullpath="ivy-${build.version}/LICENSE"/>
+			<zipfileset dir="${basedir}" includes="CHANGES.txt" fullpath="ivy-${build.version}/CHANGES.txt"/>
+			<zipfileset dir="${basedir}" includes="RELEASE_NOTES" fullpath="ivy-${build.version}/RELEASE_NOTES"/>
+			<zipfileset dir="${src.dir}/org/apache/ivy/plugins/parser/xml" includes="ivy.xsd" fullpath="ivy-${build.version}/ivy.xsd"/>
+			<zipfileset dir="${distrib.dir}" includes="ivy.xml" fullpath="ivy-${build.version}/ivy.xml"/>
+
+			<zipfileset dir="${artifacts.build.dir}" includes="${final.name}" fullpath="ivy-${build.version}/ivy-${build.version}.jar"/>
+			<zipfileset dir="${artifacts.build.dir}" includes="${final.core.name}" fullpath="ivy-${build.version}/ivy-core-${build.version}.jar"/>
+		</zip>
+		<copy file="${basedir}/DISCLAIMER" todir="${distrib.dir}" />
+		<copy file="${basedir}/LICENSE" todir="${distrib.dir}" />
+		<copy file="${basedir}/CHANGES.txt" todir="${distrib.dir}" />
+		<copy file="${basedir}/RELEASE_NOTES" todir="${distrib.dir}" />
+		<copy file="${artifacts.build.dir}/${final.name}" todir="${distrib.dir}" />
+		<copy file="${artifacts.build.dir}/${final.core.name}" todir="${distrib.dir}" />
+		<copy file="${src.dir}/org/apache/ivy/plugins/parser/xml/ivy.xsd" todir="${distrib.dir}" />
+	</target>
+	
+	<target name="snapshot-version">
+		<property name="version.prefix" value="${target.ivy.version}-dev-"/>
+	</target>
+	
+	<target name="release-version">
+		<input message="please enter version: " addproperty="build.version"/>
+		<input message="please enter status: (integration,milestone,release)" addproperty="status"/>
+	</target>
+	
+	<target name="snapshot" depends="clean, snapshot-version, coverage-report, snapshot-src, snapshot-bin" description="used for nightly and integration builds"/>
+	<target name="release" depends="release-version, snapshot" description="make a new release of Ivy"/>
+
+	<!-- 
+		publication on ivy web site
+		requires to be logged in on people.apache.org 
+	-->
+	<available property="loggedin" file="/www/incubator.apache.org/ivy/index.html"/>
+	<target name="publish-latest" if="loggedin" description="publishes the last snapshot done to ivy web site">
+	   <property name="html.dir" value="/www/incubator.apache.org/ivy/downloads/latest/"/>
+	   <delete>
+	       <fileset dir="${html.dir}"/>
+	   </delete>
+	   <copy todir="${html.dir}">
+	       <fileset dir="${distrib.dir}"/>
+	   </copy>
+	</target>
+
+</project>
\ No newline at end of file

Modified: incubator/ivy/core/trunk/build.properties
URL: http://svn.apache.org/viewvc/incubator/ivy/core/trunk/build.properties?view=diff&rev=522796&r1=522795&r2=522796
==============================================================================
--- incubator/ivy/core/trunk/build.properties (original)
+++ incubator/ivy/core/trunk/build.properties Tue Mar 27 00:08:50 2007
@@ -24,13 +24,13 @@
 test.build.dir=${basedir}/build/test
 artifacts.build.dir=${basedir}/build/artifact
 distrib.dir=${basedir}/build/distrib
-doc.build.dir=${basedir}/doc/reports
+doc.build.dir=${basedir}/build/doc
+reports.dir=${doc.build.dir}/reports
 test.xml.dir=${build.dir}/test-report
-test.report.dir=${doc.build.dir}/test
-javadoc.build.dir=${doc.build.dir}/api
-doc.src.dir=${basedir}/src/doc
-dxml.doc.file=${doc.src.dir}/ivy-book.xml
-raw.dxml.doc.file=${doc.src.dir}/ivy-raw-book.xml
+test.report.dir=${reports.dir}/test
+coverage.report.dir=${reports.dir}/coverage
+javadoc.build.dir=${reports.dir}/api
+doc.src.dir=${basedir}/doc
 
 ivy.minimum.javaversion=1.4
 debug.mode=on

Modified: incubator/ivy/core/trunk/build.xml
URL: http://svn.apache.org/viewvc/incubator/ivy/core/trunk/build.xml?view=diff&rev=522796&r1=522795&r2=522796
==============================================================================
--- incubator/ivy/core/trunk/build.xml (original)
+++ incubator/ivy/core/trunk/build.xml Tue Mar 27 00:08:50 2007
@@ -110,6 +110,13 @@
 		<property name="offline" value="true" />
 	</target>
 	
+	<target name="default-version">
+		<tstamp> 
+			<format property="pubdate" pattern="yyyyMMddHHmmss"/>  
+		</tstamp>
+		<property name="version.prefix" value="${target.ivy.version}-local-"/>
+		<property name="build.version" value="${version.prefix}${pubdate}"/>
+	</target>
 
     <!-- =================================================================
                DEPENDENCY MNGT, COMPILATION AND JAR
@@ -291,15 +298,15 @@
 	
 	<target name="coverage-report" depends="emma, test-report"  unless="skip.test"
 			description="run tests with instrumentation and generate coverage report">
-		<mkdir dir="${doc.build.dir}/coverage" />
+		<mkdir dir="${coverage.report.dir}" />
 		<emma>
 		    <report sourcepath="${src.dir}" >
 		        <fileset dir="${coverage.dir}" >
 		          <include name="*.emma" />
 		        </fileset>
 
-		        <txt outfile="${doc.build.dir}/coverage/coverage.txt" />
-		        <html outfile="${doc.build.dir}/coverage/coverage.html" />
+		        <txt outfile="${coverage.report.dir}/coverage.txt" />
+		        <html outfile="${coverage.report.dir}/coverage.html" />
 		     </report>
 		 </emma>
 	</target>
@@ -308,97 +315,6 @@
 		<javadoc destdir="${javadoc.build.dir}">
 			<fileset dir="${src.dir}"/>
 		</javadoc>
-	</target>
-	
-    <!-- =================================================================
-               DISTRIBUTION
-         ================================================================= -->
-	<target name="zip-doc" depends="default-version" description="zip the documentation">
-		<zip basedir="${basedir}/doc" destfile="${distrib.dir}/ivy-${build.version}-doc.zip"/>
-	</target>
-
-	<target name="snapshot-src" depends="default-version">
-		<mkdir dir="${distrib.dir}"/>
-		<zip destfile="${distrib.dir}/ivy-${build.version}-src.zip">
-			<zipfileset dir="${src.dir}" prefix="ivy-${build.version}/src/java"/>
-			<zipfileset dir="${basedir}/src/example" prefix="ivy-${build.version}/src/example"/>
-			<zipfileset dir="${test.dir}" prefix="ivy-${build.version}/test/java"/>
-			<zipfileset dir="${basedir}/test/repositories" prefix="ivy-${build.version}/test/repositories"/>
-			<zipfileset dir="${basedir}/test/buildlist" prefix="ivy-${build.version}/test/buildlist"/>
-			<zipfileset dir="${basedir}/test/triggers" prefix="ivy-${build.version}/test/triggers"/>
-			<zipfileset dir="${basedir}/test/xsl" prefix="ivy-${build.version}/test/xsl"/>
-			<zipfileset dir="${src.dir}/org/apache/ivy/plugins/parser/xml" includes="ivy.xsd" fullpath="ivy-${build.version}/ivy.xsd"/>
-			<zipfileset dir="${basedir}" includes="DISCLAIMER" fullpath="ivy-${build.version}/DISCLAIMER"/>
-			<zipfileset dir="${basedir}" includes="LICENSE" fullpath="ivy-${build.version}/LICENSE"/>
-			<zipfileset dir="${basedir}" includes="CHANGES.txt" fullpath="ivy-${build.version}/CHANGES.txt"/>
-			<zipfileset dir="${basedir}" includes="ivysettings.xml" fullpath="ivy-${build.version}/ivysettings.xml"/>
-			<zipfileset dir="${basedir}" includes="build.properties" fullpath="ivy-${build.version}/build.properties"/>
-			<zipfileset dir="${basedir}" includes="ivy.xml" fullpath="ivy-${build.version}/ivy.xml"/>
-
-			<zipfileset dir="${basedir}" includes="build.xml" fullpath="ivy-${build.version}/build.xml"/>
-		</zip>
-	</target>
-
-	<target name="snapshot-bin" depends="default-version, jar">
-		<mkdir dir="${distrib.dir}"/>
-		<ivy:deliver 
-			deliverpattern="${distrib.dir}/ivy.xml" 
-			pubrevision="${build.version}" 
-			pubdate="${pubdate}"
-		    status="${status}"/>
-		<zip destfile="${distrib.dir}/ivy-${build.version}-bin.zip">
-			<zipfileset dir="${basedir}/src/example" prefix="ivy-${build.version}/src/example"/>
-			<zipfileset dir="${basedir}" includes="DISCLAIMER" fullpath="ivy-${build.version}/DISCLAIMER"/>
-			<zipfileset dir="${basedir}" includes="LICENSE" fullpath="ivy-${build.version}/LICENSE"/>
-			<zipfileset dir="${basedir}" includes="CHANGES.txt" fullpath="ivy-${build.version}/CHANGES.txt"/>
-			<zipfileset dir="${src.dir}/org/apache/ivy/plugins/parser/xml" includes="ivy.xsd" fullpath="ivy-${build.version}/ivy.xsd"/>
-			<zipfileset dir="${distrib.dir}" includes="ivy.xml" fullpath="ivy-${build.version}/ivy.xml"/>
-
-			<zipfileset dir="${lib.dir}" prefix="ivy-${build.version}/lib" excludes="junit*.jar,ant*.jar" />
-			<zipfileset dir="${artifacts.build.dir}" includes="${final.name}" fullpath="ivy-${build.version}/ivy-${build.version}.jar"/>
-			<zipfileset dir="${artifacts.build.dir}" includes="${final.core.name}" fullpath="ivy-${build.version}/ivy-core-${build.version}.jar"/>
-		</zip>
-		<copy file="${basedir}/DISCLAIMER" todir="${distrib.dir}" />
-		<copy file="${basedir}/LICENSE" todir="${distrib.dir}" />
-		<copy file="${basedir}/CHANGES.txt" todir="${distrib.dir}" />
-		<copy file="${artifacts.build.dir}/${final.name}" todir="${distrib.dir}" />
-		<copy file="${artifacts.build.dir}/${final.core.name}" todir="${distrib.dir}" />
-		<copy file="${src.dir}/org/apache/ivy/plugins/parser/xml/ivy.xsd" todir="${distrib.dir}" />
-	</target>
-	
-	<target name="default-version">
-		<tstamp> 
-			<format property="pubdate" pattern="yyyyMMddHHmmss"/>  
-		</tstamp>
-		<property name="version.prefix" value="${target.ivy.version}-local-"/>
-		<property name="build.version" value="${version.prefix}${pubdate}"/>
-	</target>
-	
-	<target name="snapshot-version">
-		<property name="version.prefix" value="${target.ivy.version}-dev-"/>
-	</target>
-	
-	<target name="release-version">
-		<input message="please enter version: " addproperty="build.version"/>
-		<input message="please enter status: (integration,milestone,release)" addproperty="status"/>
-	</target>
-	
-	<target name="snapshot" depends="clean, snapshot-version, coverage-report, snapshot-src, snapshot-bin, javadoc, zip-doc" description="used for nightly and integration builds"/>
-	<target name="release" depends="release-version, snapshot" description="make a new release of Ivy"/>
-
-	<!-- 
-		publication on ivy web site
-		requires to be logged in on people.apache.org 
-	-->
-	<available property="loggedin" file="/www/incubator.apache.org/ivy/index.html"/>
-	<target name="publish-latest" if="loggedin" description="publishes the last snapshot done to ivy web site">
-	   <property name="html.dir" value="/www/incubator.apache.org/ivy/downloads/latest/"/>
-	   <delete>
-	       <fileset dir="${html.dir}"/>
-	   </delete>
-	   <copy todir="${html.dir}">
-	       <fileset dir="${distrib.dir}"/>
-	   </copy>
 	</target>
 
 

Modified: incubator/ivy/core/trunk/doc/toc.json
URL: http://svn.apache.org/viewvc/incubator/ivy/core/trunk/doc/toc.json?view=diff&rev=522796&r1=522795&r2=522796
==============================================================================
--- incubator/ivy/core/trunk/doc/toc.json (original)
+++ incubator/ivy/core/trunk/doc/toc.json Tue Mar 27 00:08:50 2007
@@ -130,7 +130,7 @@
             {
               "id":"doc/releasenotes/older",
               "title":"older versions",
-              "abstract":true,
+              "isAbstract":true,
               "children": [
                   {
                     "id":"doc/releasenotes/1.1",

Modified: incubator/ivy/core/trunk/doc/xooki/xooki.js
URL: http://svn.apache.org/viewvc/incubator/ivy/core/trunk/doc/xooki/xooki.js?view=diff&rev=522796&r1=522795&r2=522796
==============================================================================
--- incubator/ivy/core/trunk/doc/xooki/xooki.js (original)
+++ incubator/ivy/core/trunk/doc/xooki/xooki.js Tue Mar 27 00:08:50 2007
@@ -17,8 +17,19 @@
 	Some code is largely inspired by code found in the dojo toolkit, 
 	see http://dojotoolkit.org/ for more information.
 */
+
+/*
+This script can be either embedded in a xooki page for in browser processing, or used in batch using rhino or java 6 javascript tool:
+jrunscript path/to/xooki.js [-noddtree] inputFileFromXookiSite.html [path/to/dir/to/put/generated/file]
+
+Be sure to be in the directory where the html input to process is when running this command.
+ */
+var batchMode = (typeof arguments != 'undefined');
+
 var xooki = {};
 xooki.console = ""; // used for debugging purpose only, and only when the debug div is not yet created
+xooki.config = {};
+xooki.c = xooki.config;
 
 function t(msg) {
     // returns the internationalized version of the message, or the message if no translation is available
@@ -47,7 +58,11 @@
 function u(path) {
   // convert a path relative to the root to a full URL
   // u stands for Url
-  return xooki.c.root + path;
+  if (batchMode) {
+	return xooki.c.relativeRoot+path;
+  } else {
+	return xooki.c.root + path;
+  }
 }
 function cu(urlCfgProp) {
   // get a path from a configuration path and convert it to an URL
@@ -161,13 +176,13 @@
             document.write('<' + 'script');
             document.write(' language="javascript"');
             document.write(' type="text/javascript"');
-            document.write(' src="' + script_filename + '">');
+            document.write(' src="' + xooki.u(script_filename) + '">');
             document.write('</' + 'script' + '>');
         },
 
         action: function(action) {        
             // returns the url for an action on the same page
-            loc = window.location.toString();
+            loc = batchMode?'':xooki.pageURL;
             if (loc.indexOf("#") != -1) {
                 loc = loc.substring(0, loc.indexOf("#"));
             }
@@ -363,7 +378,7 @@
 }
 
 xooki.debug = function(message) {
-    var console = document.getElementById('xooki-console');
+    var console = typeof document == 'undefined' ? false : document.getElementById('xooki-console');
     if (console) {
         console.value += message + "\n";
     } else {
@@ -372,7 +387,7 @@
 }
 
 xooki.debugShowDetail = function (message) {
-    var detail = document.getElementById('xooki-debug-detail');
+    var detail = typeof document == 'undefined' ? false : document.getElementById('xooki-debug-detail');
     if (detail) {
         detail.value=message;
     } else {
@@ -391,12 +406,22 @@
     },
     
     pageLink: function(page) {
-    	if (page.abstract) {
+    	if (page.isAbstract) {
     		return page.title;
     	} else {
     		return '<a href="'+pu(page.id)+'" '+(page.id == xooki.page.id?'class="current"':'')+'>'+page.title+'</a>';
     	}
-    }
+    },
+	
+	// insert  the given  header in the html head
+	// can be used only when the browser is still in the head !
+	addHeader: function(/* string */ head) {
+		document.write(head);
+	},
+	
+	setBody: function( /* string */ body) {
+		document.body.innerHTML = body;
+	}
 };
 
 xooki.component = {
@@ -421,14 +446,16 @@
         		menu += '<li id="xooki-'+page.children[i].id+'">'+xooki.html.pageLink(page.children[i]);
         		smenu = arguments.callee(page.children[i]);
         		if (smenu != '') {
-        			menu += '<ul ';
         			if (smenu.indexOf('id="xooki-'+xooki.page.id+'"') != -1 
         				|| page.children[i].id == xooki.page.id) {
         				// either a descendant or the node processed is the current page node
         				// we specify that the menu must be opened by default
-        				menu += 'rel="open"';
-        			}
-        			menu += '>'+smenu+'</ul>';
+        				menu += '<ul rel="open"';
+	        			menu += '>'+smenu+'</ul>';
+        			} else if (xooki.c.useddtree) {
+						menu += '<ul ';
+	        			menu += '>'+smenu+'</ul>';
+					}
         		} 
         		menu += '</li>';
         	}
@@ -534,12 +561,14 @@
             + xooki.c.debugPanel;
     }
 
-    document.body.innerHTML = xooki.string.processTemplate(xooki.template.body, xooki.c);
+    xooki.html.setBody(xooki.string.processTemplate(xooki.template.body, xooki.c));
     
     xooki.input.applyChanges();
     
-    // enable dynamic tree menu 
-	ddtreemenu.createTree(css("treemenu"), false);
+	if (xooki.c.useddtree) {
+	    // enable dynamic tree menu 
+		ddtreemenu.createTree(css("treemenu"), false);
+	}
 };
 
 xooki.render.main = function() {
@@ -554,7 +583,7 @@
 
 xooki.input = {
     source: function() {
-        if (document.getElementById('xooki-source') != null) {
+        if (typeof document != 'undefined' && document.getElementById('xooki-source') != null) {
             this._source = document.getElementById('xooki-source').value;
         }
         return this._source;
@@ -582,6 +611,7 @@
             }
             filters = this.getInputFilters(format);
             for (var i in filters) {
+				xooki.debug('processing filter '+filters[i]);
                 f = xooki.input.filters[filters[i]];
                 if (typeof f == "function") {
                 	try {
@@ -718,6 +748,131 @@
 	window.onkeypress = keyCtrl;
 };
 
+
+if (typeof xooki.io == "undefined") {
+    xooki.io = {};
+}
+
+if (batchMode) {
+	importPackage(java.io);
+	
+	xooki.io.loadFile = function( url ) {
+	  var str = '';
+      var r = new BufferedReader(new FileReader(url));
+	  line = r.readLine();
+	  while (line != null) {
+		str += line + '\n';
+		line = r.readLine();
+	  }
+	  r.close();
+	  return str;
+    };
+	
+	xooki.io.saveFile = function (fileUrl, content) {
+		p = new File(fileUrl).getParentFile();
+		if (p != null) {
+			p.mkdirs();
+		}
+		pw = new PrintWriter(new FileWriter(fileUrl));
+		pw.write(content);
+		pw.close();
+		return true;
+	}
+
+    xooki.url.loadURL = function( url ) {
+		return xooki.io.loadFile(url);
+	};
+	
+	xooki.html.addHeader = function (head) {
+		xooki.pageContent = xooki.pageContent.replace(/<\/head>/, head+'\n</head>');
+	};
+	
+	xooki.html.setBody = function(body) {
+		xooki.pageContent = xooki.pageContent.replace(/<body>(.|[^,])*<\/body>/gm, '<body>'+body+'</body>');
+	}
+	
+	xooki.url.include = function(script_filename) {
+		xooki.html.addHeader('<script language="javascript" type="text/javascript" src="'+xooki.c.relativeRoot+'xooki/'+script_filename+'"></script>');
+	};
+	
+	xooki.input.source = function() {
+		if (typeof this._source == 'undefined') {
+			xooki.debug('searching source');
+			var beg = xooki.pageContent.indexOf('<textarea id="xooki-source">');
+			beg += '<textarea id="xooki-source">'.length;
+			var end = xooki.pageContent.lastIndexOf('</textarea>');
+			this._source = xooki.pageContent.substring(beg, end);
+			xooki.debug('source found');
+		}
+		return this._source;
+	}
+	
+	xooki.render.page = function() {
+	    // realize all components available
+		xooki.debug('realizing components');
+	    for (var k in xooki.component) {
+	        xooki.c[k] = xooki.component[k]();
+	    }
+	    
+		xooki.debug('processing body');
+		xooki.c.body = xooki.input.processed();
+
+		xooki.debug('updating body');
+		var body = xooki.string.processTemplate(xooki.template.body, xooki.c);
+		if (xooki.c.useddtree) {
+			body += '<script language="javascript" type="text/javascript">ddtreemenu.createTree("'+css("treemenu")+'", false);</script>';
+		}
+	    xooki.html.setBody(body);
+	};
+
+	xooki.display = function(message, background) {
+		print(message);
+	};
+	
+	xooki.debug = function (message) {
+		if (xooki.c.debug) {
+			print(message+'\n');
+		}
+	};
+	var i=0;
+	if (arguments.length > i && arguments[0] == '-noddtree') {
+		xooki.c.useddtree = false;
+		i++;
+	}
+	
+	if (arguments.length > i && arguments[0] == '-debug') {
+		xooki.c.debug = true;
+		i++;
+	} else {
+		xooki.c.debug = false;
+	}
+	
+	var file = 'index.html';
+	if (arguments.length > i) {
+		file = arguments[i];
+		i++;
+	}
+	var generateToDir = "gen";
+	if (arguments.length > i) {
+		generateToDir = arguments[i];
+		i++;
+	}
+	
+	print('processing '+file+'...\n');
+	xooki.pageContent = xooki.io.loadFile(file);
+	
+	var m = /var xookiConfig = {.*};/.exec(xooki.pageContent);
+	if (typeof m != 'undefined' && m != null) {
+		eval(m[0]);
+	}
+}
+
+if (batchMode) {
+	xooki.pageURL = new File(file).toURL().toExternalForm();
+} else {
+	xooki.pageURL = window.location.toString();
+}
+
 // init xooki engine
 (function() {
     ////////////////////////////////////////////////////////////////////////////
@@ -734,19 +889,26 @@
             }
         }
     };
-    xooki.config = {};
-    xooki.c = xooki.config;
     if (typeof xookiConfig != "undefined") {xooki.util.mix(xookiConfig, xooki.config);}
     xooki.c.initProperty = initConfigProperty;
     xooki.c.initProperty("level", 0);
     xooki.c.initProperty("root", function() {
-    	root = window.location.toString();
+    	root = xooki.pageURL;
     	// remove trailing parts of the URL to go the root depending on level
     	for (var i=0; i < xooki.c.level + 1; i++) {
     		root = root.substring(0, root.lastIndexOf('/'));
     	}
     	return root + '/';
     });
+    xooki.c.initProperty("relativeRoot", function() {
+    	relativeRoot = '';
+    	for (var i=0; i < xooki.c.level; i++) {
+    		relativeRoot += '../';
+    	}
+    	return relativeRoot;
+    });
+
+    xooki.c.initProperty("useddtree", true);
 
     var globalConfig = xooki.json.loadURL(u("config.json"));
     if (globalConfig != null) {
@@ -755,7 +917,7 @@
 
     xooki.c.initProperty("defaultInputFormat", "xooki");
     xooki.c.initProperty("xookiInputFormat", ["xooki"]);
-    xooki.c.initProperty("allowEdit", document.location.toString().substr(0,5) == "file:");
+    xooki.c.initProperty("allowEdit", !batchMode && xooki.pageURL.substr(0,5) == "file:");
     
     xooki.input.format.define("xooki", ["code", "shortcuts", "url", "xookiLinks", "jira", "lineBreak"]);
     
@@ -772,13 +934,15 @@
     xooki.c.css = (typeof xooki.c.css != "undefined")?xooki.c.css:{};    
         
     xooki.c.messages = xooki.json.loadURL(cu("messages")); 
-    xooki.c.browser = {
-        NS: (window.Event) ? 1 : 0
-    };
-    
-    // action
-    // TODO: better handle action extraction
-    xooki.c.action = window.location.search == '?action=print'?'print':xooki.c.action;
+	if (!batchMode) {
+	    xooki.c.browser = {
+	        NS: (window.Event) ? 1 : 0
+	    };
+    
+	    // action
+	    // TODO: better handle action extraction
+		xooki.c.action = window.location.search == '?action=print'?'print':xooki.c.action;
+	}
     
     ////////////////////////////////////////////////////////////////////////////
     ////////////////// TOC init
@@ -833,7 +997,7 @@
        	}
     };
 	
-	var match = new RegExp("^.*\\/((?:.*\\/){"+xooki.config.level+"}[^\\/]*)(?:\\.\\w+)(?:\\?.+)?$", "g").exec(window.location.toString());
+	var match = new RegExp("^.*\\/((?:.*\\/){"+xooki.config.level+"}[^\\/]*)(?:\\.\\w+)(?:\\?.+)?$", "g").exec(xooki.pageURL);
 	var curPageId;
 	if (match == null || match[1] == '') {
 		curPageId = "index";
@@ -858,26 +1022,30 @@
     xooki.template.source = xooki.url.loadURL(xooki.c.action == "print"?cu("printTemplate"):cu("template"));
 	if(xooki.template.source != null) {
 		xooki.template.head = xooki.template.source.match(/<head>([^§]*)<\/head>/im)[1];
+		var root = batchMode?xooki.c.relativeRoot:xooki.c.root;
 		
         var head = xooki.string.processTemplate(xooki.template.head, xooki.config);
-		head = head.replace(/href="([^\\$:"]+)"/g, 'href="'+xooki.c.root+'$1"');
-		document.write(head);
+		head = head.replace(/href="([^\\$:"]+)"/g, 'href="'+root+'$1"');
+		xooki.html.addHeader(head);
 
 		var body = xooki.template.source.match(/<body>([^§]*)<\/body>/im)[1];
-		body = body.replace(/href="([^\\$:"]+)"/g, 'href="'+xooki.c.root+'$1"');
-		xooki.template.body = body.replace(/src="([^\\$:"]+)"/g, 'src="'+xooki.c.root+'$1"');		
+		body = body.replace(/href="([^\\$:"]+)"/g, 'href="'+root+'$1"');
+		xooki.template.body = body.replace(/src="([^\\$:"]+)"/g, 'src="'+root+'$1"');		
 	}
 	
 
     ////////////////////////////////////////////////////////////////////////////
     ////////////////// includes
     ////////////////////////////////////////////////////////////////////////////
-    xooki.url.include(xooki.u("tree/simpletreemenu.js"));
+	if (batchMode) {
+		xooki.html.addHeader('<script language="javascript" type="text/javascript">xooki = {u: function(url) {return "'+xooki.c.relativeRoot+'xooki/"+url;}};</script>');
+	}
+    xooki.url.include("tree/simpletreemenu.js");
     if (xooki.c.useTrimPath) {
-        xooki.url.include(xooki.u("trimpath/template.js"));
+        xooki.url.include("trimpath/template.js");
     }
     if (xooki.c.allowEdit) {
-        xooki.url.include(xooki.u("xookiEdit.js"));
+        xooki.url.include("xookiEdit.js");
     }
 
     for (var k in xooki.c) {
@@ -920,3 +1088,13 @@
 		return false;
 	}
 }
+
+if (batchMode) {	
+	xooki.pageContent = xooki.pageContent.replace(/<script type="text\/javascript" src="[^"]*xooki.js"><\/script>/g, '');
+	
+	xooki.render.page();
+
+	print('generating to '+generateToDir+'/'+file);
+	xooki.io.saveFile(generateToDir+'/'+file, xooki.pageContent);
+}
+