00001 <?php
00002
00015 class SMWDSVResultPrinter extends SMWResultPrinter {
00016
00017 protected $separator = ':';
00018 protected $fileName = 'result.dsv';
00019
00028 protected function handleParameters( array $params, $outputmode ) {
00029 parent::handleParameters( $params, $outputmode );
00030
00031
00032 if ( trim( $params['separator'] ) != '\\' ) {
00033 $this->separator = trim( $params['separator'] );
00034 }
00035
00036 $this->fileName = str_replace( ' ', '_', $params['filename'] );
00037 }
00038
00039 public function getMimeType( $res ) {
00040 return 'text/dsv';
00041 }
00042
00043 public function getFileName( $res ) {
00044 return $this->fileName;
00045 }
00046
00047 public function getQueryMode( $context ) {
00048 return ( $context == SMWQueryProcessor::SPECIAL_PAGE ) ? SMWQuery::MODE_INSTANCES : SMWQuery::MODE_NONE;
00049 }
00050
00051 public function getName() {
00052 return wfMsg( 'smw_printername_dsv' );
00053 }
00054
00055 protected function getResultText( SMWQueryResult $res, $outputmode ) {
00056 if ( $outputmode == SMW_OUTPUT_FILE ) {
00057 return $this->getResultFileContents( $res );
00058 }
00059 else {
00060 return $this->getLinkToFile( $res, $outputmode );
00061 }
00062 }
00063
00073 protected function getResultFileContents( SMWQueryResult $res ) {
00074 $lines = array();
00075
00076 if ( $this->mShowHeaders ) {
00077 $headerItems = array();
00078
00079 foreach ( $res->getPrintRequests() as $pr ) {
00080 $headerItems[] = $pr->getLabel();
00081 }
00082
00083 $lines[] = $this->getDSVLine( $headerItems );
00084 }
00085
00086
00087 while ( $row = $res->getNext() ) {
00088 $rowItems = array();
00089
00090
00091 foreach ( $row as $field ) {
00092 $itemSegments = array();
00093
00094
00095 while ( ( $object = $field->getNextDataValue() ) !== false ) {
00096 $itemSegments[] = Sanitizer::decodeCharReferences( $object->getWikiValue() );
00097 }
00098
00099
00100 $rowItems[] = implode( ',', $itemSegments );
00101 }
00102
00103 $lines[] = $this->getDSVLine( $rowItems );
00104 }
00105
00106 return implode( "\n", $lines );
00107 }
00108
00118 protected function getDSVLine( array $fields ) {
00119 return implode( $this->separator, array_map( array( $this, 'encodeDSV' ), $fields ) );
00120 }
00121
00131 protected function encodeDSV( $value ) {
00132
00133
00134
00135
00136
00137 return str_replace(
00138 array( '\n', '\r', '\t', '\b', '\f', '\\', $this->separator ),
00139 array( "\n", "\r", "\t", "\b", "\f", '\\\\', "\\$this->separator" ),
00140 $value
00141 );
00142 }
00143
00154 protected function getLinkToFile( SMWQueryResult $res, $outputmode ) {
00155 if ( $this->getSearchLabel( $outputmode ) ) {
00156 $label = $this->getSearchLabel( $outputmode );
00157 } else {
00158 $label = wfMsgForContent( 'smw_dsv_link' );
00159 }
00160
00161 $link = $res->getQueryLink( $label );
00162 $link->setParameter( 'dsv', 'format' );
00163 $link->setParameter( $this->separator, 'separator' );
00164 $link->setParameter( $this->fileName, 'filename' );
00165
00166 if ( array_key_exists( 'mainlabel', $this->m_params ) && $this->m_params['mainlabel'] !== false ) {
00167 $link->setParameter( $this->m_params['mainlabel'], 'mainlabel' );
00168 }
00169
00170 $link->setParameter( $this->mShowHeaders ? 'show' : 'hide', 'headers' );
00171
00172 if ( array_key_exists( 'limit', $this->m_params ) ) {
00173 $link->setParameter( $this->m_params['limit'], 'limit' );
00174 } else {
00175 $link->setParameter( 100, 'limit' );
00176 }
00177
00178
00179 $this->isHTML = ( $outputmode == SMW_OUTPUT_HTML );
00180 return $link->getText( $outputmode, $this->mLinker );
00181 }
00182
00183 public function getParameters() {
00184 $params = array_merge( parent::getParameters(), $this->exportFormatParameters() );
00185
00186 $params['separator'] = new Parameter( 'separator' );
00187 $params['separator']->setMessage( 'smw-paramdesc-dsv-separator' );
00188 $params['separator']->setDefault( $this->separator );
00189 $params['separator']->addAliases( 'sep' );
00190
00191 $params['filename'] = new Parameter( 'filename' );
00192 $params['filename']->setMessage( 'smw-paramdesc-dsv-filename' );
00193 $params['filename']->setDefault( $this->fileName );
00194
00195 return $params;
00196 }
00197
00198 }