var jagg = jagg || (function () {
var ctx = context;
var modules = {};
var requirs = {};
var templates = {};
var initializers = {};
var bloks = {};
var data;
var setData = function (d) {
data = d;
};
var getData = function () {
return data;
};
var getUser = function () {
return session.get("logged.user");
};
var setUser = function (user) {
session.put("logged.user", user);
};
var getThemeFile = function (path) {
var p, index, theme = getUserTheme();
if(theme.subtheme) {
p = getThemePath() + "subthemes/" + theme.subtheme + "/" + path;
index = p.indexOf("?");
if(new File(p.substring(0, index == -1 ? p.length : index)).isExists()) {
return p;
}
}
return getThemePath() + path;
};
var getThemesPath = function () {
return "/site/themes/";
};
var getThemePath = function () {
return getThemesPath() + getUserTheme().base + "/";
};
var getBlockFile = function (name) {
return getBlocksDir() + name + "/block.jag";
};
var getInitializerFile = function (name) {
return getThemeFile("templates/" + name + "/initializer.jag");
};
var getTemplateFile = function (name) {
return getThemeFile("templates/" + name + "/template.jag");
};
var getTemplatePath = function(themeDir, name) {
return themeDir + "templates/" + name + "/template.jag";
};
var getModuleFile = function (name) {
return getModulesDir() + name + "/module.jag";
};
var getBlocksDir = function () {
return "/site/blocks/";
};
var getThemesDir = function () {
return "/site/themes/";
};
var getModulesDir = function () {
return "/modules/";
};
var getTheme = function () {
var site = require("/site/conf/site.json"),
theme = request.getParameter("theme"),
subtheme = request.getParameter("subtheme");
return {
base : theme ? theme : site.theme.base,
subtheme : subtheme ? subtheme : site.theme.subtheme
};
};
var getUserTheme = function () {
return session.get("theme") ? session.get("theme") : getTheme();
};
var mergeParams = function (extInputs, defInputs) {
var key, obj;
extInputs = extInputs || {};
for (key in defInputs) {
if (defInputs.hasOwnProperty(key)) {
obj = extInputs[key];
if (!obj) {
extInputs[key] = defInputs[key];
}
}
}
return extInputs;
};
var renderBlock = function (name, inputs, outputs, populate) {
//initializeTemplate({name:name, params:null}, jagg);
var init, fn, blok, log = new Log();
fn = template(name);
if (!fn) {
log.error("Template header and footer includes are missing for : " + name);
}
if (populate) {
blok = block(name);
if (!inputs) {
inputs = blok.getInputs ? blok.getInputs() : {};
} else {
mergeParams(inputs, blok.getInputs ? blok.getInputs() : null);
}
if (blok.getOutputs) {
outputs = blok.getOutputs(inputs);
} else if (blok.getInputs) {
outputs = inputs;
} else {
outputs = {};
}
}
init = initializer(name);
if (init.postInitialize) {
init.postInitialize(inputs, outputs);
}
fn(inputs, outputs, jagg);
};
var inheritParent = function (blok, name) {
var parent = require(getBlockFile(name));
for (var prop in parent) {
if (parent.hasOwnProperty(prop)) {
if (!blok[prop]) {
blok[prop] = parent[prop];
}
}
}
};
var initializeBlock = function (obj) {
if (!obj) {
return;
}
var extInputs, defInputs, parent, tmpl, inputBlocks, outputBlocks, outputs, tmplInitializer, bloks, i, length,
name = obj.name, blok = block(name), log = new Log();
template(name);
extInputs = obj.inputs || (obj.inputs = {});
defInputs = blok.getInputs ? blok.getInputs() : {};
mergeParams(extInputs, defInputs);
if (blok.getInputBlocks) {
inputBlocks = blok.getInputBlocks();
length = inputBlocks.length;
for (i = 0; i < length; i++) {
initializeBlocks(inputBlocks[i], extInputs);
}
}
if (blok.getOutputs) {
outputs = blok.getOutputs(extInputs);
} else if (blok.getInputs) {
outputs = extInputs;
} else {
outputs = {};
}
obj.outputs = outputs;
if (blok.getOutputBlocks) {
outputBlocks = blok.getOutputBlocks();
length = outputBlocks.length;
for (i = 0; i < length; i++) {
initializeBlocks(outputBlocks[i], outputs);
}
}
if (blok.getStaticBlocks) {
bloks = blok.getStaticBlocks();
length = bloks.length;
for (i = 0; i < length; i++) {
initializeBlock({name:bloks[i], inputs:null});
}
}
};
// [ "foo", "bar", "mar"]
// [{ "name" : "foo/bar", params : {}}]
var initializeBlocks = function (keys, inputs) {
if (!inputs) {
return;
}
var i, length, values, last;
if (typeof keys !== "string") {
length = keys.length;
values = inputs[keys[0]];
last = (length == 1);
if (values instanceof Array) {
length = values.length;
for (i = 0; i < length; i++) {
if (last) {
initializeBlock(values[i]);
} else {
initializeBlocks(keys.slice(1), values[i]);
}
}
} else {
if (last) {
initializeBlock(values);
} else {
initializeBlocks(keys.slice(1), values);
}
}
return;
} else {
values = inputs[keys];
}
if (values instanceof Array) {
length = values.length;
for (i = 0; i < length; i++) {
initializeBlock(values[i]);
}
} else {
initializeBlock(values);
}
};
var insertData = function (jagg, template, parent, name, key, value) {
var keys, values, data = getData();
data = data[parent] || (data[parent] = {});
data = data[name] || (data[name] = {});
data = data[template] || (data[template] = {});
keys = data.keys || (data.keys = []);
values = data.values || (data.values = {});
keys.push(key);
values[key] = value;
};
var printData = function (tmpls) {
var key, tmpl, keys, values, i, length;
for (key in tmpls) {
if (tmpls.hasOwnProperty(key)) {
tmpl = tmpls[key];
keys = tmpl.keys;
values = tmpl.values;
length = keys.length;
for (i = 0; i < length; i++) {
print(values[keys[i]]);
}
}
}
};
var getUrlMapping = function (path) {
var urlMap = ctx.get("url.map"), url, configs, i, length, mapping, mappings, file;
if (urlMap) {
url = urlMap[path];
return url ? url : path;
}
file = new File("/jaggery.conf");
file.open("r");
configs = parse(file.readAll());
file.close();
urlMap = {};
mappings = configs.urlMappings;
length = mappings.length;
for (i = 0; i < length; i++) {
mapping = mappings[i];
urlMap[mapping.path] = mapping.url;
}
ctx.put("url.map", urlMap);
url = urlMap[path];
return url ? url : path;
};
var getMappedUrl = function (path) {
return getAbsoluteUrl(getUrlMapping(path));
};
var getAbsoluteUrl = function (path) {
return site.context + path;
};
var module = function (name, module) {
if (module) {
return modules[name] = module;
}
module = modules[name];
if (module) {
return module;
}
include(getModuleFile(name));
return modules[name];
};
var requir = function (path) {
var obj = requirs[path];
return obj ? obj : requirs[path] = require(path);
};
var block = function (name, blok) {
var parent;
if (blok) {
return bloks[name] = blok;
}
blok = bloks[name];
if (blok) {
return blok;
}
//we need to include and initialize
include(getBlockFile(name));
blok = bloks[name];
parent = blok.getParent;
if (parent) {
parent = parent();
inheritParent(blok, parent);
}
if (blok.initialize) {
//TODO which to pass into initialize method
blok.initialize(getData());
}
return bloks[name];
};
var template = function (name, tmpl) {
var blok, parent, init;
if (tmpl) {
return templates[name] = tmpl;
}
tmpl = templates[name];
if (tmpl) {
return tmpl;
}
blok = block(name);
parent = blok.getParent;
if (parent) {
name = parent();
}
tmpl = templates[name];
if (tmpl) {
return tmpl;
}
include(getTemplateFile(name));
init = initializer(name);
if (init.preInitialize) {
init.preInitialize();
}
return templates[name];
};
var initializer = function (name, init) {
var blok, parent;
if (init) {
return initializers[name] = init;
}
init = initializers[name];
if (init) {
return init;
}
blok = block(name);
parent = blok.getParent;
if (parent) {
name = parent();
}
init = initializers[name];
if (init) {
return init;
}
include(getInitializerFile(name));
return initializers[name];
};
var render = function (obj) {
var init, fn, inputs, outputs, name = obj.name, log = new Log(), blok;
setData(obj);
initializeBlock(obj);
include(getTemplateFile(name));
fn = template(name);
if (!fn) {
log.error("Template header and footer includes are missing for : " + name);
}
inputs = obj.inputs;
blok = block(name);
if (blok.getOutputs) {
outputs = blok.getOutputs(inputs);
} else if (blok.getInputs) {
outputs = inputs;
} else {
outputs = {};
}
init = initializer(name);
if (init.postInitialize) {
init.postInitialize(inputs, outputs);
}
fn(inputs, outputs, jagg);
};
var includeBlock = function (name, inputs) {
renderBlock(name, inputs, null, true);
};
var includeBlocks = function (bloks) {
if (!bloks) {
return;
}
var i, d, length;
if (bloks instanceof Array) {
length = bloks.length;
for (i = 0; i < length; i++) {
d = bloks[i];
renderBlock(d.name, d.inputs, d.outputs, false);
}
} else {
renderBlock(bloks.name, bloks.inputs, bloks.outputs, false);
}
};
var addHeaderCSS = function (template, key, css) {
css = '<link type="text/css" rel="stylesheet" href="' + site.context + getThemeFile(css) + '"/>';
insertData(this, template, "header", "css", key, css);
};
var addHeaderCSSCode = function (template, key, css) {
css = '<style type="text/css">' + css + '</style>';
insertData(this, template, "header", "css", key, css);
};
var addHeaderJS = function (template, key, js) {
js = '<script type="text/javascript" src="' + site.context + getThemeFile(js) + '"></script>';
insertData(this, template, "header", "js", key, js);
};
var addHeaderJSCode = function (template, key, js) {
js = '<script type="text/javascript">' + js + '</script>';
insertData(this, template, "header", "js", key, js);
};
var addHeaderCode = function (template, key, code) {
insertData(this, template, "header", "code", key, code);
};
var addFooterCSS = function (template, key, css) {
css = '<link type="text/css" rel="stylesheet" href="' + site.context + getThemeFile(css) + '"/>';
insertData(this, template, "footer", "css", key, css);
};
var addFooterCSSCode = function (template, key, css) {
css = '<style type="text/css">' + css + '</style>';
insertData(this, template, "footer", "css", key, css);
};
var addFooterJS = function (template, key, js) {
js = '<script type="text/javascript" src="' + site.context + getThemeFile(js) + '"></script>';
insertData(this, template, "footer", "js", key, js);
};
var addFooterJSCode = function (template, key, js) {
js = '<script type="text/javascript">' + js + '</script>';
insertData(this, template, "footer", "js", key, js);
};
var addFooterCode = function (template, key, code) {
insertData(this, template, "footer", "code", key, code);
};
var includeJag = function (path) {
include(getThemeFile(path));
};
return {
setUser:setUser,
getUser:getUser,
block:block,
module:module,
initializer:initializer,
includeBlock:includeBlock,
includeBlocks:includeBlocks,
render:render,
template:template,
require:requir,
getAbsoluteUrl:getAbsoluteUrl,
getMappedUrl:getMappedUrl,
printData:printData,
getModulesDir:getModulesDir,
data:getData,
addHeaderCSS:addHeaderCSS,
addHeaderCSSCode:addHeaderCSSCode,
addHeaderJS:addHeaderJS,
addHeaderJSCode:addHeaderJSCode,
addHeaderCode:addHeaderCode,
addFooterCSS:addFooterCSS,
addFooterCSSCode:addFooterCSSCode,
addFooterJS:addFooterJS,
addFooterJSCode:addFooterJSCode,
addFooterCode:addFooterCode,
includeJag:includeJag,
getUserTheme:getUserTheme,
getThemeFile:getThemeFile
};
}());
这个表达式是什么意思??我就没看懂这高人想干什么?特别是中间的这个 || ,变量本身和一个function取||是什么意思??