Fix links in status posts
This commit is contained in:
@@ -12,6 +12,8 @@ module Main
|
||||
module Decorators
|
||||
module Posts
|
||||
class Decorator < SimpleDelegator
|
||||
REGEXP = URI::DEFAULT_PARSER.make_regexp
|
||||
|
||||
def syndicated?
|
||||
!syndication_sources.empty?
|
||||
end
|
||||
@@ -111,6 +113,14 @@ module Main
|
||||
photos? ? "<div>#{photos.map { |p| "<img src='#{p["value"]}'/>" }.join("")} #{content}</div>" : content
|
||||
end
|
||||
|
||||
def rendered_content
|
||||
html_text = wrap_anchors_in_object_tags(replace_urls_with_anchors(content))
|
||||
res = Sanitize.fragment(html_text,
|
||||
elements: ["img", "p", "object", "a"],
|
||||
attributes: {"img" => ["alt", "src", "title"], "a" => ["href"]})
|
||||
res.gsub(prefix_emoji[0], "") if prefix_emoji
|
||||
end
|
||||
|
||||
def raw_content
|
||||
res = Sanitize.fragment(content)
|
||||
res.gsub(prefix_emoji[0], "") if prefix_emoji
|
||||
@@ -174,6 +184,24 @@ module Main
|
||||
|
||||
private
|
||||
|
||||
def replace_urls_with_anchors(text)
|
||||
url_regex = %r{(?<!<a href="|img src="|video src=")(https?://[^\s]+)(?![^<>]*(</a>|/>))}
|
||||
|
||||
text.gsub(url_regex) do |url|
|
||||
%(<object><a href="#{url}">#{url}</a></object>)
|
||||
end
|
||||
end
|
||||
|
||||
def wrap_anchors_in_object_tags(text)
|
||||
# Regular expression to match <a> tags
|
||||
anchor_regex = /(<a\s+[^>]*>.*?<\/a>)/
|
||||
|
||||
# Replace the matched anchor tags with <object> wrapped anchor tags
|
||||
text.gsub(anchor_regex) do |anchor_tag|
|
||||
%(<object>#{anchor_tag}</object>)
|
||||
end
|
||||
end
|
||||
|
||||
# e.g. geo:-37.75188,144.90417;u=35
|
||||
def geo
|
||||
loc = location.split(":")[1]
|
||||
@@ -211,8 +239,8 @@ module Main
|
||||
results << "</#{tag}>"
|
||||
end
|
||||
results
|
||||
rescue REXML::ParseException => e
|
||||
return "<p>No excerpt</p>"
|
||||
rescue REXML::ParseException
|
||||
"<p>No excerpt</p>"
|
||||
end
|
||||
|
||||
def attrs_to_s(attrs)
|
||||
|
@@ -10,13 +10,36 @@ module Main
|
||||
module Decorators
|
||||
module Statuses
|
||||
class Decorator < Main::Decorators::Posts::Decorator
|
||||
REGEXP = URI::DEFAULT_PARSER.make_regexp
|
||||
|
||||
def raw_content
|
||||
res = Sanitize.fragment(content,
|
||||
elements: ["img", "p"],
|
||||
attributes: {"img" => ["alt", "src", "title"]})
|
||||
html_text = wrap_anchors_in_object_tags(replace_urls_with_anchors(content))
|
||||
res = Sanitize.fragment(html_text,
|
||||
elements: ["img", "p", "object", "a"],
|
||||
attributes: {"img" => ["alt", "src", "title"], "a" => ["href"]})
|
||||
|
||||
res.gsub(prefix_emoji[0], "") if prefix_emoji
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def replace_urls_with_anchors(text)
|
||||
url_regex = %r{(?<!<a href="|img src="|video src=")(https?://[^\s]+)(?![^<>]*(</a>|/>))}
|
||||
|
||||
text.gsub(url_regex) do |url|
|
||||
%(<object><a href="#{url}">#{url}</a></object>)
|
||||
end
|
||||
end
|
||||
|
||||
def wrap_anchors_in_object_tags(text)
|
||||
# Regular expression to match <a> tags
|
||||
anchor_regex = /(<a\s+[^>]*>.*?<\/a>)/
|
||||
|
||||
# Replace the matched anchor tags with <object> wrapped anchor tags
|
||||
text.gsub(anchor_regex) do |anchor_tag|
|
||||
%(<object>#{anchor_tag}</object>)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@@ -42,7 +42,7 @@ div class="mb-8 h-entry border border-gray-200 m-2 p-4 bg-gray-50 hover:bg-gray-
|
||||
video class="rounded w-max" autoplay=false loop=false muted=true controls=true
|
||||
source type="video/mp4" src="#{video["value"]}"
|
||||
div class="mb-8"
|
||||
p class="text-sm text-blue-400 dark:text-indigo-400"
|
||||
p class="mt-4 text-sm text-blue-400 dark:text-indigo-400"
|
||||
a class="u-url float-left mr-0 border-dotted border-b-2 border-blue-100 hover:border-blue-200 dark:border-indigo-900 dark:hover:border-indigo-800" href="#{post.permalink}"
|
||||
time class="dt-published" datetime=post.machine_published_at
|
||||
= post.display_published_at
|
||||
|
Reference in New Issue
Block a user