軽量で導入が簡単な国産PHP製wiki、PukiWikiの導入、改造メモ
※Webアプリなので、Apache, IIS, AN HTTPD などの HTTPデーモンソフトと、PHPが必要です。SQLは不要。OSは選びません。自分のPCに導入して使用するか、Xreaなどの機能が豊富なレンタルサーバーで使用する必要があります。詳しい事は割愛。
※総ページ数が3000を超える場合、Wikipediaでも使用されているMediaWikiを使用した方がいいらしい(SQL必須ですが)。軽さと手軽さではPukiWikiが上で、機能、拡張性、将来性などではMediaWikiが上のようです。
階層構造ベース。
以下メモ。※パスは適当に読み替えてください
※パッチは全て最初に当ててください
というか必須LayoutIgnoreURI /prox/wiki/*の様な物を追記して、広告を消す
<?php // 【追記/変更】XREAの広告(localhostでは表示しない)
if ($_SERVER{'REMOTE_ADDR'} !== '127.0.0.1') { ?>
<script type="text/javascript" src="http://imgj.xrea.com/xa.j?site=abc.s65.xrea.com"></script>
<noscript><iframe height="60" width="468" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" allowtransparency="true" src="http://img.xrea.com/ad_iframe.fcg?site=abc.s65.xrea.com"><a href="http://img.xrea.com/ad_click.fcg?site=abc.s65.xrea.com" target="_blank"><img src="http://img.xrea.com/ad_img.fcg?site=abc.s65.xrea.com" border="0" alt="xreaad" /></a></iframe></noscript>
<?php } ?>PukiWiki Plus! のやつだけど、PukiWikiでも使えた。凄く助かりました!
※実行前にバックアップ必須 あと、~などの一部の文字が化けるっぽいので注意
入れてないけど、入れると便利かも。
# 便利です。お世話になってます!最高です。作者様に感謝!
※ディレクトリに偽装 (mod_rewrite)導入必須(だったと思う $script の設定次第では、導入しなくても良かったかも)
LIB_DIR の func.php
global $script_directory_index;
を以下に置換
global $script_directory_index, $xreassl;
$script = (SERVER_PORT == 443 ? 'https://' : 'http://'); // scheme $script .= SERVER_NAME; // host $script .= (SERVER_PORT == 80 ? '' : ':' . SERVER_PORT); // port
をコメントアウトして、直後に下記を追記
$script = '';
// Xrea の SSL 用
if (preg_match('/ss\d*\.xrea\.com/i', $_SERVER['HTTP_VIA'], $matches))
$script = $xreassl = 'https://'.$matches[0].'/'.$_SERVER['HTTP_HOST'];
PLUGIN_DIR の aname.inc.php の
$url = $f_full ? get_script_uri() . anchor_replace(rawurlencode($vars['page'])) . '/' : '';
をコメントアウト
PLUGIN_DIR の rss.inc.php の
$self = get_script_uri();
を
$script = get_script_uri(); $self = (substr($script, 0, 4) === 'http' ? '' : (SERVER_PORT == 443 ? 'https://' : 'http://') . SERVER_NAME . (SERVER_PORT == 80 ? '' : ':' . SERVER_PORT)) . $script;
に置換
PLUGIN_DIR の tracker.inc.php の
return "[[$title$arrow>$script?plugin=tracker_list&refer=$r_page&config=$r_config&list=$r_list&order=$r_order]]";
を
return "[[$title$arrow>" .(substr($script, 0, 4) === 'http' ? '' : (SERVER_PORT == 443 ? 'https://' : 'http://') . SERVER_NAME . (SERVER_PORT == 80 ? '' : ':' . SERVER_PORT)). "$script?plugin=tracker_list&refer=$r_page&config=$r_config&list=$r_list&order=$r_order]]";
に置換
PLUGIN_DIR の topicpath.inc.php の
$topic_path[] = make_pagelink($defaultpage, PLUGIN_TOPICPATH_TOP_LABEL);
をコメントアウトして、下記を追記
$topic_path[] = '<a href="' .$script. '">' .PLUGIN_TOPICPATH_TOP_LABEL. '</a>';
LIB_DIR の html.php の
<form action="$script"
を全て以下に置換
<form action="{$script}index.php"
(ParaEdit 0.6を使う場合、必ずやらないと駄目だったと思う)
LIB_DIR の pukiwiki.php の「// Main」の直後に以下を追記
// {{{ 【追記】NG WORD
if (
// DellWiki の荒らし対策
preg_match('/[\r\n]-\s*ATI Mobility Radeon X1400(?:(?!64bit)[^\r\n])*[\r\n]/', $post['msg'])
// SPAM(認証が必要な場合は無効)
|| (!$edit_auth && preg_match('{\[url=|<a href=}', $post['msg']) && mb_detect_encoding($post['msg']) === 'ASCII')
) {
header('Conten-Type: text/html; charset=Shift_JIS');
header('Pragma: no-cache');
header('Cache-Control: no-store');
echo '<html><body><h1>ERROR : [DENY ' . $_SERVER{'REMOTE_HOST'} . ' ' . $_SERVER{'REMOTE_ADDR'} . ']</h1>'
. '※POSTされた内容に多バイト文字が一切含まれず、<a href=、[url=、が含まれる場合、スパムと認識されます<br />'
. '以下投稿された内容<textarea style="width:100%;height:90%">'.htmlspecialchars($post['msg']).'</textarea></body></html>';
exit;
}
// }}}
更に「// Main」の後ろにある「$retvars = array();」の直前に以下を追記
// {{{ 【追記】NG WORD(記録自体を書き換える)
//$post["msg"] = preg_replace('/https?:\/\/[^\/]+\.(?:forumer\.pl|worldbreak\.com|carookee\.com|lacoctelera\.com|foros\.net|fs\.fed\.us)[:\/]?[\da-z.\-_\/~?=&%#]*/i', "[SPAM {$_SERVER{'REMOTE_HOST'}} {$_SERVER{'REMOTE_ADDR'}}]", $post["msg"]);
// }}}
公式Wikiから引用
<LimitExcept GET HEAD>
RewriteCond %{HTTP_CONNECTION} !keep-alive [NC,OR]
RewriteCond %{REMOTE_HOST} ^firewall [NC,OR]
RewriteCond %{REMOTE_HOST} proxy [NC,OR]
RewriteCond %{REMOTE_HOST} cache [NC,OR]
RewriteCond %{REMOTE_HOST} delegate [NC,OR]
RewriteCond %{REMOTE_HOST} ^dns [NC,OR]
RewriteCond %{REMOTE_HOST} keeper [NC,OR]
RewriteCond %{REMOTE_HOST} ^mail [NC,OR]
RewriteCond %{REMOTE_HOST} ^www [NC,OR]
RewriteCond %{HTTP_CACHE_CONTROL} DelGate [NC]
RewriteCond %{HTTP_USER_AGENT} via [NC]
RewriteCond %{HTTP_USER_AGENT} squid [NC]
RewriteCond %{HTTP_USER_AGENT} delegate [NC]
RewriteCond %{HTTP_USER_AGENT} httpd [NC]
RewriteCond %{HTTP_USER_AGENT} proxy [NC]
RewriteCond %{HTTP_USER_AGENT} cache [NC]
RewriteCond %{HTTP:Via} !^$ [OR]
RewriteCond %{HTTP_FORWARDED} !^$ [OR]
RewriteCond %{HTTP:X-Forwarded} !^$ [OR]
RewriteCond %{HTTP:Client-IP} ^$ [OR]
RewriteCond %{HTTP:Forwarded-For} ^$ [OR]
RewriteCond %{HTTP:x-forwarded-for} ^$
RewriteCond DUMMY CONDITION
RewriteRule ^.*$ - [F]
</LimitExcept>
★簡単且つ効果抜群 おすすめ
'#^.*$#' => 'nospam',何てのを追加して、「$auth_users」に
'nospam' => '{x-php-md5}~~',
何てのを追加する(http://host/hoge/wiki/?cmd=md5 で生成した物を設定(入力した文字列が、パスワードになる))// Check edit-permission function check_editable( ~ // Editable return TRUE;を
// Check edit-permission
function check_editable($page, $auth_flag = TRUE, $exit_flag = TRUE
// 【追記】凍結されていても編集可能だが、Basic認証はする という場合TRUEにする(コメント時とか)
, $temp_flag = FALSE
)
{
global $script, $_title_cannotedit, $_msg_unfreeze;
if (edit_auth($page, $auth_flag, $exit_flag) && ($temp_flag || is_editable($page))) {
// Editable
return TRUE;
に置換。// 【追記】$edit_auth = 1 時、コメントすると認証を求める check_editable($vars['refer'], true, true, true);を、
function plugin_~_action() ~の後あたりに追記する。
while (is_page($page))
{
$real = ++$num;
$page = "$base/$real";
}
の直後に
// 【追記】$edit_auth = 1 時、コメントすると認証を求める check_editable($page);を追記する。
LIB_DIR / auth.php の
header('HTTP/1.0 401 Unauthorized');
}
if ($exit_flag) {
$body = $title = str_replace('$1',
htmlspecialchars(strip_bracket($page)), $title_cannot);
の後に以下のような物を【追記】
// 【追記】Basic認証に失敗していた場合、認証が必要である理由などを表示する
$body .= mb_convert_encoding('<h2 style="color:red;background-color:#fdd">現在スパム対策のため編集に認証が必要です。IDは「nospam」、PWは「捕鯨」をローマ字(小文字)にしたものを入れてください。</h2><b>※リロードすれば認証をやり直せます</b>'
. ($_POST['msg'] ? ' 以下投稿された内容<textarea style="width:100%;height:90%">'.htmlspecialchars($_POST['msg']).'</textarea>' : ''), 'EUC-JP', 'SJIS-win');
※UTF-8版の場合、代わりに以下のような物を【追記】
// 【追記】Basic認証に失敗していた場合、認証が必要である理由などを表示する $body .= mb_convert_encoding( '<h2 style="color:red;background-color:#fdd">現在スパム対策のため編集に認証が必要です。名前は「nospam」、派巣は「捕鯨」をローマ字(小文字)にしたものを入れてください。</h2><b>※リロードすれば認証をやり直せます</b>' . ($_POST['msg'] ? ' 以下投稿された内容<textarea style="width:100%;height:90%">' : '') , 'UTF-8', 'SJIS-win') . ($_POST['msg'] ? htmlspecialchars($_POST['msg']) . '</textarea>' : '') ;
更に、MenuBarにも認証が必要である理由などを載せておけばOK ※UTF-8の場合、国外PCでも日本語がデフォルトで化けないので、出来る限り日本語のみで記述する事をすすめます。(全角英数字は意味がない)
※ディレクトリに偽装 (mod_rewrite)する場合、必ずそちらを先に行ってください
PLUGIN_DIR の ref.inc.php を弄る
define('PLUGIN_REF_IMAGE', '/\.(gif|png|jpe?g)$/i');
を
define('PLUGIN_REF_IMAGE', '/^http:\/\/img\.simpleapi\.net\/[^\/]+\/https?:\/\/|\.(?:gif|png|jpe?g|jpe)$/i');
に置換する
SKIN_DIR の pukiwiki.css.php の
header('Content-Type: text/css');
の次の行に以下を【追記】
// {{{ 【追記/変更】更新されていない場合、キャッシュを使用させる
$tmp = filemtime('pukiwiki.css.php');
$req_header = apache_request_headers();
if (
$req_header['If-Modified-Since'] === gmdate('D, d M Y H:i:s', $tmp) . ' GMT' // RFC 822, updated by RFC 1123
|| $req_header['If-Modified-Since'] === gmdate('l, d-M-y H:i:s', $tmp) . ' GMT' // RFC 850, obsoleted by RFC 1036
|| $req_header['If-Modified-Since'] === preg_replace('/ 0(\d) /', ' $1 ', gmdate('D M d H:i:s Y', $tmp)) // ANSI C's asctime() format (RFC 1945)
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
// 崩れている書式にも対応させた方が良いかも知れないが、面倒なので放置
) {
header('HTTP/1.1 304 Not Modified');
exit;
}
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $tmp) . ' GMT');
// キャッシュの有効期限を常に切れた状態にする = キャッシュがある場合、オフラインで無い限り必ずサーバーにアクセスする(キャッシュをさせない訳ではないので、304を返すことも可能) = ログに残せる&最新のページを見てもらいやすい
//header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');
// }}}
※これは導入しない方がいいかもしれません
header('Cache-control: no-cache');
header('Pragma: no-cache');
をコメントアウト// {{{ 【追記/変更】更新されていない場合、キャッシュを使用させる
// 編集ページやPOST時はキャッシュさせず、他の通常ページはキャッシュさせる が、キャッシュの有効期限を常に切れた状態にする
// = キャッシュがある場合、オフラインで無い限り必ずサーバーにアクセスする(キャッシュをさせない訳ではないので、304を返すことも可能) = ログに残せる&最新のページを見てもらいやすい
// これにより、無駄な通信が減り、index.phpで直ぐに処理するのでサーバの負荷も減る
// ※オンラインでも、他のページの更新がどれだけ前に行われたかというtitle属性値の (23m) 何てのや、最新のN件等が不正確になる
// ついでにカウンタも回りづらくなる
// ※添付ファイルはこの追記では変化しない(通常通りの場合304無しでキャッシュさせる)
// ※pukiwiki.ini.php の $lastmod を 0 にする事(自前で処理する為)
if ($_POST || $_GET['plugin'] || ($_GET['cmd'] && $_GET['cmd'] !== 'read')) { // 通常ページ以外の参照か、POSTの場合
if (!(
$_GET['plugin'] === 'ref'
|| ($_GET['plugin'] === 'attach' && ($_GET['pcmd'] === 'open' || $_GET['openfile']))
|| ($_GET['plugin'] === 'input_helper_attach' && ($_GET['pcmd'] === 'open' || $_GET['openfile']))
)) { // ファイル参照ではない場合
header('Cache-control: no-cache');
header('Pragma: no-cache');
}
} else { // 通常ページの参照
// ※pukiwiki.ini.php を読み込む前に処理する為、SKIN_DIR や DATA_DIR 、 $defaultpage 、 $menubar などが決め打ちになっています。変更している場合はそれに合わせて書き換えてください。
$pagename = ($_SERVER['QUERY_STRING'] ? $_SERVER['QUERY_STRING'] :
($_GET['page'] ? $_GET['page'] : 'FrontPage') // ■$defaultpage
// $_GET['refer']
);
$tmp = array(
// 共通
filemtime('skin/pukiwiki.skin.php'), // SKIN_DIR
filemtime('wiki/4D656E75426172.txt'), // MenuBar ■$menubar
filemtime('wiki/'.strtoupper(bin2hex(urldecode($pagename))).'.txt'), // ページ名
filemtime('wiki/E382B3E383A1E383B3E38388'.strtoupper(bin2hex(urldecode($pagename))).'.txt'), // コメント/ページ名 pcomment プラグイン用 pcommentの引数で別のページを参照している場合は駄目
);
// recent, popular プラグインを使っているページ(最新のN件、人気のN件があるページ)は、その特性上毎日00:00:00に更新しているということにする ※MenuBarには使わないこと
// tracker_list プラグインを使っているページは、その特性上面倒なので、毎日00:00:00に更新しているということにする
if ($pagename === 'FrontPage')
$tmp[] = mktime(0,0,0,date('m'),date('d'),date('Y'));
/* DEBUG
echo '<xmp>';
print_r($tmp);
*/
rsort($tmp);
// {{{ 更新されていない場合、キャッシュを使用させる
$req_header = apache_request_headers();
if (
$req_header['If-Modified-Since'] === gmdate('D, d M Y H:i:s', $tmp[0]) . ' GMT' // RFC 822, updated by RFC 1123
|| $req_header['If-Modified-Since'] === gmdate('l, d-M-y H:i:s', $tmp[0]) . ' GMT' // RFC 850, obsoleted by RFC 1036
|| $req_header['If-Modified-Since'] === preg_replace('/ 0(\d) /', ' $1 ', gmdate('D M d H:i:s Y', $tmp[0])) // ANSI C's asctime() format (RFC 1945)
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
// 崩れている書式にも対応させた方が良いかも知れないが、面倒なので放置
) {
header('HTTP/1.1 304 Not Modified');
exit;
}
// }}}
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $tmp[0]) . ' GMT');
// キャッシュの有効期限を常に切れた状態にする = キャッシュがある場合、オフラインで無い限り必ずサーバーにアクセスする(キャッシュをさせない訳ではないので、304を返すことも可能) = ログに残せる&最新のページを見てもらいやすい
header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');
unset($pagename, $tmp, $req_header);
}
// }}} // {{{ 更新されていない場合、キャッシュを使用させる
$tmp = filemtime($this->filename);
$req_header = apache_request_headers();
if (
$req_header['If-Modified-Since'] === gmdate('D, d M Y H:i:s', $tmp) . ' GMT' // RFC 822, updated by RFC 1123
|| $req_header['If-Modified-Since'] === gmdate('l, d-M-y H:i:s', $tmp) . ' GMT' // RFC 850, obsoleted by RFC 1036
|| $req_header['If-Modified-Since'] === preg_replace('/ 0(\d) /', ' $1 ', gmdate('D M d H:i:s Y', $tmp)) // ANSI C's asctime() format (RFC 1945)
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
// 崩れている書式にも対応させた方が良いかも知れないが、面倒なので放置
// If-Modified-Since: の最後に付く事がある「;length=\d+」は同URLのGETとPOSTのキャッシュがある場合にIE6がくっつける様子(\d+はそのキャッシュのサイズ)
) {
header('HTTP/1.1 304 Not Modified');
exit;
}
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $tmp) . ' GMT');
unset($tmp);
// }}} // {{{ 更新されていない場合、キャッシュを使用させる
$tmp = filemtime($ref);
$req_header = apache_request_headers();
if (
$req_header['If-Modified-Since'] === gmdate('D, d M Y H:i:s', $tmp) . ' GMT' // RFC 822, updated by RFC 1123
|| $req_header['If-Modified-Since'] === gmdate('l, d-M-y H:i:s', $tmp) . ' GMT' // RFC 850, obsoleted by RFC 1036
|| $req_header['If-Modified-Since'] === preg_replace('/ 0(\d) /', ' $1 ', gmdate('D M d H:i:s Y', $tmp)) // ANSI C's asctime() format (RFC 1945)
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
// 崩れている書式にも対応させた方が良いかも知れないが、面倒なので放置
// If-Modified-Since: の最後に付く事がある「;length=\d+」は同URLのGETとPOSTのキャッシュがある場合にIE6がくっつける様子(\d+はそのキャッシュのサイズ)
) {
header('HTTP/1.1 304 Not Modified');
exit;
}
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $tmp) . ' GMT');
unset($tmp);
// }}}デフォルトの v1.23 を弄って、改造版を作った。 面倒なので別のプラグインとして公開する気はありません。 ※ディレクトリに偽装 (mod_rewrite)導入環境でのみ動作確認
導入
(無くてもJavaAppletでのグラフ作成が出来なくなるだけで、他の機能は動きます)変更点(v1.23 +4.1)
#vote{{
arg1,
arg2, ...
}}
の様に書いても使えるようにした。(これにより、差分が見やすくなる)サンプル1(日付が変わるまでの間、1回だけどれか1つの項目に投票可能 複数行)
サンプル2(日付が変わるまでの間、全選択肢に1回ずつ投票可能 1行)
サンプル2(1行)
予定 (センタク - みんなの投票所に誘導した方がよっぽど楽という事実もあったりするので、殆どやる気無し)
未確認
amChartsで作る? いや、Google Chart API使った方が早いな…
グラフ作成プラグイン - taru memo
PHP/SWF Charts使用 (FLASH)
PukiWiki/jschartプラグインでPukiWikiにグラフを表示 - アークウェブシステム開発SandBox
JSChart使用 (JavaScript)
円、線、折れ線グラフが表示可能
#instag か #input-helper のどちらかのみでOK コメント欄専用にもうちょっと小型の物があってもいいかも
非常に便利 スペースも1行分しか取らないのがイイ!
非常に便利 スペースを大きく取ってしまうが、出来る事が多め
公式消滅
非常に便利 ページが長くなると、これ無しでは使えない程
公式消滅 転載
※./ をブラウザがキャッシュしていると壊れる様子
// 編集リンクの文字列・スタイルを指定 // %s に URL が入るの次の行を以下に【変更】
define('_EDIT_LINK', ' <a class="paraedit" href="%s">Edit</a>');
更に、「// 編集リンクの挿入箇所を指定」を「</h2>の前」にする/* paraedit */
a.paraedit {
<?php if ($media === 'print') { ?>
display: none;
<?php } else { ?>
font-size: xx-small;
vertical-align: super;
<?php } ?>
}デフォルトの v1.21 を
include.inc.phpに置き換えればOK!
未確認 対応数が多い コピーすると変な事になるのが困りもの (1.2)
未確認
未確認 JavaScript
未確認
未確認 JavaScript
高機能 タグのオールクリア (?cmd=tag) 、タグクラウド、一覧表示も可能。(?cmd=taglist&tag=wiki^hoge や ?cmd=taglist&tag=wiki-hoge などの AND, NOT も使用可能)
リネーム、ページ削除の前に &tag(); のみにしてタグをクリアする必要がある(オールクリアでもいいけど)。
タグ(引数)のリネームにはreplaceplugin.inc.phpを使用する(置換後、オールクリア)。
rev184 エラーが出る場合、tag.inc.php の 「_('Admin Password')」を「('Admin Password')」に置換
TagCloud、はてなのように「Design」クリックしたら、Designを含むページ一覧が表示されて、そこで「CSS」をクリックすると、「Design+CSS」扱いに出来ないかなぁ…
未確認
カウント一覧表示 最終閲覧日、アクセス数などでソート可能。
(このサイト非常に格好いい 他にも良さそうなプラグイン多数有り)
カウント一覧表示 最終閲覧日、アクセス数などでソート可能。存在しないページのカウントファイル削除も出来る。
※#dirを適用する場合、以下の改造が必要。 → 元ファイル上書きしてしまったので、勝手に改造版公開。
counterlist.inc.php
http://www.okkez.net/pukiwiki/?memo%2F%E8%87%AA%E4%BD%9C%2F%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%2Fdeldel.inc.php
一括削除が楽になる ?cmd=deldel
mimetex.cgi を呼んで、TeX形式の数式を画像として表示する キャッシュ機能付き
例:x^2+y^2 = 
xreaでminetexをコンパイル&使用可能にする方法
公式にある linux版の mimetex.cgi を実行してもエラーが出るので、ソースをxreaにアップロードしてコンパイルする。
みこ氏作 ※キャッシュ機能無し(ver.0.5)
よくあるフォーマット & 各携帯でどうなるか
= &qrcode(2){hsus's Wiki\r\nhttp://hsus.xrea.jp/wiki/};
sue445氏版を元に改造したもの
アスキーアート表示プラグイン - 久々にワロタ まとめWiki
sue445氏版
pre.aa
{
font-family: MeiryoKe_PGothic, "MS Pゴシック", Mona;
color: black;
background-color: #efefef;
font-size: 12pt;
font-height: 18px;
line-height: 100%;
}JSが無効だと折りたたまれたままになるのが難点 また、閉じられなかった場合変な事になる
長いメニューをこれで一部隠し、第一引数に全メニューへのリンクを張れば良い感じ
他にもあると便利かも
#region([[省略>../]]) test :a|aa #endregion
| 省略 |
複数ページ一括置換
User-Agent: * Disallow: /wiki/?cmd= Disallow: /wiki/?plugin= Disallow: /wiki/Help/ Disallow: /wiki/PukiWiki/ Allow: /wiki/?cmd=rss
概要
導入
</head>の前の行に以下を【追記】
<script type="text/javascript" src="<?php echo $script . SKIN_DIR ?>menu.js" charset="utf-8"></script>または
<script type="text/javascript" src="<?php echo $GLOBALS['xreassl'] ?>/pukiwiki-skin/menu.js" charset="utf-8"></script>
<?php if (arg_check('read') && exist_plugin_convert('menu')) { ?>
<table border="0" style="width:100%">
<tr>
<td class="menubar">
<div id="menubar"><?php echo do_plugin_convert('menu') ?></div>
</td>
<td valign="top">
<div id="body">~</div>
</td>
</tr>
</table>
<?php } else { ?>
<div id="body">~</div>
<?php } ?>
を以下に【置換】
~
<?php if (arg_check('read') && exist_plugin_convert('menu') && is_file(DATA_DIR . '4D656E75426172.txt')) { ?>
<div id="menubar"><?php echo do_plugin_convert('menu') ?></div>
<?php } ?>float: right; /* float: left 時のみ */ /* margin-right: 2.5ex; */ background-color: white; padding: 1ex; border: 1px solid black;
※古いです。全く動作確認していません。
javascriptが無効になっていてもPOSTとcookieで処理するが、no-cacheでないとちょっと困ったことになる
</head>の前の行に以下を【追記】
<?php echo '<script type="text/javascript" src="' . SKIN_DIR . 'menu.js"></script>' ?>
<style type="text/css">
<?php if ($_COOKIE['hide'] == 1 || $_POST['hide'] == 1) { ?>
div#menubar{ position:static }
<?php } elseif ($_COOKIE['hide'] == 2 || $_POST['hide'] == 2) { ?>
div#menubar{ display:none }
<?php } ?>
</style><script type="text/javascript">create_contents_select()</script>
header('Content-Type: text/html; charset=' . CONTENT_CHARSET);
の次の行に以下を【追記】
if (strlen($_POST['hide'])) {
// POSTでCookieを変更
if ($_POST['keep'])
setcookie('hide', $_POST['hide']);
else
setcookie('hide');
// CookieよりPOST優先
$_COOKIE['hide'] = '';
}<?php if (arg_check('read') && exist_plugin_convert('menu')) { ?>
<table border="0" style="width:100%">
<tr>
<td class="menubar">
<div id="menubar"><?php echo do_plugin_convert('menu') ?></div>
</td>
<td valign="top">
<div id="body">~</div>
</td>
</tr>
</table>
<?php } else { ?>
<div id="body">~</div>
<?php } ?>
を以下に【置換】
~
<?php if ($attaches != '') { ?>
<div id="attach">
<?php echo $hr ?>
<?php echo $attaches ?>
</div>
<?php } ?>
の次の行に、以下を【追記】
<?php if (arg_check('read') && exist_plugin_convert('menu') && is_file(DATA_DIR . '4D656E75426172.txt')) { ?>
<hr <?php if ($_COOKIE['hide'] != 1 && $_POST['hide'] != 1) echo 'style="display:none" '; ?>id="menu_hr" />
<div id="menubar"><?php echo do_plugin_convert('menu') ?></div>
<?php } ?><body>を以下に【変更】
<body
<?php if (!$_COOKIE['hide'] && !$_POST['hide']
&& arg_check('read') && exist_plugin_convert('menu')
&& is_file(DATA_DIR . '4D656E75426172.txt')) { ?>
style="margin-left:18ex"
<?php } ?>
onload="menu_body_onload()"> | <?php _navigator('help') ?>
]
の次に以下を【追記】
<?php if (arg_check('read') && exist_plugin_convert('menu') && is_file(DATA_DIR . '4D656E75426172.txt')) { ?>
<script type="text/javascript">menu_listbox_w()</script>
<noscript><form method="post" style="display:inline;margin:0px;padding:0px">
<select name="hide">
<option value="0"<?php if (!$_COOKIE['hide'] && !$_POST['hide']) echo ' selected="selected"' ?>>Menuを左に</option>
<option value="1"<?php if ($_COOKIE['hide'] == 1 || $_POST['hide'] == 1) echo ' selected="selected"' ?>>Menuを下に</option>
<option value="2"<?php if ($_COOKIE['hide'] == 2 || $_POST['hide'] == 2) echo ' selected="selected"' ?>>Menuを隠す</option>
</select><input name="keep" title="維持(一時cookie使用)" type="checkbox"<?php if ($_POST['keep'] || strlen($_COOKIE['hide'])) echo ' checked="checked"' ?>><input type="submit" value="変更"></form> <a href="#menubar" title="MenuBar">#</a>
</noscript>
<?php } ?>div#menubar {
<?php if ($media == 'print') { ?>
display:none;
<?php } else { ?>
の次の
width:9em;を以下に【置換】
width:18ex; position:absolute; left:0px; top:0px; display:block;
IMAGE_DIR に
をDL
LIB_DIR の make_link.php の
$rel = '';
} else {
$rel = ' rel="nofollow"';
を
//$rel = '';
$rel = ' class="ext"';
} else {
//$rel = ' rel="nofollow"';
$rel = ' rel="nofollow" class="ext"';
に変更して、
InterWikiのも外したい場合は、同じファイルの「class Link_interwikiname extends Link {~}」内の最後らへんにある「 rel="nofollow"」も「 rel="nofollow" class="ext"」に置換する。
次に、SKIN_DIR の pukiwiki.css.php に
<?php if ($media !== 'print') { ?>
a.ext {
padding-left: 14px;
background-image: url(/img/pukiwiki/ext.png);
background-repeat: no-repeat;
background-position: left bottom;
}
<?php } ?>
a.ext:hover, a.ext:focus, a.ext:active {
color: red;
background-color: #ffdddd;
}
みたいなのを追記
ついでに、LIB_DIR の init.php の
' <a href="http://pukiwiki.sourceforge.jp/">PukiWiki Developers Team</a>.' . ' License is <a href="http://www.gnu.org/licenses/gpl.html">GPL</a>.<br />' . ' Based on "PukiWiki" 1.3 by <a href="http://factage.com/yu-ji/">yu-ji</a>'
にも「 class="ext"」を入れたければ入れる
※Xreaの場合、SKIN_DIR の pukiwiki.css.php の
header('Content-Type: text/css');
の後に、以下を挿入
// Xrea の SSL 用
if (preg_match('/(ss\d*\.xrea\.com)/i', $_SERVER['HTTP_VIA'], $matches))
$xreassl = 'https://'.$matches[1].'/'.$_SERVER['HTTP_HOST'];
更に、「/img/pukiwiki/」を「<?php echo $xreassl ?>/img/pukiwiki/」に置換
※「/img/pukiwiki/」は適当なパスに置換してください(SKINファイルでは、IMAGE_DIRが参照出来ない)
ついでに、<H\d> クリックでも目次表示
※#include の対応は極めていい加減
function replace_contents($arr)
{
$contents = '<div class="contents">' . "\n" .
'<a id="contents_' . $this->id . '"></a>' . "\n" .
を以下に【置換】
function replace_contents($arr)
{
$contents = '<script type="text/javascript">contents_show_hide(' .$this->id. ')</script><div id="contents_' .$this->id. '" class="contents">' ."\n" .
// '<a id="contents_' . $this->id . '"></a>' . "\n" ./* menu.js */
<?php if ($media === 'print') { ?>
div#content_select_div, span.contents_show_hide {
display: none;
}
<?php } ?>$_btn_notchangetimestamp . '</span></label>' . "\n" .を
$_btn_notchangetimestamp . ($notimeupdate == 2 ? '(※管理パスが必要です)' : '') . '</span></label>' . "\n" .に【置換】 (『タイムスタンプを変更しない』の後に『(※管理パスが必要です)』を追加する)
<div style="float:left;">を
<strong style="color:#f55">【重要】 編集時はページが壊れる可能性があるので、Proxomitron等を使用している場合は<u>必ずバイパスしてください</u>。</strong> <div style="float:left;">に【置換】 (TEXTAREAの直ぐ下に『【重要】 編集時はページが壊れる可能性があるので、Proxomitron等を使用している場合は必ずバイパスしてください。』を追加する)
<textarea name="msg" rows="$rows" cols="$cols">$s_postdata</textarea> <br />を
<textarea name="msg" rows="$rows" cols="$cols" style="width:100%;line-break:normal;word-break:break-all;word-wrap:break-word;white-space:-moz-pre-wrap;white-space:-pre-wrap">$s_postdata</textarea> <br style="display:none" />に【置換】 (普通は textarea を width:100% にするだけでいい筈だが、#instag を導入している場合(?)、強制折り返しにしないと横に伸びすぎてしまう事がある様子※IE7で確認)
./default.ini.php の
// ユーザ定義ルール(コンバート時に置換)
以下を次のように変更
// ユーザ定義ルール(コンバート時に置換)
$line_rules = array(
//'COLOR\(([^\(\)]*)\){([^}]*)}' => '<span style="color:$1">$2</span>',
'COLOR\(([^;\(\)]*)\){([^}]*)}' => '<span style="color:$1">$2</span>',
//'SIZE\(([^\(\)]*)\){([^}]*)}' => '<span style="font-size:$1px">$2</span>',
'SIZE\((\d{1,2})\){([^}]*)}' => '<span style="font-size:$1px">$2</span>',
//'COLOR\(([^\(\)]*)\):((?:(?!COLOR\([^\)]+\)\:).)*)' => '<span style="color:$1">$2</span>',
'COLOR\(([^;\(\)]*)\):((?:(?!COLOR\([^\)]+\)\:).)*)' => '<span style="color:$1">$2</span>',
//'SIZE\(([^\(\)]*)\):((?:(?!SIZE\([^\)]+\)\:).)*)' => '<span class="size$1">$2</span>',
'SIZE\(([0-7])\):((?:(?!SIZE\([^\)]+\)\:).)*)' => '<span class="size$1">$2</span>',
'%%%(?!%)((?:(?!%%%).)*)%%%' => '<ins>$1</ins>',
'%%(?!%)((?:(?!%%).)*)%%' => '<del>$1</del>',
"'''(?!')((?:(?!''').)*)'''" => '<em>$1</em>',
"''(?!')((?:(?!'').)*)''" => '<strong>$1</strong>',
// 【追記】FACE/FONTでフォント変更
'F(?:ACE|ONT)\(([^;\(\)]*)\){([^}]*)}' => '<span style="font-family:$1">$2</span>',
'F(?:ACE|ONT)\(([^;\(\)]*)\):((?:(?!F(?:ACE|ONT)\([^\)]+\)\:).)*)' => '<span style="font-family:$1">$2</span>',
// 【追記】
"~~(?!~)((?:(?!~~).)*)~~" => '<sup>$1</sup>',
"__(?!_)((?:(?!__).)*)__" => '<sub>$1</sub>',
);
以下微妙な荒らしの例
以下例
<?xml version="1.0" encoding="utf-8"?>が含まれる行を
print '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<?xml-stylesheet href="' . SKIN_DIR .'rdf.css" type="text/css"?>' . "\n\n";に変更 ※Xreaの場合、以下のようにする ※HTMLを軽くする為、内部リンクは相対パスにするを適用していること
print '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<?xml-stylesheet href="'.$GLOBALS['xreassl'].'/pukiwiki-skin/rdf.css" type="text/css"?>' . "\n\n";
負荷も軽くなるし、非常に便利なサイトで、しかも無料なので、使用しない手はありません。 オススメ!
(SKIN_DIR / pukiwiki.skin.php の 「<?php echo $link['rss'] ?>」を専用URLに変更するのを忘れずに)
ウェブブックマークへの登録が非常に簡単になるのでおすすめ。
MenuBar の最後らへんに「<div style="text-align:right">~</div>」で囲んで、ぶち込んでおくといい感じ。
MenuBarなどに amazon 等のプラグインで挿入してから、凍結すればOKと言えばOKだが… 自由にHTMLを書けない(書けるようになるプラグインもあるかと思うけど)ので、SKINにべた書きする。
SKIN_DIR / pukiwiki.skin.php の 「<?php echo do_plugin_convert('menu') ?>」の後辺りに(MenuBarの最後らへん)以下を【追記】
<hr class="full_hr" />
<h4 style="border:0px; background-color:#eee">以下宣伝
<script type="text/javascript">
_d.write(' [<a href="javascript:void(0)" onclick="'
+ "var sty = _d.getElementById('menu_ads').style;"
+ "if (sty.display === 'none') {"
+ "this.innerHTML = '隠す';"
+ "sty.display = '';"
+ "_d.cookie = 'hide_ads=1; path=<?php echo $script; ?>; expires=Fri, 5-Oct-1979 08:10:00 GMT';"
+ "} else {"
+ "this.innerHTML = '表示';"
+ "sty.display = 'none';"
+ "_d.cookie = 'hide_ads=1; path=<?php echo $script; ?>';"
+ "}"
+ '">' +(/(?:^|;\s*)hide_ads=1/.test(_d.cookie) ? '表示' : '隠す')+ '</a>]');
</script>
</h4>
<div id="menu_ads">
このサイトと微塵も関係なくてもいいじゃない。
<div style="text-align:center">
<a href="http://www8.atwiki.jp/mainichi-matome/" style="text-decoration:none">
<img src="/img/link/mainichi-hentai-28_120x90.png" style="width:120px; height:90px; border:1px solid blue" title="変態毎日新聞問題の情報集積wiki" alt="変態毎日新聞問題の情報集積wiki" /><br />
<img src="/img/link/mainichi-hentai-31_130x150.gif" style="width:130px; height:150px; border:1px solid black; margin-top:1ex" title="こどもたちや女性の安全の為に知ってください" alt="こどもたちや女性の安全の為に知ってください" /></a>
</div>
<script type="text/javascript">
if (/(?:^|;\s*)hide_ads=1/.test(_d.cookie))
_d.getElementById('menu_ads').style.display = 'none';
</script>
</div>
一応、一時Cookieを使用して広告表示/非表示切り替え可能 ※prototype.js や
menu.js を使用していない場合は、_d = document; を適当なところに書く必要があります。
※多バイト文字を使用する場合は、pukiwiki.skin.php の文字コードをUTF-8か、EUC-JPに変える必要があります
@外部JavaScriptとして読み込んだ方がいいかも知れないが、そうするとJavaScriptOFF環境で見えなくなってしまうのでやめ
@外部ファイルを readfile() で読み込んだ方がいいかも知れないが、そうすると重くなるかも知れないので(適当)やめ
PLUGIN_DIR / comment.inc.php の 「PLUGIN_COMMENT_FORMAT_NAME」の値と、
PLUGIN_DIR / pcomment.inc.php の 「PLUGIN_PCOMMENT_FORMAT_NAME」の値を以下に置換
'[[$name>:User/$name]]'
PukiWiki/1.4/Manual/Plugin/追加拡張 辺りに #mimetex などのHELPを用意
追加
-[http://find.2ch.net/?BBS=ALL&TYPE=TITLE&COUNT=100&STR= 2ch] euc
※SPAM対策がしっかり出来ていない場合、推奨出来ません
LIB_DIR / make_link.php の
「class Link_url extends Link {~}」内の最後らへんにある「 rel="nofollow"」を削除すればOK!
InterWikiのも外したい場合は、同じファイルの「class Link_interwikiname extends Link {~}」内の最後らへんにある「 rel="nofollow"」を削除すればOK!
|