User:
Pass:
Keep:   
Xoops Cube Project
XOOPS Cube Project Site
Powered by Google


Powered by XOOPS Cube Legacy 2.1.8
PukiWikiMod 1.5.1
WordPress Module 0.6.0 Alpha
XOOPS/Hack/EMLH拡張 のバックアップ(No.4)
[ リロード ]   [ ソース ]  [ トップ | 一覧 | 単語検索 | 最新 | バックアップ | ヘルプ ]


flagflag

The Easiest Multi-Language Hack (EMLH) の拡張

XOOPSの多言語対応Hackは幾つかあるが、GIJOEさんのお手軽多言語ハックは、ほんとにお手軽で、Marcan版のHackのようにXOOPSのモジュールにまで修正を行わなくとも良いので、とても便利なHackです。
ただそのままだとコンテンツだけが多言語の対象で、Marcan版のようにメインメニューやXOOPSのLanguageファイルの内容は反映され無いため、少々多言語対応としては物足りなさを感じる事もあります。
そこで、Marcan版の一部を転用してLanguageファイル切替にもとりあえず対応できるようにしてみました。
GIJOE版のEMLHをセットアップ後、添付のfilecommon.php を include/common.phpと入れ替えるだけでOKなはずです。
但し、easiestml.php内の

// list the language names separated with comma
define('EASIESTML_LANGNAMES','english,japanese');

の部分が、きっちりとXOOPSのLanguageと対応するように定義されている必要があります。

添付のcommon.phpは、XOOPS2.0.9.3にGIJOE版AutoLogin Hack適用後のものを修正しています。

現在判明しているEMLHの不具合とその対処

PukiWikiModとの相性

小生が多用しているPukiWikiModでは、幾つかの点でEMLHとの共存で問題がある。

1.easiestml_langパラメータの扱い

PukiWikiModは、PukiWikiの「?ページ名」というパラメータに対応するために、$_GETパラメータでなく、$_SERVER['QUERY_STRING']を解釈する。EMLHのeasiestml_langパラメータが負荷された時点で、このパラメータをページ名と誤解してしまうため、うまく動作しない。これについては上記common.phpのHackにて受け取ったeasiestml_langを消し去る事でPukiWikiをだませるように対応済みである。

2.静的URLモードでのeasiestml_langパラメータの受け渡し

PukiWikiModで静的URLモードを使用する場合に、.htaccessでのRewrite定義が、他のパラメータを受けわたすように出来ていないので、/modules/pukiwiki/123.html?easiestml_lang=xlang:jaなどというURLをうまく処理できない。
これについては、.htaccessの定義を以下に変更する事によってうまくいきそうだ。

# 静的ページ風URLオプションを使用する場合は
# 以下を環境に応じて修正後 # を削除して有効にしてください。
RewriteEngine	on
RewriteRule ^([0-9]*)\.html(#[^\?]*)?(\?(.*))?$ /modules/pukiwiki/index.php?pgid=$1&$4$2  [QSA]
4.<head>内のヘッダのdescriptionメタタグの扱い

PukiWikiModでは、コンテンツの内容をstrip_tagsしたものの部分文字列をdescriptionメタタグにセットしているが、この部分に[mlimg]や[xlang:ja]などがそのままわたされ、EMLH側で処理を行うようになってしまう。
この場合、[mlimg]の処理では予期せぬHTMLタグが挿入されるし、[xlang:ja]・・・[/xlang:ja]の部分も、部分文字列を抽出されてタグが対応しない状態でdescriptionメタタグにセットされる場合もあり、予期せぬ動作をしてしまう。
[mlimg]に関しては、同等の機能を持つインラインプラグインfilemlimg.inc.phpを用意する事で回避できるが、タグの不整合に関しては、/modules/pukiwiki/pukiwiki.php内の修正が必要となる。
とりあえず現在は、

// desciption
$xoopsTpl->assign("xoops_meta_description",mb_strcut(preg_replace("/\s+/","",strip_tags($body)),0,200));

という部分を

// desciption
$t_body=$body;
if (defined('EASIESTML_LANGS')) {
   $lang_tags=explode(',',EASIESTML_LANGS);
   foreach($lang_tags as $lang_tag) {
      $t_body= preg_replace('/\[\/?'.preg_quote($lang_tag).'\]/','',$t_body);
   }
}
$xoopsTpl->assign("xoops_meta_description",mb_strcut(preg_replace("/\s+/","",strip_tags($t_body)),0,200));

に修正しを行った。

5.PukiWikiModブロックのキャッシング

PukiWikiModでは、ページをXOOPSブロックとして利用できるが、この部分ではサーバー側で別途対象ページを特別なパラメータ付きでHTTPリクエストを行い取得した内容をキャッシュファイルに格納して表示するようになっている。
このページリクエスト時に、現在はサーバ側では表示言語を意識していないためデフォルトの言語しかブロックには表示できない。
そこで、ブロック表示部分を修正して現在の表示言語によってサーバ側でのブロックページリクエスト時にも言語指定を行うようにして、さらに言語毎にキャッシュを持つようにした。
修正後の、/modules/pukiwiki/blocks/pukiwiki_page.phpは、

<?php
// $Id: pukiwiki_page.php,v 1.11 2004/12/16 13:15:20 nao-pon Exp $
function b_pukiwiki_page_show($options)
{
	global $xoopsConfig;
	$show_page = ($options[0])? $options[0] : "";
	$cache_time = (empty($options[1]))? 0 : $options[1];
	$cache_time = (int)$cache_time * 60;
	$cache_no = (empty($options[2]))? "0" : $options[2];
	if (!empty($_COOKIE['easiestml_langname'])) {
		$lang_cache='.'.$_COOKIE['easiestml_langname'];
	}
	$cache_file = XOOPS_ROOT_PATH."/modules/pukiwiki/cache/p/xoops_block_{$cache_no}{$lang_cache}.dat";

	$wiki_url = XOOPS_URL.'/modules/pukiwiki/';
	if (file_exists($cache_file) && filemtime($cache_file) > time() - $cache_time)
	{
		$data = join('',@file($cache_file));
	}
	else
	{
		$error_str = $data = "";
		if ($show_page)
		{
			if (!empty($_COOKIE['easiestml_lang'])) {
				$lang_para='&easiestml_lang='.$_COOKIE['easiestml_lang'];
			}
			$url = $wiki_url.'index.php?xoops_block=1&cmd=read&page='.rawurlencode($show_page).$lang_para;
			include_once(XOOPS_ROOT_PATH."/class/snoopy.php");
			$snoopy = new Snoopy;
			$snoopy->fetch($url);

			if (isset($snoopy->error) && !empty($snoopy->error))
				$data = $error_str = $snoopy->error;
			else
				$data = $snoopy->results;

		}
		// Fatal, Parseエラーが出た場合
		if (preg_match("#<b>(Fatal|Parse) error</b>:#",$data))
			$data = "";

		if ($data != $error_str)
		{
			//マルチドメイン対応
			$data = preg_replace("/(<[^>]+(href|action|src)=(\"|'))https?:\/\/".$_SERVER["HTTP_HOST"]."(:[\d]+)?/i","$1",$data);

			// SID 自動付加環境 は SID を削除
			if (ini_get("session.use_trans_sid"))
			{
				$data = preg_replace("/(&|\?)?".preg_quote(ini_get("session.name"),"/")."=[0-9a-f]{32}/","",$data);
			}

			if ($fp = fopen($cache_file,"wb"))
			{
				fputs($fp,$data);
				fclose($fp);
			}
		}
	}

	if (strpos($data,"nobunobu") !== FALSE)
	{
		global $xoopsUser,$xoopsModule,$xoopsConfig;
		$uname = ($xoopsUser)? $xoopsUser->uname() : $xoopsConfig['anonymous'];
		//名前欄置換
		$data = str_replace("nobunobu",$uname,$data);
	}

	// 外部リンクマーク用 class設定
	$data = preg_replace("/(<a[^>]+?)(href=(\"|')?(?!https?:\/\/".$_SERVER["HTTP_HOST"].")http)/","$1class=\"ext\" $2",$data);

	// CSS Link を発行
	$css_url = (file_exists(XOOPS_THEME_PATH.'/'.$xoopsConfig['theme_set'].'/pukiwiki.css'))?
		XOOPS_THEME_URL.'/'.$xoopsConfig['theme_set'].'/pukiwiki.css'
		:
		$wiki_url.'skin/default.ja.css';
	$css_tag = '<link rel="stylesheet" href="'.$css_url.'" type="text/css" media="screen" charset="shift_jis" />';
	// 管理画面の CSS
	if(file_exists( XOOPS_ROOT_PATH."/modules/pukiwiki/cache/css.css"))
	{
		$css_tag .= "\n".'<link rel="stylesheet" href="'.$wiki_url.'cache/css.css" type="text/css" media="screen" charset="shift_jis" />'."\n";
	}
	// ページ用の .css
	$css_tag .= b_pukiwiki_page_get_page_css_tag($show_page,$wiki_url);

	// ヘッダ情報付加
	global $xoopsTpl;
	if ($xoopsTpl)
	{
		$xoopsTpl->assign('xoops_block_header',$xoopsTpl->get_template_vars('xoops_block_header').$css_tag);
	}
	else
	{
		$data = $css_tag."\n".$data;
	}

	$block['title'] = "PukiWiki - {$show_page}";
	$block['content'] = $data;

	return $block;
}
function b_pukiwiki_page_edit($options)
{
	$form = "";
	$form .= "PukiWiki Page Name: ";
	$form .= "<input type='text' name='options[]' value='".$options[0]."' /><br />";
	$form .= "Block cache: ";
	$form .= "<input type='text' name='options[]' value='".$options[1]."' />(min)<br />";
	$form .= "Cache file number: ";
	$form .= "<input type='text' name='options[]' value='".$options[2]."' />";
	return $form;
}

// ページ名のエンコード
function b_pukiwiki_page_encode($key)
{
	$enkey = '';
	$arych = preg_split("//", $key, -1, PREG_SPLIT_NO_EMPTY);

	foreach($arych as $ch)
	{
		$enkey .= sprintf("%02X", ord($ch));
	}

	return $enkey;
}

// [[ ]] を取り除く
function b_pukiwiki_page_strip_bracket($str)
{
	if(preg_match("/^\[\[(.*)\]\]$/",$str,$match))
	{
		$str = $match[1];
	}
	return $str;
}

// ページ専用CSSタグを得る
function b_pukiwiki_page_get_page_css_tag($page,$wiki_url)
{
	$page = b_pukiwiki_page_strip_bracket($page);
	$ret = '';
	$_page = '';
	$dir = XOOPS_ROOT_PATH."/modules/pukiwiki/cache/";
	foreach(explode('/',$page) as $val)
	{
		$_page = ($_page)? $_page."/".$val : $val;
		$_pagecss_file = b_pukiwiki_page_encode($_page).".css";
		if(file_exists($dir.$_pagecss_file))
		{
			$ret .= '<link rel="stylesheet" href="'.$wiki_url.'cache/'.$_pagecss_file.'" type="text/css" media="screen" charset="shift_jis" />'."\n";
		}
	}
	return $ret;
}
となる。


お名前: