r9681 - helma-ng/trunk/modules/helma
[email protected] Tue, 28 Apr 2009 11:01:04 +0200 (CEST)
| Newsgroups | gmane.comp.java.helma.cvs |
|---|---|
| Message-ID | <20090428090104.A71D93D0D6@mia> |
Author: hannes
Date: 2009-04-28 11:01:04 +0200 (Tue, 28 Apr 2009)
New Revision: 9681
Modified:
helma-ng/trunk/modules/helma/skin.js
Log:
Two new features in helma/skin: Read macro/filter modules from macros array in webapp config, and implement filter chains for subskins.
Details at http://dev.helma.org/trac/helma/changeset/9681
Modified: helma-ng/trunk/modules/helma/skin.js
===================================================================
--- helma-ng/trunk/modules/helma/skin.js 2009-04-28 09:01:02 UTC (rev 9680)
+++ helma-ng/trunk/modules/helma/skin.js 2009-04-28 09:01:04 UTC (rev 9681)
@@ -2,9 +2,7 @@
require('core/string');
require('core/object');
-import('helma/filters', 'filters');
import('helma/logging', 'logging');
-import('helma/system', 'system');
export('render', 'createSkin', 'Skin');
@@ -12,7 +10,7 @@
var log = logging.getLogger(__name__);
var skincache = false; // {}
-system.addHostObject(org.helma.template.MacroTag);
+require('helma/system').addHostObject(org.helma.template.MacroTag);
/**
* Parse a skin from a resource and render it using the given context.
@@ -40,6 +38,14 @@
} else {
throw Error("Unknown skin object: " + skinOrResource);
}
+ // extend context by globally provided macros and filters.
+ // user-provided context overrides globally defined stuff
+ var config = require('helma/webapp/env').config;
+ if (config && config.macros instanceof Array) {
+ for each (var module in config.macros) {
+ context = Object.merge(context, require(module));
+ }
+ }
return skin.render(context);
}
@@ -71,6 +77,7 @@
} else if (part.name === 'subskin') {
var skinName = part.getParameter('name', 0);
currentSkin = [];
+ currentSkin.filter = part.filter;
subSkins[skinName] = currentSkin;
} else {
currentSkin[currentSkin.length] = part;
@@ -131,10 +138,10 @@
};
function renderInternal(parts, context) {
- // extend context by globally provided filters. user-provided filters
- // override globally defined ones
- context = Object.merge(context, filters);
- return [renderPart(part, context) for each (part in parts)].join('');
+ var value = [renderPart(part, context) for each (part in parts)].join('');
+ if (parts && parts.filter)
+ return evaluateFilter(value, parts.filter, context);
+ return value;
}
function renderPart(part, context) {
@@ -148,16 +155,21 @@
if (value instanceof Array) {
value = value.join('');
}
+ return evaluateFilter(value, macro.filter, context);
+ }
+
+ function evaluateFilter(value, filter, context) {
// traverse the linked list of filters
- for (var filter = macro.filter; filter; filter = filter.filter) {
+ while (filter) {
// make sure value is not undefined, otherwise evaluateExpression()
// might become confused
if (!isVisible(value)) {
value = "";
}
value = evaluateExpression(filter, context, '_filter', value);
+ filter = filter.filter;
}
- return value
+ return value;
}
function evaluateExpression(macro, context, suffix, value) {