diff --git a/.gitignore b/.gitignore index b7e7725..3476aa5 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ /pkg/ /spec/reports/ /tmp/ +/bin/ *.gem diff --git a/.rubocop.yml b/.rubocop.yml index c796613..d60d44a 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -16,6 +16,10 @@ Style/Documentation: Style/FileName: Enabled: false +Style/IndentHeredoc: + Exclude: + - spec/**/* + AllCops: Exclude: - vendor/**/* diff --git a/Gemfile b/Gemfile index a215af7..9cea2e1 100644 --- a/Gemfile +++ b/Gemfile @@ -1,14 +1,14 @@ -source 'https://rubygems.org' -require 'json' -require 'open-uri' +source "https://rubygems.org" +require "json" +require "open-uri" gemspec group :development, :test do - versions = JSON.parse(open('https://pages.github.com/versions.json').read) - versions.delete('ruby') - versions.delete('jekyll-seo-tag') - versions.delete('github-pages') + versions = JSON.parse(open("https://pages.github.com/versions.json").read) + versions.delete("ruby") + versions.delete("jekyll-seo-tag") + versions.delete("github-pages") versions.each do |dep, version| gem dep, version diff --git a/README.md b/README.md index 8f71d58..ddcd9a0 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ Jekyll SEO Tag adds the following meta tags to your site: * Canonical URL * Next and previous URLs on paginated pages * [JSON-LD Site and post metadata](https://developers.google.com/structured-data/) for richer indexing -* [Open graph](http://ogp.me/) title, description, site title, and URL (for Facebook, LinkedIn, etc.) -* [Twitter summary card](https://dev.twitter.com/cards/overview) metadata +* [Open Graph](http://ogp.me/) title, description, site title, and URL (for Facebook, LinkedIn, etc.) +* [Twitter Summary Card](https://dev.twitter.com/cards/overview) metadata While you could theoretically add the necessary metadata tags yourself, Jekyll SEO Tag provides a battle-tested template of crowdsourced best-practices. @@ -102,12 +102,15 @@ webmaster_verifications: yandex: 1234 ``` +* `lang` - The locale these tags are marked up in. Of the format `language_TERRITORY`. Default is `en_US`. + The SEO tag will respect the following YAML front matter if included in a post, page, or document: * `title` - The title of the post, page, or document * `description` - A short description of the page's content * `image` - URL to an image associated with the post, page, or document (e.g., `/assets/page-pic.jpg`) * `author` - Page-, post-, or document-specific author information (see below) +* `lang` - Page-, post-, or document-specific language information ## Advanced usage @@ -191,17 +194,14 @@ The following options can be set for any particular page. While the default opti For most users, setting `image: [path-to-image]` on a per-page basis should be enough. If you need more control over how images are represented, the `image` property can also be an object, with the following options: * `path` - The relative path to the image. Same as `image: [path-to-image]` -* `twitter` - The relative path to a Twitter-specific image. -* `facebook` - The relative path to a Facebook-specific image. -* `height` - The height of the Facebook (`og:image`) image -* `width` - The width of the Facebook (`og:image`) image +* `height` - The height of the Open Graph (`og:image`) image +* `width` - The width of the Open Graph (`og:image`) image You can use any of the above, optional properties, like so: ```yml image: - twitter: /img/twitter.png - facebook: /img/facebook.png + path: /img/twitter.png height: 100 width: 100 ``` diff --git a/Rakefile b/Rakefile index 4c774a2..b7e9ed5 100644 --- a/Rakefile +++ b/Rakefile @@ -1,6 +1,6 @@ -require 'bundler/gem_tasks' -require 'rspec/core/rake_task' +require "bundler/gem_tasks" +require "rspec/core/rake_task" RSpec::Core::RakeTask.new(:spec) -task default: :spec +task :default => :spec diff --git a/jekyll-seo-tag.gemspec b/jekyll-seo-tag.gemspec index 872c582..75abd13 100644 --- a/jekyll-seo-tag.gemspec +++ b/jekyll-seo-tag.gemspec @@ -1,34 +1,35 @@ # coding: utf-8 -lib = File.expand_path('../lib', __FILE__) + +lib = File.expand_path("../lib", __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require 'jekyll-seo-tag/version' +require "jekyll-seo-tag/version" Gem::Specification.new do |spec| - spec.name = 'jekyll-seo-tag' + spec.name = "jekyll-seo-tag" spec.version = Jekyll::SeoTag::VERSION - spec.authors = ['Ben Balter'] - spec.email = ['ben.balter@github.com'] + spec.authors = ["Ben Balter"] + spec.email = ["ben.balter@github.com"] spec.summary = "A Jekyll plugin to add metadata tags for search engines and social networks to better index and display your site's content." - spec.homepage = 'https://github.com/benbalter/jekyll-seo-tag' - spec.license = 'MIT' + spec.homepage = "https://github.com/benbalter/jekyll-seo-tag" + spec.license = "MIT" # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or # delete this section to allow pushing this gem to any host. if spec.respond_to?(:metadata) - spec.metadata['allowed_push_host'] = 'https://rubygems.org' + spec.metadata["allowed_push_host"] = "https://rubygems.org" else - raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.' + raise "RubyGems 2.0 or newer is required to protect against public gem pushes." end - spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } - spec.bindir = 'exe' - spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } - spec.require_paths = ['lib'] + spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r!^(test|spec|features)/!) } + spec.bindir = "exe" + spec.executables = spec.files.grep(%r!^exe/!) { |f| File.basename(f) } + spec.require_paths = ["lib"] - spec.add_dependency 'jekyll', '~> 3.3' - spec.add_development_dependency 'bundler', '~> 1.10' - spec.add_development_dependency 'rake', '~> 10.0' - spec.add_development_dependency 'rspec', '~> 3.3' - spec.add_development_dependency 'html-proofer', '~> 2.5' - spec.add_development_dependency 'rubocop', '~> 0.37' + spec.add_dependency "jekyll", "~> 3.3" + spec.add_development_dependency "bundler", "~> 1.10" + spec.add_development_dependency "rake", "~> 10.0" + spec.add_development_dependency "rspec", "~> 3.3" + spec.add_development_dependency "html-proofer", "~> 2.5" + spec.add_development_dependency "rubocop", "~> 0.48" end diff --git a/lib/jekyll-seo-tag.rb b/lib/jekyll-seo-tag.rb index 696daa6..7d3a736 100644 --- a/lib/jekyll-seo-tag.rb +++ b/lib/jekyll-seo-tag.rb @@ -44,7 +44,7 @@ module Jekyll end def title? - !(@text =~ %r!title=false!i) + @text !~ %r!title=false!i end def info diff --git a/lib/template.html b/lib/template.html index eacff7f..c06665c 100755 --- a/lib/template.html +++ b/lib/template.html @@ -90,13 +90,15 @@ {% endif %} {% if page.image %} - {% assign seo_page_image = page.image.path | default: page.image.facebook | default: page.image %} + {% assign seo_page_image = page.image.path | default: page.image.facebook | default: page.image.twitter | default: page.image %} {% unless seo_page_image contains "://" %} {% assign seo_page_image = seo_page_image | absolute_url %} {% endunless %} {% assign seo_page_image = seo_page_image | escape %} {% endif %} +{% assign seo_page_lang = page.lang | default: site.lang | default: "en_US" %} + {% if seo_tag.title and seo_title %} {{ seo_title }} {% endif %} @@ -109,6 +111,8 @@ {% endif %} + + {% if seo_description %} @@ -124,7 +128,7 @@ {% endif %} {% if seo_page_image %} - + {% if page.image.height %} {% endif %} @@ -133,10 +137,6 @@ {% endif %} {% endif %} -{% if page.image.twitter %} - -{% endif %} - {% if page.date %} diff --git a/spec/jekyll_seo_tag_spec.rb b/spec/jekyll_seo_tag_spec.rb index 1937ab9..e2bcb0b 100755 --- a/spec/jekyll_seo_tag_spec.rb +++ b/spec/jekyll_seo_tag_spec.rb @@ -172,7 +172,7 @@ describe Jekyll::SeoTag do context "with relative page.image as a string" do let(:page) { make_page("image" => "/img/foo.png") } - it "outputs the image" do + it "outputs an open graph image" do expected = '' expect(output).to include(expected) end @@ -181,7 +181,7 @@ describe Jekyll::SeoTag do context "with absolute page.image" do let(:page) { make_page("image" => "http://cdn.example.invalid/img/foo.png") } - it "outputs the image" do + it "outputs an open graph image" do expected = '' expect(output).to include(expected) end @@ -191,7 +191,7 @@ describe Jekyll::SeoTag do context "when given a path" do let(:page) { make_page("image" => { "path" => "/img/foo.png" }) } - it "outputs the image" do + it "outputs an open graph image" do expected = %r!! expect(output).to match(expected) end @@ -200,7 +200,7 @@ describe Jekyll::SeoTag do context "when given a facebook image" do let(:page) { make_page("image" => { "facebook" => "/img/facebook.png" }) } - it "outputs the image" do + it "outputs an open graph image" do expected = %r!! expect(output).to match(expected) end @@ -209,17 +209,17 @@ describe Jekyll::SeoTag do context "when given a twitter image" do let(:page) { make_page("image" => { "twitter" => "/img/twitter.png" }) } - it "outputs the image" do - expected = %r!! + it "outputs an open graph image" do + expected = %r!! expect(output).to match(expected) end end - context "when given the image height and width" do - let(:image) { { "facebook" => "/img/foo.png", "height" => 1, "width" => 2 } } + context "when given an image height and width" do + let(:image) { { "path" => "/img/foo.png", "height" => 1, "width" => 2 } } let(:page) { make_page("image" => image) } - it "outputs the image" do + it "outputs an open graph image width and height" do expected = %r!! expect(output).to match(expected) expected = %r!! @@ -257,6 +257,7 @@ describe Jekyll::SeoTag do Foo + @@ -581,4 +582,38 @@ EOS end end end + + context "with locale" do + it "uses en_US when no locale is specified" do + expected = %r!! + expect(output).to match(expected) + end + + context "with site.lang" do + let(:site) { make_site("lang" => "en_US") } + + it "uses site.lang if page.lang is not present" do + expected = %r!! + expect(output).to match(expected) + end + + context "with page.lang" do + let(:page) { make_page("lang" => "en_UK") } + + it "uses page.lang if both site.lang and page.lang are present" do + expected = %r!! + expect(output).to match(expected) + end + end + end + + context "with site.lang hyphenated" do + let(:site) { make_site("lang" => "en-US") } + + it "coerces hyphen to underscore" do + expected = %r!! + expect(output).to match(expected) + end + end + end end