Class: Markawesome::ButtonTransformer

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

Overview

Transforms button syntax into wa-button elements Primary syntax: %%%attributes?ncontentn%%%

Alternative syntax: :::wa-button attributes?ncontentn:

Attributes:

  • variant: brand, success, neutral, warning, danger

  • appearance: accent, filled, outlined, filled-outlined, plain

  • size: small, medium, large

  • pill: pill (rounded edges)

  • caret: caret (dropdown indicator)

  • loading: loading (loading state)

  • disabled: disabled (disabled state)

Link buttons: %%%brandn(url)n%%% Regular buttons: %%%brand large pillnTextn%%%

Constant Summary collapse

BUTTON_ATTRIBUTES =

Define the schema for button attributes

{
  variant: %w[brand success neutral warning danger],
  appearance: %w[accent filled outlined filled-outlined plain],
  size: %w[small medium large],
  pill: %w[pill],
  caret: %w[caret],
  loading: %w[loading],
  disabled: %w[disabled]
}.freeze
ICON_SLOTS =
{ default: 'start', slots: %w[start end] }.freeze

Class Method Summary collapse

Class Method Details

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



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/markawesome/transformers/button_transformer.rb', line 58

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

  transform_proc = proc do |_params_string, button_content|
    text = button_content.to_s.strip
    if (link_match = text.match(/^\[([^\]]+)\]\(([^)]+)\)$/))
      "[#{link_match[1]}](#{link_match[2]})"
    else
      text.empty? ? '' : "**#{text}**"
    end
  end

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

.transform(content) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/markawesome/transformers/button_transformer.rb', line 37

def self.transform(content)
  # Define both regex patterns - capture all space-separated parameters
  primary_regex = /^%%%([^\n]*)\n(.*?)\n%%%/m
  alternative_regex = /^:::wa-button\s*([^\n]*)\n(.*?)\n:::/m

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

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

    build_button_html(button_content, attributes, icon_result[:icons])
  end

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