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