middleman-dato 0.6.1 → 0.7.0
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 +4 -4
- data/lib/middleman_dato/middleman_extension.rb +33 -80
- data/lib/middleman_dato/version.rb +1 -1
- data/lib/middleman_dato/watcher.rb +44 -0
- data/middleman-dato.gemspec +1 -1
- metadata +5 -22
- data/lib/middleman_dato/meta_tags/article_modified_time.rb +0 -21
- data/lib/middleman_dato/meta_tags/article_publisher.rb +0 -22
- data/lib/middleman_dato/meta_tags/base.rb +0 -75
- data/lib/middleman_dato/meta_tags/description.rb +0 -34
- data/lib/middleman_dato/meta_tags/favicon.rb +0 -82
- data/lib/middleman_dato/meta_tags/image.rb +0 -28
- data/lib/middleman_dato/meta_tags/og_locale.rb +0 -21
- data/lib/middleman_dato/meta_tags/og_meta_tag.rb +0 -24
- data/lib/middleman_dato/meta_tags/og_site_name.rb +0 -20
- data/lib/middleman_dato/meta_tags/og_type.rb +0 -26
- data/lib/middleman_dato/meta_tags/robots.rb +0 -12
- data/lib/middleman_dato/meta_tags/title.rb +0 -42
- data/lib/middleman_dato/meta_tags/twitter_card.rb +0 -20
- data/lib/middleman_dato/meta_tags/twitter_meta_tag.rb +0 -24
- data/lib/middleman_dato/meta_tags/twitter_site.rb +0 -20
- data/lib/middleman_dato/meta_tags/url.rb +0 -22
- data/lib/middleman_dato/meta_tags_builder.rb +0 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58d96f4274983ff4f7dbb53ce87535f60d0a85a7
|
4
|
+
data.tar.gz: 44ca86cac8e9b7b0761f7a226f8f3799bb004cfe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e3aa277cd4ef6b1371236da52cf3ef6b8391aad1562d4a646ae0925e23d2d44f62cb069f2750d0970459e24fbfe56abf8cddcf9711fe0537f441042d4070fe15
|
7
|
+
data.tar.gz: 3d9951128381105479635c09f8ee535da7d57b83ae7513edaa9d7924241306daa0fa1401f19699578c9ea5468c552a2bf5852889cb5d90ff34d7455a74f9c5d1
|
@@ -3,63 +3,21 @@ require 'middleman-core'
|
|
3
3
|
require 'middleman-core/version'
|
4
4
|
require 'dato/site/client'
|
5
5
|
require 'dato/local/loader'
|
6
|
-
require '
|
7
|
-
require 'middleman_dato/
|
8
|
-
require '
|
9
|
-
require '
|
6
|
+
require 'dato/watch/site_change_watcher'
|
7
|
+
require 'middleman_dato/watcher'
|
8
|
+
require 'dato/utils/seo_tags_builder'
|
9
|
+
require 'dato/utils/favicon_tags_builder'
|
10
10
|
|
11
11
|
module MiddlemanDato
|
12
|
-
class Watcher
|
13
|
-
include Singleton
|
14
|
-
attr_reader :event_queue
|
15
|
-
|
16
|
-
def initialize
|
17
|
-
PusherClient.logger.level = Logger::WARN
|
18
|
-
@site_id = nil
|
19
|
-
@apps = []
|
20
|
-
end
|
21
|
-
|
22
|
-
def watch(app, loader, site_id)
|
23
|
-
@app = app
|
24
|
-
@loader = loader
|
25
|
-
|
26
|
-
if site_id != @site_id
|
27
|
-
if @socket && @socket.connected
|
28
|
-
@apps = []
|
29
|
-
@socket.disconnect
|
30
|
-
end
|
31
|
-
|
32
|
-
@apps = [ app.object_id ]
|
33
|
-
@site_id = site_id
|
34
|
-
@socket = PusherClient::Socket.new('75e6ef0fe5d39f481626', secure: true)
|
35
|
-
@socket.subscribe("site-#{site_id}")
|
36
|
-
@socket.bind('site:change') do
|
37
|
-
print "DatoCMS content changed, refreshing data..."
|
38
|
-
@loader.load
|
39
|
-
puts " done!"
|
40
|
-
@app.sitemap.rebuild_resource_list!(:touched_dato_content)
|
41
|
-
end
|
42
|
-
@socket.connect(true)
|
43
|
-
else
|
44
|
-
@apps[@apps.size - 1] = app.object_id
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def shutdown(app)
|
49
|
-
if @socket && @socket.connected && @apps == [ app.object_id ]
|
50
|
-
@socket.disconnect
|
51
|
-
end
|
52
|
-
@apps.delete(app.object_id)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
12
|
class MiddlemanExtension < ::Middleman::Extension
|
57
13
|
attr_reader :loader
|
58
14
|
|
59
|
-
option :
|
60
|
-
option :token, nil, 'Site API token'
|
15
|
+
option :token, ENV['DATO_API_TOKEN'], 'Site API token'
|
61
16
|
option :api_base_url, 'https://site-api.datocms.com', 'Site API host'
|
62
|
-
option :
|
17
|
+
option :live_reload, true, 'Live reload of content coming from DatoCMS'
|
18
|
+
|
19
|
+
option :base_url, nil, 'Website base URL (deprecated)'
|
20
|
+
option :domain, nil, 'Site domain (deprecated)'
|
63
21
|
|
64
22
|
expose_to_config dato: :dato_collector
|
65
23
|
expose_to_application dato_items_repo: :items_repo
|
@@ -71,13 +29,13 @@ module MiddlemanDato
|
|
71
29
|
@loader.load
|
72
30
|
|
73
31
|
app.after_configuration do
|
74
|
-
if !app.build?
|
32
|
+
if options_hash[:live_reload] && !app.build?
|
75
33
|
Watcher.instance.watch(app, loader, loader.items_repo.site.id)
|
76
34
|
end
|
77
35
|
end
|
78
36
|
|
79
37
|
app.before_shutdown do
|
80
|
-
if !app.build?
|
38
|
+
if options_hash[:live_reload] && !app.build?
|
81
39
|
Watcher.instance.shutdown(app)
|
82
40
|
end
|
83
41
|
end
|
@@ -106,45 +64,40 @@ module MiddlemanDato
|
|
106
64
|
|
107
65
|
module InstanceMethods
|
108
66
|
def dato
|
109
|
-
extensions[:dato].
|
67
|
+
extensions[:dato].items_repo
|
110
68
|
end
|
111
69
|
end
|
112
70
|
|
113
71
|
helpers do
|
114
72
|
def dato
|
115
|
-
extensions[:dato].
|
73
|
+
extensions[:dato].items_repo
|
116
74
|
end
|
117
75
|
|
118
76
|
def dato_meta_tags(item)
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
item
|
129
|
-
)
|
130
|
-
builder.meta_tags
|
77
|
+
meta_tags = Dato::Utils::SeoTagsBuilder.new(item, dato.site).meta_tags
|
78
|
+
|
79
|
+
meta_tags.map do |data|
|
80
|
+
if data[:content]
|
81
|
+
content_tag(data[:tag_name], data[:content], data[:attributes])
|
82
|
+
else
|
83
|
+
tag(data[:tag_name], data[:attributes])
|
84
|
+
end
|
85
|
+
end.join
|
131
86
|
end
|
132
87
|
|
133
88
|
def dato_favicon_meta_tags(options = {})
|
134
|
-
|
135
|
-
.
|
136
|
-
.find_entities_of_type('site')
|
137
|
-
.first
|
138
|
-
|
139
|
-
options[:theme_color] ||= '#ffffff'
|
140
|
-
options[:app_name] ||= ''
|
141
|
-
|
142
|
-
favicon_builder = MetaTags::Favicon.new(
|
143
|
-
self,
|
144
|
-
site_entity,
|
89
|
+
meta_tags = Dato::Utils::FaviconTagsBuilder.new(
|
90
|
+
dato.site,
|
145
91
|
options[:theme_color]
|
146
|
-
)
|
147
|
-
|
92
|
+
).meta_tags
|
93
|
+
|
94
|
+
meta_tags.map do |data|
|
95
|
+
if data[:content]
|
96
|
+
content_tag(data[:tag_name], data[:content], data[:attributes])
|
97
|
+
else
|
98
|
+
tag(data[:tag_name], data[:attributes])
|
99
|
+
end
|
100
|
+
end.join
|
148
101
|
end
|
149
102
|
end
|
150
103
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module MiddlemanDato
|
4
|
+
class Watcher
|
5
|
+
include Singleton
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@site_id = nil
|
9
|
+
@apps = []
|
10
|
+
@watcher = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def watch(app, loader, site_id)
|
14
|
+
@app = app
|
15
|
+
@loader = loader
|
16
|
+
|
17
|
+
if site_id != @site_id
|
18
|
+
if @watcher && @watcher.connected?
|
19
|
+
@apps = []
|
20
|
+
@watcher.disconnect!
|
21
|
+
end
|
22
|
+
|
23
|
+
@apps = [ app.object_id ]
|
24
|
+
@site_id = site_id
|
25
|
+
@watcher = Dato::Watch::SiteChangeWatcher.new(site_id).connect do
|
26
|
+
print "DatoCMS content changed, refreshing data..."
|
27
|
+
@loader.load
|
28
|
+
puts " done!"
|
29
|
+
@app.sitemap.rebuild_resource_list!(:touched_dato_content)
|
30
|
+
end
|
31
|
+
else
|
32
|
+
@apps[@apps.size - 1] = app.object_id
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def shutdown(app)
|
37
|
+
if @watcher && @watcher.connected? && @apps == [ app.object_id ]
|
38
|
+
@watcher.disconnect!
|
39
|
+
end
|
40
|
+
|
41
|
+
@apps.delete(app.object_id)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/middleman-dato.gemspec
CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_development_dependency('coveralls')
|
24
24
|
|
25
25
|
s.add_runtime_dependency('middleman-core', ['>= 4.1.10'])
|
26
|
-
s.add_runtime_dependency('dato', ['>= 0.
|
26
|
+
s.add_runtime_dependency('dato', ['>= 0.3.0'])
|
27
27
|
s.add_runtime_dependency('activesupport')
|
28
28
|
s.add_runtime_dependency('pusher-client')
|
29
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: middleman-dato
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefano Verna
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coveralls
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: 0.3.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
54
|
+
version: 0.3.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: activesupport
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -96,25 +96,9 @@ files:
|
|
96
96
|
- README.md
|
97
97
|
- Rakefile
|
98
98
|
- lib/middleman-dato.rb
|
99
|
-
- lib/middleman_dato/meta_tags/article_modified_time.rb
|
100
|
-
- lib/middleman_dato/meta_tags/article_publisher.rb
|
101
|
-
- lib/middleman_dato/meta_tags/base.rb
|
102
|
-
- lib/middleman_dato/meta_tags/description.rb
|
103
|
-
- lib/middleman_dato/meta_tags/favicon.rb
|
104
|
-
- lib/middleman_dato/meta_tags/image.rb
|
105
|
-
- lib/middleman_dato/meta_tags/og_locale.rb
|
106
|
-
- lib/middleman_dato/meta_tags/og_meta_tag.rb
|
107
|
-
- lib/middleman_dato/meta_tags/og_site_name.rb
|
108
|
-
- lib/middleman_dato/meta_tags/og_type.rb
|
109
|
-
- lib/middleman_dato/meta_tags/robots.rb
|
110
|
-
- lib/middleman_dato/meta_tags/title.rb
|
111
|
-
- lib/middleman_dato/meta_tags/twitter_card.rb
|
112
|
-
- lib/middleman_dato/meta_tags/twitter_meta_tag.rb
|
113
|
-
- lib/middleman_dato/meta_tags/twitter_site.rb
|
114
|
-
- lib/middleman_dato/meta_tags/url.rb
|
115
|
-
- lib/middleman_dato/meta_tags_builder.rb
|
116
99
|
- lib/middleman_dato/middleman_extension.rb
|
117
100
|
- lib/middleman_dato/version.rb
|
101
|
+
- lib/middleman_dato/watcher.rb
|
118
102
|
- middleman-dato.gemspec
|
119
103
|
- spec/middleman_dato/meta_tags/article_modified_time_spec.rb
|
120
104
|
- spec/middleman_dato/meta_tags/favicon_spec.rb
|
@@ -152,4 +136,3 @@ test_files:
|
|
152
136
|
- spec/middleman_dato/meta_tags/og_locale_spec.rb
|
153
137
|
- spec/spec_helper.rb
|
154
138
|
- spec/support/mock_builder.rb
|
155
|
-
has_rdoc:
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'middleman_dato/meta_tags/og_meta_tag'
|
3
|
-
require 'time'
|
4
|
-
|
5
|
-
module MiddlemanDato
|
6
|
-
module MetaTags
|
7
|
-
class ArticleModifiedTime < OgMetaTag
|
8
|
-
def buildable?
|
9
|
-
item && !item.singleton?
|
10
|
-
end
|
11
|
-
|
12
|
-
def name
|
13
|
-
'article:modified_time'
|
14
|
-
end
|
15
|
-
|
16
|
-
def value
|
17
|
-
item.updated_at.iso8601
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'middleman_dato/meta_tags/og_meta_tag'
|
3
|
-
require 'time'
|
4
|
-
|
5
|
-
module MiddlemanDato
|
6
|
-
module MetaTags
|
7
|
-
class ArticlePublisher < OgMetaTag
|
8
|
-
def buildable?
|
9
|
-
item && !item.singleton? &&
|
10
|
-
global_seo_field(:facebook_page_url).present?
|
11
|
-
end
|
12
|
-
|
13
|
-
def name
|
14
|
-
'article:publisher'
|
15
|
-
end
|
16
|
-
|
17
|
-
def value
|
18
|
-
global_seo_field(:facebook_page_url)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,75 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'forwardable'
|
3
|
-
require 'dato/local/field_type/seo'
|
4
|
-
require 'active_support/core_ext/object/blank'
|
5
|
-
|
6
|
-
module MiddlemanDato
|
7
|
-
module MetaTags
|
8
|
-
class Base
|
9
|
-
attr_reader :builder, :base_url, :site, :item_type, :item
|
10
|
-
|
11
|
-
def initialize(builder, base_url, site, item)
|
12
|
-
@site = site
|
13
|
-
@base_url = base_url
|
14
|
-
@item = item
|
15
|
-
@builder = builder
|
16
|
-
end
|
17
|
-
|
18
|
-
def seo_field_with_fallback(attribute, alternative = nil, &block)
|
19
|
-
seo = first_item_field_of_type(:seo)
|
20
|
-
|
21
|
-
alternatives = []
|
22
|
-
|
23
|
-
alternatives << seo.send(attribute) if seo
|
24
|
-
alternatives << alternative if alternative
|
25
|
-
alternatives << fallback_seo.send(attribute) if fallback_seo
|
26
|
-
|
27
|
-
alternatives = alternatives.select(&:present?)
|
28
|
-
alternatives = alternatives.select(&block) if block
|
29
|
-
|
30
|
-
alternatives.first
|
31
|
-
end
|
32
|
-
|
33
|
-
def title_suffix
|
34
|
-
global_seo_field(:title_suffix) || ''
|
35
|
-
end
|
36
|
-
|
37
|
-
def no_index?
|
38
|
-
site && site.no_index
|
39
|
-
end
|
40
|
-
|
41
|
-
def global_seo_field(attribute)
|
42
|
-
global_seo[attribute] if global_seo
|
43
|
-
end
|
44
|
-
|
45
|
-
def first_item_field_of_type(type)
|
46
|
-
return nil unless item
|
47
|
-
|
48
|
-
field = item.fields.detect do |f|
|
49
|
-
f.field_type == type.to_s
|
50
|
-
end
|
51
|
-
|
52
|
-
item.send(field.api_key) if field
|
53
|
-
end
|
54
|
-
|
55
|
-
def fallback_seo
|
56
|
-
@fallback_seo ||= begin
|
57
|
-
Dato::Local::FieldType::Seo.parse(global_seo[:fallback_seo], nil) if global_seo
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def global_seo
|
62
|
-
@global_seo ||= begin
|
63
|
-
if site && site.global_seo
|
64
|
-
global_seo = site.global_seo
|
65
|
-
if site.locales.size > 1
|
66
|
-
global_seo[I18n.locale]
|
67
|
-
else
|
68
|
-
global_seo
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'middleman_dato/meta_tags/base'
|
3
|
-
|
4
|
-
module MiddlemanDato
|
5
|
-
module MetaTags
|
6
|
-
class Description < Base
|
7
|
-
def build
|
8
|
-
if description.present?
|
9
|
-
[
|
10
|
-
builder.tag(
|
11
|
-
:meta,
|
12
|
-
name: 'description',
|
13
|
-
content: description
|
14
|
-
),
|
15
|
-
builder.tag(
|
16
|
-
:meta,
|
17
|
-
property: 'og:description',
|
18
|
-
content: description
|
19
|
-
),
|
20
|
-
builder.tag(
|
21
|
-
:meta,
|
22
|
-
name: 'twitter:description',
|
23
|
-
content: description
|
24
|
-
)
|
25
|
-
]
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def description
|
30
|
-
@description ||= seo_field_with_fallback(:description)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,82 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'dato/local/field_type/image'
|
3
|
-
|
4
|
-
module MiddlemanDato
|
5
|
-
module MetaTags
|
6
|
-
class Favicon
|
7
|
-
attr_reader :builder, :theme_color, :favicon, :app_name
|
8
|
-
APPLE_TOUCH_ICON_SIZES = [57, 60, 72, 76, 114, 120, 144, 152, 180].freeze
|
9
|
-
ICON_SIZES = [16, 32, 96, 192].freeze
|
10
|
-
APPLICATION_SIZES = [70, 150, 310].freeze
|
11
|
-
|
12
|
-
def initialize(builder, entity, theme_color)
|
13
|
-
@favicon = entity.favicon
|
14
|
-
@builder = builder
|
15
|
-
@theme_color = theme_color
|
16
|
-
@app_name = entity.global_seo['site_name'] || ''
|
17
|
-
end
|
18
|
-
|
19
|
-
def image
|
20
|
-
Dato::Local::FieldType::Image.parse(favicon, nil) if favicon.present?
|
21
|
-
end
|
22
|
-
|
23
|
-
def url(width, height = nil)
|
24
|
-
height ||= width
|
25
|
-
image.file.width(width).height(height).to_url
|
26
|
-
end
|
27
|
-
|
28
|
-
def build_apple_icon_tags
|
29
|
-
APPLE_TOUCH_ICON_SIZES.map do |size|
|
30
|
-
builder.tag(:link,
|
31
|
-
rel: 'apple-touch-icon',
|
32
|
-
sizes: "#{size}x#{size}",
|
33
|
-
href: url(size))
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def build_icon_tags
|
38
|
-
ICON_SIZES.map do |size|
|
39
|
-
builder.tag(:link,
|
40
|
-
rel: 'icon',
|
41
|
-
type: "image/#{image.format}",
|
42
|
-
href: url(size),
|
43
|
-
sizes: "#{size}x#{size}")
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def build_application_tags
|
48
|
-
APPLICATION_SIZES.map do |size|
|
49
|
-
builder.tag(:meta,
|
50
|
-
name: "msapplication-square#{size}x#{size}logo",
|
51
|
-
content: url(size))
|
52
|
-
end + [builder.tag(:meta,
|
53
|
-
name: 'msapplication-wide310x150logo',
|
54
|
-
content: url(310, 150))]
|
55
|
-
end
|
56
|
-
|
57
|
-
def main_tags
|
58
|
-
[
|
59
|
-
builder.tag(:meta, name: 'application-name', content: app_name),
|
60
|
-
builder.tag(:meta, name: 'theme-color', content: theme_color),
|
61
|
-
builder.tag(:meta,
|
62
|
-
name: 'msapplication-TileColor',
|
63
|
-
content: theme_color)
|
64
|
-
]
|
65
|
-
end
|
66
|
-
|
67
|
-
def build_tags
|
68
|
-
tags = main_tags
|
69
|
-
unless image.nil?
|
70
|
-
tags += build_apple_icon_tags
|
71
|
-
tags += build_icon_tags
|
72
|
-
tags += build_application_tags
|
73
|
-
end
|
74
|
-
tags
|
75
|
-
end
|
76
|
-
|
77
|
-
def build
|
78
|
-
build_tags.join("\n")
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'middleman_dato/meta_tags/base'
|
3
|
-
|
4
|
-
module MiddlemanDato
|
5
|
-
module MetaTags
|
6
|
-
class Image < Base
|
7
|
-
def build
|
8
|
-
if image.present?
|
9
|
-
[
|
10
|
-
builder.tag(:meta, property: 'og:image', content: image),
|
11
|
-
builder.tag(:meta, name: 'twitter:image', content: image)
|
12
|
-
]
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def image
|
17
|
-
image = seo_field_with_fallback(
|
18
|
-
:image,
|
19
|
-
first_item_field_of_type(:image)
|
20
|
-
) do |i|
|
21
|
-
i.width >= 200 && i.height >= 200
|
22
|
-
end
|
23
|
-
|
24
|
-
image.file.format('jpg').to_url if image
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'middleman_dato/meta_tags/og_meta_tag'
|
3
|
-
|
4
|
-
module MiddlemanDato
|
5
|
-
module MetaTags
|
6
|
-
class OgLocale < OgMetaTag
|
7
|
-
def buildable?
|
8
|
-
true
|
9
|
-
end
|
10
|
-
|
11
|
-
def name
|
12
|
-
'og:locale'
|
13
|
-
end
|
14
|
-
|
15
|
-
def value
|
16
|
-
locale = I18n.locale
|
17
|
-
"#{locale}_#{locale.upcase}"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'middleman_dato/meta_tags/base'
|
3
|
-
|
4
|
-
module MiddlemanDato
|
5
|
-
module MetaTags
|
6
|
-
class OgMetaTag < Base
|
7
|
-
def buildable?
|
8
|
-
false
|
9
|
-
end
|
10
|
-
|
11
|
-
def build
|
12
|
-
builder.tag(:meta, property: name, content: value) if buildable?
|
13
|
-
end
|
14
|
-
|
15
|
-
def name
|
16
|
-
raise NotImplementedError
|
17
|
-
end
|
18
|
-
|
19
|
-
def value
|
20
|
-
raise NotImplementedError
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'middleman_dato/meta_tags/og_meta_tag'
|
3
|
-
|
4
|
-
module MiddlemanDato
|
5
|
-
module MetaTags
|
6
|
-
class OgSiteName < OgMetaTag
|
7
|
-
def buildable?
|
8
|
-
global_seo_field(:site_name).present?
|
9
|
-
end
|
10
|
-
|
11
|
-
def name
|
12
|
-
'og:site_name'
|
13
|
-
end
|
14
|
-
|
15
|
-
def value
|
16
|
-
global_seo_field(:site_name)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'middleman_dato/meta_tags/og_meta_tag'
|
3
|
-
|
4
|
-
module MiddlemanDato
|
5
|
-
module MetaTags
|
6
|
-
class OgType < OgMetaTag
|
7
|
-
def buildable?
|
8
|
-
true
|
9
|
-
end
|
10
|
-
|
11
|
-
def name
|
12
|
-
'og:type'
|
13
|
-
end
|
14
|
-
|
15
|
-
def value
|
16
|
-
if !item
|
17
|
-
'website'
|
18
|
-
elsif item.singleton?
|
19
|
-
'website'
|
20
|
-
else
|
21
|
-
'article'
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'middleman_dato/meta_tags/base'
|
3
|
-
|
4
|
-
module MiddlemanDato
|
5
|
-
module MetaTags
|
6
|
-
class Title < Base
|
7
|
-
def build
|
8
|
-
if title.present?
|
9
|
-
[
|
10
|
-
builder.content_tag(:title, title_with_suffix),
|
11
|
-
builder.tag(:meta, property: 'og:title', content: title),
|
12
|
-
builder.tag(:meta, name: 'twitter:title', content: title)
|
13
|
-
]
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def title
|
18
|
-
@title ||= begin
|
19
|
-
title_field = item.fields.find do |field|
|
20
|
-
field.field_type == 'string' &&
|
21
|
-
field.appeareance[:type] == 'title'
|
22
|
-
end
|
23
|
-
|
24
|
-
seo_field_with_fallback(
|
25
|
-
:title,
|
26
|
-
item && title_field && item.send(title_field.api_key)
|
27
|
-
)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def title_with_suffix
|
32
|
-
title_plus_suffix = title + title_suffix
|
33
|
-
|
34
|
-
if title_plus_suffix.size <= 60
|
35
|
-
title_plus_suffix
|
36
|
-
else
|
37
|
-
title
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'middleman_dato/meta_tags/twitter_meta_tag'
|
3
|
-
|
4
|
-
module MiddlemanDato
|
5
|
-
module MetaTags
|
6
|
-
class TwitterCard < TwitterMetaTag
|
7
|
-
def buildable?
|
8
|
-
true
|
9
|
-
end
|
10
|
-
|
11
|
-
def name
|
12
|
-
'twitter:card'
|
13
|
-
end
|
14
|
-
|
15
|
-
def value
|
16
|
-
'summary'
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'middleman_dato/meta_tags/base'
|
3
|
-
|
4
|
-
module MiddlemanDato
|
5
|
-
module MetaTags
|
6
|
-
class TwitterMetaTag < Base
|
7
|
-
def buildable?
|
8
|
-
false
|
9
|
-
end
|
10
|
-
|
11
|
-
def build
|
12
|
-
builder.tag(:meta, name: name, content: value) if buildable?
|
13
|
-
end
|
14
|
-
|
15
|
-
def name
|
16
|
-
raise NotImplementedError
|
17
|
-
end
|
18
|
-
|
19
|
-
def value
|
20
|
-
raise NotImplementedError
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'middleman_dato/meta_tags/twitter_meta_tag'
|
3
|
-
|
4
|
-
module MiddlemanDato
|
5
|
-
module MetaTags
|
6
|
-
class TwitterSite < TwitterMetaTag
|
7
|
-
def buildable?
|
8
|
-
global_seo_field(:twitter_account).present?
|
9
|
-
end
|
10
|
-
|
11
|
-
def name
|
12
|
-
'twitter:site'
|
13
|
-
end
|
14
|
-
|
15
|
-
def value
|
16
|
-
global_seo_field(:twitter_account)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'middleman_dato/meta_tags/base'
|
3
|
-
|
4
|
-
module MiddlemanDato
|
5
|
-
module MetaTags
|
6
|
-
class Url < Base
|
7
|
-
def build
|
8
|
-
if url.present?
|
9
|
-
[
|
10
|
-
builder.tag(:link, rel: 'canonical', href: url),
|
11
|
-
builder.tag(:meta, property: 'og:url', content: url),
|
12
|
-
builder.tag(:meta, name: 'twitter:url', content: url)
|
13
|
-
]
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def url
|
18
|
-
base_url + builder.current_page.url
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'middleman_dato/meta_tags/title'
|
3
|
-
require 'middleman_dato/meta_tags/description'
|
4
|
-
require 'middleman_dato/meta_tags/image'
|
5
|
-
require 'middleman_dato/meta_tags/url'
|
6
|
-
require 'middleman_dato/meta_tags/robots'
|
7
|
-
require 'middleman_dato/meta_tags/og_locale'
|
8
|
-
require 'middleman_dato/meta_tags/og_type'
|
9
|
-
require 'middleman_dato/meta_tags/og_site_name'
|
10
|
-
require 'middleman_dato/meta_tags/article_modified_time'
|
11
|
-
require 'middleman_dato/meta_tags/article_publisher'
|
12
|
-
require 'middleman_dato/meta_tags/twitter_card'
|
13
|
-
require 'middleman_dato/meta_tags/twitter_site'
|
14
|
-
|
15
|
-
module MiddlemanDato
|
16
|
-
class MetaTagsBuilder
|
17
|
-
META_TAGS = [
|
18
|
-
MetaTags::Title,
|
19
|
-
MetaTags::Description,
|
20
|
-
MetaTags::Image,
|
21
|
-
MetaTags::Url,
|
22
|
-
MetaTags::Robots,
|
23
|
-
MetaTags::OgLocale,
|
24
|
-
MetaTags::OgType,
|
25
|
-
MetaTags::OgSiteName,
|
26
|
-
MetaTags::ArticleModifiedTime,
|
27
|
-
MetaTags::ArticlePublisher,
|
28
|
-
MetaTags::TwitterCard,
|
29
|
-
MetaTags::TwitterSite
|
30
|
-
].freeze
|
31
|
-
|
32
|
-
def initialize(*args)
|
33
|
-
@args = args
|
34
|
-
end
|
35
|
-
|
36
|
-
def meta_tags
|
37
|
-
META_TAGS.map do |klass|
|
38
|
-
klass.new(*@args).build
|
39
|
-
end.flatten.compact.join("\n")
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|