76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassYUI.add('widget-htmlparser', function(Y) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass/**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Adds HTML Parser support to the base Widget class
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @module widget
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @submodule widget-htmlparser
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @for Widget
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glassvar Widget = Y.Widget,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Node = Y.Node,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Lang = Y.Lang,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass SRC_NODE = "srcNode",
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass CONTENT_BOX = "contentBox";
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass/**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Object hash, defining how attribute values are to be parsed from
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * markup contained in the widget's content box. e.g.:
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <pre>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * // Set single Node references using selector syntax
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * // (selector is run through node.one)
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * titleNode: "span.yui-title",
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * // Set NodeList references using selector syntax
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * // (array indicates selector is to be run through node.all)
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * listNodes: ["li.yui-item"],
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * // Set other attribute types, using a parse function.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * // Context is set to the widget instance.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * label: function(contentBox) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * return contentBox.one("span.title").get("innerHTML");
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * </pre>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * @property HTML_PARSER
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Object
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassWidget.HTML_PARSER = {};
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass/**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The build configuration for the Widget class.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <p>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Defines the static fields which need to be aggregated,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * when this class is used as the main class passed to
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * the <a href="Base.html#method_build">Base.build</a> method.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * </p>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _buildCfg
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Object
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @final
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassWidget._buildCfg = {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass aggregates : ["HTML_PARSER"]
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass};
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass/**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The DOM node to parse for configuration values, passed to the Widget's HTML_PARSER definition
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute srcNode
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type String | Node
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @writeOnce
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassWidget.ATTRS[SRC_NODE] = {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass value: null,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass setter: Node.one,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass getter: "_getSrcNode",
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass writeOnce: true
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass};
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassY.mix(Widget.prototype, {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _getSrcNode
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {Node} The Node to apply HTML_PARSER to
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _getSrcNode : function(val) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return val || this.get(CONTENT_BOX);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _applyParsedConfig
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {Object} The merged configuration literal
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _applyParsedConfig : function(node, cfg, parsedCfg) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return (parsedCfg) ? Y.mix(cfg, parsedCfg, false) : cfg;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Utilitity method used to apply the <code>HTML_PARSER</code> configuration for the
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * instance, to retrieve config data values.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _applyParser
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param config {Object} User configuration object (will be populated with values from Node)
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _applyParser : function(config) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var widget = this,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass srcNode = widget.get(SRC_NODE),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass schema = widget._getHtmlParser(),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass parsedConfig,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass val;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (schema && srcNode) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.Object.each(schema, function(v, k, o) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass val = null;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (Lang.isFunction(v)) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass val = v.call(widget, srcNode);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (Lang.isArray(v)) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass val = srcNode.all(v[0]);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (val.isEmpty()) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass val = null;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass val = srcNode.one(v);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (val !== null && val !== undefined) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass parsedConfig = parsedConfig || {};
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass parsedConfig[k] = val;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass config = widget._applyParsedConfig(srcNode, config, parsedConfig);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Gets the HTML_PARSER definition for this instance, by merging HTML_PARSER
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * definitions across the class hierarchy.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _getHtmlParser
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {Object} HTML_PARSER definition for this instance
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _getHtmlParser : function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Removed caching for kweight. This is a private method
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // and only called once so don't need to cache HTML_PARSER
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var classes = this._getClasses(),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass parser = {},
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass i, p;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass for (i = classes.length - 1; i >= 0; i--) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass p = classes[i].HTML_PARSER;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (p) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.mix(parser, p, true);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return parser;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass});
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass}, '@VERSION@' ,{requires:['widget-base']});