hancock_cms_seo 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +4 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +86 -0
  9. data/Rakefile +1 -0
  10. data/app/assets/javascripts/hancock/rails_admin/plugins/seo.coffee +4 -0
  11. data/app/assets/javascripts/hancock/rails_admin/plugins/seo/custom/ui.coffee +0 -0
  12. data/app/assets/stylesheets/hancock/rails_admin/plugins/seo.sass +3 -0
  13. data/app/assets/stylesheets/hancock/rails_admin/plugins/seo/custom/theming.sass +0 -0
  14. data/app/assets/stylesheets/hancock/rails_admin/plugins/seo/footer_nav_links.sass +16 -0
  15. data/app/controllers/concerns/hancock/seo/x_frame_options.rb +42 -0
  16. data/app/helpers/hancock/seo/seo_helper.rb +60 -0
  17. data/app/models/concerns/hancock/seo/decorators/seo.rb +60 -0
  18. data/app/models/concerns/hancock/seo/decorators/sitemap_data.rb +35 -0
  19. data/app/models/concerns/hancock/seo/seoable.rb +71 -0
  20. data/app/models/concerns/hancock/seo/sitemap_data_field.rb +37 -0
  21. data/app/models/concerns/hancock/seo/sitemapable.rb +7 -0
  22. data/app/models/hancock/seo/seo.rb +16 -0
  23. data/app/models/hancock/seo/sitemap_data.rb +16 -0
  24. data/app/views/blocks/_seo_block.html.slim +25 -0
  25. data/app/views/blocks/_seo_block_with_obj.html.slim +18 -0
  26. data/app/views/hancock/seo/blocks/_ga.html.slim +8 -0
  27. data/app/views/hancock/seo/blocks/_ym.html.slim +31 -0
  28. data/app/views/shared/_meta.html.slim +28 -0
  29. data/app/views/shared/_obj_with_seo.html.slim +38 -0
  30. data/app/views/shared/_og.html.slim +4 -0
  31. data/bin/console +14 -0
  32. data/bin/setup +7 -0
  33. data/config/initializers/hancock_seo.rb +7 -0
  34. data/config/locales/ru.hancock.seo.yml +37 -0
  35. data/hancock_cms_seo.gemspec +40 -0
  36. data/lib/generators/hancock/seo/config/config_generator.rb +13 -0
  37. data/lib/generators/hancock/seo/config/templates/hancock_seo.erb +10 -0
  38. data/lib/generators/hancock/seo/migrations/migrations_generator.rb +18 -0
  39. data/lib/generators/hancock/seo/migrations/templates/migration_seos.rb +48 -0
  40. data/lib/generators/hancock/seo/models/decorators_generator.rb +24 -0
  41. data/lib/generators/hancock/seo/models/seo_generator.rb +39 -0
  42. data/lib/generators/hancock/seo/models/sitemap_data_generator.rb +39 -0
  43. data/lib/generators/hancock/seo/models/templates/seo.erb +57 -0
  44. data/lib/generators/hancock/seo/models/templates/sitemap_data.erb +31 -0
  45. data/lib/generators/hancock/seo/sitemap/sitemap_generator.rb +27 -0
  46. data/lib/generators/hancock/seo/sitemap/templates/sitemap.erb +31 -0
  47. data/lib/hancock/seo/admin.rb +24 -0
  48. data/lib/hancock/seo/admin/seo.rb +69 -0
  49. data/lib/hancock/seo/admin/sitemap_data.rb +47 -0
  50. data/lib/hancock/seo/configuration.rb +29 -0
  51. data/lib/hancock/seo/engine.rb +44 -0
  52. data/lib/hancock/seo/models/active_record/seo.rb +14 -0
  53. data/lib/hancock/seo/models/active_record/sitemap_data.rb +11 -0
  54. data/lib/hancock/seo/models/mongoid/seo.rb +25 -0
  55. data/lib/hancock/seo/models/mongoid/sitemap_data.rb +24 -0
  56. data/lib/hancock/seo/models/seo.rb +114 -0
  57. data/lib/hancock/seo/models/sitemap_data.rb +79 -0
  58. data/lib/hancock/seo/version.rb +5 -0
  59. data/lib/hancock_cms_seo.rb +43 -0
  60. data/release.sh +6 -0
  61. metadata +193 -0
@@ -0,0 +1,24 @@
1
+ require 'rails/generators'
2
+
3
+ module Hancock::Seo::Models
4
+ class DecoratorsGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../../../../../../app/models/concerns/hancock/seo/decorators', __FILE__)
6
+ argument :models, type: :array, default: []
7
+
8
+ desc 'Hancock::Seo Models decorators generator'
9
+ def decorators
10
+ copied = false
11
+ (models == ['all'] ? permitted_models : models & permitted_models).each do |m|
12
+ copied = true
13
+ copy_file "#{m}.rb", "app/models/concerns/hancock/seo/decorators/#{m}.rb"
14
+ end
15
+ puts "U need to set model`s name. One of this: #{permitted_models.join(", ")}." unless copied
16
+ end
17
+
18
+ private
19
+ def permitted_models
20
+ ['seo', 'sitemap_data']
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,39 @@
1
+ require 'rails/generators'
2
+
3
+ module Hancock::Seo::Models
4
+ class SeoGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../templates', __FILE__)
6
+ argument :class_name_arg, type: :string, default: ""
7
+
8
+ desc 'Hancock::Seo Seo Model generator'
9
+ def seo
10
+ template 'seo.erb', "app/models/#{file_name}.rb"
11
+ end
12
+
13
+ private
14
+ def class_name
15
+ class_name_arg.blank? ? "SetClassForSeo" : class_name_arg
16
+ end
17
+
18
+ def capitalized_class_name
19
+ class_name.capitalize
20
+ end
21
+
22
+ def camelcased_class_name
23
+ class_name.camelcase
24
+ end
25
+
26
+ def file_name
27
+ underscored_class_name
28
+ end
29
+
30
+ def underscored_class_name
31
+ camelcased_class_name.underscore
32
+ end
33
+
34
+ def underscored_pluralized_class_name
35
+ underscored_class_name.pluralize
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,39 @@
1
+ require 'rails/generators'
2
+
3
+ module Hancock::Seo::Models
4
+ class SitemapDataGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../templates', __FILE__)
6
+ argument :class_name_arg, type: :string, default: ""
7
+
8
+ desc 'Hancock::Seo SitemapData Model generator'
9
+ def sitemap_data
10
+ template 'sitemap_data.erb', "app/models/#{file_name}.rb"
11
+ end
12
+
13
+ private
14
+ def class_name
15
+ class_name_arg.blank? ? "SetClassForSitemapData" : class_name_arg
16
+ end
17
+
18
+ def capitalized_class_name
19
+ class_name.capitalize
20
+ end
21
+
22
+ def camelcased_class_name
23
+ class_name.camelcase
24
+ end
25
+
26
+ def file_name
27
+ underscored_class_name
28
+ end
29
+
30
+ def underscored_class_name
31
+ camelcased_class_name.underscore
32
+ end
33
+
34
+ def underscored_pluralized_class_name
35
+ underscored_class_name.pluralize
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,57 @@
1
+ class <%= camelcased_class_name %> < Hancock::Seo::Seo
2
+
3
+ # # after_save :og_image_auto_rails_admin_jcrop
4
+ # def og_image_auto_rails_admin_jcrop
5
+ # auto_rails_admin_jcrop(:og_image) # or nil for cancel autocrop
6
+ # end
7
+
8
+ # # hancock_cms_attached_file(:og_image)
9
+ # def og_image_styles
10
+ # {thumb: "160x120>", standard: "800x600>"}
11
+ # end
12
+ #
13
+ # def og_image_jcrop_options
14
+ # {}
15
+ # end
16
+
17
+
18
+ def set_default_seo
19
+ _obj = self.seoable
20
+ if _obj and _obj.set_default_seo?
21
+ self.h1 = _obj.default_seo_h1 if self.h1.blank?
22
+ self.title = _obj.default_seo_title if self.title.blank?
23
+ self.keywords = _obj.default_seo_keywords if self.keywords.blank?
24
+ self.description = _obj.default_seo_description if self.description.blank?
25
+ self.title = _obj.default_seo_og_title if self.title.blank?
26
+ end
27
+ end
28
+
29
+ ############ rails_admin ##############
30
+ def self.rails_admin_add_fields
31
+ [] #super
32
+ end
33
+
34
+ def self.rails_admin_add_config(config)
35
+ #super(config)
36
+ end
37
+
38
+ def self.admin_can_user_defined_actions
39
+ [].freeze
40
+ end
41
+ def self.admin_cannot_user_defined_actions
42
+ [].freeze
43
+ end
44
+ def self.manager_can_user_defined_actions
45
+ [].freeze
46
+ end
47
+ def self.manager_cannot_user_defined_actions
48
+ [].freeze
49
+ end
50
+ def self.rails_admin_user_defined_visible_actions
51
+ [].freeze
52
+ end
53
+
54
+ rails_admin(&Hancock::Seo::Admin::Seo.config(rails_admin_add_fields) { |config|
55
+ rails_admin_add_config(config)
56
+ })
57
+ end
@@ -0,0 +1,31 @@
1
+ class <%= camelcased_class_name %> < Hancock::Seo::SitemapData
2
+
3
+ ############ rails_admin ##############
4
+ def self.rails_admin_add_fields
5
+ [] #super
6
+ end
7
+
8
+ def self.rails_admin_add_config(config)
9
+ #super(config)
10
+ end
11
+
12
+ def self.admin_can_user_defined_actions
13
+ [].freeze
14
+ end
15
+ def self.admin_cannot_user_defined_actions
16
+ [].freeze
17
+ end
18
+ def self.manager_can_user_defined_actions
19
+ [].freeze
20
+ end
21
+ def self.manager_cannot_user_defined_actions
22
+ [].freeze
23
+ end
24
+ def self.rails_admin_user_defined_visible_actions
25
+ [].freeze
26
+ end
27
+
28
+ rails_admin(&Hancock::Seo::Admin::SitemapData.config(rails_admin_add_fields) { |config|
29
+ rails_admin_add_config(config)
30
+ })
31
+ end
@@ -0,0 +1,27 @@
1
+ require 'rails/generators'
2
+
3
+ module Hancock::Seo
4
+ class SitemapGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../templates', __FILE__)
6
+ argument :host_arg, type: :string
7
+
8
+ desc 'Hancock::Seo Sitemap config generator'
9
+ def sitemap
10
+ template 'sitemap.erb', "config/sitemap.rb"
11
+ end
12
+
13
+ def host
14
+ _host = host_arg.blank? ? "http://host.domain" : host_arg
15
+ if defined?(Addressable)
16
+ Addressable::URI.heuristic_parse(_host).to_s
17
+ else
18
+ if _host =~ /^https?\:\/\//
19
+ _host
20
+ else
21
+ _host = "http://#{_host}"
22
+ end
23
+ end
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,31 @@
1
+ require 'rubygems'
2
+ require 'sitemap_generator'
3
+
4
+ # saved_default_url_options_host = default_url_options[:host]
5
+ saved_default_url_options_only_path = default_url_options[:only_path]
6
+ default_url_options[:only_path] = true
7
+ # default_url_options[:host] = ""
8
+ SitemapGenerator::Sitemap.default_host = '<%= host %>'
9
+ SitemapGenerator::Sitemap.create do
10
+
11
+ Hancock::Seo::SitemapData.enabled.for_sitemap.all.to_a.each do |sd|
12
+ obj = sd.sitemap_data_field
13
+ next if(!obj or (defined?(Hancock::Pages::Page) and obj.is_a?(Hancock::Pages::Page) and obj.fullpath == "/"))
14
+
15
+ begin
16
+ _lastmod = sd.sitemap_lastmod.to_date unless sd.sitemap_lastmod.nil?
17
+ _lastmod = sd.updated_at.to_date unless sd.updated_at.nil? if _lastmod.nil?
18
+ _lastmod = sd.created_at.to_date unless sd.created_at.nil? if _lastmod.nil?
19
+ _url = obj.is_a?(Hancock::Pages::Page) ? obj.fullpath : url_for(obj)
20
+
21
+ add _url,
22
+ :lastmod => _lastmod,
23
+ :changefreq => "#{sd.sitemap_changefreq.blank? ? 'daily' : sd.sitemap_changefreq}",
24
+ :priority => (sd.sitemap_priority.nil? ? 0.9 : sd.sitemap_priority)
25
+ rescue
26
+ end
27
+ end
28
+
29
+ end
30
+ # default_url_options[:host] = saved_default_url_options_host
31
+ default_url_options[:only_path] = saved_default_url_options_only_path
@@ -0,0 +1,24 @@
1
+ module Hancock::Seo
2
+ module Admin
3
+
4
+ def self.seo_n_sitemap_block(is_active = false, options = {})
5
+ if is_active.is_a?(Hash)
6
+ is_active, options = (is_active[:active] || false), is_active
7
+ end
8
+
9
+ Proc.new {
10
+ active is_active
11
+ label options[:label] || I18n.t('hancock.seo_n_sitemap')
12
+ field :seo
13
+ field :sitemap_data
14
+
15
+ Hancock::RailsAdminGroupPatch::hancock_cms_group(self, options[:fields] || {})
16
+
17
+ if block_given?
18
+ yield self
19
+ end
20
+ }
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,69 @@
1
+ module Hancock::Seo
2
+ module Admin
3
+ module Seo
4
+ def self.config(nav_label = nil, fields = {})
5
+ if nav_label.is_a?(Hash)
6
+ nav_label, fields = nav_label[:nav_label], nav_label
7
+ elsif nav_label.is_a?(Array)
8
+ nav_label, fields = nil, nav_label
9
+ end
10
+
11
+ Proc.new {
12
+ navigation_label(!nav_label.blank? ? nav_label : 'SEO')
13
+
14
+ label I18n.t('hancock.seo.seo')
15
+ field :seoable do
16
+ read_only true
17
+ pretty_value do
18
+ v = bindings[:view]
19
+ [value].flatten.select(&:present?).collect do |associated|
20
+ amc = polymorphic? ? RailsAdmin.config(associated) : associated_model_config # perf optimization for non-polymorphic associations
21
+ am = amc.abstract_model
22
+ wording = associated.send(amc.object_label_method)
23
+ wording = "#{wording} (#{am.model.model_name.human})"
24
+ can_see = !am.embedded? && (show_action = v.action(:show, am, associated))
25
+ can_see ? v.link_to(wording, v.url_for(action: show_action.action_name, model_name: am.to_param, id: associated.id), class: 'pjax') : ERB::Util.html_escape(wording)
26
+ end.to_sentence.html_safe
27
+ end
28
+ end
29
+ field :h1, :string do
30
+ searchable true
31
+ end
32
+ field :title, :string do
33
+ searchable true
34
+ end
35
+ field :author, :string do
36
+ searchable true
37
+ end
38
+ field :keywords, :text do
39
+ searchable true
40
+ end
41
+ field :description, :text do
42
+ searchable true
43
+ end
44
+ field :robots, :string do
45
+ searchable true
46
+ end
47
+
48
+ field :og_title, :string do
49
+ searchable true
50
+ end
51
+
52
+ if Hancock::Seo.config.gallery_support
53
+ field :og_image, :hancock_image
54
+ end
55
+
56
+ if Hancock::Seo.config.cache_support
57
+ group :caching, &Hancock::Cache::Admin.caching_block
58
+ end
59
+
60
+ Hancock::RailsAdminGroupPatch::hancock_cms_group(self, fields)
61
+
62
+ if block_given?
63
+ yield self
64
+ end
65
+ }
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,47 @@
1
+ module Hancock::Seo
2
+ module Admin
3
+ module SitemapData
4
+ def self.config(nav_label = nil, fields = {})
5
+ if nav_label.is_a?(Hash)
6
+ nav_label, fields = nav_label[:nav_label], nav_label
7
+ elsif nav_label.is_a?(Array)
8
+ nav_label, fields = nil, nav_label
9
+ end
10
+
11
+ Proc.new {
12
+ navigation_label(!nav_label.blank? ? nav_label : 'SEO')
13
+
14
+ label I18n.t('hancock.seo.sitemap_data')
15
+ field :sitemap_data_field do
16
+ read_only true
17
+ pretty_value do
18
+ v = bindings[:view]
19
+ [value].flatten.select(&:present?).collect do |associated|
20
+ amc = polymorphic? ? RailsAdmin.config(associated) : associated_model_config # perf optimization for non-polymorphic associations
21
+ am = amc.abstract_model
22
+ wording = associated.send(amc.object_label_method)
23
+ wording = "#{wording} (#{am.model.model_name.human})"
24
+ can_see = !am.embedded? && (show_action = v.action(:show, am, associated))
25
+ can_see ? v.link_to(wording, v.url_for(action: show_action.action_name, model_name: am.to_param, id: associated.id), class: 'pjax') : ERB::Util.html_escape(wording)
26
+ end.to_sentence.html_safe
27
+ end
28
+ end
29
+ field :sitemap_show, :toggle
30
+ field :sitemap_lastmod
31
+ field :sitemap_changefreq, :enum do
32
+ enum do
33
+ Hancock::Seo::SitemapData::SITEMAP_CHANGEFREQ_ARRAY
34
+ end
35
+ end
36
+ field :sitemap_priority
37
+
38
+ Hancock::RailsAdminGroupPatch::hancock_cms_group(self, fields)
39
+
40
+ if block_given?
41
+ yield self
42
+ end
43
+ }
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,29 @@
1
+ module Hancock::Seo
2
+ include Hancock::PluginConfiguration
3
+
4
+ def self.config_class
5
+ Configuration
6
+ end
7
+
8
+ class Configuration
9
+ attr_accessor :localize
10
+
11
+ attr_accessor :gallery_support
12
+ attr_accessor :cache_support
13
+
14
+ attr_accessor :model_settings_support
15
+ attr_accessor :user_abilities_support
16
+ attr_accessor :ra_comments_support
17
+
18
+ def initialize
19
+ @localize = Hancock.config.localize
20
+
21
+ @gallery_support = !!defined?(Hancock::Gallery)
22
+ @cache_support = !!defined?(Hancock::Cache)
23
+
24
+ @model_settings_support = !!defined?(RailsAdminModelSettings)
25
+ @user_abilities_support = !!defined?(RailsAdminUserAbilities)
26
+ @ra_comments_support = !!defined?(RailsAdminComments)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,44 @@
1
+ module Hancock::Seo
2
+ class Engine < ::Rails::Engine
3
+ # isolate_namespace Hancock::Seo
4
+
5
+ # rake_tasks do
6
+ # require File.expand_path('../tasks', __FILE__)
7
+ # end
8
+
9
+ # initializer "hancock_cms_seo.counters_defaults" do
10
+ # # Write default email settings to DB so they can be changed.
11
+ #
12
+ # #temp
13
+ # begin
14
+ # if Settings and Settings.table_exists?
15
+ # _cache_key = "ym_counter".freeze
16
+ # Settings.ym_counter_id(default: '', kind: :string, label: 'Yandex Метрика ID'.freeze, cache_keys: _cache_key)
17
+ # Settings.ym_counter_html(default: '', kind: :html, label: 'Yandex Метрика HTML-код'.freeze, cache_keys: _cache_key)
18
+ #
19
+ # _cache_key = "ga_counter".freeze
20
+ # Settings.ga_counter_id(default: '', kind: :string, label: 'Google Analitics ID'.freeze, cache_keys: _cache_key)
21
+ # Settings.ga_counter_html(default: '', kind: :html, label: 'Google Analitics HTML-код'.freeze, cache_keys: _cache_key)
22
+ # end
23
+ # rescue
24
+ # end
25
+ # end
26
+
27
+ config.after_initialize do
28
+ # Write default email settings to DB so they can be changed.
29
+ begin
30
+ if Settings and Settings.table_exists?
31
+ _cache_key = "ym_counter".freeze
32
+ Settings.ym_counter_id(default: '', kind: :string, label: 'Yandex Метрика ID'.freeze, cache_keys: _cache_key) unless RailsAdminSettings::Setting.ns("main").where(key: "ym_counter_id").exists?
33
+ Settings.ym_counter_html(default: '', kind: :html, label: 'Yandex Метрика HTML-код'.freeze, cache_keys: _cache_key) unless RailsAdminSettings::Setting.ns("main").where(key: "ym_counter_html").exists?
34
+
35
+ _cache_key = "ga_counter".freeze
36
+ Settings.ga_counter_id(default: '', kind: :string, label: 'Google Analitics ID'.freeze, cache_keys: _cache_key) unless RailsAdminSettings::Setting.ns("main").where(key: "ga_counter_id").exists?
37
+ Settings.ga_counter_html(default: '', kind: :html, label: 'Google Analitics HTML-код'.freeze, cache_keys: _cache_key) unless RailsAdminSettings::Setting.ns("main").where(key: "ga_counter_html").exists?
38
+ end
39
+ rescue
40
+ end
41
+ end
42
+
43
+ end
44
+ end