P_BLOG には投稿画面にマークアップ用のタグボタンが用意されてるんですが、Safari で利用する限り、あまり使い勝手が良くありませんでした。例えば、タグボタンを押して <p></p> を入力した後、開始タグと終了タグのあいだにカーソルを持ってきて <a href=""></a> タグを入力しても、</p> の後ろにタグが挿入されるのでした。これはちょっと使いにくいです。恐らく JavaScript のブラウザごとの仕様の問題だと思うのです。というのは先日、Firefox で投稿画面にアクセスしてみたところ、きちんとカーソルがある位置にタグが挿入されることが判明しました。ちょっといじれば Safari でもカーソル位置にタグが挿入されるようになるのではないかと思い、ちょっと Hack してみました。
Safari でも <br /> ボタンだけはきちんとカーソル位置に挿入されるので、何が違うのだろうと include/user_include/tag_buttons.inc.php を開いてみました。するとデフォルトでは以下のように記述されていました。
$tag_buttons =<<<EOD
<input onclick="wrap('p', '', '');" onkeypress="" type="button" value="p" tabindex="1" class="tagbutton" />
<input onclick="Tag(this.value, 0);" onkeypress="" type="button" value="br" tabindex="1" class="tagbutton" />
<input onclick="wrap('a', '', 'href');" onkeypress="" type="button" value="a" tabindex="1" class="tagbutton" />
<input onclick="wrap('strong', 'stronger', '');" onkeypress="" type="button" value="strong" tabindex="1" class="tagbutton" />
<input onclick="wrap('blockquote', '', 'cite');" onkeypress="" type="button" value="quote" tabindex="1" class="tagbutton" /><br />
<input onclick="wrap('ul', '', '');" onkeypress="" type="button" value="ul" tabindex="1" class="tagbutton" />
<input onclick="wrap('ol', '', '');" onkeypress="" type="button" value="ol" tabindex="1" class="tagbutton" />
<input onclick="wrap('li', '', '');" onkeypress="" type="button" value="li" tabindex="1" class="tagbutton" />
<input onclick="wrap('code', '', '');" onkeypress="" type="button" value="code" tabindex="1" class="tagbutton" />
<input onclick="wrap('abbr', '', 'title');" onkeypress="" type="button" value="abbr" tabindex="1" class="tagbutton" />
<br /> だけ onclick="Tag(this.value, 0);" となっています。JavaScript のことはまったく分からないのですが、onclick="wrap('', '', '');" となっているところをすべて onclick="Tag(this.value, 0);" にしてしまえば良いのではないかという仮説を立てました。するとビンゴ、これでカーソル位置にタグが挿入されるようになりました。
しかし一部は Undefined という風になってしまいます。タグボタン関連のことは恐らく script.js でまとめて記述されているのだろうと推測し、include/script.js を開いてみました。177行目あたりに TAG BUTTON に関する記述がありました。204行目以降の部分で定義されていないタグボタンが Undefined となることが想像できたので、定義されていないものを自分で定義します。僕は以下のように記述しました。
function Tag(tag_value, bin) {
cmt_txt = bin ? document.forms.addform.bincomment : document.forms.addform.comment;
var TagLookup = {
'p' : '<p></p>',
'div' : '<div class=""></div>',
'span' : '<span class=""></span>',
'strong' : '<strong></strong>',
'img' : '<img src="https://resources.portalshit.net/" width="" height="" class="" alt="" />',
'a' : '<a href="" title="" class=""></a>',
'ul' : '<ul>¥n<li></li>¥n</ul>',
'ol' : '<ol>¥n<li></li>¥n</ol>',
'li' : '<li></li>',
'quote' : '<blockquote cite="" title="">¥n<p></p>¥n</blockquote>',
'br' : '<br />',
'code' : '<code></code>',
'abbr' : '<abbr title=""></abbr>',
'tag' : '<>'
};
これでとてもマークアップが楽になりました :-)
<蛇足>
いま気付いたんだけど、Firefox だと img を選択するとき width と height を拾ってくれないみたいです。(JavaScript をいじったせいかな?) やっぱ Safari がイチバンですね。