private function doFormatFinalOutputFor($type, $linker)
 {
     $text = '';
     $languagecode = '';
     foreach ($this->dataValue->getPropertyDataItems() as $property) {
         // If we wanted to omit the language code display for some outputs then
         // this is the point to make it happen
         if (($type == self::HTML_LONG || $type == self::WIKI_SHORT) && $property->getKey() === '_LCODE') {
             //continue;
         }
         $dataItems = $this->dataValue->getDataItem()->getSemanticData()->getPropertyValues($property);
         // Should not happen but just in case
         if (!$dataItems === array()) {
             $this->dataValue->addErrorMsg('smw-datavalue-monolingual-dataitem-missing');
             continue;
         }
         $dataItem = reset($dataItems);
         if ($dataItem === false) {
             continue;
         }
         $dataValue = DataValueFactory::getInstance()->newDataValueByItem($dataItem, $property);
         $result = $this->findValueOutputFor($type, $dataValue, $linker);
         if ($property->getKey() === '_LCODE' && $type !== self::VALUE) {
             $languagecode = ' ' . Message::get(array('smw-datavalue-monolingual-lcode-parenthesis', $result));
         } elseif ($property->getKey() === '_LCODE' && $type === self::VALUE) {
             $languagecode = '@' . $result;
         } else {
             $text = $result;
         }
     }
     return $text . $languagecode;
 }
 /**
  * @since 2.5
  *
  * @return string
  */
 public function getForm()
 {
     $html = $this->htmlFormRenderer->setName('announce')->setMethod('get')->setActionUrl('https://wikiapiary.com/wiki/WikiApiary:Semantic_MediaWiki_Registry')->addHeader('h2', Message::get('smw_smwadmin_announce', Message::TEXT, Message::USER_LANGUAGE))->addParagraph(Message::get('smw_smwadmin_announce_text', Message::TEXT, Message::USER_LANGUAGE))->addSubmitButton(Message::get('smw_smwadmin_announce', Message::TEXT, Message::USER_LANGUAGE))->getForm();
     $html .= Html::element('p', array(), '');
     $html .= $this->htmlFormRenderer->setName('support')->addHeader('h2', Message::get('smw_smwadmin_support', Message::TEXT, Message::USER_LANGUAGE))->addParagraph(Message::get('smw_smwadmin_supportdocu', Message::TEXT, Message::USER_LANGUAGE))->addParagraph(Html::rawElement('ul', array(), Html::rawElement('li', array(), Message::get('smw_smwadmin_installfile', Message::TEXT, Message::USER_LANGUAGE)) . Html::rawElement('li', array(), Message::get('smw_smwadmin_smwhomepage', Message::TEXT, Message::USER_LANGUAGE)) . Html::rawElement('li', array(), Message::get('smw_smwadmin_mediazilla', Message::TEXT, Message::USER_LANGUAGE)) . Html::rawElement('li', array(), Message::get('smw_smwadmin_questions', Message::TEXT, Message::USER_LANGUAGE))))->getForm();
     return $html;
 }
 /**
  * @since 2.4
  *
  * @param Query $query
  *
  * @return Infolink
  */
 public static function get(Query $query)
 {
     $link = Infolink::newInternalLink('', ':Special:Ask', false, array());
     $params = self::getParameters($query);
     foreach ($params as $key => $param) {
         $link->setParameter($param, is_string($key) ? $key : false);
     }
     $link->setCaption(' ' . Message::get('smw_iq_moreresults', Message::TEXT, Message::USER_LANGUAGE));
     return $link;
 }
 /**
  * @see SpecialPage::execute
  */
 public function execute($query)
 {
     if (!$this->userCanExecute($this->getUser())) {
         // $this->mRestriction is private MW 1.23-
         throw new ExtendedPermissionsError('smw-admin', array('smw-smwadmin-permission-missing'));
     }
     $output = $this->getOutput();
     $output->setPageTitle(Message::get('smwadmin', Message::TEXT, Message::USER_LANGUAGE));
     $applicationFactory = ApplicationFactory::getInstance();
     $mwCollaboratorFactory = $applicationFactory->newMwCollaboratorFactory();
     $htmlFormRenderer = $mwCollaboratorFactory->newHtmlFormRenderer($this->getContext()->getTitle(), $this->getLanguage());
     $store = $applicationFactory->getStore();
     $connection = $store->getConnection('mw.db');
     $outputFormatter = new OutputFormatter($output);
     $dataRepairSection = new DataRepairSection($connection, $htmlFormRenderer, $outputFormatter);
     $dataRepairSection->enabledRefreshStore($applicationFactory->getSettings()->get('smwgAdminRefreshStore'));
     $linkSection = new LinkSection($htmlFormRenderer, $outputFormatter);
     $tableSchemaUpdaterSection = new TableSchemaUpdaterSection($store, $htmlFormRenderer, $outputFormatter);
     $tableSchemaUpdaterSection->enabledSetupStore($applicationFactory->getSettings()->get('smwgAdminSetupStore'));
     $idHandlerSection = new IdHandlerSection($connection, $htmlFormRenderer, $outputFormatter);
     $idHandlerSection->enabledIdDisposal($applicationFactory->getSettings()->get('smwgAdminIdDisposal'));
     $supportSection = new SupportSection($htmlFormRenderer);
     // Actions
     switch ($this->getRequest()->getText('action')) {
         case 'settings':
             return $linkSection->outputConfigurationList();
         case 'stats':
             return $linkSection->outputStatistics();
         case 'updatetables':
             return $tableSchemaUpdaterSection->doUpdate($this->getRequest());
         case 'idlookup':
             return $idHandlerSection->outputActionForm($this->getRequest(), $this->getUser());
         case 'refreshstore':
             return $dataRepairSection->doRefresh($this->getRequest());
     }
     // General intro
     $html = Message::get('smw_smwadmin_docu', Message::TEXT, Message::USER_LANGUAGE);
     $html .= $tableSchemaUpdaterSection->getForm();
     $html .= $dataRepairSection->getForm();
     $html .= $linkSection->getForm();
     $html .= $supportSection->getForm();
     $output->addHTML($html);
 }
 /**
  * @since 2.4
  *
  * @param string $msgKey
  */
 public function addErrorWithMsgKey($msgKey)
 {
     $this->errors[] = Message::encode(func_get_args());
 }
 /**
  * Apply structural restrictions to the current description.
  */
 public function applyRestrictions()
 {
     global $smwgQMaxSize, $smwgQMaxDepth, $smwgQConceptMaxSize, $smwgQConceptMaxDepth;
     if (!is_null($this->description)) {
         if ($this->isUsedInConcept) {
             $maxsize = $smwgQConceptMaxSize;
             $maxdepth = $smwgQConceptMaxDepth;
         } else {
             $maxsize = $smwgQMaxSize;
             $maxdepth = $smwgQMaxDepth;
         }
         $log = array();
         $this->description = $this->description->prune($maxsize, $maxdepth, $log);
         if (count($log) > 0) {
             $this->errors[] = Message::encode(array('smw_querytoolarge', str_replace('[', '[', implode(', ', $log))));
         }
     }
 }
 /**
  * Parse parameters and set internal properties
  *
  * @since 1.9
  *
  * @param array $parameters
  */
 private function parse(array $parameters)
 {
     // Initialize variables.
     $all_date_strings = array();
     $start_date = $end_date = $unit = $period = $week_num = null;
     $included_dates = array();
     $excluded_dates = array();
     $excluded_dates_jd = array();
     // Parse parameters and assign values
     foreach ($parameters as $name => $values) {
         foreach ($values as $value) {
             switch ($name) {
                 case 'property':
                     $this->property = $value;
                     break;
                 case 'start':
                     $start_date = DataValueFactory::getInstance()->newTypeIDValue('_dat', $value);
                     break;
                 case 'end':
                     $end_date = DataValueFactory::getInstance()->newTypeIDValue('_dat', $value);
                     break;
                 case 'limit':
                     // Override default limit with query specific limit
                     $this->defaultNumRecurringEvents = (int) $value;
                     break;
                 case 'unit':
                     $unit = $value;
                     break;
                 case 'period':
                     $period = (int) $value;
                     break;
                 case 'week number':
                     $week_num = (int) $value;
                     break;
                 case 'include':
                     // This is for compatibility only otherwise we break
                     // to much at once. Instead of writing include=...;...
                     // it should be include=...;...|+sep=; because the
                     // ParameterParser class is conditioned to split those
                     // parameter accordingly
                     if (strpos($value, ';')) {
                         $included_dates = explode(';', $value);
                     } else {
                         $included_dates[] = $value;
                     }
                     break;
                 case 'exclude':
                     // Some as above
                     if (strpos($value, ';')) {
                         $excluded_dates = explode(';', $value);
                     } else {
                         $excluded_dates[] = $value;
                     }
                     break;
                 default:
                     $this->parameters[$name][] = $value;
             }
         }
     }
     if ($start_date === null) {
         $this->errors[] = Message::get('smw-events-start-date-missing');
         return;
     } elseif (!$start_date->getDataItem() instanceof SMWDITime) {
         $this->setError($start_date->getErrors());
         return;
     }
     // Check property
     if (is_null($this->property)) {
         $this->errors[] = Message::get('smw-events-property-missing');
         return;
     }
     // Exclude dates
     foreach ($excluded_dates as $date_str) {
         $excluded_dates_jd[] = $this->getJulianDay(DataValueFactory::getInstance()->newTypeIDValue('_dat', $date_str));
     }
     // If the period is null, or outside of normal bounds, set it to 1.
     if (is_null($period) || $period < 1 || $period > 500) {
         $period = 1;
     }
     // Handle 'week number', but only if it's of unit 'month'.
     if ($unit == 'month' && !is_null($week_num)) {
         $unit = 'dayofweekinmonth';
         if ($week_num < -4 || $week_num > 5 || $week_num == 0) {
             $week_num = null;
         }
     }
     if ($unit == 'dayofweekinmonth' && is_null($week_num)) {
         $week_num = ceil($start_date->getDay() / 7);
     }
     // Get the Julian day value for both the start and end date.
     $end_date_jd = $this->getJulianDay($end_date);
     $cur_date = $start_date;
     $cur_date_jd = $this->getJulianDay($cur_date);
     $i = 0;
     do {
         $i++;
         $exclude_date = in_array($cur_date_jd, $excluded_dates_jd);
         if (!$exclude_date) {
             $all_date_strings[] = $cur_date->getLongWikiText();
         }
         // Now get the next date.
         // Handling is different depending on whether it's
         // month/year or week/day since the latter is a set
         // number of days while the former isn't.
         if ($unit === 'year' || $unit == 'month') {
             $cur_year = $cur_date->getYear();
             $cur_month = $cur_date->getMonth();
             $cur_day = $start_date->getDay();
             $cur_time = $cur_date->getTimeString();
             if ($unit == 'year') {
                 $cur_year += $period;
                 $display_month = $cur_month;
             } else {
                 // $unit === 'month'
                 $cur_month += $period;
                 $cur_year += (int) (($cur_month - 1) / 12);
                 $cur_month %= 12;
                 $display_month = $cur_month == 0 ? 12 : $cur_month;
             }
             // If the date is February 29, and this isn't
             // a leap year, change it to February 28.
             if ($cur_month == 2 && $cur_day == 29) {
                 if (!date('L', strtotime("{$cur_year}-1-1"))) {
                     $cur_day = 28;
                 }
             }
             $date_str = "{$cur_year}-{$display_month}-{$cur_day} {$cur_time}";
             $cur_date = DataValueFactory::getInstance()->newTypeIDValue('_dat', $date_str);
             $all_date_strings = array_merge($all_date_strings, $included_dates);
             $cur_date_jd = $cur_date->getDataItem()->getJD();
         } elseif ($unit == 'dayofweekinmonth') {
             // e.g., "3rd Monday of every month"
             $prev_month = $cur_date->getMonth();
             $prev_year = $cur_date->getYear();
             $new_month = ($prev_month + $period) % 12;
             if ($new_month == 0) {
                 $new_month = 12;
             }
             $new_year = $prev_year + floor(($prev_month + $period - 1) / 12);
             $cur_date_jd += 28 * $period - 7;
             // We're sometime before the actual date now -
             // keep incrementing by a week, until we get there.
             do {
                 $cur_date_jd += 7;
                 $cur_date = $this->getJulianDayTimeValue($cur_date_jd);
                 $right_month = $cur_date->getMonth() == $new_month;
                 if ($week_num < 0) {
                     $next_week_jd = $cur_date_jd;
                     do {
                         $next_week_jd += 7;
                         $next_week_date = $this->getJulianDayTimeValue($next_week_jd);
                         $right_week = $next_week_date->getMonth() != $new_month || $next_week_date->getYear() != $new_year;
                     } while (!$right_week);
                     $cur_date_jd = $next_week_jd + 7 * $week_num;
                     $cur_date = $this->getJulianDayTimeValue($cur_date_jd);
                 } else {
                     $cur_week_num = ceil($cur_date->getDay() / 7);
                     $right_week = $cur_week_num == $week_num;
                     if ($week_num == 5 && $cur_date->getMonth() % 12 == ($new_month + 1) % 12) {
                         $cur_date_jd -= 7;
                         $cur_date = $this->getJulianDayTimeValue($cur_date_jd);
                         $right_month = $right_week = true;
                     }
                 }
             } while (!$right_month || !$right_week);
         } else {
             // $unit == 'day' or 'week'
             // Assume 'day' if it's none of the above.
             $cur_date_jd += $unit === 'week' ? 7 * $period : $period;
             $cur_date = $this->getJulianDayTimeValue($cur_date_jd);
         }
         // should we stop?
         if (is_null($end_date)) {
             $reached_end_date = $i > $this->defaultNumRecurringEvents;
         } else {
             $reached_end_date = $cur_date_jd > $end_date_jd || $i > $this->maxNumRecurringEvents;
         }
     } while (!$reached_end_date);
     // Handle the 'include' dates as well.
     $all_date_strings = array_filter(array_merge($all_date_strings, $included_dates));
     // Set dates
     $this->dates = str_replace(' 00:00:00', '', $all_date_strings);
 }
 /**
  * Builds Html container
  *
  * Content that is being invoked has to be escaped
  * @see Highlighter::setContent
  *
  * @since 1.9
  *
  * @return string
  */
 private function getContainer()
 {
     $captionclass = $this->options['captionclass'];
     // 2.4+ can display context for user-defined properties, here we ensure
     // to keep the style otherwise it displays italic which is by convention
     // reserved for predefined properties
     if ($this->type === self::TYPE_PROPERTY && isset($this->options['userDefined'])) {
         $captionclass = $this->options['userDefined'] ? 'smwtext' : $captionclass;
     }
     $language = is_string($this->language) ? $this->language : Message::USER_LANGUAGE;
     return Html::rawElement('span', array('class' => 'smw-highlighter', 'data-type' => $this->options['type'], 'data-content' => isset($this->options['data-content']) ? $this->options['data-content'] : null, 'data-state' => $this->options['state'], 'data-title' => Message::get($this->options['title'], Message::TEXT, $language), 'title' => strip_tags(htmlspecialchars_decode(str_replace("[", "&#x005B;", $this->options['content'])))), Html::rawElement('span', array('class' => $captionclass), $this->options['caption']) . Html::rawElement('div', array('class' => 'smwttcontent'), $this->options['content']));
 }
 private function getListOfFormattedPropertyDataItems($type, $linker, $propertyDataItems)
 {
     $results = array();
     foreach ($propertyDataItems as $propertyDataItem) {
         $propertyValues = $this->dataValue->getDataItem()->getSemanticData()->getPropertyValues($propertyDataItem);
         $dataItem = reset($propertyValues);
         // By definition the first element in the list is the VALUE other
         // members are referencing to
         $isValue = $results === array();
         $dataValue = null;
         if ($dataItem !== false) {
             $dataValue = DataValueFactory::getInstance()->newDataValueByItem($dataItem, $propertyDataItem);
             $output = $this->findValueOutputFor($isValue, $type, $dataValue, $linker);
         } else {
             $output = '?';
         }
         // Return a plain value in case no linker object is available
         if ($dataValue !== null && $linker === null) {
             return array($dataValue->getWikiValue());
         }
         $dataValue = DataValueFactory::getInstance()->newDataValueByItem($propertyDataItem);
         // Tooltip in tooltip isn't expected to work therefore avoid them
         // when generating property labels in a reference output
         $dataValue->setOption(PropertyValue::OPT_NO_HIGHLIGHT, true);
         if (!$isValue && $type !== self::VALUE) {
             $output = Message::get(array('smw-datavalue-reference-outputformat', $dataValue->getShortHTMLText(smwfGetLinker()), $output), Message::TEXT);
         }
         $results[] = $output;
     }
     return $results;
 }
 private function parseFromJson($results)
 {
     if (!isset($results['@json']) || !isset($results['@json'][0])) {
         return $results;
     }
     // Restrict the depth to avoid resolving recursive assignment
     // that can not be handled beyond the 2:n
     $depth = 3;
     $params = json_decode($results['@json'][0], true, $depth);
     if ($params === null || json_last_error() !== JSON_ERROR_NONE) {
         $this->addError(Message::encode(array('smw-parser-invalid-json-format', ErrorCode::getStringFromJsonErrorCode(json_last_error()))));
         return $results;
     }
     array_walk($params, function (&$value, $key) {
         if ($value === '') {
             $value = array();
         }
         if (!is_array($value)) {
             $value = array($value);
         }
     });
     unset($results['@json']);
     return array_merge($results, $params);
 }
 private function constructErrorText($linker = null)
 {
     if (!$this->isValid() || $this->getDataItem() === array()) {
         return '';
     }
     $string = $this->getDataItem()->getString();
     $type = $linker !== null ? Message::PARSE : Message::TEXT;
     if (($message = Message::decode($string, $type, $this->getOptionBy(self::OPT_USER_LANGUAGE))) !== false) {
         return $message;
     }
     return $string;
 }
 protected function parseUserValue($value)
 {
     $value = trim($value);
     $this->m_wikitext = $value;
     if ($this->m_caption === false) {
         $this->m_caption = $this->m_wikitext;
     }
     $scheme = $hierpart = $query = $fragment = '';
     if ($value === '') {
         // do not accept empty strings
         $this->addErrorMsg(array('smw_emptystring'));
         return;
     }
     switch ($this->m_mode) {
         case SMW_URI_MODE_URI:
         case SMW_URI_MODE_ANNOURI:
             // Whether the the url value was externally encoded or not
             if (strpos($value, "%") === false) {
                 $this->showUrlContextInRawFormat = false;
             }
             // If somehow the slash was encoded bring into one format
             $value = str_replace("%2F", "/", $value);
             $parts = explode(':', $value, 2);
             // try to split "schema:rest"
             if (count($parts) == 1) {
                 // possibly add "http" as default
                 $value = 'http://' . $value;
                 $parts[1] = $parts[0];
                 $parts[0] = 'http';
             }
             // check against blacklist
             $uri_blacklist = explode("\n", Message::get('smw_uri_blacklist', Message::TEXT, Message::CONTENT_LANGUAGE));
             foreach ($uri_blacklist as $uri) {
                 $uri = trim($uri);
                 if ($uri !== '' && $uri == mb_substr($value, 0, mb_strlen($uri))) {
                     // disallowed URI!
                     $this->addErrorMsg(array('smw_baduri', $value));
                     return;
                 }
             }
             // decompose general URI components
             $scheme = $parts[0];
             $parts = explode('?', $parts[1], 2);
             // try to split "hier-part?queryfrag"
             if (count($parts) == 2) {
                 $hierpart = $parts[0];
                 $parts = explode('#', $parts[1], 2);
                 // try to split "query#frag"
                 $query = $parts[0];
                 $fragment = count($parts) == 2 ? $parts[1] : '';
             } else {
                 $query = '';
                 $parts = explode('#', $parts[0], 2);
                 // try to split "hier-part#frag"
                 $hierpart = $parts[0];
                 $fragment = count($parts) == 2 ? $parts[1] : '';
             }
             // We do not validate the URI characters (the data item will do this) but we do some escaping:
             // encode most characters, but leave special symbols as given by user:
             $hierpart = str_replace(array('%3A', '%2F', '%23', '%40', '%3F', '%3D', '%26', '%25'), array(':', '/', '#', '@', '?', '=', '&', '%'), rawurlencode($hierpart));
             $query = str_replace(array('%3A', '%2F', '%23', '%40', '%3F', '%3D', '%26', '%25'), array(':', '/', '#', '@', '?', '=', '&', '%'), rawurlencode($query));
             $fragment = str_replace(array('%3A', '%2F', '%23', '%40', '%3F', '%3D', '%26', '%25'), array(':', '/', '#', '@', '?', '=', '&', '%'), rawurlencode($fragment));
             /// NOTE: we do not support raw [ (%5D) and ] (%5E), although they are needed for ldap:// (but rarely in a wiki)
             /// NOTE: "+" gets encoded, as it is interpreted as space by most browsers when part of a URL;
             ///       this prevents tel: from working directly, but we have a datatype for this anyway.
             if (substr($hierpart, 0, 2) === '//') {
                 $hierpart = substr($hierpart, 2);
             }
             break;
         case SMW_URI_MODE_TEL:
             $scheme = 'tel';
             if (substr($value, 0, 4) === 'tel:') {
                 // accept optional "tel"
                 $value = substr($value, 4);
                 $this->m_wikitext = $value;
             }
             $hierpart = preg_replace('/(?<=[0-9]) (?=[0-9])/', '\\1-\\2', $value);
             $hierpart = str_replace(' ', '', $hierpart);
             if (substr($hierpart, 0, 2) == '00') {
                 $hierpart = '+' . substr($hierpart, 2);
             }
             if (!$this->getOptionBy(self::OPT_QUERY_CONTEXT) && (strlen(preg_replace('/[^0-9]/', '', $hierpart)) < 6 || preg_match('<[-+./][-./]>', $hierpart) || !self::isValidTelURI('tel:' . $hierpart))) {
                 /// TODO: introduce error-message for "bad" phone number
                 $this->addErrorMsg(array('smw_baduri', $this->m_wikitext));
                 return;
             }
             break;
         case SMW_URI_MODE_EMAIL:
             $scheme = 'mailto';
             if (strpos($value, 'mailto:') === 0) {
                 // accept optional "mailto"
                 $value = substr($value, 7);
                 $this->m_wikitext = $value;
             }
             if (!$this->getOptionBy(self::OPT_QUERY_CONTEXT) && !Sanitizer::validateEmail($value)) {
                 /// TODO: introduce error-message for "bad" email
                 $this->addErrorMsg(array('smw_baduri', $value));
                 return;
             }
             $hierpart = str_replace(array('%3A', '%2F', '%23', '%40', '%3F', '%3D', '%26', '%25'), array(':', '/', '#', '@', '?', '=', '&', '%'), rawurlencode($value));
     }
     // Now create the URI data item:
     try {
         $this->m_dataitem = new SMWDIUri($scheme, $hierpart, $query, $fragment, $this->m_typeid);
     } catch (SMWDataItemException $e) {
         $this->addErrorMsg(array('smw_baduri', $this->m_wikitext));
     }
 }
 private function doCreatePage($page, $namespace)
 {
     $pageContentLanguage = isset($page['contentlanguage']) ? $page['contentlanguage'] : '';
     if (isset($page['message-cache']) && $page['message-cache'] === 'clear') {
         Message::clear();
     }
     $name = isset($page['name']) ? $page['name'] : $page['page'];
     $title = Title::newFromText($name, $namespace);
     if ($namespace === NS_FILE && isset($page['contents']['upload'])) {
         return $this->doUploadFile($title, $page['contents']['upload']);
     }
     if (is_array($page['contents']) && isset($page['contents']['import-from'])) {
         $contents = $this->getFileContentsWithEncodingDetection($this->getTestCaseLocation() . $page['contents']['import-from']);
     } else {
         $contents = $page['contents'];
     }
     $this->pageCreator->createPage($title, $contents, $pageContentLanguage);
     $this->itemsMarkedForDeletion[] = $this->pageCreator->getPage();
     if (isset($page['move-to'])) {
         $this->doMovePage($page, $namespace);
     }
     if (isset($page['do-purge'])) {
         $this->pageCreator->getPage()->doPurge();
     }
     if (isset($page['do-delete']) && $page['do-delete']) {
         $this->pageDeleter->deletePage($title);
     }
 }
 public function testDecode()
 {
     $this->assertEquals(false, Message::decode('Foo'));
     $this->assertEquals('Foo', Message::decode('[2,"Foo"]'));
 }
 private function getPredefinedPropertyDescription($property, $linker, $languageCode)
 {
     $description = '';
     $key = $property->getKey();
     if (($msgKey = PropertyRegistry::getInstance()->findPropertyDescriptionMsgKeyById($key)) === '') {
         $msgKey = 'smw-pa-property-predefined' . strtolower($key);
     }
     if (!Message::exists($msgKey)) {
         return $description;
     }
     $dataValue = DataValueFactory::getInstance()->newDataValueByItem($property);
     $label = $dataValue->getFormattedLabel();
     $message = Message::get(array($msgKey, $label), $linker === null ? Message::ESCAPED : Message::PARSE, $languageCode);
     return $message;
 }
 private function getHtml($webRequest, $isEmptyRequest)
 {
     if ($isEmptyRequest) {
         return HtmlContentBuilder::getPageSearchQuickForm();
     }
     if (!$this->subjectDV->isValid()) {
         foreach ($this->subjectDV->getErrors() as $error) {
             $error = Message::decode($error);
         }
         $html = Html::rawElement('div', array('class' => 'smw-callout smw-callout-error'), Message::get(array('smw-browse-invalid-subject', $error), Message::ESCAPED));
         return $html . HtmlContentBuilder::getPageSearchQuickForm();
     }
     $htmlContentBuilder = $this->newHtmlContentBuilder($webRequest);
     if ($webRequest->getVal('output') === 'legacy' || !$htmlContentBuilder->getOption('byApi')) {
         return $htmlContentBuilder->getHtml();
     }
     $options = array('dir' => $htmlContentBuilder->getOption('dir'), 'offset' => $htmlContentBuilder->getOption('offset'), 'printable' => $htmlContentBuilder->getOption('printable'), 'showInverse' => $htmlContentBuilder->getOption('showInverse'), 'showAll' => $htmlContentBuilder->getOption('showAll'));
     // Ajax/API is doing the data fetch
     $html = Html::rawElement('div', array('class' => 'smwb-container', 'data-subject' => $this->subjectDV->getDataItem()->getHash(), 'data-options' => json_encode($options)), Html::rawElement('div', array('class' => 'smwb-status'), Html::rawElement('noscript', array(), Html::rawElement('div', array('class' => 'smw-callout smw-callout-error'), Message::get('smw-browse-js-disabled', Message::PARSE)))) . Html::rawElement('div', array('class' => 'smwb-content is-disabled'), Html::rawElement('span', array('class' => 'smw-overlay-spinner large inline')) . $htmlContentBuilder->getEmptyHtml()));
     return $html;
 }
 /**
  * Continuation of getResult that only gets executed for non file outputs.
  *
  * @since 1.6
  *
  * @param string $result
  * @param SMWQueryResult $results
  * @param integer $outputmode
  *
  * @return string
  */
 protected function handleNonFileResult($result, SMWQueryResult $results, $outputmode)
 {
     /**
      * @var \Parser $wgParser
      */
     global $wgParser;
     $result .= $this->getErrorString($results);
     // append errors
     // MW 1.21+
     // Block recursive import of annotations unless otherwise specified for
     // a specific use case
     if (method_exists($wgParser->getOutput(), 'setExtensionData')) {
         $wgParser->getOutput()->setExtensionData('smw-blockannotation', $this->params['format'] === 'embedded');
     }
     // Apply intro parameter
     if ($this->mIntro && $results->getCount() > 0) {
         if ($outputmode == SMW_OUTPUT_HTML) {
             $result = Message::get(array('smw-parse', $this->mIntro), Message::PARSE) . $result;
         } else {
             $result = $this->mIntro . $result;
         }
     }
     // Apply outro parameter
     if ($this->mOutro && $results->getCount() > 0) {
         if ($outputmode == SMW_OUTPUT_HTML) {
             $result = $result . Message::get(array('smw-parse', $this->mOutro), Message::PARSE);
         } else {
             $result = $result . $this->mOutro;
         }
     }
     // Preprocess embedded templates if needed
     if (!$this->isHTML && $this->hasTemplates) {
         if ($wgParser->getTitle() instanceof Title && $wgParser->getOptions() instanceof ParserOptions) {
             self::$mRecursionDepth++;
             if (self::$mRecursionDepth <= self::$maxRecursionDepth) {
                 // restrict recursion
                 $result = isset($this->params['import-annotation']) && $this->params['import-annotation'] ? $wgParser->recursivePreprocess($result) : '[[SMW::off]]' . $wgParser->replaceVariables($result) . '[[SMW::on]]';
             } else {
                 $result = '';
                 /// TODO: explain problem (too much recursive parses)
             }
             self::$mRecursionDepth--;
         } else {
             // not during parsing, no preprocessing needed, still protect the result
             $result = isset($this->params['import-annotation']) && $this->params['import-annotation'] ? $result : '[[SMW::off]]' . $result . '[[SMW::on]]';
         }
     }
     if ($this->isHTML && $outputmode == SMW_OUTPUT_WIKI) {
         $result = array($result, 'isHTML' => true);
     } elseif (!$this->isHTML && $outputmode == SMW_OUTPUT_HTML) {
         self::$mRecursionDepth++;
         // check whether we are in an existing parse, or if we should start a new parse for $wgTitle
         if (self::$mRecursionDepth <= self::$maxRecursionDepth) {
             // retrict recursion
             if ($wgParser->getTitle() instanceof Title && $wgParser->getOptions() instanceof ParserOptions) {
                 $result = $wgParser->recursiveTagParse($result);
             } else {
                 global $wgTitle;
                 $popt = new ParserOptions();
                 $popt->setEditSection(false);
                 $pout = $wgParser->parse($result . '__NOTOC__', $wgTitle, $popt);
                 /// NOTE: as of MW 1.14SVN, there is apparently no better way to hide the TOC
                 \SMWOutputs::requireFromParserOutput($pout);
                 $result = $pout->getText();
             }
         } else {
             $result = '';
             /// TODO: explain problem (too much recursive parses)
         }
         self::$mRecursionDepth--;
     }
     if (method_exists($wgParser->getOutput(), 'setExtensionData')) {
         $wgParser->getOutput()->setExtensionData('smw-blockannotation', false);
     }
     return $result;
 }
 private function getMessage($key, $type = Message::TEXT)
 {
     return Message::get($key, $type, Message::USER_LANGUAGE);
 }
 public function testGetInfolinkTextOnStringValueWithServiceLinks()
 {
     $service = 'testGetInfolinkTextOnStringValueWithServiceLinks';
     $this->cachedPropertyValuesPrefetcher->expects($this->atLeastOnce())->method('getPropertyValues')->will($this->returnValue(array($this->dataItemFactory->newDIBlob($service))));
     // Manipulating the Message cache is a hack!!
     $parameters = array("smw_service_" . $service, 'Bar');
     Message::getCache()->save(Message::getHash($parameters, Message::TEXT, Message::CONTENT_LANGUAGE), 'SERVICELINK-A|SERVICELINK-B');
     $stringValue = new StringValue('_txt');
     $stringValue->setOption(StringValue::OPT_USER_LANGUAGE, 'en');
     $stringValue->setOption(StringValue::OPT_CONTENT_LANGUAGE, 'en');
     $stringValue->setProperty($this->dataItemFactory->newDIProperty('Foo'));
     $stringValue->setUserValue('Bar');
     $instance = new InfoLinksProvider($stringValue);
     $this->assertContains('<div class="smwttcontent">&#x005B;SERVICELINK-B SERVICELINK-A]</div>', $instance->getInfolinkText(SMW_OUTPUT_WIKI));
     $this->assertContains('<div class="smwttcontent"><a href="SERVICELINK-B">SERVICELINK-A</a></div>', $instance->getInfolinkText(SMW_OUTPUT_HTML));
 }
 private function doHighlightText($text, $linker = null)
 {
     $content = '';
     if (!$this->canHighlight($content, $linker)) {
         return $text;
     }
     $highlighter = Highlighter::factory(Highlighter::TYPE_PROPERTY, $this->dataValue->getOptionBy(PropertyValue::OPT_USER_LANGUAGE));
     $highlighter->setContent(array('userDefined' => $this->dataValue->getDataItem()->isUserDefined(), 'caption' => $text, 'content' => $content !== '' ? $content : Message::get('smw_isspecprop')));
     return $highlighter->getHtml();
 }
 protected function addDataValuesToSubobject(ParserParameterProcessor $parserParameterProcessor)
 {
     // Named subobjects containing a "." in the first five characters are reserved to be
     // used by extensions only in order to separate them from user land and avoid having
     // them accidentally to refer to the same named ID
     // (i.e. different access restrictions etc.)
     if (strpos(mb_substr($parserParameterProcessor->getFirst(), 0, 5), '.') !== false) {
         return $this->parserData->addError(Message::encode(array('smw-subobject-parser-invalid-naming-scheme', $parserParameterProcessor->getFirst())));
     }
     list($parameters, $id) = $this->getParameters($parserParameterProcessor);
     $this->subobject->setEmptyContainerForId($id);
     $subject = $this->subobject->getSubject();
     foreach ($parameters as $property => $values) {
         if ($property === self::PARAM_SORTKEY) {
             $property = DIProperty::TYPE_SORTKEY;
         }
         if ($property === self::PARAM_CATEGORY) {
             $property = DIProperty::TYPE_CATEGORY;
         }
         foreach ($values as $value) {
             $dataValue = DataValueFactory::getInstance()->newDataValueByText($property, $value, false, $subject);
             $this->subobject->addDataValue($dataValue);
         }
     }
     $this->doAugmentSortKeyForWhenDisplayTitleIsAccessible($this->subobject->getSemanticData());
     return true;
 }
 /**
  * Messages are not resolved until the output and instead will be kept with the
  * message and argument keys (e.g. `[2,"smw_baduri","~*0123*"]`). This allows to
  * switch the a representation without requiring language context by the object
  * that reports an error.
  *
  * @since 2.4
  *
  * @param $parameters
  * @param integer|null $type
  * @param integer|null $language
  */
 public function addErrorMsg($parameters, $type = null)
 {
     $this->mErrors[] = Message::encode($parameters, $type);
     $this->mHasErrors = true;
 }
 /**
  * @since 2.5
  *
  * @param DataValue $dataValue
  *
  * @return DIContainer|null
  */
 public function getErrorContainerFromDataValue(DataValue $dataValue)
 {
     if ($dataValue->getErrors() === array()) {
         return null;
     }
     $property = $dataValue->getProperty();
     $hash = '';
     if ($property !== null) {
         $hash = $property->getKey();
     }
     $containerSemanticData = $this->newContainerSemanticData($hash);
     foreach ($dataValue->getErrors() as $error) {
         $this->addToContainerSemanticData($containerSemanticData, $property, Message::encode($error));
     }
     return new DIContainer($containerSemanticData);
 }
 private function getBooleanWordsFrom($msgKey, $languageCode = null)
 {
     $vals = explode(',', Message::get($msgKey, Message::TEXT, $languageCode));
     return $vals;
 }
 private function createParentLink()
 {
     return Html::rawElement('div', array('class' => 'smw-breadcrumb-link'), Html::rawElement('span', array('class' => 'smw-breadcrumb-arrow-right'), '') . Html::rawElement('a', array('href' => \SpecialPage::getTitleFor('SMWAdmin')->getFullURL()), Message::get('smwadmin', Message::TEXT, Message::USER_LANGUAGE)));
 }
 private function getPreferredLocalizedSeparator($custom, $standard, $language)
 {
     if ($this->options->has($custom) && ($separator = $this->options->get($custom)) !== false) {
         return $separator;
     }
     return Message::get($standard, Message::TEXT, $language);
 }
Beispiel #27
0
 private function registerMessageCallbackHandler()
 {
     Message::registerCallbackHandler(Message::TEXT, function ($arguments, $language) {
         if ($language === Message::CONTENT_LANGUAGE) {
             $language = Localizer::getInstance()->getContentLanguage();
         }
         if ($language === Message::USER_LANGUAGE) {
             $language = Localizer::getInstance()->getUserLanguage();
         }
         return call_user_func_array('wfMessage', $arguments)->inLanguage($language)->text();
     });
     Message::registerCallbackHandler(Message::ESCAPED, function ($arguments, $language) {
         if ($language === Message::CONTENT_LANGUAGE) {
             $language = Localizer::getInstance()->getContentLanguage();
         }
         if ($language === Message::USER_LANGUAGE) {
             $language = Localizer::getInstance()->getUserLanguage();
         }
         return call_user_func_array('wfMessage', $arguments)->inLanguage($language)->escaped();
     });
     Message::registerCallbackHandler(Message::PARSE, function ($arguments, $language) {
         if ($language === Message::CONTENT_LANGUAGE) {
             $language = Localizer::getInstance()->getContentLanguage();
         }
         if ($language === Message::USER_LANGUAGE) {
             $language = Localizer::getInstance()->getUserLanguage();
         }
         // 1.27+
         // [GlobalTitleFail] MessageCache::parse called by ... Message::parseText/MessageCache::parse with no title set.
         return call_user_func_array('wfMessage', $arguments)->inLanguage($language)->title($GLOBALS['wgTitle'])->parse();
     });
 }
 /**
  * A function to describe the allowed parameters of a query using
  * any specific format - most query printers should override this
  * function.
  *
  * @since 1.6.2, return element type changed in 1.8
  *
  * @return IParamDefinition[]
  */
 public static function getParameters()
 {
     $params = array();
     $allowedFormats = $GLOBALS['smwgResultFormats'];
     foreach ($GLOBALS['smwgResultAliases'] as $aliases) {
         $allowedFormats += $aliases;
     }
     $allowedFormats[] = 'auto';
     $params['format'] = array('type' => 'smwformat', 'default' => 'auto');
     // TODO $params['format']->setToLower( true );
     // TODO $allowedFormats
     $params['source'] = self::getSourceParam();
     $params['limit'] = array('type' => 'integer', 'default' => $GLOBALS['smwgQDefaultLimit'], 'negatives' => false);
     $params['offset'] = array('type' => 'integer', 'default' => 0, 'negatives' => false, 'upperbound' => $GLOBALS['smwgQUpperbound']);
     $params['link'] = array('default' => 'all', 'values' => array('all', 'subject', 'none'));
     $params['sort'] = array('islist' => true, 'default' => array(''));
     $params['order'] = array('islist' => true, 'default' => array(), 'values' => array('descending', 'desc', 'asc', 'ascending', 'rand', 'random'));
     $params['headers'] = array('default' => 'show', 'values' => array('show', 'hide', 'plain'));
     $params['mainlabel'] = array('default' => false);
     $params['intro'] = array('default' => '');
     $params['outro'] = array('default' => '');
     $params['searchlabel'] = array('default' => Message::get('smw_iq_moreresults', Message::TEXT, Message::USER_LANGUAGE));
     $params['default'] = array('default' => '');
     // Give grep a chance to find the usages:
     // smw-paramdesc-format, smw-paramdesc-source, smw-paramdesc-limit, smw-paramdesc-offset,
     // smw-paramdesc-link, smw-paramdesc-sort, smw-paramdesc-order, smw-paramdesc-headers,
     // smw-paramdesc-mainlabel, smw-paramdesc-intro, smw-paramdesc-outro, smw-paramdesc-searchlabel,
     // smw-paramdesc-default
     foreach ($params as $name => &$param) {
         if (is_array($param)) {
             $param['message'] = 'smw-paramdesc-' . $name;
         }
     }
     return ParamDefinition::getCleanDefinitions($params);
 }
 /**
  * Gets the contents for a table cell for all values of a property of a subject.
  *
  * @since 1.6.1
  *
  * @param SMWDataValue[] $dataValues
  * @param $outputMode
  * @param boolean $isSubject
  *
  * @return string
  */
 protected function getCellContent(array $dataValues, $outputMode, $isSubject)
 {
     $values = array();
     foreach ($dataValues as $dv) {
         // FILE parsing for HTML requested output (e.g. Special:Ask)
         if ($outputMode === SMW_OUTPUT_HTML && $dv->getDataItem() instanceof DIWikiPage && $dv->getDataItem()->getNamespace() === NS_FILE) {
             // Too lazy to handle the Parser object and besides the Message
             // parse does the job and ensures no other hook is executed
             $value = Message::get(array('smw-parse', $dv->getShortText(SMW_OUTPUT_WIKI, $this->getLinker($isSubject))), Message::PARSE);
         } else {
             $value = $dv->getShortText($outputMode, $this->getLinker($isSubject));
         }
         $values[] = $value === '' ? '&nbsp;' : $value;
     }
     return implode($this->params['sep'], $values);
 }