Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет yury_finkel ([info]yury_finkel)
@ 2011-06-23 20:16:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:php, pmwiki, wiki, windows-1251, программазм, технические детали

исходник файла 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';





(Добавить комментарий)


[info]oulenspiegel@lj
2011-06-23 12:19 (ссылка)
А чем плох UTF-8, кстати?

(Ответить) (Ветвь дискуссии)


[info]yury_finkel@lj
2011-06-23 12:25 (ссылка)
Тем, что движок PmWiki в этом самом UTF-8 пишет ещё и имена файлов статей (статьи в этом движке хранятся в виде файлов). И вот именами файлов в UTF-8 (не в юникоде, не в UTF-16, а именно в UTF-8) у меня возникла куча проблем. Хотя на юниксовском сервере движок работал нормально, но на моей домашней машине под виндой я не смог создать эквивалентную рабочую копию. Винда UTF-8 в именах файлов не переваривает. А мне надо обязательно иметь рабочую копию на домашнем компе для экспериментов.

(Ответить) (Уровень выше)


[info]yury_finkel@lj
2011-06-23 12:27 (ссылка)
Кроме того, там ещё проблемы с регистронезависимым поиском в русском тексте, кажется (как написано в доках).

(Ответить) (Уровень выше)