00001 <?php
00017 class SRFArray extends SMWResultPrinter {
00018
00019 protected static $mDefaultSeps = array();
00020 protected $mSep;
00021 protected $mPropSep;
00022 protected $mManySep;
00023 protected $mRecordSep;
00024 protected $mHeaderSep;
00025 protected $mArrayName = null;
00026 protected $mShowPageTitles;
00027
00028 protected $mHideRecordGaps;
00029 protected $mHidePropertyGaps;
00030
00034 protected $mMainLabelHack = false;
00035
00036 public function __construct( $format, $inline, $useValidator = true ) {
00037 parent::__construct( $format, $inline, $useValidator );
00038
00039 $this->mLinkFirst = false;
00040 $this->mLinkOthers = false;
00041 }
00042
00043 public function getQueryMode($context) {
00044 return SMWQuery::MODE_INSTANCES;
00045 }
00046
00047 public function getName() {
00048 return wfMsg( 'srf_printername_' . $this->mFormat );
00049 }
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 protected function getResultText( SMWQueryResult $res, $outputmode ) {
00060
00061
00062
00063
00064
00065
00066 $perPage_items = array();
00067
00068
00069 while( $row = $res->getNext() ) {
00070 $perProperty_items = array();
00071
00077 $isPageTitle = !$this->mMainLabelHack;
00078
00079
00080 foreach( $row as $field ) {
00081 $manyValue_items = array();
00082 $isMissingProperty = false;
00083
00084 $manyValues = $field->getContent();
00085
00086
00087 if( empty( $manyValues ) ) {
00088 $delivery = $this->deliverMissingProperty( $field );
00089 $manyValue_items = $this->fillDeliveryArray( $manyValue_items, $delivery );
00090 $isMissingProperty = true;
00091 } else
00092
00093 while( $obj = $field->getNextDataValue() ) {
00094
00095 $value_items = array();
00096 $isRecord = false;
00097
00098
00099 if( $isPageTitle ) {
00100 if( ! $this->mShowPageTitles ) {
00101 $isPageTitle = false;
00102 continue 2;
00103 }
00104 $value_items = $this->fillDeliveryArray( $value_items, $this->deliverPageTitle( $obj, $this->mLinkFirst ) );
00105 }
00106
00107 elseif( $obj instanceof SMWRecordValue ) {
00108 $recordItems = $obj->getDataItems();
00109
00110 foreach( $recordItems as $dataItem ) {
00111 $recordField = $dataItem !== null ? SMWDataValueFactory::newDataItemValue( $dataItem, null ) : null;
00112 $value_items = $this->fillDeliveryArray( $value_items, $this->deliverRecordField( $recordField, $this->mLinkOthers ) );
00113 }
00114 $isRecord = true;
00115 }
00116
00117 else {
00118 $value_items = $this->fillDeliveryArray( $value_items, $this->deliverSingleValue( $obj, $this->mLinkOthers ) );
00119 }
00120 $delivery = $this->deliverSingleManyValuesData( $value_items, $isRecord, $isPageTitle );
00121 $manyValue_items = $this->fillDeliveryArray( $manyValue_items, $delivery );
00122 }
00123 $delivery = $this->deliverPropertiesManyValues( $manyValue_items, $isMissingProperty, $isPageTitle, $field );
00124 $perProperty_items = $this->fillDeliveryArray( $perProperty_items, $delivery );
00125 $isPageTitle = false;
00126 }
00127 $delivery = $this->deliverPageProperties( $perProperty_items );
00128 $perPage_items = $this->fillDeliveryArray( $perPage_items, $delivery );
00129 }
00130
00131 $output = $this->deliverQueryResultPages( $perPage_items );
00132
00133 return $output;
00134 }
00135
00136 protected function fillDeliveryArray( $array = array(), $value = null ) {
00137 if( ! is_null( $value ) ) {
00138 $array[] = $value;
00139 }
00140 return $array;
00141 }
00142
00143 protected function deliverPageTitle( $value, $link = false ) {
00144 return $this->deliverSingleValue( $value, $link );
00145 }
00146 protected function deliverRecordField( $value, $link = false ) {
00147 if( $value !== null )
00148 return $this->deliverSingleValue( $value, $link );
00149 elseif( $this->mHideRecordGaps )
00150 return null;
00151 else
00152 return '';
00153 }
00154 protected function deliverSingleValue( $value, $link = false ) {
00155
00156 return trim( Sanitizer::decodeCharReferences( $value->getShortWikiText( $link ) ) );
00157 }
00158
00159 protected function deliverMissingProperty( SMWResultArray $field ) {
00160 if( $this->mHidePropertyGaps )
00161 return null;
00162 else
00163 return '';
00165 }
00166
00167 protected function deliverSingleManyValuesData( $value_items, $containsRecord, $isPageTitle ) {
00168 if( empty( $value_items ) )
00169 return null;
00170 return implode( $this->mRecordSep, $value_items );
00171 }
00172 protected function deliverPropertiesManyValues( $manyValue_items, $isMissingProperty, $isPageTitle, SMWResultArray $data ) {
00173 if( empty( $manyValue_items ) )
00174 return null;
00175
00176 $text = implode( $this->mManySep, $manyValue_items );
00177
00178
00179 if( $this->mShowHeaders != SMW_HEADERS_HIDE && ! $isPageTitle ) {
00180 $linker = $this->mShowHeaders == SMW_HEADERS_PLAIN ? null : $this->mLinker;
00181 $text = $data->getPrintRequest()->getText( SMW_OUTPUT_WIKI, $linker ) . $this->mHeaderSep . $text;
00182 }
00183 return $text;
00184 }
00185 protected function deliverPageProperties( $perProperty_items ) {
00186 if( empty( $perProperty_items ) )
00187 return null;
00188 return implode( $this->mPropSep, $perProperty_items );
00189 }
00190 protected function deliverQueryResultPages( $perPage_items ) {
00191 if( $this->mArrayName !== null ) {
00192 $this->createArray( $perPage_items );
00193 return '';
00194 } else {
00195 return implode( $this->mSep, $perPage_items );
00196 }
00197 }
00198
00203 protected function createArray( $array ) {
00204 global $wgArrayExtension;
00205
00206 $arrayId = $this->mArrayName;
00207
00208 if( defined( 'ExtArrays::VERSION' ) ) {
00209
00210 global $wgParser;
00211 ExtArrays::get( $wgParser )->createArray( $arrayId, $array );
00212 return true;
00213 }
00214
00215
00216
00217 if( ! isset( $wgArrayExtension ) ) {
00218
00219 return false;
00220 }
00221 $version = null;
00222 if( defined( 'ArrayExtension::VERSION' ) ) {
00223 $version = ExtArrayExtension::VERSION;
00224 } elseif( defined( 'ExtArrayExtension::VERSION' ) ) {
00225 $version = ExtArrayExtension::VERSION;
00226 }
00227 if( $version !== null && version_compare( $version, '1.3.2', '>=' ) ) {
00228
00229 $wgArrayExtension->createArray( $arrayId, $array );
00230 } else {
00231
00232 $wgArrayExtension->mArrays[ trim( $arrayId ) ] = $array;
00233 }
00234 return true;
00235 }
00236
00237 protected function initializeCfgValue( $dfltVal, $dfltCacheKey ) {
00238 $cache = &self::$mDefaultSeps[ $dfltCacheKey ];
00239 if( ! isset( $cache ) ) {
00240 $cache = $this->getCfgSepText( $dfltVal );
00241 if( $cache === null ) {
00242
00243
00244 global $srfgArraySepTextualFallbacks;
00245 $cache = $srfgArraySepTextualFallbacks[ $dfltCacheKey ];
00246 }
00247 }
00248 return $cache;
00249 }
00250 protected function getCfgSepText( $obj ) {
00251 if( is_array( $obj ) ) {
00252
00253 if( ! array_key_exists( 0, $obj ) )
00254 return null;
00255
00256
00257 if( array_key_exists( 'args', $obj ) && is_array( $obj['args'] ) )
00258 $params = $obj['args'];
00259 else
00260 $params = array();
00261
00262
00263 $obj = Title::newFromText( $obj[0], ( array_key_exists( 1, $obj ) ? $obj[1] : NS_MAIN ) );
00264 }
00265 if( $obj instanceof Title ) {
00266 $article = new Article( $obj );
00267 } elseif( $obj instanceof Article ) {
00268 $article = obj;
00269 } else {
00270 return $obj;
00271 }
00272
00273 global $wgParser;
00274
00275
00276
00277
00278
00279 if( ! isset( $wgParser->mOptions ) ) {
00280
00281 return null;
00282 }
00283
00284
00285
00286
00287
00288 $frame = $wgParser->getPreprocessor()->newCustomFrame( $params );
00289 $text = $wgParser->preprocessToDom( $article->getRawText(), Parser::PTD_FOR_INCLUSION );
00290 $text = trim( $frame->expand( $text ) );
00291
00292 return $text;
00293 }
00294
00295 protected function handleParameters( array $params, $outputmode ) {
00296
00297 parent::handleParameters( $params, $outputmode );
00298
00299 $wgParser;
00300
00301
00302
00303 $this->mSep = $params['sep'];
00304 $this->mPropSep = $params['propsep'];
00305 $this->mManySep = $params['manysep'];
00306 $this->mRecordSep = $params['recordsep'];
00307 $this->mHeaderSep = $params['headersep'];
00308
00309
00310
00311 if( $params['name'] !== false && ( $this->mInline || trim( $params['name'] ) !== '' ) ) {
00312 $this->mArrayName = trim( $params['name'] );
00313 $this->createArray( array() );
00314 }
00315
00316
00317 $this->mMainLabelHack = trim( $params['mainlabel'] ) === '-';
00318
00319
00320 $this->mShowPageTitles = strtolower( $params['titles'] ) != 'hide';
00321
00322 switch( strtolower( $params['hidegaps'] ) ) {
00323 case 'none':
00324 $this->mHideRecordGaps = false;
00325 $this->mHidePropertyGaps = false;
00326 break;
00327 case 'all':
00328 $this->mHideRecordGaps = true;
00329 $this->mHidePropertyGaps = true;
00330 break;
00331 case 'property': case 'prop': case 'attribute': case 'attr':
00332 $this->mHideRecordGaps = false;
00333 $this->mHidePropertyGaps = true;
00334 break;
00335 case 'record': case 'rec': case 'rcrd': case 'n-ary': case 'nary':
00336 $this->mHideRecordGaps = true;
00337 $this->mHidePropertyGaps = false;
00338 break;
00339 }
00340 }
00341
00342 public function getParameters() {
00343 global $smwgQMaxInlineLimit;
00344
00345 $params = array();
00346 $dfltParams = SMWQueryProcessor::getParameters();
00347
00348 ### adjusted basic SMW params: ###
00349
00350 $params['limit'] = $dfltParams['limit'];
00351 $params['limit']->setDefault( $smwgQMaxInlineLimit );
00352
00353 $params['link'] = $dfltParams['link'];
00354 $params['link']->setDefault( 'none' );
00355
00356 $params['headers'] = $dfltParams['headers'];
00357 $params['headers']->setDefault( 'hide' );
00358
00359 ### new params: ###
00360
00361 $params['titles'] = new Parameter( 'titles' );
00362 $params['titles']->setMessage( 'srf_paramdesc_pagetitle' );
00363 $params['titles']->addCriteria( new CriterionInArray( 'show', 'hide' ) );
00364 $params['titles']->addAliases( 'pagetitle', 'pagetitles' );
00365 $params['titles']->setDefault( 'show' );
00366
00367 $params['hidegaps'] = new Parameter( 'hidegaps' );
00368 $params['hidegaps']->setMessage( 'srf_paramdesc_hidegaps' );
00369 $params['hidegaps']->addCriteria( new CriterionInArray( 'none', 'all', 'property', 'record' ) );
00370 $params['hidegaps']->setDefault( 'none' );
00371
00372 # name to create 'real' array with if set (empty string '' counts as set!):
00373 $params['name'] = new Parameter( 'name' );
00374 $params['name']->setMessage( 'srf_paramdesc_arrayname' );
00375 $params['name']->setDefault( false, false );
00376
00377 # separators (default values are defined in the following globals:)
00378 global $srfgArraySep, $srfgArrayPropSep, $srfgArrayManySep, $srfgArrayRecordSep, $srfgArrayHeaderSep;
00379
00380 $params['sep'] = new Parameter( 'sep' );
00381 $params['sep']->setMessage( 'smw_paramdesc_sep' );
00382 $params['sep']->setDefault( $this->initializeCfgValue( $srfgArraySep, 'sep' ) );
00383
00384 $params['propsep'] = new Parameter( 'propsep' );
00385 $params['propsep']->setMessage( 'srf_paramdesc_propsep' );
00386 $params['propsep']->setDefault( $this->initializeCfgValue( $srfgArrayPropSep, 'propsep' ) );
00387
00388 $params['manysep'] = new Parameter( 'manysep' );
00389 $params['manysep']->setMessage( 'srf_paramdesc_manysep' );
00390 $params['manysep']->setDefault( $this->initializeCfgValue( $srfgArrayManySep, 'manysep' ) );
00391
00392 $params['recordsep'] = new Parameter( 'recordsep' );
00393 $params['recordsep']->setMessage( 'srf_paramdesc_recordsep' );
00394 $params['recordsep']->addAliases( 'narysep', 'rcrdsep', 'recsep' );
00395 $params['recordsep']->setDefault( $this->initializeCfgValue( $srfgArrayRecordSep, 'recordsep' ) );
00396
00397 $params['headersep'] = new Parameter( 'headersep' );
00398 $params['headersep']->setMessage( 'srf_paramdesc_headersep' );
00399 $params['headersep']->addAliases( 'narysep', 'rcrdsep', 'recsep' );
00400 $params['headersep']->setDefault( $this->initializeCfgValue( $srfgArrayHeaderSep, 'headersep' ) );
00401
00402 return $params;
00403 }
00404 }
00405
00406 class SRFHash extends SRFArray {
00407 protected $mLastPageTitle;
00408
00409 protected function deliverPageTitle( $value, $link = false ) {
00410 $this->mLastPageTitle = $this->deliverSingleValue( $value, $link );
00411 return null;
00412 }
00413 protected function deliverPageProperties( $perProperty_items ) {
00414 if( count( $perProperty_items ) < 1 )
00415 return null;
00416 return array( $this->mLastPageTitle, implode( $this->mPropSep, $perProperty_items ) );
00417 }
00418 protected function deliverQueryResultPages( $perPage_items ) {
00419 $hash = array();
00420 foreach( $perPage_items as $page ) {
00421 $hash[ $page[0] ] = $page[1];
00422 }
00423 return parent::deliverQueryResultPages( $hash );
00424 }
00425
00426 protected function createArray( $hash ) {
00427 global $wgHashTables;
00428
00429 $hashId = $this->mArrayName;
00430 $version = null;
00431 if( defined( 'ExtHashTables::VERSION' ) ) {
00432 $version = ExtHashTables::VERSION;
00433 }
00434 if( $version !== null && version_compare( $version, '0.999', '>=' ) ) {
00435
00436 global $wgParser;
00437 ExtHashTables::get( $wgParser )->createHash( $hashId, $hash );
00438 }
00439 elseif( ! isset( $wgHashTables ) ) {
00440
00441 return false;
00442 }
00443 elseif( $version !== null && version_compare( $version, '0.6', '>=' ) ) {
00444
00445 $wgHashTables->createHash( $hashId, $hash );
00446 }
00447 else {
00448
00449 $wgHashTables->mHashTables[ trim( $hashId ) ] = $hash;
00450 }
00451 return true;
00452 }
00453
00454 protected function handleParameters( array $params, $outputmode ) {
00455 parent::handleParameters( $params, $outputmode );
00456 $this->mShowPageTitles = true;
00457 }
00458
00459 public function getParameters() {
00460 $params = parent::getParameters();
00461
00462 unset( $params['pagetitle'] );
00463 $params['name']->setMessage( 'srf_paramdesc_hashname' );
00464
00465 return $params;
00466 }
00467 }