diff options
Diffstat (limited to 'stylis.js/src/Middleware.js')
-rw-r--r-- | stylis.js/src/Middleware.js | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/stylis.js/src/Middleware.js b/stylis.js/src/Middleware.js new file mode 100644 index 0000000..cec5f62 --- /dev/null +++ b/stylis.js/src/Middleware.js @@ -0,0 +1,107 @@ +import {MS, MOZ, WEBKIT, RULESET, KEYFRAMES, DECLARATION} from './Enum.js' +import {match, charat, substr, strlen, sizeof, replace, combine} from './Utility.js' +import {copy, tokenize} from './Tokenizer.js' +import {serialize} from './Serializer.js' +import {prefix} from './Prefixer.js' + +/** + * @param {function[]} collection + * @return {function} + */ +export function middleware (collection) { + var length = sizeof(collection) + + return function (element, index, children, callback) { + var output = '' + + for (var i = 0; i < length; i++) + output += collection[i](element, index, children, callback) || '' + + return output + } +} + +/** + * @param {function} callback + * @return {function} + */ +export function rulesheet (callback) { + return function (element) { + if (!element.root) + if (element = element.return) + callback(element) + } +} + +/** + * @param {object} element + * @param {number} index + * @param {object[]} children + * @param {function} callback + */ +export function prefixer (element, index, children, callback) { + if (!element.return) + switch (element.type) { + case DECLARATION: element.return = prefix(element.value, element.length) + break + case KEYFRAMES: + return serialize([copy(replace(element.value, '@', '@' + WEBKIT), element, '')], callback) + case RULESET: + if (element.length) + return combine(element.props, function (value) { + switch (match(value, /(::plac\w+|:read-\w+)/)) { + // :read-(only|write) + case ':read-only': case ':read-write': + return serialize([copy(replace(value, /:(read-\w+)/, ':' + MOZ + '$1'), element, '')], callback) + // :placeholder + case '::placeholder': + return serialize([ + copy(replace(value, /:(plac\w+)/, ':' + WEBKIT + 'input-$1'), element, ''), + copy(replace(value, /:(plac\w+)/, ':' + MOZ + '$1'), element, ''), + copy(replace(value, /:(plac\w+)/, MS + 'input-$1'), element, '') + ], callback) + } + + return '' + }) + } +} + +/** + * @param {object} element + * @param {number} index + * @param {object[]} children + */ +export function namespace (element) { + switch (element.type) { + case RULESET: + element.props = element.props.map(function (value) { + return combine(tokenize(value), function (value, index, children) { + switch (charat(value, 0)) { + // \f + case 12: + return substr(value, 1, strlen(value)) + // \0 ( + > ~ + case 0: case 40: case 43: case 62: case 126: + return value + // : + case 58: + if (children[index + 1] === 'global') + children[index + 1] = '', children[index + 2] = '\f' + substr(children[index + 2], index = 1, -1) + // \s + case 32: + return index === 1 ? '' : value + default: + switch (index) { + case 0: element = value + return sizeof(children) > 1 ? '' : value + case index = sizeof(children) - 1: case 2: + return index === 2 ? value + element + element : value + element + default: + return value + } + } + }) + }) + } +} |