add tests for drop
This commit is contained in:
parent
058b337aba
commit
96e9823561
|
@ -18,7 +18,8 @@ module Jekyll
|
||||||
|
|
||||||
# Should the `<title>` tag be generated for this page?
|
# Should the `<title>` tag be generated for this page?
|
||||||
def title?
|
def title?
|
||||||
@text !~ %r!title=false!i && title
|
return false unless title
|
||||||
|
@text !~ %r!title=false!i
|
||||||
end
|
end
|
||||||
|
|
||||||
def site_title
|
def site_title
|
||||||
|
@ -33,20 +34,21 @@ module Jekyll
|
||||||
# Page title with site title or description appended
|
# Page title with site title or description appended
|
||||||
def title
|
def title
|
||||||
if page["title"] && site_title
|
if page["title"] && site_title
|
||||||
format_string(page["title"]) + TITLE_SEPARATOR + site_title
|
page_title + TITLE_SEPARATOR + site_title
|
||||||
elsif site["description"] && site_title
|
elsif site["description"] && site_title
|
||||||
site_title + TITLE_SEPARATOR + format_string(site["description"])
|
site_title + TITLE_SEPARATOR + format_string(site["description"])
|
||||||
else
|
else
|
||||||
format_string(page["title"]) || site_title
|
page_title || site_title
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def name
|
def name
|
||||||
if page["seo"] && page["seo"]["name"]
|
return format_string(seo_name) if seo_name
|
||||||
format_string page["seo"]["name"]
|
return unless homepage_or_about?
|
||||||
elsif homepage_or_about? && site["social"] && site["social"]["name"]
|
|
||||||
|
if site["social"] && site["social"]["name"]
|
||||||
format_string site["social"]["name"]
|
format_string site["social"]["name"]
|
||||||
elsif homepage_or_about? && site_title
|
elsif site_title
|
||||||
format_string site_title
|
format_string site_title
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -65,18 +67,13 @@ module Jekyll
|
||||||
# If the result from the name search is a string, we'll also check
|
# If the result from the name search is a string, we'll also check
|
||||||
# to see if the author exists in `site.data.authors`
|
# to see if the author exists in `site.data.authors`
|
||||||
def author
|
def author
|
||||||
author = page["author"]
|
return if author_string_or_hash.to_s.empty?
|
||||||
author = page["authors"][0] if author.to_s.empty? && page["authors"]
|
|
||||||
author = site["author"] if author.to_s.empty?
|
|
||||||
return if author.to_s.empty?
|
|
||||||
|
|
||||||
if author.is_a?(String)
|
author = if author_string_or_hash.is_a?(String)
|
||||||
author = if site.data["authors"] && site.data["authors"][author]
|
author_hash(author_string_or_hash)
|
||||||
site.data["authors"][author]
|
else
|
||||||
else
|
author_string_or_hash
|
||||||
{ "name" => author }
|
end
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
author["twitter"] ||= author["name"]
|
author["twitter"] ||= author["name"]
|
||||||
author["twitter"].delete! "@"
|
author["twitter"].delete! "@"
|
||||||
|
@ -127,7 +124,8 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# The resulting path is always an absolute URL
|
# The resulting path is always an absolute URL
|
||||||
def image
|
def image
|
||||||
return unless image = page["image"]
|
image = page["image"]
|
||||||
|
return unless image
|
||||||
|
|
||||||
image = { "path" => image } if image.is_a?(String)
|
image = { "path" => image } if image.is_a?(String)
|
||||||
image["path"] ||= image["facebook"] || image["twitter"]
|
image["path"] ||= image["facebook"] || image["twitter"]
|
||||||
|
@ -177,6 +175,27 @@ module Jekyll
|
||||||
|
|
||||||
string unless string.empty?
|
string unless string.empty?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def author_string_or_hash
|
||||||
|
author = page["author"]
|
||||||
|
author = page["authors"][0] if author.to_s.empty? && page["authors"]
|
||||||
|
author = site["author"] if author.to_s.empty?
|
||||||
|
author
|
||||||
|
end
|
||||||
|
|
||||||
|
def author_hash(author_string)
|
||||||
|
if site.data["authors"] && site.data["authors"][author_string]
|
||||||
|
hash = site.data["authors"][author_string]
|
||||||
|
hash["twitter"] ||= author_string
|
||||||
|
hash
|
||||||
|
else
|
||||||
|
{ "name" => author_string }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def seo_name
|
||||||
|
page["seo"] && page["seo"]["name"]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -49,7 +49,6 @@
|
||||||
<link rel="next" href="{{ paginator.next_page_path | absolute_url }}">
|
<link rel="next" href="{{ paginator.next_page_path | absolute_url }}">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{{ seo_tag.author | jsonify }}
|
|
||||||
{% if site.twitter %}
|
{% if site.twitter %}
|
||||||
{% if seo_tag.image %}
|
{% if seo_tag.image %}
|
||||||
<meta name="twitter:card" content="summary_large_image" />
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
|
|
|
@ -0,0 +1,233 @@
|
||||||
|
RSpec.describe Jekyll::SeoTag::Drop do
|
||||||
|
let(:page) { make_page({ "title" => "page title" }) }
|
||||||
|
let(:site) { make_site({ "title" => "site title" }) }
|
||||||
|
let(:context) { make_context(:page => page, :site => site) }
|
||||||
|
let(:text) { "" }
|
||||||
|
subject { described_class.new(text, context) }
|
||||||
|
|
||||||
|
it "returns the version" do
|
||||||
|
expect(subject.version).to eql(Jekyll::SeoTag::VERSION)
|
||||||
|
end
|
||||||
|
|
||||||
|
context "title?" do
|
||||||
|
it "knows to include the title" do
|
||||||
|
expect(subject.title?).to be_truthy
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with title=false" do
|
||||||
|
let(:text) { "title=false" }
|
||||||
|
|
||||||
|
it "knows not to include the title" do
|
||||||
|
expect(subject.title?).to be_falsy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "site title" do
|
||||||
|
it "knows the site title" do
|
||||||
|
expect(subject.site_title).to eql("site title")
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with site.name" do
|
||||||
|
let(:site) { make_site({ "name" => "site title" }) }
|
||||||
|
|
||||||
|
it "knows the site title" do
|
||||||
|
expect(subject.site_title).to eql("site title")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "page title" do
|
||||||
|
it "knows the page title" do
|
||||||
|
expect(subject.page_title).to eql("page title")
|
||||||
|
end
|
||||||
|
|
||||||
|
context "without a page title" do
|
||||||
|
let(:page) { make_page }
|
||||||
|
|
||||||
|
it "knows the page title" do
|
||||||
|
expect(subject.page_title).to eql("site title")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "title" do
|
||||||
|
context "with a page and site title" do
|
||||||
|
it "builds the title" do
|
||||||
|
expect(subject.title).to eql("page title | site title")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with a site description but no page title" do
|
||||||
|
let(:page) { make_page }
|
||||||
|
let(:site) do
|
||||||
|
make_site({ "title" => "site title", "description" => "site description" })
|
||||||
|
end
|
||||||
|
|
||||||
|
it "builds the title" do
|
||||||
|
expect(subject.title).to eql("site title | site description")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with just a page title" do
|
||||||
|
let(:site) { make_site }
|
||||||
|
|
||||||
|
it "builds the title" do
|
||||||
|
expect(subject.title).to eql("page title")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with just a site title" do
|
||||||
|
let(:page) { make_page }
|
||||||
|
|
||||||
|
it "builds the title" do
|
||||||
|
expect(subject.title).to eql("site title")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "name" do
|
||||||
|
context "with seo.name" do
|
||||||
|
let(:page) { make_page({ "seo" => { "name" => "seo name" } }) }
|
||||||
|
|
||||||
|
it "uses the seo name" do
|
||||||
|
expect(subject.name).to eql("seo name")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "the index" do
|
||||||
|
let(:page) { make_page({ "permalink" => "/" }) }
|
||||||
|
|
||||||
|
context "with site.social.name" do
|
||||||
|
let(:site) { make_site({ "social" => { "name" => "social name" } }) }
|
||||||
|
|
||||||
|
it "uses site.social.name" do
|
||||||
|
expect(subject.name).to eql("social name")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "uses the site title" do
|
||||||
|
expect(subject.name).to eql("site title")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "description" do
|
||||||
|
context "with a page description" do
|
||||||
|
let(:page) { make_page({ "description"=> "page description" }) }
|
||||||
|
|
||||||
|
it "uses the page description" do
|
||||||
|
expect(subject.description).to eql("page description")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with a page excerpt" do
|
||||||
|
let(:page) { make_page({ "description"=> "page excerpt" }) }
|
||||||
|
|
||||||
|
it "uses the page description" do
|
||||||
|
expect(subject.description).to eql("page excerpt")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with a site description" do
|
||||||
|
let(:site) { make_site({ "description"=> "site description" }) }
|
||||||
|
|
||||||
|
it "uses the page description" do
|
||||||
|
expect(subject.description).to eql("site description")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "author" do
|
||||||
|
let(:page_data) { {} }
|
||||||
|
let(:page) { make_page(page_data) }
|
||||||
|
let(:data) { {} }
|
||||||
|
let(:site) do
|
||||||
|
site = make_site({ "author" => "author" })
|
||||||
|
site.data = data
|
||||||
|
site
|
||||||
|
end
|
||||||
|
|
||||||
|
%i[with without].each do |site_data_type|
|
||||||
|
context "#{site_data_type} site.author data" do
|
||||||
|
let(:data) do
|
||||||
|
if site_data_type == :with
|
||||||
|
{
|
||||||
|
"authors" => {
|
||||||
|
"author" => { "name" => "Author" },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
{
|
||||||
|
:string => { "author" => "author" },
|
||||||
|
:array => { "authors" => %w(author author2) },
|
||||||
|
:empty_string => { "author" => "" },
|
||||||
|
:nil => { "author" => nil },
|
||||||
|
:hash => { "author" => { "name" => "author" } },
|
||||||
|
}.each do |author_type, data|
|
||||||
|
context "with author as #{author_type}" do
|
||||||
|
let(:page_data) { data }
|
||||||
|
|
||||||
|
it "returns a hash" do
|
||||||
|
expect(subject.author).to be_a(Hash)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns the name" do
|
||||||
|
if site_data_type == :with && author_type != :hash
|
||||||
|
expect(subject.author["name"]).to eql("Author")
|
||||||
|
else
|
||||||
|
expect(subject.author["name"]).to eql("author")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns the twitter handle" do
|
||||||
|
expect(subject.author["twitter"]).to eql("author")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "twitter" do
|
||||||
|
let(:page_data) { { "author" => "author" } }
|
||||||
|
|
||||||
|
it "pulls the handle from the author" do
|
||||||
|
expect(subject.author["twitter"]).to eql("author")
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with an @" do
|
||||||
|
let(:page_data) do
|
||||||
|
{
|
||||||
|
"author" => {
|
||||||
|
"name" => "author",
|
||||||
|
"twitter" => "@twitter",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it "strips the @" do
|
||||||
|
expect(subject.author["twitter"]).to eql("twitter")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with an explicit handle" do
|
||||||
|
let(:page_data) do
|
||||||
|
{
|
||||||
|
"author" => {
|
||||||
|
"name" => "author",
|
||||||
|
"twitter" => "twitter",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it "pulls the handle from the hash" do
|
||||||
|
expect(subject.author["twitter"]).to eql("twitter")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -403,6 +403,7 @@ EOS
|
||||||
|
|
||||||
context "with the author in site.data.authors" do
|
context "with the author in site.data.authors" do
|
||||||
let(:author_data) { { "benbalter" => { "twitter" => "test" } } }
|
let(:author_data) { { "benbalter" => { "twitter" => "test" } } }
|
||||||
|
|
||||||
it "outputs the twitter card" do
|
it "outputs the twitter card" do
|
||||||
expected = %r!<meta name="twitter:creator" content="@test" />!
|
expected = %r!<meta name="twitter:creator" content="@test" />!
|
||||||
expect(output).to match(expected)
|
expect(output).to match(expected)
|
||||||
|
|
Loading…
Reference in New Issue