image_paradise 0.1.12

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of image_paradise might be problematic. Click here for more details.

Files changed (115) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.md +38 -0
  3. data/README.md +179 -0
  4. data/USAGE.md +10 -0
  5. data/bin/black_white +10 -0
  6. data/bin/display_text_from_this_image +7 -0
  7. data/bin/image_paradise +7 -0
  8. data/bin/image_paradise_shell +7 -0
  9. data/bin/image_to_ascii +54 -0
  10. data/bin/image_to_pdf +7 -0
  11. data/bin/make_this_image_transparent +7 -0
  12. data/bin/rotate_left +7 -0
  13. data/bin/rotate_right +7 -0
  14. data/doc/README.gen +162 -0
  15. data/doc/TODO_FOR_THE_GTK_GUI.md +1 -0
  16. data/image_paradise.gemspec +50 -0
  17. data/lib/image_paradise.rb +5 -0
  18. data/lib/image_paradise/base/base.rb +91 -0
  19. data/lib/image_paradise/black_white.rb +89 -0
  20. data/lib/image_paradise/confree_generator/class.rb +614 -0
  21. data/lib/image_paradise/confree_generator/constants.rb +61 -0
  22. data/lib/image_paradise/confree_generator/gui/gtk_confree_generator.rb +752 -0
  23. data/lib/image_paradise/confree_generator/gui/insert_button.rb +78 -0
  24. data/lib/image_paradise/confree_generator/reset.rb +61 -0
  25. data/lib/image_paradise/confree_generator/shared/shared.rb +100 -0
  26. data/lib/image_paradise/constants.rb +43 -0
  27. data/lib/image_paradise/constants/image_file_types.rb +21 -0
  28. data/lib/image_paradise/create_animated_gif.rb +47 -0
  29. data/lib/image_paradise/crop/crop.rb +302 -0
  30. data/lib/image_paradise/gm_support.rb +34 -0
  31. data/lib/image_paradise/graphs.rb +36 -0
  32. data/lib/image_paradise/graphs/accumulator_bar.rb +29 -0
  33. data/lib/image_paradise/graphs/area.rb +64 -0
  34. data/lib/image_paradise/graphs/bar.rb +117 -0
  35. data/lib/image_paradise/graphs/bar_conversion.rb +53 -0
  36. data/lib/image_paradise/graphs/base.rb +1392 -0
  37. data/lib/image_paradise/graphs/bezier.rb +45 -0
  38. data/lib/image_paradise/graphs/bullet.rb +115 -0
  39. data/lib/image_paradise/graphs/deprecated.rb +42 -0
  40. data/lib/image_paradise/graphs/dot.rb +129 -0
  41. data/lib/image_paradise/graphs/line.rb +328 -0
  42. data/lib/image_paradise/graphs/mini/bar.rb +42 -0
  43. data/lib/image_paradise/graphs/mini/legend.rb +109 -0
  44. data/lib/image_paradise/graphs/mini/pie.rb +42 -0
  45. data/lib/image_paradise/graphs/mini/side_bar.rb +41 -0
  46. data/lib/image_paradise/graphs/net.rb +133 -0
  47. data/lib/image_paradise/graphs/photo_bar.rb +106 -0
  48. data/lib/image_paradise/graphs/pie.rb +139 -0
  49. data/lib/image_paradise/graphs/scatter.rb +264 -0
  50. data/lib/image_paradise/graphs/scene.rb +216 -0
  51. data/lib/image_paradise/graphs/side_bar.rb +144 -0
  52. data/lib/image_paradise/graphs/side_stacked_bar.rb +116 -0
  53. data/lib/image_paradise/graphs/spider.rb +163 -0
  54. data/lib/image_paradise/graphs/stacked_area.rb +73 -0
  55. data/lib/image_paradise/graphs/stacked_bar.rb +68 -0
  56. data/lib/image_paradise/graphs/stacked_mixin.rb +30 -0
  57. data/lib/image_paradise/graphs/themes.rb +117 -0
  58. data/lib/image_paradise/graphviz/README.md +2 -0
  59. data/lib/image_paradise/graphviz/generate_graphviz_image.rb +274 -0
  60. data/lib/image_paradise/gui/gtk/control_panel.rb +126 -0
  61. data/lib/image_paradise/identify.rb +145 -0
  62. data/lib/image_paradise/image_border.rb +231 -0
  63. data/lib/image_paradise/image_manipulations.rb +320 -0
  64. data/lib/image_paradise/image_paradise.rb +150 -0
  65. data/lib/image_paradise/image_to_ascii/image_to_ascii.rb +187 -0
  66. data/lib/image_paradise/image_to_pdf/image_to_pdf.rb +99 -0
  67. data/lib/image_paradise/label/README.md +2 -0
  68. data/lib/image_paradise/label/simple_label.rb +206 -0
  69. data/lib/image_paradise/optimizer.rb +483 -0
  70. data/lib/image_paradise/project/project.rb +29 -0
  71. data/lib/image_paradise/random_text_to_image.rb +363 -0
  72. data/lib/image_paradise/requires/common_base_requires.rb +17 -0
  73. data/lib/image_paradise/requires/require_colours.rb +9 -0
  74. data/lib/image_paradise/requires/require_gtk_components.rb +8 -0
  75. data/lib/image_paradise/requires/require_image_to_ascii.rb +7 -0
  76. data/lib/image_paradise/requires/require_the_image_paradise_project.rb +24 -0
  77. data/lib/image_paradise/requires/require_toplevel_methods.rb +21 -0
  78. data/lib/image_paradise/rotate/README.md +2 -0
  79. data/lib/image_paradise/rotate/rotate.rb +98 -0
  80. data/lib/image_paradise/shell/interactive.rb +156 -0
  81. data/lib/image_paradise/svg/README.md +5 -0
  82. data/lib/image_paradise/svg/circle.rb +106 -0
  83. data/lib/image_paradise/svg/feature.rb +48 -0
  84. data/lib/image_paradise/svg/rectangle.rb +154 -0
  85. data/lib/image_paradise/svg/svg.rb +102 -0
  86. data/lib/image_paradise/to_gif.rb +91 -0
  87. data/lib/image_paradise/to_jpg.rb +90 -0
  88. data/lib/image_paradise/toplevel_methods/add_black_border_to_this_image.rb +56 -0
  89. data/lib/image_paradise/toplevel_methods/crop.rb +28 -0
  90. data/lib/image_paradise/toplevel_methods/e.rb +16 -0
  91. data/lib/image_paradise/toplevel_methods/esystem.rb +19 -0
  92. data/lib/image_paradise/toplevel_methods/extract_text_from_this_image.rb +56 -0
  93. data/lib/image_paradise/toplevel_methods/file_related_code.rb +25 -0
  94. data/lib/image_paradise/toplevel_methods/flip_image_left_right.rb +32 -0
  95. data/lib/image_paradise/toplevel_methods/greyscale_this_image.rb +59 -0
  96. data/lib/image_paradise/toplevel_methods/help.rb +30 -0
  97. data/lib/image_paradise/toplevel_methods/make_this_image_transparent.rb +30 -0
  98. data/lib/image_paradise/toplevel_methods/menu.rb +92 -0
  99. data/lib/image_paradise/toplevel_methods/merge_these_images.rb +49 -0
  100. data/lib/image_paradise/toplevel_methods/mirror_image.rb +28 -0
  101. data/lib/image_paradise/toplevel_methods/misc.rb +31 -0
  102. data/lib/image_paradise/toplevel_methods/png_to_svg.rb +34 -0
  103. data/lib/image_paradise/toplevel_methods/roebe.rb +17 -0
  104. data/lib/image_paradise/toplevel_methods/to_png.rb +105 -0
  105. data/lib/image_paradise/toplevel_methods/wallpaper.rb +37 -0
  106. data/lib/image_paradise/toplevel_methods/write_this_text.rb +76 -0
  107. data/lib/image_paradise/version/version.rb +19 -0
  108. data/test/16x16_red_square_image_for_testing.png +0 -0
  109. data/test/testing_confree_generator.rb +8 -0
  110. data/test/testing_crop.rb +19 -0
  111. data/test/testing_image_magick_commands.rb +39 -0
  112. data/test/testing_image_paradise.rb +49 -0
  113. data/test/testing_the_svg_component.html +261 -0
  114. data/test/testing_the_svg_component.rb +106 -0
  115. metadata +217 -0
@@ -0,0 +1 @@
1
+ - We need to add a pdf-to-png converter.
@@ -0,0 +1,50 @@
1
+ # =========================================================================== #
2
+ # Gemspec for Project ImageParadise.
3
+ # =========================================================================== #
4
+ require 'image_paradise/version/version.rb'
5
+
6
+ Gem::Specification.new { |s|
7
+
8
+ s.name = 'image_paradise'
9
+ s.version = ImageParadise::VERSION
10
+ s.date = Time.now.strftime('%Y-%m-%d')
11
+
12
+ DESCRIPTION = <<-EOF
13
+
14
+ This project, called image_paradise, allows you to manipulate images,
15
+ primarily by using ImageMagick.
16
+
17
+ For a more complete overview, have a look at the documentation, but
18
+ just to give an overview - it is possible to animate .gif files,
19
+ make use of gruff, or batch-generate automatically created
20
+ image files through confree_generator (if you have cfdg
21
+ installed). Images can be cropped through the toplevel method
22
+ ImageParadise.crop(). class Optimizer can be used to optimize .jpg
23
+ and .png files, if pngquant is installed.
24
+
25
+ EOF
26
+
27
+ s.summary = DESCRIPTION
28
+ s.description = DESCRIPTION
29
+
30
+ s.extra_rdoc_files = %w()
31
+
32
+ s.authors = ['Robert A. Heiler']
33
+ s.email = 'shevegen@gmail.com'
34
+ s.files = Dir['**/*']
35
+ s.license = 'GPL-2.0'
36
+ s.executables = Dir['bin/*'].map { |f| File.basename(f) }
37
+ s.homepage = 'https://rubygems.org/gems/image_paradise'
38
+
39
+ s.required_ruby_version = '>= '+RUBY_VERSION
40
+ s.required_rubygems_version = '>= '+Gem::VERSION
41
+ s.rubygems_version = '>= '+Gem::VERSION
42
+
43
+ # ========================================================================= #
44
+ # Dependencies for the project:
45
+ # ========================================================================= #
46
+ s.add_dependency 'colours'
47
+ s.add_dependency 'opn'
48
+ s.add_dependency 'save_file'
49
+
50
+ }
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ require 'image_paradise/requires/require_the_image_paradise_project.rb'
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'image_paradise/base/base.rb'
6
+ # < ::ImageParadise::Base
7
+ # =========================================================================== #
8
+ require 'image_paradise/requires/common_base_requires.rb'
9
+ require 'image_paradise/constants.rb'
10
+ require 'image_paradise/toplevel_methods/esystem.rb'
11
+ require 'image_paradise/toplevel_methods/file_related_code.rb'
12
+ require 'image_paradise/toplevel_methods/roebe.rb'
13
+
14
+ module ImageParadise
15
+
16
+ class Base # === ImageParadise::Base
17
+
18
+ include Colours
19
+
20
+ # ========================================================================= #
21
+ # === initialize
22
+ # ========================================================================= #
23
+ def initialize
24
+ end
25
+
26
+ # ========================================================================= #
27
+ # === reset
28
+ # ========================================================================= #
29
+ def reset
30
+ end
31
+
32
+ # ========================================================================= #
33
+ # === today
34
+ # ========================================================================= #
35
+ def today
36
+ "#{Time.now.strftime('%d.%m.%Y')}_#{Time.now.strftime('%H:%M:%S.%L')}"
37
+ end
38
+
39
+ # ========================================================================= #
40
+ # === rds
41
+ # ========================================================================= #
42
+ def rds(i)
43
+ i.squeeze('/')
44
+ end
45
+
46
+ # ========================================================================= #
47
+ # === chdir
48
+ # ========================================================================= #
49
+ def chdir(i)
50
+ Dir.chdir(i)
51
+ end
52
+
53
+ # ========================================================================= #
54
+ # === mkdir
55
+ # ========================================================================= #
56
+ def mkdir(i)
57
+ FileUtils.mkdir_p(i) unless File.directory? i
58
+ end
59
+
60
+ # ========================================================================= #
61
+ # === register_sigint
62
+ # ========================================================================= #
63
+ def register_sigint
64
+ Signal.trap('SIGINT') {
65
+ e 'Exiting now, as requested.'
66
+ exit
67
+ }
68
+ end
69
+
70
+ # ========================================================================= #
71
+ # === write_what_into
72
+ # ========================================================================= #
73
+ def write_what_into(what, into)
74
+ SaveFile.write_what_into(what, into)
75
+ end
76
+
77
+ # ========================================================================= #
78
+ # === esystem
79
+ # ========================================================================= #
80
+ def esystem(i)
81
+ ::ImageParadise.esystem(i)
82
+ end
83
+
84
+ # ========================================================================= #
85
+ # === is_on_roebe?
86
+ # ========================================================================= #
87
+ def is_on_roebe?
88
+ ::ImageParadise.is_on_roebe?
89
+ end
90
+
91
+ end; end
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === ImageParadise::BlackWhite
6
+ #
7
+ # This class can turn an image into a black-white image.
8
+ #
9
+ # Usage example:
10
+ # ImageParadise::BlackWhite.new
11
+ # =========================================================================== #
12
+ # require 'image_paradise/black_white.rb'
13
+ # =========================================================================== #
14
+ require 'image_paradise/base/base.rb'
15
+
16
+ module ImageParadise
17
+
18
+ class BlackWhite < ::ImageParadise::Base # === ImageParadise::BlackWhite
19
+
20
+ # ========================================================================= #
21
+ # === initialize
22
+ # ========================================================================= #
23
+ def initialize(
24
+ i = nil,
25
+ run_already = true
26
+ )
27
+ reset
28
+ set_input(i)
29
+ run if run_already
30
+ end
31
+
32
+ # ========================================================================= #
33
+ # === reset (reset tag)
34
+ # ========================================================================= #
35
+ def reset
36
+ end
37
+
38
+ # ========================================================================= #
39
+ # === set_input
40
+ # ========================================================================= #
41
+ def set_input(i = ARGV)
42
+ i = [i] unless i.is_a? Array
43
+ @input = i
44
+ end
45
+
46
+ # ========================================================================= #
47
+ # === input?
48
+ # ========================================================================= #
49
+ def input?
50
+ @input
51
+ end
52
+
53
+ # ========================================================================= #
54
+ # === run (run tag)
55
+ # ========================================================================= #
56
+ def run
57
+ input?.each {|filename|
58
+ _ = 'convert '+filename+' -colorspace Gray OUTPUT_'+filename
59
+ Esystem.esystem(_)
60
+ }
61
+ end
62
+
63
+ # ========================================================================= #
64
+ # === []
65
+ # ========================================================================= #
66
+ def self.[](i = '')
67
+ self.new(i)
68
+ end
69
+
70
+ end
71
+
72
+ # =========================================================================== #
73
+ # === ImageParadise.black_white
74
+ # =========================================================================== #
75
+ def self.black_white(i = ARGV)
76
+ if i.is_a? Array
77
+ i.each {|entry|
78
+ ImageParadise.black_white(entry)
79
+ }
80
+ else
81
+ ImageParadise::BlackWhite.new(i)
82
+ end
83
+ end
84
+
85
+ end
86
+
87
+ if __FILE__ == $PROGRAM_NAME
88
+ ImageParadise::BlackWhite.new(ARGV)
89
+ end # black_white
@@ -0,0 +1,614 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === ImageParadise::ConfreeGenerator
6
+ #
7
+ # The task of this class is to generate a .cfdg file or more than one.
8
+ #
9
+ # Usage examples:
10
+ #
11
+ # ImageParadise::ConfreeGenerator.new(ARGV)
12
+ #
13
+ # =========================================================================== #
14
+ # require 'image_paradise/confree_generator/class.rb'
15
+ # ImageParadise.confreegenerator
16
+ # =========================================================================== #
17
+ require 'image_paradise/base/base.rb'
18
+ require 'image_paradise/confree_generator/reset.rb'
19
+ require 'image_paradise/confree_generator/shared/shared.rb'
20
+
21
+ module ImageParadise
22
+
23
+ class ConfreeGenerator < ::ImageParadise::Base # === ImageParadise::ConfreeGenerator
24
+
25
+ begin
26
+ require 'web_object/toplevel_methods/standalone_drag_and_drop_this_image.rb'
27
+ rescue LoadError; end
28
+
29
+ begin
30
+ require 'html_tags' # For .html generation.
31
+ include HtmlTags
32
+ rescue LoadError; end
33
+
34
+ include ImageParadise::ConfreeGenerator::Shared # This one is part of shared/shared.rb
35
+
36
+ attr_accessor :n_confree_files # How many confree files we will process.
37
+
38
+ # ========================================================================= #
39
+ # === initialize
40
+ # ========================================================================= #
41
+ def initialize(
42
+ i = nil,
43
+ run_already = true
44
+ )
45
+ register_sigint
46
+ reset
47
+ set_input(i)
48
+ if block_given?
49
+ yielded = yield
50
+ case yielded
51
+ # ===================================================================== #
52
+ # === :do_not_open_via_the_browser
53
+ # ===================================================================== #
54
+ when :do_not_open_via_the_browser
55
+ @try_to_open_the_generated_image_in_the_browser = false
56
+ end
57
+ end
58
+ run if run_already
59
+ end
60
+
61
+ # ========================================================================= #
62
+ # === name_of_output_file?
63
+ # ========================================================================= #
64
+ def name_of_output_file?
65
+ ConfreeGenerator::NAME_OF_OUTPUT_FILE
66
+ end
67
+
68
+ # ========================================================================= #
69
+ # === set_location_of_output_file
70
+ #
71
+ # This tells us where we store the output file.
72
+ # ========================================================================= #
73
+ def set_location_of_output_file(
74
+ i = DIRECTORY_WITH_CFDG_IMAGES+name_of_output_file?
75
+ )
76
+ i = DIRECTORY_WITH_CFDG_IMAGES+name_of_output_file? if i.nil?
77
+ i = Dir.pwd+'/'+i unless i.include? '/'
78
+ @location_of_output_file = i
79
+ end; alias set_output_location set_location_of_output_file # === set_output_location
80
+ alias set_output set_location_of_output_file # === set_output
81
+
82
+ # ========================================================================= #
83
+ # === br
84
+ # ========================================================================= #
85
+ def br
86
+ HtmlTags.br
87
+ end
88
+
89
+ # ========================================================================= #
90
+ # === random_name
91
+ #
92
+ # This method will return a string which consists of the input-string
93
+ # and 8 more random characters. We assume that for 8 random characters,
94
+ # there will be no double names.
95
+ #
96
+ # The result of this method is, for instance:
97
+ # "tube_map_jblhelce.png"
98
+ # ========================================================================= #
99
+ def random_name(i)
100
+ copy = i.to_s.dup
101
+ alphabet = ALPHABET # Build up the alphabet.
102
+ copy.gsub!(/\.cfdg/,'') # Don't like file ending here.
103
+ copy = File.basename(copy).dup
104
+ copy << '_'
105
+ 10.times { copy << alphabet.sample }
106
+ return copy
107
+ end
108
+
109
+ # ========================================================================= #
110
+ # === eparse
111
+ # ========================================================================= #
112
+ def eparse(i)
113
+ Colours.eparse(i)
114
+ end
115
+
116
+ # ========================================================================= #
117
+ # === toggle_generate_image
118
+ #
119
+ # This toggle switches between when we want to generate the image,
120
+ # and when we don't.
121
+ # ========================================================================= #
122
+ def toggle_generate_image
123
+ if generate_the_image?
124
+ e 'Setting to false - dont create images.'
125
+ else
126
+ e 'Setting to true - do create images.'
127
+ end
128
+ @generate_the_image = ! @generate_the_image
129
+ end; alias change_flag toggle_generate_image # === change_flag
130
+
131
+ # ========================================================================= #
132
+ # === generate_the_image?
133
+ # ========================================================================= #
134
+ def generate_the_image?
135
+ @generate_the_image
136
+ end
137
+
138
+ # ========================================================================= #
139
+ # === show_welcome_message
140
+ # ========================================================================= #
141
+ def show_welcome_message
142
+ opnn; efancy ' => Starting the Confreegenerator now.'
143
+ opnn; e 'Welcome!'
144
+ end
145
+
146
+ # ========================================================================= #
147
+ # === check_whether_cfdg_is_installed
148
+ # ========================================================================= #
149
+ def check_whether_cfdg_is_installed
150
+ _ = `cfdg 2>&1` # => "sh: cfdg: command not found\n"
151
+ if _.include? 'cfdg: command not found'
152
+ e 'Note that you do not seem to have cfdg installed.'
153
+ e 'We will still continue nonetheless.'
154
+ end
155
+ end
156
+
157
+ # ========================================================================= #
158
+ # === start_gui (gui tag)
159
+ #
160
+ # This method will start the GUI component.
161
+ # ========================================================================= #
162
+ def start_gui
163
+ require 'confreegenerator/gui/gtk_confree_generator.rb'
164
+ @gtk_confreegenerator = GtkConfreeGenerator.new
165
+ end
166
+
167
+ # ========================================================================= #
168
+ # === check_input_given (menu tag)
169
+ #
170
+ # Usage examples:
171
+ #
172
+ # confgen change_flag
173
+ #
174
+ # Regular use:
175
+ #
176
+ # rfree $CFDG/spiral_star.cfdg
177
+ # rfree $CFDG/star.cfdg
178
+ #
179
+ # ========================================================================= #
180
+ def menu
181
+ _ = @input.shift # Return the first element and also remove it.
182
+ case _ # case tag
183
+ # ======================================================================= #
184
+ # === confree_generator --batch
185
+ # ======================================================================= #
186
+ when /^-?-?batch$/,
187
+ 'batchmode','b','2'
188
+ run_in_batch_mode
189
+ # ======================================================================= #
190
+ # === confree_generator --html
191
+ # ======================================================================= #
192
+ when /^-?-?html$/i,
193
+ /^-?-?html(_|-)?gallery$/i,
194
+ 'gallery','default','4'
195
+ create_html_gallery # Always create the html gallery.
196
+ # ======================================================================= #
197
+ # === confree_generator --gui
198
+ # ======================================================================= #
199
+ when /^-?-?gui$/i,'startgui','start_gui','3'
200
+ start_gui
201
+ # ======================================================================= #
202
+ # === confree_generator --toggle
203
+ # ======================================================================= #
204
+ when '--toggle','change','change_flag','c','flag','f','fl',
205
+ 'fla','generate_image','toggle','1'
206
+ toggle_generate_image
207
+ # ======================================================================= #
208
+ # === confree_generator --gallery_only
209
+ # ======================================================================= #
210
+ when '--gallery_only','gallery_only'
211
+ @create_image = false # We skip creating the images anew.
212
+ create_html_gallery
213
+ # ======================================================================= #
214
+ # === confree_generator --help
215
+ # ======================================================================= #
216
+ when 'HELP','help','--help'
217
+ show_help; exit
218
+ else # else tag
219
+ set_input(_)
220
+ show_welcome_message
221
+ create_html_gallery if @create_html_gallery
222
+ end
223
+ end; alias check_input_given menu # === check_input_given
224
+
225
+ # ======================================================================= #
226
+ # === set_width_then_height
227
+ #
228
+ # This method will first set the width, then the height.
229
+ # ======================================================================= #
230
+ def set_width_then_height(
231
+ width = 55,
232
+ height = nil
233
+ )
234
+ height = width if height.nil?
235
+ set_width(width)
236
+ set_height(height)
237
+ end
238
+
239
+ # ========================================================================= #
240
+ # === append_to_html_file
241
+ #
242
+ # Use this method to append into a html file.
243
+ # ========================================================================= #
244
+ def append_to_html_file(i = nil)
245
+ append_what_into(i, html_file?) if i
246
+ end; alias my_append append_to_html_file # === my_append
247
+
248
+ # ========================================================================= #
249
+ # === html_file?
250
+ # ========================================================================= #
251
+ def html_file?
252
+ @html_file
253
+ end
254
+
255
+ # ========================================================================= #
256
+ # === start_batch_processing (batch tag)
257
+ # ========================================================================= #
258
+ def start_batch_processing
259
+ @file_listing = get_all_cfdg_files
260
+ # Let's order it randomly:
261
+ @file_listing = @file_listing.sort_by { rand }
262
+ # Obtain how many we have:
263
+ @n_confree_files = @file_listing.size
264
+ set_input @file_listing
265
+ @input.each {|entry|
266
+ _ = TEMP_IMAGES+random_name(entry)+'.png'
267
+ e _
268
+ set_output_location(_)
269
+ create_image_from_cfdg(entry)
270
+ }
271
+ end
272
+
273
+ # ========================================================================= #
274
+ # === run_in_batch_mode
275
+ # ========================================================================= #
276
+ def run_in_batch_mode
277
+ @batch_mode = true
278
+ end
279
+
280
+ # ========================================================================= #
281
+ # === create_html_gallery (html tag, img tag, gallery tag)
282
+ #
283
+ # Run this method here to create the HTML gallery.
284
+ #
285
+ # To invoke this method from the commandline, try:
286
+ #
287
+ # confree_generator --html
288
+ #
289
+ # ========================================================================= #
290
+ def create_html_gallery
291
+ ::ImageParadise.remove_file(html_file?) # Always ensure that the html_file was removed.
292
+ opnn; e "We will save into `#{sfile(html_file?)}`."
293
+ mkdir(File.dirname(html_file?))
294
+ _ = '<html>'.dup
295
+ _ << '<title>'+html_file?+' CFDG Image Collection'+'</title>'
296
+ _ << HtmlTags.body
297
+ # ======================================================================= #
298
+ # After here, we have added <html>, <title> and <body>
299
+ # ======================================================================= #
300
+ append_to_html_file(_)
301
+ img_counter = 0
302
+ if @create_image
303
+ these_files = get_all_cfdg_files
304
+ else
305
+ these_files = Dir[save_files_where?+'*.png']
306
+ end
307
+ be_verbose = @create_image
308
+ # ======================================================================= #
309
+ # Next, we add all the images that we found:
310
+ # ======================================================================= #
311
+ these_files.each {|cfdg_file|
312
+ if @create_image
313
+ _ = TEMP_IMAGES+random_name(cfdg_file)+'.png'
314
+ else
315
+ _ = cfdg_file
316
+ end
317
+ set_output_location(_)
318
+ if @create_image
319
+ opnn; e 'Now processing file `'+sfile(cfdg_file)+'` into `'+sfile(_)+'`.'
320
+ end
321
+ img_counter += 1 # at which img pos are we?
322
+ @n_confree_files += 1
323
+ tmp_var = img_counter % 9
324
+ set_width_then_height(320) # This is the same size for both.
325
+ create_image_from_cfdg_file(cfdg_file, true) if @create_image
326
+ # ===================================================================== #
327
+ # Next we will create the file, but we will store it into a html table.
328
+ # Data points 1,2,3 - 4,5,6 -7,8,9 come into a table.
329
+ # ===================================================================== #
330
+ case tmp_var # case tag
331
+ when 0
332
+ my_append(TD+N)
333
+ write_entry( i.sub(/\/Users\/x\/DATA\/IMG/,'$IMG'),
334
+ img_counter, be_verbose )
335
+ my_append(ctd)
336
+ my_append(ctr+N+N)
337
+ my_append(ctable+N+N)
338
+ # Reset the img_counter every 9 iteration.
339
+ img_counter = 0
340
+ when 1
341
+ my_append(TABLE+TR+TD+N)
342
+ write_entry(cfdg_file, img_counter, be_verbose)
343
+ my_append(ctd)
344
+ when 3,6
345
+ _ = td+cfdg_file+img_counter.to_s+ctd+
346
+ ctr+N+N+tr
347
+ my_append(_)
348
+ else # bei 2,4,5,7,8
349
+ my_append(TD+N)
350
+ write_entry(cfdg_file, img_counter, be_verbose)
351
+ my_append(ctd)
352
+ end
353
+ }
354
+ # ======================================================================= #
355
+ # Last but not least, we close the table.
356
+ # ======================================================================= #
357
+ my_append(ctr)
358
+ my_append(ctable)
359
+ my_append(br+'Find more examples ')
360
+ my_append('<a href="http://chriscoyne.com/gallery/view.php"><b>here</b></a>')
361
+ my_append(br+' '+@n_confree_files.to_s+' images files should be listed here.'+N)
362
+ my_append(br+cbody+chtml)
363
+ opnn; e "Finished appending into `#{sfile(html_file?)}`."
364
+ end
365
+
366
+ # ========================================================================= #
367
+ # === save_files_where?
368
+ # ========================================================================= #
369
+ def save_files_where?
370
+ TEMP_IMAGES
371
+ end
372
+
373
+ # ========================================================================= #
374
+ # === opnn
375
+ # ========================================================================= #
376
+ def opnn
377
+ Opn.opn(namespace: NAMESPACE)
378
+ end
379
+
380
+ # ========================================================================= #
381
+ # === show_help (help tag)
382
+ #
383
+ # To invoke this help menu, do:
384
+ #
385
+ # congen HELP
386
+ #
387
+ # ========================================================================= #
388
+ def show_help
389
+ e
390
+ e ::Colours::YEL+'Currently this script has this usage:'+::Colours.rev
391
+ e
392
+ eparse ' confreegen name_of_cfdg_file.cfdg'
393
+ e
394
+ eparse ' toggle # Toggle whether we want to create the image or not.'
395
+ eparse ' batch # run everything in batch mode (batch processing)'
396
+ eparse ' gallery_only # generate only the gallery'
397
+ eparse ' html # create a html gallery'
398
+ eparse ' gui # start the GUI component of this project'
399
+ e
400
+ end
401
+
402
+ # ========================================================================= #
403
+ # === write_entry
404
+ #
405
+ # A helper method to log stuff into the html file. We use the project
406
+ # HtmlTags for the html here.
407
+ # ========================================================================= #
408
+ def write_entry(
409
+ i, counter = 0, be_verbose = true
410
+ )
411
+ my_append(
412
+ HtmlTags.comment(counter.to_s)
413
+ )
414
+ my_append(
415
+ span('The CFDG-File Name is:','','','font-size:0.95em')+br+N
416
+ ) if be_verbose
417
+ my_append(
418
+ b(i)+br+N
419
+ )
420
+ # ======================================================================= #
421
+ # Add the <img> tag here.
422
+ # ======================================================================= #
423
+ id_for_this_image_file = File.basename(@location_of_output_file).
424
+ sub(/#{File.extname(@location_of_output_file)}$/,'')
425
+ my_append(
426
+ N+N+img( # <- This will actually call HtmlTags.img().
427
+ @location_of_output_file,
428
+ '','','margin:5px; border:1px solid black;'
429
+ )+
430
+ WebObject.standalone_drag_and_drop_this_image(id_for_this_image_file)+
431
+ N # img tag here.
432
+ )
433
+ end
434
+
435
+ # ========================================================================= #
436
+ # === process_input (process tag)
437
+ #
438
+ # This method will process the .cfdg file at hand.
439
+ # ========================================================================= #
440
+ def process_input(
441
+ i = @input
442
+ )
443
+ if @batch_mode # Run all images here.
444
+ start_batch_processing
445
+ else
446
+ unless i.empty?
447
+ e ' => Processing the given input next.'
448
+ i.each_with_index {|entry, index| index += 1
449
+ opnn; e ("#{index})").rjust(4)+' '+entry
450
+ create_image_from_cfdg(entry)
451
+ }
452
+ end
453
+ end
454
+ end
455
+
456
+ # ========================================================================= #
457
+ # === create_image_from_cfdg (system tag)
458
+ #
459
+ # This is the method that will shell out to "cfdg" and actually create
460
+ # the image in question. Additionally, we may also optimize the
461
+ # generated .png file, via "pngquant", to minimize the size.
462
+ # ========================================================================= #
463
+ def create_image_from_cfdg(
464
+ i,
465
+ generate_the_image = @generate_the_image
466
+ )
467
+ if File.exist? i
468
+ scan_this_file_for_width_and_height_values(i)
469
+ end
470
+ _ = 'cfdg '+i.to_s
471
+ _ << ' -b 1' # This means border size. For now this is hardcoded.
472
+ _ << ' -w '+@height.to_s
473
+ _ << ' -h '+@width.to_s
474
+ # _ << '-a 10'
475
+ _ << ' '+@location_of_output_file
476
+ e _
477
+ if generate_the_image
478
+ system(_)
479
+ # ===================================================================== #
480
+ # === Optimize via pngquant
481
+ # ===================================================================== #
482
+ if OPTIMIZE_PNG_FILES
483
+ # =================================================================== #
484
+ # Do a bit of clean-up first:
485
+ # =================================================================== #
486
+ # _ = 'output-fs8.png'
487
+ # File.delete(_) if File.exist? _
488
+ # =================================================================== #
489
+ # Optimize the generated .png file.
490
+ # =================================================================== #
491
+ optimize_string = 'pngquant '+@location_of_output_file
492
+ e "Next running #{sfancy('pngquant')} to reduce the size "\
493
+ "of the .png file at hand."
494
+ e
495
+ e sfancy(" #{optimize_string}")
496
+ e
497
+ system(optimize_string)
498
+ end
499
+ if @try_to_open_the_generated_image_in_the_browser
500
+ if File.exist? @location_of_output_file
501
+ require 'open_in_browser'
502
+ OpenInBrowser[@location_of_output_file]
503
+ end
504
+ end
505
+ end
506
+ end; alias create_image_from_cfdg_file create_image_from_cfdg # === create_image_from_cfdg_file
507
+
508
+ # ========================================================================= #
509
+ # === scan_this_file_for_width_and_height_values
510
+ # ========================================================================= #
511
+ def scan_this_file_for_width_and_height_values(i)
512
+ File.readlines(i).each {|line|
513
+ if line.include? ' WIDTH: '
514
+ # =================================================================== #
515
+ # Set the width next:
516
+ # =================================================================== #
517
+ set_width(line.delete('#:').strip.sub(/WIDTH/,''))
518
+ elsif line.include? ' HEIGHT: '
519
+ # =================================================================== #
520
+ # Set the height next:
521
+ # =================================================================== #
522
+ set_height(line.delete('#:').strip.sub(/HEIGHT/,''))
523
+ end
524
+ }
525
+ end
526
+
527
+ # ========================================================================= #
528
+ # === set_height
529
+ # ========================================================================= #
530
+ def set_height(i)
531
+ if i.is_a? String
532
+ i = i.dup if i.frozen?
533
+ i.strip!
534
+ end
535
+ @height = i.to_i
536
+ end
537
+
538
+ # ========================================================================= #
539
+ # === set_width
540
+ # ========================================================================= #
541
+ def set_width(i)
542
+ if i.is_a? String
543
+ i = i.dup if i.frozen?
544
+ i.strip!
545
+ end
546
+ @width = i.to_i
547
+ end
548
+
549
+ # ========================================================================= #
550
+ # === set_input
551
+ #
552
+ # Whenever this is called, we immediately run sanitize_input.
553
+ # ========================================================================= #
554
+ def set_input(i = '')
555
+ unless i.is_a? Array # We want an array here.
556
+ i = [i.to_s]
557
+ end
558
+ @input = i # <- This is typically a .cfdg file such as "moon_explorations.cfdg"
559
+ sanitize_input
560
+ end
561
+
562
+ # ========================================================================= #
563
+ # === sanitize_input (sanitize tag)
564
+ # ========================================================================= #
565
+ def sanitize_input
566
+ @input.map! {|entry|
567
+ entry = get_random_cfdg_file if entry == 'RANDOM' # Turn RANDOM into something meaningful here.
568
+ entry = entry.dup if entry.frozen?
569
+ unless entry.end_with? '.cfdg'
570
+ entry << '.cfdg'
571
+ end
572
+ unless File.exist? entry
573
+ try_this_target = "#{HARDCODED_PATH_TO_THE_CFDG_IMAGES_DIRECTORY}#{entry}"
574
+ if File.exist?(try_this_target)
575
+ entry = try_this_target
576
+ end
577
+ end
578
+ entry
579
+ }
580
+ @input.flatten!
581
+ end
582
+
583
+ # ========================================================================= #
584
+ # === run (run tag)
585
+ # ========================================================================= #
586
+ def run
587
+ check_whether_cfdg_is_installed
588
+ check_input_given
589
+ process_input
590
+ end
591
+
592
+ end
593
+
594
+ # =========================================================================== #
595
+ # === ImageParadise.confreegenerator
596
+ # =========================================================================== #
597
+ def self.confreegenerator(
598
+ i = ARGV
599
+ )
600
+ ::ImageParadise::ConfreeGenerator.new(i)
601
+ end
602
+
603
+ # =========================================================================== #
604
+ # === ImageParadise.batch_generate_the_cfdg_files
605
+ # =========================================================================== #
606
+ def self.batch_generate_the_cfdg_files
607
+ ::ImageParadise::ConfreeGenerator.new('--batch')
608
+ end
609
+
610
+ end
611
+
612
+ if __FILE__ == $PROGRAM_NAME
613
+ ImageParadise::ConfreeGenerator.new(ARGV)
614
+ end # confree_generator