hancock_cms_seo 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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