Skip to content

Commit

Permalink
Truncate the description value to 100 words (#492)
Browse files Browse the repository at this point in the history
Merge pull request 492
  • Loading branch information
kemenaran authored Nov 6, 2023
1 parent db0e639 commit 589feb0
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 1 deletion.
21 changes: 21 additions & 0 deletions docs/advanced-usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,27 @@ You can set it the same way as the other author properties. For example, you can
url: https://example.com/
```

### Customizing description length

By default, the description is limited to the first 100 words of the full content.

You can adjust this limit at the page level, by using the `seo_description_max_words` page property:

```yml
seo_description_max_words: 200
```

You can also set a default site-wide value for all pages using [Front Matter defaults](https://jekyllrb.com/docs/configuration/front-matter-defaults/) in your `_config.yml` file:

```yml
defaults:
- scope:
path: ""
values:
seo_description_max_words: 200
```


### Customizing JSON-LD output

The following options can be set for any particular page. While the default options are meant to serve most users in the most common circumstances, there may be situations where more precise control is necessary.
Expand Down
14 changes: 13 additions & 1 deletion lib/jekyll-seo-tag/drop.rb
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ def name

def description
@description ||= begin
format_string(page["description"] || page["excerpt"]) || site_description
value = format_string(page["description"] || page["excerpt"]) || site_description
snippet(value, description_max_words)
end
end

Expand Down Expand Up @@ -175,6 +176,10 @@ def canonical_url
end
end

def description_max_words
@description_max_words ||= page["seo_description_max_words"] || 100
end

private

def filters
Expand Down Expand Up @@ -217,6 +222,13 @@ def format_string(string)
string unless string.empty?
end

def snippet(string, max_words)
return string if string.nil?

result = string.split(%r!\s+!, max_words + 1)[0...max_words].join(" ")
result.length < string.length ? result.concat("…") : result
end

def seo_name
@seo_name ||= format_string(page_seo["name"]) if page_seo["name"]
end
Expand Down
18 changes: 18 additions & 0 deletions spec/jekyll_seo_tag/drop_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,24 @@
expect(subject.description).to be_nil
end
end

context "truncation" do
context "without seo_description_max_words" do
let(:page_meta) { { "description" => "word " * 150 } }

it "truncates the description to the first 200 words" do
expect(subject.description).to eql(("word " * 100).chop.concat("…"))
end
end

context "with an explicit seo_description_max_words property" do
let(:page_meta) { { "description" => "For a long time, I went to bed early", "seo_description_max_words" => 6 } }

it "truncates the description to the configured words count" do
expect(subject.description).to eql("For a long time, I went…")
end
end
end
end

context "author" do
Expand Down
17 changes: 17 additions & 0 deletions spec/jekyll_seo_tag_integration_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,23 @@
it "removes null values from JSON-LD" do
expect(output).to_not match(%r!:null!)
end

context "description" do
context "with page.seo_description_max_words" do
let(:meta) do
{
"title" => "post",
"description" => "For a long time, I went to bed early",
"image" => "/img.png",
"seo_description_max_words" => 6,
}
end

it "truncates the description" do
expect(json_data["description"]).to eql("For a long time, I went…")
end
end
end
end
end

Expand Down

0 comments on commit 589feb0

Please sign in to comment.