parseCodeDocument function
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,
);
}