You are viewing a plain text version of this content. The canonical link for it is here.
Posted to easyant-commits@incubator.apache.org by jl...@apache.org on 2011/03/06 21:48:22 UTC
svn commit: r1078591 [2/3] - in /incubator/easyant/site: ./ production/
sources/ sources/images/ sources/js/ sources/style/ sources/xooki/
sources/xooki/images/ sources/xooki/tiddly/ sources/xooki/trimpath/ staging/
Added: incubator/easyant/site/sources/style/style.css
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/style/style.css?rev=1078591&view=auto
==============================================================================
--- incubator/easyant/site/sources/style/style.css (added)
+++ incubator/easyant/site/sources/style/style.css Sun Mar 6 21:48:20 2011
@@ -0,0 +1,338 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+/*
+Design by Free CSS Templates
+http://www.freecsstemplates.org
+Released for free under a Creative Commons Attribution 2.5 License
+*/
+body {
+ background: #FFFFFF url(../images/img01.gif) repeat-x;
+ font: normal small Arial, Helvetica, sans-serif;
+ color: #6c6c6c;
+ padding: 0;
+ margin: 0;
+}
+
+h1, h2, h3 {
+ margin: 0;
+ color: #11A6D4;
+}
+
+pre {
+ background-color: #eee;
+ border: 1px solid #ddd;
+}
+
+a {
+ color: #EA672E;
+}
+
+a:hover {
+ text-decoration: none;
+ color: #11A6D4;
+}
+
+img {
+ border: none;
+}
+
+thead {
+ background-color: #eeeeee;
+ color: #FFFFFF;
+
+}
+
+table, sortable {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ border: 1px solid #CCCCCC;
+ background-color: #F7F7F7;
+
+
+}
+
+#mandatory {
+ background-color: #CCFFFF;
+}
+
+
+/* Header */
+
+#header {
+ height: 130px;
+ margin: 0 auto;
+ padding: 0;
+ background: url(../images/img02.jpg) no-repeat;
+}
+
+/* Header > Logo */
+
+#logo {
+ float: left;
+ padding: 65px 0 0 0;
+}
+
+#logo h1 {
+ text-transform: uppercase;
+ font-size: 2em;
+}
+
+#logo h2 {
+ margin: 0;
+ text-transform: uppercase;
+ font-size: 1.2em;
+}
+
+#logo a {
+ text-decoration: none;
+ color: #FFFFFF;
+}
+
+/* Header > Top Menu */
+
+#topmenu {
+ float: right;
+}
+
+#topmenu ul {
+ margin: 0;
+ padding: 100px 15px 0 0;
+ list-style: none;
+ line-height: normal;
+}
+
+#topmenu li {
+ display: inline
+}
+
+#topmenu a {
+ display: block;
+ float: left;
+ margin: 0 0 0 20px;
+ padding: 0 0 0 15px;
+ text-transform: uppercase;
+ text-decoration: none;
+ font-size: x-small;
+ font-weight: bold;
+ color: #FFFFFF;
+}
+
+#topmenu a:hover {
+ text-decoration: underline
+}
+
+#topmenu1 {
+ background: url(../images/img03.gif) no-repeat left center;
+}
+
+#topmenu2 {
+ background: url(../images/img04.gif) no-repeat left center;
+}
+
+#topmenu3 {
+ background: url(../images/img05.gif) no-repeat left center;
+}
+
+/* Menu */
+
+#menu {
+
+ height: 40px;
+ margin: 0 auto;
+}
+
+#menu ul {
+ margin: 0;
+ list-style: none;
+ line-height: normal;
+}
+
+#menu li {
+ display: inline;
+}
+
+#menu a {
+ display: block;
+ float: left;
+ height: 26px;
+ padding: 14px 18px 0 20px;
+ background: url(../images/img06.gif) no-repeat;
+ text-transform: uppercase;
+ text-decoration: none;
+ font-weight: bold;
+}
+
+#menu a:hover {
+ text-decoration: underline;
+}
+
+#menu .first a {
+ padding-left: 0;
+ background: none;
+}
+
+/* Content */
+
+#content {
+ margin: 0 auto;
+ width: 95%;
+ padding: 20px 20px;
+}
+
+/* Footer */
+
+#footer {
+ clear: both;
+ width: 95%;
+ margin: 0 auto 2em auto;
+ background: #F7F7F7 url(../images/img07.gif) repeat-x;
+ border: 1px solid #CCCCCC;
+}
+
+/* Footer > Legal */
+
+#legal {
+ margin: 0;
+ padding: 8px;
+ text-align: center;
+ color: #FFFFFF;
+}
+
+#legal a {
+ font-weight: bold;
+ color: #FFFFFF;
+}
+
+/* Boxed Style */
+
+.boxed {
+ margin-bottom: 1em;
+ background: #F7F7F7 url(../images/img07.gif) repeat-x;
+ border: 1px solid #CCCCCC;
+}
+
+.boxed .title {
+ height: 29px;
+ padding: 11px 0 0 27px;
+ background: url(../images/img08.gif) no-repeat 10px 50%;
+ text-transform: uppercase;
+ font-size: 1.2em;
+ color: #FFFFFF;
+}
+
+.boxed .content {
+ padding: 10px;
+}
+
+/* Posts */
+
+#posts {
+ float: left;
+ width: 75%;
+}
+
+/* Links */
+
+#links {
+
+ padding-left: 10px;
+ background-repeat: no-repeat;
+ /* background: url(../images/img05.gif) repeat-y;*/
+}
+
+#links ul {
+ margin: 0;
+ padding: 0;
+ background-repeat: no-repeat;
+ list-style: none;
+}
+
+#links li {
+ background-repeat: no-repeat;
+}
+
+#links li a {
+ text-decoration: none;
+}
+
+#links li a:hover {
+ text-decoration: underline;
+}
+
+#links li i {
+ font-style: normal;
+ font-size: 14px;
+}
+
+#links li h2 {
+ font-size: 14px;
+}
+
+
+/* Content > Sidebar */
+
+#sidebar {
+ float: right;
+ width: 23%;
+}
+
+td.spacer {
+ border-top: none;
+ background-color: #f5f5f5;
+}
+
+header-row, thead {
+ font-weight: bold;
+ color: #EA672E;
+}
+
+.odd {background-color:#f6f7f8;}
+.even {background-color: #fff;}
+
+.phase-name {
+ font-weight: bold;
+}
+
+span.bold {
+ font-weight: bold;
+}
+
+span.defaultValue, span.buildTypeValue {
+ font-style: italic;
+
+}
+
+
+#buildtype-phases, td.phase-row {
+ vertical-align:top;
+ border-spacing:0px;
+ border-top: 1px solid black;
+}
+
+#note {
+ background-image: url('../images/info.gif');
+ background-repeat: no-repeat;
+ background-color: #eeeeee;
+ min-height:48px;
+ margin-top: 5px;
+ margin-bottom: 5px;
+ padding-left: 50px;
+ padding-top : 12px;
+ border: 1px solid #dddddd;
+
+}
Added: incubator/easyant/site/sources/style/tree.css
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/style/tree.css?rev=1078591&view=auto
==============================================================================
--- incubator/easyant/site/sources/style/tree.css (added)
+++ incubator/easyant/site/sources/style/tree.css Sun Mar 6 21:48:20 2011
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+.treeview ul{
+margin: 0;
+padding: 0;
+}
+
+.treeview li{
+background: url(../images/bullet.gif) no-repeat left center;
+list-style-type: none;
+padding-left: 22px;
+margin-bottom: 3px;
+}
+
+.treeview li.submenu{
+background: url(../images/closed.gif) no-repeat left 1px;
+cursor: hand !important;
+cursor: pointer !important;
+}
+
+.treeview li.collapsable, .treeview li.open {
+background: white url(../images/open.gif) no-repeat left 1px;
+}
+
+
+.treeview ul.closed {
+display: none;
+}
+
+.treeview .submenu ul li{
+cursor: default;
+}
Added: incubator/easyant/site/sources/template.html
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/template.html?rev=1078591&view=auto
==============================================================================
--- incubator/easyant/site/sources/template.html (added)
+++ incubator/easyant/site/sources/template.html Sun Mar 6 21:48:20 2011
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <title>${title}</title>
+ <meta name="keywords" content="" />
+ <meta name="description" content="" />
+ <link rel="stylesheet" type="text/css" href="style/style.css" media="screen"/>
+ <!-- for tree, see if it would better go in xooki.js -->
+ <link rel="stylesheet" type="text/css" href="style/tree.css" />
+ <script type="text/javascript" src="sortable.js"></script>
+</head>
+<body>
+<div id="header">
+ <div id="topmenu">
+ <ul>
+ <li><a href="index.html" id="topmenu1" accesskey="1" title="">Home</a></li>
+ <li><a href="contact.html" id="topmenu2" accesskey="2" title="">Contact</a></li>
+ </ul>
+ </div>
+</div>
+<!-- end #header -->
+<div id="menu">
+ <ul>
+ <li class="first"><a href="index.html" accesskey="1" title="">Home</a></li>
+ <li><a href="#" title="">License</a></li>
+ <li><a href="tutorials.html" title="">Tutorials</a></li>
+ <li><a href="reference.html" title="">References</a></li>
+ </ul>
+</div>
+<!-- end #menu -->
+<div id="content">
+ <div id="posts">
+ ${body}
+ </div>
+ <!-- end #posts -->
+ <div id="sidebar" class="boxed">
+ <h2 class="title">EasyAnt Menu</h2>
+ <div id="links">
+ ${menu}
+ </div>
+ </div>
+ <!-- end #links -->
+ <div style="clear: both;"> </div>
+</div>
+<!-- end #content -->
+<div id="footer">
+ <p id="legal">Copyright © 2008-2010 EasyAnt project. Designed by <a href="http://www.freecsstemplates.org/">Free CSS Templates</a></p>
+</div>
+<!-- end #footer -->
+</body>
+</html>
Added: incubator/easyant/site/sources/toc.json
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/toc.json?rev=1078591&view=auto
==============================================================================
--- incubator/easyant/site/sources/toc.json (added)
+++ incubator/easyant/site/sources/toc.json Sun Mar 6 21:48:20 2011
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+{
+ "children": [
+ {
+ "id":"index",
+ "title":"Documentation",
+ "children": [
+ ]
+ },
+ {
+ "id":"features",
+ "title":"Features",
+ "children": [
+ ]
+ },
+ {
+ "id":"faq",
+ "title":"FAQ",
+ "children": [
+ ]
+ },
+ {
+ "id":"contact",
+ "title":"Contact",
+ "children": [
+ ]
+ }
+ ]
+}
Added: incubator/easyant/site/sources/xooki/antlib.xml
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/xooki/antlib.xml?rev=1078591&view=auto
==============================================================================
--- incubator/easyant/site/sources/xooki/antlib.xml (added)
+++ incubator/easyant/site/sources/xooki/antlib.xml Sun Mar 6 21:48:20 2011
@@ -0,0 +1,114 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<antlib>
+ <scriptdef name="generate" language="javascript">
+ <element name="fileset" type="fileset"/>
+ <attribute name="destDir"/>
+ <attribute name="checkUpToDate"/>
+ <attribute name="printerFriendly"/>
+ <![CDATA[
+ print('Target Dir: ' + attributes.get("destdir"));
+ importClass(java.io.File);
+
+ fs = elements.get("fileset").get(0);
+ srcDir = elements.get("fileset").get(0).getDir(project);
+
+ // Get the files (array) of that fileset
+ ds = fs.getDirectoryScanner(project);
+ srcFiles = ds.getIncludedFiles();
+
+ // iterate over that array
+ print('processing '+srcFiles.length+' source files...');
+ 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);
+
+ if (attributes.get("checkuptodate") == "true") {
+ p = "xooki."+file.getAbsolutePath().replace(' ','_')+".uptodate";
+ upToDate = project.createTask("uptodate");
+ upToDate.setProperty(p);
+ upToDate.setSrcfile(file);
+ upToDate.setTargetFile(new File(attributes.get("destdir")+"/"+filepath+"/"+filename));
+ upToDate.perform();
+ if (project.getProperty(p) != null) {
+ self.log(srcFiles[i]+" is up to date", 3);
+ continue;
+ }
+ }
+
+ exec = project.createTask("exec");
+ exec.setDir(new File(basedir));
+ exec.setExecutable("jrunscript");
+ exec.setTaskName("generate");
+ exec.createArg().setValue(srcDir+"/xooki/xooki.js");
+ exec.createArg().setValue(filename);
+ exec.createArg().setValue(attributes.get("destdir")+"/"+filepath);
+ if (attributes.get("printerfriendly") == "true") {
+ exec.createArg().setValue("print");
+ }
+ exec.perform();
+ }
+ ]]>
+ </scriptdef>
+ <scriptdef name="print" language="javascript">
+ <attribute name="src"/>
+ <attribute name="dest"/>
+ <attribute name="checkUpToDate"/>
+ <![CDATA[
+ importClass(java.io.File);
+
+ var file = new File(attributes.get("src"));
+ var destFile = new File(attributes.get("dest"));
+
+ var basedir = file.getParent();
+ var filename = file.getName();
+
+ var perform = true;
+
+ if (attributes.get("checkuptodate") == "true") {
+ p = "xooki."+file.getAbsolutePath().replace(' ','_')+".uptodate";
+ upToDate = project.createTask("uptodate");
+ upToDate.setProperty(p);
+ upToDate.setSrcfile(file);
+ upToDate.setTargetFile(destFile);
+ upToDate.perform();
+ if (project.getProperty(p) != null) {
+ self.log(file+" is up to date", 3);
+ perform = false;
+ }
+ }
+
+ if (perform) {
+ exec = project.createTask("exec");
+ exec.setDir(new File(basedir));
+ exec.setExecutable("jrunscript");
+ exec.setTaskName("print");
+ exec.createArg().setValue(project.getProperty("basedir")+"/xooki/xooki.js");
+ exec.createArg().setValue(filename);
+ exec.createArg().setValue(destFile);
+ exec.createArg().setValue("print");
+ exec.perform();
+ }
+ ]]>
+ </scriptdef>
+</antlib>
Added: incubator/easyant/site/sources/xooki/blankPageTpl.html
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/xooki/blankPageTpl.html?rev=1078591&view=auto
==============================================================================
--- incubator/easyant/site/sources/xooki/blankPageTpl.html (added)
+++ incubator/easyant/site/sources/xooki/blankPageTpl.html Sun Mar 6 21:48:20 2011
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+<head>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
+ <script type="text/javascript">var xookiConfig = {level: ${level}};</script>
+ <script type="text/javascript" src="${relroot}xooki/xooki.js"></script>
+</head>
+<body>
+ <textarea id="xooki-source">
+ </textarea>
+<script type="text/javascript">xooki.postProcess();</script>
+</body>
+</html>
Added: incubator/easyant/site/sources/xooki/images/addchild.gif
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/xooki/images/addchild.gif?rev=1078591&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/easyant/site/sources/xooki/images/addchild.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/easyant/site/sources/xooki/images/debug.gif
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/xooki/images/debug.gif?rev=1078591&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/easyant/site/sources/xooki/images/debug.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/easyant/site/sources/xooki/images/delete.gif
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/xooki/images/delete.gif?rev=1078591&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/easyant/site/sources/xooki/images/delete.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/easyant/site/sources/xooki/images/down.gif
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/xooki/images/down.gif?rev=1078591&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/easyant/site/sources/xooki/images/down.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/easyant/site/sources/xooki/images/edit.gif
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/xooki/images/edit.gif?rev=1078591&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/easyant/site/sources/xooki/images/edit.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/easyant/site/sources/xooki/images/save.gif
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/xooki/images/save.gif?rev=1078591&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/easyant/site/sources/xooki/images/save.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/easyant/site/sources/xooki/images/up.gif
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/xooki/images/up.gif?rev=1078591&view=auto
==============================================================================
Binary file - no diff available.
Propchange: incubator/easyant/site/sources/xooki/images/up.gif
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: incubator/easyant/site/sources/xooki/messages.json
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/xooki/messages.json?rev=1078591&view=auto
==============================================================================
--- incubator/easyant/site/sources/xooki/messages.json (added)
+++ incubator/easyant/site/sources/xooki/messages.json Sun Mar 6 21:48:20 2011
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+{
+ "Impossible to save changes to ${0}": "Impossible to save changes to ${0}.
+ This could be because your browser doesn't support saving (instead, use FireFox if you can), or because the pathname to your Xooki file contains illegal characters"
+}
Added: incubator/easyant/site/sources/xooki/tiddly/util.js
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/xooki/tiddly/util.js?rev=1078591&view=auto
==============================================================================
--- incubator/easyant/site/sources/xooki/tiddly/util.js (added)
+++ incubator/easyant/site/sources/xooki/tiddly/util.js Sun Mar 6 21:48:20 2011
@@ -0,0 +1,182 @@
+// utility functions borrowed from tiddly wiki: http://www.tiddlywiki.com/
+// Tiddly Wiki License:
+/*
+TiddlyWiki 2.1.3 by Jeremy Ruston, (jeremy [at] osmosoft [dot] com)
+
+Copyright (c) Osmosoft Limited 2004-2006
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this
+list of conditions and the following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+Neither the name of the Osmosoft Limited nor the names of its contributors may be
+used to endorse or promote products derived from this software without specific
+prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+*/
+
+if (typeof xooki.io == "undefined") {
+ xooki.io = {};
+}
+
+xooki.io.saveFile = function (fileUrl, content) {
+ var r = null;
+ if((r == null) || (r == false))
+ r = mozillaSaveFile(fileUrl, content);
+ if((r == null) || (r == false))
+ r = ieSaveFile(fileUrl, content);
+ return(r);
+}
+
+xooki.io.loadFile = function (fileUrl) {
+ var r = null;
+ if((r == null) || (r == false))
+ r = mozillaLoadFile(fileUrl);
+ if((r == null) || (r == false))
+ r = ieLoadFile(fileUrl);
+ return(r);
+}
+
+xooki.io.getLocalPath = function (originalPath) {
+ // Remove any location or query part of the URL
+ var argPos = originalPath.indexOf("?");
+ if(argPos != -1)
+ originalPath = originalPath.substr(0,argPos);
+ var hashPos = originalPath.indexOf("#");
+ if(hashPos != -1)
+ originalPath = originalPath.substr(0,hashPos);
+ // Convert file://localhost/ to file:///
+ if(originalPath.indexOf("file://localhost/") == 0)
+ originalPath = "file://" + originalPath.substr(16);
+ // Convert to a native file format assuming
+ // "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
+ // "file://///server/share/path/path/path..." - FireFox pc network file --> "\server\share\path\path\path..."
+ // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
+ // "file://server/share/path/path/path..." - pc network file --> "\server\share\path\path\path..."
+ var localPath;
+ if(originalPath.charAt(9) == ":") // pc local file
+ localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\");
+ else if(originalPath.indexOf("file://///") == 0) // FireFox pc network file
+ localPath = "\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\");
+ else if(originalPath.indexOf("file:///") == 0) // mac/unix local file
+ localPath = unescape(originalPath.substr(7));
+ else if(originalPath.indexOf("file:/") == 0) // mac/unix local file
+ localPath = unescape(originalPath.substr(5));
+ else // pc network file
+ localPath = "\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\");
+ return localPath;
+}
+
+
+// Returns null if it can't do it, false if there's an error, true if it saved OK
+function ieSaveFile(filePath, content)
+{
+ try
+ {
+ var fso = new ActiveXObject("Scripting.FileSystemObject");
+ }
+ catch(e)
+ {
+ //alert("Exception while attempting to save
+
+" + e.toString());
+ return(null);
+ }
+ var file = fso.OpenTextFile(filePath,2,-1,0);
+ file.Write(content);
+ file.Close();
+ return(true);
+}
+
+// Returns null if it can't do it, false if there's an error, or a string of the content if successful
+function ieLoadFile(filePath)
+{
+ try
+ {
+ var fso = new ActiveXObject("Scripting.FileSystemObject");
+ var file = fso.OpenTextFile(filePath,1);
+ var content = file.ReadAll();
+ file.Close();
+ }
+ catch(e)
+ {
+ //alert("Exception while attempting to load
+
+" + e.toString());
+ return(null);
+ }
+ return(content);
+}
+
+// Returns null if it can't do it, false if there's an error, true if it saved OK
+function mozillaSaveFile(filePath, content)
+{
+ if(window.Components)
+ try
+ {
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+ var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
+ file.initWithPath(filePath);
+ if (!file.exists())
+ file.create(0, 0664);
+ var out = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
+ out.init(file, 0x20 | 0x02, 00004,null);
+ out.write(content, content.length);
+ out.flush();
+ out.close();
+ return(true);
+ }
+ catch(e)
+ {
+ //alert("Exception while attempting to save
+
+" + e);
+ return(false);
+ }
+ return(null);
+}
+
+// Returns null if it can't do it, false if there's an error, or a string of the content if successful
+function mozillaLoadFile(filePath)
+{
+ if(window.Components)
+ try
+ {
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+ var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
+ file.initWithPath(filePath);
+ if (!file.exists())
+ return(null);
+ var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
+ inputStream.init(file, 0x01, 00004, null);
+ var sInputStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
+ sInputStream.init(inputStream);
+ return(sInputStream.read(sInputStream.available()));
+ }
+ catch(e)
+ {
+ //alert("Exception while attempting to load
+
+" + e);
+ return(false);
+ }
+ return(null);
+}
+
+// end tiddly wiki borrowed code
Added: incubator/easyant/site/sources/xooki/trimpath/template.js
URL: http://svn.apache.org/viewvc/incubator/easyant/site/sources/xooki/trimpath/template.js?rev=1078591&view=auto
==============================================================================
--- incubator/easyant/site/sources/xooki/trimpath/template.js (added)
+++ incubator/easyant/site/sources/xooki/trimpath/template.js Sun Mar 6 21:48:20 2011
@@ -0,0 +1,397 @@
+/**
+ * TrimPath Template. Release 1.0.38.
+ * Copyright (C) 2004, 2005 Metaha.
+ *
+ * TrimPath Template is licensed under the GNU General Public License
+ * and the Apache License, Version 2.0, as follows:
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var TrimPath;
+
+// TODO: Debugging mode vs stop-on-error mode - runtime flag.
+// TODO: Handle || (or) characters and backslashes.
+// TODO: Add more modifiers.
+
+(function() { // Using a closure to keep global namespace clean.
+ if (TrimPath == null)
+ TrimPath = new Object();
+ if (TrimPath.evalEx == null)
+ TrimPath.evalEx = function(src) { return eval(src); };
+
+ var UNDEFINED;
+ if (Array.prototype.pop == null) // IE 5.x fix from Igor Poteryaev.
+ Array.prototype.pop = function() {
+ if (this.length === 0) {return UNDEFINED;}
+ return this[--this.length];
+ };
+ if (Array.prototype.push == null) // IE 5.x fix from Igor Poteryaev.
+ Array.prototype.push = function() {
+ for (var i = 0; i < arguments.length; ++i) {this[this.length] = arguments[i];}
+ return this.length;
+ };
+
+ TrimPath.parseTemplate = function(tmplContent, optTmplName, optEtc) {
+ if (optEtc == null)
+ optEtc = TrimPath.parseTemplate_etc;
+ var funcSrc = parse(tmplContent, optTmplName, optEtc);
+ var func = TrimPath.evalEx(funcSrc, optTmplName, 1);
+ if (func != null)
+ return new optEtc.Template(optTmplName, tmplContent, funcSrc, func, optEtc);
+ return null;
+ }
+
+ try {
+ String.prototype.process = function(context, optFlags) {
+ var template = TrimPath.parseTemplate(this, null);
+ if (template != null)
+ return template.process(context, optFlags);
+ return this;
+ }
+ } catch (e) { // Swallow exception, such as when String.prototype is sealed.
+ }
+
+ TrimPath.parseTemplate_etc = {}; // Exposed for extensibility.
+ TrimPath.parseTemplate_etc.statementTag = "forelse|for|if|elseif|else|var|macro";
+ TrimPath.parseTemplate_etc.statementDef = { // Lookup table for statement tags.
+ "if" : { delta: 1, prefix: "if (", suffix: ") {", paramMin: 1 },
+ "else" : { delta: 0, prefix: "} else {" },
+ "elseif" : { delta: 0, prefix: "} else if (", suffix: ") {", paramDefault: "true" },
+ "/if" : { delta: -1, prefix: "}" },
+ "for" : { delta: 1, paramMin: 3,
+ prefixFunc : function(stmtParts, state, tmplName, etc) {
+ if (stmtParts[2] != "in")
+ throw new etc.ParseError(tmplName, state.line, "bad for loop statement: " + stmtParts.join(' '));
+ var iterVar = stmtParts[1];
+ var listVar = "__LIST__" + iterVar;
+ return [ "var ", listVar, " = ", stmtParts[3], ";",
+ // Fix from Ross Shaull for hash looping, make sure that we have an array of loop lengths to treat like a stack.
+ "var __LENGTH_STACK__;",
+ "if (typeof(__LENGTH_STACK__) == 'undefined' || !__LENGTH_STACK__.length) __LENGTH_STACK__ = new Array();",
+ "__LENGTH_STACK__[__LENGTH_STACK__.length] = 0;", // Push a new for-loop onto the stack of loop lengths.
+ "if ((", listVar, ") != null) { ",
+ "var ", iterVar, "_ct = 0;", // iterVar_ct variable, added by B. Bittman
+ "for (var ", iterVar, "_index in ", listVar, ") { ",
+ iterVar, "_ct++;",
+ "if (typeof(", listVar, "[", iterVar, "_index]) == 'function') {continue;}", // IE 5.x fix from Igor Poteryaev.
+ "__LENGTH_STACK__[__LENGTH_STACK__.length - 1]++;",
+ "var ", iterVar, " = ", listVar, "[", iterVar, "_index];" ].join("");
+ } },
+ "forelse" : { delta: 0, prefix: "} } if (__LENGTH_STACK__[__LENGTH_STACK__.length - 1] == 0) { if (", suffix: ") {", paramDefault: "true" },
+ "/for" : { delta: -1, prefix: "} }; delete __LENGTH_STACK__[__LENGTH_STACK__.length - 1];" }, // Remove the just-finished for-loop from the stack of loop lengths.
+ "var" : { delta: 0, prefix: "var ", suffix: ";" },
+ "macro" : { delta: 1,
+ prefixFunc : function(stmtParts, state, tmplName, etc) {
+ var macroName = stmtParts[1].split('(')[0];
+ return [ "var ", macroName, " = function",
+ stmtParts.slice(1).join(' ').substring(macroName.length),
+ "{ var _OUT_arr = []; var _OUT = { write: function(m) { if (m) _OUT_arr.push(m); } }; " ].join('');
+ } },
+ "/macro" : { delta: -1, prefix: " return _OUT_arr.join(''); };" }
+ }
+ TrimPath.parseTemplate_etc.modifierDef = {
+ "eat" : function(v) { return ""; },
+ "escape" : function(s) { return String(s).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">"); },
+ "capitalize" : function(s) { return String(s).toUpperCase(); },
+ "default" : function(s, d) { return s != null ? s : d; }
+ }
+ TrimPath.parseTemplate_etc.modifierDef.h = TrimPath.parseTemplate_etc.modifierDef.escape;
+
+ TrimPath.parseTemplate_etc.Template = function(tmplName, tmplContent, funcSrc, func, etc) {
+ this.process = function(context, flags) {
+ if (context == null)
+ context = {};
+ if (context._MODIFIERS == null)
+ context._MODIFIERS = {};
+ if (context.defined == null)
+ context.defined = function(str) { return (context[str] != undefined); };
+ for (var k in etc.modifierDef) {
+ if (context._MODIFIERS[k] == null)
+ context._MODIFIERS[k] = etc.modifierDef[k];
+ }
+ if (flags == null)
+ flags = {};
+ var resultArr = [];
+ var resultOut = { write: function(m) { resultArr.push(m); } };
+ try {
+ func(resultOut, context, flags);
+ } catch (e) {
+ if (flags.throwExceptions == true)
+ throw e;
+ var result = new String(resultArr.join("") + "[ERROR: " + e.toString() + (e.message ? '; ' + e.message : '') + "]");
+ result["exception"] = e;
+ return result;
+ }
+ return resultArr.join("");
+ }
+ this.name = tmplName;
+ this.source = tmplContent;
+ this.sourceFunc = funcSrc;
+ this.toString = function() { return "TrimPath.Template [" + tmplName + "]"; }
+ }
+ TrimPath.parseTemplate_etc.ParseError = function(name, line, message) {
+ this.name = name;
+ this.line = line;
+ this.message = message;
+ }
+ TrimPath.parseTemplate_etc.ParseError.prototype.toString = function() {
+ return ("TrimPath template ParseError in " + this.name + ": line " + this.line + ", " + this.message);
+ }
+
+ var parse = function(body, tmplName, etc) {
+ body = cleanWhiteSpace(body);
+ var funcText = [ "var TrimPath_Template_TEMP = function(_OUT, _CONTEXT, _FLAGS) { with (_CONTEXT) {" ];
+ var state = { stack: [], line: 1 }; // TODO: Fix line number counting.
+ var endStmtPrev = -1;
+ while (endStmtPrev + 1 < body.length) {
+ var begStmt = endStmtPrev;
+ // Scan until we find some statement markup.
+ begStmt = body.indexOf("{", begStmt + 1);
+ while (begStmt >= 0) {
+ var endStmt = body.indexOf('}', begStmt + 1);
+ var stmt = body.substring(begStmt, endStmt);
+ var blockrx = stmt.match(/^\{(cdata|minify|eval)/); // From B. Bittman, minify/eval/cdata implementation.
+ if (blockrx) {
+ var blockType = blockrx[1];
+ var blockMarkerBeg = begStmt + blockType.length + 1;
+ var blockMarkerEnd = body.indexOf('}', blockMarkerBeg);
+ if (blockMarkerEnd >= 0) {
+ var blockMarker;
+ if( blockMarkerEnd - blockMarkerBeg <= 0 ) {
+ blockMarker = "{/" + blockType + "}";
+ } else {
+ blockMarker = body.substring(blockMarkerBeg + 1, blockMarkerEnd);
+ }
+
+ var blockEnd = body.indexOf(blockMarker, blockMarkerEnd + 1);
+ if (blockEnd >= 0) {
+ emitSectionText(body.substring(endStmtPrev + 1, begStmt), funcText);
+
+ var blockText = body.substring(blockMarkerEnd + 1, blockEnd);
+ if (blockType == 'cdata') {
+ emitText(blockText, funcText);
+ } else if (blockType == 'minify') {
+ emitText(scrubWhiteSpace(blockText), funcText);
+ } else if (blockType == 'eval') {
+ if (blockText != null && blockText.length > 0) // From B. Bittman, eval should not execute until process().
+ funcText.push('_OUT.write( (function() { ' + blockText + ' })() );');
+ }
+ begStmt = endStmtPrev = blockEnd + blockMarker.length - 1;
+ }
+ }
+ } else if (body.charAt(begStmt - 1) != '$' && // Not an expression or backslashed,
+ body.charAt(begStmt - 1) != '\\') { // so check if it is a statement tag.
+ var offset = (body.charAt(begStmt + 1) == '/' ? 2 : 1); // Close tags offset of 2 skips '/'.
+ // 10 is larger than maximum statement tag length.
+ if (body.substring(begStmt + offset, begStmt + 10 + offset).search(TrimPath.parseTemplate_etc.statementTag) == 0)
+ break; // Found a match.
+ }
+ begStmt = body.indexOf("{", begStmt + 1);
+ }
+ if (begStmt < 0) // In "a{for}c", begStmt will be 1.
+ break;
+ var endStmt = body.indexOf("}", begStmt + 1); // In "a{for}c", endStmt will be 5.
+ if (endStmt < 0)
+ break;
+ emitSectionText(body.substring(endStmtPrev + 1, begStmt), funcText);
+ emitStatement(body.substring(begStmt, endStmt + 1), state, funcText, tmplName, etc);
+ endStmtPrev = endStmt;
+ }
+ emitSectionText(body.substring(endStmtPrev + 1), funcText);
+ if (state.stack.length != 0)
+ throw new etc.ParseError(tmplName, state.line, "unclosed, unmatched statement(s): " + state.stack.join(","));
+ funcText.push("}}; TrimPath_Template_TEMP");
+ return funcText.join("");
+ }
+
+ var emitStatement = function(stmtStr, state, funcText, tmplName, etc) {
+ var parts = stmtStr.slice(1, -1).split(' ');
+ var stmt = etc.statementDef[parts[0]]; // Here, parts[0] == for/if/else/...
+ if (stmt == null) { // Not a real statement.
+ emitSectionText(stmtStr, funcText);
+ return;
+ }
+ if (stmt.delta < 0) {
+ if (state.stack.length <= 0)
+ throw new etc.ParseError(tmplName, state.line, "close tag does not match any previous statement: " + stmtStr);
+ state.stack.pop();
+ }
+ if (stmt.delta > 0)
+ state.stack.push(stmtStr);
+
+ if (stmt.paramMin != null &&
+ stmt.paramMin >= parts.length)
+ throw new etc.ParseError(tmplName, state.line, "statement needs more parameters: " + stmtStr);
+ if (stmt.prefixFunc != null)
+ funcText.push(stmt.prefixFunc(parts, state, tmplName, etc));
+ else
+ funcText.push(stmt.prefix);
+ if (stmt.suffix != null) {
+ if (parts.length <= 1) {
+ if (stmt.paramDefault != null)
+ funcText.push(stmt.paramDefault);
+ } else {
+ for (var i = 1; i < parts.length; i++) {
+ if (i > 1)
+ funcText.push(' ');
+ funcText.push(parts[i]);
+ }
+ }
+ funcText.push(stmt.suffix);
+ }
+ }
+
+ var emitSectionText = function(text, funcText) {
+ if (text.length <= 0)
+ return;
+ var nlPrefix = 0; // Index to first non-newline in prefix.
+ var nlSuffix = text.length - 1; // Index to first non-space/tab in suffix.
+ while (nlPrefix < text.length && (text.charAt(nlPrefix) == '\n'))
+ nlPrefix++;
+ while (nlSuffix >= 0 && (text.charAt(nlSuffix) == ' ' || text.charAt(nlSuffix) == '\t'))
+ nlSuffix--;
+ if (nlSuffix < nlPrefix)
+ nlSuffix = nlPrefix;
+ if (nlPrefix > 0) {
+ funcText.push('if (_FLAGS.keepWhitespace == true) _OUT.write("');
+ var s = text.substring(0, nlPrefix).replace('\n', '\\n'); // A macro IE fix from BJessen.
+ if (s.charAt(s.length - 1) == '\n')
+ s = s.substring(0, s.length - 1);
+ funcText.push(s);
+ funcText.push('");');
+ }
+ var lines = text.substring(nlPrefix, nlSuffix + 1).split('\n');
+ for (var i = 0; i < lines.length; i++) {
+ emitSectionTextLine(lines[i], funcText);
+ if (i < lines.length - 1)
+ funcText.push('_OUT.write("\\n");\n');
+ }
+ if (nlSuffix + 1 < text.length) {
+ funcText.push('if (_FLAGS.keepWhitespace == true) _OUT.write("');
+ var s = text.substring(nlSuffix + 1).replace('\n', '\\n');
+ if (s.charAt(s.length - 1) == '\n')
+ s = s.substring(0, s.length - 1);
+ funcText.push(s);
+ funcText.push('");');
+ }
+ }
+
+ var emitSectionTextLine = function(line, funcText) {
+ var endMarkPrev = '}';
+ var endExprPrev = -1;
+ while (endExprPrev + endMarkPrev.length < line.length) {
+ var begMark = "${", endMark = "}";
+ var begExpr = line.indexOf(begMark, endExprPrev + endMarkPrev.length); // In "a${b}c", begExpr == 1
+ if (begExpr < 0)
+ break;
+ if (line.charAt(begExpr + 2) == '%') {
+ begMark = "${%";
+ endMark = "%}";
+ }
+ var endExpr = line.indexOf(endMark, begExpr + begMark.length); // In "a${b}c", endExpr == 4;
+ if (endExpr < 0)
+ break;
+ emitText(line.substring(endExprPrev + endMarkPrev.length, begExpr), funcText);
+ // Example: exprs == 'firstName|default:"John Doe"|capitalize'.split('|')
+ var exprArr = line.substring(begExpr + begMark.length, endExpr).replace(/\|\|/g, "#@@#").split('|');
+ for (var k in exprArr) {
+ if (exprArr[k].replace) // IE 5.x fix from Igor Poteryaev.
+ exprArr[k] = exprArr[k].replace(/#@@#/g, '||');
+ }
+ funcText.push('_OUT.write(');
+ emitExpression(exprArr, exprArr.length - 1, funcText);
+ funcText.push(');');
+ endExprPrev = endExpr;
+ endMarkPrev = endMark;
+ }
+ emitText(line.substring(endExprPrev + endMarkPrev.length), funcText);
+ }
+
+ var emitText = function(text, funcText) {
+ if (text == null ||
+ text.length <= 0)
+ return;
+ text = text.replace(/\\/g, '\\\\');
+ text = text.replace(/\n/g, '\\n');
+ text = text.replace(/"/g, '\\"');
+ funcText.push('_OUT.write("');
+ funcText.push(text);
+ funcText.push('");');
+ }
+
+ var emitExpression = function(exprArr, index, funcText) {
+ // Ex: foo|a:x|b:y1,y2|c:z1,z2 is emitted as c(b(a(foo,x),y1,y2),z1,z2)
+ var expr = exprArr[index]; // Ex: exprArr == [firstName,capitalize,default:"John Doe"]
+ if (index <= 0) { // Ex: expr == 'default:"John Doe"'
+ funcText.push(expr);
+ return;
+ }
+ var parts = expr.split(':');
+ funcText.push('_MODIFIERS["');
+ funcText.push(parts[0]); // The parts[0] is a modifier function name, like capitalize.
+ funcText.push('"](');
+ emitExpression(exprArr, index - 1, funcText);
+ if (parts.length > 1) {
+ funcText.push(',');
+ funcText.push(parts[1]);
+ }
+ funcText.push(')');
+ }
+
+ var cleanWhiteSpace = function(result) {
+ result = result.replace(/\t/g, " ");
+ result = result.replace(/\r\n/g, "\n");
+ result = result.replace(/\r/g, "\n");
+ result = result.replace(/^(\s*\S*(\s+\S+)*)\s*$/, '$1'); // Right trim by Igor Poteryaev.
+ return result;
+ }
+
+ var scrubWhiteSpace = function(result) {
+ result = result.replace(/^\s+/g, "");
+ result = result.replace(/\s+$/g, "");
+ result = result.replace(/\s+/g, " ");
+ result = result.replace(/^(\s*\S*(\s+\S+)*)\s*$/, '$1'); // Right trim by Igor Poteryaev.
+ return result;
+ }
+
+ // The DOM helper functions depend on DOM/DHTML, so they only work in a browser.
+ // However, these are not considered core to the engine.
+ //
+ TrimPath.parseDOMTemplate = function(elementId, optDocument, optEtc) {
+ if (optDocument == null)
+ optDocument = document;
+ var element = optDocument.getElementById(elementId);
+ var content = element.value; // Like textarea.value.
+ if (content == null)
+ content = element.innerHTML; // Like textarea.innerHTML.
+ content = content.replace(/</g, "<").replace(/>/g, ">");
+ return TrimPath.parseTemplate(content, elementId, optEtc);
+ }
+
+ TrimPath.processDOMTemplate = function(elementId, context, optFlags, optDocument, optEtc) {
+ return TrimPath.parseDOMTemplate(elementId, optDocument, optEtc).process(context, optFlags);
+ }
+}) ();