lib/copy/server.rb in copy-0.1.7 vs lib/copy/server.rb in copy-0.2.0

- old
+ new

@@ -1,19 +1,19 @@ require 'sinatra/base' require 'erb' require 'redcarpet' -module Copy - class Server < Sinatra::Base +module Copy + class Server < Sinatra::Base set :views, './views' - set :public, './public' + set :public_folder, './public' set :root, File.dirname(File.expand_path(__FILE__)) - + helpers do include Rack::Utils alias_method :h, :escape_html - + def protected! unless authorized? response['WWW-Authenticate'] = %(Basic realm="Copy Admin Area") throw(:halt, [401, "Not authorized\n"]) end @@ -22,102 +22,103 @@ def authorized? return false unless settings.respond_to?(:copy_username) && settings.respond_to?(:copy_password) @auth ||= Rack::Auth::Basic::Request.new(request.env) @auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == [settings.copy_username, settings.copy_password] end - + def set_cache_control_header if settings.respond_to?(:cache_time) && settings.cache_time.is_a?(Numeric) && settings.cache_time > 0 expires settings.cache_time, :public else cache_control :no_cache end end - + def format_text(name, content, options = {}) original = content.dup # Apply markdown formatting. - content = Redcarpet.new(content, :smart).to_html.chomp - + markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, :autolink => true, :space_after_headers => true) + content = markdown.render(content).chomp + html_attrs = %Q(class="_copy_editable" data-name="#{name}") - + if original =~ /\n/ # content with newlines renders in a div tag = options[:wrap_tag] || :div %Q(<#{tag} #{html_attrs}>#{content}</#{tag}>) else # single line content renders in a span without <p> tags tag = options[:wrap_tag] || :span content.gsub!(/<\/*p>/, '') %Q(<#{tag} #{html_attrs}>#{content}</#{tag}>) end end - + def copy(name, options = {}, &block) if !Copy::Storage.connected? || !(content = Copy::Storage.get(name)) # Side-step the output buffer so we can capture the block, but not output it. @_out_buf, old_buffer = '', @_out_buf content = yield @_out_buf = old_buffer - + # Remove newlines from the beginning content.gsub!(/^\n/, '') # Get the first line from captured text. first_line = content.split("\n").first # Determine how much white space it has in front. white_space = first_line.match(/^(\s)*/)[0] # Remove that same amount of white space from the beginning of every line. content.gsub!(Regexp.new("^#{white_space}"), '') # Remove all whitespace from the end, but keep the newline if present. content.gsub!(/\s*\z/, '') << "\n" if content =~ /\n/ - + # Save the content so it can be edited. Copy::Storage.set(name, content) if Copy::Storage.connected? end - + # Append the output buffer. @_out_buf << format_text(name, content, options) end - + def partial(template) template_array = template.to_s.split('/') template = template_array[0..-2].join('/') + "/_#{template_array[-1]}.#{@_route.format}" send(@_route.renderer, template.to_sym, :layout => false) end end - + def self.config(&block) class_eval(&block) end - + before do if settings.respond_to?(:storage) && !Copy::Storage.connected? Copy::Storage.connect!(settings.storage) end end - + get '/_copy/?' do protected! ERB.new(File.read(settings.root + '/admin/index.html.erb')).result(self.send(:binding)) end - + get '/_copy.js' do protected! content_type(:js) ERB.new(File.read(settings.root + '/admin/index.js.erb')).result(self.send(:binding)) end - + get '/_copy/:name' do protected! @name = params[:name] @doc = Copy::Storage.get(params[:name]) ERB.new(File.read(settings.root + '/admin/edit.html.erb')).result(self.send(:binding)) end - + put '/_copy/:name' do protected! Copy::Storage.set(params[:name], params[:content]) format_text(params[:name], Copy::Storage.get(params[:name]), :wrap_tag => params[:wrap_tag]) end - + get '*' do @_route = Copy::Router.new(params[:splat].first, settings.views) if @_route.success? set_cache_control_header content_type(@_route.format) \ No newline at end of file