【问题标题】:Mediawiki: render 'off-database' wiki text as HTML in PHP?Mediawiki:在 PHP 中将“数据库外”的 wiki 文本呈现为 HTML?
【发布时间】:2011-10-06 00:30:15
【问题描述】:

情况是,我有一个私人 wiki,比如http://mysite.com/wiki,它在密码后面。我想做的是在同一台服务器上有一个单独的位置,可以读取带有 wiki 文本(代码)的任意文本文件,并使用 http://mysite.com/wikiparticular 引擎来呈现 HTML从中(因为安装了模板/插件)。

例如,我将在http://mysite.com 上有一个 /tmppub 目录;在其中,我有一个带有 wiki 文本源代码的文本文件,比如 Example.wiki 和一个 process.php 页面;然后我会打电话:

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

... 其中 process.php 将读取同一目录中的 Example.wiki 文件,以某种方式将内容传递给 ../wiki 安装,然后检索 HTML 输出并显示它。

我想,我想要的类似于Mediawiki2HTML - gwtwiki - How to convert Mediawiki text to HTML - Java Wikipedia API (Bliki engine) 中的示例——除了这个 Mediawiki2HTML 是用 Java 编写的(我想要 PHP)并且可能使用内部渲染引擎(我想要一个已经存在的特定 Mediawiki 安装)。

问题是,我可以编写一个 PHP 脚本来读取文件,处理 /wiki 的密码,并传递 GET 和 POST 变量 - 除了我不确定如何解决 Mediawiki 安装问题:

  • 我可以假装打电话给&action=edit(例如Editing Wikipedia:Sandbox)并要求预览;但这会返回编辑按钮和文本字段,我必须手动清理它们 - 不喜欢
  • 我可以尝试解决 API,但正如我在 API:Parsing wikitext - MediaWiki 中看到的那样,它仅适用于 Mediawiki 安装中已经存在的页面 - 而不是它的页面。

最后,我想只获取内容的原始 HTML(没有用于侧边栏的 HTML 等),就像使用 action parameter render (example) 时一样。

 

如果已经有这样的 PHP 应用程序可用,是否有人知道 - 如果没有,解决 Mediawiki 安装的正确方法是什么,以获得 wiki 文本源的“原始”HTML 呈现?

提前感谢您的任何回答,
干杯!

【问题讨论】:

    标签: php html mediawiki render


    【解决方案1】:

    您实际上可以使用 API,甚至可以使用 parse 操作来解析自定义 wikitext。 (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();
    

    解析后的 H​​TML 现在位于 $parsedText 变量中。如果您需要对文本执行预保存转换(将{{subst:}}s、波浪号扩展为签名等),请查看ApiParse.php 文件以供参考。

    【讨论】:

    • 太棒了,非常感谢@Matěj Grabovský - 我很难找到与 MediaWiki API 相关的工作示例!我在运行您的代码时也遇到了一些问题,我将在下一个答案帖子中记录...再次感谢 - 干杯!
    【解决方案2】:

    有许多可用的 wiki 解析器 - http://www.mediawiki.org/wiki/Alternative_parsers

    您可以选择其中任何一个。您需要做的就是在它们周围放置一个简单的身份验证包装器,然后您就可以将其用作服务。

    【讨论】:

    • 嗨@Sukumar,谢谢你 - 然而,你的链接指出:“......也就是说,程序和项目,MediaWiki本身,它们能够或打算将 MediaWiki 的文本标记语法翻译成别的东西。";我已经说过我想使用我安装的 specific 引擎(因为安装了模板等 - 将编辑帖子)。干杯!!
    【解决方案3】:

    感谢@Matěj Grabovský 提供answer;但是,我在让它工作的时候绊倒了几次,所以这里有一篇文章。

    首先,我刚刚将答案中的代码保存为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:
    ....
    

    ...这是废话,因为MyWiki 安装在从浏览器调用时有效 - 我还在sqlitebrowser 中打开了数据库以确认确实存在表MWPREFIX_page。 (Matěj's answer中提到的/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';"
    $
    

    知道了这一点,我将Matěj's script修改为:

    <?
    //~ 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 实际上在标准错误中。因此,要从脚本中获取输出,我会在脚本目录中调用:

    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
    https://stackoverflow.com/questions/1947395/how-can-i-debug-a-php-cli-script-with-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...
    

     

    编辑注释:

    • 请注意,即使您在 LocalSettings.php 中设置了 $wgDefaultUserOptions ['editsection'] = false;,这对上述脚本也没有影响(尽管它会在 Mediawiki 中产生影响) - 如果您想禁用编辑API 脚本渲染的部分列表,脚本必须包含 $parserOptions-&gt;setEditSection( false );这是通过 MediaWiki: ParserOptions Class 设置的
    • 由于在生产服务器上,我似乎无权运行PHP: exec()(或者更确切地说,PHP: passthru()),或者可能无权运行php-cli - 所以我不能逐字使用上述解决方案,因为@987654355 @ 将需要一个终端。但是,可以复制commandLine.inc,并使用$argv = array();unset($_SERVER); 对其进行“破解”,然后上述解析器可以完全从网络服务器上下文中工作(但是,我不确定这个复制的commandLine.inc 可能存在安全风险?)

    【讨论】:

      猜你喜欢
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多