萬盛學電腦網

 萬盛學電腦網 >> 網頁制作 >> 腳本Html教程 >> 使用Tiger交叉引用HTML

使用Tiger交叉引用HTML

 作為一種標記語言,HTML 在互聯網中的廣泛采用佐證了它在發布內容方面的實用性是無與倫比的。HTML 向結構內容提供各種標記,其中包括處於不同級的標題標記,例如從 <h1> 到 <h6>,或定義列表的標記,例如 <ul> 或 <ol>。HTML 文檔是簡單的文本文檔,可以使用任何編輯器加以創建或從當前辦公產品套件中導出的文檔進行創建。HTML 缺乏對一些項目(例如章節、圖、表格)交叉引用的真正支持。要是這些項目不被移動到不同的位置、被添加內容或完全被移除,對於此類項目維持有序的編碼制加上確保對這些項目從文檔中的任意其他位置引用保持最新超出了 HTML 的范圍。然而,此類功能很容易獲得,特別當在多文檔間管理此類引用時尤為如此。本文將介紹一款名為 Xref 的 Java 工具,它提供此類功能以及其他一些功能。該工具演示了新的開發簡易性功能(已經添加到即將發行的 J2SE 5.0 發行版“Tiger”中)的好處。本文所使用的主要功能有通用性、類型安全枚舉和其他語言擴展,像為收集而提供的增強 for 循環。

  我通常使用 HTML 文檔來管理信息。這種頁面描述語言的使用非常簡單,將有用數據存儲在 web 頁面中非常方便 —— 在堆之間沒有閒置的文檔和文檔丟失,這些情況再也不會出現了。假定更為復雜的 HTML 文檔是有序的(<ol>)或無序的(<ul>),通常使用像從 <h1> 到 <h6> 的標題標記(盡管後面的標題標記不經常使用)或列表加以構造。此外,在文檔中其他結構性元素之間還可能存在圖或表格。通常像章節標題、表格和圖這樣的元素得到分配給能夠引用它們的編號,例如:

  ......

  3. 配置代理服務器

  ......

  3.1 設置服務器

  ......

  3.2 配置代理規則

  ......

  在文本中的某些位置上我們可以找到類似

  ......

  有關設置代理服務器的更多信息,請參見第 3.1 章。

  ......

  使用圖和表格的工作原理相同。此時,問題變得明朗了: 如果在現有結構之間插入某些內容,例如一個新的章節 3.1,所有後面的章節標題必須重新編號。除此之外,對章節編號的引用也必須修改。這顯然既煩人 —— 更糟糕的是 —— 又容易發生錯誤,特別是如果此類編號和引用跨越多個構成實際文檔的 HTML 文件,這種問題尤為突出。

  在您辦公套件中的日常文字處理程序提供了另一個宜人的功能: 自動創建目錄或圖列表和表格列表。在 HTML 中,此類列表必須手動創建和維護。這還不是我們通常樂於做的事情。

  本文中描述的 Xref 工具對這些問題提供了一個簡單的解決方案以及一些附加功能。除此之外,該工具還是如何高效利用一些 J2SE 5.0 新功能的有用示例。

  當然 Xref 本身可以以多種方式簡化 HTML 內容的創建,其主要目標是 web 創作區域,其中創建了跨越一個或多個 HTML 文檔的文本。該區域在幾種復雜性級別上受到支持。

  在其應用程序的最簡單形式中,使用 HTML 標題標記進行構造的現有文檔可以被處理,且標題將被自動編號。這一結果在不進行任何更改的情況下獲得。如果需要,帶有指向所有章節的所有章節和超鏈接目錄可以通過向文檔簡單添加一個新標記而生成。這是惟一的必要更改。

在 HTML 文檔中,應用程序的更復雜形式要求多項更改: 通過添加新的 HTML 標記,對於其他像圖或表格這樣的對象可以獲得另外的自動編號。再者,還支持列表(圖列表或表格列表)的創建

  完整的 Xref 功能通過使用引用功能實施。使用另一個新標記 (<ref>)對任何被添加標簽對象(例如章節標題、圖或表格)的引用可以在文檔內創建,且將正確的編號插入在相同位置。除此之外,指向被引用的對象的超鏈接也將被創建。

  所有在本文中描述的源代碼和帶有編譯後的類的 JAR 文件可下載 —— 請參見 參考資料 部分。

  盡管許多流行的浏覽器還不支持本文中描述的一些功能,但它們還可以在 CSS2 中所指定的計數器基礎上實現 (請參見 參考資料 部分)。這些計數器還可以被用於自動編號,例如章節標題的自動編號。在本文描述的工具更加專注於交叉引用任務,並提供除 CSS2 計數器之外的幾項功能:

  像圖和表格(以及其他任意序列)這類項目的編號基於新的偽 HTML 標記,直接插入到文檔內。

  包括對被編號項目(像章節或圖)的引用解析、針對目標的指定錨點的創建和 <a href> 這樣的引用在內的自動交叉引用功能。

  在文檔中,包括對所引用項目的 <a href> 引用在內的交叉引用列表的自動生成。

  跨文檔功能(編號和引用能跨越多個文檔 )。

  除此之外,針對 J2SE 5.0 發行版的一些新功能還旨在成為展示應用程序。

  針對交叉引用進程的標記

  已經對三個新標記加以定義以便達到該工具的目的:

  標記 <lab name="myLabel" type="figure">...</lab>:

  該標記在隨後即被引用的 HTML 文檔中設置給定類型的標簽。該標簽還接受可選的 text 屬性,用該屬性可以顯式設置用於在自動生成列表(默認時,在開始標記和結束 <lab> 標記之間包含的文本被用於這一目的 )中的標簽的文本。關於這方面的更多詳細信息稍後加以介紹。

  標記 <ref name="MainData" type="table">...</ref>:

  該標記通過其名稱引用給定類型的標簽。

  標記 <list type="chapter"></list>:

  該標記將已知標簽的自動生成列表插入到文檔中,例如目錄或圖列表。

  除此之外,現有標題標記從 <h1> 到 <h6> 已經被擴展以便接受均為可選的附加 name 和 text 屬性。這一點非常有用,因為這些標題標記對於 HTML 已經是現有的構造機制,而不是針對每個章節標題進行定義的額外 <lab> 標記,依賴於現有標記更有用。因此基本上不用

  <lab name="Chapter1" type="chapter">The first chapter</lab>

  而是使用

  <h1 name="Chapter1">The first chapter</h1>

  這樣提供了一個極其重要的額外好處: 如果使用 HTML 標題標記構造目錄的現有文檔需要使用該工具進行處理,則不需要對文檔做實際修改來獲得章節標題的自動編號! 如果沒有出現此類屬性,XrefParser 對標題標記的 name 屬性使用偽值。標題的編號惟一建立在文檔結構基礎上,而不是建立在標題標記的屬性,因此,此類未修改的文檔要使用正確的標題編號加以重寫。當然,不可能添加指向此類標題的 <ref> 引用。然而此類附加信息根據需要可以被插入到現有文檔中 —— 因此絕對不必為了獲得該工具的某些好處而重寫 HTML 文檔。但是,要獲得該工具的全部優點需要一定的重寫.

在此給出幾項注解:

  使用任何標准的文本編輯器可以將這些標記插入到文檔中。HTML 編輯器還支持 HTML 標記的插入(Netscape 編寫器是提供該項功能的編輯器的一個示例 )。

  在此采用的標記名稱無可否認部分借用了 Leslie Lamport 的 LaTeX 宏軟件包,該軟件包建立在 Donald Knuth 極好的文本編輯器 TeX 之上。這可能是 sun 用於創建技術和科學文檔的 最好 工具,特別是如果這些標記名稱包含許多公式和等式的情況下尤為如此。

  我們當然可以定義任何 HTML 標記的編號並將它們插入文檔中 —— 這並不意味著沒有這些標記浏覽器就會變得重要了。幸運的是,浏覽器不太關心這些標記而只是忽略它們。這樣實際上很好,因為這意味著這些標記不在源文檔中顯示。在由該工具創建的目標文檔中,已經將適當的文本(標題、表格或圖編號 )添加到標記所指定的位置。

  我們此處使用的 org.htmlparser.Parser 不 忽略這些標記當然是個好消息。事實上,它為每個標記提供了 org.htmlparser.lexer.nodes.TagNode 的一個實例,且 getRawTagName() 方法提供了標記名稱作為可用於進一步處理的字符串。

  XrefParser 不僅使用正確的編號解析所有的引用,而且還針對引用目標插入 HTML 錨點 ( <a name> ... </a> )和對引用提供超鏈接,因此導航得到充分的簡化。還在由 <list> 標記所創建的列表內為每個項目創建超鏈接

  對於所引入的 <ref> 和 <list> 標記,結束標記並不是在所有情況中都是必須的。但是,它是使用結束標記兼容 xHTML 是一個很好樣式. 對於 <lab>標記,必須使這些結束標記顧及文本數據的自動收集。

  技術實現

  此處所選擇的方法是定義被添加到 HTML 文檔中的一些新 HTML 標記,並擴展帶有附加屬性的標准標題標記 <h1> 到 <h6> 。此類 HTML 文檔使用 HTMLParser Sourceforge 項目的一部分 org.htmlparser.Parser 的實例加以處理。(參見 參考資料 部分 )。這個類提供一些功能來解析 HTML 文檔並以樹型結構的形式提供文檔信息。該樹型結構基本上由三個不同的節點元素組成:

  org.htmlparser.lexer.nodes.TagNode: 一個含有關於解析器所遇到 HTML 標記的所有信息的節點。

  org.htmlparser.lexer.nodes.TagNode: 一個含有純 HTML 文本的節點。

  org.htmlparser.lexer.nodes.TagNode: 一個含有關於解析器所遇到 HTML 注釋的所有信息的節點。

  該樹型結構可以被遞歸處理,並根據所遇到節點的類型采取適當的操作。很明顯,為達到 Xref 工具的目的,由於我們正尋找特定的標記來觸發一定操作,TagNode 是最相關的節點,但是 String

copyright © 萬盛學電腦網 all rights reserved