ruleProperty method

List<Node> ruleProperty ()

Search for something like:

color: or  border: or background-color:
transform+: or *zoom: or @(prefix)width:

Implementation

List<Node> ruleProperty() {
  final List<int> index = <int>[];
  final List<String> name = <String>[];
  final List<Node> result = <Node>[]; //in js is name
  String s;

  parserInput.save();

  final String simpleProperty = parserInput.$re(_rulePropertyRegExp1);
  if (simpleProperty != null) {
    result.add(Keyword(simpleProperty));
    parserInput.forget();
    return result;
  }

  bool match(RegExp re) {
    final int i = parserInput.i;
    final String chunk = parserInput.$re(re);

    if (chunk != null) {
      index.add(i);
      name.add(chunk);
      return true;
    }
    return false;
  }

  match(_rulePropertyRegExp2);
  while (true) {
    if (!match(_rulePropertyRegExp3)) break;
  }

  if (name.length > 1 && match(_rulePropertyRegExp4)) {
    parserInput.forget();

    // at last, we have the complete match now. move forward,
    // convert name particles to tree objects and return:
    if (name[0] == '') {
      name.removeAt(0);
      index.removeAt(0);
    }

    for (int k = 0; k < name.length; k++) {
      s = name[k];
      result.add((!s.startsWith('@') && !s.startsWith(r'$'))
          ? Keyword(s)
          : (s.startsWith('@'))
              ? Variable(
                  '@${s.substring(2, s.length - 1)}', index[k], fileInfo)
              : Property(
                  '\$${s.substring(2, s.length - 1)}', index[k], fileInfo));
    }
    return result;
  }
  parserInput.restore();
  return null;

//3.0.0 20160718
// ruleProperty: function () {
//     var name = [], index = [], s, k;
//
//     parserInput.save();
//
//     var simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\s*:/);
//     if (simpleProperty) {
//         name = [new(tree.Keyword)(simpleProperty[1])];
//         parserInput.forget();
//         return name;
//     }
//
//     function match(re) {
//         var i = parserInput.i,
//             chunk = parserInput.$re(re);
//         if (chunk) {
//             index.push(i);
//             return name.push(chunk[1]);
//         }
//     }
//
//     match(/^(\*?)/);
//     while (true) {
//         if (!match(/^((?:[\w-]+)|(?:[@\$]\{[\w-]+\}))/)) {
//             break;
//         }
//     }
//
//     if ((name.length > 1) && match(/^((?:\+_|\+)?)\s*:/)) {
//         parserInput.forget();
//
//         // at last, we have the complete match now. move forward,
//         // convert name particles to tree objects and return:
//         if (name[0] === '') {
//             name.shift();
//             index.shift();
//         }
//         for (k = 0; k < name.length; k++) {
//             s = name[k];
//             name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?
//                 new(tree.Keyword)(s) :
//                 (s.charAt(0) === '@' ?
//                     new(tree.Variable)('@' + s.slice(2, -1), index[k], fileInfo) :
//                     new(tree.Property)('$' + s.slice(2, -1), index[k], fileInfo));
//         }
//         return name;
//     }
//     parserInput.restore();
// }
}