目次

関連ページ

このページの目次

pyukiwiki現状

  • 最初にpyukiwikiをこのお天気koalaや自宅・職場のイントラネットに導入した2012年ころは、pyukiwikiはsorceforgeサイト内でまさに開発中で、いろいろと解説等が充実していたのだが、久々に下記バージョン変更のために覗いてみたら、soeceforgeサイトもnekyoさんのサイトもなくなっていて、移行先のOSDNのサイト内でいくつかのバージョンのpyukiwikiをダウンロードできる状態が維持されているだけになってしまっていた。
  • それでも、なんとありがたいことに、2012-03-18付の最終バージョンが待望のUTF-8版のVer.0.2.0で、下記のとおり、職場のフォローアップ精神皆無のサーバ変更を切り抜けることができた!
    • ただ、残念なことに、プラグインの解説がダウンロードサイト内に見当たらラない、Ver0.1.9では、プラグインの解説を記述した「プラグイン」というページが用意されていたが、Ver.0.2.0ではもともとプラグインはpyukiwikiの公式Webページ上の開設記事にリンクされる形になっているので、サイトが消えてしまって見る術がない状態

pyukiwiki 0.2.0 p3 UTF-8の導入

pyukiwiki 0.2.0 p3 UTF-8の不具合調整

  • このサイトが利用しているver.0.1.9classicと比べると、バグも少なく、ページや添付ファイルの全角文字対応もできていて、改良の跡がうかがえる

見出し行右端のページトップへジャンプするリンク付き矢印(↑)が機能しない件

  • 職場の環境(IISのイントラネット)だと、見出し行右端のページトップへ戻る矢印(↑)が機能しない。
  • この矢印には、wiki.cgiにおけるhtml生成処理(sub text_to_htmlサブルーチン)で、表示中のページのURL末尾に「#navigator」を付したURLがリンクされており、クリックすることで、pyukiwiki.skin.cgiによって生成されるページ上部の「<div id="navigator">」タグまでジャンプする(この部位を再表示する)ようになっている。
    • 矢印部分のタグ例(「&uarr」は矢印)。URLのページ名は全角のままになっている
 <div class="jumpmenu"><a href="/cgi-bin/pyukiwiki020p3/index.cgi?整形ルール#navigator">&uarr;</a></div>
  • これは自宅イントラネットのapache環境下では、ページ名が全角を含んでいてもちゃんと機能するが、職場の環境では、全角を含むURLがいけないのか、クリックするとFrontPage(index.cgi)に戻ってしまう。
  • 下記のようなエンコードしたURLをリンクさせればいいのだが、
 http://・・・・/cgi-bin/pyukiwiki020p3/index.cgi?%E6%95%B4%E5%BD%A2%E3%83%AB%E3%83%BC%E3%83%AB
  • この部分のwiki.cgiのコードは下記のとおりで、環境変数など種々の変数が入っていて面倒くさそう
 			my $hedding = ($tocnum != 0)
 				? qq(<div class="jumpmenu"><a href="@{[&htmlspecialchars($::form{cmd} ne 'read' ? "?$ENV{QUERY_STRING}" : &make_cookedurl($::pushedpage eq '' ? $::form{mypage} : $::pushedpage))]}#navigator">&uarr;</a></div>\n)
 				: '';
  • かといってこの部分を、直接ページトップに戻らせるべく下記のようにアンカーを指定しても、
  • -
 			my $hedding = ($tocnum != 0)
 				? qq(<div class="jumpmenu"><a href="#top">&uarr;</a></div>\n)
 				: '';
 とか
 			my $hedding = ($tocnum != 0)
  				? qq(<div class="jumpmenu"><a href="#navigator">&uarr;</a></div>\n)
 				: '';
  • headブロックで下記のとおりbase hrefの設定をしているので、
 <base href="http://・・・・/cgi-bin/pyukiwiki020p3/index.cgi">
  • 矢印はFrontPageのトップへリンクしてしまう。
 http://・・・・/cgi-bin/pyukiwiki020p3/index.cgi#navigator
  • そこで、発想を変えて、矢印をクリックするとこの表示中のページのURLを取得し、その#navigatorアンカー(ページトップ)を表示するjavascriptの命令を実行するように仕組んでみたら、職場環境下ではうまくいった
    • まず、pyukiwiki.skin.cgiのheadブロック内(headブロックでロードされている外部のjavascriptファイル内でもいいが、圧縮されていて読みにくく加工しにくいので)に、表示中のページのURLを取得し、その#navigatorアンカー(ページトップ)を表示するjavascriptの関数を設定する。
 <script type="text/javascript">
 function Ueemodoru() {
  windows.location.href = windows.location.href + "#navigator";
 }
 </script>
    • そして、wiki.cgiの上記「sub text_to_html」サブルーチン部分を下記のとおり書き換えると、とりあえずページトップへのジャンプをしてくれるようになった。
 			my $hedding = ($tocnum != 0)
 				? qq(<div class="jumpmenu"><a href="javascript:void(0);" onclick="Ueemodoru();">&uarr;</a></div>\n)
 				: '';
  • オリジナルコードではif分岐がされており、前記書き換えコードだとこの分岐が行われないが、とりあえず通常のページ表示状態であればトップへのジャンプは問題なく機能しているので、応急処置としてはOKか。

pyukiwiki 0.2.0 p3 UTF-8のカスタマイズ

画像添付時に#refの標準表記を表示する

  • pyukiwikiで面倒に感じるのはファイルの添付作業。ページの編集と添付操作がそれぞれ独立していて、ファイルを添付したら、改めて編集モードで#refプラグインにそのファイル名やページ名をセットして文書中に張り込まなくてはいけないこと。
  • 旧版(pyukiwiki0.1.9classic)では、添付時に、現在のページの末尾に自動的に該添付ファイル名とページ名を書き込んだ#refプラグインを追記するようにしていたが、新バージョンでは、見出し行のブロックごとに編集できるようになっていたりと、編集プラグインが複雑化していて、書き換えが面倒だったので、添付が成功すると、タイトル欄の末尾に#refコマンドを書き出して、これをコピペして編集中のページに貼りつけられるようにした。
  • 改変は、添付を司るattachプラグインのプログラムファイルであるattach.inc.plにおいて、添付作業を行うattach_uploadサブルーチンの末尾を、ページ名の後に#refコマンドを書き足すように、下記#koala--〜#--koalaでくくったコードに書き換えた
 	&send_mail_to_admin($::form{mypage}, "AttachUpload", $ffile);
 #koala--
 #これがオリジナル
 #	return ('msg'=>"$::form{mypage}\t$::resource{attach_plugin_msg_uploaded}--",'body'=>&attach_form);
 #これを下記のように「#ref($ffile2\,$::form{mypage}\,100%)」を書き足す仕様に
 return('msg'=>"$::form{mypage}\t$::resource{attach_plugin_msg_uploaded}\n\#ref($ffile2\,$::form{mypage}\,100%)", 'body'=>&attach_form);
 #--koala
  • なお、画像の大きさを設定する縮尺パラメータ「100%」も付属させ、これをいじって表示サイズを調整することを促す表記にした。画像以外ではこの縮尺値は無視されるので、あっても問題ない。

Counter: 1153, today: 1, yesterday: 1

管理用のツール

wikiファイルのwindows上での編集

  • pyukiwikiでは、作成したページのコンテンツはwikiフォルダ内にUTF-8の文字コードからなるテキストファイルとして保存される。
  • pyukiwiki0.2.0p3UTF8ディストリビューションでは、保存される際のファイル名には、ページタイトルをUTF8コードで表記したものを16進数でエンコードした名称が使われる。
  • 作成した複数のページについて一覧したい場合は、タイトル行の下部からリンクされている「一覧」をクリックすることで作成ページ一覧の表示が可能だが、いちいちweb(イントラネット)上でクリックして「編集」を選択して・・・という作業を行うことにになり、不便に感じることも。
  • 特にイントラネットのサイトや、インターネット上でもローカルPCにコンテンツのミラーを保存している場合などは、windows上で編集が行えると便利だと思うことがある。
  • wikiファイル自体はただのテキストファイル(但しUTF-8コード)なので、TeraPad?などの複数の文字コードを扱えるエディターであれば閲覧や編集は可能。しかし、上記のとおりpyukiwikiではファイル名が16進数でエンコードされているので、一見してどのページのファイルであるのか判別ができないという難点がある。
    • 例えば「テスト」という名称のページは「E38386E382B9E38388.txt」という名称のテキストファイルとして保存される。
  • そこで、ExcelのVBAなどで、wikiフォルダ内のコンテンツファイルの名称一覧をページタイトルにデコードできるツールが作れると便利。

デコードツール

  • EUCとSJISの間には、JIS, EUC, SJIS の漢字コードについて(Yusuke Shinyama さん)というページにも紹介されているとおりの関係性があり(16進コード表のなかでの実体文字の並び方は同じで、位置がずれているだけ)、頑張ればコードのシフトによって相互変換が可能。
    • 実際、EUCエンコードのpyukiwiki0.1.9ではコードシフトによる相互変換プログラムを作成して使っている
  • しかし、UTF-8の場合は、下記のとおり、漢字や記号などでコードの並び方がSJISとずいぶん異なっていて、容易に変換できるように思えない
SJISEUC UTF-8 実体文字(SJIS)
889FB0A1E4BA9C
88A0B0A2E59496
88A1B0A3E5A883
88A2B0A4E998BF
88A3B0A5E59380
88A4B0A6E6849B
88A5B0A7E68CA8
88A6B0A8E5A7B6
88A7B0A9E980A2
88A8B0AAE891B5
88A9B0ABE88C9C
88AAB0ACE7A990
88ABB0ADE682AA
88ACB0AEE68FA1
88ADB0AFE6B8A5
88AEB0B0E697AD
88AFB0B1E891A6
88B0B0B2E88AA6
  • VBAでsjisとUTF-8の間で文字コードを変換するプログラムについては、NONSOFTさんのページに紹介があるが、文字から文字への変換ぽく、16進表記についてどのようにこれを利用すればいいのかちょっと思いつかなくて・・・
    • ファイルの中身をEUCからUTF-8に変換する、とかの「文字to文字」用途なら使えそう
  • なので、使用が想定される実体文字すべてについてのsjis(の実体文字)とUTF-8の16進コードの対応表(例えばJIS X 0208 (1990) to Unicode 漢字コード表をwebから入手し、これをexcelの表に転記して、wikiファイルのUTF-8の16進コードファイル名をこの表と照合することで、実際のタイトル名にデコードすることを考えた。
    • コード表の文字数は、対応する実体文字がないものも含め、9000弱
      • コード表の例
UTF-8の16進表記実体文字UTF-8の16進表記文字数
E4BA9C6
E594966
E5A8836
E998BF6
E593806
E6849B6
E68CA86
E5A7B66
E980A26
E891B56
E88C9C6
E7A9906
E682AA6
E68FA16
E6B8A56

    • この表から、実体文字(sjis)、UTF-8の16進表記、UTF-8の16進表記の文字数、をそれぞれ配列に入れて、16進ファイル名の先頭からFor〜Next文でこの配列との照合を順次行い、実体文字に置き換えて、wikiファイル名とデコードしたタイトル名とを対照させてexcelに書き出してゆく方法
      • wikiファイル名に、フォルダ内の対応wikiファイルへのリンクを設定しておくと、すぐにファイルを開けるので便利
    • 頭の悪い力技だが、最近のPCは能力が高いので、数十程度のページ数なら数秒程度で処理が終わってしまう。
    • 例えば下記のように、照合は、Mid関数などを使って16進コードの文字数を動的に変更させながら行う。
 	Do while (i<=16進ファイル名文字数)
		For (j=1 to 10000)
               If Mid(16進ファイル名, i,16進文字数(j)) = UTF8の16進コード(j) Then
                  sjis = sjis & UTF8の16進コードに対応する実体文字(j)
                  i = i + 16進文字数(j) - 1
                  Exit For
               End If
 		Next j
 	  i=i+1
 	Loop

Counter: 1153, today: 1, yesterday: 1


Last-modified: 2019-02-11