2个不稳定版本
0.2.0 | 2019年11月4日 |
---|---|
0.1.1 | 2019年10月15日 |
0.1.0 |
|
#499 in 文本处理
280KB
6.5K SLoC
glk-rs
此crate提供了实现交互式小说解释器Glk I/O接口的绑定。该标准由glulxe解释器等使用。
它导出C函数、Rust特性和一个示例实现。用户需要为解释器将调用的Glk函数提供实际的实现。
注意
此crate目前只能提供Glk库的能力。
在实现解释器或其他Glk应用程序时,使用Glk库将很有用,但目前此crate无法实现,尽管它可能至少共享一些特质、实用代码或常量。
使用方法
在一个具有处理器的结构体上实现glk::traits::Api
和Glk特质(至少是处理基本功能的Base
;每个Glk模块由一个单独的特质处理),然后调用glk::init(…)
来注册处理器。
/** Dispatch trait for all Glk APIs. Each function returns a
* reference to a trait which will be called for functions on the associated
* Glk module.
*/
pub trait Api {
/** Mandatory Glk API functions. */
fn base(&mut self) -> &mut dyn Base;
/** GLK_MODULE_LINE_ECHO */
fn line_echo(&mut self) -> Option<&mut dyn LineEcho>;
/** GLK_MODULE_LINE_TERMINATORS */
fn line_terminators(&mut self) -> Option<&mut dyn LineTerminators>;
/** GLK_MODULE_UNICODE */
fn unicode(&mut self) -> Option<&mut dyn Unicode>;
/** GLK_MODULE_UNICODE_NORM */
fn unicode_norm(&mut self) -> Option<&mut dyn UnicodeNorm>;
/** GLK_MODULE_IMAGE */
fn image(&mut self) -> Option<&mut dyn Image>;
/** GLK_MODULE_SOUND */
fn sound(&mut self) -> Option<&mut dyn Sound>;
/** GLK_MODULE_SOUND2 */
fn sound2(&mut self) -> Option<&mut dyn Sound2>;
/** GLK_MODULE_HYPERLINKS */
fn hyperlinks(&mut self) -> Option<&mut dyn Hyperlinks>;
/** GLK_MODULE_DATETIME */
fn date_time(&mut self) -> Option<&mut dyn Datetime>;
/** GLK_MODULE_RESOURCE_STREAM */
fn resource_stream(&mut self) -> Option<&mut dyn ResourceStream>;
/** GLK_MODULE_GARGLKTEXT */
fn garglk_text(&mut self) -> Option<&mut dyn garglk::GarGlkText>;
/** GI blorb handler functions */
fn giblorb(&mut self) -> Option<&mut dyn giblorb::Handlers>;
/** GI dispatch handler functions */
fn gidispatch(&mut self) -> Option<&mut dyn gidispatch::Handlers>;
/** Rust Glk extension handler functions */
fn ext(&mut self) -> Option<&mut dyn ext::Handlers>;
}
这些函数可以返回Some(self)
,或者委托给实现给定特质的另一个对象。如果没有实现该模块,则返回None
。
然后将您的应用程序链接到需要glk_
API的任何内容。
请注意,使用glk::init
注册的处理程序是线程本地的,因此请确保从注册glk API处理器的同一线程调用解释器。Glk仅支持单线程解释器。
示例:Toyglk
一个基本的演示Glk实现,使用crossterm作为终端后端。它使用glulxe
crate托管Glulxe解释器。
- 目标是实现Glk标准的完整版本,包括Unicode扩展。
- 仅支持一个窗口:整个终端。
- 行和字符(也是特殊键码)输入。
- 保存和恢复工作。
- 支持Glk样式和GarGlkText RGB颜色。
一些我最喜欢的小说,如《蓝色空洞》和《仿造猴子》可以工作。例如。
$ cargo run --release --example toyglk CounterfeitMonkey.gblorb
...
Can you hear me? >> yes
Good, you're conscious. We're conscious. I've heard urban legends about
synthesis going wrong, one half person getting lost.
Glk类型
glui32
直接映射到u32
,而glsi32
映射到i32
。
不透明的句柄类型(frefid_t
、schanid_t
、strid_t
、winid_t
)表示为不透明类型,可以转换为usize
(或者指针,如果你处于危险状态)。
提供了与C兼容的结构体类型event_t
、glkdate_t
、glktimeval_t
、stream_result_t
。
为了方便使用,为gestalts、事件类型、键码等定义了便捷类型。这些是新类型,它们封装了一个u32
,而不是枚举,以留出扩展(或特殊需求)传递新值的余地。
许可证
根据您的选择,许可协议为以下之一
- Apache License,版本2.0(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
(请注意,内部crate glk-sys
仅在MIT许可证下进行许可,因为它基于glk的文件,这些文件也是以这种许可证授权的)
贡献
除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,根据Apache-2.0许可证的定义,应如上所述双重许可,没有任何额外的条款或条件。
依赖关系
~0–2MB
~37K SLoC