<?php
-/////////////////////////////////////////////////
-// PukiWiki - Yet another WikiWikiWeb clone.
-//
-// $Id: ref.inc.php,v 1.38 2004/09/01 13:15:16 henoheno Exp $
+// PukiWiki - Yet another WikiWikiWeb clone
+// $Id: ref.inc.php,v 1.51 2011/01/25 15:01:01 henoheno Exp $
+// Copyright (C)
+// 2002-2006 PukiWiki Developers Team
+// 2001-2002 Originally written by yu-ji
+// License: GPL v2 or (at your option) any later version
//
-
-// UPLOAD_DIR ¤Î¥Ç¡¼¥¿(²èÁü¥Õ¥¡¥¤¥ë¤Î¤ß)¤ËľÀÜ¥¢¥¯¥»¥¹¤µ¤»¤ë
-define('PLUGIN_REF_DIRECT_ACCESS', FALSE); // FALSE or TRUE
-// - ¤³¤ì¤Ï½¾Íè¤Î¥¤¥ó¥é¥¤¥ó¥¤¥á¡¼¥¸½èÍý¤ò¸ß´¹¤Î¤¿¤á¤Ë»Ä¤¹¤â¤Î¤Ç
-// ¤¢¤ê¡¢¹â®²½¤Î¤¿¤á¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó
-// - UPLOAD_DIR ¤òWeb¥µ¡¼¥Ð¡¼¾å¤ËϪ½Ð¤µ¤»¤Æ¤ª¤ê¡¢¤«¤ÄľÀÜ¥¢¥¯¥»¥¹
-// ¤Ç¤¤ë(¥¢¥¯¥»¥¹À©¸Â¤¬¤Ê¤¤)¾õÂ֤Ǥ¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹
-// - Apache ¤Ê¤É¤Ç¤Ï UPLOAD_DIR/.htaccess ¤òºï½ü¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹
-// - ¥Ö¥é¥¦¥¶¤Ë¤è¤Ã¤Æ¤Ï¥¤¥ó¥é¥¤¥ó¥¤¥á¡¼¥¸¤Îɽ¼¨¤ä¡¢¡Ö¥¤¥ó¥é¥¤¥ó
-// ¥¤¥á¡¼¥¸¤À¤±¤òɽ¼¨¡×¤µ¤»¤¿»þ¤Ê¤É¤ËÉÔ¶ñ¹ç¤¬½Ð¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹
-
-/*
-* ¥×¥é¥°¥¤¥ó ref
-- ¥Ú¡¼¥¸¤ËźÉÕ¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤òŸ³«¤¹¤ë
-- URL¤òŸ³«¤¹¤ë
-
-* Usage
- #ref(filename[,page][,parameters][,title])
-
-* ¥Ñ¥é¥á¡¼¥¿
-- filename -- źÉÕ¥Õ¥¡¥¤¥ë̾¡¢¤¢¤ë¤¤¤ÏURL
--- '¥Ú¡¼¥¸Ì¾/źÉÕ¥Õ¥¡¥¤¥ë̾'¤ò»ØÄꤹ¤ë¤È¡¢»ØÄꤷ¤¿¥Ú¡¼¥¸¤ÎźÉÕ¥Õ¥¡¥¤¥ë¤ò»²¾È¤¹¤ë
-- page -- ¥Õ¥¡¥¤¥ë¤òźÉÕ¤·¤¿¥Ú¡¼¥¸Ì¾(¾Êά²Ä)
-- Left|Center|Right -- ²£¤Î°ÌÃÖ¹ç¤ï¤»
-- Wrap|Nowrap -- ¥Æ¡¼¥Ö¥ë¥¿¥°¤Ç°Ï¤à/°Ï¤Þ¤Ê¤¤
-- Around -- ¥Æ¥¥¹¥È¤Î²ó¤ê¹þ¤ß
-- noicon -- ¥¢¥¤¥³¥ó¤òɽ¼¨¤·¤Ê¤¤
-- nolink -- ¸µ¥Õ¥¡¥¤¥ë¤Ø¤Î¥ê¥ó¥¯¤òÄ¥¤é¤Ê¤¤
-- noimg -- ²èÁü¤òŸ³«¤·¤Ê¤¤
-- zoom -- ½Ä²£Èæ¤òÊÝ»ý¤¹¤ë
-- 999x999 -- ¥µ¥¤¥º¤ò»ØÄê(Éýx¹â¤µ)
-- 999% -- ¥µ¥¤¥º¤ò»ØÄê(³ÈÂçΨ)
-- ¤½¤Î¾¤Îʸ»úÎó -- img¤Îalt/href¤Îtitle¤È¤·¤Æ»ÈÍÑ
-¥Ú¡¼¥¸Ì¾¤ä¥Ñ¥é¥á¡¼¥¿¤Ë¸«¤¨¤ëʸ»úÎó¤ò»ÈÍѤ¹¤ë¤È¤¤Ï¡¢#ref(hoge.png,,zoom)¤Î¤è¤¦¤Ë
-¥¿¥¤¥È¥ë¤ÎÁ°¤Ë¥«¥ó¥Þ¤ò;ʬ¤ËÆþ¤ì¤ë
-*/
-
-// Usage
-define('PLUGIN_REF_USAGE', "(attached-file-name[,page-name][,parameters][,title])");
-
-// Image suffixes
-define('PLUGIN_REF_IMAGE', '/\.(gif|png|jpe?g)$/i');
+// Image refernce plugin
+// Include an attached image-file as an inline-image
// File icon image
-if (! defined('FILE_ICON')) {
+if (! defined('FILE_ICON'))
define('FILE_ICON',
'<img src="' . IMAGE_DIR . 'file.png" width="20" height="20"' .
' alt="file" style="border-width:0px" />');
-}
-// Default alignment
-define('REF_DEFAULT_ALIGN', 'left'); // 'left', 'center', 'right'
+/////////////////////////////////////////////////
+// Default settings
+
+// Horizontal alignment
+define('PLUGIN_REF_DEFAULT_ALIGN', 'left'); // 'left', 'center', 'right'
+
+// Text wrapping
+define('PLUGIN_REF_WRAP_TABLE', FALSE); // TRUE, FALSE
+
+// URL指定時に画像サイズを取得するか
+define('PLUGIN_REF_URL_GET_IMAGE_SIZE', FALSE); // FALSE, TRUE
+
+// UPLOAD_DIR のデータ(画像ファイルのみ)に直接アクセスさせる
+define('PLUGIN_REF_DIRECT_ACCESS', FALSE); // FALSE or TRUE
+// - これは従来のインラインイメージ処理を互換のために残すもので
+// あり、高速化のためのオプションではありません
+// - UPLOAD_DIR をWebサーバー上に露出させており、かつ直接アクセス
+// できる(アクセス制限がない)状態である必要があります
+// - Apache などでは UPLOAD_DIR/.htaccess を削除する必要があります
+// - ブラウザによってはインラインイメージの表示や、「インライン
+// イメージだけを表示」させた時などに不具合が出る場合があります
+
+/////////////////////////////////////////////////
-// Force wrap on default
-define('REF_WRAP_TABLE', FALSE); // TRUE, FALSE
+// Image suffixes allowed
+define('PLUGIN_REF_IMAGE', '/\.(gif|png|jpe?g|swf)$/i');
-// URL»ØÄê»þ¤Ë²èÁü¥µ¥¤¥º¤ò¼èÆÀ¤¹¤ë¤«
-define('REF_URL_GETIMAGESIZE', FALSE);
+// Usage (a part of)
+define('PLUGIN_REF_USAGE', "([pagename/]attached-file-name[,parameters, ... ][,title])");
function plugin_ref_inline()
{
return "<p>#ref(): {$params['_error']}</p>\n";
}
- if ((REF_WRAP_TABLE && ! $params['nowrap']) || $params['wrap']) {
- // ÏȤÇÊñ¤à
+ if ((PLUGIN_REF_WRAP_TABLE && ! $params['nowrap']) || $params['wrap']) {
+ // 枠で包む
// margin:auto
- // Mozilla 1.x = x (wrap,around¤¬¸ú¤«¤Ê¤¤)
+ // Mozilla 1.x = x (wrap,aroundが効かない)
// Opera 6 = o
- // Netscape 6 = x (wrap,around¤¬¸ú¤«¤Ê¤¤)
- // IE 6 = x (wrap,around¤¬¸ú¤«¤Ê¤¤)
+ // Netscape 6 = x (wrap,aroundが効かない)
+ // IE 6 = x (wrap,aroundが効かない)
// margin:0px
- // Mozilla 1.x = x (wrap¤Ç´ó¤»¤¬¸ú¤«¤Ê¤¤)
- // Opera 6 = x (wrap¤Ç´ó¤»¤¬¸ú¤«¤Ê¤¤)
- // Netscape 6 = x (wrap¤Ç´ó¤»¤¬¸ú¤«¤Ê¤¤)
+ // Mozilla 1.x = x (wrapで寄せが効かない)
+ // Opera 6 = x (wrapで寄せが効かない)
+ // Netscape 6 = x (wrapで寄せが効かない)
// IE6 = o
$margin = ($params['around'] ? '0px' : 'auto');
$margin_align = ($params['_align'] == 'center') ? '' : ";margin-{$params['_align']}:0px";
$style = "text-align:{$params['_align']}";
}
- // div¤ÇÊñ¤à
+ // divで包む
return "<div class=\"img_margin\" style=\"$style\">{$params['_body']}</div>\n";
}
global $script, $vars;
global $WikiName, $BracketName; // compat
- // Ìá¤êÃÍ
+ // 戻り値
$params = array(
- 'left' => FALSE, // º¸´ó¤»
- 'center' => FALSE, // Ãæ±û´ó¤»
- 'right' => FALSE, // ±¦´ó¤»
- 'wrap' => FALSE, // TABLE¤Ç°Ï¤à
- 'nowrap' => FALSE, // TABLE¤Ç°Ï¤Þ¤Ê¤¤
- 'around' => FALSE, // ²ó¤ê¹þ¤ß
- 'noicon' => FALSE, // ¥¢¥¤¥³¥ó¤òɽ¼¨¤·¤Ê¤¤
- 'nolink' => FALSE, // ¸µ¥Õ¥¡¥¤¥ë¤Ø¤Î¥ê¥ó¥¯¤òÄ¥¤é¤Ê¤¤
- 'noimg' => FALSE, // ²èÁü¤òŸ³«¤·¤Ê¤¤
- 'zoom' => FALSE, // ½Ä²£Èæ¤òÊÝ»ý¤¹¤ë
- '_size' => FALSE, // ¥µ¥¤¥º»ØÄꤢ¤ê
- '_w' => 0, // Éý
- '_h' => 0, // ¹â¤µ
- '_%' => 0, // ³ÈÂçΨ
+ 'left' => FALSE, // 左寄せ
+ 'center' => FALSE, // 中央寄せ
+ 'right' => FALSE, // 右寄せ
+ 'wrap' => FALSE, // TABLEで囲む
+ 'nowrap' => FALSE, // TABLEで囲まない
+ 'around' => FALSE, // 回り込み
+ 'noicon' => FALSE, // アイコンを表示しない
+ 'nolink' => FALSE, // 元ファイルへのリンクを張らない
+ 'noimg' => FALSE, // 画像を展開しない
+ 'zoom' => FALSE, // 縦横比を保持する
+ '_size' => FALSE, // サイズ指定あり
+ '_w' => 0, // 幅
+ '_h' => 0, // 高さ
+ '_%' => 0, // 拡大率
'_args' => array(),
'_done' => FALSE,
'_error' => ''
);
- // źÉÕ¥Õ¥¡¥¤¥ë¤Î¤¢¤ë¥Ú¡¼¥¸: default¤Ï¸½ºß¤Î¥Ú¡¼¥¸Ì¾
+ // 添付ファイルのあるページ: defaultは現在のページ名
$page = isset($vars['page']) ? $vars['page'] : '';
- // źÉÕ¥Õ¥¡¥¤¥ë¤Î¥Õ¥¡¥¤¥ë̾
+ // 添付ファイルのファイル名
$name = '';
- // źÉÕ¥Õ¥¡¥¤¥ë¤Þ¤Ç¤Î¥Ñ¥¹¤ª¤è¤Ó(¼ÂºÝ¤Î)¥Õ¥¡¥¤¥ë̾
+ // 添付ファイルまでのパスおよび(実際の)ファイル名
$file = '';
- // Âè°ì°ú¿ô: "[¥Ú¡¼¥¸Ì¾¤ª¤è¤Ó/]źÉÕ¥Õ¥¡¥¤¥ë̾"¡¢¤¢¤ë¤¤¤Ï"URL"¤ò¼èÆÀ
+ // 第一引数: "[ページ名および/]添付ファイル名"、あるいは"URL"を取得
$name = array_shift($args);
$is_url = is_url($name);
if(! $is_url) {
- // źÉÕ¥Õ¥¡¥¤¥ë
+ // 添付ファイル
if (! is_dir(UPLOAD_DIR)) {
$params['_error'] = 'No UPLOAD_DIR';
return $params;
}
$matches = array();
- // ¥Õ¥¡¥¤¥ë̾¤Ë¥Ú¡¼¥¸Ì¾(¥Ú¡¼¥¸»²¾È¥Ñ¥¹)¤¬¹çÀ®¤µ¤ì¤Æ¤¤¤ë¤«
+ // ファイル名にページ名(ページ参照パス)が合成されているか
// (Page_name/maybe-separated-with/slashes/ATTACHED_FILENAME)
if (preg_match('#^(.+)/([^/]+)$#', $name, $matches)) {
if ($matches[1] == '.' || $matches[1] == '..') {
$file = UPLOAD_DIR . encode($page) . '_' . encode($name);
$is_file = is_file($file);
- // ÂèÆó°ú¿ô°Ê¹ß¤¬Â¸ºß¤·¡¢¤½¤ì¤Ïref¤Î¥ª¥×¥·¥ç¥ó̾¾Î¤Ê¤É¤È°ìÃפ·¤Ê¤¤
+ // 第二引数以降が存在し、それはrefのオプション名称などと一致しない
} else if (isset($args[0]) && $args[0] != '' && ! isset($params[$args[0]])) {
$e_name = encode($name);
// Promote new design
if ($is_file_default && $is_file_second) {
// Because of race condition NOW
- $params['_error'] = htmlspecialchars('The same file name "' .
+ $params['_error'] = htmlsc('The same file name "' .
$name . '" at both page: "' . $page . '" and "' . $_arg .
- '". Try ref(pagename/filname) to specify one of them');
+ '". Try ref(pagename/filename) to specify one of them');
} else {
// Because of possibility of race condition, in the future
$params['_error'] = 'The style ref(filename,pagename) is ambiguous ' .
'and become obsolete. ' .
- 'Please try ref(pagename/filname)';
+ 'Please try ref(pagename/filename)';
}
return $params;
}
$is_file = is_file($file);
}
if (! $is_file) {
- $params['_error'] = htmlspecialchars('File not found: "' .
+ $params['_error'] = htmlsc('File not found: "' .
$name . '" at page "' . $page . '"');
return $params;
}
}
- // »Ä¤ê¤Î°ú¿ô¤Î½èÍý
+ // 残りの引数の処理
if (! empty($args))
foreach ($args as $arg)
ref_check_arg($arg, $params);
/*
- $name¤ò¤â¤È¤Ë°Ê²¼¤ÎÊÑ¿ô¤òÀßÄê
+ $nameをもとに以下の変数を設定
$url,$url2 : URL
- $title :¥¿¥¤¥È¥ë
- $is_image : ²èÁü¤Î¤È¤TRUE
- $info : ²èÁü¥Õ¥¡¥¤¥ë¤Î¤È¤getimagesize()¤Î'size'
- ²èÁü¥Õ¥¡¥¤¥ë°Ê³°¤Î¥Õ¥¡¥¤¥ë¤Î¾ðÊó
- źÉÕ¥Õ¥¡¥¤¥ë¤Î¤È¤ : ¥Õ¥¡¥¤¥ë¤ÎºÇ½ª¹¹¿·Æü¤È¥µ¥¤¥º
- URL¤Î¤È¤ : URL¤½¤Î¤â¤Î
+ $title :タイトル
+ $is_image : 画像のときTRUE
+ $info : 画像ファイルのときgetimagesize()の'size'
+ 画像ファイル以外のファイルの情報
+ æ·»ä»\98ã\83\95ã\82¡ã\82¤ã\83«ã\81®ã\81¨ã\81\8d : ã\83\95ã\82¡ã\82¤ã\83«ã\81®æ\9c\80çµ\82æ\9b´æ\96°æ\97¥ã\81¨ã\82µã\82¤ã\82º
+ URLのとき : URLそのもの
*/
$title = $url = $url2 = $info = '';
$width = $height = 0;
$matches = array();
if ($is_url) { // URL
- $url = $url2 = htmlspecialchars($name);
- $title = htmlspecialchars(preg_match('/([^\/]+)$/', $name, $matches) ? $matches[1] : $url);
+ if (PKWK_DISABLE_INLINE_IMAGE_FROM_URI) {
+ //$params['_error'] = 'PKWK_DISABLE_INLINE_IMAGE_FROM_URI prohibits this';
+ //return $params;
+ $url = htmlsc($name);
+ $params['_body'] = '<a href="' . $url . '">' . $url . '</a>';
+ return $params;
+ }
+
+ $url = $url2 = htmlsc($name);
+ $title = htmlsc(preg_match('/([^\/]+)$/', $name, $matches) ? $matches[1] : $url);
$is_image = (! $params['noimg'] && preg_match(PLUGIN_REF_IMAGE, $name));
- if ($is_image && REF_URL_GETIMAGESIZE && (bool)ini_get('allow_url_fopen')) {
+ if ($is_image && PLUGIN_REF_URL_GET_IMAGE_SIZE && (bool)ini_get('allow_url_fopen')) {
$size = @getimagesize($name);
if (is_array($size)) {
$width = $size[0];
}
}
- } else { // źÉÕ¥Õ¥¡¥¤¥ë
+ } else { // 添付ファイル
- $title = htmlspecialchars($name);
+ $title = htmlsc($name);
$is_image = (! $params['noimg'] && preg_match(PLUGIN_REF_IMAGE, $name));
}
}
- // ³ÈÄ¥¥Ñ¥é¥á¡¼¥¿¤ò¥Á¥§¥Ã¥¯
+ // æ\8b¡å¼µã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\82\92ã\83\81ã\82§ã\83\83ã\82¯
if (! empty($params['_args'])) {
$_title = array();
foreach ($params['_args'] as $arg) {
}
if (! empty($_title)) {
- $title = htmlspecialchars(join(',', $_title));
+ $title = htmlsc(join(',', $_title));
if ($is_image) $title = make_line_rules($title);
}
}
- // ²èÁü¥µ¥¤¥ºÄ´À°
+ // 画像サイズ調整
if ($is_image) {
- // »ØÄꤵ¤ì¤¿¥µ¥¤¥º¤ò»ÈÍѤ¹¤ë
+ // 指定されたサイズを使用する
if ($params['_size']) {
if ($width == 0 && $height == 0) {
$width = $params['_w'];
if ($width && $height) $info = "width=\"$width\" height=\"$height\" ";
}
- // ¥¢¥é¥¤¥ó¥á¥ó¥ÈȽÄê
- $params['_align'] = REF_DEFAULT_ALIGN;
+ // アラインメント判定
+ $params['_align'] = PLUGIN_REF_DEFAULT_ALIGN;
foreach (array('right', 'left', 'center') as $align) {
if ($params[$align]) {
$params['_align'] = $align;
}
}
- if ($is_image) { // ²èÁü
+ if ($is_image) { // 画像
$params['_body'] = "<img src=\"$url\" alt=\"$title\" title=\"$title\" $info/>";
if (! $params['nolink'] && $url2)
$params['_body'] = "<a href=\"$url2\" title=\"$title\">{$params['_body']}</a>";
return $params;
}
-// ¥ª¥×¥·¥ç¥ó¤ò²òÀϤ¹¤ë
+// オプションを解析する
function ref_check_arg($val, & $params)
{
if ($val == '') {
if (! isset($vars['page']) || ! isset($vars['src']))
return array('msg'=>'Invalid argument', 'body'=>$usage);
- $page = $vars['page'];
- $file = $vars['src'];
+ $page = $vars['page'];
+ $filename = $vars['src'] ;
- $ref = UPLOAD_DIR . encode($page) . '_' . encode(basename($file));
+ $ref = UPLOAD_DIR . encode($page) . '_' . encode(preg_replace('#^.*/#', '', $filename));
if(! file_exists($ref))
return array('msg'=>'Attach file not found', 'body'=>$usage);
+ $is_image = preg_match(PLUGIN_REF_IMAGE, $filename);
+ if (!$is_image) {
+ return array('msg'=>'Seems not an image', 'body'=>$usage);
+ }
$got = @getimagesize($ref);
if (! isset($got[2])) $got[2] = FALSE;
switch ($got[2]) {
return array('msg'=>'Seems not an image', 'body'=>$usage);
}
- // Output
- $file = htmlspecialchars($file);
+ // Care for Japanese-character-included file name
+ $legacy_filename = mb_convert_encoding($filename, 'UTF-8', SOURCE_ENCODING);
+ if (LANG == 'ja') {
+ switch(UA_NAME . '/' . UA_PROFILE){
+ case 'MSIE/default':
+ $legacy_filename = mb_convert_encoding($filename, 'SJIS', SOURCE_ENCODING);
+ break;
+ }
+ }
+ $utf8filename = mb_convert_encoding($filename, 'UTF-8', SOURCE_ENCODING);
$size = filesize($ref);
- header('Content-Disposition: inline; filename="' . $file . '"');
+
+ // Output
+ pkwk_common_headers();
+ header('Content-Disposition: inline; filename="' . $legacy_filename
+ .'"; filename*=utf-8\'\'' . rawurlencode($utf8filename));
header('Content-Length: ' . $size);
header('Content-Type: ' . $type);
@readfile($ref);
-
exit;
}
-?>