helma/modules/jala/util/HopKit/lib.xml

433 lines
20 KiB
XML

<?xml version="1.0"?>
<project name="jala-utils" default="usage">
<property environment="env"/>
<property name="work" value="${env.BUILD_HOME}/work" />
<!-- load javascript libraries -->
<loadfile property="file_jsmin" srcFile="${env.BUILD_HOME}/scripts/jsmin.js" />
<loadfile property="file_jslint" srcFile="${env.BUILD_HOME}/scripts/jslint.js" />
<loadfile property="file_jsant" srcFile="${env.BUILD_HOME}/scripts/jsant.js" />
<!-- =================================================================== -->
<!-- Help on usage -->
<!-- =================================================================== -->
<target name="help" depends="usage" />
<target name="usage">
<echo message="" />
<echo message=" Available targets are:" />
<echo message=" jslint -> Run jslint on the current directory (validation)" />
<echo message=" docs -> Run jsdoc on a helma application" />
<echo message=" pot -> Parse i18n methods out of function files and skins and" />
<echo message=" create a gettext template file." />
<echo message=" messages -> Compile Gnu PO-files into JavaScript message files" />
<echo message="" />
<echo message=" Macro definitions that can be used in other build files:" />
<echo message=" - jslint" />
<echo message=" - jsdoc" />
<echo message=" - jsmin" />
<echo message="" />
<echo message=" See comments inside this file (lib.xml) for more details." />
<echo message="----------------------------------------------------------" />
<echo message="" />
<echo message="" />
</target>
<!-- =================================================================== -->
<!-- Validates a version -->
<!-- =================================================================== -->
<target name="jslint">
<echo message="Validating source files in ${user.dir}" />
<jslint printWarnings="true" failOnError="false">
<fileset dir="${user.dir}" includes="**/*.js" />
</jslint>
</target>
<!-- =================================================================== -->
<!-- Create documentation for a Helma application with jsdoc.pl -->
<!-- =================================================================== -->
<target name="hopdoc">
<input message="Directory containing the application code (./code):"
addproperty="docs.source" defaultvalue="./code" />
<input message="Destination directory for the documentation (./docs):"
addproperty="docs.destination" defaultvalue="./docs" />
<input message="Name of the project:"
addproperty="docs.projectName" defaultvalue="" />
<!-- convert inputs to absolute paths -->
<property name="srcdir" location="${docs.source}" />
<property name="destdir" location="${docs.destination}" />
<mkdir dir="${work}" />
<helmadoc srcdir="${srcdir}"
destdir="${destdir}"
projectName="${docs.projectName}" />
<delete dir="${work}" />
</target>
<!-- =================================================================== -->
<!-- Create documentation with jsdoc.pl -->
<!-- =================================================================== -->
<target name="docs">
<input message="Directory containing the code (./code):"
addproperty="docs.source" defaultvalue="./code" />
<input message="Destination directory for the documentation (./docs):"
addproperty="docs.destination" defaultvalue="./docs" />
<input message="Name of the project:"
addproperty="docs.projectName" defaultvalue="" />
<!-- convert inputs to absolute paths -->
<property name="srcdir" location="${docs.source}" />
<property name="destdir" location="${docs.destination}" />
<mkdir dir="${work}" />
<jsdoc srcdir="${srcdir}"
destdir="${destdir}"
projectName="${docs.projectName}" />
<delete dir="${work}" />
</target>
<!-- =================================================================== -->
<!-- Parse i18n methods and macros in function files and skins -->
<!-- and create a GNU gettext compatible template file -->
<!-- =================================================================== -->
<target name="pot">
<input message="Name of the template file to generate:"
addproperty="i18n.template" defaultvalue="messages.pot" />
<echo message="Using '${i18n.template}' as output" />
<input message="Directories containing code/skins separated by spaces:"
addproperty="i18n.scan" />
<input message="Encoding of code/skin files (default is UTF-8):"
addproperty="i18n.fileEncoding" />
<!-- convert inputs to absolute paths -->
<property name="dest" location="${i18n.template}" />
<property name="src" location="${i18n.scan}" />
<java classname="org.mozilla.javascript.tools.shell.Main">
<arg value="${env.BUILD_HOME}/scripts/MessageParser.js" />
<arg value="-o" />
<arg value="${dest}" />
<arg value="-e" />
<arg value="${i18n.fileEncoding}" />
<arg line="${src}" />
</java>
</target>
<!-- =================================================================== -->
<!-- Generates JavaScript message files out of the .po files in a given -->
<!-- directory -->
<!-- =================================================================== -->
<target name="messages">
<input message="Directory containing PO-files:"
addproperty="i18n.poDirectory" />
<input message="Destination directory for generated message files:"
addproperty="i18n.destination" />
<input message="Namespace to use for generated messages (optional):"
addproperty="i18n.namespace" />
<!-- convert inputs to absolute paths -->
<property name="src" location="${i18n.poDirectory}" />
<property name="dest" location="${i18n.destination}" />
<echo message="Generating message files from PO-files in '${src}'..." />
<echo message="Using '${dest}' as output directory" />
<java classname="org.mozilla.javascript.tools.shell.Main">
<arg value="${env.BUILD_HOME}/scripts/PoParser.js" />
<arg value="${src}" />
<arg value="${dest}" />
<arg line="${i18n.namespace}" />
</java>
</target>
<!-- =================================================================== -->
<!-- Create documentation with jsdoc.pl -->
<!-- =================================================================== -->
<macrodef name="jsdoc">
<attribute name="srcdir" />
<attribute name="destdir" />
<attribute name="projectName" />
<sequential>
<echo message="Generating JSDoc API documentation for @{srcdir}" />
<property name="workJSdoc" value="${work}/jsdoc-worker" />
<mkdir dir="${workJSdoc}" />
<copy todir="${workJSdoc}">
<fileset dir="@{srcdir}">
<exclude name=".svn/**" />
<include name="**/*.js" />
</fileset>
</copy>
<mkdir dir="@{destdir}" />
<exec executable="perl">
<arg value="${env.BUILD_HOME}/JSDoc/jsdoc.pl" />
<arg value="--template-dir=${env.BUILD_HOME}/JSDoc/templates" />
<arg value="-d=@{destdir}" />
<arg value="--extensions=js" />
<arg value="--no-sources" />
<arg value="--recursive" />
<arg value="--quiet" />
<arg value="--package-naming" />
<arg value="--project-name=@{projectName}" />
<arg value="--project-summary=@{srcdir}/.jsdoc/summary.html" />
<arg value="--globals-name=Global" />
<arg value="${workJSdoc}" />
</exec>
<delete dir="${workJSdoc}" />
</sequential>
</macrodef>
<!-- =================================================================== -->
<!-- Create documentation for a helma appplication with jsdoc.pl -->
<!-- (copies the application to a temp directory, works on the js -->
<!-- source code to make it work with jsdoc and runs the doc task) -->
<!-- =================================================================== -->
<macrodef name="helmadoc">
<attribute name="srcdir" />
<attribute name="destdir" />
<attribute name="projectName" />
<sequential>
<echo message="Generating API specification for Helma application in @{srcdir}" />
<property name="workHelmadoc" value="${work}/helmadocs-worker" />
<mkdir dir="${workHelmadoc}" />
<copy todir="${workHelmadoc}">
<fileset dir="@{srcdir}">
<exclude name=".svn/**" />
<include name="**/*.js" />
<include name="**/*.hac" />
<include name="**/*.properties" />
</fileset>
</copy>
<echo message="Preparing files for JSDoc ..." />
<script language="javascript"> <![CDATA[
// load libraries:
eval(file_jsant);
var fs = project.createDataType("fileset");
fs.setDir(new java.io.File(workHelmadoc));
fs.setIncludes("**/*.js,**/*.hac,**/*.properties");
fs.setExcludes("app.properties,db.properties,Global/**");
var ds = fs.getDirectoryScanner(project);
var srcFiles = ds.getIncludedFiles();
var files = [];
for (var i=0; i<srcFiles.length; i++) {
var f = new java.io.File(workHelmadoc + "/" + srcFiles[i]);
files[files.length] = f.getCanonicalPath();
}
// slice filename into dir (= name of prototype), filename, file-extension
var fileNameReg = /([^\\\/]+)[\\\/]([^\\\/]+)\.([^\.]*)$/i;
// find plain function definitions
var functionReg = /(^|[^=]\s+)function\s+(\w+)\s*\(/gi;
// find constructor functions (after replacing plain function definitions
var ctorReg = /.prototype.constructor/gi;
// find object/collection/mountpoint mappings in type.properties
var mappingReg = /(.*)\s*\(\s*(.*)\s*\)/;
// store helper javascripts
var propsDef = "";
// keep track of constructor functions
var ctorTracker = {};
for (var i=0; i<files.length; i++) {
var fileNameResult = files[i].match(fileNameReg);
if (ctorTracker[fileNameResult[1]] === null) {
ctorTracker[fileNameResult[1]] = false;
}
var content = Util.readFile(files[i]);
if (fileNameResult[3].toLowerCase() == "properties") {
// add mappings of type.properties to the field summary
var props = Util.loadProperties(files[i]);
for (var e=props.keys(); e.hasMoreElements();) {
var key = e.nextElement();
var value = props.getProperty(key);
if (key.indexOf(".") > -1 || (key.indexOf("_") == 0 && key != "_id" && key != "_children")) {
continue;
}
var re = value.match(mappingReg);
if (re) {
propsDef += "/**\n * mapped to " + re[1] + "\n * {@link " + re[2].capitalize() + "}\n */\n";
} else {
propsDef += "/** mapped to database column <b>" + value + "</b> */\n";
}
propsDef += fileNameResult[1] + ".prototype." + key + " = null;\n\n";
}
} else if (fileNameResult[3].toLowerCase() == "hac") {
// wrap helma action files in a block: function XXX_action { }
var str = fileNameResult[1] + ".prototype." + fileNameResult[2] + "_action = function() {\n" + content + "\n}\n";
Util.writeToFile(files[i], str);
} else {
// in common javascript files switch to .prototype. definition
var str = content.replace(functionReg, "$1" + fileNameResult[1] + ".prototype.$2 = function(");
if (str.match(ctorReg)) {
str = str.replace(ctorReg, "");
ctorTracker[fileNameResult[1]] = true;
}
Util.writeToFile(files[i], str);
}
}
// all constructors that haven't been defined in functions are added to helper-file
for (var key in ctorTracker) {
if (key.toLowerCase() == "root" || key.toLowerCase() == "hopobject") {
continue;
}
if (ctorTracker[key] === false) {
propsDef += "function " + key + "(){return;}\n"
}
}
var file = Util.getFile(workHelmadoc, "definitions.js");
Util.writeToFile(file, propsDef);
]]> </script>
<echo message="... prepared files for JSDoc." />
<mkdir dir="@{destdir}" />
<exec executable="perl">
<arg value="${env.BUILD_HOME}/JSDoc/jsdoc.pl" />
<arg value="--template-dir=${env.BUILD_HOME}/JSDoc/templates" />
<arg value="-d=@{destdir}" />
<arg value="--extensions=js,hac,properties" />
<arg value="--no-sources" />
<arg value="--recursive" />
<arg value="--quiet" />
<arg value="--package-naming" />
<arg value="--project-name=@{projectName}" />
<arg value="--project-summary=@{srcdir}/.jsdoc/summary.html" />
<arg value="--globals-name=Global" />
<arg value="${workHelmadoc}" />
</exec>
<delete dir="${workHelmadoc}" />
</sequential>
</macrodef>
<!-- =================================================================== -->
<!-- Compresses javascript files in a fileset -->
<!-- -->
<!-- nested element: -->
<!-- <fileset> - the files to compress -->
<!-- =================================================================== -->
<macrodef name="jsmin">
<element name="filesetEl" implicit="true" />
<sequential>
<path id="filepath">
<filesetEl />
</path>
<script language="javascript"> <![CDATA[
// load libraries:
eval(file_jsant);
eval(file_jsmin);
// loop through files in fileset passed by reference
var files = filepath.list();
for (var i=0; i<files.length; i++) {
// read original code
var f = new java.io.File(files[i]);
var oldCode = Util.readFile(f.getCanonicalPath());
// compress
try {
var newCode = jsmin("", oldCode, 2);
} catch (anyerror) {
Util.log(files[i] + " could not be compressed because of an error: " + anyerror);
continue;
}
// load comment
var comment = Util.readFile(new java.io.File(f.getParent(), "COPYRIGHT.txt").toString());
newCode = comment + newCode + "\n";
Util.writeToFile(f.getCanonicalPath(), newCode);
// log message
var msg = "Reduced " + files[i] + " from " + oldCode.length + " to " + newCode.length + " bytes";
msg += " (" + (Math.round(newCode.length / oldCode.length * 1000) / 10) + "% of original size)";
Util.log(msg);
}
]]> </script>
</sequential>
</macrodef>
<!-- =================================================================== -->
<!-- Validate javascript files in a fileset -->
<!-- -->
<!-- nested element: -->
<!-- <fileset> - the files to validate -->
<!-- -->
<!-- attributes: -->
<!-- printWarnings: if "true", syntax warnings are written too -->
<!-- (and not just errors) -->
<!-- failOnError: if "true" build process fails if there are -->
<!-- any javascript errors -->
<!-- =================================================================== -->
<macrodef name="jslint">
<attribute name="printWarnings" default="true" />
<attribute name="failOnError" default="false" />
<element name="filesetEl" implicit="true" />
<sequential>
<!-- copy attributes to local properties (that can be used in the script task) -->
<property name="printWarningsProp" value="@{printWarnings}" />
<property name="failOnErrorProp" value="@{failOnError}" />
<!-- nested elements can't be used from script task, so wrap <path> around the <fileset> -->
<path id="filepath">
<filesetEl />
</path>
<script language="javascript"> <![CDATA[
// load libraries:
eval(file_jsant);
eval(file_jslint);
// store whether there was a major error in any of the files
var fail = false;
var failStr = "";
// loop through files in fileset passed by reference
var files = filepath.list();
for (var i=0; i<files.length; i++) {
// get file object and parse source file
var f = new java.io.File(files[i]);
var re = JSLINT(Util.readFile(f.getCanonicalPath()) ,{browser:true, passfail:false, undef:true});
// loop through error and warning messages
for (var j=0; j<JSLINT.errors.length; j++) {
var e = JSLINT.errors[j];
if(e && printWarningsProp == "true") {
// warning message
Util.log("Javascript Warning in " + files[i] + ", line " + (e.line+1) + ", character " + (e.character+1)+ ":\n" + e.reason + "\n\n");
} else if (!e) {
// if last element of the array is null, the one
// before that element was an error
e = JSLINT.errors[j-1];
failStr += "Javascript error in " + files[i] + ", line " + (e.line+1) + ", character " + (e.character+1)+ ":\n" + e.reason + "\n\n";
fail = true;
}
}
}
if (fail && failOnErrorProp == "true") {
// failing directly from javascript using createTask("fail")
// results in a bulk of stack traces.
// so set the property here ... and fail outside the script task
Util.setProperty("validateFailed", "true");
Util.log(failStr);
}
]]> </script>
<fail if="validateFailed">validate failed: error(s) in javascript code.</fail>
</sequential>
</macrodef>
</project>