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 的結果通常接近前一個結果,因此此策略避免了從第一個片段的開頭重複累加長度。