require 'json' module Polyblock class Block < ActiveRecord::Base attr_accessor :settings_cache DEFAULTS = { :association => { :class_name => "Polyblock::Block", :as => :contentable, :dependent => :destroy }, :nested_attributes => {}, :validates => {}, :html => true, :default_text => "[Editable content space for Polyblock #{name}]" } belongs_to :contentable, :polymorphic => true before_save :strip_html_if_necessary def self.import(pbs) outputs = pbs.map do |pb| block = fetch_or_initialize pb[:name] block.content = pb[:content] if pb.key?(:content) && pb[:content].present? && pb[:content] != block.content block.save end outputs.include?(false) end def self.export output = all.as_json(:except => [:id, :created_at, :updated_at]) puts "" puts "Run the following in Rails Console on the remote server:" puts "" puts "Polyblock::Block.import(#{output})" puts "" end def settings return self.settings_cache unless self.settings_cache.nil? self.settings_cache = self.contentable.present? ? self.contentable.send("#{self.name}_settings") : DEFAULTS end def to_s content end def present? !nil? && content.present? end def blank? nil? || content.blank? end def system? self.contentable.nil? end def self.fetch_or_initialize(name) if name.is_a? Block name elsif name.is_a? String matches = where :name => name if matches.any? matches.first else new({:name => name}) end end end def self.fetch_or_create(name) pb = fetch_or_initialize(name) pb.save if pb.new_record? pb end def self.next_id any? ? maximum(:id).next : 1 end def self.random_id o = [('a'..'z'), ('A'..'Z')].map { |i| i.to_a }.flatten (0...50).map { o[rand(o.length)] }.join end def self.strip_html(str) output = str.gsub('

', '
').gsub(' ', ' ') output = CGI.unescapeHTML(output) output = ActionController::Base.helpers.strip_tags(output) output.html_safe end private def strip_html_if_necessary self.content = Block.strip_html(self.content) unless self.settings[:html] || self.content.nil? end end end