para-seo_tools 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +178 -0
- data/Rakefile +2 -0
- data/app/.DS_Store +0 -0
- data/app/components/seo_tools_skeleton_component.rb +7 -0
- data/app/controllers/.DS_Store +0 -0
- data/app/controllers/admin/para/seo_tools/skeleton_resources_controller.rb +21 -0
- data/app/decorators/seo_tools_skeleton_component_decorator.rb +3 -0
- data/app/helpers/para/seo_tools/admin/fields_helper.rb +15 -0
- data/app/models/para/seo_tools/page.rb +54 -0
- data/app/views/.DS_Store +0 -0
- data/app/views/admin/.DS_Store +0 -0
- data/app/views/admin/para/seo_tools/pages/_actions.html.haml +5 -0
- data/app/views/admin/para/seo_tools/pages/_filters.html.haml +25 -0
- data/app/views/admin/para/seo_tools/pages/_form.html.haml +13 -0
- data/app/views/admin/para/seo_tools/pages/_table.html.haml +20 -0
- data/app/views/admin/para/seo_tools/skeleton_resources/index.html.haml +4 -0
- data/bin/rails +12 -0
- data/config/locales/para-seo_tools.fr.yml +22 -0
- data/db/migrate/20150601085253_create_seo_tools_pages.rb +14 -0
- data/db/migrate/20160610094032_add_meta_tags_to_seo_tools_pages.rb +12 -0
- data/db/migrate/20160614081242_add_locale_and_remove_meta_tags_list_to_seo_tools_pages.rb +8 -0
- data/lib/generators/para/seo_tools/install/install_generator.rb +24 -0
- data/lib/generators/para/seo_tools/install/templates/initializer.rb +33 -0
- data/lib/generators/para/seo_tools/install/templates/skeleton.rb +37 -0
- data/lib/para/seo_tools/controller.rb +50 -0
- data/lib/para/seo_tools/engine.rb +27 -0
- data/lib/para/seo_tools/meta_tags/renderer.rb +80 -0
- data/lib/para/seo_tools/meta_tags/store.rb +52 -0
- data/lib/para/seo_tools/meta_tags/tags/base.rb +49 -0
- data/lib/para/seo_tools/meta_tags/tags/description.rb +54 -0
- data/lib/para/seo_tools/meta_tags/tags/image.rb +46 -0
- data/lib/para/seo_tools/meta_tags/tags/keywords.rb +20 -0
- data/lib/para/seo_tools/meta_tags/tags/title.rb +48 -0
- data/lib/para/seo_tools/meta_tags/tags/url.rb +13 -0
- data/lib/para/seo_tools/meta_tags/tags.rb +29 -0
- data/lib/para/seo_tools/meta_tags/vendors/base.rb +27 -0
- data/lib/para/seo_tools/meta_tags/vendors/open_graph.rb +23 -0
- data/lib/para/seo_tools/meta_tags/vendors/twitter.rb +23 -0
- data/lib/para/seo_tools/meta_tags/vendors.rb +17 -0
- data/lib/para/seo_tools/meta_tags.rb +12 -0
- data/lib/para/seo_tools/routes.rb +15 -0
- data/lib/para/seo_tools/sitemap.rb +13 -0
- data/lib/para/seo_tools/skeleton/page.rb +71 -0
- data/lib/para/seo_tools/skeleton/site.rb +18 -0
- data/lib/para/seo_tools/skeleton/worker.rb +11 -0
- data/lib/para/seo_tools/skeleton.rb +79 -0
- data/lib/para/seo_tools/version.rb +5 -0
- data/lib/para/seo_tools/view_helpers.rb +9 -0
- data/lib/para/seo_tools.rb +43 -0
- data/lib/tasks/migration.rake +20 -0
- data/lib/tasks/sitemap.rake +17 -0
- data/lib/tasks/skeleton.rake +9 -0
- data/para-seo_tools.gemspec +27 -0
- data/test/fixtures/seo_tools/pages.yml +11 -0
- data/test/models/seo_tools/page_test.rb +7 -0
- metadata +181 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 221bb39c998483d4271625e92a0ae8a99e60892d
|
4
|
+
data.tar.gz: 1f98d09e9135f026442dbda3f64dfeb300c1abf8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 28d2a040ebdc391c3ae165489e2aa190560b43a84fa200bf689d6e1bcd511639762b7d59eb117828d0b5addfe6f06f355d01f07cc664353d1d336432d8ea14f0
|
7
|
+
data.tar.gz: 375e465165815264dc4b89a61afdc6097e7a6ba7941ff5173bf088f4e189b62f324cc38ae0f13712004b7d1d405b73529320fbb12570b21c7a602dcdffbeca6d
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 vala
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,178 @@
|
|
1
|
+
# Para::SeoTools
|
2
|
+
|
3
|
+
The SEO Tools for Para allows to configure the sitemap and meta tags for your
|
4
|
+
Para CMS powered website.
|
5
|
+
|
6
|
+
You'll be able to easily define a sitemap for your app, and get an admin panel
|
7
|
+
for filling out all the pages' meta tags.
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'seo_tools-para'
|
15
|
+
```
|
16
|
+
|
17
|
+
And then execute:
|
18
|
+
|
19
|
+
```bash
|
20
|
+
bundle
|
21
|
+
```
|
22
|
+
|
23
|
+
Or install it yourself as:
|
24
|
+
|
25
|
+
```bash
|
26
|
+
gem install seo_tools-para
|
27
|
+
```
|
28
|
+
|
29
|
+
Run the installation generator :
|
30
|
+
|
31
|
+
```bash
|
32
|
+
rails generate seo_tools:install
|
33
|
+
```
|
34
|
+
|
35
|
+
## Usage
|
36
|
+
|
37
|
+
The idea is to define a simple Sitemap structure, and you'll be able to
|
38
|
+
edit those pages meta_tags from the admin panel, and a sitemap.xml will be
|
39
|
+
generatable with a simple Task.
|
40
|
+
|
41
|
+
In the following section, you'll find how to :
|
42
|
+
|
43
|
+
1. Define the sitemap
|
44
|
+
2. Display the meta tags admin panel
|
45
|
+
3. Generate a sitemap.xml
|
46
|
+
4. Retrieving meta tags in your app
|
47
|
+
|
48
|
+
|
49
|
+
### 1. Define the sitemap
|
50
|
+
|
51
|
+
When you run the `seo_tools:install` generator, a file is created at
|
52
|
+
`config/skeleton.rb` for you to create the sitemap.
|
53
|
+
|
54
|
+
This file allows you to define which pages you want to make available for
|
55
|
+
search engines indexation and optimization, through a simple DSL.
|
56
|
+
|
57
|
+
The pages are defined with the `page` method, and accepts some options.
|
58
|
+
|
59
|
+
The following will define the page `posts` and call `posts_path` to retrieve
|
60
|
+
its URL
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
page :posts
|
64
|
+
```
|
65
|
+
|
66
|
+
If you want to define the page path yourself, just add the `:path` option
|
67
|
+
to the `page` call
|
68
|
+
|
69
|
+
```ruby
|
70
|
+
page :home, path: root_path
|
71
|
+
```
|
72
|
+
|
73
|
+
When the page is linked to a resource : often, a #show page, you'll need to
|
74
|
+
pass the `:resource` option
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
Posts.find_each do |post|
|
78
|
+
page :post, resource: post
|
79
|
+
end
|
80
|
+
```
|
81
|
+
|
82
|
+
Also, you can pass options for the sitemap generation tool.
|
83
|
+
The options are `:priority`, `:change_frequency` which are left blank
|
84
|
+
by default.
|
85
|
+
|
86
|
+
```ruby
|
87
|
+
page :posts, priority: 1, change_frequency: 'weekly'
|
88
|
+
```
|
89
|
+
|
90
|
+
### 2. Display the meta tags admin panel
|
91
|
+
|
92
|
+
For the admin panel to display, all you'll need to do is create the component
|
93
|
+
in your Para's `components.rb`.
|
94
|
+
|
95
|
+
> Note : For more informations on the `components.rb` file, please see the
|
96
|
+
> [Para documentation](https://github.com/para-cms/para/wiki/Components-configuration)
|
97
|
+
|
98
|
+
Add the component to your `config/components.rb` file :
|
99
|
+
|
100
|
+
```ruby
|
101
|
+
section :your_section do
|
102
|
+
component :sitemap, :seo_tools_skeleton
|
103
|
+
end
|
104
|
+
```
|
105
|
+
|
106
|
+
The go to the admin panel, and click the **Sitemap** menu link.
|
107
|
+
|
108
|
+
### 3. Generate a sitemap.xml
|
109
|
+
|
110
|
+
Sitemap generation is accomplished through the use of the
|
111
|
+
[rails-sitemap](https://github.com/viseztrance/rails-sitemap) gem,
|
112
|
+
with a custom task to integrate easily with `seo_tools-para`.
|
113
|
+
|
114
|
+
You'll first need to configure your application's host name.
|
115
|
+
This can be defined in the generated initializer or in an environment variable.
|
116
|
+
|
117
|
+
In the `config/initializers/seo_tools.rb` initializer :
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
config.host = "www.mydomain.com"
|
121
|
+
```
|
122
|
+
|
123
|
+
Or with the `APP_DOMAIN` environment variable.
|
124
|
+
|
125
|
+
```bash
|
126
|
+
APP_DOMAIN="www.mydomain.com"
|
127
|
+
```
|
128
|
+
|
129
|
+
Generating the sitemap can be done with the dedicated rake task :
|
130
|
+
|
131
|
+
```bash
|
132
|
+
rake seo_tools:sitemap:generate
|
133
|
+
```
|
134
|
+
|
135
|
+
You can pass a `LOCATION` environment variable to define where to store it.
|
136
|
+
By default, it will be stored at : `public/sitemap.xml`
|
137
|
+
|
138
|
+
```bash
|
139
|
+
rake seo_tools:sitemap:generate LOCATION=/home/user/apps/my-app/shared
|
140
|
+
```
|
141
|
+
|
142
|
+
### 4. Retrieving meta tags in your app
|
143
|
+
|
144
|
+
Meta tags edition and rendering is done through the
|
145
|
+
[meta_tags](https://github.com/glyph-fr/meta_tags) gem.
|
146
|
+
|
147
|
+
For more informations on customizing its behavior, please see the
|
148
|
+
[meta_tags documentation](https://github.com/glyph-fr/meta_tags).
|
149
|
+
|
150
|
+
The meta tags are automatically retrieved from the current page path by default.
|
151
|
+
|
152
|
+
`seo_tools-para` includes a `before_action` callback that fetches the existing
|
153
|
+
meta tags for the current path, and sets them in your page.
|
154
|
+
|
155
|
+
All you need to do is to include the following in your layout file, at the top
|
156
|
+
of your `<head>` tag, since `meta_tags` automatically appends the
|
157
|
+
`<meta encoding="utf-8">` tag.
|
158
|
+
|
159
|
+
```erb
|
160
|
+
<html>
|
161
|
+
<head>
|
162
|
+
<%= meta_tags %>
|
163
|
+
...
|
164
|
+
</head>
|
165
|
+
<body>
|
166
|
+
...
|
167
|
+
</body>
|
168
|
+
</html>
|
169
|
+
```
|
170
|
+
|
171
|
+
|
172
|
+
## Contributing
|
173
|
+
|
174
|
+
1. Fork it ( https://github.com/[my-github-username]/seo_tools-para/fork )
|
175
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
176
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
177
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
178
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
data/app/.DS_Store
ADDED
Binary file
|
Binary file
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Admin
|
2
|
+
module Para
|
3
|
+
module SeoTools
|
4
|
+
class SkeletonResourcesController < ::Para::Admin::CrudResourcesController
|
5
|
+
def index
|
6
|
+
super
|
7
|
+
@available_locales = ::Para::SeoTools::Page.group(:locale).pluck(:locale)
|
8
|
+
end
|
9
|
+
|
10
|
+
def refresh
|
11
|
+
::Para::SeoTools::Skeleton.with_logging do
|
12
|
+
::Para::SeoTools::Skeleton.load
|
13
|
+
::Para::SeoTools::Skeleton::Worker.perform
|
14
|
+
end
|
15
|
+
|
16
|
+
redirect_to after_form_submit_path
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Para
|
2
|
+
module SeoTools
|
3
|
+
module Admin
|
4
|
+
module FieldsHelper
|
5
|
+
def meta_tag_input(form, name, options = {})
|
6
|
+
options[:hint] ||= if (default = form.object.default(name))
|
7
|
+
t('para.seo_tools.pages.default_meta_tag_value', value: default).html_safe
|
8
|
+
end
|
9
|
+
|
10
|
+
form.input name, options
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Para
|
2
|
+
module SeoTools
|
3
|
+
class Page < ActiveRecord::Base
|
4
|
+
META_TAGS = :title, :description, :keywords, :image, :canonical
|
5
|
+
|
6
|
+
has_attached_file :image, styles: { thumb: '200x200#' }
|
7
|
+
validates_attachment :image, content_type: { content_type: /\Aimage\/.*\Z/ }
|
8
|
+
|
9
|
+
def meta_tag(name)
|
10
|
+
process(name, send(name)).presence || default(name)
|
11
|
+
end
|
12
|
+
|
13
|
+
def defaults
|
14
|
+
if (hash = read_attribute(:defaults))
|
15
|
+
hash
|
16
|
+
else
|
17
|
+
self.defaults = {}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def default(name)
|
22
|
+
process(name, defaults[name.to_s]) if defaults[name.to_s]
|
23
|
+
end
|
24
|
+
|
25
|
+
ransacker :title do |parent|
|
26
|
+
default_title = Arel::Nodes::InfixOperation.new('->>', parent.table[:defaults], Arel::Nodes.build_quoted('title'))
|
27
|
+
expr = Arel::Nodes::NamedFunction.new('COALESCE', [parent.table[:title], default_title])
|
28
|
+
|
29
|
+
# Conversion to Arel::Nodes::SqlLiteral is required for sorting to work,
|
30
|
+
# since the Arel::Nodes::NamedFunction doesn't include Arel ordering
|
31
|
+
# methods, and Ransack uses them
|
32
|
+
#
|
33
|
+
Arel::Nodes::SqlLiteral.new(expr.to_sql)
|
34
|
+
end
|
35
|
+
|
36
|
+
ransacker :description do |parent|
|
37
|
+
default_description = Arel::Nodes::InfixOperation.new('->>', parent.table[:defaults], Arel::Nodes.build_quoted('description'))
|
38
|
+
expr = Arel::Nodes::NamedFunction.new('COALESCE',[parent.table[:description], default_description])
|
39
|
+
|
40
|
+
Arel::Nodes::SqlLiteral.new(expr.to_sql)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def process(name, value)
|
46
|
+
if (processor = Para::SeoTools::MetaTags::Tags[name])
|
47
|
+
processor.process(value)
|
48
|
+
else
|
49
|
+
value
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/app/views/.DS_Store
ADDED
Binary file
|
Binary file
|
@@ -0,0 +1,25 @@
|
|
1
|
+
= search_form_for @q, builder: SimpleForm::FormBuilder, url: @component.path, html: { data: { :'filters-form' => true } } do |form|
|
2
|
+
- if @available_locales.length > 1
|
3
|
+
.row
|
4
|
+
.col-md-3
|
5
|
+
= form.input_field :locale_eq, as: :selectize, collection: @available_locales, class: 'form-control', placeholder: t('para.seo_tools.pages.choose_locale')
|
6
|
+
|
7
|
+
.col-md-7
|
8
|
+
.input-group
|
9
|
+
%span.input-group-addon
|
10
|
+
%i.fa.fa-search
|
11
|
+
|
12
|
+
= form.input_field :identifier_or_path_or_title_or_description_or_keywords_or_canonical_cont, as: :string, placeholder: t('para.shared.search'), class: 'form-control'
|
13
|
+
|
14
|
+
.col-md-2
|
15
|
+
= form.submit t('para.shared.search'), class: 'btn btn-default btn-block'
|
16
|
+
|
17
|
+
- else
|
18
|
+
.input-group
|
19
|
+
%span.input-group-addon
|
20
|
+
%i.fa.fa-search
|
21
|
+
|
22
|
+
= form.input_field :identifier_or_path_or_title_or_description_or_keywords_or_canonical_cont, as: :string, placeholder: t('para.shared.search'), class: 'form-control'
|
23
|
+
|
24
|
+
%span.input-group-btn
|
25
|
+
= form.submit t('para.shared.search'), class: 'btn btn-default'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
= para_form_for(resource) do |form|
|
2
|
+
= form.fieldset do
|
3
|
+
= form.input :path, disabled: true
|
4
|
+
|
5
|
+
= meta_tag_input form, :title
|
6
|
+
= meta_tag_input form, :description
|
7
|
+
= meta_tag_input form, :keywords
|
8
|
+
|
9
|
+
= form.fieldset title: t('para.seo_tools.pages.additional_meta_tags') do
|
10
|
+
= meta_tag_input form, :image, as: :image
|
11
|
+
= meta_tag_input form, :canonical
|
12
|
+
|
13
|
+
= form.actions
|
@@ -0,0 +1,20 @@
|
|
1
|
+
= resources_table(model: model, component: component, actions: false) do |table|
|
2
|
+
= table.header do
|
3
|
+
= table.header_for(:path)
|
4
|
+
= table.header_for(:title)
|
5
|
+
= table.header_for(:description)
|
6
|
+
= table.header_for(:locale) if @available_locales.length > 1
|
7
|
+
%th
|
8
|
+
|
9
|
+
= table.rows(resources) do |resource|
|
10
|
+
= table.data_for(resource, :path)
|
11
|
+
= table.data_for(resource.meta_tag(:title))
|
12
|
+
= table.data_for(resource.meta_tag(:description))
|
13
|
+
= table.data_for(resource, :locale) if @available_locales.length > 1
|
14
|
+
|
15
|
+
%td
|
16
|
+
.pull-right.btn-group
|
17
|
+
= table.edit_button(resource)
|
18
|
+
|
19
|
+
= link_to resource.path, target: '_blank', class: 'btn btn-default hint--left', data: { hint: t('para.seo_tools.pages.see_in_app') } do
|
20
|
+
= fa_icon 'eye'
|
data/bin/rails
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" with Rails 4 gems installed from the root of your application.
|
3
|
+
|
4
|
+
ENGINE_ROOT = File.expand_path('../..', __FILE__)
|
5
|
+
ENGINE_PATH = File.expand_path('../../lib/para/seo_tools/engine', __FILE__)
|
6
|
+
|
7
|
+
# Set up gems listed in the Gemfile.
|
8
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
|
9
|
+
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
|
10
|
+
|
11
|
+
require 'rails/all'
|
12
|
+
require 'rails/engine/commands'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
fr:
|
2
|
+
para:
|
3
|
+
seo_tools:
|
4
|
+
pages:
|
5
|
+
see_in_app: "Voir la page"
|
6
|
+
default_meta_tag_value: "Valeur par défaut : <b>%{value}</b>"
|
7
|
+
additional_meta_tags: "Meta-données avancées"
|
8
|
+
refresh_skeleton: "Mettre à jour"
|
9
|
+
choose_locale: "Choisissez une langue"
|
10
|
+
|
11
|
+
activerecord:
|
12
|
+
attributes:
|
13
|
+
para/seo_tools/page:
|
14
|
+
path: "URL de la page"
|
15
|
+
identifier: "Identifiant de la page"
|
16
|
+
title: "Titre"
|
17
|
+
description: "Description"
|
18
|
+
keywords: "Mots-clés de la page"
|
19
|
+
image: "Image pour le partage sur les réseaux sociaux"
|
20
|
+
canonical: "URL canonique"
|
21
|
+
locale: "Langue"
|
22
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class CreateSeoToolsPages < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :seo_tools_pages do |t|
|
4
|
+
t.string :identifier
|
5
|
+
t.string :path
|
6
|
+
t.references :meta_tags_list, index: true, foreign_key: true
|
7
|
+
|
8
|
+
t.timestamps null: false
|
9
|
+
end
|
10
|
+
|
11
|
+
add_index :seo_tools_pages, :identifier
|
12
|
+
add_index :seo_tools_pages, :path
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Para
|
2
|
+
module SeoTools
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
# Copied files come from templates folder
|
5
|
+
source_root File.expand_path('../templates', __FILE__)
|
6
|
+
|
7
|
+
# Generator desc
|
8
|
+
desc 'Seo Tools install generator'
|
9
|
+
|
10
|
+
def copy_initializer_file
|
11
|
+
copy_file 'initializer.rb', 'config/initializers/seo_tools.rb'
|
12
|
+
end
|
13
|
+
|
14
|
+
def copy_and_run_migrations
|
15
|
+
rake 'para_seo_tools_engine:install:migrations'
|
16
|
+
rake 'db:migrate'
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_skeleton_file
|
20
|
+
copy_file 'skeleton.rb', 'config/skeleton.rb'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
Para::SeoTools.configure do |config|
|
2
|
+
# Configure the hostname for the sitemap
|
3
|
+
#
|
4
|
+
# Defaults to the ENV['APP_DOMAIN'] variable
|
5
|
+
#
|
6
|
+
# config.host = ENV['APP_DOMAIN']
|
7
|
+
|
8
|
+
# Default title methods to be checked for title
|
9
|
+
#
|
10
|
+
# config.title_methods = %w(title name)
|
11
|
+
|
12
|
+
# Default methods to be checked for description
|
13
|
+
#
|
14
|
+
# config.description_methods = %w(description desc content)
|
15
|
+
|
16
|
+
# Default image methods to be checked for image
|
17
|
+
#
|
18
|
+
# config.image_methods = %w(image picture avatar)
|
19
|
+
|
20
|
+
# Configure the default meta tags that will be used when no source could
|
21
|
+
# fill the defined meta.
|
22
|
+
#
|
23
|
+
# One good thing is to configure the title here to avoid empty <title> tags.
|
24
|
+
# But you can configure any supported meta tag here.
|
25
|
+
#
|
26
|
+
# Note that you'll need to pass a proc or lambda, and that it'll be executed
|
27
|
+
# in the context of the controller.
|
28
|
+
# This allows for example to set I18n aware defaults.
|
29
|
+
#
|
30
|
+
# config.defaults = lambda do
|
31
|
+
# { title: 'My website' }
|
32
|
+
# end
|
33
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# Use `lazy: true` to avoid generating the pages skeleton on server run
|
2
|
+
#
|
3
|
+
# You'll then have to run `rake seo_tools:skeleton:build` to refresh it or use
|
4
|
+
# the `Para::SeoTools::Skeleton::Worker.perform` method in some worker to
|
5
|
+
# refresh it periodically
|
6
|
+
#
|
7
|
+
# Note that you also have to always refresh the sitemap manually with the
|
8
|
+
# following task : `rake seo_tools:sitemap:generate`
|
9
|
+
#
|
10
|
+
Para::SeoTools::Skeleton.draw(lazy: false) do
|
11
|
+
# Define your website SEO targetted structure here.
|
12
|
+
# Pages are defined with the `page` method, and allows for some options.
|
13
|
+
#
|
14
|
+
# The following will define the page `posts` and call `posts_path` to retrieve
|
15
|
+
# its URL
|
16
|
+
#
|
17
|
+
# page :posts
|
18
|
+
#
|
19
|
+
# If you want to define the page path yourself, just add the `:path` option
|
20
|
+
# to the `page` call
|
21
|
+
#
|
22
|
+
# page :home, path: root_path
|
23
|
+
#
|
24
|
+
# When the page is linked to a resource : often, a #show page, you'll need to
|
25
|
+
# pass the `:resource` option
|
26
|
+
#
|
27
|
+
# Posts.find_each do |post|
|
28
|
+
# page :post, resource: post
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# Also, you can pass options for the sitemap generation tool.
|
32
|
+
# The options are `:priority`, `:change_frequency` which are left blank
|
33
|
+
# by default.
|
34
|
+
#
|
35
|
+
# page :posts, priority: 1, change_frequency: 'weekly'
|
36
|
+
#
|
37
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Para
|
2
|
+
module SeoTools
|
3
|
+
module Controller
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
before_action :store_request_for_meta_tags_processing
|
8
|
+
helper_method :meta_tags_store
|
9
|
+
before_action :fetch_meta_tags_page
|
10
|
+
end
|
11
|
+
|
12
|
+
def meta_tags_store
|
13
|
+
@meta_tags_store ||= MetaTags::Store.new(self)
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
def meta_tags_from(resource)
|
19
|
+
@instance = resource
|
20
|
+
end
|
21
|
+
|
22
|
+
def set_meta_tags_from_page(page)
|
23
|
+
if page.kind_of?(Para::SeoTools::Page)
|
24
|
+
Para::SeoTools::Page::META_TAGS.each do |tag_name|
|
25
|
+
if (value = page.meta_tag(tag_name)).present?
|
26
|
+
set_meta_tag(tag_name, value)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
else
|
30
|
+
page = Para::SeoTools::Page.where(identifier: page.to_s).first
|
31
|
+
set_meta_tags_from_page(page) if page
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def set_meta_tag(tag_name, value)
|
36
|
+
meta_tags_store.send(:"#{ tag_name }=", value)
|
37
|
+
end
|
38
|
+
|
39
|
+
def fetch_meta_tags_page
|
40
|
+
if (page = Para::SeoTools::Page.find_by_path(request.path))
|
41
|
+
set_meta_tags_from_page(page)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def store_request_for_meta_tags_processing
|
46
|
+
RequestStore.store[:'para.seo_tools.request'] = request
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Para
|
2
|
+
module SeoTools
|
3
|
+
class Engine < Rails::Engine
|
4
|
+
config.after_initialize do
|
5
|
+
Para::SeoTools::Skeleton.load
|
6
|
+
end
|
7
|
+
|
8
|
+
initializer 'para.seo_tools.include_controller_mixin' do
|
9
|
+
ActiveSupport.on_load(:action_controller) do
|
10
|
+
include Para::SeoTools::Controller
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
initializer "para.seo_tools.include_view_helpers" do
|
15
|
+
ActiveSupport.on_load(:action_view) do
|
16
|
+
include Para::SeoTools::ViewHelpers
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
rake_tasks do
|
21
|
+
Dir[File.expand_path('../../tasks/**/*.rake', __FILE__)].each do |path|
|
22
|
+
load(path)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|