Kir Kolyshkin (k001) wrote,
Kir Kolyshkin
k001

mediawiki rss feeds, или как работает free software

Вот вам типичный пример того, как работает свободное ПО, то бишь free software. Пример банальный и потому, наверное, просто понимаемый. Попробую объяснить совсем уж по-простому, на пальцах -- поэтому прошу прощения у коллег за "детсадовский" стиль изложения.

Некий чувак Jim Wilson написал для mediawiki (mediawiki -- это вики-движок, который используется, в частности, википедиями, а также моей wiki.openvz.org) некоторое расширение, позволяющее генерить RSS/Atom feeds из любой wiki-странички. Мне таковая функциональность нужна, чтобы писать на wiki новости. Типа, там, вышло новое ядро. Это, впрочем, всё неважно -- важно то, что есть некая нужная мне программа, и эта программа -- свободная. У меня (и у вас) есть свобода не только её использовать, но и менять, подгонять под себя, улучшать и т.п. И вот почему это важно.

Ну вот, поставил я эту программу. Она заработала, но как-то не очень хорошо. Я нашёл в этой программе два дефекта (которые у меня проявились из-за того, что у меня по-другому mediawiki настроена, и потому что я чуть-чуть иначе использовал сию программу).

Так вот, я посмотрел в исходный код программы и вник в то, как некоторые интересующие меня места работают. Нашёл, почему оно там неправильно работает, и аккуратно исправил. Подробно описал проблему и отправил автору, конечно, вместе с исправлениями.

Теперь, если автор не занят и ему мои исправления покажутся правильными и стоящими, он выпустит новую версию, где этих дефектов не будет.

В итоге всем станет хорошо. Мне хорошо, потому что у меня заработало всё как надо. Всем пользователям, которые могли бы наткнуться на эти дефекты, а теперь не наткнутся. Автору программы, потому что теперь она лучше работает. Всем тем, кто пользуется не столько самой этой программой, сколько её результатами. И так далее.

Свободное ПО делает мир лучше.

Под катом мои ему письма с патчами.

Date: Tue, 25 Mar 2008 15:46:42 +0300
From: Kir Kolyshkin <kir ЭТ opеnvz.оrg>
To: wilson.jim.r ЭТ mаil.cоm
Subject: [PATCH 1/2] minor bug in WikiArticleFeeds vs. namespaces

Hi Jim,

Thank you for your WikiArticleFeeds extension for MediaWiki -- I am now 
trying to use it at wiki.openvz.org.

I am testing it having an article in my user space and found that links 
generated for feeds are not taking namespace into account. Here are the 
details:

Article is at http://wiki.openvz.org/User:Kir/News/updates
Its HTML header contains:

<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="http://wiki.openvz.org/w/index.php?title=Kir/News/updates&amp;action=feed&amp;feed=rss" />
<link rel="alternate" type="application/atom+xml" title="Atom 0.3" href="http://wiki.openvz.org/w/index.php?title=Kir/News/updates&amp;action=feed&amp;feed=atom" />

Apparently the problem is namespace part (i.e. "User:") is missing from 
URLs, so these links gives us no feed.

I have tracked this problem down to function wfAddWikiFeedHeaders() in 
your code which calls $wgTitle->getDBkey(). I am not a mediawiki expert 
but it looks like it should call $wgTitle->getPrefixedDBkey() instead. 
Attached is the one-line patch (in unified diff format) which fixes it. 
Hope you'll include it.

Regards,
  Kir.

--- WikiArticleFeeds.php-orig	2008-03-25 06:02:09.000000000 -0400
+++ WikiArticleFeeds.php	2008-03-25 06:02:19.000000000 -0400
@@ -229,7 +229,7 @@ function wfAddWikiFeedHeaders($out, $tex
 
         global $wgServer, $wgScript, $wgTitle;
     
-        $baseUrl = $wgServer.$wgScript.'?title='.$wgTitle->getDBkey().'&action=feed&feed=';
+        $baseUrl = $wgServer.$wgScript.'?title='.$wgTitle->getPrefixedDBkey().'&action=feed&feed=';
         $rssArr['href'] = $baseUrl.'rss';
         $atomArr['href'] = $baseUrl.'atom';    
     }


Date: Tue, 25 Mar 2008 15:58:38 +0300
From: Kir Kolyshkin <kir ЭТ opеnvz.оrg>
To: wilson.jim.r ЭТ mаil.cоm
Subject: [PATCH 2/2] bug in parsing author/date fields

Here is another patch for your excellent WikiArticleFeeds extension. I 
found a problem using it on my wiki.openvz.org -- there were no 
author/date tags in feed.

The patch fixes parsing Author and Date out of signatures in some 
non-default mediawiki setups.

You look for $wgScript in user URL, but depending on MediaWiki setup 
(i.e. LocalSettings.php) article URLs can not contain the value of 
wgScript. Article path prefix is defined by $wgArticlePath [1], which 
may or may not include wgScript. For examples of setups where article 
URLs does not contain $wgScript, see [2]

Attached patch fixes that problem, using $wgArticlePath directly (note 
that I have to strip $1 suffix out of it). As a side effect, regex is 
now a bit simpler, part (/|\\?title=) removed as it should be a part of 
$wgArticlePath. Also, there is a minor optimization -- preg_quote is now 
done only once, instead of up to 4 times.

Hope you will accept the patch.

Regards,
  Kir.

[1] http://www.mediawiki.org/wiki/Manual:$wgArticlePath
[2] http://www.mediawiki.org/wiki/Manual:Short_URL

--- WikiArticleFeeds.php-orig	2008-03-25 06:02:09.000000000 -0400
+++ WikiArticleFeeds.php	2008-03-25 08:44:03.000000000 -0400
@@ -407,7 +407,7 @@ function wfPurgeFeedsOnArticlePurge($art
  */
 function wfGenerateWikiFeed($article, $feedFormat = 'atom', $filterTags = null) {
 
-    global $wgOut, $wgScript, $wgServer, $wgFeedClasses, $wgMessageCache, $wgVersion, $wgSitename;
+    global $wgOut, $wgArticlePath, $wgServer, $wgFeedClasses, $wgMessageCache, $wgVersion, $wgSitename;
 
     # Setup, handle redirects
     if ($article->isRedirect()) {
@@ -493,10 +493,11 @@ function wfGenerateWikiFeed($article, $f
             # Determine the item author and date
             $author = null;
             $date = null;
+            $articlePath=preg_quote(str_replace('$1', '', $wgArticlePath));
 
             # Look for a regular ~~~~ sig
             $isAttributable = preg_match(
-                '%<a [^>]*href=([\'"])'.preg_quote($wgScript).'(/|\\?title=)User:.*?\\1[^>]*>(.*?)</a> (\\d\\d):(\\d\\d), (\\d+) ([A-z][a-z]+) (\\d{4}) \\([A-Z]+\\)%m',
+                '%<a [^>]*href=([\'"])'.$articlePath.'User:.*?\\1[^>]*>(.*?)</a> (\\d\\d):(\\d\\d), (\\d+) ([A-z][a-z]+) (\\d{4}) \\([A-Z]+\\)%m',
                 $seg,
                 $matches
             );
@@ -504,7 +505,7 @@ function wfGenerateWikiFeed($article, $f
             # As a fallback - look for a --~~~~ like sig with a user page outside the User NS
             if (!$isAttributable) {
                 $isAttributable = preg_match(
-                    '%--<a [^>]*href=([\'"])'.preg_quote($wgScript).'(/|\\?title=).*?\\1[^>]*>(.*?)</a> (\\d\\d):(\\d\\d), (\\d+) ([A-z][a-z]+) (\\d{4}) \\([A-Z]+\\)%m',
+                    '%--<a [^>]*href=([\'"])'.$articlePath.'.*?\\1[^>]*>(.*?)</a> (\\d\\d):(\\d\\d), (\\d+) ([A-z][a-z]+) (\\d{4}) \\([A-Z]+\\)%m',
                     $seg,
                     $matches
                 );
@@ -512,7 +513,7 @@ function wfGenerateWikiFeed($article, $f
             
             # Parse it out - if we can
             if ($isAttributable) {
-                list($author, $hour, $min, $day, $monthName, $year) = array_slice($matches, 3); 
+                list($author, $hour, $min, $day, $monthName, $year) = array_slice($matches, 2); 
                 $months = array(
                     'January' => '01', 'February' => '02', 'March' => '03', 'April' => '04',
                     'May' => '05', 'June' => '06', 'July' => '07', 'August' => '08',
@@ -531,8 +532,8 @@ function wfGenerateWikiFeed($article, $f
             if (!$wgForceArticleFeedSectionLinks) {
                 $strippedSeg = preg_replace(
                     array(
-                        '%<a [^>]*href=([\'"])'.preg_quote($wgScript).'(/|\\?title=)User:.*?\\1[^>]*>(.*?)</a> (\\d\\d:\\d\\d, \\d+ [A-z][a-z]+ \\d{4} \\([A-Z]+\\))%m',
-                        '%--<a [^>]*href=([\'"])'.preg_quote($wgScript).'(/|\\?title=).*?\\1[^>]*>(.*?)</a> (\\d\\d:\\d\\d, \\d+ [A-z][a-z]+ \\d{4} \\([A-Z]+\\))%m'
+                        '%<a [^>]*href=([\'"])'.$articlePath.'User:.*?\\1[^>]*>(.*?)</a> (\\d\\d:\\d\\d, \\d+ [A-z][a-z]+ \\d{4} \\([A-Z]+\\))%m',
+                        '%--<a [^>]*href=([\'"])'.$articlePath.'.*?\\1[^>]*>(.*?)</a> (\\d\\d:\\d\\d, \\d+ [A-z][a-z]+ \\d{4} \\([A-Z]+\\))%m'
                     ),
                     '',
                     $seg
Tags: free software, mediawiki, rss
Subscribe

  • (no subject)

    Here is the example of how not to build packages. All I need is 'convert' utility from ImageMagick, and this is a server system. Now let's try...…

  • mediawiki spam prevention

    Итак, к предыдущему посту. Побороться с описанным там видом спама довольно просто -- надо не давать новым пользователям добавлять новые страницы.…

  • wiki

    Вот за что я люблю wiki. Человек "проходил мимо", увидел и поправил. Ляпота. ( Comments | Comment on this)

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 61 comments

  • (no subject)

    Here is the example of how not to build packages. All I need is 'convert' utility from ImageMagick, and this is a server system. Now let's try...…

  • mediawiki spam prevention

    Итак, к предыдущему посту. Побороться с описанным там видом спама довольно просто -- надо не давать новым пользователям добавлять новые страницы.…

  • wiki

    Вот за что я люблю wiki. Человек "проходил мимо", увидел и поправил. Ляпота. ( Comments | Comment on this)