summaryrefslogtreecommitdiff
path: root/www/wiki/includes/content/WikitextContentHandler.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/includes/content/WikitextContentHandler.php')
-rw-r--r--www/wiki/includes/content/WikitextContentHandler.php163
1 files changed, 163 insertions, 0 deletions
diff --git a/www/wiki/includes/content/WikitextContentHandler.php b/www/wiki/includes/content/WikitextContentHandler.php
new file mode 100644
index 00000000..9c26ae15
--- /dev/null
+++ b/www/wiki/includes/content/WikitextContentHandler.php
@@ -0,0 +1,163 @@
+<?php
+/**
+ * Content handler for wiki text pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ */
+
+/**
+ * Content handler for wiki text pages.
+ *
+ * @ingroup Content
+ */
+class WikitextContentHandler extends TextContentHandler {
+
+ public function __construct( $modelId = CONTENT_MODEL_WIKITEXT ) {
+ parent::__construct( $modelId, [ CONTENT_FORMAT_WIKITEXT ] );
+ }
+
+ protected function getContentClass() {
+ return WikitextContent::class;
+ }
+
+ /**
+ * Returns a WikitextContent object representing a redirect to the given destination page.
+ *
+ * @param Title $destination The page to redirect to.
+ * @param string $text Text to include in the redirect, if possible.
+ *
+ * @return Content
+ *
+ * @see ContentHandler::makeRedirectContent
+ */
+ public function makeRedirectContent( Title $destination, $text = '' ) {
+ $optionalColon = '';
+
+ if ( $destination->getNamespace() == NS_CATEGORY ) {
+ $optionalColon = ':';
+ } else {
+ $iw = $destination->getInterwiki();
+ if ( $iw && Language::fetchLanguageName( $iw, null, 'mw' ) ) {
+ $optionalColon = ':';
+ }
+ }
+
+ $mwRedir = MagicWord::get( 'redirect' );
+ $redirectText = $mwRedir->getSynonym( 0 ) .
+ ' [[' . $optionalColon . $destination->getFullText() . ']]';
+
+ if ( $text != '' ) {
+ $redirectText .= "\n" . $text;
+ }
+
+ $class = $this->getContentClass();
+ return new $class( $redirectText );
+ }
+
+ /**
+ * Returns true because wikitext supports redirects.
+ *
+ * @return bool Always true.
+ *
+ * @see ContentHandler::supportsRedirects
+ */
+ public function supportsRedirects() {
+ return true;
+ }
+
+ /**
+ * Returns true because wikitext supports sections.
+ *
+ * @return bool Always true.
+ *
+ * @see ContentHandler::supportsSections
+ */
+ public function supportsSections() {
+ return true;
+ }
+
+ /**
+ * Returns true, because wikitext supports caching using the
+ * ParserCache mechanism.
+ *
+ * @since 1.21
+ *
+ * @return bool Always true.
+ *
+ * @see ContentHandler::isParserCacheSupported
+ */
+ public function isParserCacheSupported() {
+ return true;
+ }
+
+ /**
+ * Get file handler
+ * @return FileContentHandler
+ */
+ protected function getFileHandler() {
+ return new FileContentHandler();
+ }
+
+ public function getFieldsForSearchIndex( SearchEngine $engine ) {
+ $fields = parent::getFieldsForSearchIndex( $engine );
+
+ $fields['heading'] =
+ $engine->makeSearchFieldMapping( 'heading', SearchIndexField::INDEX_TYPE_TEXT );
+ $fields['heading']->setFlag( SearchIndexField::FLAG_SCORING );
+
+ $fields['auxiliary_text'] =
+ $engine->makeSearchFieldMapping( 'auxiliary_text', SearchIndexField::INDEX_TYPE_TEXT );
+
+ $fields['opening_text'] =
+ $engine->makeSearchFieldMapping( 'opening_text', SearchIndexField::INDEX_TYPE_TEXT );
+ $fields['opening_text']->setFlag(
+ SearchIndexField::FLAG_SCORING | SearchIndexField::FLAG_NO_HIGHLIGHT
+ );
+ // Until we have full first-class content handler for files, we invoke it explicitly here
+ $fields = array_merge( $fields, $this->getFileHandler()->getFieldsForSearchIndex( $engine ) );
+
+ return $fields;
+ }
+
+ public function getDataForSearchIndex(
+ WikiPage $page,
+ ParserOutput $parserOutput,
+ SearchEngine $engine
+ ) {
+ $fields = parent::getDataForSearchIndex( $page, $parserOutput, $engine );
+
+ $structure = new WikiTextStructure( $parserOutput );
+ $fields['heading'] = $structure->headings();
+ // text fields
+ $fields['opening_text'] = $structure->getOpeningText();
+ $fields['text'] = $structure->getMainText(); // overwrites one from ContentHandler
+ $fields['auxiliary_text'] = $structure->getAuxiliaryText();
+ $fields['defaultsort'] = $structure->getDefaultSort();
+
+ // Until we have full first-class content handler for files, we invoke it explicitly here
+ if ( NS_FILE == $page->getTitle()->getNamespace() ) {
+ $fields = array_merge( $fields,
+ $this->getFileHandler()->getDataForSearchIndex( $page, $parserOutput, $engine ) );
+ }
+ return $fields;
+ }
+
+}