-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
156 lines (139 loc) · 3.75 KB
/
index.js
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
var platform = require('./lib/platform');
// check for existing lodash module
try {
var _ = require('lodash');
}
// use individual modules to reduce
// bundled filesize for titanium module
catch(e) {
var _ = {
isArray: require('lodash.isarray'),
isObject: require('lodash.isobject'),
map: require('lodash.map'),
each: require('lodash.foreach'),
every: require('lodash.every'),
merge: require('lodash.merge'),
flatten: require('lodash.flatten'),
invoke: require('lodash.invoke'),
omit: require('lodash.omit')
}
}
// [platform=ios formFactor=handheld]
var queryTypes = {
platform: (function(){
if (platform.isIOS) {
return 'ios';
} else if (platform.isAndroid) {
return 'android';
} else if (platform.isMobileWeb) {
return 'mobileweb';
}
})(),
formFactor: (function(){
if (platform.isTablet){
return 'tablet';
} else {
return 'handheld';
}
})(),
width: (function(){
return Ti.Platform.getDisplayCaps().width;
})(),
height: (function(){
return Ti.Platform.getDisplayCaps().height;
})(),
density: (function(){
return Ti.Platform.getDisplayCaps().density;
})(),
dpi: (function(){
return Ti.Platform.getDisplayCaps().dpi;
})()
}
// checks property, return true if query
function _isQuery(property) {
return _.isArray(property.match(/\[([^\]]+)]/));
}
// parses query into object
function _parseQuery(query) {
var queries = query.replace(/[\[\]']+/g,'').split(' ');
return _.map(queries, function(query) {
var queryParts = query.match(/([A-Za-z]+)(>|>=|=|<=|<+)([0-9A-Za-z]+)/);
return {
type: queryParts[1],
comparator: queryParts[2],
value: queryParts[3],
active: false
}
});
}
function _dimensionQueryMaybeActive(query) {
var dim = queryTypes[query.type];
var comp = query.comparator;
var val = parseFloat(query.value);
if (comp === '=' && dim === val) {
return true;
} else if (comp === '>' && dim > val) {
return true;
} else if (comp === '>=' && dim >= val) {
return true;
} else if (comp === '<' && dim < val) {
return true;
} else if (comp === '<=' && dim <= val) {
return true;
} else {
return false;
}
}
// returns true if query is active
function _queryActive(query) {
var queries = _parseQuery(query);
var dimensionQueryTypes = ['width', 'height', 'dpi', 'density'];
return _.every(_.each(queries, function(query) {
if (query.type === 'formFactor' && query.value === queryTypes.formFactor) {
query.active = true;
} else if (query.type === 'platform' && query.value === queryTypes.platform){
query.active = true;
} else if (dimensionQueryTypes.indexOf(query.type) > -1) {
query.active = _dimensionQueryMaybeActive(query);
}
}), 'active');
}
function _processQueries(styles) {
// look for queries
_.each(styles, function(value, property) {
// if property is query
if (_isQuery(property)){
// query active, join styles
if (_queryActive(property)){
styles = _.merge(styles, styles[property]);
}
// remove query after joining
styles = _.omit(styles, property);
}
});
return styles;
}
function _mergeStyles(styles) {
// custom merge function
var merger = function (a, b) {
if (_.isObject(a)) {
return _.merge({}, a, b, merger);
} else {
return a || b;
}
};
// process array of styles and merge
var args = _.flatten([{}, styles, merger]);
return _.merge.apply(_, args);
}
function processStyles(styles) {
if (_.isArray(styles)) {
styles = _mergeStyles(_.invoke(styles, function(){
return _processQueries(this);
}));
} else {
styles = _processQueries(styles);
}
return styles;
}
module.exports = processStyles;