chemistry_paradise 1.3.1

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

Potentially problematic release.


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

Files changed (83) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +522 -0
  3. data/bin/chemistry_paradise +7 -0
  4. data/bin/wetter +7 -0
  5. data/chemistry_paradise.gemspec +46 -0
  6. data/doc/README.gen +518 -0
  7. data/doc/bugs/BUGS.md +16 -0
  8. data/doc/formulas/biochemical_calculations.md +5 -0
  9. data/doc/todo/todo_for_the_chemistry_paradise_project.md +33 -0
  10. data/doc/todo/todo_for_the_wetter_project.md +7 -0
  11. data/lib/chemistry_paradise/base/base.rb +215 -0
  12. data/lib/chemistry_paradise/base/colours.rb +93 -0
  13. data/lib/chemistry_paradise/commandline/help.rb +40 -0
  14. data/lib/chemistry_paradise/commandline/menu.rb +88 -0
  15. data/lib/chemistry_paradise/commandline/parse_commandline.rb +94 -0
  16. data/lib/chemistry_paradise/constants/constants.rb +77 -0
  17. data/lib/chemistry_paradise/constants/file_constants.rb +33 -0
  18. data/lib/chemistry_paradise/constants/german_names_of_elements_to_element_symbol.rb +157 -0
  19. data/lib/chemistry_paradise/converters/celsius_to_fahrenheit.rb +143 -0
  20. data/lib/chemistry_paradise/converters/celsius_to_kelvin.rb +125 -0
  21. data/lib/chemistry_paradise/converters/fahrenheit_to_celsius.rb +132 -0
  22. data/lib/chemistry_paradise/converters/shared.rb +21 -0
  23. data/lib/chemistry_paradise/gui/gtk3/calculate_molecular_weight/calculate_molecular_weight.rb +34 -0
  24. data/lib/chemistry_paradise/gui/gtk3/show_periodic_table/show_periodic_table.rb +34 -0
  25. data/lib/chemistry_paradise/gui/gtk3/temperature_converter/temperature_converter.rb +112 -0
  26. data/lib/chemistry_paradise/gui/gtk3/wetter/wetter.rb +119 -0
  27. data/lib/chemistry_paradise/gui/libui/temperature_converter/temperature_converter.rb +100 -0
  28. data/lib/chemistry_paradise/gui/libui/wetter/wetter.rb +47 -0
  29. data/lib/chemistry_paradise/gui/shared_code/calculate_molecular_weight/calculate_molecular_weight_module.rb +171 -0
  30. data/lib/chemistry_paradise/gui/shared_code/show_periodic_table/show_periodic_table_module.rb +318 -0
  31. data/lib/chemistry_paradise/gui/shared_code/temperature_converter/temperature_converter_module.rb +192 -0
  32. data/lib/chemistry_paradise/gui/shared_code/wetter/wetter_module.rb +349 -0
  33. data/lib/chemistry_paradise/gui/swing/TemperatureConverter$1.class +0 -0
  34. data/lib/chemistry_paradise/gui/swing/TemperatureConverter.class +0 -0
  35. data/lib/chemistry_paradise/gui/swing/TemperatureConverter.java +133 -0
  36. data/lib/chemistry_paradise/gui/unified_widgets/wetter/wetter.rb +62 -0
  37. data/lib/chemistry_paradise/images/show_periodic_table.png +0 -0
  38. data/lib/chemistry_paradise/images/vienna_map.png +0 -0
  39. data/lib/chemistry_paradise/interactive_chemistry_shell.rb +246 -0
  40. data/lib/chemistry_paradise/project/project.rb +24 -0
  41. data/lib/chemistry_paradise/requires/common_external_requires.rb +17 -0
  42. data/lib/chemistry_paradise/requires/require_the_project.rb +21 -0
  43. data/lib/chemistry_paradise/requires/require_the_project_including_the_graphical_user_interface.rb +7 -0
  44. data/lib/chemistry_paradise/requires/require_the_project_including_the_web_interface.rb +4 -0
  45. data/lib/chemistry_paradise/shared.rb +130 -0
  46. data/lib/chemistry_paradise/show_electron_configuration.rb +250 -0
  47. data/lib/chemistry_paradise/show_element.rb +145 -0
  48. data/lib/chemistry_paradise/sinatra/sinatra.rb +131 -0
  49. data/lib/chemistry_paradise/sinatra/wetter/app.rb +68 -0
  50. data/lib/chemistry_paradise/sinatra/wetter/start_sinatra_interface.rb +31 -0
  51. data/lib/chemistry_paradise/split_molecule_names.rb +228 -0
  52. data/lib/chemistry_paradise/toplevel_methods/atomgewichte.rb +31 -0
  53. data/lib/chemistry_paradise/toplevel_methods/convert_parens.rb +64 -0
  54. data/lib/chemistry_paradise/toplevel_methods/display_where_the_molmasses_are_kept.rb +24 -0
  55. data/lib/chemistry_paradise/toplevel_methods/e.rb +16 -0
  56. data/lib/chemistry_paradise/toplevel_methods/kelvin.rb +34 -0
  57. data/lib/chemistry_paradise/toplevel_methods/language.rb +50 -0
  58. data/lib/chemistry_paradise/toplevel_methods/misc.rb +147 -0
  59. data/lib/chemistry_paradise/toplevel_methods/periodic_table.rb +16 -0
  60. data/lib/chemistry_paradise/toplevel_methods/remove_this_molecule_from.rb +63 -0
  61. data/lib/chemistry_paradise/toplevel_methods/roebe.rb +16 -0
  62. data/lib/chemistry_paradise/toplevel_methods/show_electron_negativity_chart.rb +26 -0
  63. data/lib/chemistry_paradise/utility_scripts/calculate_atomic_mass.rb +559 -0
  64. data/lib/chemistry_paradise/utility_scripts/combustion_analysis.rb +207 -0
  65. data/lib/chemistry_paradise/utility_scripts/electron_negativity_chart.rb +78 -0
  66. data/lib/chemistry_paradise/utility_scripts/equalize_chemical_formula.rb +84 -0
  67. data/lib/chemistry_paradise/utility_scripts/equation_solver.rb +130 -0
  68. data/lib/chemistry_paradise/utility_scripts/orbitals.rb +70 -0
  69. data/lib/chemistry_paradise/utility_scripts/show_electron_negativity_of_this_element.rb +103 -0
  70. data/lib/chemistry_paradise/verbose_chemical_calculation.rb +21 -0
  71. data/lib/chemistry_paradise/version/version.rb +19 -0
  72. data/lib/chemistry_paradise/wetter/wetter.rb +539 -0
  73. data/lib/chemistry_paradise/www/wetter/embeddable_interface.rb +78 -0
  74. data/lib/chemistry_paradise/www/wetter/wetter.cgi +28 -0
  75. data/lib/chemistry_paradise/yaml/atomgewichte.yml +113 -0
  76. data/lib/chemistry_paradise/yaml/colours_for_the_elements.yml +13 -0
  77. data/lib/chemistry_paradise/yaml/dichte.yml +21 -0
  78. data/lib/chemistry_paradise/yaml/electron_negativity_chart.yml +111 -0
  79. data/lib/chemistry_paradise/yaml/molecular_formula_of_different_molecules.yml +13 -0
  80. data/lib/chemistry_paradise/yaml/periodic_table_of_the_elements.yml +125 -0
  81. data/lib/chemistry_paradise.rb +1 -0
  82. data/test/testing_chemistry_paradise.rb +49 -0
  83. metadata +173 -0
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'chemistry_paradise/version/version.rb'
6
+ # =========================================================================== #
7
+ module ChemistryParadise
8
+
9
+ # ========================================================================= #
10
+ # === VERSION
11
+ # ========================================================================= #
12
+ VERSION = '1.3.1'
13
+
14
+ # ========================================================================= #
15
+ # === LAST_UPDATE
16
+ # ========================================================================= #
17
+ LAST_UPDATE = '17.03.2023'
18
+
19
+ end
@@ -0,0 +1,539 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === ChemistryParadise::Wetter
6
+ #
7
+ # Code pertaining to the Wetter class will be stored here in this file,
8
+ # or in a subdirectory of the base.
9
+ #
10
+ # What is the purpose of this small class?
11
+ #
12
+ # This class will show the local weather in Vienna, by "parsing"
13
+ # a remote website that contains this information.
14
+ #
15
+ # The main regex in use can also be anchored towards "12.2°", if
16
+ # otherwise the dataset is nil.
17
+ #
18
+ # Usage example:
19
+ #
20
+ # ChemistryParadise::Wetter.new(ARGV)
21
+ #
22
+ # =========================================================================== #
23
+ # require 'chemistry_paradise/wetter/wetter.rb'
24
+ # =========================================================================== #
25
+ require 'chemistry_paradise/base/base.rb'
26
+
27
+ module ChemistryParadise
28
+
29
+ class Wetter < ::ChemistryParadise::Base # === ChemistryParadise::Wetter
30
+
31
+ begin
32
+ require 'open-uri'
33
+ rescue LoadError; end
34
+
35
+ begin
36
+ # ======================================================================= #
37
+ # If we want to tap into this functionality here, we only have to
38
+ # use: opn(namespace: namespace?);
39
+ # ======================================================================= #
40
+ require 'opn'
41
+ rescue LoadError; end
42
+
43
+ # ========================================================================= #
44
+ # === NAMESPACE
45
+ # ========================================================================= #
46
+ NAMESPACE = inspect
47
+
48
+ # ========================================================================= #
49
+ # === REMOTE_URL
50
+ #
51
+ # Point to the remote website that holds the information for the
52
+ # local temperature in the city of Vienna.
53
+ # ========================================================================= #
54
+ REMOTE_URL = 'https://www.zamg.ac.at/cms/de/wetter/wetterwerte-analysen/wien'
55
+
56
+ # ========================================================================= #
57
+ # === TRY_TO_MAKE_USE_OF_THE_UNICODE_WEATHER_SYMBOL
58
+ #
59
+ # If the next constant is set to true then class Wetter will try to
60
+ # make use of the unicode symbol for "cloudy weather".
61
+ # ========================================================================= #
62
+ TRY_TO_MAKE_USE_OF_THE_UNICODE_WEATHER_SYMBOL = true
63
+
64
+ # ========================================================================= #
65
+ # === USE_THIS_REGEX
66
+ #
67
+ # This is the regex handling some remote "Temp:" String.
68
+ # ========================================================================= #
69
+ USE_THIS_REGEX = /Temp: (-?\d+.\d+)/ # It also handles negative temperature.
70
+
71
+ # ========================================================================= #
72
+ # === USE_DEGREE_REGEX
73
+ #
74
+ # This second regex can be used when we wish to match against &deg values.
75
+ # ========================================================================= #
76
+ USE_DEGREE_REGEX = /\>(\d+.\d+)&deg;\</ # See: https://rubular.com/r/FheegP7Hfg
77
+
78
+ # ========================================================================= #
79
+ # === initialize
80
+ # ========================================================================= #
81
+ def initialize(
82
+ i = ARGV, # The commandline arguments are stored here.
83
+ run_already = true,
84
+ &block
85
+ )
86
+ reset
87
+ set_commandline_arguments(i)
88
+ # ======================================================================= #
89
+ # === Handle blocks next
90
+ # ======================================================================= #
91
+ if block_given?
92
+ yielded = yield
93
+ case yielded
94
+ # ===================================================================== #
95
+ # === :be_silent
96
+ # ===================================================================== #
97
+ when :be_silent
98
+ set_be_quiet
99
+ end
100
+ end
101
+ run if run_already
102
+ end
103
+
104
+ # ========================================================================= #
105
+ # === reset (reset tag)
106
+ # ========================================================================= #
107
+ def reset
108
+ super()
109
+ initialize_the_internal_hash
110
+ # ======================================================================= #
111
+ # === :debug
112
+ # ======================================================================= #
113
+ @internal_hash[:debug] = false
114
+ # ======================================================================= #
115
+ # === :data
116
+ # ======================================================================= #
117
+ @internal_hash[:data] = nil
118
+ # ======================================================================= #
119
+ # === :match
120
+ # ======================================================================= #
121
+ @internal_hash[:match] = nil
122
+ # ======================================================================= #
123
+ # === :shall_we_report_openssl_errors
124
+ # ======================================================================= #
125
+ @internal_hash[:shall_we_report_openssl_errors] = false
126
+ # ======================================================================= #
127
+ # === @namespace
128
+ # ======================================================================= #
129
+ @namespace = NAMESPACE
130
+ be_verbose
131
+ end
132
+
133
+ # ========================================================================= #
134
+ # === menu (menu tag)
135
+ # ========================================================================= #
136
+ def menu(
137
+ i = commandline_arguments?
138
+ )
139
+ if i.is_a? Array
140
+ i.each {|entry| menu(entry) }
141
+ else
142
+ case i # case tag
143
+ # ===================================================================== #
144
+ # === help
145
+ # ===================================================================== #
146
+ when /^-?-?help$/i
147
+ show_help
148
+ exit
149
+ # ===================================================================== #
150
+ # === --URL
151
+ # ===================================================================== #
152
+ when /^-?-?URL$/i
153
+ show_the_remote_url
154
+ exit
155
+ # ===================================================================== #
156
+ # === debug
157
+ # ===================================================================== #
158
+ when /debug/
159
+ enable_debug_mode
160
+ end
161
+ end
162
+ end
163
+
164
+ # ========================================================================= #
165
+ # === match?
166
+ # ========================================================================= #
167
+ def match?
168
+ @internal_hash[:match]
169
+ end
170
+
171
+ # ========================================================================= #
172
+ # === enable_debug_mode
173
+ # ========================================================================= #
174
+ def enable_debug_mode
175
+ @internal_hash[:debug] = true
176
+ end
177
+
178
+ # ========================================================================= #
179
+ # === debug?
180
+ # ========================================================================= #
181
+ def debug?
182
+ @internal_hash[:debug]
183
+ end
184
+
185
+ # ========================================================================= #
186
+ # === show_help
187
+ # ========================================================================= #
188
+ def show_help
189
+ e
190
+ e ' --URL # show the remote URL'
191
+ e ' --sinatra # start the sinatra-interface of this gem'
192
+ e
193
+ end
194
+
195
+ # ========================================================================= #
196
+ # === show_the_remote_url
197
+ #
198
+ # To invoke this method, do:
199
+ #
200
+ # wetter --URL
201
+ #
202
+ # ========================================================================= #
203
+ def show_the_remote_url
204
+ e
205
+ e sfancy(" #{REMOTE_URL}")
206
+ e
207
+ end
208
+
209
+ # ========================================================================= #
210
+ # === try_to_make_use_of_the_unicode_weather_symbol?
211
+ # ========================================================================= #
212
+ def try_to_make_use_of_the_unicode_weather_symbol?
213
+ TRY_TO_MAKE_USE_OF_THE_UNICODE_WEATHER_SYMBOL
214
+ end
215
+
216
+ # ========================================================================= #
217
+ # === data?
218
+ # ========================================================================= #
219
+ def data?
220
+ @internal_hash[:data]
221
+ end
222
+
223
+ # ========================================================================= #
224
+ # === remote_URL?
225
+ # ========================================================================= #
226
+ def remote_URL?
227
+ REMOTE_URL
228
+ end
229
+
230
+ # ========================================================================= #
231
+ # === local_file?
232
+ # ========================================================================= #
233
+ def local_file?
234
+ File.absolute_path(File.basename(remote_URL?)+'.html')
235
+ end
236
+
237
+ # ========================================================================= #
238
+ # === try_to_download_the_remote_webpage
239
+ #
240
+ # This method was specifically added in February 2023, to bypass any
241
+ # issue we may have had when openssl is not available. It will rely
242
+ # on "wget" to download the webpage.
243
+ # ========================================================================= #
244
+ def try_to_download_the_remote_webpage(
245
+ remote_URL = remote_URL?,
246
+ be_verbose = be_verbose?
247
+ )
248
+ base_dir = '/home/x/Temp/wetter/'
249
+ if is_on_roebe? and !File.directory?(base_dir)
250
+ require 'fileutils'
251
+ FileUtils.mkdir_p(base_dir)
252
+ end
253
+ cd(base_dir) if File.directory?(base_dir)
254
+ local_file = File.absolute_path(File.basename(remote_URL)+'.html')
255
+ if File.exist?(local_file)
256
+ File.delete(local_file) # Remove any old file first.
257
+ end
258
+ if File.exist?(local_file.delete_suffix('.html'))
259
+ File.delete(local_file.delete_suffix('.html')) # Remove any old file first.
260
+ end
261
+ # ======================================================================= #
262
+ # Next, download the remote file.
263
+ # ======================================================================= #
264
+ esystem(
265
+ "wget #{remote_URL}", :silence_output_from_system
266
+ ) { :be_quiet }
267
+ unless File.exist?(local_file)
268
+ require 'fileutils'
269
+ if File.exist? local_file.delete_suffix('.html')
270
+ FileUtils.mv(
271
+ local_file.delete_suffix('.html'),
272
+ local_file
273
+ )
274
+ end
275
+ end
276
+ if File.exist? local_file and
277
+ be_verbose and
278
+ shall_we_report_openssl_errors?
279
+ opn; e "The remote file was downloaded into `#{sfile(local_file)}`."
280
+ end
281
+ end
282
+
283
+ # ========================================================================= #
284
+ # === read_in_the_dataset_from_the_remote_webpage
285
+ #
286
+ # This method has to catch OpenSSL errors.
287
+ # ========================================================================= #
288
+ def read_in_the_dataset_from_the_remote_webpage
289
+ begin
290
+ @internal_hash[:data] = URI.open(remote_URL?).read
291
+ rescue OpenSSL::SSL::SSLError => _error
292
+ # ===================================================================== #
293
+ # Here we know that an OpenSSL connection error occurred.
294
+ # We will notify the user about this but only one sentence.
295
+ # ===================================================================== #
296
+ _ = local_file?
297
+ if File.exist? _
298
+ if be_verbose and shall_we_report_openssl_errors?
299
+ opn; e 'An OpenSSL-error occurred. Trying to read from the'
300
+ opn; e 'local file at '+sfile(_)+' next.'
301
+ end
302
+ internal_hash[:data] = File.read(_)
303
+ else
304
+ e 'An OpenSSL-error occurred. Can not continue.' if be_verbose
305
+ end
306
+ end
307
+ if debug?
308
+ opn; e 'Now showing @internal_hash[:data], as we run in debug-mode.'
309
+ e cliner
310
+ e data?
311
+ e cliner
312
+ end
313
+ return @internal_hash[:data]
314
+ end
315
+
316
+ # ========================================================================= #
317
+ # === shall_we_report_openssl_errors?
318
+ # ========================================================================= #
319
+ def shall_we_report_openssl_errors?
320
+ @internal_hash[:shall_we_report_openssl_errors]
321
+ end
322
+
323
+ # ========================================================================= #
324
+ # === sanitize_the_dataset
325
+ # ========================================================================= #
326
+ def sanitize_the_dataset
327
+ splitted = data?.split(N)
328
+ splitted.reject! {|line|
329
+ ! (line.include?('title="Wien Innere Stadt') and line.include?('Temp: '))
330
+ }
331
+ splitted = splitted.first if splitted.is_a? Array
332
+ if debug?
333
+ opn; e 'Now showing the sanitized dataset, as we run in debug-mode.'
334
+ pp splitted
335
+ end
336
+ @internal_hash[:data] = splitted # Re-assign it here.
337
+ if data?.nil?
338
+ @internal_hash[:data] =~ USE_DEGREE_REGEX
339
+ unless $1.to_s.dup.empty?
340
+ @internal_hash[:data] = $1.to_s.dup
341
+ end
342
+ end
343
+ end
344
+
345
+ # ========================================================================= #
346
+ # === find_the_appropriate_match
347
+ #
348
+ # This will find the current degree, in Celsius.
349
+ # ========================================================================= #
350
+ def find_the_appropriate_match
351
+ @internal_hash[:data] =~ USE_THIS_REGEX # Apply the appropriate regex here.
352
+ @internal_hash[:match] = $1.to_s.dup
353
+ end
354
+
355
+ # ========================================================================= #
356
+ # === report_the_result
357
+ # ========================================================================= #
358
+ def report_the_result
359
+ if be_verbose?
360
+ n_degrees_celsius = match?.to_f
361
+ result = "#{olivedrab('The current temperature in Vienna is: ')}"\
362
+ "#{sfancy(n_degrees_celsius)} #{gold('°C')}".dup
363
+ # ===================================================================== #
364
+ # Next we have to check if we use a fancy unicode weather symbol:
365
+ # ===================================================================== #
366
+ if try_to_make_use_of_the_unicode_weather_symbol?
367
+ begin
368
+ require 'roebe/toplevel_methods/unicode/popular_unicode_symbols.rb'
369
+ case n_degrees_celsius
370
+ when 16 .. 50 # Should be clear weather most of the time.
371
+ result << " #{tomato(Roebe.clear_weather)}"
372
+ when 5 .. 15 # Medium-temperature; usually cloudy.
373
+ result << " #{royalblue(Roebe.cloudy_weather_symbol)}"
374
+ when -35 .. 4 # It's really quite cold.
375
+ result << " #{royalblue(Roebe.snowman)}"
376
+ end
377
+ rescue LoadError
378
+ end
379
+ end
380
+ # ===================================================================== #
381
+ # Next display which class reports the output as well:
382
+ # ===================================================================== #
383
+ opn; e result
384
+ end
385
+ end; alias report report_the_result # === report
386
+
387
+ # ========================================================================= #
388
+ # === run (run tag)
389
+ # ========================================================================= #
390
+ def run
391
+ menu
392
+ try_to_download_the_remote_webpage
393
+ read_in_the_dataset_from_the_remote_webpage
394
+ sanitize_the_dataset
395
+ find_the_appropriate_match
396
+ report
397
+ end
398
+
399
+ # ========================================================================= #
400
+ # === ChemistryParadise::Wetter.menu (menu tag)
401
+ # ========================================================================= #
402
+ def self.menu(i)
403
+ if i.is_a? Array
404
+ if i.empty?
405
+ new(i)
406
+ else
407
+ i.each {|entry| menu(entry) }
408
+ end
409
+ else
410
+ case i
411
+ # ===================================================================== #
412
+ # === wetter --libui
413
+ # ===================================================================== #
414
+ when /^-?-?libui$/i
415
+ puts 'Starting the libui wetter (aka "weather") application next.'
416
+ require 'chemistry_paradise/gui/libui/wetter/wetter.rb'
417
+ ChemistryParadise::GUI::LibUI::Wetter.new
418
+ exit
419
+ # ===================================================================== #
420
+ # === wetter --sinatra
421
+ #
422
+ # This entry point starts the sinatra-interface of the wetter
423
+ # project.
424
+ #
425
+ # Invocation example:
426
+ #
427
+ # wetter --sinatra
428
+ #
429
+ # ===================================================================== #
430
+ when /^-?-?sinatra$/i,
431
+ /^-?-?www$/i
432
+ require 'chemistry_paradise/sinatra/wetter/start_sinatra_interface.rb'
433
+ ChemistryParadise::Wetter.start_sinatra_interface
434
+ # ===================================================================== #
435
+ # === wetter --gtk3
436
+ # ===================================================================== #
437
+ when /^-?-?gtk3?$/i,
438
+ /^-?-?gui$/i # === wetter --gui
439
+ puts 'Starting the ruby-gtk3 wetter (aka "weather") application next.'
440
+ require 'chemistry_paradise/gui/gtk3/wetter/wetter.rb'
441
+ ChemistryParadise::GUI::Gtk::Wetter.run
442
+ exit
443
+ # ===================================================================== #
444
+ # === wetter --temperature-only
445
+ # ===================================================================== #
446
+ when /^-?-?temperature(-|_)?only$/i,
447
+ /^-?-?temperature\??$/i
448
+ puts Wetter.temperature?
449
+ exit
450
+ # ===================================================================== #
451
+ # === wetter --gtk2
452
+ # ===================================================================== #
453
+ when /^-?-?gtk2$/i
454
+ e 'Support for ruby-gtk2 has been removed in November 2021.'
455
+ e 'Please use the ruby-gtk3 variant instead.'
456
+ exit
457
+ else
458
+ Wetter.new(i)
459
+ end
460
+ end
461
+ end
462
+
463
+ # ========================================================================= #
464
+ # === ChemistryParadise::Wetter.project_base_directory?
465
+ # ========================================================================= #
466
+ def self.project_base_directory?
467
+ "#{ChemistryParadise.project_base_directory?}wetter/"
468
+ end; self.instance_eval { alias project_base_dir? project_base_directory? } # === RBT.project_base_dir?
469
+ self.instance_eval { alias project_dir? project_base_directory? } # === RBT.project_dir?
470
+
471
+ # ========================================================================= #
472
+ # === ChemistryParadise::Wetter.is_on_roebe?
473
+ # ========================================================================= #
474
+ def self.is_on_roebe?
475
+ ChemistryParadise.send(__method__)
476
+ end
477
+
478
+ # ========================================================================= #
479
+ # === ChemistryParadise::Wetter.current_degrees
480
+ #
481
+ # This method will simply return a Float number, the current temperature
482
+ # in Vienna by default.
483
+ #
484
+ # Usage examples:
485
+ #
486
+ # ChemistryParadise::Wetter.current_degrees
487
+ # ChemistryParadise::Wetter.simplified_current_degrees
488
+ #
489
+ # ========================================================================= #
490
+ def self.current_degrees
491
+ new { :be_silent }.match?.to_f
492
+ end; self.instance_eval { alias n_degrees_celsius? current_degrees } # === ChemistryParadise::Wetter.n_degrees_celsius?
493
+ self.instance_eval { alias temperature? current_degrees } # === ChemistryParadise::Wetter.temperature?
494
+ self.instance_eval { alias return_temperature current_degrees } # === ChemistryParadise::Wetter.return_temperature
495
+ self.instance_eval { alias return_current_temperature_in_vienna current_degrees } # === ChemistryParadise::Wetter.return_current_temperature_in_vienna
496
+ self.instance_eval { alias simplified_current_degrees current_degrees } # === ChemistryParadise::Wetter.simplified_current_degrees
497
+ self.instance_eval { alias return_current_degrees current_degrees } # === ChemistryParadise::Wetter.return_current_degrees
498
+
499
+ # ========================================================================= #
500
+ # === ChemistryParadise::Wetter.run
501
+ # ========================================================================= #
502
+ def self.run(
503
+ i = ARGV
504
+ )
505
+ new(i)
506
+ end
507
+
508
+ # ========================================================================= #
509
+ # === ChemistryParadise::Wetter.gtk3_widget
510
+ #
511
+ # Simpler toplevel-method to obtain a new gtk-widget instance for the
512
+ # wetter project. It will only work if the gtk3 code has been
513
+ # required prior to calling this method.
514
+ # ========================================================================= #
515
+ def self.gtk3_widget
516
+ ::Wetter::GUI::Wetter.gtk3_widget
517
+ end
518
+
519
+ end
520
+
521
+ # =========================================================================== #
522
+ # === ChemistryParadise.simplified_current_degrees
523
+ # =========================================================================== #
524
+ def self.simplified_current_degrees
525
+ ChemistryParadise::Wetter.simplified_current_degrees
526
+ end; self.instance_eval { alias current_temperature_in_vienna? simplified_current_degrees } # === ChemistryParadise.current_temperature_in_vienna?
527
+ self.instance_eval { alias n_degrees_celsius? simplified_current_degrees } # === ChemistryParadise.n_degrees_celsius?
528
+ self.instance_eval { alias return_current_degrees simplified_current_degrees } # === ChemistryParadise.return_current_degrees
529
+
530
+ end
531
+
532
+ if __FILE__ == $PROGRAM_NAME
533
+ alias e puts
534
+ ChemistryParadise::Wetter.new(ARGV)
535
+ e ChemistryParadise.project_base_dir?
536
+ e ChemistryParadise::Wetter.project_base_dir?
537
+ e 'Are we on roebe: '+ChemistryParadise::Wetter.is_on_roebe?.to_s
538
+ # rb wetter.rb --help
539
+ end # wetterrb
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === ChemistryParadise::Wetter::EmbeddableInterface
6
+ #
7
+ # The code in this file can be used to "embed" the functionality of
8
+ # Wetter in web-applications, in particular in sinatra.
9
+ #
10
+ # This depends on the cyberweb project.
11
+ # =========================================================================== #
12
+ # require 'chemistry_paradise/www/www/embeddable_interface.rb'
13
+ # include ChemistryParadise/Wetter::EmbeddableInterface
14
+ # =========================================================================== #
15
+ require 'chemistry_paradise/base/base.rb'
16
+
17
+ module ChemistryParadise
18
+
19
+ class Wetter < ::ChemistryParadise::Base # === ChemistryParadise::Wetter
20
+
21
+ module EmbeddableInterface # === Wetter::EmbeddableInterface
22
+
23
+ require 'chemistry_paradise/wetter/wetter.rb'
24
+
25
+ begin
26
+ require 'html_tags'
27
+ include HtmlTags::BaseModule
28
+ rescue LoadError; end
29
+
30
+ begin
31
+ require 'cyberweb/sinatra/custom_extensions.rb'
32
+ include Cyberweb::Sinatra::CustomExtensions
33
+ rescue LoadError; end
34
+
35
+ begin
36
+ require 'cyberweb/html_template/html_template.rb'
37
+ rescue LoadError; end
38
+
39
+ # ========================================================================= #
40
+ # === return_root_string
41
+ # ========================================================================= #
42
+ def return_root_string
43
+ current_temperature = ChemistryParadise.n_degrees_celsius?.to_s.dup
44
+ append_this = ''.dup
45
+ if current_temperature.to_f > 12
46
+ append_this << '°C</b><br><style>'+
47
+ Cyberweb.return_css_for_sunny_weather+
48
+ "</style>\n"+
49
+ '<div class="weather_container"><div class="weather_sunny"></div></div>'
50
+ else
51
+ append_this << '°C</b><br>'
52
+ end
53
+ Cyberweb::HtmlTemplate[
54
+ title: 'The weather/temperature in Vienna',
55
+ body: div('The current temperature in Vienna is: <br><br>'\
56
+ '<b style="padding:1em; margin:0.5em; font-size: larger">'+
57
+ current_temperature+
58
+ append_this,'','',
59
+ 'font-size: 1.8em'
60
+ )
61
+ ].to_s
62
+ end
63
+
64
+ end; end
65
+
66
+ # =========================================================================== #
67
+ # === ChemistryParadise::Wetter.embeddable_interface
68
+ #
69
+ # This method can be used to "embed" a fake-object that implements the
70
+ # module defined above.
71
+ # =========================================================================== #
72
+ def self.embeddable_interface
73
+ object = Object.new
74
+ object.extend(ChemistryParadise::Wetter::EmbeddableInterface)
75
+ return object
76
+ end
77
+
78
+ end
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # http://localhost/programming/ruby/src/chemistry_paradise/lib/chemistry_paradise/www/wetter/wetter.cgi
6
+ # =========================================================================== #
7
+ require 'cyberweb/autoinclude'
8
+ require 'chemistry_paradise/wetter/wetter.rb'
9
+
10
+ german('Wetter') {
11
+ created_on '27.07.2022' # Wednesday.
12
+ autoextend
13
+ ruby_favicon
14
+ default_template Cyberweb.return_css_for_sunny_weather
15
+ body_css_class 'mar0px pad0px VERDANAs'
16
+ font_size '1.2em'
17
+
18
+ doc('mar0px pad0px s0_6em') {
19
+ h1 dot(106, 'marr8px')+
20
+ 'Wetter',
21
+ 'mart1px marb0_5em'
22
+ current_temperature = ChemistryParadise.n_degrees_celsius?.to_s.dup
23
+ div {
24
+ e 'The current temperature is: <b>'+
25
+ current_temperature.to_s+'</b>'
26
+ }
27
+ ee '<div class="weather_container"><div class="weather_sunny"></div></div>'
28
+ }}