Class: Markawesome::IconTransformer
- Inherits:
-
BaseTransformer
- Object
- BaseTransformer
- Markawesome::IconTransformer
- Defined in:
- lib/markawesome/transformers/icon_transformer.rb
Overview
Transforms icon syntax into wa-icon elements Primary syntax: $$$icon-name (name only, decorative)
- Alternative syntax: :::wa-icon icon-name [family] [variant] [animation]nn:
-
Examples: $$$settings -> <wa-icon name=“settings”></wa-icon> $$$home -> <wa-icon name=“home”></wa-icon> $$$user-circle -> <wa-icon name=“user-circle”></wa-icon>
- :::wa-icon star spinn:
-
-> <wa-icon name=“star” animation=“spin”></wa-icon>
- :::wa-icon heart solidnFavoriten:
-
->
<wa-icon name="heart" variant="solid" label="Favorite"></wa-icon>
Constant Summary collapse
- ALTERNATIVE_REGEX =
First-line params + optional multi-line body. The closer is anchored to a line start; the opener is intentionally not anchored so it still matches mid-prose.
/:::wa-icon[ \t]+([^\n]*?)[ \t]*\n(.*?)^:::/m
Class Method Summary collapse
Class Method Details
.render_as_markdown(content, _options = {}) ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/markawesome/transformers/icon_transformer.rb', line 52 def self.render_as_markdown(content, = {}) protected_content, code_blocks = protect_code_blocks(content) # Drop primary-syntax icons entirely. result = protected_content.gsub(/\$\$\$([a-zA-Z0-9\-_]+)(?![a-zA-Z0-9\-_]|\s+name\b)/, '') # A labeled block degrades to its label text (collapsed, not HTML-escaped — it # re-enters a markdown stream); an unlabeled block degrades to ''. result = result.gsub(ALTERNATIVE_REGEX) do ::Regexp.last_match(2).to_s.strip.gsub(/\s+/, ' ') end restore_code_blocks(result, code_blocks) end |
.transform(content) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/markawesome/transformers/icon_transformer.rb', line 23 def self.transform(content) # Protect code blocks first protected_content, code_blocks = protect_code_blocks(content) # Apply primary syntax transformation # Only block patterns that look like incomplete icon names: # $$$icon name (where 'icon name' could be intended as one identifier) result = protected_content.gsub(/\$\$\$([a-zA-Z0-9\-_]+)(?![a-zA-Z0-9\-_]|\s+name\b)/) do icon_name = ::Regexp.last_match(1) build_icon_html(icon_name) end # Apply alternative syntax transformation result = result.gsub(ALTERNATIVE_REGEX) do first_line = ::Regexp.last_match(1) raw_body = ::Regexp.last_match(2) tokens = first_line.strip.split(/\s+/) icon_name = tokens.shift # first token is always the name attributes = AttributeParser.parse(tokens.join(' '), IconAttributes::SCHEMA) label = normalize_label(raw_body) build_icon_html(icon_name, attributes, label) end # Restore code blocks restore_code_blocks(result, code_blocks) end |