Skip to content

Commit

Permalink
BlockReadingBuilder -> Compositor. (#50)
Browse files Browse the repository at this point in the history
  • Loading branch information
ShikiSuen authored Jun 15, 2022
1 parent 626472b commit 6f175eb
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 118 deletions.
24 changes: 12 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ Megrez Engine is a module made for processing lingual data of an input method. T

### §1. 初期化

在你的 ctlInputMethod (InputMethodController) 或者 KeyHandler 內初期化一份 Megrez.BlockReadingBuilder 分節讀音槽副本(這裡將該副本命名為「`_builder`」)。由於 Megrez.BlockReadingBuilder 的型別是 Class 型別,所以其副本可以用 let 來宣告。
在你的 ctlInputMethod (InputMethodController) 或者 KeyHandler 內初期化一份 Megrez.Compositor 分節讀音槽副本(這裡將該副本命名為「`compositor`」)。由於 Megrez.Compositor 的型別是 Class 型別,所以其副本可以用 let 來宣告。

以 KeyHandler 為例:
```swift
class KeyHandler: NSObject {
// 先設定好變數
let _builder: Megrez.BlockReadingBuilder = .init()
let compositor: Megrez.Compositor = .init()
...
}
```
Expand All @@ -26,12 +26,12 @@ class KeyHandler: NSObject {
@objc(ctlInputMethod) // 根據 info.plist 內的情況來確定型別的命名
class ctlInputMethod: IMKInputController {
// 先設定好變數
let _builder: Megrez.BlockReadingBuilder = .init()
let compositor: Megrez.Compositor = .init()
...
}
```

由於 Swift 會在某個大副本(KeyHandler 或者 ctlInputMethod 副本)被銷毀的時候自動銷毀其中的全部副本,所以 Megrez.BlockReadingBuilder 的副本初期化沒必要寫在 init() 當中。但你很可能會想在 init() 時指定 Tekkon.Composer 所對接的語言模組型別、以及其可以允許的最大詞長。
由於 Swift 會在某個大副本(KeyHandler 或者 ctlInputMethod 副本)被銷毀的時候自動銷毀其中的全部副本,所以 Megrez.Compositor 的副本初期化沒必要寫在 init() 當中。但你很可能會想在 init() 時指定 Tekkon.Composer 所對接的語言模組型別、以及其可以允許的最大詞長。

這裡就需要在 init() 時使用參數:
```swift
Expand All @@ -40,7 +40,7 @@ class ctlInputMethod: IMKInputController {
/// - lm: 語言模型。可以是任何基於 Megrez.LanguageModel 的衍生型別。
/// - length: 指定該分節讀音槽內可以允許的最大詞長,預設為 10 字。
/// - separator: 多字讀音鍵當中用以分割漢字讀音的記號,預設為空。
let _builder: Megrez.BlockReadingBuilder = .init(lm: lmTest, length: 13, separator: "-")
let compositor: Megrez.Compositor = .init(lm: lmTest, length: 13, separator: "-")
```

### §2. 使用範例
Expand Down Expand Up @@ -71,15 +71,15 @@ MegrezTests.swift 檔案內的 SimpleLM 可以作為範例。

如果需要更實戰的範例的話,可以洽威注音專案的倉庫內的 LMInstantiator.swift 及其關聯檔案。

#### // 2. 怎樣與 builder 互動:
#### // 2. 怎樣與 compositor 互動:

這裡只講幾個常用函數:

- 游標位置 `builder.cursorIndex` 是可以賦值與取值的動態變數,且會在賦值內容為超出位置範圍的數值時自動修正。初期值為 0。
- `builder.insertReadingAtCursor(reading: "gao1")` 可以在當前的游標位置插入讀音「gao1」。
- `builder.deleteReadingToTheFrontOfCursor()` 的作用是:朝著往文字輸入方向、砍掉一個與游標相鄰的讀音。反之,`deleteReadingAtTheRearOfCursor` 則朝著與文字輸入方向相反的方向、砍掉一個與游標相鄰的讀音。
- 游標位置 `compositor.cursorIndex` 是可以賦值與取值的動態變數,且會在賦值內容為超出位置範圍的數值時自動修正。初期值為 0。
- `compositor.insertReadingAtCursor(reading: "gao1")` 可以在當前的游標位置插入讀音「gao1」。
- `compositor.deleteReadingToTheFrontOfCursor()` 的作用是:朝著往文字輸入方向、砍掉一個與游標相鄰的讀音。反之,`deleteReadingAtTheRearOfCursor` 則朝著與文字輸入方向相反的方向、砍掉一個與游標相鄰的讀音。
- 在威注音的術語體系當中,「文字輸入方向」為向前(Front)、與此相反的方向為向後(Rear)。
- `builder.grid.fixNodeSelectedCandidate(location: ?, value: "??")` 用來根據輸入法選中的候選字詞、據此更新當前游標位置選中的候選字詞節點當中的候選字詞。
- `compositor.grid.fixNodeSelectedCandidate(location: ?, value: "??")` 用來根據輸入法選中的候選字詞、據此更新當前游標位置選中的候選字詞節點當中的候選字詞。

輸入完內容之後,可以聲明一個用來接收結果的變數:

Expand All @@ -90,7 +90,7 @@ MegrezTests.swift 檔案內的 SimpleLM 可以作為範例。
/// - score: 給定累計權重,非必填參數。預設值為 0。
/// - joinedPhrase: 用以統計累計長詞的內部參數,請勿主動使用。
/// - longPhrases: 用以統計累計長詞的內部參數,請勿主動使用。
var walked = _builder.walk(at: 0, score: 0.0)
var walked = compositor.walk(at: 0, score: 0.0)
```

MegrezTests.swift 是輸入了很多內容之後再 walk 的。實際上一款輸入法會在你每次插入讀音或刪除讀音的時候都重新 walk。那些處於候選字詞鎖定狀態的節點不會再受到之後的 walk 的行為的影響,但除此之外的節點會因為每次 walk 而可能各自的候選字詞會出現自動變化。如果給了 nodesLimit 一個非零的數值的話,則 walk 的範圍外的節點不會受到影響。
Expand All @@ -107,7 +107,7 @@ walk 之後的取值的方法及利用方法可以有很多種。這裡有其中
print(composed)
```

上述 print 結果就是 _builder 目前的組句,是這種陣列格式(以吳宗憲的詩句為例):
上述 print 結果就是 compositor 目前的組句,是這種陣列格式(以吳宗憲的詩句為例):
```swift
["八月", "中秋", "山林", "", "風吹", "大地", "草枝", ""]
```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

extension Megrez {
/// 分節讀音槽。
public class BlockReadingBuilder {
public class Compositor {
/// 給被丟掉的節點路徑施加的負權重。
private let kDroppedPathScore: Double = -999
/// 該分節讀音槽的游標位置。
Expand Down
Loading

0 comments on commit 6f175eb

Please sign in to comment.