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 <strong> 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.
This commit is contained in:
Edward Loveall 2021-08-08 14:34:40 -04:00
parent 130b235a6c
commit 31f7d6956c
No known key found for this signature in database
GPG Key ID: 789A4AE983AC8901
6 changed files with 19 additions and 18 deletions

View File

@ -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

View File

@ -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),
]

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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?