geo_pattern 1.4.0 → 1.6.0

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.
Files changed (118) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +24 -0
  3. data/README.md +80 -16
  4. data/lib/geo_pattern/background.rb +9 -7
  5. data/lib/geo_pattern/background_generators/solid_generator.rb +4 -2
  6. data/lib/geo_pattern/color.rb +3 -1
  7. data/lib/geo_pattern/color_generators/base_color_generator.rb +10 -15
  8. data/lib/geo_pattern/color_generators/simple_generator.rb +2 -0
  9. data/lib/geo_pattern/color_preset.rb +7 -1
  10. data/lib/geo_pattern/errors.rb +2 -0
  11. data/lib/geo_pattern/geo_pattern_task.rb +11 -9
  12. data/lib/geo_pattern/helpers.rb +7 -5
  13. data/lib/geo_pattern/pattern.rb +6 -4
  14. data/lib/geo_pattern/pattern_generator.rb +14 -12
  15. data/lib/geo_pattern/pattern_helpers.rb +29 -11
  16. data/lib/geo_pattern/pattern_preset.rb +3 -1
  17. data/lib/geo_pattern/pattern_sieve.rb +5 -3
  18. data/lib/geo_pattern/pattern_store.rb +20 -18
  19. data/lib/geo_pattern/pattern_validator.rb +4 -2
  20. data/lib/geo_pattern/rake_task.rb +19 -16
  21. data/lib/geo_pattern/roles/comparable_metadata.rb +3 -1
  22. data/lib/geo_pattern/roles/named_generator.rb +3 -1
  23. data/lib/geo_pattern/seed.rb +2 -0
  24. data/lib/geo_pattern/structure.rb +9 -7
  25. data/lib/geo_pattern/structure_generators/base_generator.rb +17 -14
  26. data/lib/geo_pattern/structure_generators/chevrons_generator.rb +19 -17
  27. data/lib/geo_pattern/structure_generators/concentric_circles_generator.rb +19 -17
  28. data/lib/geo_pattern/structure_generators/diamonds_generator.rb +23 -17
  29. data/lib/geo_pattern/structure_generators/hexagons_generator.rb +25 -23
  30. data/lib/geo_pattern/structure_generators/mosaic_squares_generator.rb +35 -35
  31. data/lib/geo_pattern/structure_generators/nested_squares_generator.rb +23 -21
  32. data/lib/geo_pattern/structure_generators/octagons_generator.rb +12 -11
  33. data/lib/geo_pattern/structure_generators/overlapping_circles_generator.rb +13 -11
  34. data/lib/geo_pattern/structure_generators/overlapping_rings_generator.rb +15 -13
  35. data/lib/geo_pattern/structure_generators/plaid_generator.rb +18 -18
  36. data/lib/geo_pattern/structure_generators/plus_signs_generator.rb +24 -18
  37. data/lib/geo_pattern/structure_generators/sine_waves_generator.rb +17 -15
  38. data/lib/geo_pattern/structure_generators/squares_generator.rb +10 -9
  39. data/lib/geo_pattern/structure_generators/tessellation_generator.rb +36 -34
  40. data/lib/geo_pattern/structure_generators/triangles_generator.rb +22 -19
  41. data/lib/geo_pattern/structure_generators/xes_generator.rb +26 -19
  42. data/lib/geo_pattern/svg_image.rb +10 -8
  43. data/lib/geo_pattern/version.rb +3 -1
  44. data/lib/geo_pattern.rb +53 -51
  45. metadata +61 -139
  46. data/.gitignore +0 -18
  47. data/.rspec +0 -3
  48. data/.rubocop.yml +0 -71
  49. data/.simplecov +0 -25
  50. data/.travis.yml +0 -12
  51. data/Gemfile +0 -26
  52. data/Rakefile +0 -86
  53. data/fixtures/generated_patterns/chevrons.svg +0 -1
  54. data/fixtures/generated_patterns/concentric_circles.svg +0 -1
  55. data/fixtures/generated_patterns/diamonds.svg +0 -1
  56. data/fixtures/generated_patterns/diamonds_with_base_color.svg +0 -1
  57. data/fixtures/generated_patterns/diamonds_with_color.svg +0 -1
  58. data/fixtures/generated_patterns/hexagons.svg +0 -1
  59. data/fixtures/generated_patterns/mosaic_squares.svg +0 -1
  60. data/fixtures/generated_patterns/nested_squares.svg +0 -1
  61. data/fixtures/generated_patterns/octagons.svg +0 -1
  62. data/fixtures/generated_patterns/overlapping_circles.svg +0 -1
  63. data/fixtures/generated_patterns/overlapping_rings.svg +0 -1
  64. data/fixtures/generated_patterns/plaid.svg +0 -1
  65. data/fixtures/generated_patterns/plus_signs.svg +0 -1
  66. data/fixtures/generated_patterns/sine_waves.svg +0 -1
  67. data/fixtures/generated_patterns/squares.svg +0 -1
  68. data/fixtures/generated_patterns/tessellation.svg +0 -1
  69. data/fixtures/generated_patterns/triangles.svg +0 -1
  70. data/fixtures/generated_patterns/xes.svg +0 -1
  71. data/geo_pattern.gemspec +0 -29
  72. data/script/bootstrap +0 -30
  73. data/script/console +0 -8
  74. data/script/test +0 -21
  75. data/spec/background_generators/solid_generator_spec.rb +0 -50
  76. data/spec/background_spec.rb +0 -25
  77. data/spec/color_generators/base_color_generator_spec.rb +0 -31
  78. data/spec/color_generators/simple_generator_spec.rb +0 -12
  79. data/spec/color_preset_spec.rb +0 -53
  80. data/spec/color_spec.rb +0 -15
  81. data/spec/geo_pattern_spec.rb +0 -115
  82. data/spec/helpers_spec.rb +0 -65
  83. data/spec/pattern_preset_spec.rb +0 -41
  84. data/spec/pattern_sieve_spec.rb +0 -66
  85. data/spec/pattern_spec.rb +0 -72
  86. data/spec/pattern_store_spec.rb +0 -47
  87. data/spec/pattern_validator_spec.rb +0 -28
  88. data/spec/seed_spec.rb +0 -14
  89. data/spec/spec_helper.rb +0 -18
  90. data/spec/structure_generators/chevrons_generator_spec.rb +0 -5
  91. data/spec/structure_generators/concentric_circles_generator_spec.rb +0 -5
  92. data/spec/structure_generators/diamonds_generator_spec.rb +0 -5
  93. data/spec/structure_generators/hexagons_generator_spec.rb +0 -5
  94. data/spec/structure_generators/mosaic_squares_generator_spec.rb +0 -5
  95. data/spec/structure_generators/nested_squares_generator_spec.rb +0 -5
  96. data/spec/structure_generators/octagons_generator_spec.rb +0 -5
  97. data/spec/structure_generators/overlapping_circles_generator_spec.rb +0 -5
  98. data/spec/structure_generators/overlapping_rings_generator_spec.rb +0 -5
  99. data/spec/structure_generators/plaid_generator_spec.rb +0 -5
  100. data/spec/structure_generators/plus_signs_generator_spec.rb +0 -5
  101. data/spec/structure_generators/sine_waves_generator_spec.rb +0 -5
  102. data/spec/structure_generators/squares_generator_spec.rb +0 -5
  103. data/spec/structure_generators/tessellation_generator_spec.rb +0 -5
  104. data/spec/structure_generators/triangles_generator_spec.rb +0 -5
  105. data/spec/structure_generators/xes_generator_spec.rb +0 -5
  106. data/spec/structure_spec.rb +0 -38
  107. data/spec/support/aruba.rb +0 -24
  108. data/spec/support/helpers/fixtures.rb +0 -12
  109. data/spec/support/kernel.rb +0 -40
  110. data/spec/support/matchers/image.rb +0 -17
  111. data/spec/support/matchers/name.rb +0 -15
  112. data/spec/support/rspec.rb +0 -24
  113. data/spec/support/shared_examples/generator.rb +0 -46
  114. data/spec/support/shared_examples/pattern.rb +0 -31
  115. data/spec/support/shared_examples/pattern_name.rb +0 -7
  116. data/spec/support/shared_examples/structure.rb +0 -48
  117. data/spec/support/string.rb +0 -2
  118. data/spec/svg_spec.rb +0 -12
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GeoPattern
2
4
  module StructureGenerators
3
5
  class TessellationGenerator < BaseGenerator
@@ -7,30 +9,30 @@ module GeoPattern
7
9
 
8
10
  def after_initialize
9
11
  # 3.4.6.4 semi-regular tessellation
10
- @side_length = map(hex_val(0, 1), 0, 15, 5, 40)
11
- @hex_height = side_length * Math.sqrt(3)
12
- @hex_width = side_length * 2
12
+ @side_length = map(hex_val(0, 1), 0, 15, 5, 40)
13
+ @hex_height = side_length * Math.sqrt(3)
14
+ @hex_width = side_length * 2
13
15
  @triangle_height = side_length / 2 * Math.sqrt(3)
14
- @triangle = build_rotated_triangle_shape(side_length, triangle_height)
15
- @tile_width = side_length * 3 + triangle_height * 2
16
- @tile_height = (hex_height * 2) + (side_length * 2)
16
+ @triangle = build_rotated_triangle_shape(side_length, triangle_height)
17
+ @tile_width = side_length * 3 + triangle_height * 2
18
+ @tile_height = (hex_height * 2) + (side_length * 2)
17
19
 
18
20
  self.height = tile_height
19
- self.width = tile_width
21
+ self.width = tile_width
20
22
  end
21
23
 
22
24
  def generate_structure
23
- for i in 0..19
24
- val = hex_val(i, 1)
25
+ 20.times do |i|
26
+ val = hex_val(i, 1)
25
27
  opacity = opacity(val)
26
- fill = fill_color(val)
28
+ fill = fill_color(val)
27
29
 
28
- styles = {
29
- 'stroke' => stroke_color,
30
- 'stroke-opacity' => stroke_opacity,
31
- 'fill' => fill,
32
- 'fill-opacity' => opacity,
33
- 'stroke-width' => 1
30
+ styles = {
31
+ "stroke" => stroke_color,
32
+ "stroke-opacity" => stroke_opacity,
33
+ "fill" => fill,
34
+ "fill-opacity" => opacity,
35
+ "stroke-width" => 1
34
36
  }
35
37
 
36
38
  case i
@@ -47,47 +49,47 @@ module GeoPattern
47
49
  when 3 # center / bottom square
48
50
  svg.rect(hex_width / 2 + triangle_height, hex_height * 1.5 + side_length, side_length, side_length, styles)
49
51
  when 4 # left top / bottom triangle
50
- svg.polyline(triangle, styles.merge('transform' => "translate(#{side_length / 2}, #{-side_length / 2}) rotate(0, #{side_length / 2}, #{triangle_height / 2})"))
51
- svg.polyline(triangle, styles.merge('transform' => "translate(#{side_length / 2}, #{tile_height - -side_length / 2}) rotate(0, #{side_length / 2}, #{triangle_height / 2}) scale(1, -1)"))
52
+ svg.polyline(triangle, styles.merge("transform" => "translate(#{side_length / 2}, #{-side_length / 2}) rotate(0, #{side_length / 2}, #{triangle_height / 2})"))
53
+ svg.polyline(triangle, styles.merge("transform" => "translate(#{side_length / 2}, #{tile_height - -side_length / 2}) rotate(0, #{side_length / 2}, #{triangle_height / 2}) scale(1, -1)"))
52
54
  when 5 # right top / bottom triangle
53
- svg.polyline(triangle, styles.merge('transform' => "translate(#{tile_width - side_length / 2}, #{-side_length / 2}) rotate(0, #{side_length / 2}, #{triangle_height / 2}) scale(-1, 1)"))
54
- svg.polyline(triangle, styles.merge('transform' => "translate(#{tile_width - side_length / 2}, #{tile_height + side_length / 2}) rotate(0, #{side_length / 2}, #{triangle_height / 2}) scale(-1, -1)"))
55
+ svg.polyline(triangle, styles.merge("transform" => "translate(#{tile_width - side_length / 2}, #{-side_length / 2}) rotate(0, #{side_length / 2}, #{triangle_height / 2}) scale(-1, 1)"))
56
+ svg.polyline(triangle, styles.merge("transform" => "translate(#{tile_width - side_length / 2}, #{tile_height + side_length / 2}) rotate(0, #{side_length / 2}, #{triangle_height / 2}) scale(-1, -1)"))
55
57
  when 6 # center / top / right triangle
56
- svg.polyline(triangle, styles.merge('transform' => "translate(#{tile_width / 2 + side_length / 2}, #{hex_height / 2})"))
58
+ svg.polyline(triangle, styles.merge("transform" => "translate(#{tile_width / 2 + side_length / 2}, #{hex_height / 2})"))
57
59
  when 7 # center / top / left triangle
58
- svg.polyline(triangle, styles.merge('transform' => "translate(#{tile_width - tile_width / 2 - side_length / 2}, #{hex_height / 2}) scale(-1, 1)"))
60
+ svg.polyline(triangle, styles.merge("transform" => "translate(#{tile_width - tile_width / 2 - side_length / 2}, #{hex_height / 2}) scale(-1, 1)"))
59
61
  when 8 # center / bottom / right triangle
60
- svg.polyline(triangle, styles.merge('transform' => "translate(#{tile_width / 2 + side_length / 2}, #{tile_height - hex_height / 2}) scale(1, -1)"))
62
+ svg.polyline(triangle, styles.merge("transform" => "translate(#{tile_width / 2 + side_length / 2}, #{tile_height - hex_height / 2}) scale(1, -1)"))
61
63
  when 9 # center / bottom / left triangle
62
- svg.polyline(triangle, styles.merge('transform' => "translate(#{tile_width - tile_width / 2 - side_length / 2}, #{tile_height - hex_height / 2}) scale(-1, -1)"))
64
+ svg.polyline(triangle, styles.merge("transform" => "translate(#{tile_width - tile_width / 2 - side_length / 2}, #{tile_height - hex_height / 2}) scale(-1, -1)"))
63
65
  when 10 # left / middle triangle
64
- svg.polyline(triangle, styles.merge('transform' => "translate(#{side_length / 2}, #{tile_height / 2 - side_length / 2})"))
66
+ svg.polyline(triangle, styles.merge("transform" => "translate(#{side_length / 2}, #{tile_height / 2 - side_length / 2})"))
65
67
  when 11 # right / middle triangle
66
- svg.polyline(triangle, styles.merge('transform' => "translate(#{tile_width - side_length / 2}, #{tile_height / 2 - side_length / 2}) scale(-1, 1)"))
68
+ svg.polyline(triangle, styles.merge("transform" => "translate(#{tile_width - side_length / 2}, #{tile_height / 2 - side_length / 2}) scale(-1, 1)"))
67
69
  when 12 # left / top square
68
70
  svg.rect(0, 0, side_length, side_length,
69
- styles.merge('transform' => "translate(#{side_length / 2}, #{side_length / 2}) rotate(-30, 0, 0)"))
71
+ styles.merge("transform" => "translate(#{side_length / 2}, #{side_length / 2}) rotate(-30, 0, 0)"))
70
72
  when 13 # right / top square
71
73
  svg.rect(0, 0, side_length, side_length,
72
- styles.merge('transform' => "scale(-1, 1) translate(#{-tile_width + side_length / 2}, #{side_length / 2}) rotate(-30, 0, 0)"))
74
+ styles.merge("transform" => "scale(-1, 1) translate(#{-tile_width + side_length / 2}, #{side_length / 2}) rotate(-30, 0, 0)"))
73
75
  when 14 # left / center-top square
74
76
  svg.rect(0, 0, side_length, side_length,
75
- styles.merge('transform' => "translate(#{side_length / 2}, #{tile_height / 2 - side_length / 2 - side_length}) rotate(30, 0, #{side_length})"))
77
+ styles.merge("transform" => "translate(#{side_length / 2}, #{tile_height / 2 - side_length / 2 - side_length}) rotate(30, 0, #{side_length})"))
76
78
  when 15 # right / center-top square
77
79
  svg.rect(0, 0, side_length, side_length,
78
- styles.merge('transform' => "scale(-1, 1) translate(#{-tile_width + side_length / 2}, #{tile_height / 2 - side_length / 2 - side_length}) rotate(30, 0, #{side_length})"))
80
+ styles.merge("transform" => "scale(-1, 1) translate(#{-tile_width + side_length / 2}, #{tile_height / 2 - side_length / 2 - side_length}) rotate(30, 0, #{side_length})"))
79
81
  when 16 # left / center-top square
80
82
  svg.rect(0, 0, side_length, side_length,
81
- styles.merge('transform' => "scale(1, -1) translate(#{side_length / 2}, #{-tile_height + tile_height / 2 - side_length / 2 - side_length}) rotate(30, 0, #{side_length})"))
83
+ styles.merge("transform" => "scale(1, -1) translate(#{side_length / 2}, #{-tile_height + tile_height / 2 - side_length / 2 - side_length}) rotate(30, 0, #{side_length})"))
82
84
  when 17 # right / center-bottom square
83
85
  svg.rect(0, 0, side_length, side_length,
84
- styles.merge('transform' => "scale(-1, -1) translate(#{-tile_width + side_length / 2}, #{-tile_height + tile_height / 2 - side_length / 2 - side_length}) rotate(30, 0, #{side_length})"))
86
+ styles.merge("transform" => "scale(-1, -1) translate(#{-tile_width + side_length / 2}, #{-tile_height + tile_height / 2 - side_length / 2 - side_length}) rotate(30, 0, #{side_length})"))
85
87
  when 18 # left / bottom square
86
88
  svg.rect(0, 0, side_length, side_length,
87
- styles.merge('transform' => "scale(1, -1) translate(#{side_length / 2}, #{-tile_height + side_length / 2}) rotate(-30, 0, 0)"))
89
+ styles.merge("transform" => "scale(1, -1) translate(#{side_length / 2}, #{-tile_height + side_length / 2}) rotate(-30, 0, 0)"))
88
90
  when 19 # right / bottom square
89
91
  svg.rect(0, 0, side_length, side_length,
90
- styles.merge('transform' => "scale(-1, -1) translate(#{-tile_width + side_length / 2}, #{-tile_height + side_length / 2}) rotate(-30, 0, 0)"))
92
+ styles.merge("transform" => "scale(-1, -1) translate(#{-tile_width + side_length / 2}, #{-tile_height + side_length / 2}) rotate(-30, 0, 0)"))
91
93
  end
92
94
  end
93
95
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GeoPattern
2
4
  module StructureGenerators
3
5
  class TrianglesGenerator < BaseGenerator
@@ -6,44 +8,45 @@ module GeoPattern
6
8
  attr_reader :scale, :side_length, :triangle_height, :triangle
7
9
 
8
10
  def after_initialize
9
- @scale = hex_val(0, 1)
10
- @side_length = map(scale, 0, 15, 15, 80)
11
+ @scale = hex_val(0, 1)
12
+ @side_length = map(scale, 0, 15, 15, 80)
11
13
  @triangle_height = side_length / 2 * Math.sqrt(3)
12
- @triangle = build_triangle_shape(side_length, triangle_height)
14
+ @triangle = build_triangle_shape(side_length, triangle_height)
13
15
 
14
- self.width = side_length * 3
16
+ self.width = side_length * 3
15
17
  self.height = triangle_height * 6
16
18
  end
17
19
 
18
20
  def generate_structure
19
21
  i = 0
20
- for y in 0..5
21
- for x in 0..5
22
- val = hex_val(i, 1)
22
+ 6.times do |y|
23
+ 6.times do |x|
24
+ val = hex_val(i, 1)
23
25
  opacity = opacity(val)
24
- fill = fill_color(val)
26
+ fill = fill_color(val)
25
27
 
26
28
  styles = {
27
- 'fill' => fill,
28
- 'fill-opacity' => opacity,
29
- 'stroke' => stroke_color,
30
- 'stroke-opacity' => stroke_opacity
29
+ "fill" => fill,
30
+ "fill-opacity" => opacity,
31
+ "stroke" => stroke_color,
32
+ "stroke-opacity" => stroke_opacity
31
33
  }
32
34
 
33
- rotation = ''
34
- if y % 2 == 0
35
- rotation = x % 2 == 0 ? 180 : 0
35
+ rotation = if y % 2 == 0
36
+ (x % 2 == 0) ? 180 : 0
36
37
  else
37
- rotation = x % 2 != 0 ? 180 : 0
38
+ (x % 2 != 0) ? 180 : 0
38
39
  end
39
40
 
40
41
  svg.polyline(triangle, styles.merge(
41
- 'transform' => "translate(#{x * side_length * 0.5 - side_length / 2}, #{triangle_height * y}) rotate(#{rotation}, #{side_length / 2}, #{triangle_height / 2})"))
42
+ "transform" => "translate(#{x * side_length * 0.5 - side_length / 2}, #{triangle_height * y}) rotate(#{rotation}, #{side_length / 2}, #{triangle_height / 2})"
43
+ ))
42
44
 
43
45
  # Add an extra one at top-right, for tiling.
44
- if (x == 0)
46
+ if x == 0
45
47
  svg.polyline(triangle, styles.merge(
46
- 'transform' => "translate(#{6 * side_length * 0.5 - side_length / 2}, #{triangle_height * y}) rotate(#{rotation}, #{side_length / 2}, #{triangle_height / 2})"))
48
+ "transform" => "translate(#{6 * side_length * 0.5 - side_length / 2}, #{triangle_height * y}) rotate(#{rotation}, #{side_length / 2}, #{triangle_height / 2})"
49
+ ))
47
50
  end
48
51
  i += 1
49
52
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GeoPattern
2
4
  module StructureGenerators
3
5
  class XesGenerator < BaseGenerator
@@ -7,54 +9,59 @@ module GeoPattern
7
9
 
8
10
  def after_initialize
9
11
  @square_size = map(hex_val(0, 1), 0, 15, 10, 25)
10
- @x_shape = build_plus_shape(square_size) # rotated later
11
- @x_size = square_size * 3 * 0.943
12
+ @x_shape = build_plus_shape(square_size) # rotated later
13
+ @x_size = square_size * 3 * 0.943
12
14
 
13
15
  self.height = self.width = x_size * 3
14
16
  end
15
17
 
16
18
  def generate_structure
17
19
  i = 0
18
- for y in 0..5
19
- for x in 0..5
20
- val = hex_val(i, 1)
20
+ 6.times do |y|
21
+ 6.times do |x|
22
+ val = hex_val(i, 1)
21
23
  opacity = opacity(val)
22
- dy = x % 2 == 0 ? y * x_size - x_size * 0.5 : y * x_size - x_size * 0.5 + x_size / 4
23
- fill = fill_color(val)
24
+ dy = (x % 2 == 0) ? y * x_size - x_size * 0.5 : y * x_size - x_size * 0.5 + x_size / 4
25
+ fill = fill_color(val)
24
26
 
25
27
  styles = {
26
- 'fill' => fill,
27
- 'style' => {
28
- 'opacity' => opacity
28
+ "fill" => fill,
29
+ "style" => {
30
+ "opacity" => opacity
29
31
  }
30
32
  }
31
33
 
32
34
  svg.group(x_shape, styles.merge(
33
- 'transform' => "translate(#{x * x_size / 2 - x_size / 2},#{dy - y * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"))
35
+ "transform" => "translate(#{x * x_size / 2 - x_size / 2},#{dy - y * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"
36
+ ))
34
37
 
35
38
  # Add an extra column on the right for tiling.
36
- if (x == 0)
39
+ if x == 0
37
40
  svg.group(x_shape, styles.merge(
38
- 'transform' => "translate(#{6 * x_size / 2 - x_size / 2},#{dy - y * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"))
41
+ "transform" => "translate(#{6 * x_size / 2 - x_size / 2},#{dy - y * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"
42
+ ))
39
43
  end
40
44
 
41
45
  # Add an extra row on the bottom that matches the first row, for tiling.
42
- if (y == 0)
43
- dy = x % 2 == 0 ? 6 * x_size - x_size / 2 : 6 * x_size - x_size / 2 + x_size / 4
46
+ if y == 0
47
+ dy = (x % 2 == 0) ? 6 * x_size - x_size / 2 : 6 * x_size - x_size / 2 + x_size / 4
44
48
  svg.group(x_shape, styles.merge(
45
- 'transform' => "translate(#{x * x_size / 2 - x_size / 2},#{dy - 6 * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"))
49
+ "transform" => "translate(#{x * x_size / 2 - x_size / 2},#{dy - 6 * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"
50
+ ))
46
51
  end
47
52
 
48
53
  # These can hang off the bottom, so put a row at the top for tiling.
49
- if (y == 5)
54
+ if y == 5
50
55
  svg.group(x_shape, styles.merge(
51
- 'transform' => "translate(#{x * x_size / 2 - x_size / 2},#{dy - 11 * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"))
56
+ "transform" => "translate(#{x * x_size / 2 - x_size / 2},#{dy - 11 * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"
57
+ ))
52
58
  end
53
59
 
54
60
  # Add an extra one at top-right and bottom-right, for tiling.
55
61
  if x == 0 && y == 0
56
62
  svg.group(x_shape, styles.merge(
57
- 'transform' => "translate(#{6 * x_size / 2 - x_size / 2},#{dy - 6 * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"))
63
+ "transform" => "translate(#{6 * x_size / 2 - x_size / 2},#{dy - 6 * x_size / 2}) rotate(45, #{x_size / 2}, #{x_size / 2})"
64
+ ))
58
65
  end
59
66
  i += 1
60
67
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GeoPattern
2
4
  class SvgImage
3
5
  include Comparable
@@ -11,9 +13,9 @@ module GeoPattern
11
13
  attr_reader :height, :width
12
14
 
13
15
  def initialize
14
- @width = 100
15
- @height = 100
16
- @svg_string = ''
16
+ @width = 100
17
+ @height = 100
18
+ @svg_string = +""
17
19
  end
18
20
 
19
21
  def width=(width)
@@ -37,7 +39,7 @@ module GeoPattern
37
39
  end
38
40
 
39
41
  def svg_closer
40
- '</svg>'
42
+ "</svg>"
41
43
  end
42
44
 
43
45
  def to_s
@@ -70,16 +72,16 @@ module GeoPattern
70
72
 
71
73
  def group(elements, args = {})
72
74
  svg_string << %(<g #{write_args(args)}>)
73
- elements.each { |e| eval e }
75
+ elements.each { |e| eval e } # rubocop:disable Security/Eval
74
76
  svg_string << %(</g>)
75
77
  end
76
78
 
77
79
  def write_args(args)
78
- str = ''
79
- args.each do|key, value|
80
+ str = +""
81
+ args.each do |key, value|
80
82
  if value.is_a?(Hash)
81
83
  str << %(#{key}=")
82
- value.each do|k, v|
84
+ value.each do |k, v|
83
85
  str << %(#{k}:#{v};)
84
86
  end
85
87
  str << %(" )
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GeoPattern
2
- VERSION = '1.4.0'
4
+ VERSION = "1.6.0"
3
5
  end
data/lib/geo_pattern.rb CHANGED
@@ -1,56 +1,58 @@
1
- require 'base64'
2
- require 'digest/sha1'
3
- require 'color'
4
- require 'forwardable'
5
-
6
- require 'geo_pattern/version'
7
-
8
- require 'geo_pattern/roles/named_generator'
9
- require 'geo_pattern/roles/comparable_metadata'
10
-
11
- require 'geo_pattern/errors'
12
- require 'geo_pattern/color'
13
- require 'geo_pattern/svg_image'
14
- require 'geo_pattern/pattern_helpers'
15
- require 'geo_pattern/helpers'
16
- require 'geo_pattern/pattern_store'
17
- require 'geo_pattern/pattern_validator'
18
- require 'geo_pattern/pattern_sieve'
19
- require 'geo_pattern/pattern'
20
- require 'geo_pattern/seed'
21
- require 'geo_pattern/pattern_preset'
22
- require 'geo_pattern/color_preset'
23
-
24
- require 'geo_pattern/structure'
25
- require 'geo_pattern/background'
26
-
27
- require 'geo_pattern/color_generators/simple_generator'
28
- require 'geo_pattern/color_generators/base_color_generator'
29
-
30
- require 'geo_pattern/background_generators/solid_generator'
31
-
32
- require 'geo_pattern/structure_generators/base_generator'
33
- require 'geo_pattern/structure_generators/chevrons_generator'
34
- require 'geo_pattern/structure_generators/concentric_circles_generator'
35
- require 'geo_pattern/structure_generators/diamonds_generator'
36
- require 'geo_pattern/structure_generators/hexagons_generator'
37
- require 'geo_pattern/structure_generators/mosaic_squares_generator'
38
- require 'geo_pattern/structure_generators/nested_squares_generator'
39
- require 'geo_pattern/structure_generators/octagons_generator'
40
- require 'geo_pattern/structure_generators/overlapping_circles_generator'
41
- require 'geo_pattern/structure_generators/overlapping_rings_generator'
42
- require 'geo_pattern/structure_generators/plaid_generator'
43
- require 'geo_pattern/structure_generators/plus_signs_generator'
44
- require 'geo_pattern/structure_generators/sine_waves_generator'
45
- require 'geo_pattern/structure_generators/squares_generator'
46
- require 'geo_pattern/structure_generators/tessellation_generator'
47
- require 'geo_pattern/structure_generators/triangles_generator'
48
- require 'geo_pattern/structure_generators/xes_generator'
49
-
50
- require 'geo_pattern/pattern_generator'
1
+ # frozen_string_literal: true
2
+
3
+ require "base64"
4
+ require "digest/sha1"
5
+ require "color"
6
+ require "forwardable"
7
+
8
+ require "geo_pattern/version"
9
+
10
+ require "geo_pattern/roles/named_generator"
11
+ require "geo_pattern/roles/comparable_metadata"
12
+
13
+ require "geo_pattern/errors"
14
+ require "geo_pattern/color"
15
+ require "geo_pattern/svg_image"
16
+ require "geo_pattern/pattern_helpers"
17
+ require "geo_pattern/helpers"
18
+ require "geo_pattern/pattern_store"
19
+ require "geo_pattern/pattern_validator"
20
+ require "geo_pattern/pattern_sieve"
21
+ require "geo_pattern/pattern"
22
+ require "geo_pattern/seed"
23
+ require "geo_pattern/pattern_preset"
24
+ require "geo_pattern/color_preset"
25
+
26
+ require "geo_pattern/structure"
27
+ require "geo_pattern/background"
28
+
29
+ require "geo_pattern/color_generators/simple_generator"
30
+ require "geo_pattern/color_generators/base_color_generator"
31
+
32
+ require "geo_pattern/background_generators/solid_generator"
33
+
34
+ require "geo_pattern/structure_generators/base_generator"
35
+ require "geo_pattern/structure_generators/chevrons_generator"
36
+ require "geo_pattern/structure_generators/concentric_circles_generator"
37
+ require "geo_pattern/structure_generators/diamonds_generator"
38
+ require "geo_pattern/structure_generators/hexagons_generator"
39
+ require "geo_pattern/structure_generators/mosaic_squares_generator"
40
+ require "geo_pattern/structure_generators/nested_squares_generator"
41
+ require "geo_pattern/structure_generators/octagons_generator"
42
+ require "geo_pattern/structure_generators/overlapping_circles_generator"
43
+ require "geo_pattern/structure_generators/overlapping_rings_generator"
44
+ require "geo_pattern/structure_generators/plaid_generator"
45
+ require "geo_pattern/structure_generators/plus_signs_generator"
46
+ require "geo_pattern/structure_generators/sine_waves_generator"
47
+ require "geo_pattern/structure_generators/squares_generator"
48
+ require "geo_pattern/structure_generators/tessellation_generator"
49
+ require "geo_pattern/structure_generators/triangles_generator"
50
+ require "geo_pattern/structure_generators/xes_generator"
51
+
52
+ require "geo_pattern/pattern_generator"
51
53
 
52
54
  module GeoPattern
53
55
  def self.generate(string = Time.now, opts = {})
54
- GeoPattern::PatternGenerator.new(string.to_s, opts).generate
56
+ GeoPattern::PatternGenerator.new(string.to_s, **opts).generate
55
57
  end
56
58
  end