Skip to content

Commit

Permalink
refactor: Dict class
Browse files Browse the repository at this point in the history
Signed-off-by: Mumulhl <mumulhl.666@gmail.com>
  • Loading branch information
mumu-lhl committed Dec 7, 2024
1 parent da53695 commit 90b0173
Show file tree
Hide file tree
Showing 9 changed files with 194 additions and 186 deletions.
133 changes: 54 additions & 79 deletions lib/dictionary.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,80 +8,82 @@ import "package:path_provider/path_provider.dart";
import "database/dictionary.dart";
import "main.dart";

final dict = _Dict();

class _Dict {
int? id;
String? path;
class Mdict {
late final int id;
final String path;
String? fontName;
String? fontPath;
String? backupPath;
DictionaryDatabase? db;
DictReader? reader;
late final DictionaryDatabase db;
late final DictReader reader;
DictReader? readerResource;
bool? tagExist;

Future<void> addDictionary(String path) async {
path = setExtension(path, "");
Mdict({required this.path});

Future<void> init() async {
id = await dictionaryList.getId(path);

reader = DictReader("$path.mdx");
await reader.init(false);

try {
readerResource = DictReader("$path.mdd");
await readerResource!.init(false);
} catch (e) {
readerResource = null;
}

db = dictionaryDatabase(id);

final fontPath = await dictionaryList.getFontPath(id);
customFont(fontPath);

final backupPath = await dictionaryList.getBackupPath(id);
customBackupPath(backupPath);

await checkTagExist();
}

Future<void> close() async {
await db.close();
}

Future<bool> add() async {
try {
await dictionaryList.getId(path);
return;
return false;
// ignore: empty_catches
} catch (e) {}

if (db != null) {
await db!.close();
}

await _initDictReader(path);

await prefs.setString("currentDictionaryPath", path);

await dictionaryList.add(path);

final id = await dictionaryList.getId(path);
this.id = id;
id = await dictionaryList.getId(path);
db = dictionaryDatabase(id);

await _addWords();

if (readerResource != null) await _addResource();

_changeCurrentDictionary(id, path);

customFont(null);
customBackupPath(null);

tagExist = false;
}

Future<void> changeDictionary(int id, String path) async {
_changeCurrentDictionary(id, path);

await prefs.setString("currentDictionaryPath", path);

await db!.close();
db = dictionaryDatabase(id);

final fontPath = await dictionaryList.getFontPath(id);
customFont(fontPath);

final backupPath = await dictionaryList.getBackupPath(id);
customBackupPath(backupPath);

await checkTagExist();

_initDictReader(path, readKey: false);
return true;
}

Future<void> checkTagExist() async {
tagExist = await db!.existTag();
tagExist = await db.existTag();
}

Future<void> customBackupPath(String? path) async {
backupPath = path;
await dictionaryList.updateBackup(id!, path);
await dictionaryList.updateBackup(id, path);
}

Future<void> customFont(String? path) async {
Expand All @@ -92,64 +94,42 @@ class _Dict {
fontName = basename(path);
}

await dictionaryList.updateFont(id!, path);
await dictionaryList.updateFont(id, path);
}

Future<String> readWord(String word) async {
late DictionaryData data;
try {
data = await db!.getOffset(word);
data = await db.getOffset(word);
} catch (e) {
data = await db!.getOffset(word.toLowerCase());
data = await db.getOffset(word.toLowerCase());
}

String content = await dict.reader!.readOne(data.blockOffset,
data.startOffset, data.endOffset, data.compressedSize);
String content = await reader.readOne(data.blockOffset, data.startOffset,
data.endOffset, data.compressedSize);

if (content.startsWith("@@@LINK=")) {
// 8: remove @@@LINK=
// content.length - 3: remove \r\n\x00
data = await db!
data = await db
.getOffset(content.substring(8, content.length - 3).trimRight());
content = await dict.reader!.readOne(data.blockOffset, data.startOffset,
content = await reader.readOne(data.blockOffset, data.startOffset,
data.endOffset, data.compressedSize);
}

return content;
}

Future<void> removeDictionary(String path) async {
reader = null;
readerResource = null;
_changeCurrentDictionary(null, null);

Future<void> removeDictionary() async {
await prefs.remove("currentDictionaryPath");

await db!.close();
final id = await dictionaryList.getId(path);
await db.close();
final databasePath = join((await getApplicationDocumentsDirectory()).path,
"dictionary_$id.sqlite");
final file = File(databasePath);
await file.delete();

await dictionaryList.remove(path);

try {
final newDictionary = (await dictionaryList.all())[0];
changeDictionary(newDictionary.id, newDictionary.path);
// ignore: empty_catches
} catch (e) {}
}

Future<void> scanDictionaries(String path) async {
final dir = Directory(path);
final files = await dir.list().toList();

for (final file in files) {
if (extension(file.path) == ".mdx") {
await addDictionary(file.path);
}
}
}

Future<void> _addResource() async {
Expand All @@ -170,13 +150,13 @@ class _Dict {

if (number == 50000) {
number = 0;
await db!.insertResource(resourceList);
await db.insertResource(resourceList);
resourceList.clear();
}
}

if (resourceList.isNotEmpty) {
await db!.insertResource(resourceList);
await db.insertResource(resourceList);
}
}

Expand All @@ -187,7 +167,7 @@ class _Dict {
await for (final (
key,
(blockOffset, startOffset, endOffset, compressedSize)
) in reader!.read()) {
) in reader.read()) {
wordList.add(DictionaryCompanion(
key: Value(key),
blockOffset: Value(blockOffset),
Expand All @@ -198,21 +178,16 @@ class _Dict {

if (number == 50000) {
number = 0;
await db!.insertWords(wordList);
await db.insertWords(wordList);
wordList.clear();
}
}

if (wordList.isNotEmpty) {
await db!.insertWords(wordList);
await db.insertWords(wordList);
}
}

void _changeCurrentDictionary(int? id, String? path) {
this.id = id;
this.path = path;
}

Future<void> _initDictReader(String path, {bool readKey = true}) async {
final dictReaderTemp = DictReader("$path.mdx");
await dictReaderTemp.init(readKey);
Expand Down
28 changes: 8 additions & 20 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import "package:ciyue/database/app.dart";
import "package:ciyue/database/dictionary.dart";
import "package:ciyue/dictionary.dart";
import "package:ciyue/pages/main/main.dart";
import "package:ciyue/pages/manage_dictionaries/main.dart";
import "package:ciyue/pages/manage_dictionaries/settings_dictionary.dart";
import "package:ciyue/pages/webview_display.dart";
import "package:ciyue/settings.dart";
import "package:dict_reader/dict_reader.dart";
import "package:drift/drift.dart";
import "package:dynamic_color/dynamic_color.dart";
import "package:flutter/material.dart";
import "package:flutter/services.dart";
Expand All @@ -19,28 +18,16 @@ import "package:shared_preferences/shared_preferences.dart";
void main() async {
WidgetsFlutterBinding.ensureInitialized();

driftRuntimeOptions.dontWarnAboutMultipleDatabases = true;

prefs = await SharedPreferences.getInstance();
dict.path = prefs.getString("currentDictionaryPath");
final path = prefs.getString("currentDictionaryPath");

dictionaryList = appDatabase();

if (dict.path != null) {
dict.id = await dictionaryList.getId(dict.path!);

dict.reader = DictReader("${dict.path!}.mdx");
await dict.reader!.init(false);

try {
dict.readerResource = DictReader("${dict.path!}.mdd");
await dict.readerResource!.init(false);
} catch (e) {
dict.readerResource = null;
}

final id = await dictionaryList.getId(dict.path!);
dict.db = dictionaryDatabase(id);

await dict.checkTagExist();
if (path != null) {
dict = Mdict(path: path);
await dict!.init();
}

flutterTts = FlutterTts();
Expand All @@ -66,6 +53,7 @@ late FlutterTts flutterTts;
late PackageInfo packageInfo;
late SharedPreferences prefs;
late VoidCallback refreshAll;
Mdict? dict;

final _router = GoRouter(
routes: [
Expand Down
3 changes: 1 addition & 2 deletions lib/pages/main/home.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import "package:ciyue/database/dictionary.dart";
import "package:ciyue/dictionary.dart";
import "package:ciyue/main.dart";
import "package:flutter/material.dart";
import "package:flutter_gen/gen_l10n/app_localizations.dart";
Expand All @@ -19,7 +18,7 @@ class HomeScreen extends StatelessWidget {

final locale = AppLocalizations.of(context);

if (dict.path == null) {
if (dict == null) {
body = Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
Expand Down
6 changes: 3 additions & 3 deletions lib/pages/main/main.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import "package:ciyue/database/dictionary.dart";
import "package:ciyue/dictionary.dart";
import "package:ciyue/main.dart";
import "package:ciyue/pages/main/home.dart";
import "package:ciyue/pages/main/settings.dart";
import "package:ciyue/pages/main/wordbook.dart";
Expand All @@ -25,7 +25,7 @@ class _HomeState extends State<Home> {
Widget build(BuildContext context) {
PreferredSizeWidget? appBar;

if (dict.path != null && _currentIndex == 0) {
if (dict != null && _currentIndex == 0) {
Widget? removeButton;
if (searchWord != "") {
removeButton = IconButton(
Expand All @@ -52,7 +52,7 @@ class _HomeState extends State<Home> {
suffixIcon: removeButton),
controller: textFieldController,
onChanged: (text) async {
final result = await dict.db!.searchWord(text);
final result = await dict!.db.searchWord(text);

setState(() {
searchResult = result;
Expand Down
17 changes: 8 additions & 9 deletions lib/pages/main/settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import "dart:convert";
import "dart:io";

import "package:ciyue/database/dictionary.dart";
import "package:ciyue/dictionary.dart";
import "package:ciyue/main.dart";
import "package:ciyue/settings.dart";
import "package:file_selector/file_selector.dart";
Expand Down Expand Up @@ -52,20 +51,20 @@ class Export extends StatelessWidget {
title: Text(AppLocalizations.of(context)!.export),
onTap: () async {
final directoryPath = await getDirectoryPath();
if (directoryPath == null || dict.db == null) {
if (directoryPath == null || dict == null) {
return;
}

final dictionaryName = basename(dict.path!),
final dictionaryName = basename(dict!.path),
filename = setExtension(dictionaryName, ".json"),
saveLocation = join(directoryPath, filename);

if (settings.autoExport) {
dict.customBackupPath(saveLocation);
dict!.customBackupPath(saveLocation);
}

final words = await dict.db!.getAllWords(),
tags = await dict.db!.getAllTags();
final words = await dict!.db.getAllWords(),
tags = await dict!.db.getAllTags();

if (words.isNotEmpty) {
final wordsOutput = jsonEncode(words), tagsOutput = jsonEncode(tags);
Expand Down Expand Up @@ -121,7 +120,7 @@ class Import extends StatelessWidget {
leading: Icon(Icons.file_download),
title: Text(AppLocalizations.of(context)!.import),
onTap: () async {
if (dict.db == null) {
if (dict == null) {
return;
}

Expand Down Expand Up @@ -149,8 +148,8 @@ class Import extends StatelessWidget {
tagsData.add(WordbookTag.fromJson(i));
}

await dict.db!.addAllWords(wordsData);
await dict.db!.addAllTags(tagsData);
await dict!.db.addAllWords(wordsData);
await dict!.db.addAllTags(tagsData);
},
);
}
Expand Down
Loading

0 comments on commit 90b0173

Please sign in to comment.