Class: Slk::Formatters::ProfileFieldRenderer
- Inherits:
-
Object
- Object
- Slk::Formatters::ProfileFieldRenderer
- Defined in:
- lib/slk/formatters/profile_field_renderer.rb
Overview
Renders ProfileField values to display strings (date with relative phrasing, link with alt text, type:user dereferenced via resolved_users).
Instance Method Summary collapse
- #extract_text_from_block(block) ⇒ Object
- #flatten_rich_text(blocks) ⇒ Object
-
#format_text(value) ⇒ Object
Slack stores some text fields (notably free-text profile blocks) as rich_text JSON blocks.
-
#initialize(output:) ⇒ ProfileFieldRenderer
constructor
A new instance of ProfileFieldRenderer.
- #render(field, profile) ⇒ Object
- #render_user_reference(user_id, profile) ⇒ Object
Constructor Details
#initialize(output:) ⇒ ProfileFieldRenderer
Returns a new instance of ProfileFieldRenderer.
8 9 10 11 |
# File 'lib/slk/formatters/profile_field_renderer.rb', line 8 def initialize(output:) @output = output @hyperlinks = output.respond_to?(:color?) && output.color? end |
Instance Method Details
#extract_text_from_block(block) ⇒ Object
37 38 39 40 41 42 43 44 |
# File 'lib/slk/formatters/profile_field_renderer.rb', line 37 def extract_text_from_block(block) return [block.to_s] unless block.is_a?(Hash) return [block['text'].to_s] if block['type'] == 'text' return [block['name'] ? ":#{block['name']}:" : ''] if block['type'] == 'emoji' Array(block['elements']).flat_map { |el| extract_text_from_block(el) } end |
#flatten_rich_text(blocks) ⇒ Object
33 34 35 |
# File 'lib/slk/formatters/profile_field_renderer.rb', line 33 def flatten_rich_text(blocks) Array(blocks).flat_map { |block| extract_text_from_block(block) }.join end |
#format_text(value) ⇒ Object
Slack stores some text fields (notably free-text profile blocks) as rich_text JSON blocks. Detect and flatten to plain text.
24 25 26 27 28 29 30 31 |
# File 'lib/slk/formatters/profile_field_renderer.rb', line 24 def format_text(value) text = value.to_s return text unless text.start_with?('[{') && text.include?('rich_text') flatten_rich_text(JSON.parse(text)) rescue JSON::ParserError text end |
#render(field, profile) ⇒ Object
13 14 15 16 17 18 19 20 |
# File 'lib/slk/formatters/profile_field_renderer.rb', line 13 def render(field, profile) case field.type when 'date' then format_date(field.value) when 'link' then format_link(field) when 'user' then format_user_list(field, profile) else format_text(field.value) end end |
#render_user_reference(user_id, profile) ⇒ Object
46 47 48 49 50 51 52 53 |
# File 'lib/slk/formatters/profile_field_renderer.rb', line 46 def render_user_reference(user_id, profile) ref = profile.resolved_users[user_id] return user_id unless ref suffix = ref.title.to_s.empty? ? '' : " — #{ref.title}" pronouns = ref.pronouns.to_s.empty? ? '' : " #{@output.gray("(#{ref.pronouns})")}" "#{ref.best_name}#{pronouns}#{suffix}" end |