| // Copyright (c) 2023, 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. |
| |
| import 'dart:io'; |
| |
| import 'package:source_span/source_span.dart'; |
| |
| void main(List<String> args) { |
| final file = File('README.md'); |
| final contents = file.readAsStringSync(); |
| |
| final sourceFile = SourceFile.fromString(contents, url: file.uri); |
| final spans = _parseFile(contents, sourceFile); |
| |
| for (var span in spans.take(30)) { |
| print('[${span.start.line + 1}:${span.start.column + 1}] ${span.text}'); |
| } |
| } |
| |
| Iterable<SourceSpan> _parseFile(String contents, SourceFile sourceFile) sync* { |
| var wordStart = 0; |
| var inWhiteSpace = true; |
| |
| for (var i = 0; i < contents.length; i++) { |
| final codeUnit = contents.codeUnitAt(i); |
| |
| if (codeUnit == _eol || codeUnit == _space) { |
| if (!inWhiteSpace) { |
| inWhiteSpace = true; |
| |
| // emit a word |
| yield sourceFile.span(wordStart, i); |
| } |
| } else { |
| if (inWhiteSpace) { |
| inWhiteSpace = false; |
| |
| wordStart = i; |
| } |
| } |
| } |
| |
| if (!inWhiteSpace) { |
| // emit a word |
| yield sourceFile.span(wordStart, contents.length); |
| } |
| } |
| |
| const int _eol = 10; |
| const int _space = 32; |