diff options
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/DataValues/BooleanValue.php')
-rw-r--r-- | www/wiki/extensions/SemanticMediaWiki/src/DataValues/BooleanValue.php | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/DataValues/BooleanValue.php b/www/wiki/extensions/SemanticMediaWiki/src/DataValues/BooleanValue.php new file mode 100644 index 00000000..96813b07 --- /dev/null +++ b/www/wiki/extensions/SemanticMediaWiki/src/DataValues/BooleanValue.php @@ -0,0 +1,256 @@ +<?php + +namespace SMW\DataValues; + +use SMW\Localizer; +use SMW\Message; +use SMWDataItem as DataItem; +use SMWDataValue as DataValue; +use SMWDIBoolean as DIBoolean; + +/** + * This datavalue implements the handling of Boolean datavalues. + * + * @license GNU GPL v2+ + * @since 2.4 + * + * @author Markus Krötzsch + * @author mwjames + */ +class BooleanValue extends DataValue { + + /** + * The text to write for "true" if a custom output format was set. + * @var string + */ + protected $trueCaption; + + /** + * The text to write for "false" if a custom output format was set. + * @var string + */ + protected $falseCaption; + + /** + * @param string $typeid + */ + public function __construct( $typeid = '' ) { + parent::__construct( $typeid ); + } + + /** + * @see DataValue::parseUserValue + */ + protected function parseUserValue( $value ) { + + $value = trim( $value ); + + if ( $this->m_caption === false ) { + $this->m_caption = $value; + } + + $this->m_dataitem = new DIBoolean( + $this->doParseBoolValue( $value ) + ); + } + + /** + * @see DataValue::loadDataItem + * + * @param DataItem $dataItem + * + * @return boolean + */ + protected function loadDataItem( DataItem $dataItem ) { + + if ( $dataItem->getDIType() !== DataItem::TYPE_BOOLEAN ) { + return false; + } + + $this->m_dataitem = $dataItem; + $this->m_caption = $this->getStandardCaption( true ); + + return true; + } + + /** + * @see DataValue::setOutputFormat + */ + public function setOutputFormat( $formatstring ) { + + if ( $formatstring == $this->m_outformat ) { + return; + } + + unset( $this->trueCaption ); + unset( $this->falseCaption ); + + if ( $formatstring === '' ) { // no format + // (unsetting the captions is exactly the right thing here) + } elseif ( strtolower( $formatstring ) == '-' ) { // "plain" format + $this->trueCaption = 'true'; + $this->falseCaption = 'false'; + } elseif ( strtolower( $formatstring ) == 'num' ) { // "numeric" format + $this->trueCaption = 1; + $this->falseCaption = 0; + } elseif ( strtolower( $formatstring ) == 'tick' ) { // "tick" format + $this->trueCaption = '✓'; + $this->falseCaption = '✕'; + } elseif ( strtolower( $formatstring ) == 'x' ) { // X format + $this->trueCaption = '<span style="font-family: sans-serif; ">X</span>'; + $this->falseCaption = ' '; + } else { // format "truelabel, falselabel" (hopefully) + $captions = explode( ',', $formatstring, 2 ); + if ( count( $captions ) == 2 ) { // note: escaping needed to be safe; MW-sanitising would be an alternative + $this->trueCaption = \Sanitizer::removeHTMLtags( trim( $captions[0] ) ); + $this->falseCaption = \Sanitizer::removeHTMLtags( trim( $captions[1] ) ); + } // else: no format that is recognised, ignore + } + + // Localized version + if ( strpos( $formatstring, 'LOCL' ) !== false ) { + $this->setLocalizedCaptions( $formatstring ); + } + + $this->m_caption = $this->getStandardCaption( true ); + $this->m_outformat = $formatstring; + } + + /** + * @see DataValue::getShortWikiText + */ + public function getShortWikiText( $linker = null ) { + return $this->m_caption; + } + + /** + * @see DataValue::getShortHTMLText + */ + public function getShortHTMLText( $linker = null ) { + return $this->m_caption; + } + + /** + * @see DataValue::getLongWikiText + */ + public function getLongWikiText( $linker = null ) { + return $this->isValid() ? $this->getStandardCaption( true ) : $this->getErrorText(); + } + + /** + * @see DataValue::getLongHTMLText + */ + public function getLongHTMLText( $linker = null ) { + return $this->isValid() ? $this->getStandardCaption( true ) : $this->getErrorText(); + } + + /** + * @see DataValue::getWikiValue + */ + public function getWikiValue() { + return $this->getFirstBooleanCaptionFrom( + $this->isValid() && $this->m_dataitem->getBoolean() ? 'smw_true_words' : 'smw_false_words', + Message::CONTENT_LANGUAGE + ); + } + + /** + * @since 1.6 + * + * @return boolean + */ + public function getBoolean() { + return !$this->isValid() ? false : $this->m_dataitem->getBoolean(); + } + + /** + * Get text for displaying the value of this property, or false if not + * valid. + * @param $useformat bool, true if the output format should be used, false if the returned text should be parsable + * @return string + */ + protected function getStandardCaption( $useformat ) { + + if ( !$this->isValid() ) { + return false; + } + + if ( $useformat && ( isset( $this->trueCaption ) ) ) { + return $this->m_dataitem->getBoolean() ? $this->trueCaption : $this->falseCaption; + } + + return $this->getFirstBooleanCaptionFrom( + $this->m_dataitem->getBoolean() ? 'smw_true_words' : 'smw_false_words', + $this->getOption( 'content.language' ) + ); + } + + private function doParseBoolValue( $value ) { + + // Use either the global or page related content language + $contentLanguage = $this->getOption( 'content.language' ); + + $lcv = mb_strtolower( $value ); + $boolvalue = false; + + if ( $lcv === '1' ) { + $boolvalue = true; + } elseif ( $lcv === '0' ) { + $boolvalue = false; + } elseif ( in_array( $lcv, $this->getBooleanWordsFrom( 'smw_true_words', $contentLanguage, 'true' ), true ) ) { + $boolvalue = true; + } elseif ( in_array( $lcv, $this->getBooleanWordsFrom( 'smw_false_words', $contentLanguage, 'false' ), true ) ) { + $boolvalue = false; + } else { + $this->addErrorMsg( + [ 'smw_noboolean', $value ], + Message::TEXT, + Message::USER_LANGUAGE + ); + } + + return $boolvalue; + } + + private function setLocalizedCaptions( &$formatstring ) { + + if ( !( $languageCode = Localizer::getLanguageCodeFrom( $formatstring ) ) ) { + $languageCode = $this->getOption( 'user.language' ); + } + + $this->trueCaption = $this->getFirstBooleanCaptionFrom( + 'smw_true_words', + $languageCode + ); + + $this->falseCaption = $this->getFirstBooleanCaptionFrom( + 'smw_false_words', + $languageCode + ); + } + + private function getFirstBooleanCaptionFrom( $msgKey, $languageCode = null ) { + + $vals = $this->getBooleanWordsFrom( + $msgKey, + $languageCode + ); + + return reset( $vals ); + } + + private function getBooleanWordsFrom( $msgKey, $languageCode = null, $canonicalForm = null ) { + + $vals = explode( + ',', + Message::get( $msgKey, Message::TEXT, $languageCode ) + ); + + if ( $canonicalForm !== null ) { + $vals[] = $canonicalForm; + } + + return $vals; + } + +} |