Class: Markawesome::AccordionTransformer

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

Overview

Transforms accordion syntax into wa-accordion / wa-accordion-item elements Primary syntax:

//////appearance? mode? icon-placement? heading:N?
/// [expanded] [disabled] [icon:name] Label text
item body markdown
///
//////
Alternative syntax: :::wa-accordion …same items… :

Container attributes (bare, order-independent, rightmost-wins):

- appearance: outlined (default), filled, filled-outlined, plain
- mode: multiple (default), single, single-collapsible
- icon-placement: start, end (default emitted only when given)
- heading:N -> heading-level="N" where N is 1-6 or "none"

Item tokens (leading flags, then the rest of the line is the label):

- expanded -> expanded; disabled -> disabled
- icon:name -> <wa-icon slot="icon" name="name"></wa-icon> as first child

wa-accordion is experimental in Web Awesome (added 3.7). expanded/disabled and the mode/appearance/icon-placement attributes are all static-safe.

Constant Summary collapse

CONTAINER_ATTRIBUTES =
{
  appearance: %w[outlined filled filled-outlined plain],
  mode: %w[multiple single single-collapsible],
  icon_placement: %w[start end]
}.freeze
ICON_SLOTS =
{
  default: 'icon',
  slots: %w[icon],
  slot_map: { 'icon' => 'icon' }
}.freeze
ITEM_FLAGS =
%w[expanded disabled].freeze
PRIMARY_REGEX =
%r{^/{6}([^\n]*)\n((?:/{3} [^\n]+\n.*?\n/{3}\n?)+)/{6}}m
ALTERNATIVE_REGEX =
%r{^:::wa-accordion\s*([^\n]*)\n((?:/{3} [^\n]+\n.*?\n/{3}\n?)+):::}m
ITEM_REGEX =
%r{^/{3} ([^\n]+)\n(.*?)\n/{3}}m

Class Method Summary collapse

Class Method Details

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



64
65
66
67
68
69
70
71
72
73
74
# File 'lib/markawesome/transformers/accordion_transformer.rb', line 64

def self.render_as_markdown(content, _options = {})
  transform_proc = proc do |_params_string, items_block, _third|
    items_block.scan(ITEM_REGEX).map do |header, body|
      _flags, label = parse_item_flags_and_label(IconSlotParser.parse(header, ICON_SLOTS)[:remaining])
      "### #{label}\n\n#{body.strip}"
    end.join("\n\n")
  end

  patterns = dual_syntax_patterns(PRIMARY_REGEX, ALTERNATIVE_REGEX, transform_proc)
  apply_multiple_patterns(content, patterns)
end

.transform(content) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/markawesome/transformers/accordion_transformer.rb', line 47

def self.transform(content)
  transform_proc = proc do |params_string, items_block, _third|
    attributes = AttributeParser.parse(params_string.to_s.strip, CONTAINER_ATTRIBUTES)
    heading_level = extract_heading_level(params_string)

    attr_parts = ["appearance=\"#{normalize_appearance(attributes[:appearance])}\""]
    attr_parts << "mode=\"#{attributes[:mode]}\"" if attributes[:mode]
    attr_parts << "icon-placement=\"#{attributes[:icon_placement]}\"" if attributes[:icon_placement]
    attr_parts << "heading-level=\"#{heading_level}\"" if heading_level

    "<wa-accordion #{attr_parts.join(' ')}>#{build_items(items_block)}</wa-accordion>"
  end

  patterns = dual_syntax_patterns(PRIMARY_REGEX, ALTERNATIVE_REGEX, transform_proc)
  apply_multiple_patterns(content, patterns)
end