Search2chBBS

2ch の BBS から subject.txt や dat などをダウンロードして遊んでみたのですが、スレ一覧の gzip 取得がうまくいきませんでした。後、ソースが公開されている複数の ‘2ch ブラウザ’ も参考にしました。

BBS MENU for 2ch

monazilla

2ch ブラウザ開発資料

掲示板一覧の仕様 bbsmenu

PocketPC用のあらたな2chブラウザ

Search2chBBS

プログラムは単純なものです。Core Data と WebKit を利用しています。WebKit を用いて URL [
http://menu.2ch.net/bbsmenu.html ] から bbsmenu.html ファイルをダウンロードしています。下にソースの一部を記載します。

_webView = [[WebView alloc] initWithFrame:NSZeroRect];
[_webView setFrameLoadDelegate:self];
[_webView setResourceLoadDelegate:self];
preferences = [_webView preferences];
[preferences setDefaultTextEncodingName:@"shift_jis"];
frame = [_webView mainFrame];
url = [NSURL URLWithString:@"http://menu.2ch.net/bbsmenu.html"];
request = [NSURLRequest requestWithURL:url];
[frame loadRequest:request];

それから WebKit を利用して DOM にアクセスしています。下に表示されているのが bbsmneu.html の一部とソースの一部分です。この場合は _category に ‘PC等’、title に ‘PCサロン’ 、url に ‘http://pc7.2ch.net/pc2nanmin/’ などがそれぞれ対応しています。

<BR><BR><B>PC等</B><BR>
<A HREF=http://pc7.2ch.net/pc2nanmin/>PCサロン</A><br>
<A HREF=http://pc8.2ch.net/pcnews/>PCニュース</A><br>
<A HREF=http://pc8.2ch.net/win/>Windows</A><br>
<A HREF=http://pc8.2ch.net/jobs/>旧・mac</A><br>
<A HREF=http://pc7.2ch.net/mac/>新・mac</A><br>
if ([node hasChildNodes] == YES) {
if ([[node nodeName] isEqualToString:@"A"] == YES) {
obj = [NSEntityDescription insertNewObjectForEntityForName:@"Board" inManagedObjectContext:[self managedObjectContext]];
[obj setValue:_category forKey:@"category"];
[obj setValue:[[node firstChild] nodeValue] forKey:@"title"];
[obj setValue:[[[node attributes] getNamedItem:@"HREF"] nodeValue] forKey:@"url"];
} else if ([[node nodeName] isEqualToString:@"B"] == YES) {
_category = [[node firstChild] nodeValue];
} else {
[self nodeHref:[node childNodes]];
}

PeauntsView

公開した PeauntsView [ hhttp://kyoshiaki.sakura.ne.jp/osx/tiger.html ] とはあまり関係ないのですが、いろいろ DOM からノードにアクセスを試してみました。その時に参考になった資料やサンプルと PeanutView を作成するのにに参考にしたドキュメントの URL を記載しておきます。

DOMHTMLDocument などのドキュメントが見つからなかったのでフレームワークのヘッダを参考にしました。
/System/Library/Frameworks/WebKit.framework/Versions/A/Headers/DOMCore.h
DOMNode : DOMObject
DOMElement : DOMNode

/System/Library/Frameworks/WebKit.framework/Versions/A/Headers/DOMHTML.h
DOMHTMLDocument : DOMDocument
DOMHTMLCollection : DOMObject

Web Kit Objective-C Framework Reference

サンプルコード
/Developer/Examples/WebKit/DOMHTMLEditor
/Developer/Examples/WebKit/DOMTreeView

Jolla -Utility Plug-In for Dashboard

Web Kit Objective-C Programming Guide

Web Kit Objective-C Programming Guide: Using the Document Object Model from Objective-C

Web Kit Objective-C Programming Guide: Using the Document Object Model Extensions

Web Kit Objective-C Programming Guide: Using JavaScript From Objective-C

Safari JavaScript Programming Topics

Safari JavaScript Programming Topics: Using the Document Object Model From JavaScript

Safari JavaScript Programming Topics: Using Objective-C From JavaScript

PeanutsView

プログラムの動作は単純です。簡単に説明すると、フレームのサイズをゼロにした WebView を作成し、 http://snoopy.com/ からデータを読み込みます。mainFrame から DOMDocument を取り出し、DOMHTMLDocument に変換、そこから images メソッドを使って画像をリンクしている DOMNode ( DOMElement ) を集めた DOMCollection を取り出します。

後は DOMCollection から DOMNode を順番に取り出し、DOMElement に変換、getAttribute:@”SRC” を呼び出し、取り出した attribute の文字列と @”/comics/peanuts/archive/images/peanuts” で始まる文字列を比較し、一致した場合 src に格納します。後は URL を作成し、NSImage を使って画像を Web から取り出して表示します。

下記はソースから重要な箇所を抜粋したものです。詳細はソースを参照してください。

 _webView = [[WebView alloc] initWithFrame:NSZeroRect];
[_webView setFrameLoadDelegate:self];
frame = [_webView mainFrame];
url = [NSURL URLWithString:@"http://snoopy.com/"];
request = [NSURLRequest requestWithURL:url];
[frame loadRequest:request];
frame = [_webView mainFrame];
htmlDocument = (DOMHTMLDocument *)[ frame DOMDocument ];
collection = [htmlDocument images];
for (i=0; i<[collection length]; i++) {
element = (DOMElement *)[collection item:i];
if ([[element getAttribute:@"SRC"] compare:peanuts
options:NSCaseInsensitiveSearch range:range] == NSOrderedSame) {
src = [element getAttribute:@"SRC"];
}
}
image = [[NSImage alloc] initWithContentsOfURL:url];