API dostępu do danych z kanałów
Firefox 2 oraz Thunderbird 2 wprowadzają serię interfejsów, które pozwalają programistom rozszerzeń w łatwy sposób uzyskiwać dostęp do kanałów RSS i Atom.
Interfejsy kanałów
-
nsIFeed
- Reprezentuje kanał RSS lub Atom.
-
nsIFeedContainer
- Bazowa klasa, z której dziedziczy kilka interfejsów związanych z kanałami.
-
nsIFeedElementBase
- Bazowa klasa, z której dziedziczy kilka interfejsów związanych z kanałami.
-
nsIFeedEntry
- Reprezentuje pojedynczy wpis kanału RSS lub Atom.
-
nsIFeedGenerator
- Opisuje software, za pomocą którego wygenerowano kanał RSS lub Atom.
-
nsIFeedPerson
- Reprezentuje osobę. Zawiera imię oraz nazwisko osoby, jej adres email oraz adres jej strony domowej.
-
nsIFeedProcessor
- Parsuje kanały RSS oraz Atom.
-
nsIFeedProgressListener
- Zaimplementowane przez program chcący parsować kanały RSS lub Atom w celu otrzymywania wiadomości podczas procesu parsowania.
-
nsIFeedResult
- Opisuje rezultat parsowania kanału.
-
nsIFeedResultListener
- Zaimplementowane przez program chcący parsować kanały RSS lub Atom w celu otrzymywania potwierdzenia ukończenia procesu prasowania.
-
nsIFeedTextConstruct
- Reprezentuje tekst w wątku; zawiera funkcje pozwalające na pobranie danego tekstu wyłącznie jako tekst lub HTML.
-
nsIScriptableUnescapeHTML
- Klasa użytkowa przywracająca ciągi znaków HTML.
Przykład: Czytanie kanału z sieci
Bardzo łatwo można odczytać oraz parsować kanał. Użyj XMLHttpRequest
by pobrać kanał, potem przekaż jego łańcuch do nsIFeedProcessor
w celu przetworzenia.
Pobieranie kanału oraz wysyłanie go do parsowania może zostać zrobione za pomocą kodu podobnego do przedstawionego poniżej:
fetch: function(feedUrl) { var httpRequest = null; function infoReceived() { var data = httpRequest.responseText; var ioService = Components.classes['@mozilla.org/network/io-service;1'] .getService(Components.interfaces.nsIIOService); var uri = ioService.newURI(feedUrl, null, null); if (data.length) { var parser = Components.classes["@mozilla.org/feed-processor;1"] .createInstance(Components.interfaces.nsIFeedProcessor); var listener = new FeedTestResultListener(); try { parser.listener = listener; parser.parseFromString(data, uri); } catch(e) { alert("Error parsing feed."); } } } httpRequest = new XMLHttpRequest(); httpRequest.open("GET", feedUrl, true); try { httpRequest.onload = infoReceived; httpRequest.send(null); } catch(e) { alert(e); } }
Interfejs nsIFeedProcessor
pozwala na parsowanie danych kanału z kilku możliwych źródeł; w tym przypadku ładujemy dokument do łańcucha, a następnie parsujemy go za pomocą metody parseFromString()
. Można też parsować go z pliku za pomocą parseFromStream()
, lub też bezpośrednio z adresu za pomocą parseAsync()
.
Właściwe parsowanie kanału dokonywane jest za pomocą metody nazywanej handleResult()
na obiekcie FeedTestResultListener
. Kod wygląda następująco:
FeedTestResultListener.prototype = { handleResult: function(result) { var feed = result.doc; feed.QueryInterface(Components.interfaces.nsIFeed); // Otwórz nowe okno var win = window.open("", "FeedTest_Window"); var doc = win.document; doc.open(); // Zapisz nagłówek HTML oraz tytuł strony doc.write("<html><head><title>Feed: " + feed.title.text + "</title></head><body>"); doc.write("<h1>" + feed.title.text + "</h1><p>"); var itemArray = feed.items; var numItems = itemArray.length; // Zapisz informacje zawartą w artykule if (!numItems) { doc.write("<i>No news is good news!</i>"); } else { var i; var theEntry; var theUrl; var info; for (i=0; i<numItems; i++) { theEntry = itemArray.queryElementAt(i, Components.interfaces.nsIFeedEntry); if (theEntry) { theUrl = doc.write('<b><a href="' + theEntry.link.resolve("") + '">' + theEntry.title.text + '</a></b><br>'); if (theEntry.summary) { info = theEntry.summary.text + "<p><hr><p>"; } else { info = theEntry.content.text + "<p><hr><p>"; } doc.write("<blockquote>" + info); doc.write("</blockquote><p>"); } } } // Zamknij dokument doc.write("</body></html>"); doc.close(); } }
Funkcja handleResult()
otrzymuje jako argumenty obiekt typu nsIFeedResult
opisujący kanał, oraz doc
typu nsIFeed
zawierające wszystkie dane kanału.
W celu uzyskania tytułu kanału należy spojrzeć na właściwość feed.title
. Tytuł jest nsIFeedTextConstruct
reprezentujący tekst zapisany w rożnych formatach; używając właściwości text
uzyskamy tytuł kanału w formacie HTML. Można również użyć metody plainText()
by uzyskać kopię jako zwykły tekst.
Następnie można przejrzeć uszeregowanie kanału za pomocą feed.items
nsIArray
. Uszeregowanie to zawiera obiekty nsIFeedEntry
opisujące każdy składnik kanału.
Tworzenie zawartości dokumentu następuje poprzez pobranie tytułu, linka, podsumowania oraz zawartości własności poszczególnych składników. Pełny adres linka może zostać pobrany za pomocą metody linka resolve()
.
W celu rozpoczęcia pobierania kanału wywołujemy po prostu fetch(
url
)
. Otwierane jest wtedy nowe okno zawierające składniki kanału, których linki pozwalają na bezpośrednie odczytanie artykułu.
Szczegóły dostępu do poszczególnych interfejsów dostępowych kanału można znaleźć klikając w poniższe odnośniki.