@@ -3,9 +3,15 @@ package com.haoge.easyandroid.easy
33import android.util.Log
44import org.json.JSONArray
55import org.json.JSONObject
6+ import java.io.StringReader
7+ import java.io.StringWriter
68import java.lang.reflect.Modifier
79import java.util.*
8- import java.util.regex.Pattern
10+ import javax.xml.transform.OutputKeys
11+ import javax.xml.transform.TransformerException
12+ import javax.xml.transform.TransformerFactory
13+ import javax.xml.transform.stream.StreamResult
14+ import javax.xml.transform.stream.StreamSource
915
1016/* *
1117 * 对数据进行格式化
@@ -14,6 +20,7 @@ import java.util.regex.Pattern
1420 */
1521class EasyFormatter private constructor(private val builder : Builder ) {
1622
23+ private val indent = " "
1724 private val list = mutableListOf<Any >()// 用于临时存放当前已被解析的类。防止出现循环引用导致栈溢出
1825 // 格式化List/Set集合数据
1926 private fun formatCollection (collection : Collection <* >): StringBuilder {
@@ -40,71 +47,71 @@ class EasyFormatter private constructor(private val builder: Builder) {
4047 } else if (data.startsWith(" [" )
4148 && data.endsWith(" ]" )) {
4249 return formatJSONArray(data)
50+ } else if (data.startsWith(" <" )
51+ && data.endsWith(" >" )) {
52+ return formatXML(data)
4353 }
4454
4555 return StringBuilder (data)
4656 }
4757
58+ private fun formatXML (data : String ):StringBuilder {
59+ return try {
60+ val xmlInput = StreamSource (StringReader (data))
61+ val xmlOutput = StreamResult (StringWriter ())
62+ val transformer = TransformerFactory .newInstance().newTransformer()
63+ transformer.setOutputProperty(OutputKeys .INDENT , " yes" )
64+ transformer.setOutputProperty(" {http://xml.apache.org/xslt}indent-amount" , " 2" )
65+ transformer.transform(xmlInput, xmlOutput)
66+ val output = xmlOutput.writer.toString().replaceFirst(" >" .toRegex(), " >\n " )
67+ val lines = output.lines()
68+ val isFlat = isFlat(builder.maxMapSize, lines.size)
69+ val result = StringBuilder ()
70+ if (isFlat.not ()) {
71+ result.append(output)
72+ } else {
73+ lines.forEach { result.append(it.trimIndent()) }
74+ }
75+ result
76+ } catch (e: TransformerException ) {
77+ StringBuilder (data)
78+ }
79+ }
80+
4881 private fun formatJSONArray (data : String ): StringBuilder {
49- val result = StringBuilder (" [" )
50- try {
51- val array = JSONArray (data)
52- val length = array.length()
53- val isFlat = isFlat(builder.maxArraySize, length)
54-
55- for (index in 0 .. (length - 1 )) {
56- val sub = StringBuilder ()
57- if (! isFlat) {
58- result.append(" \n " )
59- }
82+ return try {
83+ val json = JSONArray (data).toString(indent.length)
6084
61- sub.append(formatString(array.optString(index)))
62- if (index != length - 1 ) {
63- sub.append(" ," )
64- }
65- appendSubString(result, sub, isFlat)
66- }
67- if (! isFlat) {
68- result.append(" \n " )
85+ val lines = JSONArray (data).toString(indent.length).lines()
86+ val isFlat = isFlat(builder.maxMapSize, lines.size)
87+ val result = StringBuilder ()
88+ if (isFlat.not ()) {
89+ result.append(json)
90+ } else {
91+ lines.forEach { result.append(it.trimIndent()) }
6992 }
93+ result
7094 } catch (e: Exception ) {
71- return StringBuilder (data)
95+ StringBuilder (data)
7296 }
73- result.append(" ]" )
74- return result
7597 }
7698
7799 private fun formatJSONObject (data : String ): StringBuilder {
78- val result = StringBuilder (" {" )
79- try {
80- val json = JSONObject (data)
81- val length = json.length()
82- val keys = json.keys()
83- val isFlat = isFlat(builder.maxMapSize, length)
84- var hasNext = keys.hasNext()
85- while (hasNext) {
86- if (! isFlat) {
87- result.append(" \n " )
88- }
89-
90- val sub = StringBuilder ()
91- val next = keys.next()
92- sub.append(formatString(next)).append(" :" ).append(json.optString(next))
100+ return try {
101+ val json = JSONObject (data).toString(indent.length)
93102
94- hasNext = keys.hasNext()
95- if (hasNext) {
96- sub.append(" , " )
97- }
98- appendSubString(result, sub, isFlat)
99- }
100- if (! isFlat) {
101- result.append(" \n " )
103+ val lines = JSONArray (data).toString(indent.length).lines()
104+ val isFlat = isFlat(builder.maxMapSize, lines.size)
105+ val result = StringBuilder ()
106+ if (isFlat.not ()) {
107+ result.append(json)
108+ } else {
109+ lines.forEach { result.append(it.trimIndent()) }
102110 }
111+ result
103112 } catch (e: Exception ) {
104- return StringBuilder (data)
113+ StringBuilder (data)
105114 }
106- result.append(" }" )
107- return result
108115 }
109116
110117 private fun isFlat (maxSize : Int , length : Int ):Boolean {
@@ -152,7 +159,7 @@ class EasyFormatter private constructor(private val builder: Builder) {
152159 result.append(value)
153160 result.append(" \n " )
154161 } else {
155- result.append(value.replace( Pattern .compile( " ( \t ) " ).toRegex(), " " ))
162+ result.append(value.trimIndent( ))
156163 }
157164 }
158165 result.toString()
@@ -208,11 +215,11 @@ class EasyFormatter private constructor(private val builder: Builder) {
208215 val lines = subString.lines()
209216 for ((index, value) in lines.withIndex()) {
210217 if (index == 0 ) {
211- if (! isFlat) container.append(" \t " )
218+ if (! isFlat) container.append(indent )
212219 container.append(value)
213220 if (lines.size > 1 ) container.append(" \n " )
214221 } else if (value.isNotEmpty()) {
215- container.append(" \t " ).append(value)
222+ container.append(indent ).append(value)
216223 .append(if (index == lines.size - 1 ) " " else " \n " )
217224 }
218225 }
0 commit comments