module LP::Exporter

Exporter module

Constants

VERSION

Version

Public Class Methods

export(path, entry, lang = false) click to toggle source

Export strings from file to YAML @param [String] path path to output location @param [Array] entry info about file @param [Boolean] lang if should use language name rather than LangID

# File lib/lp/exporter.rb, line 76
def self.export(path, entry, lang = false)
    filepath = File.join(path, entry.first)+'.yaml'
    data = {}
    data = YAML.load_file(filepath) if File.exists?(filepath)
    langName = entry[1]
    File.open(entry.last, 'rb') do |file|
        PEdump.new(file).strings.each do |str|
            langName = str.lang unless lang
            data[langName] ||= {}
            data[langName][str.id] = str.value
        end
    end
    File.write(filepath, Hash[data.to_a.sort_by { |d| d.first } ].to_yaml)
end
extract(cab, files, dir) click to toggle source

Extract cab @param [String] cab filename of cab @param [Array] files list of names for files to match from cab @param [String] dir path to directory where keep extracted cab files @return [Hash] Info about extracted files

# File lib/lp/exporter.rb, line 33
def self.extract(cab, files, dir)
    decompressor = LibMsPack::CabDecompressor.new
    cab = decompressor.open(cab)
    file = cab.files
    fileList = {}
    begin
        pathname = file.getFilename.gsub('\\', '/')
        path = Pathname.new(pathname)
        next unless path.extname == '.mui'
        realname = path.basename('.*')
        found = (files.count == 0)
        files.each do |str|
            if realname.fnmatch?(str + '*', File::FNM_DOTMATCH | File::FNM_PATHNAME | File::FNM_CASEFOLD)
                found = true
                break
            end
        end
        next unless found
        nameparts = realname.to_s.split('.')
        base = nameparts.first
        namelen = nameparts.length
        namelen -= 1 if nameparts[-1] == 'dll'
        name = nameparts[0, namelen].join('.')
        data = path.dirname.basename.to_s.split('_')
        arch = data[0]
        lang = data[-2]
        newName = [lang, arch, realname].join('_')

        location = File.join(dir, base, newName)
        fileList[base] ||= []
        fileList[base] << [name, lang, arch, location]
        FileUtils.mkdir_p(File.join(dir, base))
        decompressor.extract(file, location)
    end until (file = file.next).nil?
    decompressor.close(cab)
    decompressor.destroy
    fileList
end
process(cab, files, tmpdir, path, lang) click to toggle source

Start extracting cab @param [String] cab filename of cab @param [Array] files list of names for files to match from cab @param [String] tmpdir path to directory where keep extracted cab files @param [String] path path to output location @param [Boolean] lang if should use language name rather than LangID

# File lib/lp/exporter.rb, line 18
def self.process(cab, files, tmpdir, path, lang)
    files = extract(cab, files, tmpdir)
    files.each do |base, entries|
        entries.each do |entry|
            export(path, entry, lang)
        end
        puts 'Exported ' + base
    end
end