blog.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:7k
源码类别:

Ajax

开发平台:

Others

  1. # BlogRequest is a fake Request object, created so blog.url_for will work.
  2. class BlogRequest
  3.   attr_accessor :protocol, :host_with_port, :path, :symbolized_path_parameters, :relative_url_root
  4.   def initialize(root)
  5.     unless root =~ /(https?)://([^/]*)(.*)/
  6.       raise "Invalid root argument: #{root}"
  7.     end
  8.     @protocol = $1
  9.     @host_with_port = $2
  10.     @relative_url_root = $3.gsub(%r{/$},'')
  11.     @path = ''
  12.     @symbolized_path_parameters = {}
  13.   end
  14. end
  15. # The Blog class represents the one and only blog.  It stores most
  16. # configuration settings and is linked to most of the assorted content
  17. # classes via has_many.
  18. #
  19. # Once upon a time, there were plans to make typo handle multiple blogs,
  20. # but it never happened and typo is now firmly single-blog.
  21. #
  22. class Blog < ActiveRecord::Base
  23.   include ConfigManager
  24.   extend ActiveSupport::Memoizable
  25.   validate_on_create { |blog|
  26.     unless Blog.count.zero?
  27.       blog.errors.add_to_base("There can only be one...")
  28.     end
  29.   }
  30.   serialize :settings, Hash
  31.   # Description
  32.   setting :blog_name,                  :string, 'My Shiny Weblog!'
  33.   setting :blog_subtitle,              :string, ''
  34.   setting :title_prefix,               :integer, 0
  35.   setting :geourl_location,            :string, ''
  36.   setting :canonical_server_url,       :string, ''  # Deprecated
  37.   setting :lang,                       :string, 'en_US'
  38.   # Spam
  39.   setting :sp_global,                  :boolean, false
  40.   setting :sp_article_auto_close,      :integer, 0
  41.   setting :sp_url_limit,               :integer, 0
  42.   setting :sp_akismet_key,             :string, ''
  43.   # Mostly Behaviour
  44.   setting :text_filter,                :string, 'markdown smartypants'
  45.   setting :comment_text_filter,        :string, 'markdown smartypants'
  46.   setting :limit_article_display,      :integer, 10
  47.   setting :limit_rss_display,          :integer, 10
  48.   setting :default_allow_pings,        :boolean, false
  49.   setting :default_allow_comments,     :boolean, true
  50.   setting :default_moderate_comments,  :boolean, false
  51.   setting :link_to_author,             :boolean, false
  52.   setting :show_extended_on_rss,       :boolean, true
  53.   setting :theme,                      :string, 'true-blue-3'
  54.   setting :use_gravatar,               :boolean, false
  55.   setting :global_pings_disable,       :boolean, false
  56.   setting :ping_urls,                  :string, "http://blogsearch.google.com/ping/RPC2nhttp://rpc.technorati.com/rpc/pingnhttp://ping.blo.gs/nhttp://rpc.weblogs.com/RPC2"
  57.   setting :send_outbound_pings,        :boolean, true
  58.   setting :email_from,                 :string, 'typo@example.com'
  59.   setting :editor,                     :integer, 'visual'
  60.   setting :cache_option,               :string, 'caches_page'
  61.   setting :allow_signup,               :integer, 0
  62.   # SEO
  63.   setting :meta_description,           :string, ''
  64.   setting :meta_keywords,              :string, ''
  65.   setting :google_analytics,           :string, ''
  66.   setting :feedburner_url,             :string, ''
  67.   setting :rss_description,            :boolean, false
  68.   setting :permalink_format,           :string, '/%year%/%month%/%day%/%title%'
  69.   setting :robots,                     :string, ''
  70.   setting :index_categories,           :boolean, true
  71.   setting :index_tags,                 :boolean, true
  72.   setting :admin_display_elements,     :integer, 10
  73.   #deprecation warning for plugins removal
  74.   setting :deprecation_warning,        :integer, 1
  75.   validate :permalink_has_identifier
  76.   def initialize(*args)
  77.     super
  78.     # Yes, this is weird - PDC
  79.     begin
  80.       self.settings ||= {}
  81.     rescue Exception => e
  82.       self.settings = {}
  83.     end
  84.   end
  85.   # The default Blog. This is the lowest-numbered blog, almost always
  86.   # id==1. This should be the only blog as well.
  87.   def self.default
  88.     find(:first, :order => 'id')
  89.   rescue
  90.     logger.warn 'You have no blog installed.'
  91.     nil
  92.   end
  93.   # In settings with :article_id
  94.   def ping_article!(settings)
  95.     unless global_pings_enabled? && settings.has_key?(:url) && settings.has_key?(:article_id)
  96.       throw :error, "Invalid trackback or trackbacks not enabled"
  97.     end
  98.     settings[:blog_id] = self.id
  99.     article = Article.find(settings[:article_id])
  100.     unless article.allow_pings?
  101.       throw :error, "Trackback not saved"
  102.     end
  103.     article.trackbacks.create!(settings)
  104.   end
  105.   def global_pings_enabled?
  106.     ! global_pings_disable?
  107.   end
  108.   # Check that all required blog settings have a value.
  109.   def configured?
  110.     settings.has_key?('blog_name')
  111.   end
  112.   # The +Theme+ object for the current theme.
  113.   def current_theme
  114.     Theme.find(theme)
  115.   end
  116.   memoize :current_theme
  117.   # Generate a URL based on the +base_url+.  This allows us to generate URLs
  118.   # without needing a controller handy, so we can produce URLs from within models
  119.   # where appropriate.
  120.   #
  121.   # It also caches the result in the RouteCache, so repeated URL generation
  122.   # requests should be fast, as they bypass all of Rails' route logic.
  123.   def url_for(options = {}, extra_params = {})
  124.     @request ||= BlogRequest.new(self.base_url)
  125.     case options
  126.     when String
  127.       if extra_params[:only_path]
  128.         url_generated = @request.relative_url_root
  129.       else
  130.         url_generated = self.base_url
  131.       end
  132.       url_generated += "/#{options}" # They asked for 'url_for "/some/path"', so return it unedited.
  133.       url_generated += "##{extra_params[:anchor]}" if extra_params[:anchor]
  134.       url_generated
  135.     when Hash
  136.       unless RouteCache[options]
  137.         options.reverse_merge!(:only_path => false, :controller => '',
  138.                                :action => 'permalink')
  139.         @url ||= ActionController::UrlRewriter.new(@request, {})
  140.         if ActionController::Base.relative_url_root.nil?
  141.           old_relative_url = nil
  142.         else
  143.           old_relative_url = ActionController::Base.relative_url_root.dup
  144.         end
  145.         ActionController::Base.relative_url_root = @request.relative_url_root
  146.         RouteCache[options] = @url.rewrite(options)
  147.         ActionController::Base.relative_url_root = old_relative_url
  148.       end
  149.       return RouteCache[options]
  150.     else
  151.       raise "Invalid URL in url_for: #{options.inspect}"
  152.     end
  153.   end
  154.   # The URL for a static file.
  155.   def file_url(filename)
  156.     "#{base_url}/files/#{filename}"
  157.   end
  158.   def requested_article(params)
  159.     Article.find_by_params_hash(params)
  160.   end
  161.   def articles_matching(query, args={})
  162.     Article.search(query, args)
  163.   end
  164.   def rss_limit_params
  165.     limit = limit_rss_display.to_i
  166.     return limit.zero? 
  167.       ? {} 
  168.       : {:limit => limit}
  169.   end
  170.   def permalink_has_identifier
  171.     unless permalink_format =~ /(%year%|%month%|%day%|%title%)/
  172.       errors.add(:permalink_format, _("You need a permalink format with an identifier : %%month%%, %%year%%, %%day%%, %%title%%"))
  173.     end
  174.     # A permalink cannot end in .atom or .rss. it's reserved for the feeds
  175.     if permalink_format =~ /.(atom|rss)$/
  176.       errors.add(:permalink_format, _("Can't end in .rss or .atom. These are reserved to be used for feed URLs"))
  177.     end
  178.   end
  179. end