parseCodeDocument function

CodeDocument parseCodeDocument(
  1. String source, {
  2. String? language,
  3. String? filePath,
  4. int? maxLineLength = 1000,
  5. int tabSize = 2,
  6. bool showLineNumbers = true,
})

Parses source text into sanitized CodeLine rows.

Implementation

CodeDocument parseCodeDocument(
  String source, {
  String? language,
  String? filePath,
  int? maxLineLength = 1000,
  int tabSize = 2,
  bool showLineNumbers = true,
}) {
  assert(tabSize > 0);
  final rawLines = source.split('\n');
  if (rawLines.isNotEmpty && rawLines.last.isEmpty) rawLines.removeLast();
  final width = rawLines.isEmpty ? 1 : rawLines.length.toString().length;
  final lines = <CodeLine>[];
  var commentCount = 0;
  var blankCount = 0;
  var nonEmptyLineCount = 0;
  for (var index = 0; index < rawLines.length; index++) {
    final raw = rawLines[index].endsWith('\r')
        ? rawLines[index].substring(0, rawLines[index].length - 1)
        : rawLines[index];
    final safe = _sanitizeCodeText(raw, tabSize: tabSize);
    final kind = _classifyCodeLine(safe, language: language);
    if (kind == CodeLineKind.comment) commentCount += 1;
    if (kind == CodeLineKind.blank) blankCount += 1;
    if (kind != CodeLineKind.blank) nonEmptyLineCount += 1;
    final indentation = _leadingSpaces(safe);
    final lineNumber = index + 1;
    final linePrefix = showLineNumbers
        ? '${lineNumber.toString().padLeft(width)} │ '
        : '';
    final rawDisplay = '$linePrefix$safe';
    final display = _truncateGraphemes(rawDisplay, maxLineLength);
    lines.add(
      CodeLine(
        index: index,
        lineNumber: lineNumber,
        kind: kind,
        text: safe,
        displayText: display,
        indentation: indentation,
        outputSanitized: safe != raw,
        outputTruncated: display != rawDisplay,
        outputOriginalLength: raw.length,
      ),
    );
  }
  return CodeDocument(
    lines: List<CodeLine>.unmodifiable(lines),
    language: language,
    filePath: filePath == null ? null : _sanitizeCodeText(filePath),
    lineCount: lines.length,
    nonEmptyLineCount: nonEmptyLineCount,
    commentCount: commentCount,
    blankCount: blankCount,
    showLineNumbers: showLineNumbers,
    tabSize: tabSize,
  );
}