cyberweb 0.6.17 → 0.7.9

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

Potentially problematic release.


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

Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +299 -134
  3. data/bin/images_from_this_webpage +11 -0
  4. data/doc/README.gen +276 -107
  5. data/doc/todo/todo_for_the_cyberweb_project.md +90 -90
  6. data/examples/css/day_night_toggle/day_night_toggle.html +202 -0
  7. data/examples/css/fleeing_dinosaur_animation/fleeing_dinosaur_animation.html +420 -0
  8. data/examples/css/important_style/important_style.html +35 -0
  9. data/examples/html/custom_cursor.html +1 -1
  10. data/examples/javascript_and_jquery/misc/miscallenous_javascript_examples.html +25 -0
  11. data/examples/javascript_and_jquery/roll_a_die/roll_a_die.html +48 -0
  12. data/lib/cyberweb/base/misc.rb +7 -0
  13. data/lib/cyberweb/cascading_style_sheets/div.css +2 -2
  14. data/lib/cyberweb/cascading_style_sheets/drop_shadow.css +4 -0
  15. data/lib/cyberweb/cascading_style_sheets/fonts.css +42 -30
  16. data/lib/cyberweb/cascading_style_sheets/glow_effects.css +58 -0
  17. data/lib/cyberweb/cascading_style_sheets/margin.css +254 -248
  18. data/lib/cyberweb/cascading_style_sheets/tooltip.css +73 -0
  19. data/lib/cyberweb/generator/cgi.rb +2 -1
  20. data/lib/cyberweb/javascript_code/custom_functions.js +16 -16
  21. data/lib/cyberweb/javascript_code/math.js +18 -0
  22. data/lib/cyberweb/javascript_code/simulate_a_dice.js +13 -5
  23. data/lib/cyberweb/sinatra/custom_extensions.rb +2 -2
  24. data/lib/cyberweb/toplevel_methods/misc.rb +44 -0
  25. data/lib/cyberweb/utility_scripts/create_coloured_tags.rb +1 -5
  26. data/lib/cyberweb/utility_scripts/download_balloon_css.rb +1 -5
  27. data/lib/cyberweb/utility_scripts/fix_incorrect_links_to_locally_existing_images_in_this_file.rb +5 -33
  28. data/lib/cyberweb/utility_scripts/hyperlink_all_images_from.rb +1 -5
  29. data/lib/cyberweb/utility_scripts/obtain_css_rules.rb +169 -0
  30. data/lib/cyberweb/version/version.rb +2 -2
  31. data/lib/cyberweb/web_object/html_tags.rb +12 -1
  32. data/lib/cyberweb/web_object/images.rb +534 -178
  33. data/lib/cyberweb/web_object/javascript_and_jquery.rb +9 -9
  34. data/lib/cyberweb/web_object/link.rb +102 -67
  35. data/lib/cyberweb/web_object/misc.rb +320 -518
  36. data/lib/cyberweb/yaml/js_files_to_load.yml +3 -2
  37. data/lib/cyberweb/yaml/load_these_yaml_files_by_default.yml +1 -0
  38. data/test/complex_tests/testing_style_variants/show_coloured_boxes.cgi +2 -2
  39. data/test/javascript/testing_various_javascript_related_APIs.html +17 -0
  40. data/test/simple_tests/testing_dragging_an_image.cgi +2 -0
  41. data/test/simple_tests/testing_uniform_css_rules_for_all_images.cgi +25 -0
  42. metadata +15 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 30fff42b77ea23687e3a7c812c9360427d0defabcd0c2b5ea64d87fe1b2b62a7
4
- data.tar.gz: '095486b97da97655ad352f5c1c591f1d720df25b00bf4483e8ae5c0a32e12b66'
3
+ metadata.gz: 4252b07a6abec2328f6e7d3a71050c0f9a06face83316816f5a57c579a85a886
4
+ data.tar.gz: 956c7467e2e14c3109ae924edf8b0aaa34cf0991e2566892c744452b895db870
5
5
  SHA512:
6
- metadata.gz: 20cbd5ddf46615e5467f5fac71cb7ec749994d832c3e8d395cb2fe8497696ff41f76f62fd45b85e6016cba69c8a7ee0025775e9f7e90a3ba894cc42cfe63d9f8
7
- data.tar.gz: db4ad6b4c14b867d211f69c0869d3fbc50e83b7892c72c4ddeaf5d32e536fd83ecfff44f300ed540ecd69ddd2e80ca96fea7e547b74a73a710e1a4bd7481468f
6
+ metadata.gz: 0eae328a1dda370eeb858d0b21f3ef7e8872d805fbd0cce1a3095d24e8cb02b1b1e1cffafceb7920d88dec9b752d7396b4e7a33f8ab88e13b92437bae8a816de
7
+ data.tar.gz: 0b0f0e74482310f80c18f9e961d8c8677263ef4bddba123915809722f1a8d3e84bd4c72e6ad7bc632fc1115a1dc5de7dc829de095baa4d05e0ec1b46495fe66f
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  [![forthebadge](https://forthebadge.com/images/badges/made-with-ruby.svg)](https://www.ruby-lang.org/en/)
3
3
  [![Gem Version](https://badge.fury.io/rb/cyberweb.svg)](https://badge.fury.io/rb/cyberweb)
4
4
 
5
- This gem was <b>last updated</b> on the <span style="color: darkblue; font-weight: bold">01.11.2022</span> (dd.mm.yyyy notation), at <span style="color: steelblue; font-weight: bold">19:17:06</span> o'clock.
5
+ This gem was <b>last updated</b> on the <span style="color: darkblue; font-weight: bold">28.11.2022</span> (dd.mm.yyyy notation), at <span style="color: steelblue; font-weight: bold">13:02:00</span> o'clock.
6
6
 
7
7
  <img src="https://i.imgur.com/aC4YzSk.png" style="margin-left: 1.2em">
8
8
 
@@ -419,11 +419,18 @@ Note that **Cyberweb.set_path()** is a shorter alias to this method;
419
419
  may be useful in IRB. Otherwise I recommend to use the longer
420
420
  method name instead, as it is more explicit.
421
421
 
422
+ For many users this API may be fairly irrelevant or even cumbersome.
423
+ In that case you should consider uploading some of your images to a
424
+ remote server and then simply link towards these images rather
425
+ than having to deal with paths to local images being a nuisance. I do
426
+ that with some of my files, e. g. referring to a FTP site. In the
427
+ long run, though, this situation will eventually improve.
428
+
422
429
  ## Images
423
430
 
424
- If an image is not existing, but used within the Cyberweb
425
- framework, then a a red border and a red text will be
426
- displayed around that (non-existing) image.
431
+ If an image is not existing, but used within the Cyberweb framework,
432
+ then a a red border and a red text will be displayed around that
433
+ (non-existing) image.
427
434
 
428
435
  This way, the user is being encouraged to fix the problem at hand.
429
436
 
@@ -432,11 +439,13 @@ fix/change this.
432
439
 
433
440
  This is why the red warning or warnings in general, can be reduced
434
441
  or disabled - have a look at the configuration file for this.
442
+ Personally I prefer a red warning, but others may not want to
443
+ have this.
435
444
 
436
- If warnings are set to verbose, then the web_object project will
437
- display the above notification for images not found. If it is set
438
- to normal or lower than that, the web_object project will not
439
- display that warning.
445
+ If <b>warnings</b> are set to verbose, then the <b>cyberweb project</b>
446
+ will display the notification mentioned above for all images that
447
+ were not found. If it is set to normal or lower than that, the
448
+ cyberweb project will <b>not</b> display that warning.
440
449
 
441
450
  ## Greek letters
442
451
 
@@ -450,13 +459,6 @@ the following command:
450
459
 
451
460
  Cyberweb.show_greek_letters
452
461
 
453
- ## Javascript-support in the Cyberweb project
454
-
455
- Have a look at the subdirectory called **javascript/**.
456
-
457
- If a new javascript-component is added, it should be registered
458
- in one of the .rb files in said directory.
459
-
460
462
  ## Commandline usage
461
463
 
462
464
  A commandline program exists, at <b>bin/cyberweb</b>.
@@ -884,18 +886,6 @@ useful for short header-entries, such as "Goals" or
884
886
  functionality purely exists due to convenience - I wanted
885
887
  to quickly generate the default id entry for a sitemap.
886
888
 
887
- ## JavaScript clock
888
-
889
- If you wish to display a small JavaScript "clock" that just
890
- shows the time, you could use this:
891
-
892
- display_clock('pad1em') { :larger_font_size }
893
-
894
- The block argument just increases the font-size a bit; it can
895
- be omitted of course, as can all arguments, too:
896
-
897
- display_clock
898
-
899
889
  ## Redirecting to another page
900
890
 
901
891
  You can combine BeautifulUrl, and Cyberweb, to redirect
@@ -1839,19 +1829,6 @@ To do this, try:
1839
1829
  e('This text should now be editable.') { :editable }
1840
1830
  }
1841
1831
 
1842
- ## Specify javascript files
1843
-
1844
- You can specify a specific javascript file via:
1845
-
1846
- w.javascript_file = '../../CODE/JS/FADER.js'
1847
- w.javascript_file = :fader
1848
-
1849
- As you can see, both a string version giving the full path, and a
1850
- Symbol shortcut, will work - provided that the Symbol was registered.
1851
-
1852
- I recommend to use the Symbol version for two reasons: first, it is
1853
- less to type. Second, it is trivial to change the path lateron.
1854
-
1855
1832
  ## Configuration
1856
1833
 
1857
1834
  All meaningful options that can be configured, can be configured
@@ -2383,32 +2360,6 @@ Valid cursors include:
2383
2360
  not-allowed
2384
2361
  no-drop
2385
2362
 
2386
- ## Removing child elements in JavaScript
2387
-
2388
- An element can be removed via JavaScript by issueing:
2389
-
2390
- this.parentNode.removeChild(this)
2391
-
2392
- ## Default parameters to functions in JavaScript
2393
-
2394
- You can use default values to functions in JavaScript.
2395
-
2396
- Example:
2397
-
2398
- function multiply(a, b = 1) {
2399
- return a * b;
2400
- }
2401
-
2402
- console.log(multiply(5, 2));
2403
- console.log(multiply(5));
2404
-
2405
- Alternatively you could also use || inside of the function
2406
- body, to simulate default values.
2407
-
2408
- It may then look like this inside of a function:
2409
-
2410
- bar = bar || "Default Value";
2411
-
2412
2363
  ## Using language-specific files as content of a webpage
2413
2364
 
2414
2365
  The typical way how I describe the main content of a web-page
@@ -2818,44 +2769,6 @@ Example in HTML:
2818
2769
 
2819
2770
  <img src='foobar.jpg' loading='lazy' alt='Alternative Text'>
2820
2771
 
2821
- ## JavaScript for-in and for-of loops:
2822
-
2823
- Just examples for each:
2824
-
2825
- for (const key in {a: 1, b: 2}) {
2826
- console.log(key);
2827
- }
2828
- // a, b
2829
-
2830
- for (const value of [1,2,3,4,5]) {
2831
- console.log(value);
2832
- }
2833
- // 1, 2, 3, 4, 5
2834
-
2835
- ## Data Types in JavaScript (ECMAScript)
2836
-
2837
- There are six simple data types:
2838
-
2839
- Undefined
2840
- Null
2841
- Boolean
2842
- Number
2843
- String
2844
- Symbol
2845
-
2846
- ## How to use the typeof() operator in JavaScript
2847
-
2848
- The typeof operator is called like this:
2849
-
2850
- let x = "some string";
2851
- typeof(x) # "string"
2852
- typeof(95) # "number"
2853
-
2854
- Note that the () for typeof() could be omitted, as typeof is
2855
- an operator and not a function - but it seems simpler to use
2856
- the () just as it is used for other functions in JavaScript
2857
- as well.
2858
-
2859
2772
  ## CSS zoom-on-hover effect
2860
2773
 
2861
2774
  This can be done like this:
@@ -4227,8 +4140,8 @@ More specifically what these **four values** mean:
4227
4140
 
4228
4141
  drop-shadow(offset-x offset-y blur-radius color)
4229
4142
 
4230
- If you make use of the **cyberweb** project then you
4231
- can use the following API:
4143
+ If you make use of the **cyberweb** project then you can use
4144
+ the following API, to generate a drop shadow:
4232
4145
 
4233
4146
  generate_drop_shadow :red, :default, 'drop_shadow_red'
4234
4147
  div('drop_shadow_red') {
@@ -4427,8 +4340,8 @@ remember that you also get a lot of flexibility that way.
4427
4340
 
4428
4341
  ## The method images_css() in class Cyberweb::WebObject
4429
4342
 
4430
- Sometimes you have several images and may want to apply the
4431
- same CSS rules to all of them.
4343
+ Sometimes you may have several images and may want to apply
4344
+ the same CSS rules to all of them.
4432
4345
 
4433
4346
  For instance, I use the CSS class <b>bblack1</b> which is
4434
4347
  equivalent to:
@@ -4449,6 +4362,10 @@ for a demo in this regard. (Not all images work; some of them
4449
4362
  are only available on my home system, but the other images
4450
4363
  should work.)
4451
4364
 
4365
+ Do note that since as of November 2022, when images_css is
4366
+ used then it will <b>always</b> be appended to every
4367
+ image tag. So only use it if you really need this functionality.
4368
+
4452
4369
  ## links.md
4453
4370
 
4454
4371
  If a file called <b>links.md</b> exists in the current working directory
@@ -4660,6 +4577,258 @@ showcasing this functionality.
4660
4577
 
4661
4578
  <img src="https://i.imgur.com/k5wFnwn.png" style="margin: 1em">
4662
4579
 
4580
+ ## class Cyberweb::ObtainCssRules
4581
+
4582
+ <b>class Cyberweb::ObtainCssRules</b> was added to quickly fetch the
4583
+ CSS rule shortcut.
4584
+
4585
+ For instance, the cyberweb gem comes with many custom CSS classes
4586
+ defined. I use these for different project.
4587
+
4588
+ One such CSS rule is this:
4589
+
4590
+ .mars1em {
4591
+ margin-left: 1em;
4592
+ margin-right: 1em;
4593
+ }
4594
+
4595
+ Now: sometimes I can not use these custom CSS rules, even though I
4596
+ want to.
4597
+
4598
+ <b>class Cyberweb::ObtainCssRules</b> fills that use case.
4599
+
4600
+ We can tell this class to fetch the body of the CSS rule at
4601
+ <b>.mars1em</b>. This will then be automatically expanded
4602
+ onto the corresponding "margin-left" and "margin-right"
4603
+ entries.
4604
+
4605
+ To require this class do:
4606
+
4607
+ require 'cyberweb/utility_scripts/obtain_css_rules.rb'
4608
+
4609
+ Furthermore, this class was also added to automatically
4610
+ make use of various shortcuts.
4611
+
4612
+ Let me demonstrate how I use this specifically.
4613
+
4614
+ In the file pidgin.rb, which is part of the roebe gem,
4615
+ I use the following:
4616
+
4617
+ default_template1 '
4618
+
4619
+ p.default {
4620
+ .mars1em;
4621
+ }
4622
+
4623
+ '
4624
+
4625
+ What does the above mean?
4626
+
4627
+ It means that the p-tag (in HTML), if it makes use of the
4628
+ CSS class called default, will use the CSS rules defined
4629
+ in the .mars1em CSS class' body.
4630
+
4631
+ So, it is <b>exactly</b> identical to the following:
4632
+
4633
+ p.default {
4634
+ margin-left: 1em;
4635
+ margin-right: 1em;
4636
+ }
4637
+
4638
+ This is a bit similar to less and SASS and similar
4639
+ shortcut-tools.
4640
+
4641
+ Within the web-app, for class WebObject, I may then
4642
+ create these paragraphs via:
4643
+
4644
+ p_default {
4645
+ e 'Hello world!'
4646
+ }
4647
+
4648
+ Note that the above does not work 100% reliably; I
4649
+ added this in <b>November 2022</b> in part to try it out.
4650
+
4651
+ At some later point in time this may be improved,
4652
+ so use with care. I recommend to be very strict when
4653
+ using the above functionality; the less complexity,
4654
+ the better usually (unless you can write more succinct
4655
+ and more expressive code, perhaps; but even then it
4656
+ is a trade-off ultimately).
4657
+
4658
+ ## Returning all images from a remote website
4659
+
4660
+ If you ever have a use case that you wish to return all
4661
+ images found on a remote website, consider using the
4662
+ following API:
4663
+
4664
+ x = Cyberweb.return_all_images_from_this_webpage('https://www.projectaon.org/en/xhtml/lw/02fotw/sect166.htm', true)
4665
+
4666
+ This would yield the following Array:
4667
+
4668
+ [
4669
+ "https://www.projectaon.org/en/xhtml/lw/02fotw/title.png",
4670
+ "https://www.projectaon.org/en/xhtml/lw/02fotw/brdrtpl.png",
4671
+ "https://www.projectaon.org/en/xhtml/lw/02fotw/brdrtp.png",
4672
+ "https://www.projectaon.org/en/xhtml/lw/02fotw/brdrtpr.png",
4673
+ "https://www.projectaon.org/en/xhtml/lw/02fotw/brdrl.png",
4674
+ "https://www.projectaon.org/en/xhtml/lw/02fotw/ill10.png",
4675
+ "https://www.projectaon.org/en/xhtml/lw/02fotw/brdrr.png",
4676
+ "https://www.projectaon.org/en/xhtml/lw/02fotw/brdrbtl.png",
4677
+ "https://www.projectaon.org/en/xhtml/lw/02fotw/brdrbt.png",
4678
+ "https://www.projectaon.org/en/xhtml/lw/02fotw/brdrbtr.png",
4679
+ "https://www.projectaon.org/en/xhtml/lw/02fotw/left.png",
4680
+ "https://www.projectaon.org/en/xhtml/lw/02fotw/toc.png",
4681
+ "https://www.projectaon.org/en/xhtml/lw/02fotw/right.png"
4682
+ ]
4683
+
4684
+ ## JavaScript support in the cyberweb project
4685
+
4686
+ ### JavaScript for-in and for-of loops:
4687
+
4688
+ Just examples for each:
4689
+
4690
+ for (const key in {a: 1, b: 2}) {
4691
+ console.log(key);
4692
+ }
4693
+ // a, b
4694
+
4695
+ for (const value of [1,2,3,4,5]) {
4696
+ console.log(value);
4697
+ }
4698
+ // 1, 2, 3, 4, 5
4699
+
4700
+ ### Javascript-support in the Cyberweb project
4701
+
4702
+ Have a look at the subdirectory called **javascript/**.
4703
+
4704
+ If a new javascript-component is added, it should be registered
4705
+ in one of the .rb files in said directory.
4706
+
4707
+ ### Data Types in JavaScript (ECMAScript)
4708
+
4709
+ There are six simple data types:
4710
+
4711
+ Undefined
4712
+ Null
4713
+ Boolean
4714
+ Number
4715
+ String
4716
+ Symbol
4717
+
4718
+ ### How to use the typeof() operator in JavaScript
4719
+
4720
+ The typeof operator is called like this:
4721
+
4722
+ let x = "some string";
4723
+ typeof(x) # "string"
4724
+ typeof(95) # "number"
4725
+
4726
+ Note that the () for typeof() could be omitted, as typeof is
4727
+ an operator and not a function - but it seems simpler to use
4728
+ the () just as it is used for other functions in JavaScript
4729
+ as well.
4730
+
4731
+ ### JavaScript clock
4732
+
4733
+ If you wish to display a small JavaScript "clock" that just
4734
+ shows the time, you could use this:
4735
+
4736
+ display_clock('pad1em') { :larger_font_size }
4737
+
4738
+ The block argument just increases the font-size a bit; it can
4739
+ be omitted of course, as can all arguments, too:
4740
+
4741
+ display_clock
4742
+
4743
+ ### Specify JavaScript files
4744
+
4745
+ You can specify a specific javascript file via:
4746
+
4747
+ w.javascript_file = '../../CODE/JS/FADER.js'
4748
+ w.javascript_file = :fader
4749
+
4750
+ As you can see, both a string version giving the full path, and a
4751
+ Symbol shortcut, will work - provided that the Symbol was registered.
4752
+
4753
+ I recommend to use the Symbol version for two reasons: first, it is
4754
+ less to type. Second, it is trivial to change the path lateron.
4755
+
4756
+ ### Removing child elements in JavaScript
4757
+
4758
+ An element can be removed via JavaScript by issueing:
4759
+
4760
+ this.parentNode.removeChild(this)
4761
+
4762
+ ### Default parameters to functions in JavaScript
4763
+
4764
+ You can use default values to functions in JavaScript.
4765
+
4766
+ Example:
4767
+
4768
+ function multiply(a, b = 1) {
4769
+ return a * b;
4770
+ }
4771
+
4772
+ console.log(multiply(5, 2));
4773
+ console.log(multiply(5));
4774
+
4775
+ Alternatively you could also use || inside of the function
4776
+ body, to simulate default values.
4777
+
4778
+ It may then look like this inside of a function:
4779
+
4780
+ bar = bar || "Default Value";
4781
+
4782
+ ### JavaScript's document.getElementById()
4783
+
4784
+ You can use JavaScript's document.getElementById() to modify
4785
+ values programmatically.
4786
+
4787
+ Example showcasing this:
4788
+
4789
+ function foobar() {
4790
+ document.getElementById("set_on_value_changed").value = "44";
4791
+ }
4792
+
4793
+ All you need to know is the ID of the target element.
4794
+
4795
+ ### Does order matter for JavaScript?
4796
+
4797
+ Script tags that are used in a webpage are executed in the order they
4798
+ appear. So, if you look at the following JavaScript code:
4799
+
4800
+ <script>
4801
+ var x = 42;
4802
+ </script>
4803
+
4804
+ <script>
4805
+ alert(x); // Will alert '3';
4806
+ </script>
4807
+
4808
+ Then first the variable x will be set, to the value of <b>42</b>.
4809
+
4810
+ Note that this also applies to when you load external .js files - first
4811
+ in, first to be evaluated. So order does indeed matter.
4812
+
4813
+ The reason I noted this down here was in the event that I may forgot
4814
+ why I decided to load some .js files before others.
4815
+
4816
+ There is, however had, also a practical consideration here: if you
4817
+ have some external .js files that take a while to load, it may be
4818
+ best to put them near the end of the page, or at the least after
4819
+ other .js files were already loaded, as it may otherwise slow
4820
+ down the loading of the webpage. This is the reason why some
4821
+ webpages recommend to put JavaScript script-tags shortly before
4822
+ the closing </body> tag rather than in the <head> section of
4823
+ the given HTML code at hand.
4824
+
4825
+ You can also use the async keyword; this means that the loading of
4826
+ the webpage will continue.
4827
+
4828
+ Example:
4829
+
4830
+ <script src="path/foobar.js" async></script>
4831
+
4663
4832
  ## Useful quotes when designing websites and web-apps
4664
4833
 
4665
4834
  The following subsection collects a few <b>interesting statements</b> -
@@ -4802,35 +4971,31 @@ more useful in general, feel free to drop me an email at any time, via:
4802
4971
  shevy@inbox.lt
4803
4972
 
4804
4973
  Before that email I used an email account at Google gmail, but in **2021** I
4805
- decided to slowly abandon gmail for various reasons. In order to limit this
4974
+ decided to slowly abandon gmail, for various reasons. In order to limit the
4806
4975
  explanation here, allow me to just briefly state that I do not feel as if I
4807
- want to promote any Google service anymore, for various reasons.
4976
+ want to promote any Google service anymore when the user becomes the
4977
+ product (such as via data collection by upstream services). I feel this is
4978
+ a hugely flawed business model.
4808
4979
 
4809
4980
  Do keep in mind that responding to emails may take some time, depending on
4810
4981
  the amount of work I may have at that moment.
4811
4982
 
4812
- In 2022 rubygems.org decided to make 2FA mandatory for every gem owner:
4813
- see https://blog.rubygems.org/2022/06/13/making-packages-more-secure.html
4814
-
4815
- As I can not use 2FA, for reasons I will skip explaining here (see
4816
- various github issue discussions in the past), this effectively means that
4817
- Betty Li and others who run the show at rubygems.org will perma-ban me
4818
- from using rubygems as a developer.
4819
-
4820
- As I disagree with that decision completely, this will mean that all my
4821
- gems will be removed from rubygems.org prior to that sunset date, e. g.
4822
- before they permanently lock me out from the code that I used
4823
- to maintain. It is pointless to want to discuss this with them anymore -
4824
- they have made up their minds and decided that you can only use
4825
- the code if 2FA is in place, even though the code itself works just
4826
- fine. If you don't use 2FA you are effectively locked out from your
4827
- own code; I consider this a malicious attack. See also how they limited
4828
- discussions to people with mandatory 2FA on the ruby-bugtracker, thus
4829
- banning everyone permanently without 2FA:
4830
-
4831
- https://bugs.ruby-lang.org/issues/18800
4832
-
4833
- Guess it may indeed be time to finally abandon ruby - not because
4834
- ruby is a bad language, but there are people now in charge who
4835
- really should not be part of ruby in the first place.
4983
+ In <b>2022</b> rubygems.org, or rather the corporate overlords who control the
4984
+ rubygems.org infrastructure these days, decided to make 2FA mandatory for every
4985
+ gem owner eventually: see
4986
+ https://blog.rubygems.org/2022/06/13/making-packages-more-secure.html
4987
+
4988
+ Mandatory 2FA will eventually be extended to all rubygems.org developers and
4989
+ maintainers. As I can not use 2FA, for reasons I will skip explaining here,
4990
+ this means that my projects will eventually be taken over by shopify (or,
4991
+ correspondingly, whoever effectively controls the rubygems.org ecosystem).
4992
+ At that point, I no longer have any control what is done to my projects
4993
+ since shopify (respectively those controlling the gems ecosystem) took away
4994
+ control here. Not sure at which point ruby became corporate-controlled -
4995
+ that was not the case several years ago.
4996
+
4997
+ Ruby also only allows 2FA users to participate on the issue tracker these
4998
+ days:
4999
+
5000
+ https://bugs.ruby-lang.org/issues/18800
4836
5001
 
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # images_from_this_webpage
6
+ # =========================================================================== #
7
+ require 'cyberweb/toplevel_methods/misc.rb'
8
+
9
+ Cyberweb.return_all_images_from_this_webpage(ARGV, true).each {|this_remote_image|
10
+ puts this_remote_image
11
+ }