Browse Source

【DesignToken】优化代码结构

liuxiaolong 2 years ago
parent
commit
5ce5c33fd1
16 changed files with 140 additions and 178 deletions
  1. 5 0
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/MdParseGlobalUtil.kt
  2. 2 0
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/TokenCategory.kt
  3. 2 3
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/base/FileUtil.kt
  4. 8 0
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/base/Log.kt
  5. 0 2
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/base/XMLUtil.kt
  6. 21 0
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/base/XmlParserDataCategory.kt
  7. 5 0
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/ParseTokenFactory.kt
  8. 66 0
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/borderradius/BorderRadiusParse.kt
  9. 5 7
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/borderwidth/BorderWidthParse.kt
  10. 7 8
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/color/ColorParse.kt
  11. 0 45
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/color/ColorXmlParserHandler.kt
  12. 10 8
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/borderwidth/BorderWidthXmlParserHandler.kt
  13. 4 6
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/sizeing/SizeingParse.kt
  14. 0 46
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/sizeing/SizingXmlParserHandler.kt
  15. 5 7
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/spacing/SpacingParse.kt
  16. 0 46
      lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/spacing/SpacingXmlParserHandler.kt

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

@@ -1,6 +1,8 @@
 package com.kdanmobile.android.lib.material.tokens.category
 
 import com.kdanmobile.android.lib.material.tokens.TokenCategory
+import com.kdanmobile.android.lib.material.tokens.base.logE
+import com.kdanmobile.android.lib.material.tokens.base.logT
 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
@@ -36,6 +38,9 @@ class MdParseGlobalUtil(var filePath: String, var destFolderPath : String) {
             val parse = ParseTokenFactory.factory(key)
             parse?.parse(key, entry.value)
             parse?.generateTokenFile(ParseTokenFactory.getSavePathByCategory(destFolderPath, key))
+            if (parse == null){
+                logE("解析器","未解析tokens类型:${entry.key}")
+            }
         }
 
 

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

@@ -16,4 +16,6 @@ enum class TokenCategory {
 
     border_width,
 
+    border_radius
+
 }

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

@@ -1,6 +1,5 @@
 package com.kdanmobile.android.lib.material.tokens.base
 
-import com.kdanmobile.android.lib.material.tokens.category.spacing.SpacingXmlParserHandler
 import java.io.File
 
 /**
@@ -18,13 +17,13 @@ object FileUtil {
      * @param xmlItemName 条目名称: integer、color...
      * @param token 写入的数据
      */
-    fun writeTokens(file: File, xmlItemName : String, token : List<Pair<String, String>>){
+    fun writeTokens(file: File, xmlItemName : XmlParserDataCategory, token : List<Pair<String, String>>){
         file.bufferedWriter().use {
             it.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
             it.append("<resources>\n")
             for (pair in token) {
                 val key = pair.first.replace("-","_").replace(".","_")
-                it.append("    <${xmlItemName} name=\"${key}\">${pair.second}</${xmlItemName}>\n")
+                it.append("    <${xmlItemName.name} name=\"${key}\">${pair.second}</${xmlItemName.name}>\n")
             }
             it.append("</resources>")
         }

+ 8 - 0
lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/base/Log.kt

@@ -13,8 +13,16 @@ object Log {
         println(tag +": ${msg}")
     }
 
+    fun e(tag: String, msg: String){
+        System.err.println(tag +": ${msg}")
+    }
+
 }
 
 fun logT(tag: String, msg: String){
     Log.t(tag, msg)
+}
+
+fun logE(tag: String, msg: String){
+    Log.e(tag, msg)
 }

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

@@ -1,7 +1,5 @@
 package com.kdanmobile.android.lib.material.tokens.base
 
-import com.kdanmobile.android.lib.material.tokens.category.color.ColorXmlParserHandler
-import org.xml.sax.helpers.DefaultHandler
 import java.io.File
 import javax.xml.parsers.SAXParserFactory
 

+ 21 - 0
lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/base/XmlParserDataCategory.kt

@@ -0,0 +1,21 @@
+package com.kdanmobile.android.lib.material.tokens.base
+
+/**
+ * @classname:
+ * @author: LiuXiaoLong
+ * @date: 2023/2/14
+ * description:
+ */
+enum class XmlParserDataCategory {
+
+    /**
+     * 数值类型 px dp等
+     */
+    integer,
+
+    /**
+     * 颜色类型
+     */
+    color
+
+}

+ 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.borderradius.BorderRadiusParse
 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
@@ -32,6 +33,9 @@ object ParseTokenFactory {
             TokenCategory.color.name ->{
                 ColorParse()
             }
+            TokenCategory.border_radius.name ->{
+                BorderRadiusParse()
+            }
             else -> null
         }
     }
@@ -42,6 +46,7 @@ object ParseTokenFactory {
             TokenCategory.spacing.name -> "values/token_spacing.xml"
             TokenCategory.color.name -> "values/token_colors.xml"
             TokenCategory.border_width.name -> "values/token_border_width.xml"
+            TokenCategory.border_radius.name -> "values/token_border_radius.xml"
             else -> ""
         }.run {
             if (isNullOrEmpty().not()){

+ 66 - 0
lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/borderradius/BorderRadiusParse.kt

@@ -0,0 +1,66 @@
+package com.kdanmobile.android.lib.material.tokens.category.borderradius
+
+import com.kdanmobile.android.lib.material.tokens.base.*
+import com.kdanmobile.android.lib.material.tokens.category.IParseToken
+import com.kdanmobile.android.lib.material.tokens.category.common.CommonXmlParserHandler
+import org.json.JSONObject
+import java.io.File
+
+/**
+ * @classname:
+ * @author: LiuXiaoLong
+ * @date: 2023/2/13
+ * description: 解析Sizing相关token
+ */
+class BorderRadiusParse : IParseToken {
+
+    private var result = hashMapOf<String, String>()
+
+    private var tag = "解析BorderRadius"
+
+
+    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 borderRadiusValue = value.getString("value")
+                result["${rootKey}_${key}"] = borderRadiusValue
+            } else {
+                parse("${rootKey}_$key", value)
+            }
+        }
+    }
+
+
+    /**
+     * 生成token文件
+     */
+    override fun generateTokenFile(destFilePath: String?) {
+
+        if (destFilePath.isNullOrEmpty()) {
+            logT(tag, "保存路径为空---return")
+            return
+        }
+        logT(tag, "开始生成BorderRadius Token文件")
+        Log.t(tag, "token文件输出路径:${destFilePath}")
+
+        val file = File(destFilePath)
+        val outputList = FileUtil.parseAndMergeOldData(tag, file, CommonXmlParserHandler(XmlParserDataCategory.integer), result)
+            .sortedBy {
+                it.second.toInt()
+            }
+            .map {
+                it.first to it.second +"dp"
+            }
+        FileUtil.writeTokens(file, XmlParserDataCategory.integer, outputList)
+
+        logT(tag, "解析生成文件完成-----")
+
+    }
+
+
+}
+

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

@@ -1,10 +1,8 @@
 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.base.*
 import com.kdanmobile.android.lib.material.tokens.category.IParseToken
+import com.kdanmobile.android.lib.material.tokens.category.common.CommonXmlParserHandler
 import org.json.JSONObject
 import java.io.File
 import javax.xml.parsers.SAXParserFactory
@@ -50,17 +48,17 @@ class BorderWidthParse : IParseToken {
             return
         }
 
-        logT(tag, "开始生成Sizing Token文件")
+        logT(tag, "开始生成BorderWidth Token文件")
         Log.t(tag, "token文件输出路径:${destFilePath}")
 
         val file = File(destFilePath)
-        val outputData = FileUtil.parseAndMergeOldData(tag, file, BorderWidthXmlParserHandler(), result)
+        val outputData = FileUtil.parseAndMergeOldData(tag, file, CommonXmlParserHandler(XmlParserDataCategory.integer), result)
             .sortedBy {
                 it.second.toInt()
             }.map {
                 it.first to it.second +"dp"
             }
-        FileUtil.writeTokens(file, "integer", outputData)
+        FileUtil.writeTokens(file, XmlParserDataCategory.integer, outputData)
         logT(tag, "解析生成文件完成-----")
 
     }

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

@@ -1,10 +1,8 @@
 package com.kdanmobile.android.lib.material.tokens.category.color
 
-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.base.*
 import com.kdanmobile.android.lib.material.tokens.category.IParseToken
+import com.kdanmobile.android.lib.material.tokens.category.common.CommonXmlParserHandler
 import org.json.JSONObject
 import java.io.File
 import javax.xml.parsers.SAXParserFactory
@@ -30,7 +28,8 @@ class ColorParse : IParseToken {
             val names = (value as JSONObject).names()
             if (names.length() == 2 && names.getString(0).equals("type") || names.getString(0).equals("value")) {
                 val colorValue = value.getString("value")
-                result["${rootKey}_${key}"] = colorValue
+                val key = "${rootKey}_${key}".replace("-","_").replace(".","_")
+                result[key] = colorValue
             } else {
                 parse("${rootKey}_$key", value)
             }
@@ -47,15 +46,15 @@ class ColorParse : IParseToken {
             logT(tag, "保存路径为空---return")
             return
         }
-        logT(tag, "开始生成Sizing Token文件")
+        logT(tag, "开始生成Color Token文件")
         Log.t(tag, "token文件输出路径:${destFilePath}")
 
         val file = File(destFilePath)
-        val outputList = FileUtil.parseAndMergeOldData(tag, file, ColorXmlParserHandler(), result)
+        val outputList = FileUtil.parseAndMergeOldData(tag, file, CommonXmlParserHandler(XmlParserDataCategory.color), result)
             .sortedByDescending {
                 it.first
             }
-        FileUtil.writeTokens(file, "color", outputList)
+        FileUtil.writeTokens(file, XmlParserDataCategory.color, outputList)
 
         logT(tag, "解析生成文件完成-----")
 

+ 0 - 45
lib_material_tokens/src/main/java/com/kdanmobile/android/lib/material/tokens/category/color/ColorXmlParserHandler.kt

@@ -1,45 +0,0 @@
-package com.kdanmobile.android.lib.material.tokens.category.color
-
-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 ColorXmlParserHandler : BaseXmlHandler() {
-
-    override fun startElement(uri: String?, localName: String?, qName: String?, attributes: Attributes?) {
-        super.startElement(uri, localName, qName, attributes)
-
-        if (qName.equals("color")) {
-            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)
-    }
-
-
-}

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

@@ -1,39 +1,41 @@
-package com.kdanmobile.android.lib.material.tokens.category.borderwidth
+package com.kdanmobile.android.lib.material.tokens.category.common
+
 
 import com.kdanmobile.android.lib.material.tokens.base.BaseXmlHandler
+import com.kdanmobile.android.lib.material.tokens.base.XmlParserDataCategory
 import org.xml.sax.Attributes
-import org.xml.sax.helpers.DefaultHandler
 
 /**
  * @classname:
  * @author: LiuXiaoLong
  * @date: 2023/2/13
- * description: Sizing类型token 解析器,获取xml文件已经存在的 sizing数据
+ * description: 通用的解析器,获取xml文件已经存在的数据
+ * @param dataCategory 要读取的数据类型
+ * @see XmlParserDataCategory
  */
-class BorderWidthXmlParserHandler : BaseXmlHandler() {
+class CommonXmlParserHandler(var dataCategory : XmlParserDataCategory) : BaseXmlHandler() {
 
 
     override fun startElement(uri: String?, localName: String?, qName: String?, attributes: Attributes?) {
         super.startElement(uri, localName, qName, attributes)
-
-        if (qName.equals("integer")) {
+        if (qName.equals(dataCategory.name)) {
             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()) {
+                name = name?.replace("-","_")?.replace(".","_")
                 maps[name!!] = value!!
             }
         } catch (e: Exception) {
             e.printStackTrace()
         }
-
     }
 
 

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

@@ -1,10 +1,8 @@
 package com.kdanmobile.android.lib.material.tokens.category.sizeing
 
-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.base.*
 import com.kdanmobile.android.lib.material.tokens.category.IParseToken
+import com.kdanmobile.android.lib.material.tokens.category.common.CommonXmlParserHandler
 import org.json.JSONObject
 import java.io.File
 import javax.xml.parsers.SAXParserFactory
@@ -54,13 +52,13 @@ class SizeingParse : IParseToken {
         Log.t(tag, "token文件输出路径:${destFilePath}")
 
         val file = File(destFilePath)
-        val outputData = FileUtil.parseAndMergeOldData(tag, file, SizingXmlParserHandler(), result)
+        val outputData = FileUtil.parseAndMergeOldData(tag, file, CommonXmlParserHandler(XmlParserDataCategory.integer), result)
             .sortedBy {
                 it.second.toInt()
             }.map {
                 it.first to it.second +"px"
             }
-        FileUtil.writeTokens(file, "integer", outputData)
+        FileUtil.writeTokens(file, XmlParserDataCategory.integer, outputData)
         logT(tag, "解析生成文件完成-----")
 
     }

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

@@ -1,46 +0,0 @@
-package com.kdanmobile.android.lib.material.tokens.category.sizeing
-
-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 SizingXmlParserHandler : 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)
-    }
-
-
-}

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

@@ -1,10 +1,8 @@
 package com.kdanmobile.android.lib.material.tokens.category.spacing
 
-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.base.*
 import com.kdanmobile.android.lib.material.tokens.category.IParseToken
+import com.kdanmobile.android.lib.material.tokens.category.common.CommonXmlParserHandler
 import org.json.JSONObject
 import java.io.File
 import javax.xml.parsers.SAXParserFactory
@@ -49,18 +47,18 @@ class SpacingParse : IParseToken {
             logT(tag, "保存路径为空---return")
             return
         }
-        logT(tag, "开始生成Sizing Token文件")
+        logT(tag, "开始生成Spacing Token文件")
         Log.t(tag, "token文件输出路径:${destFilePath}")
 
         val file = File(destFilePath)
-        val resultData = FileUtil.parseAndMergeOldData(tag, file, SpacingXmlParserHandler(), result)
+        val resultData = FileUtil.parseAndMergeOldData(tag, file, CommonXmlParserHandler(XmlParserDataCategory.integer), result)
             .sortedBy {
                 it.second.toInt()
             }
             .map {
                 it.first to it.second +"px"
             }
-        FileUtil.writeTokens(file, "integer", resultData)
+        FileUtil.writeTokens(file, XmlParserDataCategory.integer, resultData)
 
         logT(tag, "解析生成文件完成-----")
 

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

@@ -1,46 +0,0 @@
-package com.kdanmobile.android.lib.material.tokens.category.spacing
-
-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 SpacingXmlParserHandler : 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)
-    }
-
-
-}