Mediawiki: визуализировать текст вики вне базы данных как HTML в PHP? - PullRequest
1 голос
/ 15 июля 2011

Ситуация такова, что у меня есть частная вики, скажем, на http://mysite.com/wiki,, которая за паролем.То, что я хотел бы сделать, - это иметь отдельное местоположение на том же сервере, которое могло бы читать произвольные текстовые файлы с текстом (кодом) вики и использовать определенный механизм http://mysite.com/wiki дляотрисовывать HTML из него (из-за установленных шаблонов / плагинов).

В качестве примера у меня будет каталог / tmppub на http://mysite.com;, и в нем будет текстовый файл с исходным кодом вики-текста, например Example.wiki, и процесс.php страница;тогда я бы позвонил:

http://mysite.com/tmppub/process.php?file=Example.wiki

... где process.php прочитал бы файл Example.wiki в том же каталоге, каким-то образом передал бы содержимое в установку ../wiki и получил бы HTMLвывод и отображение.

Полагаю, то, что я хочу, похоже на пример в Mediawiki2HTML - gwtwiki - Как преобразовать текст Mediawiki в HTML - Java Wikipedia API (механизм Bliki) - за исключением того, что Mediawiki2HTML находится в Java(Я бы хотел PHP) и, возможно, использовал бы внутренний движок рендеринга (я бы хотел уже существующую конкретную установку Mediawiki).

Дело в том, что я могу приготовить мне PHP-скрипт, который будет читать файл, обрабатывать пароль / wiki и передавать переменные GET и POST - за исключением того, что я не уверен, как мне поступить с Mediawiki.установка:

  • Я мог бы попытаться подделать звонок на &action=edit (например, Редактирование Википедии: Песочница ) и запросить предварительный просмотр;но это вернуло бы кнопки редактирования и текстовые поля, которые мне пришлось бы чистить вручную - не так, как
  • Я мог бы попытаться обратиться к API, но, как я вижу в API: Парсинг викитекста -MediaWiki , он будет работать только со страницами, уже находящимися в установке Mediawiki, а не со страницами без него.

Наконец, я хотел бы получить только необработанный HTML-контент (без HTML для боковых панелей и т. Д.), Как при использовании параметра действия render (* 1036)* пример ).

Кто-нибудь делает, если такое приложение PHP уже доступно - и если нет, то каким будет правильный способ обратиться к установке Mediawiki, чтобы получить «сырой» HTML-рендерингисточник текста вики?

Заранее спасибо за любые ответы,
Ура!

Ответы [ 3 ]

2 голосов
/ 16 июля 2011

Вы можете использовать API даже для анализа пользовательского викитекста с помощью действия parse.(Параметр title, возможно, немного вводит в заблуждение, но на самом деле это просто указатель для анализатора при использовании, например, {{PAGENAME}}.) Для анализа существующей страницы используется действие render.

Если аутентификация основана на HTTP, и у вас есть доступ к установке MediaWiki, вы можете использовать код, который используется для сценариев обслуживания, чтобы загрузить важные вещи и проанализировать их.(Хотя это может быть немного грязно.) Следующий код взят из includes/api/ApiParse.php и немного отредактирован (конечно, отрегулируйте путь к файлу в соответствии с вашими потребностями):

require_once dirname( __FILE__ ) . '/w/maintenance/commandLine.inc';

$text = "* [[foo]]\n* [[Example|bar]]\n* [http://example.com/ an outside link]";
$titleObj = Title::newFromText( 'Example' );
$parserOptions = new ParserOptions();
$parserOptions->setTidy( true );

$parserOutput = $wgParser->parse( $text, $titleObj, $parserOptions );
$parsedText = $parserOutput->getText();

Анализируемый HTMLтеперь в переменной $parsedText.Если вам нужно выполнить предварительное преобразование текста (разверните {{subst:}} s, тильды в подписи и т. Д.), Посмотрите файл ApiParse.php для справки.

0 голосов
/ 17 июля 2011

Спасибо @ Matěj Grabovský за ответ ;тем не менее, я отключил пару раз, пока заставлял его работать, поэтому вот запись.

Прежде всего, я просто сохранил код из ответа как mwparse.php и попытался вызвать его извеб-браузер - ответ: « Этот скрипт должен запускаться из командной строки ».Ах, хорошо :) Оказывается, это требование для использования commandLine.inc.

Итак, я вхожу в оболочку сервера и пытаюсь выполнить из CLI, и я получаю:

$ cd /path/to/mwparse/
$ php -f mwparse.php
...
Exception caught inside exception handler: exception 'DBQueryError' with message 'A database error has occurred
Query: SELECT /* MessageCache::loadFromDB 127.0.0.1 * /  page_title  FROM MWPREFIX_page  WHERE page_is_redirect = '0' AND page_namespace = '8' AND (page_title not like '%%/%%') AND (page_len > 10000)
Function: doQuery
Error: HY000 no such table: MWPREFIX_page
' in /path/to/MyWiki/includes/db/Database.php:606
Stack trace:
....

... что является bullcrap, поскольку установка MyWiki работает при вызове из браузера - и я также открыл базу данных в sqlitebrowser, чтобы подтвердить, что таблица MWPREFIX_page действительно существует.(что упоминается в /w в ответе Матея здесь я звоню /MyWiki)

Итак, после попытки установить xdebug и отладить скрипт с помощью этого (который не работалс Mediawiki для меня, по-видимому, потому что память продолжала истощаться), я просто попытался выполнить эту команду:

php -r "require_once dirname( __FILE__ ) . 'PREFIX/maintenance/commandLine.inc';"

... в разных каталогах, с соответствующими PREFIX.Оказывается, только возможно выполнить эту строку в корневой установке Mediawiki - то есть, в данном случае, в папке MyWiki:

$ cd /path/to/MyWiki
$ php -r "require_once dirname( __FILE__ ) . '/maintenance/commandLine.inc';"
$

Зная это, яизменен скрипт Матей на:

<?
//~ error_reporting(E_ALL);
//~ ini_set('display_errors', '1');

chdir('../MyWiki);
//echo getcwd() . "\n"; // for debug check

require_once './maintenance/commandLine.inc';

$text = "* [[foo]]\n* [[Example|bar]]\n* [http://example.com/ an outside link]";

$titleObj = Title::newFromText( 'Example' );
$parserOptions = new ParserOptions();
$parserOptions->setTidy( true );

$parserOutput = $wgParser->parse( $text, $titleObj, $parserOptions );
$parsedText = $parserOutput->getText();

echo $parsedText;
?>

Теперь я могу запустить скрипт из его собственной директории;однако следующее:

PHP Notice:  Undefined index: SERVER_NAME in /path/to/MyWiki/includes/Linker.php on line 888
Notice: Undefined index: SERVER_NAME in /path/to/MyWiki/includes/Linker.php on line 888

... можно увидеть в выходных данных.Notice - если error_reporting включено - PHP Notice на самом деле в stderr.Таким образом, чтобы получить только вывод из скрипта, в каталоге скрипта я бы назвал:

php -f mwparse.php 2>/dev/null

Чтобы получить это в сети, теперь мне просто нужно написать страницу PHP, которая вызывает этот скрипт в CLI(возможно, с использованием exec ), что не должно быть проблемой ( за исключением того, что require_once ... commandLine.inc занимает несколько секунд, так что это будет некоторый удар по производительности ).

Хорошо, рад видеть, что это решено - еще раз спасибо,
Приветствия!

PS: Поскольку я потратил довольно много времени на это, я будувыгрузка некоторого количества записей из командной строки (в основном связанных с установкой xdebug) ниже.

from web: This script must be run from the command line

from remote terminal:

Exception caught inside exception handler: exception 'DBQueryError' with message 'A database error has occurred
Query: SELECT /* MessageCache::loadFromDB 127.0.0.1 * /  page_title  FROM MWPREFIX_page  WHERE page_is_redirect = '0' AND page_namespace = '8' AND (page_title not like '%%/%%') AND (page_len > 10000)
Function: doQuery
Error: HY000 no such table: MWPREFIX_page
' in /path/to/MyWiki/includes/db/Database.php:606
Stack trace:
....

PHP Deprecated:  Comments starting with '#' are deprecated in /etc/php5/cli/conf.d/mcrypt.ini on line 1 in Unknown on line 0
sdf

MediaWiki internal error.

Original exception: exception 'DBQueryError' with message 'A database error has occurred
Query: SELECT /* MediaWikiBagOStuff::_doquery 127.0.0.1 * / value,exptime FROM PREFIX_objectcache WHERE keyname='wikidb-MWPREFIX_:messages:en'
Function: doQuery
Error: HY000 no such table: MWPREFIX_objectcache
' in /path/to/MyWiki/includes/db/Database.php:606

http://www.apaddedcell.com/easy-php-debugging-ubuntu-using-xdebug-and-vim
/1257582/kak-ya-mogu-otladit-skript-php-cli-s-pomoschy-xdebug

sudo apt-get install php-pear # pecl
sudo pecl install xdebug-beta # sh: phpize: not found
sudo apt-get install php5-dev # phpize; The following extra packages will be installed:   autoconf automake autotools-dev binutils gcc gcc-4.4 libc-dev-bin libc6-dev   libltdl-dev libssl-dev libtool linux-libc-dev m4 manpages-dev shtool   zlib1g-dev
sudo pecl install xdebug-beta # Installing '/usr/lib/php5/20090626+lfs/xdebug.so'

sudo nano /etc/php5/apache2/php.ini # zend_extension=/usr/lib/php5/20090626+lfs/xdebug.so and paste

sudo service apache2 restart # sudo /etc/init.d/apache2 restart

wget http://xdebug.org/files/xdebug-2.1.1.tgz # for debugclient
tar xzvf xdebug-2.1.1.tgz
rm package*.xml

cd xdebug-2.1.1/
$ cd debugclient
$ ./configure --with-libedit # configure: error: "libedit was not found on your system."
sudo apt-get install libedit2 # libedit2 is already the newest version.
sudo apt-get install libedit-dev # The following extra packages will be installed:   libbsd-dev libncurses5-dev
$ ./configure --with-libedit
$ make
# make install
./debugclient # Waiting for debug server to connect.

# open another remote terminal
export XDEBUG_CONFIG="idekey=session_name"
php mwparse.php
# flies by

# mediawiki started crashing upon adding ?XDEBUG_SESSION_START=1 to url, restart server

# now different errors:
# Deprecated: Call-time pass-by-reference has been deprecated in /path/to/MyWiki/includes/Article.php on line 1658 (http://www.emmajane.net/php-what-call-time-pass-reference-story)
# Notice: Undefined variable: wgBibPath in /path/to/MyWiki/extensions/Bibwiki/Bibwiki.i18n.php on line 116
# Fatal error: Allowed memory size of 20971520 bytes exhausted (tried to allocate 16 bytes) in /path/to/MyWiki/includes/GlobalFunctions.php on line 337

http://www.mediawiki.org/wiki/Manual:Errors_and_symptoms#Fatal_error:_Allowed_memory_size_of_nnnnnnn_bytes_exhausted_.28tried_to_allocate_nnnnnnnn_bytes.29

sudo nano /etc/php5/apache2/php.ini # comment out xdebug stuff
sudo service apache2 restart # now mediawiki works fine...

РЕДАКТИРОВАТЬ примечания:

  • Обратите внимание, что даже есливы устанавливаете $wgDefaultUserOptions ['editsection'] = false; в вашем LocalSettings.php, что не влияет на вышеупомянутый скрипт (, хотя это будет действовать в собственно Mediawiki ) - если вы хотите отключить редактирование списка разделовдля рендеринга скрипта API скрипт должен содержать $parserOptions->setEditSection( false ); (, это устанавливается через MediaWiki: ParserOptions Class )
  • Поскольку на рабочем сервере, похоже, у меня нет разрешения на запуск PHP: exec () (точнее, PHP: passthru () ), или, возможно, нет разрешения на запуск php-cli - поэтому я не могу использовать дословное решение выше, потому что commandLine.inc потребует терминал.Тем не менее, можно сделать копию commandLine.inc и «взломать» ее с помощью $argv = array();unset($_SERVER);, и тогда вышеупомянутый парсер может работать полностью из контекста веб-сервера ( однако, я не уверен, если это копированиеcommandLine.inc может представлять угрозу безопасности? )
0 голосов
/ 15 июля 2011

Есть много доступных вики-парсеров - http://www.mediawiki.org/wiki/Alternative_parsers

Вы можете выбрать любой из них. Все, что вам нужно сделать, это обернуть их простой аутентификационной оболочкой, и вы сможете использовать ее в качестве службы.

...