From fba87c1076e37cff6e76741ca00a6622f957a56b Mon Sep 17 00:00:00 2001 From: Edward Loveall Date: Sun, 3 Oct 2021 18:14:46 -0400 Subject: [PATCH] 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. --- spec/classes/page_converter_spec.cr | 66 ++++++++-------------------- spec/components/page_content_spec.cr | 20 --------- src/classes/page_converter.cr | 51 +++------------------ src/models/page.cr | 2 - src/pages/articles/show_page.cr | 3 -- 5 files changed, 25 insertions(+), 117 deletions(-) diff --git a/spec/classes/page_converter_spec.cr b/spec/classes/page_converter_spec.cr index 30b0a3b..39f89e0 100644 --- a/spec/classes/page_converter_spec.cr +++ b/spec/classes/page_converter_spec.cr @@ -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", diff --git a/spec/components/page_content_spec.cr b/spec/components/page_content_spec.cr index 72727e2..50520a6 100644 --- a/spec/components/page_content_spec.cr +++ b/spec/components/page_content_spec.cr @@ -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: [ diff --git a/src/classes/page_converter.cr b/src/classes/page_converter.cr index b4ee7d4..70f932f 100644 --- a/src/classes/page_converter.cr +++ b/src/classes/page_converter.cr @@ -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 diff --git a/src/models/page.cr b/src/models/page.cr index 6bcb69c..1c22559 100644 --- a/src/models/page.cr +++ b/src/models/page.cr @@ -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 diff --git a/src/pages/articles/show_page.cr b/src/pages/articles/show_page.cr index d3e5dc8..33aadd8 100644 --- a/src/pages/articles/show_page.cr +++ b/src/pages/articles/show_page.cr @@ -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