mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
172 lines
5.2 KiB
Ruby
172 lines
5.2 KiB
Ruby
require 'zlib'
|
|
|
|
class Numeric
|
|
def to_digits(n = 3)
|
|
str = self.to_s
|
|
(n - str.size).times { str = str.prepend("0") }
|
|
return str
|
|
end
|
|
end
|
|
|
|
module Scripts
|
|
def self.dump(path = "Data/Scripts", rxdata = "Data/Scripts.rxdata")
|
|
clear_directory(path)
|
|
folder_id = [1, 1] # Can only have two layers of folders
|
|
file_id = 1
|
|
level = 0 # 0=main path, 1=subfolder, 2=sub-subfolder
|
|
folder_path = path
|
|
folder_name = nil
|
|
scripts = File.open(rxdata, 'rb') { |f| Marshal.load(f) }
|
|
|
|
scripts.each_with_index do |e, i|
|
|
_, title, script = e
|
|
title = title_to_filename(title).strip
|
|
script = Zlib::Inflate.inflate(script).delete("\r")
|
|
next if title.empty? && script.empty?
|
|
section_name = nil
|
|
|
|
if title[/\[\[\s*(.+)\s*\]\]$/] # Make a folder
|
|
section_name = $~[1].strip
|
|
section_name = "unnamed" if !section_name || section_name.empty?
|
|
folder_name = ((i>=scripts.length-2) ? "999" : folder_id[level].to_digits(3)) + "_" + section_name
|
|
create_directory(folder_path + "/" + folder_name)
|
|
folder_id[level] += 1
|
|
if level < folder_id.length-1
|
|
level += 1 # Go one level deeper
|
|
folder_id[level] = 1 # Reset numbering of subfolders
|
|
folder_path += "/" + folder_name
|
|
folder_name = nil
|
|
end
|
|
file_id = 1 # Reset numbering of script files
|
|
|
|
elsif title.start_with?("=====") # Return to top level directory
|
|
level = 0
|
|
folder_path = path
|
|
folder_name = nil
|
|
end
|
|
|
|
# Create script file
|
|
next if script.empty?
|
|
this_folder = (folder_name) ? folder_path + "/" + folder_name : folder_path
|
|
section_name = title.strip if !section_name
|
|
section_name = "unnamed" if !section_name || section_name.empty?
|
|
file_name = ((i==scripts.length-1) ? "999" : file_id.to_digits(3)) + "_" + section_name + ".rb"
|
|
create_script(this_folder + "/" + file_name, script)
|
|
file_id += 1 # Increment numbering of script files
|
|
end
|
|
|
|
# Backup Scripts.rxdata to ScriptsBackup.rxdata
|
|
File.open("Data/ScriptsBackup.rxdata", "wb") do |f|
|
|
Marshal.dump(scripts, f)
|
|
end
|
|
|
|
# Replace Scripts.rxdata with ScriptsLoader.rxdata
|
|
loader_scripts = File.open("Data/ScriptsLoader.rxdata", 'rb') { |f| Marshal.load(f) }
|
|
File.open(rxdata, "wb") do |f|
|
|
Marshal.dump(loader_scripts, f)
|
|
end
|
|
end
|
|
|
|
def self.from_folder(path = "Data/Scripts", rxdata = "Data/Scripts.rxdata")
|
|
scripts = []
|
|
aggregate_from_folder(path, scripts)
|
|
# Save scripts to file
|
|
File.open(rxdata, "wb") do |f|
|
|
Marshal.dump(scripts, f)
|
|
end
|
|
end
|
|
|
|
def self.aggregate_from_folder(path, scripts, level = 0)
|
|
files = []
|
|
folders = []
|
|
Dir.foreach(path) do |f|
|
|
next if f == '.' || f == '..'
|
|
if File.directory?(path + "/" + f)
|
|
folders.push(f)
|
|
else
|
|
files.push(f)
|
|
end
|
|
end
|
|
files.sort!
|
|
files.each do |f|
|
|
section_name = filename_to_title(f)
|
|
content = File.open(path + "/" + f, "rb") { |f2| f2.read }.gsub(/\n/, "\r\n")
|
|
scripts << [rand(999999), section_name, Zlib::Deflate.deflate(content)]
|
|
end
|
|
folders.sort!
|
|
folders.each do |f|
|
|
section_name = filename_to_title(f)
|
|
scripts << [rand(999999), "==================", Zlib::Deflate.deflate("")] if level==0
|
|
scripts << [rand(999999), "", Zlib::Deflate.deflate("")] if level==1
|
|
scripts << [rand(999999), "[[ " + section_name + " ]]", Zlib::Deflate.deflate("")]
|
|
aggregate_from_folder(path + "/" + f, scripts, level+1)
|
|
end
|
|
end
|
|
|
|
def self.filename_to_title(filename)
|
|
filename = filename.bytes.pack('U*')
|
|
title = ""
|
|
if filename[/^[^_]*_(.+)$/]
|
|
title = $~[1]
|
|
title = title[0..-4] if title.end_with?(".rb")
|
|
title = title.strip
|
|
end
|
|
title = "unnamed" if !title || title.empty?
|
|
title.gsub!(/&bs;/, "\\")
|
|
title.gsub!(/&fs;/, "/")
|
|
title.gsub!(/&cn;/, ":")
|
|
title.gsub!(/&as;/, "*")
|
|
title.gsub!(/&qm;/, "?")
|
|
title.gsub!(/&dq;/, "\"")
|
|
title.gsub!(/</, "<")
|
|
title.gsub!(/>/, ">")
|
|
title.gsub!(/&po;/, "|")
|
|
return title
|
|
end
|
|
|
|
def self.title_to_filename(title)
|
|
filename = title.clone
|
|
filename.gsub!(/\\/, "&bs;")
|
|
filename.gsub!(/\//, "&fs;")
|
|
filename.gsub!(/:/, "&cn;")
|
|
filename.gsub!(/\*/, "&as;")
|
|
filename.gsub!(/\?/, "&qm;")
|
|
filename.gsub!(/"/, "&dq;")
|
|
filename.gsub!(/</, "<")
|
|
filename.gsub!(/>/, ">")
|
|
filename.gsub!(/\|/, "&po;")
|
|
return filename
|
|
end
|
|
|
|
def self.create_script(title, content)
|
|
f = File.new(title, "wb")
|
|
f.write content
|
|
f.close
|
|
end
|
|
|
|
def self.clear_directory(path, delete_current = false)
|
|
Dir.foreach(path) do |f|
|
|
next if f == '.' || f == '..'
|
|
if File.directory?(path + "/" + f)
|
|
clear_directory(path + "/" + f, true)
|
|
else
|
|
File.delete(path + "/" + f)
|
|
end
|
|
end
|
|
Dir.delete(path) if delete_current
|
|
end
|
|
|
|
def self.create_directory(path)
|
|
paths = path.split('/')
|
|
paths.each_with_index do |e, i|
|
|
if !File.directory?(paths[0..i].join('/'))
|
|
Dir.mkdir(paths[0..i].join('/'))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
#Scripts.dump("D:/Desktop/Scripts", "D:/Desktop/Main Essentials/Data/Scripts.rxdata")
|
|
#Scripts.from_folder("D:/Desktop/Scripts", "D:/Desktop/Main Essentials/Data/Scripts.rxdata")
|
|
Scripts.dump
|
|
#Scripts.from_folder |