class Senkyoshi::ScormPackage
Attributes
entries[RW]
manifest[RW]
points_possible[RW]
Public Class Methods
correct_path(path, scorm_path)
click to toggle source
Returns file path with relative path to scorm package removed
# File lib/senkyoshi/models/scorm_package.rb, line 107 def self.correct_path(path, scorm_path) corrected = path.gsub(scorm_path, "") corrected.slice(1, corrected.size) if corrected.start_with? "/" end
find_scorm_item_paths(zip_file)
click to toggle source
Returns paths to scormItem files
# File lib/senkyoshi/models/scorm_package.rb, line 44 def self.find_scorm_item_paths(zip_file) Nokogiri::XML.parse( Senkyoshi.read_file(zip_file, "imsmanifest.xml"), ). xpath("//resource[@type='resource/x-plugin-scormengine']"). map { |r| r.xpath("./@bb:file").text } rescue Exceptions::MissingFileError => e if zip_file STDERR.puts "Blackboard export manifest file missing: #{zip_file.name}" end STDERR.puts e.to_s [] end
find_scorm_items(zip_file)
click to toggle source
Returns array of parsed scormItem files
# File lib/senkyoshi/models/scorm_package.rb, line 62 def self.find_scorm_items(zip_file) find_scorm_item_paths(zip_file).map do |path| Nokogiri::XML.parse Senkyoshi.read_file(zip_file, path) end end
find_scorm_manifest(zip_file, scorm_item)
click to toggle source
Returns the zip file entry for the scorm package manifest, given a scormItem file
# File lib/senkyoshi/models/scorm_package.rb, line 72 def self.find_scorm_manifest(zip_file, scorm_item) path = scorm_item.xpath("/scormItem/@mappedContentId").text zip_file.get_entry("#{path}/imsmanifest.xml") end
find_scorm_manifests(zip_file)
click to toggle source
Returns array of all scorm manifest files inside of blackboard export
# File lib/senkyoshi/models/scorm_package.rb, line 80 def self.find_scorm_manifests(zip_file) find_scorm_items(zip_file).map do |scorm_item| find_scorm_manifest(zip_file, scorm_item) end end
find_scorm_paths(zip_file)
click to toggle source
Returns array of paths to scorm packages
# File lib/senkyoshi/models/scorm_package.rb, line 89 def self.find_scorm_paths(zip_file) manifests = ScormPackage.find_scorm_manifests(zip_file) manifests.map { |manifest| File.dirname(manifest.name) } end
get_entries(zip_file, manifest)
click to toggle source
Returns array of all zip file entries that belong in scorm package
# File lib/senkyoshi/models/scorm_package.rb, line 97 def self.get_entries(zip_file, manifest) zip_file.entries.select do |e| File.dirname(e.name).start_with?(File.dirname(manifest.name)) && !e.directory? end end
get_scorm_packages(blackboard_export)
click to toggle source
Extracts scorm packages from a blackboard export zip file
# File lib/senkyoshi/models/scorm_package.rb, line 33 def self.get_scorm_packages(blackboard_export) find_scorm_items(blackboard_export). map do |item| manifest_entry = find_scorm_manifest(blackboard_export, item) ScormPackage.new blackboard_export, manifest_entry, item end end
new(zip_file, manifest, scorm_item = nil)
click to toggle source
# File lib/senkyoshi/models/scorm_package.rb, line 20 def initialize(zip_file, manifest, scorm_item = nil) @manifest = manifest @entries = ScormPackage.get_entries zip_file, manifest @points_possible = if scorm_item scorm_item.xpath( "/scormItem/gradebookInfo/@pointsPossible", ).text end end
Public Instance Methods
cleanup()
click to toggle source
Removes all temp files if they exist
# File lib/senkyoshi/models/scorm_package.rb, line 137 def cleanup FileUtils.rm_r @dir unless @dir.nil? end
write_zip(export_name)
click to toggle source
Writes all entries to a zip file in a temporary directory and returns location of temporary file
# File lib/senkyoshi/models/scorm_package.rb, line 116 def write_zip(export_name) @dir ||= Dir.mktmpdir scorm_path = File.dirname @manifest.name path = "#{@dir}/#{export_name}" Zip::File.open path, Zip::File::CREATE do |zip| @entries.each do |entry| if entry.file? zip.get_output_stream( ScormPackage.correct_path(entry.name, scorm_path), ) do |file| file.write(entry.get_input_stream.read) end end end end path end