workflow status License Swift Twitter

有效小说核心

这是一个小说文本解析和提供显示事件流的软件包。

关于

这是一个小说引擎。

这可以有效帮助显示小说文字内容。

这个库不包含UI层。它仅提供解析和输出流显示事件。(使用示例: EffectiveNovelReader)

此外,这个库没有针对小说游戏进行优化,因为它不具备 if 条件判断、宏、子程序等功能。

如果你将其用于此类目的,请在应用层每次使用时都进行解析。

演示

演示: EffectiveNovelReader

语法

使用标签来控制它们的显示方式。

这个语法基于 Tyranoscript

语法标签

标签必须用 [] 括起来。

注释时,请在行首添加 #
如果你想使用 #,写 \\#

标签 显示事件 描述
n .newline 换行
tw .tapWait 点击等待
twn .tapWaitAndNewline 点击等待并换行
cl .clear 清除
sleep duration=xxxx .sleep(duration: Double) 睡眠指定的时长。时长单位是毫秒。
delay speed=xxxx .delay(speed: Double) 更改字符显示的延迟速度。速度单位为毫秒。
setDefaultDelay speed=xxxx .setDefaultDelay(speed: Double) 更改默认的字符显示延迟速度。速度单位为毫秒。
resetDelay .resetDelay 重置延迟速度
e .end 停止脚本,小说结束点。

示例小说脚本

# Sample Script
tap waiting and newline[twn]

[cl] cleared text.

very fast stream after this text[delay speed=2][n]

displaying!!!!!!

[resetDelay]reset delay speed.[n]

end. [e]

用法

状态流程

stateDiagram-v2
    direction LR
    [*] --> loadWait
    loadWait --> prepare: load
    prepare --> running: start
    running --> loadWait: finish
    running --> pause: pause
    pause --> running: resume
    running --> loadWait: interrupt
    pause --> loadWait: interrupt
加载中

示例代码

// 1. get `EFNovelController` instance
let controller = EFNovelController()


// 2. load raw novel text
let result: ValidateResult<EFNovelScript, [ValidationError]> = controller.load(rawText: rawText)

let novelScript: EFNovelScript

switch result {
case .valid(let script):
    novelScript = script
case .invalid(let errors):
    print(errors)
    // handle error.
}

// 3. start() and listening stream
controller.start(script: novelScript)
          .sink { event in
              switch event {
              case .character(let char):
                  displayCharacter(char)
              // and any command handling
              }
          }
          .store(in: &cancellables)

// (4.) show text until wait tag
controller.showTextUntilWaitTag()

// (5.) pause stream.
controller.pause()

// (6.) resume from pause
// If you want to start from any index number, you can use `controller.resume(at: 100)`
controller.resume() 

// (7.) interrupt
controller.interrupt()

示例

待办事项

许可证

EffectiveNovelCore 使用 MIT 许可证