defmodule MedicalTranscriptionWeb.Components.KeywordHighlighter do @moduledoc """ Highlights keywords in transcription text by creating tags for each. """ use MedicalTranscriptionWeb, :html # alias Phoenix.HTML.Tag def highlight(assigns) do # TODO: Eliminate the need to use `raw` here. ~H""" <%= raw(format_text(@text, @keywords)) %> """ end # To highlight the keywords within the transcription, we find the start and end index of each keyword within `text`, # split the text at those points, and then join it back together, wrapping the keyword portion in a span with the # `text-brand` class. defp format_text(text, [first | rest]) do if String.contains?(first.label, "and") do format_text(text, rest) else # [one | two] = String.split(text, first.label) # # keyword = # Tag.content_tag(:span, first.label, # class: "text-brand", # title: "Score: #{Float.round(first.score, 2)}" # ) # # with_replaced_keyword = # Tag.content_tag :div do # "#{one}#{keyword}#{two}" # end # with_replaced_keyword = ~E""" # #{one} # #{first.label} # #{two} # """ # with_replaced_keyword = "#{one}#{keyword}#{two}" with_replaced_keyword = text |> String.split(first.label) |> Enum.join( ~s(#{first.label}) ) format_text(with_replaced_keyword, rest) end end defp format_text(text, []), do: text end