docs: def tags_in_string(msg):
      """
      Return the set of tags in a message string.
  
      Tags includes HTML tags, data placeholders, etc.
  
      Skips tags that might change due to translations: HTML entities, <abbr>,
      and so on.
  
      """
      def is_linguistic_tag(tag):
          """Is this tag one that can change with the language?"""
          if tag.startswith("&"):
              return True
          if any(x in tag for x in ["<abbr>", "<abbr ", "</abbr>"]):
              return True
          return False
  
      __, tags = Converter().detag_string(msg)
      return set(t for t in tags if not is_linguistic_tag(t))