MediaWiki  master
JsonContent.php
Go to the documentation of this file.
1 <?php
15 class 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  $th = Html::element( 'th', [], $key );
167  $td = $this->valueCell( $val );
168  return Html::rawElement( 'tr', [], $th . $td );
169  }
170 
177  protected function arrayTable( $mapping ) {
178  $rows = [];
179  $empty = true;
180 
181  foreach ( $mapping as $val ) {
182  $rows[] = $this->arrayRow( $val );
183  $empty = false;
184  }
185  if ( $empty ) {
186  $rows[] = Html::rawElement( 'tr', [],
187  Html::element( 'td', [ 'class' => 'mw-json-empty' ],
188  wfMessage( 'content-json-empty-array' )->text()
189  )
190  );
191  }
192  return Html::rawElement( 'table', [ 'class' => 'mw-json' ],
193  Html::rawElement( 'tbody', [], implode( "\n", $rows ) )
194  );
195  }
196 
203  protected function arrayRow( $val ) {
204  $td = $this->valueCell( $val );
205  return Html::rawElement( 'tr', [], $td );
206  }
207 
214  protected function valueCell( $val ) {
215  if ( is_object( $val ) ) {
216  return Html::rawElement( 'td', [], $this->objectTable( $val ) );
217  }
218 
219  if ( is_array( $val ) ) {
220  return Html::rawElement( 'td', [], $this->arrayTable( $val ) );
221  }
222 
223  return Html::element( 'td', [ 'class' => 'mw-json-value' ], $this->primitiveValue( $val ) );
224  }
225 
232  protected function primitiveValue( $val ) {
233  if ( is_string( $val ) ) {
234  // Don't FormatJson::encode for strings since we want quotes
235  // and new lines to render visually instead of escaped.
236  return '"' . $val . '"';
237  }
238  return FormatJson::encode( $val );
239  }
240 }
__construct( $text, $modelId=CONTENT_MODEL_JSON)
Definition: JsonContent.php:27
static element( $element, $attribs=[], $contents='')
Identical to rawElement(), but HTML-escapes $contents (like Xml::element()).
Definition: Html.php:231
addModuleStyles( $modules)
setText( $text)
preSaveTransform(Title $title, User $user, ParserOptions $popts)
Beautifies JSON prior to save.
Definition: JsonContent.php:72
static rawElement( $element, $attribs=[], $contents='')
Returns an HTML element in a string.
Definition: Html.php:209
arrayRow( $val)
Create HTML table row representing the value in an array.
Status $jsonParse
Definition: JsonContent.php:21
static encode( $value, $pretty=false, $escaping=0)
Returns the JSON representation of a value.
Definition: FormatJson.php:115
getText()
Returns the text represented by this Content object, as a string.
const CONTENT_MODEL_JSON
Definition: Defines.php:219
arrayTable( $mapping)
Create HTML table representing a JSON array.
const UTF8_OK
Skip escaping most characters above U+007F for readability and compactness.
Definition: FormatJson.php:34
The User object encapsulates all of the user-specific settings (user_id, name, rights, email address, options, last login time).
Definition: User.php:51
rootValueTable( $val)
Construct HTML table representation of any JSON value.
objectTable( $mapping)
Create HTML table representing a JSON object.
fillParserOutput(Title $title, $revId, ParserOptions $options, $generateHtml, ParserOutput &$output)
Set the HTML and add the appropriate styles.
Definition: JsonContent.php:91
objectRow( $key, $val)
Create HTML table row representing one object property.
getData()
Decodes the JSON string.
Definition: JsonContent.php:39
Represents the content of a JSON content.
Definition: JsonContent.php:15
valueCell( $val)
Construct HTML table cell representing any JSON value.
primitiveValue( $val)
Construct text representing a JSON primitive value.
beautifyJSON()
Pretty-print JSON.
Definition: JsonContent.php:60
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
static parse( $value, $options=0)
Decodes a JSON string.
Definition: FormatJson.php:188