眠ってしまってからも音楽再生に CPUパワーを消費し続けるのは気が咎めるので Songbirdのためのスリープタイマーを探していた。PCを停止するのであれば 「at HH:MM shutdown /h」でいいのだが、PCは起動しっぱなしでいい。
Songbird Timer 0.2というそのものズバリのアドオンは、対応が Songbird 0.3までで使えず。install.rdfの maxVersionを書きかえても、Songbird 1.0で導入された Media Core APIに対応したコードではないので動かない。無念……
アドオンで、プロセスにつき一度だけ初期化処理を実行したいときってどうすれば? 現在のヘボなやり方では Main/Mini Playerを切り替えるだけでタイマーの再設定と残り時間表示ができなくなる。(タイマー自体は有効なまま)
Mini Playerからメインメニューにアクセスできない(タイマーもセットできない)のは Songbirdの問題。できて当然ではないか?
ついでに、Mini Playerから Main Playerに戻るとフィルタペインが初期状態(「すべて」が選択されている)になっているのも以前から気になっている。Last Track Resumeというアドオンが気に入ってるんだけど、まさしく一つの「Track」しかレジューム再生してくれなくて、「アルバムを再生中、現在○曲目」というような状態を復元してくれないのがもの足りない。そういう所にこだわりはないのかねえ。
Songbirdのシャッフル再生とはランダム再生のことです。
旧PC(SN25P)から移植した SAPPHIRE Radeon X1600 (DDR2 512MB PCI-E)の小さくて高回転のファンが、新PC(COSMOS)では最大の騒音源となったので VGAクーラーを購入した。
10cm×10cmのファンが 2基並んだ大きさというのを想像してなかったのだが、実際に取り付けてみると、片方のファンだけでグラフィックカードの 8割方をカバーできた。もう一基は MSIロゴの入ったヒートシンクにぶつかり、SYSFAN2コネクタに 1-2mm干渉し(MUSASHIを少し下に曲げた)、IDEコネクタに被さりながら(M/Bから 1cmほどはみでてる)、とりあえず収まった。二つ目のファンは VGAクーラーとしてより COSMOS底部のファンの代替として働いている(ただし吸気は、底部前面からではなく後面VGAダクトから行っていると思う)。
GPU Core温度は HWMonitor 1.13.0読みで 46℃から 37℃程度まで下がり、音も静かになった。今度の最大の騒音源は CPUクーラーの V8。
CPUFAN | 715rpm (BIOS設定50%, つまみ Lowest) | これで BIOS読み 32℃ (BIOSの温度は SpeedFan、HWMonitorの値より数度高い) |
---|---|---|
HDDFAN(間接吸気) | 1048rpm (BIOS設定100%) | S.M.A.R.T.報告で 36℃、37℃ |
排気FAN(上面・前) | 580rpm (BIOS設定50%) | |
排気FAN(上面・後) | 635rpm (BIOS設定50%) | |
排気FAN(後面) | 949rpm (75%) | 音が目立たないので少し回転数高め |
MUSASHI(間接吸気) | 最低回転数 | GPU Core 39℃ (HWMonitor読み) |
VGAファン、CPUファン、と最大の騒音源をつぶしてきた結果、現在の最大の騒音源は CMT-SE3のファン!これ以上の静音化は無理です。やりました!
SONY CMT-SE3 スーパーオーディオCD/DVD搭載コンポ
ソニー
(no price)
BIOSで読む SYSTEM Temperatureが CPU温度より 10数度高い 42度くらい。SpeedFanが報告する CPU以外の 3つの温度のうち、1つが他 2つより 15度以上高い 60度前後。一か所だけ際だって高い。手をかざしてみて一番熱いのが DrMOSのロゴのあるヒートシンク付近で、排気ファン 2つと CPUクーラーに囲まれた部分。ヒートシンクの背が低いこともあって空気の流れから取り残されているのかも。グラフィックカードの次にここ(790FXと DrMOS)を効率的に冷却しないで静音化は難しい。
排気ファン(後面)を 100%、排気ファン(上面・後)を 75%にすると 10度以上下がって 47度だが、こうなると PCを起動しているのを忘れてしまうほど静か、というのではなくなってしまう。CPUファンを見た目で V8にしてしまい、CPU自体は静かによく冷えているのだけど、周辺の冷却も考えるとトップフロー式の方が良かったかも。(Noctua NH-C12Pとか)
80×80×10mm^3、2000rpmのファンをヒートシンクにくっつけて 7Vで動かすと、ケースファンより静かな動作音で 3-4℃温度を下げられるみたい。その余裕で排気ファン(後面と上面・後)を共に 75%に。これで SpeedFan読みで 47℃。
790FXや DrMOSは何℃で常用できるものなんだろう。(MSIが、DrMOSの採用によって 70数℃が 50数度に、と宣伝しているから割と耐えてくれるだろうと期待しているが)
最終更新: 2009-12-30T04:34+0900
ケース | CoolerMaster COSMOS 1000 | ¥27000 | パーツ決定はこのケースから。というかこのケースの(値段の高さの)せいで BTOから自作へ方針転換。気密性と静音指向、それと、らしくない見た目が決め手。 |
---|---|---|---|
ケースオプション | CoolerMaster SIDE WINDOW BLACK (for COSMOS S) | ¥6500 | 吸音材はなくなるけど中が見えると楽しい。(自分で組んだからなおさら) |
PSU | Owltech Seasonic M12 600W (SS-600HW) | ¥16500 | 効率はより新しい M12Dシリーズのほうが優れるが、一番低い容量で 750W。そんなには不要。 |
M/B | MSI 790FX-GD70 (MS-7577) | ¥20000 | シックで良い。これを見た後ではピンクとか黄色とか青とか、考えられない。ASUSだけは黒がいい感じだけどオンボードサウンドの評価がやけに低い。 |
CPU | AMD PhenomⅡ X3 720 Black Edition (Socket AM3) | ¥15000 | Windowsスコア 5.8(Windows 7では 6.7)。コア数よりクロック周波数。あと TDPの(Core i7と比べたときの)低さ。 |
CPUクーラー | CoolerMaster V8 | ¥10000 | 見た目と存在感のみで選んだ。ケースと同じ CoolerMaster製品なので目に入った。 |
RAM | BUFFALO FIRESTIX DDR3-1066 2×2GiB (FSX1333D3G-K4G) | ¥7800 | Windowsスコア 5.9(7.5)。赤いヒートシンクが良い。それだけ。そんなわけだから上位の FireStix Infernoも下位の FireStix Heatも不可だし、オーバークロックもしません。DDR3は 3枚組みが多くて閉口した。DDR3は Double-Data-Rate 3の略だっての。i7だけじゃないっての。 |
VGA | SAPPHIRE ATI Radeon X1600 (DDR2 512MiB) | SN25Pから移植 | Windowsスコア 4.5(4.5)(Aero)、4.9(4.6)(Game)。 |
HDD | いくつか | SN25Pから OSごと移植 | Windowsスコア 5.9(5.9)。Windowsのライセンスを有効にするために電話が必要だった*。 |
光学ドライブ | DVDいろいろ対応(IDE接続) | SN25Pから移植 | |
FDD | ふつーの | SN25Pから移植 | M/B付属のケーブルは 5インチベイの上から 3段目までしか届かなかった。エアフローを遮るので普段ケーブルは繋がない。 |
RAID | HighPoint RocketRaid 2302 | SN25Pから移植 |
COSMOSと 790FX-GD70の組み合わせは良い。ケースのフロントパネルのコネクタが全て M/Bに接続できてはりぼてにならない。COSMOSがはじめからそなえるケースファン 4つも SYSFAN1/2/3/4に過不足なくつなげられる。COSMOSの HDDベイは 6つ。M/Bの SB750がサポートする SATAポートも 6つ。JMicronが追加で 2つの SATAポートを提供するので、片方をフロントパネルの eSATAに使っている(ホットプラグはできないかも。HDDのドライバ次第だと思うが)。もう片方は SATA接続の Blu-rayドライブでもつなげばいいだろう。
COSMOSの電源LEDは青色で点灯・消灯の 2モード。HDDアクセスLEDも青色。なんで青色。なんで同じ色。もうね、青色LEDはいらないよ。電源は緑、HDDはオレンジでいいじゃない。
今使ってるディスプレイ―MITSUBISHI VISEO MDT243WGの電源LEDも青色で、点灯、点滅、消灯の 3モード。目に刺さる青色というのがまず間違い。明るさを 100段階で調節できて 0にすると常時消灯もできるがそれでは役目を果たしていないし、気にならなくなるまで暗くすると今度は視認性が悪い。青色でなければそこそこ明るくても気にならなかったはずだ。サスペンドモードを点滅で表したのが二つ目の間違い。点滅周期(約4秒)と同じだけの時間見つめていないとサスペンドモードと電源OFFを区別できない。リモコンの感度が悪いことと相まって、PCを休止する->モニタの電源を切る->切れたかな?->じっと見つめて、暗くて視認性の悪い LEDが点滅していないことを確認する、という面倒を毎日負わされる。(VISEOの前に使っていた BenQ FP937S+は電源ONが黄緑、サスペンドがオレンジだった。調節機能はなかったが不足もなかった)
閑話休題。COSMOSについて。COSMOSの天板は他で言われているように振動して音を出す。いまは無事でもそのうち音を出すようになります。何か物を置くか、内側におもりを貼り付けでもすればよいか。>>>プチプチを詰めました。
排気ファン 3つに囲まれた CPU領域の冷却は申し分がない。5インチベイ 2つをつぶして 12cmファンを取り付けられる(そのためのブラケットは COSMOSに余分に付属していた) HDD領域も、位置が吸気口の直上ということもあって比較的問題がない。拡張スロット領域のグラフィックカードの冷却が COSMOS 1000 一番の癌。どうにかして空気の流れをつくらなければいけない。グラフィックカードに付いている小さくて高回転のファンが現在の最大の騒音源なので、この領域の冷却が静音化にもつながる喫緊の課題。Zalman VNF100は V8や DrMOSのヒートシンクと干渉しそうなので、気は乗らないが Scythe MUSASHIをとりあえず注文した。
今はグラフィックカードのファンが最大の騒音源で目立っているが、これを止めると、静音ケースといえども 3つある排気ファンの音が普通に聞こえてくる。電源と HDD上の吸気ファンの音は多分聞こえていない。排気ファンの交換がこの後の課題だが、空気の流れのあるところに必ず音があるような気がしないでもない。となれば隔離か。>>>夏以外は回転数を 50-75%にしぼることで相当改善する。
SpeedFan 4.37はこのように報告する⁂が
Win9x:NO 64Bit:YES GiveIO:NO SpeedFan:YES Scanning ISA BUS at $0290... Scanning AtiIgp SMBus at $0B00... F75387 found on SMBus at $2E F75133S found on SMBus at $36
GreenPowerCenterⅡによると LPC I/Oは Fintek F71889Fだ。(OC Dialの上に蟻っぽいマークのチップがあって、たしかに Fitek F71889?と読める)
本当に楽しみだから、待ちきれずに届く前に書いてしまう。次の PCのためにケースを買った。
いかにも PCという見た目の無骨なタワー型、ミドルタワー型、スリムタイプの PCには全くそそられない。最近はメーカーが独自に作り込んだ PC(ソニーの VAIO type?とか、HPの TouchSmart PCとか)に注目している。でもメーカーのお仕着せは御免なわけで、Shuttleのキューブ型ベアボーンはメーカーの個性と自由さのバランスがちょうど良かった。今、物欲を一番そそられるのは Appleの Mac miniと、HPの TouchSmart PC。どちらも唯一無二のできばえだと思う。ただ、Mac miniは MacであるがゆえにメインPCになれないし、TouchSmart PCは "Personal" Computerにするのはもったいない。デザインパネルをまとってキューブ型 PCをもういちど……は性能がいまいちだし静音も冷却も限界が知れてるので避けたい。コアを増やすのがはやってる今、Xeonを二個積んでデュアル CPUがやりたいな……(構成カスタマイズ中)……げ、40万円。Quadro FX高すぎ。ゲーミング PCは性能に問題はないし、個性的なんだけど全体に厨のにおいが漂っていて好きになれないな……、200mm大径ファン!前面エアフィルタ!天面にコネクタ・電源スイッチを配置! Antec Nine Hundred Two!素晴らしい! 青色LEDと 9つもある(とはいえ 3.25インチHDDもここに格納する) 5インチベイがいかにもゲーミングPC、いかにも自作PCといった風情でマイナスポイントだけど、合理的な天面アクセスは評価が高い。使える上にパッと見でも(凡百のケースと)ちょっと違うのが良い。ここで COSMOS登場。200mmファンこそ持たないものの、密閉構造と最初から備えた静音対策、落ち着いた、PCケースっぽくないデザインが高評価。大きさだけが難点に思えるも、Extended ATXに対応、Dual Xeonも可能、と考えればむしろ利点。
最終更新: 2010-01-30T00:03+0900
キーといっても 6つのキーのこと。即ち Delete, Insert, Home, End, PageUp, PageDown。MSのキー配置といっても MSオリジナルのとか MSキーボード全てのという意味ではなく、自分の使ってる MSキーボードのキー配置という意味。
省スペースでない一般のキーボードはこうなってる。
Insert | Home | PageUp |
Delete | End | PageDown |
MSの今使ってるキーボードはこう。
Home | End |
Insert | PageUp |
Delete | PageDown |
縦長の配置になっている。
一般のキーボードでは Home, Endボタンが押しづらく(探りづらく)感じる。MSの配置では強いていえば Insertが押しづらいか。けれど Insertキーの出番は挿入・置換モードの切り替えとコピー(Shiftキー併用)だけで、どちらも全く使わないので一向に構わない。
終了。
一般的な配置の場合、Insert、Home、Endをローテートして、
Home | End | PageUp |
Delete | Insert | PageDown |
こうしたら、左上辺(Home, End)、右辺(PageUp, PageDown)、左下角(Delete)として、よく使うキーを捉えられるんでは。(Insertはどうあっても埋もれる運命)
Majestouchがもうじき届くのでキーマップとキートップを変更してみよう。HKLMを利用するとマシン単位の変更になるけど、キーボード本体や、専用ドライバを使ってこの変更ができると他のキーボードへの影響がなくて良いのだけど。
今使っている、今の PCと同時に買ったディスプレイは BenQ FP937S+。当時 33000円也。>20050830p01
(旧) BenQ FP937S+ | (新) MITSUBISHI MDT243WG | ||
---|---|---|---|
サイズ | 19インチ(376mmx301mm) | 24インチ(518mm×324mm) | 大きくなった。 |
解像度 | 1280×1024 | 1920×1200 | 縦にも横にも広くなった。縦が 1080以上だと黒帯がでて嫌いって人がいるけど、俺はむしろ黒帯がないと、知らないところで上下か左右がカットされていそうで気になる。 |
横:縦 | 5:4 | 16:10 | ワイドになった。もうスクウェアにはこだわらない。縦置き二画面より、ワイド大画面に二つのウィンドウを並べる方が手軽(Windows 7では特に)。タスクバー領域のために 16:9より 16:10を選ぶ。 |
画素ピッチ | 0.294mm | 0.270mm | 画素の密度が上がった。文字が小さくなるのは dpiで調節する(追記:調節する必要を感じないのでそのまま)。Petzoldさんの本に、GetSystemMetrics()から得られる解像度や dpiに関係する値を基にした計算方法が載っていたが、理解をあきらめた経緯がある。アプリケーション作者には理解してもらいたい。 |
パネル | TN (Samsung, AUO) | A-MVA (AUO) | TNから VAに。旧モニタが初めての液晶モニタだったためか、スクロール中の文字が読めないことに戸惑ったが、TNパネルに起因する不満はなかった。注視してる範囲なんて狭いから視野角の狭さも気にならなかった。MDT243WGでも左右端に輝度の落ち込みがある。気にしなーい。 |
輝度 | 300cd/㎡ | 500cd/㎡ | 500は明るすぎ。今のモニタでもブライトネス 0で使っている。最初は最高輝度 250cd/㎡の BenQ G2400WDを買う予定だった(輝度半分。消費電力も半分。価格は 3分の 1)。ブライトネス 0で MP Modeをレベル 3にしてもまだ明るい。暗闇で使うモニタではない。白背景だと本が読める。黒背景でも辛うじてだが文字が判別できる。 |
コントラスト比 | 700:1 | 1000:1(2000:1 CRO) | VAパネルの黒に期待。 |
視野角(上下/左右) | 135°/150° | 178°/178°(コントラスト比10) | TNは見下ろす角度以外では使い物にならないので、ごろ寝も縦置きもできない。カタログスペックで VAパネルは IPSと並んでるけど、色の変化なども含めると実用的には IPSより確実に劣るらしい。 |
応答速度 | 8ms | 6ms (gray to gray), 16ms | 旧モニタは黒背景に白文字が覿面に弱かった。最短時間が 6msだとか 8msだとかより、最悪の場合にどこまで落ち込むかの方に注目したい。 |
入力 | DVI-D, ミニD-SUB 15ピン | DVI-D(HDCP対応), ミニD-SUB 15ピン, HDMI×2, D5端子, S端子, コンポジット | PS2を、映ればもうけもんみたいな NOVAC EntaVision HDで接続するのをやめたかった。PS2を捨てられれば MITSUBISHI RDT261WHを買っていた。 |
消費電力 | 40W(最大) | 110W(最大) | 画面サイズの差を差し引いても、TNパネルは消費電力と価格の低さが魅力。 |
VESAマウント | 100mm×100mm | 200mm×100mm | 200×100は一般的じゃない。 |
その他 | グランツーリスモをやっていると目の裏が痛くなる。 | リモコン付き。前後傾以外に首振り、高さ調節可能。前モデルと同様、ミュート時に OSDが出続ける。モードを切り替えたときに右上にでる情報表示(半透明)がうまくタイトルバーとスクロールバーを避けてる。リモコンのミュートボタンがなぜか高速リピート動作。 |
海外レビュー > NEC MultiSync 24WMGX3 Review
Regular Expression Cookbook
Oreilly & Associates Inc
¥ 4,073
「XRegExp: JavaScript regex library」は、「SyntaxHighlighter(Ver.2.0)」で使われていたので知った。XRegExpの作者が、本の著者の一人、Steven Levithan。
XRegExp(Ver.0.6.1)が、Firefox 2,3、Internet Explorer 5.5-8β1、Safari 3.1、Opera 9.27の JavaScriptに付け加えて利用可能にする正規表現の機能は
後方参照も可。String.replace()での使用も可。
「.」が改行にもマッチ。
ほとんどの空白を無意味なものにしたり(=パターンを自由にインデントできる)、行コメント(#から改行まで)を利用可能にする。
(?#ここにコメント)
こんなの。\p{L}, \p{M}, \p{N}, \p{InHiragana}, \p{InKatakana}。否定は大文字のPで \P{}。
文字集合の中で使えないという制限があるが、若干の工夫でなんとかなる。
使い所が限定されていそうだったり、使い方が難しそうな機能として
(独り言) 名前付きキャプチャグループをサポートしたなら、そのキャプチャ結果をスタックして、そこにパターンを繰り返し適用する書き方を用意することで、matchRecursive()なんてスペシャルメソッドは不要にできるのでは? <何を言ってるのか自分でわかってないよ
XRegExpのコンストラクタに「脳log[2008-01-11-p01] 鬼車すごい。正規表現で再帰ができる。」で書いたようなパターン文字列を渡して、再帰を認識するマッチングを行いたいです。
正規表現に関連するいくつかのメソッドを上書きし、ブラウザ間の差異を吸収するとともに、仕様通りの動作に統一したりもする。
IEなどが、幅0の文字にマッチしたときに lastIndexを不当にインクリメントするのを修正。
(独り言) limitを指定したときに戻ってくる配列の要素数が limitと一致しない。XRegExpのバグ? もちろん separatorにキャプチャグループは使っていない。
例えば再帰の深さの上限を 10や 20と決めてしまって、XRegExpのコンストラクタでごにょごにょパターン文字列を展開してみればどうだろう。JavaScriptで正規表現を一から実装しようというプロジェクトではないから、自ずと制限が定まってしまうのだけど、上限付きでもそれが 20もあれば十分という気がする。
驚いた。大部分がライブラリの機能紹介という退屈な(<作者本人が一番よく知っているから)文章に紛れ込んだバグ報告(とも呼べそうにないもの)を不自由な Google翻訳から見つけ出すとは。
1.0のソースも眺めてみたいけれど巨大な変更履歴にちょっと後込み。そのうちね。
♭ Steven LevithanHi. I translated this page using Google Translate. The la..
最終更新: 2014-12-24T10:54+0900
個人的にはなくても不便はないけども、番号を表示する方法のアテができたので。
求める条件は
SyntaxHighlighterのように "view source", "copy to clipboard"機能を用意して、行番号が一緒にコピーされる欠点をカバーするのは次善の策。
WP-Syntaxがやっているように、1行 2列のテーブルを作って、左の列に行番号を、右の列にハイライトされたソースコードを配置するのは、サポートするブラウザも多そうで良さげ。
でも行番号あり・なしで二通りの出力フォーマットを用意するのはスクリプトのサイズの面から避けたい。何と言っても、忘れていたけど、shjs-0.4.2をいじくったものであるこの日記の /shjs/sh_main.js はハイライトするついでに、各行に <span class="odd">、<span class="even">というタグをかぶせていたのだった(しかも 3行の追加だけで)。その方面でいくことにする。
つまり、CSS2の counter-reset, counter-increment, counter に全面的に頼った方法。contentで追加した文字列がコピペ不能なのがかえって幸いした。Fx 3.0.7、Safari 3.2.2、Opera 9.64、IE8で期待通りの表示を確認した。(※末尾に追記あり)
pre.sh_sourceCode.sh_numbered .odd:before, pre.sh_sourceCode.sh_numbered .even:before { counter-increment: sh_sourceCode; content: counter(sh_sourceCode, decimal-leading-zero) ": "; }
--- sh_main.js-0.4.2 Mon May 12 23:07:40 2008 +++ sh_main.js Fri Mar 13 23:29:34 2009 @@ -60,6 +60,8 @@ currentStyle = style; }; + var oddLine = false; + var endOfLinePattern = /\r\n|\r|\n/g; endOfLinePattern.lastIndex = 0; var inputStringLength = inputString.length; @@ -78,6 +80,7 @@ } var line = inputString.substring(start, end); + builder.startElement((oddLine = !oddLine) ? 'odd' : 'even'); var matchCache = null; var matchCacheState = -1; @@ -158,6 +161,7 @@ builder.endElement(); } currentStyle = undefined; + builder.endElement(); if (endOfLineMatch) { builder.text(endOfLineMatch[0]); } @@ -307,8 +311,13 @@ @param element a DOM <pre> element containing the source code to be highlighted @param language a language definition object */ -function sh_highlightElement(htmlDocument, element, language) { +function sh_highlightElement(htmlDocument, element, language, firstline) { sh_addClass(element, "sh_sourceCode"); + if (firstline !== null && ! isNaN(firstline)) { + // cssのセレクタで区別できるように。 + this.sh_addClass(element, "sh_numbered"); + element.style.counterReset = "sh_sourceCode " + (parseInt(firstline) - 1); + } var inputString; if (element.childNodes.length === 0) { return; @@ -345,7 +354,8 @@ if (prefix === "sh_") { var language = htmlClass.substring(3); if (language in sh_languages) { - sh_highlightElement(htmlDocument, element, sh_languages[language]); + // firstlineなんて非標準属性をでっちあげないで + // スクリプトにパラメータを渡す方法は? + // (class属性を乱用するのは気に入らない) + sh_highlightElement(htmlDocument, element, sh_languages[language], element.getAttribute("firstline")); } else { throw "Found <pre> element with class='" + htmlClass + "', but no such language exists";
sh_main.js (version 0.5)への変更も似たようなものだけど、sh_load()の中にも変更すべき場所がある。
sh_main.js (version 0.6)を対応させるのは面倒なので省略。0.4.2も実はそうだったんだけど、shjsはスタイルのネストを想定していない。例えばこれ。
// URL inside comment. <http://vvvvvv.sakura.ne.jp>
ハイライトされた結果の HTMLはこうなる。
<span class="sh_comment">// URL inside comment. <</span><span class="sh_url"><a class="sh_url" href="http://vvvvvv.sakura.ne.jp">http://vvvvvv.sakura.ne.jp</a></span><span class="sh_comment">></span>
フラットな構造で、comment, url, commentと 3つの要素が並んでいる。commentが urlを含むような構造にはならない。0.6ではハイライト前後のタグ構造をマージする仕組みになっているから、0.4.2や 0.5のように ad hocなごまかしができなくて、まずはこの前提を取り払わなければいけない……。
<<< language, number >>>
を
<pre class="sh_language" firstline="number"> </pre>
に変換します。
--- hikidoc.rb.108 Thu Aug 28 22:11:00 2008 +++ hikidoc.rb Fri Mar 13 23:05:05 2009 @@ -335,7 +378,7 @@ @output.preformatted(@output.text(text)) end - BLOCK_PRE_OPEN_RE = /\A<<<\s*(\w+)?/ + BLOCK_PRE_OPEN_RE = /\A<<<\s*(.*\S)?/ BLOCK_PRE_CLOSE_RE = /\A>>>/ def compile_block_pre(f) @@ -665,9 +706,18 @@ end def block_preformatted(str, info) - syntax = info ? info.downcase : nil + syntax, firstline = *(info ? info.split(/\s*,\s*/) : []) + syntax = syntax.downcase if syntax + firstline = /\A[-+]?\d+\z/.match(firstline).to_a[0] if firstline if syntax begin + attr_firstline = firstline ? %Q( firstline="#{escape_html_param firstline}") : "" + @f.print %Q(<pre class="sh_#{escape_html_param syntax}"#{attr_firstline}>), text(str), "</pre>\n" + @f.puts inline_plugin(%Q(shjs #{syntax.dump})) + return + convertor = Syntax::Convertors::HTML.for_syntax(syntax) @f.puts convertor.convert(str) return
お試しください。
Firefox> 行番号が選択されたり選択されなかったりする。見た目の選択範囲に関わらず行番号はコピーされない。 Safari> 行番号も選択範囲に入るがコピーはされない。 Opera> 行番号がコピーされる。 IE8> 行番号がコピーされる。ダメダメだあ。(この機能は封印しよう)
やっぱり一行二列の表を作る方法でいくことにした。
この方法だと、preを一旦取り除いて tableの下に追加する関係からか、同じ preにハイライト処理が二回走ってしまう(getElementsByTagName()で得られる NodeListが liveである、ということ)。sh_sourceCodeというクラス名を目印に、二度目以降の処理をスキップするよう動作を変更した。
Internet Explorerは 8になっても一筋縄ではいかないようで……。左右の列の<pre>の高さが、デフォルトスタイルシートと同じ font-size:80%でないと揃わない。「IE8互換表示」や「IE7」モードだと揃うんだけど。
二重処理を防ごうと Array.prototype.sliceを使って NodeListを Arrayに変換しようと思ったらまたしても IEの壁。オブジェクトを指定してください、と相変わらずわかりにくいエラーメッセージ。(prototype.jsが愚直にループをまわしてるのは IEのせいかもね)
<table>を使うとその中の <pre>の幅が、内容に同期している(最小にして十分なサイズ)。他の <pre>と同じように、いつでも本文と同じ幅に揃えたいなー。
<pre class="sh_javascript" firstline="00339"> このような <pre>を出力すると…… </pre>
sh_putLinenumber: function(element, param, inputString) { var startline = parseInt(param, 10); var opt = /^([-+]?)(0*)(\d+)/.exec(param); var opt_explicit_sign = (opt[1] === '+') ? '+' : ''; var opt_zero_padding = (0 !== opt[2].length) ? new Array(opt[2].length + opt[3].length + 1).join('0') : ''; var re_zero_padding = new RegExp('^0+(?=\\d{' + opt_zero_padding.length + '})'); var nums = inputString.match(/(?:\r\n?|\n)(?!$)|$/g); if (0 !== opt_explicit_sign.length || 0 !== opt_zero_padding.length) { for (var i = 0; i !== nums.length; ++i) { nums[i] = (0 < startline + i ? opt_explicit_sign : startline + i < 0 ? '-' : '') + (opt_zero_padding + Math.abs(startline + i)).replace(re_zero_padding, '') + nums[i]; } } else { for (var i = 0; i !== nums.length; ++i) { nums[i] = '' + (startline + i) + nums[i]; } } var d = element.ownerDocument; var e = {table:'table', tbody:'tbody', tr:'tr', tdLeft:'td', pre:'pre', tdRight:'td'}; for (var p in e) { e[p] = d.createElement(e[p]); } element.parentNode.replaceChild(e['table'], element); e['table'].appendChild(e['tbody']).appendChild(e['tr']); e['tr'].appendChild(e['tdLeft']).appendChild(e['pre']).appendChild(d.createTextNode(nums.join(''))); e['tr'].appendChild(e['tdRight']).appendChild(element); e['table'].className = 'sh_sourceTable'; e['pre'].className = 'sh_sourceCode sh_numbers'; return element; },
341-344、346-354、358行がオプションのために追加した部分。(SyntaxHighlighter2.0の行ハイライト機能はこういときにつかうのだな。イラネと思っていたのを改めます)
固定幅というわけではなくて、0の数以上に繰り上がれば桁が増える。上の場合では 99999行目を超えたとき。テストする段で気付いたが、最低でも 92行のソースコードを貼らないと恩恵に与れない……。
正規表現を持ち出すまでもなく、適切な数の 0をくっつけるだけでよかったんだね(> JavaScriptのビルトインオブジェクトの拡張:ゼロパディング - 気まぐれショウルーム)。先に調べよう。過去に、適切な数の 0を知るために log(10)をとればいいと無邪気に考えていた苦い記憶があるので、最初に正規表現を持ち出してしまった(それもどうだ?)という事情があったりもするんだけど。(Number.toString(10).lengthで済んでしまうなんて!)
<pre>直後の改行は存在しないかのように扱われるが、</pre>直前の改行は存在する(スクリプトで取得できる)ものの表示されない(4つのブラウザで確認)。というわけで、末尾の空行に行番号を付けてしまうと列の左右で行の数が一致しなくなる(だから除外する)。
Google Chrome(1.0.154.53)は
<pre>.innerHTML = <pre>.innerHTML
とやるたびに先頭の改行文字を取り除いていってしまうんじゃないか? 個別のブラウザ対応は切りがないし、完全対応は不可能なので、行番号を付けるときは <pre>の最初と最後の行を空行にしないのが最も安全。
トンデモ IEさんは <pre>.innerHTML= だろうと <tag style="white-space:pre">.innerHTML= だろうと空白をトリミングしてくれますしね。
テストが不十分なので、langファイルの自動読み込み部分など、一度も実行されていない部分が動くかは不明。
最小化方法は JSMin。ためしに YUI Compressorにもかけてみたがローカル変数の短縮を全くやってくれなくて JSMinと大差ない結果だった。一番外側の無名関数の実行部分をとりのぞいたらちゃんとローカル変数名の短縮もやってくれた。
小手先の変更もいくつか加えた。(ブラウザ判別コードの実行を一度だけにしたり << 関数の中で分岐するんでなく、判別結果で関数を取り換える)
♭ 通りすがりのTブラウジングしていたらたまたまこの記事を見つけました。 キー配置の意見は僕も全く同じです。 次キーボードを買い換える..