heroicons_helper 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "set"
4
+
3
5
  module HeroiconsHelper
4
6
  # Icon to show heroicons by name and variant.
5
7
  class Icon
@@ -7,7 +9,8 @@ module HeroiconsHelper
7
9
 
8
10
  VARIANT_OUTLINE = "outline"
9
11
  VARIANT_SOLID = "solid"
10
- VARIANTS = [VARIANT_OUTLINE, VARIANT_SOLID].freeze
12
+ VARIANT_MINI = "mini"
13
+ VALID_VARIANTS = Set.new([VARIANT_OUTLINE, VARIANT_SOLID, VARIANT_MINI]).freeze
11
14
 
12
15
  def initialize(name, variant, attributes: {})
13
16
  @name = name.to_s
@@ -52,7 +55,7 @@ module HeroiconsHelper
52
55
  accessible
53
56
  end
54
57
 
55
- # prepare the octicon class
58
+ # prepare the heroicon class
56
59
  private def classes
57
60
  "heroicon heroicon-#{@name}-#{@variant} #{@attributes[:class]} ".strip
58
61
  end
@@ -64,7 +67,7 @@ module HeroiconsHelper
64
67
  fill: "none",
65
68
  stroke: "currentColor",
66
69
  }
67
- when VARIANT_SOLID
70
+ when VARIANT_SOLID, VARIANT_MINI
68
71
  {
69
72
  fill: "currentColor",
70
73
  }
@@ -75,7 +78,7 @@ module HeroiconsHelper
75
78
  "0 0 #{@width} #{@height}"
76
79
  end
77
80
 
78
- # determine the height and width of the octicon based on :size option
81
+ # determine the height and width of the heroicon based on :size option
79
82
  private def size
80
83
  size = {
81
84
  width: @width,
@@ -104,7 +107,7 @@ module HeroiconsHelper
104
107
  private def get_heroicon(name, variant)
105
108
  raise ArgumentError, "Icon name can't be empty" if name.empty?
106
109
 
107
- raise ArgumentError, "Variant `#{variant.inspect}` is invalid; must be one of #{VARIANTS.join(", ")}" unless VARIANTS.include?(variant)
110
+ raise ArgumentError, "Variant `#{variant.inspect}` is invalid; must be one of #{VALID_VARIANTS.join(", ")}" unless VALID_VARIANTS.include?(variant)
108
111
 
109
112
  icon = HeroiconsHelper::ICON_NAMES[name]
110
113
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HeroiconsHelper
4
- VERSION = "0.5.0"
4
+ VERSION = "0.6.0"
5
5
  end
data/package-lock.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "cheerio": "1.0.0-rc.11",
10
10
  "fs-extra": "^7.0.1",
11
11
  "globby": "11.0.0",
12
- "heroicons": "^1.0.6",
12
+ "heroicons": "^2.0.0",
13
13
  "lodash.merge": "4.6.2",
14
14
  "trim-newlines": "3.0.1",
15
15
  "yargs": "15.1.0"
@@ -289,9 +289,9 @@
289
289
  "dev": true
290
290
  },
291
291
  "node_modules/entities": {
292
- "version": "4.3.0",
293
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz",
294
- "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==",
292
+ "version": "4.3.1",
293
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz",
294
+ "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==",
295
295
  "dev": true,
296
296
  "engines": {
297
297
  "node": ">=0.12"
@@ -412,9 +412,9 @@
412
412
  "dev": true
413
413
  },
414
414
  "node_modules/heroicons": {
415
- "version": "1.0.6",
416
- "resolved": "https://registry.npmjs.org/heroicons/-/heroicons-1.0.6.tgz",
417
- "integrity": "sha512-5bxTsG2hyNBF0l+BrFlZlR5YngQNMfl0ggJjIRkMSADBQbaZMoTg47OIQzq6f1mpEZ85HEIgSC4wt5AeFM9J2Q==",
415
+ "version": "2.0.7",
416
+ "resolved": "https://registry.npmjs.org/heroicons/-/heroicons-2.0.7.tgz",
417
+ "integrity": "sha512-BuYwHlgmMIPy1lut5ADTZnsk/FqenSx9f9UxbbABDtTO2GV0Ec/k7VgDs6CCcEnaZ8IDH9mbzyeS/HVpqpxXnQ==",
418
418
  "dev": true
419
419
  },
420
420
  "node_modules/htmlparser2": {
@@ -784,7 +784,7 @@
784
784
  "node_modules/which-module": {
785
785
  "version": "2.0.0",
786
786
  "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
787
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
787
+ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
788
788
  "dev": true
789
789
  },
790
790
  "node_modules/wrap-ansi": {
@@ -1043,9 +1043,9 @@
1043
1043
  "dev": true
1044
1044
  },
1045
1045
  "entities": {
1046
- "version": "4.3.0",
1047
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz",
1048
- "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==",
1046
+ "version": "4.3.1",
1047
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz",
1048
+ "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==",
1049
1049
  "dev": true
1050
1050
  },
1051
1051
  "fast-glob": {
@@ -1136,9 +1136,9 @@
1136
1136
  "dev": true
1137
1137
  },
1138
1138
  "heroicons": {
1139
- "version": "1.0.6",
1140
- "resolved": "https://registry.npmjs.org/heroicons/-/heroicons-1.0.6.tgz",
1141
- "integrity": "sha512-5bxTsG2hyNBF0l+BrFlZlR5YngQNMfl0ggJjIRkMSADBQbaZMoTg47OIQzq6f1mpEZ85HEIgSC4wt5AeFM9J2Q==",
1139
+ "version": "2.0.7",
1140
+ "resolved": "https://registry.npmjs.org/heroicons/-/heroicons-2.0.7.tgz",
1141
+ "integrity": "sha512-BuYwHlgmMIPy1lut5ADTZnsk/FqenSx9f9UxbbABDtTO2GV0Ec/k7VgDs6CCcEnaZ8IDH9mbzyeS/HVpqpxXnQ==",
1142
1142
  "dev": true
1143
1143
  },
1144
1144
  "htmlparser2": {
@@ -1391,7 +1391,7 @@
1391
1391
  "which-module": {
1392
1392
  "version": "2.0.0",
1393
1393
  "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
1394
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
1394
+ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
1395
1395
  "dev": true
1396
1396
  },
1397
1397
  "wrap-ansi": {
data/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "private": true,
4
4
  "devDependencies": {
5
5
  "cheerio": "1.0.0-rc.11",
6
- "heroicons": "^1.0.6",
6
+ "heroicons": "^2.0.0",
7
7
  "fs-extra": "^7.0.1",
8
8
  "globby": "11.0.0",
9
9
  "lodash.merge": "4.6.2",
data/script/keywords.json CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "archive": ["box", "catalog"]
2
+ "archive-box": ["box", "catalog"]
3
3
  }
@@ -19,8 +19,9 @@ const { argv } = yargs
19
19
  type: "array",
20
20
  describe: "Input SVG files",
21
21
  default: [
22
- "node_modules/heroicons/outline/*.svg",
23
- "node_modules/heroicons/solid/*.svg",
22
+ "node_modules/heroicons/24/outline/*.svg",
23
+ "node_modules/heroicons/24/solid/*.svg",
24
+ "node_modules/heroicons/20/solid/*.svg",
24
25
  ],
25
26
  })
26
27
  .option("output", {
@@ -38,45 +39,28 @@ const svgFilepaths = filepaths.filter(
38
39
 
39
40
  if (svgFilepaths.length === 0) {
40
41
  // eslint-disable-next-line no-console
41
- console.error(`No input SVG file(s) found in ${icon_file_path.join(", ")}`);
42
+ console.error(`No input SVG file(s) found in ${filepaths.join(", ")}`);
42
43
  process.exit(1);
43
44
  }
44
45
 
45
46
  let exitCode = 0;
46
47
 
47
- const validTypes = ["solid", "outline"];
48
- const defaultOutlineWidth = "24";
49
- const defaultSolidWidth = "20";
48
+ const validTypes = ["solid", "outline", "mini"];
49
+ const defaultOutlineWidth = parseInt("24");
50
+ const defaultSolidWidth = parseInt("24");
51
+ const defaultMiniWidth = parseInt("20");
50
52
 
51
53
  const icons = svgFilepaths.map((filepath) => {
52
54
  try {
53
- let filename = path.parse(filepath).base;
54
- const type = path.parse(filepath).dir.split("/").pop();
55
- let widthSize;
56
- switch (type) {
57
- case "outline":
58
- widthSize = defaultOutlineWidth;
59
- break;
60
- case "solid":
61
- widthSize = defaultSolidWidth;
62
- break;
63
- default:
64
- throw new Error(`Unknown icon type: ${type}`);
65
- }
66
-
67
- const filenamePattern = /(.+)(?:-[0-9]{1,2})?-([0-9]{2}).svg$/;
68
- const filenameReplacePattern = /\.svg$/;
69
-
70
- if (!filenamePattern.test(filename)) {
71
- filename = filename.replace(filenameReplacePattern, `-${widthSize}.svg`);
72
- }
73
-
74
- const [, name, height] = filename.match(filenamePattern);
55
+ const filename = path.parse(filepath).base;
56
+ let splitDir = path.parse(filepath).dir.split("/");
57
+ let type = splitDir.pop();
58
+ const size = splitDir.pop();
75
59
 
76
60
  const svg = fs.readFileSync(path.resolve(filepath), "utf8");
77
61
  const svgElement = cheerio.load(svg)("svg");
78
- let svgWidth = parseInt(svgElement.attr("width"));
79
- let svgHeight = parseInt(svgElement.attr("height"));
62
+ let svgWidth = parseInt(svgElement.attr("width")) || parseInt(size);
63
+ let svgHeight = parseInt(svgElement.attr("height")) || parseInt(size);
80
64
  const svgViewBox = svgElement.attr("viewBox");
81
65
  const svgPath = trimNewlines(svgElement.html()).trim();
82
66
 
@@ -94,12 +78,6 @@ const icons = svgFilepaths.map((filepath) => {
94
78
  throw new Error(`${filename}: Missing viewBox attribute.`);
95
79
  }
96
80
 
97
- if (svgHeight != parseInt(height)) {
98
- throw new Error(
99
- `${filename}: Height in filename (${height}) does not match height attribute of SVG (${svgHeight})`
100
- );
101
- }
102
-
103
81
  const viewBoxPattern = /0 0 ([0-9]+) ([0-9]+)/;
104
82
 
105
83
  if (!viewBoxPattern.test(svgViewBox)) {
@@ -122,6 +100,11 @@ const icons = svgFilepaths.map((filepath) => {
122
100
  );
123
101
  }
124
102
 
103
+ if (svgWidth == defaultMiniWidth && type == "solid") {
104
+ type = "mini";
105
+ }
106
+ const name = filename.slice(0, -4);
107
+
125
108
  return {
126
109
  name,
127
110
  keywords: keywords[name] || [],
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.5.0
4
+ version: 0.6.0
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-24 00:00:00.000000000 Z
11
+ date: 2022-08-26 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.