flr 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1c066c1bf53372cfb42446a4478e319c4251e2dd6d9c30267135588cadee209f
4
- data.tar.gz: da3036ab6a3452fe35d05321ee068ca8059f88e64d878f249bfaf230ddada681
3
+ metadata.gz: cf8e0a359356f8ea371d681026c47f7e4e649d144a0c1cda4acc051f07404cbd
4
+ data.tar.gz: fbf661e81c360e715695c2b9906ccb0328ed07163a208aab3b1d50ef024a5423
5
5
  SHA512:
6
- metadata.gz: 98e30fa23cae12986881c75b7fc15d6ec7fa2b423d74fd1bc7ba5549f882ff0194211f202867aa30acd3ce81253b70d3d73718022cc3ed9b082e14c8f4cb47d7
7
- data.tar.gz: 2d6cbb7417a21c448860f02bdb41c494d37a05108515542638e0bb6ca36677fc52cfb58e19a132bb2642c2d0b2591eae28ccc77290e817fb506b0046143d217e
6
+ metadata.gz: 6263917c0732cc4b6e772fe024267b8854d9b0f99c6868f2326caa6986dc68015db43f5e24be2bf0f06a3478d84de900099289c6b6ae2780542eb492d50ff93a
7
+ data.tar.gz: 87218e5d6f9d85fbce53246077b8a2e74e7e9df84fc45e221635b2b0c5980373177530b5bb6f4996d8cae1576f3ffc2d3beb741c49a99ee18f2a4c081f0444a8
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 2.0.0
2
+
3
+ - New asset generation algorithm to support all kinds of standard or nonstandard image/text resource structure
4
+ - New asset-id generation algorithm to support assets with the same filename but different path
5
+ - New recommended flutter resource structure
6
+
1
7
  ## 1.1.0
2
8
 
3
9
  - Improve generate-capability to support nonstandard image resource structure
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- flr (1.1.0)
4
+ flr (2.0.0)
5
5
  bundler (~> 2.0, >= 2.0.2)
6
6
  listen (~> 3.0, >= 3.2.1)
7
7
  thor (~> 1.0, >= 1.0.1)
data/lib/flr/checker.rb CHANGED
@@ -12,7 +12,7 @@ module Flr
12
12
  #
13
13
  # === Examples
14
14
  #
15
- # flutter_dir = "~/path/to/flutter_project/pubspec.yaml"
15
+ # flutter_dir = "~path/to/flutter_r_demo"
16
16
  # Checker.check_pubspec_file_is_existed(flutter_dir)
17
17
  #
18
18
  def self.check_pubspec_file_is_existed(flutter_dir)
@@ -63,7 +63,7 @@ module Flr
63
63
  return true
64
64
  end
65
65
 
66
- # check_flr_assets_is_legal(flr_config) -> resource_dir_result_tuple
66
+ # check_flr_assets_is_legal(flutter_dir, flr_config) -> resource_dir_result_tuple
67
67
  #
68
68
  # 检测当前flr配置信息中的assets配置是否合法
69
69
  # 若合法,返回资源目录结果三元组 resource_dir_result_triplet
@@ -88,11 +88,12 @@ module Flr
88
88
  # 判断flr的assets配置合法的标准是:assets配置的resource_dir数组中的legal_resource_dir数量大于0。
89
89
  #
90
90
  # === Examples
91
- # assets_legal_resource_dir_array = ["lib/assets/images", "lib/assets/texts"]
92
- # fonts_legal_resource_dir_array = ["lib/assets/fonts"]
93
- # illegal_resource_dir_array = ["wrong/path/to/non-existed_folder"]
91
+ # flutter_dir = "~/path/to/flutter_r_demo"
92
+ # assets_legal_resource_dir_array = ["~/path/to/flutter_r_demo/lib/assets/images", "~/path/to/flutter_r_demo/lib/assets/texts"]
93
+ # fonts_legal_resource_dir_array = ["~/path/to/flutter_r_demo/lib/assets/fonts"]
94
+ # illegal_resource_dir_array = ["~/path/to/flutter_r_demo/to/non-existed_folder"]
94
95
  #
95
- def self.check_flr_assets_is_legal(flr_config)
96
+ def self.check_flr_assets_is_legal(flutter_dir, flr_config)
96
97
  core_version = flr_config["core_version"]
97
98
  dartfmt_line_length = flr_config["dartfmt_line_length"]
98
99
  assets_resource_dir_array = flr_config["assets"]
@@ -119,7 +120,8 @@ module Flr
119
120
  fonts_legal_resource_dir_array = []
120
121
  illegal_resource_dir_array = []
121
122
 
122
- assets_resource_dir_array.each do |resource_dir|
123
+ assets_resource_dir_array.each do |relative_resource_dir|
124
+ resource_dir = flutter_dir + "/" + relative_resource_dir
123
125
  if File.exist?(resource_dir) == true
124
126
  assets_legal_resource_dir_array.push(resource_dir)
125
127
  else
@@ -127,7 +129,8 @@ module Flr
127
129
  end
128
130
  end
129
131
 
130
- fonts_resource_dir_array.each do |resource_dir|
132
+ fonts_resource_dir_array.each do |relative_resource_dir|
133
+ resource_dir = flutter_dir + "/" + relative_resource_dir
131
134
  if File.exist?(resource_dir) == true
132
135
  fonts_legal_resource_dir_array.push(resource_dir)
133
136
  else
data/lib/flr/command.rb CHANGED
@@ -43,46 +43,46 @@ Flr recommends the following flutter resource structure:
43
43
  │ ├── ..
44
44
  ├── lib
45
45
  │ ├── assets
46
- │ │ ├── \#{module}-images #{"// image resources root directory of a moudle".red}
47
- │ │ │ ├── \#{main_image_asset}
48
- │ │ │ ├── \#{variant-dir} #{"// image resources root directory of a variant".red}
49
- │ │ │ │ ├── \#{image_asset_variant}
50
- │ │ │ │
51
- │ │ ├── home-images #{"// image resources root directory of home module".red}
52
- │ │ │ ├── home_icon.png
53
- │ │ │ ├── home_badge.svg
54
- │ │ │ ├── 3.0x #{"// image resources root directory of a 3.0x-ratio-variant".red}
46
+ │ │ ├── images #{"// image resource directory of all modules".red}
47
+ │ │ │ ├── \#{module} #{"// image resource directory of a module".red}
48
+ │ │ │ ├── \#{main_image_asset}
49
+ │ │ │ │ ├── \#{variant-dir} #{"// image resource directory of a variant".red}
50
+ │ │ │ │ │ ├── \#{image_asset_variant}
51
+ │ │ │ │
52
+ │ │ │ ├── home #{"// image resource directory of home module".red}
53
+ │ │ │ ├── home_badge.svg
55
54
  │ │ │ │ ├── home_icon.png
56
- │ │ │ │
57
- │ │ ├── texts #{"// text resources root directory".red}
55
+ │ │ │ │ ├── 3.0x #{"// image resource directory of a 3.0x-ratio-variant".red}
56
+ │ │ │ │ │ ├── home_icon.png
57
+ │ │ │ │
58
+ │ │ ├── texts #{"// text resource directory".red}
58
59
  │ │ │ │ #{"// (you can also break it down further by module)".red}
59
60
  │ │ │ └── test.json
60
61
  │ │ │ └── test.yaml
61
- │ │ │ │
62
- │ │ ├── fonts #{"// font resources root directory of all font-family".red}
63
- │ │ │ ├── \#{font-family} #{"// font resources root directory of a font-family".red}
62
+ │ │ │ │
63
+ │ │ ├── fonts #{"// font resource directory of all font-families".red}
64
+ │ │ │ ├── \#{font-family} #{"// font resource directory of a font-family".red}
64
65
  │ │ │ │ ├── \#{font-family}-\#{font_weight_or_style}.ttf
65
- │ │ │ │
66
- │ │ │ ├── Amiri #{"// font resources root directory of Amiri font-family".red}
66
+ │ │ │ │
67
+ │ │ │ ├── Amiri #{"// font resource directory of Amiri font-family".red}
67
68
  │ │ │ │ ├── Amiri-Regular.ttf
68
69
  │ │ │ │ ├── Amiri-Bold.ttf
69
70
  │ │ │ │ ├── Amiri-Italic.ttf
70
71
  │ │ │ │ ├── Amiri-BoldItalic.ttf
71
72
  │ ├── ..
72
-
73
+
73
74
  #{"[*]: Then config the resource directories that need to be scanned as follows:".tips_style}
74
75
 
75
- #{"flr:".tips_style}
76
- #{"core_version: #{Flr::CORE_VERSION}".tips_style}
77
- #{"dartfmt_line_length: #{Flr::DARTFMT_LINE_LENGTH}".tips_style}
78
- #{"# config the image and text resource directories that need to be scanned".tips_style}
79
- #{"assets:".tips_style}
80
- #{"- lib/assets/moduleX-images".tips_style}
81
- #{"- lib/assets/home-images".tips_style}
82
- #{"- lib/assets/texts".tips_style}
83
- #{"# config the font resource directories that need to be scanned".tips_style}
84
- #{"fonts:".tips_style}
85
- #{"- lib/assets/fonts".tips_style}
76
+ #{"flr:".tips_style}
77
+ #{"core_version: #{Flr::CORE_VERSION}".tips_style}
78
+ #{"dartfmt_line_length: #{Flr::DARTFMT_LINE_LENGTH}".tips_style}
79
+ #{"# config the image and text resource directories that need to be scanned".tips_style}
80
+ #{"assets:".tips_style}
81
+ #{"- lib/assets/images".tips_style}
82
+ #{"- lib/assets/texts".tips_style}
83
+ #{"# config the font resource directories that need to be scanned".tips_style}
84
+ #{"fonts:".tips_style}
85
+ #{"- lib/assets/fonts".tips_style}
86
86
 
87
87
  MESSAGE
88
88
 
@@ -145,7 +145,9 @@ Flr recommends the following flutter resource structure:
145
145
 
146
146
  dependencies_config = pubspec_config["dependencies"]
147
147
 
148
- # 添加 flr_config pubspec.yaml
148
+ # 添加flr_config到pubspec.yaml:检测当前是否存在flr_config;若不存在,则添加flr_config;若存在,则按照以下步骤处理:
149
+ # - 读取dartfmt_line_length选项、assets选项和fonts选项的值(这些选项值若存在,则应用于新建的flr_config;需要注意,使用前需要判断选项值是否合法:dartfmt_line_length选项值 >=80;assets选项和fonts选项的值为数组)
150
+ # - 新建flr_config,然后使用旧值或者默认值设置各个选项
149
151
  #
150
152
  # flr_config: Flr的配置信息
151
153
  # ```yaml
@@ -155,7 +157,33 @@ Flr recommends the following flutter resource structure:
155
157
  # assets: []
156
158
  # fonts: []
157
159
  # ```
158
- flr_config = Hash["core_version" => "#{Flr::CORE_VERSION}", "dartfmt_line_length" => Flr::DARTFMT_LINE_LENGTH, "assets" => [], "fonts" => []]
160
+
161
+ dartfmt_line_length = Flr::DARTFMT_LINE_LENGTH
162
+ asset_resource_dir_array = []
163
+ font_resource_dir_array = []
164
+
165
+ old_flr_config = pubspec_config["flr"]
166
+ if old_flr_config.is_a?(Hash)
167
+ dartfmt_line_length = old_flr_config["dartfmt_line_length"]
168
+ if dartfmt_line_length.nil? or dartfmt_line_length.is_a?(Integer) == false
169
+ dartfmt_line_length = Flr::DARTFMT_LINE_LENGTH
170
+ end
171
+ if dartfmt_line_length < Flr::DARTFMT_LINE_LENGTH
172
+ dartfmt_line_length = Flr::DARTFMT_LINE_LENGTH
173
+ end
174
+
175
+ asset_resource_dir_array = old_flr_config["assets"]
176
+ if asset_resource_dir_array.nil? or asset_resource_dir_array.is_a?(Array) == false
177
+ asset_resource_dir_array = []
178
+ end
179
+
180
+ font_resource_dir_array = old_flr_config["fonts"]
181
+ if font_resource_dir_array.nil? or font_resource_dir_array.is_a?(Array) == false
182
+ font_resource_dir_array = []
183
+ end
184
+ end
185
+
186
+ flr_config = Hash["core_version" => "#{Flr::CORE_VERSION}", "dartfmt_line_length" => dartfmt_line_length, "assets" => asset_resource_dir_array, "fonts" => font_resource_dir_array]
159
187
  pubspec_config["flr"] = flr_config
160
188
 
161
189
  # 添加 r_dart_library(https://github.com/YK-Unit/r_dart_library)的依赖声明
@@ -258,7 +286,7 @@ Flr recommends the following flutter resource structure:
258
286
 
259
287
  flr_config = pubspec_config["flr"]
260
288
 
261
- resource_dir_result_tuple = Checker.check_flr_assets_is_legal(flr_config)
289
+ resource_dir_result_tuple = Checker.check_flr_assets_is_legal(flutter_project_root_dir, flr_config)
262
290
 
263
291
  rescue Exception => e
264
292
  puts(e.message)
@@ -271,7 +299,10 @@ Flr recommends the following flutter resource structure:
271
299
 
272
300
  # ----- Step-2 Begin -----
273
301
  # 进行核心逻辑版本检测:
274
- # 检测Flr配置中的核心逻辑版本号和当前工具的核心逻辑版本号是否一致;若不一致,则生成“核心逻辑版本不一致”的警告日志,存放到警告日志数组
302
+ # 检测flr_config中的core_version和当前工具的core_version是否一致;若不一致,则按照以下规则处理:
303
+ # - 更新flr_config中的core_version的值为当前工具的core_version;
304
+ # - 生成“核心逻辑版本不一致”的警告日志,存放到警告日志数组。
305
+ #
275
306
 
276
307
  flr_core_version = flr_config["core_version"]
277
308
 
@@ -280,10 +311,12 @@ Flr recommends the following flutter resource structure:
280
311
  end
281
312
 
282
313
  if flr_core_version != Flr::CORE_VERSION
314
+ flr_config["core_version"] = Flr::CORE_VERSION
315
+
283
316
  message = <<-MESSAGE
284
- #{"[!]: warning, the \"core_version\"(CoreLogic version) of the configured Flr tool is #{flr_core_version}, while the \"core_version\"(CoreLogic version) of the currently used Flr tool is #{Flr::CORE_VERSION}".warning_style}
285
- #{"[*]: to fix it, you should make sure that the core logic version of the Flr tool you are currently using is consistent with the configuration".tips_style}
286
- #{"[*]: to get the value of \"core_version\"(CoreLogic version), just run \"flr version\"".tips_style}
317
+ #{"[!]: warning, some team members may be using Flr tool with core_version #{flr_core_version}, while you are using Flr tool with core_version #{Flr::CORE_VERSION}".warning_style}
318
+ #{"[*]: to fix it, you and your team members should use the Flr tool with same core_version".tips_style}
319
+ #{"[*]: \"core_version\" is the core logic version of Flr tool, you can run \"flr version\" to get it".tips_style}
287
320
 
288
321
  MESSAGE
289
322
 
@@ -319,16 +352,18 @@ Flr recommends the following flutter resource structure:
319
352
  puts("scan assets now ...")
320
353
 
321
354
  # ----- Step-4 Begin -----
322
- # 扫描assets_legal_resource_dir数组中的legal_resource_dir,输出image_asset数组和illegal_image_file数组:
355
+ # 扫描assets_legal_resource_dir数组中的legal_resource_dir,输出有序的image_asset数组、non_svg_image_asset数组、svg_image_asset数组、illegal_image_file数组:
323
356
  # - 创建image_asset数组、illegal_image_file数组;
324
357
  # - 遍历assets_legal_resource_dir数组,按照如下处理每个资源目录:
325
- # - 扫描当前资源目录和其第1级的子目录,查找所有image_file;
358
+ # - 扫描当前资源目录和其所有层级的子目录,查找所有image_file;
326
359
  # - 根据legal_resource_file的标准,筛选查找结果生成legal_image_file子数组和illegal_image_file子数组;illegal_image_file子数组合并到illegal_image_file数组;
327
360
  # - 根据image_asset的定义,遍历legal_image_file子数组,生成image_asset子数;组;image_asset子数组合并到image_asset数组。
328
361
  # - 对image_asset数组做去重处理;
329
362
  # - 按照字典顺序对image_asset数组做升序排列(一般使用开发语言提供的默认的sort算法即可);
330
- # - 输出image_asset数组和illegal_image_file数组。
331
- #
363
+ # - 按照SVG分类,从image_asset数组筛选得到有序的non_svg_image_asset数组和svg_image_asset数组:
364
+ # - 按照SVG分类,从image_asset数组筛选得到non_svg_image_asset数组和svg_image_asset数组;
365
+ # - 按照字典顺序对non_svg_image_asset数组和svg_image_asset数组做升序排列(一般使用开发语言提供的默认的sort算法即可);
366
+ # - 输出有序的image_asset数组、non_svg_image_asset数组、svg_image_asset数组、illegal_image_file数组。
332
367
 
333
368
  image_asset_array = []
334
369
  illegal_image_file_array = []
@@ -340,13 +375,28 @@ Flr recommends the following flutter resource structure:
340
375
 
341
376
  illegal_image_file_array += illegal_image_file_subarray
342
377
 
343
- image_asset_subarray = AssetUtil.generate_image_assets(legal_image_file_subarray, resource_dir, package_name)
378
+ image_asset_subarray = AssetUtil.generate_image_assets(flutter_project_root_dir, package_name, legal_image_file_subarray)
344
379
  image_asset_array += image_asset_subarray
345
380
  end
346
381
 
347
382
  image_asset_array.uniq!
348
383
  image_asset_array.sort!
349
384
 
385
+ non_svg_image_asset_array = []
386
+ svg_image_asset_array = []
387
+
388
+ image_asset_array.each do |image_asset|
389
+ if FileUtil.is_svg_image_resource_file?(image_asset)
390
+ svg_image_asset_array.push(image_asset)
391
+ else
392
+ non_svg_image_asset_array.push(image_asset)
393
+ end
394
+
395
+ end
396
+
397
+ non_svg_image_asset_array.sort!
398
+ svg_image_asset_array.sort!
399
+
350
400
  # ----- Step-4 End -----
351
401
 
352
402
  # ----- Step-5 Begin -----
@@ -371,7 +421,7 @@ Flr recommends the following flutter resource structure:
371
421
 
372
422
  illegal_text_file_array += illegal_text_file_subarray
373
423
 
374
- text_asset_subarray = AssetUtil.generate_text_assets(legal_text_file_subarray, resource_dir, package_name)
424
+ text_asset_subarray = AssetUtil.generate_text_assets(flutter_project_root_dir, package_name, legal_text_file_subarray)
375
425
  text_asset_array += text_asset_subarray
376
426
  end
377
427
 
@@ -415,7 +465,7 @@ Flr recommends the following flutter resource structure:
415
465
  next
416
466
  end
417
467
 
418
- font_asset_config_array = AssetUtil.generate_font_asset_configs(legal_font_file_array, font_family_dir, package_name)
468
+ font_asset_config_array = AssetUtil.generate_font_asset_configs(flutter_project_root_dir, package_name, legal_font_file_array)
419
469
  font_asset_config_array.sort!{|a, b| a["asset"] <=> b["asset"]}
420
470
 
421
471
  font_family_config = Hash["family" => font_family_name , "fonts" => font_asset_config_array]
@@ -475,26 +525,31 @@ Flr recommends the following flutter resource structure:
475
525
  puts("specify scanned assets in pubspec.yaml done !!!")
476
526
 
477
527
  # ----- Step-9 Begin -----
478
- # 按照SVG分类,从image_asset数组筛选得到有序的non_svg_image_asset数组和svg_image_asset数组:
479
- # - 按照SVG分类,从image_asset数组筛选得到non_svg_image_asset数组和svg_image_asset数组;
480
- # - 按照字典顺序对non_svg_image_asset数组和svg_image_asset数组做升序排列(一般使用开发语言提供的默认的sort算法即可);
528
+ # 分别遍历non_svg_image_asset数组、svg_image_asset数组、text_asset数组,
529
+ # 根据asset_id生成算法,分别输出non_svg_image_asset_id字典、svg_image_asset_id 字典、text_asset_id字典。
530
+ # 字典的key为asset,value为asset_id。
481
531
  #
532
+ non_svg_image_asset_id_dict = Hash[]
533
+ svg_image_asset_id_dict = Hash[]
534
+ text_asset_id_dict = Hash[]
535
+
536
+ non_svg_image_asset_array.each do |asset|
537
+ used_asset_id_array = non_svg_image_asset_id_dict.values
538
+ asset_id = CodeUtil.generate_asset_id(asset, used_asset_id_array, Flr::PRIOR_NON_SVG_IMAGE_FILE_TYPE)
539
+ non_svg_image_asset_id_dict[asset] = asset_id
540
+ end
482
541
 
483
- non_svg_image_asset_array = []
484
- svg_image_asset_array = []
485
-
486
- image_asset_array.each do |image_asset|
487
- file_extname = File.extname(image_asset).downcase
488
-
489
- if file_extname.eql?(".svg")
490
- svg_image_asset_array.push(image_asset)
491
- else
492
- non_svg_image_asset_array.push(image_asset)
493
- end
542
+ svg_image_asset_array.each do |asset|
543
+ used_asset_id_array = svg_image_asset_id_dict.values
544
+ asset_id = CodeUtil.generate_asset_id(asset, used_asset_id_array, Flr::PRIOR_SVG_IMAGE_FILE_TYPE)
545
+ svg_image_asset_id_dict[asset] = asset_id
494
546
  end
495
547
 
496
- non_svg_image_asset_array.sort!
497
- svg_image_asset_array.sort!
548
+ text_asset_array.each do |asset|
549
+ used_asset_id_array = text_asset_id_dict.values
550
+ asset_id = CodeUtil.generate_asset_id(asset, used_asset_id_array, Flr::PRIOR_TEXT_FILE_TYPE)
551
+ text_asset_id_dict[asset] = asset_id
552
+ end
498
553
 
499
554
  # ----- Step-9 End -----
500
555
 
@@ -533,7 +588,7 @@ Flr recommends the following flutter resource structure:
533
588
  #
534
589
 
535
590
  r_dart_file.puts("\n")
536
- g__R_Image_AssetResource_class_code = CodeUtil.generate__R_Image_AssetResource_class(non_svg_image_asset_array, package_name)
591
+ g__R_Image_AssetResource_class_code = CodeUtil.generate__R_Image_AssetResource_class(non_svg_image_asset_array, non_svg_image_asset_id_dict, package_name)
537
592
  r_dart_file.puts(g__R_Image_AssetResource_class_code)
538
593
 
539
594
  # ----- Step-13 End -----
@@ -543,7 +598,7 @@ Flr recommends the following flutter resource structure:
543
598
  #
544
599
 
545
600
  r_dart_file.puts("\n")
546
- g__R_Svg_AssetResource_class_code = CodeUtil.generate__R_Svg_AssetResource_class(svg_image_asset_array, package_name)
601
+ g__R_Svg_AssetResource_class_code = CodeUtil.generate__R_Svg_AssetResource_class(svg_image_asset_array, svg_image_asset_id_dict, package_name)
547
602
  r_dart_file.puts(g__R_Svg_AssetResource_class_code)
548
603
 
549
604
  # ----- Step-14 End -----
@@ -553,7 +608,7 @@ Flr recommends the following flutter resource structure:
553
608
  #
554
609
 
555
610
  r_dart_file.puts("\n")
556
- g__R_Text_AssetResource_class_code = CodeUtil.generate__R_Text_AssetResource_class(text_asset_array, package_name)
611
+ g__R_Text_AssetResource_class_code = CodeUtil.generate__R_Text_AssetResource_class(text_asset_array, text_asset_id_dict, package_name)
557
612
  r_dart_file.puts(g__R_Text_AssetResource_class_code)
558
613
 
559
614
  # ----- Step-15 End -----
@@ -564,7 +619,7 @@ Flr recommends the following flutter resource structure:
564
619
  #
565
620
 
566
621
  r_dart_file.puts("\n")
567
- g__R_Image_class_code = CodeUtil.generate__R_Image_class(non_svg_image_asset_array, package_name)
622
+ g__R_Image_class_code = CodeUtil.generate__R_Image_class(non_svg_image_asset_array, non_svg_image_asset_id_dict, package_name)
568
623
  r_dart_file.puts(g__R_Image_class_code)
569
624
 
570
625
  # ----- Step-16 End -----
@@ -574,7 +629,7 @@ Flr recommends the following flutter resource structure:
574
629
  #
575
630
 
576
631
  r_dart_file.puts("\n")
577
- g__R_Svg_class_code = CodeUtil.generate__R_Svg_class(svg_image_asset_array, package_name)
632
+ g__R_Svg_class_code = CodeUtil.generate__R_Svg_class(svg_image_asset_array, svg_image_asset_id_dict, package_name)
578
633
  r_dart_file.puts(g__R_Svg_class_code)
579
634
 
580
635
  # ----- Step-17 End -----
@@ -584,7 +639,7 @@ Flr recommends the following flutter resource structure:
584
639
  #
585
640
 
586
641
  r_dart_file.puts("\n")
587
- g__R_Text_class_code = CodeUtil.generate__R_Text_class(text_asset_array, package_name)
642
+ g__R_Text_class_code = CodeUtil.generate__R_Text_class(text_asset_array, text_asset_id_dict, package_name)
588
643
  r_dart_file.puts(g__R_Text_class_code)
589
644
 
590
645
  # ----- Step-18 End -----
@@ -679,7 +734,7 @@ Flr recommends the following flutter resource structure:
679
734
 
680
735
  flr_config = pubspec_config["flr"]
681
736
 
682
- resource_dir_result_tuple = Checker.check_flr_assets_is_legal(flr_config)
737
+ resource_dir_result_tuple = Checker.check_flr_assets_is_legal(flutter_project_root_dir, flr_config)
683
738
 
684
739
  rescue Exception => e
685
740
  puts(e.message)
data/lib/flr/constant.rb CHANGED
@@ -1,6 +1,10 @@
1
1
  module Flr
2
+ # Flr支持的非SVG类图片文件类型
3
+ NON_SVG_IMAGE_FILE_TYPES = %w(.png .jpg .jpeg .gif .webp .icon .bmp .wbmp)
4
+ # Flr支持的SVG类图片文件类型
5
+ SVG_IMAGE_FILE_TYPES = %w(.svg)
2
6
  # Flr支持的图片文件类型
3
- IMAGE_FILE_TYPES = %w(.png .jpg .jpeg .gif .webp .icon .bmp .wbmp .svg)
7
+ IMAGE_FILE_TYPES = NON_SVG_IMAGE_FILE_TYPES + SVG_IMAGE_FILE_TYPES
4
8
  # Flr支持的文本文件类型
5
9
  TEXT_FILE_TYPES = %w(.txt .json .yaml .xml)
6
10
  # Flr支持的字体文件类型
@@ -6,87 +6,158 @@ module Flr
6
6
  # 资产相关的工具类方法
7
7
  class AssetUtil
8
8
 
9
- # generate_image_assets(legal_image_file_array, resource_dir, package_name) -> image_asset_array
9
+ # is_asset_variant?(legal_resource_file) -> true or false
10
+ #
11
+ # 判断当前的资源文件是不是资产变体(asset_variant)类型
12
+ #
13
+ # 判断的核心算法是:
14
+ # - 获取资源文件的父目录;
15
+ # - 判断父目录是否符合资产变体目录的特征
16
+ # 资产变体映射的的资源文件要求存放在“与 main_asset 在同一个目录下的”、“符合指定特征的”子目录中;
17
+ # 截止目前,Flutter只支持一种变体类型:倍率变体;
18
+ # 倍率变体只适用于非SVG类图片资源;
19
+ # 倍率变体目录特征可使用此正则来判断:“^((0\.[0-9]+)|([1-9]+[0-9]*(\.[0-9]+)?))[x]$”;
20
+ # 倍率变体目录名称示例:“0.5x”、“1.5x”、“2.0x”、“3.0x”,“2x”、“3x”;
21
+ #
22
+ def self.is_asset_variant?(legal_resource_file)
23
+
24
+ if FileUtil.is_non_svg_image_resource_file?(legal_resource_file)
25
+ dirname = File.dirname(legal_resource_file)
26
+ parent_dir_name = File.basename(dirname)
27
+
28
+ ratio_regex = /^((0\.[0-9]+)|([1-9]+[0-9]*(\.[0-9]+)?))[x]$/
29
+ if parent_dir_name =~ ratio_regex
30
+ return true
31
+ end
32
+ end
33
+
34
+ return false
35
+ end
36
+
37
+ # generate_main_asset(flutter_dir, package_name, legal_resource_file) -> main_asset
38
+ #
39
+ # 为当前资源文件生成 main_asset
40
+ #
41
+ # === Examples
42
+ # flutter_dir = "~/path/to/flutter_r_demo"
43
+ # package_name = "flutter_r_demo"
44
+ #
45
+ # === Example-1
46
+ # legal_resource_file = "~/path/to/flutter_r_demo/lib/assets/images/test.png"
47
+ # main_asset = "packages/flutter_r_demo/assets/images/test.png"
48
+ #
49
+ # === Example-2
50
+ # legal_resource_file = "~/path/to/flutter_r_demo/lib/assets/images/3.0x/test.png"
51
+ # main_asset = "packages/flutter_r_demo/assets/images/test.png"
52
+ #
53
+ # === Example-3
54
+ # legal_resource_file = "~/path/to/flutter_r_demo/lib/assets/texts/3.0x/test.json"
55
+ # main_asset = "packages/flutter_r_demo/assets/texts/3.0x/test.json"
56
+ #
57
+ # === Example-3
58
+ # legal_resource_file = "~/path/to/flutter_r_demo/lib/assets/fonts/Amiri/Amiri-Regular.ttf"
59
+ # main_asset = "packages/flutter_r_demo/fonts/Amiri/Amiri-Regular.ttf"
60
+ #
61
+ def self.generate_main_asset(flutter_dir, package_name, legal_resource_file)
62
+ # legal_resource_file: ~/path/to/flutter_r_demo/lib/assets/images/3.0x/test.png
63
+ # to get main_resource_file: ~/path/to/flutter_r_demo/lib/assets/images/test.png
64
+ main_resource_file = legal_resource_file
65
+ if is_asset_variant?(legal_resource_file)
66
+ # test.png
67
+ file_basename = File.basename(legal_resource_file)
68
+ # ~/path/to/flutter_r_demo/lib/assets/images/3.0x
69
+ file_dir = File.dirname(legal_resource_file)
70
+ # ~/path/to/flutter_r_demo/lib/assets/images
71
+ main_resource_file_dir = File.dirname(file_dir)
72
+ # ~/path/to/flutter_r_demo/lib/assets/images/test.png
73
+ main_resource_file = main_resource_file_dir + "/" + file_basename
74
+ end
75
+
76
+ # main_resource_file: ~/path/to/flutter_r_demo/lib/assets/images/test.png
77
+ # main_relative_resource_file: lib/assets/images/test.png
78
+ # to get main_implied_relative_resource_file: assets/images/test.png
79
+ flutter_dir_prefix = "#{flutter_dir}/"
80
+ main_relative_resource_file = main_resource_file
81
+ if main_relative_resource_file =~ /\A#{flutter_dir_prefix}/
82
+ main_relative_resource_file["#{flutter_dir_prefix}"] = ""
83
+ end
84
+ lib_prefix = "lib/"
85
+ main_implied_relative_resource_file = main_relative_resource_file;
86
+ if main_implied_relative_resource_file =~ /\A#{lib_prefix}/
87
+ main_implied_relative_resource_file[lib_prefix] = ""
88
+ end
89
+
90
+ main_asset = "packages/#{package_name}/#{main_implied_relative_resource_file}"
91
+ return main_asset
92
+ end
93
+
94
+ # generate_image_assets(flutter_dir, package_name, legal_image_file_array) -> image_asset_array
10
95
  #
11
96
  # 遍历指定资源目录下扫描找到的legal_image_file数组生成image_asset数组
12
97
  #
13
98
  # === Examples
14
- # legal_image_file_array = ["lib/assets/images/test.png"]
15
- # resource_dir = "lib/assets/images"
99
+ # flutter_dir = "~/path/to/flutter_r_demo"
16
100
  # package_name = "flutter_r_demo"
101
+ # legal_image_file_array = ["~/path/to/flutter_r_demo/lib/assets/images/test.png", "~/path/to/flutter_r_demo/lib/assets/images/3.0x/test.png"]
17
102
  # image_asset_array = ["packages/flutter_r_demo/assets/images/test.png"]
18
103
  #
19
- def self.generate_image_assets(legal_image_file_array, resource_dir, package_name)
104
+ def self.generate_image_assets(flutter_dir, package_name, legal_image_file_array)
20
105
 
21
106
  image_asset_array = []
22
107
 
23
- # implied_resource_dir = "assets/images"
24
- implied_resource_dir = resource_dir
25
- if resource_dir.include?("lib/")
26
- implied_resource_dir = resource_dir.split("lib/")[1]
27
- end
28
-
29
108
  legal_image_file_array.each do |legal_image_file|
30
- file_basename = File.basename(legal_image_file)
31
- image_asset = "packages/#{package_name}/#{implied_resource_dir}/#{file_basename}"
109
+ image_asset = generate_main_asset(flutter_dir, package_name, legal_image_file)
32
110
  image_asset_array.push(image_asset)
33
111
  end
34
112
 
113
+ image_asset_array.uniq!
35
114
  return image_asset_array
36
115
  end
37
116
 
38
- # generate_text_assets(legal_text_file_array, resource_dir, package_name) -> text_asset_array
117
+ # generate_text_assets(flutter_dir, package_name, legal_text_file_array) -> text_asset_array
39
118
  #
40
119
  # 遍历指定资源目录下扫描找到的legal_text_file数组生成text_asset数组
41
120
  #
42
121
  # === Examples
43
- # legal_text_file_array = ["lib/assets/jsons/test.json"]
44
- # resource_dir = "lib/assets/jsons"
122
+ # flutter_dir = "~/path/to/flutter_r_demo"
45
123
  # package_name = "flutter_r_demo"
124
+ # legal_text_file_array = ["~path/to/flutter_r_demo/lib/assets/jsons/test.json"]
46
125
  # text_asset_array = ["packages/flutter_r_demo/assets/jsons/test.json"]
47
126
  #
48
- def self.generate_text_assets(legal_text_file_array, resource_dir, package_name)
127
+ def self.generate_text_assets(flutter_dir, package_name, legal_text_file_array)
49
128
 
50
129
  text_asset_array = []
51
130
 
52
131
  legal_text_file_array.each do |legal_text_file|
53
- # implied_resource_file = "assets/jsons/test.json"
54
- implied_resource_file = legal_text_file
55
- if legal_text_file.include?("lib/")
56
- implied_resource_file = legal_text_file.split("lib/")[1]
57
- end
58
- text_asset = "packages/#{package_name}/#{implied_resource_file}"
132
+ text_asset = generate_main_asset(flutter_dir, package_name, legal_text_file)
59
133
  text_asset_array.push(text_asset)
60
134
  end
61
135
 
136
+ text_asset_array.uniq!
62
137
  return text_asset_array
63
138
  end
64
139
 
65
- # generate_font_asset_configs(legal_font_file_array, resource_dir, package_name) -> font_asset_config_array
140
+ # generate_font_asset_configs(flutter_dir, package_name, legal_font_file_array) -> font_asset_config_array
66
141
  #
67
142
  # 遍历指定资源目录下扫描找到的legal_font_file数组生成font_asset_config数组
68
143
  #
69
144
  # === Examples
70
- # legal_font_file_array = ["lib/assets/fonts/Amiri/Amiri-Regular.ttf"]
71
- # resource_dir = "lib/assets/fonts/Amiri"
145
+ # flutter_dir = "~/path/to/flutter_r_demo"
72
146
  # package_name = "flutter_r_demo"
147
+ # legal_font_file_array = ["~path/to/flutter_r_demo/lib/assets/fonts/Amiri/Amiri-Regular.ttf"]
73
148
  # font_asset_config_array -> [{"asset": "packages/flutter_r_demo/assets/fonts/Amiri/Amiri-Regular.ttf"}]
74
149
  #
75
- def self.generate_font_asset_configs(legal_font_file_array, resource_dir, package_name)
150
+ def self.generate_font_asset_configs(flutter_dir, package_name, legal_font_file_array)
76
151
 
77
152
  font_asset_config_array = []
78
153
 
79
154
  legal_font_file_array.each do |legal_font_file|
80
- # implied_resource_file = "assets/fonts/Amiri/Amiri-Regular.ttf"
81
- implied_resource_file = legal_font_file
82
- if legal_font_file.include?("lib/")
83
- implied_resource_file = legal_font_file.split("lib/")[1]
84
- end
85
- font_asset = "packages/#{package_name}/#{implied_resource_file}"
155
+ font_asset = generate_main_asset(flutter_dir, package_name, legal_font_file)
86
156
  font_asset_config = Hash["asset" => font_asset]
87
157
  font_asset_config_array.push(font_asset_config)
88
158
  end
89
159
 
160
+ font_asset_config_array.uniq!{|config| config["asset"]}
90
161
  return font_asset_config_array
91
162
  end
92
163
 
@@ -116,7 +116,7 @@ class AssetResource {
116
116
  return code
117
117
  end
118
118
 
119
- # generate_asset_id (asset, prior_asset_type) -> string
119
+ # generate_asset_id (asset, used_asset_id_array, prior_asset_type) -> string
120
120
  #
121
121
  # - prior_asset_type: 优先的资源类型;默认值为 ".*",意味当前不存在任何优先的资源类型
122
122
  # 对于优先的资源类型,其 asset_id 不会携带类型信息,详细见例子
@@ -126,26 +126,40 @@ class AssetResource {
126
126
  # - 处理非法字符:把除了字母(a-z, A-Z)、数字(0-9)、'_' 字符、'$' 字符之外的字符转换为 '_' 字符
127
127
  # - 首字母转化为小写
128
128
  # - 处理首字符异常情况:检测首字符是不是数字、'_'、'$',若是则添加前缀字符"a"
129
+ # - 处理 asset_id 重名的情况
129
130
  #
130
131
  # === Examples
131
132
  #
132
133
  # ===== Example-1
133
- # a_asset = "packages/flutter_r_demo/assets/images/test.png"
134
- # b_asset = "packages/flutter_r_demo/assets/images/test.jpg"
134
+ # asset = "packages/flutter_r_demo/assets/images/test.png"
135
+ # asset = "packages/flutter_r_demo/assets/images/test.jpg"
136
+ # used_asset_id_array = []
135
137
  # prior_asset_type = ".png"
136
- # a_asset_id = "test"
137
- # b_asset_id = "test_jpg"
138
+ # asset_id = "test"
138
139
  #
139
140
  # ===== Example-2
140
- # a_asset = "packages/flutter_r_demo/assets/texts/test.json"
141
- # b_asset = "packages/flutter_r_demo/assets/texts/test.yaml"
141
+ # asset = "packages/flutter_r_demo/assets/images/test.jpg"
142
+ # used_asset_id_array = [test]
143
+ # prior_asset_type = ".png"
144
+ # asset_id = "test_jpg"
145
+ #
146
+ # ===== Example-3
147
+ # asset = "packages/flutter_r_demo/assets/home-images/test.jpg"
148
+ # used_asset_id_array = [test, test_jpg]
149
+ # prior_asset_type = ".png"
150
+ # asset_id = "test_jpg_1"
151
+ #
152
+ # ===== Example-4
153
+ # asset = "packages/flutter_r_demo/assets/texts/test.json"
154
+ # used_asset_id_array = []
142
155
  # prior_asset_type = ".*"
143
- # a_asset_id = "test_json"
144
- # b_asset_id = "test_yaml"
156
+ # asset_id = "test_json"
145
157
  #
146
- def self.generate_asset_id(asset, prior_asset_type = ".*")
158
+ def self.generate_asset_id(asset, used_asset_id_array, prior_asset_type = ".*")
147
159
  file_extname = File.extname(asset).downcase
148
160
 
161
+ dirname = File.dirname(asset)
162
+ parent_dir_name = File.basename(dirname)
149
163
  file_basename = File.basename(asset)
150
164
 
151
165
  file_basename_no_extension = File.basename(asset, ".*")
@@ -168,6 +182,26 @@ class AssetResource {
168
182
  asset_id = "a" + asset_id
169
183
  end
170
184
 
185
+ # 处理 asset_id 重名的情况
186
+ if used_asset_id_array.include?(asset_id)
187
+ # 当前asset_id重名次数,初始值为1
188
+ repeat_count = 1
189
+
190
+ # 查找当前asset_id衍生出来的asset_id_brother(id兄弟)
191
+ # asset_id_brother = #{asset_id}$#{repeat_count}
192
+ # 其中,repeat_count >= 1
193
+ #
194
+ # Example:
195
+ # asset_id = test
196
+ # asset_id_brother = test$1
197
+ #
198
+ id_brother_regx = /^#{asset_id}\$[1-9][0-9]*$/
199
+ cur_asset_id_brothers = used_asset_id_array.select{ |id| id =~ id_brother_regx }
200
+
201
+ repeat_count += cur_asset_id_brothers.size
202
+ asset_id = "#{asset_id}$#{repeat_count}"
203
+ end
204
+
171
205
  return asset_id
172
206
  end
173
207
 
@@ -190,13 +224,13 @@ class AssetResource {
190
224
  return asset_comment
191
225
  end
192
226
 
193
- # generate_AssetResource_property(asset, package_name, prior_asset_type) -> string
227
+ # generate_AssetResource_property(asset, asset_id_dict, package_name, prior_asset_type) -> string
194
228
  #
195
229
  # 为当前 asset 生成 AssetResource property 的代码
196
230
  #
197
- def self.generate_AssetResource_property(asset, package_name, prior_asset_type = ".*")
231
+ def self.generate_AssetResource_property(asset, asset_id_dict, package_name, prior_asset_type = ".*")
198
232
 
199
- asset_id = generate_asset_id(asset, prior_asset_type)
233
+ asset_id = asset_id_dict[asset]
200
234
  asset_comment = generate_asset_comment(asset, package_name)
201
235
 
202
236
  asset_name = asset.dup
@@ -213,17 +247,17 @@ class AssetResource {
213
247
  return code
214
248
  end
215
249
 
216
- # generate__R_Image_AssetResource_class(non_svg_image_asset_array, package_name) -> string
250
+ # generate__R_Image_AssetResource_class(non_svg_image_asset_array, non_svg_image_asset_id_dict, package_name) -> string
217
251
  #
218
252
  # 根据模板,为 non_svg_image_asset_array(非svg类的图片资产数组)生成 _R_Image_AssetResource class 的代码
219
253
  #
220
- def self.generate__R_Image_AssetResource_class(non_svg_image_asset_array, package_name)
254
+ def self.generate__R_Image_AssetResource_class(non_svg_image_asset_array, non_svg_image_asset_id_dict, package_name)
221
255
 
222
256
  all_g_AssetResource_property_code = ""
223
257
 
224
258
  non_svg_image_asset_array.each do |image_asset|
225
259
  all_g_AssetResource_property_code += "\n"
226
- g_AssetResource_property_code = generate_AssetResource_property(image_asset, package_name, Flr::PRIOR_NON_SVG_IMAGE_FILE_TYPE)
260
+ g_AssetResource_property_code = generate_AssetResource_property(image_asset, non_svg_image_asset_id_dict, package_name, Flr::PRIOR_NON_SVG_IMAGE_FILE_TYPE)
227
261
  all_g_AssetResource_property_code += g_AssetResource_property_code
228
262
  end
229
263
 
@@ -238,17 +272,17 @@ class _R_Image_AssetResource {
238
272
  return code
239
273
  end
240
274
 
241
- # generate__R_Svg_AssetResource_class(image_asset_array, package_name) -> string
275
+ # generate__R_Svg_AssetResource_class(svg_image_asset_array, svg_image_asset_id_dict, package_name) -> string
242
276
  #
243
277
  # 根据模板,为 svg_image_asset_array(svg类的图片资产数组)生成 _R_Svg_AssetResource class 的代码
244
278
  #
245
- def self.generate__R_Svg_AssetResource_class(svg_image_asset_array, package_name)
279
+ def self.generate__R_Svg_AssetResource_class(svg_image_asset_array, svg_image_asset_id_dict, package_name)
246
280
 
247
281
  all_g_AssetResource_property_code = ""
248
282
 
249
283
  svg_image_asset_array.each do |image_asset|
250
284
  all_g_AssetResource_property_code += "\n"
251
- g_AssetResource_property_code = generate_AssetResource_property(image_asset, package_name, Flr::PRIOR_SVG_IMAGE_FILE_TYPE)
285
+ g_AssetResource_property_code = generate_AssetResource_property(image_asset, svg_image_asset_id_dict, package_name, Flr::PRIOR_SVG_IMAGE_FILE_TYPE)
252
286
  all_g_AssetResource_property_code += g_AssetResource_property_code
253
287
  end
254
288
 
@@ -263,17 +297,17 @@ class _R_Svg_AssetResource {
263
297
  return code
264
298
  end
265
299
 
266
- # generate__R_Text_AssetResource_class(text_asset_array, package_name) -> string
300
+ # generate__R_Text_AssetResource_class(text_asset_array, text_asset_id_dict, package_name) -> string
267
301
  #
268
302
  # 根据模板,为 text_asset_array(文本资产数组)生成 _R_Text_AssetResource class 的代码
269
303
  #
270
- def self.generate__R_Text_AssetResource_class(text_asset_array, package_name)
304
+ def self.generate__R_Text_AssetResource_class(text_asset_array, text_asset_id_dict, package_name)
271
305
 
272
306
  all_g_AssetResource_property_code = ""
273
307
 
274
308
  text_asset_array.each do |text_asset|
275
309
  all_g_AssetResource_property_code += "\n"
276
- g_AssetResource_property_code = generate_AssetResource_property(text_asset, package_name, Flr::PRIOR_TEXT_FILE_TYPE)
310
+ g_AssetResource_property_code = generate_AssetResource_property(text_asset, text_asset_id_dict, package_name, Flr::PRIOR_TEXT_FILE_TYPE)
277
311
  all_g_AssetResource_property_code += g_AssetResource_property_code
278
312
  end
279
313
 
@@ -288,18 +322,18 @@ class _R_Text_AssetResource {
288
322
  return code
289
323
  end
290
324
 
291
- # generate__R_Image_class(non_svg_image_asset_array, package_name) -> string
325
+ # generate__R_Image_class(non_svg_image_asset_array, non_svg_image_asset_id_dict, package_name) -> string
292
326
  #
293
327
  # 根据模板,为 non_svg_image_asset_array(非svg类的图片资产数组)生成 _R_Image class 的代码
294
328
  #
295
- def self.generate__R_Image_class(non_svg_image_asset_array, package_name)
329
+ def self.generate__R_Image_class(non_svg_image_asset_array, non_svg_image_asset_id_dict, package_name)
296
330
 
297
331
  all_g_Asset_method_code = ""
298
332
 
299
333
  non_svg_image_asset_array.each do |image_asset|
300
334
  all_g_Asset_method_code += "\n"
301
335
 
302
- asset_id = generate_asset_id(image_asset, Flr::PRIOR_NON_SVG_IMAGE_FILE_TYPE)
336
+ asset_id = non_svg_image_asset_id_dict[image_asset]
303
337
  asset_comment = generate_asset_comment(image_asset, package_name)
304
338
 
305
339
  g_Asset_method_code = <<-CODE
@@ -327,18 +361,18 @@ class _R_Image {
327
361
  return code
328
362
  end
329
363
 
330
- # generate__R_Svg_class(image_asset_array, package_name) -> string
364
+ # generate__R_Svg_class(svg_image_asset_array, svg_image_asset_id_dict, package_name) -> string
331
365
  #
332
366
  # 根据模板,为 svg_image_asset_array(svg类的图片资产数组)生成 _R_Svg class 的代码
333
367
  #
334
- def self.generate__R_Svg_class(svg_image_asset_array, package_name)
368
+ def self.generate__R_Svg_class(svg_image_asset_array, svg_image_asset_id_dict, package_name)
335
369
 
336
370
  all_g_Asset_method_code = ""
337
371
 
338
372
  svg_image_asset_array.each do |image_asset|
339
373
  all_g_Asset_method_code += "\n"
340
374
 
341
- asset_id = generate_asset_id(image_asset, Flr::PRIOR_SVG_IMAGE_FILE_TYPE)
375
+ asset_id = svg_image_asset_id_dict[image_asset]
342
376
  asset_comment = generate_asset_comment(image_asset, package_name)
343
377
 
344
378
  g_Asset_method_code = <<-CODE
@@ -367,18 +401,18 @@ class _R_Svg {
367
401
  return code
368
402
  end
369
403
 
370
- # generate__R_Text_class(text_asset_array, package_name) -> string
404
+ # generate__R_Text_class(text_asset_array, text_asset_id_dict, package_name) -> string
371
405
  #
372
406
  # 根据模板,为 text_asset_array(文本资产数组)生成 _R_Text class 的代码
373
407
  #
374
- def self.generate__R_Text_class(text_asset_array, package_name)
408
+ def self.generate__R_Text_class(text_asset_array, text_asset_id_dict, package_name)
375
409
 
376
410
  all_g_Asset_method_code = ""
377
411
 
378
412
  text_asset_array.each do |text_asset|
379
413
  all_g_Asset_method_code += "\n"
380
414
 
381
- asset_id = generate_asset_id(text_asset, Flr::PRIOR_TEXT_FILE_TYPE)
415
+ asset_id = text_asset_id_dict[text_asset]
382
416
  asset_comment = generate_asset_comment(text_asset, package_name)
383
417
 
384
418
  g_Asset_method_code = <<-CODE
@@ -79,6 +79,61 @@ module Flr
79
79
  return true
80
80
  end
81
81
 
82
+ # 判断当前文件是不是非SVG类图片资源文件
83
+ def self.is_non_svg_image_resource_file?(file)
84
+ file_extname = File.extname(file).downcase
85
+
86
+ if Flr::NON_SVG_IMAGE_FILE_TYPES.include?(file_extname)
87
+ return true;
88
+ end
89
+
90
+ return false
91
+ end
92
+
93
+ # 判断当前文件是不是SVG类图片资源文件
94
+ def self.is_svg_image_resource_file?(file)
95
+ file_extname = File.extname(file).downcase
96
+
97
+ if Flr::SVG_IMAGE_FILE_TYPES.include?(file_extname)
98
+ return true;
99
+ end
100
+
101
+ return false
102
+ end
103
+
104
+ # 判断当前文件是不是图片资源文件
105
+ def self.is_image_resource_file?(file)
106
+ file_extname = File.extname(file).downcase
107
+
108
+ if Flr::IMAGE_FILE_TYPES.include?(file_extname)
109
+ return true;
110
+ end
111
+
112
+ return false
113
+ end
114
+
115
+ # 判断当前文件是不是文本资源文件
116
+ def self.is_text_resource_file?(file)
117
+ file_extname = File.extname(file).downcase
118
+
119
+ if Flr::TEXT_FILE_TYPES.include?(file_extname)
120
+ return true;
121
+ end
122
+
123
+ return false
124
+ end
125
+
126
+ # 判断当前文件是不是字体资源文件
127
+ def self.is_font_resource_file?(file)
128
+ file_extname = File.extname(file).downcase
129
+
130
+ if Flr::FONT_FILE_TYPES.include?(file_extname)
131
+ return true;
132
+ end
133
+
134
+ return false
135
+ end
136
+
82
137
  # is_legal_resource_file??(file) -> true or false
83
138
  #
84
139
  # 判断当前资源文件是否合法
@@ -87,8 +142,8 @@ module Flr
87
142
  # 其file_basename_no_extension 由字母(a-z、A-Z)、数字(0-9)、其他合法字符('_', '+', '-', '.', '·', '!', '@', '&', '$', '¥')组成
88
143
  #
89
144
  # === Examples
90
- # good_file = "lib/assets/images/test.png"
91
- # bad_file = "lib/assets/images/~.png"
145
+ # good_file = "~/path/to/flutter_project/lib/assets/images/test.png"
146
+ # bad_file = "~/path/to/flutter_project/lib/assets/images/~.png"
92
147
  # is_legal_resource_file?(good_file) -> true
93
148
  # is_legal_resource_file?(bad_file) -> false
94
149
  #
@@ -105,26 +160,25 @@ module Flr
105
160
 
106
161
  # find_image_files(resource_dir) -> image_file_result_tuple
107
162
  #
108
- # v1.0.0: 扫描指定的资源目录和其第1级子目录,查找所有图片文件
109
- # v1.1.0: 放开图片资源扫描目录层级限制,以支持不标准的资源组织目录结构
163
+ # 扫描指定的资源目录和其所有层级的子目录,查找所有图片文件
110
164
  # 返回图片文件结果二元组 image_file_result_tuple
111
165
  # image_file_result_tuple = [legal_image_file_array, illegal_image_file_array]
112
166
  #
113
167
  # 判断文件合法的标准参考 self.is_legal_resource_file? 方法
114
168
  #
115
169
  # === Examples
116
- # resource_dir = "lib/assets/images"
117
- # legal_image_file_array = ["lib/assets/images/test.png", "lib/assets/images/2.0x/test.png"]
118
- # illegal_image_file_array = ["lib/assets/images/~.png"]
170
+ # resource_dir = "~/path/to/flutter_project/lib/assets/images"
171
+ # legal_image_file_array = ["~/path/to/flutter_project/lib/assets/images/test.png", "~/path/to/flutter_project/lib/assets/images/2.0x/test.png"]
172
+ # illegal_image_file_array = ["~/path/to/flutter_project/lib/assets/images/~.png"]
119
173
  #
120
174
  def self.find_image_files(resource_dir)
121
175
  legal_image_file_array = []
122
176
  illegal_image_file_array = []
123
177
 
124
178
  pattern_file_types = Flr::IMAGE_FILE_TYPES.join(",")
125
- # dir/*{.png.,.jpg} : 查找当前目录的指定类型文件
126
- # dir/*/*{.png.,.jpg}: 查找当前目录的第1级子目录的指定类型文件
127
- # dir/**/*{.png.,.jpg}: 查找当前目录和其所有子目录的指定类型文件
179
+ # dir/*{.png,.jpg} : 查找当前目录的指定类型文件
180
+ # dir/*/*{.png,.jpg}: 查找当前目录的第1级子目录的指定类型文件
181
+ # dir/**/*{.png,.jpg}: 查找当前目录和其所有子目录的指定类型文件
128
182
  Dir.glob(["#{resource_dir}/**/*{#{pattern_file_types}}"]).each do |file|
129
183
  if is_legal_resource_file?(file)
130
184
  legal_image_file_array.push(file)
@@ -146,9 +200,9 @@ module Flr
146
200
  # 判断文件合法的标准参考 self.is_legal_resource_file? 方法
147
201
  #
148
202
  # === Examples
149
- # resource_dir = "lib/assets/jsons"
150
- # legal_text_file_array = ["lib/assets/jsons/city.json", "lib/assets/jsons/mock/city.json"]
151
- # illegal_text_file_array = ["lib/assets/jsons/~.json"]
203
+ # resource_dir = "~/path/to/flutter_project/lib/assets/jsons"
204
+ # legal_text_file_array = ["~/path/to/flutter_project/lib/assets/jsons/city.json", "~/path/to/flutter_project/lib/assets/jsons/mock/city.json"]
205
+ # illegal_text_file_array = ["~/path/to/flutter_project/lib/assets/jsons/~.json"]
152
206
  #
153
207
  def self.find_text_files(resource_dir)
154
208
  legal_text_file_array = []
@@ -173,7 +227,8 @@ module Flr
173
227
  # 扫描指定的资源目录,返回其所有第一级子目录
174
228
  #
175
229
  # === Examples
176
- # top_child_dir_array = ["lib/assets/fonts/Amiri", "lib/assets/fonts/Open_Sans"]
230
+ # resource_dir = "~/path/to/flutter_project/lib/assets/fonts"
231
+ # top_child_dir_array = ["~/path/to/flutter_project/lib/assets/fonts/Amiri", "~/path/to/flutter_project/lib/assets/fonts/Open_Sans"]
177
232
  #
178
233
  def self.find_top_child_dirs(resource_dir)
179
234
  top_child_dir_array = []
@@ -196,9 +251,9 @@ module Flr
196
251
  # 判断文件合法的标准参考 self.is_legal_resource_file? 方法
197
252
  #
198
253
  # === Examples
199
- # font_family_dir = "lib/assets/fonts/Amiri"
200
- # legal_font_file_array = ["lib/assets/fonts/Amiri/Amiri-Regular.ttf", "lib/assets/fonts/Amiri/Amiri-Bold.ttf"]
201
- # illegal_font_file_array = ["lib/assets/fonts/Amiri/~.ttf"]
254
+ # font_family_dir = "~/path/to/flutter_project/lib/assets/fonts/Amiri"
255
+ # legal_font_file_array = ["~/path/to/flutter_project/lib/assets/fonts/Amiri/Amiri-Regular.ttf", "~/path/to/flutter_project/lib/assets/fonts/Amiri/Amiri-Bold.ttf"]
256
+ # illegal_font_file_array = ["~/path/to/flutter_project/lib/assets/fonts/Amiri/~.ttf"]
202
257
  #
203
258
  def self.find_font_files_in_font_family_dir(font_family_dir)
204
259
  legal_font_file_array = []
data/lib/flr/version.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  module Flr
2
2
  # 工具版本号
3
- VERSION = "1.1.0"
3
+ VERSION = "2.0.0"
4
4
 
5
5
  # 核心逻辑版本号
6
- CORE_VERSION = "1.0.0"
6
+ CORE_VERSION = "2.0.0"
7
7
 
8
8
  class Version < Array
9
9
  def initialize str
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flr
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - York
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-01 00:00:00.000000000 Z
11
+ date: 2020-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler