module Archetype::SassExtensions::UI::Glyphs
#
# given a set of grid sizes and an individual size, return the closest matching size
#
# *Parameters*:
# - $grids {List} the list of grid options
# - $size {Number} the size to find a match for
# *Returns*:
# - {Number} the closest matching grid size
#
def choose_best_glyph_grid(grids, size)
return grids if grids == null
grids = grids.to_a
# perfect match?
if grids.include?(size)
return size
end
# otherwise let's find the best match
# start with assuming the first item is the best
best = {
:grid => grids.first,
:distance => (+1.0/0.0) # similuate Float::INFINITY, but for Ruby 1.8
}
# for each grid option...
grids.each do |grid|
# if the units are comparable...
if unit(grid) == unit(size)
tmp_grid = strip_units(grid).value.to_f
tmp_size = strip_units(size).value.to_f
# simple algorithm to compute the distance between the size and grid
# choose the lesser of the (mod) or (grid - mod)
# then divide it by grid^(number_of_grid_choices)
mod = (tmp_size % tmp_grid)
distance = [mod, tmp_grid - mod].min / tmp_grid**(grids.length)
# if it's closer (smaller distance), use it...
if distance < best[:distance]
best = {
:grid => grid,
:distance => distance
}
end
end
end
# return the best match we found
return best[:grid]
end
Sass::Script::Functions.declare :choose_best_glyph_grid, [:grids, :size]
#
# checks if a string looks like it's just a composition of character codes
#
# *Parameters*:
# - $string {String} the string to check
# *Returns*:
# - {Boolean} whether or not the string looks like a sequence of character codes
#
def looks_like_character_code(string)
string = helpers.to_str(string, ' ', :quotes)
return bool(string =~ /^(\\([\da-fA-F]{4})\s*)+$/)
end
Sass::Script::Functions.declare :looks_like_character_code, [:string]
#
# registers a glyph library under a given key
#
def register_glyph_library(key, library)
registry = archetype_glyphs_registry
# if it's already in the registry, just return the current list
if helpers.is_null(registry[key])
registry = registry.dup
registry[key] = library
registry = Sass::Script::Value::Map.new(registry)
environment.global_env.set_var('CONFIG_GLYPHS_LIBRARIES', registry)
end
return key
end
#
# gets a glyph library as registered under the given key
#
def get_glyph_library(key)
default_key = identifier('default')
default = archetype_glyphs_registry[default_key] || null
return default if key == default_key
library = archetype_glyphs_registry[key]
# if the library doesn't exist...
if helpers.is_null(library)
# notify the user
helpers.warn("[archetype:glyph] could not find a glyph library for `#{library}`, using default")
# and return the default
return default
end
# merge the library with the default
return map_merge(default, library)
end
def get_all_glyph_libraries
return environment.var('CONFIG_GLYPHS_LIBRARIES') || Sass::Script::Value::Map.new
end
private
def archetype_glyphs_registry
registry = environment.var('CONFIG_GLYPHS_LIBRARIES')
return registry.respond_to?(:to_h) ? registry.to_h : {}
end
end