admiral-tools-figma 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +1 -0
- data/admiral-tools-figma.gemspec +9 -0
- data/admiraltools/actions/figma_download_images.rb +116 -0
- data/admiraltools/actions/figma_generate_styles.rb +77 -0
- data/admiraltools/actions/figma_get_image_links.rb +139 -0
- data/admiraltools/actions/figma_get_styles.rb +90 -0
- data/admiraltools/helper/admiraltools_helper.rb +18 -0
- data/admiraltools/helper/figma/figma_client/figma_client.rb +193 -0
- data/admiraltools/helper/figma/figma_client/models/api/primitives/figma_color.rb +35 -0
- data/admiraltools/helper/figma/figma_client/models/api/primitives/figma_component.rb +58 -0
- data/admiraltools/helper/figma/figma_client/models/api/primitives/figma_components_styles_meta.rb +30 -0
- data/admiraltools/helper/figma/figma_client/models/api/primitives/figma_frame_info.rb +46 -0
- data/admiraltools/helper/figma/figma_client/models/api/primitives/figma_node.rb +43 -0
- data/admiraltools/helper/figma/figma_client/models/api/primitives/figma_paint.rb +32 -0
- data/admiraltools/helper/figma/figma_client/models/api/primitives/figma_style.rb +48 -0
- data/admiraltools/helper/figma/figma_client/models/api/primitives/figma_type_style.rb +56 -0
- data/admiraltools/helper/figma/figma_client/models/api/results/figma_components_styles_result.rb +36 -0
- data/admiraltools/helper/figma/figma_client/models/api/results/figma_images_result.rb +25 -0
- data/admiraltools/helper/figma/figma_client/models/api/results/figma_nodes_result.rb +52 -0
- data/admiraltools/helper/figma/figma_client/models/domain/converters/figma_to_domain_converter.rb +98 -0
- data/admiraltools/helper/figma/figma_client/models/domain/primitives/color.rb +44 -0
- data/admiraltools/helper/figma/figma_client/models/domain/primitives/component.rb +86 -0
- data/admiraltools/helper/figma/figma_client/models/domain/primitives/components_list.rb +29 -0
- data/admiraltools/helper/figma/figma_client/models/domain/primitives/font.rb +56 -0
- data/admiraltools/helper/figma/figma_client/models/domain/primitives/frame_info.rb +46 -0
- data/admiraltools/helper/figma/figma_client/models/domain/primitives/image_link.rb +33 -0
- data/admiraltools/helper/figma/figma_client/models/domain/primitives/style.rb +113 -0
- data/admiraltools/helper/figma/figma_client/models/domain/primitives/styles_group.rb +22 -0
- data/admiraltools/helper/figma/figma_client/models/domain/primitives/styles_list.rb +29 -0
- data/admiraltools/helper/figma/figma_client/models/models.rb +25 -0
- data/admiraltools/helper/figma/figma_image_downloader/bin/svg2vectordrawable.jar +0 -0
- data/admiraltools/helper/figma/figma_image_downloader/figma_image_downloader.rb +65 -0
- data/admiraltools/helper/figma/figma_image_downloader/generators/folder_generator.rb +47 -0
- data/admiraltools/helper/figma/figma_image_downloader/generators/folder_generator_raw.rb +32 -0
- data/admiraltools/helper/figma/figma_image_downloader/generators/folder_generator_res.rb +38 -0
- data/admiraltools/helper/figma/figma_image_downloader/generators/folder_generator_xcassets.rb +180 -0
- data/admiraltools/helper/figma/figma_image_downloader/generators/generators.rb +6 -0
- data/admiraltools/helper/figma/figma_image_downloader/helpers/image_name_formatter.rb +72 -0
- data/admiraltools/helper/figma/figma_image_downloader/helpers/progress_tasks_logger.rb +22 -0
- data/admiraltools/helper/figma/figma_image_downloader/helpers/scale_formatter.rb +96 -0
- data/admiraltools/helper/figma/figma_image_downloader/helpers/svg_to_vector_converter.rb +12 -0
- data/admiraltools/helper/figma/figma_image_downloader/models/download_image_params.rb +31 -0
- data/admiraltools/helper/figma/figma_image_downloader/models/image_name_components.rb +10 -0
- data/admiraltools/helper/figma/figma_image_downloader/models/image_ref.rb +12 -0
- data/admiraltools/helper/figma/figma_image_downloader/models/image_set_ref.rb +14 -0
- data/admiraltools/helper/figma/figma_image_downloader/models/models.rb +5 -0
- data/admiraltools/helper/figma/figma_template_generator/figma_template_generator.rb +22 -0
- data/admiraltools/helper/figma/figma_template_generator/models/styles_template.rb +34 -0
- data/admiraltools/helper/figma/helpers/file_folder.rb +30 -0
- data/admiraltools/helper/figma/helpers/hash_access.rb +18 -0
- data/admiraltools/helper/figma/helpers/string_filters.rb +63 -0
- data/admiraltools/helper/figma/helpers/string_format.rb +60 -0
- data/admiraltools/helper/system/system.rb +17 -0
- data/admiraltools/version.rb +7 -0
- data/admiraltools.rb +18 -0
- metadata +96 -0
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../models/image_name_components'
|
4
|
+
require_relative '../../helpers/string_format'
|
5
|
+
|
6
|
+
class ImageNameFormatter
|
7
|
+
def separate(name:, naming_style:, folder_depth:, page_name: nil, frame_name: nil)
|
8
|
+
name = File.join([page_name, frame_name, name].compact)
|
9
|
+
full_name = format_path(name)
|
10
|
+
path_components = slice_name(name: full_name, folder_depth: folder_depth)
|
11
|
+
name = format_name(name: path_components.name, naming_style: naming_style)
|
12
|
+
folder = format_folder(folder: path_components.folder, naming_style: naming_style)
|
13
|
+
ImageNameComponents.new(name: name, folder: folder)
|
14
|
+
end
|
15
|
+
|
16
|
+
def image_path(group_name:, image_link:, single_scale:, convert_to_dpi: false)
|
17
|
+
if single_scale
|
18
|
+
"#{group_name}.#{image_link.image_format}"
|
19
|
+
else
|
20
|
+
scale = ScaleFormatter.new.formatted_scale(scale: image_link.scale, convert_to_dpi: convert_to_dpi)
|
21
|
+
"#{group_name}@#{scale}.#{image_link.image_format}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def format_name(name:, naming_style:)
|
28
|
+
format_string(string: name, naming_style: naming_style).lowercase_first_letter
|
29
|
+
end
|
30
|
+
|
31
|
+
def format_folder(folder:, naming_style:)
|
32
|
+
folder.split('/').map { |f| format_string(string: f, naming_style: naming_style) }.join('/')
|
33
|
+
end
|
34
|
+
|
35
|
+
def format_string(string:, naming_style:)
|
36
|
+
string ||= ''
|
37
|
+
case naming_style
|
38
|
+
when String::FORMAT_STYLE_CAMELCASE
|
39
|
+
string.camelcase('-', '_', ' ', '/')
|
40
|
+
when String::FORMAT_STYLE_SNAKECASE
|
41
|
+
string.snakecase
|
42
|
+
when String::FORMAT_STYLE_KEBABCASE
|
43
|
+
string.kebabcase
|
44
|
+
else
|
45
|
+
string
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def slice_name(name:, folder_depth:)
|
50
|
+
path_components = (name || '').split('/') || []
|
51
|
+
max_index = max(path_components.length - 1, 0)
|
52
|
+
folder_depth = folder_depth.negative? ? max_index : folder_depth
|
53
|
+
max_depth = max(folder_depth, 0)
|
54
|
+
|
55
|
+
folder = path_components[0, max_depth].join('/') || ''
|
56
|
+
name = path_components[max_depth..max_index].join('/') || ''
|
57
|
+
|
58
|
+
ImageNameComponents.new(name: name, folder: folder)
|
59
|
+
end
|
60
|
+
|
61
|
+
def format_path(path)
|
62
|
+
path.split('/').map(&:strip).join('/')
|
63
|
+
end
|
64
|
+
|
65
|
+
def min(a, b)
|
66
|
+
[a, b].min
|
67
|
+
end
|
68
|
+
|
69
|
+
def max(a, b)
|
70
|
+
[a, b].max
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class ProgressTasksLogger
|
4
|
+
attr_accessor :total_count, :current_count
|
5
|
+
|
6
|
+
def initialize(total_count:)
|
7
|
+
@total_count = total_count
|
8
|
+
@current_count = 0
|
9
|
+
end
|
10
|
+
|
11
|
+
def reset
|
12
|
+
self.current_count = 0
|
13
|
+
end
|
14
|
+
|
15
|
+
def increment(value: 1)
|
16
|
+
self.current_count += value
|
17
|
+
end
|
18
|
+
|
19
|
+
def progress_string
|
20
|
+
"(#{current_count}/#{total_count})"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class ScaleFormatter
|
4
|
+
def scales_from_dpis(dpis)
|
5
|
+
return [] if dpis.nil?
|
6
|
+
|
7
|
+
dpis.map { |d| scale_from_dpi(d) }.compact
|
8
|
+
end
|
9
|
+
|
10
|
+
def dpis_from_scales(scales)
|
11
|
+
return [] if scales.nil?
|
12
|
+
|
13
|
+
scales.map { |s| dpi_from_scale(s) }.compact
|
14
|
+
end
|
15
|
+
|
16
|
+
def any_scales_to_scales(scales)
|
17
|
+
return [] if scales.nil?
|
18
|
+
|
19
|
+
result_scales = []
|
20
|
+
scales.each do |scale|
|
21
|
+
case scale
|
22
|
+
when String
|
23
|
+
converted_scale = scale_from_dpi(scale)
|
24
|
+
if !converted_scale.nil?
|
25
|
+
result_scales.push(converted_scale)
|
26
|
+
else
|
27
|
+
float_scale = scale.to_f
|
28
|
+
result_scales.push(float_scale) unless float_scale.nil?
|
29
|
+
end
|
30
|
+
when Numeric
|
31
|
+
result_scales.push(scale)
|
32
|
+
else
|
33
|
+
next
|
34
|
+
end
|
35
|
+
end
|
36
|
+
result_scales.uniq
|
37
|
+
end
|
38
|
+
|
39
|
+
def scale_from_dpi(dpi)
|
40
|
+
dpi = dpi.downcase
|
41
|
+
case dpi
|
42
|
+
when 'ldpi'
|
43
|
+
0.75
|
44
|
+
when 'mdpi'
|
45
|
+
1.0
|
46
|
+
when 'hdpi'
|
47
|
+
1.5
|
48
|
+
when 'xhdpi'
|
49
|
+
2.0
|
50
|
+
when 'xxhdpi'
|
51
|
+
3.0
|
52
|
+
when 'xxxhdpi'
|
53
|
+
4.0
|
54
|
+
else
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def dpi_from_scale(scale)
|
60
|
+
scale = scale.round(2)
|
61
|
+
case scale
|
62
|
+
when 0.75
|
63
|
+
'ldpi'
|
64
|
+
when 1.0
|
65
|
+
'mdpi'
|
66
|
+
when 1.5
|
67
|
+
'hdpi'
|
68
|
+
when 2.0
|
69
|
+
'xhdpi'
|
70
|
+
when 3.0
|
71
|
+
'xxhdpi'
|
72
|
+
when 4.0
|
73
|
+
'xxxhdpi'
|
74
|
+
else
|
75
|
+
nil
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def formatted_scale(scale:, convert_to_dpi: false)
|
80
|
+
return nil if scale.nil?
|
81
|
+
|
82
|
+
dpi_scale = dpi_from_scale(scale)
|
83
|
+
|
84
|
+
if convert_to_dpi && !dpi_scale.nil?
|
85
|
+
dpi_scale
|
86
|
+
else
|
87
|
+
"#{scale.to_s_formatted.gsub(/[.,]/, '_')}x"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
class Numeric
|
93
|
+
def to_s_formatted
|
94
|
+
to_s.chomp('.0')
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class SvtToVectorConverter
|
4
|
+
def convert(input_file:, output_file: nil)
|
5
|
+
return unless ['.svg'].include?(File.extname(input_file))
|
6
|
+
|
7
|
+
name = File.join(File.dirname(input_file), File.basename(input_file, File.extname(input_file)))
|
8
|
+
output_file = output_file.nil? ? "#{name}.xml" : output_file
|
9
|
+
jar_file = File.join(File.dirname(__FILE__), '../bin/svg2vectordrawable.jar')
|
10
|
+
system("java -jar #{jar_file} #{input_file} #{output_file} true")
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class DownloadImageParams
|
4
|
+
attr_accessor :image_components, :output_folder, :folder_depth, :output_format, :naming_style,
|
5
|
+
:xcassets_params, :convert_svg_to_vector, :convert_scales_to_dpi,
|
6
|
+
:include_page_name, :include_frame_name
|
7
|
+
|
8
|
+
def initialize(
|
9
|
+
image_components:,
|
10
|
+
output_folder:,
|
11
|
+
folder_depth:,
|
12
|
+
output_format:,
|
13
|
+
naming_style:,
|
14
|
+
xcassets_params:,
|
15
|
+
convert_svg_to_vector:,
|
16
|
+
convert_scales_to_dpi:,
|
17
|
+
include_page_name:,
|
18
|
+
include_frame_name:
|
19
|
+
)
|
20
|
+
@image_components = image_components
|
21
|
+
@output_folder = output_folder
|
22
|
+
@folder_depth = folder_depth
|
23
|
+
@output_format = output_format
|
24
|
+
@naming_style = naming_style
|
25
|
+
@xcassets_params = xcassets_params
|
26
|
+
@convert_svg_to_vector = convert_svg_to_vector
|
27
|
+
@convert_scales_to_dpi = convert_scales_to_dpi
|
28
|
+
@include_page_name = include_page_name
|
29
|
+
@include_frame_name = include_frame_name
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'image_ref'
|
4
|
+
|
5
|
+
class ImageSetRef
|
6
|
+
attr_accessor :name, :folder, :image_refs, :single_scale
|
7
|
+
|
8
|
+
def initialize(name:, folder:, image_refs:, single_scale:)
|
9
|
+
@name = name || ''
|
10
|
+
@folder = folder || ''
|
11
|
+
@image_refs = image_refs || []
|
12
|
+
@single_scale = single_scale
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'models/styles_template'
|
4
|
+
|
5
|
+
class FigmaTemplateGenerator
|
6
|
+
def generate(styles:, style_types:, template_path:, output_path:)
|
7
|
+
require 'liquid'
|
8
|
+
Liquid::Template.register_filter(StringFilters)
|
9
|
+
|
10
|
+
styles = styles.select { |s| (style_types.nil? || style_types.include?(s.style_type)) }
|
11
|
+
template_data = StylesTemplate.new(styles: styles).to_hash
|
12
|
+
|
13
|
+
dir_name = File.dirname(output_path)
|
14
|
+
FileUtils.mkdir_p(dir_name) unless File.directory?(dir_name)
|
15
|
+
|
16
|
+
template = File.read(template_path)
|
17
|
+
output = Liquid::Template.parse(template).render(template_data)
|
18
|
+
output_file = File.open(output_path, 'w')
|
19
|
+
output_file.write(output)
|
20
|
+
output_file.close unless output.nil?
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../figma_client/figma_client'
|
4
|
+
|
5
|
+
class StylesTemplate
|
6
|
+
attr_accessor :groups, :styles, :common_style_names
|
7
|
+
|
8
|
+
def initialize(styles:)
|
9
|
+
styles = styles.sort_by(&:name)
|
10
|
+
@styles = styles
|
11
|
+
|
12
|
+
groups_hash = {}
|
13
|
+
|
14
|
+
styles.each do |s|
|
15
|
+
group = groups_hash[s.name_info.group_name] || StylesGroup.new(name: s.name_info.group_name, styles: [])
|
16
|
+
group.styles.push(s)
|
17
|
+
groups_hash[s.name_info.group_name] = group
|
18
|
+
end
|
19
|
+
|
20
|
+
@groups = groups_hash.map { |_key, value| value }
|
21
|
+
|
22
|
+
@common_style_names = styles
|
23
|
+
.uniq { |s| s.name_info.style_name }
|
24
|
+
.map { |s| s.name_info.style_name }
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_hash
|
28
|
+
hash = {}
|
29
|
+
hash['styles'] = styles.map(&:to_hash)
|
30
|
+
hash['groups'] = groups.map(&:to_hash)
|
31
|
+
hash['common_style_names'] = common_style_names
|
32
|
+
hash
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
class File
|
6
|
+
def self.open_file(file_name:, mode:, create_directories:)
|
7
|
+
create_directories = !create_directories.nil? || false
|
8
|
+
if create_directories
|
9
|
+
dirname = File.dirname(file_name)
|
10
|
+
FileUtils.mkdir_p(dirname) unless File.directory?(dirname)
|
11
|
+
end
|
12
|
+
File.open(file_name, mode)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.read_file_json(path:)
|
16
|
+
if File.exist?(path)
|
17
|
+
text = File.read(path)
|
18
|
+
JSON.parse(text)
|
19
|
+
else
|
20
|
+
nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.write_file_json(hash:, path:, create_directories: true)
|
25
|
+
file = File.open_file(file_name: path, mode: 'w', create_directories: create_directories)
|
26
|
+
json = JSON.pretty_generate(hash)
|
27
|
+
file.write(json)
|
28
|
+
file.close
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Hash
|
4
|
+
def dig_set(keys, value, force = false, delete_if_nil = true)
|
5
|
+
final_key = keys.pop
|
6
|
+
position = self
|
7
|
+
keys.each do |key|
|
8
|
+
position[key] = {} if !position[key].is_a?(Hash) && force
|
9
|
+
position = position[key]
|
10
|
+
break if position.nil?
|
11
|
+
end
|
12
|
+
if delete_if_nil && value.nil?
|
13
|
+
position&.delete(final_key)
|
14
|
+
else
|
15
|
+
position[final_key] = value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'string_format'
|
4
|
+
|
5
|
+
module StringFilters
|
6
|
+
# Letter case
|
7
|
+
|
8
|
+
def uppercase_first_letter(input)
|
9
|
+
input.uppercase_first_letter
|
10
|
+
end
|
11
|
+
|
12
|
+
def lowercase_first_letter(input)
|
13
|
+
input.lowercase_first_letter
|
14
|
+
end
|
15
|
+
|
16
|
+
# Snake case
|
17
|
+
|
18
|
+
def snakecase(input)
|
19
|
+
input.snakecase
|
20
|
+
end
|
21
|
+
|
22
|
+
def upper_snakecase(input)
|
23
|
+
input.snakecase.uppercase_first_letter
|
24
|
+
end
|
25
|
+
|
26
|
+
def lower_snakecase(input)
|
27
|
+
input.snakecase.lowercase_first_letter
|
28
|
+
end
|
29
|
+
|
30
|
+
# Kebab case
|
31
|
+
|
32
|
+
def kebabcase(input)
|
33
|
+
input.kebabcase
|
34
|
+
end
|
35
|
+
|
36
|
+
def upper_kebabcase(input)
|
37
|
+
input.kebabcase.uppercase_first_letter
|
38
|
+
end
|
39
|
+
|
40
|
+
def lower_kebabcase(input)
|
41
|
+
input.kebabcase.lowercase_first_letter
|
42
|
+
end
|
43
|
+
|
44
|
+
# Camel case
|
45
|
+
|
46
|
+
def camelcase_s(input, *separators)
|
47
|
+
input.camelcase(separators)
|
48
|
+
end
|
49
|
+
|
50
|
+
def upper_camelcase(input, *separators)
|
51
|
+
input.camelcase(separators)
|
52
|
+
end
|
53
|
+
|
54
|
+
def lower_camelcase(input, *separators)
|
55
|
+
input.camelcase(separators)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Formatting
|
59
|
+
|
60
|
+
def default_format(input)
|
61
|
+
input.default_format
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class String
|
4
|
+
FORMAT_STYLE_CAMELCASE = 'camelcase'
|
5
|
+
FORMAT_STYLE_SNAKECASE = 'snakecase'
|
6
|
+
FORMAT_STYLE_KEBABCASE = 'kebabcase'
|
7
|
+
|
8
|
+
def uppercase_first_letter
|
9
|
+
capitalize
|
10
|
+
end
|
11
|
+
|
12
|
+
def lowercase_first_letter
|
13
|
+
return self unless length.positive?
|
14
|
+
|
15
|
+
self[0, 1].downcase + self[1..-1]
|
16
|
+
end
|
17
|
+
|
18
|
+
def snakecase
|
19
|
+
gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
20
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
21
|
+
.tr('-', '_')
|
22
|
+
.gsub(/\s/, '_')
|
23
|
+
.gsub(/__+/, '_')
|
24
|
+
.downcase
|
25
|
+
end
|
26
|
+
|
27
|
+
def kebabcase
|
28
|
+
snakecase.gsub(/_/, '-')
|
29
|
+
end
|
30
|
+
|
31
|
+
def camelcase(*separators)
|
32
|
+
case separators.first
|
33
|
+
when Symbol, TrueClass, FalseClass, NilClass
|
34
|
+
first_letter = separators.shift
|
35
|
+
end
|
36
|
+
|
37
|
+
separators = ['_', '\s'] if separators.empty?
|
38
|
+
|
39
|
+
str = dup
|
40
|
+
|
41
|
+
separators.each do |s|
|
42
|
+
str = str.gsub(/(?:#{s}+)([a-zA-Z0-9])/) { Regexp.last_match(1).upcase }
|
43
|
+
end
|
44
|
+
|
45
|
+
case first_letter
|
46
|
+
when :upper, true
|
47
|
+
str = str.gsub(/(\A|\s)([a-z])/) { Regexp.last_match(1) + Regexp.last_match(2).upcase }
|
48
|
+
when :lower, false
|
49
|
+
str = str.gsub(/(\A|\s)([A-Z])/) { Regexp.last_match(1) + Regexp.last_match(2).downcase }
|
50
|
+
end
|
51
|
+
|
52
|
+
str
|
53
|
+
end
|
54
|
+
|
55
|
+
def default_format
|
56
|
+
available_symbols_regex = /[^a-zA-Z0-9_]/
|
57
|
+
separator_symbols = [' ', '_', '-', '/']
|
58
|
+
camelcase(separator_symbols).gsub(available_symbols_regex, '').lowercase_first_letter
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
def syscall(*cmd)
|
2
|
+
require 'open3'
|
3
|
+
stdout, = Open3.capture3(*cmd)
|
4
|
+
stdout
|
5
|
+
end
|
6
|
+
|
7
|
+
def syscall_safe(*cmd)
|
8
|
+
syscall(*cmd)
|
9
|
+
rescue StandardError
|
10
|
+
''
|
11
|
+
end
|
12
|
+
|
13
|
+
class String
|
14
|
+
def extract_by_regex(regex)
|
15
|
+
(regex.match(self) || [])[0]
|
16
|
+
end
|
17
|
+
end
|
data/admiraltools.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#require 'fastlane/plugin/admiraltools/version'
|
4
|
+
#
|
5
|
+
module Fastlane
|
6
|
+
module Admiraltools
|
7
|
+
# Return all .rb files inside the "actions" and "helpers" directory
|
8
|
+
def self.all_classes
|
9
|
+
Dir[File.expand_path('**/{actions,helpers}/*.rb', File.dirname(__FILE__))]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# By default we want to import all available actions and helpers
|
15
|
+
# A plugin can contain any number of actions and plugins
|
16
|
+
Fastlane::Admiraltools.all_classes.each do |current|
|
17
|
+
require current
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: admiral-tools-figma
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Admiral team
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-09-04 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: The tool to download figma icons
|
14
|
+
email:
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- README.md
|
20
|
+
- admiral-tools-figma.gemspec
|
21
|
+
- admiraltools.rb
|
22
|
+
- admiraltools/actions/figma_download_images.rb
|
23
|
+
- admiraltools/actions/figma_generate_styles.rb
|
24
|
+
- admiraltools/actions/figma_get_image_links.rb
|
25
|
+
- admiraltools/actions/figma_get_styles.rb
|
26
|
+
- admiraltools/helper/admiraltools_helper.rb
|
27
|
+
- admiraltools/helper/figma/figma_client/figma_client.rb
|
28
|
+
- admiraltools/helper/figma/figma_client/models/api/primitives/figma_color.rb
|
29
|
+
- admiraltools/helper/figma/figma_client/models/api/primitives/figma_component.rb
|
30
|
+
- admiraltools/helper/figma/figma_client/models/api/primitives/figma_components_styles_meta.rb
|
31
|
+
- admiraltools/helper/figma/figma_client/models/api/primitives/figma_frame_info.rb
|
32
|
+
- admiraltools/helper/figma/figma_client/models/api/primitives/figma_node.rb
|
33
|
+
- admiraltools/helper/figma/figma_client/models/api/primitives/figma_paint.rb
|
34
|
+
- admiraltools/helper/figma/figma_client/models/api/primitives/figma_style.rb
|
35
|
+
- admiraltools/helper/figma/figma_client/models/api/primitives/figma_type_style.rb
|
36
|
+
- admiraltools/helper/figma/figma_client/models/api/results/figma_components_styles_result.rb
|
37
|
+
- admiraltools/helper/figma/figma_client/models/api/results/figma_images_result.rb
|
38
|
+
- admiraltools/helper/figma/figma_client/models/api/results/figma_nodes_result.rb
|
39
|
+
- admiraltools/helper/figma/figma_client/models/domain/converters/figma_to_domain_converter.rb
|
40
|
+
- admiraltools/helper/figma/figma_client/models/domain/primitives/color.rb
|
41
|
+
- admiraltools/helper/figma/figma_client/models/domain/primitives/component.rb
|
42
|
+
- admiraltools/helper/figma/figma_client/models/domain/primitives/components_list.rb
|
43
|
+
- admiraltools/helper/figma/figma_client/models/domain/primitives/font.rb
|
44
|
+
- admiraltools/helper/figma/figma_client/models/domain/primitives/frame_info.rb
|
45
|
+
- admiraltools/helper/figma/figma_client/models/domain/primitives/image_link.rb
|
46
|
+
- admiraltools/helper/figma/figma_client/models/domain/primitives/style.rb
|
47
|
+
- admiraltools/helper/figma/figma_client/models/domain/primitives/styles_group.rb
|
48
|
+
- admiraltools/helper/figma/figma_client/models/domain/primitives/styles_list.rb
|
49
|
+
- admiraltools/helper/figma/figma_client/models/models.rb
|
50
|
+
- admiraltools/helper/figma/figma_image_downloader/bin/svg2vectordrawable.jar
|
51
|
+
- admiraltools/helper/figma/figma_image_downloader/figma_image_downloader.rb
|
52
|
+
- admiraltools/helper/figma/figma_image_downloader/generators/folder_generator.rb
|
53
|
+
- admiraltools/helper/figma/figma_image_downloader/generators/folder_generator_raw.rb
|
54
|
+
- admiraltools/helper/figma/figma_image_downloader/generators/folder_generator_res.rb
|
55
|
+
- admiraltools/helper/figma/figma_image_downloader/generators/folder_generator_xcassets.rb
|
56
|
+
- admiraltools/helper/figma/figma_image_downloader/generators/generators.rb
|
57
|
+
- admiraltools/helper/figma/figma_image_downloader/helpers/image_name_formatter.rb
|
58
|
+
- admiraltools/helper/figma/figma_image_downloader/helpers/progress_tasks_logger.rb
|
59
|
+
- admiraltools/helper/figma/figma_image_downloader/helpers/scale_formatter.rb
|
60
|
+
- admiraltools/helper/figma/figma_image_downloader/helpers/svg_to_vector_converter.rb
|
61
|
+
- admiraltools/helper/figma/figma_image_downloader/models/download_image_params.rb
|
62
|
+
- admiraltools/helper/figma/figma_image_downloader/models/image_name_components.rb
|
63
|
+
- admiraltools/helper/figma/figma_image_downloader/models/image_ref.rb
|
64
|
+
- admiraltools/helper/figma/figma_image_downloader/models/image_set_ref.rb
|
65
|
+
- admiraltools/helper/figma/figma_image_downloader/models/models.rb
|
66
|
+
- admiraltools/helper/figma/figma_template_generator/figma_template_generator.rb
|
67
|
+
- admiraltools/helper/figma/figma_template_generator/models/styles_template.rb
|
68
|
+
- admiraltools/helper/figma/helpers/file_folder.rb
|
69
|
+
- admiraltools/helper/figma/helpers/hash_access.rb
|
70
|
+
- admiraltools/helper/figma/helpers/string_filters.rb
|
71
|
+
- admiraltools/helper/figma/helpers/string_format.rb
|
72
|
+
- admiraltools/helper/system/system.rb
|
73
|
+
- admiraltools/version.rb
|
74
|
+
homepage: https://github.com/admiral-team
|
75
|
+
licenses: []
|
76
|
+
metadata: {}
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
requirements: []
|
92
|
+
rubygems_version: 3.4.10
|
93
|
+
signing_key:
|
94
|
+
specification_version: 4
|
95
|
+
summary: The tool to download figma icons
|
96
|
+
test_files: []
|