toloframework
Version:
Javascript/HTML/CSS compiler for Firefox OS or nodewebkit apps using modules in the nodejs style.
174 lines (149 loc) • 3.83 kB
JavaScript
"use strict";
var $ = require("$");
var List = require("tfw.binding.list");
var Color = require("tfw.color");
var CONVERTERS = {
boolean: booleanConverter,
booleans: booleansConverter,
color: colorConverter,
multilang: multilangConverter,
intl: intlConverter,
not: notConverter,
strings: stringsConverter,
string: function(v) { return "" + v; },
integer: function( valueForNaN ) {
if( typeof valueForNaN === 'number' ) {
return function(v) {
var n = parseInt(v);
if( isNaN( n ) ) return valueForNaN;
return n;
};
} else {
return parseInt;
}
},
float: function( valueForNaN ) {
if( typeof valueForNaN === 'number' ) {
return function(v) {
var n = parseFloat(v);
if( isNaN( n ) ) return valueForNaN;
return n;
};
} else {
return parseFloat;
}
},
enum: function( list ) {
var caseInsensitiveList = list.map(function(x) { return x.toLowerCase(); });
return function(v) {
var idx = Math.max( 0, caseInsensitiveList.indexOf( ("" + v).toLowerCase() ) );
return list[idx];
};
},
array: arrayConverter,
list: listConverter,
unit: cssUnitConverter,
units: cssUnitsConverter,
length: lengthConverter,
isEmpty: isEmptyConverter,
isNotEmpty: isEmptyConverter
};
exports.get = function( converterName ) {
return CONVERTERS[converterName];
};
exports.set = function( converterName, converter ) {
if( typeof converter === 'function' ) {
CONVERTERS[converterName] = converter;
} else {
delete CONVERTERS[converterName];
}
};
var RX_CSS_UNIT = /^(-?[.0-9]+)[ \n\r]*([a-z%]*)/;
function cssUnitConverter(v) {
if( typeof v === 'number' ) return v + "px";
v = ("" + v).trim().toLowerCase();
if( v === 'auto' || v === 'inherit' ) return v;
var m = RX_CSS_UNIT.exec( v );
if( !m ) return "0";
var scalar = parseFloat( m[1] );
if( isNaN( scalar ) ) return "0";
var unit = m[2];
if( unit.length < 1 ) unit = "px";
return scalar + unit;
}
function cssUnitsConverter(v) {
if( !Array.isArray( v ) ) return [];
return v.map(cssUnitConverter);
}
function booleanConverter(v) {
switch( typeof v ) {
case 'string':
return v.trim().toLowerCase() === 'true';
case 'number':
return v !== 0;
default:
return v ? true : false;
}
}
function booleansConverter(v) {
if( !Array.isArray( v ) ) return [];
return v.map(booleanConverter);
}
function colorConverter(v) {
if( typeof v !== 'string' ) return '#000';
if( !Color.instance.parse( v ) ) return '#000';
return Color.instance.stringify();
}
function notConverter(v) { return !booleanConverter( v ); }
function arrayConverter(v) {
if( List.isList( v ) ) return v.slice();
return Array.isArray( v ) ? v : [v];
}
function lengthConverter(v) {
if( !v ) return 0;
if( typeof v.length === 'number' ) {
return v.length;
}
return 0;
}
function isEmptyConverter(v) {
if( !v ) return true;
if( typeof v === 'string' ) {
return v.trim().length === 0;
}
if( typeof v.length === 'number' ) {
return v.length === 0;
}
return false;
}
function isNotEmptyConverter(v) {
return !isEmptyConverter(v);
}
function stringsConverter(v) {
if( !Array.isArray( v ) ) return [];
return v.map(function(v) { return "" + v; });
}
function multilangConverter(v) {
if( !Array.isArray( v ) && typeof v !== 'object' ) {
var def = {};
def[$.lang()] = "" + v;
return def;
}
return v;
}
function intlConverter(v) {
if( typeof v === 'string' ) return v;
if( !v ) return "";
var result = v[$.lang()];
if( !result ) {
for( var lang in v ) {
result = v[lang];
break;
}
}
return result;
}
function listConverter( v ) {
if( List.isList( v ) ) return v;
return new List( arrayConverter( v ) );
}