
features.opensocial-templates.os.js Maven / Gradle / Ivy
Go to download
Packages all the features that shindig provides into a single jar file to allow
loading from the classpath
The newest version!
/*
* 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.
*/
/**
* @fileoverview Implements os:Render tag and OpenSocial-specific
* identifier resolver.
*/
/**
* Define 'os:Render' and 'os:Html' tags and the @onAttach attribute
*/
os.defineBuiltinTags = function() {
var osn = os.getNamespace('os') ||
os.createNamespace('os', 'http://ns.opensocial.org/2008/markup');
/**
* custom tag for variable assignment
*/
osn.Var = function(node, data, context) {
var value = os.getValueFromNode_(node,'value');
if (! value && node.innerHTML) {
value = node.innerHTML;
}
var parsedValue = gadgets.json.parse(value);
if (parsedValue) {
value = parsedValue;
}
context['vars_'][VAR_top][node.getAttribute('key')] = value;
return '';
};
/**
* custom tag renders the specified child nodes of the current
* context.
*/
osn.Render = function(node, data, context) {
var parent = context.getVariable(os.VAR_parentnode);
var exp = node.getAttribute('content') || '*';
var result = os.getValueFromNode_(parent, exp);
if (!result) {
return '';
} else if (typeof(result) == 'string') {
var textNode = document.createTextNode(result);
result = [];
result.push(textNode);
} else if (!os.isArray(result)) {
var resultArray = [];
for (var i = 0; i < result.childNodes.length; i++) {
resultArray.push(result.childNodes[i]);
}
result = resultArray;
} else if (exp != '*' && result.length == 1 &&
result[0].nodeType == DOM_ELEMENT_NODE) {
// When we call , render the inner content
// of the tag returned, not the tag itself.
var resultArray = [];
for (var child = result[0].firstChild; child; child = child.nextSibling) {
resultArray.push(child);
}
result = resultArray;
}
// Trim away leading and trailing spaces on IE, which interprets them
// literally.
if (os.isIe) {
for (var i = 0; i < result.length; i++) {
if (result[i].nodeType == DOM_TEXT_NODE) {
var trimmed = os.trimWhitespaceForIE_(
result[i].nodeValue, (i == 0), (i == result.length - 1));
if (trimmed != result[i].nodeValue) {
result[i].parentNode.removeChild(result[i]);
result[i] = document.createTextNode(trimmed);
}
}
}
}
return result;
};
// TODO: Remove legacy names.
osn.render = osn.RenderAll = osn.renderAll = osn.Render;
/**
* custom tag renders HTML content (as opposed to HTML code), so
* would result in the bold string "Hello",
* rather than the text of the markup.
*/
osn.Html = function(node) {
var html = node.code ? '' + node.code : node.getAttribute('code') || '';
// TODO(levik): Sanitize the HTML here to avoid script injection issues.
// Perhaps use the gadgets sanitizer if available.
return html;
};
function createClosure(object, method) {
return function() {
method.apply(object);
};
}
/**
* Custom attribute handler for @onAttach attribute, which allows deferred
* execution of a snippet of JS when a template is attached to the DOM.
* This is useful for when geometry needs to be available for post-processing
* (such as with Google Maps).
* The code will have "this" bounde to the DOM node on which the attribute was
* found.
*/
function processOnAttach(node, code, data, context) {
var callbacks = context.getVariable(os.VAR_callbacks);
var func = new Function(code);
callbacks.push(createClosure(node, func));
}
os.registerAttribute_('onAttach', processOnAttach);
os.registerAttribute_('onCreate', processOnAttach);
os.registerAttribute_('oncreate', processOnAttach);
os.registerAttribute_('x-oncreate', processOnAttach);
os.registerAttribute_('x-onCreate', processOnAttach);
};
os.defineBuiltinTags();
/**
* Identifier Resolver function for OpenSocial objects.
* Checks for:
*
* - Simple property
* - JavaBean-style getter
* - OpenSocial Field
* - Data result set
*
* @param {Object} object The object in the scope of which to get a named
* property.
* @param {string} name The name of the property to get.
* @return {Object?} The property requested.
*/
os.resolveOpenSocialIdentifier = function(object, name) {
// Simple property from object.
if (typeof(object[name]) != 'undefined') {
return object[name];
}
// JavaBean-style getter method.
var functionName = os.getPropertyGetterName(name);
if (object[functionName]) {
return object[functionName]();
}
// Check OpenSocial field by dictionary mapping
if (object.getField) {
var fieldData = object.getField(name);
if (fieldData) {
return fieldData;
}
}
// Multi-purpose get() method
if (object.get) {
var responseItem = object.get(name);
// ResponseItem is a data set
if (responseItem && responseItem.getData) {
var data = responseItem.getData();
// Return array payload where appropriate
return data.array_ || data;
}
return responseItem;
}
// Return undefined value, to avoid confusing with existing value of "null".
var und;
return und;
};
os.setIdentifierResolver(os.resolveOpenSocialIdentifier);
/**
* Create methods for an object based upon a field map for OpenSocial.
* @param {Object} object Class object to have methods created for.
* @param {Object} fields A key-value map object to retrieve fields (keys) and
* method names (values) from.
* @private
*/
os.createOpenSocialGetMethods_ = function(object, fields) {
if (object && fields) {
for (var key in fields) {
var value = fields[key];
var getter = os.getPropertyGetterName(value);
object.prototype[getter] = function() {
this.getField(key);
};
}
}
};
/**
* Automatically register JavaBean-style methods for various OpenSocial objects.
* @private
*/
os.registerOpenSocialFields_ = function() {
var fields = os.resolveOpenSocialIdentifier.FIELDS;
if (opensocial) {
// TODO: Add more OpenSocial objects.
if (opensocial.Person) {
//os.createOpenSocialGetMethods_(opensocial.Person, opensocial.Person.Field);
}
}
};
os.registerOpenSocialFields_();
© 2015 - 2025 Weber Informatics LLC | Privacy Policy