Improve title parsing

The subtitle has been removed because it's difficult to find and error
prone to guess at. It is somewhat accessible from the post's
previewContent field in GraphQL but that can be truncated.
This commit is contained in:
Edward Loveall 2021-10-03 18:14:46 -04:00
parent 2808505b4e
commit fba87c1076
No known key found for this signature in database
GPG Key ID: 789A4AE983AC8901
5 changed files with 25 additions and 117 deletions

View File

@ -3,56 +3,26 @@ require "../spec_helper"
include Nodes
describe PageConverter do
it "sets the title and subtitle if present" do
it "sets the page title" do
title = "Hello, world!"
paragraph_json = <<-JSON
[
{
"text": "Title",
"text": "#{title}",
"type": "H3",
"markups": [],
"iframe": null,
"layout": null,
"metadata": null
},
{
"text": "Subtitle",
"type": "H4",
"markups": [],
"iframe": null,
"layout": null,
"metadata": null
}
]
JSON
data_json = default_data_json(paragraph_json)
data_json = default_data_json(title, paragraph_json)
data = PostResponse::Data.from_json(data_json)
page = PageConverter.new.convert(data)
page.title.should eq "Title"
page.subtitle.should eq "Subtitle"
end
it "sets the title to the first paragraph if no title" do
paragraph_json = <<-JSON
[
{
"text": "Not a title",
"type": "P",
"markups": [],
"iframe": null,
"layout": null,
"metadata": null
}
]
JSON
data_json = default_data_json(paragraph_json)
data = PostResponse::Data.from_json(data_json)
page = PageConverter.new.convert(data)
page.title.should eq "Not a title"
page.subtitle.should eq nil
page.title.should eq title
end
it "sets the author" do
@ -106,25 +76,18 @@ describe PageConverter do
page.created_at.should eq Time.utc(1970, 1, 1, 0, 0, 1)
end
it "calls ParagraphConverter to convert the remaining paragraph content" do
it "calls converts the remaining paragraph content" do
title = "Title"
paragraph_json = <<-JSON
[
{
"text": "Title",
"text": "#{title}",
"type": "H3",
"markups": [],
"iframe": null,
"layout": null,
"metadata": null
},
{
"text": "Subtitle",
"type": "H4",
"markups": [],
"iframe": null,
"layout": null,
"metadata": null
},
{
"text": "Content",
"type": "P",
@ -135,7 +98,7 @@ describe PageConverter do
}
]
JSON
data_json = default_data_json(paragraph_json)
data_json = default_data_json(title, paragraph_json)
data = PostResponse::Data.from_json(data_json)
page = PageConverter.new.convert(data)
@ -148,11 +111,18 @@ describe PageConverter do
end
end
def default_data_json(paragraph_json : String)
def default_paragraph_json
"[]"
end
def default_data_json(
title : String = "This is a story",
paragraph_json : String = default_paragraph_json
)
<<-JSON
{
"post": {
"title": "This is a story",
"title": "#{title}",
"createdAt": 1628974309758,
"creator": {
"id": "abc123",

View File

@ -6,7 +6,6 @@ describe PageContent do
it "renders a single parent/child node structure" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -24,7 +23,6 @@ describe PageContent do
it "renders multiple childrens" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -53,7 +51,6 @@ describe PageContent do
it "renders an anchor" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -69,7 +66,6 @@ describe PageContent do
it "renders a blockquote" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -87,7 +83,6 @@ describe PageContent do
it "renders code" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -105,7 +100,6 @@ describe PageContent do
it "renders empasis" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -127,7 +121,6 @@ describe PageContent do
children = [Text.new("A caption")] of Child
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -155,7 +148,6 @@ describe PageContent do
it "renders a GitHub Gist" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -173,7 +165,6 @@ describe PageContent do
it "renders an H3" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -191,7 +182,6 @@ describe PageContent do
it "renders an H4" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -209,7 +199,6 @@ describe PageContent do
it "renders an image" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -231,7 +220,6 @@ describe PageContent do
it "renders embedded content" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -256,7 +244,6 @@ describe PageContent do
it "renders an embedded link container" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -280,7 +267,6 @@ describe PageContent do
it "renders an mixtape embed container" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -311,7 +297,6 @@ describe PageContent do
it "renders an ordered list" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -330,7 +315,6 @@ describe PageContent do
it "renders an preformatted text" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -348,7 +332,6 @@ describe PageContent do
it "renders an preformatted text" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -366,7 +349,6 @@ describe PageContent do
it "renders strong text" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -384,7 +366,6 @@ describe PageContent do
it "renders an unordered list" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [
@ -403,7 +384,6 @@ describe PageContent do
it "renders a user anchor" do
page = Page.new(
title: "Title",
subtitle: nil,
author: user_anchor_factory,
created_at: Time.local,
nodes: [

View File

@ -1,57 +1,20 @@
struct HeaderData
getter title : String
getter subtitle : String?
def initialize(@title : String, @subtitle : String?)
end
def first_content_paragraph_index : Int32
if title.blank?
0
elsif subtitle.nil? || subtitle.blank?
1
else
2
end
end
end
class PageConverter
def convert(data : PostResponse::Data) : Page
paragraphs = data.post.content.bodyModel.paragraphs
title, content = title_and_content(data)
author = data.post.creator
created_at = Time.unix_ms(data.post.createdAt)
header = header_data(paragraphs)
if header.first_content_paragraph_index.zero?
content = [] of PostResponse::Paragraph
else
content = paragraphs[header.first_content_paragraph_index..]
end
Page.new(
title: header.title,
subtitle: header.subtitle,
title: title,
author: author,
created_at: Time.unix_ms(data.post.createdAt),
nodes: ParagraphConverter.new.convert(content)
)
end
def header_data(paragraphs : Array(PostResponse::Paragraph)) : HeaderData
if paragraphs.empty?
return HeaderData.new("", nil)
end
first_two_paragraphs = paragraphs.first(2)
first_two_types = first_two_paragraphs.map(&.type)
if first_two_types == [PostResponse::ParagraphType::H3, PostResponse::ParagraphType::H4]
HeaderData.new(
title: first_two_paragraphs[0].text,
subtitle: first_two_paragraphs[1].text,
)
else
HeaderData.new(
title: first_two_paragraphs[0].text,
subtitle: nil,
)
end
def title_and_content(data : PostResponse::Data) : {String, Array(PostResponse::Paragraph)}
title = data.post.title
paragraphs = data.post.content.bodyModel.paragraphs
non_content_paragraphs = paragraphs.reject { |para| para.text == title }
{title, non_content_paragraphs}
end
end

View File

@ -1,13 +1,11 @@
class Page
getter nodes : Nodes::Children
getter title : String
getter subtitle : String?
getter author : PostResponse::Creator
getter created_at : Time
def initialize(
@title : String,
@subtitle : String?,
@author : PostResponse::Creator,
@created_at : Time,
@nodes : Nodes::Children = [] of Nodes::Child

View File

@ -7,9 +7,6 @@ class Articles::ShowPage < MainLayout
def content
h1 page.title
if subtitle = page.subtitle
para subtitle, class: "subtitle"
end
para class: "meta" do
text "#{author_link(page.author)} on #{page.created_at.to_s("%F")}"
end