3 * Helper for displaying edit conflicts to users
5 * Copyright (C) 2017 Kunal Mehta <legoktm@member.fsf.org>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 * http://www.gnu.org/copyleft/gpl.html
25 namespace MediaWiki\EditPage
;
30 use IBufferingStatsdDataFactory
;
35 * Helper for displaying edit conflicts in text content
40 class TextConflictHelper
{
50 public $contentModel = null;
55 public $contentFormat = null;
63 * @var IBufferingStatsdDataFactory
68 * @var string Message key for submit button's label
70 protected $submitLabel;
75 protected $yourtext = '';
80 protected $storedversion = '';
84 * @param OutputPage $out
85 * @param IBufferingStatsdDataFactory $stats
86 * @param string $submitLabel
88 public function __construct( Title
$title, OutputPage
$out, IBufferingStatsdDataFactory
$stats,
91 $this->title
= $title;
93 $this->stats
= $stats;
94 $this->submitLabel
= $submitLabel;
95 $this->contentModel
= $title->getContentModel();
96 $this->contentFormat
= ContentHandler
::getForModelID( $this->contentModel
)->getDefaultFormat();
100 * @param string $yourtext
101 * @param string $storedversion
103 public function setTextboxes( $yourtext, $storedversion ) {
104 $this->yourtext
= $yourtext;
105 $this->storedversion
= $storedversion;
109 * @param string $contentModel
111 public function setContentModel( $contentModel ) {
112 $this->contentModel
= $contentModel;
116 * @param string $contentFormat
118 public function setContentFormat( $contentFormat ) {
119 $this->contentFormat
= $contentFormat;
123 * Record a user encountering an edit conflict
125 public function incrementConflictStats() {
126 $this->stats
->increment( 'edit.failures.conflict' );
127 // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics
129 $this->title
->getNamespace() >= NS_MAIN
&&
130 $this->title
->getNamespace() <= NS_CATEGORY_TALK
132 $this->stats
->increment(
133 'edit.failures.conflict.byNamespaceId.' . $this->title
->getNamespace()
139 * Record when a user has resolved an edit conflict
141 public function incrementResolvedStats() {
142 $this->stats
->increment( 'edit.failures.conflict.resolved' );
143 // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics
145 $this->title
->getNamespace() >= NS_MAIN
&&
146 $this->title
->getNamespace() <= NS_CATEGORY_TALK
148 $this->stats
->increment(
149 'edit.failures.conflict.resolved.byNamespaceId.' . $this->title
->getNamespace()
155 * @return string HTML
157 public function getExplainHeader() {
158 return Html
::rawElement(
160 [ 'class' => 'mw-explainconflict' ],
161 $this->out
->msg( 'explainconflict', $this->out
->msg( $this->submitLabel
)->text() )->parse()
166 * HTML to build the textbox1 on edit conflicts
168 * @param array $customAttribs
169 * @return string HTML
171 public function getEditConflictMainTextBox( array $customAttribs = [] ) {
172 $builder = new TextboxBuilder();
173 $classes = $builder->getTextboxProtectionCSSClasses( $this->title
);
175 $attribs = [ 'tabindex' => 1 ];
176 $attribs +
= $customAttribs;
178 $attribs = $builder->mergeClassesIntoAttributes( $classes, $attribs );
180 $attribs = $builder->buildTextboxAttribs(
183 $this->out
->getUser(),
188 Html
::textarea( 'wpTextbox1', $builder->addNewLineAtEnd( $this->storedversion
), $attribs )
193 * Content to go in the edit form before textbox1
195 * @see EditPage::$editFormTextBeforeContent
196 * @return string HTML
198 public function getEditFormHtmlBeforeContent() {
203 * Content to go in the edit form after textbox1
205 * @see EditPage::$editFormTextAfterContent
206 * @return string HTML
208 public function getEditFormHtmlAfterContent() {
213 * Content to go in the edit form after the footers
214 * (templates on this page, hidden categories, limit report)
216 public function showEditFormTextAfterFooters() {
217 $this->out
->wrapWikiMsg( '<h2>$1</h2>', "yourdiff" );
219 $yourContent = $this->toEditContent( $this->yourtext
);
220 $storedContent = $this->toEditContent( $this->storedversion
);
221 $handler = ContentHandler
::getForModelID( $this->contentModel
);
222 $diffEngine = $handler->createDifferenceEngine( $this->out
);
224 $diffEngine->setContent( $yourContent, $storedContent );
225 $diffEngine->showDiff(
226 $this->out
->msg( 'yourtext' )->parse(),
227 $this->out
->msg( 'storedversion' )->text()
230 $this->out
->wrapWikiMsg( '<h2>$1</h2>', "yourtext" );
232 $builder = new TextboxBuilder();
233 $attribs = $builder->buildTextboxAttribs(
235 [ 'tabindex' => 6, 'readonly' ],
236 $this->out
->getUser(),
241 Html
::textarea( 'wpTextbox2', $builder->addNewLineAtEnd( $this->yourtext
), $attribs )
246 * @param string $text
249 public function toEditContent( $text ) {
250 return ContentHandler
::makeContent(