123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- 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;
|