Skip to content

Commit

Permalink
Merge pull request #128 from qwertyyb/feature/insertWhitespaceBetween…
Browse files Browse the repository at this point in the history
…ZhEn

feat: 支持在中文和英文/数字间插入空格
  • Loading branch information
qwertyyb authored Apr 14, 2024
2 parents c9f3738 + 3a63b9e commit 5ed5f9a
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 4 deletions.
19 changes: 16 additions & 3 deletions Fire/FireInputController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class FireInputController: IMKInputController {
private var _candidates: [Candidate] = []
private var _hasNext: Bool = false
private var _lastInputIsNumber = false
private var _lastInputText = ""
internal var inputMode: InputMode {
get { Fire.shared.inputMode }
set(value) { Fire.shared.inputMode = value }
Expand Down Expand Up @@ -132,6 +133,8 @@ class FireInputController: IMKInputController {
private func enModeHandler(event: NSEvent) -> Bool? {
// 英文输入模式, 不做任何处理
if inputMode == .enUS {
NSLog("[FireInputController] enModeHandler, in en mode: \(event.characters ?? "")")
_lastInputText = event.characters ?? ""
return false
}
return nil
Expand Down Expand Up @@ -252,6 +255,8 @@ class FireInputController: IMKInputController {
if event.keyCode == kVK_Space && _originalString.count > 0 {
if let first = self._candidates.first {
insertCandidate(first)
} else {
_lastInputText = " "
}
return true
}
Expand Down Expand Up @@ -370,9 +375,17 @@ class FireInputController: IMKInputController {
// 往输入框插入当前字符
func insertText(_ text: String) {
NSLog("insertText: %@", text)
let value = NSAttributedString(string: text)
client()?.insertText(value, replacementRange: replacementRange())
_lastInputIsNumber = text.last != nil && Int(String(text.last!)) != nil
if text.count > 0 {
var newText = text
if Defaults[.enableWhitespaceBetweenZhEn] && Utils.shared.shouldConcatWithWhitespace(_lastInputText, text) {
newText = " " + newText
NSLog("[FireInputController] insertCandidate should append whitespace: \(newText)")
}
let value = NSAttributedString(string: newText)
client()?.insertText(value, replacementRange: replacementRange())
_lastInputIsNumber = newText.last != nil && Int(String(newText.last!)) != nil
_lastInputText = newText
}
clean()
}

Expand Down
5 changes: 4 additions & 1 deletion Fire/Preferences/GeneralPane.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ struct GeneralPane: View {
@Default(.disableEnMode) private var disableEnMode
@Default(.disableTempEnMode) private var disableTempEnMode
@Default(.showInputModeStatus) private var showInputModeStatus
@Default(.enableWhitespaceBetweenZhEn) private var enableWhitespaceBetweenZhEn

var body: some View {
Settings.Container(contentWidth: 450.0) {
Expand Down Expand Up @@ -79,10 +80,12 @@ struct GeneralPane: View {
GroupBox(label: Text("中英文切换")) {
VStack(alignment: .leading, spacing: 12) {
HStack {
Toggle("禁止切换英文", isOn: $disableEnMode)
Spacer()
Toggle("状态栏显示", isOn: $showInputModeStatus)
}
HStack {
Toggle("禁止切换英文", isOn: $disableEnMode)
Toggle("中文与英文/数字之间插入空格", isOn: $enableWhitespaceBetweenZhEn)
Spacer()
Toggle("禁用;键临时英文模式", isOn: $disableTempEnMode)
}
Expand Down
22 changes: 22 additions & 0 deletions Fire/Utils.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,28 @@ class Utils {
}
return NSScreen.main
}

// 根据上次输入的字符,判断插入的新字符是否要前加空格
func shouldConcatWithWhitespace(_ lastText: String, _ nextText: String) -> Bool {
NSLog("[Utils] shouldConcatWithWhitespace, lastText: \(lastText), nextText: \(nextText)")
if lastText.count <= 0 || nextText.count <= 0 {
return false
}
guard let firstEnReg = try? NSRegularExpression(pattern: "[a-zA-Z0-9]$"),
let nextCnReg = try? NSRegularExpression(pattern: "^[\\u4e00-\\u9fa5]") else {
return false
}
if firstEnReg.numberOfMatches(in: lastText, range: NSMakeRange(0, lastText.count)) > 0
&& nextCnReg.numberOfMatches(in: nextText, range: NSMakeRange(0, nextText.count)) > 0 {
return true
}
guard let firstCnReg = try? NSRegularExpression(pattern: "[\\u4e00-\\u9fa5]$"),
let nextEnReg = try? NSRegularExpression(pattern: "^[a-zA-Z0-9]") else {
return false
}
return firstCnReg.numberOfMatches(in: lastText, range: NSMakeRange(0, lastText.count)) > 0
&& nextEnReg.numberOfMatches(in: nextText, range: NSMakeRange(0, nextText.count)) > 0
}

static let shared = Utils()
}
3 changes: 3 additions & 0 deletions Fire/types.swift
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,9 @@ extension Defaults.Keys {
static let customPunctuationSettings = Key<[String: String]>("customPunctuationSettings", default: punctuation)
// 数字后输入"。"自动转为"."
static let enableDotAfterNumber = Key<Bool>("enableDotAfterNumber", default: true)
// 在中文和英文之间插入空格,在中文输入模式下生效,也可在英文模式下输入英文再切到中文输入模式下输入中文时生效
// 在从中文模式输入中文后再切到英文输入模式下输入英文时不生效
static let enableWhitespaceBetweenZhEn = Key<Bool>("enableWhitespaceBetweenZhEn", default: true)

static let wbTablePath = Key<String>(
"wbTableURL",
Expand Down

0 comments on commit 5ed5f9a

Please sign in to comment.