MediaWiki REL1_35
JsonContent.php
Go to the documentation of this file.
1<?php
15class JsonContent extends TextContent {
16
21 protected $jsonParse;
22
27 public function __construct( $text, $modelId = CONTENT_MODEL_JSON ) {
28 parent::__construct( $text, $modelId );
29 }
30
39 public function getData() {
40 if ( $this->jsonParse === null ) {
41 $this->jsonParse = FormatJson::parse( $this->getText() );
42 }
43 return $this->jsonParse;
44 }
45
49 public function isValid() {
50 return $this->getData()->isGood();
51 }
52
60 public function beautifyJSON() {
61 return FormatJson::encode( $this->getData()->getValue(), true, FormatJson::UTF8_OK );
62 }
63
72 public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
73 // FIXME: WikiPage::doEditContent invokes PST before validation. As such, native data
74 // may be invalid (though PST result is discarded later in that case).
75 if ( !$this->isValid() ) {
76 return $this;
77 }
78
79 return new static( self::normalizeLineEndings( $this->beautifyJSON() ) );
80 }
81
91 protected function fillParserOutput( Title $title, $revId,
92 ParserOptions $options, $generateHtml, ParserOutput &$output
93 ) {
94 // FIXME: WikiPage::doEditContent generates parser output before validation.
95 // As such, native data may be invalid (though output is discarded later in that case).
96 if ( $generateHtml && $this->isValid() ) {
97 $output->setText( $this->rootValueTable( $this->getData()->getValue() ) );
98 $output->addModuleStyles( 'mediawiki.content.json' );
99 } else {
100 $output->setText( '' );
101 }
102 }
103
112 protected function rootValueTable( $val ) {
113 if ( is_object( $val ) ) {
114 return $this->objectTable( $val );
115 }
116
117 if ( is_array( $val ) ) {
118 // Wrap arrays in another array so that they're visually boxed in a container.
119 // Otherwise they are visually indistinguishable from a single value.
120 return $this->arrayTable( [ $val ] );
121 }
122
123 return Html::rawElement( 'table', [ 'class' => 'mw-json mw-json-single-value' ],
124 Html::rawElement( 'tbody', [],
125 Html::rawElement( 'tr', [],
126 Html::element( 'td', [], $this->primitiveValue( $val ) )
127 )
128 )
129 );
130 }
131
138 protected function objectTable( $mapping ) {
139 $rows = [];
140 $empty = true;
141
142 foreach ( $mapping as $key => $val ) {
143 $rows[] = $this->objectRow( $key, $val );
144 $empty = false;
145 }
146 if ( $empty ) {
147 $rows[] = Html::rawElement( 'tr', [],
148 Html::element( 'td', [ 'class' => 'mw-json-empty' ],
149 wfMessage( 'content-json-empty-object' )->text()
150 )
151 );
152 }
153 return Html::rawElement( 'table', [ 'class' => 'mw-json' ],
154 Html::rawElement( 'tbody', [], implode( '', $rows ) )
155 );
156 }
157
165 protected function objectRow( $key, $val ) {
166 $thContent = Html::element( 'span', [], $key );
167 $th = Html::rawElement( 'th', [], $thContent );
168 $td = $this->valueCell( $val );
169 return Html::rawElement( 'tr', [], $th . $td );
170 }
171
178 protected function arrayTable( $mapping ) {
179 $rows = [];
180 $empty = true;
181
182 foreach ( $mapping as $val ) {
183 $rows[] = $this->arrayRow( $val );
184 $empty = false;
185 }
186 if ( $empty ) {
187 $rows[] = Html::rawElement( 'tr', [],
188 Html::element( 'td', [ 'class' => 'mw-json-empty' ],
189 wfMessage( 'content-json-empty-array' )->text()
190 )
191 );
192 }
193 return Html::rawElement( 'table', [ 'class' => 'mw-json' ],
194 Html::rawElement( 'tbody', [], implode( "\n", $rows ) )
195 );
196 }
197
204 protected function arrayRow( $val ) {
205 $td = $this->valueCell( $val );
206 return Html::rawElement( 'tr', [], $td );
207 }
208
215 protected function valueCell( $val ) {
216 if ( is_object( $val ) ) {
217 return Html::rawElement( 'td', [], $this->objectTable( $val ) );
218 }
219
220 if ( is_array( $val ) ) {
221 return Html::rawElement( 'td', [], $this->arrayTable( $val ) );
222 }
223
224 return Html::element( 'td', [ 'class' => 'mw-json-value' ], $this->primitiveValue( $val ) );
225 }
226
233 protected function primitiveValue( $val ) {
234 if ( is_string( $val ) ) {
235 // Don't FormatJson::encode for strings since we want quotes
236 // and new lines to render visually instead of escaped.
237 return '"' . $val . '"';
238 }
239 return FormatJson::encode( $val );
240 }
241}
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
Represents the content of a JSON content.
objectRow( $key, $val)
Create HTML table row representing one object property.
objectTable( $mapping)
Create HTML table representing a JSON object.
valueCell( $val)
Construct HTML table cell representing any JSON value.
arrayRow( $val)
Create HTML table row representing the value in an array.
Status $jsonParse
primitiveValue( $val)
Construct text representing a JSON primitive value.
preSaveTransform(Title $title, User $user, ParserOptions $popts)
Beautifies JSON prior to save.
__construct( $text, $modelId=CONTENT_MODEL_JSON)
fillParserOutput(Title $title, $revId, ParserOptions $options, $generateHtml, ParserOutput &$output)
Set the HTML and add the appropriate styles.
beautifyJSON()
Pretty-print JSON.
rootValueTable( $val)
Construct HTML table representation of any JSON value.
getData()
Decodes the JSON string.
arrayTable( $mapping)
Create HTML table representing a JSON array.
Set options of the Parser.
addModuleStyles( $modules)
Generic operation result class Has warning/error list, boolean status and arbitrary value.
Definition Status.php:44
Content object implementation for representing flat text.
getText()
Returns the text represented by this Content object, as a string.
static normalizeLineEndings( $text)
Do a "\\r\\n" -> "\\n" and "\\r" -> "\\n" transformation as well as trim trailing whitespace.
Represents a title within MediaWiki.
Definition Title.php:42
The User object encapsulates all of the user-specific settings (user_id, name, rights,...
Definition User.php:60
const CONTENT_MODEL_JSON
Definition Defines.php:229