Class: Markawesome::DetailsTransformer

Inherits:
BaseTransformer show all
Defined in:
lib/markawesome/transformers/details_transformer.rb

Overview

Transforms summary/details syntax into wa-details elements Primary syntax: ^^^appearance? icon-placement? disabled? open? name:value?nsummaryn>>>ndetailsn^^^

Alternative syntax: :::wa-details appearance? icon-placement? disabled? open? name:value?nsummaryn>>>ndetailsn:

Appearances: outlined (default), filled, filled-outlined, plain Icon placement: start, end (default) Boolean flags: disabled, open Name: name:group-id for accordion behavior

Constant Summary collapse

COMPONENT_ATTRIBUTES =
{
  appearance: %w[outlined filled filled-outlined plain],
  icon_placement: %w[start end],
  disabled: %w[disabled],
  open: %w[open]
}.freeze
ICON_SLOTS =
{
  default: nil,
  slots: %w[expand collapse],
  slot_map: { 'expand' => 'expand-icon', 'collapse' => 'collapse-icon' }
}.freeze

Class Method Summary collapse

Class Method Details

.render_as_markdown(content, _options = {}) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/markawesome/transformers/details_transformer.rb', line 69

def self.render_as_markdown(content, _options = {})
  primary_regex = /^\^\^\^?(.*?)\n(.*?)\n^>>>\n(.*?)\n^\^\^\^?/m
  alternative_regex = /^:::wa-details\s*(.*?)\n(.*?)\n^>>>\n(.*?)\n:::/m

  transform_proc = proc do |_params_string, summary_content, details_content|
    summary = summary_content.to_s.strip
    details = details_content.to_s.strip
    "<details>\n<summary>#{summary}</summary>\n\n#{details}\n</details>"
  end

  patterns = dual_syntax_patterns(primary_regex, alternative_regex, transform_proc)
  apply_multiple_patterns(content, patterns)
end

.transform(content) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/markawesome/transformers/details_transformer.rb', line 29

def self.transform(content)
  # Define both regex patterns - capture parameter string
  primary_regex = /^\^\^\^?(.*?)\n(.*?)\n^>>>\n(.*?)\n^\^\^\^?/m
  alternative_regex = /^:::wa-details\s*(.*?)\n(.*?)\n^>>>\n(.*?)\n:::/m

  # Define shared transformation logic
  transform_proc = proc do |params_string, summary_content, details_content|
    summary_content = summary_content.strip
    details_content = details_content.strip

    # Parse icon tokens first, then pass remaining to AttributeParser and name extraction
    icon_result = IconSlotParser.parse(params_string, ICON_SLOTS)
    attributes = AttributeParser.parse(icon_result[:remaining], COMPONENT_ATTRIBUTES)

    # Extract name parameter (format: name:value) - special handling
    name_value = extract_name_value(icon_result[:remaining])

    appearance_class = normalize_appearance(attributes[:appearance])
    icon_placement = attributes[:icon_placement] || 'end'
    summary_html = markdown_to_html(summary_content)
    details_html = markdown_to_html(details_content)

    # Build attributes
    attr_parts = ["appearance='#{appearance_class}'", "icon-placement='#{icon_placement}'"]
    attr_parts << 'disabled' if attributes[:disabled]
    attr_parts << 'open' if attributes[:open]
    attr_parts << "name='#{name_value}'" if name_value

    icon_html = IconSlotParser.to_html(icon_result[:icons], ICON_SLOTS[:slot_map])

    "<wa-details #{attr_parts.join(' ')}>" \
      "<span slot='summary'>#{summary_html}</span>" \
      "#{icon_html}#{details_html}</wa-details>"
  end

  # Apply both patterns
  patterns = dual_syntax_patterns(primary_regex, alternative_regex, transform_proc)
  apply_multiple_patterns(content, patterns)
end