即時摘要
出自 MozTW Wiki
內容大綱
簡介
即時摘要是網頁中較常更新的簡要訊息。這類訊息字數不多、作為書籤的標題正好、能提供比固定標題更有用的資訊,並且隨時更新。即時摘要比頁面標題更適合做為書籤標題,因為使用者能藉此更快得知網頁上某部份有用資訊,且網頁也能以此種方式通知使用者更新狀況。
這份文件描述即時摘要的技術細節、現有功能及未來展望。欲知即時摘要的安裝及使用方式,請參考安裝步驟;有關製作即時摘要的方法,請參考建立即時摘要。您也可以參考摘要來源及提供摘要的網頁等範例集。
實例
以下列岀數種網頁類型及其所能提供的即時摘要:
- 拍賣網頁: 物品名稱、目前最高出價、剩餘時間等等。例:「Keroro 鑰匙圈 - NT$ 45 - 1 時 20 分」
- 特價商品: 產品名稱、目前價格、限額。例:「嚼不爛軟糖(包) - 40 元 - 40 包」
- 新聞網站: 頭條消息。例:「運動快報: 增菘瑋洪晨恩加入美國職棒球團」
- 「每日一字」型的網頁: 直接列出當日詞彙/物品/新聞。例:(假設真有每日一字的網站)「猋 ㄅㄧㄠ」;
- 股價資訊: 目前成交價及漲跌。例:「中鋼 30.20 -0.15」
- 投資概況: 基金/股票的投資情形。例:「總金額:$12,130 (+0.3%)」
- 氣象報告: 目前天氣。例:「高雄 晴 28°c ~ 34°c」
當然還有很多種可能,全憑你的想像力 :)
摘要來源
即時摘要可由一額外的摘要文字檔提供 ([wood.com wood.com] 即為一例),也可由現有網頁套用 XSLT 樣式表產生。套用 XSLT 時,其樣式表及適用網頁皆由摘要來源檔 (microsummary generator) 指定。
摘要來源檔中含有一組建立即時摘要的指令,以 XML 方式記載、名稱空間 (namespace) 為 http://www.mozilla.org/microsummaries/0.1。此檔中有一個 <generator> 標籤、內含下列屬性及子元素:
- 一個 name 屬性,標明此來源檔的名稱。例:「蕃薯藤即時頭條」
- 一個 <pages> 子元素,其中含有一個以上的 <include> 或 <exclude> 子元素。<include> (或 <exclude>) 中以正規表示式 (regular expression) 指定可套用 (或不可套用) 此來源檔的網址 URL,欲套用的網址一定要以此明確指定。
- 一個 <template> 元素,內含 XSLT 樣式表,現有網頁套用此樣式表後便產生即時摘要。此樣式表除純文字外亦可產出 HTML 、圖片或其他內容。
[Should a generator also contain an update interval or timeout specifying how often to update microsummaries or when to update them next? How should this interval/timeout be specified? Is it worth enabling complex specifications like "update every five minutes from 9:30am-4pm EST and not at all otherwise" for an NYSE stock quote? Maybe use Cron-notation for specifying update interval?]
以下為即時摘要來源檔的範例:
<?xml version="1.0" encoding="UTF-8"?> <generator xmlns="http://www.mozilla.org/microsummaries/0.1" name="Yahoo! Finance Stock Quote"> <pages> <include>http://finance.yahoo.com/q\?.*s=[a-zA-Z]+</include> </pages> <template> <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:value-of select="substring-before(substring-after(string(id('yfncsubtit')/tbody/tr/td[1]/b), '('), ')')"/> <xsl:text>: </xsl:text> <xsl:value-of select="id('yfncsumtab')/tbody/tr/td/table[3]/tbody/tr[2]/td[1]/table/tbody/tr/td/table/tbody/tr[1]/td[2]/big/b"/> </xsl:template> </xsl:transform> </template> </generator>
指定即時摘要
Firefox 程式、使用者、使用者參觀的網站及其他獨立開發者都該能指定網頁的即時摘要。
Firefox
Firefox 應該內建熱門網站的即時摘要來源。
使用者
使用者應該要能使用即時摘要產生器 (Firefox 內建) 將網頁中某部份指定為即時摘要,過程也應該相當簡單 (例如採用拖放字串、輸入自訂文字等)。摘要產生器的實作時程目前向後順延。
網站
Sites should be able to specify microsummaries by embedding metadata referencing microsummary generators into pages. For example, a site might embed the following <link> element into an HTML page:
<link rel="microsummary" type="application/x.microsummary+xml" href="/index-microsummary.xml">
Or it might embed the following two XML processing instruction into an XML document:
<?microsummary type="application/x.microsummary+xml" href="/index-microsummary.xml"?>
[If a page points to a microsummary generator whose <pages> list does not include the page, should the microsummary service ignore the <pages> list and apply the generator to the page anyway?]
Independent Developers
Independent developers should be able to specify microsummaries by distributing generators that users can acquire from a directory similar to the search engines directory at addons.mozilla.org. Generators should have simple search engine-like installation and management UI and update themselves automatically.
Back-end Implementation
The microsummary service updates microsummaries when they expire and provides an API for front-end code to access microsummaries and be notified when they get updated.
Like the livemarks service, the microsummary service checks every 15 seconds for microsummaries that need updating. If a microsummary needs updating, the service downloads the necessary content (i.e. the page, the generator), processes it to generate an updated microsummary, and stores the updated microsummary in the datastore.
nsIMicrosummaryService
[scriptable, uuid(c5e9c390-beb0-4eb4-90ab-529efc817632)] interface nsIMicrosummaryService : nsISupports { /** * Install the microsummary generator from the resource at the supplied URI. * Callable by content via the addMicrosummaryGenerator() sidebar method. * * @param generatorURI * the URI of the resource providing the generator * */ void addGenerator(in nsIURI generatorURI); /** * Get the set of microsummaries available for a given page. The set * might change after this method returns, since this method will trigger * an asynchronous load of the page in question (if it isn't already loaded) * to see if it references any page-specific microsummaries. * * If the caller passes a bookmark ID, and one of the microsummaries * is the current one for the bookmark, this method will retrieve content * from the datastore for that microsummary, which is useful when callers * want to display a list of microsummaries for a page that isn't loaded, * and they want to display the actual content of the selected microsummary * immediately (rather than after the content is asynchronously loaded). * * @param pageURI * the URI of the page for which to retrieve available microsummaries * * @param bookmarkID (optional) * the ID of the bookmark for which this method is being called * * @returns an nsIMicrosummarySet of nsIMicrosummaries for the given page * */ nsIMicrosummarySet getMicrosummaries(in nsIURI pageURI, in nsISupports bookmarkID); /** * Get the current microsummary for the given bookmark. * * @param bookmarkID * the bookmark for which to get the current microsummary * * @returns the current microsummary for the bookmark, or null * if the bookmark does not have a current microsummary * */ nsIMicrosummary getMicrosummary(in nsISupports bookmarkID); /** * Set the current microsummary for the given bookmark. * * @param bookmarkID * the bookmark for which to set the current microsummary * * @param microsummary * the microsummary to set as the current one * */ void setMicrosummary(in nsISupports bookmarkID, in nsIMicrosummary microsummary); /** * Remove the current microsummary for the given bookmark. * * @param bookmarkID * the bookmark for which to remove the current microsummary * */ void removeMicrosummary(in nsISupports bookmarkID); /** * Whether or not the given bookmark has a current microsummary. * * @param bookmarkID * the bookmark for which to set the current microsummary * * @returns a boolean representing whether or not the given bookmark * has a current microsummary * */ boolean hasMicrosummary(in nsISupports bookmarkID); /** * Whether or not the given microsummary is the current microsummary * for the given bookmark. * * @param bookmarkID * the bookmark to check * * @param microsummary * the microsummary to check * * @returns whether or not the microsummary is the current one * for the bookmark * */ boolean isMicrosummary(in nsISupports bookmarkID, in nsIMicrosummary microsummary); };
nsIMicrosummaryObserver
[scriptable, uuid(cb284a83-1ca5-4000-9841-ce345ce84915)] interface nsIMicrosummaryObserver : nsISupports { /** * Called when an observed microsummary updates its content. * Since an observer might watch multiple microsummaries at the same time, * the microsummary whose content has been updated gets passed * to this handler. * XXX Should this be onContentUpdated? * * @param microsummary * the microsummary whose content has just been updated * */ void onContentLoaded(in nsIMicrosummary microsummary); /** * Called when an element is appended to a microsummary set. * XXX Should this be in a separate nsICollectionObserver interface? * * @param microsummary * the microsummary that has just been appended to the set * */ void onElementAppended(in nsIMicrosummary microsummary); };
nsIMicrosummary
[scriptable, uuid(f9d1a73c-e147-46f3-ba61-4f0bd33f5d47)] interface nsIMicrosummary : nsISupports { // the URI of the page being summarized readonly attribute nsIURI pageURI; // The URI of the generator that generates this microsummary. readonly attribute nsIURI generatorURI; // The generator that generates this microsummary. // Since generators can be remote resources, this may not always be available. attribute nsIMicrosummaryGenerator generator; // The content of the microsummary. // Since generators and pages can be remote resources, and we need them // to generate the content, this may not always be available. readonly attribute AString content; /** * Add a microsummary observer to this microsummary. * * @param observer * the microsummary observer to add * */ void addObserver(in nsIMicrosummaryObserver observer); /** * Remove a microsummary observer from this microsummary. * * @param observer * the microsummary observer to remove * */ void removeObserver(in nsIMicrosummaryObserver observer); /** * Update the microsummary, first loading its generator and page content * as necessary. If you want know when a microsummary finishes updating, * add an observer before calling this method. * */ void update(); };
nsIMicrosummarySet
[scriptable, uuid(7111e88d-fecd-4b17-b7a9-1fa74e23153f)] interface nsIMicrosummarySet : nsISupports { /** * Add a microsummary observer to this microsummary set. Adding an observer * to a set is the equivalent of adding it to each constituent microsummary. * * @param observer * the microsummary observer to add * */ void addObserver(in nsIMicrosummaryObserver observer); /** * Remove a microsummary observer from this microsummary. * * @param observer * the microsummary observer to remove * */ void removeObserver(in nsIMicrosummaryObserver observer); /** * Retrieve a enumerator of microsummaries in the set. * * @returns an enumerator of nsIMicrosummary objects * */ nsISimpleEnumerator Enumerate(); };
nsIMicrosummaryGenerator
[scriptable, uuid(ff3eba15-81de-4c24-bfcf-c8180dc3c00a)] interface nsIMicrosummaryGenerator : nsISupports { // An arbitrary descriptive name for this microsummary generator. readonly attribute AUTF8String name; // The canonical location and unique identifier of the generator. // It tells us where the generator comes from and where to go for updates. // For generators referenced by web pages via <link> tags, this URI // is the one specified by the tag. For generators installed by users, // this URI is the remote location from which we installed the generator. // For generators bundled with the browser, this URI is a reference // to the latest version of this generator available on Mozilla Add-ons. readonly attribute nsIURI uri; // Whether or not this generator needs page content to generate // a microsummary. Microsummaries generated by XSLT templates need page // content, while those which represent the actual microsummary content // do not. readonly attribute boolean needsPageContent; /** * Generate a microsummary by processing the generator template * against the page content. If a generator doesn't need content, * pass null as the parameter to this method. * * XXX In the future, this should support returning rich text content, * so perhaps we should make it return a DOM node now and have the caller * convert that to text if it doesn't support rich content. * * @param pageContent * the content of the page being summarized * @returns the text result of processing the template * */ AString generateMicrosummary(in nsIDOMNode aPageContent); };
Datastore
In Firefox 2 the microsummary service stores microsummaries and their meta-data as properties of the RDF resources that represent bookmarks in the bookmarks data source. In Firefox 3 the service stores the same date as annotations in the annotations datastore via the annotation service. Microsummary data includes:
- bookmarks/generatedTitle: the content of the microsummary (i.e. what Firefox displays to users);
- microsummary/generatorURI: the canonical source of the generator;
- microsummary/expiration: the time in microseconds since the epoch at which the microsummary will expire.
Front-end Implementation
The initial integration points are the bookmark properties dialog and the bookmarks toolbar.
Since microsummaries can contain HTML and other unsafe content, they should be inserted into the UI inside untrusted iframes wherever they appear.
Bookmark Properties Dialog
The bookmark properties dialog lets the user choose to display a microsummary for the bookmark. If multiple microsummaries are available, the dialog lets users choose between them. The dialog retrieves microsummaries via nsIMicrosummaryService.getMicrosummaries() and updates the datastore per the user's selection via nsIMicrosummaryService.setMicrosummary() and nsIMicrosummaryService.removeMicrosummary().
Bookmarks Toolbar
When a microsummary is set for a bookmarked URI, the bookmarks toolbar displays the microsummary instead of the page title as the label of the bookmark. When the microsummary service updates the microsummary, the bookmarks toolbar updates the label. Once the microsummary service has updated the microsummary, the bookmarks toolbar may display some UI indicating that an update is underway (f.e. it may replace the favicon with a throbber for the duration of the update).
The toolbar displays microsummaries via a template rule that applies only to bookmarks with microsummaries. The toolbar controller registers itself with the microsummary service as a microsummary observer in order to be notified when a microsummary gets updated.
[The mechanism by which the bookmarks controller identifies and observes microsummary bookmarks should be extensible (i.e. a generic "metadata observer") so that future code (both native and extensions) can register additional bookmark types with metadata whose observation triggers activity.]
Additional integration points may be defined in the future (f.e. microsummaries might be displayed as tab labels).
Standardization
The microsummary generator dialect and the use of the <link rel> element to specify microsummaries should be standardized by appropriate bodies. Appropriate bodies for standardization may include the microformats group and the WHATWG.