// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/// Return the summary of the given DartDoc [string], which is the content of
/// the lines before the first blank line.
String getDartDocSummary(String string) {
  if (string == null) {
    return null;
  }
  var lines = string.split('\n');
  var buffer = StringBuffer();
  var firstLine = true;
  for (var line in lines) {
    if (buffer.length != 0 && line.isEmpty) {
      return buffer.toString();
    }
    if (!firstLine) {
      buffer.write('\n');
    }
    firstLine = false;
    buffer.write(line);
  }
  return buffer.toString();
}

/// Converts [string] from a DartDoc comment with slashes and stars to a plain
/// text representation of the comment.
String removeDartDocDelimiters(String string) {
  if (string == null) {
    return null;
  }
  // remove /** */
  if (string.startsWith('/**')) {
    string = string.substring(3);
  }
  if (string.endsWith('*/')) {
    string = string.substring(0, string.length - 2);
  }
  string = string.trim();
  // remove leading '* ' and '/// '
  var lines = string.split('\n');
  var buffer = StringBuffer();
  var firstLine = true;
  for (var line in lines) {
    line = line.trim();
    if (line.startsWith('*')) {
      line = line.substring(1);
      if (line.startsWith(' ')) {
        line = line.substring(1);
      }
    } else if (line.startsWith('///')) {
      line = line.substring(3);
      if (line.startsWith(' ')) {
        line = line.substring(1);
      }
    }
    if (!firstLine) {
      buffer.write('\n');
    }
    firstLine = false;
    buffer.write(line);
  }
  string = buffer.toString();
  // done
  return string;
}
