最近の更新

関連


その他いろいろ

多機能フィードリーダSynapse製作中

2月までは目が回るほど忙しい

MODxでつくる! 最強のCMSサイト カバー
MODxでつくる! 最強のCMSサイト

PukiWikiをで外部のサイトへのリンクを踏むと、リファラが送信されてしまいます。これを防ぐパッチがありますが、内部・外部でWiki側のURLが複数存在する場合に対応するコードを追加し、外部へのリンクのみ緩衝用のページ(googleやhatena, ime.nu等)を介するパッチを書きました。

diff -ur a/lib/make_link.php b/lib/make_link.php
--- a/lib/make_link.php	2006-10-22 05:40:25.000000000 +0900
+++ b/lib/make_link.php	2008-11-22 16:07:46.000000000 +0900
@@ -385,7 +385,20 @@
 		} else {
 			$rel = ' rel="nofollow"';
 		}
-		return '<a href="' . $this->name . '"' . $rel . '>' . $this->alias . '</a>';
+    //! ----
+    //! jump via redirector for external pages
+    global $do_redirect_externals, $redirect_url, $script_urls;
+    if ($do_redirect_externals) {
+      $ru = $redirect_url;
+      foreach ($script_urls as $s)
+        if (strncasecmp($this->name, $s, strlen($s)) == 0) {
+          $ru = '';
+          break;
+        }
+    } else
+      $ru = '';
+    //! ----
+		return '<a href="' . $ru . $this->name . '"' . $rel . '>' . $this->alias . '</a>';
 	}
 }

diff -ur a/pukiwiki.ini.php b/pukiwiki.ini.php
--- a/pukiwiki.ini.php	2006-10-22 05:40:24.000000000 +0900
+++ b/pukiwiki.ini.php	2008-11-22 11:28:52.000000000 +0900
@@ -116,6 +116,16 @@
 // Specify PukiWiki URL (default: auto)
 //$script = 'http://example.com/pukiwiki/';

+// Redirect URLs
+$do_redirect_externals = true;
+$redirect_url = 'リダイレクト用のURL';
+$script_urls = array(
+    'http://192.168.1.100/',
+    'http://example.com/wiki/',
+    './',
+    '/',
+    );
+
 // Shorten $script: Cut its file name (default: not cut)
 //$script_directory_index = 'index.php';

PukiWiki 1.4.7_nofb_utf8対象です。

リダイレクトしてくれるのは

  • http://a.hatena.ne.jp/go?
  • http://ime.nu/
  • http://www.google.com/url?sa=D&q=

など。公に提供しているものではないと思うので、真面目にやるなら自分で用意した方が良いでしょう。

PukiWikiでは[[タイトル:http://link.example.com/a/b/c]]のようにしてリンクを張ることが出来ますが、同じホスト内のWiki以外の箇所にリンク先したい場合があります。

特にエイリアスやヴァーチャルホストなどで、ホスト部分が変動する場合には通常の方法では対応できません。そこで同ホストの相対・絶対URLにリンクを張るパッチを書いてみました。

下記のパッチをPukiWiki-1.4.7_notb_utf8に適用することで、

  • [[タイトル:./d/e/f]]のようにしてhttp://link.example.com/wiki/d/e/fにリンク (相対URL。PukiWikiがhttp://link.example.com/wiki/にある場合)
  • [[タイトル:/d/e/f]]のようにしてhttp://link.example.com/d/e/fにリンク (絶対URL)

と、相対・絶対URLにリンクを張ることが出来るようになります。

[~/pukiwiki-1.4.7_notb_utf8]$ patch -p1 < thispatch

diff -ur a/lib/make_link.php b/lib/make_link.php
--- a/lib/make_link.php	2006-10-22 05:40:25.000000000 +0900
+++ b/lib/make_link.php	2008-11-22 11:30:12.000000000 +0900
@@ -360,7 +360,7 @@
  (?:>|:)
 )?
 (                 # (3) url
- (?:(?:https?|ftp|news):\/\/|mailto:)[\w\/\@\$()!?&%#:;.,~'=*+-]+
+ (?:(?:https?|ftp|news):\/\/|mailto:|\.\/|(?<!\w)\/)[\w\/\@\$()!?&%#:;.,~'=*+-]+
 )
 (?($s1)\]\])      # close bracket
 EOD;



20081122-2307 絶対URLの適用範囲が広すぎたので修正

MODxで複数のコンテンツ種のあるウェブサイトを作っていて、テンプレートが微妙に違うのにコピペしなければならない、かといってチャンクにすると数が増えすぎる、といったジレンマに直面したことはありませんか。

Cascading Templatesプラグインを使うと、t.outer.innerのような名前のテンプレートを持つドキュメントに対し、当のt.outer.innerはもちろんのこと、その外側にt.outer、更に外側にtを適用することができます。

上の例からも分かるように、親子関係はテンプレート名のドット区切りで指定するため、わざわざ面倒な設定をプラグインに書き込む必要もなく、非常に手軽です。もちろん、ドット区切りの際見つからなかったテンプレートは自動的に無視されます。

MODxにWordPressを埋め込むことを可能にするスニペット、WordPress Integrator 1.1.0をリリース。

以前はエイリアスパスOFFでないと使えませんでしたが、掲示板でnakaさんから頂いた案(404をスニペットで検出してWPIのあるドキュメントに転送)により、エイリアスパスONでも動作するようになりました。

WordPress MEの最新版、2.1.3にも対応。

7bitで使っているWordPress MEを2.1.3にアップグレードしました。
MODxに埋め込んでいるWordPress Integratorの兼ね合いで一度動作しなくなりましたが、
wp-settings.phpの=を=&に置換し、スニペットに

global $wp_the_query;
global $wp_locale;

を追加して解決。またグローバル変数が増えたようです。最新(1.0.1)のWordPress Integratorではまだ上記の修正を含んでいないので、動かない場合は書き加えてみてください。

またまた安直な名前でプラグイン/スニペットを作りました。

MODxには基本的に多言語を同一のサイトでさくさく切り替える機能はないのですが、このサイト自体英語圏のお客さんが多い(あるいはスパマー)ということで書いてみました。
Multilingual Listing

ドキュメントを作成する際、document, document-en, document-frとデフォルト言語以外はサフィックスつきのエイリアスを指定するのが前提です。
階層は問いませんが、兄弟ドキュメントにするのが無難でしょう。各サブ言語はメニュー表示しない設定にしないとWayfinderなどでリストが長くて見づらくなります。

今の7bitでいうとWordPress Integratorで使われています。ページの左上に切り替えリンクに注目。
日本語ブラウザを使っていると恩恵は全然ありませんが、一応要求言語をみて振り分けています。
暇な方はFirefoxのツール»オプション»詳細»一般»言語設定 でenを一番上にし、Wordpress Integratorのページ以外(たとえばMODxのページ)からWordpress Integratorにアクセスしてみると、英語版が表示されるのが分かると思います。
なぜWordpress Integratorのページから飛ぶのではダメかというと、複数言語の対応が今ひとつだった場合、ブラウザの要求言語しか見られないのは不便かもしれないから。
そのため、「言語違いの同ドキュメント」がリファラにある場合は振り分け処理をしません。

最後に。英語圏のページにいる間はリンク生成を全部英語ページに、というのも考えましたが、かなり面倒な上コアのハック必須(たぶん)なので今のところ対応予定はありません。

多言語を推すページ自体が多言語化していないのは二日遅れの冗談だとでも思ってください。(英語力が…orz)

MODxにWordPressを埋め込むWordPress Integratorの1.0.1を公開しました。
主な変更は、

  • WordPress2.1対応(WP側に若干の修正が必要)
  • 今までMODx側のプラグインに< ?php ... ?> が含まれていたのを修正

といったところです。
MODx0.9.5+WP2.1で動作確認しています。他の環境で動いたり動かなかったりした場合は教えて貰えると助かります。
(2/15-20はネット環境がないのでサポートできませんが、掲示板にでも書いておいてください)

MODx0.9.5付属のFCKEditorのアップローダ(manager/media/brwoser/mcpuk)でマルチバイト文字列を名前に持つファイルをアップロードすると、色々と面倒なことになります。

削除も出来なくなってしまうことがあるので、アップロード・選択・削除が可能になるパッチを書いてみました。(編集やファイル名変更はできません)
実用上殆ど役には立たないでしょうが、間違えてUPしてしまった物を消すくらいには使えます。
2回rawurlencodeしています。

PHP4,PHP5のフレームワーク、CakePHP日本語リファレンスが出たようですね。(via PHPSPOT開発日誌)

PHPは$this必須のせいで中々クラスをバリバリ書く気にならんのですが、折角なので次何か作るときは使ってみよう。

RoR全盛とはいえ、共用サーバでmod_phpが限界の人には良さそうです。symfonyは重いようですし。

2006 07 22

Authが難しい

認証を楽々使えるPEAR::Authには毎度お世話になっていますが、ユーザ名とパスワードの一致以外のログイン条件をどう書いて良いものか分かりません。
ログインした後の処理と失敗したときの処理は指定できるのに…preLoginFunctionが欲しい。

仕方ないのでログイン成功後にチェック→条件を満たしていなければlogout、としてみました。

function check_alive($auth){
	//alive
	if($auth->getAuth()){
		global $db;
		$q_username = $db->quoteSmart($auth->getUsername());
		$querystr = "SELECT alive FROM ? WHERE username = {$q_username} LIMIT 1;";
		debug($querystr);
		$rs = $db->getOne($querystr);
		if( DB::isError($rs) ){
			echo "エラー";
			return;
		}
		if( $rs==0 ){ //!alive
			$auth->logout();
			derivedAuth::drawLogin($auth->getUsername());
			return false;
		}
	}
	return true;
}