docs: function srcToBlocks(src) {
    var chunks = src.split(re.srcSplit);
    var blocks = [];
    var i = 0;
  
    for (i = 0; i < chunks.length; i++) {
      let block = {
        lines: [],
        tags : [],
        code : ''
      };
      let hasTag = false;
  
      // First of triplet: ignore
  
      // Iterate
      i++;
      if (i >= chunks.length) {
        break;
      }
  
      // Second of triplet: doc-comment
      let lines = chunks[i].split(re.lineSplit);
      let j = 1;
  
      // Only ignore very first line
      for (j = 1; j < lines.length; j++) {
        let line = lines[j].trimRight();
        let tag = line.match(re.tag);
  
        if (tag === null) {
          if (hasTag === false || line !== '') {
            block.lines.push(line);
          }
        } else {
          hasTag = true;
          block.tags.push({
            tag : tag[1],
            line: tag[2]
          });
        }
      }
  
      // Iterate
      i++;
      if (i < chunks.length) {
        // Third of triplet: code
        block.code = chunks[i].trim().replace(/\s+/g, ' ');
      }
  
      if (block.lines.length > 0 || block.tags.length > 0) {
        blocks.push(block);
      }
    }
  
    return blocks;
  }