最近の更新

関連


その他いろいろ

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

はやくMODx 2.0でないかなあ

jQueryを利用してHTMLのテキストエリアの高さを行数にあわせて自動調整してくれるプラグイン、autoResizeというものがあります。

jQuery plugin: ‘autoResize’ – James Padolsey

今までPukiWikiの編集画面はスクロールしにくく使いづらいと感じていたので、即組み込みます。PukiWikiは1.4.7を使用。

$ cd pukiwiki
$ wget 'http://james.padolsey.com/demos/plugins/jQuery/autoresize.jquery.min.js' -O autoresize.jquery.min.js
$ wget 'http://code.jquery.com/jquery-1.4.2.min.js' -O jquery.min.js

そして以下のパッチを適用。lib/html.phpとskin/pukiwiki.skin.phpを変更します。

diff -ur lib/html.php lib/html.php
--- lib/html.php 2010-06-23 02:04:17.000000000 +0900
+++ lib/html.php 2010-06-23 02:17:21.000000000 +0900
@@ -245,7 +245,11 @@
   <input type="hidden" name="cmd"    value="edit" />
   <input type="hidden" name="page"   value="$s_page" />
   <input type="hidden" name="digest" value="$s_digest" />
-  <textarea name="msg" rows="$rows" cols="$cols">$s_postdata</textarea>
+  <textarea id="expandingmsg" name="msg" rows="$rows" cols="$cols">$s_postdata</textarea>
+  <script type="text/javascript">
+  $('textarea#expandingmsg').autoResize({limit: 9000});
+  $('textarea#expandingmsg').keydown();
+  </script>
   <br />
   <div style="float:left;">
    <input type="submit" name="preview" value="$btn_preview" accesskey="p" />
diff -ur skin/pukiwiki.skin.php skin/pukiwiki.skin.php
--- skin/pukiwiki.skin.php       2010-06-23 02:04:18.000000000 +0900
+++ skin/pukiwiki.skin.php       2010-06-23 02:14:49.000000000 +0900
@@ -79,6 +79,8 @@
  <link rel="stylesheet" type="text/css" media="screen" href="skin/pukiwiki.css.php?charset=<?php echo $css_charset ?>" charset="<?php echo $css_charset ?>" />
  <link rel="stylesheet" type="text/css" media="print"  href="skin/pukiwiki.css.php?charset=<?php echo $css_charset ?>&amp;media=print" charset="<?php echo $css_charset ?>" />
  <link rel="alternate" type="application/rss+xml" title="RSS" href="<?php echo $link['rss'] ?>" /><?php // RSS auto-discovery ?>
+ <script type="text/javascript" src="jquery.min.js"></script>
+ <script type="text/javascript" src="autoresize.jquery.min.js"></script>

 <?php if (PKWK_ALLOW_JAVASCRIPT && $trackback_javascript) { ?> <script type="text/javascript" src="skin/trackback.js"></script><?php } ?>

コメント欄にある通り、autoResizeの後で

$("textarea#expandingmsg").keydown();

をしないと、元々長いテキストに関しては初期状態ではサイズが不適当になります。

リビジョン間の差分やコードの色分け表示に対応したsvnリポジトリのブラウザWebSVN
こんな便利な物があるとは知らず、今までブラウジング目的だけでtrac使っていました。
早速乗り換えるべく設置してみましたが、バージョン2.2.1をUTF-8で使っていると、他の文字コードで化けてファイルの中身が一切表示されなかったりします。

そこでWebSVNの文字化け対策 - okonomiの日記を参考に2.1.1版のパッチを書きました。/usr/bin/nkfを利用しています。

diff -ur websvn-2.2.1/include/svnlook.php websvn/include/svnlook.php
--- websvn-2.2.1/include/svnlook.php    2009-05-10 20:19:20.000000000 +0900
+++ websvn/include/svnlook.php  2009-06-28 09:44:13.000000000 +0900
@@ -558,7 +558,7 @@
     // If there's no filename, we'll just deliver the contents as it is to the user
     if ($filename == "") {
       $path = encodepath($this->getSvnpath($path));
-      passthruCommand($config->svn." cat ".$this->repConfig->svnParams().quote($path.'@'.$rev).' '.$pipe);
+      passthruCommand($config->svn." cat ".$this->repConfig->svnParams().quote($path.'@'.$rev).' '.'|/usr/bin/nkf -w'.$pipe);
       return $highlighted;
     }

@@ -570,7 +570,7 @@
     if ($l == "php") {
       // Output the file to the filename
       $path = encodepath($this->getSvnpath($path));
-      $cmd = $config->svn." cat ".$this->repConfig->svnParams().quote($path.'@'.$rev).' > '.quote($filename);
+      $cmd = $config->svn." cat ".$this->repConfig->svnParams().quote($path.'@'.$rev).'|/usr/bin/nkf -w'.' > '.quote($filename);
       $retcode = 0;
       execCommand($cmd, $retcode);
       if ($retcode != 0) {
@@ -632,6 +632,7 @@

         $path = encodepath($this->getSvnpath($path));
         $cmd = $config->svn." cat ".$this->repConfig->svnParams().quote($path.'@'.$rev).' | '.
+          "/usr/bin/nkf -w |".
           $config->enscript." --language=html ".
           ($l ? "--color --pretty-print=$l" : "")." -o - | ".
           $config->sed." -n ".$config->quote."1,/^<PRE.$/!{/^<\\/PRE.$/,/^<PRE.$/!p;}".$config->quote." > $tempname";
@@ -648,7 +649,7 @@
       } else {
         $highlighted = false;
         $path = encodepath(str_replace(DIRECTORY_SEPARATOR, "/", $this->getSvnpath($path)));
-        $cmd = $config->svn." cat ".$this->repConfig->svnParams().quote($path.'@'.$rev).' > '.quote($filename);
+        $cmd = $config->svn." cat ".$this->repConfig->svnParams().quote($path.'@'.$rev).' |/usr/bin/nkf -w> '.quote($filename);
         $retcode = 0;
         execCommand($cmd, $retcode);
         if ($retcode != 0) {
@@ -727,7 +728,7 @@

     // Output the file to the filename
     $path = encodepath($this->getSvnpath($path));
-    $cmd = $config->svn." cat ".$this->repConfig->svnParams().quote($path.'@'.$rev).' > '.quote($filename);
+    $cmd = $config->svn." cat ".$this->repConfig->svnParams().quote($path.'@'.$rev).'|/usr/bin/nkf -w'.' > '.quote($filename);
     $retcode = 0;
     execCommand($cmd, $retcode);
     if ($retcode != 0) {
@@ -777,7 +778,7 @@

       // Output the file to a temporary file
       $path = encodepath($this->getSvnpath($path));
-      $cmd = $config->svn." cat ".$this->repConfig->svnParams().quote($path.'@'.$rev).' > '.$tmp;
+      $cmd = $config->svn." cat ".$this->repConfig->svnParams().quote($path.'@'.$rev).' | /usr/bin/nkf -w > '.$tmp;
       $retcode = 0;
       execCommand($cmd, $retcode);
       if ($retcode != 0) {
@@ -797,12 +798,13 @@
       if ($config->useEnscript) {
         $path = encodepath($this->getSvnpath($path));
         $cmd = $config->svn." cat ".$this->repConfig->svnParams().quote($path.'@'.$rev).' | '.
+          "/usr/bin/nkf -w|".
           $config->enscript." --language=html ".
           ($l ? "--color --pretty-print=$l" : "")." -o - | ".
           $config->sed." -n ".$config->quote."/^<PRE.$/,/^<\\/PRE.$/p".$config->quote;
       } else {
         $path = encodepath($this->getSvnpath($path));
-        $cmd = $config->svn." cat ".$this->repConfig->svnParams().quote($path.'@'.$rev);
+        $cmd = $config->svn." cat ".$this->repConfig->svnParams().quote($path.'@'.$rev).'|/usr/bin/nkf -w';
         $pre = true;
       }

PHPによるスレッドフロート型掲示板スクリプト、111ch に実に2年ぶりに手を加え、1.0.2をリリースしました。

スレッドフロートといいつつ、sageない場合に一番上に新着スレッドが移動しないバグを修正しました。

色々スパム防止機能がついているので、このスクリプトに対応するプログラムをわざわざ作成しない限りは自動投稿は困難です。このサイトでも用いて居ますが、自動的に投稿されたと思われるスパムは全然ありません。(単に過疎っているだけかもしれませんが)

CMSであるMODxに高機能なWikiシステムであるPukiWikiを埋め込むためのプラグインとスニペット、
PukiWiki Integratorをバージョンアップし、v1.1.0を公開しました。

Wikiで使われる[[title:http://example.com/]]形式のリンクを、MODxがスニペットなどと間違えて消し去ってしまうのを防ぎます。
また、データベースに溜まる警告を抑制しました。

MODxでは通常、ドキュメントの内容(’content’)はHTMLで書きますが、
Wiki記法が使えると省力化にもなり、便利です。

WikiFormatを使用した例

ユーザサイドでWiki記法を整形する Kazuho@Cybozu Labs: Wiki.Formatter in JavaScript をMODxで利用するためのプラグイン、WikiFormat v1.0.0をリリースしました。

CMSであるMODxに高機能なWikiシステムであるPukiWikiを埋め込むためのプラグインとスニペット、
PukiWiki Integrator v1.0.0を公開しました。

pukiwikiintegrator

サイトの統一感をMODxで保ちつつ、気軽に編集できるWikiを扱うことができます。

pkwk_titleというプレースホルダを生成するので、などとして、スクリーンショットのように「Wiki » FrontPage」といった表示も可能です。

このサイトのMODxもWordPressも古いのでそろそろ最新版に差し替えようかと思い、
実験用マシンに入れたついでにがががっと書いてしまった。

WordPress Integratorの導入もそれぞれ最新版で(若干の修正を含んで)確認したので、
近いうちに新バージョンを公開します。SS撮りまくったので導入手順も書くかも(期待薄)。

しかし0.9.6系で書いてもmodx revolution 2.0になったら書き直しがあるのか…というかいつリリースされるんだろう。遅い。

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にも対応。

次のページ »