Link hashtags in video titles

This commit is contained in:
zy26thu-hash 2026-07-28 22:54:54 +08:00
parent 9d1291a0b8
commit f6e671fae1
3 changed files with 24 additions and 1 deletions

View File

@ -3,6 +3,18 @@ require "../spec_helper"
CONFIG = Config.from_yaml(File.open("config/config.example.yml"))
Spectator.describe "Helper" do
describe "#parse_video_title" do
it "links hashtags in video titles" do
expect(parse_video_title("Video title #music"))
.to eq(%(Video title <a href="/hashtag/music">#music</a>))
end
it "escapes video titles before linking hashtags" do
expect(parse_video_title(%(<b>#music</b>)))
.to eq(%(&lt;b&gt;<a href="/hashtag/music">#music</a>&lt;/b&gt;))
end
end
describe "#produce_channel_search_continuation" do
it "correctly produces token for searching a specific channel" do
expect(produce_channel_search_continuation("UCXuqSBlHAE6Xw-yeJA0Tunw", "", 100)).to eq("4qmFsgJqEhhVQ1h1cVNCbEhBRTZYdy15ZUpBMFR1bncaIEVnWnpaV0Z5WTJnd0FUZ0JZQUY2QkVkS2IxaTRBUUE9WgCaAilicm93c2UtZmVlZFVDWHVxU0JsSEFFNlh3LXllSkEwVHVud3NlYXJjaA%3D%3D")

View File

@ -20,6 +20,16 @@ def elapsed_text(elapsed)
"#{(millis * 1000).round(2)}µs"
end
def parse_video_title(title : String) : String
HTML.escape(title).gsub(/(^|[[:space:]])#([A-Za-z0-9_]+)/) do |match|
prefix = match.starts_with?("#") ? "" : match[0].to_s
hashtag = match[prefix.size + 1..]
href = URI.encode_path("/hashtag/#{hashtag}")
%(#{prefix}<a href="#{href}">##{hashtag}</a>)
end
end
def decode_length_seconds(string)
length_seconds = string.gsub(/[^0-9:]/, "")
return 0_i32 if length_seconds.empty?

View File

@ -1,5 +1,6 @@
<% ucid = video.ucid %>
<% title = HTML.escape(video.title) %>
<% title_html = parse_video_title(video.title) %>
<% author = HTML.escape(video.author) %>
@ -77,7 +78,7 @@ we're going to need to do it here in order to allow for translations.
<div class="h-box">
<h1>
<%= title %>
<%= title_html %>
<% if params.listen %>
<a title="<%=I18n.translate(locale, "Video mode")%>" id="link-iv-listen" data-base-url="/watch?<%= env.params.query %>&listen=0" href="/watch?<%= env.params.query %>&listen=0">
<i class="icon ion-ios-videocam"></i>