include_utils.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. import re
  4. def auto_parse_include(text, suffix, callback=None):
  5. # 遍历所有的 '@include' 标签
  6. xml = suffix == ".xml"
  7. java = suffix == ".java"
  8. if xml:
  9. frgment_new_instance_matches = re.findall(r'<include[\s\S]*?/>', text)
  10. # print(f"发现include标签:{matches}")
  11. # 如果存在 '@include' 标签,取出标签中的 layout
  12. if frgment_new_instance_matches:
  13. for match in frgment_new_instance_matches:
  14. layout = re.search(r'layout=\"@layout/([^\"]+)\"', match).group(1)
  15. if layout and callback:
  16. callback(f"{layout}.xml")
  17. # print(f"解析到include标签:{layout}.xml")
  18. # 遍历所有的viewStub
  19. frgment_new_instance_matches = re.findall(r'<ViewStub[\s\S]*?/>', text)
  20. if frgment_new_instance_matches:
  21. for match in frgment_new_instance_matches:
  22. view_stub = re.search(r'layout=\"@layout/([^\"]+)\"', match).group(1)
  23. print(f"解析到ViewStub:{view_stub}")
  24. if view_stub and callback:
  25. callback(f"{view_stub}.xml")
  26. # 遍历所有的background
  27. drawable_background = re.findall(r'android:background=\"@drawable/([^\"]+)\"', text)
  28. if drawable_background:
  29. for match in drawable_background:
  30. print(f"解析到background:{match}")
  31. if match and callback:
  32. callback(f"{match}.xml")
  33. # 遍历所有的src
  34. drawable_src = re.findall(r'android:src=\"@drawable/([^\"]+)\"', text)
  35. if drawable_src:
  36. for match in drawable_src:
  37. print(f"解析到src:{match}")
  38. if match and callback:
  39. callback(f"{match}.xml")
  40. if java:
  41. # 遍历所有的 'R.layout.xxxxxxx' 代码
  42. frgment_new_instance_matches = re.findall(r'R\.layout\.\w*\b', text)
  43. if frgment_new_instance_matches:
  44. for match in frgment_new_instance_matches:
  45. layout = re.search(r'R\.layout\.(\w*)\b', match).group(1)
  46. if layout and callback:
  47. callback(f"{layout}.xml")
  48. # 遍历所有的viewBinding
  49. # inflate 或者 bind匹配
  50. bind_inflate_matches = re.findall(r'(\w+Binding)\.(?:bind|inflate)+', text)
  51. if bind_inflate_matches:
  52. for match in bind_inflate_matches:
  53. v1 = re.search(r'(\w+)Binding', match).group(1)
  54. print(f"解析到viewBinding:{v1} bind或者inflate")
  55. # 将v2的驼峰改为下划线命名,首字母小写
  56. v1 = re.sub(r'(?<!^)([A-Z])', r'_\1', v1).lower()
  57. if v1 and callback:
  58. callback(f"{v1}.xml")
  59. # 泛型匹配
  60. generics_matches = re.findall(r'<(?:.*Model\s*,\s*)?(\w+)Binding(?:\s*,\s*(\w+)?Binding)?>', text)
  61. if generics_matches:
  62. for match in generics_matches:
  63. for v2 in match:
  64. if v2:
  65. print(f"解析到viewBinding:{v2} 泛型匹配")
  66. # 将v2的驼峰改为下划线命名,首字母小写
  67. v2 = re.sub(r'(?<!^)([A-Z])', r'_\1', v2).lower()
  68. if v2 and callback:
  69. callback(f"{v2}.xml")
  70. # 遍历所有的fragment
  71. # 取出 public class StrategyFragment extends的类名
  72. class_name = re.findall(r'\s+class\s+(\w+Fragment\d?)\s+', text)
  73. class_name = class_name[0] if class_name else None
  74. # 匹配*Fragment.newInstance
  75. frgment_new_instance_matches = re.findall(r'\b(\w+Fragment\d?)\.newI', text)
  76. if frgment_new_instance_matches:
  77. for fragment in frgment_new_instance_matches:
  78. print(f"解析到fragment newInstance:{fragment}")
  79. if fragment and callback:
  80. callback(f'{fragment}.java')
  81. # 匹配new *Fragment()
  82. new_fragment_matches = re.findall(r'\bnew\s+(\w+Fragment\d?)\(', text)
  83. if new_fragment_matches:
  84. for new_fragment in new_fragment_matches:
  85. # 不匹配new 自己的class
  86. no_new_self = not (new_fragment == class_name)
  87. if new_fragment and no_new_self and callback:
  88. print(f"解析到fragment new:{new_fragment}")
  89. callback(f'{new_fragment}.java')
  90. # 遍历所有的adapter
  91. # 取出 public class StrategyFragment extends的类名
  92. class_name = re.findall(r'\s+class\s+(\w+Adapter\d?)\s+', text)
  93. class_name = class_name[0] if class_name else None
  94. # 匹配*Adapter.newInstance
  95. adapter_new_instance_matches = re.findall(r'\b(\w+Adapter\d?)\.newI', text)
  96. if adapter_new_instance_matches:
  97. for adapter in adapter_new_instance_matches:
  98. print(f"解析到adapter newInstance:{adapter}")
  99. if adapter and callback:
  100. callback(f'{adapter}.java')
  101. # 匹配new *Adapter()
  102. new_adapter_matches = re.findall(r'\bnew\s+(\w+Adapter\d?)\(', text)
  103. if new_adapter_matches:
  104. for new_adapter in new_adapter_matches:
  105. # 不匹配new 自己的class
  106. no_new_self = not (new_adapter == class_name)
  107. if new_adapter and no_new_self and callback:
  108. print(f"解析到adapter new:{new_adapter}")
  109. callback(f'{new_adapter}.java')
  110. # 遍历所有的delegate
  111. # 取出 public class StrategyFragment extends的类名
  112. class_name = re.findall(r'\s+class\s+(\w+Delegate\d?)\s+', text)
  113. class_name = class_name[0] if class_name else None
  114. # 匹配*Delegate.newInstance
  115. delegate_new_instance_matches = re.findall(r'\b(\w+Delegate\d?)\.newI', text)
  116. if delegate_new_instance_matches:
  117. for delegate in delegate_new_instance_matches:
  118. print(f"解析到delegate newInstance:{delegate}")
  119. if delegate and callback:
  120. callback(f'{delegate}.java')
  121. # 匹配new *Delegate()
  122. new_delegate_matches = re.findall(r'\bnew\s+(\w+Delegate\d?)\(', text)
  123. if new_delegate_matches:
  124. for new_delegate in new_delegate_matches:
  125. # 不匹配new 自己的class
  126. no_new_self = not (new_delegate == class_name)
  127. if new_delegate and no_new_self and callback:
  128. print(f"解析到delegate new:{new_delegate}")
  129. callback(f'{new_delegate}.java')