https://www.mediawiki.org/wiki/Special:Code/MediaWiki/114119

Revision: 114119
Author:   ning
Date:     2012-03-19 00:35:20 +0000 (Mon, 19 Mar 2012)
Log Message:
-----------
More object model support, smw ask query, mw redirect, etc.

Modified Paths:
--------------
    trunk/extensions/WikiObjectModel/WikiObjectModel.php
    trunk/extensions/WikiObjectModel/includes/WOM_Processor.php
    trunk/extensions/WikiObjectModel/includes/WOM_Setup.php
    trunk/extensions/WikiObjectModel/includes/apis/WOM_GetObjectModel.php
    trunk/extensions/WikiObjectModel/includes/apis/WOM_OutputObjectModel.php
    trunk/extensions/WikiObjectModel/includes/apis/WOM_OutputProcessor.php
    trunk/extensions/WikiObjectModel/includes/models/WOM_OM_HTMLTag.php
    trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Parameter.php
    trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Property.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMCategoryParser.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMHTMLTagParser.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMLinkParser.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMListItemParser.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMMagicWordParser.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMParamValueParser.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMParameterParser.php
    
trunk/extensions/WikiObjectModel/includes/parsers/WOMParserFunctionParser.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyParser.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyValueParser.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMSectionParser.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMTableParser.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMTblCellParser.php
    
trunk/extensions/WikiObjectModel/includes/parsers/WOMTemplateFieldHolderParser.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMTemplateParser.php
    trunk/extensions/WikiObjectModel/includes/parsers/WikiObjectModelParser.php

Added Paths:
-----------
    trunk/extensions/WikiObjectModel/includes/apis/SRF_Xml.php
    trunk/extensions/WikiObjectModel/includes/apis/WOM_GetWikiResult.php
    trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Redirect.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMAskParser.php
    
trunk/extensions/WikiObjectModel/includes/parsers/WOMParserFunctionParameterParser.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMRedirectParser.php

Modified: trunk/extensions/WikiObjectModel/WikiObjectModel.php
===================================================================
--- trunk/extensions/WikiObjectModel/WikiObjectModel.php        2012-03-18 
23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/WikiObjectModel.php        2012-03-19 
00:35:20 UTC (rev 114119)
@@ -6,26 +6,17 @@
  */
 if ( !defined( 'MEDIAWIKI' ) ) die;
 
-define( 'WOM_VERSION', '1.0.1 alpha' );
+define( 'WOM_VERSION', '1.0.2 alpha' );
 
-$wgExtensionCredits['parserhook'][] = array(
-       'path' => __FILE__,
-       'name' => 'Wiki ObjectModel Extension',
-       'version' => WOM_VERSION,
-       'author' => "Ning Hu, Justin Zhang, 
[http://smwforum.ontoprise.com/smwforum/index.php/Jesse_Wang Jesse Wang], 
sponsored by [http://projecthalo.com Project Halo], [http://www.vulcan.com 
Vulcan Inc.]",
-       'url' => 'http://wiking.vulcan.com/dev',
-       'descriptionmsg' => 'wom-desc'
-);
-
 $wgOMIP = $IP . '/extensions/WikiObjectModel';
 $wgOMScriptPath = $wgScriptPath . '/extensions/WikiObjectModel';
 
-$wgExtensionFunctions[] = 'smwfOMInitLanguage';
+$wgExtensionFunctions[] = 'wfWOMSetupExtension';
 $wgExtensionMessagesFiles['WikiObjectModel'] = $wgOMIP . 
'/languages/Messages.php';
 
 require_once( $wgOMIP . '/includes/WOM_Setup.php' );
 
-function smwfOMInitLanguageObject( $langcode, $fallback = null ) {
+function wfWOMInitLanguageObject( $langcode, $fallback = null ) {
        global $wgOMIP;
 
        $langClass = 'WOMLanguage' . str_replace( '-', '_', ucfirst( $langcode 
) );
@@ -45,10 +36,34 @@
        return new $langClass();
 }
 
-function smwfOMInitLanguage() {
+function wfWOMInitLanguage() {
        global $wgLanguageCode, $wgLang;
        global $wgOMContLang, $wgOMLang;
 
-       $wgOMContLang = smwfOMInitLanguageObject( $wgLanguageCode );
-       $wgOMLang = smwfOMInitLanguageObject( $wgLang->getCode(), $wgOMContLang 
);
+       $wgOMContLang = wfWOMInitLanguageObject( $wgLanguageCode );
+       $wgOMLang = wfWOMInitLanguageObject( $wgLang->getCode(), $wgOMContLang 
);
 }
+
+function wfWOMRegisterParserFunctionParsers( &$parsers ) {
+       global $wgOMPFParsers;
+       $parsers += $wgOMPFParsers;
+       return true;
+}
+
+function wfWOMSetupExtension() {
+       global $wgHooks, $wgExtensionCredits;
+
+       wfWOMInitLanguage();
+
+       $wgHooks['womRegisterParserFunctionParsers'][] = 
'wfWOMRegisterParserFunctionParsers';
+
+       $wgExtensionCredits['parserhook'][] = array(
+               'path' => __FILE__,
+               'name' => 'Wiki ObjectModel Extension',
+               'version' => WOM_VERSION,
+               'author' => "Ning Hu, Justin Zhang, 
[http://smwforum.ontoprise.com/smwforum/index.php/Jesse_Wang Jesse Wang], 
sponsored by [http://projecthalo.com Project Halo], [http://www.vulcan.com 
Vulcan Inc.]",
+               'url' => 'http://wiking.vulcan.com/dev',
+               'descriptionmsg' => 'wom-desc'
+       );
+       return true;
+}
\ No newline at end of file

Modified: trunk/extensions/WikiObjectModel/includes/WOM_Processor.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/WOM_Processor.php 2012-03-18 
23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/WOM_Processor.php 2012-03-19 
00:35:20 UTC (rev 114119)
@@ -14,7 +14,10 @@
        private static $isParsersRegistered = false;
        private static $parsers = array();
        private static $base_parser;
+       private static $modelParserMapping = array();
 
+       public static $parserFuncParsers = array();
+
        private static function setupParsers() {
                if ( self::$isParsersRegistered ) return;
 
@@ -22,9 +25,33 @@
                foreach ( $wgOMParsers as $p ) {
                        $parser = new $p();
                        self::$parsers[$parser->getParserID()] = $parser;
+                       foreach ( $parser->getValidModelTypes() as $type ) {
+                               self::$modelParserMapping[$type] = 
$parser->getParserID();
+                       }
                }
                self::$base_parser = self::$parsers[WOM_PARSER_ID_TEXT];
 
+               $parsers = array();
+               if ( wfRunHooks ( 'womRegisterParsers', array ( &$parsers ) ) ) 
{
+                       foreach ( $parsers as $p ) {
+                               $parser = new $p();
+                               self::$parsers[$parser->getParserID()] = 
$parser;
+                               foreach ( $parser->getValidModelTypes() as 
$type ) {
+                                       self::$modelParserMapping[$type] = 
$parser->getParserID();
+                               }
+                       }
+               }
+               $parsers = array();
+               if ( wfRunHooks ( 'womRegisterParserFunctionParsers', array ( 
&$parsers ) ) ) {
+                       foreach ( $parsers as $p ) {
+                               $parser = new $p();
+                               
self::$parserFuncParsers[$parser->getParserID()] = $parser;
+                               foreach ( $parser->getValidModelTypes() as 
$type ) {
+                                       self::$modelParserMapping[$type] = 
WOM_PARSER_ID_PARAMETER;
+                               }
+                       }
+               }
+
                self::$isParsersRegistered = true;
        }
 
@@ -35,9 +62,8 @@
                if ( !self::$isParsersRegistered ) {
                        self::setupParsers();
                }
-               global $wgOMModelParserMapping;
-               if ( isset( $wgOMModelParserMapping[$obj->getTypeID()] ) ) {
-                       $id = $wgOMModelParserMapping[$obj->getTypeID()];
+               if ( isset( self::$modelParserMapping[$obj->getTypeID()] ) ) {
+                       $id = self::$modelParserMapping[$obj->getTypeID()];
                        if ( isset( self::$parsers[$id] ) ) {
                                wfProfileOut( $fname );
                                return self::$parsers[$id];
@@ -119,7 +145,10 @@
                                if ( $obj->getTypeID() == WOM_TYPE_HTMLTAG ) {
                                        // special case, html tag
                                } elseif ( $obj instanceof 
WikiObjectModelCollection ) {
-                                       self::parseParagraphs( $obj );
+                                       // FIXME: hardcode, for querystring 
object
+                                       if ( $obj->getTypeID() != 
WOM_TYPE_QUERYSTRING ) {
+                                               self::parseParagraphs( $obj );
+                                       }
                                }
                                $new_objs[] = $obj;
                        }
@@ -180,7 +209,10 @@
                                if ( $obj->getTypeID() == WOM_TYPE_HTMLTAG ) {
                                        // special case, html tag
                                } elseif ( $obj instanceof 
WikiObjectModelCollection ) {
-                                       self::parseSentences( $obj );
+                                       // FIXME: hardcode, for querystring 
object
+                                       if ( $obj->getTypeID() != 
WOM_TYPE_QUERYSTRING ) {
+                                               self::parseSentences( $obj );
+                                       }
                                }
                                $new_objs[] = $obj;
                        }
@@ -230,7 +262,9 @@
                                foreach ( self::$parsers as $parser ) {
                                        $parser_res = $parser->parseNext( 
$text, $parentObj, $offset );
                                        if ( $parser_res == null ) continue;
-                                       if ( $parserInstance == null || 
$parser->subclassOf( $parserInstance ) ) {
+                                       if ( ( $parserInstance == null || 
$parser->subclassOf( $parserInstance ) ) ||
+                                               ( $result != null && 
$parser_res['len'] > $result['len'] ) ) {
+
                                                $parserInstance = $parser;
                                                $result = $parser_res;
                                        }

Modified: trunk/extensions/WikiObjectModel/includes/WOM_Setup.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/WOM_Setup.php     2012-03-18 
23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/WOM_Setup.php     2012-03-19 
00:35:20 UTC (rev 114119)
@@ -14,8 +14,6 @@
 $wgAutoloadClasses['WOMTemplateModel']         =  $wgOMIP . 
'/includes/models/WOM_OM_Template.php';
 $wgAutoloadClasses['WOMParserFunctionModel']   =  $wgOMIP . 
'/includes/models/WOM_OM_ParserFunction.php';
 $wgAutoloadClasses['WOMParameterModel']        =  $wgOMIP . 
'/includes/models/WOM_OM_Parameter.php';
-$wgAutoloadClasses['WOMQuerystringModel']      =  $wgOMIP . 
'/includes/models/WOM_OM_Querystring.php';
-$wgAutoloadClasses['WOMQueryPrintoutModel']    =  $wgOMIP . 
'/includes/models/WOM_OM_QueryPrintout.php';
 $wgAutoloadClasses['WOMParamValueModel']       =  $wgOMIP . 
'/includes/models/WOM_OM_ParamValue.php';
 $wgAutoloadClasses['WOMTemplateFieldModel']    =  $wgOMIP . 
'/includes/models/WOM_OM_TmplField.php';
 $wgAutoloadClasses['WOMPropertyModel']         =  $wgOMIP . 
'/includes/models/WOM_OM_Property.php';
@@ -32,6 +30,7 @@
 $wgAutoloadClasses['WOMMagicWordModel']        =  $wgOMIP . 
'/includes/models/WOM_OM_MagicWord.php';
 $wgAutoloadClasses['WOMHTMLTagModel']          =  $wgOMIP . 
'/includes/models/WOM_OM_HTMLTag.php';
 $wgAutoloadClasses['WOMTemplateFieldHolderModel'] =  $wgOMIP . 
'/includes/models/WOM_OM_TmplFieldHolder.php';
+$wgAutoloadClasses['WOMRedirectModel']         =  $wgOMIP . 
'/includes/models/WOM_OM_Redirect.php';
 
 // Definitions
 define( 'WOM_TYPE_PAGE'           , 'page' );
@@ -45,8 +44,6 @@
 define( 'WOM_TYPE_TEMPLATE'       , 'template' );
 define( 'WOM_TYPE_PARSERFUNCTION' , 'parser_function' );
 define( 'WOM_TYPE_PARAMETER'      , 'parameter' );
-define( 'WOM_TYPE_QUERYSTRING'    , 'querystring' );
-define( 'WOM_TYPE_QUERYPRINTOUT'  , 'printout' );
 define( 'WOM_TYPE_PARAM_VALUE'    , 'value' );
 define( 'WOM_TYPE_TMPL_FIELD'     , 'template_field' );
 define( 'WOM_TYPE_SENTENCE'       , 'sentence' );
@@ -57,6 +54,7 @@
 define( 'WOM_TYPE_MAGICWORD'      , 'magicword' );
 define( 'WOM_TYPE_HTMLTAG'        , 'html' );
 define( 'WOM_TYPE_TMPL_FIELD_HOLDER', 'template_field_holder' );
+define( 'WOM_TYPE_REDIRECT'       , 'redirect' );
 
 // POM Parser
 $wgAutoloadClasses['WikiObjectModelParser']     =  $wgOMIP . 
'/includes/parsers/WikiObjectModelParser.php';
@@ -76,6 +74,7 @@
 $wgAutoloadClasses['WOMMagicWordParser']       =  $wgOMIP . 
'/includes/parsers/WOMMagicWordParser.php';
 $wgAutoloadClasses['WOMHTMLTagParser']         =  $wgOMIP . 
'/includes/parsers/WOMHTMLTagParser.php';
 $wgAutoloadClasses['WOMTemplateFieldHolderParser'] =  $wgOMIP . 
'/includes/parsers/WOMTemplateFieldHolderParser.php';
+$wgAutoloadClasses['WOMRedirectParser']        =  $wgOMIP . 
'/includes/parsers/WOMRedirectParser.php';
 
 // Definitions
 define( 'WOM_PARSER_ID_CATEGORY'       , 'category' );
@@ -94,6 +93,7 @@
 define( 'WOM_PARSER_ID_MAGICWORD'      , 'magicword' );
 define( 'WOM_PARSER_ID_HTMLTAG'        , 'html' );
 define( 'WOM_PARSER_ID_TEMPLATE_FIELD_HOLDER', 'template_field_holder' );
+define( 'WOM_PARSER_ID_REDIRECT'       , 'redirect' );
 
 global $wgOMParsers, $wgOMModelParserMapping;
 $wgOMParsers = array(
@@ -113,29 +113,21 @@
                'WOMMagicWordParser',
                'WOMHTMLTagParser',
                'WOMTemplateFieldHolderParser',
+               'WOMRedirectParser',
 );
 
-$wgOMModelParserMapping = array(
-       WOM_TYPE_TEXT           => WOM_PARSER_ID_TEXT,
-       WOM_TYPE_CATEGORY       => WOM_PARSER_ID_CATEGORY,
-       WOM_TYPE_SECTION        => WOM_PARSER_ID_SECTION,
-       WOM_TYPE_PROPERTY       => WOM_PARSER_ID_PROPERTY,
-       WOM_TYPE_NESTPROPERTY   => WOM_PARSER_ID_PROPERTY,
-       WOM_TYPE_NESTPROPERTYVAL => WOM_PARSER_ID_PROPERTY_VALUE,
-       WOM_TYPE_LINK           => WOM_PARSER_ID_LINK,
-       WOM_TYPE_TEMPLATE       => WOM_PARSER_ID_TEMPLATE,
-       WOM_TYPE_PARSERFUNCTION => WOM_PARSER_ID_PARSERFUNCTION,
-       WOM_TYPE_PARAMETER      => WOM_PARSER_ID_PARAMETER,
-       WOM_TYPE_TMPL_FIELD     => WOM_PARSER_ID_PARAMETER,
-       WOM_TYPE_QUERYSTRING    => WOM_PARSER_ID_PARAMETER,
-       WOM_TYPE_QUERYPRINTOUT  => WOM_PARSER_ID_PARAMETER,
-       WOM_TYPE_PARAM_VALUE    => WOM_PARSER_ID_PARAM_VALUE,
-       WOM_TYPE_LISTITEM       => WOM_PARSER_ID_LISTITEM,
-       WOM_TYPE_TABLE          => WOM_PARSER_ID_TABLE,
-       WOM_TYPE_TBL_CELL       => WOM_PARSER_ID_TABLECELL,
-       WOM_TYPE_MAGICWORD      => WOM_PARSER_ID_MAGICWORD,
-       WOM_TYPE_HTMLTAG        => WOM_PARSER_ID_HTMLTAG,
-       WOM_TYPE_TMPL_FIELD_HOLDER => WOM_PARSER_ID_TEMPLATE_FIELD_HOLDER,
+// Parser function parameter
+$wgAutoloadClasses['WOMQuerystringModel']      =  $wgOMIP . 
'/includes/models/WOM_OM_Querystring.php';
+$wgAutoloadClasses['WOMQueryPrintoutModel']    =  $wgOMIP . 
'/includes/models/WOM_OM_QueryPrintout.php';
+define( 'WOM_TYPE_QUERYSTRING'    , 'querystring' );
+define( 'WOM_TYPE_QUERYPRINTOUT'  , 'printout' );
+
+$wgAutoloadClasses['WOMParserFunctionParameterParser']     =  $wgOMIP . 
'/includes/parsers/WOMParserFunctionParameterParser.php';
+
+$wgAutoloadClasses['WOMAskParser']        =  $wgOMIP . 
'/includes/parsers/WOMAskParser.php';
+define( 'WOM_PFPARSER_ID_ASK'       , 'ask' );
+$wgOMPFParsers = array(
+       'WOMAskParser',
 );
 
 global $wgOMSentenceObjectTypes;
@@ -164,4 +156,5 @@
 $wgAutoloadClasses['ApiWOMQuery'] = $wgOMIP . '/includes/apis/WOM_Query.php';
 $wgAPIModules['womoutput'] = 'ApiWOMOutputObjectModel';
 $wgAutoloadClasses['ApiWOMOutputObjectModel'] = $wgOMIP . 
'/includes/apis/WOM_OutputObjectModel.php';
-
+$wgAPIModules['womwiki'] = 'ApiWOMGetWikiResult';
+$wgAutoloadClasses['ApiWOMGetWikiResult'] = $wgOMIP . 
'/includes/apis/WOM_GetWikiResult.php';

Added: trunk/extensions/WikiObjectModel/includes/apis/SRF_Xml.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/apis/SRF_Xml.php                  
        (rev 0)
+++ trunk/extensions/WikiObjectModel/includes/apis/SRF_Xml.php  2012-03-19 
00:35:20 UTC (rev 114119)
@@ -0,0 +1,44 @@
+<?php
+/**
+ * A query printer for xml
+ *
+ * @note AUTOLOADED
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+       die( 'Not an entry point.' );
+}
+
+class SRFXml extends SMWResultPrinter {
+       protected function getResultText( $res, $outputmode ) {
+               $xml = '';
+               if ( $this->mShowHeaders != SMW_HEADERS_HIDE ) {
+                       $xml .= '<head>' . "\n";
+                       foreach ( $res->getPrintRequests() as $pr ) {
+                               $xml .= "<item>{$pr->getText( $outputmode, null 
)}</item>\n";
+                       }
+                       $xml .= '</head>' . "\n";
+               }
+
+               $xml .= '<res>' . "\n";
+               // print all result rows
+               while ( $row = $res->getNext() ) {
+                       $xml .= '<row>' . "\n";
+                       $firstcol = true;
+                       foreach ( $row as $field ) {
+                               $xml .= '<item>' . "\n";
+                               $growing = array();
+                               while ( ( $object = $field->getNextObject() ) 
!== false ) {
+                                       $text = 
Sanitizer::decodeCharReferences( $object->getWikiValue() );
+                                       $growing[] = $text;
+                               } // while...
+                               $xml .= implode( ',', $growing );
+                               $xml .= '</item>' . "\n";
+                       } // foreach...
+                       $xml .= '</row>' . "\n";
+               }
+               $xml .= '</res>' . "\n";
+
+               return $xml;
+       }
+}
\ No newline at end of file

Modified: trunk/extensions/WikiObjectModel/includes/apis/WOM_GetObjectModel.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/apis/WOM_GetObjectModel.php       
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/apis/WOM_GetObjectModel.php       
2012-03-19 00:35:20 UTC (rev 114119)
@@ -33,7 +33,8 @@
                        $this->dieUsage( "Article doesn't exist ($page_name)", 
3 );
 
                try {
-                       $objs = WOMProcessor::getObjIdByXPath( $articleTitle, 
$xpath, $rid );
+                       $page_obj = WOMProcessor::getPageObject( $articleTitle, 
$rid );
+                       $objs = WOMProcessor::getObjIdByXPath2( $page_obj, 
$xpath );
                } catch ( Exception $e ) {
                        $err = $e->getMessage();
                }
@@ -48,6 +49,7 @@
                        $this->getResult()->setContent( $result['message'], 
$err );
                } else {
                        $result['result'] = 'Success';
+                       $result['revisionID'] = $page_obj->getRevisionID();
 
                        // pay attention to special xml tag, e.g., 
<property><value>...</value></property>
                        $result['return'] = array();
@@ -60,7 +62,6 @@
                                $this->getResult()->setContent( 
$result['return'], $count );
                        } else {
                                $xml = '';
-                               $page_obj = WOMProcessor::getPageObject( 
$articleTitle, $rid );
                                foreach ( $objs as $id ) {
                                        if ( $id == '' ) continue;
                                        $wobj = $page_obj->getObject( $id );
@@ -76,7 +77,7 @@
                                        header ( "Content-Type: 
application/rdf+xml" );
                                        echo <<<OUTPUT
 <?xml version="1.0" encoding="UTF-8" ?>
-<api><womget result="Success"><return>
+<api><womget result="Success" 
revisionID="{$page_obj->getRevisionID()}"><return>
 {$xml}
 </return></womget></api>
 OUTPUT;

Added: trunk/extensions/WikiObjectModel/includes/apis/WOM_GetWikiResult.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/apis/WOM_GetWikiResult.php        
                        (rev 0)
+++ trunk/extensions/WikiObjectModel/includes/apis/WOM_GetWikiResult.php        
2012-03-19 00:35:20 UTC (rev 114119)
@@ -0,0 +1,107 @@
+<?php
+
+/**
+ * @addtogroup API
+ */
+class ApiWOMGetWikiResult extends ApiBase {
+
+       public function __construct( $main, $action ) {
+               parent :: __construct( $main, $action );
+       }
+
+       public function execute() {
+               global $wgUser;
+
+               $params = $this->extractRequestParams();
+               if ( is_null( $params['wiki'] ) )
+                       $this->dieUsage( 'Must specify wiki text', 0 );
+               $wiki = $params['wiki'];
+               $type = $params['type'];
+
+               global $wgParser;
+               $popt = new ParserOptions();
+               $popt->setEditSection( false );
+               $title = Title::newFromText( '__TEMPWIKITITLE__' );
+               if ( strtolower( $type ) == 'ask' ) {
+                       $wiki = "{$wiki}|format=xml";
+
+                       global $wgOMIP, $smwgResultFormats, $wgAutoloadClasses;
+                       $smwgResultFormats['xml'] = 'SRFXml';
+                       $wgAutoloadClasses['SRFXml'] = $wgOMIP . 
'/includes/apis/SRF_Xml.php';
+
+                       $s = $wgParser->preprocess( $wiki, $title, $popt );
+                       $b = 0;
+                       for ( $i = 0; $i < strlen( $s ); ++$i ) {
+                               if ( $s { $i } == '[' ) {
+                                       ++ $b;
+                               } elseif ( $s { $i } == ']' ) {
+                                       -- $b;
+                               } elseif ( $s { $i } == '|' ) {
+                                       if ( $b == 0 ) break;
+                               }
+                       }
+                       $rawparams = array( substr( $s, 0, $i ) );
+                       if ( $i < strlen( $s ) ) $rawparams = array_merge( 
$rawparams, explode( '|', substr( $s, $i + 1 ) ) );
+                       $result = 
SMWQueryProcessor::getResultFromFunctionParams( $rawparams, SMW_OUTPUT_WIKI );
+               } else {
+                       $pout = $wgParser->parse( $wiki, $title, $popt );
+                       $result = "<![CDATA[{$pout->getText()}]]>";
+               }
+
+               header ( "Content-Type: application/rdf+xml" );
+               echo <<<OUTPUT
+<?xml version="1.0" encoding="UTF-8" ?>
+<api><womwiki result="Success">
+<wiki><![CDATA[{$wiki}]]></wiki>
+<return>
+{$result}
+</return></womwiki></api>
+OUTPUT;
+               exit( 1 );
+       }
+
+       protected function getAllowedParams() {
+               $types = defined( 'SMW_VERSION' ) ? array( 'wiki', 'ask' ) : 
array( 'wiki' );
+               return array (
+                       'wiki' => null,
+                       'type' => array(
+                               ApiBase :: PARAM_DFLT => 'wiki',
+                               ApiBase :: PARAM_TYPE => $types
+                       ),
+               );
+       }
+
+       protected function getParamDescription() {
+               $types = defined( 'SMW_VERSION' ) ? array(
+                               'Type to fetch wiki parse result',
+                               'type = wiki, get parser result of wiki text',
+                               'type = ask, get parser result of ask query, in 
xml format'
+                       ) : array(
+                               'Type to fetch wiki parse result',
+                               'type = wiki, get parser result of wiki text',
+                       );
+               return array (
+                       'wiki' => 'Wiki text',
+                       'type' => $types
+               );
+       }
+
+       protected function getDescription() {
+               return 'Call to get parse result of wiki';
+       }
+
+       protected function getExamples() {
+               return array (
+                       'api.php?action=womwiki&wiki=[[Hello]]',
+                       
'api.php?action=womwiki&wiki=[[Category:Hello]]&type=ask'
+               );
+       }
+
+//     public function mustBePosted() {
+//             return true;
+//     }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}

Modified: 
trunk/extensions/WikiObjectModel/includes/apis/WOM_OutputObjectModel.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/apis/WOM_OutputObjectModel.php    
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/apis/WOM_OutputObjectModel.php    
2012-03-19 00:35:20 UTC (rev 114119)
@@ -38,8 +38,8 @@
                if ( !$article->exists() )
                        $this->dieUsage( "Article doesn't exist ($page_name)", 
3 );
 
-               $page_obj = WOMOutputProcessor::getOutputData( $articleTitle, 
$rid );
                try {
+                       $page_obj = WOMOutputProcessor::getOutputData( 
$articleTitle, $rid );
                        $objs = WOMProcessor::getObjIdByXPath2( $page_obj, 
$xpath );
                } catch ( Exception $e ) {
                        $err = $e->getMessage();
@@ -55,6 +55,7 @@
                        $this->getResult()->setContent( $result['message'], 
$err );
                } else {
                        $result['result'] = 'Success';
+                       $result['revisionID'] = $page_obj->getRevisionID();
 
                        // pay attention to special xml tag, e.g., 
<property><value>...</value></property>
                        $result['return'] = array();
@@ -81,7 +82,7 @@
                                        header ( "Content-Type: 
application/rdf+xml" );
                                        echo <<<OUTPUT
 <?xml version="1.0" encoding="UTF-8" ?>
-<api><womoutput result="Success"><return>
+<api><womoutput result="Success" 
revisionID="{$page_obj->getRevisionID()}"><return>
 {$xml}
 </return></womoutput></api>
 OUTPUT;

Modified: trunk/extensions/WikiObjectModel/includes/apis/WOM_OutputProcessor.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/apis/WOM_OutputProcessor.php      
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/apis/WOM_OutputProcessor.php      
2012-03-19 00:35:20 UTC (rev 114119)
@@ -282,7 +282,10 @@
                        foreach ( $queries as $label => $vals ) {
                                $vals = array_unique( $vals );
                                foreach ( $vals as $val ) {
-                                       $query_res->insertObject( new 
WOMPropertyModel( $label, $val ) );
+                                       $qprop = new WOMPropertyModel( $label, 
$val );
+                                       $qprop->setObjectID( 'output' . ( 
$tmp_id ++ ) );
+                                       $query_res->insertObject( $qprop );
+                                       $wom->addToPageObjectSet( $qprop );
                                }
                        }
                }
@@ -310,6 +313,8 @@
                        }
                }
 
+               if ( wfRunHooks ( 'womGetExtraOutputObjects', array ( $wgTitle, 
&$wom ) ) ) {
+               }
                return $wom;
        }
 }

Modified: trunk/extensions/WikiObjectModel/includes/models/WOM_OM_HTMLTag.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/models/WOM_OM_HTMLTag.php 
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/models/WOM_OM_HTMLTag.php 
2012-03-19 00:35:20 UTC (rev 114119)
@@ -22,7 +22,7 @@
                return $this->m_name;
        }
 
-       public function setName( $name ) {
+       public function setTagName( $name ) {
                $this->m_name = $name;
        }
 
@@ -37,6 +37,7 @@
                        $v = preg_replace( '/^[\'"](.*)[\'"]$/', '$1', $v );
                        if ( $attr == $a ) return $v;
                }
+               return null;
        }
 
        public function setAttributes( $attrs ) {
@@ -62,14 +63,14 @@
        public function setXMLAttribute( $key, $value ) {
                if ( $value == '' ) throw new MWException( __METHOD__ . ": 
value cannot be empty" );
 
-               if ( $key == 'name' ) {
+               if ( $key == 'tag' ) {
                        $this->m_name = $value;
                } else {
-                       throw new MWException( __METHOD__ . ": invalid 
key/value pair: name=html_tag_name" );
+                       $attrs[$key] = $value;
                }
        }
        protected function getXMLAttributes() {
-               $ret = 'name="' . self::xml_entities( $this->m_name ) . '"';
+               $ret = 'tag="' . self::xml_entities( $this->m_name ) . '"';
                foreach ( $this->m_attrs as $a => $v ) {
                        $v = preg_replace( '/^"(.*)"$/', '$1', $v );
                        if ( $a == 'id' ) $a = 'tag_id';

Modified: trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Parameter.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Parameter.php       
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Parameter.php       
2012-03-19 00:35:20 UTC (rev 114119)
@@ -10,20 +10,26 @@
 
 class WOMParameterModel extends WikiObjectModelCollection {
        protected $m_key;
+       protected $m_pipe;
 
        public function __construct( $key = '' ) {
                parent::__construct( WOM_TYPE_PARAMETER );
                $this->m_key = $key;
+               $this->m_pipe = true;
        }
 
        public function getKey() {
                return $this->m_key;
        }
 
+       public function setPipe( $pipe ) {
+               $this->m_pipe = $pipe;
+       }
+
        public function getWikiText() {
                return ( $this->m_key == '' ? "" : ( $this->m_key . '=' ) ) .
                        $this->getValueText() .
-                       '|';
+                       ( $this->m_pipe ? '|' : '' );
        }
 
        public function getValueText() {

Modified: trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Property.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Property.php        
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Property.php        
2012-03-19 00:35:20 UTC (rev 114119)
@@ -72,7 +72,11 @@
        }
 
        public function getWikiText() {
-               $res = 
"[[{$this->getPropertyName()}::{$this->getPropertyValue()}";
+               $value = $this->getPropertyValue();
+               if ( substr( $value, 0, 1 ) == ':' ) {
+                       $value = ' ' . $value;
+               }
+               $res = "[[{$this->getPropertyName()}::{$value}";
                if ( $this->getPropertyValue() != $this->getCaption()
                        && $this->getCaption() != '' ) {
                                $res .= "|{$this->getCaption()}";
@@ -89,7 +93,7 @@
        }
 
        public function getPropertyValue() {
-               return $this->m_smwdatavalue == null ? $this->m_value : 
$this->m_smwdatavalue->getWikiValue();
+               return trim( $this->m_smwdatavalue == null ? $this->m_value : 
$this->m_smwdatavalue->getWikiValue() );
        }
 
        public function getCaption() {

Added: trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Redirect.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Redirect.php        
                        (rev 0)
+++ trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Redirect.php        
2012-03-19 00:35:20 UTC (rev 114119)
@@ -0,0 +1,29 @@
+<?php
+/**
+ * This model implements redirect models.
+ *
+ * #REDIRECT [[Pagename]]
+ * Consider that #REDIRECT can be localized.
+ *
+ * @author Ning
+ * @file
+ * @ingroup WikiObjectModels
+ *
+ */
+
+class WOMRedirectModel extends WikiObjectModel {
+       private $m_to_page;
+
+       public function __construct( $to_page ) {
+               parent::__construct( WOM_TYPE_REDIRECT );
+               $this->m_to_page = $to_page;
+       }
+
+       public function getWikiText() {
+               return '#REDIRECT [[' . $this->m_to_page . ']]';
+       }
+
+       protected function getXMLContent() {
+               return "<![CDATA[{$this->m_to_page}]]>";
+       }
+}

Added: trunk/extensions/WikiObjectModel/includes/parsers/WOMAskParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMAskParser.php          
                (rev 0)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMAskParser.php  
2012-03-19 00:35:20 UTC (rev 114119)
@@ -0,0 +1,67 @@
+<?php
+/**
+ * @author Ning
+ *
+ * @file
+ * @ingroup WikiObjectModels
+ */
+
+class WOMAskParser extends WOMParserFunctionParameterParser {
+
+       public function __construct() {
+               $this->m_parserId = WOM_PFPARSER_ID_ASK;
+       }
+
+       public function getValidModelTypes() {
+               return array(
+                       WOM_TYPE_QUERYSTRING,
+                       WOM_TYPE_QUERYPRINTOUT
+               );
+       }
+
+       private function parseAskParameters ( $text, WikiObjectModelCollection 
$parentObj ) {
+               if ( defined( 'SMW_AGGREGATION_VERSION' ) ) {
+                       $r = preg_match( 
'/^(\s*\?([^>=|}]+)(?:\>([^=|}]*))?(?:=([^|}]*))?)(\||\}|$)/', $text, $m );
+                       if ( !$r ) return null;
+                       return array(
+                               'len' => strlen( $m[5] == '|' ? $m[0] : $m[1] ),
+                               'obj' => new WOMQueryPrintoutModel( trim( $m[2] 
), trim( $m[4] ), trim( $m[3] ) ) );
+               } else {
+                       $r = preg_match( 
'/^(\s*\?([^=|}]+)(?:=([^|}]*))?)(\||\}|$)/', $text, $m );
+                       if ( !$r ) return null;
+                       return array(
+                               'len' => strlen( $m[4] == '|' ? $m[0] : $m[1] ),
+                               'obj' => new WOMQueryPrintoutModel( trim( $m[2] 
), trim( $m[3] ) ) );
+               }
+       }
+
+       public function parseParserFunctionParameter ( $text, 
WikiObjectModelCollection $parentObj ) {
+               if ( !defined( 'SMW_VERSION' )
+                       || !( $parentObj instanceof WOMParserFunctionModel ) )
+                               return null;
+
+               if ( trim( strtolower( $parentObj->getFunctionKey() ) ) != 
'ask' ) return null;
+
+               if ( count ( $parentObj->getObjects() ) == 0 ) {
+                       return array( 'len' => 0, 'obj' => new 
WOMQuerystringModel() );
+               }
+
+               return $this->parseAskParameters( $text, $parentObj );
+       }
+
+       public function getSubParserID( $obj ) {
+               if ( ( $obj instanceof WOMQuerystringModel )
+                       || ( $obj instanceof WOMQueryPrintoutModel ) )
+                               return '';
+
+               return null;
+       }
+
+       public function validate ( $obj ) {
+               if ( !( ( $obj instanceof WOMQuerystringModel )
+                       || ( $obj instanceof WOMQueryPrintoutModel ) ) )
+                               return false;
+
+               return true;
+       }
+}

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMCategoryParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMCategoryParser.php     
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMCategoryParser.php     
2012-03-19 00:35:20 UTC (rev 114119)
@@ -13,6 +13,10 @@
                $this->m_parserId = WOM_PARSER_ID_CATEGORY;
        }
 
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_CATEGORY );
+       }
+
        public function parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
                $text = substr( $text, $offset );
                global $wgContLang;

Modified: trunk/extensions/WikiObjectModel/includes/parsers/WOMHTMLTagParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMHTMLTagParser.php      
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMHTMLTagParser.php      
2012-03-19 00:35:20 UTC (rev 114119)
@@ -13,6 +13,10 @@
                $this->m_parserId = WOM_PARSER_ID_HTMLTAG;
        }
 
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_HTMLTAG );
+       }
+
        public function parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
                $text = substr( $text, $offset );
                // this is not a proper html tag regex, for strings include 
char '>'

Modified: trunk/extensions/WikiObjectModel/includes/parsers/WOMLinkParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMLinkParser.php 
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMLinkParser.php 
2012-03-19 00:35:20 UTC (rev 114119)
@@ -13,6 +13,10 @@
                $this->m_parserId = WOM_PARSER_ID_LINK;
        }
 
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_LINK );
+       }
+
        public function parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
                $text = substr( $text, $offset );
 

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMListItemParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMListItemParser.php     
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMListItemParser.php     
2012-03-19 00:35:20 UTC (rev 114119)
@@ -13,6 +13,10 @@
                $this->m_parserId = WOM_PARSER_ID_LISTITEM;
        }
 
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_LISTITEM );
+       }
+
        public function parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
                $lastLF = ( $offset == 0 || $text { $offset - 1 } == "\n" );
                $text = substr( $text, $offset );

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMMagicWordParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMMagicWordParser.php    
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMMagicWordParser.php    
2012-03-19 00:35:20 UTC (rev 114119)
@@ -13,6 +13,10 @@
                $this->m_parserId = WOM_PARSER_ID_MAGICWORD;
        }
 
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_MAGICWORD );
+       }
+
        static $underscores = array( '0' => '', '1' => '' );
        static $mwa = null;
        static function getDoubleUnderscoreRegex() {

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMParamValueParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMParamValueParser.php   
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMParamValueParser.php   
2012-03-19 00:35:20 UTC (rev 114119)
@@ -13,6 +13,10 @@
                $this->m_parserId = WOM_PARSER_ID_PARAM_VALUE;
        }
 
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_PARAM_VALUE );
+       }
+
        public function parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
                if ( !( ( $parentObj instanceof WOMParameterModel )
                        || ( $parentObj instanceof WOMTemplateFieldHolderModel 
) ) )

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMParameterParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMParameterParser.php    
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMParameterParser.php    
2012-03-19 00:35:20 UTC (rev 114119)
@@ -13,28 +13,8 @@
                $this->m_parserId = WOM_PARSER_ID_PARAMETER;
        }
 
-       private function parseAsk ( $text, WikiObjectModelCollection $parentObj 
) {
-               if ( !defined( 'SMW_VERSION' ) ) return null;
-
-               if ( trim( strtolower( $parentObj->getFunctionKey() ) ) != 
'ask' ) return null;
-
-               if ( count ( $parentObj->getObjects() ) == 0 ) {
-                       return array( 'len' => 0, 'obj' => new 
WOMQuerystringModel() );
-               }
-
-               if ( defined( 'SMW_AGGREGATION_VERSION' ) ) {
-                       $r = preg_match( 
'/^(\s*\?([^>=|}]+)(?:\>([^=|}]*))?(?:=([^|}]*))?)(\||\}|$)/', $text, $m );
-                       if ( !$r ) return null;
-                       return array(
-                               'len' => strlen( $m[5] == '|' ? $m[0] : $m[1] ),
-                               'obj' => new WOMQueryPrintoutModel( trim( $m[2] 
), trim( $m[4] ), trim( $m[3] ) ) );
-               } else {
-                       $r = preg_match( 
'/^(\s*\?([^=|}]+)(?:=([^|}]*))?)(\||\}|$)/', $text, $m );
-                       if ( !$r ) return null;
-                       return array(
-                               'len' => strlen( $m[4] == '|' ? $m[0] : $m[1] ),
-                               'obj' => new WOMQueryPrintoutModel( trim( $m[2] 
), trim( $m[3] ) ) );
-               }
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_PARAMETER, WOM_TYPE_TMPL_FIELD );
        }
 
        public function parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
@@ -44,8 +24,12 @@
 
                $text = substr( $text, $offset );
 
-               $ret = $this->parseAsk ( $text, $parentObj );
-               if ( $ret != null ) return $ret;
+               if ( $parentObj instanceof WOMParserFunctionModel ) {
+                       foreach ( WOMProcessor::$parserFuncParsers as $p ) {
+                               $ret = $p->parseParserFunctionParameter ( 
$text, $parentObj );
+                               if ( $ret != null ) return $ret;
+                       }
+               }
 
                $r = preg_match( '/^([^=|}]*)(\||=|\}|$)/', $text, $m );
                if ( !$r ) return null;
@@ -67,18 +51,26 @@
        }
 
        public function getSubParserID( $obj ) {
-               if ( ( $obj instanceof WOMQuerystringModel )
-                       || ( $obj instanceof WOMQueryPrintoutModel ) )
-                               return '';
+               foreach ( WOMProcessor::$parserFuncParsers as $p ) {
+                       $ret = $p->getSubParserID ( $obj );
+                       if ( $ret !== null ) return $ret;
+               }
 
                return WOM_PARSER_ID_PARAM_VALUE;
        }
 
        public function isObjectClosed( $obj, $text, $offset ) {
-               if ( !( ( $obj instanceof WOMTemplateFieldModel )
-                       || ( $obj instanceof WOMParameterModel )
-                       || ( $obj instanceof WOMQuerystringModel )
-                       || ( $obj instanceof WOMQueryPrintoutModel ) ) )
+               $valid = false;
+               foreach ( WOMProcessor::$parserFuncParsers as $p ) {
+                       if ( $p->validate ( $obj ) ) {
+                               $valid = true;
+                               break;
+                       }
+               }
+
+               if ( !( $valid ||
+                       ( $obj instanceof WOMTemplateFieldModel ) ||
+                       ( $obj instanceof WOMParameterModel ) ) )
                                return false;
 
                if ( ( strlen( $text ) >= $offset + 1 ) && $text { $offset } == 
'|' ) {
@@ -86,7 +78,10 @@
                }
                $parentClose = WOMProcessor::getObjectParser( $obj->getParent() 
)
                        ->isObjectClosed( $obj->getParent(), $text, $offset );
-               if ( $parentClose !== false ) return 0;
+               if ( $parentClose !== false ) {
+                       $obj->setPipe( false );
+                       return 0;
+               }
 
                return false;
        }

Added: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMParserFunctionParameterParser.php
===================================================================
--- 
trunk/extensions/WikiObjectModel/includes/parsers/WOMParserFunctionParameterParser.php
                              (rev 0)
+++ 
trunk/extensions/WikiObjectModel/includes/parsers/WOMParserFunctionParameterParser.php
      2012-03-19 00:35:20 UTC (rev 114119)
@@ -0,0 +1,59 @@
+<?php
+/**
+ * @author Ning
+ *
+ * @file
+ * @ingroup WikiObjectModels
+ */
+
+abstract class WOMParserFunctionParameterParser {
+       protected $m_parserId;
+
+       /**
+        * Array of error text messages. Private to allow us to track error 
insertion
+        * (PHP's count() is too slow when called often) by using $mHasErrors.
+        * @var array
+        */
+       protected $mErrors = array();
+
+       /**
+        * Boolean indicating if there where any errors.
+        * Should be modified accordingly when modifying $mErrors.
+        * @var boolean
+        */
+       protected $mHasErrors = false;
+
+// /// Processing methods /////
+       public abstract function parseParserFunctionParameter ( $text, 
WikiObjectModelCollection $parentObj );
+
+       public abstract function validate( $obj );
+
+       public abstract function getValidModelTypes();
+
+// /// Get methods /////
+       public function getParserID() {
+               return $this->m_parserId;
+       }
+
+       // specified next parser. e.g., template parser -> parameter parser
+       public function getSubParserID( $obj ) { return ''; }
+
+       /**
+        * Return a string that displays all error messages as a tooltip, or
+        * an empty string if no errors happened.
+        */
+       public function getErrorText() {
+               if ( defined( 'SMW_VERSION' ) )
+                       return smwfEncodeMessages( $this->mErrors );
+
+               return $this->mErrors;
+       }
+
+       /**
+        * Return an array of error messages, or an empty array
+        * if no errors occurred.
+        */
+       public function getErrors() {
+               return $this->mErrors;
+       }
+}

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMParserFunctionParser.php
===================================================================
--- 
trunk/extensions/WikiObjectModel/includes/parsers/WOMParserFunctionParser.php   
    2012-03-18 23:22:20 UTC (rev 114118)
+++ 
trunk/extensions/WikiObjectModel/includes/parsers/WOMParserFunctionParser.php   
    2012-03-19 00:35:20 UTC (rev 114119)
@@ -13,6 +13,10 @@
                $this->m_parserId = WOM_PARSER_ID_PARSERFUNCTION;
        }
 
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_PARSERFUNCTION );
+       }
+
        public function parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
                $text = substr( $text, $offset );
                $r = preg_match( '/^\{\{\s*#([^\{\|\}:]+):/', $text, $m );

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyParser.php     
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyParser.php     
2012-03-19 00:35:20 UTC (rev 114119)
@@ -14,6 +14,10 @@
                $this->m_parserId = WOM_PARSER_ID_PROPERTY;
        }
 
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_PROPERTY, WOM_TYPE_NESTPROPERTY );
+       }
+
        public function parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
                if ( !defined( 'SMW_VERSION' ) ) {
                        return null;
@@ -21,6 +25,26 @@
 
                $text = substr( $text, $offset );
 
+               global $smwgRecursivePropertyValues;
+
+               $inQuerystring = false;
+               $o = $parentObj;
+               do {
+                       if ( $o instanceof WOMQuerystringModel ) {
+                               $inQuerystring = true;
+                               break;
+                       }
+                       $o = $o->getParent();
+               } while ( $o != null );
+
+               if ( $inQuerystring || $smwgRecursivePropertyValues ) {
+                       $semanticPropPattern = '/^\[\[                 # 
Beginning of the link
+                                               (?:([^:][^][]*?):[=:]) # 
Property name (or a list of those)
+                                               /xu';
+                       if ( !preg_match( $semanticPropPattern, $text, $m ) ) 
return null;
+
+                       return array( 'len' => strlen( $m[0] ), 'obj' => new 
WOMNestPropertyModel( $m[1] ) );
+               }
                // copied from SemanticMediaWiki, 
includes/SMW_ParserExtensions.php
                // not deal with <nowiki>, could be bug here. SMW has the same 
bug
                // E.g., [[text::this <nowiki> is ]] </nowiki> not good]]
@@ -45,24 +69,6 @@
 //             }
                $r = preg_match( $semanticLinkPattern, $text, $m );
                if ( $r ) {
-                       $inQuerystring = false;
-                       $o = $parentObj;
-                       do {
-                               if ( $o instanceof WOMQuerystringModel ) {
-                                       $inQuerystring = true;
-                                       break;
-                               }
-                               $o = $o->getParent();
-                       } while ( $o != null );
-
-                       if ( $inQuerystring ) {
-                               $semanticPropPattern = '/\[\[                 # 
Beginning of the link
-                                                       (?:([^:][^][]*):[=:])+ 
# Property name (or a list of those)
-                                                       /xu';
-                               preg_match( $semanticPropPattern, $text, $m );
-                               return array( 'len' => strlen( $m[0] ), 'obj' 
=> new WOMNestPropertyModel( $m[1] ) );
-                       }
-
                        return array( 'len' => strlen( $m[0] ), 'obj' => new 
WOMPropertyModel( $m[1], $m[2], isset( $m[3] ) ? $m[3] : '' ) );
                }
                return null;

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyValueParser.php
===================================================================
--- 
trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyValueParser.php    
    2012-03-18 23:22:20 UTC (rev 114118)
+++ 
trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyValueParser.php    
    2012-03-19 00:35:20 UTC (rev 114119)
@@ -13,6 +13,10 @@
                $this->m_parserId = WOM_PARSER_ID_PROPERTY_VALUE;
        }
 
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_NESTPROPERTYVAL );
+       }
+
        public function parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
                if ( !( $parentObj instanceof WOMNestPropertyModel ) )
                        return null;

Added: trunk/extensions/WikiObjectModel/includes/parsers/WOMRedirectParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMRedirectParser.php     
                        (rev 0)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMRedirectParser.php     
2012-03-19 00:35:20 UTC (rev 114119)
@@ -0,0 +1,33 @@
+<?php
+/**
+ * @author Ning
+ *
+ * @file
+ * @ingroup WikiObjectModels
+ */
+
+class WOMRedirectParser extends WikiObjectModelParser {
+
+       public function __construct() {
+               parent::__construct();
+               $this->m_parserId = WOM_PARSER_ID_REDIRECT;
+       }
+
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_REDIRECT );
+       }
+
+       public function parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
+               if ( $offset != 0 ) return null;
+
+               $redirect = MagicWord::get( 'redirect' );
+               if ( !preg_match( '/^\s*(?:' . $redirect->getBaseRegex() . ')/' 
. $redirect->getRegexCase(), $text, $m ) )
+                       return null;
+               $len = strlen( $m[0] );
+               $text = substr( $text, $len );
+               if ( !preg_match( '/^\s*\[\[:?(.*?)(\|(.*?))*\]\]/', $text, $m 
) )
+                       return null;
+
+               return array( 'len' => $len + strlen( $m[0] ), 'obj' => new 
WOMRedirectModel( $m[1] ) );
+       }
+}

Modified: trunk/extensions/WikiObjectModel/includes/parsers/WOMSectionParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMSectionParser.php      
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMSectionParser.php      
2012-03-19 00:35:20 UTC (rev 114119)
@@ -15,6 +15,10 @@
                $this->m_parserId = WOM_PARSER_ID_SECTION;
        }
 
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_SECTION );
+       }
+
        public function parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
                $lastLF = ( $offset == 0 || $text { $offset - 1 } == "\n" );
                $text = substr( $text, $offset );

Modified: trunk/extensions/WikiObjectModel/includes/parsers/WOMTableParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMTableParser.php        
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMTableParser.php        
2012-03-19 00:35:20 UTC (rev 114119)
@@ -13,6 +13,10 @@
                $this->m_parserId = WOM_PARSER_ID_TABLE;
        }
 
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_TABLE );
+       }
+
        // FIXME: what if table style uses parser function which contains 
'return'
        public function parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
                $text = substr( $text, $offset );

Modified: trunk/extensions/WikiObjectModel/includes/parsers/WOMTblCellParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMTblCellParser.php      
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMTblCellParser.php      
2012-03-19 00:35:20 UTC (rev 114119)
@@ -13,6 +13,10 @@
                $this->m_parserId = WOM_PARSER_ID_TABLECELL;
        }
 
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_TBL_CELL );
+       }
+
        private function getFirstLineChar( $text, $offset ) {
                for ( $i = $offset; $i >= 0; --$i ) {
                        if ( $text { $i } == "\n" ) {

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMTemplateFieldHolderParser.php
===================================================================
--- 
trunk/extensions/WikiObjectModel/includes/parsers/WOMTemplateFieldHolderParser.php
  2012-03-18 23:22:20 UTC (rev 114118)
+++ 
trunk/extensions/WikiObjectModel/includes/parsers/WOMTemplateFieldHolderParser.php
  2012-03-19 00:35:20 UTC (rev 114119)
@@ -13,6 +13,10 @@
                $this->m_parserId = WOM_PARSER_ID_TEMPLATE_FIELD_HOLDER;
        }
 
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_TMPL_FIELD_HOLDER );
+       }
+
        public function parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
                $text = substr( $text, $offset );
                $r = preg_match( '/^(\{\{\{([^{|}]+))([|}])/', $text, $m );

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMTemplateParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMTemplateParser.php     
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMTemplateParser.php     
2012-03-19 00:35:20 UTC (rev 114119)
@@ -13,6 +13,10 @@
                $this->m_parserId = WOM_PARSER_ID_TEMPLATE;
        }
 
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_TEMPLATE );
+       }
+
        public function parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
                $text = substr( $text, $offset );
                $r = preg_match( '/^(\{\{([^{|}]+))([|}])/', $text, $m );

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WikiObjectModelParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WikiObjectModelParser.php 
2012-03-18 23:22:20 UTC (rev 114118)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WikiObjectModelParser.php 
2012-03-19 00:35:20 UTC (rev 114119)
@@ -53,6 +53,10 @@
                return array( 'len' => 1, 'obj' => new WOMTextModel( $text { 0 
} ) );
        }
 
+       public function getValidModelTypes() {
+               return array( WOM_TYPE_TEXT );
+       }
+
        // E.g.,
        // semantic property is extended from internal links
        // parser functions is extended from templates


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to