跳转到内容

Oberon/文本

来自 Wikibooks,开放世界中的开放书籍

对于新手来说,令人困惑的是,在现代计算机系统中的文本文件中可以找到三种形式的换行符

  • 在 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.OpenMM 将打开一个查看器。如果存在名为 Example.Text 的文件,则其内容将显示在查看器中。如果不存在此名称的文件,则查看器将为空。可以通过ML 设置插入点,并且可以使用键盘 插入字符。除了 Edit 之外,ETH Oberon 还具有 ET 和 Gadgets 子系统。命令 ET.Open <aFile>Desktops.OpenDoc <aFile> 可用。ETH Oberon 还具有 Hex 模块,该模块提供了一个十六进制编辑器,其命令为 Hex.Open <aFile>

程序化访问文本

[编辑 | 编辑源代码]

可以使用 Texts 模块中的过程来操作文本;对于ETH OberonV5。此外,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() 将信息反序列化到内存中文本的记录结构。

单击超链接以查看定义类型的模块。

在 V2 中

[编辑 | 编辑源代码]
类型 Text
类型 TextDesc 的字段 字段的类型 注释
Texts.Text,指向 Texts.TextDesc 的指针 len LONGINT 文本长度(以字节为单位)。
changed BOOLEAN 标志,指示修订版。
notify Texts.Notifier 指向方法的指针,用于通知对状态更改感兴趣的客户端。
trailer Texts.Piece 指向片段列表中哨兵节点的指针。
pce Texts.Piece 最后找到的片段。
org LONGINT 最后找到的片段中第一个字符的偏移量(在 [0,len) 范围内)。
Texts.Piece
类型 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 指向文本后一个片段的指针。

在 ETH Oberon 中

[编辑 | 编辑源代码]

TextDesc 是 Objects.ObjDesc 的扩展。为创建 TextDesc 而添加的字段与从 ObjDesc 继承的字段通过不同的背景颜色区分。

类型 Text
类型 字段
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 最后找到的片段。
上表中的 Objects.Library
类型 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  
Texts.Piece
类型 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 指针

在 A2 的 Oberon 子系统中

[编辑 | 编辑源代码]

TextDesc 是 Objects.ObjDesc 的扩展。为创建 TextDesc 而添加的字段与从 ObjDesc 继承的字段通过不同的背景颜色区分。

类型 Text
类型 字段
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 最后找到的片段。
上表中的 Objects.Library
类型 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  
Texts.Piece
类型 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 指针

在 V5 中

[编辑 | 编辑源代码]
类型 Text
类型 TextDesc 的字段 字段的类型 注释
Texts.Text,指向一个 Texts.TextDesc 的指针 len INTEGER[3] 文本长度(以字节为单位)。
changed BOOLEAN 标志,指示修订版。
notify Texts.Notifier 指向方法的指针,用于通知对状态更改感兴趣的客户端。
trailer Texts.Piece 指向片段列表中哨兵节点的指针。
pce Texts.Piece 最后找到的片段。
org INTEGER 最后找到的片段中第一个字符的偏移量(在 [0,len) 范围内)。
Texts.Piece
类型 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 指向文本后一个片段的指针。

Texts.FindPiece 和缓存

[编辑 | 编辑源代码]

对于给定的文本 T 和偏移量 pos(在 [0, T.len) 范围内),过程 Texts.FindPiece 的任务是定位包含 pos 的片段。在每次执行时,FindPiece 可以从偏移量 0 开始,并累加片段的长度,直到找到包含 pos 的片段。基于 T.pce 和 T.org 的缓存可以提高效率。当 FindPiece 完成搜索时,指向找到的片段的指针将记录在 T.pce 中;该片段第一个字符的偏移量将记录在 T.org 中。FindPiece 的下一次执行将从该缓存位置开始。由于 FindPiece 的结果通常接近前一个结果,因此此策略避免了从第一个片段的开头重复累加长度。

参考文献

[编辑 | 编辑源代码]
  1. 每种情况都易于显式显示。在具有十六进制编辑器 Hex 的 Oberon 系统中,MM 在 Hex.Open <aFile> 上。在 ETH Oberon 中,行以 CR LF 结尾的文件由 ET.OpenAscii <aFile> 编辑。
  2. 由于 Text 是 Oberon 系统中的基本类型,“Oberon Text”被认为是专有名词。因此,使用大写字母“Text”。
  3. 在 V5 中,唯一整数类型是 INTEGER。参见 V2 中的 LONGINT。
华夏公益教科书