Files
GitJournal/lib/core/notes_folder_config.dart
Vishesh Handa 044592b92d Allow Journal Entries to have their own file naming scheme
Adding an individual setting is becoming way too complex now.
2020-10-12 18:21:26 +02:00

294 lines
9.8 KiB
Dart

import 'dart:io';
import 'package:equatable/equatable.dart';
import 'package:meta/meta.dart';
import 'package:path/path.dart' as p;
import 'package:yaml/yaml.dart';
import 'package:yaml_serializer/yaml_serializer.dart';
import 'package:gitjournal/core/notes_folder_fs.dart';
import 'package:gitjournal/core/sorting_mode.dart';
import 'package:gitjournal/folder_views/common.dart';
import 'package:gitjournal/folder_views/standard_view.dart';
import 'package:gitjournal/screens/note_editor.dart';
import 'package:gitjournal/settings.dart';
import 'package:gitjournal/utils/logger.dart';
@immutable
class NotesFolderConfig extends Equatable {
static const FILENAME = ".gitjournal.yaml";
final SortingMode sortingMode;
final EditorType defaultEditor;
final FolderViewType defaultView;
final StandardViewHeader viewHeader;
final bool showNoteSummary;
final NoteFileNameFormat fileNameFormat;
final NoteFileNameFormat journalFileNameFormat;
final NotesFolderFS folder;
final bool yamlHeaderEnabled;
//int _version = 1;
final String yamlModifiedKey;
final String yamlCreatedKey;
final String yamlTagsKey;
final bool saveTitleInH1;
final Set<String> inlineTagPrefixes;
final String imageLocationSpec;
NotesFolderConfig({
@required this.sortingMode,
@required this.defaultEditor,
@required this.defaultView,
@required this.viewHeader,
@required this.showNoteSummary,
@required this.fileNameFormat,
@required this.journalFileNameFormat,
@required this.folder,
@required this.yamlHeaderEnabled,
@required this.yamlModifiedKey,
@required this.yamlCreatedKey,
@required this.yamlTagsKey,
@required this.saveTitleInH1,
@required this.inlineTagPrefixes,
@required this.imageLocationSpec,
});
@override
List<Object> get props => [
sortingMode,
defaultEditor,
defaultView,
viewHeader,
fileNameFormat,
journalFileNameFormat,
folder,
yamlHeaderEnabled,
yamlModifiedKey,
yamlCreatedKey,
yamlTagsKey,
saveTitleInH1,
inlineTagPrefixes,
imageLocationSpec,
];
static NotesFolderConfig fromSettings(
NotesFolderFS folder, Settings settings) {
StandardViewHeader viewHeader;
switch (settings.folderViewHeaderType) {
case "TitleGenerated":
viewHeader = StandardViewHeader.TitleGenerated;
break;
case "FileName":
viewHeader = StandardViewHeader.FileName;
break;
case "TitleOrFileName":
viewHeader = StandardViewHeader.TitleOrFileName;
break;
}
return NotesFolderConfig(
defaultEditor: settings.defaultEditor.toEditorType(),
defaultView: settings.defaultView.toFolderViewType(),
sortingMode: SortingMode(settings.sortingField, settings.sortingOrder),
showNoteSummary: settings.showNoteSummary,
viewHeader: viewHeader,
fileNameFormat: settings.noteFileNameFormat,
journalFileNameFormat: settings.journalNoteFileNameFormat,
folder: folder,
yamlHeaderEnabled: settings.yamlHeaderEnabled,
yamlCreatedKey: settings.yamlCreatedKey,
yamlModifiedKey: settings.yamlModifiedKey,
yamlTagsKey: settings.yamlTagsKey,
saveTitleInH1: settings.saveTitleInH1,
inlineTagPrefixes: settings.inlineTagPrefixes,
imageLocationSpec: settings.imageLocationSpec,
);
}
Future<void> saveToSettings(Settings settings) async {
settings.sortingField = sortingMode.field;
settings.sortingOrder = sortingMode.order;
settings.showNoteSummary = showNoteSummary;
settings.defaultEditor = SettingsEditorType.fromEditorType(defaultEditor);
settings.defaultView =
SettingsFolderViewType.fromFolderViewType(defaultView);
String ht;
switch (viewHeader) {
case StandardViewHeader.FileName:
ht = "FileName";
break;
case StandardViewHeader.TitleGenerated:
ht = "TitleGenerated";
break;
case StandardViewHeader.TitleOrFileName:
ht = "TitleOrFileName";
break;
}
settings.folderViewHeaderType = ht;
settings.noteFileNameFormat = fileNameFormat;
settings.journalNoteFileNameFormat = journalFileNameFormat;
settings.yamlHeaderEnabled = yamlHeaderEnabled;
settings.yamlCreatedKey = yamlCreatedKey;
settings.yamlModifiedKey = yamlModifiedKey;
settings.yamlTagsKey = yamlTagsKey;
settings.saveTitleInH1 = saveTitleInH1;
settings.inlineTagPrefixes = inlineTagPrefixes;
settings.imageLocationSpec = imageLocationSpec;
settings.save();
}
NotesFolderConfig copyWith({
SortingMode sortingMode,
EditorType defaultEditor,
FolderViewType defaultView,
StandardViewHeader viewHeader,
bool showNoteSummary,
NoteFileNameFormat fileNameFormat,
NoteFileNameFormat journalFileNameFormat,
NotesFolderFS folder,
bool yamlHeaderEnabled,
String yamlCreatedKey,
String yamlModifiedKey,
String yamlTagsKey,
bool saveTitleInH1,
Set<String> inlineTagPrefixes,
String imageLocationSpec,
}) {
return NotesFolderConfig(
sortingMode: sortingMode ?? this.sortingMode,
defaultEditor: defaultEditor ?? this.defaultEditor,
defaultView: defaultView ?? this.defaultView,
viewHeader: viewHeader ?? this.viewHeader,
showNoteSummary: showNoteSummary ?? this.showNoteSummary,
fileNameFormat: fileNameFormat ?? this.fileNameFormat,
journalFileNameFormat:
journalFileNameFormat ?? this.journalFileNameFormat,
folder: folder ?? this.folder,
yamlHeaderEnabled: yamlHeaderEnabled ?? this.yamlHeaderEnabled,
yamlCreatedKey: yamlCreatedKey ?? this.yamlCreatedKey,
yamlModifiedKey: yamlModifiedKey ?? this.yamlModifiedKey,
yamlTagsKey: yamlTagsKey ?? this.yamlTagsKey,
saveTitleInH1: saveTitleInH1 ?? this.saveTitleInH1,
inlineTagPrefixes: inlineTagPrefixes ?? this.inlineTagPrefixes,
imageLocationSpec: imageLocationSpec ?? this.imageLocationSpec,
);
}
static Future<NotesFolderConfig> fromFS(NotesFolderFS folder) async {
var file = File(p.join(folder.folderPath, FILENAME));
if (!file.existsSync()) {
return null;
}
var map = <String, dynamic>{};
var contents = await file.readAsString();
try {
var yamlMap = loadYaml(contents);
yamlMap.forEach((key, value) {
map[key] = value;
});
} catch (err) {
Log.d('NotesFolderConfig::decode("$contents") -> ${err.toString()}');
}
var sortingField =
SortingField.fromInternalString(map["sortingField"]?.toString());
var sortingOrder =
SortingOrder.fromInternalString(map["sortingOrder"]?.toString());
var sortingMode = SortingMode(sortingField, sortingOrder);
var defaultEditor =
SettingsEditorType.fromInternalString(map["defaultEditor"]?.toString());
var defaultView = SettingsFolderViewType.fromInternalString(
map["defaultView"]?.toString());
var showNoteSummary = map["showNoteSummary"].toString() != "false";
var folderViewHeaderType = map["folderViewHeaderType"]?.toString();
StandardViewHeader viewHeader;
switch (folderViewHeaderType) {
case "TitleGenerated":
viewHeader = StandardViewHeader.TitleGenerated;
break;
case "FileName":
viewHeader = StandardViewHeader.FileName;
break;
case "TitleOrFileName":
viewHeader = StandardViewHeader.TitleOrFileName;
break;
}
var fileNameFormat = map['noteFileNameFormat']?.toString();
var journalFileNameFormat = map['journalFileNameFormat'].toString();
var yamlHeaderEnabled = map["yamlHeaderEnabled"]?.toString() != "false";
var yamlCreatedKey = map['yamlCreatedKey']?.toString();
var yamlModifiedKey = map['yamlModifiedKey']?.toString();
var yamlTagsKey = map['yamlTagsKey']?.toString();
var saveTitleInH1 = map['saveTitleInH1']?.toString() != "false";
// FIXME: What about inlineTagPrefixes?
return NotesFolderConfig(
defaultEditor: defaultEditor.toEditorType(),
defaultView: defaultView.toFolderViewType(),
sortingMode: sortingMode,
showNoteSummary: showNoteSummary,
viewHeader: viewHeader,
fileNameFormat: NoteFileNameFormat.fromInternalString(fileNameFormat),
journalFileNameFormat:
NoteFileNameFormat.fromInternalString(journalFileNameFormat),
folder: folder,
yamlHeaderEnabled: yamlHeaderEnabled,
yamlCreatedKey: yamlCreatedKey,
yamlModifiedKey: yamlModifiedKey,
yamlTagsKey: yamlTagsKey,
saveTitleInH1: saveTitleInH1,
inlineTagPrefixes: {},
imageLocationSpec: "",
);
}
Future<void> saveToFS() async {
String ht;
switch (viewHeader) {
case StandardViewHeader.FileName:
ht = "FileName";
break;
case StandardViewHeader.TitleGenerated:
ht = "TitleGenerated";
break;
case StandardViewHeader.TitleOrFileName:
ht = "TitleOrFileName";
break;
}
var map = <String, dynamic>{
"sortingField": sortingMode.field.toInternalString(),
"sortingOrder": sortingMode.order.toInternalString(),
"defaultEditor":
SettingsEditorType.fromEditorType(defaultEditor).toInternalString(),
"defaultView": SettingsFolderViewType.fromFolderViewType(defaultView)
.toInternalString(),
"showNoteSummary": showNoteSummary,
"folderViewHeaderType": ht,
"noteFileNameFormat": fileNameFormat.toInternalString(),
'journalFileNameFormat': journalFileNameFormat.toInternalString(),
'yamlHeaderEnabled': yamlHeaderEnabled,
'yamlModifiedKey': yamlModifiedKey,
'yamlCreatedKey': yamlCreatedKey,
'yamlTagsKey': yamlTagsKey,
'saveTitleInH1': saveTitleInH1,
};
var yaml = toYAML(map);
var file = File(p.join(folder.folderPath, FILENAME));
await file.writeAsString(yaml);
}
}