1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
import 'dart:io';
import 'package:intl/intl.dart';
import 'package:path/path.dart' as p;
class LogEntry {
LogEntry({required this.file, required this.timestamp});
final File file;
final DateTime timestamp;
}
final _filenameRegex = RegExp(r'^ql-(\d{6})-(\d{6})\.md$');
final _timestampFormat = DateFormat('yyMMdd-HHmmss');
Future<File> logEntry(String dir, String text, {DateTime? now}) async {
final stamp = _timestampFormat.format(now ?? DateTime.now());
final file = File(p.join(dir, 'ql-$stamp.md'));
await file.writeAsString(text);
return file;
}
Future<List<LogEntry>> listEntries(String dir) async {
final directory = Directory(dir);
if (!await directory.exists()) return const [];
final entries = <LogEntry>[];
await for (final entity in directory.list(followLinks: false)) {
if (entity is! File) continue;
final ts = _parseFilename(p.basename(entity.path));
if (ts == null) continue;
entries.add(LogEntry(file: entity, timestamp: ts));
}
entries.sort((a, b) => b.timestamp.compareTo(a.timestamp));
return entries;
}
Future<void> deleteEntry(File f) async {
if (await f.exists()) await f.delete();
}
DateTime? _parseFilename(String name) {
final m = _filenameRegex.firstMatch(name);
if (m == null) return null;
final d = m.group(1)!; // YYMMDD
final t = m.group(2)!; // HHMMSS
try {
return DateTime(
2000 + int.parse(d.substring(0, 2)),
int.parse(d.substring(2, 4)),
int.parse(d.substring(4, 6)),
int.parse(t.substring(0, 2)),
int.parse(t.substring(2, 4)),
int.parse(t.substring(4, 6)),
);
} catch (_) {
return null;
}
}
|