src/cm/media/js/lib/yui/yui_3.0.0b1/build/dataschema/dataschema.js
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 0 40c8f766c9b8
permissions -rw-r--r--
add link to "privacy policy" in the header test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
/*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
Code licensed under the BSD License:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
http://developer.yahoo.net/yui/license.txt
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
version: 3.0.0b1
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
build: 1163
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
*/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
YUI.add('dataschema-base', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
 * The DataSchema utility provides a common configurable interface for widgets to
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
 * apply a given schema to a variety of data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
 * @module dataschema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
 * Provides the base DataSchema implementation, which can be extended to 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
 * create DataSchemas for specific data formats, such XML, JSON, text and
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
 * arrays.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
 * @module dataschema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
 * @submodule dataschema-base
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
var LANG = Y.Lang,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
 * Base class for the YUI DataSchema Utility.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
 * @class DataSchema.Base
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
 * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
    SchemaBase = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
     * Overridable method returns data as-is.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
     * @method apply
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
     * @param schema {Object} Schema to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
     * @param data {Object} Data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
     * @return {Object} Schema-parsed data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
     * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
    apply: function(schema, data) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
        return data;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
     * Applies field parser, if defined
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
     * @method parse
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
     * @param value {Object} Original value.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
     * @param field {Object} Field.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
     * @return {Object} Type-converted value.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
    parse: function(value, field) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
        if(field.parser) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
            var parser = (LANG.isFunction(field.parser)) ?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
            field.parser : Y.Parsers[field.parser+''];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
            if(parser) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
                value = parser.call(this, value);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
            else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
        return value;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
Y.namespace("DataSchema").Base = SchemaBase;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
Y.namespace("Parsers");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
}, '3.0.0b1' ,{requires:['base']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
YUI.add('dataschema-json', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
 * Provides a DataSchema implementation which can be used to work with JSON data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
 * @module dataschema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
 * @submodule dataschema-json
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
 * JSON subclass for the DataSchema Utility.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
 * @class DataSchema.JSON
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
 * @extends DataSchema.Base
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
 * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
var LANG = Y.Lang,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    92
    SchemaJSON = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
        // DataSchema.JSON static methods
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
         * Utility function converts JSON locator strings into walkable paths
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
         * @method DataSchema.JSON.getPath
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
         * @param locator {String} JSON value locator.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
         * @return {String[]} Walkable path to data value.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   106
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   107
        getPath: function(locator) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
            var path = null,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
                keys = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
                i = 0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
            if (locator) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
                // Strip the ["string keys"] and [1] array indexes
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
                locator = locator.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
                    replace(/\[(['"])(.*?)\1\]/g,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
                    function (x,$1,$2) {keys[i]=$2;return '.@'+(i++);}).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
                    replace(/\[(\d+)\]/g,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
                    function (x,$1) {keys[i]=parseInt($1,10)|0;return '.@'+(i++);}).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
                    replace(/^\./,''); // remove leading dot
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
                // Validate against problematic characters.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122
                if (!/[^\w\.\$@]/.test(locator)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   123
                    path = locator.split('.');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
                    for (i=path.length-1; i >= 0; --i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
                        if (path[i].charAt(0) === '@') {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   126
                            path[i] = keys[parseInt(path[i].substr(1),10)];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   127
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   128
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
            return path;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
         * Utility function to walk a path and return the value located there.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
         * @method DataSchema.JSON.getLocationValue
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   140
         * @param path {String[]} Locator path.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   141
         * @param data {String} Data to traverse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   142
         * @return {Object} Data value at location.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   143
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   144
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
        getLocationValue: function (path, data) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   146
            var i = 0,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   147
                len = path.length;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   148
            for (;i<len;i++) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
                if(!LANG.isUndefined(data[path[i]])) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   150
                    data = data[path[i]];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   151
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   152
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   153
                    data = undefined;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   154
                    break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   155
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   156
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   157
            return data;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   158
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   159
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   160
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   161
         * Applies a given schema to given JSON data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   162
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   163
         * @method apply
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   164
         * @param schema {Object} Schema to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   165
         * @param data {Object} JSON data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   166
         * @return {Object} Schema-parsed data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   167
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   168
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   169
        apply: function(schema, data) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   170
            var data_in = data,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   171
                data_out = {results:[],meta:{}};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   172
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   173
            // Convert incoming JSON strings
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   174
            if(!LANG.isObject(data)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   175
                try {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   176
                    data_in = Y.JSON.parse(data);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   177
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   178
                catch(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   179
                    data_out.error = e;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   180
                    return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   181
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   182
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   183
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   184
            if(LANG.isObject(data_in) && schema) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   185
                // Parse results data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   186
                if(!LANG.isUndefined(schema.resultListLocator)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   187
                    data_out = SchemaJSON._parseResults(schema, data_in, data_out);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   188
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   189
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   190
                // Parse meta data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   191
                if(!LANG.isUndefined(schema.metaFields)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   192
                    data_out = SchemaJSON._parseMeta(schema.metaFields, data_in, data_out);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   193
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   194
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   195
            else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   196
                data_out.error = new Error("JSON schema parse failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   197
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   198
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   199
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   200
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   201
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   202
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   203
         * Schema-parsed list of results from full data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   204
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   205
         * @method _parseResults
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   206
         * @param schema {Object} Schema to parse against.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   207
         * @param json_in {Object} JSON to parse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   208
         * @param data_out {Object} In-progress parsed data to update.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   209
         * @return {Object} Parsed data object.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   210
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   211
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   212
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   213
        _parseResults: function(schema, json_in, data_out) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   214
            var results = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   215
                path,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   216
                error;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   217
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   218
            if(schema.resultListLocator) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   219
                path = SchemaJSON.getPath(schema.resultListLocator);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   220
                if(path) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   221
                    results = SchemaJSON.getLocationValue(path, json_in);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   222
                    if (results === undefined) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   223
                        data_out.results = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   224
                        error = new Error("JSON results retrieval failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   225
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   226
                    else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   227
                        if(LANG.isArray(schema.resultFields) && LANG.isArray(results)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   228
                            data_out = SchemaJSON._getFieldValues(schema.resultFields, results, data_out);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   229
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   230
                        else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   231
                            data_out.results = [];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   232
                            error = new Error("JSON Schema fields retrieval failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   233
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   234
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   235
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   236
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   237
                    error = new Error("JSON Schema results locator failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   238
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   239
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   240
                if (error) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   241
                    data_out.error = error;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   242
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   243
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   244
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   245
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   246
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   247
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   248
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   249
         * Get field data values out of list of full results
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   250
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   251
         * @method _getFieldValues
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   252
         * @param fields {Array} Fields to find.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   253
         * @param array_in {Array} Results to parse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   254
         * @param data_out {Object} In-progress parsed data to update.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   255
         * @return {Object} Parsed data object.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   256
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   257
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   258
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   259
        _getFieldValues: function(fields, array_in, data_out) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   260
            var results = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   261
                len = fields.length,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   262
                i, j,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   263
                field, key, path, parser,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   264
                simplePaths = [], complexPaths = [], fieldParsers = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   265
                result, record;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   266
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   267
            // First collect hashes of simple paths, complex paths, and parsers
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   268
            for (i=0; i<len; i++) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   269
                field = fields[i]; // A field can be a simple string or a hash
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   270
                key = field.key || field; // Find the key
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   271
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   272
                // Validate and store locators for later
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   273
                path = SchemaJSON.getPath(key);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   274
                if (path) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   275
                    if (path.length === 1) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   276
                        simplePaths[simplePaths.length] = {key:key, path:path[0]};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   277
                    } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   278
                        complexPaths[complexPaths.length] = {key:key, path:path};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   279
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   280
                } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   281
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   282
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   283
                // Validate and store parsers for later
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   284
                //TODO: use Y.DataSchema.parse?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   285
                parser = (LANG.isFunction(field.parser)) ? field.parser : Y.Parsers[field.parser+''];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   286
                if (parser) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   287
                    fieldParsers[fieldParsers.length] = {key:key, parser:parser};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   288
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   289
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   290
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   291
            // Traverse list of array_in, creating records of simple fields,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   292
            // complex fields, and applying parsers as necessary
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   293
            for (i=array_in.length-1; i>=0; --i) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   294
                record = {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   295
                result = array_in[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   296
                if(result) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   297
                    // Cycle through simpleLocators
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   298
                    for (j=simplePaths.length-1; j>=0; --j) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   299
                        // Bug 1777850: The result might be an array instead of object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   300
                        record[simplePaths[j].key] = Y.DataSchema.Base.parse(
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   301
                                (LANG.isUndefined(result[simplePaths[j].path]) ?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   302
                                result[j] : result[simplePaths[j].path]), simplePaths[j]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   303
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   304
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   305
                    // Cycle through complexLocators
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   306
                    for (j=complexPaths.length - 1; j>=0; --j) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   307
                        record[complexPaths[j].key] = Y.DataSchema.Base.parse(
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   308
                            (SchemaJSON.getLocationValue(complexPaths[j].path, result)), complexPaths[j] );
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   309
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   310
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   311
                    // Cycle through fieldParsers
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   312
                    for (j=fieldParsers.length-1; j>=0; --j) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   313
                        key = fieldParsers[j].key;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   314
                        record[key] = fieldParsers[j].parser(record[key]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   315
                        // Safety net
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   316
                        if (LANG.isUndefined(record[key])) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   317
                            record[key] = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   318
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   319
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   320
                    results[i] = record;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   321
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   322
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   323
            data_out.results = results;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   324
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   325
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   326
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   327
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   328
         * Parses results data according to schema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   329
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   330
         * @method _parseMeta
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   331
         * @param metaFields {Object} Metafields definitions.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   332
         * @param json_in {Object} JSON to parse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   333
         * @param data_out {Object} In-progress parsed data to update.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   334
         * @return {Object} Schema-parsed meta data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   335
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   336
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   337
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   338
        _parseMeta: function(metaFields, json_in, data_out) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   339
            if(LANG.isObject(metaFields)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   340
                var key, path;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   341
                for(key in metaFields) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   342
                    if (metaFields.hasOwnProperty(key)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   343
                        path = SchemaJSON.getPath(metaFields[key]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   344
                        if (path && json_in) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   345
                            data_out.meta[key] = SchemaJSON.getLocationValue(path, json_in);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   346
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   347
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   348
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   349
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   350
            else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   351
                data_out.error = new Error("JSON meta data retrieval failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   352
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   353
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   354
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   355
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   356
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   357
Y.DataSchema.JSON = Y.mix(SchemaJSON, Y.DataSchema.Base);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   358
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   359
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   360
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   361
}, '3.0.0b1' ,{requires:['json', 'dataschema-base']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   362
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   363
YUI.add('dataschema-xml', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   364
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   365
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   366
 * Provides a DataSchema implementation which can be used to work with XML data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   367
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   368
 * @module dataschema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   369
 * @submodule dataschema-xml
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   370
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   371
var LANG = Y.Lang,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   372
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   373
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   374
     * XML subclass for the DataSchema Utility.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   375
     * @class DataSchema.XML
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   376
     * @extends DataSchema.Base
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   377
     * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   378
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   379
    SchemaXML = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   380
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   381
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   382
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   383
        // DataSchema.XML static methods
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   384
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   385
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   386
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   387
         * Applies a given schema to given XML data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   388
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   389
         * @method apply
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   390
         * @param schema {Object} Schema to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   391
         * @param data {XMLDoc} XML document.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   392
         * @return {Object} Schema-parsed data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   393
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   394
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   395
        apply: function(schema, data) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   396
            var xmldoc = data,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   397
                data_out = {results:[],meta:{}};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   398
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   399
            if(xmldoc && xmldoc.nodeType && xmldoc.nodeType === 9 && schema) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   400
                // Parse results data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   401
                data_out = SchemaXML._parseResults(schema, xmldoc, data_out);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   402
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   403
                // Parse meta data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   404
                data_out = SchemaXML._parseMeta(schema.metaFields, xmldoc, data_out);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   405
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   406
            else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   407
                data_out.error = new Error("XML schema parse failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   408
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   409
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   410
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   411
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   412
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   413
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   414
         * Get an XPath-specified value for a given field from an XML node or document.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   415
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   416
         * @method _getLocationValue
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   417
         * @param field {String | Object} Field definition.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   418
         * @param context {Object} XML node or document to search within.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   419
         * @return {Object} Data value or null.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   420
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   421
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   422
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   423
        _getLocationValue: function(field, context) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   424
            var locator = field.locator || field.key || field,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   425
                xmldoc = context.ownerDocument || context,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   426
                result, res, value = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   427
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   428
            try {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   429
                // Standards mode
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   430
                if(!LANG.isUndefined(xmldoc.evaluate)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   431
                    result = xmldoc.evaluate(locator, context, xmldoc.createNSResolver(!context.ownerDocument ? context.documentElement : context.ownerDocument.documentElement), 0, null);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   432
                    while(res = result.iterateNext()) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   433
                        value = res.textContent;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   434
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   435
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   436
                // IE mode
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   437
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   438
                    xmldoc.setProperty("SelectionLanguage", "XPath");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   439
                    result = context.selectNodes(locator)[0];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   440
                    value = result.value || result.text || null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   441
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   442
                return Y.DataSchema.Base.parse(value, field);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   443
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   444
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   445
            catch(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   446
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   447
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   448
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   449
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   450
         * Parses results data according to schema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   451
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   452
         * @method _parseMeta
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   453
         * @param xmldoc_in {Object} XML document parse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   454
         * @param data_out {Object} In-progress schema-parsed data to update.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   455
         * @return {Object} Schema-parsed data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   456
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   457
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   458
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   459
        _parseMeta: function(metaFields, xmldoc_in, data_out) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   460
            if(LANG.isObject(metaFields)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   461
                var key,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   462
                    xmldoc = xmldoc_in.ownerDocument || xmldoc_in;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   463
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   464
                for(key in metaFields) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   465
                    if (metaFields.hasOwnProperty(key)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   466
                        data_out.meta[key] = SchemaXML._getLocationValue(metaFields[key], xmldoc);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   467
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   468
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   469
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   470
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   471
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   472
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   473
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   474
         * Schema-parsed list of results from full data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   475
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   476
         * @method _parseResults
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   477
         * @param schema {Object} Schema to parse against.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   478
         * @param xmldoc_in {Object} XML document parse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   479
         * @param data_out {Object} In-progress schema-parsed data to update.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   480
         * @return {Object} Schema-parsed data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   481
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   482
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   483
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   484
        _parseResults: function(schema, xmldoc_in, data_out) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   485
            if(schema.resultListLocator && LANG.isArray(schema.resultFields)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   486
                var nodeList = xmldoc_in.getElementsByTagName(schema.resultListLocator),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   487
                    fields = schema.resultFields,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   488
                    results = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   489
                    node, field, result, i, j;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   490
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   491
                if(nodeList.length) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   492
                    // Loop through each result node
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   493
                    for(i=nodeList.length-1; i>= 0; i--) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   494
                        result = {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   495
                        node = nodeList[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   496
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   497
                        // Find each field value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   498
                        for(j=fields.length-1; j>= 0; j--) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   499
                            field = fields[j];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   500
                            result[field.key || field] = SchemaXML._getLocationValue(field, node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   501
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   502
                        results[i] = result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   503
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   504
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   505
                    data_out.results = results;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   506
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   507
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   508
                    data_out.error = new Error("XML schema result nodes retrieval failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   509
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   510
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   511
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   512
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   513
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   514
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   515
Y.DataSchema.XML = Y.mix(SchemaXML, Y.DataSchema.Base);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   516
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   517
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   518
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   519
}, '3.0.0b1' ,{requires:['dataschema-base']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   520
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   521
YUI.add('dataschema-array', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   522
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   523
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   524
 * Provides a DataSchema implementation which can be used to work with data stored in arrays.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   525
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   526
 * @module dataschema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   527
 * @submodule dataschema-array
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   528
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   529
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   530
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   531
 * Array subclass for the DataSchema Utility.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   532
 * @class DataSchema.Array
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   533
 * @extends DataSchema.Base
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   534
 * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   535
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   536
var LANG = Y.Lang,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   537
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   538
    SchemaArray = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   539
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   540
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   541
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   542
        // DataSchema.Array static methods
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   543
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   544
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   545
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   546
         * Applies a given schema to given Array data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   547
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   548
         * @method apply
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   549
         * @param schema {Object} Schema to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   550
         * @param data {Object} Array data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   551
         * @return {Object} Schema-parsed data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   552
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   553
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   554
        apply: function(schema, data) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   555
            var data_in = data,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   556
                data_out = {results:[],meta:{}};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   557
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   558
            if(LANG.isArray(data_in)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   559
                if(LANG.isArray(schema.resultFields)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   560
                    // Parse results data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   561
                    data_out = SchemaArray._parseResults(schema.resultFields, data_in, data_out);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   562
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   563
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   564
                    data_out.results = data_in;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   565
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   566
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   567
            else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   568
                data_out.error = new Error("Array schema parse failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   569
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   570
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   571
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   572
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   573
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   574
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   575
         * Schema-parsed list of results from full data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   576
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   577
         * @method _parseResults
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   578
         * @param fields {Array} Schema to parse against.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   579
         * @param array_in {Array} Array to parse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   580
         * @param data_out {Object} In-progress parsed data to update.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   581
         * @return {Object} Parsed data object.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   582
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   583
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   584
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   585
        _parseResults: function(fields, array_in, data_out) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   586
            var results = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   587
                result, item, type, field, key, value, i, j;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   588
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   589
            for(i=array_in.length-1; i>-1; i--) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   590
                result = {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   591
                item = array_in[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   592
                type = (LANG.isObject(item) && !LANG.isFunction(item)) ? 2 : (LANG.isArray(item)) ? 1 : (LANG.isString(item)) ? 0 : -1;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   593
                if(type > 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   594
                    for(j=fields.length-1; j>-1; j--) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   595
                        field = fields[j];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   596
                        key = (!LANG.isUndefined(field.key)) ? field.key : field;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   597
                        value = (!LANG.isUndefined(item[key])) ? item[key] : item[j];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   598
                        result[key] = Y.DataSchema.Base.parse(value, field);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   599
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   600
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   601
                else if(type === 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   602
                    result = item;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   603
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   604
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   605
                    //TODO: null or {}?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   606
                    result = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   607
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   608
                results[i] = result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   609
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   610
            data_out.results = results;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   611
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   612
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   613
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   614
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   615
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   616
Y.DataSchema.Array = Y.mix(SchemaArray, Y.DataSchema.Base);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   617
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   618
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   619
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   620
}, '3.0.0b1' ,{requires:['dataschema-base']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   621
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   622
YUI.add('dataschema-text', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   623
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   624
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   625
 * Provides a DataSchema implementation which can be used to work with delimited text data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   626
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   627
 * @module dataschema
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   628
 * @submodule dataschema-text
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   629
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   630
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   631
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   632
 * Text subclass for the DataSchema Utility.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   633
 * @class DataSchema.Text
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   634
 * @extends DataSchema.Base
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   635
 * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   636
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   637
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   638
var LANG = Y.Lang,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   639
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   640
    SchemaText = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   641
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   642
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   643
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   644
        // DataSchema.Text static methods
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   645
        //
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   646
        /////////////////////////////////////////////////////////////////////////////
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   647
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   648
         * Applies a given schema to given delimited text data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   649
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   650
         * @method apply
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   651
         * @param schema {Object} Schema to apply.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   652
         * @param data {Object} Text data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   653
         * @return {Object} Schema-parsed data.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   654
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   655
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   656
        apply: function(schema, data) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   657
            var data_in = data,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   658
                data_out = {results:[],meta:{}};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   659
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   660
            if(LANG.isString(data_in) && LANG.isString(schema.resultDelimiter)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   661
                // Parse results data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   662
                data_out = SchemaText._parseResults(schema, data_in, data_out);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   663
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   664
            else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   665
                data_out.error = new Error("Text schema parse failure");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   666
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   667
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   668
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   669
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   670
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   671
        /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   672
         * Schema-parsed list of results from full data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   673
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   674
         * @method _parseResults
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   675
         * @param schema {Array} Schema to parse against.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   676
         * @param text_in {String} Text to parse.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   677
         * @param data_out {Object} In-progress parsed data to update.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   678
         * @return {Object} Parsed data object.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   679
         * @static
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   680
         * @protected
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   681
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   682
        _parseResults: function(schema, text_in, data_out) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   683
            var resultDelim = schema.resultDelimiter,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   684
                results = [],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   685
                results_in, fields_in, result, item, fields, field, key, value, i, j,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   686
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   687
            // Delete final delimiter at end of string if there
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   688
            tmpLength = text_in.length-resultDelim.length;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   689
            if(text_in.substr(tmpLength) == resultDelim) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   690
                text_in = text_in.substr(0, tmpLength);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   691
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   692
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   693
            // Split into results
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   694
            results_in = text_in.split(schema.resultDelimiter);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   695
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   696
            for(i=results_in.length-1; i>-1; i--) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   697
                result = {};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   698
                item = results_in[i];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   699
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   700
                if(LANG.isString(schema.fieldDelimiter)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   701
                    fields_in = item.split(schema.fieldDelimiter);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   702
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   703
                    if(LANG.isArray(schema.resultFields)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   704
                        fields = schema.resultFields;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   705
                        for(j=fields.length-1; j>-1; j--) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   706
                            field = fields[j];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   707
                            key = (!LANG.isUndefined(field.key)) ? field.key : field;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   708
                            value = (!LANG.isUndefined(fields_in[key])) ? fields_in[key] : fields_in[j];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   709
                            result[key] = Y.DataSchema.Base.parse(value, field);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   710
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   711
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   712
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   713
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   714
                else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   715
                    result = item;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   716
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   717
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   718
                results[i] = result;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   719
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   720
            data_out.results = results;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   721
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   722
            return data_out;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   723
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   724
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   725
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   726
Y.DataSchema.Text = Y.mix(SchemaText, Y.DataSchema.Base);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   727
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   728
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   729
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   730
}, '3.0.0b1' ,{requires:['dataschema-base']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   731
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   732
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   733
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   734
YUI.add('dataschema', function(Y){}, '3.0.0b1' ,{use:['dataschema-base','dataschema-json','dataschema-xml','dataschema-array','dataschema-text']});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   735