跳轉到內容

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。
華夏公益教科書