nnnjjj123
2020-11-17 1b2c1edb61190eeb19f465ff031eaa3b2a1b8dbc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
define([
    'dojo/_base/lang'
], function (lang) {
    // A basic check to ensure a property name is valid. Will incorrectly flag some valid names,
    // which is fine - they'll just get unnecessarily wrapped in quotes
    var propertyNameRegex = /^[A-Za-z]+[A-Za-z0-9_]*$/;
 
    // Check for dijit form widgets for editor property
    var dijitFormWidgetRegex = /dijit\/form\/([A-Za-z]*)$/;
 
    function tab(count) {
        var tabString = '';
 
        while (count--) {
            tabString += '\t';
        }
 
        return tabString;
    }
 
    /**
     * @param {Object|Array} obj: object to convert to JavaScript
     * @param {Object} options: option bag object
     * @param {number} options.indent: (integer) indentation level of output code
     * @param {boolean} options.includeEmpty: if true, empty properties ('', null, undefined) will be included in output
     * @param {boolean} options.inline: if true, print just properties, not wrapping braces
     */
    function toJavaScript(obj, options) {
        options = options || {};
 
        var javascript = '';
        var indent = options.indent || 0;
 
        // TODO: does not handle some things, e.g. null, undefined
 
        if (typeof obj === 'string') {
            return escapeString(obj);
        }
 
        if (typeof obj !== 'object') {
            return obj;
        }
 
        if (!options.inline) {
            if (obj instanceof Array) {
                javascript = '[';
            }
            else {
                javascript = '{';
            }
 
            javascript += '\n';
        }
 
        indent++;
        if (obj instanceof Array) {
            javascript += printArray(obj, lang.delegate(options, { inline: false }), indent);
        }
        else {
            javascript += printObject(obj, lang.delegate(options, { inline: false }), indent);
        }
        indent--;
 
        if (!options.inline) {
            javascript += '\n' + tab(indent);
 
            if (obj instanceof Array) {
                javascript += ']';
            }
            else {
                javascript += '}';
            }
        }
 
        return javascript;
    }
 
    function printObject(obj, options, indent) {
        var javascript = '';
        var property;
        var firstProperty = true;
 
        for (property in obj) {
            // TODO: filtering with hasOwnProperty may not be necessary (or desirable?)
            if (obj.hasOwnProperty(property)) {
                if ((options.includeEmpty ||
                    (obj[property] !== '' && obj[property] !== null && obj[property] !== undefined))) {
                    if (firstProperty) {
                        firstProperty = false;
                    }
                    else {
                        javascript += ',\n';
                    }
 
                    javascript += tab(indent) + formatPropertyName(property) + ': ';
 
                    switch (typeof obj[property]) {
                        // Array, Object
                        case 'object':
                            javascript += toJavaScript(obj[property], lang.delegate(options, { indent: indent }));
 
                            break;
 
                        case 'string':
                            // Coerce string values that should be boolean
                            if (obj[property] === 'true' || obj[property] === 'false') {
                                javascript += obj[property];
                            }
                            else {
                                // Widget editors are received by module ID, so convert any of those to constructors
                                javascript += (property === 'editor' && formatDijitFormWidget(obj[property])) ||
                                    '\'' + escapeString(obj[property]) + '\'';
                            }
 
                            break;
 
                        // number, boolean
                        default:
                            javascript += obj[property];
                    }
                }
            }
        }
 
        return javascript;
    }
 
    function printArray(array, options, indent) {
        var javascript = '';
        var i;
 
        for (i = 0; i < array.length; i++) {
            javascript += tab(indent);
            javascript += toJavaScript(array[i], lang.delegate(options, { indent: indent }));
 
            if (i < array.length - 1) {
                javascript += ',\n';
            }
        }
 
        return javascript;
    }
 
    function escapeString(str) {
        return str.replace(/[\\']/g, '\\$&');
    }
 
    function formatDijitFormWidget(str) {
        return typeof str === 'string' && dijitFormWidgetRegex.test(str) ?
            str.replace(dijitFormWidgetRegex, '$1') :
            '';
    }
 
    function formatPropertyName(str) {
        if (!propertyNameRegex.test(str)) {
            return '\'' + str + '\'';
        }
        else {
            return str;
        }
    }
 
    toJavaScript.escapeString = escapeString;
    toJavaScript.formatDijitFormWidget = formatDijitFormWidget;
    toJavaScript.formatPropertyName = formatPropertyName;
 
    return toJavaScript;
});