lib/nwiki.rb in nwiki-0.0.1 vs lib/nwiki.rb in nwiki-0.0.2
- old
+ new
@@ -1,102 +1,4 @@
# -*- coding: utf-8 -*-
require 'nwiki/version'
-
-require 'rss'
-require "grit"
-require "org-ruby"
-require "rack/mime"
-
-module Nwiki
- class Articles
- def initialize opt
- @data_file_directory = opt[:data_file_directory]
- @articles_url_prefix = opt[:articles_url_prefix]
- @file_encoding = opt[:file_encoding]
- @site_title = opt[:site_title].force_encoding(@file_encoding)
- end
-
- def call env
- file_path = convert_file_path(env["PATH_INFO"])
- return [403, {"Content-Type" => "text/plane"}, ["forbidden."]] if file_path.include? ".."
- tree = Grit::Repo.new(@data_file_directory).commits.first.tree
- case result = tree/file_path || tree/(file_path + '.org')
- when Grit::Tree
- if env["PATH_INFO"] =~ /\/$/
- list = "<ul><li><a href=\"../\">../</a></li>" + result.contents.map{ |c|
- case c
- when Grit::Tree
- %Q!<li><a href="#{c.name}/">#{c.name}/</a></li>!
- when Grit::Blob
- %Q!<li><a href="#{c.name}">#{c.name}</a></li>!
- else
- # TODO
- end
- }.sort.join("\n") + "</ul>"
- [200, {"Content-Type" => "text/html; charset=#{@file_encoding}"}, [wrap_html(@site_title, file_path.force_encoding(@file_encoding)){ list.force_encoding(@file_encoding) }]]
- else
- request_path = env["SCRIPT_NAME"] + env["PATH_INFO"]
- [301, {"Content-Type" => "text/plane; charset=#{@file_encoding}", "Location" => request_path + "/"}, ["redirect."]]
- end
- when Grit::Blob
- extname = File.extname(file_path)
- if extname == '.org' || extname == ''
- [200, {"Content-Type" => "text/html; charset=#{@file_encoding}"}, [wrap_html(@site_title, result.name.force_encoding(@file_encoding)){ Orgmode::Parser.new(result.data.force_encoding(@file_encoding), 1).to_html }]]
- else
- [200, {"Content-Type" => Rack::Mime.mime_type(File.extname(file_path), 'text/plain')}, [result.data]]
- end
- else
- [404, {"Content-Type" => "text/plane; charset=#{@file_encoding}"}, ["not found."]]
- end
- end
-
- def convert_file_path(str)
- path = str.
- gsub(%r!^#{@articles_url_prefix}!, '').
- gsub(%r!^/!, '')
- path.empty? ? '/' : URI.unescape(path).force_encoding(@file_encoding)
- end
-
- def wrap_html site_title, article_title
- html = ""
- html << "<!DOCTYPE html><html><head><title>#{article_title} - #{site_title}</title></head><body><h1>#{site_title}</h1>"
- html << yield if block_given?
- html << "</body></html>"
- end
- end
-
- class Feeds
- def initialize opt
- @data_file_directory = opt[:data_file_directory]
- @feeds_url_prefix = opt[:feeds_url_prefix]
- @articles_url_prefix = opt[:articles_url_prefix]
- @site_title = opt[:site_title]
- @site_description = opt[:site_description]
- @site_link = opt[:site_link]
- @site_author = opt[:site_author]
- end
-
- def call env
- feed = RSS::Maker.make("atom") do |maker|
- maker.channel.about = @site_link + @feeds_url_prefix
- maker.channel.title = @site_title
- maker.channel.description = @site_description
- maker.channel.link = @site_link
- maker.channel.author = @site_author
- maker.channel.date = Time.now
- maker.items.do_sort = true
- Grit::Repo.new(@data_file_directory).commits.map{ |history|
- history.diffs.map{ |diff|
- next nil if diff.deleted_file # FIXME how do we view deleted file?
- maker.items.new_item{ |item|
- path = diff.b_path.force_encoding('utf-8')
- item.link = "#{@site_link}#{@articles_url_prefix}/#{path}"
- item.title = File.basename(path)
- item.date = history.date
- }
- }.compact
- }.flatten
- end
- [200, {"Content-Type" => "text/xml"}, [feed.to_s]]
- end
- end
-end
+require 'nwiki/core'
+require 'nwiki/frontend'