lib/gollum-site/site.rb in gollum-site-0.0.6 vs lib/gollum-site/site.rb in gollum-site-0.1.0
- old
+ new
@@ -3,94 +3,138 @@
def self.default_layout_dir()
::File.join(::File.dirname(::File.expand_path(__FILE__)), "layout")
end
attr_reader :output_path
+ attr_reader :layouts
+ attr_reader :pages
- def initialize(wiki, options = {})
- @wiki = wiki
+ def initialize(path, options = {})
+ @wiki = Gollum::Wiki.new(path, {
+ # markup_class should work after v1.1.0 of Gollum
+ # need to change class name in markup.rb
+ #:markup_class => Gollum::SiteMarkup,
+ :page_class => Gollum::SitePage,
+ :base_path => options[:base_path]
+ })
+ @wiki.site = self
@output_path = options[:output_path] || "_site"
- if (@include_default_layout = options[:include_default_layout]).nil?
- @include_default_layout = true
- end
+ set_version(options[:version] || "master")
end
- # Public: generate a static site
- #
- # version - The String version ID to generate (default: "master").
- #
- def generate(version = 'master')
- ::Dir.mkdir(@output_path) unless ::File.exists? @output_path
+ # Prepare site for specified version
+ def set_version(version)
+ @version = version
+ @pages = {}
+ @files = {}
+ @layouts = {}
- layouts = {}
- items = @wiki.tree_map_for(version).inject([]) do |list, entry|
- if entry.name =~ /^_Footer./
- # Ignore
- elsif entry.name == "_Layout.html"
- layout = ::Liquid::Template.parse(entry.blob(@wiki.repo).data)
- layouts[::File.dirname(entry.path)] = layout
- elsif @wiki.page_class.valid_page_name?(entry.name)
- sha = @wiki.ref_map[version] || version
- page = entry.page(@wiki, @wiki.repo.commit(sha))
- list << page
- else
- list << entry
- end
- list
- end
+ @commit = version == :working ? @wiki.repo.commit("HEAD") : @wiki.repo.commit(version)
+ items = self.ls(version)
- if layouts["."].nil? and @include_default_layout
- dir = Gollum::Site.default_layout_dir()
- default_layout = ::File.join(dir, "_Layout.html")
- layout = ::Liquid::Template.parse(IO.read(default_layout))
- layouts["."] = layout
- css = ::File.join(dir, "css")
- javascript = ::File.join(dir, "javascript")
- FileUtils.cp_r([css, javascript], @output_path)
- end
-
items.each do |item|
- if item.is_a?(@wiki.page_class)
- path = ::File.join(@output_path, @wiki.page_class.cname(item.name))
- layout = get_layout(layouts, ::File.dirname(item.path))
- data = render_page(item, layout)
+ filename = ::File.basename(item.path)
+ dirname = ::File.dirname(item.path)
+ if filename =~ /^_Footer./
+ # ignore
+ elsif filename =~ /^_Layout.html/
+ # layout
+ @layouts[item.path] = ::Liquid::Template.parse(item.data)
+ elsif @wiki.page_class.valid_page_name?(filename)
+ # page
+ page = @wiki.page_class.new(@wiki)
+ blob = OpenStruct.new(:name => filename, :data => item.data)
+ page.populate(blob, dirname)
+ page.version = @commit
+ @pages[page.name.downcase] = page
else
- path = ::File.join(@output_path, item.path)
- ::FileUtils.mkdir_p(::File.dirname(path))
- data = item.blob(@wiki.repo).data
+ # file
+ @files[item.path] = item.data
end
- f = ::File.new(path, "w")
- f.write(data)
- f.close
end
end
- def get_layout(layouts, path)
- if path == ""
- layouts["."]
+ def ls(version = 'master')
+ if version == :working
+ ls_opts = {
+ :others => true,
+ :exclude_standard => true,
+ :cached => true,
+ :z => true
+ }
+
+ ls_opts_del = {
+ :deleted => true,
+ :exclude_standard => true,
+ :z => true
+ }
+
+ # if output_path is in work_tree, it should be excluded
+ if ::File.expand_path(@output_path).match(::File.expand_path(@wiki.repo.git.work_tree))
+ ls_opts[:exclude] = @output_path
+ ls_opts_del[:exclude] = @output_path
+ end
+
+ cwd = Dir.pwd # need to change directories for git ls-files -o
+ Dir.chdir(@wiki.repo.git.work_tree)
+ deleted = @wiki.repo.git.native(:ls_files, ls_opts_del).split("\0")
+ working = @wiki.repo.git.native(:ls_files, ls_opts).split("\0")
+ work_tree = (working - deleted).map do |path|
+ path = @wiki.decode_git_path(path)
+ OpenStruct.new(:path => path, :data => IO.read(path))
+ end
+ Dir.chdir(cwd) # change back to original directory
+ return work_tree
else
- layouts[path] or get_layout(layouts, path.split("/")[0..-2].join("/"))
+ return @wiki.tree_map_for(version).map do |entry|
+ OpenStruct.new(:path => entry.path, :data => entry.blob(@wiki.repo).data)
+ end
end
end
- def render_page(page, layout=nil)
- if layout.nil?
- return page.formatted_data
+ # path must be relative to top level of wiki repo
+ def update_working_item(path)
+ filename = ::File.basename(path)
+ dirname = ::File.dirname(path)
+ if filename =~ /^_Footer./
+ # ignore
+ elsif filename =~ /^_Layout.html/
+ # layout
+ elsif @wiki.page_class.valid_page_name?(filename)
+ # page
+ abspath = ::File.join(@wiki.repo.git.work_tree, path)
+ page = @wiki.page_class.new(@wiki)
+ blob = OpenStruct.new(:name => filename, :data => IO.read(abspath))
+ page.populate(blob, dirname)
+ page.version = @commit
+ @pages[page.name.downcase] = page
+ page.generate(@output_path, @version)
else
- return layout.render( 'page' => page_to_liquid(page),
- 'wiki' => wiki_to_liquid(page.wiki))
+ # file
+ data = IO.read(abspath)
+ @files[path] = data
+ path = ::File.join(@output_path, path)
+ ::FileUtils.mkdir_p(::File.dirname(path))
+ ::File.open(path, "w") do |f|
+ f.write(data)
+ end
end
end
- def page_to_liquid(page)
- {"content" => page.formatted_data,
- "title" => page.title,
- "format" => page.format.to_s,
- "author" => page.version.author.name,
- "date" => page.version.authored_date.strftime("%Y-%m-%d %H:%M:%S")}
- end
+ # Public: generate the static site
+ def generate()
+ ::Dir.mkdir(@output_path) unless ::File.exists? @output_path
- def wiki_to_liquid(wiki)
- {"base_path" => wiki.base_path}
+ @pages.each do |name, page|
+ page.generate(@output_path, @version)
+ end
+
+ @files.each do |path, data|
+ path = ::File.join(@output_path, path)
+ ::FileUtils.mkdir_p(::File.dirname(path))
+ ::File.open(path, "w") do |f|
+ f.write(data)
+ end
+ end
end
end
end