heroicons_helper 0.3.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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.