From: jenkins-bot Date: Sun, 31 Jul 2016 05:03:13 +0000 (+0000) Subject: Merge "mw.Title: Use $wgIllegalFileChars for file title checking" X-Git-Tag: 1.31.0-rc.0~6213 X-Git-Url: http://git.cyclocoop.org/%7B%24www_url%7Dadmin/compta/pie.php?a=commitdiff_plain;h=239659fe4ce2f3e9872d9bc1b3f7b3ffcbfa7fb3;hp=b8a840974455ec58dfb395f30d6e6e54980856e0;p=lhc%2Fweb%2Fwiklou.git Merge "mw.Title: Use $wgIllegalFileChars for file title checking" --- diff --git a/RELEASE-NOTES-1.28 b/RELEASE-NOTES-1.28 index a20bec0299..41e94be634 100644 --- a/RELEASE-NOTES-1.28 +++ b/RELEASE-NOTES-1.28 @@ -36,6 +36,8 @@ production. * Added a new hook, 'UploadVerifyUpload', which can be used to reject a file upload. Unlike 'UploadVerifyFile' it provides information about upload comment and the file description page, but does not run for uploads to stash. +* (T141604) Extensions can now provide a better error message when their + maintenance scripts are run without the extension being installed. === External library changes in 1.28 === @@ -49,6 +51,13 @@ production. === Bug fixes in 1.28 === === Action API changes in 1.28 === +* Added 'maxarticlesize' property to action=query&meta=siteinfo which contains + the value of $wgMaxArticleSize. +* Property 'modulemessages' from action=parse&prop=modules was removed + (deprecated since 1.26). +* The following response properties from action=login, deprecated in 1.27, are + now removed: lgtoken, cookieprefix, sessionid. Clients should handle cookies + to properly manage session state. === Action API internal changes in 1.28 === * Added a new hook, 'ApiMakeParserOptions', to allow extensions to better @@ -75,6 +84,14 @@ changes to languages because of Phabricator reports. * The 'UserLoginComplete' hook has a new parameter to differentiate between actual login and visiting the login page while already logged in. * ResourceLoader::makeLoaderURL() was removed (deprecated since 1.24). +* $.fn.liveAndTestAtStart was removed (deprecated since 1.24). +* Linker::link() and Linker::linkKnown() were deprecated; please instead use + MediaWiki\Linker\LinkRenderer. In addition, the LinkBegin and LinkEnd hooks + were replaced by HtmlPageLinkRendererBegin and HtmlPageLinkRendererEnd + respectively. See docs/hooks.txt for the specific changes needed for those hooks. +* The 'ParserLimitReportFormat' hook was removed. +* Disabled "bug 2702" HTML tidying of parsed UI messages on wikis where Tidy is + disabled. == Compatibility == diff --git a/autoload.php b/autoload.php index 8c16adf5e4..5808040e41 100644 --- a/autoload.php +++ b/autoload.php @@ -755,7 +755,7 @@ $wgAutoloadLocalClasses = [ 'LonelyPagesPage' => __DIR__ . '/includes/specials/SpecialLonelypages.php', 'LongPagesPage' => __DIR__ . '/includes/specials/SpecialLongpages.php', 'MIMEsearchPage' => __DIR__ . '/includes/specials/SpecialMIMEsearch.php', - 'MWCallableUpdate' => __DIR__ . '/includes/deferred/CallableUpdate.php', + 'MWCallableUpdate' => __DIR__ . '/includes/deferred/MWCallableUpdate.php', 'MWContentSerializationException' => __DIR__ . '/includes/content/ContentHandler.php', 'MWCryptHKDF' => __DIR__ . '/includes/utils/MWCryptHKDF.php', 'MWCryptHash' => __DIR__ . '/includes/utils/MWCryptHash.php', diff --git a/composer.json b/composer.json index 54eb3c03d6..1bd3d4c5a4 100644 --- a/composer.json +++ b/composer.json @@ -45,7 +45,7 @@ }, "require-dev": { "jakub-onderka/php-parallel-lint": "0.9.2", - "justinrainbow/json-schema": "~1.3", + "justinrainbow/json-schema": "~1.6", "mediawiki/mediawiki-codesniffer": "0.7.2", "monolog/monolog": "~1.18.2", "nikic/php-parser": "1.4.1", diff --git a/docs/extension.schema.json b/docs/extension.schema.json index 14a9731198..110e99d4e6 100644 --- a/docs/extension.schema.json +++ b/docs/extension.schema.json @@ -625,6 +625,11 @@ "capitallinkoverride": { "type": "boolean", "description": "Set $wgCapitalLinks on a per-namespace basis" + }, + "conditional": { + "type": "boolean", + "description": "Whether the namespace is conditional upon configuration and should not be registered (requires separate registration via a hook)", + "default": false } }, "required": ["id", "constant", "name"] @@ -867,6 +872,7 @@ "description": "Configuration options for this extension", "patternProperties": { "^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": { + "type": "object", "properties": { "value": { "required": true @@ -881,6 +887,11 @@ ], "default": "array_merge" }, + "path": { + "description": "Whether this should be interpreted as a filesystem path, relative to extension directory root", + "type": "boolean", + "default": false + }, "description": { "type": ["string", "array"], "description": "A description of the config setting, mostly for documentation/developers" diff --git a/docs/extension.schema.v1.json b/docs/extension.schema.v1.json index 893facfd7a..37235e93ab 100644 --- a/docs/extension.schema.v1.json +++ b/docs/extension.schema.v1.json @@ -615,6 +615,11 @@ "capitallinkoverride": { "type": "boolean", "description": "Set $wgCapitalLinks on a per-namespace basis" + }, + "conditional": { + "type": "boolean", + "description": "Whether the namespace is conditional upon configuration and should not be registered (requires separate registration via a hook)", + "default": false } }, "required": ["id", "constant", "name"] diff --git a/docs/hooks.txt b/docs/hooks.txt index e1b397472d..57240c98f9 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -2360,24 +2360,12 @@ cache or return false to not use it. &$parser: Parser object &$varCache: variable cache (array) -'ParserLimitReport': DEPRECATED! Use ParserLimitReportPrepare and -ParserLimitReportFormat instead. +'ParserLimitReport': DEPRECATED! Use ParserLimitReportPrepare instead. Called at the end of Parser:parse() when the parser will include comments about size of the text parsed. $parser: Parser object &$limitReport: text that will be included (without comment tags) -'ParserLimitReportFormat': Called for each row in the parser limit report that -needs formatting. If nothing handles this hook, the default is to use "$key" to -get the label, and "$key-value" or "$key-value-text"/"$key-value-html" to -format the value. -$key: Key for the limit report item (string) -&$value: Value of the limit report item -&$report: String onto which to append the data -$isHTML: If true, $report is an HTML table with two columns; if false, it's - text intended for display in a monospaced font. -$localize: If false, $report should be output in English. - 'ParserLimitReportPrepare': Called at the end of Parser:parse() when the parser will include comments about size of the text parsed. Hooks should use $output->setLimitReportData() to populate data. Functions for this hook should diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index 883b8a32c1..8dc7d4094a 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -81,18 +81,6 @@ class AutoLoader { require $filename; } - /** - * Force a class to be run through the autoloader, helpful for things like - * Sanitizer that have define()s outside of their class definition. Of course - * this wouldn't be necessary if everything in MediaWiki was class-based. Sigh. - * - * @param string $class - * @return bool Return the results of class_exists() so we know if we were successful - */ - static function loadClass( $class ) { - return class_exists( $class ); - } - /** * Method to clear the protected class property $autoloadLocalClassesLower. * Used in tests. diff --git a/includes/CategoryViewer.php b/includes/CategoryViewer.php index 8dd3f5c516..490f548135 100644 --- a/includes/CategoryViewer.php +++ b/includes/CategoryViewer.php @@ -407,11 +407,26 @@ class CategoryViewer extends ContextSource { return $r; } + /** + * Return pretty name which is display name if given and different from prefix text or + * the unprefixed page name. + * + * @return string HTML safe name. + */ + function getPrettyPageNameHtml() { + $displayTitle = $this->getOutput()->getPageTitle(); + if ( $displayTitle === $this->getTitle()->getPrefixedText() ) { + return htmlspecialchars( $this->getTitle()->getText() ); + } else { + return $displayTitle; + } + } + /** * @return string */ function getPagesSection() { - $ti = wfEscapeWikiText( $this->title->getText() ); + $name = $this->getPrettyPageNameHtml(); # Don't show articles section if there are none. $r = ''; @@ -427,7 +442,7 @@ class CategoryViewer extends ContextSource { if ( $rescnt > 0 ) { $r = "
\n"; - $r .= '

' . $this->msg( 'category_header', $ti )->parse() . "

\n"; + $r .= '

' . $this->msg( 'category_header' )->rawParams( $name )->parse() . "

\n"; $r .= $countmsg; $r .= $this->getSectionPagingLinks( 'page' ); $r .= $this->formatList( $this->articles, $this->articles_start_char ); @@ -441,6 +456,7 @@ class CategoryViewer extends ContextSource { * @return string */ function getImageSection() { + $name = $this->getPrettyPageNameHtml(); $r = ''; $rescnt = $this->showGallery ? $this->gallery->count() : count( $this->imgsNoGallery ); $dbcnt = $this->cat->getFileCount(); @@ -450,10 +466,7 @@ class CategoryViewer extends ContextSource { if ( $rescnt > 0 ) { $r .= "
\n"; $r .= '

' . - $this->msg( - 'category-media-header', - wfEscapeWikiText( $this->title->getText() ) - )->text() . + $this->msg( 'category-media-header' )->rawParams( $name )->parse() . "

\n"; $r .= $countmsg; $r .= $this->getSectionPagingLinks( 'file' ); diff --git a/includes/EditPage.php b/includes/EditPage.php index 362f905fd4..674cf2874e 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -260,9 +260,6 @@ class EditPage { /** @var bool */ public $tooBig = false; - /** @var bool */ - public $kblength = false; - /** @var bool */ public $missingComment = false; @@ -396,6 +393,9 @@ class EditPage { /** @var bool */ protected $edit; + /** @var bool|int */ + protected $contentLength = false; + /** * @var bool Set in ApiEditPage, based on ContentHandler::allowsDirectApiEditing */ @@ -1774,8 +1774,8 @@ class EditPage { return $status; } - $this->kblength = (int)( strlen( $this->textbox1 ) / 1024 ); - if ( $this->kblength > $wgMaxArticleSize ) { + $this->contentLength = strlen( $this->textbox1 ); + if ( $this->contentLength > $wgMaxArticleSize * 1024 ) { // Error will be displayed by showEditForm() $this->tooBig = true; $status->setResult( false, self::AS_CONTENT_TOO_BIG ); @@ -2062,8 +2062,8 @@ class EditPage { } // Check for length errors again now that the section is merged in - $this->kblength = (int)( strlen( $this->toEditText( $content ) ) / 1024 ); - if ( $this->kblength > $wgMaxArticleSize ) { + $this->contentLength = strlen( $this->toEditText( $content ) ); + if ( $this->contentLength > $wgMaxArticleSize * 1024 ) { $this->tooBig = true; $status->setResult( false, self::AS_MAX_ARTICLE_SIZE_EXCEEDED ); return $status; @@ -2968,15 +2968,15 @@ class EditPage { 'wrap' => "
\n$1
" ] ); } - if ( $this->kblength === false ) { - $this->kblength = (int)( strlen( $this->textbox1 ) / 1024 ); + if ( $this->contentLength === false ) { + $this->contentLength = strlen( $this->textbox1 ); } - if ( $this->tooBig || $this->kblength > $wgMaxArticleSize ) { + if ( $this->tooBig || $this->contentLength > $wgMaxArticleSize * 1024 ) { $wgOut->wrapWikiMsg( "
\n$1\n
", [ 'longpageerror', - $wgLang->formatNum( $this->kblength ), + $wgLang->formatNum( round( $this->contentLength / 1024, 3 ) ), $wgLang->formatNum( $wgMaxArticleSize ) ] ); @@ -3536,13 +3536,12 @@ HTML if ( Hooks::run( 'EditPageBeforeConflictDiff', [ &$this, &$wgOut ] ) ) { $stats = $wgOut->getContext()->getStats(); $stats->increment( 'edit.failures.conflict' ); - if ( $this->mTitle->isTalkPage() ) { - $stats->increment( 'edit.failures.conflict.byType.talk' ); - } else { - $stats->increment( 'edit.failures.conflict.byType.subject' ); - } - if ( $this->mTitle->getNamespace() === NS_PROJECT ) { - $stats->increment( 'edit.failures.conflict.byNamespace.project' ); + // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics + if ( + $this->mTitle->getNamespace() >= NS_MAIN && + $this->mTitle->getNamespace() <= NS_CATEGORY_TALK + ) { + $stats->increment( 'edit.failures.conflict.byNamespaceId.' . $this->mTitle->getNamespace() ); } $wgOut->wrapWikiMsg( '

$1

', "yourdiff" ); diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index e262c8138d..e19c36c1a4 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -222,17 +222,17 @@ function wfAppendToArrayIfNotDefault( $key, $value, $default, &$changed ) { * Merge arrays in the style of getUserPermissionsErrors, with duplicate removal * e.g. * wfMergeErrorArrays( - * array( array( 'x' ) ), - * array( array( 'x', '2' ) ), - * array( array( 'x' ) ), - * array( array( 'y' ) ) + * [ [ 'x' ] ], + * [ [ 'x', '2' ] ], + * [ [ 'x' ] ], + * [ [ 'y' ] ] * ); * returns: - * array( - * array( 'x', '2' ), - * array( 'x' ), - * array( 'y' ) - * ) + * [ + * [ 'x', '2' ], + * [ 'x' ], + * [ 'y' ] + * ] * * @param array $array1,... * @return array @@ -827,7 +827,7 @@ function wfParseUrl( $url ) { $bits = parse_url( $url ); MediaWiki\restoreWarnings(); // parse_url() returns an array without scheme for some invalid URLs, e.g. - // parse_url("%0Ahttp://example.com") == array( 'host' => '%0Ahttp', 'path' => 'example.com' ) + // parse_url("%0Ahttp://example.com") == [ 'host' => '%0Ahttp', 'path' => 'example.com' ] if ( !$bits || !isset( $bits['scheme'] ) ) { return false; } diff --git a/includes/Linker.php b/includes/Linker.php index 1979e44fbc..5e540b9c03 100644 --- a/includes/Linker.php +++ b/includes/Linker.php @@ -170,6 +170,7 @@ class Linker { * link() replaces the old functions in the makeLink() family. * * @since 1.18 Method exists since 1.16 as non-static, made static in 1.18. + * @deprecated since 1.28, use MediaWiki\Linker\LinkRenderer instead * * @param Title $target Can currently only be a Title, but this may * change to support Images, literal URLs, etc. @@ -245,7 +246,9 @@ class Linker { /** * Identical to link(), except $options defaults to 'known'. + * * @since 1.16.3 + * @deprecated since 1.28, use MediaWiki\Linker\LinkRenderer instead * @see Linker::link * @return string */ diff --git a/includes/MovePage.php b/includes/MovePage.php index 708dea1fc9..70b6738773 100644 --- a/includes/MovePage.php +++ b/includes/MovePage.php @@ -392,11 +392,16 @@ class MovePage { $reason, $nullRevision ]; - $dbw->onTransactionIdle( function () use ( $params, $dbw ) { - // Keep each single hook handler atomic - $dbw->setFlag( DBO_TRX ); // flag is automatically reset by DB layer - Hooks::run( 'TitleMoveComplete', $params ); - } ); + // Keep each single hook handler atomic + DeferredUpdates::addUpdate( + new AtomicSectionUpdate( + $dbw, + __METHOD__, + function () use ( $params ) { + Hooks::run( 'TitleMoveComplete', $params ); + } + ) + ); return Status::newGood(); } diff --git a/includes/OutputPage.php b/includes/OutputPage.php index ecc719a044..d34ace8fb0 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -290,6 +290,9 @@ class OutputPage extends ContextSource { */ private $copyrightUrl; + /** @var array Profiling data */ + private $limitReportData = []; + /** * Constructor for OutputPage. This should not be called directly. * Instead a new RequestContext should be created and it will implicitly create @@ -604,29 +607,6 @@ class OutputPage extends ContextSource { $this->mModuleStyles = array_merge( $this->mModuleStyles, (array)$modules ); } - /** - * Get the list of module messages to include on this page - * - * @deprecated since 1.26 Obsolete - * @param bool $filter - * @param string|null $position - * @return array Array of module names - */ - public function getModuleMessages( $filter = false, $position = null ) { - wfDeprecated( __METHOD__, '1.26' ); - return []; - } - - /** - * Load messages of one or more ResourceLoader modules. - * - * @deprecated since 1.26 Use addModules() instead - * @param string|array $modules Module name (string) or array of module names - */ - public function addModuleMessages( $modules ) { - wfDeprecated( __METHOD__, '1.26' ); - } - /** * @return null|string ResourceLoader target */ @@ -1777,11 +1757,14 @@ class OutputPage extends ContextSource { } } - // enable OOUI if requested via ParserOutput + // Enable OOUI if requested via ParserOutput if ( $parserOutput->getEnableOOUI() ) { $this->enableOOUI(); } + // Include profiling data + $this->limitReportData = $parserOutput->getLimitReportData(); + // Link flags are ignored for now, but may in the future be // used to mark individual language links. $linkFlags = []; @@ -3098,7 +3081,13 @@ class OutputPage extends ContextSource { * @return string */ function getBottomScripts() { - return $this->getScriptsForBottomQueue(); + return $this->getScriptsForBottomQueue() . + ResourceLoader::makeInlineScript( + ResourceLoader::makeConfigSetScript( + [ 'wgPageParseReport' => $this->limitReportData ], + true + ) + ); } /** diff --git a/includes/RevisionList.php b/includes/RevisionList.php index 731d1b3e5d..811870c8c0 100644 --- a/includes/RevisionList.php +++ b/includes/RevisionList.php @@ -23,7 +23,7 @@ /** * List for revision table items for a single page */ -abstract class RevisionListBase extends ContextSource { +abstract class RevisionListBase extends ContextSource implements Iterator { /** @var Title */ public $title; @@ -89,6 +89,10 @@ abstract class RevisionListBase extends ContextSource { return $this->current; } + public function rewind() { + $this->reset(); + } + /** * Get the current list item, or false if we are at the end * @return Revision @@ -107,6 +111,14 @@ abstract class RevisionListBase extends ContextSource { return $this->current; } + public function key() { + return $this->res ? $this->res->key(): 0; + } + + public function valid() { + return $this->res ? $this->res->valid() : false; + } + /** * Get the number of items in the list. * @return int diff --git a/includes/SiteConfiguration.php b/includes/SiteConfiguration.php index 5b9bdfa1b1..885f926fa2 100644 --- a/includes/SiteConfiguration.php +++ b/includes/SiteConfiguration.php @@ -36,15 +36,15 @@ * * @code * $conf = new SiteConfiguration; - * $conf->wikis = array( 'de', 'en', 'beta' ); + * $conf->wikis = [ 'de', 'en', 'beta' ]; * @endcode * * When configuring the MediaWiki global settings (the $wg variables), * the identifiers will be available to specify settings on a per wiki basis. * * @code - * $conf->settings = array( - * 'wgSomeSetting' => array( + * $conf->settings = [ + * 'wgSomeSetting' => [ * * # production: * 'de' => false, @@ -52,8 +52,8 @@ * * # test: * 'beta => true, - * ), - * ); + * ], + * ]; * @endcode * * With three wikis, that is easy to manage. But what about a farm with @@ -62,15 +62,15 @@ * the above code could be written: * * @code - * $conf->settings = array( - * 'wgSomeSetting' => array( + * $conf->settings = [ + * 'wgSomeSetting' => [ * * 'default' => false, * * # Enable feature on test * 'beta' => true, - * ), - * ); + * ], + * ]; * @endcode * * @@ -80,23 +80,23 @@ * on a per wiki basis. * * @code - * $conf->settings = array( - * 'wgMergeSetting' = array( + * $conf->settings = [ + * 'wgMergeSetting' = [ * # Value that will be shared among all wikis: - * 'default' => array( NS_USER => true ), + * 'default' => [ NS_USER => true ], * * # Leading '+' means merging the array of value with the defaults - * '+beta' => array( NS_HELP => true ), - * ), - * ); + * '+beta' => [ NS_HELP => true ], + * ], + * ]; * * # Get configuration for the German site: * $conf->get( 'wgMergeSetting', 'de' ); - * // --> array( NS_USER => true ); + * // --> [ NS_USER => true ]; * * # Get configuration for the testing site: * $conf->get( 'wgMergeSetting', 'beta' ); - * // --> array( NS_USER => true, NS_HELP => true ); + * // --> [ NS_USER => true, NS_HELP => true ]; * @endcode * * Finally, to load all configuration settings, extract them in global context: @@ -108,9 +108,14 @@ * extract( $globals ); * @endcode * + * @note For WikiMap to function, the configuration must define string values for + * $wgServer (or $wgCanonicalServer) and $wgArticlePath, even if these are the + * same for all wikis or can be correctly determined by the logic in + * Setup.php. + * * @todo Give examples for, * suffixes: - * $conf->suffixes = array( 'wiki' ); + * $conf->suffixes = [ 'wiki' ]; * localVHosts * callbacks! */ diff --git a/includes/Title.php b/includes/Title.php index 8aa8cb7db7..ea42768c0e 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -500,7 +500,7 @@ class Title implements LinkTarget { * @param string $interwiki The interwiki prefix * @return Title The new object */ - public static function &makeTitle( $ns, $title, $fragment = '', $interwiki = '' ) { + public static function makeTitle( $ns, $title, $fragment = '', $interwiki = '' ) { $t = new Title(); $t->mInterwiki = $interwiki; $t->mFragment = $fragment; diff --git a/includes/WatchedItem.php b/includes/WatchedItem.php index b070e1eba6..bfd1d6136b 100644 --- a/includes/WatchedItem.php +++ b/includes/WatchedItem.php @@ -156,54 +156,6 @@ class WatchedItem { return new self( $user, $title, self::DEPRECATED_USAGE_TIMESTAMP, (bool)$checkRights ); } - /** - * @deprecated since 1.27 Use WatchedItemStore::resetNotificationTimestamp() - */ - public function resetNotificationTimestamp( $force = '', $oldid = 0 ) { - wfDeprecated( __METHOD__, '1.27' ); - if ( $this->checkRights && !$this->user->isAllowed( 'editmywatchlist' ) ) { - return; - } - MediaWikiServices::getInstance()->getWatchedItemStore()->resetNotificationTimestamp( - $this->user, - $this->getTitle(), - $force, - $oldid - ); - } - - /** - * @deprecated since 1.27 Use WatchedItemStore::addWatchBatch() - */ - public static function batchAddWatch( array $items ) { - wfDeprecated( __METHOD__, '1.27' ); - if ( !$items ) { - return false; - } - - $targets = []; - $users = []; - /** @var WatchedItem $watchedItem */ - foreach ( $items as $watchedItem ) { - $user = $watchedItem->getUser(); - if ( $watchedItem->checkRights && !$user->isAllowed( 'editmywatchlist' ) ) { - continue; - } - $userId = $user->getId(); - $users[$userId] = $user; - $targets[$userId][] = $watchedItem->getTitle()->getSubjectPage(); - $targets[$userId][] = $watchedItem->getTitle()->getTalkPage(); - } - - $store = MediaWikiServices::getInstance()->getWatchedItemStore(); - $success = true; - foreach ( $users as $userId => $user ) { - $success &= $store->addWatchBatchForUser( $user, $targets[$userId] ); - } - - return $success; - } - /** * @deprecated since 1.27 Use User::addWatch() * @return bool diff --git a/includes/WebRequest.php b/includes/WebRequest.php index 30efb3b49f..b5c57ee972 100644 --- a/includes/WebRequest.php +++ b/includes/WebRequest.php @@ -565,8 +565,7 @@ class WebRequest { /** * Fetch a text string from the given array or return $default if it's not - * set. Carriage returns are stripped from the text, and with some language - * modules there is an input transliteration applied. This should generally + * set. Carriage returns are stripped from the text. This should generally * be used for form "