summaryrefslogtreecommitdiff
path: root/stylis.js/src/Middleware.js
diff options
context:
space:
mode:
Diffstat (limited to 'stylis.js/src/Middleware.js')
-rw-r--r--stylis.js/src/Middleware.js107
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
+ }
+ }
+ })
+ })
+ }
+}