image_paradise 0.1.12

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.

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,68 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ require 'image_paradise/graphs/base.rb'
6
+ require 'image_paradise/graphs/stacked_mixin.rb'
7
+
8
+ module ImageParadise
9
+
10
+ class Gruff::StackedBar < Gruff::Base
11
+
12
+ include StackedMixin
13
+
14
+ # Spacing factor applied between bars
15
+ attr_accessor :bar_spacing
16
+
17
+ # Number of pixels between bar segments
18
+ attr_accessor :segment_spacing
19
+
20
+ # === draw
21
+ #
22
+ # Draws a bar graph, but multiple sets are stacked on top of each other.
23
+ def draw
24
+ get_maximum_by_stack
25
+ super
26
+ return unless @has_data
27
+ # Setup spacing.
28
+ #
29
+ # Columns sit stacked.
30
+ @bar_spacing ||= 0.9
31
+ @segment_spacing ||= 1
32
+ @bar_width = @graph_width / @column_count.to_f
33
+ padding = (@bar_width * (1 - @bar_spacing)) / 2
34
+
35
+ @d = @d.stroke_opacity 0.0
36
+
37
+ height = Array.new(@column_count, 0)
38
+
39
+ @norm_data.each_with_index do |data_row, row_index|
40
+ data_row[DATA_VALUES_INDEX].each_with_index do |data_point, point_index|
41
+ @d = @d.fill data_row[DATA_COLOR_INDEX]
42
+
43
+ # Calculate center based on bar_width and current row
44
+ label_center = @graph_left + (@bar_width * point_index) + (@bar_width * @bar_spacing / 2.0)
45
+ draw_label(label_center, point_index)
46
+
47
+ next if (data_point == 0)
48
+ # Use incremented x and scaled y
49
+ left_x = @graph_left + (@bar_width * point_index) + padding
50
+ left_y = @graph_top + (@graph_height -
51
+ data_point * @graph_height -
52
+ height[point_index]) + @segment_spacing
53
+ right_x = left_x + @bar_width * @bar_spacing
54
+ right_y = @graph_top + @graph_height - height[point_index] - @segment_spacing
55
+
56
+ # update the total height of the current stacked bar
57
+ height[point_index] += (data_point * @graph_height )
58
+
59
+ @d = @d.rectangle(left_x, left_y, right_x, right_y)
60
+
61
+ end
62
+
63
+ end
64
+
65
+ @d.draw(@base_image)
66
+ end
67
+
68
+ end; end
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ module ImageParadise
6
+
7
+ module Gruff::Base::StackedMixin
8
+ # Used by StackedBar and child classes.
9
+ #
10
+ # tsal: moved from Base 03 FEB 2007
11
+ DATA_VALUES_INDEX = Gruff::Base::DATA_VALUES_INDEX
12
+ # === get_maximum_by_stack
13
+ def get_maximum_by_stack
14
+ # Get sum of each stack
15
+ max_hash = {}
16
+ @data.each { |data_set|
17
+ data_set[DATA_VALUES_INDEX].each_with_index do |data_point, i|
18
+ max_hash[i] = 0.0 unless max_hash[i]
19
+ max_hash[i] += data_point.to_f
20
+ end
21
+ }
22
+
23
+ # @maximum_value = 0
24
+ max_hash.keys.each { |key|
25
+ @maximum_value = max_hash[key] if max_hash[key] > @maximum_value
26
+ }
27
+ @minimum_value = 0
28
+ end
29
+
30
+ end; end
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ module ImageParadise
6
+
7
+ module Gruff
8
+
9
+ module Themes
10
+
11
+ # ========================================================================= #
12
+ # === THIRTYSEVEN_SIGNALS
13
+ #
14
+ # A color scheme plucked from the colors on the popular usability blog.
15
+ # ========================================================================= #
16
+ THIRTYSEVEN_SIGNALS = {
17
+ :colors => [
18
+ '#FFF804', # yellow
19
+ '#336699', # blue
20
+ '#339933', # green
21
+ '#ff0000', # red
22
+ '#cc99cc', # purple
23
+ '#cf5910', # orange
24
+ 'black'
25
+ ],
26
+ :marker_color => 'black',
27
+ :font_color => 'black',
28
+ :background_colors => %w(#d1edf5 white)
29
+ }
30
+
31
+ # ========================================================================= #
32
+ # === KEYNOTE
33
+ #
34
+ # A color scheme similar to the popular presentation software.
35
+ # ========================================================================= #
36
+ KEYNOTE = {
37
+ :colors => [
38
+ '#FDD84E', # yellow
39
+ '#6886B4', # blue
40
+ '#72AE6E', # green
41
+ '#D1695E', # red
42
+ '#8A6EAF', # purple
43
+ '#EFAA43', # orange
44
+ 'white'
45
+ ],
46
+ :marker_color => 'white',
47
+ :font_color => 'white',
48
+ :background_colors => %w(black #4a465a)
49
+ }
50
+
51
+ # A color scheme from the colors used on the 2005 Rails keynote
52
+ # presentation at RubyConf.
53
+ RAILS_KEYNOTE = {
54
+ :colors => [
55
+ '#00ff00', # green
56
+ '#333333', # grey
57
+ '#ff5d00', # orange
58
+ '#f61100', # red
59
+ 'white',
60
+ '#999999', # light grey
61
+ 'black'
62
+ ],
63
+ :marker_color => 'white',
64
+ :font_color => 'white',
65
+ :background_colors => %w(#0083a3 #0083a3)
66
+ }
67
+
68
+ # A color scheme similar to that used on the popular podcast site.
69
+ ODEO = {
70
+ :colors => [
71
+ '#202020', # grey
72
+ 'white',
73
+ '#3a5b87', # dark blue
74
+ '#a21764', # dark pink
75
+ '#8ab438', # green
76
+ '#999999', # light grey
77
+ 'black'
78
+ ],
79
+ :marker_color => 'white',
80
+ :font_color => 'white',
81
+ :background_colors => %w(#ff47a4 #ff1f81)
82
+ }
83
+
84
+ # A pastel theme
85
+ PASTEL = {
86
+ :colors => [
87
+ '#a9dada', # blue
88
+ '#aedaa9', # green
89
+ '#daaea9', # peach
90
+ '#dadaa9', # yellow
91
+ '#a9a9da', # dk purple
92
+ '#daaeda', # purple
93
+ '#dadada' # grey
94
+ ],
95
+ :marker_color => '#aea9a9', # Grey
96
+ :font_color => 'black',
97
+ :background_colors => 'white'
98
+ }
99
+
100
+ # === GREYSCALE
101
+ #
102
+ # A greyscale theme
103
+ GREYSCALE = {
104
+ :colors => [
105
+ '#282828', #
106
+ '#383838', #
107
+ '#686868', #
108
+ '#989898', #
109
+ '#c8c8c8', #
110
+ '#e8e8e8', #
111
+ ],
112
+ :marker_color => '#aea9a9', # Grey
113
+ :font_color => 'black',
114
+ :background_colors => 'white'
115
+ }
116
+
117
+ end; end; end
@@ -0,0 +1,2 @@
1
+ This directory may contain code that can be used in conjunction with
2
+ the program called graphviz.
@@ -0,0 +1,274 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === ImageParadise::GenerateGraphvizImage
6
+ #
7
+ # This class can generate a graphviz-image.
8
+ #
9
+ # Note that it currently is catered to the Studium project's primary
10
+ # use case, so don't expect it to have too many features.
11
+ #
12
+ # The first argument to this class can be a Hash. If so then this
13
+ # class will batch-process that Hash.
14
+ #
15
+ # The generated String, into the dotfile, should be like this:
16
+ #
17
+ # "Module M4" -> "Module M10";
18
+ # "Module M8" -> "Module M10";
19
+ #
20
+ # Usage example:
21
+ #
22
+ # ImageParadise::GenerateGraphvizImage.new(ARGV)
23
+ #
24
+ # =========================================================================== #
25
+ # require 'image_paradise/graphviz/generate_graphviz_image.rb'
26
+ # ImageParadise::GenerateGraphvizImage.new(ARGV)
27
+ # =========================================================================== #
28
+ require 'image_paradise/base/base.rb'
29
+
30
+ module ImageParadise
31
+
32
+ class GenerateGraphvizImage < Base # === ImageParadise::GenerateGraphvizImage
33
+
34
+ require 'fileutils'
35
+
36
+ # ========================================================================= #
37
+ # === TRY_TO_REDUCE_THE_FILESIZE_FOR_GENERATED_PNG_FILES
38
+ # ========================================================================= #
39
+ TRY_TO_REDUCE_THE_FILESIZE_FOR_GENERATED_PNG_FILES = true
40
+
41
+ # ========================================================================= #
42
+ # === initialize
43
+ # ========================================================================= #
44
+ def initialize(
45
+ commandline_arguments = nil,
46
+ run_already = true
47
+ )
48
+ reset
49
+ set_commandline_arguments(
50
+ commandline_arguments
51
+ )
52
+ # ======================================================================= #
53
+ # === Handle blocks
54
+ # ======================================================================= #
55
+ if block_given?
56
+ yielded = yield
57
+ case yielded
58
+ # ===================================================================== #
59
+ # === :use_bold_font
60
+ # ===================================================================== #
61
+ when :use_bold_font
62
+ use_bold_font
63
+ # ===================================================================== #
64
+ # === :use_bold_font_and_german
65
+ # ===================================================================== #
66
+ when :use_bold_font_and_german
67
+ use_bold_font
68
+ use_german
69
+ end
70
+ end
71
+ run if run_already
72
+ end
73
+
74
+ # ========================================================================= #
75
+ # === reset (reset tag)
76
+ # ========================================================================= #
77
+ def reset
78
+ super()
79
+ # ======================================================================= #
80
+ # === @append_this_string_to_each_node
81
+ #
82
+ # This string here will be appended to each node-line.
83
+ # ======================================================================= #
84
+ @append_this_string_to_each_node = ''.dup
85
+ # ======================================================================= #
86
+ # === @use_this_fontname
87
+ # ======================================================================= #
88
+ @use_this_fontname = 'Courier'
89
+ # ======================================================================= #
90
+ # === @penwidth
91
+ # ======================================================================= #
92
+ @penwidth = 2
93
+ # ======================================================================= #
94
+ # === @use_english_or_german_for_this_class
95
+ # ======================================================================= #
96
+ @use_english_or_german_for_this_class = :english
97
+ end
98
+
99
+ # ========================================================================= #
100
+ # === to_german
101
+ # ========================================================================= #
102
+ def to_german
103
+ @use_english_or_german_for_this_class = :german
104
+ end; alias use_german to_german # === use_german
105
+
106
+ # ========================================================================= #
107
+ # === return_english_or_german_name_for_a_module
108
+ # ========================================================================= #
109
+ def return_english_or_german_name_for_a_module
110
+ case @use_english_or_german_for_this_class
111
+ when :english
112
+ 'Module'
113
+ when :german
114
+ 'Modul'
115
+ end
116
+ end
117
+
118
+ # ========================================================================= #
119
+ # === use_bold_font
120
+ #
121
+ # This will use a hardcoded font by default. The user is expected to
122
+ # supply another font if he/she seeks to change the font.
123
+ # ========================================================================= #
124
+ def use_bold_font(
125
+ i = 'Cascadia Mono PL Bold'
126
+ )
127
+ @use_this_fontname = i
128
+ end
129
+
130
+ # ========================================================================= #
131
+ # === set_commandline_arguments
132
+ # ========================================================================= #
133
+ def set_commandline_arguments(i = '')
134
+ i = [i].flatten.compact
135
+ @commandline_arguments = i
136
+ end
137
+
138
+ # ========================================================================= #
139
+ # === commandline_arguments?
140
+ # ========================================================================= #
141
+ def commandline_arguments?
142
+ @commandline_arguments
143
+ end
144
+
145
+ # ========================================================================= #
146
+ # === first_argument?
147
+ # ========================================================================= #
148
+ def first_argument?
149
+ @commandline_arguments.first
150
+ end; alias dataset? first_argument? # === dataset?
151
+
152
+ # ========================================================================= #
153
+ # === check_whether_the_first_argument_is_a_hash
154
+ # ========================================================================= #
155
+ def check_whether_the_first_argument_is_a_hash
156
+ into = 'module_dependencies.dot'
157
+ _ = ''.dup
158
+ _ << "# dot -Tpng #{into} -o outfile.png\n"
159
+ _ << 'digraph graphname {
160
+
161
+ node [color=Red,fontname="'+@use_this_fontname+'",shape=box, fontsize=28] // All nodes will this shape and colour
162
+ edge [color=Blue, style=dashed] // All the lines look like this
163
+ '
164
+ first_argument = first_argument?
165
+ if first_argument.is_a? Hash
166
+ if @penwidth
167
+ @append_this_string_to_each_node << " [penwidth=#{@penwidth}]"
168
+ end
169
+ sorted = first_argument.sort_by {|key, value|
170
+ key.delete('M').to_i
171
+ }
172
+ sorted.each {|module_number, module_dependencies|
173
+ # Iterate over the module dependencies next.
174
+ module_dependencies.each {|this_module|
175
+ this_module.delete!('"')
176
+ unless this_module.include?('None')
177
+ source_module = '"'+return_english_or_german_name_for_a_module+' '+module_number+'"'
178
+ target_module = '"'+return_english_or_german_name_for_a_module+' '+this_module+'"'
179
+ unless source_module == target_module
180
+ _ << "#{target_module} -> #{source_module}"
181
+ unless @append_this_string_to_each_node.empty?
182
+ _ << @append_this_string_to_each_node
183
+ end
184
+ _ << ';'
185
+ _ << N
186
+ end
187
+ end
188
+ }
189
+ _ << "\n"
190
+ }
191
+ _ << '}'
192
+ # ===================================================================== #
193
+ # Remove the old file if it exists.
194
+ # ===================================================================== #
195
+ puts "Saving into the file #{into} next."
196
+ if File.exist? into
197
+ File.delete(into)
198
+ end
199
+ write_what_into(_, into)
200
+ if File.exist? into
201
+ run_dot_command_to_create_the_image(into)
202
+ end
203
+ end
204
+ end
205
+
206
+ # ========================================================================= #
207
+ # === run_dot_command_to_create_the_image
208
+ # ========================================================================= #
209
+ def run_dot_command_to_create_the_image(i)
210
+ output_file = 'outfile.png'
211
+ if File.exist? output_file
212
+ File.delete(output_file)
213
+ end
214
+ cmd_to_run = "dot -Tpng #{i} -o #{output_file}"
215
+ e
216
+ e " #{cmd_to_run}"
217
+ e
218
+ result = `#{cmd_to_run} 2>&1`
219
+ if result.include? 'Error: '
220
+ # ===================================================================== #
221
+ # Handle situations such as this one here:
222
+ # Error: module_dependencies.dot: syntax error in line 4 near ','
223
+ # ===================================================================== #
224
+ e 'Some error happened. The error will be shown next:'
225
+ e
226
+ e Colours.crimson(" #{result.strip}")
227
+ e
228
+ else
229
+ # ===================================================================== #
230
+ # Try to optimize the .png file at hand.
231
+ # ===================================================================== #
232
+ if TRY_TO_REDUCE_THE_FILESIZE_FOR_GENERATED_PNG_FILES and
233
+ output_file.end_with?('.png') and
234
+ File.exist?(output_file)
235
+ new_file = 'OUT_'+output_file
236
+ e
237
+ e 'Running pngquant next:'
238
+ e
239
+ esystem "pngquant #{output_file} --output #{new_file}"
240
+ e
241
+ if File.exist?(new_file) and File.exist?(output_file)
242
+ FileUtils.mv(new_file, output_file)
243
+ end
244
+ end
245
+ # ===================================================================== #
246
+ # Open the existing file in the browser next, if present.
247
+ # ===================================================================== #
248
+ if File.exist?(output_file) and is_on_roebe?
249
+ require 'roebe/toplevel_methods/open_in_browser.rb'
250
+ e "Now opening #{sfile(output_file)} in the browser."
251
+ OpenInBrowser[output_file]
252
+ end
253
+ end
254
+ end
255
+
256
+ # ========================================================================= #
257
+ # === run (run tag)
258
+ # ========================================================================= #
259
+ def run
260
+ check_whether_the_first_argument_is_a_hash
261
+ end
262
+
263
+ # ========================================================================= #
264
+ # === ImageParadise::GenerateGraphvizImage[]
265
+ # ========================================================================= #
266
+ def self.[](i = '')
267
+ new(i)
268
+ end
269
+
270
+ end; end
271
+
272
+ if __FILE__ == $PROGRAM_NAME
273
+ ImageParadise::GenerateGraphvizImage.new(ARGV)
274
+ end # generate_graphviz_image