print-scorm 1.0.0
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 +7 -0
- data/bin/print-scorm +50 -0
- data/lib/print-scorm.rb +156 -0
- metadata +85 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a227289c6807c1704f5e32f07045cbfc284023164d4e01c51eb9c6867b5c802b
|
4
|
+
data.tar.gz: 8a0541c4a75fc58ffb2df6259f9967358eb79fb199b0072de504d791befde566
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cf4a0fb7e3ceb285445e1ef3a53ed633f3e10d072bd61b6dfde44159ffcfa966966d752ccc584e29cbdb512b3c180d4c1f6e2d26a1ba660523a051cad5c05dd6
|
7
|
+
data.tar.gz: 571ebb506f44d135e01bb016dc7970efc6f53bf750a4e1af3f7f7cc77f21cee7ddb4890bce05b75d1076472bc66f97d5f1a357468c2a2ea8e3f89209b0659c9c
|
data/bin/print-scorm
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require_relative "../lib/print-scorm"
|
4
|
+
|
5
|
+
output = nil
|
6
|
+
input = nil
|
7
|
+
skip_existing = false
|
8
|
+
|
9
|
+
Selenium::WebDriver::Firefox.path = "/usr/bin/firefox-beta"
|
10
|
+
OptionParser.new do |opts|
|
11
|
+
opts.banner = "Exports SCROM packages to PDF"
|
12
|
+
|
13
|
+
opts.on("-ffirefox", "--firefox=firefox", "Path to firefox binary executable") do |firefox|
|
14
|
+
unless FileTest.file?(firefox)
|
15
|
+
warn "The specified Firefox path is not a file: #{firefox}"
|
16
|
+
exit -1
|
17
|
+
end
|
18
|
+
|
19
|
+
Selenium::WebDriver::Firefox.path = firefox
|
20
|
+
end
|
21
|
+
|
22
|
+
opts.on("-oOUTPUT", "--output=OUTPUT", "Path to output PDF file") do |out|
|
23
|
+
output = out
|
24
|
+
end
|
25
|
+
|
26
|
+
opts.on("-iINPUT", "--input=INPUT", "Path to input ZIP file") do |inp|
|
27
|
+
input = inp
|
28
|
+
end
|
29
|
+
|
30
|
+
opts.on("-F", "--force", "Does not skip existing files") do |f|
|
31
|
+
skip_existing = true
|
32
|
+
end
|
33
|
+
|
34
|
+
opts.on("-h", "--help", "Prints this help") do
|
35
|
+
puts opts
|
36
|
+
exit
|
37
|
+
end
|
38
|
+
end.parse!(ARGV)
|
39
|
+
|
40
|
+
if !output || !output.end_with?(".pdf")
|
41
|
+
warn "The output file must be a PDF file: #{output}"
|
42
|
+
exit -1
|
43
|
+
end
|
44
|
+
|
45
|
+
if !input || !input.end_with?(".zip")
|
46
|
+
warn "The input file must be a valid ZIP file: #{input}"
|
47
|
+
exit -1
|
48
|
+
end
|
49
|
+
|
50
|
+
ExportSCROM.new(skip_existing).run(input, output)
|
data/lib/print-scorm.rb
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
require "optparse"
|
2
|
+
require "watir"
|
3
|
+
require "watir-scroll"
|
4
|
+
|
5
|
+
class ExportSCROM
|
6
|
+
MAX_SLEEPTIME = 1.1
|
7
|
+
MAX_TIMEOUT = 60
|
8
|
+
ACCORDION_ID = "ui-accordion-infoHolder-header-"
|
9
|
+
|
10
|
+
@@browser = nil
|
11
|
+
|
12
|
+
def initialize(skip_existing=true)
|
13
|
+
super()
|
14
|
+
@skip_existing = skip_existing
|
15
|
+
end
|
16
|
+
|
17
|
+
def browser
|
18
|
+
return @@browser
|
19
|
+
end
|
20
|
+
|
21
|
+
def run(zipfile, target_name)
|
22
|
+
@@browser = Watir::Browser.new :firefox unless @@browser
|
23
|
+
zipfile = File.join(Dir.pwd, zipfile) unless zipfile.start_with? "/"
|
24
|
+
directory = File.dirname(zipfile)
|
25
|
+
|
26
|
+
if @skip_existing && FileTest.exists?(target_name)
|
27
|
+
puts "Skipping the already existing `#{target_name}`"
|
28
|
+
return nil
|
29
|
+
end
|
30
|
+
|
31
|
+
tempdir = File.join(directory, "__tmp")
|
32
|
+
p tempdir
|
33
|
+
`rm -r "#{tempdir}"` if FileTest.exist? tempdir
|
34
|
+
`mkdir -p "#{tempdir}"`
|
35
|
+
`unzip "#{zipfile}" -d "#{tempdir}"`
|
36
|
+
|
37
|
+
b = @@browser
|
38
|
+
b.window.resize_to 1200, 900
|
39
|
+
b.goto "file://"+tempdir+"/scorm2004RLO.htm"
|
40
|
+
b.alert.ok #Ok to the alert
|
41
|
+
|
42
|
+
if b.html.include? "This project does not contain any pages."
|
43
|
+
return nil
|
44
|
+
end
|
45
|
+
|
46
|
+
begin
|
47
|
+
b.button(title: "Full Screen").click
|
48
|
+
rescue
|
49
|
+
puts "No fullscreen button!!"
|
50
|
+
end
|
51
|
+
|
52
|
+
sleep 1
|
53
|
+
all_screenshots = []
|
54
|
+
page_index = 0
|
55
|
+
screenshot(tempdir, page_index, b, all_screenshots)
|
56
|
+
|
57
|
+
while b.button(id: "x_nextBtn").enabled?
|
58
|
+
b.button(id: "x_nextBtn").click #fullscreen
|
59
|
+
sleep MAX_SLEEPTIME
|
60
|
+
|
61
|
+
# Wait for bullets to load
|
62
|
+
start_time = Time.now
|
63
|
+
while !all_bullets_loaded(b) && (Time.now - start_time < MAX_TIMEOUT)
|
64
|
+
sleep 1
|
65
|
+
end
|
66
|
+
|
67
|
+
page_index += 1
|
68
|
+
last_screenshot = screenshot(tempdir, page_index, b, all_screenshots)
|
69
|
+
skip_click = false
|
70
|
+
while b.button(id: "nextBtn").exists? && b.button(id: "nextBtn").enabled?
|
71
|
+
unless skip_click
|
72
|
+
b.button(id: "nextBtn").click #fullscreen
|
73
|
+
else
|
74
|
+
skip_click = false
|
75
|
+
end
|
76
|
+
sleep MAX_SLEEPTIME
|
77
|
+
|
78
|
+
page_index += 1
|
79
|
+
new_screenshot = screenshot(tempdir, page_index, b, all_screenshots)
|
80
|
+
|
81
|
+
if new_screenshot[:hash] == last_screenshot[:hash]
|
82
|
+
puts "Loop detected. Avoiding..."
|
83
|
+
page_index -= 1
|
84
|
+
all_screenshots.pop
|
85
|
+
break
|
86
|
+
else
|
87
|
+
last_screenshot = new_screenshot
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
accordion_id = 1
|
92
|
+
accordion_button = b.h3(id: ACCORDION_ID + accordion_id.to_s)
|
93
|
+
while accordion_button.exists?
|
94
|
+
accordion_button.click
|
95
|
+
sleep MAX_SLEEPTIME
|
96
|
+
|
97
|
+
page_index += 1
|
98
|
+
new_screenshot = screenshot(tempdir, page_index, b, all_screenshots)
|
99
|
+
|
100
|
+
accordion_id += 1
|
101
|
+
accordion_button = b.h3(id: ACCORDION_ID + accordion_id.to_s)
|
102
|
+
end
|
103
|
+
|
104
|
+
oldScroll = @@browser.execute_script("return document.getElementById('x_pageHolder').scrollTop")
|
105
|
+
i = 1
|
106
|
+
loop do
|
107
|
+
b.execute_script "document.getElementById('x_pageHolder').scrollTo(0, document.getElementById('x_pageHolder').clientHeight*#{i})"
|
108
|
+
|
109
|
+
newScroll = @@browser.execute_script("return document.getElementById('x_pageHolder').scrollTop")
|
110
|
+
|
111
|
+
break if oldScroll == newScroll
|
112
|
+
|
113
|
+
sleep 0.5
|
114
|
+
page_index += 1
|
115
|
+
screenshot(tempdir, page_index, b, all_screenshots)
|
116
|
+
|
117
|
+
oldScroll = newScroll
|
118
|
+
i += 1
|
119
|
+
end
|
120
|
+
|
121
|
+
go_ahead_buttons = b.buttons(class: "ui-button-text-only")
|
122
|
+
if go_ahead_buttons.size > 0
|
123
|
+
if b.html.include? "<h2 aria-live=\"assertive\">Sommario</h2>"
|
124
|
+
go_ahead_buttons[0].click
|
125
|
+
skip_click = true
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
`convert #{all_screenshots.join(" ")} "#{target_name}"`
|
131
|
+
`rm -r "#{tempdir}"`
|
132
|
+
end
|
133
|
+
|
134
|
+
def all_bullets_loaded(b)
|
135
|
+
all_loaded = true
|
136
|
+
b.ps(class: "bullet").map do |bullet|
|
137
|
+
all_loaded = all_loaded && bullet.visible?
|
138
|
+
end
|
139
|
+
|
140
|
+
b.lis(class: "bullet").map do |bullet|
|
141
|
+
all_loaded = all_loaded && bullet.visible?
|
142
|
+
end
|
143
|
+
return all_loaded
|
144
|
+
end
|
145
|
+
|
146
|
+
def screenshot(tempdir, page_index, b, all_screenshots)
|
147
|
+
fname = File.join(tempdir, "page#{page_index}.png")
|
148
|
+
b.screenshot.save(fname)
|
149
|
+
all_screenshots.push "\"#{fname}\""
|
150
|
+
|
151
|
+
return {
|
152
|
+
name: fname,
|
153
|
+
hash: `md5sum "#{fname}"`.split(" ")[0]
|
154
|
+
}
|
155
|
+
end
|
156
|
+
end
|
metadata
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: print-scorm
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Simone Scalabrino
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-03-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: watir
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 6.16.5
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 6.16.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 6.16.5
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 6.16.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: watir-scroll
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 0.4.0
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 0.4.0
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 0.4.0
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 0.4.0
|
53
|
+
description: Exports SCORM packages to PDF
|
54
|
+
email: s.scalabrino9@gmail.com
|
55
|
+
executables:
|
56
|
+
- print-scorm
|
57
|
+
extensions: []
|
58
|
+
extra_rdoc_files: []
|
59
|
+
files:
|
60
|
+
- bin/print-scorm
|
61
|
+
- lib/print-scorm.rb
|
62
|
+
homepage: https://github.com/intersimone999/print-scorm
|
63
|
+
licenses:
|
64
|
+
- GPL-3.0
|
65
|
+
metadata: {}
|
66
|
+
post_install_message:
|
67
|
+
rdoc_options: []
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
requirements: []
|
81
|
+
rubygems_version: 3.1.2
|
82
|
+
signing_key:
|
83
|
+
specification_version: 4
|
84
|
+
summary: Exports SCORM packages to PDF
|
85
|
+
test_files: []
|