smallcage 0.0.8
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.
- data/History.txt +15 -0
- data/License.txt +20 -0
- data/Manifest.txt +70 -0
- data/README.txt +1 -0
- data/Rakefile +4 -0
- data/bin/smc +136 -0
- data/config/hoe.rb +70 -0
- data/config/requirements.rb +17 -0
- data/lib/smallcage/commands/Manifest.erb +19 -0
- data/lib/smallcage/commands/auto.rb +52 -0
- data/lib/smallcage/commands/clean.rb +24 -0
- data/lib/smallcage/commands/import.rb +212 -0
- data/lib/smallcage/commands/manifest.rb +39 -0
- data/lib/smallcage/commands/server.rb +24 -0
- data/lib/smallcage/commands/update.rb +40 -0
- data/lib/smallcage/erb_base.rb +16 -0
- data/lib/smallcage/loader.rb +239 -0
- data/lib/smallcage/misc.rb +13 -0
- data/lib/smallcage/renderer.rb +19 -0
- data/lib/smallcage/runner.rb +36 -0
- data/lib/smallcage/version.rb +9 -0
- data/lib/smallcage.rb +22 -0
- data/log/debug.log +0 -0
- data/project/default/_smc/helpers/base_helper.rb +34 -0
- data/project/default/_smc/helpers/site_helper.rb +5 -0
- data/project/default/_smc/templates/default.rhtml +5 -0
- data/project/default/_smc/templates/footer.rhtml +0 -0
- data/project/default/_smc/templates/header.rhtml +0 -0
- data/project/nkf/_smc/filters/filters.yml +3 -0
- data/project/nkf/_smc/filters/nkf_filter.rb +15 -0
- data/project/relpath/_smc/filters/filters.yml +2 -0
- data/project/relpath/_smc/filters/relpath_filter.rb +13 -0
- data/project/standard/_dir.smc +2 -0
- data/project/standard/_smc/helpers/menu_helper.rb +23 -0
- data/project/standard/_smc/templates/footer.rhtml +12 -0
- data/project/standard/_smc/templates/header.rhtml +35 -0
- data/project/standard/_smc/templates/redirect.rhtml +13 -0
- data/project/standard/_smc/templates/sidebar.rhtml +9 -0
- data/project/standard/_smc/templates/topic_path.rhtml +6 -0
- data/project/standard/about/_dir.smc +1 -0
- data/project/standard/about/index.html.smc +3 -0
- data/project/standard/common/css/default.css +97 -0
- data/project/standard/common/css/print.css +0 -0
- data/project/standard/index.html.smc +3 -0
- data/project/standard/sample1/_dir.smc +1 -0
- data/project/standard/sample1/index.html.smc +7 -0
- data/project/standard/sample1/index2.html.smc +5 -0
- data/project/standard/sample1/redirect.html.smc +2 -0
- data/project/standard/sample2/_dir.smc +1 -0
- data/project/standard/sample2/index.html.smc +3 -0
- data/script/destroy +14 -0
- data/script/destroy.cmd +1 -0
- data/script/generate +14 -0
- data/script/generate.cmd +1 -0
- data/setup.rb +1585 -0
- data/spec/data/htdocs1/_dir.smc +0 -0
- data/spec/data/htdocs1/a/b/c/index.html.smc +1 -0
- data/spec/import_spec.rb +20 -0
- data/spec/loader_spec.rb +41 -0
- data/spec/manifest_spec.rb +32 -0
- data/spec/misc_spec.rb +25 -0
- data/spec/smallcage_spec.rb +34 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +9 -0
- data/tasks/deployment.rake +27 -0
- data/tasks/environment.rake +7 -0
- data/tasks/rspec.rake +21 -0
- data/tasks/website.rake +9 -0
- data/test/test_helper.rb +2 -0
- data/test/test_smallcage.rb +11 -0
- metadata +132 -0
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            require 'webrick'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module SmallCage::Commands
         | 
| 4 | 
            +
              class Server
         | 
| 5 | 
            +
                def self.execute(opts)
         | 
| 6 | 
            +
                  document_root = opts[:path]
         | 
| 7 | 
            +
                  port = opts[:port]
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  server = WEBrick::HTTPServer.new({
         | 
| 10 | 
            +
                    :DocumentRoot => document_root,
         | 
| 11 | 
            +
                    :Port => port
         | 
| 12 | 
            +
                  })
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  WEBrick::HTTPServlet::FileHandler.remove_handler("cgi")
         | 
| 15 | 
            +
                  WEBrick::HTTPServlet::FileHandler.remove_handler("rhtml")
         | 
| 16 | 
            +
                  
         | 
| 17 | 
            +
                  ['INT', 'TERM'].each do |signal|
         | 
| 18 | 
            +
                    Signal.trap(signal){ server.shutdown }
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                  server.start    
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
| @@ -0,0 +1,40 @@ | |
| 1 | 
            +
            module SmallCage::Commands
         | 
| 2 | 
            +
              class Update
         | 
| 3 | 
            +
                def self.execute(opts)
         | 
| 4 | 
            +
                  self.new(opts).execute
         | 
| 5 | 
            +
                end
         | 
| 6 | 
            +
                
         | 
| 7 | 
            +
                def initialize(opts)
         | 
| 8 | 
            +
                  @opts = opts
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
                
         | 
| 11 | 
            +
                def execute
         | 
| 12 | 
            +
                  target = Pathname.new(@opts[:path])
         | 
| 13 | 
            +
                  unless target.exist?
         | 
| 14 | 
            +
                    raise "target directory or file does not exist.: " + target.to_s
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
                  
         | 
| 17 | 
            +
                  loader = SmallCage::Loader.new(target)
         | 
| 18 | 
            +
                  renderer = SmallCage::Renderer.new(loader)
         | 
| 19 | 
            +
                  
         | 
| 20 | 
            +
                  loader.each_smc_obj do |obj|
         | 
| 21 | 
            +
                    result = renderer.render(obj["template"], obj)
         | 
| 22 | 
            +
                          
         | 
| 23 | 
            +
                    filters = loader.filters("after_rendering_filters")
         | 
| 24 | 
            +
                    filters.each do |f|
         | 
| 25 | 
            +
                      result = f.after_rendering_filter(obj, result)
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    output_result(obj, result)
         | 
| 29 | 
            +
                    puts obj["uri"] if @opts[:quiet].nil?
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
                
         | 
| 33 | 
            +
                def output_result(obj, str)
         | 
| 34 | 
            +
                  open(obj["path"], "w") do |io|
         | 
| 35 | 
            +
                    io << str
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
                private :output_result
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
            end
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            class SmallCage::ErbBase
         | 
| 3 | 
            +
              def initialize(loader, renderer, obj)
         | 
| 4 | 
            +
                @loader, @renderer, @obj = loader, renderer, obj
         | 
| 5 | 
            +
              end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              def method_missing(name)
         | 
| 8 | 
            +
                n = name.to_s
         | 
| 9 | 
            +
                
         | 
| 10 | 
            +
                return @obj[n] unless @obj[n].nil?
         | 
| 11 | 
            +
                return @obj["strings"][0] if n == "body" && ! @obj["strings"][0].nil?
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                # render if template file exists. or return nil.
         | 
| 14 | 
            +
                return @renderer.render(name, @obj)
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -0,0 +1,239 @@ | |
| 1 | 
            +
            module SmallCage
         | 
| 2 | 
            +
              class Loader
         | 
| 3 | 
            +
                DEFAULT_TEMPLATE = "default"
         | 
| 4 | 
            +
                DIR_PROP_FILE = "_dir.smc"
         | 
| 5 | 
            +
                MAX_DEPTH = 100
         | 
| 6 | 
            +
              
         | 
| 7 | 
            +
                attr_reader :root, :target, :erb_base
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
                def initialize(target)
         | 
| 10 | 
            +
                  target = Pathname.new(target.to_s.strip.gsub(%r{(.+)/$}, '\1'))
         | 
| 11 | 
            +
                  target = real_target(target) 
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  @target = target # absolute
         | 
| 14 | 
            +
                  @root = SmallCage::Loader.find_root(target) # absolute
         | 
| 15 | 
            +
                  @templates_dir = @root + "_smc/templates"
         | 
| 16 | 
            +
                  @helpers_dir = @root + "_smc/helpers"
         | 
| 17 | 
            +
                  @filters_dir = @root + "_smc/filters"
         | 
| 18 | 
            +
                  @erb_base = load_erb_base
         | 
| 19 | 
            +
                  @filters = load_filters
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                # return root dir Pathname object.
         | 
| 23 | 
            +
                def self.find_root(path, depth = MAX_DEPTH)
         | 
| 24 | 
            +
                  unless path.exist?
         | 
| 25 | 
            +
                    raise "Not found: " + path.to_s 
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
                  d = path.realpath
         | 
| 28 | 
            +
                  
         | 
| 29 | 
            +
                  if d.file?
         | 
| 30 | 
            +
                    d = d.parent
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                  
         | 
| 33 | 
            +
                  i = 0
         | 
| 34 | 
            +
                  loop do
         | 
| 35 | 
            +
                    if d.join("_smc").directory?
         | 
| 36 | 
            +
                      return d
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
                    break if d.root?
         | 
| 39 | 
            +
                    d = d.parent
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    i += 1
         | 
| 42 | 
            +
                    break if depth <= i
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
                  
         | 
| 45 | 
            +
                  raise "Root not found: " + path
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
              
         | 
| 48 | 
            +
                def load(path)
         | 
| 49 | 
            +
                  unless path.exist?
         | 
| 50 | 
            +
                    raise "Not found: " + path.to_s 
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
                  path = path.realpath
         | 
| 53 | 
            +
                  unless path.to_s[0...@root.to_s.length] == @root.to_s
         | 
| 54 | 
            +
                    raise "Illegal path: " + path.to_s + " , " + @root.to_s
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                  result = {}
         | 
| 58 | 
            +
                  if path.file?
         | 
| 59 | 
            +
                    path_smc = path
         | 
| 60 | 
            +
                    path_out = Pathname.new(strip_ext(path))
         | 
| 61 | 
            +
                    uri_smc = to_uri(path)
         | 
| 62 | 
            +
                    uri_out = strip_ext(uri_smc)
         | 
| 63 | 
            +
                    source_path = path
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                    result["dirs"]     = load_dirs(path)
         | 
| 66 | 
            +
                    result["template"] = DEFAULT_TEMPLATE
         | 
| 67 | 
            +
                  else
         | 
| 68 | 
            +
                    path_smc = nil
         | 
| 69 | 
            +
                    path_out = path
         | 
| 70 | 
            +
                    uri_smc = nil
         | 
| 71 | 
            +
                    uri_out = to_uri(path)
         | 
| 72 | 
            +
                    uri_out += "/" unless uri_out =~ %r{/$}
         | 
| 73 | 
            +
                    source_path = path + DIR_PROP_FILE
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                    if source_path.file?
         | 
| 76 | 
            +
                      path_smc = source_path
         | 
| 77 | 
            +
                      uri_smc = to_uri(source_path)
         | 
| 78 | 
            +
                    end
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
                  
         | 
| 81 | 
            +
                  add_smc_method(path_out, path_smc)
         | 
| 82 | 
            +
                  add_smc_method(uri_out, uri_smc)
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                  result["path"]     = path_out
         | 
| 85 | 
            +
                  result["uri"]      = uri_out
         | 
| 86 | 
            +
                  result["arrays"]   = []
         | 
| 87 | 
            +
                  result["strings"]  = []
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                  return result unless source_path.exist?
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                  source = source_path.read
         | 
| 92 | 
            +
                  return result if source.strip.empty?
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                  obj = YAML.load_stream(source)
         | 
| 95 | 
            +
                  return result if obj.nil?
         | 
| 96 | 
            +
                  
         | 
| 97 | 
            +
                  obj.documents.each do |o|
         | 
| 98 | 
            +
                    if o.is_a? Hash
         | 
| 99 | 
            +
                      result = result.merge(o)
         | 
| 100 | 
            +
                    elsif o.is_a? Array
         | 
| 101 | 
            +
                      result["arrays"]  << o
         | 
| 102 | 
            +
                    else
         | 
| 103 | 
            +
                      result["strings"] << o.to_s
         | 
| 104 | 
            +
                    end
         | 
| 105 | 
            +
                  end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                  return result
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                def load_dirs(path)
         | 
| 111 | 
            +
                  result = []
         | 
| 112 | 
            +
                  loop do
         | 
| 113 | 
            +
                    path = path.parent
         | 
| 114 | 
            +
                    result.unshift load(path)
         | 
| 115 | 
            +
                    break if path.join("_smc").directory?
         | 
| 116 | 
            +
                    raise "Root directory not found!" if path.root?
         | 
| 117 | 
            +
                  end
         | 
| 118 | 
            +
                  return result
         | 
| 119 | 
            +
                end
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                def template_path(name)
         | 
| 122 | 
            +
                  result = @templates_dir + "#{name}.rhtml"
         | 
| 123 | 
            +
                  return nil unless result.file?
         | 
| 124 | 
            +
                  return result
         | 
| 125 | 
            +
                end
         | 
| 126 | 
            +
                
         | 
| 127 | 
            +
                def each_smc_obj
         | 
| 128 | 
            +
                  each_smc_file do |path|
         | 
| 129 | 
            +
                    next if path.directory?
         | 
| 130 | 
            +
                    next if path.basename.to_s == DIR_PROP_FILE
         | 
| 131 | 
            +
                    obj = load(path)
         | 
| 132 | 
            +
                    yield obj
         | 
| 133 | 
            +
                  end
         | 
| 134 | 
            +
                end
         | 
| 135 | 
            +
                
         | 
| 136 | 
            +
                def each_smc_file
         | 
| 137 | 
            +
                  if @target.directory?
         | 
| 138 | 
            +
                    p = Pathname.new(@target)
         | 
| 139 | 
            +
                    Dir.chdir(@target) do
         | 
| 140 | 
            +
                      Dir.glob("**/*.smc") do |f|
         | 
| 141 | 
            +
                        yield p + f
         | 
| 142 | 
            +
                      end
         | 
| 143 | 
            +
                    end
         | 
| 144 | 
            +
                  else
         | 
| 145 | 
            +
                    yield @target
         | 
| 146 | 
            +
                  end
         | 
| 147 | 
            +
                end
         | 
| 148 | 
            +
                private :each_smc_file
         | 
| 149 | 
            +
                
         | 
| 150 | 
            +
                def real_target(target)
         | 
| 151 | 
            +
                  return target.realpath if target.directory?
         | 
| 152 | 
            +
                  return target.realpath if target.file? and target.to_s =~ /\.smc$/ 
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                  tmp = Pathname.new(target.to_s + ".smc")
         | 
| 155 | 
            +
                  return tmp.realpath if tmp.file?
         | 
| 156 | 
            +
             | 
| 157 | 
            +
                  raise "Target not found: " + target.to_s
         | 
| 158 | 
            +
                end
         | 
| 159 | 
            +
                private :real_target
         | 
| 160 | 
            +
                
         | 
| 161 | 
            +
                
         | 
| 162 | 
            +
                def load_erb_base
         | 
| 163 | 
            +
                  result = Class.new(SmallCage::ErbBase)
         | 
| 164 | 
            +
                  class_names = load_classes(@helpers_dir, %r{([^/]+_helper)\.rb$})
         | 
| 165 | 
            +
                  class_names.each do |class_name|
         | 
| 166 | 
            +
                    result.class_eval("include SmallCage::#{class_name}")
         | 
| 167 | 
            +
                  end
         | 
| 168 | 
            +
                  return result
         | 
| 169 | 
            +
                end
         | 
| 170 | 
            +
                private :load_erb_base
         | 
| 171 | 
            +
                
         | 
| 172 | 
            +
                def load_classes(dir, rex)
         | 
| 173 | 
            +
                  class_names = []
         | 
| 174 | 
            +
                  Dir.entries(dir).sort.each do |h|
         | 
| 175 | 
            +
                    next unless h =~ rex
         | 
| 176 | 
            +
                    require "#{dir}/#{h}"
         | 
| 177 | 
            +
                    class_names << $1.camelize
         | 
| 178 | 
            +
                  end
         | 
| 179 | 
            +
                  return class_names
         | 
| 180 | 
            +
                end
         | 
| 181 | 
            +
                private :load_classes
         | 
| 182 | 
            +
             | 
| 183 | 
            +
                def filters(name)
         | 
| 184 | 
            +
                  if @filters[name].nil?
         | 
| 185 | 
            +
                    return []
         | 
| 186 | 
            +
                  end
         | 
| 187 | 
            +
                  return @filters[name]
         | 
| 188 | 
            +
                end
         | 
| 189 | 
            +
                
         | 
| 190 | 
            +
                def load_filters
         | 
| 191 | 
            +
                  result = {}
         | 
| 192 | 
            +
                  return {} unless @filters_dir.directory?
         | 
| 193 | 
            +
                  
         | 
| 194 | 
            +
                  load_classes(@filters_dir, %r{([^/]+_filter)\.rb$})
         | 
| 195 | 
            +
                  
         | 
| 196 | 
            +
                  config = load_filters_config
         | 
| 197 | 
            +
                  config.each do |filter_type,filter_list|
         | 
| 198 | 
            +
                    result[filter_type] = []
         | 
| 199 | 
            +
                    filter_list.each do |fc|
         | 
| 200 | 
            +
                      fc = { "name" => fc } if fc.is_a? String
         | 
| 201 | 
            +
                      klass = SmallCage.const_get(fc["name"].camelize)
         | 
| 202 | 
            +
                      result[filter_type] << klass.new(fc)
         | 
| 203 | 
            +
                    end
         | 
| 204 | 
            +
                  end
         | 
| 205 | 
            +
                  return result
         | 
| 206 | 
            +
                end
         | 
| 207 | 
            +
                private :load_filters
         | 
| 208 | 
            +
             | 
| 209 | 
            +
                def load_filters_config
         | 
| 210 | 
            +
                  path = @filters_dir.join("filters.yml")
         | 
| 211 | 
            +
                  return {} unless path.file?
         | 
| 212 | 
            +
                  return YAML.load(path.read())
         | 
| 213 | 
            +
                end
         | 
| 214 | 
            +
                private :load_filters_config
         | 
| 215 | 
            +
                
         | 
| 216 | 
            +
                def strip_ext(path)
         | 
| 217 | 
            +
                  path.to_s[0..-5]
         | 
| 218 | 
            +
                end
         | 
| 219 | 
            +
                private :strip_ext
         | 
| 220 | 
            +
                
         | 
| 221 | 
            +
                def to_uri(path)
         | 
| 222 | 
            +
                  path.realpath.to_s[@root.to_s.length .. -1]
         | 
| 223 | 
            +
                end
         | 
| 224 | 
            +
                private :to_uri
         | 
| 225 | 
            +
             | 
| 226 | 
            +
                def add_smc_method(obj, value)
         | 
| 227 | 
            +
                  obj.instance_eval do
         | 
| 228 | 
            +
                    @__smallcage ||= {}
         | 
| 229 | 
            +
                    @__smallcage[:smc] = value
         | 
| 230 | 
            +
                  end
         | 
| 231 | 
            +
             | 
| 232 | 
            +
                  def obj.smc
         | 
| 233 | 
            +
                    return @__smallcage.nil? ? nil : @__smallcage[:smc]
         | 
| 234 | 
            +
                  end
         | 
| 235 | 
            +
                end
         | 
| 236 | 
            +
                private :add_smc_method
         | 
| 237 | 
            +
             | 
| 238 | 
            +
              end
         | 
| 239 | 
            +
            end
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            # From active-support/inflector.rb  
         | 
| 3 | 
            +
            class String
         | 
| 4 | 
            +
              def camelize(first_letter_in_uppercase = true)
         | 
| 5 | 
            +
                s = self
         | 
| 6 | 
            +
                if first_letter_in_uppercase
         | 
| 7 | 
            +
                  s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
         | 
| 8 | 
            +
                else
         | 
| 9 | 
            +
                  s[0..0] + s.camelize[1..-1]
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
            end
         | 
| 13 | 
            +
             | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            class SmallCage::Renderer
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              def initialize(loader)
         | 
| 4 | 
            +
                @loader = loader
         | 
| 5 | 
            +
              end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              def render(name, obj)
         | 
| 8 | 
            +
                path = @loader.template_path(name)
         | 
| 9 | 
            +
                return nil if path.nil?
         | 
| 10 | 
            +
                return render_string(path.read, obj)
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
                
         | 
| 13 | 
            +
              def render_string(str, obj)
         | 
| 14 | 
            +
                erb_class = ERB.new(str, nil, '-').def_class(@loader.erb_base, "erb")
         | 
| 15 | 
            +
                result = erb_class.new(@loader, self, obj).erb
         | 
| 16 | 
            +
                return result
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            end
         | 
| @@ -0,0 +1,36 @@ | |
| 1 | 
            +
            module SmallCage
         | 
| 2 | 
            +
              class Runner
         | 
| 3 | 
            +
                def self.run(opts)
         | 
| 4 | 
            +
                  Runner.new(opts).send(opts[:command])
         | 
| 5 | 
            +
                end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                def initialize(opts)
         | 
| 8 | 
            +
                  @opts = opts
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
                
         | 
| 11 | 
            +
                def update
         | 
| 12 | 
            +
                  SmallCage::Commands::Update.execute(@opts)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
                
         | 
| 15 | 
            +
                def clean
         | 
| 16 | 
            +
                  SmallCage::Commands::Clean.execute(@opts)
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
                
         | 
| 19 | 
            +
                def server
         | 
| 20 | 
            +
                  SmallCage::Commands::Server.execute(@opts)
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                def auto
         | 
| 24 | 
            +
                  SmallCage::Commands::Auto.execute(@opts)
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
                
         | 
| 27 | 
            +
                def import
         | 
| 28 | 
            +
                  SmallCage::Commands::Import.execute(@opts)
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
                
         | 
| 31 | 
            +
                def manifest
         | 
| 32 | 
            +
                  SmallCage::Commands::Manifest.execute(@opts)
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
            end
         | 
    
        data/lib/smallcage.rb
    ADDED
    
    | @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            $:.unshift File.dirname(__FILE__)
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'yaml'
         | 
| 4 | 
            +
            require 'erb'
         | 
| 5 | 
            +
            require 'pathname'
         | 
| 6 | 
            +
            require 'open-uri'
         | 
| 7 | 
            +
            require 'fileutils'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            require 'smallcage/version'
         | 
| 10 | 
            +
            require 'smallcage/misc'
         | 
| 11 | 
            +
            require 'smallcage/loader'
         | 
| 12 | 
            +
            require 'smallcage/erb_base'
         | 
| 13 | 
            +
            require 'smallcage/renderer'
         | 
| 14 | 
            +
            require 'smallcage/runner'
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            require 'smallcage/commands/update'
         | 
| 17 | 
            +
            require 'smallcage/commands/clean'
         | 
| 18 | 
            +
            require 'smallcage/commands/server'
         | 
| 19 | 
            +
            require 'smallcage/commands/auto'
         | 
| 20 | 
            +
            require 'smallcage/commands/import'
         | 
| 21 | 
            +
            require 'smallcage/commands/manifest'
         | 
| 22 | 
            +
             | 
    
        data/log/debug.log
    ADDED
    
    | 
            File without changes
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            module SmallCage
         | 
| 2 | 
            +
              module BaseHelper
         | 
| 3 | 
            +
                include ERB::Util
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                def _glob(relpath, rex)
         | 
| 6 | 
            +
                  base_dir = Pathname.new(@obj["path"]).parent
         | 
| 7 | 
            +
                  base_dir = base_dir.join(relpath)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  entries = Dir.glob("#{base_dir}/**/*")
         | 
| 10 | 
            +
                  result = []
         | 
| 11 | 
            +
                  entries.each do |path|
         | 
| 12 | 
            +
                    result << path if path.to_s =~ rex
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
                  return result.sort
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def _with(o)
         | 
| 18 | 
            +
                  tmpobj = @obj
         | 
| 19 | 
            +
                  @obj = o
         | 
| 20 | 
            +
                  yield
         | 
| 21 | 
            +
                  @obj = tmpobj
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
                
         | 
| 24 | 
            +
                def _load(path)
         | 
| 25 | 
            +
                  path = Pathname.new(path)
         | 
| 26 | 
            +
                  @loader.load(path)
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
                
         | 
| 29 | 
            +
                def _erb(body)
         | 
| 30 | 
            +
                  @renderer.render_string(body, @obj)
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
                
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            module SmallCage
         | 
| 2 | 
            +
              module MenuHelper
         | 
| 3 | 
            +
                
         | 
| 4 | 
            +
                def menu_active(name)
         | 
| 5 | 
            +
                  p = @obj["menu_path"]
         | 
| 6 | 
            +
                  p ||= uri
         | 
| 7 | 
            +
                  return p =~ %r{^/#{name}/} ? "active" : "inactive"
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
                
         | 
| 10 | 
            +
                def menu_active_rex(rex)
         | 
| 11 | 
            +
                  p = @obj["menu_path"]
         | 
| 12 | 
            +
                  p ||= uri
         | 
| 13 | 
            +
                  return p =~ rex ? "active" : "inactive"
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
                
         | 
| 16 | 
            +
                def topic_dirs
         | 
| 17 | 
            +
                  result = @obj["dirs"].dup
         | 
| 18 | 
            +
                  result.reject! {|d| d["topic"].nil? }
         | 
| 19 | 
            +
                  return result
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
                
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
         | 
| 3 | 
            +
            <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja-JP" lang="ja-JP">
         | 
| 4 | 
            +
            <head>
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
         | 
| 7 | 
            +
            <meta name="keywords" content="" />
         | 
| 8 | 
            +
            <%- unless description.nil? -%>
         | 
| 9 | 
            +
            <meta name="description" content="<%=h description %>" />
         | 
| 10 | 
            +
            <%- end -%>
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            <link rev="made" href="mailto:info@example.com" />
         | 
| 13 | 
            +
            <link rel="index" href="./index.html" />
         | 
| 14 | 
            +
            <link rel="stylesheet" type="text/css" href="/common/css/default.css" media="screen"/>
         | 
| 15 | 
            +
            <link rel="stylesheet" type="text/css" href="/common/css/print.css" media="print" />
         | 
| 16 | 
            +
            <link rel="shortcut icon" href="/common/favicon.ico" />
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            <title><% if uri !~ %r{^/index.html$} %><%=h title %> | <% end %>Standard Site Template</title>
         | 
| 19 | 
            +
            </head>
         | 
| 20 | 
            +
            <body>
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            <div class="header">
         | 
| 23 | 
            +
            <h1><a href="/index.html">Standard Site Template</a></h1>
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            <div class="topicpath">
         | 
| 26 | 
            +
            <%= topic_path %>
         | 
| 27 | 
            +
            </div>
         | 
| 28 | 
            +
            </div>
         | 
| 29 | 
            +
             | 
| 30 | 
            +
             | 
| 31 | 
            +
            <div class="container">
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            <div class="contents">
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            <h2><%=h title %></h2>
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <!DOCTYPE html 
         | 
| 3 | 
            +
            	PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         | 
| 4 | 
            +
            	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
         | 
| 5 | 
            +
            <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja-JP" lang="ja-JP">
         | 
| 6 | 
            +
            <head>
         | 
| 7 | 
            +
            	<title></title>
         | 
| 8 | 
            +
            	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
         | 
| 9 | 
            +
            	<meta http-equiv="refresh" content="0;URL=<%= redirect_uri %>">
         | 
| 10 | 
            +
            </head>
         | 
| 11 | 
            +
            <body>
         | 
| 12 | 
            +
            </body>
         | 
| 13 | 
            +
            </html>
         | 
| @@ -0,0 +1,9 @@ | |
| 1 | 
            +
            <div class="sidebar">
         | 
| 2 | 
            +
            <ul>
         | 
| 3 | 
            +
            <li class="<%= menu_active_rex(%r{^/index.html$}) %>"><a href="/index.html">Home</a></li>
         | 
| 4 | 
            +
            <li class="<%= menu_active("sample1") %>"><a href="/sample1/index.html">Sample 1</a></li>
         | 
| 5 | 
            +
            <li class="<%= menu_active("sample2") %>"><a href="/sample2/index.html">Sample 2</a></li>
         | 
| 6 | 
            +
            <li class="<%= menu_active("dummy") %>"><a href="/dummy/index.html">Dummy</a></li>
         | 
| 7 | 
            +
            <li class="<%= menu_active("about") %>"><a href="/about/index.html">About</a></li>
         | 
| 8 | 
            +
            </ul>
         | 
| 9 | 
            +
            </div>
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            topic: About
         |