lib/spontaneous/plugins/page/formats.rb in spontaneous-0.2.0.alpha2 vs lib/spontaneous/plugins/page/formats.rb in spontaneous-0.2.0.alpha3

- old
+ new

@@ -5,88 +5,113 @@ module Spontaneous::Plugins::Page module Formats extend ActiveSupport::Concern module ClassMethods - def formats(*formats) - return format_list if formats.nil? or formats.empty? - set_formats(formats) + def outputs(*outputs) + return output_list if outputs.nil? or outputs.empty? + set_outputs(outputs) end - def format_list - @formats ||= supertype_formats + def output_map + @outputs ||= supertype_outputs end - def mime_types - @mime_types ||= supertype_mimetypes + def output_list + output_map.values end - def add_format(new_format) - format = define_format(new_format) - format_list.push(format) + def add_output(format, *args) + options = args.extract_options! + output = define_and_add_output(format, options) end - def set_formats(formats) - formats = formats.flatten - mime_types.clear - format_list.clear - formats.map do |format| - format_list.push define_format(format) + def set_outputs(outputs) + output_map.clear + outputs.each do |definition| + define_and_add_output(*definition) end end - def define_format(format) - mime_type = nil - if format.is_a?(Hash) - mime_type = format.values.first - format = format.keys.first - mime_types[format.to_sym] = mime_type - else - mime_type = ::Rack::Mime.mime_type(".#{format}", nil) + def define_and_add_output(format, options = {}) + output = define_output(format, options) + output_map[output.name] = output + end + + def define_output(format, options = {}) + o = Spontaneous::Output.create(format, options).tap do |output| + silence_warnings { self.const_set("Output#{format.to_s.upcase}", output) } end - raise Spontaneous::UnknownFormatException.new(format) unless mime_type - format.to_sym end - def supertype_formats - supertype? && supertype.respond_to?(:formats) ? supertype.formats.dup : [:html] + def supertype_outputs + supertype? && supertype.respond_to?(:outputs) ? supertype.output_map.dup : { :html => standard_output } end - def supertype_mimetypes - supertype? && supertype.respond_to?(:mime_types) ? supertype.mime_types.dup : {} + def standard_output + define_output(:html) end - def default_format - formats.first + def default_output + output_list.first end def provides_format?(format) - format = (format || :html).to_sym - formats.include?(format) + return true if format.blank? + format = format.to_s + outputs.any? { |output| (output == format) or (output.name.to_s == format) } end + alias_method :provides_output?, :provides_format? + + def output(name = nil) + output_without_validation(name) or raise Spontaneous::UnknownOutputException.new(self, name) + end + + def output_without_validation(name = nil) + return name if name.is_a?(Spontaneous::Output::Format) + return default_output if name.blank? + output_map[name.to_sym] + end + def mime_type(format) - if mime_types && mime_types.key?(format) - mime_types[format] + return format.mime_type if format.respond_to?(:mime_type) + if (match = output_without_validation(format)) + match.mime_type else ::Rack::Mime.mime_type(".#{format}") end end end # ClassMethods - def formats - self.class.formats + def outputs + self.class.outputs.map { |output| output.new(self) } end - def default_format - self.class.default_format + def default_output + self.class.default_output.new(self) end - def provides_format?(format) - self.class.provides_format?(format) + def provides_output?(format) + self.class.provides_output?(format) end + def output(format, content = nil) + return format if format.is_a?(Spontaneous::Output::Format) + output_class = self.class.output(format) + output_class.new(self, content) + end + def mime_type(format) self.class.mime_type(format) + end + + def render(format=:html, params={}, *args) + if format.is_a?(Hash) + params = format + format = :html + end + output = output(format) + output.render(params, *args) end end # Formats end # Spontaneous::Plugins::Page