自作プラグイン/tab.inc.php
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
** tab.inc.php [#f4e25ff9]
|RIGHT:100|LEFT:360|c
|~サマリ|複数ページのタブ表示|
|~リビジョン|1.11|
|~対応バージョン|1.5.3|
|~投稿者|[[M.Taniguchi]]|
|~投稿日|&new{2020-04-20 (月) 13:31:33};|
**概要 [#ua2ede48]
複数のページをタブ表示するプラグイン。~
タブをクリックすると該当ページをロードして表示を差し替え...
タブをダブルクリックすると該当ページのURLに遷移します。
PukiWiki 1.5.3/PHP 7.4/UTF-8 で動作確認済み。旧バージョ...
**使い方 [#k0eae189]
#tab([ラベル1>]ページ名[,[ラベル2>]ページ名2][,...])
ラベルとページ名の組をカンマで区切って必要なだけ羅列する。~
ページ名はタブ表示したいページの名前(Hoge、Fuga/Piyo等)...
ラベルを省略するとページ名がタブのラベルとなる。
''使用例''
#tab(プロフィール>Profile,履歴>History,連絡先>Contact)
''制約''
-本プラグインを挿入できるのは1ページにつき1箇所のみです。
-ループする恐れがあるため、タブの入れ子、つまりタブで読み...
-注釈表示領域にはタブで読み込まれたページの注釈が表示され...
-JavaScriptが有効でないと動作しません。
**コード [#g8cc5e41]
tab.inc.php~
(下記のコードをコピーして、plugin ディレクトリに tab.inc...
<?php
/*
PukiWiki - Yet another WikiWikiWeb clone.
tab.inc.php, v1.11 2020 M.Taniguchi
License: GPL v3 or (at your option) any later version
ページをタブ表示するプラグイン。
タブをクリックすると該当ページをロードして表示を差し替え...
タブをダブルクリックすると該当ページのURLに遷移します。
【使い方】
#tab([ラベル1>]ページ名[,[ラベル2>]ページ名2][,...])
ラベルとページ名の組をカンマで区切って必要なだけ羅列する。
ページ名はタブ表示したいページの名前(Hoge、Fuga/Piyo等...
ラベルを省略するとページ名がタブのラベルとなる。
【使用例】
#tab(プロフィール>Profile,履歴>History,連絡先>Contact)
【制約】
・本プラグインを挿入できるのは1ページにつき1箇所のみです。
・ループする恐れがあるため、タブの入れ子、つまりタブで読...
・注釈表示領域にはタブで読み込まれたページの注釈が表示さ...
・JavaScriptが有効でないと動作しません。
*/
/////////////////////////////////////////////////
// タブ表示プラグイン設定(tab.inc.php)
if (!defined('PLUGIN_TAB_RESTRICT')) define('P...
if (!defined('PLUGIN_TAB_ALLOW_DOUBLECLICK')) define('P...
if (!defined('PLUGIN_TAB_TIMEOUT')) define('P...
if (!defined('PLUGIN_TAB_ALLOW_DEFAULTSTYLE')) define('P...
if (!defined('PLUGIN_TAB_NOTEID')) define('P...
if (!defined('PLUGIN_TAB_NOCACHE')) define('P...
function plugin_tab_convert() {
global $vars, $defaultpage, $foot_explain;
// JavaScript無効なら中断
if (!PKWK_ALLOW_JAVASCRIPT) return '';
// 引数がなければ中断
$arg = func_get_args();
if (!$arg) return '';
// 二重起動なら中断
static $included = false;
if ($included) return '';
$included = true;
// 制限あり?
if (PLUGIN_TAB_RESTRICT) {
global $auth_user;
$backup = $auth_user;
$auth_user = ''; // 非認証ユーザーのふり
$result = (PKWK_READONLY || !is_editable($vars['page']...
$auth_user = $backup;
if (!$result) return ''; // 誰でも編集可能なページなら...
}
// 引数を走査してタブページ名を取得
$page = '';
$tabs = '';
foreach ($arg as $v) {
if (strpos($v, '>') === false) {
$v = trim($v);
$v = array($v, $v);
} else {
$v = explode('>', $v);
$v[0] = trim($v[0]);
$v[1] = trim($v[1]);
}
$id = urlencode($v[1]);
$tabs .= '<li id="PluginTab-' . $id . '" class="Plugin...
if (!$page) $page = $v[1];
}
$tabs = '<ul id="PluginTabs">' . $tabs . '</ul>';
// デフォルトページ読み込み
$data = plugin_tab_getPage($page);
$data = str_replace('","explain":[', '`,"explain":[', s...
$page = urlencode($page);
$noteId = (PLUGIN_TAB_NOTEID)? PLUGIN_TAB_NOTEID : 'not...
// スタイル定義
$style = <<<EOT
<style>
/* タブ領域 */
#PluginTabs {
display: block;
margin-bottom: 0;
padding: 0;
-webkit-user-select: none; -moz-user-select: none; -ms-...
}
/* タブ */
.PluginTab {
list-style: none;
display: inline-block;
min-width: 5em;
padding: .3em .5em;
box-sizing: border-box;
border: 0 solid #808080;
border-width: 1px 1px 0;
border-radius: 8px 8px 0 0;
text-align: center;
cursor: pointer;
}
/* 選択中タブ */
.PluginTab[data-active='1'] {
font-weight: bold;
cursor: auto;
}
/* ページ表示領域 */
#PluginTabContent {
margin-top: 1.5em;
}
/* その他調整 */
#${noteId} { display:none };
</style>
EOT;
// JavaScriptコード
$script = get_script_uri();
$method = 'GET';
$timeout = PLUGIN_TAB_TIMEOUT;
$jscode = <<<EOT
<script>
'use strict';
var __PluginTab__ = function() {
const self = this;
this.content = document.getElementById('PluginTabConten...
this.tabs = document.getElementsByClassName('PluginTab'...
this.note = null; // 注釈表示領域要素
this.data = []; // ページ情報
// 最初のタブのページ情報はあらかじめ設定
this.data['${page}'] = ${data};
// URLに「#タブページ名」指定あり?
var path = location.href.split('#');
if (path[1] != undefined && path[1]) {
// ありならタブ切り替え
window.addEventListener('DOMContentLoaded', function(){
var ele = document.getElementById('PluginTab-' + path...
self.change(ele);
self.note = document.getElementById('${noteId}');
self.note.style.display = 'none';
});
} else {
// HTML表示
this.makeHTML(this.content, this.data['${page}']['body...
// 注釈を設定
window.addEventListener('DOMContentLoaded', function(){
self.note = document.getElementById('${noteId}');
self.changeNote(self.data['${page}']['explain']);
});
}
};
// タブ切り替え(タブクリックハンドラ)
__PluginTab__.prototype.change = function(ele) {
const self = this;
if (ele.getAttribute('data-active')) return; // すでに...
var page = ele.getAttribute('data-page'); // クリックさ...
// URLに「#タブページ名」を設定
window.location.href = '#' + ((page != '${page}')? pag...
// タブに選択中属性を設定
for (var i = self.tabs.length - 1; i >= 0; --i) self.ta...
ele.setAttribute('data-active', '1');
// ロード済みのページか?
if (self.data[page] !== undefined) {
// ロード済みページ情報を表示
self.makeHTML(self.content, self.data[page]['body']);
self.changeNote(self.data[page]['explain']);
} else {
// ページ情報をロードして表示
var xhr = new XMLHttpRequest();
xhr.open('${method}', '${script}?plugin=tab&refer=' + ...
xhr.responseType = 'json';
if (${timeout} > 0) xhr.timeout = Math.max(${timeout},...
xhr.onload = function() {
if (xhr.status == 200 && xhr.response) {
self.data[page] = xhr.response; // ページ情報を記憶...
if (typeof self.data[page] === 'string') self.data[p...
self.makeHTML(self.content, self.data[page]['body']);
self.changeNote(self.data[page]['explain']);
}
};
xhr.send();
}
};
// Script実行付きinnerHTML(注:document.write()には非対...
__PluginTab__.prototype.makeHTML = function(element, htm...
var regexp = /<script[^>]+?\/>|<script(.|\s)*?\/script>...
var scripts = html.match(regexp);
if (scripts) {
element.innerHTML = html.replace(regexp, '');
scripts.forEach(function(script) {
var scriptElement = document.createElement('script');
var src = script.match(/<script[^>]+src=['"]?([^'"\s]...
if (src && src.length >= 1) {
scriptElement.src = src[1];
scriptElement.setAttribute('defer', 'defer');
} else {
scriptElement.text = script.replace(/<[\/]*?script>/...
}
element.appendChild(scriptElement);
});
} else {
element.innerHTML = html;
}
};
// ページ遷移(タブダブルクリックハンドラ)
__PluginTab__.prototype.move = function(ele) {
var page = ele.getAttribute('data-page'); // ダブルクリ...
window.location.href = '${script}?' + page; // 画面遷移
};
// 注釈書き換え
__PluginTab__.prototype.changeNote = function(data) {
const self = this;
if (self.note) {
var explain = '';
if (data) data.forEach(function(v){ explain += v; });
if (explain) {
self.note.innerHTML = '<hr class="note_hr"/>' + expla...
self.note.style.display = 'block';
} else {
self.note.style.display = 'none';
self.note.innerHTML = '';
}
}
};
var __pluginTab__ = new __PluginTab__();
</script>
EOT;
$foot_explain = array(1 => '​'); // 注釈表示ブロ...
return ((PLUGIN_TAB_ALLOW_DEFAULTSTYLE)? $style : '') ....
}
// URL指定呼び出し(タブ切り替え時にクライアントから呼ば...
function plugin_tab_action() {
global $vars;
header('Content-Type: application/json');
if (PLUGIN_TAB_NOCACHE) header('Cache-Control: no-cache...
echo plugin_tab_getPage($vars['refer']);
exit;
}
// ページ情報JSON取得
function plugin_tab_getPage($page) {
global $vars, $defaultpage, $foot_explain, $auth_type, ...
$page = trim($page);
if (!$page) $page = &$defaultpage; // ページ名が空なら...
// 有効かつ権限があればページ内容を取得
$body = '';
if (is_page($page)) {
if (check_readable($page, false, false)) {
// 現在ページと取得ページが異なる?
if ($page != $vars['page']) {
$backup = unserialize(serialize($vars)); // HTTP引数...
$vars['page'] = $page; // 現在ページ名を変更してシス...
}
$body = get_source($page); // ソースを取得
foreach ($body as $i => $row) if (strpos($row, '#tab(...
$body = convert_html($body); // HTMLに変換
if ($backup) $vars = $backup; // HTTP引数を元に戻す
} else
if (exist_plugin_action('loginform') && (AUTH_TYPE_FOR...
$body = '<a href="./?plugin=loginform&pcmd=login&page...
}
}
// JSONエンコード
$json = json_encode(array('body' => $body, 'explain' =>...
return $json;
}
**詳細 [#j4377614]
***ページの切り替え処理 [#k41be708]
タブを選択すると、対応するページをAjaxでロードします。~
そして既表示ページをDOMから削除し、代わりにロードしたペー...
スタイルによる表示・非表示ではなく、わざわざこのようにDOM...
***動作設定 [#j8fd8718]
コード内の下記の定数で動作を制御することができます。
|~定数名|~値|~既定値|~意味|
|PLUGIN_TAB_RESTRICT|CENTER:0 or 1|CENTER:0|1なら本プラグ...
|PLUGIN_TAB_ALLOW_DOUBLECLICK|CENTER:0 or 1|CENTER:1|1な...
|PLUGIN_TAB_TIMEOUT|CENTER:任意の数値|CENTER:10000|タブペ...
|PLUGIN_TAB_ALLOW_DEFAULTSTYLE|CENTER:0 or 1|CENTER:1|1な...
|PLUGIN_TAB_NOTEID|CENTER:任意の文字列|CENTER:'note'|注釈...
|PLUGIN_TAB_NOCACHE|CENTER:0 or 1|CENTER:1|1ならロードす...
~
''※ 誰でも編集可能な公開ウィキにおいては、PLUGIN_TAB_REST...
PukiWikiは原則として、ページを同時に複数表示したり、画面...
一般に、ユーザーもそのつもりでページを編集してはいないで...
(標準添付の include のようにサーバーサイドでページの入れ...
このプラグインはその原則を無理やり破るため、予期せぬ不具...
結果はPukiWikiやPHPのバージョン・表示するページ内容・併用...
可能性があるだけで即致命的なわけではなく、導入してみたが...
***スキンCSSによるタブへのスタイル適用 [#d598780e]
コード内の定数 PLUGIN_TAB_ALLOW_DEFAULTSTYLE の値を 0 に...
|~役割|~要素|~CSSセレクター|
|CENTER:タブ領域|<ul id="PluginTabs">タブ群</ul>|#PluginT...
|CENTER:タブ|<li class="PluginTab">ラベル</li>|.PluginTab|
|CENTER:選択中タブ|<li class="PluginTab" data-active="1">...
|CENTER:ページ表示領域|<section id="PluginTabContent">ペ...
***ページ情報取得API [#te17538a]
次のURL書式で指定ページの本文と注釈とをJSON形式で得ること...
?plugin=tab&page=ページ名
応答フォーマットは次の通り。
{
"body":"ページ本文のHTML",
"explain":[
"1つ目の注釈のHTML",
"2つ目の注釈のHTML",
...
]
}
**ライセンス [#p1472648]
GPL v3
**改版履歴 [#h661aa51]
-バージョン1.0
--初版
-バージョン1.04
--タブのダブルクリックによる該当ページへの遷移機能を追加
-バージョン1.1
--エイリアス書式に合わせ、引数の順序を「ページ名>ラベル」...
--リロードしても元に戻らないよう、選択したタブをURLに保持...
--ページに含まれるJavaScript(script要素)をできるかぎり...
--ページ内容により正常に表示されない不具合を修正
-バージョン1.11
--リソースを常にGETメソッドで取得するよう修正
終了行:
** tab.inc.php [#f4e25ff9]
|RIGHT:100|LEFT:360|c
|~サマリ|複数ページのタブ表示|
|~リビジョン|1.11|
|~対応バージョン|1.5.3|
|~投稿者|[[M.Taniguchi]]|
|~投稿日|&new{2020-04-20 (月) 13:31:33};|
**概要 [#ua2ede48]
複数のページをタブ表示するプラグイン。~
タブをクリックすると該当ページをロードして表示を差し替え...
タブをダブルクリックすると該当ページのURLに遷移します。
PukiWiki 1.5.3/PHP 7.4/UTF-8 で動作確認済み。旧バージョ...
**使い方 [#k0eae189]
#tab([ラベル1>]ページ名[,[ラベル2>]ページ名2][,...])
ラベルとページ名の組をカンマで区切って必要なだけ羅列する。~
ページ名はタブ表示したいページの名前(Hoge、Fuga/Piyo等)...
ラベルを省略するとページ名がタブのラベルとなる。
''使用例''
#tab(プロフィール>Profile,履歴>History,連絡先>Contact)
''制約''
-本プラグインを挿入できるのは1ページにつき1箇所のみです。
-ループする恐れがあるため、タブの入れ子、つまりタブで読み...
-注釈表示領域にはタブで読み込まれたページの注釈が表示され...
-JavaScriptが有効でないと動作しません。
**コード [#g8cc5e41]
tab.inc.php~
(下記のコードをコピーして、plugin ディレクトリに tab.inc...
<?php
/*
PukiWiki - Yet another WikiWikiWeb clone.
tab.inc.php, v1.11 2020 M.Taniguchi
License: GPL v3 or (at your option) any later version
ページをタブ表示するプラグイン。
タブをクリックすると該当ページをロードして表示を差し替え...
タブをダブルクリックすると該当ページのURLに遷移します。
【使い方】
#tab([ラベル1>]ページ名[,[ラベル2>]ページ名2][,...])
ラベルとページ名の組をカンマで区切って必要なだけ羅列する。
ページ名はタブ表示したいページの名前(Hoge、Fuga/Piyo等...
ラベルを省略するとページ名がタブのラベルとなる。
【使用例】
#tab(プロフィール>Profile,履歴>History,連絡先>Contact)
【制約】
・本プラグインを挿入できるのは1ページにつき1箇所のみです。
・ループする恐れがあるため、タブの入れ子、つまりタブで読...
・注釈表示領域にはタブで読み込まれたページの注釈が表示さ...
・JavaScriptが有効でないと動作しません。
*/
/////////////////////////////////////////////////
// タブ表示プラグイン設定(tab.inc.php)
if (!defined('PLUGIN_TAB_RESTRICT')) define('P...
if (!defined('PLUGIN_TAB_ALLOW_DOUBLECLICK')) define('P...
if (!defined('PLUGIN_TAB_TIMEOUT')) define('P...
if (!defined('PLUGIN_TAB_ALLOW_DEFAULTSTYLE')) define('P...
if (!defined('PLUGIN_TAB_NOTEID')) define('P...
if (!defined('PLUGIN_TAB_NOCACHE')) define('P...
function plugin_tab_convert() {
global $vars, $defaultpage, $foot_explain;
// JavaScript無効なら中断
if (!PKWK_ALLOW_JAVASCRIPT) return '';
// 引数がなければ中断
$arg = func_get_args();
if (!$arg) return '';
// 二重起動なら中断
static $included = false;
if ($included) return '';
$included = true;
// 制限あり?
if (PLUGIN_TAB_RESTRICT) {
global $auth_user;
$backup = $auth_user;
$auth_user = ''; // 非認証ユーザーのふり
$result = (PKWK_READONLY || !is_editable($vars['page']...
$auth_user = $backup;
if (!$result) return ''; // 誰でも編集可能なページなら...
}
// 引数を走査してタブページ名を取得
$page = '';
$tabs = '';
foreach ($arg as $v) {
if (strpos($v, '>') === false) {
$v = trim($v);
$v = array($v, $v);
} else {
$v = explode('>', $v);
$v[0] = trim($v[0]);
$v[1] = trim($v[1]);
}
$id = urlencode($v[1]);
$tabs .= '<li id="PluginTab-' . $id . '" class="Plugin...
if (!$page) $page = $v[1];
}
$tabs = '<ul id="PluginTabs">' . $tabs . '</ul>';
// デフォルトページ読み込み
$data = plugin_tab_getPage($page);
$data = str_replace('","explain":[', '`,"explain":[', s...
$page = urlencode($page);
$noteId = (PLUGIN_TAB_NOTEID)? PLUGIN_TAB_NOTEID : 'not...
// スタイル定義
$style = <<<EOT
<style>
/* タブ領域 */
#PluginTabs {
display: block;
margin-bottom: 0;
padding: 0;
-webkit-user-select: none; -moz-user-select: none; -ms-...
}
/* タブ */
.PluginTab {
list-style: none;
display: inline-block;
min-width: 5em;
padding: .3em .5em;
box-sizing: border-box;
border: 0 solid #808080;
border-width: 1px 1px 0;
border-radius: 8px 8px 0 0;
text-align: center;
cursor: pointer;
}
/* 選択中タブ */
.PluginTab[data-active='1'] {
font-weight: bold;
cursor: auto;
}
/* ページ表示領域 */
#PluginTabContent {
margin-top: 1.5em;
}
/* その他調整 */
#${noteId} { display:none };
</style>
EOT;
// JavaScriptコード
$script = get_script_uri();
$method = 'GET';
$timeout = PLUGIN_TAB_TIMEOUT;
$jscode = <<<EOT
<script>
'use strict';
var __PluginTab__ = function() {
const self = this;
this.content = document.getElementById('PluginTabConten...
this.tabs = document.getElementsByClassName('PluginTab'...
this.note = null; // 注釈表示領域要素
this.data = []; // ページ情報
// 最初のタブのページ情報はあらかじめ設定
this.data['${page}'] = ${data};
// URLに「#タブページ名」指定あり?
var path = location.href.split('#');
if (path[1] != undefined && path[1]) {
// ありならタブ切り替え
window.addEventListener('DOMContentLoaded', function(){
var ele = document.getElementById('PluginTab-' + path...
self.change(ele);
self.note = document.getElementById('${noteId}');
self.note.style.display = 'none';
});
} else {
// HTML表示
this.makeHTML(this.content, this.data['${page}']['body...
// 注釈を設定
window.addEventListener('DOMContentLoaded', function(){
self.note = document.getElementById('${noteId}');
self.changeNote(self.data['${page}']['explain']);
});
}
};
// タブ切り替え(タブクリックハンドラ)
__PluginTab__.prototype.change = function(ele) {
const self = this;
if (ele.getAttribute('data-active')) return; // すでに...
var page = ele.getAttribute('data-page'); // クリックさ...
// URLに「#タブページ名」を設定
window.location.href = '#' + ((page != '${page}')? pag...
// タブに選択中属性を設定
for (var i = self.tabs.length - 1; i >= 0; --i) self.ta...
ele.setAttribute('data-active', '1');
// ロード済みのページか?
if (self.data[page] !== undefined) {
// ロード済みページ情報を表示
self.makeHTML(self.content, self.data[page]['body']);
self.changeNote(self.data[page]['explain']);
} else {
// ページ情報をロードして表示
var xhr = new XMLHttpRequest();
xhr.open('${method}', '${script}?plugin=tab&refer=' + ...
xhr.responseType = 'json';
if (${timeout} > 0) xhr.timeout = Math.max(${timeout},...
xhr.onload = function() {
if (xhr.status == 200 && xhr.response) {
self.data[page] = xhr.response; // ページ情報を記憶...
if (typeof self.data[page] === 'string') self.data[p...
self.makeHTML(self.content, self.data[page]['body']);
self.changeNote(self.data[page]['explain']);
}
};
xhr.send();
}
};
// Script実行付きinnerHTML(注:document.write()には非対...
__PluginTab__.prototype.makeHTML = function(element, htm...
var regexp = /<script[^>]+?\/>|<script(.|\s)*?\/script>...
var scripts = html.match(regexp);
if (scripts) {
element.innerHTML = html.replace(regexp, '');
scripts.forEach(function(script) {
var scriptElement = document.createElement('script');
var src = script.match(/<script[^>]+src=['"]?([^'"\s]...
if (src && src.length >= 1) {
scriptElement.src = src[1];
scriptElement.setAttribute('defer', 'defer');
} else {
scriptElement.text = script.replace(/<[\/]*?script>/...
}
element.appendChild(scriptElement);
});
} else {
element.innerHTML = html;
}
};
// ページ遷移(タブダブルクリックハンドラ)
__PluginTab__.prototype.move = function(ele) {
var page = ele.getAttribute('data-page'); // ダブルクリ...
window.location.href = '${script}?' + page; // 画面遷移
};
// 注釈書き換え
__PluginTab__.prototype.changeNote = function(data) {
const self = this;
if (self.note) {
var explain = '';
if (data) data.forEach(function(v){ explain += v; });
if (explain) {
self.note.innerHTML = '<hr class="note_hr"/>' + expla...
self.note.style.display = 'block';
} else {
self.note.style.display = 'none';
self.note.innerHTML = '';
}
}
};
var __pluginTab__ = new __PluginTab__();
</script>
EOT;
$foot_explain = array(1 => '​'); // 注釈表示ブロ...
return ((PLUGIN_TAB_ALLOW_DEFAULTSTYLE)? $style : '') ....
}
// URL指定呼び出し(タブ切り替え時にクライアントから呼ば...
function plugin_tab_action() {
global $vars;
header('Content-Type: application/json');
if (PLUGIN_TAB_NOCACHE) header('Cache-Control: no-cache...
echo plugin_tab_getPage($vars['refer']);
exit;
}
// ページ情報JSON取得
function plugin_tab_getPage($page) {
global $vars, $defaultpage, $foot_explain, $auth_type, ...
$page = trim($page);
if (!$page) $page = &$defaultpage; // ページ名が空なら...
// 有効かつ権限があればページ内容を取得
$body = '';
if (is_page($page)) {
if (check_readable($page, false, false)) {
// 現在ページと取得ページが異なる?
if ($page != $vars['page']) {
$backup = unserialize(serialize($vars)); // HTTP引数...
$vars['page'] = $page; // 現在ページ名を変更してシス...
}
$body = get_source($page); // ソースを取得
foreach ($body as $i => $row) if (strpos($row, '#tab(...
$body = convert_html($body); // HTMLに変換
if ($backup) $vars = $backup; // HTTP引数を元に戻す
} else
if (exist_plugin_action('loginform') && (AUTH_TYPE_FOR...
$body = '<a href="./?plugin=loginform&pcmd=login&page...
}
}
// JSONエンコード
$json = json_encode(array('body' => $body, 'explain' =>...
return $json;
}
**詳細 [#j4377614]
***ページの切り替え処理 [#k41be708]
タブを選択すると、対応するページをAjaxでロードします。~
そして既表示ページをDOMから削除し、代わりにロードしたペー...
スタイルによる表示・非表示ではなく、わざわざこのようにDOM...
***動作設定 [#j8fd8718]
コード内の下記の定数で動作を制御することができます。
|~定数名|~値|~既定値|~意味|
|PLUGIN_TAB_RESTRICT|CENTER:0 or 1|CENTER:0|1なら本プラグ...
|PLUGIN_TAB_ALLOW_DOUBLECLICK|CENTER:0 or 1|CENTER:1|1な...
|PLUGIN_TAB_TIMEOUT|CENTER:任意の数値|CENTER:10000|タブペ...
|PLUGIN_TAB_ALLOW_DEFAULTSTYLE|CENTER:0 or 1|CENTER:1|1な...
|PLUGIN_TAB_NOTEID|CENTER:任意の文字列|CENTER:'note'|注釈...
|PLUGIN_TAB_NOCACHE|CENTER:0 or 1|CENTER:1|1ならロードす...
~
''※ 誰でも編集可能な公開ウィキにおいては、PLUGIN_TAB_REST...
PukiWikiは原則として、ページを同時に複数表示したり、画面...
一般に、ユーザーもそのつもりでページを編集してはいないで...
(標準添付の include のようにサーバーサイドでページの入れ...
このプラグインはその原則を無理やり破るため、予期せぬ不具...
結果はPukiWikiやPHPのバージョン・表示するページ内容・併用...
可能性があるだけで即致命的なわけではなく、導入してみたが...
***スキンCSSによるタブへのスタイル適用 [#d598780e]
コード内の定数 PLUGIN_TAB_ALLOW_DEFAULTSTYLE の値を 0 に...
|~役割|~要素|~CSSセレクター|
|CENTER:タブ領域|<ul id="PluginTabs">タブ群</ul>|#PluginT...
|CENTER:タブ|<li class="PluginTab">ラベル</li>|.PluginTab|
|CENTER:選択中タブ|<li class="PluginTab" data-active="1">...
|CENTER:ページ表示領域|<section id="PluginTabContent">ペ...
***ページ情報取得API [#te17538a]
次のURL書式で指定ページの本文と注釈とをJSON形式で得ること...
?plugin=tab&page=ページ名
応答フォーマットは次の通り。
{
"body":"ページ本文のHTML",
"explain":[
"1つ目の注釈のHTML",
"2つ目の注釈のHTML",
...
]
}
**ライセンス [#p1472648]
GPL v3
**改版履歴 [#h661aa51]
-バージョン1.0
--初版
-バージョン1.04
--タブのダブルクリックによる該当ページへの遷移機能を追加
-バージョン1.1
--エイリアス書式に合わせ、引数の順序を「ページ名>ラベル」...
--リロードしても元に戻らないよう、選択したタブをURLに保持...
--ページに含まれるJavaScript(script要素)をできるかぎり...
--ページ内容により正常に表示されない不具合を修正
-バージョン1.11
--リソースを常にGETメソッドで取得するよう修正
ページ名: