at posts/single.html

tDiaryプラグインのJavaScript動的ロード方法について調べてみた

日曜日に少し早起きしたので、日記を書く。 引き続き、tDiaryのJavaScript比重を高める計画(というほどのものではないけど) - ただのにっき(2011-06-07)より。

最近プラグインから.jsファイルのロードをコントロールできるようにしたので

と書かれているので、tDiaryプラグインがどうやってJavaScriptを呼び出せば良いのかを調べてみた。

まずはGitHubから最新のソースを取得する。

$ git remote show tdiary
* remote tdiary
  Fetch URL: git@github.com:tdiary/tdiary-core.git
  Push  URL: git@github.com:tdiary/tdiary-core.git
  HEAD branch: master
  Remote branches:
    master                       tracked
    refs/remotes/tdiary/testable stale (use 'git remote prune' to remove)
    tdiary-request               tracked
  Local branch configured for 'git pull':
    testable merges with remote testable
  Local ref configured for 'git push':
    master pushes to master (up to date)

$ git pull tdiary master

さっそくjsフォルダの中を見てみる。

$ ls js/
00default.js    amazon.js       category.js

なるほど。プラグインフォルダと同じようなファイル構成になってる。 ということは、tDiaryプラグインから制御しているかも。 プラグインフォルダをjavascriptで検索。

$ grep javascript -i plugin/*
plugin/00default.rb:    %Q[<meta http-equiv="Content-Script-Type" content="text/javascript; charset=#{h charset}">]
plugin/00default.rb:    %Q[<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.js" type="text/javascript"></script>]
plugin/00default.rb:    html = @javascripts.sort.map {|script|
plugin/00default.rb:            %Q|<script src="js/#{script}" type="text/javascript"></script>|
plugin/00default.rb:            <script type="text/javascript"><!--
plugin/00default.rb:            #{@javascript_setting.map{|a| "#{a[0]} = #{a[1]};"}.join("\n\t\t")}
plugin/00default.rb:                    <script type="text/javascript"><!--
plugin/00default.rb:    <script language="JavaScript"><!--

00default.rbが引っかかったので、中を見てみる。

$ vim plugin/00default.rb
361 def script_tag
362    html = @javascripts.sort.map {|script|
363       %Q|<script src="js/#{script}" type="text/javascript"></script>|
364    }.join( "\n\t" )
365    html << "\n" << <<-HEAD
366       <script type="text/javascript"><!--
367       #{@javascript_setting.map{|a| "#{a[0]} = #{a[1]};"}.join("\n\t\t")}
368       //-->
369       </script>
370    HEAD
371 end

script_tagメソッドでJavaScriptファイルの呼び出しをやっていることが分かった。 @javascript 変数の配列内に入っているJavaScriptファイル名を呼び出している。 とすると、どこかで@javascriptに値をセットしているはず。

次に@javascriptで検索。

$ grep @javascripts -r *
plugin/00default.rb:    html = @javascripts.sort.map {|script|
tdiary/plugin.rb:                       @javascripts = []
tdiary/plugin.rb:                       @javascripts << script unless @javascripts.index( script )

tdiary/plugin.rbを発見。開く。

$ vim tdiary/plugin.rb
307       def enable_js( script )
308          @javascripts << script unless @javascripts.index( script )
309       end

enable_jsメソッドにファイル名を渡せば@javascript配列に格納してくれるのか。 次はもちろんenable_jsで検索。

$ grep enable_js -r *
ChangeLog:      * added Plugin#enable_js and Plugin#add_js_setting method for inserting javascripts.
doc/HOWTO-make-plugin.html:<tr><th style="white-space: nowrap;">enable_js( script_file_name )</th><td>jsディレクトリ配下にあるJavaScriptを有効にする(例: 'amazon.js')。このメソ ッドで有効にしたファイルは、HTMLヘッダ内に呼び出された順番に埋めこまれます。</td></tr>
doc/HOWTO-make-plugin.html:<tr><th style="white-space: nowrap;">add_js_setting( var, val )</th><td>enable_jsで埋めこまれたJavaScriptへのパラメタを受け渡す。「var」には変数名を 与えます。標準では「$tDiary.plugin.プラグイン名.変数名」で、「$tDiary.plugin」までは名前空間としてtDiary側で確保済みです。「val」には変数に与える値をJavaScriptとして有効な形の 文字列で指定します。例えば「abc」という文字列であれば「"'abc'"」のようにする必要があります。</td></tr>
misc/plugin/amazon.rb:  enable_js( 'amazon.js' )
misc/plugin/category.rb:        enable_js( 'category.js' )
plugin/00default.rb:enable_js( '00default.js' )
tdiary/plugin.rb:               def enable_js( script )

おお。doc/HOWTO-make-plugin.htmlに使い方が書いてあることが分かった。 また、 plugin/00default.rb や misc/plugin/amazon.rb に呼び出しの例がある。 各プラグインで、以下のように指定すればいいのね。

enable_js( 'amazon.js' )

これまでは自前で <script src="..."> と書いていたので、かなり楽になってる。

まとめ

tDiary: How to make pluginにちゃんと使い方が書いてあった。

enable_js( script_file_name ) jsディレクトリ配下にあるJavaScriptを有効にする(例: 'amazon.js')。このメソッドで有効にしたファイルは、HTMLヘッダ内に呼び出された順番に埋めこまれます。
add_js_setting( var, val ) enable_jsで埋めこまれたJavaScriptへのパラメタを受け渡す。「var」には変数名を与えます。標準では「$tDiary.plugin.プラグイン名.変数名」で、「$tDiary.plugin」までは名前空間としてtDiary側で確保済みです。「val」には変数に与える値をJavaScriptとして有効な形の文字列で指定します。例えば「abc」という文字列であれば「"'abc'"」のようにする必要があります。

関連する日記