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
@@ -5,15 +5,15 @@
|
|
5
5
|
# === Open::Open
|
6
6
|
#
|
7
7
|
# This class will simply open a given file. It may also "open" the file
|
8
|
-
# in the browser, that is, to use
|
9
|
-
# content as such.
|
8
|
+
# in the browser, that is, to use firefox or chrome or thorium to
|
9
|
+
# display the file content as such.
|
10
10
|
#
|
11
11
|
# Usage example:
|
12
12
|
#
|
13
13
|
# Open::Open.new(ARGV)
|
14
14
|
#
|
15
15
|
# =========================================================================== #
|
16
|
-
# require 'open/open.rb'
|
16
|
+
# require 'open/open/open.rb'
|
17
17
|
# Open::Open.new(ARGV)
|
18
18
|
# =========================================================================== #
|
19
19
|
require 'open/base/base.rb'
|
@@ -22,13 +22,13 @@ module Open
|
|
22
22
|
|
23
23
|
class Open < ::Open::Base # === Open::Open
|
24
24
|
|
25
|
-
require 'open/in_editor/in_editor.rb'
|
26
25
|
require 'open/in_browser/in_browser.rb'
|
27
|
-
require 'open/
|
26
|
+
require 'open/in_editor/in_editor.rb'
|
27
|
+
require 'open/toplevel_methods/misc.rb'
|
28
28
|
|
29
29
|
begin
|
30
30
|
require 'roebe/classes/find_expanded_alias.rb'
|
31
|
-
rescue LoadError; end
|
31
|
+
rescue LoadError => error; puts error; end
|
32
32
|
|
33
33
|
# ========================================================================= #
|
34
34
|
# === LIBREOFFICE
|
@@ -41,7 +41,7 @@ class Open < ::Open::Base # === Open::Open
|
|
41
41
|
if ENV['PATH_TO_THE_LIBREOFFICE_EXECUTABLE']
|
42
42
|
LIBREOFFICE = ENV['PATH_TO_THE_LIBREOFFICE_EXECUTABLE'].to_s.dup
|
43
43
|
else
|
44
|
-
LIBREOFFICE = '/usr/bin/soffice'
|
44
|
+
LIBREOFFICE = '/usr/bin/soffice' # This will be valid for most users of the gem.
|
45
45
|
end
|
46
46
|
|
47
47
|
# ========================================================================= #
|
@@ -63,26 +63,6 @@ class Open < ::Open::Base # === Open::Open
|
|
63
63
|
# ========================================================================= #
|
64
64
|
USE_THIS_DELAY = 0.65
|
65
65
|
|
66
|
-
# ========================================================================= #
|
67
|
-
# === ARRAY_EXTENSIONS_THAT_CAN_BE_OPENED_IN_THE_EDITOR
|
68
|
-
#
|
69
|
-
# All extensions that can be opened in the editor should be registered
|
70
|
-
# in this constant.
|
71
|
-
#
|
72
|
-
# For example, "h" means ".h" aka a C or C++ header file.
|
73
|
-
# ========================================================================= #
|
74
|
-
ARRAY_EXTENSIONS_THAT_CAN_BE_OPENED_IN_THE_EDITOR = %w(
|
75
|
-
php rb txt yaml yml cgi
|
76
|
-
md gemspec html csv py
|
77
|
-
conf c sh js log css cr
|
78
|
-
ascii la pl perl json
|
79
|
-
js fasta fa m3u cpp
|
80
|
-
go gff gff3
|
81
|
-
gen h
|
82
|
-
erb sinatra
|
83
|
-
sql
|
84
|
-
).sort << '' # The last part is for files like "TODO" which lack an extension.
|
85
|
-
|
86
66
|
# ========================================================================= #
|
87
67
|
# === ARRAY_LIBREOFFICE_EXTENSIONS
|
88
68
|
#
|
@@ -104,42 +84,18 @@ class Open < ::Open::Base # === Open::Open
|
|
104
84
|
pps
|
105
85
|
)
|
106
86
|
|
107
|
-
# ========================================================================= #
|
108
|
-
# === ARRAY_IMAGES
|
109
|
-
#
|
110
|
-
# All file-extensions for images can be registered in this Array.
|
111
|
-
# ========================================================================= #
|
112
|
-
ARRAY_IMAGES = %w(
|
113
|
-
png
|
114
|
-
jpg
|
115
|
-
gif
|
116
|
-
jpeg
|
117
|
-
tiff
|
118
|
-
tif
|
119
|
-
bmp
|
120
|
-
)
|
121
|
-
|
122
|
-
# ========================================================================= #
|
123
|
-
# === ARRAY_VIDEOS
|
124
|
-
# ========================================================================= #
|
125
|
-
ARRAY_VIDEOS = %w(
|
126
|
-
vob
|
127
|
-
avi
|
128
|
-
flv
|
129
|
-
mp3
|
130
|
-
mp4
|
131
|
-
)
|
132
|
-
|
133
87
|
# ========================================================================= #
|
134
88
|
# === initialize
|
135
89
|
# ========================================================================= #
|
136
90
|
def initialize(
|
137
|
-
|
138
|
-
run_already
|
91
|
+
commandline_arguments = ARGV,
|
92
|
+
run_already = true,
|
139
93
|
&block
|
140
94
|
)
|
141
95
|
reset
|
142
|
-
|
96
|
+
set_commandline_arguments(
|
97
|
+
commandline_arguments
|
98
|
+
)
|
143
99
|
# ======================================================================= #
|
144
100
|
# === Handle blocks next
|
145
101
|
# ======================================================================= #
|
@@ -159,7 +115,7 @@ class Open < ::Open::Base # === Open::Open
|
|
159
115
|
# === :open_via_fullscreen
|
160
116
|
# =================================================================== #
|
161
117
|
if yielded.has_key? :open_via_fullscreen
|
162
|
-
@open_via_fullscreen = yielded.delete(:open_via_fullscreen)
|
118
|
+
@internal_hash[:open_via_fullscreen] = yielded.delete(:open_via_fullscreen)
|
163
119
|
end
|
164
120
|
end
|
165
121
|
end
|
@@ -173,75 +129,102 @@ class Open < ::Open::Base # === Open::Open
|
|
173
129
|
super()
|
174
130
|
infer_the_namespace
|
175
131
|
# ======================================================================= #
|
176
|
-
# === @
|
132
|
+
# === @internal_hash
|
133
|
+
# ======================================================================= #
|
134
|
+
@internal_hash = {}
|
177
135
|
# ======================================================================= #
|
178
|
-
|
136
|
+
# === :open_via_fullscreen
|
179
137
|
# ======================================================================= #
|
180
|
-
|
138
|
+
@internal_hash[:open_via_fullscreen] = false
|
181
139
|
# ======================================================================= #
|
182
|
-
|
140
|
+
# === :set_the_main_book
|
183
141
|
# ======================================================================= #
|
184
|
-
|
142
|
+
@internal_hash[:set_the_main_book] = false
|
185
143
|
# ======================================================================= #
|
186
|
-
|
144
|
+
# === :image_editor_to_use
|
187
145
|
# ======================================================================= #
|
188
|
-
|
146
|
+
@internal_hash[:image_editor_to_use] = 'gimp'
|
189
147
|
# ======================================================================= #
|
190
|
-
|
148
|
+
# === :editor
|
149
|
+
# ======================================================================= #
|
150
|
+
set_editor(use_which_editor?)
|
151
|
+
# ======================================================================= #
|
152
|
+
# === :open_these_elements
|
153
|
+
# ======================================================================= #
|
154
|
+
@internal_hash[:open_these_elements] = []
|
191
155
|
end
|
192
156
|
|
193
157
|
# ========================================================================= #
|
194
158
|
# === set_the_main_book?
|
195
159
|
# ========================================================================= #
|
196
160
|
def set_the_main_book?
|
197
|
-
@set_the_main_book
|
161
|
+
@internal_hash[:set_the_main_book]
|
198
162
|
end
|
199
163
|
|
200
164
|
# ========================================================================= #
|
201
|
-
# ===
|
165
|
+
# === open_in_editor (open tag, open1 tag)
|
166
|
+
#
|
167
|
+
# This method will simply delegate towards class Open::InEditor.
|
168
|
+
#
|
169
|
+
# Take note that Open.in_editor() will already handle delays, so
|
170
|
+
# we do not have to do anything special here.
|
202
171
|
# ========================================================================= #
|
203
|
-
def
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
172
|
+
def open_in_editor(i)
|
173
|
+
::Open.in_editor(i)
|
174
|
+
end; alias try_to_open_this_file_in_the_editor open_in_editor # === try_to_open_this_file_in_the_editor
|
175
|
+
alias consider_opening_the_given_input open_in_editor # === consider_opening_the_given_input
|
176
|
+
alias open_these_files open_in_editor # === open_these_files
|
177
|
+
alias do_open_in_editor open_in_editor # === do_open_in_editor
|
208
178
|
|
209
179
|
# ========================================================================= #
|
210
|
-
# ===
|
180
|
+
# === try_to_require_the_studium_project
|
211
181
|
# ========================================================================= #
|
212
|
-
def
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
182
|
+
def try_to_require_the_studium_project
|
183
|
+
unless Object.const_defined?(:Studium) and
|
184
|
+
Studium.respond_to?(:include_this_exam_topic?)
|
185
|
+
begin # We pull in only the relevant files from the Studium project.
|
186
|
+
require 'studium/constants/constants.rb'
|
187
|
+
require 'studium/toplevel_methods/toplevel_methods.rb'
|
188
|
+
rescue LoadError
|
189
|
+
if is_on_roebe?
|
190
|
+
e 'The two files ('\
|
191
|
+
'studium/constants/constants.rb,'\
|
192
|
+
'studium/toplevel_methods/toplevel_methods.rb '\
|
193
|
+
'forth) from the studium-project could not be loaded.'
|
194
|
+
end
|
195
|
+
end
|
217
196
|
end
|
218
197
|
end
|
219
198
|
|
220
199
|
# ========================================================================= #
|
221
|
-
# ===
|
200
|
+
# === show_help (help tag)
|
222
201
|
# ========================================================================= #
|
223
|
-
def
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
202
|
+
def show_help
|
203
|
+
opne 'The following options are available:'
|
204
|
+
e
|
205
|
+
ecomment ' SELF # Open this .rb file here.'
|
206
|
+
ecomment ' --use-this-browser=firefox # Assign a new browser, in this case firefox.'
|
207
|
+
ecomment ' --browser? # '\
|
208
|
+
'Show which browser is the currently assigned one.'
|
209
|
+
ecomment ' --everything # '\
|
210
|
+
'This will open every file in the current working directory, and '\
|
211
|
+
'all subdirectories.'
|
212
|
+
ecomment ' --important-exam # '\
|
213
|
+
'Open all important exams. Only useful if the studium gem is '\
|
214
|
+
'also installed.'
|
215
|
+
e
|
216
|
+
end
|
217
|
+
|
218
|
+
# ========================================================================= #
|
219
|
+
# === menu (menu tag)
|
220
|
+
# ========================================================================= #
|
221
|
+
def menu(
|
222
|
+
i = commandline_arguments?
|
223
|
+
)
|
224
|
+
if i.is_a? Array
|
225
|
+
i.each {|entry| menu(entry) }
|
226
|
+
else
|
227
|
+
case i # (case tag)
|
245
228
|
# ===================================================================== #
|
246
229
|
# === open --important-exam
|
247
230
|
# ===================================================================== #
|
@@ -249,140 +232,46 @@ class Open < ::Open::Base # === Open::Open
|
|
249
232
|
base_dir = ENV['USERS']
|
250
233
|
base_dir = '/home' if base_dir.nil?
|
251
234
|
entry = "#{base_dir}/x/programming/ruby/src/studium/lib/studium/yaml/important_exams.yml"
|
252
|
-
|
253
|
-
|
254
|
-
# Get rid of localhost next. This must be handled with more care,
|
255
|
-
# because some files may include the string 'localhost' as part of
|
256
|
-
# their name, such as 'remove_localhost.rb'. In this case, we will
|
257
|
-
# additionally check whether the file exists.
|
258
|
-
# ===================================================================== #
|
259
|
-
if entry.is_a?(String) and entry.include?('localhost')
|
260
|
-
unless File.exist? entry # See the above header for an explanation.
|
261
|
-
entry = replace_localhost_with_data(entry)
|
262
|
-
end
|
263
|
-
end
|
264
|
-
if entry.is_a? String
|
265
|
-
entry.chop! if entry.end_with? '#' # Don't need trailing '#' tokens.
|
266
|
-
entry.chop! if entry.end_with? ':-' # ← This check must come before the check against ':'.
|
267
|
-
entry.chop! if entry.end_with? ':' # Chop off trailing ':' tokens.
|
268
|
-
# ===================================================================== #
|
269
|
-
# Next, we handle input such as:
|
270
|
-
# 'lib/lpc/requires/basic_requires.rb:begin'
|
271
|
-
# This evidently does not end with a ':' character, but it clearly
|
272
|
-
# has a fairly useless ':' component in it. If that is the case,
|
273
|
-
# we will treat this as input that is only valid up towards the
|
274
|
-
# very right ':', anchored on the '.rb:' part.
|
275
|
-
# ===================================================================== #
|
276
|
-
if entry.include? '.rb:'
|
277
|
-
# =================================================================== #
|
278
|
-
# The following code means to find the index at '.rb:' and then add
|
279
|
-
# 2 to it - this should be the correct name of the entry at hand.
|
280
|
-
# =================================================================== #
|
281
|
-
entry = entry[0 .. (entry.index('.rb:')+2)]
|
282
|
-
end
|
283
|
-
if entry.end_with?(',') and !File.exist?(',')
|
284
|
-
entry.chop!
|
285
|
-
elsif entry.end_with?('.') and File.exist?(entry[0..-2])
|
286
|
-
# =================================================================== #
|
287
|
-
# This clause will be entered if we have input something like
|
288
|
-
# "colours.rb." where the user may have wanted to type in
|
289
|
-
# "colours.rb" - and IF the file exists.
|
290
|
-
# =================================================================== #
|
291
|
-
opnn; e "Assuming a superfluous trailing '.', so removing "\
|
292
|
-
"the last '.' there."
|
293
|
-
entry.chop!
|
294
|
-
end
|
295
|
-
end
|
296
|
-
case entry # Work only on the first entry. (case tag)
|
235
|
+
@internal_hash[:open_these_elements].clear
|
236
|
+
@internal_hash[:open_these_elements] << entry
|
297
237
|
# ===================================================================== #
|
298
|
-
# === open
|
238
|
+
# === open --everything
|
239
|
+
#
|
240
|
+
# This actually refers only to files, so we select for files next.
|
299
241
|
# ===================================================================== #
|
300
|
-
when
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
open_this_file_here
|
305
|
-
exit
|
242
|
+
when /^-?-?everything?$/i
|
243
|
+
elements = Dir['**/**'].select {|inner_entry| File.file?(inner_entry) }
|
244
|
+
@internal_hash[:open_these_elements].clear
|
245
|
+
@internal_hash[:open_these_elements] << elements
|
306
246
|
# ===================================================================== #
|
307
247
|
# === open --help
|
308
248
|
# ===================================================================== #
|
309
249
|
when /^-?-?help$/i,
|
310
|
-
|
250
|
+
/^-?-?show(-|_)?help$/i
|
311
251
|
show_help
|
312
252
|
exit
|
313
|
-
end unless File.exist?(entry.to_s)
|
314
|
-
entry
|
315
|
-
}
|
316
|
-
@input = i # This must be an Array.
|
317
|
-
end; alias set_input_files set_input # === set_input_files
|
318
|
-
|
319
|
-
# ========================================================================= #
|
320
|
-
# === input?
|
321
|
-
# ========================================================================= #
|
322
|
-
def input?
|
323
|
-
@input
|
324
|
-
end; alias input_file? input? # === input_file?
|
325
|
-
alias input_files? input? # === input_files?
|
326
|
-
|
327
|
-
# ========================================================================= #
|
328
|
-
# === check_whether_the_user_has_provided_any_input
|
329
|
-
# ========================================================================= #
|
330
|
-
def check_whether_the_user_has_provided_any_input
|
331
|
-
_ = input_files?
|
332
|
-
local_files = Dir['*'].select {|entry| File.file? entry }
|
333
|
-
if _.empty? and !local_files.empty? and (local_files.size == 1)
|
334
253
|
# ===================================================================== #
|
335
|
-
#
|
336
|
-
# one file exists in the local directory.
|
254
|
+
# === open --browser?
|
337
255
|
# ===================================================================== #
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
256
|
+
when /^-?-?browser\??$/
|
257
|
+
_ = YAML.load_file(::Open.file_browser?)
|
258
|
+
e "#{rev}The browser currently in use is `#{sfancy(_)}#{rev}`."
|
259
|
+
exit
|
260
|
+
# ===================================================================== #
|
261
|
+
# === open --use-this-browser=firefox
|
262
|
+
# ===================================================================== #
|
263
|
+
when /^-?-?use(-|_)?this(-|_)?browser=(.+)/
|
264
|
+
::Open.permanently_use_this_browser = $3.to_s.dup
|
347
265
|
exit
|
348
266
|
end
|
349
267
|
end
|
350
268
|
end
|
351
269
|
|
352
270
|
# ========================================================================= #
|
353
|
-
# ===
|
354
|
-
# ========================================================================= #
|
355
|
-
def start_bluefish
|
356
|
-
esystem 'bluefish &'
|
357
|
-
end
|
358
|
-
|
359
|
-
# ========================================================================= #
|
360
|
-
# === is_bluefish_running?
|
361
|
-
# ========================================================================= #
|
362
|
-
def is_bluefish_running?
|
363
|
-
`ps ax | grep bluefish`.split("\n").reject {|entry|
|
364
|
-
entry.include? 'grep'
|
365
|
-
}.size > 0
|
366
|
-
end
|
367
|
-
|
368
|
-
# ========================================================================= #
|
369
|
-
# === consider_padding
|
370
|
-
#
|
371
|
-
# Simply add a surrounding '"' to the given input, so that any resulting
|
372
|
-
# system() call will still work if we have awkward filenames.
|
373
|
-
# ========================================================================= #
|
374
|
-
def consider_padding(i)
|
375
|
-
if i.include?(' ') or i.include?('(')
|
376
|
-
i = '"'+i+'"'
|
377
|
-
end
|
378
|
-
return i
|
379
|
-
end
|
380
|
-
|
381
|
-
# ========================================================================= #
|
382
|
-
# === play_multimedia_file
|
271
|
+
# === editor?
|
383
272
|
# ========================================================================= #
|
384
|
-
def
|
385
|
-
|
273
|
+
def editor?
|
274
|
+
@internal_hash[:editor]
|
386
275
|
end
|
387
276
|
|
388
277
|
# ========================================================================= #
|
@@ -392,13 +281,6 @@ class Open < ::Open::Base # === Open::Open
|
|
392
281
|
do_open_in_editor(this_file?+IN_BACKGROUND)
|
393
282
|
end
|
394
283
|
|
395
|
-
# ========================================================================= #
|
396
|
-
# === return_this_file_here
|
397
|
-
# ========================================================================= #
|
398
|
-
def return_this_file_here
|
399
|
-
__FILE__
|
400
|
-
end; alias this_file? return_this_file_here # === this_file?
|
401
|
-
|
402
284
|
# ========================================================================= #
|
403
285
|
# === delay?
|
404
286
|
# ========================================================================= #
|
@@ -407,186 +289,70 @@ class Open < ::Open::Base # === Open::Open
|
|
407
289
|
end
|
408
290
|
|
409
291
|
# ========================================================================= #
|
410
|
-
# ===
|
411
|
-
# ========================================================================= #
|
412
|
-
def find_and_return_last_file
|
413
|
-
array = Dir['*'].reject {|entry| ! File.file? entry }
|
414
|
-
array.map! {|entry|
|
415
|
-
[entry, File.ctime(entry)]
|
416
|
-
}
|
417
|
-
result = array.sort_by {|entry| entry[1] }.reverse
|
418
|
-
result = result.first[0]
|
419
|
-
return result
|
420
|
-
end
|
421
|
-
|
422
|
-
# ========================================================================= #
|
423
|
-
# === can_be_opened_in_the_editor?
|
292
|
+
# === set_use_this_editor
|
424
293
|
# ========================================================================= #
|
425
|
-
def
|
426
|
-
|
427
|
-
|
428
|
-
|
294
|
+
def set_use_this_editor(
|
295
|
+
i = use_which_editor?
|
296
|
+
)
|
297
|
+
@internal_hash[:editor] = i.to_s
|
298
|
+
end; alias set_editor set_use_this_editor # === set_editor
|
429
299
|
|
430
300
|
# ========================================================================= #
|
431
|
-
# ===
|
301
|
+
# === open_in_pdf_viewer (pdf tag)
|
302
|
+
#
|
303
|
+
# This method can be used to open a .pdf file. We will let the project
|
304
|
+
# PdfParadise handle this situation.
|
305
|
+
#
|
306
|
+
# Since as of 19.09.2018 we will keep a log of the opened .pdf files
|
307
|
+
# if we are on roebe. This can then be used to determine which were
|
308
|
+
# the last .pdf files that were read.
|
432
309
|
# ========================================================================= #
|
433
|
-
def
|
434
|
-
|
435
|
-
)
|
310
|
+
def open_in_pdf_viewer(i)
|
311
|
+
require 'pdf_paradise' unless Object.const_defined? :PdfParadise
|
436
312
|
# ======================================================================= #
|
437
|
-
#
|
313
|
+
# Since as of April 2022 we will use the absolute path to the .pdf
|
314
|
+
# file at hand. The reason for this is because this makes it easier
|
315
|
+
# to know which files are open, and we can store these file paths
|
316
|
+
# into a local file (such as a .yml file), and then use this at a
|
317
|
+
# later time to restore all .pdf files that were open. This thus
|
318
|
+
# constitutes some type of "session management".
|
438
319
|
# ======================================================================= #
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
'small delay (of '+sfancy(delay?.to_s)+' seconds).'
|
444
|
-
end
|
445
|
-
i.each {|entry|
|
446
|
-
sleep delay? if i.size > DELAY_IF_WE_HAVE_MORE_THAN_N_ENTRIES # Small delay.
|
447
|
-
try_to_open_this_file_in_the_editor(entry)
|
448
|
-
}
|
449
|
-
else
|
450
|
-
# ===================================================================== #
|
451
|
-
# Get rid of localhost-string parts next.
|
452
|
-
# ===================================================================== #
|
453
|
-
if i.include? 'localhost'
|
454
|
-
i = replace_localhost_with_data(i)
|
455
|
-
end unless File.exist? i
|
456
|
-
# ===================================================================== #
|
457
|
-
# Next, we chop off '?' characters. This is, however had, not good if
|
458
|
-
# this is part of the filename. So we must check if the file exists,
|
459
|
-
# prior to doing this check.
|
460
|
-
# ===================================================================== #
|
461
|
-
unless File.exist? i
|
462
|
-
i = i[0..i.index('?')] if i.include? '?'
|
463
|
-
end
|
464
|
-
# ===================================================================== #
|
465
|
-
# Get rid of '#' in the input, if it exists.
|
466
|
-
# ===================================================================== #
|
467
|
-
i = i[0..i.index('#')] if i.include? '#'
|
468
|
-
case i
|
469
|
-
when 'LAST' # Assign the last file.
|
470
|
-
i = find_and_return_last_file
|
471
|
-
end
|
472
|
-
# ===================================================================== #
|
473
|
-
# Next, act on the extension name.
|
474
|
-
# ===================================================================== #
|
475
|
-
_ = File.extname(i).delete('.').downcase
|
476
|
-
case _ # case tag
|
477
|
-
# ===================================================================== #
|
478
|
-
# === open .pdf files
|
479
|
-
# ===================================================================== #
|
480
|
-
when 'pdf'
|
481
|
-
open_in_pdf_viewer(i)
|
482
|
-
# ===================================================================== #
|
483
|
-
# === epub
|
484
|
-
# ===================================================================== #
|
485
|
-
when 'epub'
|
486
|
-
esystem "okular #{i} &"
|
487
|
-
# ===================================================================== #
|
488
|
-
# === torrent
|
489
|
-
# ===================================================================== #
|
490
|
-
when 'torrent'
|
491
|
-
open_this_torrent_file(i)
|
492
|
-
# ===================================================================== #
|
493
|
-
# === Extensions that can be opened in the editor
|
494
|
-
# ===================================================================== #
|
495
|
-
when *ARRAY_EXTENSIONS_THAT_CAN_BE_OPENED_IN_THE_EDITOR
|
496
|
-
open_in_browser_or_in_editor(i)
|
497
|
-
# ===================================================================== #
|
498
|
-
# === All registered images
|
499
|
-
# ===================================================================== #
|
500
|
-
when *ARRAY_IMAGES
|
501
|
-
open_in_gimp(i)
|
502
|
-
# ===================================================================== #
|
503
|
-
# === All libreoffice extensions
|
504
|
-
# ===================================================================== #
|
505
|
-
when *ARRAY_LIBREOFFICE_EXTENSIONS
|
506
|
-
open_in_office(i)
|
320
|
+
i = File.absolute_path(i)
|
321
|
+
if File.exist? i
|
322
|
+
require 'pdf_paradise/main_pdf/main_pdf.rb'
|
323
|
+
require 'pdf_paradise/set_main_book.rb'
|
507
324
|
# ===================================================================== #
|
508
|
-
#
|
325
|
+
# Only enable the following on my home-system, and only in the
|
326
|
+
# books-subdirectory, and university-subdirectory.
|
509
327
|
# ===================================================================== #
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
328
|
+
if is_on_roebe? and set_the_main_book?
|
329
|
+
case return_pwd
|
330
|
+
# =================================================================== #
|
331
|
+
# The following checks were explained above. We will also run
|
332
|
+
# rcfiles, and send pidof.
|
333
|
+
# =================================================================== #
|
334
|
+
when /^#{Regexp.quote('/home/x/books/')}/,
|
335
|
+
/^#{Regexp.quote('/home/x/studium/')}/
|
336
|
+
PdfParadise::SetMainBook.new(i)
|
337
|
+
run_rcfiles_then_run_ata_via_qdbus
|
519
338
|
end
|
520
339
|
end
|
340
|
+
PdfParadise.main_pdf(i) {{
|
341
|
+
open_via_fullscreen: open_via_fullscreen?
|
342
|
+
}}
|
343
|
+
register_this_pdf_file(i)
|
344
|
+
else
|
345
|
+
this_file_was_not_found(i)
|
521
346
|
end
|
522
|
-
end; alias consider_opening_the_given_input try_to_open_this_file_in_the_editor # === consider_opening_the_given_input
|
523
|
-
alias open_in_editor try_to_open_this_file_in_the_editor # === open_in_editor
|
524
|
-
alias open_these_files try_to_open_this_file_in_the_editor # === open_these_files
|
525
|
-
|
526
|
-
# ========================================================================= #
|
527
|
-
# === open_this_torrent_file
|
528
|
-
# ========================================================================= #
|
529
|
-
def open_this_torrent_file(i)
|
530
|
-
if i.include?("'") and !i.include?('"')
|
531
|
-
i = '"'+i+'"'
|
532
|
-
end
|
533
|
-
_ = "transmission #{i} &"
|
534
|
-
esystem(_)
|
535
347
|
end
|
536
348
|
|
537
349
|
# ========================================================================= #
|
538
|
-
# ===
|
539
|
-
#
|
540
|
-
# This method will try to find files based on '::' input.'
|
541
|
-
# ========================================================================= #
|
542
|
-
def try_to_find_files_based_on_hyphens_as_part_of_the_input(i)
|
543
|
-
if i.include? '::'
|
544
|
-
# ===================================================================== #
|
545
|
-
# In this case, replace '::', after passing it through the
|
546
|
-
# snakecase() method.
|
547
|
-
# ===================================================================== #
|
548
|
-
i = snakecase_and_prepend_first_name_and_lib(i).tr('::','/')+'/'
|
549
|
-
end
|
550
|
-
unless i.start_with?('/home')
|
551
|
-
# ===================================================================== #
|
552
|
-
# We assume that only ruby files follow the '::' layout, for now. (Jun 2017)
|
553
|
-
# ===================================================================== #
|
554
|
-
i.prepend('$RUBY_SRC/')
|
555
|
-
end
|
556
|
-
if i.include? '$'
|
557
|
-
i = convert_global_env(i)
|
558
|
-
end
|
559
|
-
i.squeeze!('/')
|
560
|
-
unless i.end_with?('*')
|
561
|
-
i << '*'
|
562
|
-
end
|
563
|
-
these_files = Dir[i]
|
564
|
-
open_these_files(these_files)
|
565
|
-
end
|
566
|
-
|
567
|
-
# ========================================================================= #
|
568
|
-
# === snakecase_and_prepend_first_name_and_lib
|
569
|
-
#
|
570
|
-
# This combines snakecase() by also prepending the first-name
|
571
|
-
# and "lib/" prefix.
|
572
|
-
# ========================================================================= #
|
573
|
-
def snakecase_and_prepend_first_name_and_lib(i)
|
574
|
-
if i.include? '::'
|
575
|
-
splitted = i.split('::')
|
576
|
-
first_name = splitted.first.downcase
|
577
|
-
end
|
578
|
-
i = snakecase(i)
|
579
|
-
return first_name+'/lib/'+i
|
580
|
-
end
|
581
|
-
|
582
|
-
# ========================================================================= #
|
583
|
-
# === register_this_pdf_file
|
350
|
+
# === register_this_pdf_file
|
584
351
|
# ========================================================================= #
|
585
352
|
def register_this_pdf_file(what)
|
586
353
|
begin
|
587
354
|
require 'save_file'
|
588
|
-
require 'roebe/constants/
|
589
|
-
require 'roebe/constants/directory_constants.rb'
|
355
|
+
require 'roebe/constants/file_and_directory_constants.rb'
|
590
356
|
rescue LoadError; end
|
591
357
|
into = Roebe.file_these_pdf_files_were_opened
|
592
358
|
old_dataset = nil
|
@@ -627,36 +393,17 @@ class Open < ::Open::Base # === Open::Open
|
|
627
393
|
end
|
628
394
|
|
629
395
|
# ========================================================================= #
|
630
|
-
# ===
|
631
|
-
#
|
632
|
-
# This method was required because sometimes we wish to open in the
|
633
|
-
# browser, and sometimes we wish to open in the editor.
|
396
|
+
# === return_this_file_here
|
634
397
|
# ========================================================================= #
|
635
|
-
def
|
636
|
-
|
637
|
-
|
638
|
-
i.squeeze!('/')
|
639
|
-
end
|
640
|
-
# ======================================================================= #
|
641
|
-
# Next, we get the extension name.
|
642
|
-
# ======================================================================= #
|
643
|
-
_ = File.extname(File.basename(i)).delete '.'
|
644
|
-
case _
|
645
|
-
when 'html','php' # Open in both, in this case.
|
646
|
-
do_open_in_editor(i)
|
647
|
-
unless File.zero? i
|
648
|
-
::Open.in_browser(i) unless _.include? 'php'
|
649
|
-
end
|
650
|
-
else
|
651
|
-
do_open_in_editor(i)
|
652
|
-
end
|
653
|
-
end
|
398
|
+
def return_this_file_here
|
399
|
+
__FILE__
|
400
|
+
end; alias this_file? return_this_file_here # === this_file?
|
654
401
|
|
655
402
|
# ========================================================================= #
|
656
403
|
# === open_in_gimp
|
657
404
|
# ========================================================================= #
|
658
405
|
def open_in_gimp(i)
|
659
|
-
esystem "#{@
|
406
|
+
esystem "#{@internal_hash[:image_editor_to_use]} #{i}#{IN_BACKGROUND}"
|
660
407
|
end
|
661
408
|
|
662
409
|
# ========================================================================= #
|
@@ -676,147 +423,277 @@ class Open < ::Open::Base # === Open::Open
|
|
676
423
|
end
|
677
424
|
|
678
425
|
# ========================================================================= #
|
679
|
-
# ===
|
426
|
+
# === open_via_fullscreen?
|
680
427
|
# ========================================================================= #
|
681
|
-
def
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
'studium/toplevel_methods/find_exam_topic_and_exam_title.rb and '\
|
693
|
-
'studium/toplevel_methods/is_this_exam_topic_included.rb '\
|
694
|
-
'forth) from the studium-project could not be loaded.'
|
695
|
-
end
|
428
|
+
def open_via_fullscreen?
|
429
|
+
@internal_hash[:open_via_fullscreen]
|
430
|
+
end
|
431
|
+
|
432
|
+
# ========================================================================= #
|
433
|
+
# === joined_and_stripped_commandline_arguments
|
434
|
+
# ========================================================================= #
|
435
|
+
def joined_and_stripped_commandline_arguments
|
436
|
+
_ = commandline_arguments?.map {|entry|
|
437
|
+
if entry.is_a? Symbol
|
438
|
+
entry = ":#{entry}" # Symbols become "fake" symbols here, on purpose.
|
696
439
|
end
|
440
|
+
entry
|
441
|
+
}
|
442
|
+
return _.join(' ').strip
|
443
|
+
end
|
444
|
+
|
445
|
+
# ========================================================================= #
|
446
|
+
# === set_open_these_elements
|
447
|
+
# ========================================================================= #
|
448
|
+
def set_open_these_elements(i)
|
449
|
+
@internal_hash[:open_these_elements] = [i].flatten.compact
|
450
|
+
end; alias set_input set_open_these_elements # === set_input
|
451
|
+
alias set_input_files set_open_these_elements # === set_input_files
|
452
|
+
|
453
|
+
# ========================================================================= #
|
454
|
+
# === play_multimedia_file
|
455
|
+
# ========================================================================= #
|
456
|
+
def play_multimedia_file(i)
|
457
|
+
esystem "#{USE_THIS_MPLAYER_COMMAND} #{i}" # open
|
458
|
+
end
|
459
|
+
|
460
|
+
# ========================================================================= #
|
461
|
+
# === can_be_opened_in_the_editor?
|
462
|
+
# ========================================================================= #
|
463
|
+
def can_be_opened_in_the_editor?(i)
|
464
|
+
_ = File.extname(i).delete('.')
|
465
|
+
ARRAY_EXTENSIONS_THAT_CAN_BE_OPENED_IN_THE_EDITOR.include?(i)
|
466
|
+
end
|
467
|
+
|
468
|
+
# ========================================================================= #
|
469
|
+
# === find_and_return_last_file
|
470
|
+
#
|
471
|
+
# This method will select all files from the current directory and
|
472
|
+
# add the ctime (into the Array). Then it will simply sort based
|
473
|
+
# the ctime, and return the first entry.
|
474
|
+
# ========================================================================= #
|
475
|
+
def find_and_return_last_file
|
476
|
+
array = Dir['*'].select {|entry| File.file? entry }
|
477
|
+
array.map! {|entry|
|
478
|
+
[entry, File.ctime(entry)]
|
479
|
+
}
|
480
|
+
result = array.sort_by {|entry| entry[1] }.reverse
|
481
|
+
result = result.first[0] # Return the first entry here.
|
482
|
+
return result
|
483
|
+
end
|
484
|
+
|
485
|
+
# ========================================================================= #
|
486
|
+
# === open_this_torrent_file
|
487
|
+
#
|
488
|
+
# This method will properly open a .torrent file - right now hardcoded
|
489
|
+
# towards the "transmission" application.
|
490
|
+
# ========================================================================= #
|
491
|
+
def open_this_torrent_file(i)
|
492
|
+
if i.include?("'") and !i.include?('"')
|
493
|
+
i = '"'+i+'"'
|
697
494
|
end
|
495
|
+
_ = "transmission #{i} &"
|
496
|
+
esystem(_)
|
497
|
+
end
|
498
|
+
|
499
|
+
# ========================================================================= #
|
500
|
+
# === open_these_elements?
|
501
|
+
# ========================================================================= #
|
502
|
+
def open_these_elements?
|
503
|
+
@internal_hash[:open_these_elements]
|
504
|
+
end; alias input_files? open_these_elements? # === input_files?
|
505
|
+
alias input_file? open_these_elements? # === input_file?
|
506
|
+
alias input? open_these_elements? # === input?
|
507
|
+
|
508
|
+
# ========================================================================= #
|
509
|
+
# === remove_empty_entries
|
510
|
+
# ========================================================================= #
|
511
|
+
def remove_empty_entries
|
512
|
+
@internal_hash[:open_these_elements].reject! {|entry|
|
513
|
+
entry.nil? or entry.empty?
|
514
|
+
}
|
698
515
|
end
|
699
516
|
|
700
517
|
# ========================================================================= #
|
701
|
-
# ===
|
518
|
+
# === snakecase_and_prepend_first_name_and_lib
|
702
519
|
#
|
703
|
-
# This
|
704
|
-
#
|
705
|
-
# a local file, if we are on a roebe-system.
|
520
|
+
# This combines snakecase() by also prepending the first-name
|
521
|
+
# and "lib/" prefix.
|
706
522
|
# ========================================================================= #
|
707
|
-
def
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
i.squeeze!('/')
|
523
|
+
def snakecase_and_prepend_first_name_and_lib(i)
|
524
|
+
if i.include? '::'
|
525
|
+
splitted = i.split('::')
|
526
|
+
first_name = splitted.first.downcase
|
712
527
|
end
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
opnn; e ' `'+steelblue(points_at)+'`.'
|
726
|
-
i = points_at
|
727
|
-
end
|
728
|
-
end
|
528
|
+
i = snakecase(i)
|
529
|
+
return first_name+'/lib/'+i
|
530
|
+
end
|
531
|
+
|
532
|
+
# ========================================================================= #
|
533
|
+
# === replace_localhost_with_data
|
534
|
+
# ========================================================================= #
|
535
|
+
def replace_localhost_with_data(i)
|
536
|
+
if i.include? 'programming'
|
537
|
+
return i.sub('localhost',HOME_DIRECTORY_OF_USER_X)
|
538
|
+
else
|
539
|
+
return i.sub('localhost',"#{HOME_DIRECTORY_OF_USER_X}data/")
|
729
540
|
end
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
541
|
+
end
|
542
|
+
|
543
|
+
# ========================================================================= #
|
544
|
+
# === try_to_find_files_based_on_hyphens_as_part_of_the_input
|
545
|
+
#
|
546
|
+
# This method will try to find files based on '::' input.'
|
547
|
+
# ========================================================================= #
|
548
|
+
def try_to_find_files_based_on_hyphens_as_part_of_the_input(i)
|
549
|
+
if i.include? '::'
|
550
|
+
# ===================================================================== #
|
551
|
+
# In this case, replace '::', after passing it through the
|
552
|
+
# snakecase() method.
|
553
|
+
# ===================================================================== #
|
554
|
+
i = snakecase_and_prepend_first_name_and_lib(i).tr('::','/')+'/'
|
740
555
|
end
|
741
|
-
|
742
|
-
|
556
|
+
unless i.start_with?('/home')
|
557
|
+
# ===================================================================== #
|
558
|
+
# We assume that only ruby files follow the '::' layout, for now. (Jun 2017)
|
559
|
+
# ===================================================================== #
|
560
|
+
i.prepend('$RUBY_SRC/')
|
743
561
|
end
|
744
|
-
if i.include? '
|
745
|
-
i =
|
562
|
+
if i.include? '$'
|
563
|
+
i = convert_global_env(i)
|
746
564
|
end
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
File.directory?(Roebe.log_dir?) and
|
751
|
-
is_on_roebe?
|
752
|
-
into = Roebe.log_dir?+'opened_files.yml'
|
753
|
-
if File.exist? into
|
754
|
-
array = YAML.load_file(into)
|
755
|
-
else
|
756
|
-
array = [into].flatten.compact
|
757
|
-
end
|
758
|
-
what = YAML.dump(array)
|
759
|
-
SaveFile.write_what_into(what, into)
|
565
|
+
i.squeeze!('/')
|
566
|
+
unless i.end_with?('*')
|
567
|
+
i << '*'
|
760
568
|
end
|
569
|
+
these_files = Dir[i]
|
570
|
+
open_these_files(these_files)
|
761
571
|
end
|
762
572
|
|
763
573
|
# ========================================================================= #
|
764
|
-
# ===
|
574
|
+
# === is_bluefish_running?
|
765
575
|
# ========================================================================= #
|
766
|
-
def
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
esystem 'qdbus org.kde.konsole-`pidof -s konsole` /Sessions/3 runCommand "ata"'
|
771
|
-
esystem 'qdbus org.kde.konsole-`pidof -s konsole` /Sessions/4 runCommand "ata"'
|
576
|
+
def is_bluefish_running?
|
577
|
+
`ps ax | grep bluefish`.split("\n").reject {|entry|
|
578
|
+
entry.include? 'grep'
|
579
|
+
}.size > 0
|
772
580
|
end
|
773
581
|
|
774
582
|
# ========================================================================= #
|
775
|
-
# ===
|
583
|
+
# === start_bluefish
|
776
584
|
#
|
777
|
-
# This method can be used to
|
778
|
-
#
|
585
|
+
# This method can be used to start the bluefish-editor.
|
586
|
+
# ========================================================================= #
|
587
|
+
def start_bluefish
|
588
|
+
esystem 'bluefish &'
|
589
|
+
end
|
590
|
+
|
591
|
+
# ========================================================================= #
|
592
|
+
# === check_whether_the_user_has_provided_any_input
|
593
|
+
# ========================================================================= #
|
594
|
+
def check_whether_the_user_has_provided_any_input
|
595
|
+
_ = input_files?
|
596
|
+
local_files = Dir['*'].select {|entry| File.file? entry }
|
597
|
+
if _.empty? and !local_files.empty? and (local_files.size == 1)
|
598
|
+
# ===================================================================== #
|
599
|
+
# Handle the case where no specific input was given, but only
|
600
|
+
# one file exists in the local directory.
|
601
|
+
# ===================================================================== #
|
602
|
+
set_input_files(local_files.first)
|
603
|
+
_ = input_files?
|
604
|
+
end
|
605
|
+
if _.empty?
|
606
|
+
if is_on_roebe? and !is_bluefish_running?
|
607
|
+
opne 'Starting bluefish now, as we are on a roebe-system and'
|
608
|
+
opne 'bluefish is currently not running.'
|
609
|
+
start_bluefish
|
610
|
+
else
|
611
|
+
opne tomato('Please provide at the least one argument - the '\
|
612
|
+
'file you wish to open.')
|
613
|
+
exit
|
614
|
+
end
|
615
|
+
end
|
616
|
+
end
|
617
|
+
|
618
|
+
# ========================================================================= #
|
619
|
+
# === general_open_functionality
|
779
620
|
#
|
780
|
-
#
|
781
|
-
# if
|
782
|
-
#
|
621
|
+
# This method will act based on the extension name of the file usually -
|
622
|
+
# or, if not applicable, it will simply open this in the default,
|
623
|
+
# designated editor.
|
783
624
|
# ========================================================================= #
|
784
|
-
def
|
785
|
-
|
625
|
+
def general_open_functionality(i)
|
626
|
+
extname = File.extname(i).delete('.').downcase
|
627
|
+
case extname # case tag
|
786
628
|
# ======================================================================= #
|
787
|
-
#
|
788
|
-
# file at hand. The reason for this is because this makes it easier
|
789
|
-
# to know which files are open, and we can store these file paths
|
790
|
-
# into a local file (such as a .yml file), and then use this at a
|
791
|
-
# later time to restore all .pdf files that were open. This thus
|
792
|
-
# constitutes some type of "session management".
|
629
|
+
# === Extensions that can be opened in the editor
|
793
630
|
# ======================================================================= #
|
794
|
-
|
795
|
-
|
796
|
-
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
631
|
+
when *ARRAY_EXTENSIONS_THAT_CAN_BE_OPENED_IN_THE_EDITOR
|
632
|
+
open_in_browser_or_in_editor(i)
|
633
|
+
# ======================================================================= #
|
634
|
+
# === torrent
|
635
|
+
# ======================================================================= #
|
636
|
+
when 'torrent'
|
637
|
+
open_this_torrent_file(i)
|
638
|
+
# ======================================================================= #
|
639
|
+
# === All registered images
|
640
|
+
# ======================================================================= #
|
641
|
+
when *ARRAY_IMAGES
|
642
|
+
open_in_gimp(i)
|
643
|
+
# ======================================================================= #
|
644
|
+
# === All libreoffice extensions
|
645
|
+
# ======================================================================= #
|
646
|
+
when *ARRAY_LIBREOFFICE_EXTENSIONS
|
647
|
+
open_in_office(i)
|
648
|
+
# ======================================================================= #
|
649
|
+
# === epub
|
650
|
+
# ======================================================================= #
|
651
|
+
when 'epub'
|
652
|
+
esystem "okular #{i} &"
|
653
|
+
# ======================================================================= #
|
654
|
+
# === open .pdf files
|
655
|
+
# ======================================================================= #
|
656
|
+
when 'pdf'
|
657
|
+
open_in_pdf_viewer(i)
|
658
|
+
# ======================================================================= #
|
659
|
+
# === All videos will enter here
|
660
|
+
# ======================================================================= #
|
661
|
+
when *ARRAY_VIDEOS
|
662
|
+
play_multimedia_file(i)
|
663
|
+
else
|
664
|
+
if File.exist? i
|
665
|
+
opne "#{rev}Not registered extension `#{sfancy(i)}#{rev}`."
|
666
|
+
opne 'We will attempt to open it anyway though.'
|
667
|
+
open_in_browser_or_in_editor(i)
|
668
|
+
else # else we conclude that the file does not exist.
|
669
|
+
no_file_was_found_at(i)
|
670
|
+
end
|
671
|
+
end
|
672
|
+
end; alias try_to_open_this_file_in_the_editor general_open_functionality # === try_to_open_this_file_in_the_editor
|
673
|
+
|
674
|
+
# ========================================================================= #
|
675
|
+
# === open_in_browser_or_in_editor
|
676
|
+
#
|
677
|
+
# This method was required because sometimes we wish to open in the
|
678
|
+
# browser, and sometimes we wish to open in the editor.
|
679
|
+
# ========================================================================= #
|
680
|
+
def open_in_browser_or_in_editor(i)
|
681
|
+
if i.include? '//'
|
682
|
+
i = i.dup if i.frozen?
|
683
|
+
i = rds(i)
|
684
|
+
end
|
685
|
+
# ======================================================================= #
|
686
|
+
# Next, we get the extension name.
|
687
|
+
# ======================================================================= #
|
688
|
+
_ = File.extname(File.basename(i)).delete '.'
|
689
|
+
case _
|
690
|
+
when 'html','php' # Open in both, editor and browser, in this case.
|
691
|
+
do_open_in_editor(i)
|
692
|
+
unless File.zero? i
|
693
|
+
::Open.in_browser(i) unless _.include? 'php'
|
813
694
|
end
|
814
|
-
PdfParadise.main_pdf(i) {{
|
815
|
-
open_via_fullscreen: @open_via_fullscreen
|
816
|
-
}}
|
817
|
-
register_this_pdf_file(i)
|
818
695
|
else
|
819
|
-
|
696
|
+
do_open_in_editor(i)
|
820
697
|
end
|
821
698
|
end
|
822
699
|
|
@@ -837,79 +714,135 @@ class Open < ::Open::Base # === Open::Open
|
|
837
714
|
end
|
838
715
|
|
839
716
|
# ========================================================================= #
|
840
|
-
# ===
|
717
|
+
# === run_rcfiles_then_run_ata_via_qdbus
|
841
718
|
# ========================================================================= #
|
842
|
-
def
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
'Show which browser is the currently assigned one.'
|
849
|
-
e
|
719
|
+
def run_rcfiles_then_run_ata_via_qdbus
|
720
|
+
require 'rcfiles'
|
721
|
+
Rcfiles.run
|
722
|
+
esystem 'qdbus org.kde.konsole-`pidof -s konsole` /Sessions/2 runCommand "ata"'
|
723
|
+
esystem 'qdbus org.kde.konsole-`pidof -s konsole` /Sessions/3 runCommand "ata"'
|
724
|
+
esystem 'qdbus org.kde.konsole-`pidof -s konsole` /Sessions/4 runCommand "ata"'
|
850
725
|
end
|
851
726
|
|
852
727
|
# ========================================================================= #
|
853
|
-
# ===
|
728
|
+
# === sanitize_the_commandline_arguments
|
854
729
|
# ========================================================================= #
|
855
|
-
def
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
|
730
|
+
def sanitize_the_commandline_arguments
|
731
|
+
@commandline_arguments.flatten!
|
732
|
+
@commandline_arguments.map! {|entry|
|
733
|
+
case entry
|
734
|
+
when '*'
|
735
|
+
entry = Dir['*']
|
736
|
+
end
|
737
|
+
entry
|
738
|
+
}
|
739
|
+
@commandline_arguments.flatten!
|
740
|
+
end
|
741
|
+
|
742
|
+
# ========================================================================= #
|
743
|
+
# === run (run tag)
|
744
|
+
# ========================================================================= #
|
745
|
+
def run
|
746
|
+
sanitize_the_commandline_arguments
|
747
|
+
# @internal_hash[:open_these_elements] << joined_and_stripped_commandline_arguments
|
748
|
+
@internal_hash[:open_these_elements] << commandline_arguments_without_hyphens
|
749
|
+
remove_empty_entries
|
750
|
+
check_whether_the_user_has_provided_any_input
|
751
|
+
try_to_require_the_studium_project
|
752
|
+
try_to_require_the_beautiful_url_project
|
753
|
+
menu # Now we can pass this into the main menu here.
|
754
|
+
array = [@internal_hash[:open_these_elements]].flatten.compact
|
755
|
+
array.each {|_|
|
756
|
+
_ = _.to_s.dup # Always work on a String-copy past this point.
|
757
|
+
# ===================================================================== #
|
758
|
+
# Check whether the input includes the ':' character - but this may
|
759
|
+
# have two different use cases. The first one is to check for a
|
760
|
+
# shortcut entry; the second will just ignore the part after ':'.
|
761
|
+
# ===================================================================== #
|
762
|
+
if _.start_with? ':'
|
763
|
+
open_in_editor(_)
|
764
|
+
return
|
765
|
+
end
|
766
|
+
if _.include?(':') and
|
767
|
+
!File.exist?(_) and
|
768
|
+
File.exist?(_.split(':').first.to_s)
|
769
|
+
_ = _.split(':').first.to_s
|
770
|
+
end
|
862
771
|
# ===================================================================== #
|
863
|
-
#
|
772
|
+
# Next, we handle input such as:
|
773
|
+
#
|
774
|
+
# 'lib/lpc/requires/basic_requires.rb:begin'
|
775
|
+
#
|
776
|
+
# This evidently does not end with a ':' character, but it clearly
|
777
|
+
# has a fairly useless ':' component in it. If that is the case,
|
778
|
+
# we will treat this as input that is only valid up towards the
|
779
|
+
# very right ':', anchored on the '.rb:' part.
|
864
780
|
# ===================================================================== #
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
781
|
+
if _.include? '.rb:'
|
782
|
+
# =================================================================== #
|
783
|
+
# The following code means to find the index at '.rb:' and then add
|
784
|
+
# 2 to it - this should be the correct name of the entry at hand.
|
785
|
+
# =================================================================== #
|
786
|
+
_ = _[0 .. (_.index('.rb:')+2)]
|
787
|
+
end
|
788
|
+
unless File.exist? _
|
789
|
+
_.chop! if _.end_with? '#' # Don't need trailing '#' tokens.
|
790
|
+
_.chop! if _.end_with? ':-' # ← This check must come before the check against ':'.
|
791
|
+
_.chop! if _.end_with? ':' # Chop off trailing ':' tokens.
|
792
|
+
_.chop! if _.end_with? ';' # Chop off trailing ':' tokens.
|
793
|
+
_.delete_prefix!('http:') if _.start_with?('http:')
|
794
|
+
end
|
795
|
+
case _
|
869
796
|
# ===================================================================== #
|
870
|
-
# === open
|
797
|
+
# === open ME
|
871
798
|
# ===================================================================== #
|
872
|
-
when
|
873
|
-
|
799
|
+
when 'ME',
|
800
|
+
'SELF',
|
801
|
+
'ALL',/
|
802
|
+
^-?-?this(_|-)?file/
|
803
|
+
open_this_file_here
|
874
804
|
exit
|
805
|
+
end unless File.exist?(_)
|
806
|
+
_.delete!('^') if _.include?('^')
|
807
|
+
if _.end_with?('.') and File.exist?(_[0..-2])
|
808
|
+
# =================================================================== #
|
809
|
+
# This clause will be entered if we have input something like
|
810
|
+
# "colours.rb." where the user may have wanted to type in
|
811
|
+
# "colours.rb" - and IF the file exists.
|
812
|
+
# =================================================================== #
|
813
|
+
opne "Assuming a superfluous trailing '.', so removing "\
|
814
|
+
"the last '.' there."
|
815
|
+
_.chop!
|
875
816
|
end
|
876
|
-
end
|
877
|
-
end
|
878
|
-
|
879
|
-
# ========================================================================= #
|
880
|
-
# === try_to_require_the_beautiful_url_project
|
881
|
-
# ========================================================================= #
|
882
|
-
def try_to_require_the_beautiful_url_project
|
883
|
-
unless Object.const_defined? :BeautifulUrl
|
884
|
-
begin
|
885
|
-
require 'roebe/requires/failsafe_require_of_beautiful_url.rb'
|
886
|
-
rescue LoadError; end
|
887
|
-
end
|
888
|
-
end
|
889
|
-
|
890
|
-
# ========================================================================= #
|
891
|
-
# === run_everything
|
892
|
-
# ========================================================================= #
|
893
|
-
def run_everything
|
894
|
-
input_files = input_files?.flatten
|
895
|
-
# ======================================================================= #
|
896
|
-
# Iterate over all input files that were passed to us.
|
897
|
-
# ======================================================================= #
|
898
|
-
input_files.each {|this_file|
|
899
817
|
# ===================================================================== #
|
900
|
-
#
|
818
|
+
# Split away at '::' if this is part of that substring.
|
819
|
+
# ===================================================================== #
|
820
|
+
if _.include? '::'
|
821
|
+
splitted = _.split('::')
|
822
|
+
_ = splitted.last
|
823
|
+
end
|
901
824
|
# ===================================================================== #
|
902
|
-
|
903
|
-
|
904
|
-
|
825
|
+
# === Get rid of localhost-string parts next.
|
826
|
+
#
|
827
|
+
# Get rid of the String "localhost" next. This must be handled with
|
828
|
+
# more care, because some files may include the string 'localhost' as
|
829
|
+
# part of their name, such as 'remove_localhost.rb'. In this case,
|
830
|
+
# we will additionally check whether the file exists.
|
831
|
+
# ===================================================================== #
|
832
|
+
if _.is_a?(String) and _.include?('localhost')
|
833
|
+
unless File.exist? _ # See the above header for an explanation.
|
834
|
+
_ = replace_localhost_with_data(_)
|
835
|
+
end
|
905
836
|
end
|
906
|
-
|
907
|
-
|
837
|
+
case _
|
838
|
+
when 'LAST' # Assign the last file.
|
839
|
+
_ = find_and_return_last_file
|
908
840
|
end
|
909
841
|
# ===================================================================== #
|
910
|
-
#
|
842
|
+
# If the file exists, enter here first - thus, we will query whether
|
843
|
+
# the file exists or whether it does not.
|
911
844
|
# ===================================================================== #
|
912
|
-
if File.exist?
|
845
|
+
if File.exist? _ # This is the simplest way - the file exists here.
|
913
846
|
# =================================================================== #
|
914
847
|
# However had, in December 2022 it was noticed that a file such
|
915
848
|
# as "curricula.yml" may exist, as well as a directory called
|
@@ -917,86 +850,91 @@ class Open < ::Open::Base # === Open::Open
|
|
917
850
|
# curricula.yml rather than curricula/. So, what to do in this
|
918
851
|
# case? Well - we will do a minimal glob, that is, if a file
|
919
852
|
# exists as described above, then we will prioritize this over
|
920
|
-
# the directory name.
|
853
|
+
# the directory name and immediately open it.
|
921
854
|
# =================================================================== #
|
922
|
-
if File.directory?(
|
923
|
-
(Dir[
|
924
|
-
|
855
|
+
if File.directory?(_) and !File.file?(_) and
|
856
|
+
(Dir["#{_}*"].size > 0)
|
857
|
+
_ = Dir["#{_}*"].first.to_s # Pick a real file in this case.
|
925
858
|
end
|
926
|
-
|
927
|
-
|
928
|
-
|
859
|
+
general_open_functionality(_)
|
860
|
+
# ===================================================================== #
|
861
|
+
# === Check whether the input is an exam-question next
|
862
|
+
#
|
863
|
+
# This check should come before we delegate towards FindExpandedAlias.
|
864
|
+
#
|
865
|
+
# Invocation example:
|
866
|
+
#
|
867
|
+
# open ab2
|
868
|
+
#
|
869
|
+
# ===================================================================== #
|
870
|
+
elsif Object.const_defined?(:Studium) and
|
871
|
+
::Studium.respond_to?(:include_this_exam_topic?) and
|
872
|
+
::Studium.respond_to?(:find_corresponding_exam_topic) and
|
873
|
+
::Studium.include_this_exam_topic?(_) # open ab2
|
874
|
+
_ = ::Studium.find_corresponding_exam_topic(
|
875
|
+
::Studium.find_corresponding_exam_topic(_),
|
876
|
+
:be_quiet
|
877
|
+
) # This can be false.
|
878
|
+
if _
|
879
|
+
if is_on_roebe?
|
880
|
+
_ = Studium.my_exam_topics_directory?+File.basename(_)
|
881
|
+
else
|
882
|
+
_ = Studium.exam_topics_directory?+File.basename(_)
|
883
|
+
end
|
884
|
+
open_in_editor(_)
|
885
|
+
end
|
886
|
+
# ===================================================================== #
|
887
|
+
# === Query whether BeautifulUrl includes this file.
|
888
|
+
# ===================================================================== #
|
889
|
+
elsif BeautifulUrl.does_include?(_) # open linux
|
890
|
+
_ = beautiful_url(_)
|
891
|
+
consider_opening_the_given_input(_) # Then try again.
|
892
|
+
# ===================================================================== #
|
893
|
+
# Ok, the following else-clauses handle the situation
|
894
|
+
# that the given input could not be found.
|
895
|
+
# ===================================================================== #
|
896
|
+
elsif _.include? 'project_'
|
897
|
+
do_open_in_editor(_)
|
898
|
+
else
|
899
|
+
possible_matches = Dir[('*'+_+'*').squeeze('*')] # ← This may be an empty Array as well.
|
929
900
|
# =================================================================== #
|
930
901
|
# Since as of Jan 2018, if the variable possible_matches is NOT
|
931
902
|
# empty, we will sort it in a way so that the shorter file names
|
932
|
-
# are on top of the array.
|
903
|
+
# are on top of the array. See the following clause for that.
|
933
904
|
# =================================================================== #
|
934
905
|
unless possible_matches.empty?
|
935
906
|
possible_matches = possible_matches.sort_by {|entry| entry.size }
|
936
907
|
end
|
937
908
|
# =================================================================== #
|
938
|
-
#
|
939
|
-
#
|
940
|
-
# This check should come before we delegate towards FindExpandedAlias.
|
941
|
-
# =================================================================== #
|
942
|
-
if Object.const_defined?(:Studium) and
|
943
|
-
::Studium.respond_to?(:include_this_exam_topic?) and
|
944
|
-
::Studium.respond_to?(:find_corresponding_exam_topic) and
|
945
|
-
::Studium.include_this_exam_topic?(this_file) # open ab2
|
946
|
-
_ = ::Studium.find_corresponding_exam_topic(
|
947
|
-
::Studium.find_corresponding_exam_topic(this_file),
|
948
|
-
:be_quiet
|
949
|
-
) # This can be false.
|
950
|
-
if _
|
951
|
-
if is_on_roebe?
|
952
|
-
_ = Studium.my_exam_topics_directory?+File.basename(_)
|
953
|
-
else
|
954
|
-
_ = Studium.exam_topics_directory?+File.basename(_)
|
955
|
-
end
|
956
|
-
open_in_editor(_)
|
957
|
-
end
|
909
|
+
# At the least one entry has been found in the next case.
|
958
910
|
# =================================================================== #
|
959
|
-
#
|
960
|
-
|
961
|
-
elsif BeautifulUrl.does_include?(this_file) # open linux
|
962
|
-
_ = beautiful_url(this_file)
|
963
|
-
consider_opening_the_given_input(_) # Then try again.
|
964
|
-
# =================================================================== #
|
965
|
-
# Ok, the following else-clauses handle the situation
|
966
|
-
# that the given input could not be found.
|
967
|
-
# =================================================================== #
|
968
|
-
elsif this_file.include? 'project_'
|
969
|
-
do_open_in_editor(this_file)
|
970
|
-
# =================================================================== #
|
971
|
-
# At the least one entry has been found.
|
972
|
-
# =================================================================== #
|
973
|
-
elsif ((_ = possible_matches).size > 0) # If we can find at least one entry.
|
974
|
-
consider_opening_the_given_input(_.first) # Recursive call.
|
911
|
+
if (possible_matches.size > 0) # If we can find at least one entry.
|
912
|
+
consider_opening_the_given_input(possible_matches.first) # Recursive call here.
|
975
913
|
# =================================================================== #
|
976
914
|
# Same as above, but both prepend and append a '*' character.
|
977
915
|
# =================================================================== #
|
978
|
-
elsif (
|
979
|
-
consider_opening_the_given_input(
|
916
|
+
elsif (possible_matches.size > 0) # If we can find at least one entry.
|
917
|
+
consider_opening_the_given_input(possible_matches.first)
|
980
918
|
# =================================================================== #
|
981
919
|
# Next, try to pass it through class Roebe::FindExpandedAlias.
|
982
920
|
# =================================================================== #
|
983
|
-
elsif File.exist?(
|
984
|
-
open_in_editor(
|
921
|
+
elsif File.exist?(more_matches = Roebe.find_expanded_alias(_).to_s)
|
922
|
+
open_in_editor(more_matches)
|
985
923
|
# =================================================================== #
|
986
924
|
# Next, try to handle input containing two ':' tokens.
|
987
925
|
# =================================================================== #
|
988
|
-
elsif
|
989
|
-
try_to_find_files_based_on_hyphens_as_part_of_the_input(
|
926
|
+
elsif _.include?('::')
|
927
|
+
try_to_find_files_based_on_hyphens_as_part_of_the_input(_)
|
990
928
|
# =================================================================== #
|
991
929
|
# Use RUBY_SRC as shortcut on my home system.
|
992
930
|
# =================================================================== #
|
993
931
|
elsif is_on_roebe? and
|
994
|
-
File.exist?(return_assumed_path_to_ruby_src_lib_of(
|
995
|
-
use_this_file_instead = return_assumed_path_to_ruby_src_lib_of(
|
996
|
-
|
997
|
-
|
998
|
-
|
999
|
-
|
932
|
+
File.exist?(return_assumed_path_to_ruby_src_lib_of(_))
|
933
|
+
use_this_file_instead = return_assumed_path_to_ruby_src_lib_of(_)
|
934
|
+
opne "#{rev}Since we are on roebe, we will use another path, aka"
|
935
|
+
opne
|
936
|
+
opne " #{steelblue(use_this_file_instead)}"
|
937
|
+
opne
|
1000
938
|
open_in_editor(use_this_file_instead)
|
1001
939
|
# =================================================================== #
|
1002
940
|
# === Check for aliases next
|
@@ -1004,30 +942,29 @@ class Open < ::Open::Base # === Open::Open
|
|
1004
942
|
# Next, try to find an expanded alias here.
|
1005
943
|
# =================================================================== #
|
1006
944
|
elsif Roebe.const_defined?(:FindExpandedAlias) and
|
1007
|
-
(::Roebe::FindExpandedAlias[
|
1008
|
-
do_open_in_editor(
|
945
|
+
(::Roebe::FindExpandedAlias[_] != _)
|
946
|
+
do_open_in_editor(_)
|
1009
947
|
else
|
1010
|
-
|
948
|
+
# ================================================================= #
|
949
|
+
# Alright - the file was not found via the above checks, so we
|
950
|
+
# will simply delegate towards Open.in_browser() next.
|
951
|
+
# ================================================================= #
|
952
|
+
# Or we could notify the user that no entry was found:
|
953
|
+
# opne "No match could be found for `#{sfancy(_)}`."
|
954
|
+
# ================================================================= #
|
955
|
+
::Open.in_browser(_)
|
1011
956
|
end
|
1012
957
|
end
|
1013
958
|
}
|
1014
959
|
end
|
1015
960
|
|
1016
|
-
# ========================================================================= #
|
1017
|
-
# === run (run tag)
|
1018
|
-
# ========================================================================= #
|
1019
|
-
def run
|
1020
|
-
check_whether_the_user_has_provided_any_input
|
1021
|
-
try_to_require_the_studium_project
|
1022
|
-
try_to_require_the_beautiful_url_project
|
1023
|
-
menu
|
1024
|
-
run_everything
|
1025
|
-
end
|
1026
|
-
|
1027
961
|
# ========================================================================= #
|
1028
962
|
# === Open::Open[]
|
1029
963
|
# ========================================================================= #
|
1030
|
-
def self.[](
|
964
|
+
def self.[](
|
965
|
+
i = ARGV,
|
966
|
+
&block
|
967
|
+
)
|
1031
968
|
new(i, &block) # Always delegate here.
|
1032
969
|
end
|
1033
970
|
|
@@ -1036,15 +973,20 @@ end
|
|
1036
973
|
# =========================================================================== #
|
1037
974
|
# === Open.open
|
1038
975
|
# =========================================================================== #
|
1039
|
-
def self.open(
|
976
|
+
def self.open(
|
977
|
+
i = ARGV, &block
|
978
|
+
)
|
1040
979
|
::Open::Open.new(i, &block)
|
1041
980
|
end; self.instance_eval { alias [] open } # === Open[]
|
1042
981
|
|
1043
982
|
# =========================================================================== #
|
1044
983
|
# === Open.pdf_viewer?
|
984
|
+
#
|
985
|
+
# This method can be used to query the pdf-viewer in use.
|
1045
986
|
# =========================================================================== #
|
1046
987
|
def self.pdf_viewer?
|
1047
|
-
unless (Object.const_defined?(:PdfParadise) and
|
988
|
+
unless (Object.const_defined?(:PdfParadise) and
|
989
|
+
PdfParadise.const_defined?(:MainPdf))
|
1048
990
|
require 'pdf_paradise/main_pdf/main_pdf.rb'
|
1049
991
|
end
|
1050
992
|
return ::PdfParadise.use_which_pdf_viewer?
|
@@ -1054,4 +996,4 @@ end
|
|
1054
996
|
|
1055
997
|
if __FILE__ == $PROGRAM_NAME
|
1056
998
|
Open::Open.new(ARGV)
|
1057
|
-
end # open
|
999
|
+
end # ruby open.rb local_ginger
|