require 'ronn' require 'rack' require 'sinatra/base' module Ronn # Ronn HTTP server. Serves a list of .ronn files as HTML. The options Hash is # passed to Ronn::Document.new on each invocation. # # Use Ronn::Server.new to create a Rack app. See the config.ru file in the # root of the Ronn distribution for example usage. # # Ronn::Server.run starts a server on port 1207. module Server def self.new(files, options = {}) files = Dir[files] if files.respond_to?(:to_str) raise ArgumentError, 'no files' if files.empty? Sinatra.new do set :show_exceptions, true set :public_dir, File.expand_path(__FILE__, '../templates') set :static, false set :views, File.expand_path(__FILE__, '../templates') get '/' do files.map do |f| base = File.basename(f, '.ronn') "
  • #{escape_html(base)}
  • " end end options[:styles] ||= options[:style] my_styles = if options[:styles].respond_to?(:to_ary) options[:styles] elsif options[:styles] options[:styles].split(/[, ]+/) else [] end files.each do |file| basename = File.basename(file, '.ronn') get "/#{basename}.html" do options = options.merge(styles: my_styles) %w[date manual organization].each do |attribute| next unless params[attribute] options[attribute] = params[attribute] end Ronn::Document.new(file, options).to_html end get "/#{basename}.roff" do content_type 'text/plain+roff' Ronn::Document.new(file, options.dup).to_roff end end end end def self.run(files, options = {}) port_number = options['port'] || 1207 new(files, options).run!( server: %w[mongrel thin webrick], port: port_number, logging: true ) end end end