para-seo_tools 0.2.1
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.
- 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
|