MessageBlock constructor

MessageBlock(
  1. String block
)

Implementation

factory MessageBlock(String block) {
  var parts = <String>[];

  var appendToPrevBlock = false;

  var cursor = 0;
  for (var m in _regexpBlockSplitter.allMatches(block)) {
    var prev = m.start > cursor ? block.substring(cursor, m.start) : '';

    var escapedChar = m.group(1);
    var escaped = false;

    if (escapedChar != null && escapedChar.isNotEmpty) {
      prev += '|';
      escaped = true;
    }

    if (prev.isNotEmpty) {
      if (appendToPrevBlock) {
        parts[parts.length - 1] += prev;
      } else {
        parts.add(prev);
      }
    }

    appendToPrevBlock = escaped;

    cursor = m.end;
  }

  if (block.length > cursor) {
    var tail = block.substring(cursor);
    if (appendToPrevBlock) {
      parts[parts.length - 1] += tail;
    } else {
      parts.add(tail);
    }
  }

  var branches = <MessageBlockBranch>[];

  for (var part in parts) {
    branches.add(MessageBlockBranch(part));
  }

  return MessageBlock._(branches);
}