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 
73  protected function fillParserOutput( Title $title, $revId,
74  ParserOptions $options, $generateHtml, ParserOutput &$output
75  ) {
76  // FIXME: WikiPage::doEditContent generates parser output before validation.
77  // As such, native data may be invalid (though output is discarded later in that case).
78  if ( $generateHtml && $this->isValid() ) {
79  $output->setText( $this->rootValueTable( $this->getData()->getValue() ) );
80  $output->addModuleStyles( 'mediawiki.content.json' );
81  } else {
82  $output->setText( '' );
83  }
84  }
85 
94  protected function rootValueTable( $val ) {
95  if ( is_object( $val ) ) {
96  return $this->objectTable( $val );
97  }
98 
99  if ( is_array( $val ) ) {
100  // Wrap arrays in another array so that they're visually boxed in a container.
101  // Otherwise they are visually indistinguishable from a single value.
102  return $this->arrayTable( [ $val ] );
103  }
104 
105  return Html::rawElement( 'table', [ 'class' => 'mw-json mw-json-single-value' ],
106  Html::rawElement( 'tbody', [],
107  Html::rawElement( 'tr', [],
108  Html::element( 'td', [], $this->primitiveValue( $val ) )
109  )
110  )
111  );
112  }
113 
120  protected function objectTable( $mapping ) {
121  $rows = [];
122  $empty = true;
123 
124  foreach ( $mapping as $key => $val ) {
125  $rows[] = $this->objectRow( $key, $val );
126  $empty = false;
127  }
128  if ( $empty ) {
129  $rows[] = Html::rawElement( 'tr', [],
130  Html::element( 'td', [ 'class' => 'mw-json-empty' ],
131  wfMessage( 'content-json-empty-object' )->text()
132  )
133  );
134  }
135  return Html::rawElement( 'table', [ 'class' => 'mw-json' ],
136  Html::rawElement( 'tbody', [], implode( '', $rows ) )
137  );
138  }
139 
147  protected function objectRow( $key, $val ) {
148  $thContent = Html::element( 'span', [], $key );
149  $th = Html::rawElement( 'th', [], $thContent );
150  $td = $this->valueCell( $val );
151  return Html::rawElement( 'tr', [], $th . $td );
152  }
153 
160  protected function arrayTable( $mapping ) {
161  $rows = [];
162  $empty = true;
163 
164  foreach ( $mapping as $val ) {
165  $rows[] = $this->arrayRow( $val );
166  $empty = false;
167  }
168  if ( $empty ) {
169  $rows[] = Html::rawElement( 'tr', [],
170  Html::element( 'td', [ 'class' => 'mw-json-empty' ],
171  wfMessage( 'content-json-empty-array' )->text()
172  )
173  );
174  }
175  return Html::rawElement( 'table', [ 'class' => 'mw-json' ],
176  Html::rawElement( 'tbody', [], implode( "\n", $rows ) )
177  );
178  }
179 
186  protected function arrayRow( $val ) {
187  $td = $this->valueCell( $val );
188  return Html::rawElement( 'tr', [], $td );
189  }
190 
197  protected function valueCell( $val ) {
198  if ( is_object( $val ) ) {
199  return Html::rawElement( 'td', [], $this->objectTable( $val ) );
200  }
201 
202  if ( is_array( $val ) ) {
203  return Html::rawElement( 'td', [], $this->arrayTable( $val ) );
204  }
205 
206  return Html::element( 'td', [ 'class' => 'mw-json-value' ], $this->primitiveValue( $val ) );
207  }
208 
215  protected function primitiveValue( $val ) {
216  if ( is_string( $val ) ) {
217  // Don't FormatJson::encode for strings since we want quotes
218  // and new lines to render visually instead of escaped.
219  return '"' . $val . '"';
220  }
221  return FormatJson::encode( $val );
222  }
223 }
JsonContent\beautifyJSON
beautifyJSON()
Pretty-print JSON.
Definition: JsonContent.php:60
ParserOptions
Set options of the Parser.
Definition: ParserOptions.php:45
JsonContent\isValid
isValid()
Definition: JsonContent.php:49
ParserOutput
Definition: ParserOutput.php:31
JsonContent\arrayTable
arrayTable( $mapping)
Create HTML table representing a JSON array.
Definition: JsonContent.php:160
JsonContent\arrayRow
arrayRow( $val)
Create HTML table row representing the value in an array.
Definition: JsonContent.php:186
wfMessage
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
Definition: GlobalFunctions.php:1182
JsonContent\objectTable
objectTable( $mapping)
Create HTML table representing a JSON object.
Definition: JsonContent.php:120
FormatJson\UTF8_OK
const UTF8_OK
Skip escaping most characters above U+007F for readability and compactness.
Definition: FormatJson.php:34
TextContent\getText
getText()
Returns the text represented by this Content object, as a string.
Definition: TextContent.php:153
JsonContent\rootValueTable
rootValueTable( $val)
Construct HTML table representation of any JSON value.
Definition: JsonContent.php:94
Status
Generic operation result class Has warning/error list, boolean status and arbitrary value.
Definition: Status.php:44
CONTENT_MODEL_JSON
const CONTENT_MODEL_JSON
Definition: Defines.php:212
FormatJson\encode
static encode( $value, $pretty=false, $escaping=0)
Returns the JSON representation of a value.
Definition: FormatJson.php:115
JsonContent\$jsonParse
Status $jsonParse
Definition: JsonContent.php:21
JsonContent
Represents the content of a JSON content.
Definition: JsonContent.php:15
JsonContent\fillParserOutput
fillParserOutput(Title $title, $revId, ParserOptions $options, $generateHtml, ParserOutput &$output)
Set the HTML and add the appropriate styles.
Definition: JsonContent.php:73
JsonContent\objectRow
objectRow( $key, $val)
Create HTML table row representing one object property.
Definition: JsonContent.php:147
$title
$title
Definition: testCompression.php:38
ParserOutput\addModuleStyles
addModuleStyles( $modules)
Definition: ParserOutput.php:952
ParserOutput\setText
setText( $text)
Definition: ParserOutput.php:724
JsonContent\valueCell
valueCell( $val)
Construct HTML table cell representing any JSON value.
Definition: JsonContent.php:197
FormatJson\parse
static parse( $value, $options=0)
Decodes a JSON string.
Definition: FormatJson.php:188
TextContent
Content object implementation for representing flat text.
Definition: TextContent.php:39
JsonContent\getData
getData()
Decodes the JSON string.
Definition: JsonContent.php:39
Title
Represents a title within MediaWiki.
Definition: Title.php:49
JsonContent\primitiveValue
primitiveValue( $val)
Construct text representing a JSON primitive value.
Definition: JsonContent.php:215
Html\rawElement
static rawElement( $element, $attribs=[], $contents='')
Returns an HTML element in a string.
Definition: Html.php:210
JsonContent\__construct
__construct( $text, $modelId=CONTENT_MODEL_JSON)
Definition: JsonContent.php:27
Html\element
static element( $element, $attribs=[], $contents='')
Identical to rawElement(), but HTML-escapes $contents (like Xml::element()).
Definition: Html.php:232