From b3d5508c103d50dbffc743d5c6efed505038d583 Mon Sep 17 00:00:00 2001 From: Roan Kattouw Date: Thu, 25 Sep 2008 14:23:24 +0000 Subject: [PATCH] (bug 15673) Add indentation and newlines to format=wddxfm output: * Like the JSON formatter, use our own WDDX formatter when PHP's is not available or the user asked for pretty output (PHP's doesn't do indentation) * Don't prettify when our own formatter is used because PHP's is not avaiable * Detect regular arrays (with sequential integer keys) and use for them, rather than using for all arrays. PHP's formatter does this as well. This change should make our WDDX formatter's output identical to PHP's --- RELEASE-NOTES | 2 ++ includes/api/ApiFormatWddx.php | 56 ++++++++++++++++++++++++---------- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 7adbe31ce0..0dc5d93cdd 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -269,6 +269,8 @@ The following extensions are migrated into MediaWiki 1.14: * Added APIAfterExecute, APIQueryAfterExecute and APIQueryGeneratorAfterExecute hooks which allow for extending core modules in a cleaner way * action=protect checks for invalid protection types and levels +* (bug 15673) Added indentation to format=wddxfm output and improved built-in + WDDX formatter to resemble PHP's more === Languages updated in 1.14 === diff --git a/includes/api/ApiFormatWddx.php b/includes/api/ApiFormatWddx.php index d7e48c08a0..b717ef2d7e 100644 --- a/includes/api/ApiFormatWddx.php +++ b/includes/api/ApiFormatWddx.php @@ -42,38 +42,62 @@ class ApiFormatWddx extends ApiFormatBase { } public function execute() { - if (function_exists('wddx_serialize_value')) { + if (function_exists('wddx_serialize_value') && !$this->getIsHtml()) { $this->printText(wddx_serialize_value($this->getResultData())); } else { - $this->printText(''); - $this->printText('
'); - $this->slowWddxPrinter($this->getResultData()); - $this->printText(''); + // Don't do newlines and indentation if we weren't asked + // for pretty output + $nl = ($this->getIsHtml() ? "" : "\n"); + $indstr = " "; + $this->printText("$nl"); + $this->printText("$nl"); + $this->printText("$indstr
$nl"); + $this->printText("$indstr$nl"); + $this->slowWddxPrinter($this->getResultData(), 4); + $this->printText("$indstr$nl"); + $this->printText("$nl"); } } /** * Recursivelly go through the object and output its data in WDDX format. */ - function slowWddxPrinter($elemValue) { + function slowWddxPrinter($elemValue, $indent = 0) { + $indstr = ($this->getIsHtml() ? "" : str_repeat(' ', $indent)); + $indstr2 = ($this->getIsHtml() ? "" : str_repeat(' ', $indent + 2)); + $nl = ($this->getIsHtml() ? "" : "\n"); switch (gettype($elemValue)) { case 'array' : - $this->printText(''); - foreach ($elemValue as $subElemName => $subElemValue) { - $this->printText(wfElement('var', array ( - 'name' => $subElemName - ), null)); - $this->slowWddxPrinter($subElemValue); - $this->printText(''); + // Check whether we've got an associative array () + // or a regular array () + $cnt = count($elemValue); + if($cnt == 0 || array_keys($elemValue) === range(0, $cnt - 1)) { + // Regular array + $this->printText($indstr . wfElement('array', array( + 'length' => $cnt + ), null) . $nl); + foreach($elemValue as $subElemValue) + $this->slowWddxPrinter($subElemValue, $indent + 2); + $this->printText("$indstr$nl"); + } else { + // Associative array () + $this->printText("$indstr$nl"); + foreach($elemValue as $subElemName => $subElemValue) { + $this->printText($indstr2 . wfElement('var', array( + 'name' => $subElemName + ), null) . $nl); + $this->slowWddxPrinter($subElemValue, $indent + 4); + $this->printText("$indstr2$nl"); + } + $this->printText("$indstr$nl"); } - $this->printText(''); break; case 'integer' : case 'double' : - $this->printText(wfElement('number', null, $elemValue)); + $this->printText($indstr . wfElement('number', null, $elemValue) . $nl); break; case 'string' : - $this->printText(wfElement('string', null, $elemValue)); + $this->printText($indstr . wfElement('string', null, $elemValue) . $nl); break; default : ApiBase :: dieDebug(__METHOD__, 'Unknown type ' . gettype($elemValue)); -- 2.20.1