diff --git a/spec/invidious/helpers_spec.cr b/spec/invidious/helpers_spec.cr index 9fbb6d6fe..0a9d50373 100644 --- a/spec/invidious/helpers_spec.cr +++ b/spec/invidious/helpers_spec.cr @@ -3,6 +3,16 @@ 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 #music)) + end + + it "escapes video titles before linking hashtags" do + expect(parse_video_title(%(#music))).to eq(%(<b>#music</b>)) + 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") diff --git a/src/invidious/helpers/utils.cr b/src/invidious/helpers/utils.cr index 7a262f849..92eb85ed1 100644 --- a/src/invidious/helpers/utils.cr +++ b/src/invidious/helpers/utils.cr @@ -20,6 +20,14 @@ 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..] + "#{prefix}##{hashtag}" + end +end + def decode_length_seconds(string) length_seconds = string.gsub(/[^0-9:]/, "") return 0_i32 if length_seconds.empty? diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr index 796c0c914..ee393e7de 100644 --- a/src/invidious/views/watch.ecr +++ b/src/invidious/views/watch.ecr @@ -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.

- <%= title %> + <%= title_html %> <% if params.listen %> " id="link-iv-listen" data-base-url="/watch?<%= env.params.query %>&listen=0" href="/watch?<%= env.params.query %>&listen=0">