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

Revision: 106309
Author:   ning
Date:     2011-12-15 02:37:35 +0000 (Thu, 15 Dec 2011)
Log Message:
-----------
apply ask query to WOM

Modified Paths:
--------------
    trunk/extensions/WikiObjectModel/includes/WOM_Initialize.php
    trunk/extensions/WikiObjectModel/includes/WOM_Processor.php
    trunk/extensions/WikiObjectModel/includes/WOM_Setup.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/WOMTableParser.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/models/WOM_OM_NestProperty.php
    
trunk/extensions/WikiObjectModel/includes/models/WOM_OM_NestPropertyValue.php
    trunk/extensions/WikiObjectModel/includes/models/WOM_OM_QueryPrintout.php
    trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Querystring.php
    trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyValueParser.php

Modified: trunk/extensions/WikiObjectModel/includes/WOM_Initialize.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/WOM_Initialize.php        
2011-12-15 02:29:47 UTC (rev 106308)
+++ trunk/extensions/WikiObjectModel/includes/WOM_Initialize.php        
2011-12-15 02:37:35 UTC (rev 106309)
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Deprecated entry point, use WikiObjectModel/WikiObjectModel.php instead. 
+ * Deprecated entry point, use WikiObjectModel/WikiObjectModel.php instead.
  */
 
 include_once '../WikiObjectModel.php';
\ No newline at end of file

Modified: trunk/extensions/WikiObjectModel/includes/WOM_Processor.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/WOM_Processor.php 2011-12-15 
02:29:47 UTC (rev 106308)
+++ trunk/extensions/WikiObjectModel/includes/WOM_Processor.php 2011-12-15 
02:37:35 UTC (rev 106309)
@@ -206,7 +206,7 @@
                }
        }
 
-       private static function parseNext( $text, WikiObjectModelCollection 
$parentObj, WOMPageModel $rootObj, &$offset = 0, $parserInstance = null ) {
+       private static function parseNext( $text, WikiObjectModelCollection 
$parentObj, WOMPageModel $rootObj, &$offset = 0 ) {
 //             $fname = 'WikiObjectModel::parseNext (WOM)';
 //             wfProfileIn( $fname );
 
@@ -224,22 +224,23 @@
                        }
 
                        $result = null;
-                       if ( $parserInstance == null ) {
-                               $parserInstance2 = null;
+                       $parserId = self::getObjectParser( $parentObj 
)->getSubParserID( $parentObj );
+                       if ( $parserId == '' ) {
+                               $parserInstance = null;
                                foreach ( self::$parsers as $parser ) {
                                        $parser_res = $parser->parseNext( 
$text, $parentObj, $offset );
                                        if ( $parser_res == null ) continue;
-                                       if ( $parserInstance2 == null || 
$parser->subclassOf( $parserInstance2 ) ) {
-                                               $parserInstance2 = $parser;
+                                       if ( $parserInstance == null || 
$parser->subclassOf( $parserInstance ) ) {
+                                               $parserInstance = $parser;
                                                $result = $parser_res;
                                        }
                                }
-                               if ( $parserInstance2 == null ) {
-                                       $parserInstance2 = self::$base_parser;
-                                       $result = $parserInstance2->parseNext( 
$text, $parentObj, $offset );
+                               if ( $parserInstance == null ) {
+                                       $parserInstance = self::$base_parser;
+                                       $result = $parserInstance->parseNext( 
$text, $parentObj, $offset );
                                }
                        } else {
-                               $parserInstance2 = $parserInstance;
+                               $parserInstance = self::$parsers[$parserId];
                                $result = $parserInstance->parseNext( $text, 
$parentObj, $offset );
                                if ( $result == null ) {
                                        // FIXME: just omit current char, this 
will not fit for Wiki parser
@@ -265,15 +266,14 @@
 
                        if ( $next_obj->isCollection() && !( isset( 
$result['closed'] ) && $result['closed'] ) ) {
                                $collection_start = $offset;
-                               $d = self::parseNext( $text, $next_obj, 
$rootObj, $offset,
-                                       ( ( $parserInstance2 != null && isset( 
self::$parsers[$parserInstance2->getSubParserID()] ) ) ?
-                                       
self::$parsers[$parserInstance2->getSubParserID()] :
-                                       null ) );
-                               if ( $d == 100 && 
$parserInstance2->isObjectClosed( $next_obj, $text, $offset ) === false ) {
+                               $d = self::parseNext( $text, $next_obj, 
$rootObj, $offset );
+                               if ( $d == 100 && 
$parserInstance->isObjectClosed( $next_obj, $text, $offset ) === false ) {
                                        // rollback
-                                       $p = self::getObjectParser( $parentObj 
);
-                                       if ( $p != null && $p->isObjectClosed( 
$parentObj, $text, $offset ) === false ) {
-                                               return $d;
+                                       if ( ! ( $parentObj instanceof 
WOMPageModel ) ) {
+                                               $p = self::getObjectParser( 
$parentObj );
+                                               if ( $p != null && 
$p->isObjectClosed( $parentObj, $text, $offset ) === false ) {
+                                                       return $d;
+                                               }
                                        }
                                        $parentObj->rollback();
                                        $offset = $collection_start - 
$result['len'];
@@ -738,13 +738,12 @@
 
        public static function getValidText( $text, $parent, $wom ) {
                if ( $parent != null ) {
-                       $parserId = self::getObjectParser( $parent 
)->getSubParserID();
+                       $parserId = self::getObjectParser( $parent 
)->getSubParserID( $parent );
                        if ( $parserId != '' ) {
-                               $parser = self::$parsers[$parserId];
                                $offset = 0;
                                $p2 = clone ( $parent );
                                $p2->reset();
-                               self::parseNext( $text, $p2, $wom, $offset, 
$parser );
+                               self::parseNext( $text, $p2, $wom, $offset );
                                $text = '';
                                foreach ( $p2->getObjects() as $obj ) {
                                        $text .= $obj->getWikiText();

Modified: trunk/extensions/WikiObjectModel/includes/WOM_Setup.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/WOM_Setup.php     2011-12-15 
02:29:47 UTC (rev 106308)
+++ trunk/extensions/WikiObjectModel/includes/WOM_Setup.php     2011-12-15 
02:37:35 UTC (rev 106309)
@@ -14,9 +14,13 @@
 $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';
+$wgAutoloadClasses['WOMNestPropertyModel']     =  $wgOMIP . 
'/includes/models/WOM_OM_NestProperty.php';
+$wgAutoloadClasses['WOMNestPropertyValueModel'] =  $wgOMIP . 
'/includes/models/WOM_OM_NestPropertyValue.php';
 $wgAutoloadClasses['WOMTextModel']             =  $wgOMIP . 
'/includes/models/WOM_OM_Text.php';
 $wgAutoloadClasses['WOMLinkModel']             =  $wgOMIP . 
'/includes/models/WOM_OM_Link.php';
 $wgAutoloadClasses['WOMSectionModel']          =  $wgOMIP . 
'/includes/models/WOM_OM_Section.php';
@@ -34,11 +38,15 @@
 define( 'WOM_TYPE_CATEGORY'       , 'category' );
 define( 'WOM_TYPE_SECTION'        , 'section' );
 define( 'WOM_TYPE_PROPERTY'       , 'property' );
+define( 'WOM_TYPE_NESTPROPERTY'   , 'nest_property' );
+define( 'WOM_TYPE_NESTPROPERTYVAL', 'nest_property_value' );
 define( 'WOM_TYPE_LINK'           , 'link' );
 define( 'WOM_TYPE_TEXT'           , 'text' );
 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' );
@@ -56,6 +64,7 @@
 $wgAutoloadClasses['WOMCategoryParser']        =  $wgOMIP . 
'/includes/parsers/WOMCategoryParser.php';
 $wgAutoloadClasses['WOMLinkParser']            =  $wgOMIP . 
'/includes/parsers/WOMLinkParser.php';
 $wgAutoloadClasses['WOMPropertyParser']        =  $wgOMIP . 
'/includes/parsers/WOMPropertyParser.php';
+$wgAutoloadClasses['WOMPropertyValueParser']   =  $wgOMIP . 
'/includes/parsers/WOMPropertyValueParser.php';
 $wgAutoloadClasses['WOMSectionParser']         =  $wgOMIP . 
'/includes/parsers/WOMSectionParser.php';
 $wgAutoloadClasses['WOMTemplateParser']        =  $wgOMIP . 
'/includes/parsers/WOMTemplateParser.php';
 $wgAutoloadClasses['WOMParserFunctionParser']  =  $wgOMIP . 
'/includes/parsers/WOMParserFunctionParser.php';
@@ -72,6 +81,7 @@
 define( 'WOM_PARSER_ID_CATEGORY'       , 'category' );
 define( 'WOM_PARSER_ID_SECTION'        , 'section' );
 define( 'WOM_PARSER_ID_PROPERTY'       , 'property' );
+define( 'WOM_PARSER_ID_PROPERTY_VALUE' , 'property_val' );
 define( 'WOM_PARSER_ID_LINK'           , 'link' );
 define( 'WOM_PARSER_ID_TEXT'           , 'text' );
 define( 'WOM_PARSER_ID_TEMPLATE'       , 'template' );
@@ -91,6 +101,7 @@
                'WOMCategoryParser',
                'WOMLinkParser',
                'WOMPropertyParser',
+               'WOMPropertyValueParser',
                'WOMSectionParser',
                'WOMTemplateParser',
                'WOMParserFunctionParser',
@@ -109,11 +120,15 @@
        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,

Added: trunk/extensions/WikiObjectModel/includes/models/WOM_OM_NestProperty.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/models/WOM_OM_NestProperty.php    
                        (rev 0)
+++ trunk/extensions/WikiObjectModel/includes/models/WOM_OM_NestProperty.php    
2011-12-15 02:37:35 UTC (rev 106309)
@@ -0,0 +1,66 @@
+<?php
+/**
+ * This model implements Property models.
+ *
+ * @author Ning
+ * @file
+ * @ingroup WikiObjectModels
+ *
+ */
+
+class WOMNestPropertyModel extends WikiObjectModelCollection {
+       protected $m_property; // name
+       protected $m_user_property; // name
+
+       public function __construct( $property ) {
+               parent::__construct( WOM_TYPE_NESTPROPERTY );
+
+               if ( !defined( 'SMW_VERSION' ) ) {
+                       // MW hook will catch this exception
+                       throw new MWException( __METHOD__ . ": Property model 
is invalid. Please install 'SemanticMediaWiki extension' first." );
+               }
+
+               $user_property = SMWPropertyValue::makeUserProperty( $property 
);
+               if ( count ( $user_property->getErrors() ) > 0 ) {
+                       $user_property = SMWPropertyValue::makeUserProperty( 
'///NA///' );
+               } else {
+                       $property = '';
+               }
+
+               $this->m_user_property = $user_property;
+               $this->m_property = $property;
+       }
+
+       public function getProperty() {
+               return $this->m_user_property;
+       }
+
+       public function setProperty( $property ) {
+               $this->m_user_property = $property;
+       }
+
+       public function getPropertyName() {
+               return ( $this->m_property ) ? $this->m_property : 
$this->m_user_property->getWikiValue();
+       }
+
+       public function getWikiText() {
+               return 
"[[{$this->getPropertyName()}::{$this->getValueText()}]]";
+       }
+
+       public function getValueText() {
+               return parent::getWikiText();
+       }
+
+       public function setXMLAttribute( $key, $value ) {
+               if ( $value == '' ) throw new MWException( __METHOD__ . ": 
value cannot be empty" );
+
+               if ( $key == 'name' ) {
+                       $property = SMWPropertyValue::makeUserProperty( $value 
);
+               } else {
+                       throw new MWException( __METHOD__ . ": invalid 
key/value pair: name=property_name" );
+               }
+       }
+       protected function getXMLAttributes() {
+               return 'name="' . self::xml_entities( $this->getPropertyName() 
) . '"';
+       }
+}

Added: 
trunk/extensions/WikiObjectModel/includes/models/WOM_OM_NestPropertyValue.php
===================================================================
--- 
trunk/extensions/WikiObjectModel/includes/models/WOM_OM_NestPropertyValue.php   
                            (rev 0)
+++ 
trunk/extensions/WikiObjectModel/includes/models/WOM_OM_NestPropertyValue.php   
    2011-12-15 02:37:35 UTC (rev 106309)
@@ -0,0 +1,20 @@
+<?php
+/**
+ * This model implements Parameter / Template_field value models.
+ *
+ * @author Ning
+ * @file
+ * @ingroup WikiObjectModels
+ *
+ */
+
+class WOMNestPropertyValueModel extends WikiObjectModelCollection {
+
+       public function __construct() {
+               parent::__construct( WOM_TYPE_NESTPROPERTYVAL );
+       }
+
+       public function setXMLAttribute( $key, $value ) {
+               throw new MWException( __METHOD__ . ": no key/value pair 
required" );
+       }
+}

Added: trunk/extensions/WikiObjectModel/includes/models/WOM_OM_QueryPrintout.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/models/WOM_OM_QueryPrintout.php   
                        (rev 0)
+++ trunk/extensions/WikiObjectModel/includes/models/WOM_OM_QueryPrintout.php   
2011-12-15 02:37:35 UTC (rev 106309)
@@ -0,0 +1,62 @@
+<?php
+/**
+ * This model implements query printout models.
+ *
+ * @author Ning
+ * @file
+ * @ingroup WikiObjectModels
+ *
+ */
+
+class WOMQueryPrintoutModel extends WikiObjectModel {
+       protected $m_property;
+       protected $m_label;
+       protected $m_aggregation;
+
+       public function __construct( $property, $label = '', $aggregation = '' 
) {
+               parent::__construct( WOM_TYPE_QUERYPRINTOUT );
+               $this->m_property = $property;
+               $this->m_label = $label;
+
+               $this->m_aggregation = ( defined( 'SMW_AGGREGATION_VERSION' ) ? 
$aggregation : '' );
+       }
+
+       public function getProperty() {
+               return $this->m_property;
+       }
+
+       public function getLabel() {
+               return $this->m_label;
+       }
+
+       public function getAggregation() {
+               return $this->m_aggregation;
+       }
+
+       public function getWikiText() {
+               return '?' . $this->m_property .
+                       ( $this->m_aggregation == '' ? "" : ( '>' . 
$this->m_aggregation ) ) .
+                       ( $this->m_label == '' ? "" : ( '=' . $this->m_label ) 
) . '|';
+       }
+
+       public function setXMLAttribute( $key, $value ) {
+               if ( $value == '' ) throw new MWException( __METHOD__ . ": 
value cannot be empty" );
+
+               if ( $key == 'property' ) {
+                       $this->m_property = $value;
+               } elseif ( $key == 'label' ) {
+                       $this->m_label = $value;
+               } elseif ( defined( 'SMW_AGGREGATION_VERSION' ) && $key == 
'aggregation' ) {
+                       $this->m_aggregation = $value;
+               } else {
+                       throw new MWException( __METHOD__ . ": invalid 
key/value pair: property=property name, label=query label" .
+                               ( defined( 'SMW_AGGREGATION_VERSION' ) ? ", 
aggregation=agg_type" : "" ) );
+               }
+       }
+
+       protected function getXMLAttributes() {
+               return 'property="' . self::xml_entities( $this->m_property ) . 
'"' .
+                       ( $this->m_aggregation == '' ? "" : ( ' aggregation="' 
. self::xml_entities( $this->m_aggregation ) . '"' ) ) .
+                       ( $this->m_label == '' ? "" : ( ' label="' . 
self::xml_entities( $this->m_label ) . '"' ) );
+       }
+}

Added: trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Querystring.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Querystring.php     
                        (rev 0)
+++ trunk/extensions/WikiObjectModel/includes/models/WOM_OM_Querystring.php     
2011-12-15 02:37:35 UTC (rev 106309)
@@ -0,0 +1,29 @@
+<?php
+/**
+ * This model implements key value models.
+ *
+ * @author Ning
+ * @file
+ * @ingroup WikiObjectModels
+ *
+ */
+
+class WOMQuerystringModel extends WikiObjectModelCollection {
+
+       public function __construct() {
+               parent::__construct( WOM_TYPE_QUERYSTRING );
+       }
+
+       public function setXMLAttribute( $key, $value ) {
+               throw new MWException( __METHOD__ . ": no key/value pair 
required" );
+       }
+
+       public function getWikiText() {
+               return $this->getValueText() .
+                       '|';
+       }
+
+       public function getValueText() {
+               return parent::getWikiText();
+       }
+}

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMParameterParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMParameterParser.php    
2011-12-15 02:29:47 UTC (rev 106308)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMParameterParser.php    
2011-12-15 02:37:35 UTC (rev 106309)
@@ -13,12 +13,40 @@
                $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 parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
                if ( !( ( $parentObj instanceof WOMTemplateModel )
                        || ( $parentObj instanceof WOMParserFunctionModel ) ) )
                                return null;
 
                $text = substr( $text, $offset );
+
+               $ret = $this->parseAsk ( $text, $parentObj );
+               if ( $ret != null ) return $ret;
+
                $r = preg_match( '/^([^=|}]*)(\||=|\}|$)/', $text, $m );
                if ( !$r ) return null;
 
@@ -38,13 +66,19 @@
                }
        }
 
-       public function getSubParserID() {
+       public function getSubParserID( $obj ) {
+               if ( ( $obj instanceof WOMQuerystringModel )
+                       || ( $obj instanceof WOMQueryPrintoutModel ) )
+                               return '';
+
                return WOM_PARSER_ID_PARAM_VALUE;
        }
 
        public function isObjectClosed( $obj, $text, $offset ) {
                if ( !( ( $obj instanceof WOMTemplateFieldModel )
-                       || ( $obj instanceof WOMParameterModel ) ) )
+                       || ( $obj instanceof WOMParameterModel )
+                       || ( $obj instanceof WOMQuerystringModel )
+                       || ( $obj instanceof WOMQueryPrintoutModel ) ) )
                                return false;
 
                if ( ( strlen( $text ) >= $offset + 1 ) && $text { $offset } == 
'|' ) {

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMParserFunctionParser.php
===================================================================
--- 
trunk/extensions/WikiObjectModel/includes/parsers/WOMParserFunctionParser.php   
    2011-12-15 02:29:47 UTC (rev 106308)
+++ 
trunk/extensions/WikiObjectModel/includes/parsers/WOMParserFunctionParser.php   
    2011-12-15 02:37:35 UTC (rev 106309)
@@ -20,11 +20,22 @@
                if ( $r ) {
                        $len = strlen( $m[0] );
                        $func_key = trim( $m[1] );
+
                        return array( 'len' => $len, 'obj' => new 
WOMParserFunctionModel( $func_key ) );
                }
                return null;
        }
 
+       public function getSubParserID( $obj ) {
+//             if ( ( $obj instanceof WOMParserFunctionModel )
+//                     && ( strtolower( $obj->getFunctionKey() ) == 'ask' )
+//                     && ( count ( $obj->getObjects() ) == 0 ) ) {
+//
+//                     return WOM_PARSER_ID_QUERYSTRING;
+//             }
+               return WOM_PARSER_ID_PARAMETER;
+       }
+
        public function isObjectClosed( $obj, $text, $offset ) {
                if ( !$obj instanceof WOMParserFunctionModel ) return false;
 

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyParser.php     
2011-12-15 02:29:47 UTC (rev 106308)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyParser.php     
2011-12-15 02:37:35 UTC (rev 106309)
@@ -45,8 +45,42 @@
 //             }
                $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;
        }
+
+       public function getSubParserID( $obj ) {
+               return WOM_PARSER_ID_PROPERTY_VALUE;
+       }
+
+       public function isObjectClosed( $obj, $text, $offset ) {
+               if ( !$obj instanceof WOMNestPropertyModel ) return false;
+
+               if ( ( strlen( $text ) >= $offset + 2 )
+                       && $text { $offset } == ']'
+                       && $text { $offset + 1 } == ']' ) {
+                               return 2;
+               }
+
+               return false;
+       }
 }

Added: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyValueParser.php
===================================================================
--- 
trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyValueParser.php    
                            (rev 0)
+++ 
trunk/extensions/WikiObjectModel/includes/parsers/WOMPropertyValueParser.php    
    2011-12-15 02:37:35 UTC (rev 106309)
@@ -0,0 +1,36 @@
+<?php
+/**
+ * @author Ning
+ *
+ * @file
+ * @ingroup WikiObjectModels
+ */
+
+class WOMPropertyValueParser extends WikiObjectModelParser {
+
+       public function __construct() {
+               parent::__construct();
+               $this->m_parserId = WOM_PARSER_ID_PROPERTY_VALUE;
+       }
+
+       public function parseNext( $text, WikiObjectModelCollection $parentObj, 
$offset = 0 ) {
+               if ( !( $parentObj instanceof WOMNestPropertyModel ) )
+                       return null;
+
+               return array( 'len' => 0, 'obj' => new 
WOMNestPropertyValueModel() );
+       }
+
+       public function isObjectClosed( $obj, $text, $offset ) {
+               if ( !( $obj instanceof WOMNestPropertyValueModel ) )
+                       return false;
+
+               if ( ( strlen( $text ) >= $offset + 1 ) && $text { $offset } == 
'|' ) {
+                       return 1;
+               }
+               $parentClose = WOMProcessor::getObjectParser( $obj->getParent() 
)
+                       ->isObjectClosed( $obj->getParent(), $text, $offset );
+               if ( $parentClose !== false ) return 0;
+
+               return false;
+       }
+}

Modified: trunk/extensions/WikiObjectModel/includes/parsers/WOMTableParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMTableParser.php        
2011-12-15 02:29:47 UTC (rev 106308)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMTableParser.php        
2011-12-15 02:37:35 UTC (rev 106309)
@@ -26,7 +26,7 @@
                return array( 'len' => strlen( $m[1] ), 'obj' => new 
WOMTableModel( trim( $m[2] ) ) );
        }
 
-       public function getSubParserID() {
+       public function getSubParserID( $obj ) {
                return WOM_PARSER_ID_TABLECELL;
        }
 

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMTemplateFieldHolderParser.php
===================================================================
--- 
trunk/extensions/WikiObjectModel/includes/parsers/WOMTemplateFieldHolderParser.php
  2011-12-15 02:29:47 UTC (rev 106308)
+++ 
trunk/extensions/WikiObjectModel/includes/parsers/WOMTemplateFieldHolderParser.php
  2011-12-15 02:37:35 UTC (rev 106309)
@@ -25,7 +25,7 @@
                return null;
        }
 
-       public function getSubParserID() {
+       public function getSubParserID( $obj ) {
                return WOM_PARSER_ID_PARAM_VALUE;
        }
 

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WOMTemplateParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WOMTemplateParser.php     
2011-12-15 02:29:47 UTC (rev 106308)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WOMTemplateParser.php     
2011-12-15 02:37:35 UTC (rev 106309)
@@ -25,7 +25,7 @@
                return null;
        }
 
-       public function getSubParserID() {
+       public function getSubParserID( $obj ) {
                return WOM_PARSER_ID_PARAMETER;
        }
 

Modified: 
trunk/extensions/WikiObjectModel/includes/parsers/WikiObjectModelParser.php
===================================================================
--- trunk/extensions/WikiObjectModel/includes/parsers/WikiObjectModelParser.php 
2011-12-15 02:29:47 UTC (rev 106308)
+++ trunk/extensions/WikiObjectModel/includes/parsers/WikiObjectModelParser.php 
2011-12-15 02:37:35 UTC (rev 106309)
@@ -70,7 +70,7 @@
        }
 
        // specified next parser. e.g., template parser -> parameter parser
-       public function getSubParserID() { return ''; }
+       public function getSubParserID( $obj ) { return ''; }
 
        /**
         * Return a string that displays all error messages as a tooltip, or


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

Reply via email to