Files
GitJournal/lib/storage/serializers.dart
Vishesh Handa acede95536 Dart: Add analysis_options
For now I've mostly tried to follow the same style guide as the flutter
repository, with many options disabled. Eventually, maybe it would make
sense to be far stricter.
2019-02-13 13:08:15 +01:00

72 lines
1.4 KiB
Dart

import 'dart:convert';
import 'package:journal/note.dart';
import 'package:yaml/yaml.dart';
abstract class NoteSerializer {
String encode(Note note);
Note decode(String str);
}
class JsonNoteSerializer implements NoteSerializer {
@override
Note decode(String str) {
final json = JsonDecoder().convert(str);
return Note.fromJson(json);
}
@override
String encode(Note note) {
return JsonEncoder().convert(note.toJson());
}
}
class MarkdownYAMLSerializer implements NoteSerializer {
@override
Note decode(String str) {
if (str.startsWith("---\n")) {
var parts = str.split("---\n");
var yamlMap = loadYaml(parts[1]);
var map = Map<String, dynamic>();
yamlMap.forEach((key, value) {
map[key] = value;
});
map['body'] = parts[2].trimLeft();
return Note.fromJson(map);
}
var map = Map<String, dynamic>();
map['body'] = str;
return Note.fromJson(map);
}
@override
String encode(Note note) {
const serparator = '---\n';
var str = "";
str += serparator;
var metadata = note.toJson();
metadata.remove('body');
metadata.remove('fileName');
str += toYAML(metadata);
str += serparator;
str += '\n';
str += note.body;
return str;
}
static String toYAML(Map<String, dynamic> map) {
var str = "";
map.forEach((key, value) {
str += key + ": " + value + "\n";
});
return str;
}
}