Oberon/文本
对于新手来说,令人困惑的是,在现代计算机系统中的文本文件中可以找到三种形式的换行符。
- 在 Oberon 和一些其他系统(最突出的例子是 Classic MacOS)中,一行文本以回车符字符结尾,表示为 CR。
- 在类 Unix和一些其他系统中,一行文本以换行符结尾,表示为 LF。
- 在 DOS、Microsoft Windows 和一些其他系统中,一行文本以两个字符 CR 和 LF 结尾。
这种多样性在 Oberon 中并不构成困难;大多数 Oberon 系统允许使用任何这些换行符进行方便的编辑。[1]
同样令新手感到困惑的是,Oberon 文本[2]乍一看似乎只不过是一个包含一系列ASCII字符的纯文本。然而,Oberon 中的文本是在 Text 模块中定义的一种类型。这种类型的文本是一系列字符,包括非打印字符。文本中的字符可以具有属性,包括字体、大小和颜色。此外,文本可以包含非字符对象;例如图像或超链接。因此,两个显示的文档(一个是 Oberon 文本,另一个是 HTML 文本)可以具有相同的外观和相同的链接行为。
每个 Oberon 系统都有一个 Edit 模块。如果 Edit.Open Example.Text
几乎出现在屏幕上的任何位置,则对 Edit.Open
的MM 将打开一个查看器。如果存在名为 Example.Text 的文件,则其内容将显示在查看器中。如果不存在此名称的文件,则查看器将为空。可以通过ML 设置插入点,并且可以使用键盘 插入字符。除了 Edit 之外,ETH Oberon 还具有 ET 和 Gadgets 子系统。命令 ET.Open <aFile>
和 Desktops.OpenDoc <aFile>
可用。ETH Oberon 还具有 Hex 模块,该模块提供了一个十六进制编辑器,其命令为 Hex.Open <aFile>
。
可以使用 Texts 模块中的过程来操作文本;对于ETH Oberon 和V5。此外,DEFINITION Texts中也总结了 ETH Oberon 的信息。
要以编程方式读取文本,会在指定偏移量的文本上打开一个称为 Reader 的 RECORD。(Reader 是一个 RECORD;而不是一个过程。)在 Reader 打开后,Read(reader, ch) 过程每次执行时都会检索一个字符,如 ETH Oberon 中的这段代码片段所示。
VAR T: Texts.Text; R: Texts.Reader; ch: CHAR; BEGIN NEW(T); Texts.Open(T, “Texts.Mod“); Texts.OpenReader(R, T, 0); Texts.Read(R, ch); WHILE ~R.eot DO Out.Char(ch); Texts.Read(R, ch) END END
字符的字体在 Reader 的 Objects.Library 中引用。Reader 还具有字段 col(字符的颜色)和 voff(字符的垂直偏移量)。执行 Read(reader, ch) 后,新读取的字符可在 ch 中获得,属性位于 reader 的组件中。这假设读取的对象是字符,如 (reader.lib IS Fonts.Font) 为 TRUE 所证明的那样。Read() 的每次执行都会使 reader 在文本中前进一个字符,直到到达末尾并且 reader.eot 变为 TRUE。
这些表显示了内存中表示文本的记录的结构。当 Texts.Store() 将文本记录到文件(用于存储介质)中时,记录结构中的信息会被序列化。在反向过程中,Texts.Load() 将信息反序列化到内存中文本的记录结构。
单击超链接以查看定义类型的模块。
类型 | TextDesc 的字段 | 字段的类型 | 注释 |
---|---|---|---|
Texts.Text,指向 Texts.TextDesc 的指针 | len | LONGINT | 文本长度(以字节为单位)。 |
changed | BOOLEAN | 标志,指示修订版。 | |
notify | Texts.Notifier | 指向方法的指针,用于通知对状态更改感兴趣的客户端。 | |
trailer | Texts.Piece | 指向片段列表中哨兵节点的指针。 | |
pce | Texts.Piece | 最后找到的片段。 | |
org | LONGINT | 最后找到的片段中第一个字符的偏移量(在 [0,len) 范围内)。 |
类型 | PieceDesc 的字段 | 字段的类型 | 注释 |
---|---|---|---|
Texts.Piece,指向 Texts.PieceDesc 的指针 | f | Files.File | 指向文件的指针。 |
off | LONGINT | 文本中片段中第一个字符的整数偏移量。 | |
len | LONGINT | 片段中的字节数。 | |
fnt | Fonts.Font | 指向字体的指针。 | |
col | INTEGER | ||
voff | INTEGER | 字符的垂直偏移量(以像素为单位)。 | |
prev | Texts.Piece | 指向文本前一个片段的指针。 | |
next | Texts.Piece | 指向文本后一个片段的指针。 |
TextDesc 是 Objects.ObjDesc 的扩展。为创建 TextDesc 而添加的字段与从 ObjDesc 继承的字段通过不同的背景颜色区分。
类型 | 字段 TextDesc |
字段的类型 | 注释 |
---|---|---|---|
Texts.Text,指向 Texts.TextDesc 的指针 | stamp | LONGINT | 整数 |
dlink | Objects.Object | 指针 | |
slink | Objects.Object | 指针 | |
lib | Objects.Library | 指针 | |
ref | INTEGER | ||
handle | Objects.Handler | 指针 | |
len | LONGINT | 文本长度。 | |
obs | Objects.Library | 指针 | |
trailer | Texts.Piece | 指向片段列表中哨兵节点的指针。 | |
org | LONGINT | 最后找到的片段中第一个字符的偏移量(在 [0,len) 范围内)。 | |
pce | Texts.Piece | 最后找到的片段。 |
类型 | LibDesc 的字段 | 字段的类型 | 注释 |
---|---|---|---|
Objects.Library,指向 LibDesc 的指针 | next | Objects.Library | 指针 |
ind | Objects.Index | 指针 | |
f | Files.File | 指针 | |
R | Files.Rider | 指针 | |
name | Objects.Name | ||
dict | Objects.Dictionary | 指针 | |
maxref | INTEGER | ||
GName | POINTER |
类型 | PieceDesc 的字段 | 字段的类型 | 注释 |
---|---|---|---|
Texts.Piece,指向 Texts.PieceDesc 的指针 | f | Files.File | 指针 |
off | LONGINT | 整数 | |
len | LONGINT | ||
obj | Objects.Object | 指针 | |
lib | Objects.Library | 指针 | |
ref | INTEGER | ||
col | SHORTINT | ||
voff | SHORTINT | ||
prev | Piece | 指针 | |
next | Piece | 指针 |
TextDesc 是 Objects.ObjDesc 的扩展。为创建 TextDesc 而添加的字段与从 ObjDesc 继承的字段通过不同的背景颜色区分。
类型 | 字段 TextDesc |
字段的类型 | 注释 |
---|---|---|---|
Texts.Text,指向 Texts.TextDesc 的指针 | stamp | LONGINT | 整数 |
dlink | Objects.Object | 指针 | |
slink | Objects.Object | 指针 | |
lib | Objects.Library | 指针 | |
ref | INTEGER | ||
handle | Objects.Handler | 指针 | |
len | LONGINT | 文本长度。 | |
obs | Objects.Library | 指针 | |
trailer | Texts.Piece | 指向片段列表中哨兵节点的指针。 | |
org | LONGINT | 最后找到的片段中第一个字符的偏移量(在 [0,len) 范围内)。 | |
pce | Texts.Piece | 最后找到的片段。 |
类型 | LibDesc 的字段 | 字段的类型 | 注释 |
---|---|---|---|
Objects.Library,指向 LibDesc 的指针 | next | Objects.Library | 指针 |
ind | Objects.Index | 指针 | |
f | Files.File | 指针 | |
R | Files.Rider | 指针 | |
name | Objects.Name | ||
dict | Objects.Dictionary | 指针 | |
maxref | INTEGER | ||
GName | POINTER |
类型 | PieceDesc 的字段 | 字段的类型 | 注释 |
---|---|---|---|
Texts.Piece,指向一个 Texts.PieceDesc 的指针 | f | Files.File | 指针 |
off | LONGINT | 整数 | |
len | LONGINT | ||
obj | Objects.Object | 指针 | |
lib | Objects.Library | 指针 | |
ref | INTEGER | ||
col | SHORTINT | ||
voff | SHORTINT | ||
prev | Piece | 指针 | |
next | Piece | 指针 |
类型 | TextDesc 的字段 | 字段的类型 | 注释 |
---|---|---|---|
Texts.Text,指向一个 Texts.TextDesc 的指针 | len | INTEGER[3] | 文本长度(以字节为单位)。 |
changed | BOOLEAN | 标志,指示修订版。 | |
notify | Texts.Notifier | 指向方法的指针,用于通知对状态更改感兴趣的客户端。 | |
trailer | Texts.Piece | 指向片段列表中哨兵节点的指针。 | |
pce | Texts.Piece | 最后找到的片段。 | |
org | INTEGER | 最后找到的片段中第一个字符的偏移量(在 [0,len) 范围内)。 |
类型 | PieceDesc 的字段 | 字段的类型 | 注释 |
---|---|---|---|
Texts.Piece,指向一个 Texts.PieceDesc 的指针 | f | Files.File | 指向文件的指针。 |
off | INTEGER | 文本中片段中第一个字符的整数偏移量。 | |
len | INTEGER | 片段中的字节数。 | |
fnt | Fonts.Font | 指向字体的指针。 | |
col | INTEGER | ||
voff | INTEGER | 字符的垂直偏移量(以像素为单位)。 | |
prev | Texts.Piece | 指向文本前一个片段的指针。 | |
next | Texts.Piece | 指向文本后一个片段的指针。 |
对于给定的文本 T 和偏移量 pos(在 [0, T.len) 范围内),过程 Texts.FindPiece 的任务是定位包含 pos 的片段。在每次执行时,FindPiece 可以从偏移量 0 开始,并累加片段的长度,直到找到包含 pos 的片段。基于 T.pce 和 T.org 的缓存可以提高效率。当 FindPiece 完成搜索时,指向找到的片段的指针将记录在 T.pce 中;该片段第一个字符的偏移量将记录在 T.org 中。FindPiece 的下一次执行将从该缓存位置开始。由于 FindPiece 的结果通常接近前一个结果,因此此策略避免了从第一个片段的开头重复累加长度。