src/cm/media/js/lib/yui/yui3-3.15.0/build/dataschema-text/dataschema-text.js
author gibus
Mon, 10 Mar 2014 15:19:48 +0100
changeset 602 e16a97fb364a
permissions -rw-r--r--
Use YUI 3.15
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('dataschema-text', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
 * Provides a DataSchema implementation which can be used to work with
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
 * delimited text data.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
 * @module dataschema
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
 * @submodule dataschema-text
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
Provides a DataSchema implementation which can be used to work with
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
delimited text data.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
See the `apply` method for usage.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
@class DataSchema.Text
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
@extends DataSchema.Base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
var Lang = Y.Lang,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
    isString = Lang.isString,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
    isUndef  = Lang.isUndefined,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
    SchemaText = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
        ////////////////////////////////////////////////////////////////////////
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
        //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
        // DataSchema.Text static methods
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
        //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
        ////////////////////////////////////////////////////////////////////////
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
        Applies a schema to a string of delimited data, returning a normalized
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
        object with results in the `results` property. The `meta` property of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
        the response object is present for consistency, but is assigned an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
        empty object.  If the input data is absent or not a string, an `error`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
        property will be added.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
        Use _schema.resultDelimiter_ and _schema.fieldDelimiter_ to instruct
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
        `apply` how to split up the string into an array of data arrays for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
        processing.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
        Use _schema.resultFields_ to specify the keys in the generated result
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
        objects in `response.results`. The key:value pairs will be assigned
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
        in the order of the _schema.resultFields_ array, assuming the values
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
        in the data records are defined in the same order.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
        _schema.resultFields_ field identifiers are objects with the following
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
        properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
          * `key`   : <strong>(required)</strong> The property name you want
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
                the data value assigned to in the result object (String)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
          * `parser`: A function or the name of a function on `Y.Parsers` used
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
                to convert the input value into a normalized type.  Parser
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
                functions are passed the value as input and are expected to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
                return a value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
        If no value parsing is needed, you can use just the desired property
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
        name string as the field identifier instead of an object (see example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
        below).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
        @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
            // Process simple csv
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
            var schema = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
                    resultDelimiter: "\n",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
                    fieldDelimiter: ",",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
                    resultFields: [ 'fruit', 'color' ]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
                },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
                data = "Banana,yellow\nOrange,orange\nEggplant,purple";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
            var response = Y.DataSchema.Text.apply(schema, data);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
            // response.results[0] is { fruit: "Banana", color: "yellow" }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
            // Use parsers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
            schema.resultFields = [
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
                {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
                    key: 'fruit',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
                    parser: function (val) { return val.toUpperCase(); }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
                },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
                'color' // mix and match objects and strings
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
            ];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
            response = Y.DataSchema.Text.apply(schema, data);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
            // response.results[0] is { fruit: "BANANA", color: "yellow" }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
        @method apply
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
        @param {Object} schema Schema to apply.  Supported configuration
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
            properties are:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
          @param {String} schema.resultDelimiter Character or character
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
              sequence that marks the end of one record and the start of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
              another.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
          @param {String} [schema.fieldDelimiter] Character or character
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
              sequence that marks the end of a field and the start of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
              another within the same record.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
          @param {Array} [schema.resultFields] Field identifiers to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
              assign values in the response records. See above for details.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
        @param {String} data Text data.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
        @return {Object} An Object with properties `results` and `meta`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
        @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
        **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
        apply: function(schema, data) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
            var data_in = data,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
                data_out = { results: [], meta: {} };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
            if (isString(data) && schema && isString(schema.resultDelimiter)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
                // Parse results data
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
                data_out = SchemaText._parseResults.call(this, schema, data_in, data_out);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
                data_out.error = new Error("Text schema parse failure");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
            return data_out;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
         * Schema-parsed list of results from full data
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
         * @method _parseResults
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
         * @param schema {Array} Schema to parse against.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
         * @param text_in {String} Text to parse.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
         * @param data_out {Object} In-progress parsed data to update.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
         * @return {Object} Parsed data object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
         * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
        _parseResults: function(schema, text_in, data_out) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
            var resultDelim = schema.resultDelimiter,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
                fieldDelim  = isString(schema.fieldDelimiter) &&
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
                                schema.fieldDelimiter,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
                fields      = schema.resultFields || [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
                results     = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
                parse       = Y.DataSchema.Base.parse,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
                results_in, fields_in, result, item,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
                field, key, value, i, j;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
            // Delete final delimiter at end of string if there
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
            if (text_in.slice(-resultDelim.length) === resultDelim) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
                text_in = text_in.slice(0, -resultDelim.length);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
            // Split into results
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
            results_in = text_in.split(schema.resultDelimiter);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
            if (fieldDelim) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
                for (i = results_in.length - 1; i >= 0; --i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
                    result = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
                    item = results_in[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
                    fields_in = item.split(schema.fieldDelimiter);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
                    for (j = fields.length - 1; j >= 0; --j) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
                        field = fields[j];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
                        key = (!isUndef(field.key)) ? field.key : field;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
                        // FIXME: unless the key is an array index, this test
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
                        // for fields_in[key] is useless.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
                        value = (!isUndef(fields_in[key])) ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
                                    fields_in[key] :
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
                                    fields_in[j];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
                        result[key] = parse.call(this, value, field);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
                    results[i] = result;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
                results = results_in;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
            data_out.results = results;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
            return data_out;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
Y.DataSchema.Text = Y.mix(SchemaText, Y.DataSchema.Base);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
}, '@VERSION@', {"requires": ["dataschema-base"]});