module Polyblock module ApplicationHelper def pb(name, options={}) options = { :editable => false, :tag => :div, :tag_options => {}, :condensed => false, :length => 250, :omission => '... (continued)' }.merge(options) # Fetch or create Polyblock if name.is_a? Polyblock::Block pb = name pb_id = pb.id name = pb.name pb_exists = true else matches = Polyblock::Block.where :name => name pb_exists = matches.any? pb = pb_exists ? matches.first : Polyblock::Block.new({:name => name}) pb_id = if pb_exists pb.id else Polyblock::Block.any? ? Polyblock::Block.order(:id).last.id + 1 : 1 end end # Generate a random string for id o = [('a'..'z'), ('A'..'Z')].map { |i| i.to_a }.flatten random_id = (0...50).map { o[rand(o.length)] }.join # Build output tag content = pb_exists ? pb.content : "

This block is content managed by Polyblock!
Click to edit me!

" tag_options = options[:tag_options].deep_merge({:id => "pb-#{pb_id}-#{random_id}", :data => {:pbid => pb_id, :pbname => name}}) tag_options[:contenteditable] = if options[:condensed] "false" elsif options[:editable] "true" elsif respond_to?(:can?) && can?(:manage, pb) "true" elsif respond_to?(:user_signed_in?) && user_signed_in? if current_user.respond_to?(:admin?) && current_user.admin? "true" elsif pb.contentable.present? && pb.contentable.respond_to?(:user_id) && pb.contentable.user_id == current_user.id "true" else "false" end else "false" end tag_options[:class] = (tag_options.has_key?(:class) ? "#{tag_options[:class]} ":"") + "polyblock" tag_options[:data][:pb_exists] = pb_exists # Truncation if options[:condensed] tag_options[:class] += " polyblock-condensed" content = CGI.unescapeHTML(content.gsub("

", "
").gsub(' ', ' ')) content = truncate(sanitize(strip_tags(content)), :length => options[:length], :omission => options[:omission]).html_safe end content_tag(options[:tag], content, tag_options, false) end def simple_fields_for_polyblock(name, f, options={}) options = { :label => false, :input_html => {} }.merge(options) render :partial => "polyblock/simple_fields_for", :locals => {:f => f, :name => name, :options => options} end def polyblock_editor_bar render :partial => "polyblock/editor_bar" end end end