Class: HTML::Pipeline::TeamMentionFilter
- Defined in:
- lib/html/pipeline/@team_mention_filter.rb
Overview
HTML filter that replaces @org/team mentions with links. Mentions within <pre>, <code>, <a>, <style>, and <script> elements are ignored.
Context options:
:base_url - Used to construct links to team profile pages for each
mention.
:team_pattern - Used to provide a custom regular expression to
identify team names
Constant Summary collapse
- TeamPattern =
Default pattern used to extract team names from text. The value can be overridden by providing the team_pattern variable in the context. To properly link the mention, should be in the format of /@(1)/(2)/.
/ (?<=^|\W) # beginning of string or non-word char @([a-z0-9][a-z0-9-]*) # @organization \/ # dividing slash ([a-z0-9][a-z0-9\-_]*) # team \b /ix
- IGNORE_PARENTS =
Don’t look for mentions in text nodes that are children of these elements
%w[pre code a style script].to_set
Instance Attribute Summary
Attributes inherited from Filter
Class Method Summary collapse
-
.mentioned_teams_in(text, team_pattern = TeamPattern) ⇒ Object
Public: Find @org/team mentions in text.
Instance Method Summary collapse
- #call ⇒ Object
- #link_to_mentioned_team(org, team) ⇒ Object
-
#mention_link_filter(text, _base_url = '/', team_pattern = TeamPattern) ⇒ Object
Replace @org/team mentions in text with links to the mentioned team’s page.
- #team_pattern ⇒ Object
Methods inherited from Filter
#base_url, call, #current_user, #doc, #has_ancestor?, #html, #initialize, #needs, #parse_html, #repository, to_document, to_html, #validate
Constructor Details
This class inherits a constructor from HTML::Pipeline::Filter
Class Method Details
.mentioned_teams_in(text, team_pattern = TeamPattern) ⇒ Object
Public: Find @org/team mentions in text. See TeamMentionFilter#team_mention_link_filter.
TeamMentionFilter.mentioned_teams_in(text) do |match, org, team|
"<a href=...>#{team}</a>"
end
text - String text to search.
Yields the String match, org name, and team name. The yield’s return replaces the match in the original text.
Returns a String replaced with the return of the block.
30 31 32 33 34 35 36 |
# File 'lib/html/pipeline/@team_mention_filter.rb', line 30 def self.mentioned_teams_in(text, team_pattern = TeamPattern) text.gsub team_pattern do |match| org = $1 team = $2 yield match, org, team end end |
Instance Method Details
#call ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/html/pipeline/@team_mention_filter.rb', line 52 def call result[:mentioned_teams] ||= [] doc.search('.//text()').each do |node| content = node.to_html next unless content.include?('@') next if has_ancestor?(node, IGNORE_PARENTS) html = mention_link_filter(content, base_url, team_pattern) next if html == content node.replace(html) end doc end |
#link_to_mentioned_team(org, team) ⇒ Object
87 88 89 90 91 92 93 94 95 96 |
# File 'lib/html/pipeline/@team_mention_filter.rb', line 87 def link_to_mentioned_team(org, team) result[:mentioned_teams] |= [team] url = base_url.dup url << '/' unless url =~ /[\/~]\z/ "<a href='#{url << org}/#{team}' class='team-mention'>" \ "@#{org}/#{team}" \ '</a>' end |
#mention_link_filter(text, _base_url = '/', team_pattern = TeamPattern) ⇒ Object
Replace @org/team mentions in text with links to the mentioned team’s page.
text - String text to replace @mention team names in. base_url - The base URL used to construct team page URLs. team_pattern - Regular expression used to identify teams in text
Returns a string with @team mentions replaced with links. All links have a ‘team-mention’ class name attached for styling.
79 80 81 82 83 84 85 |
# File 'lib/html/pipeline/@team_mention_filter.rb', line 79 def mention_link_filter(text, _base_url = '/', team_pattern = TeamPattern) self.class.mentioned_teams_in(text, team_pattern) do |match, org, team| link = link_to_mentioned_team(org, team) link ? match.sub("@#{org}/#{team}", link) : match end end |
#team_pattern ⇒ Object
66 67 68 |
# File 'lib/html/pipeline/@team_mention_filter.rb', line 66 def team_pattern context[:team_pattern] || TeamPattern end |