From 31f7d6956c50164ece4bd208fd39d1baf2be69a6 Mon Sep 17 00:00:00 2001 From: Edward Loveall Date: Sun, 8 Aug 2021 14:34:40 -0400 Subject: [PATCH] Anchor and UserAnchor nodes can contain children The impetus for this change was to help make the MarkupConverter code more robust. However, it's also possible that an Anchor can contain styled text. For example, in markdown someone might write a link that contains some text: ```markdown [this link is so **good**](https://example.com) ``` This setup will now allow that. Unknown if UserAnchor can ever contain any text that isn't just the user's name, but it's easy to deal with and makes the typing much easier. --- spec/classes/markup_converter_spec.cr | 4 ++-- spec/classes/paragraph_converter_spec.cr | 5 ++++- spec/components/page_content_spec.cr | 4 ++-- src/classes/markup_converter.cr | 4 ++-- src/components/page_content.cr | 4 ++-- src/models/nodes.cr | 16 +++++++--------- 6 files changed, 19 insertions(+), 18 deletions(-) diff --git a/spec/classes/markup_converter_spec.cr b/spec/classes/markup_converter_spec.cr index f034a99..f77022e 100644 --- a/spec/classes/markup_converter_spec.cr +++ b/spec/classes/markup_converter_spec.cr @@ -126,7 +126,7 @@ describe MarkupConverter do result.should eq([ Text.new("I am a "), - Anchor.new(text: "Link", href: "https://example.com"), + Anchor.new(children: [Text.new("Link")] of Child, href: "https://example.com"), ]) end @@ -160,7 +160,7 @@ describe MarkupConverter do result.should eq([ Text.new("Hi "), - UserAnchor.new(text: "Dr Nick", userId: "abc123"), + UserAnchor.new(children: [Text.new("Dr Nick")] of Child, userId: "abc123"), Text.new("!"), ]) end diff --git a/spec/classes/paragraph_converter_spec.cr b/spec/classes/paragraph_converter_spec.cr index 0591690..4eda931 100644 --- a/spec/classes/paragraph_converter_spec.cr +++ b/spec/classes/paragraph_converter_spec.cr @@ -190,7 +190,10 @@ describe ParagraphConverter do Image.new(src: "image.png", originalWidth: 1000, originalHeight: 600), FigureCaption.new(children: [ Text.new("Image by "), - Anchor.new(href: "https://unsplash.com/@someuser", text: "someuser"), + Anchor.new( + children: [Text.new("someuser")] of Child, + href: "https://unsplash.com/@someuser" + ), ] of Child), ] of Child), ] diff --git a/spec/components/page_content_spec.cr b/spec/components/page_content_spec.cr index 32195f9..fdb07bb 100644 --- a/spec/components/page_content_spec.cr +++ b/spec/components/page_content_spec.cr @@ -40,7 +40,7 @@ describe PageContent do it "renders an anchor" do page = Page.new(nodes: [ - Anchor.new(href: "https://example.com", text: "link"), + Anchor.new(children: [Text.new("link")] of Child, href: "https://example.com"), ] of Child) html = PageContent.new(page: page).render_to_string @@ -229,7 +229,7 @@ describe PageContent do it "renders a user anchor" do page = Page.new(nodes: [ - UserAnchor.new(userId: "abc123", text: "Some User"), + UserAnchor.new(children: [Text.new("Some User")] of Child, userId: "abc123"), ] of Child) html = PageContent.new(page: page).render_to_string diff --git a/src/classes/markup_converter.cr b/src/classes/markup_converter.cr index 5830d77..56ebfe9 100644 --- a/src/classes/markup_converter.cr +++ b/src/classes/markup_converter.cr @@ -39,9 +39,9 @@ class MarkupConverter case markup.type when PostResponse::MarkupType::A if href = markup.href - container = Anchor.new(href: href, text: to_be_marked) + container = Anchor.new(children: [Text.new(to_be_marked)] of Child, href: href) elsif userId = markup.userId - container = UserAnchor.new(userId: userId, text: to_be_marked) + container = UserAnchor.new(children: [Text.new(to_be_marked)] of Child, userId: userId) else container = Empty.new end diff --git a/src/components/page_content.cr b/src/components/page_content.cr index 3019b6e..9ccf7cd 100644 --- a/src/components/page_content.cr +++ b/src/components/page_content.cr @@ -13,7 +13,7 @@ class PageContent < BaseComponent end def render_child(node : Anchor) - a(href: node.href) { text node.text } + a(href: node.href) { render_children(node.children) } end def render_child(node : BlockQuote) @@ -95,6 +95,6 @@ class PageContent < BaseComponent end def render_child(node : UserAnchor) - a(href: node.href) { text node.text } + a(href: node.href) { render_children(node.children) } end end diff --git a/src/models/nodes.cr b/src/models/nodes.cr index cf699e6..f17d450 100644 --- a/src/models/nodes.cr +++ b/src/models/nodes.cr @@ -1,5 +1,5 @@ module Nodes - alias Leaf = Text | Image | IFrame | Anchor | UserAnchor + alias Leaf = Text | Image | IFrame alias Child = Container | Leaf | Empty alias Children = Array(Child) @@ -136,15 +136,14 @@ module Nodes end end - class Anchor + class Anchor < Container getter href : String - getter text : String - def initialize(@href : String, @text : String) + def initialize(@children : Children, @href : String) end def ==(other : Anchor) - other.href == href && other.text == text + other.children == children && other.href == href end def empty? @@ -152,18 +151,17 @@ module Nodes end end - class UserAnchor + class UserAnchor < Container USER_BASE_URL = "https://medium.com/u/" getter href : String - getter text : String - def initialize(userId : String, @text : String) + def initialize(@children : Children, userId : String) @href = USER_BASE_URL + userId end def ==(other : UserAnchor) - other.href == href && other.text == text + other.children == children && other.href == href end def empty?