查看: 2366|回复: 0

[原创发布] 一个工具向的脚本-Base64Resource

[复制链接]
梦石
0
星屑
4623
在线时间
1207 小时
注册时间
2016-4-7
回帖
944

开拓者

发表于 2018-4-9 00:09:07 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 shitake 于 2018-4-9 09:37 编辑

如果你经常写脚本给别人,同时你的脚本用到了少量的外部资源文件(图片/音效之类的)。但是你希望发布的时候只需要发布一个脚本而不是带了脚本和外部文件的一个很大的rm工程文件。那么可以考虑试试这个脚本。
Base64Resource 会把那些外部文件转换成base64 然后直接存储在脚本文件内。在需要加载的时候写入到一个零时文件内。然后再把这个文件的path喂给bitmap/audio。零时文件会在退出的时候【通过ruby的exit退出】删掉。

具体使用方法:

Base64Resource#pack_base64(src) 会把文件 src 所指向的文件转换成 base64(我把换行替换成|了)然后输出到相同路径下的 .base64 文件内。然后把这个文件的内容复制到 RESOURCES 里。在需要的时候你就可以通过 Base64Resource.get(name) 来获取对应的base64文件所写入的实际文件的path。把这个返回值传给Bitmap#new之类的就可以了。

需要注意的是,这种方法只适合十分小的外部文件【比如图标,简单音效之类的】


[fold=code][pre lang="ruby"]module Base64Resource

  RESOURCES = {
  }

  TEMP_PATH = '.temp'

  class << self
    def init
      make_temp
      ObjectSpace.define_finalizer("clear_temp",  proc { Base64Resource.clear_temp })
    end

    # @param [String] src
    def pack_base64(src)
      str = [open(src, 'rb').read].pack('m')
      open(src + '.base64', 'wb'){ |f| f.write "#{File.extname(src)}|" + str.gsub("\n", '|') }
    end

    def make_temp
      Dir.mkdir TEMP_PATH unless Dir.exist? TEMP_PATH
    end

    def make_temp_file(name, content)
      open(name, 'wb') { |f| f.write content }
    end

    def delete_directory(path)
      if File.directory?(path)
        Dir.foreach(path) do |subFile|
          if subFile != '.' and subFile != '..'
            delete_directory(File.join(path, subFile));
          end
        end
        Dir.rmdir(path)
      else
        File.delete(path)
      end
    end

    def clear_temp
      delete_directory(TEMP_PATH) if Dir.exist? TEMP_PATH
    end

    def get(name)
      raise "ResourceError: undefined resource #{name} for Resource" unless RESOURCES[name]
      str =  RESOURCES[name].split('|')
      name = File.join(TEMP_PATH, [name, str.shift].join)
      content = str.concat(['']).join("\n").unpack('m')[0]
      make_temp_file(name, content)
      name
    end
  end

end

Base64Resource.init[/pre][/fold]

评分

参与人数 2星屑 +100 赞 +2 收起 理由
唯道集虚 + 100 + 1 塞糖
夜狠简单 + 1 塞糖

查看全部评分

附庸的附庸不是我的附庸,女儿的女儿还是我的女儿。CK2沉迷ing
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部