// 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;
  }
  List<String> lines = string.split('\n');
  StringBuffer buffer = new StringBuffer();
  bool firstLine = true;
  for (String 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 '/// '
  List<String> lines = string.split('\n');
  StringBuffer buffer = new StringBuffer();
  bool firstLine = true;
  for (String 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;
}
