heroicons_helper 0.3.0 → 0.4.2

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: ea79c1638e02674896f2f251375b879df8e289d10c39bd1b6550b35f65bb667e
4
- data.tar.gz: 49e4f89e38f7ceec4e09970d9864f859424f4e59f314b40353df87e73ff128b9
3
+ metadata.gz: 32e795de2bdf5ffe8332a8e4d6cdb04def32910875e359606d5fcc65dc31f82d
4
+ data.tar.gz: ea6e061f06312b495ed529102e10972a06f10462134ef0d96f32de246ee7bd2e
5
5
  SHA512:
6
- metadata.gz: c4c7715c0dc796769dd80fd26e38a56bbccadb1c00418ac0ff8911722679bd571e2a2cb058ecbf3931e9c6da3020628239ee5500ef90b05aed66c53f856bec5c
7
- data.tar.gz: 0257f55a823a70b7147b4ac0d7c3051fd407febea7577b0ffd2cc9bb2e14b7582299daae2a425f273de59ca7bd4dd5ddd51181baeb5ac40cdd47c1006224a324
6
+ metadata.gz: 07b15015752f2446cd1939ad3a330bffa9a313142b55d291e4ed1941b68ee047f5591ef921978deb0cb3619da28ab66a1da9f7e1e1ac06faafd011df61ca46ba
7
+ data.tar.gz: dd8578a59db2b627bb809b59051e5d2f238c9c559f6cfe1d0ee91f7eb1ab56d2d5ab88e93f6be5e45f040089d5fb0332b767a7db3df367dcadc5ffe16e3d1ae6
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # HeroiconsHelper
2
2
 
3
- This gem helps you use Heroicons in your Ruby projects. It's inspired by [heroicons-ruby](https://github.com/chunlea/heroicons-ruby) and [octicons](https://github.com/primer/octicons).
3
+ This gem helps you use Heroicons in your Ruby projects. It's inspired by [heroicons-ruby](https://github.com/chunlea/heroicons-ruby) and [octicons_gem](https://github.com/primer/octicons/tree/main/lib/octicons_gem).
4
4
 
5
5
  ## Installation
6
6
 
@@ -25,19 +25,19 @@ include HeroiconsHelper
25
25
  You'll have a brand new method called `heroicon` whose signature looks like this:
26
26
 
27
27
  ```ruby
28
- heroicon(symbol, variant, attributes: {})
28
+ heroicon(icon, variant, attributes: {})
29
29
  ```
30
30
 
31
31
  where
32
32
 
33
- * `symbol` is the heroicons name
33
+ * `icon` is the Heroicon name (eg. `:bell` or `"bell")
34
34
  * `variant` is the type of Heroicons (eg., `outline` or `solid`)
35
35
  * `attributes` are any additional HTML attributes to add on to the resulting `svg` element
36
36
 
37
37
  This one method call returns an object that represents the Heroicon, and you should call `to_svg` to get the resulting SVG string:
38
38
 
39
39
  ```ruby
40
- outline_icon = heroicon("x", "outline")
40
+ outline_icon = heroicon("x", variant: HeroiconsHelper::Icon::VARIANT_OUTLINE)
41
41
  puts outline_icon.to_svg
42
42
  ```
43
43
  ```
@@ -3,22 +3,29 @@
3
3
  module HeroiconsHelper
4
4
  # Icon to show heroicons by name and variant.
5
5
  class Icon
6
- attr_reader :path, :attributes, :width, :height, :symbol, :variant
6
+ attr_reader :path, :attributes, :width, :height, :name, :variant, :keywords
7
7
 
8
8
  VARIANT_OUTLINE = "outline"
9
9
  VARIANT_SOLID = "solid"
10
10
  VARIANTS = [VARIANT_OUTLINE, VARIANT_SOLID].freeze
11
11
 
12
- def initialize(symbol, variant, attributes: {})
13
- @symbol = symbol
14
- @variant = variant
15
-
16
- icon = get_heroicon(@symbol, @variant)
17
-
18
- @path = icon["path"]
19
- @width = icon["width"]
20
- @height = icon["height"]
21
- @attributes = attributes.dup.merge!(default_attributes)
12
+ def initialize(name, variant, attributes: {})
13
+ @name = name.to_s
14
+ @variant = variant.to_s
15
+
16
+ heroicon = get_heroicon(@name, @variant)
17
+
18
+ @path = heroicon["path"]
19
+ @width = heroicon["width"]
20
+ @height = heroicon["height"]
21
+ @keywords = heroicon["keywords"]
22
+ @attributes = attributes.dup.compact
23
+ @attributes[:class] = classes
24
+ @attributes[:viewBox] = viewbox
25
+ @attributes.merge!(size)
26
+ @attributes[:version] = "1.1"
27
+ @attributes.merge!(variant_attributes)
28
+ @attributes.merge!(a11y)
22
29
  end
23
30
 
24
31
  # Returns an string representing a <svg> tag
@@ -26,54 +33,93 @@ module HeroiconsHelper
26
33
  "<svg xmlns=\"http://www.w3.org/2000/svg\" #{html_attributes}>#{@path}</svg>"
27
34
  end
28
35
 
29
- private
30
-
31
- def html_attributes
36
+ private def html_attributes
32
37
  attrs = []
33
38
  @attributes.each_pair { |attr, value| attrs << "#{attr}=\"#{value}\"" }
34
39
  attrs.map(&:strip).join(" ")
35
40
  end
36
41
 
37
- def default_attributes
42
+ # add some accessibility features to svg
43
+ private def a11y
44
+ accessible = {}
45
+
46
+ if @attributes[:"aria-label"].nil? && @attributes["aria-label"].nil?
47
+ accessible[:"aria-hidden"] = "true"
48
+ else
49
+ accessible[:role] = "img"
50
+ end
51
+
52
+ accessible
53
+ end
54
+
55
+ # prepare the octicon class
56
+ private def classes
57
+ "heroicon heroicon-#{@name}-#{@variant} #{@attributes[:class]} ".strip
58
+ end
59
+
60
+ private def variant_attributes
38
61
  case @variant
39
62
  when VARIANT_OUTLINE
40
63
  {
41
- viewBox: viewbox,
42
64
  fill: "none",
43
65
  stroke: "currentColor",
44
66
  }
45
67
  when VARIANT_SOLID
46
68
  {
47
- viewBox: viewbox,
48
69
  fill: "currentColor",
49
70
  }
50
71
  end
51
72
  end
52
73
 
53
- def viewbox
74
+ private def viewbox
54
75
  "0 0 #{@width} #{@height}"
55
76
  end
56
77
 
57
- def get_heroicon(symbol, variant)
58
- symbol_s = symbol.to_s
59
- raise ArgumentError, "Icon name can't be empty" if symbol_s.empty?
78
+ # determine the height and width of the octicon based on :size option
79
+ private def size
80
+ size = {
81
+ width: @width,
82
+ height: @height,
83
+ }
84
+
85
+ # Specific size
86
+ unless @attributes[:width].nil? && @attributes[:height].nil?
87
+ size[:width] = @attributes[:width].nil? ? calculate_width(@attributes[:height]) : @attributes[:width]
88
+ size[:height] = @attributes[:height].nil? ? calculate_height(@attributes[:width]) : @attributes[:height]
89
+ @width = size[:width]
90
+ @height = size[:height]
91
+ end
92
+
93
+ size
94
+ end
95
+
96
+ private def calculate_width(height)
97
+ (height.to_i * @width) / @height
98
+ end
99
+
100
+ private def calculate_height(width)
101
+ (width.to_i * @height) / @width
102
+ end
103
+
104
+ private def get_heroicon(name, variant)
105
+ raise ArgumentError, "Icon name can't be empty" if name.empty?
60
106
 
61
- variant_s = variant.to_s
62
- raise ArgumentError, "Variant `#{variant.inspect}` is invalid; must be one of #{VARIANTS.join(", ")}" unless VARIANTS.include?(variant_s)
107
+ raise ArgumentError, "Variant `#{variant.inspect}` is invalid; must be one of #{VARIANTS.join(", ")}" unless VARIANTS.include?(variant)
63
108
 
64
- icon = HeroiconsHelper::ICON_SYMBOLS[symbol_s]
109
+ icon = HeroiconsHelper::ICON_NAMES[name]
65
110
 
66
- raise ArgumentError, "Couldn't find Heroicon for `#{symbol.inspect}`" unless icon
111
+ raise ArgumentError, "Couldn't find Heroicon for `#{name.inspect}`" unless icon
67
112
 
68
- icon_in_variant = icon["variants"][variant_s]
69
- raise ArgumentError, "Heroicon for `#{symbol.inspect}` doesn't have variant `#{variant.inspect}`" unless icon_in_variant
113
+ icon_variant = icon["variants"][variant]
114
+ raise ArgumentError, "Heroicon for `#{name.inspect}` doesn't have variant `#{variant.inspect}`" unless icon_variant
70
115
 
71
116
  {
72
117
  "name" => icon["name"],
73
- "variant" => variant_s,
74
- "width" => icon_in_variant["width"],
75
- "height" => icon_in_variant["height"],
76
- "path" => icon_in_variant["path"],
118
+ "variant" => variant,
119
+ "keywords" => icon["keywords"] || [],
120
+ "width" => icon_variant["width"],
121
+ "height" => icon_variant["height"],
122
+ "path" => icon_variant["path"],
77
123
  }
78
124
  end
79
125
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HeroiconsHelper
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.2"
5
5
  end
@@ -7,9 +7,22 @@ require "json"
7
7
 
8
8
  module HeroiconsHelper
9
9
  file_data = File.read(File.join(File.dirname(__FILE__), "./heroicons_helper/data.json"))
10
- ICON_SYMBOLS = JSON.parse(file_data).freeze
10
+ ICON_NAMES = JSON.parse(file_data).freeze
11
11
 
12
- def heroicon(symbol, variant, attributes: {})
13
- ::HeroiconsHelper::Icon.new(symbol, variant, attributes: attributes)
12
+ def heroicon(name, variant:, **attributes)
13
+ cache_key = HeroiconsHelper::Cache.get_key(
14
+ name: name,
15
+ variant: variant,
16
+ height: attributes[:height],
17
+ width: attributes[:width]
18
+ )
19
+
20
+ cached_heroicon = HeroiconsHelper::Cache.read(cache_key)
21
+ return cached_heroicon unless cached_heroicon.nil?
22
+
23
+ heroicon = ::HeroiconsHelper::Icon.new(name, variant, attributes: attributes)
24
+ HeroiconsHelper::Cache.set(cache_key, heroicon)
25
+
26
+ heroicon
14
27
  end
15
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heroicons_helper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Garen J. Torikian
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-10 00:00:00.000000000 Z
11
+ date: 2022-06-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A package that distributes Heroicons as a gem, for easy inclusion in
14
14
  Ruby projects.