X-Git-Url: https://git.cyclocoop.org/%7B%24admin_url%7Dmembres/modifier.php?a=blobdiff_plain;f=includes%2FEditPage.php;h=914e7aa6a92b493c071e7e56e6b8f3e5061f82ad;hb=015b74691b1320c37cef090e209c2794001a6e6f;hp=229a36a26e4b48591e6a021bdcf34b03b9568172;hpb=4a5f646a7fea7cbe0421c5cf38b72bae5c1bcf65;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/EditPage.php b/includes/EditPage.php index 229a36a26e..914e7aa6a9 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -336,7 +336,7 @@ class EditPage { /** @var string */ public $edittime = ''; - /** @var integer */ + /** @var int */ private $editRevId = null; /** @var string */ @@ -852,7 +852,7 @@ class EditPage { /** * This function collects the form data and uses it to populate various member variables. - * @param WebRequest $request + * @param WebRequest &$request * @throws ErrorPageError */ public function importFormData( &$request ) { @@ -1080,7 +1080,7 @@ class EditPage { * this method should be overridden and return the page text that will be used * for saving, preview parsing and so on... * - * @param WebRequest $request + * @param WebRequest &$request * @return string|null */ protected function importContentFormData( &$request ) { @@ -1432,7 +1432,7 @@ class EditPage { /** * Make sure the form isn't faking a user's credentials. * - * @param WebRequest $request + * @param WebRequest &$request * @return bool * @private */ @@ -1475,7 +1475,7 @@ class EditPage { /** * Attempt submission - * @param array|bool $resultDetails See docs for $result in internalAttemptSave + * @param array|bool &$resultDetails See docs for $result in internalAttemptSave * @throws UserBlockedError|ReadOnlyError|ThrottledError|PermissionsError * @return Status The resulting status object. */ @@ -1698,7 +1698,7 @@ class EditPage { global $wgParser; if ( $this->sectiontitle !== '' ) { - $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->sectiontitle ); + $sectionanchor = $this->guessSectionName( $this->sectiontitle ); // If no edit summary was specified, create one automatically from the section // title and have it link to the new section. Otherwise, respect the summary as // passed. @@ -1708,7 +1708,7 @@ class EditPage { ->rawParams( $cleanSectionTitle )->inContentLanguage()->text(); } } elseif ( $this->summary !== '' ) { - $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->summary ); + $sectionanchor = $this->guessSectionName( $this->summary ); # This is a new section, so create a link to the new section # in the revision summary. $cleanSummary = $wgParser->stripSectionName( $this->summary ); @@ -1721,12 +1721,12 @@ class EditPage { /** * Attempt submission (no UI) * - * @param array $result Array to add statuses to, currently with the + * @param array &$result Array to add statuses to, currently with the * possible keys: * - spam (string): Spam string from content if any spam is detected by * matchSpamRegex. * - sectionanchor (string): Section anchor for a section save. - * - nullEdit (boolean): Set if doEditContent is OK. True if null edit, + * - nullEdit (bool): Set if doEditContent is OK. True if null edit, * false otherwise. * - redirect (bool): Set if doEditContent is OK. True if resulting * revision is a redirect. @@ -1743,7 +1743,7 @@ class EditPage { * time. */ public function internalAttemptSave( &$result, $bot = false ) { - global $wgUser, $wgRequest, $wgParser, $wgMaxArticleSize; + global $wgUser, $wgRequest, $wgMaxArticleSize; global $wgContentHandlerUseDB; $status = Status::newGood(); @@ -2117,7 +2117,7 @@ class EditPage { # We can't deal with anchors, includes, html etc in the header for now, # headline would need to be parsed to improve this. if ( $hasmatch && strlen( $matches[2] ) > 0 ) { - $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $matches[2] ); + $sectionanchor = $this->guessSectionName( $matches[2] ); } } $result['sectionanchor'] = $sectionanchor; @@ -3076,7 +3076,7 @@ class EditPage { 'tabindex' => 1, 'size' => 60, 'spellcheck' => 'true', - ] + Linker::tooltipAndAccesskeyAttribs( 'summary' ); + ]; } /** @@ -3097,6 +3097,7 @@ class EditPage { $inputAttrs = null, $spanLabelAttrs = null ) { $inputAttrs = $this->getSummaryInputAttributes( $inputAttrs ); + $inputAttrs += Linker::tooltipAndAccesskeyAttribs( 'summary' ); $spanLabelAttrs = ( is_array( $spanLabelAttrs ) ? $spanLabelAttrs : [] ) + [ 'class' => $this->missingSummary ? 'mw-summarymissed' : 'mw-summary', @@ -3132,6 +3133,10 @@ class EditPage { $inputAttrs = OOUI\Element::configFromHtmlAttributes( $this->getSummaryInputAttributes( $inputAttrs ) ); + $inputAttrs += [ + 'title' => Linker::titleAttrib( 'summary' ), + 'accessKey' => Linker::accesskey( 'summary' ), + ]; // For compatibility with old scripts and extensions, we want the legacy 'id' on the `` $inputAttrs['inputId'] = $inputAttrs['id']; @@ -3220,16 +3225,13 @@ class EditPage { protected function showFormBeforeText() { global $wgOut; - $section = htmlspecialchars( $this->section ); - $wgOut->addHTML( << - - - - - -HTML - ); + + $wgOut->addHTML( Html::hidden( 'wpSection', htmlspecialchars( $this->section ) ) ); + $wgOut->addHTML( Html::hidden( 'wpStarttime', $this->starttime ) ); + $wgOut->addHTML( Html::hidden( 'wpEdittime', $this->edittime ) ); + $wgOut->addHTML( Html::hidden( 'editRevId', $this->editRevId ) ); + $wgOut->addHTML( Html::hidden( 'wpScrolltop', $this->scrolltop ) ); + if ( !$this->checkUnicodeCompliantBrowser() ) { $wgOut->addHTML( Html::hidden( 'safemode', '1' ) ); } @@ -3493,8 +3495,8 @@ HTML } /** - * Inserts optional text shown below edit and upload forms. Can be used to offer special characters not present on - * most keyboards for copying/pasting. + * Inserts optional text shown below edit and upload forms. Can be used to offer special + * characters not present on most keyboards for copying/pasting. */ protected function showEditTools() { global $wgOut; @@ -4200,7 +4202,7 @@ HTML * Returns an array of html code of the following checkboxes old style: * minor and watch * - * @param int $tabindex Current tabindex + * @param int &$tabindex Current tabindex * @param array $checked See getCheckboxesDefinition() * @return array */ @@ -4258,7 +4260,7 @@ HTML * Returns an array of html code of the following checkboxes: * minor and watch * - * @param int $tabindex Current tabindex + * @param int &$tabindex Current tabindex * @param array $checked Array of checkbox => bool, where bool indicates the checked * status of the checkbox * @@ -4277,7 +4279,7 @@ HTML $accesskey = null; if ( isset( $options['tooltip'] ) ) { $accesskey = $this->context->msg( "accesskey-{$options['tooltip']}" )->text(); - $title = Linker::titleAttrib( $options['tooltip'], 'withaccess' ); + $title = Linker::titleAttrib( $options['tooltip'] ); } if ( isset( $options['title-message'] ) ) { $title = $this->context->msg( $options['title-message'] )->text(); @@ -4331,7 +4333,7 @@ HTML $newPage = !$this->mTitle->exists(); if ( $labelAsPublish ) { - $buttonLabelKey = $newPage ? 'publishpage' : 'publishchanges'; + $buttonLabelKey = $newPage ? 'publishpage' : 'publishchanges'; } else { $buttonLabelKey = $newPage ? 'savearticle' : 'savechanges'; } @@ -4343,7 +4345,7 @@ HTML * Returns an array of html code of the following buttons: * save, diff and preview * - * @param int $tabindex Current tabindex + * @param int &$tabindex Current tabindex * * @return array */ @@ -4355,8 +4357,7 @@ HTML $attribs = [ 'name' => 'wpSave', 'tabindex' => ++$tabindex, - ] + Linker::tooltipAndAccesskeyAttribs( 'save' ); - + ]; if ( $this->oouiEnabled ) { $saveConfig = OOUI\Element::configFromHtmlAttributes( $attribs ); $buttons['save'] = new OOUI\ButtonInputWidget( [ @@ -4368,11 +4369,13 @@ HTML 'label' => $buttonLabel, 'infusable' => true, 'type' => 'submit', + 'title' => Linker::titleAttrib( 'save' ), + 'accessKey' => Linker::accesskey( 'save' ), ] + $saveConfig ); } else { $buttons['save'] = Html::submitButton( $buttonLabel, - $attribs + [ 'id' => 'wpSave' ], + $attribs + Linker::tooltipAndAccesskeyAttribs( 'save' ) + [ 'id' => 'wpSave' ], [ 'mw-ui-progressive' ] ); } @@ -4380,7 +4383,7 @@ HTML $attribs = [ 'name' => 'wpPreview', 'tabindex' => ++$tabindex, - ] + Linker::tooltipAndAccesskeyAttribs( 'preview' ); + ]; if ( $this->oouiEnabled ) { $previewConfig = OOUI\Element::configFromHtmlAttributes( $attribs ); $buttons['preview'] = new OOUI\ButtonInputWidget( [ @@ -4390,18 +4393,20 @@ HTML 'useInputTag' => true, 'label' => $this->context->msg( 'showpreview' )->text(), 'infusable' => true, - 'type' => 'submit' + 'type' => 'submit', + 'title' => Linker::titleAttrib( 'preview' ), + 'accessKey' => Linker::accesskey( 'preview' ), ] + $previewConfig ); } else { $buttons['preview'] = Html::submitButton( $this->context->msg( 'showpreview' )->text(), - $attribs + [ 'id' => 'wpPreview' ] + $attribs + Linker::tooltipAndAccesskeyAttribs( 'preview' ) + [ 'id' => 'wpPreview' ] ); } $attribs = [ 'name' => 'wpDiff', 'tabindex' => ++$tabindex, - ] + Linker::tooltipAndAccesskeyAttribs( 'diff' ); + ]; if ( $this->oouiEnabled ) { $diffConfig = OOUI\Element::configFromHtmlAttributes( $attribs ); $buttons['diff'] = new OOUI\ButtonInputWidget( [ @@ -4412,11 +4417,13 @@ HTML 'label' => $this->context->msg( 'showdiff' )->text(), 'infusable' => true, 'type' => 'submit', + 'title' => Linker::titleAttrib( 'diff' ), + 'accessKey' => Linker::accesskey( 'diff' ), ] + $diffConfig ); } else { $buttons['diff'] = Html::submitButton( $this->context->msg( 'showdiff' )->text(), - $attribs + [ 'id' => 'wpDiff' ] + $attribs + Linker::tooltipAndAccesskeyAttribs( 'diff' ) + [ 'id' => 'wpDiff' ] ); } @@ -4785,4 +4792,27 @@ HTML } return $wikitext; } + + /** + * Turns section name wikitext into anchors for use in HTTP redirects. Various + * versions of Microsoft browsers misinterpret fragment encoding of Location: headers + * resulting in mojibake in address bar. Redirect them to legacy section IDs, + * if possible. All the other browsers get HTML5 if the wiki is configured for it, to + * spread the new style links more efficiently. + * + * @param string $text + * @return string + */ + private function guessSectionName( $text ) { + global $wgParser; + + // Detect Microsoft browsers + $userAgent = $this->context->getRequest()->getHeader( 'User-Agent' ); + if ( $userAgent && preg_match( '/MSIE|Edge/', $userAgent ) ) { + // ...and redirect them to legacy encoding, if available + return $wgParser->guessLegacySectionNameFromWikiText( $text ); + } + // Meanwhile, real browsers get real anchors + return $wgParser->guessSectionNameFromWikiText( $text ); + } }