aboutsummaryrefslogtreecommitdiff
path: root/node_modules/csso/lib/utils/translate.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/csso/lib/utils/translate.js')
-rw-r--r--node_modules/csso/lib/utils/translate.js178
1 files changed, 178 insertions, 0 deletions
diff --git a/node_modules/csso/lib/utils/translate.js b/node_modules/csso/lib/utils/translate.js
new file mode 100644
index 00000000..ae7beebe
--- /dev/null
+++ b/node_modules/csso/lib/utils/translate.js
@@ -0,0 +1,178 @@
+function each(list) {
+ if (list.head === null) {
+ return '';
+ }
+
+ if (list.head === list.tail) {
+ return translate(list.head.data);
+ }
+
+ return list.map(translate).join('');
+}
+
+function eachDelim(list, delimeter) {
+ if (list.head === null) {
+ return '';
+ }
+
+ if (list.head === list.tail) {
+ return translate(list.head.data);
+ }
+
+ return list.map(translate).join(delimeter);
+}
+
+function translate(node) {
+ switch (node.type) {
+ case 'StyleSheet':
+ return each(node.rules);
+
+ case 'Atrule':
+ var nodes = ['@', node.name];
+
+ if (node.expression && !node.expression.sequence.isEmpty()) {
+ nodes.push(' ', translate(node.expression));
+ }
+
+ if (node.block) {
+ nodes.push('{', translate(node.block), '}');
+ } else {
+ nodes.push(';');
+ }
+
+ return nodes.join('');
+
+ case 'Ruleset':
+ return translate(node.selector) + '{' + translate(node.block) + '}';
+
+ case 'Selector':
+ return eachDelim(node.selectors, ',');
+
+ case 'SimpleSelector':
+ var nodes = node.sequence.map(function(node) {
+ // add extra spaces around /deep/ combinator since comment beginning/ending may to be produced
+ if (node.type === 'Combinator' && node.name === '/deep/') {
+ return ' ' + translate(node) + ' ';
+ }
+
+ return translate(node);
+ });
+
+ return nodes.join('');
+
+ case 'Block':
+ return eachDelim(node.declarations, ';');
+
+ case 'Declaration':
+ return translate(node.property) + ':' + translate(node.value);
+
+ case 'Property':
+ return node.name;
+
+ case 'Value':
+ return node.important
+ ? each(node.sequence) + '!important'
+ : each(node.sequence);
+
+ case 'Attribute':
+ var result = translate(node.name);
+ var flagsPrefix = ' ';
+
+ if (node.operator !== null) {
+ result += node.operator;
+
+ if (node.value !== null) {
+ result += translate(node.value);
+
+ // space between string and flags is not required
+ if (node.value.type === 'String') {
+ flagsPrefix = '';
+ }
+ }
+ }
+
+ if (node.flags !== null) {
+ result += flagsPrefix + node.flags;
+ }
+
+ return '[' + result + ']';
+
+ case 'FunctionalPseudo':
+ return ':' + node.name + '(' + eachDelim(node.arguments, ',') + ')';
+
+ case 'Function':
+ return node.name + '(' + eachDelim(node.arguments, ',') + ')';
+
+ case 'Negation':
+ return ':not(' + eachDelim(node.sequence, ',') + ')';
+
+ case 'Braces':
+ return node.open + each(node.sequence) + node.close;
+
+ case 'Argument':
+ case 'AtruleExpression':
+ return each(node.sequence);
+
+ case 'Url':
+ return 'url(' + translate(node.value) + ')';
+
+ case 'Progid':
+ return translate(node.value);
+
+ case 'Combinator':
+ return node.name;
+
+ case 'Identifier':
+ return node.name;
+
+ case 'PseudoClass':
+ return ':' + node.name;
+
+ case 'PseudoElement':
+ return '::' + node.name;
+
+ case 'Class':
+ return '.' + node.name;
+
+ case 'Id':
+ return '#' + node.name;
+
+ case 'Hash':
+ return '#' + node.value;
+
+ case 'Dimension':
+ return node.value + node.unit;
+
+ case 'Nth':
+ return node.value;
+
+ case 'Number':
+ return node.value;
+
+ case 'String':
+ return node.value;
+
+ case 'Operator':
+ return node.value;
+
+ case 'Raw':
+ return node.value;
+
+ case 'Unknown':
+ return node.value;
+
+ case 'Percentage':
+ return node.value + '%';
+
+ case 'Space':
+ return ' ';
+
+ case 'Comment':
+ return '/*' + node.value + '*/';
+
+ default:
+ throw new Error('Unknown node type: ' + node.type);
+ }
+}
+
+module.exports = translate;