open 0.1.30 → 0.2.22
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.
- checksums.yaml +4 -4
- data/README.md +110 -31
- data/bin/open +1 -1
- data/bin/open_in_browser +1 -1
- data/doc/README.gen +72 -8
- data/doc/deprecated_code/deprecated_code.md +26 -0
- data/img/open_logo.png +0 -0
- data/lib/open/base/base.rb +265 -128
- data/lib/open/books/README.md +8 -0
- data/lib/open/books/books.rb +100 -0
- data/lib/open/constants/constants.rb +86 -8
- data/lib/open/in_browser/in_browser.rb +501 -319
- data/lib/open/in_editor/in_editor.rb +367 -162
- data/lib/open/last/last.rb +14 -12
- data/lib/open/last_url/last_url.rb +4 -3
- data/lib/open/nano_open/nano_open.rb +30 -5
- data/lib/open/{open.rb → open/open.rb} +596 -654
- data/lib/open/project/project.rb +3 -2
- data/lib/open/requires/failsafe_require_of_beautiful_url.rb +9 -0
- data/lib/open/requires/require_the_project.rb +2 -2
- data/lib/open/requires/require_yaml.rb +13 -0
- data/lib/open/these_files/these_files.rb +1 -1
- data/lib/open/toplevel_methods/browser.rb +71 -0
- data/lib/open/toplevel_methods/delay.rb +23 -0
- data/lib/open/toplevel_methods/e.rb +14 -0
- data/lib/open/toplevel_methods/editor.rb +41 -0
- data/lib/open/toplevel_methods/host_os.rb +25 -0
- data/lib/open/toplevel_methods/is_on_roebe.rb +16 -0
- data/lib/open/toplevel_methods/is_on_windows.rb +26 -0
- data/lib/open/toplevel_methods/misc.rb +50 -0
- data/lib/open/version/version.rb +2 -2
- data/lib/open/with_delay/with_delay.rb +10 -11
- data/open.gemspec +3 -3
- data/test/testing_open.rb +1 -1
- data/test/testing_open_in_browser.rb +16 -0
- data/test/testing_open_via_launchy.rb +3 -0
- data/test/testing_shortcuts.rb +3 -0
- metadata +25 -9
- data/lib/open/toplevel_code/toplevel_code.rb +0 -189
@@ -4,6 +4,8 @@
|
|
4
4
|
# =========================================================================== #
|
5
5
|
# === Open::InBrowser
|
6
6
|
#
|
7
|
+
# This class has been re-written on the 16.06.2023.
|
8
|
+
#
|
7
9
|
# This class can be used to open something in the browser.
|
8
10
|
#
|
9
11
|
# The correct browser to use is, by default, the one that is stored in
|
@@ -18,8 +20,12 @@
|
|
18
20
|
# require 'open'
|
19
21
|
# Open::InBrowser.new(ARGV)
|
20
22
|
#
|
23
|
+
# Usage example:
|
24
|
+
#
|
25
|
+
# Open::InBrowser.new(ARGV)
|
26
|
+
#
|
21
27
|
# =========================================================================== #
|
22
|
-
# To open a remote webpage in firefox only,
|
28
|
+
# To open a remote webpage in firefox only, you could use this code:
|
23
29
|
#
|
24
30
|
# use_this_browser = 'firefox -new-tab'
|
25
31
|
# _ = use_this_browser
|
@@ -27,30 +33,39 @@
|
|
27
33
|
#
|
28
34
|
# =========================================================================== #
|
29
35
|
# require 'open/in_browser/in_browser.rb'
|
36
|
+
# Open.in_browser(ARGV)
|
37
|
+
# Open::InBrowser.new(ARGV)
|
30
38
|
# =========================================================================== #
|
31
39
|
require 'open/base/base.rb'
|
32
40
|
|
33
41
|
module Open
|
34
42
|
|
35
|
-
class InBrowser < Base # === Open::InBrowser
|
43
|
+
class InBrowser < ::Open::Base # === Open::InBrowser
|
36
44
|
|
37
45
|
begin
|
38
46
|
require 'studium/requires/return_remote_homepage_of_this_lecture.rb'
|
39
47
|
rescue LoadError; end
|
40
48
|
|
49
|
+
# ========================================================================= #
|
50
|
+
# === ARRAY_TOKENS_THAT_REQUIRE_PADDING
|
51
|
+
# ========================================================================= #
|
52
|
+
ARRAY_TOKENS_THAT_REQUIRE_PADDING = ['#',';','(','&',')']
|
53
|
+
|
41
54
|
# ========================================================================= #
|
42
55
|
# === initialize
|
43
56
|
#
|
44
|
-
# The
|
57
|
+
# The target URLs to be opened will be stored in the first argument,
|
58
|
+
# called commandline_arguments.
|
45
59
|
# ========================================================================= #
|
46
60
|
def initialize(
|
47
|
-
|
48
|
-
run_already
|
61
|
+
commandline_arguments = ARGV,
|
62
|
+
run_already = true,
|
63
|
+
&block
|
49
64
|
)
|
50
65
|
register_sigint
|
51
66
|
reset
|
52
|
-
|
53
|
-
|
67
|
+
set_commandline_arguments(
|
68
|
+
commandline_arguments
|
54
69
|
)
|
55
70
|
# ======================================================================= #
|
56
71
|
# === Handle blocks given next
|
@@ -65,12 +80,21 @@ class InBrowser < Base # === Open::InBrowser
|
|
65
80
|
# part of the opened URL.
|
66
81
|
# ===================================================================== #
|
67
82
|
when :no_localhost
|
68
|
-
|
83
|
+
do_not_use_localhost
|
69
84
|
# ===================================================================== #
|
70
85
|
# === :try_to_use_localhost_URLs
|
71
86
|
# ===================================================================== #
|
72
87
|
when :try_to_use_localhost_URLs
|
73
|
-
|
88
|
+
do_use_localhost
|
89
|
+
# ===================================================================== #
|
90
|
+
# === be_silent
|
91
|
+
#
|
92
|
+
# This entry point will make this class be quiet, that is, not display
|
93
|
+
# the actual command that is used.
|
94
|
+
# ===================================================================== #
|
95
|
+
when :be_silent,
|
96
|
+
:be_quiet
|
97
|
+
do_not_show_the_sys_command_that_is_used
|
74
98
|
# ===================================================================== #
|
75
99
|
# === :open_in_background
|
76
100
|
# ===================================================================== #
|
@@ -81,20 +105,11 @@ class InBrowser < Base # === Open::InBrowser
|
|
81
105
|
#
|
82
106
|
# This clause can be entered by code such as the following:
|
83
107
|
#
|
84
|
-
# Open.
|
108
|
+
# Open.in_browser(port: 8080) { :use_launchy }
|
85
109
|
#
|
86
110
|
# ===================================================================== #
|
87
111
|
when :use_launchy
|
88
112
|
set_use_launchy(true)
|
89
|
-
# ===================================================================== #
|
90
|
-
# === be_silent
|
91
|
-
#
|
92
|
-
# This entry point will make this class be quiet, that is, not display
|
93
|
-
# the actual command that is used.
|
94
|
-
# ===================================================================== #
|
95
|
-
when :be_silent,
|
96
|
-
:be_quiet
|
97
|
-
@internal_hash[:show_the_sys_command_that_is_used] = false
|
98
113
|
else
|
99
114
|
# =================================================================== #
|
100
115
|
# Handle Hashes next:
|
@@ -111,9 +126,25 @@ class InBrowser < Base # === Open::InBrowser
|
|
111
126
|
if yielded.has_key? :use_this_browser
|
112
127
|
set_use_this_browser(yielded[:use_this_browser])
|
113
128
|
end
|
129
|
+
# ================================================================= #
|
130
|
+
# === :remaining_commandline_arguments
|
131
|
+
# ================================================================= #
|
132
|
+
if yielded.has_key? :remaining_commandline_arguments
|
133
|
+
_ = yielded[:remaining_commandline_arguments]
|
134
|
+
if _
|
135
|
+
append_array_to_commandline_arguments(_)
|
136
|
+
end
|
137
|
+
end
|
114
138
|
end
|
115
139
|
end
|
116
140
|
end
|
141
|
+
case run_already
|
142
|
+
# ======================================================================= #
|
143
|
+
# === :do_not_run_yet
|
144
|
+
# ======================================================================= #
|
145
|
+
when :do_not_run_yet
|
146
|
+
run_already = false
|
147
|
+
end
|
117
148
|
run if run_already
|
118
149
|
end
|
119
150
|
|
@@ -121,7 +152,6 @@ class InBrowser < Base # === Open::InBrowser
|
|
121
152
|
# === reset (reset tag)
|
122
153
|
# ========================================================================= #
|
123
154
|
def reset
|
124
|
-
super()
|
125
155
|
# ======================================================================= #
|
126
156
|
# === @internal_hash
|
127
157
|
# ======================================================================= #
|
@@ -131,12 +161,16 @@ class InBrowser < Base # === Open::InBrowser
|
|
131
161
|
#
|
132
162
|
# This variable will keep track as to which browser will be used.
|
133
163
|
# ======================================================================= #
|
134
|
-
@internal_hash[:use_this_browser] =
|
164
|
+
@internal_hash[:use_this_browser] = determine_which_browser_to_use_then_return_the_result
|
135
165
|
# ======================================================================= #
|
136
166
|
# === :open_in_background
|
137
167
|
# ======================================================================= #
|
138
168
|
@internal_hash[:open_in_background] = false
|
139
169
|
# ======================================================================= #
|
170
|
+
# === :show_the_sys_command_that_is_used
|
171
|
+
# ======================================================================= #
|
172
|
+
@internal_hash[:show_the_sys_command_that_is_used] = true
|
173
|
+
# ======================================================================= #
|
140
174
|
# === :use_launchy
|
141
175
|
#
|
142
176
|
# This variable will make use of the launchy gem rather than the
|
@@ -144,54 +178,53 @@ class InBrowser < Base # === Open::InBrowser
|
|
144
178
|
# way, in particular for windows, to open remote URLs. That way
|
145
179
|
# we can query for the windows operating system and silently
|
146
180
|
# delegate onto the launchy gem, if need be. The default value
|
147
|
-
# is false, though, so most users of this
|
148
|
-
# this on their own.
|
181
|
+
# for this setting is false, though, so most users of this
|
182
|
+
# class have to enable this on their own.
|
149
183
|
# ======================================================================= #
|
150
184
|
@internal_hash[:use_launchy] = false
|
151
185
|
# ======================================================================= #
|
152
|
-
# === :
|
186
|
+
# === :work_on_these_URLs
|
187
|
+
#
|
188
|
+
# The following variable must be kept as Array at all times.
|
153
189
|
# ======================================================================= #
|
154
|
-
@internal_hash[:
|
190
|
+
@internal_hash[:work_on_these_URLs] = []
|
155
191
|
# ======================================================================= #
|
156
192
|
# === :append_this_string
|
157
193
|
# ======================================================================= #
|
158
194
|
@internal_hash[:append_this_string] = ''.dup
|
159
195
|
# ======================================================================= #
|
160
|
-
# === :
|
196
|
+
# === :use_localhost
|
197
|
+
#
|
198
|
+
# If this variable is true then we will try to use 'localhost'
|
199
|
+
# entries, at the least on roebe-system.
|
161
200
|
#
|
162
|
-
# By default
|
163
|
-
#
|
201
|
+
# By default the class will try to use localhost-URLs. Use the
|
202
|
+
# commandline flag --do-not-use-localhost if you dislike or
|
203
|
+
# do not need this feature.
|
164
204
|
# ======================================================================= #
|
165
|
-
@internal_hash[:
|
205
|
+
@internal_hash[:use_localhost] = true
|
166
206
|
end
|
167
207
|
|
168
208
|
# ========================================================================= #
|
169
|
-
# ===
|
209
|
+
# === do_use_localhost
|
170
210
|
# ========================================================================= #
|
171
|
-
def
|
172
|
-
@internal_hash[:
|
211
|
+
def do_use_localhost
|
212
|
+
@internal_hash[:use_localhost] = true
|
173
213
|
end
|
174
214
|
|
175
215
|
# ========================================================================= #
|
176
|
-
# ===
|
216
|
+
# === do_not_use_localhost
|
177
217
|
# ========================================================================= #
|
178
|
-
def
|
179
|
-
@internal_hash[:
|
218
|
+
def do_not_use_localhost
|
219
|
+
@internal_hash[:use_localhost] = false
|
180
220
|
end
|
181
221
|
|
182
222
|
# ========================================================================= #
|
183
|
-
# ===
|
223
|
+
# === use_localhost?
|
184
224
|
# ========================================================================= #
|
185
|
-
def
|
186
|
-
@internal_hash[:
|
187
|
-
end
|
188
|
-
|
189
|
-
# ========================================================================= #
|
190
|
-
# === use_launchy?
|
191
|
-
# ========================================================================= #
|
192
|
-
def use_launchy?
|
193
|
-
@internal_hash[:use_launchy]
|
194
|
-
end
|
225
|
+
def use_localhost?
|
226
|
+
@internal_hash[:use_localhost]
|
227
|
+
end; alias use_localhost_URLs? use_localhost? # === use_localhost_URLs?
|
195
228
|
|
196
229
|
# ========================================================================= #
|
197
230
|
# === check_for_intralink
|
@@ -204,10 +237,9 @@ class InBrowser < Base # === Open::InBrowser
|
|
204
237
|
use_this_token_to_replace_empty_spaces = '_'
|
205
238
|
)
|
206
239
|
if i
|
207
|
-
if i.is_a? Array
|
208
|
-
i = i.join(' ').tr(' ', use_this_token_to_replace_empty_spaces)
|
209
|
-
end
|
240
|
+
i = i.join(' ') if i.is_a? Array
|
210
241
|
i = i.to_s # Ensure that we have a String at this point.
|
242
|
+
i.tr!(' ', use_this_token_to_replace_empty_spaces) if i.include?(' ')
|
211
243
|
unless i.empty?
|
212
244
|
@internal_hash[:append_this_string] << i
|
213
245
|
end
|
@@ -215,132 +247,41 @@ class InBrowser < Base # === Open::InBrowser
|
|
215
247
|
end
|
216
248
|
|
217
249
|
# ========================================================================= #
|
218
|
-
# ===
|
219
|
-
#
|
220
|
-
# We prefer this to be an Array.
|
221
|
-
#
|
222
|
-
# Usage example:
|
223
|
-
#
|
224
|
-
# Open::InBrowser.new('https://blog.fefe.de/') { :use_launchy }
|
225
|
-
# Open::InBrowser.new('blog.fefe.de') { :use_launchy }
|
226
|
-
#
|
250
|
+
# === append_this_string?
|
227
251
|
# ========================================================================= #
|
228
|
-
def
|
229
|
-
|
230
|
-
)
|
231
|
-
if i.is_a? Array # This if-clause was added in May 2022.
|
232
|
-
i = i.join(' ').strip
|
233
|
-
end
|
234
|
-
possible_array = beautiful_url(i)
|
235
|
-
case i
|
236
|
-
# ======================================================================= #
|
237
|
-
# === rf HERE
|
238
|
-
# ======================================================================= #
|
239
|
-
when /HERE/
|
240
|
-
i = File.basename(return_pwd)
|
241
|
-
if is_on_roebe?
|
242
|
-
i = Studium.return_remote_homepage_of_this_lecture(i)
|
243
|
-
end
|
244
|
-
end
|
245
|
-
if possible_array.is_a?(Array) and (possible_array.size > 1)
|
246
|
-
i = possible_array
|
247
|
-
else
|
248
|
-
if i.is_a? Hash
|
249
|
-
# =================================================================== #
|
250
|
-
# === :use_launchy
|
251
|
-
# =================================================================== #
|
252
|
-
if i.has_key? :use_launchy
|
253
|
-
set_use_launchy(i.delete(:use_launchy))
|
254
|
-
end
|
255
|
-
# =================================================================== #
|
256
|
-
# === :with_localhost
|
257
|
-
#
|
258
|
-
# Example for this entry point:
|
259
|
-
#
|
260
|
-
# Open::InBrowser.new(with_localhost: PORT_TO_USE)
|
261
|
-
#
|
262
|
-
# =================================================================== #
|
263
|
-
if i.has_key?(:with_localhost) and use_localhost_URLs?
|
264
|
-
i = "http://localhost:#{i.delete(:with_localhost)}/"
|
265
|
-
# =================================================================== #
|
266
|
-
# === :port
|
267
|
-
#
|
268
|
-
# Example for this entry point:
|
269
|
-
#
|
270
|
-
# Open::InBrowser[port: 8080]
|
271
|
-
#
|
272
|
-
# =================================================================== #
|
273
|
-
elsif i.has_key? :port
|
274
|
-
i = "http://localhost:#{i.delete(:port)}/"
|
275
|
-
end
|
276
|
-
end
|
277
|
-
end
|
278
|
-
i = [i] unless i.is_a? Array
|
279
|
-
i.flatten! if i.is_a? Array
|
280
|
-
# ======================================================================= #
|
281
|
-
# Work over all members of this Array next.
|
282
|
-
# ======================================================================= #
|
283
|
-
i.map! {|entry|
|
284
|
-
case entry
|
285
|
-
when :default_sinatra_port
|
286
|
-
entry = 'http://localhost:4567/'
|
287
|
-
end
|
288
|
-
if Object.const_defined? :Studium
|
289
|
-
possible_link = Studium.return_remote_homepage_of_this_lecture(entry)
|
290
|
-
if possible_link == entry
|
291
|
-
else
|
292
|
-
entry = possible_link
|
293
|
-
end
|
294
|
-
end
|
295
|
-
if ::BeautifulUrl.is_a_local_link?(entry)
|
296
|
-
entry = ::BeautifulUrl.local_menu(entry)
|
297
|
-
else
|
298
|
-
entry = beautiful_url(entry).dup
|
299
|
-
end
|
300
|
-
entry = entry.first if entry.is_a? Array
|
301
|
-
if entry and File.exist?(entry)
|
302
|
-
entry = File.absolute_path(entry)
|
303
|
-
end
|
304
|
-
if entry and entry.start_with?('/home/x/') and !entry.include?('images/') and use_localhost_URLs?
|
305
|
-
entry.sub!(/\/home\/x\//,'http://localhost/')
|
306
|
-
end
|
307
|
-
# ===================================================================== #
|
308
|
-
# Perform some sanitize-operations next.
|
309
|
-
# ===================================================================== #
|
310
|
-
if entry and
|
311
|
-
((entry.include?("'") and !entry.include?('"')) or
|
312
|
-
entry.include?(' ')
|
313
|
-
)
|
314
|
-
entry = '"'+entry+'"'
|
315
|
-
elsif entry and (entry.include?(';') or entry.include?('('))
|
316
|
-
entry = '"'+entry+'"'
|
317
|
-
end
|
318
|
-
unless entry and File.exist?(entry)
|
319
|
-
# =================================================================== #
|
320
|
-
# Try a trailing glob next. The idea here is to expand from e. g.
|
321
|
-
# "image3" towards "image3.jpg", if the latter file exists, and
|
322
|
-
# the former does NOT exist.
|
323
|
-
# =================================================================== #
|
324
|
-
possible_matches = Dir["#{entry}*"]
|
325
|
-
unless possible_matches.empty?
|
326
|
-
first = possible_matches.first
|
327
|
-
if File.exist? first
|
328
|
-
entry = first
|
329
|
-
end
|
330
|
-
end
|
331
|
-
end
|
332
|
-
entry
|
333
|
-
}
|
334
|
-
@internal_hash[:target_url] = i
|
252
|
+
def append_this_string?
|
253
|
+
@internal_hash[:append_this_string]
|
335
254
|
end
|
336
255
|
|
337
256
|
# ========================================================================= #
|
338
257
|
# === target_url?
|
339
258
|
# ========================================================================= #
|
340
259
|
def target_url?
|
341
|
-
@internal_hash[:
|
342
|
-
end; alias target_URL?
|
343
|
-
alias remote_URL?
|
260
|
+
@internal_hash[:work_on_these_URLs]
|
261
|
+
end; alias target_URL? target_url? # === target_URL?
|
262
|
+
alias remote_URL? target_url? # === remote_URL?
|
263
|
+
alias work_on_these_URLs? target_url? # === work_on_these_URLs?
|
264
|
+
|
265
|
+
# ========================================================================= #
|
266
|
+
# === set_use_launchy
|
267
|
+
# ========================================================================= #
|
268
|
+
def set_use_launchy(i = false)
|
269
|
+
@internal_hash[:use_launchy] = i
|
270
|
+
end
|
271
|
+
|
272
|
+
# ========================================================================= #
|
273
|
+
# === use_launchy?
|
274
|
+
# ========================================================================= #
|
275
|
+
def use_launchy?
|
276
|
+
@internal_hash[:use_launchy]
|
277
|
+
end
|
278
|
+
|
279
|
+
# ========================================================================= #
|
280
|
+
# === do_not_show_the_sys_command_that_is_used
|
281
|
+
# ========================================================================= #
|
282
|
+
def do_not_show_the_sys_command_that_is_used
|
283
|
+
@internal_hash[:show_the_sys_command_that_is_used] = false
|
284
|
+
end
|
344
285
|
|
345
286
|
# ========================================================================= #
|
346
287
|
# === first_remote_URL?
|
@@ -349,6 +290,51 @@ class InBrowser < Base # === Open::InBrowser
|
|
349
290
|
remote_URL?.first
|
350
291
|
end
|
351
292
|
|
293
|
+
# ========================================================================= #
|
294
|
+
# === open_in_background?
|
295
|
+
# ========================================================================= #
|
296
|
+
def open_in_background?
|
297
|
+
@internal_hash[:open_in_background]
|
298
|
+
end
|
299
|
+
|
300
|
+
# ========================================================================= #
|
301
|
+
# === set_open_in_background
|
302
|
+
# ========================================================================= #
|
303
|
+
def set_open_in_background(
|
304
|
+
i = true
|
305
|
+
)
|
306
|
+
@internal_hash[:open_in_background] = i
|
307
|
+
end
|
308
|
+
|
309
|
+
# ========================================================================= #
|
310
|
+
# === show_the_sys_command_that_is_used?
|
311
|
+
# ========================================================================= #
|
312
|
+
def show_the_sys_command_that_is_used?
|
313
|
+
@internal_hash[:show_the_sys_command_that_is_used]
|
314
|
+
end
|
315
|
+
|
316
|
+
# ========================================================================= #
|
317
|
+
# === determine_which_browser_to_use_then_return_the_result
|
318
|
+
# ========================================================================= #
|
319
|
+
def determine_which_browser_to_use_then_return_the_result
|
320
|
+
result = ::Open.use_which_browser? # Use the generic browser by default here.
|
321
|
+
if result.nil?
|
322
|
+
result = file_load_default_browser?
|
323
|
+
end
|
324
|
+
if is_on_windows?
|
325
|
+
case result
|
326
|
+
# ===================================================================== #
|
327
|
+
# === palemoon
|
328
|
+
# ===================================================================== #
|
329
|
+
when 'palemoon'
|
330
|
+
result.prepend(
|
331
|
+
"C:\\Program Files\\Pale Moon\\palemoon.exe"
|
332
|
+
)
|
333
|
+
end
|
334
|
+
end
|
335
|
+
return result
|
336
|
+
end
|
337
|
+
|
352
338
|
# ========================================================================= #
|
353
339
|
# === set_use_this_browser
|
354
340
|
# ========================================================================= #
|
@@ -366,167 +352,344 @@ class InBrowser < Base # === Open::InBrowser
|
|
366
352
|
end
|
367
353
|
|
368
354
|
# ========================================================================= #
|
369
|
-
# ===
|
355
|
+
# === menu (menu tag)
|
370
356
|
# ========================================================================= #
|
371
|
-
def
|
372
|
-
|
357
|
+
def menu(i)
|
358
|
+
if i.is_a? Array
|
359
|
+
i.each {|entry| menu(entry) }
|
360
|
+
else
|
361
|
+
case i
|
362
|
+
# ===================================================================== #
|
363
|
+
# === rf --do-use-localhost
|
364
|
+
# ===================================================================== #
|
365
|
+
when /^-?-?do(-|_)?use(-|_)?localhost$/i,
|
366
|
+
/^-?-?localhost$/i
|
367
|
+
do_use_localhost
|
368
|
+
# ===================================================================== #
|
369
|
+
# === rf --do-not-use-localhost
|
370
|
+
# ===================================================================== #
|
371
|
+
when /^-?-?do(-|_)?not(-|_)?use(-|_)?localhost$/i,
|
372
|
+
/^-?-?no(-|_)?localhost$/i
|
373
|
+
do_not_use_localhost
|
374
|
+
# ===================================================================== #
|
375
|
+
# === rf HERE
|
376
|
+
#
|
377
|
+
# This entry point is mostly only useful on my home system, where
|
378
|
+
# the instruction "rf HERE" will delegate towards the Studium
|
379
|
+
# namespace.
|
380
|
+
# ===================================================================== #
|
381
|
+
when /HERE/
|
382
|
+
i = File.basename(return_pwd)
|
383
|
+
if is_on_roebe?
|
384
|
+
i = Studium.return_remote_homepage_of_this_lecture(i)
|
385
|
+
@internal_hash[:work_on_these_URLs].each_with_index {|inner_entry, index|
|
386
|
+
case inner_entry
|
387
|
+
when /^HERE$/
|
388
|
+
@internal_hash[:work_on_these_URLs][index] = i
|
389
|
+
end
|
390
|
+
}
|
391
|
+
end
|
392
|
+
end
|
393
|
+
end
|
373
394
|
end
|
374
395
|
|
375
396
|
# ========================================================================= #
|
376
|
-
# ===
|
397
|
+
# === could_there_be_a_potential_local_file_for?
|
377
398
|
# ========================================================================= #
|
378
|
-
def
|
379
|
-
|
399
|
+
def could_there_be_a_potential_local_file_for?(i)
|
400
|
+
# ======================================================================= #
|
401
|
+
# Try a trailing glob next. The idea here is to expand from e. g.
|
402
|
+
# "image3" towards "image3.jpg", if the latter file exists, and
|
403
|
+
# the former does NOT exist.
|
404
|
+
# ======================================================================= #
|
405
|
+
all_files = Dir["#{i}*"]
|
406
|
+
!all_files.empty?
|
380
407
|
end
|
381
408
|
|
382
409
|
# ========================================================================= #
|
383
|
-
# ===
|
410
|
+
# === sanitize_work_on_these_URLs
|
384
411
|
# ========================================================================= #
|
385
|
-
def
|
386
|
-
@internal_hash[:
|
412
|
+
def sanitize_work_on_these_URLs
|
413
|
+
if @internal_hash[:work_on_these_URLs]
|
414
|
+
@internal_hash[:work_on_these_URLs].map! {|entry|
|
415
|
+
# =================================================================== #
|
416
|
+
# First handle the case where we have a local link.
|
417
|
+
# =================================================================== #
|
418
|
+
if BeautifulUrl.is_a_local_link?(entry) and !File.exist?(entry)
|
419
|
+
entry = BeautifulUrl.local_menu(entry)
|
420
|
+
end
|
421
|
+
entry
|
422
|
+
}
|
423
|
+
end
|
387
424
|
end
|
388
425
|
|
389
426
|
# ========================================================================= #
|
390
|
-
# ===
|
427
|
+
# === work_through_all_designated_URLs
|
391
428
|
#
|
392
|
-
# This is the
|
429
|
+
# This is the method that will batch-process the given input (as Array).
|
393
430
|
# ========================================================================= #
|
394
|
-
def
|
395
|
-
|
431
|
+
def work_through_all_designated_URLs(
|
432
|
+
i = @internal_hash[:work_on_these_URLs]
|
396
433
|
)
|
397
|
-
|
398
|
-
|
434
|
+
i.each {|this_argument|
|
435
|
+
do_process_this_target_URL(this_argument)
|
436
|
+
}
|
437
|
+
end
|
438
|
+
|
439
|
+
# ========================================================================= #
|
440
|
+
# === do_process_this_target_URL (URL tag, main tag)
|
441
|
+
#
|
442
|
+
# This is the main method for this class - it will handle all given
|
443
|
+
# input properly.
|
444
|
+
# ========================================================================= #
|
445
|
+
def do_process_this_target_URL(
|
446
|
+
i,
|
447
|
+
optional_append_this_string = append_this_string?,
|
448
|
+
&block
|
449
|
+
)
|
450
|
+
i = i.first if i.is_a? Array # This is not necessary, but just in case.
|
451
|
+
if block_given?
|
452
|
+
yielded = yield
|
453
|
+
case yielded
|
454
|
+
# ===================================================================== #
|
455
|
+
# === :use_launchy
|
456
|
+
# ===================================================================== #
|
457
|
+
when :use_launchy
|
458
|
+
set_use_launchy(yielded.delete(:use_launchy))
|
459
|
+
end
|
460
|
+
end
|
461
|
+
if i.is_a? Symbol
|
462
|
+
case i
|
463
|
+
# ===================================================================== #
|
464
|
+
# === :default_sinatra_port
|
465
|
+
# ===================================================================== #
|
466
|
+
when :default_sinatra_port
|
467
|
+
i = 'http://localhost:4567/'
|
468
|
+
else
|
469
|
+
i = BeautifulUrl.menu(i)
|
470
|
+
end
|
471
|
+
end
|
472
|
+
if i.is_a? Array # This if-clause was added in May 2022.
|
473
|
+
i = i.join(' ').strip
|
474
|
+
end
|
475
|
+
if i.include?(' # ') # e. g. "https://moodle.univie.ac.at/course/view.php?id=415670 # 2023W"
|
476
|
+
i = i.split(' # ').first.to_s.strip
|
477
|
+
end
|
399
478
|
# ======================================================================= #
|
400
|
-
#
|
479
|
+
# The next clause may remove '#'. However had, this is not always a
|
480
|
+
# good idea, as these are also linked for intralinks - so for now this
|
481
|
+
# was changed June 2023. But, if the file exists locally, then we will
|
482
|
+
# simply prepend "file://" instead.
|
401
483
|
# ======================================================================= #
|
402
|
-
if
|
403
|
-
|
404
|
-
if
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
484
|
+
if i.include?('#')
|
485
|
+
raw_file = i[0 .. (i.index('#') - 1)]
|
486
|
+
if File.exist?(raw_file)
|
487
|
+
i = i.dup
|
488
|
+
i.prepend('file://')
|
489
|
+
end
|
490
|
+
end
|
491
|
+
if optional_append_this_string.size > 0
|
492
|
+
# ===================================================================== #
|
493
|
+
# We prepend the '#' character before appending it, unless
|
494
|
+
# it starts with the '?' character.
|
495
|
+
# ===================================================================== #
|
496
|
+
unless optional_append_this_string.start_with? '?'
|
497
|
+
optional_append_this_string.prepend '#'
|
498
|
+
end
|
499
|
+
i = i.dup if i.frozen?
|
500
|
+
i << optional_append_this_string
|
501
|
+
end if optional_append_this_string
|
502
|
+
# ======================================================================= #
|
503
|
+
# We must check first whether the target file at hand exists or not.
|
504
|
+
# ======================================================================= #
|
505
|
+
if i.is_a?(String) and File.exist?(i)
|
506
|
+
unless i.include?('/')
|
507
|
+
i = File.absolute_path(i) # Always use the absolute path in this case.
|
508
|
+
if use_localhost? and
|
509
|
+
i.start_with?(HOME_DIRECTORY_OF_USER_X)
|
510
|
+
i.sub!(/#{HOME_DIRECTORY_OF_USER_X}/, 'http://localhost/')
|
413
511
|
end
|
414
512
|
end
|
513
|
+
open_this_in_the_browser(i) # If it exists then we can open it directly here.
|
514
|
+
else
|
415
515
|
# ===================================================================== #
|
416
|
-
#
|
516
|
+
# First find out whether there could be a local file for this input.
|
517
|
+
#
|
518
|
+
# For instance, the input "image3" could match towards "image3.jpg".
|
519
|
+
# So if a file called "image3.jpg" were to exist locally then we
|
520
|
+
# will prioritize it next - that is the main point for the
|
521
|
+
# following clause.
|
417
522
|
# ===================================================================== #
|
418
|
-
if
|
419
|
-
|
523
|
+
if could_there_be_a_potential_local_file_for?(i)
|
524
|
+
i = Dir["#{i}*"].first
|
525
|
+
elsif is_beautiful_url_available?
|
526
|
+
# =================================================================== #
|
527
|
+
# else we will simply try to fetch an entry from BeautifulUrl.
|
528
|
+
# =================================================================== #
|
529
|
+
new_link = BeautifulUrl.menu(i)
|
530
|
+
case new_link
|
531
|
+
when i, nil
|
532
|
+
# ================================================================= #
|
533
|
+
# All is fine in this case.
|
534
|
+
# ================================================================= #
|
535
|
+
else
|
536
|
+
i = new_link
|
537
|
+
end
|
538
|
+
end
|
539
|
+
open_this_in_the_browser(i)
|
540
|
+
end
|
541
|
+
end
|
542
|
+
|
543
|
+
# ========================================================================= #
|
544
|
+
# === open_this_in_the_browser
|
545
|
+
#
|
546
|
+
# Usage example:
|
547
|
+
#
|
548
|
+
# Open.in_browser('https://blog.fefe.de/') { :use_launchy }
|
549
|
+
# Open.in_browser('blog.fefe.de') { :use_launchy }
|
550
|
+
#
|
551
|
+
# ========================================================================= #
|
552
|
+
def open_this_in_the_browser(i)
|
553
|
+
if i.is_a? Array
|
554
|
+
i.each {|entry| open_this_in_the_browser(entry) }
|
555
|
+
else
|
556
|
+
if i.is_a? Hash
|
420
557
|
# =================================================================== #
|
421
|
-
#
|
558
|
+
# === :with_localhost
|
559
|
+
#
|
560
|
+
# Example for this entry point:
|
422
561
|
#
|
423
|
-
#
|
562
|
+
# Open::InBrowser.new(with_localhost: PORT_TO_USE)
|
424
563
|
#
|
425
564
|
# =================================================================== #
|
426
|
-
|
427
|
-
|
428
|
-
elsif browser.include?('chromium') or
|
429
|
-
browser.include?('thorium') or
|
430
|
-
browser.include?('chrome')
|
565
|
+
if i.has_key?(:with_localhost) and use_localhost_URLs?
|
566
|
+
i = "http://localhost:#{i.delete(:with_localhost)}/"
|
431
567
|
# =================================================================== #
|
432
|
-
#
|
568
|
+
# === :port
|
569
|
+
#
|
570
|
+
# Example for this entry point:
|
571
|
+
#
|
572
|
+
# Open::InBrowser[port: 8080]
|
573
|
+
#
|
433
574
|
# =================================================================== #
|
434
|
-
|
575
|
+
elsif i.has_key? :port
|
576
|
+
i = "http://localhost:#{i.delete(:port)}/"
|
577
|
+
end
|
578
|
+
end
|
579
|
+
i = i.dup if i.frozen?
|
580
|
+
if i and i.include?('→')
|
581
|
+
i.delete!('→')
|
582
|
+
i.strip!
|
435
583
|
end
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
584
|
+
if i.end_with?('.cgi')
|
585
|
+
if is_on_roebe? and
|
586
|
+
Dir.pwd.include?('/home/x/') and
|
587
|
+
!i.include?('/')
|
588
|
+
i = File.absolute_path(i)
|
441
589
|
end
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
optional_append_this_string.prepend '#'
|
590
|
+
i.delete_prefix!(HOME_DIRECTORY_OF_USER_X)
|
591
|
+
if use_localhost?
|
592
|
+
i.prepend('http://localhost/') unless i.start_with?('http://localhost/')
|
593
|
+
else
|
594
|
+
if beautiful_url_is_available? and is_on_roebe?
|
595
|
+
i.prepend(HOME_DIRECTORY_OF_USER_X) unless i.start_with?(HOME_DIRECTORY_OF_USER_X)
|
449
596
|
end
|
450
|
-
entry << optional_append_this_string
|
451
597
|
end
|
598
|
+
end
|
599
|
+
unless i.empty?
|
600
|
+
# =================================================================== #
|
601
|
+
# Perform some sanitize-operations next.
|
602
|
+
# =================================================================== #
|
603
|
+
if ARRAY_TOKENS_THAT_REQUIRE_PADDING.any? {|this_token| i.include?(this_token) }
|
604
|
+
i = '"'+i+'"' unless i.start_with?('"')
|
605
|
+
end
|
606
|
+
cmd_to_use = "#{use_this_browser?}".dup
|
452
607
|
# =================================================================== #
|
453
|
-
# Next,
|
454
|
-
#
|
455
|
-
#
|
608
|
+
# Next, we must determine which options to pass to the browser at
|
609
|
+
# hand. Each browser may be different - for instance, firefox
|
610
|
+
# responds to a different set of commandline flags compared to
|
611
|
+
# chrome, and so forth.
|
456
612
|
# =================================================================== #
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
613
|
+
case cmd_to_use
|
614
|
+
# =================================================================== #
|
615
|
+
# This is for chromium-based browsers, including thorium and chrome.
|
616
|
+
# =================================================================== #
|
617
|
+
when 'chromium',
|
618
|
+
/thorium$/i,
|
619
|
+
/chrome$/i
|
620
|
+
cmd_to_use << ' --no-sandbox --app-url'
|
621
|
+
# =================================================================== #
|
622
|
+
# Handle firefox next:
|
623
|
+
# =================================================================== #
|
624
|
+
when 'firefox'
|
625
|
+
cmd_to_use << ' -new-tab'
|
626
|
+
# =================================================================== #
|
627
|
+
# Handle opera next:
|
628
|
+
# =================================================================== #
|
629
|
+
when 'opera' # Perform some sanitizing in this case.
|
630
|
+
cmd_to_use << ' -newtab'
|
631
|
+
# ================================================================= #
|
632
|
+
# Or an alternative to the above would be:
|
633
|
+
#
|
634
|
+
# opera --remote 'openURL(<url>, new-page)'
|
635
|
+
#
|
636
|
+
# I am not sure which variant to prefer, so I kind of chose one
|
637
|
+
# randomly for now.
|
638
|
+
# ================================================================= #
|
481
639
|
end
|
640
|
+
# if cmd_to_use.include?(' ')
|
641
|
+
# # ================================================================= #
|
642
|
+
# # Pad it in this case:
|
643
|
+
# # ================================================================= #
|
644
|
+
# i = '"'+i.to_s+'"'
|
645
|
+
# end
|
646
|
+
cmd_to_use << " #{i}"
|
647
|
+
# =================================================================== #
|
648
|
+
# Finally pass it into the designated browser.
|
649
|
+
# =================================================================== #
|
482
650
|
if open_in_background?
|
483
|
-
|
484
|
-
end
|
485
|
-
if File.exist?(real_filename) and
|
486
|
-
!real_filename.start_with?('file://') and
|
487
|
-
!entry.include?('http://localhost/')
|
488
|
-
entry = entry.dup
|
489
|
-
entry.prepend('file://')
|
651
|
+
cmd_to_use << ' &'
|
490
652
|
end
|
491
|
-
|
492
|
-
|
653
|
+
# =================================================================== #
|
654
|
+
# Check for the launchy gem next.
|
655
|
+
# =================================================================== #
|
656
|
+
if use_launchy?
|
657
|
+
cmd_to_use.prepend('launchy ')
|
493
658
|
end
|
494
659
|
# =================================================================== #
|
495
660
|
# Handle windows next:
|
496
661
|
# =================================================================== #
|
497
662
|
if is_on_windows?
|
498
|
-
# start firefox -new-tab www.howtogeek.com
|
499
|
-
this_command = "start #{browser} -new-tab #{entry}"
|
500
|
-
else
|
501
|
-
this_command = "#{browser} #{entry}"
|
502
|
-
end
|
503
|
-
if show_the_sys_command_that_is_used?
|
504
|
-
e this_command
|
505
|
-
end
|
506
|
-
unless entry.empty?
|
507
663
|
# ================================================================= #
|
508
|
-
#
|
509
|
-
#
|
664
|
+
# Usage example for windows:
|
665
|
+
#
|
666
|
+
# start firefox -new-tab www.howtogeek.com
|
667
|
+
#
|
510
668
|
# ================================================================= #
|
511
|
-
if
|
512
|
-
|
513
|
-
e cmd_to_use
|
514
|
-
system(cmd_to_use)
|
515
|
-
else
|
516
|
-
system(this_command) # Here we always output.
|
517
|
-
end
|
669
|
+
cmd_to_use = cmd_to_use.dup if cmd_to_use.frozen?
|
670
|
+
cmd_to_use.prepend('start ')
|
518
671
|
end
|
519
|
-
|
520
|
-
|
521
|
-
|
672
|
+
if show_the_sys_command_that_is_used?
|
673
|
+
e "#{rev}#{cmd_to_use}"
|
674
|
+
end
|
675
|
+
system "#{cmd_to_use}"
|
676
|
+
end
|
522
677
|
end
|
523
|
-
end
|
678
|
+
end; alias open_in_browser open_this_in_the_browser # === open_in_browser
|
524
679
|
|
525
680
|
# ========================================================================= #
|
526
681
|
# === run (run tag)
|
527
682
|
# ========================================================================= #
|
528
|
-
def run
|
529
|
-
|
683
|
+
def run
|
684
|
+
@internal_hash[:work_on_these_URLs] = commandline_arguments?
|
685
|
+
menu(
|
686
|
+
@internal_hash[:work_on_these_URLs]
|
687
|
+
)
|
688
|
+
@internal_hash[:work_on_these_URLs].reject! {|entry|
|
689
|
+
entry.start_with?('--') # Reject entries that start with '--'.
|
690
|
+
}
|
691
|
+
sanitize_work_on_these_URLs
|
692
|
+
work_through_all_designated_URLs
|
530
693
|
end
|
531
694
|
|
532
695
|
# ========================================================================= #
|
@@ -538,57 +701,75 @@ class InBrowser < Base # === Open::InBrowser
|
|
538
701
|
|
539
702
|
end
|
540
703
|
|
704
|
+
# =========================================================================== #
|
705
|
+
# === Open.in_browser
|
706
|
+
#
|
707
|
+
# This method will always join the input-argument before passing it
|
708
|
+
# to the class.
|
709
|
+
#
|
710
|
+
# Note that the behaviour of Open.in_browser() is in-sync with the
|
711
|
+
# method Open.in_editor(), in regards to joinable arguments
|
712
|
+
# (typically an Array as input). If you do not want this behaviour
|
713
|
+
# then you may have to prepare for this in your own code, such
|
714
|
+
# as by having an Array and iterating over it before passing
|
715
|
+
# the individual entries into Open.in_browser().
|
716
|
+
#
|
717
|
+
# Note that this method needs to be somewhat flexible, as we can provide
|
718
|
+
# varied input such as shown in the following examples:
|
719
|
+
#
|
720
|
+
# Open.open_in_browser(port: 8080)
|
721
|
+
# Open.in_browser(remote_URL) {{ use_this_browser: :firefox }}
|
722
|
+
# Open.in_browser(:default_sinatra_port)
|
723
|
+
#
|
724
|
+
# =========================================================================== #
|
725
|
+
def self.in_browser(
|
726
|
+
i = ARGV,
|
727
|
+
&block
|
728
|
+
)
|
729
|
+
if i.respond_to? :join
|
730
|
+
# ======================================================================= #
|
731
|
+
# This will only join entries that do not start with '--'.
|
732
|
+
# ======================================================================= #
|
733
|
+
entries_that_start_with_hyphens = i.select {|entry| entry.start_with?('--') }
|
734
|
+
i.reject! {|entry| entry.start_with?('--') }
|
735
|
+
new_array = []
|
736
|
+
new_array << i.join(' ').strip
|
737
|
+
new_array << entries_that_start_with_hyphens unless entries_that_start_with_hyphens.empty?
|
738
|
+
i = new_array
|
739
|
+
end
|
541
740
|
# ========================================================================= #
|
542
|
-
# ===
|
543
|
-
#
|
544
|
-
# Note that this method needs to be somewhat flexible, as we can provide
|
545
|
-
# varied input such as:
|
546
|
-
#
|
547
|
-
# Open.open_in_browser(port: 8080)
|
548
|
-
# Open.in_browser(remote_URL) {{ use_this_browser: :firefox }}
|
549
|
-
#
|
741
|
+
# === Handle blocks next
|
550
742
|
# ========================================================================= #
|
551
|
-
|
552
|
-
|
553
|
-
&block
|
554
|
-
)
|
743
|
+
if block_given?
|
744
|
+
yielded = yield
|
555
745
|
# ======================================================================= #
|
556
|
-
# === Handle
|
746
|
+
# === Handle Hashes next
|
557
747
|
# ======================================================================= #
|
558
|
-
if
|
559
|
-
yielded = yield
|
748
|
+
if yielded.is_a? Hash
|
560
749
|
# ===================================================================== #
|
561
|
-
# ===
|
750
|
+
# === :delay
|
562
751
|
# ===================================================================== #
|
563
|
-
if yielded.
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
# =================================================================== #
|
570
|
-
if yielded.has_key? :delay
|
571
|
-
_ = yielded.delete(:delay)
|
572
|
-
if _.is_a? String
|
573
|
-
_ = _.sub(/ seconds/,'')
|
574
|
-
_ = _.sub(/ second/,'').to_f if _.include? ' second'
|
575
|
-
_ = _.to_f # Need a Float.
|
576
|
-
end
|
577
|
-
sleep(_)
|
752
|
+
if yielded.has_key? :delay
|
753
|
+
_ = yielded.delete(:delay)
|
754
|
+
if _.is_a? String
|
755
|
+
_ = _.sub(/ seconds/,'')
|
756
|
+
_ = _.sub(/ second/,'').to_f if _.include? ' second'
|
757
|
+
_ = _.to_f # Need a Float.
|
578
758
|
end
|
759
|
+
sleep(_)
|
579
760
|
end
|
580
|
-
# else
|
581
761
|
end
|
582
|
-
|
583
|
-
|
584
|
-
|
762
|
+
end
|
763
|
+
return ::Open::InBrowser.new(i, &block)
|
764
|
+
end; self.instance_eval { alias open_in_browser in_browser } # === Open.open_in_browser
|
765
|
+
self.instance_eval { alias open_browser in_browser } # === Open.open_browser
|
585
766
|
|
586
767
|
end
|
587
768
|
|
588
769
|
# =========================================================================== #
|
589
770
|
# === open_in_browser
|
590
771
|
#
|
591
|
-
# This method will open an URL
|
772
|
+
# This method will open an URL via the browser.
|
592
773
|
#
|
593
774
|
# Usage example in pure Ruby:
|
594
775
|
#
|
@@ -603,12 +784,13 @@ def open_in_browser(
|
|
603
784
|
# ========================================================================= #
|
604
785
|
# Next, open the class that we defined above in this file here.
|
605
786
|
# ========================================================================= #
|
606
|
-
_ = Open
|
787
|
+
_ = Open.in_browser(url, :do_not_run_yet, &block)
|
607
788
|
_.check_for_intralink(optional_intralink)
|
608
789
|
_.run
|
609
790
|
end; alias oib open_in_browser # oib shortcut.
|
610
791
|
|
611
792
|
if __FILE__ == $PROGRAM_NAME
|
612
|
-
|
793
|
+
Open.in_browser(ARGV)
|
613
794
|
end # inbrowser
|
614
|
-
# inbrowser https://distrowatch.com/dwres.php?resource=ratings&distro=antix
|
795
|
+
# inbrowser "https://distrowatch.com/dwres.php?resource=ratings&distro=antix"
|
796
|
+
# inbrowser /home/x/Temp/studium/html/timetable.html#today
|