/**
* * ==== DO NOT EDIT THIS FILE ==== * * ==== API Major Details ==== * * 1. Each 'named' ('rule' function input parameter) will exposes a composite function to * add (or modify) properties of a particular instance of a stylesheet rule within the <style> element. * * 2. attached to each composite rule, are the members *.as.*=[class(),id(),native()]; * where class() prepends '.', id() prepends '#', and native prepends '' to the rule name. * * 3. Toggle rules on elements by calling '.toggle(element,t|f)'; where t|f forces removal of a rule; * implicitly rules use 'as.class()' and so elements are required to be toggled to view the effect. * * 4. The final REQUIRED STEP for a rule to be implemented is a call to the composite rule function 'promote()' * so that the TextNodes representing the rule components are added as children appropriately into the <style> parent. * */ define(function() { var stylesheet = function() { var style = document.createElement('style'); var reset = function() { document.head.appendChild(style); }; reset(); var proxy = function(title, element, clean) { if (clean) { if (element.className.indexOf(title) > 0) { element.className = element.className.replace(' ' + title, ''); return; } if (element.className.indexOf(' ')>0) { element.className = element.className.replace(title + ' ', ''); return; } element.className = element.className.replace(title + '', ''); return; } if (element.className.indexOf(title) > -1) { return; } if (element.className.length) { element.className += ' '; } element.className += title; }; var selectors = [[], []]; var create = function(local) { var key = selectors[0].indexOf(local); if (key < 0) { var name = local, type = '.', properties = [[], []]; var product = null; var promote = function() { var backup = promote; promote = function() { promote = backup; style.removeChild(product); promote(); }; product = document.createTextNode(type + name + '{' + properties[1].join('') + '}'); style.appendChild(product); }; var pattern = function(name, value) { var key = properties[0].indexOf(name); if (key < 0) { properties[0].unshift(name), properties[1].unshift(name + ':' + value + ';'); key = 0; } if (value) { properties[1][key] = name + ':' + value + ';'; } return function(name, value) { return pattern(name, value); }; }; pattern.promote = function() { promote(); }; pattern.as = { class: function() { type = '.'; }, id: function() { type = '#'; }, native: function() { type = ''; } }; pattern.toggle = function(element, clean) { proxy(name, element, clean); }; selectors[0].unshift(name), selectors[1].unshift(pattern), key = 0; } return selectors[1][key]; }; return function(rule) { return create(rule); }; }; var create = stylesheet(); return create; });
Comments