mce_table がアドバンストツールバーを上書きする不具合を修正しました。

本日公開したばかりで、早速の不具合ですいません。

ビジュアルリッチエディタにテーブル編集用のボタンを追加するプラグイン

上記のプラグインを適用すると既存のアドバンストツールバーが消えてしまうという不具合がありました。
うっかりミスです。すいません。

早速修正しておきましたので、もしすでにご利用中の方はすいませんがインストールしなおしてください。

修正前

既存のアドバンストツールバーがない!

修正後

アドバンストツールバーの下段にtable関連のボタンが追加される。

WordPressのTinyMCEにテーブルのボタン

WordPress のビジュアルリッチエディターにテーブルを編集するためのボタンを追加するプラグインを作った。

ビジュアルリッチエディタにテーブル編集用のボタンを追加するプラグイン

最近、WordPress サイトばかりつくっていて、プラグインやらテーマやらを量産しているので、しばらくこういうコネタのプラグインの公開が続くと思います。

  • カスタムなCSSを生成するプラグイン(外部CSSですが物理的にファイルをおくわけではありません。)
  • リッチエディター上でボタンでポンでテンプレートを挿入したり作ったりできるプラグイン
    (たとえば納入事例など、一定のレイアウトで記事を書きたい時に便利なやつ)

以上は、この数日中ではないかと。。。

JavaScript でカウントダウン

特定の日時までのカウントダウンをリアルタイムに表示する JavaScript のクラスを作った。

サンプル – JavaScript によるカウントダウン

サンプルのソース

<div id="countdown">
    <div><span id="time">2011/01/01</span> まで</div>
    <div id="timer"></div>
</div><!--end #countdown-->
 --中略--
<script type="text/javascript">
var datetime = document.getElementById('time').childNodes[0].nodeValue;
var cd = new countDown(datetime);
cd.message = 'あけおめ!';
cd.display('timer');
</script>
  1. var cd = new countDown() で日時を渡して cd オブジェクトを生成。
  2. cd.message プロパティにカウントダウン終了時のメッセージを設定。
  3. cd.display() メソッドで、タイマーを挿入したい要素の ID 属性を指定。
  4. タイマーの数値に指定された、counter というクラス属性に対して、CSS で文字サイズを拡大。

countdown.class.js のソース

countDown クラスのソースは以下のとおり。 (ダウンロードはこちら

適当にカスタマイズしてご利用下さい。

function countDown(time) {
    var day = new Date(time);
    this.period = day.getTime();
}

countDown.prototype.message = '終了しました!';

countDown.prototype.display = function(ele){
    this.obj = document.getElementById(ele);
    this._getCounter(this);
}

countDown.prototype._getCounter = function(_this){
    var timer = setTimeout(function(){_this._getCounter(_this);}, 1000);

    var now = new Date();
    var total = parseInt((this.period - now.getTime()) / 1000);
    if (0 >= parseInt(total)) {
        _this.obj.innerHTML = _this.message;
        clearTimeout(timer);
        return;
    }
    var sec = total % 60;
    var min = ((total - sec) % 3600) / 60;
    var hour = (total - min * 60 - sec) / 3600;

    _this.obj.innerHTML = '';

    var data = {
        '時間': hour,
        '分':   min,
        '秒':   sec
    };

    for (var i in data) {
        var node = document.createElement('span');
        node.className = 'counter';
        var value = document.createTextNode(data[i]);
        node.appendChild(value);
        _this.obj.appendChild(node);
        _this.obj.appendChild(document.createTextNode(i));
    }
}

setTImeout() のあたりが、いまいちエレガントじゃない気がする。ていうかよくわからん。

JavaScriptでHTMLエスケープ

昨日、公開した WordPress プラグイン “mce_preformatted” は、整形済みテキストを本文に挿入するために、 textarea 内に入力されたテキストの HTML エスケープを行っている。

通常、HTML のエスケープには正規表現を使用するが、このプラグインでは違うアプローチで HTML をエスケープしている。

通常の方法

以下は正規表現を使用した方法。

function htmlEscape(s){
	s=s.replace(/&/g,'&amp;');
	s=s.replace(/>/g,'&gt;');
	s=s.replace(/</g,'&lt;');
	return s;
}

今回使用した方法

obj.innerText (Firefox では obj.textContent)を使用した方法。

function htmlEscape(s){
    var obj = document.createElement('pre');
    if (typeof obj.textContent != 'undefined') {
        obj.textContent = s;
    } else {
        obj.innerText = s;
    }
    return obj.innerHTML;
}

結果は全く同じ。
たいした根拠はないのだが、正規表現よりもエコな気がするんだけど、どうなんだろう?

String 型のメソッドとして登録する

以下のようにすると、さらにエレガントかもしれない。

String.prototype.htmlEscape = function(){
    var obj = document.createElement('pre');
    if (typeof obj.textContent != 'undefined') {
        obj.textContent = this;
    } else {
        obj.innerText = this;
    }
    return obj.innerHTML;
}

こうしておくと、以下のように書けるので、ちょっとだけかっこいい。

var str = '<strong>Cool!</strong>';
alert(str.htmlEscape());

WordPressのtinyMCEにプラグインを追加するためのクラス

WordPress のビジュアルリッチエディター(tinyMCE)に独自のボタンを追加する機会が多いので、それを容易にするためのクラスをつくった。

このクラスは WordPress プラグインではなく、WordPress プラグインを制作するときに使用するためのクラスです。

目的

WordPress のビジュアルリッチエディターでは、tinyMCE というJavaScript のライブラリを使用しているが、本家の tinyMCE では WordPress に実装されている機能よりはるかに多くの機能がプラグインとして配布されている。

これらの全てを実装することは、サポートや使い勝手の面でベターとは思わないが、いくつかの機能を追加したいと感じることは多い。

そこで、これらの tinyMCE プラグインを追加しやすくするためのクラスをつくった。

仕様

WordPress の tinyMCE にプラグインを追加するには、WordPress 側のプラグインで以下のアクションフィルターを使用する。

  • mce_external_plugins
  • mce_external_languages
  • tiny_mce_before_init
  • mce_buttons

このクラスでは、最大5つのパラメータをコンストラクタの引数に渡すことで、これらのアクションフィルターを定義する。

ダウンロード

最新版のソース

使い方

以下のような感じで使用する。

  1. WordPress プラグインを作成するためのPHPファイル、ディレクトリを作成する。
  2. プラグインディレクトリ内に任意のtinyMCEプラグインを設置する。
  3. WordPress プラグイン側で後述のように、コンストラクタを起動する。

コンストラクタ

new mcePlugins(......)

引数には以下の項目を設定する。

  1. $plugin_name : プラグインの名前
  2. $plugin_url : tinyMCE プラグインのeditor_plugin.js までのURL
  3. $lang_path : 言語ファイルまでのパス
  4. $button_callback : tinyMCEにボタンを追加するためのコールバック関数
  5. $inits : tinyMCE の動作設定を行うための配列

上記の個々の項目の詳細については、ご自身で調べまくってください。

このサイト上でも、今後、すこしずつご紹介していきます。

JavaScriptでUTCからローカル時間に変換

JavaScript で任意の日付をUTCとみなして、ローカル時間に変換するメソッドを作った。(ってほどでもないけど。。。)

せっかくなので、Date オブジェクトのメソッドとしてコール可能なようにした。

ソース

以下のソースを適当にコピペしてご利用下さい。

Date.prototype.utc2local = function()
{
    this.setTime(
        this.getTime()-(this.getTimezoneOffset()*60*1000)
    );
}

使い方

以下のような感じで。

Date.utc2local() を実行した後は、Date オブジェクトにセットされている時間が UTC になります。

var d = new Date('2010/9/1 00:00:00'); // UTCの日時
d.utc2local();
alert(d.getHours()); // ローカルな時間

ページのタイトルを取得するブックマークレット

こんなものは、たくさんあると思うのですが。。。

表示されているページにリンクを貼るためのHTMLを取得するためのブックマークレット。

リンクを取得する

上記のリンクをブックマークバーあるいは右クリックでお気に入りに追加しておけば、任意のページへリンクを貼るためのHTMLが入力されたTEXTAREAがページの右上に表示される。

ちなみにブックマークレットのソースは以下。

ソースをダウンロード

その他

こういう方法もある。

bit.lyにセキュリティホール?

追記: 8/10 09:00頃だと思いますが、解消されたようですね。

追記:8/10 07:00ごろにbit.lyからまもなく問題を解消するよとメールがあったので、以下の問題は近日中に解消されると思います。

書こうか迷ったのですが、bit.lyにセキュリティホールがあるようです。
いろいろと検索した結果、すでにいくつかのソースが公開されているようなので、あえてここでもご紹介します。

こういうことが可能である旨は私からもbit.lyのサポートに報告済みです。

現象

crossdomain.xmlが非常にゆるい制限になっているため、Flashを使用した悪意のあるページに、bit.lyにログインしたままアクセスすると、メールアドレスやAPIキーを取得されます。

原因

Flashには、crossdomain.xmlというファイルで許可されているコンテンツは別のドメインからでも取得可能にするという、独自の仕組みがあります。

bit.lyは、このcrossdomain.xmlが非常にゆるい制約になっているため、別のサーバーにあるHTMLコンテンツから、bit.lyのコンテンツを取得可能になっています。

サンプル

bit.lyにログインしたまま、以下のURLにアクセスするとメールアドレスが取得されているのが、おわかりかと思います。

http://firegoby.theta.ne.jp/labo/bitly/

実際には、どこにも保存しておりませんので、ご安心下さい。

対策

bit.lyはログインしたままにしないで、こまめにログアウトするよう心がけることを、強くご推奨します。

WordPressのリンクをオンラインブックマークにする

前回までの記事で何度かご紹介したが、ようやくWotrdPressのリンクをオンラインブックマークふうに使用するためのプラグインができた。

WordPressのリンクをブックマークとして共有するプラグイン

これを使用すると、いちいち同期作業みたいなことをしなくても、ほぼ全てのブラウザでブックマークの共有が可能になる。

なんとiPhone版のSafariでも!

というわけで、ぜひお試しください。

WordPressでGoogleブックマークみたいなこと(2)

以前の記事で、WordPressのリンクをブックマークのように使用できないか?ということで、ごちゃごちゃ書いた。

で、あの後、致命的に設計不良があることに気がついた。

前回の記事ではXBELをWordPressのプラグインで出力して、それをブックマークレットからごちゃごちゃみたいなことを計画していたのだが、クロスドメイン制約にひっかかることを完全に忘れてた!

というわけで、結局JSONを使用することで解決して、ほぼ出来上がった。

とりあえず、デモンストレーション。

実際のブックマークレット

以下のリンクを、ブックマークバーにドラッグ&ドロップするか右クリックでお気に入りに登録してから使用する。

ブックマーク

とりあえず、現在はテスト中。

まもなく配ります。

ブックマークレットを登録する

今回制作したプラグインにはブックマークレットがついている。
これを使用するには、以下のようにリンクの部分をドラッグ&ドロップする。

ブックマークを使う

ブックマークを実際に使用するには、さきほど登録したブックマークレットをクリックする。

ブックマーク(WordPressのリンク)に追加する

ブックマークの下の方に “Add Bookmark Here…” というリンクがあるのでそれをクリックすると、WordPressのリンクの追加画面に移動する。

リンク先のURLやタイトルは自動的に入力されるので、必要に応じてカテゴリー等を登録すればブックマークレット側に反映される。

ちなみに、リンクの登録を行うためのインターフェースはログインユーザー以外には表示されない。