Browse Source

【Token解析】1.Border-width分类解析 2.优化工具类代码

liuxiaolong 2 years ago
parent
commit
fd09a970d2

+ 1 - 0
app/src/main/res/values/colors.xml

@@ -4,4 +4,5 @@
     <color name="white">#FFFFFFFF</color>
 
     <color name="app_line_color">#FFC5E7FF</color>
+
 </resources>

+ 4 - 3
lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/MdParseGlobalUtil.kt

@@ -32,9 +32,10 @@ class MdParseGlobalUtil(var filePath: String, var destFolderPath : String) {
         val jsonObj = JSONObject(json)
         val map = getTokensCategoryData(jsonObj)
         for (entry in map) {
-            val parse = ParseTokenFactory.factory(entry.key)
-            parse?.parse(entry.key, entry.value)
-            parse?.generateTokenFile(ParseTokenFactory.getSavePathByCategory(destFolderPath, entry.key))
+            val key = entry.key.replace("-","_")
+            val parse = ParseTokenFactory.factory(key)
+            parse?.parse(key, entry.value)
+            parse?.generateTokenFile(ParseTokenFactory.getSavePathByCategory(destFolderPath, key))
         }
 
 

+ 3 - 0
lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/TokenCategory.kt

@@ -11,6 +11,9 @@ enum class TokenCategory {
     sizing,
 
     spacing,
+
     color,
 
+    border_width,
+
 }

+ 2 - 1
lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/base/FileUtil.kt

@@ -23,7 +23,8 @@ object FileUtil {
             it.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
             it.append("<resources>\n")
             for (pair in token) {
-                it.append("    <${xmlItemName} name=\"${pair.first}\">${pair.second}</${xmlItemName}>\n")
+                val key = pair.first.replace("-","_").replace(".","_")
+                it.append("    <${xmlItemName} name=\"${key}\">${pair.second}</${xmlItemName}>\n")
             }
             it.append("</resources>")
         }

+ 5 - 0
lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/ParseTokenFactory.kt

@@ -1,6 +1,7 @@
 package com.kdanmobile.android.lib.material.tokens.category
 
 import com.kdanmobile.android.lib.material.tokens.TokenCategory
+import com.kdanmobile.android.lib.material.tokens.category.borderwidth.BorderWidthParse
 import com.kdanmobile.android.lib.material.tokens.category.color.ColorParse
 import com.kdanmobile.android.lib.material.tokens.category.sizeing.SizeingParse
 import com.kdanmobile.android.lib.material.tokens.category.spacing.SpacingParse
@@ -25,6 +26,9 @@ object ParseTokenFactory {
                 //todo 此处待验证,保存的值还没有加单位,应该是px, 但需要具体项目再测一下
                 SpacingParse()
             }
+            TokenCategory.border_width.name-> {
+                BorderWidthParse()
+            }
             TokenCategory.color.name ->{
                 ColorParse()
             }
@@ -37,6 +41,7 @@ object ParseTokenFactory {
             TokenCategory.sizing.name -> "values/token_sizing.xml"
             TokenCategory.spacing.name -> "values/token_spacing.xml"
             TokenCategory.color.name -> "values/token_colors.xml"
+            TokenCategory.border_width.name -> "values/token_border_width.xml"
             else -> ""
         }.run {
             if (isNullOrEmpty().not()){

+ 71 - 0
lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/borderwidth/BorderWidthParse.kt

@@ -0,0 +1,71 @@
+package com.kdanmobile.android.lib.material.tokens.category.borderwidth
+
+import com.kdanmobile.android.lib.material.tokens.base.FileUtil
+import com.kdanmobile.android.lib.material.tokens.base.Log
+import com.kdanmobile.android.lib.material.tokens.base.XMLUtil
+import com.kdanmobile.android.lib.material.tokens.base.logT
+import com.kdanmobile.android.lib.material.tokens.category.IParseToken
+import org.json.JSONObject
+import java.io.File
+import javax.xml.parsers.SAXParserFactory
+
+/**
+ * @classname:
+ * @author: LiuXiaoLong
+ * @date: 2023/2/13
+ * description: 解析Border_width相关token
+ */
+class BorderWidthParse : IParseToken {
+
+    private var result = hashMapOf<String, String>()
+
+    private var tag = "解析BorderWidth"
+
+
+    override fun parse(rootKey: String, jsonObject: JSONObject) {
+        println("开始解析${rootKey}类型Tokens")
+        for (itemKey in jsonObject.keys()) {
+            val key = itemKey as String
+            val value = jsonObject.get(key)
+            val names = (value as JSONObject).names()
+            if (names.length() == 2 && names.getString(0).equals("type") || names.getString(0).equals("value")) {
+                val sizingValue = value.getString("value")
+                result["${rootKey}_${key}"] = sizingValue
+            } else {
+                parse("${rootKey}_$key", value)
+            }
+        }
+
+
+    }
+
+
+    /**
+     * 生成token文件
+     */
+    override fun generateTokenFile(destFilePath: String?) {
+
+        if (destFilePath.isNullOrEmpty()){
+            logT(tag, "保存路径为空---return")
+            return
+        }
+
+        logT(tag, "开始生成Sizing Token文件")
+        Log.t(tag, "token文件输出路径:${destFilePath}")
+
+        val file = File(destFilePath)
+        val outputData = FileUtil.parseAndMergeOldData(tag, file, BorderWidthXmlParserHandler(), result)
+            .sortedBy {
+                it.second.toInt()
+            }.map {
+                it.first to it.second +"dp"
+            }
+        FileUtil.writeTokens(file, "integer", outputData)
+        logT(tag, "解析生成文件完成-----")
+
+    }
+
+
+
+}
+

+ 46 - 0
lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/borderwidth/BorderWidthXmlParserHandler.kt

@@ -0,0 +1,46 @@
+package com.kdanmobile.android.lib.material.tokens.category.borderwidth
+
+import com.kdanmobile.android.lib.material.tokens.base.BaseXmlHandler
+import org.xml.sax.Attributes
+import org.xml.sax.helpers.DefaultHandler
+
+/**
+ * @classname:
+ * @author: LiuXiaoLong
+ * @date: 2023/2/13
+ * description: Sizing类型token 解析器,获取xml文件已经存在的 sizing数据
+ */
+class BorderWidthXmlParserHandler : BaseXmlHandler() {
+
+
+    override fun startElement(uri: String?, localName: String?, qName: String?, attributes: Attributes?) {
+        super.startElement(uri, localName, qName, attributes)
+
+        if (qName.equals("integer")) {
+            for (i in 0 until attributes!!.length) {
+                name = attributes?.getValue(i)
+            }
+        }
+
+    }
+
+    override fun endElement(uri: String?, localName: String?, qName: String?) {
+        super.endElement(uri, localName, qName)
+        try {
+            if (name.isNullOrEmpty().not() && value.isNullOrEmpty().not() && "\n".equals(value).not()) {
+                maps[name!!] = value!!
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+
+    }
+
+
+    override fun characters(ch: CharArray, start: Int, length: Int) {
+        super.characters(ch, start, length)
+        value = String(ch, start, length)
+    }
+
+
+}

+ 6 - 5
lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/color/ColorParse.kt

@@ -29,8 +29,8 @@ class ColorParse : IParseToken {
             val value = jsonObject.get(key)
             val names = (value as JSONObject).names()
             if (names.length() == 2 && names.getString(0).equals("type") || names.getString(0).equals("value")) {
-                val sizingValue = value.getString("value")
-                result["${rootKey}_${key}"] = sizingValue
+                val colorValue = value.getString("value")
+                result["${rootKey}_${key}"] = colorValue
             } else {
                 parse("${rootKey}_$key", value)
             }
@@ -43,7 +43,7 @@ class ColorParse : IParseToken {
      */
     override fun generateTokenFile(destFilePath: String?) {
 
-        if (destFilePath.isNullOrEmpty()){
+        if (destFilePath.isNullOrEmpty()) {
             logT(tag, "保存路径为空---return")
             return
         }
@@ -52,6 +52,9 @@ class ColorParse : IParseToken {
 
         val file = File(destFilePath)
         val outputList = FileUtil.parseAndMergeOldData(tag, file, ColorXmlParserHandler(), result)
+            .sortedByDescending {
+                it.first
+            }
         FileUtil.writeTokens(file, "color", outputList)
 
         logT(tag, "解析生成文件完成-----")
@@ -59,7 +62,5 @@ class ColorParse : IParseToken {
     }
 
 
-
-
 }
 

+ 5 - 0
lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/sizeing/SizeingParse.kt

@@ -55,6 +55,11 @@ class SizeingParse : IParseToken {
 
         val file = File(destFilePath)
         val outputData = FileUtil.parseAndMergeOldData(tag, file, SizingXmlParserHandler(), result)
+            .sortedBy {
+                it.second.toInt()
+            }.map {
+                it.first to it.second +"px"
+            }
         FileUtil.writeTokens(file, "integer", outputData)
         logT(tag, "解析生成文件完成-----")
 

+ 6 - 0
lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/spacing/SpacingParse.kt

@@ -54,6 +54,12 @@ class SpacingParse : IParseToken {
 
         val file = File(destFilePath)
         val resultData = FileUtil.parseAndMergeOldData(tag, file, SpacingXmlParserHandler(), result)
+            .sortedBy {
+                it.second.toInt()
+            }
+            .map {
+                it.first to it.second +"px"
+            }
         FileUtil.writeTokens(file, "integer", resultData)
 
         logT(tag, "解析生成文件完成-----")