平台會定義一些基礎的內容類型,如:純文字和 XML。這些內容類型定義的方式,與由任何其他外掛程式所提供的方式相同。我們會查看平台如何定義某些內容類型,以便更加瞭解內容類型的組織架構。
外掛程式在延伸點 org.eclipse.core.runtime.contentTypes 提供延伸來定義內容類型。
在這個延伸規格中,外掛程式會為內容類型指定簡單的 ID 和名稱(完整的 ID 一律是簡單的 ID,前面加上現行名稱空間)。
下列片段顯示 org.eclipse.core.runtime.text
內容類型構成要素修剪過的版本:
<extension point="org.eclipse.core.runtime.contentTypes"> <content-type id="text" name="%textContentTypeName"> file-extensions="txt"> <describer class="org.eclipse.core.internal.content.TextContentDescriber"/> </content-type> ...
file-extensions
屬性會定義與內容類型相關聯的副檔名(在本例中為 ".txt")。file-names
屬性(本例未使用)可建立完整名稱的關聯性。在執行內容類型偵測和說明時,平台會考量這兩個屬性(如果用戶端提供了檔案名稱)。
describer
元素是用來定義內容類型的內容描述子。
如果有任何可供識別的性質可進行自動內容類型偵測,或是屬於內容類型的資料中有任何有趣的內容,
則內容類型應該提供內容描述子。如果是 org.eclipse.core.runtime.text
,
則無法只是查看內容就能了解內容類型。
不過,文字串流之前可以附加位元組順序標記,這是用戶端可能有興趣了解的內容,
因此這保證是一個內容描述子。
描述子是 IContentDescriber 或 ITextContentDescriber 的實作。 後者是前者的特殊類型,其必須由文字導向內容類型的描述子所實作。不管內容類型的本質為何, 描述子都有兩個責任:協助判斷其內容類型對給定的資料串流是否適用, 以及從可能屬於其內容類型的資料串流中擷取有興趣的內容。
每當平台嘗試判斷特定資料串流的內容類型或說明其內容時,都會呼叫方法 describe(stream, description)。只有在要求偵測時,說明才是 null
。
否則,描述子應該以任何可透過讀取串流找到的內容(且只有這些內容),嘗試填入內容說明。內容類型標記應該用來宣告具有預設值的任何內容(比方說,org.eclipse.core.runtime.xml
會宣告 big5 作為預設 charset)。
在執行其責任時,會希望內容描述子儘可能快速執行。必須讀取的資料串流越少越好。同時,也會希望外掛程式啟動時能夠免除在套件中宣告內容描述子實作(請參閱 Eclipse-AutoStart 軟體組 Manifest 標頭)。 由於在起始設定內容類型組織架構時會建立所有描述子的實例,無法符合這項需求會導致過早啟動,而必須加以避免。如果會觸發啟動對應的外掛程式,平台的進一步實作可能會拒絕建立描述子的實例。
內容類型在本質上是階層式的。這允許新的內容類型能輕易使用更一般化的內容類型屬性或行為。 比方說,XML 資料的內容類型會視為文字內容類型的子項:
<content-type id="xml" name="%xmlContentTypeName" base-type="org.eclipse.core.runtime.text" file-extensions="xml"> <describer class="org.eclipse.core.internal.content.XMLContentDescriber"/> <property name="charset" default="big5"/> </content-type>
XML 檔會視為一種文字檔,因此任何適用於後者的特性也應適用於前者。
請注意,XML 內容類型會置換數個原來定義在 Text 內容類型中的內容類型屬性,
如:檔案關聯和描述子實作。同時,這個內容類型也會宣告
charset
內容的預設內容值。這表示在視為屬於 XML 內容類型之資料串流的內容說明期間,
如果描述子未填入 charset 內容,平台會將它設為 "big5"。
在另一個範例中,org.eclipse.ant.core.antBuildFile
內容類型(用於 Ant 建置 Script)會繼承 XML 內容類型:
<content-type
id="antBuildFile"
name="%antBuildFileContentType.name"
base-type="org.eclipse.core.runtime.xml"
file-names="build.xml"
file-extensions="macrodef,ent,xml">
<describer
class="org.eclipse.ant.internal.core.contentDescriber.AntBuildfileContentDescriber">
</describer>
</content-type>
請注意,charset 內容的預設值是繼承而來的。您可以重新宣告並使用空字串作為值,來取消繼承的內容或描述子。
新的檔案關聯可以加入現有的內容類型中。比方說,
「資源」外掛程式會使 org.eclipse.core.runtime.xml
與 ".project" 檔相關聯:
<extension point="org.eclipse.core.runtime.contentTypes"> <file-association content-type="org.eclipse.core.runtime.xml" file-names=".project"/> ...
由於 Eclipse 可繼承的本質,外掛程式根據的內容類型可能無法用於給定的產品配置中。這可以利用建立內容類型的別名來解決。內容類型別名是一個位置保留區,
用於另一個無法保證其可用性的偏好內容類型。比方說,
執行時期會宣告 Java Development Tooling (org.eclipse.jdt.core.javaProperties
) 所提供之 Java 內容的內容類型別名 (org.eclipse.core.runtime.properties
):
<!-- 用於設定 JDT 之正式類型的位置保留區無法使用 -->
<content-type id="properties" name="%propertiesContentTypeName"
base-type="org.eclipse.core.runtime.text"
alias-for="org.eclipse.jdt.core.javaProperties"
file-extensions="properties">
<property name="charset" default="ISO-8859-1"/>
</content-type>
這會提供外掛程式,其中含有可參照的位置保留區,不管偏好的內容類型可用與否。如果可用,別名內容類型不會出現在內容類型型錄中, 且其任何參照都會解譯成目標內容類型的參照。如果不可用,則會使用別名作為普通的內容類型。