исходник файла xlpage-windows-1251.php для PmWiki
Выкладываю исходник написанного мной файла xlpage-windows-1251.php для адаптации движка PmWiki под кодировку windows-1251. Наконец-то он у меня стабилизировался, я реализовал в нём всё, что мне было нужно. По хорошему надо бы послать на сайт pmwiki.org, но лень писать по-английски (активный английский у меня никакой), да и вообще посылать лень. Поэтому выкладываю здесь, может, какой-нибудь такой же страдалец, как и я, нагуглит, и будет ему счастье :)
scripts/xlpage-windows-1251.php:
<?php if (!defined('PmWiki')) exit();
/* Этот файл предназначен для использования в PmWiki кодировки windows-1251.
Также производится кодирование уголковых кавычек в url.
*/
global $HTTPHeaders, $PageNameChars, $MakePageNamePatterns;
global $pagename, $KeepToken, $Charset;
$Charset='windows-1251';
$HTTPHeaders[] = "Content-type: text/html; charset=windows-1251;";
//преобразование из названия статьи в имя файла статьи
$MakePageNamePatterns = array(
"/'/" => '', // убрать апострофы
'/\\"|\\"|\\«|\\»|«|»/'
=> '_', // все виды кавычек — в подчёркивание
"/[^{$PageNameChars}_]+/" => ' ', // всё, что не для url — в пробел
"/((^|\s|_)[a-zа-яё])/e" =>
"mb_strtoupper('$1','$Charset')", // заглавные буквы в начале и после пробелов
"/ /" => '' // убрать пробелы
);
$KeepToken = "\263\263\263";
//берём url, переданный браузером серверу
$pagename = $_REQUEST['n'];
if (!$pagename) $pagename = @$_GET['pagename'];
if ($pagename=='' && $EnablePathInfo)
$pagename = @substr($_SERVER['PATH_INFO'],1);
if (!$pagename &&
preg_match('!^'.preg_quote($_SERVER['SCRIPT_NAME'],'!').'/?([^?]*)!',
$_SERVER['REQUEST_URI'],$match))
$pagename = urldecode($match[1]);
$pagename = preg_replace('!/+$!','',$pagename);
//преобразование из url, данного браузером серверу, в имя файла статьи
$pagename = fromUTF8($pagename);
$_REQUEST['q'] = fromUTF8($_REQUEST['q']);
//кавычки — в подчёркивание
$pagename = preg_replace('/\\«/','_',$pagename);
$pagename = preg_replace('/\\»/','_',$pagename);
$pagename = preg_replace('/\\"/','_',$pagename);
//заглавные буквы
$pagename = preg_replace("/((^|\s|_)[a-zа-яё])/e",
"mb_strtoupper('$1','$Charset')",$pagename);
$pagename = preg_replace("/ /",'',$pagename); //убрать пробелы
//преобразование из utf-8 в windows-1251, если нужно
function fromUTF8($s) {
global $Charset;
$t = iconv('UTF-8',$Charset,$s);
if ($s==iconv($Charset,'UTF-8',$t))
return $t;
else
return $s;
}
//преобразование имени файла статьи в url
function xPUE($x) {
global $Charset;
$x = preg_replace('/_([^_]+)_/','«$1»',$x);
return preg_replace('/[\\x80-\\xff \'"<>]/e', "'%'.dechex(ord('$0'))",
iconv($Charset,'UTF-8',$x));
}
$FmtPV['$PageUrl'] =
'xPUE(($EnablePathInfo)
? "$ScriptUrl/$group/$name"
: "$ScriptUrl?n=$group.$name")';
$FmtPV['$RequestedPage'] =
'htmlspecialchars($pagename, ENT_QUOTES)';
//преобразование имени файла статьи в название с пробелами
function xAsSpaced($text) {
global $Charset;
$text = preg_replace("/([а-яёa-z\\d])([А-ЯЁA-Z])/", '$1 $2',$text);
$text = preg_replace('/([^-\\d])(\\d[-\\d]*( |$))/','$1 $2',$text);
$text = preg_replace("/([А-ЯЁA-Z])([А-ЯЁA-Z][а-яёa-z\\d])/",'$1 $2',$text);
$text = preg_replace('/_([^_]+)_/','«$1»',$text);
$text = preg_replace('/([а-яёa-zА-ЯЁA-Z\\d])«/','$1 «',$text);
$text = preg_replace('/»([а-яёa-zА-ЯЁA-Z\\d])/','» $1',$text);
$text = preg_replace("/ ([А-ЯЁA-Z])/e","' '.mb_strtolower('$1','$Charset')",$text);
return $text;
}
$AsSpacedFunction = 'xAsSpaced';