Project "hpDrafter"

Workshop Cocam プロジェクト第3弾は "hpDrafter"。
Apple の WWDC 2003 から公開された WebKit framework (Cocoa で HTML レンダリングまわりをおこなう API) を使って,結果を見ながら編集できる HTML editor に挑戦。

↑ top page


hpDrafter のご紹介
    hpDrafter はプレビュー機能を備えた HTML エディタです。
    以下のような機能を備えています。
    • WebKit を使った Safari クオリティの HTML レンダリング
    • 編集内容をリアルタイムにレンダリング (on/off 可)
    • テンプレート機能 (編集可,on/off 可)
    • 外部 CSS ファイルの適用 (編集可,on/off 可)
    • 各エディタのフォントが指定可
    • HTML タグの色付け機能 (on/off 可)
    • タグ挿入機能
    • 色コード挿入機能
    • タグ情報を自由に編集できるタグ・ライブラリ
    • 文字コード (SJIS, JIS, EUC, UTF-8) 指定可
    • 改行コード (CR, LF, DOS) 指定可
    ・・・その他いろいろ。


Download hpDrafter

永遠のベータ (進行状況)
    June 3, 2010:
      hD100603.png hpDrafter 2.0.0 公開です。
      今回から、Snow Leopard 専用です。
      旧バージョンもしばらくはダウンロードできる状態にしておきます。

      基本的に、出来ることは旧バージョンと違いがないので、旧バージョンで不都合を感じていなければ、わざわざ乗り換える必要はないかも。

    • 対応環境ががらっと変わるので、メジャーバージョンも上げる事にした。
      バージョニングも pKizzy と同じ方式にして、2.0.0。
      ただ、メジャーバージョンが > 0 だからといって、完成バージョンを意味するわけではない。
      心はいつも「永遠の β」。

    • hpDrafter2_icon.png アイコンも作り直しました。
      ただ、いっそ1から作り直そうかとも思ったんだけど、その作業は割と大変だし、完成を待ってたらいつ公開できるか分かったもんじゃない。
      そこで、前回のリソースを 使い回し 有効活用して、Snow Leopard から対応の高解像度バージョンにしてみた。
      あまり細かいところをじっくり見ないように (^^;
      しかし、アイコンが綺麗になるのは、ユーザとしては結構なことだけど、作り手としては厄介なことだ。

    • hpDrafter を最初に作ったとき (にはまだ名前は違っていたけど) には Cocoa Binding なんてものも無くて、classical な (?) Objective-C で coding していた。
      公開してみると、愛用しているような声も予想以上にちらほら頂いたりしたので、出来る限り後方互換性を維持すべく基本構造は引き継いでいた。
      おかげで、Ver. 1.4β4 は OSX 10.3.9 Tiger でも動く (・・・はず。しばらく自分では試してないからちょっと自信ないんだけど (^^; )

      しかし、更新の手間とか考えると、やはり過去バージョンの API を気にしないといけないのは面倒だし (そんなに更新する気はあるのか、という突っ込みはさておき・・・(^^; )。 Cocoa Binding とか使えると、やっぱり coding も楽になるし。
      てなことで、以前から、一度オーバーホールしようと考えていた。
      で、今回、仕切り直して、up-to-date の OSX 10.6 Snow Leopard をベースにすることにして、新バージョンの公開に至った次第。

    • 基本的に、手を加えたのは内部構造なので、出来る事は変わってないし、旧バージョンのユーザ (いるのか?) なら、分からないところは特に無いんじゃないかと思う。 ファイルの互換性も保たれてる (・・・はず)
      ただ、UI はところどころすっきりできたとは思ってる。


    September 5, 2009:
      hpDrafter Ver.1.4β4 公開です。
      ご要望をいただき、修正しました。

    • 「挿入」メニューからの「ファイへのリンク...」および「画像...」、またはファイルのドロップで挿入される、<a> または <img> タグを、小文字に変更。
      xhtml を書く場合、その方が都合がよいのだそうで。
      html でも問題はないはず。

    • MacOSX 10.3 および 10.4 で動作するバイナリをビルドしたつもりですが、すでに手元に Panther, Tiger 環境が無いため、実際のテストは出来ておりません。
      あしからず。
      10.5 Leopard では大丈夫のはず。

      今回は,こんなところで。


    March 21, 2008:
      hpDrafter Ver.1.4β3 公開です。

    • 主な変更は,待望 (誰が?) の日本語リソース追加。

      どうして作者 (ちなみに,私のこと) が日本人なのに,今まで用意してこなかったかというと,バージョンアップする度に2言語分のリソースをメンテしていく手間が面倒だったから。 どれか1つ選ぶとすれば,英語がいいかなぁ,と。
      なので,日本語リソースを追加したということは,いわば,開発終了宣言と言えなくもない。 ま,これまでも停止してたようなもんだけど。
      不具合などあれば修正はしていくつもり。

    • 改行を <br> タグに自動変換する機能を追加。
      ブログなどでは,改行が自動的に反映される場合もあるようで,その下書きにも対応できるように。
      設定はメニューか,もしくは,新たなインジケータも右端に追加。

      今回は,こんなところで。


    May 27, 2006:
      hpDrafter Ver.1.4β1 公開です。

      hpDrafter も,待望 (誰が?) の Universal Binary 化。

      今まで hpDrafter は MacOSX 10.2.8 以降で動いてたはずなんだけど,Universal Binary って 10.2.8 でも動くんだったっけ?
      ちょっと調べてみたけど,よく分からんかった・・・ (^^;

      ただ,調べたついでに,PowerPC 用コードはちゃんと 10.2.8 SDK でビルドするように設定し直したので,Jaguar 対応度は増した (・・・はず)


    November 16, 2005:
      hpDrafter Ver.1.3β3 公開です。

      hpDrafter には色コード挿入機能があるわけだけど,これまではコードを引用符 (ダブル・クォーテーション・マーク) ではさんだ文字列を挿入していた。
      しかし自分で使ってて,CSS の場合は引用符が要らない,というかあってはいけないことに気付いた。
      というわけで,引用符は付けないように変更。

      それから若干,内部処理の最適化。
      と言っても,初期のころ NSMutableString の存在を知らずに NSString だけで書いたコードを NSMutableString に置き換えただけ。 この方が,メモリ管理に関しては確実なはずなので,より安全性が増したはず。 とは言っても,特に不安定だったわけでもない (少なくとも僕の環境では) ので,実質的には違いはないはず。

      といったところ。


    August 25, 2005:
      hpDrafter Ver.1.3β2 公開です。
      不具合を報告していただいたので,その修正。

      その不具合とは,テキスト中の最後のタグが不完全な (">" で閉じられていない) 場合,固まる,というもの。
      これはタグ・カラーリング・ルーチンのバグだった。
      そういえば以前にこのバグは認識していて,直したつもりになってたんだけど,過去記事を見ても,それらしいことを書いてない。 すっかり忘れてたらしい (^^;

      カラーリングのコードは前からいまいちと思ってたので,この際,全部書き直すことにした。
      前はかなりごちゃごちゃしてたんだけど,かなりすっきり書くことができた。
      パフォーマンスもちょっとよくなった気がする。 これはきっと気のせいだ (^^;
      これも hpDrafter, pArticles と作ってきて,ちょっとは成長したってことだろうか。


    July 6, 2005:
      ひさびさの更新。
      hpDrafter Ver.1.3β1 公開です。

      Tiger にしてから,いくつか不具合が起きているみたい。
      修正できたものとできなかったものがあって,やるだけやったところでいちおう公開。

      特に変なことはしてないので Panther 以前にも悪影響はないと思うけど,もう僕にはテストできないので,バージョンの 0.1 の桁も上げることにした。
      Ver. 1.3 台以降は Tiger で動作確認バージョンです。

      まず,ページのタイトルが表示されない,"viewer" のまま固定されてた不具合。
      調べてみると,WebFrameLoadDelegate プロトコルの webView: didReceiveTitle: forFrame: メソッドが呼ばれてない!
      これはページのタイトルが読み込み終わったところで呼ばれるメソッドで,このメソッドでウィンドウの setTitle: をやってる。 Safari みたいなブラウザでもページが表示される前にタイトルだけ先に変わるのはこいつのおかげ。 しかしこれが呼ばれないもんだからタイトルが変わりようがない。
      Safari なんか見るとちゃんと機能してるみたいだし,hpDrafter でも Clear Cache したときは大丈夫そうだ。
      違いはレンダリングに使うメソッドで,loadRequest: のときは大丈夫だけど loadHTMLString: baseURL: メソッドではダメらしい。 キャッシュの扱いといい,loadHTMLString: baseURL: は不遇な扱いを受けてる気がする。 このメソッドは使ってはいかんのか?
      仕方がないので,ページ全体のロード完了を検出したとき (progress indicator を止めるため) についでに表示することにして,いちおう解決。

      HTML エディタ text view にファイルをドラッグ&ドロップしたときのカーソルの表示が Tiger から変わったらしく,意味不明な挙動になった (^^;
      以前までは,hpDrafter がバックグラウンドにいるときに insertion pointer を表示させるやり方が分からなかったわけだけど,Tiger になってからフォアグラウンドでもバックグラウンドでも自動で表示されるようになったようだ。
      しかし,マウス位置が動いた瞬間は表示されるんだけど,その後は表示されたりされなかったり,法則性が分からない。
      それから,command キーを押してドラッグ前の選択領域を保持している場合は,マウス位置に追従したカーソルは表示されては困るんだけど,これを抑制する方法が分からない。 shouldDrawInsertionPoint のオーバーライドはやっぱりダメ, drawInsertionPointInRect: color: turnedOn: をオーバーライドするのもダメだった。
      insertion pointer の表示がいったいどこでおこなわれているのか分からないので,どうしようもない。


    May 12, 2005:
      hpDrafter Ver.1.2β5 公開です。

      今回も,ファイルのドラッグ&ドロップ機能の改善から。
      command キーを押すことで,ドラッグ開始前のテキスト選択範囲を保持する機能の追加。
      テキストが選択された状態で <IMG> をドロップするとテキストがタグに置き換えられ,<A> をドロップすると </A> とで挟まれます。 要するに,Insert メニューからタグ挿入するのと同じ結果になります。 control キー (画像ファイルで強制的に <A> タグを挿入させる) とのコンビネーションも可能です。

      以前に書いた,タグ・ライブラリの編集中にタブ・キーの移動で editable:NO の項目を編集できてしまう不具合の修正。 なんで不具合かというと,編集を確定する時にアプリがおかしくなるから。
      どうやら table view の delegate で,tableView:shouldEditTableColumn:row: メソッドを実装してコントロールしてやる必要があった模様。 この場合,メソッド名の Edit とはテキスト編集のことだけを指しているらしい。 たとえばポップ・アップ・メニューで選択するとか,チェックボックスを on/off するとかは Edit ではないのか? ややこしいなぁ・・・

      プリファレンス・パネルのプレビュー用外部ブラウザの設定テーブルで,アプリを並べ替えてもメニューの順番が変わっていなかった不具合を修正。

      とまあ,こんなところで。

      ちなみに,Tiger 入手!

      しかし未インストール・・・。


    April 19, 2005:
      hpDrafter Ver.1.2β4 公開です。

      今回は,前回搭載したドラッグ&ドロップ機能の改善から。
      ドラッグ中のカーソル位置からテキスト中の位置を割り出す方法は,ぐぐってみつけることができた。

      NSPoint aPoint = [[self window] convertBaseToScreen:[sender draggingLocation]];
      unsigned index = [self characterIndexForPoint:aPoint];

      という感じにやればよいらしい。 ちなみに convertBaseToScreen: は NSWindow の,characterIndexForPoint: は NSTextView (が対応する NSTextInput protocol) の,draggingLocation は NSDraggingInfo protocol のメソッド。 sender は draggingEntered:draggingUpdated: メソッドで渡される引数 (とは言わないんだったっけ?)

      挿入ポインタの表示は,得られた index 位置に setSelectedRange: してやればいいだけ。 それ以前の選択領域を控えておくのを忘れずに。 これで,hpDrafter 使用中にバックグラウンドの Finder からファイルを引っ張ってくるときや,ファイルをドラッグしながら command+tab で hpDrafter に切り替えたときなんかは,ちゃんと挿入ポインタがドラッグを追跡して移動してくれる。
      ところが hpDrafter がバックグラウンドにいるときが問題で,普通は挿入ポインタが消えてしまってるし,ファイルをドラッグしても表示されない。 NSTextView の shouldDrawInsertionPoint メソッドをオーバーライドしてやって,必要なときに YES を返すようにしてやればいいのかと思ったんだけど,どうもそれだけではこのメソッドは呼ばれないらしい。 draggingUpdated: なんかで displaysetNeedsDisplay: を呼んでやってもダメ。 どうやればいいんだろ?
      ということで,バックグラウンドの時に挿入ポインタを表示するのが宿題として残ったところで,今回はここまで。

      もひとつ,初期設定まわりの不具合を修正。
      前回紹介した suna suna さん製サンプル初期設定を使って立ち上げたり,初期設定 plist ファイルがない状態で立ち上げると,アプリ終了時に初期設定が保存されなかった。
      原因を調べてみると,エディタ文字色設定の color space 変換を忘れてたせいで,初期設定の保存にしくじってた。 なので,途中で一度でもエディタ文字色の設定を触ってれば問題なくなってたはず。 何にせよ,サンプル提供者の suna suna さんには罪はありませんので (当たり前 (^^; )

      とまあ,こんなところで。


    April 11, 2005:
      オンライン・マニュアルつくってみました。
      このページのトップにリンクがあります。
      実は,草案を suna suna さんが作って送ってくださいました。 suna suna さん,ありがとうございました m(_ _)m

      内容は Ver1.2β2 をベースにしています。 まだまだ不備も多いとは思いますが,無いよりはるかにマシでしょう。
      他人が作った草案を見てると,こんなところが分かりづらいのかと新発見が多数。 バグ発見も多数でした (^^;
      さらに,suna suna さんより初期設定のサンプルも提供していただきました。 はっきり言って,hpDrafter のデフォルトの設定ってかなりいい加減なので,役立つかもしれません。 特に,タグ・ライブラリの充実度は桁違いです。 タグ・ライブラリをいただくだけでも恩恵は大きいかも。
      というわけで,サンプル初期設定ファイルを,その初期設定に含まれるタグ・ライブラリをエクスポーとした tlib ファイルとともに,Download コーナーに置いときます。
      使い方は,初期設定ファイルは ˜/Library/Preferences/ フォルダに置くだけ。 tlib ファイルはタグ・ライブラリ・ウィンドウを開いて File > Import Tag Library メニューからインポートしてください。

      そんなところで,hpDrafter Ver.1.2β3 公開です。
      さっそく,マニュアルから逸脱してます (^^;

      今回は新メニュー,Insert メニューの下に "Link to File..." と "Image..." を追加。
      オープン・ダイアログからファイルを選ぶと,それぞれ <A> によるアンカー・タグ,<IMG> によるイメージ・タグを挿入します。 もちろん HREF や SRC 属性等を自動挿入します。
      さらに HREF や SRC 属性には,Base URL を基準として相対パスを使うよう努力 (ちょっとだけ (^^ ) します。 できなかった場合はファイル名のみになります。

      ついでにドラッグ&ドロップにも対応しました。
      エディタの text view にファイルをドロップすると,JPEG, GIF, PNG ファイルの場合は <IMG> タグを,それ以外のファイルの場合は <A> タグを挿入します。 ドロップ時に control キーを押しておくことで,画像ファイルで <A> タグを挿入することもできます。
      ただし注意。
      ドロップされた位置にタグが挿入されるわけではありません。 それ以前のカーソル位置が基準になります。 つまり,上記のメニューから挿入を実行したのと同じ結果になるわけです。 このあたり,詳しくは下で。

      OSX 10.2 で "Export Tag Library..." が機能していなかった問題の修正。
      これもセーブ・パネルの修正を忘れてました (^^;

      文字列置換後にタグのカラーリングが効いていなかった問題の修正。

      そんなところで,以下,ひとりごと。

      text view へのドラッグ&ドロップは前から考えていて,今回いろいろ試してみた。
      ほんとは text view の中にドラッグすると,カーソル位置とともに挿入ポインタが移動して,好きなところにドロップでタグ挿入・・・とやりたかった。 ドラッグを追跡して挿入ポインタを表示するのは NSTextView が標準でできるはず (ドラッグ&ドロップ編集ではできてるし) だから,それを利用してやろう・・・と目論んでたんだけど,どうにもやり方が分からない。
      NSTextView にはドラッグ中に呼び出される dragOperationForDraggingInfo:type: というメソッドがあって,これをオーバーライドしてドラッグのタイプ (コピーとかリンクとか) を指定しろということになってる。 しかしファイルをドラッグしたときは,そもそもこのメソッドは呼ばれない。 なにやら,僕の与り知らぬところで判別や処理がおこなわれてるらしい・・・。
      NSTableView のための NSTableDataSource のように,お手軽な手段を用意しといてくれたらいいのになぁ・・・。
      ま,自前でコードを書けばいいんだろうけど,カーソル位置からテキスト上の位置 (index) を求めるとか,挿入ポインタを指定した場所に表示させるとか,いろいろやり方が分からない・・・。
      せめてドラッグが入ったときには text view の縁を光らせ (ファインダのウィンドウにドラッグした時みたいに) ようと思ったんだけど,これもやり方不明。 cell や view には focus ring というのがあるんだけど,これは縁の外側を光らせる。 内側を光らせる標準のメソッドってないのか?

      という感じで,引き続き調べようとは思ってる。
      ただ,現状では使い勝手もビジュアルもいまいちなんだけど,それを割り切って使う分には便利かもだし,とりあえず使える状態にしときます。


    March 26, 2005:
      hpDrafter Ver.1.2β2 公開です。
      要望などいただき,いろいろ変更してます。

      まず,HTML エディタの文字色を変更可に。 タグ以外の部分,地の文字の色を指定できます。
      今まで,エディタの背景色や透明度は変更できてた。 エディタを半透明にできれば,ビューアを透かして見ながら編集できると思ってたんだけど,正直見づらくてあまり役に立ってなかった (と思う)
      だけど要望をいただいて,SunriseBrowser を見て気づいた。 背景を黒っぽい半透明にして,文字を白くできればけっこういけるのかも。
      というわけで,文字色も変えれるようにしてみた。
      ただし,背景を半透明にしてるとカーソルや文字の跡が残像として残ってしまって,透明度や色合い次第ではけっこう目立ってしまう。 スクリーンショットで見せようと思ったけど,スクリーンショットには映らないみたい。 SunriseBrowser ではどうやってるんだろ・・・と思ったら,あちらでも残像は出るみたい。
      半透明のやり方が間違ってるのかなとは思うんだけど,どんなやり方にしろ残像を残そうとしてないのに残ってしまうのは,AppKit のレンダリングのバグでしょう (責任転嫁 (^^; )
      今のところ背景や文字色設定は HTML エディタだけだけど,template や CSS ウィンドウでも設定可能にすべきかな?

      エディタ背景色や文字色で,グレースケール・バーから色を選んだときに正常に動作しなかった不具合の修正。
      color space 変換していなかったのが原因。

      タグ・ライブラリで,Generic TagCommentQuotation 等を編集すると落ちていた不具合の修正。
      その作業中に気付いたんだけど,タブ・ライブラリの編集中にタブ・キーで移動すると,editable:NO の項目も編集できてしまう。 その編集後に確定したとき,すぐにアプリが落ちるわけではないけど,動作がおかしくなってしまう。
      これはおそらく NSTableView のバグで,すぐには修正できないと思うので,気をつけて使ってください。

      オート・インデントしてるとき,日本語確定のリターン・キーにも反応して行中でも空白等を挿入してしまっていた不具合の修正。
      本当は,日本語入力されたかどうか判別しないといけないんだと思うんだけど,それは無理 (僕の技術レベル的に (^^; ) なので,カーソル直前にリターン・コードがあるかどうかで判別する対症療法で解決 (したつもり)。 これでとりあえず問題ないとは思いますが・・・。

      OSX 10.2 で,HTML エディタと template エディタでの "Save As..." や "Export Complete HTML..." ができていなかった不具合の修正。 直したつもりだったんだけどなぁ・・・忘れてたらしい? (^^;

      タグ・ライブラリから UP/DOWN ボタンを削除
      以前にドラッグ&ドロップで並べ替えできるようにしたときに,このボタンは消してたはずだったんだけど,hidden は 10.3 以降しか効かないのを忘れてた (^^;

      メニューとかに残っていた "hpSampler" の文字を "hpDrafter" に変更。
      前回はすっかり忘れてた (^^;
      もう残ってないと思うけど・・・?

      修正だらけだけど,最後に新機能を1つ。
      ビューア・ウィンドウに,テンプレート,CSS,Auto Rendering の適用/不適用を示すインジケータを搭載。 TMP はテンポラリではなくてテンプレートの意味です。 これらのインジケータ自体を押して ON/OFF 切り替えすることもできます。
      本当は黒の状態が ON らしいんだけど,どう見ても白い方が ON に見える。 だから 白=ON, 黒=OFF 状態にしてる。 他のアプリで 黒=ON, 白=OFF に慣れた人には感覚がおかしいかも? ON=青だったら分かりやすくてよかったのに,なんで青じゃないんだろ? NSSegmentedControl を使えば ON=青 にできるのかな? でもいまいち使い方が分からないので,Interface Builder で設定できるようになったら考えることにしよう (^^;


    March 12, 2005:
      hpDrafter Ver.1.2β1 公開です。
      いきなりの,名前変えてみました第3弾 & アイコンつくってみました第3弾。

      hpSampler から移行するには,いくつか手順が必要です。
      • ˜/Library/Preferences/jp.WorkshopCocam.hpSampler.plist ファイルを jp.WorkshopCocam.hpDrafter.plist に改名。 コピーするのが無難かも。
      • html/css チェッカが ˜/Library/hpSampler フォルダにある場合: ˜/Library/hpDrafter フォルダをつくって,チェッカをそこに移動 (コピー)。 hpDrafter の Preferences Panel でチェッカのパスを修正 (hpSampler → hpDrafter)。 やらなくても実害はないですが。
      • ˜/Library/hpSampler フォルダを削除。 これもやらなくても実害はないですが。 もちろん,チェッカを残している場合は削除してはいけません。
      そんなところかな。
      チェッカを使ってなくて,特に初期設定とか引き継ぐ必要もなければ,何もしなくても大丈夫 (なはず)
      チェッカのインストール用スクリプトも修正したので,hpDrafter から新たにチェッカをインストールしたい人は,スクリプトもダウンロードし直してください。

      実は "hpSampler" っていう名前は,あまりしっくりきてなかった。 "sample" っていう動詞は,「試作する」「試し書き」みたいな意味で使ってたつもりだったけど,ほんとは「サンプリング」とかいうように「抜き取り検査」みたいなニュアンスが強いように思う。 チョコレートなんかのアソートのことをサンプラーと言ったりもするし。
      それと比べて "draft" はかなりイメージに近い。 名前変えると移行に手間がかかるのは分かってるし,当分はこれで行く予定。

      いちおうぐぐってみたところ,他にメジャーな "hpDrafter" はなさそう。
      このぐぐって引っかかるという条件もちょっと重要。
      その意味で,実は "pArticles" は失敗だった。 "particles" という一般名詞で引っかかりすぎる。 最初は case sensitive 検索すれば一発だ,と思ってたんだけど,いざ調べてみると case sensitive な検索ができるインターネット検索が見つからない。 僕が知らないだけかもしれないけど。 普段あいまい検索してくれるのはありがたいけど,case sensitive のオプションぐらい用意しといてほしいもんだ・・・。
      というわけで,"pArticles" も改名検討中・・・。 だけど,移行の手間は pArticles の方がずっと大きくなりそう・・・

      で,名前が変わっただけじゃなくて,変更も (いちおう) あります。
      前回の起動プロセスの見直しで,HTML ファイルをドラッグ&ドロップしてアプリを起動したときに base URL が変更されなくなっていた。
      その問題を修正。


    March 5, 2005:
      hpSampler Ver.1.1β7 公開です。
      ずいぶん前にいただいてた要望に応えて,外部ブラウザでのプレビューに対応。
      キャッシュをクリアするときと同じように一時ファイルを書き出し,それを指定したブラウザに開かせます。 すでに開いたウィンドウがあればそこに読み込まれるようです。
      今回これに対応するため,一時ファイルの名前を変更しました。 どうやら以前のは長すぎて,IE では開けなかったみたい。
      プリファレンス・パネルでブラウザのリストを編集可。 このリストの順番にしたがって,ショートカット・キーが割り振られます。
      ただ,NSWorkspace の iconForFile: メソッドで画像を取得してるんだけど,アイコンの画像があんまりきれいじゃないんだな。 ほんとはリソースに含まれる小さいサイズの画像を取得すればいいんだろうけど,どうやったらいいんだろ・・・?

      template 編集ウィンドウで,フォーカスが外れた text view で選択が解除されるようになった。
      フォーカスが外れたことを検出する notification とか delegate メソッドとかが分かってなかったんだけど,NSResponder の resignFirstResponder メソッドをオーバーライドすればいいらしいことが判明。

      起動プロセスを見直した。
      といっても特別速くなったわけじゃない。 というか,むしろ (若干だけど) 遅くなってるはず。
      ただ,内部構造をシンプルに整理し直したということで。


    January 14, 2005:
      hpSampler Ver.1.1β6 公開です。
      最近,ご要望をいただきまして,それに応えてのアップデートです。

      hpSampler は,テキスト・ファイル全般を開くことができて,拡張子によってどのエディタに読み込むかを判断する。
      と,これはドラッグ&ドロップの時の話。
      Open メニューから開こうとしたときは,拡張子が "html/htm/sstemp/ssproj" のものしか開けなかった。
      これを,開ける拡張子に shtml と css を加え,テキスト・ファイル全般を開けるようにした。 そのためには,NSOpenPanel を開く時に
      int result = [openPanel runModalForTypes:[NSArray arrayWithObjects:@"html", @"htm", @"shtml", @"css", @"sstemp", @"ssproj", NSFileTypeForHFSTypeCode('TEXT'), nil]];
      などとやればいいらしい。

      ついでに調べてると,新規ファイルとしてファイル保存した場合の問題もみつかった。
      新規のファイルは,クリエータをテキスト・エディットに,ファイル・タイプをテキストにしてたつもりだったんだけど,ファイル・タイプの設定にしくじってたらしい。
      というわけで,調べて修正。 次のようにすればいい感じ。
      NSMutableDictionary *attributesDic = [NSMutableDictionary dictionaryWithDictionary:[[NSFileManager defaultManager] fileAttributesAtPath:filename traverseLink:NO]];

      [attributesDic setObject:[NSNumber numberWithUnsignedLong:'ttxt'] forKey:@"NSFileHFSCreatorCode"];

      [attributesDic setObject:[NSNumber numberWithUnsignedLong:NSHFSTypeCodeFromFileType([NSString stringWithString:@"'TEXT'"])] forKey:@"NSFileHFSTypeCode"];

      [[NSFileManager defaultManager] changeFileAttributes:attributesDic atPath:filename];


      もひとつついでに,以前に直したつもりになってた不具合も修正。
      HTML ファイルのドラッグ&ドロップで起動したときに,ビューア・ウィンドウの Base URL フィールドが空白になる問題。
      起動まわりは対症療法で対処してるけど,一度気合い入れてオーバーホールしないといけなさそう・・・。


    January 7, 2005:
      ひさびさの更新。 hpSampler Ver.1.1β5 公開です。

      実は,タグ・ライブラリ・ウィンドウにバグがあって,落ちることがあったらしい。 そこでプログラムを見直して,怪しいところを修正。 とは言っても,致命的なミスは見つけられなかったから,まだ問題は残ってるかも。
      ついでに,タグ・ライブラリ・ウィンドウの table view も drag&drop での並べ替えに対応。 pArticles で覚えたやり方をほとんどそのまんま使えたから,けっこう楽だった。
      ついでに,ウィンドウのボタン構成はちょこっとシンプルになりました。

      ついでに細かい不具合の修正。
      HTML ファイルを drag&drop してアプリを起動したときに,viewer ウィンドウの base URL フィールドが空白のままになる不具合を修正。

      editor ウィンドウで,New メニューで HTML テキストをクリアした場合に base URL が変化しない不具合を修正。 今度から "http://localhost/" にリセットされます。

      そんな感じで。


    August 20, 2004:
      hpSampler Ver.1.1β4 公開です。
      今回はレンダリングのサスペンド機能 (っていうのかな?) を導入。
      どういうことかというと,連続してキー・タイプがあったときはレンダリングを保留しておいて,一定時間キー・タイプがなくなった隙をみてレンダリングを実行する機能です。
      これまではタイプするごとにレンダリングしてたから,けっこう重かった。 日本語を入力するときはある程度タイプして確定したときにレンダリング,というサイクルだからあまり気にならなかったんだけど,半角文字を入力するとき (たとえばタグを入力するときとか英単語を書くときとか),リターン・キーやデリート・キーを連打したときとかだとかなり重く感じてた。
      だけどサスペンド機能のおかげで,タイプ中に割り込まれる頻度が減ったおかげで,見かけ上はかなり軽くなった。 ただしレンダリング自体が重いとさすがにどうしても重くなってしまうけど。

      タグ・カラーリングにも同じくサスペンドを適用可能で,プリファレンス・パネルでそれぞれ on/off や待ち時間 (共通) を設定可。
      レンダリングとタグ・カラーリングという,hpSampler の2大重い処理がサスペンドできるようになって,体感速度はかなり上がったはず。
      ま,おかげでリアルタイム性は少し損なわれたわけだけど,そこはマシン・パワーなんかとの兼ね合いで納得いくように設定してください。

      実はこの機能,かなり初期の頃から実装したいと思ってた。 だけどやり方がさっぱり・・・。 今度こそマルチ・スレッドか? と思ったり。
      ところが最近,別の調べ物でぐぐってるときに,NSTimer クラスを使えばいいらしいことを発見。
      [NSTimer scheduledTimerWithTimeInterval:interval target:target selector:@selector(render:) userInfo:nil repeats:NO]
      とやるとタイマーをつくることができて,interval 秒後に target オブジェクトに render: メッセージを送らせることができるそうな。
      キー・タイプされるたびにこれを実行すればいいんだけど,ただ単にタイミングが遅れるだけでは意味がない。 そこで,タイマーをつくるたびにカウントしていって,レンダリングのメソッドではタイマーから呼び出されるたびにカウントを減らして,カウントがゼロになったときだけレンダリングを実行する。
      ・・・という感じで期待通りに動いているみたい。

      これでなんだかけっこう快適になってしまったかも。
      パフォーマンス向上の改良しないとと思ってたけど,モチベーションが一気に下がり気味 (^^;


    August 6, 2004:
      hpSampler Ver.1.1β3 公開です。
      今回はタグ・カラーリングが高速化!

      といっても,うちの iBook 500MHz では,たとえばこのページ全体を編集するにはまだちょっと引っかかる感じ。 それでも1回分の記事ぐらいの分量だけなら許せるレベルになった気がします。 自分が作ったアプリだと思うと,なおさら許してやりたくなります (^^

      今まで色付けするのには NSText の setTextColor:range: メソッドを使ってました。 このやり方だと,タグを1コ1コ色分けするごとに view 全体を再描画していたはずで,それが遅かった原因。 色設定はまとめてやって,描画は最後に1度だけやるという方法があるはずと思ってしばらく調べてた。
      mkino さんのページなど調べてると,NSTextView の中でテキスト情報を持ってる NSTextStorage にアクセスすればよい感じ。
      NSTextStorage は NSMutableAttributedString のサブクラスで,
      [textStorage addAttribute:NSForegroundColorAttributeName value:color range:range]
      とすると指定範囲の文字色を変えられる。 で,作業前に [textStorage beginEditing] を指定しておくとその後の再描画が保留され,作業後に [textStorage endEditing] することでまとめて描画してくれる。
      ・・・はずなんだけど,やってみると色が付かない・・・
      後から分かってみると,
      [textStorage addAttribute:@"NSForegroundColorAttributeName" value:color range:range]
      とやってしまってたのが原因でしたとさ。 こんなことで2週間ぐらいつまづいてしまった・・・。

      それともう1つ,"Export Complete HTML..." というメニューを追加しました。
      HTML にテンプレートを結合した「完全な」テキストをファイルに書き出すためのもの。

      そういえば,hpSampler はメンテナンス・モードとか言いながら pArticles の方はほったらかしだな・・・ (^^;


    July 30, 2004:
      怒濤の3日連続更新!
      ・・・それだけミスを連発してるというだけのことですが (TT

      今回は hpSampler そのものの更新はありません。
      問題はチェッカをインストールするためのシェル・スクリプト。
      ˜/Library/hpSampler フォルダが存在しないときに,インストールを中止して終了してしまってました。
      これを,フォルダを作成してインストールを続行するように修正しました。
      今まで一度でも Clear Cache を使用した人は,フォルダが作成されていたはずなので大丈夫だったはず。 当然,私も大丈夫だったので見過ごしてしまってました (TT
      Download のイメージファイルは差し替えておいたので,これが原因でインストールできなかったと心当たりのある人は,ダウンロードして試してみてください。

      指摘してくださった大門さん,ありがとうございました m(_ _)m


    July 29, 2004:
      hpSampler Ver.1.1β2 公開です。
      先日の β1 にバグを発見。
      チェッカにオプションを指定しない場合にチェッカが正しく動作しない問題がありました。
      デフォルト状態だと,CSS チェッカが動作しませんでした。 で,そこを修正。 ついでに,オプション設定フィールドに余分なスペースが入っても問題なく動作するようになっているはずです。

      それから,Jcode ってすでにバージョンが 0.87 にアップしてたんですね・・・。
      なので 0.86 は入手困難になっているかもしれません。
      うちの記述とシェル・スクリプトも 0.87 対応に修正しました。

      しかし今後のことを考えると,よそのバージョン・アップまではとても追い切れないし,対応しきれないなぁ・・・。
      基本的に,テキスト・エディタ等で copytools.sh 中のファイル名の部分を置換 (今回の場合 "86" から "87" に一括置換) してもらえれば対応できるはずだと思いますが・・・。


    July 28, 2004:
      Screenshot 0404xx hpSampler Ver.1.1β1 公開です。
      今回はちょっと大きな変更になったので,思い切って 1.1 にしました。

      今回の変更は,HTML および CSS の文法チェッカに対応したこと。
      坂井さん (www.fan.gr.jp/~sakai/) に基本部分を提供していただきました。 ありがとうございました m(_ _)m

      使い方は簡単。 新たにチェッカ・ウィンドウが搭載されたので,開いてメニューで HTML か CSS かチェック対象を選び,Start ボタンを押すだけ。 ちなみにうちのホームページをチェックしてみたところ,エラーだらけになりましたが・・・ (^^;
      注意してほしいのは,チェックはファイルに対しておこなわれるので,ウィンドウの内容が直接反映されるわけではないというところ。 チェック前には忘れずに保存するようにしてください。

      ただし,使うためにはチェッカのインストールと設定をする必要があります。
      プリファレンス・パネルでチェッカのパスとオプションを設定します。 するとオプションを半角スペースで分割した文字列が引数としてチェッカのコマンドに渡されます。 編集中の HTML/CSS ファイルのパスが最後の引数になります。
      このとき,ただ単にスペースで区切っているだけなので,引数にスペースを含めることはできません ("" を使うのも不可)。 それに環境変数 ($PWD とか) の展開もされません。 余分なスペースも入れない方がよいでしょう。 その辺,注意してください。 この説明を読んでピンとこない人は,設定は触らないことをお勧めします。 僕の説明もおかしいかもだけど (^^;

      と,ここまで読んでもさっぱりという人や,設定が面倒という人のためにインストール方法を用意してみました。
      hpSampler はチェッカとして以下のフリーのツールを推奨します。 ちなみに SWChecker クラスは http://www.harmless.de/cocoa.html で公開されている AMShellWrapper をベースに,坂井さんが日本語出力時の不具合が修正されているそうです。

      少し面倒かとは思いますが,こちらのインストール方法のページを参考にインストールしてください。
      簡単に説明すると,上記サイトからいくつかファイルをダウンロードし,うちからシェル・スクリプトを2つダウンロードし,1つのフォルダにまとめてからシェル・スクリプトを実行,という手順です。
      この手順に従ってもらえれば,プリファレンス・パネルの設定は変更することなくチェッカを使うことができます (はずです)

      それから,"Save As..." メニューで 10.3 固有のメソッドを使っていたため,10.2 では「別名で保存」ができていなかったようです。 この問題も坂井さんが解決してくれました。
      坂井さん,いろいろとありがとうございました m(_ _)m

      あと,チェッカでの結果表示ではエラー箇所が行番号で表示されますが,エディタに行番号表示がないので非常に分かりづらい・・・
      というわけで,"Go to Line..." のメニューを追加しました。


    July 14, 2004:
      すでに知ってる人も多いとは思いますが,7/10 に,新しもの好きのダウンロ〜ドで hpSampler を紹介していただきました。 こちらから売り込んだんですけど。
      この数日で,この約1年のアクセス数を倍増させるほどのアクセスがありました。 さすが,すごい影響力ですね。 多くの人目に触れることが予想されたので,ついでにトップ・ページなどもすっきりリニューアルさせたり。
      しかし,すでに嵐は去った模様・・・。

      せっかく作ったものなので,1人でも多くの方に気に入って使ってもらえたら嬉しい限りです。
      ま,予想通り,反響は1つもありませんが・・・。

      そんな今回も,懲りずに hpSampler 1.0β5 公開です。
      今回はいくつか不具合の修正だけ。

      まず1つ目は,文字列置換後に auto render が効いていなかった問題の修正。
      実は,新しもの好きのダウンロ〜ドで紹介してもらったとき,.dmg ファイルの作成にしくじっていることが判明。 あわててファイルを作り直したりしてるうちに,ここまでの修正が β4 に含まれてしまいました。 なので,7/3 バージョンの β4 は存在しなくなりました。 前回ダウンロードした人もいたかもですが,前回分の実行ファイルは実行できなかったはず。

      2つ目は,tag library のインポートで拡張子制限。 .tlib ファイルだけに制限しました。
      些細なことだけど,ま,いちおう他と整合性をとっておこうかなというところです。

      Fixed Problems
      これまであった問題のいくつかは解決されました。
      • 文字列置換後の auto render が効かない。
        上記のように解決しました。


    July 3, 2004:
      hpSampler 1.0β4 公開です。
      今度こそ β に移行。 アプリとしても形になってきてるし,そろそろいいんじゃないかと・・・。
      ナンバリングは β4 から。 いちおう混乱を避けるため,重複しないようにしてみました。
      「永遠のベータ」なんていうネーミングからして,完成させるつもりがないのがバレバレ? (^^;

      ついでに,名前変えてみました第2弾。 ・・・とは言っても第1弾はホームページで公開する前の話なので誰も知らない話なわけですが (^^;
      なんでわざわざ変えたかというと,他にも Site Sampler っていうソフトがあるんですよね。 ぐぐってみるとけっこうたくさん引っかかります。 どうやら検索ソフトであったり,条件を絞ってページをピックアップするようなソフトが多いようです。 Netscape Site Sampler なんてのもあるそうで・・・。
      ま,僕自身は名前がカブってても別に気にしないですが,あとあと問題にされたりしたら面倒だし・・・。 というわけで念のための予防です。
      hpSampler にしたところ,ほとんど重複はないようです。

      新しいアイコンではすでに "hpSampler" と書かれていて,文字も微妙に判別できます。
      それが,前々回に書いたアイコンの秘密でした。 本当にどうでもいいようなことですけど (^^;

      アプリ名変更の副作用として,これまでの初期設定が引き継がれません。 ~/Library/Preferences フォルダの jp.WorkshopCocam.SiteSampler.plist ファイルの名前を jp.WorkshopCocam.hpSampler.plist に変えて乗り切ってください。
      template の内容は,変な文字列が含まれて上の TextView にだけ文字列が現れると思います。 カット&ペースト等で乗り切ってください。
      あと,Clear Cache を実行したことがある人は,~/Library フォルダに SiteSampler フォルダが作られてると思います。 ま,害はないと思いますが,気になるようなら削除してください。
      この辺,アプリで対応できないことはないんだけど,面倒だし・・・。 ま,しょせん α だったということでご勘弁を : P

      アプリ名変更にともなって,URL も変わりました。
      このように下層の URL は変わる可能性があります。 ブックマーク等される方はトップ・ページの方で登録されることをお勧めします。


      ではでは,今回の変更点いってみましょう。
      前回も触れましたが,template 編集ウィンドウでの検索を修正しました。 今回から,検索範囲,Wrap Around 等の挙動が,2つまとめて1つの TextView みたいに動作するようになりました。 ただ,2つの View で同時に文字列が選択されたりするし,完璧ではありませんが。
      SWEditorTextView をさらにサブクラス化して SWTemplateTextView を作ることで対応しました。
      ちなみに今回プログラミングしてて気付いたんですが,template ウィンドウって Undo が効いてなかったんですね。 2つの TextView を NSSplitView の subview としてるんですが,Undo のアクションは SplitView が受け取って (無視して) TextView まで届いてない感じです。 今回プログラムした Replace All の Undo だけは,SplitView に対処させるようにしたので有効です。
      これ,どうやったら対処できるんだろう・・・。 NSTextView は Undo に対応してるけど,それを SplitView に登録させる???
      う〜ん,もともと template ウィンドウは積極的に編集する場所とは思ってないし,今のところあんまり真剣にはやる気なし・・・。


      Project "hpSampler" は,ここらでしばらくメンテナンス・モードに入るつもりです。
      改良のアイデアがないわけではないんだけど,ちょっと飽きてきたし (^^;
      ま,そのうち気が向いたらぼちぼち改良していきたいと思います。

      今後は Cocoa Binding を使った第4プロジェクトをメインで進めていきたいと目論んでいます。
      日の目を見る日が来ることを祈るばかり・・・。


能書き
    hpDrafter のはじまりは、シンプルな思いつきでした。
    Safari のレンダリングってめちゃ速い (IE 比) やん。 これってキー・タイプより速いんでは?
    ってことはつまり、そのレンダリング・エンジンである WebKit を使えば、入力に対してリアルタイムで反応するプレビューアが実現できるんでは?
    やってみました。 できました。
    自分のタイピングに合わせてレンダリングされるのは、なかなか気色よい感触です。
    はじまりは、それが見たかっただけ、といっても過言ではないでしょう。

    しかしせっかくなので、HTML エディタとして使い物になるレベル (少なくとも自分にとって) にまで進化させてみようか、なんて考えてみました。

    自分は HTML を直接書きたいタイプです。 製品ものの WYSIWYG なエディタも使ったことがあります (もう何年も前の話ですが・・・) が、結局、HTML を直接見て手直ししないと気がすみません。
    というわけで、hpDrafter も HTML を手書きすることを前提にデザインされています。

    手書きのための支援機能って何でしょう?
    タグの色付けは、まぁ、妥当なところでしょう。

    それとタグ挿入支援機能。
    しかし、ありがちなアイコン・ツールバー方式は嫌いです。
    タグを入れるたびにいちいちカーソルをそこまで動かせと?
    必ずしも用意されてるタグの使用頻度が高いわけじゃないぞ、用意されてないタグはどうしろと?
    同じタグでもオプションによって何タイプも使い分けたいような時は?
    ツールバーでディスプレイ領域を無駄遣いするぐらいならエディタなりプレビューアなりをもっと広く表示させろよ・・・。
    というわけで、好き勝手にカスタマイズ可能な、ショートカット・キー対応 (かつキーを設定可) の、邪魔にならないタグ挿入支援機能が (僕にとっては) 理想です。
    というわけで付けました。

    その他いろいろ・・・ま、他はおまけのようなものです。
    コンセプトは、シンプルに。 余計な機能は付けない。少なくとも、要らない機能はあえて使わない限り邪魔にならないように。

    とは言いながら、アプリとしてのまとまりを求めていくうち、多少なりとも複雑になってしまいました。
    おそらく僕個人の感覚に基づいた,クセのあるアプリになっていることでしょう (^^

    ま,ソースは公開しているので,気に入らない人は勝手に作り変えてくれれば・・・なんて言ってしまっちゃおしまいか? (^^;


Project "hpDrafter" のページ

ご紹介
Download
マニュアル

アルファな日々
アルファな毎日
永遠のベータ


システム要求

hpDrafter は以下の環境で開発・動作確認をおこなっています。
  • MacBook 1.82GHz/
    MacBook Pro 2.8GHz
  • MacOSX 10.6.2
  • Xcode 3.2.2
まことに残念ながら,上記以外の環境での動作は保証できかねます。


権利等

hpDrafter に関するすべての権利は作者である kokam (以下,作者) が保持します。
・・・と言いたいところですが・・・。
hpDrafter が他者の権利を侵害していないと言い切れないのが辛いところ・・・ 。 特許等,正確に把握していませんし,少なくともアイコンでアップルのリソースを拝借していますし・・・。 フリーやシェア作家の方ですべての権利を保持すると明言している方々はその辺ちゃんと調査されてるんでしょうね。 頭が下がります m(_ _)m
少なくとも,作者に認められる権利に関しては,一切放棄しません。

hpDrafter の実行ファイル,ソース・ファイルは自由にダウンロードおよび使用していただいてかまいません。
しかし,使用によって生じたいかなる損害に関しても作者は責任を負いかねます。 あくまで素人が趣味で作っただけのソフトであることを了解した上で,自己責任で使ってください。

個人利用での改変はご自由にどうぞ。
再配布に関しては,ダウンロードしたそのままの .dmg ファイル,つまり未改変のファイルについてのみ認めます。


References

Cocoa プログラミングや Cocoa Binding についてとても分かりやすく解説されている mkino さんのサイト。
HAPPY Macintosh Developing TIME!


Workshop Cocam, 2010


+
inserted by FC2 system