忘れたときに備えた記録

トップ 最新 追記
2005|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|11|12|
2009|01|02|03|04|05|06|10|12|
2010|06|07|08|12|
2011|07|09|
2012|09|11|
2013|02|03|09|
2015|10|11|
2016|01|08|11|
2017|02|08|10|
2018|11|

2005-08-02(Tuesday)

プラグイン化

すったもんだの挙句、XHTML化キットはプラグインになりました。後でtar.gzファイルの形式でもアップしますが、Subversionの使える環境なら、

~/$ svn co http://svn.hinet.mydns.jp/x-tdiary/trunc x-tdiary

としてダウンロードしたファイルをtdiary/plugin/ディレクトリにコピーするか、@options['sp.path']で指定したディレクトリにコピーして設定画面の「プラグイン選択」で有効にすれば使えるようになります。

Tags: x-tdiary

数式プラグインのデモ

文中の数式 \int_a^bf(x)dx

単独の数式

URL:HTMLやXHTML関連の資料

http://www.nextindex.net/

Tags: メモ

2005-08-03(Wednesday)

オブジェクトがあるクラスまたはそのサブクラスのインスタンスであるかどうかの判定

hiraku@shako:~/tmp$ cat test.rb
#!/usr/bin/ruby
class Base
end

class Sub < Base
end

a = Sub.new
puts a.class
if a.is_a? Base then
  puts "a is subclass of Base"
end

hiraku@shako:~/tmp$ ./test.rb
Sub
a is subclass of Base

Tags: Ruby

Mix-in

#!/usr/bin/ruby
module TestModule
  def method
    puts %Q[This is TDiary::Plugin.method defined at TestModule]
  end
end

class ClassA
  include TestModule
end

class ClassB
  include TestModule
end

class ClassC
end

a = ClassA.new
b = ClassB.new
c = ClassC.new
a.method
b.method
c.method

This is ClassA.method defined at TestModule
This is ClassB.method defined at TestModule
./test.rb:24:in `method': wrong number of arguments (0 for 1) (ArgumentError)
        from ./test.rb:24

Tags: Ruby

2005-08-04(Thursday) tDiaryのバージョンアップ

tDiary-2.0.2

を入れてみたので、書き込みのテスト。

本日のツッコミ(全1件) [ツッコミを入れる]

_ ひらく [ツッコミのテスト]


2005-08-05(Friday)

オブジェクトが、あるメソッドを持つか否かの判定

#!/usr/bin/ruby

class Base
   def test
      if respond_to?('meth') then
         puts 'Defined'
      else
         puts 'Not defined'
      end
   end
end

class Sub1 < Base
end

class Sub2 < Base
   def meth
   end
end

Sub1.new.test
Sub2.new.test

結果

Not defined
Defined

Tags: Ruby

moduleがinitializeメソッドを定義しているときの振る舞い

#!/usr/bin/ruby

class Base
   def initialize
      puts 'Base init'
   end
end

module Mod
   def initialize
      puts 'Mod init'
   end
end

class C1 < Base
end

class C2 < Base
   include Mod
end

class C3 < Base
   include Mod
   def initialize
      puts 'C3 init'
   end
end

class C4 < Base
   def initialize
      puts 'C4 init'
   end
   include Mod
end

C1.new
C2.new
C3.new
C4.new

結果

Base init
Mod init
C3 init
C4 init

派生クラスが独自のinitializeを持たずにincludeすると、モジュールのinitializeが基底クラスのものに優先する(C2)

includeの位置に関わらず、独自のinitializeを持っていればそれが優先される(C4)

Tags: Ruby

さらに、moduleやincludeしたクラスのinitialize内でsuperを呼んだ場合

#!/usr/bin/ruby

class Base
   def initialize
      puts 'Base init'
   end
end

module Mod
   def initialize
      puts 'Mod init'
      super
   end
end

class C5 < Base
   include Mod
   def initialize
      puts 'C5 init'
      super
   end
end

C5.new

結果

C5 init
Mod init
Base init

includeしたクラスのinitializeでsuperするとモジュールのものが、モジュールのintializeでsuperすると基底クラスのものが実行される。

Tags: Ruby

if修飾子、unless修飾子の返り値

#!/usr/bin/ruby
def a
   1 unless 2
end

def b
   1 if 2
end

puts a
puts b

結果

nil
1

リファレンスに書いてあるけど見落として、メソッドの返り値がおかしくなってはまったのでメモ。

Tags: Ruby

2005-08-07(Sunday)

代入メソッドのクラス内での使用

#!/usr/bin/ruby
class Test
   def initialize
      @n = 0
   end

   def v=(n)
      @n=n
   end

   def v
      @n
   end

   def test
      v = 11
   end

   def test2
      self.v = 12
   end
end

o = Test.new
o.v = 10
puts o.v

o.test
puts o.v

o.test2
puts o.v

結果

10
10
12

クラスのメンバメソッドから代入メソッドを呼ぶつもりで v=11 としても、 def v=(n)... は実行されない。

self.v=12 とすると実行される。

Tags: Ruby

MathMLで分数を<>で囲むのは無理?

以下、手書きで書いたMathML

<math xmlns='http://www.w3.org/1998/Math/MathML' display='block'>
<mfenced open='{' close='&gt;'>
<mfrac><mn>1</mn><mn>12</mn></mfrac>
</mfenced>
</math>

Tags: メモ

TeXなら

\left<\frac12\right>

って出来るけど、MathMLだとダメっぽい。


2005-08-08(Monday)

x-enabler.rbとMathMLプラグインのHikiへの適用

もしかして可能なのではと思って試してみたら、いくつか問題点があったので、メモ。

1.URLのパラメータにxhtml=onとやると、dispatchでエラーを起こす。Hikiが知らないパラメータを与えると出るエラー?

->基本的にXHTMLモード?

2.&を&amp;に展開してからプラグインに渡している?

->正規表現を書き換えて対応?

3.編集画面をXHTML化しようとすると、ブラウザ側でエラー。

->編集時のURLのパラメータを見分けて、そこだけHTMLモード?

Tags: メモ

試作してみた

ここで一応動いています。のっけからXHTMLで動くんで、MozillaとかFirefoxで見てください。


2005-08-09(Tuesday)

フォント未対応?

\longmapstoがうまく表示できない。x-math.rbでは'&longmapsto;'に変換して出力しているが、'?'となってしまう。

「定義されていない実体参照」のエラーが出ないので、単にフォントがないだけと思われる。

Tags: MathML

hatが伸びない

x-math.rbで\widehat{abc}とやっても、bにしか\hatが付かない。他の記号だと、きちんと横に伸びるんだけどなぁ。

Tags: MathML

フォントサイズの一括変更

ここを参考にして、スタイルシートに

math, math[mode="inline"] {
  display: inline;
  font-family: CMSY10, CMEX10, Symbol, Times;
  font-style: normal;
  font-size: 200%
}

とか書くと拡大される。200%は大きすぎるけど、100%だと小さい感じがするので、120%くらい?

tDiaryのappend-css.rbで追記してもうまく動かないので、スタイルファイルそのものを書き換える必要がある。

Tags: MathML

追記

append-css.rbで書いた内容がXHTMLモードでは有効にならないのは、<style>要素の中身が<!-- -->でコメント化されているのが原因の模様。XHTMLモード用のappend-css.rbを書けば、手軽に変更できそうだ。

さらに追記

こっちで対応。


2005-08-10(Wednesday)

dateコマンドでファイル名に使える現在日時の文字列を得る方法

$ date +"%Y_%m%d_%H%M%S"

Tags: メモ

XHTMLでの<script>要素や<style>要素

W3Cの資料によれば、XHTMLにおいてはコメントの <!-- と --> ではなく、 <![CDATA[ と ]]> で囲むべし、とのこと。

試してみると、Firefoxではうまく動いた。

Tags: x-tdiary

トラックバックのテスト

テスト

recent_trackback3.rbの設定

tDiary-2.0.2に付属しているものだと、[各TrackBack間に挿入する文字列]のデフォルトが'&nbsp'(末端の;が抜けている)になっているので、XHTML化したときにエラーになる。

最新版のものではこのオプション自体が廃止されているので、エラーは出ない。

2.0.2でも、XHTML化のまえに設定画面で直しておけばOK。

Tags: x-tdiary

2005-08-11(Thursday)

Hikiのプラグインに渡される文字列

Hikiでは、プラグインに渡される文字列は、エスケープ済みのものになるらしい。つまり、プラグインのパラメータとして文字列"&"を与えると、"&amp;"が実際のメソッドに渡される。

逆に、'\\'は'\'ではなく、そのまま'\\'として渡される。

Tags: メモ

入れ子になった正規表現

#!/usr/bin/ruby
REG = /(0(1(2))(3))/
str = '0123'
puts str.slice(REG, 1)
puts str.slice(REG, 2)
puts str.slice(REG, 3)
puts str.slice(REG, 4)

結果

0123
12
2
3

Tags: Ruby

XHTML化の判定についてメモ

色々と試行錯誤してきてちょっと混乱してきたので、さっき思いついたよさげな案をメモ。

まず、判定に使う変数,パラメータは、主にURLで指定する"xhtml"(未定義、off, on, force)、設定画面で指定する"@conf['x-tdiary.default'](以下、default)"、XHTML対応ブラウザか否かを表す"supported_agent"の3つ。

まず、xhtml=forceの場合は、必ずXHTMLモード。ブラウザによってはダウンロードが始まったりする。

次に、defaultがfalseの場合。

xhtmlが未定義またはoffならHTMLモード、onの時は更にsupported_agentを見てfalseなら警告画面行き、trueならXHTMLモード。

defaultがtrueの場合は、xhtml=offのときはHTMLモード。

xhtml=onの場合は、supported_agent=trueならXHTMLモードで動いて良い。supported_agent=falseなら警告画面行き。

xhtmlが未定義の場合。supported_agentがtrueならXHTMLモード。falseなら警告画面、ではなくHTMLモードで動かす。

警告画面では、本来のページのHTMLモードなリンクと、xhtml=forceなリンクを用意して選べるようにしておく。

例えば、IEでリンクをクリックして飛んできた場合。標準のIEは、XHTMLのページを指定されるとダウンロードを始める。

xhtml=offならHTMLモードに飛んで閲覧できる。

xhtml=onなリンクを踏んだ場合、supported_agentで引っかかって警告画面行き。

xhtml未定義の場合は、defaultの値に従うが、trueならsupported_agentで引っかかってHTMLモード。falseならそのままHTMLモード。つまり、必ずHTMLモード。

xhtml=forceなら、問答無用でXHTMLページに飛んでしまい、わけがわからないままダウンロードが始まってしまう。

ので、外部にxhtml=forceなリンクが出来ないようにする必要がある。具体的には、外部のリファラーを表示するサイトにxhtml=forceなページから飛んでいくと、xhtml=forceなリンクが出来る。

ので、xhtml=forceな場合は外部へリンクしないようにする。<a>タグのhrefパラメータを正規表現の置換で削除することにする。タグ自体は、nameパラメータを参考にして飛んでくる場合があるので残しておく。

例2

アンテナなどの巡回チェッカの場合。

とりあえず、トップページのindex.rbが指定されていると仮定する。xhtmlパラメータは未定義になる。また、supported_agent=falseと仮定する。

すると、defaultの値によって対応が決定される。trueの場合は、supported_agentに引っかかってHTMLモード。falseならそのままHTMLモード。どっちにしても、必ずHTMLモードのページを巡回するようになる。

てな感じで、多分良さそう。この場合分けを実装したら1.0PR版てことにしてしまおう。


2005-08-12(Friday)

xhtml_onoffメソッドのメモ

リンク用のパラメータ文字列を生成するメソッドの振る舞いが、少しややこしくなってきた。CGIスクリプトのソースには長いコメントを埋めたくないので、こっちにメモ。

パラメータとして flg=[true, false, nil] をとる。@conf['x-hoge.default']はdefaultと略す。

flg=trueならXHTMLモードへのリンクを、falseならHTMLモードへのリンクを作る。

nilならflg=(現在のモード==XHTMLモードかつsupported_agent?)として判定する。

XHTMLモードは、default=trueかつsupported_agent?=trueなら明示する必要がない。

つまり、flg&&default&&supported_agent?のときxhtml=onは不要。

HTMLモードは、default=falseまたはsupported_agent=falseなら明示する必要がない。

つまり、!flg&&(!default || !supported_agent?)のときxhtml=offが不要。

以上2条件の場合は空文字列を返し、それ以外はflgの値にしたがって"xhtml=onまたはoff"を返す。

Tags: x-tdiary

Hikiでのxhtml_onoffメソッド

Hikiの場合、本文で想定外のタグの閉じ忘れがないと仮定して良いはずなので@conf['x-hoge.default']は省略して常にtrueであるとする。

パラメータとして、flgをとるのはtDiaryと同じ。

nilならデフォルトを要求しているのでflg=supported_agent?とする。

falseとtrueの場合は、tDiaryと同じ。

んで、XHTMLモードは、supported_agent?=trueかつflg=trueの場合に明示の必要がない。

HTMLモードは、supported_agent?=falseかつflg=flaseの場合に明示の必要がない。

つまり、flg==supported_agentの場合、モード指定を明示する必要がない。

それ以外の場合は、指定されたモードを明示する。

Tags: x-hiki

XHTML化するモード

閲覧、編集、プレビューの3つのみXHTML化する。

つまり、params[preview][0]!=nilの場合か、そうでないならば@command="view"または"edit"の場合にのみXHTML化する。

Tags: x-hiki

2005-08-14(Sunday)

XHTMLのヘッダ

今日、ソースを確認していたら、先頭に<?xml ....?>を入れるのを忘れている。後で直さないと。

Tags: メモ

Konquerorのagent

"like Gecko"という記述があって、Gecko系列と誤認してしまう。んで、ためしにMathMLなページを表示させてみたけど、案の定ダメ。対応を考えないと。

Tags: メモ

IE + MathPlayer

あれこれ試し中。mod_rewriteを使って拡張子をxmlと見せかければ、XMLページとしては認識できるようだ。でも、途中でエラーが出る。なんなんだろうか。

Tags: メモ

2005-08-16(Tuesday)

IEでtDiary+XHTML化キット

IE+MathPlayerで上手く表示できなかった原因が判明した。HTMLヘッダのContent-Typeで、"xhtml+xml;charset=..."となっていたのを、"xhtml+xml"としてcharsetの部分を抜いたら、IE+MathPlayerで見られるようになった。

本文がEUCでも、HTML本文の<head>タグ内で設定しているから大丈夫っぽい。後で確認しよう。

Tags: メモ

続き

確認した。

<?xml version="1.0" encoding="EUC-JP" ?>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=EUC-JP" />

これらだけだと、文字化けしたが、

<html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP">

となっていたのを

<html xmlns="http://www.w3.org/1999/xhtml" lang="ja-JP" xml:lang="ja-JP">

としたら正常に表示されるようになった。

以前トラックバックをくれたヤンさんのところで起きていた文字化け問題も、これで解決できるんじゃないかなと思うんですが、どうでしょうか?

さらに続き

その後、まっさらけのデータに、「日本語のテスト」とだけ入れて作った日記を表示させたら、やっぱり文字化け。

さんざん試しまくった挙句、上記のhtmlタグの条件を満たした上で、ヘッダ部分にこの「忘れたときに備えた記録」のと同じ文字列が入っていると、日本語が表示された。

ということは…?

最後(ちょっと修正)

CGI側でlangやらcharsetやらを言語関係の設定を一切出力しない環境を作ってみた。

すると、Firefoxでは一気に文字化けするが、IEでは平然と日本語を表示する。

そこで、再びFirefoxで文字化けしない状態に戻し、今度はとして、XML宣言からencodingを抜いてみた。また、HTTPヘッダのContent-Typeのcharsetもなし。

すると、IEでは日本語を表示できたが、Firefoxでは文字化け状態。

どうもIEは、指定をしなければ本文に使われている文字で判定して文字化けせずに表示でき、XML宣言でencodingを指定すると文字化けを起こすようだ。なんだこりゃ。

結論

XHTML化キットは当分IE+MathPlayerには対応しません。

IEの次のバージョンでちゃんと対応してくれたらいいなぁ。

前言撤回

対応しませんといった舌の根も乾かないうちに、対応することにしてしまったり。

結局、MathPlayerの場合は条件分岐してXML宣言にencodingを付けない事で対応しました。僕のサイトは最新版で動いているので、ここと、HikiはIE+MathPlayerでも見られるようになった筈です。

明日もう一回動作確認したら、パッケージング。


2005-08-19(Friday)

Nさんへ

僕の作ったモノがきっかけで増えたりしたら、作者冥利に尽きるんですけどねぇ。

ところで、ツッコミは不特定多数の方が書き込めるので、恐らくはセキュリティの都合上と思いますが、書き込める物が極めて限定されています。書けるのは特別な機能を持たない文字列とURLぐらいで、例えばHTMLタグなども書き込めません(URLも、ツッコミスパムなるものが生まれてしまい、こういったものが用意されました)。

Wikiの方は(Wiki設計者が用意したコマンドの範囲内で)いくらでも書けるので、そちらの方でよろしくお願いします。

ちなみに…

Source

<%=math '\int_0^1 x^{x^x}dx'%>

Result

\int_0^1 x^{x^x}dx

hamadaさんへ

僕もWikiは、これまでほとんど触ったことがありませんでした(せいぜい、Wikipediaを見るくらい)。自分が管理していないページをいじってしまう事に気後れしていたのだと思うのですが、最近、いじって初めて分かる面白さのようなものを感じました。


2005-08-20(Saturday)

デフォルトスタイルをWikiスタイルに

うっひゃ〜。デフォルト信奉者として大慌てでmathemptスタイルをsnapshotから削除。

流用してwikimathスタイルを作らないと。

MathWikiスタイル

Wikiスタイルではプラグイン呼び出しを1行で完結する必要があるので、複数行のパラメータを渡せない。 これでは array 環境が悲しいことになるので、なんとかイカサマして複数行のパラメータを渡せるようにする。 その上で、$...$記法と\[...\]記法を導入しよう。

wiki_style.rbを見ると、initializeでパーサオブジェクトを作って、to_srcを渡している。 だから、to_srcをオーバーライドして、複数行のプラグイン呼び出しを探し、あるならその中の改行を、例えば"\001"に置換する。

これで、パーサに渡されるときには1行にまとまっている。

to_htmlを実行すると、パーサにWiki形式のデータを解析させて、最後にhtmlに変換したデータを返している。 だから、to_htmlをオーバーライドして、superを実行後、"\001"を改行に置換する。

その後、実際にプラグインを呼び出したりするのはtDiary本体の仕事で、任せていいはず。

$...$記法の追加は、オーバーライドしたto_srcで、複数行のプラグイン呼び出しの前に$...$を{ {...} }に置換すれば、中身の...が複数行でも大丈夫になる。

escapeHTML が行われる条件

wiki_style.rbに、

s = CGI::escapeHTML( s ) unless stat == :GS

とある。

GS はプラグインの開始を意味する記号なので、escapeHTML はプラグインのパラメータ以外でのみ行われる。
Tags: tDiary

MathWikiスタイル

さっき書いたやり方は、セクションクラスとスタイルクラスをごっちゃにしてる。 改めて、作るべき挙動を考える。

全体の流れ

スタイル#to_htmlでhtml化したデータを生成する。内部では to_html4 または to_chtml メソッドを呼び出している。

呼び出したメソッド内では、 each_section し、各セクションのhtml化メソッドを実行。 返してきた文字列を繋げて to_html に返す。

to_html は返されたメソッドを呼び出し元に返す。

だから、スタイルクラス.to_htmlから呼び出したときのみ each_section で MathWikiSection オブジェクトを作り、必要な置換を行ってhtmlを生成させるためには、各クラスのメソッドを以下のように改変すればいいはずだ。

スタイルクラス

to_html メソッドで、フラグを立て、super する。

each_section メソッドで、フラグが立っていたら各セクションを元にMathWikiSectionクラスを新たに作り、それを yield に渡す。 フラグが立っていないなら、そのまま各セクションを yield に渡す。

セクションクラス MathWikiSection

元のto_srcから全体のソースを取り出し、先に書いた置換を行い、複数行のパラメータを1行にまとめる。

置換後のソースをsuperに渡して、各インスタンス変数を作らせる。

html4 と chtmlでは、最初にsuperし、それから先に書いた2つ目の置換(1行にまとめたパラメータを複数行に戻す等)を行い、呼び出し元に返す。


2005-08-21(Sunday)

MathWikiスタイル

早速実装に入るが、その前に昨日の修正。

2回目の置換をセクションクラス#html4, chtmlで行うとしたが、それを呼び出しているスタイルクラス#to_htmlで行えば一箇所に纏められる。