Своеобразная ошибка поиска в DokuWiki - PullRequest
2 голосов
/ 13 апреля 2011

Перекрестная публикация на форумах DokuWiki :

Итак, я вносил некоторые изменения, чтобы учесть три вещи: использование заглавных букв в именах страниц, естественная сортировка в боковой панели.ToC и поиск без учета регистра.

Имейте в виду, потому что я знаю, что это похоже на ошибку прав доступа к файлу.Я не верю, что это так.

При поиске «nul» и любых его изменений (nUl, Nul, nuL и т. Д.) Я получаю следующее сообщение об ошибке:

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 365

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 366

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 367

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 368

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 369

Warning: filesize() [function.filesize]: stat failed for C:/Websites/dokuwiki/data/meta/nul.changes in C:\Websites\dokuwiki\inc\changelog.php on line 305

Страницы с именем "nul" не было и никогда не было.Когда поиск завершен, он добавляет новую строку в \ dokuwiki \ data \ index \ page.idx с тем же содержимым, что я искал (nul, NuL, nUl и т. Д. И т. Д.).Как только эта строка добавлена ​​в page.idx, любой поиск букв «n», «u» или «l» также приведет к ошибке:

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 365

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 366

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 367

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 368

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 369

Warning: filectime() [function.filectime]: stat failed for C:/Websites/dokuwiki/data/pages/nul.txt in C:\Websites\dokuwiki\inc\parser\metadata.php on line 46

Warning: filemtime() [function.filemtime]: stat failed for C:/Websites/dokuwiki/data/pages/nul.txt in C:\Websites\dokuwiki\inc\parser\metadata.php on line 72

Еще раз, страница «nul»никогда не существовал в вики и записывается в page.idx после поиска.

Вот изменения, которые я сделал для достижения трех вещей, которые я отметил в начале своего поста:

/inc/fulltext.php, строки 255 и 263: я заменил «strpos» на «stripos».

if ($id !== '' && $cleaned !== '') {
        foreach ($pages as $p_id => $p_title) {
            if ((stripos($in_ns ? $p_id : noNSorNS($p_id), $cleaned) === false) &&
                (!$in_title || (stripos($p_title, $id) === false)) ) {
                unset($pages[$p_id]);
            }
        }
    }
    if (isset($ns)) {
        foreach (array_keys($pages) as $p_id) {
            if (stripos($p_id, $ns) !== 0) {
                unset($pages[$p_id]);
            }
        }
    }

/ inc / pageutils.php, строка 114 удалена:

//$id = utf8_strtolower($id);

/ inc / search.php, строки 40 и 41: я заменил «sort» на «natcasesort»

natcasesort($files);
natcasesort($dirs);

Насколько я могу судить, все эти незначительные изменения, и я ничего не вижуСразу видно, что это станет причиной этой проблемы.

Есть идеи?

Обновление -

Я отменил все свои изменения и ошибка повторяется.

Затем я установил новую DokuWiki (выпуск 2010-11-07a "Anteater") в совершенно отдельный каталог, ошибка не исчезла.

Затем я установил ночной снимок с splitbrain.org,и ошибка сохраняется.

У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 14 апреля 2011

Оказывается, что это ошибка Windows, связанная с зарезервированным NUL.Согласно предложению Чарльза, я опубликую ответ здесь, а также в сообщении на форуме, указанном в моем исходном комментарии.Я чувствую, что это грязное решение, но мне нужно, чтобы оно заработало.Я просто переписываю слово «nul» в символы ASCII, а затем перевожу его обратно для отображения на странице и в заголовке:

\ inc \ pageutils.php, строка 137 (ish):

if(strtolower($id) == 'nul') {
    for($i=0;$i != strlen($id);$i++) {
        $stupidWindowsFix .= "&#".ord($id[$i]).";";
    }
    $id = $stupidWindowsFix;
}

\ inc \ template.php, строка 876:

$name = html_entity_decode($id);
...