2014-01-03 13:32:13 -05:00
|
|
|
module.exports.clone = (obj) ->
|
|
|
|
return obj if obj is null or typeof (obj) isnt "object"
|
|
|
|
temp = obj.constructor()
|
|
|
|
for key of obj
|
|
|
|
temp[key] = module.exports.clone(obj[key])
|
|
|
|
temp
|
|
|
|
|
|
|
|
module.exports.combineAncestralObject = (obj, propertyName) ->
|
|
|
|
combined = {}
|
|
|
|
while obj?[propertyName]
|
|
|
|
for key, value of obj[propertyName]
|
|
|
|
continue if combined[key]
|
|
|
|
combined[key] = value
|
|
|
|
if obj.__proto__
|
|
|
|
obj = obj.__proto__
|
|
|
|
else
|
|
|
|
# IE has no __proto__. TODO: does this even work? At most it doesn't crash.
|
|
|
|
obj = Object.getPrototypeOf(obj)
|
|
|
|
combined
|
|
|
|
|
|
|
|
module.exports.normalizeFunc = (func_thing, object) ->
|
|
|
|
# func could be a string to a function in this class
|
|
|
|
# or a function in its own right
|
|
|
|
object ?= {}
|
|
|
|
if _.isString(func_thing)
|
|
|
|
func = object[func_thing]
|
|
|
|
if not func
|
|
|
|
console.error("Could not find method", func_thing, 'in object', @)
|
|
|
|
return => null # always return a func, or Mediator will go boom
|
|
|
|
func_thing = func
|
2014-03-13 11:39:53 -04:00
|
|
|
return func_thing
|
|
|
|
|
2014-01-10 19:48:28 -05:00
|
|
|
module.exports.hexToHSL = (hex) ->
|
|
|
|
rgbToHsl(hexToR(hex), hexToG(hex), hexToB(hex))
|
|
|
|
|
|
|
|
hexToR = (h) -> parseInt (cutHex(h)).substring(0, 2), 16
|
|
|
|
hexToG = (h) -> parseInt (cutHex(h)).substring(2, 4), 16
|
|
|
|
hexToB = (h) -> parseInt (cutHex(h)).substring(4, 6), 16
|
|
|
|
cutHex = (h) -> (if (h.charAt(0) is "#") then h.substring(1, 7) else h)
|
2014-03-13 11:39:53 -04:00
|
|
|
|
2014-01-10 19:48:28 -05:00
|
|
|
module.exports.hslToHex = (hsl) ->
|
|
|
|
'#' + (toHex(n) for n in hslToRgb(hsl...)).join('')
|
2014-03-13 11:39:53 -04:00
|
|
|
|
2014-01-10 19:48:28 -05:00
|
|
|
toHex = (n) ->
|
|
|
|
h = Math.floor(n).toString(16)
|
|
|
|
h = '0'+h if h.length is 1
|
2014-03-12 15:30:43 -04:00
|
|
|
h
|
|
|
|
|
2014-03-12 17:48:27 -04:00
|
|
|
module.exports.i18n = (say, target, language=me.lang(), fallback='en') ->
|
2014-03-12 15:30:43 -04:00
|
|
|
generalResult = null
|
|
|
|
fallbackResult = null
|
|
|
|
fallforwardResult = null # If a general language isn't available, the first specific one will do
|
|
|
|
matches = (/\w+/gi).exec(language)
|
|
|
|
generalName = matches[0] if matches
|
|
|
|
|
2014-03-12 19:47:08 -04:00
|
|
|
for localeName, locale of say.i18n
|
|
|
|
if target of locale
|
|
|
|
result = locale[target]
|
2014-03-12 15:30:43 -04:00
|
|
|
else continue
|
2014-03-12 19:47:08 -04:00
|
|
|
return result if localeName == language
|
|
|
|
generalResult = result if localeName == generalName
|
|
|
|
fallbackResult = result if localeName == fallback
|
|
|
|
fallforwardResult = result if localeName.indexOf(language) == 0 and not fallforwardResult?
|
2014-03-12 15:30:43 -04:00
|
|
|
|
|
|
|
return generalResult if generalResult?
|
|
|
|
return fallforwardResult if fallforwardResult?
|
2014-03-12 19:47:08 -04:00
|
|
|
return fallbackResult if fallbackResult?
|
2014-03-12 20:07:36 -04:00
|
|
|
return say[target] if target of say
|
2014-03-13 11:39:53 -04:00
|
|
|
null
|