Skip to content

Commit

Permalink
import data from squirrel (#127)
Browse files Browse the repository at this point in the history
  • Loading branch information
eagleoflqj authored May 19, 2024
1 parent 5d68ee3 commit 906d343
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 55 deletions.
Binary file modified assets/zh-Hans.lproj/Localizable.strings
Binary file not shown.
57 changes: 36 additions & 21 deletions src/config/advanced.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,31 +31,46 @@ private func extractZip(_ file: URL) -> Bool {
struct AdvancedView: View {
let openPanel = NSOpenPanel()
@AppStorage("ImportDataSelectedDirectory") var importDataSelectedDirectory: String?
@State private var showImport = false
@State private var showImportF5a = false
@State private var showImportSquirrel = false

var body: some View {
Button {
openPanel.allowsMultipleSelection = false
openPanel.canChooseDirectories = false
openPanel.allowedContentTypes = [UTType.init(filenameExtension: "zip")!]
openPanel.directoryURL = URL(
fileURLWithPath: importDataSelectedDirectory
?? homeDir.appendingPathComponent("Downloads").localPath())
openPanel.begin { response in
if response == .OK {
removeFile(extractDir)
mkdirP(extractPath)
if let file = openPanel.urls.first, extractZip(file) {
showImport = true
VStack {
Text("Import data from …")

Button {
removeFile(extractDir)
if copyFile(squirrelDir, extractDir) {
showImportSquirrel = true
}
} label: {
Text("Local Squirrel")
}.sheet(isPresented: $showImportSquirrel) {
ImportDataView(squirrelItems)
}.disabled(!FileManager.default.fileExists(atPath: squirrelDir.localPath()))

Button {
openPanel.allowsMultipleSelection = false
openPanel.canChooseDirectories = false
openPanel.allowedContentTypes = [UTType.init(filenameExtension: "zip")!]
openPanel.directoryURL = URL(
fileURLWithPath: importDataSelectedDirectory
?? homeDir.appendingPathComponent("Downloads").localPath())
openPanel.begin { response in
if response == .OK {
removeFile(extractDir)
mkdirP(extractPath)
if let file = openPanel.urls.first, extractZip(file) {
showImportF5a = true
}
}
importDataSelectedDirectory = openPanel.directoryURL?.localPath()
}
importDataSelectedDirectory = openPanel.directoryURL?.localPath()
} label: {
Text("Fcitx5 Android")
}.sheet(isPresented: $showImportF5a) {
ImportDataView(f5aItems)
}
} label: {
Text("Import data from Fcitx5 Android")
}.sheet(isPresented: $showImport) {
ImportDataView()
}
.padding()
}.padding()
}
}
92 changes: 58 additions & 34 deletions src/config/importdata.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ private let dataDir = extractDir.appendingPathComponent("external")
private let imDir = dataDir.appendingPathComponent("data/inputmethod")
private let pinyinDir = dataDir.appendingPathComponent("data/pinyin")
private let tableDir = dataDir.appendingPathComponent("data/table")
private let rimeDir = dataDir.appendingPathComponent("data/rime")
private let f5aRimeDir = dataDir.appendingPathComponent("data/rime")

struct ImportableItem: Identifiable {
let id = UUID()
Expand All @@ -14,42 +14,81 @@ struct ImportableItem: Identifiable {
var doImport: () -> Bool
}

private func rimeExcluded() -> [String] {
private func rimeExcluded(_ rimeDir: URL) -> [String] {
["installation.yaml", "sync"]
}

private func rimeBin() -> [String] {
private func rimeBin(_ rimeDir: URL) -> [String] {
if rimeDir.appendingPathComponent("build").exists() {
return ["build"]
}
return []
}

private func rimeUser() -> [String] {
private func rimeUser(_ rimeDir: URL) -> [String] {
var userFiles = getFileNamesWithExtension(rimeDir.localPath(), ".userdb", true)
if rimeDir.appendingPathComponent("user.yaml").exists() {
userFiles.append("user.yaml")
}
return userFiles
}

private func rimeConfig() -> [String] {
private func rimeConfig(_ rimeDir: URL) -> [String] {
let allFiles = getFileNamesWithExtension(rimeDir.localPath())
let otherFiles = [rimeExcluded, rimeBin, rimeUser].flatMap { $0() }
let otherFiles = [rimeExcluded, rimeBin, rimeUser].flatMap { $0(rimeDir) }
return allFiles.filter { !otherFiles.contains($0) }
}

private func importRime(_ getter: () -> [String]) -> Bool {
private func importRime(_ getter: (URL) -> [String], _ rimeDir: URL) -> Bool {
mkdirP(rimeLocalDir.localPath())
return getter().map { fileName in
return getter(rimeDir).map { fileName in
moveAndMerge(
rimeDir.appendingPathComponent(fileName),
rimeLocalDir.appendingPathComponent(fileName)
)
}.allSatisfy { $0 }
}

private let importableItems = [
private func importableRimeConfig(_ rimeDir: URL) -> ImportableItem {
return ImportableItem(
name: NSLocalizedString("Rime config", comment: ""), enabled: true,
exists: {
rimeConfig(rimeDir).count > 0
},
doImport: {
importRime(rimeConfig, rimeDir)
})
}

private func importableRimeBin(_ rimeDir: URL) -> ImportableItem {
return ImportableItem(
name: NSLocalizedString("Rime binaries", comment: ""), enabled: false,
exists: {
rimeBin(rimeDir).count > 0
},
doImport: {
importRime(rimeBin, rimeDir)
})
}

private func importableRimeUser(_ rimeDir: URL) -> ImportableItem {
return ImportableItem(
name: NSLocalizedString("Rime user data", comment: ""), enabled: false,
exists: {
rimeUser(rimeDir).count > 0
},
doImport: {
importRime(rimeUser, rimeDir)
})
}

let squirrelItems = [
importableRimeConfig(extractDir),
importableRimeBin(extractDir),
importableRimeUser(extractDir),
]

let f5aItems = [
ImportableItem(
name: NSLocalizedString("Global Config", comment: ""), enabled: false,
exists: {
Expand Down Expand Up @@ -147,37 +186,22 @@ private let importableItems = [
.allSatisfy { $0 }
}
),
ImportableItem(
name: NSLocalizedString("Rime config", comment: ""), enabled: true,
exists: {
rimeConfig().count > 0
},
doImport: {
importRime(rimeConfig)
}),
ImportableItem(
name: NSLocalizedString("Rime binaries", comment: ""), enabled: false,
exists: {
rimeBin().count > 0
},
doImport: {
importRime(rimeBin)
}),
ImportableItem(
name: NSLocalizedString("Rime user data", comment: ""), enabled: false,
exists: {
rimeUser().count > 0
},
doImport: {
importRime(rimeUser)
}),
importableRimeConfig(f5aRimeDir),
importableRimeBin(f5aRimeDir),
importableRimeUser(f5aRimeDir),
]

struct ImportDataView: View {
@State private var items = importableItems.filter { $0.exists() }
private var importableItems: [ImportableItem]
@State private var items: [ImportableItem]
@State private var failedItems = [String]()
@State private var showAlert = false

init(_ importableItems: [ImportableItem]) {
self.importableItems = importableItems
self.items = importableItems.filter { $0.exists() }
}

var body: some View {
VStack {
Text("Files with the same name will be overridden.")
Expand Down
2 changes: 2 additions & 0 deletions src/config/util.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ let pinyinLocalDir = localDir.appendingPathComponent("pinyin")
let tableLocalDir = localDir.appendingPathComponent("table")
let rimeLocalDir = localDir.appendingPathComponent("rime")

let squirrelDir = homeDir.appendingPathComponent("Library/Rime")

func getFileNamesWithExtension(_ path: String, _ suffix: String = "", _ full: Bool = false)
-> [String]
{
Expand Down

0 comments on commit 906d343

Please sign in to comment.