src/cm/media/js/lib/yui/yui_3.10.3/build/widget-htmlparser/widget-htmlparser-debug.js
changeset 525 89ef5ed3c48b
equal deleted inserted replaced
524:322d0feea350 525:89ef5ed3c48b
       
     1 /*
       
     2 YUI 3.10.3 (build 2fb5187)
       
     3 Copyright 2013 Yahoo! Inc. All rights reserved.
       
     4 Licensed under the BSD License.
       
     5 http://yuilibrary.com/license/
       
     6 */
       
     7 
       
     8 YUI.add('widget-htmlparser', function (Y, NAME) {
       
     9 
       
    10 /**
       
    11  * Adds HTML Parser support to the base Widget class
       
    12  *
       
    13  * @module widget
       
    14  * @submodule widget-htmlparser
       
    15  * @for Widget
       
    16  */
       
    17 
       
    18 var Widget = Y.Widget,
       
    19     Node = Y.Node,
       
    20     Lang = Y.Lang,
       
    21 
       
    22     SRC_NODE = "srcNode",
       
    23     CONTENT_BOX = "contentBox";
       
    24 
       
    25 /**
       
    26  * Object hash, defining how attribute values are to be parsed from
       
    27  * markup contained in the widget's content box. e.g.:
       
    28  * <pre>
       
    29  *   {
       
    30  *       // Set single Node references using selector syntax
       
    31  *       // (selector is run through node.one)
       
    32  *       titleNode: "span.yui-title",
       
    33  *       // Set NodeList references using selector syntax
       
    34  *       // (array indicates selector is to be run through node.all)
       
    35  *       listNodes: ["li.yui-item"],
       
    36  *       // Set other attribute types, using a parse function.
       
    37  *       // Context is set to the widget instance.
       
    38  *       label: function(contentBox) {
       
    39  *           return contentBox.one("span.title").get("innerHTML");
       
    40  *       }
       
    41  *   }
       
    42  * </pre>
       
    43  *
       
    44  * @property HTML_PARSER
       
    45  * @type Object
       
    46  * @static
       
    47  */
       
    48 Widget.HTML_PARSER = {};
       
    49 
       
    50 /**
       
    51  * The build configuration for the Widget class.
       
    52  * <p>
       
    53  * Defines the static fields which need to be aggregated,
       
    54  * when this class is used as the main class passed to
       
    55  * the <a href="Base.html#method_build">Base.build</a> method.
       
    56  * </p>
       
    57  * @property _buildCfg
       
    58  * @type Object
       
    59  * @static
       
    60  * @final
       
    61  * @private
       
    62  */
       
    63 Widget._buildCfg = {
       
    64     aggregates : ["HTML_PARSER"]
       
    65 };
       
    66 
       
    67 /**
       
    68  * The DOM node to parse for configuration values, passed to the Widget's HTML_PARSER definition
       
    69  *
       
    70  * @attribute srcNode
       
    71  * @type String | Node
       
    72  * @writeOnce
       
    73  */
       
    74 Widget.ATTRS[SRC_NODE] = {
       
    75     value: null,
       
    76     setter: Node.one,
       
    77     getter: "_getSrcNode",
       
    78     writeOnce: true
       
    79 };
       
    80 
       
    81 Y.mix(Widget.prototype, {
       
    82 
       
    83     /**
       
    84      * @method _getSrcNode
       
    85      * @protected
       
    86      * @return {Node} The Node to apply HTML_PARSER to
       
    87      */
       
    88     _getSrcNode : function(val) {
       
    89         return val || this.get(CONTENT_BOX);
       
    90     },
       
    91 
       
    92     /**
       
    93      * @method _applyParsedConfig
       
    94      * @protected
       
    95      * @return {Object} The merged configuration literal
       
    96      */
       
    97     _applyParsedConfig : function(node, cfg, parsedCfg) {
       
    98         return (parsedCfg) ? Y.mix(cfg, parsedCfg, false) : cfg;
       
    99     },
       
   100 
       
   101     /**
       
   102      * Utility method used to apply the <code>HTML_PARSER</code> configuration for the
       
   103      * instance, to retrieve config data values.
       
   104      *
       
   105      * @method _applyParser
       
   106      * @protected
       
   107      * @param config {Object} User configuration object (will be populated with values from Node)
       
   108      */
       
   109     _applyParser : function(config) {
       
   110 
       
   111         var widget = this,
       
   112             srcNode = this._getNodeToParse(),
       
   113             schema = widget._getHtmlParser(),
       
   114             parsedConfig,
       
   115             val;
       
   116 
       
   117         if (schema && srcNode) {
       
   118             Y.Object.each(schema, function(v, k, o) {
       
   119                 val = null;
       
   120 
       
   121                 if (Lang.isFunction(v)) {
       
   122                     val = v.call(widget, srcNode);
       
   123                 } else {
       
   124                     if (Lang.isArray(v)) {
       
   125                         val = srcNode.all(v[0]);
       
   126                         if (val.isEmpty()) {
       
   127                             val = null;
       
   128                         }
       
   129                     } else {
       
   130                         val = srcNode.one(v);
       
   131                     }
       
   132                 }
       
   133 
       
   134                 if (val !== null && val !== undefined) {
       
   135                     parsedConfig = parsedConfig || {};
       
   136                     parsedConfig[k] = val;
       
   137                 }
       
   138             });
       
   139         }
       
   140         config = widget._applyParsedConfig(srcNode, config, parsedConfig);
       
   141     },
       
   142 
       
   143     /**
       
   144      * Determines whether we have a node reference which we should try and parse.
       
   145      *
       
   146      * The current implementation does not parse nodes generated from CONTENT_TEMPLATE,
       
   147      * only explicitly set srcNode, or contentBox attributes.
       
   148      *
       
   149      * @method _getNodeToParse
       
   150      * @return {Node} The node reference to apply HTML_PARSER to.
       
   151      * @private
       
   152      */
       
   153     _getNodeToParse : function() {
       
   154         var srcNode = this.get("srcNode");
       
   155         return (!this._cbFromTemplate) ? srcNode : null;
       
   156     },
       
   157 
       
   158     /**
       
   159      * Gets the HTML_PARSER definition for this instance, by merging HTML_PARSER
       
   160      * definitions across the class hierarchy.
       
   161      *
       
   162      * @private
       
   163      * @method _getHtmlParser
       
   164      * @return {Object} HTML_PARSER definition for this instance
       
   165      */
       
   166     _getHtmlParser : function() {
       
   167         // Removed caching for kweight. This is a private method
       
   168         // and only called once so don't need to cache HTML_PARSER
       
   169         var classes = this._getClasses(),
       
   170             parser = {},
       
   171             i, p;
       
   172 
       
   173         for (i = classes.length - 1; i >= 0; i--) {
       
   174             p = classes[i].HTML_PARSER;
       
   175             if (p) {
       
   176                 Y.mix(parser, p, true);
       
   177             }
       
   178         }
       
   179         return parser;
       
   180     }
       
   181 });
       
   182 
       
   183 
       
   184 }, '3.10.3', {"requires": ["widget-base"]});