jekyll-webawesome 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 130ee0316a424171a091be2d9cc4c4a3a0e37405b688c23cfb2f799859734e8d
4
- data.tar.gz: c761f81f2bd93d34662b5eb3a87cfa9e7371f34de78de443a4f2ce7d6384ea04
3
+ metadata.gz: 7b6eb4f391cab1dfe15ec2aa266b96d8ae24deb895e7adf31ea9803c82deffaa
4
+ data.tar.gz: cb090de2e14286bca9be4ccbd353f87243ecfb73d13ff48b2a04407ba788a111
5
5
  SHA512:
6
- metadata.gz: 277c861af2b243caf830ee5842cf1c6b7e639d59b3bcd6e4812306b60bc9b6041e72ef707b3bfbcecb59448659ed65aaf862857e60117e3a80b1eff5eae10863
7
- data.tar.gz: 4502a2de5e762d09499396ee85dcd811cc6d92fbbb0b0c2ae464008fa19d23f3ca02a21b3e091b7ce75a37b3c414f746ee807c91335f55d975d6bc1990076193
6
+ metadata.gz: '09e56263d9312ce554e7d7c8af43b414c6dfe0b87d300c2f90381dead47350eb4b2e4eabcdfc4f467fbfa63cdca3ee4b06628a2d6fe4695b359c11e4e8e49082'
7
+ data.tar.gz: 58f86a89531e199421d85f6af6b93c8594997c357f0256716a89ed259be39a2a8a6f30a428f5f2a3b91ba50af9dd74f19789d10a0ab1ee469f6ceff23ef13ce6
data/CHANGELOG.md CHANGED
@@ -8,6 +8,43 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
8
8
 
9
9
  - Placeholder
10
10
 
11
+ ## [0.7.0] - 2025-10-27
12
+
13
+ ### Changed
14
+
15
+ - **BREAKING CHANGE**: Extracted all transformation logic into separate `markawesome` gem
16
+ - Jekyll WebAwesome now depends on `markawesome ~> 0.1` for transformation logic
17
+ - Configuration is now synced from Jekyll to Markawesome automatically
18
+ - Hook registration wrapped in conditional checks to prevent test environment errors
19
+
20
+ ### Removed
21
+
22
+ - All transformer classes moved to `markawesome` gem
23
+ - Individual transformer spec files (now in `markawesome` gem)
24
+
25
+ ### Added
26
+
27
+ - Configuration sync method to pass Jekyll config to Markawesome
28
+ - Conditional `if defined?(Jekyll::Hooks)` guards around hook registrations
29
+ - Support for passing `image_dialog` options to Markawesome transformer
30
+
31
+ ### Technical Details
32
+
33
+ This release extracts the Markdown-to-Web Awesome transformation engine into a framework-agnostic gem called `markawesome`. The `jekyll-webawesome` gem now focuses solely on Jekyll integration (hooks, plugin registration, code block handling), while `markawesome` handles all component transformations.
34
+
35
+ Benefits:
36
+
37
+ - Transformation logic can now be used with other static site generators (Hugo, Middleman, etc.)
38
+ - Better separation of concerns
39
+ - Easier testing and maintenance
40
+ - No breaking changes for end users (syntax remains the same)
41
+
42
+ Migration:
43
+
44
+ - Update your Gemfile: `gem 'jekyll-webawesome', '~> 0.5.0'`
45
+ - Run `bundle update jekyll-webawesome`
46
+ - No configuration changes needed - everything works the same
47
+
11
48
  ## [0.6.0] - 2025-10-23
12
49
 
13
50
  - Support inline wa-tag components
data/README.md CHANGED
@@ -24,21 +24,6 @@ This plugin focuses on the most commonly used Web Awesome components for Jekyll
24
24
  | **Tab Group** | `++++++` | `:::wa-tabs` | `<wa-tab-group><wa-tab>content</wa-tab></wa-tab-group>` |
25
25
  | **Tag** | `@@@brand` | `:::wa-tag brand` | `<wa-tag variant="brand">content</wa-tag>` |
26
26
 
27
- ### Planned
28
-
29
- These content-focused components will get dedicated syntax in future releases:
30
-
31
- | Component | Primary Syntax | Alternative syntax | HTML Output |
32
- |-----------|----------------------|-------------------|-------------|
33
- | **Icon** | `$$$icon-name` | `:::wa-icon name` | `<wa-icon name="icon-name"></wa-icon>` |
34
- | **Progress Bar** | `&&&value` | `:::wa-progress-bar value` | `<wa-progress-bar value="50"></wa-progress-bar>` |
35
- | **Rating** | `???value` | `:::wa-rating value` | `<wa-rating value="4"></wa-rating>` |
36
- | **Avatar** | (none) | `:::wa-avatar` | `<wa-avatar>` |
37
- | **QR Code** | (none) | `:::wa-qr-code` | `<wa-qr-code>` |
38
- | **Skeleton** | (none) | `:::wa-skeleton` | `<wa-skeleton>` |
39
- | **Spinner** | (none) | `:::wa-spinner` | `<wa-spinner>` |
40
- | **Tooltip** | (none) | `:::wa-tooltip` | `<wa-tooltip>` |
41
-
42
27
  Not all components will make sense to include here, to be included in the "prose" content of a web page. Some components are more suitable to be used in layouts or used in the page as includes, too complicated for this purpose.
43
28
 
44
29
  Both syntax styles work identically and can be mixed within the same document.
@@ -33,7 +33,7 @@ Gem::Specification.new do |spec|
33
33
  spec.require_paths = ['lib']
34
34
 
35
35
  spec.add_dependency 'jekyll', '>= 3.7', '< 5.0'
36
- spec.add_dependency 'kramdown', '~> 2.0'
36
+ spec.add_dependency 'markawesome', '~> 0.1'
37
37
 
38
38
  spec.add_development_dependency 'bundler', '~> 2.0'
39
39
  spec.add_development_dependency 'rake', '~> 13.0'
@@ -96,61 +96,64 @@ module Jekyll
96
96
  end
97
97
 
98
98
  # Register hooks directly in the transformer module
99
- # Clear protected blocks at start of build
100
- Jekyll::Hooks.register :site, :pre_render do |_site|
101
- CodeBlockTransformer.clear_protected_blocks
102
- end
99
+ # Wrapped in conditional to prevent errors when Jekyll::Hooks is not fully loaded
100
+ if defined?(Jekyll::Hooks)
101
+ # Clear protected blocks at start of build
102
+ Jekyll::Hooks.register :site, :pre_render do |_site|
103
+ CodeBlockTransformer.clear_protected_blocks
104
+ end
103
105
 
104
- # STEP 1: Protect all code blocks BEFORE any transformations (highest priority)
105
- Jekyll::Hooks.register :documents, :pre_render, priority: 50 do |document|
106
- next unless document.relative_path =~ /.*\.md$/i
107
- next unless CodeBlockTransformer.transform_documents_enabled?(document.site)
106
+ # STEP 1: Protect all code blocks BEFORE any transformations (highest priority)
107
+ Jekyll::Hooks.register :documents, :pre_render, priority: 50 do |document|
108
+ next unless document.relative_path =~ /.*\.md$/i
109
+ next unless CodeBlockTransformer.transform_documents_enabled?(document.site)
108
110
 
109
- puts "Jekyll::WebAwesome::CodeBlockTransformer protecting code blocks in document: #{document.relative_path}\n"
110
- document.content = CodeBlockTransformer.protect_all_code_blocks(document.content)
111
- end
111
+ puts "Jekyll::WebAwesome::CodeBlockTransformer protecting code blocks in document: #{document.relative_path}\n"
112
+ document.content = CodeBlockTransformer.protect_all_code_blocks(document.content)
113
+ end
112
114
 
113
- Jekyll::Hooks.register :pages, :pre_render, priority: 50 do |page|
114
- next unless page.relative_path =~ /.*\.md$/i
115
- next unless CodeBlockTransformer.transform_pages_enabled?(page.site)
115
+ Jekyll::Hooks.register :pages, :pre_render, priority: 50 do |page|
116
+ next unless page.relative_path =~ /.*\.md$/i
117
+ next unless CodeBlockTransformer.transform_pages_enabled?(page.site)
116
118
 
117
- puts "Jekyll::WebAwesome::CodeBlockTransformer protecting code blocks in page: #{page.relative_path}\n"
118
- page.content = CodeBlockTransformer.protect_all_code_blocks(page.content)
119
- end
119
+ puts "Jekyll::WebAwesome::CodeBlockTransformer protecting code blocks in page: #{page.relative_path}\n"
120
+ page.content = CodeBlockTransformer.protect_all_code_blocks(page.content)
121
+ end
120
122
 
121
- # STEP 2: Transform protected code blocks to Jekyll highlight syntax
122
- # This happens AFTER WebAwesome transformers (priority 20) but BEFORE restoration
123
- Jekyll::Hooks.register :documents, :pre_render, priority: 15 do |document|
124
- next unless document.relative_path =~ /.*\.md$/i
125
- next unless CodeBlockTransformer.transform_documents_enabled?(document.site)
123
+ # STEP 2: Transform protected code blocks to Jekyll highlight syntax
124
+ # This happens AFTER WebAwesome transformers (priority 20) but BEFORE restoration
125
+ Jekyll::Hooks.register :documents, :pre_render, priority: 15 do |document|
126
+ next unless document.relative_path =~ /.*\.md$/i
127
+ next unless CodeBlockTransformer.transform_documents_enabled?(document.site)
126
128
 
127
- puts "Jekyll::WebAwesome::CodeBlockTransformer transforming code blocks in document: #{document.relative_path}\n"
128
- document.content = CodeBlockTransformer.transform_code_blocks(document.content)
129
- end
129
+ puts "Jekyll::WebAwesome::CodeBlockTransformer transforming code blocks in document: #{document.relative_path}\n"
130
+ document.content = CodeBlockTransformer.transform_code_blocks(document.content)
131
+ end
130
132
 
131
- Jekyll::Hooks.register :pages, :pre_render, priority: 15 do |page|
132
- next unless page.relative_path =~ /.*\.md$/i
133
- next unless CodeBlockTransformer.transform_pages_enabled?(page.site)
133
+ Jekyll::Hooks.register :pages, :pre_render, priority: 15 do |page|
134
+ next unless page.relative_path =~ /.*\.md$/i
135
+ next unless CodeBlockTransformer.transform_pages_enabled?(page.site)
134
136
 
135
- puts "Jekyll::WebAwesome::CodeBlockTransformer transforming code blocks in page: #{page.relative_path}\n"
136
- page.content = CodeBlockTransformer.transform_code_blocks(page.content)
137
- end
137
+ puts "Jekyll::WebAwesome::CodeBlockTransformer transforming code blocks in page: #{page.relative_path}\n"
138
+ page.content = CodeBlockTransformer.transform_code_blocks(page.content)
139
+ end
138
140
 
139
- # STEP 3: Restore protected blocks after transformation (lowest priority)
140
- Jekyll::Hooks.register :documents, :pre_render, priority: 10 do |document|
141
- next unless document.relative_path =~ /.*\.md$/i
142
- next unless CodeBlockTransformer.transform_documents_enabled?(document.site)
141
+ # STEP 3: Restore protected blocks after transformation (lowest priority)
142
+ Jekyll::Hooks.register :documents, :pre_render, priority: 10 do |document|
143
+ next unless document.relative_path =~ /.*\.md$/i
144
+ next unless CodeBlockTransformer.transform_documents_enabled?(document.site)
143
145
 
144
- puts "Jekyll::WebAwesome::CodeBlockTransformer restoring code blocks in document: #{document.relative_path}\n"
145
- document.content = CodeBlockTransformer.restore_protected_blocks(document.content)
146
- end
146
+ puts "Jekyll::WebAwesome::CodeBlockTransformer restoring code blocks in document: #{document.relative_path}\n"
147
+ document.content = CodeBlockTransformer.restore_protected_blocks(document.content)
148
+ end
147
149
 
148
- Jekyll::Hooks.register :pages, :pre_render, priority: 10 do |page|
149
- next unless page.relative_path =~ /.*\.md$/i
150
- next unless CodeBlockTransformer.transform_pages_enabled?(page.site)
150
+ Jekyll::Hooks.register :pages, :pre_render, priority: 10 do |page|
151
+ next unless page.relative_path =~ /.*\.md$/i
152
+ next unless CodeBlockTransformer.transform_pages_enabled?(page.site)
151
153
 
152
- puts "Jekyll::WebAwesome::CodeBlockTransformer restoring code blocks in page: #{page.relative_path}\n"
153
- page.content = CodeBlockTransformer.restore_protected_blocks(page.content)
154
+ puts "Jekyll::WebAwesome::CodeBlockTransformer restoring code blocks in page: #{page.relative_path}\n"
155
+ page.content = CodeBlockTransformer.restore_protected_blocks(page.content)
156
+ end
154
157
  end
155
158
  end
156
159
  end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'transformer'
4
3
  require_relative 'code_block_transformer'
5
4
 
6
5
  module Jekyll
@@ -84,21 +83,58 @@ module Jekyll
84
83
  filepath.to_s.match?(/\.md$/i)
85
84
  end
86
85
 
87
- # Register hooks for pre-render processing (before markdown conversion)
88
- Jekyll::Hooks.register :documents, :pre_render do |document|
89
- next unless markdown_file?(document.relative_path)
90
- next unless transform_documents_enabled?(document.site)
91
-
92
- puts "Jekyll::WebAwesome Processing document (pre-render): #{document.relative_path}\n" if debug_enabled?(document.site)
93
- document.content = Transformer.process(document.content, document.site)
86
+ # Sync Jekyll configuration to Markawesome before processing
87
+ def self.sync_configuration(site)
88
+ # Sync callout icons from site config if present
89
+ if site.config.dig('webawesome', 'callout_icons')
90
+ Markawesome.configure do |config|
91
+ config.callout_icons = site.config.dig('webawesome', 'callout_icons').transform_keys(&:to_sym)
92
+ end
93
+ elsif Jekyll::WebAwesome.configuration&.callout_icons
94
+ Markawesome.configure do |config|
95
+ config.callout_icons = Jekyll::WebAwesome.configuration.callout_icons
96
+ end
97
+ end
94
98
  end
95
99
 
96
- Jekyll::Hooks.register :pages, :pre_render do |page|
97
- next unless markdown_file?(page.relative_path)
98
- next unless transform_pages_enabled?(page.site)
100
+ # Register hooks for pre-render processing (before markdown conversion)
101
+ # Wrapped in conditional to prevent errors when Jekyll::Hooks is not fully loaded
102
+ if defined?(Jekyll::Hooks)
103
+ Jekyll::Hooks.register :documents, :pre_render do |document|
104
+ next unless markdown_file?(document.relative_path)
105
+ next unless transform_documents_enabled?(document.site)
106
+
107
+ # Sync configuration from Jekyll to Markawesome
108
+ sync_configuration(document.site)
109
+
110
+ puts "Jekyll::WebAwesome Processing document (pre-render): #{document.relative_path}\n" if debug_enabled?(document.site)
111
+
112
+ # Build options for Markawesome
113
+ options = {}
114
+ if image_dialog_enabled?(document.site)
115
+ options[:image_dialog] = image_dialog_config(document.site)
116
+ end
117
+
118
+ document.content = Markawesome::Transformer.process(document.content, options)
119
+ end
99
120
 
100
- puts "Jekyll::WebAwesome Processing page (pre-render): #{page.relative_path}\n" if debug_enabled?(page.site)
101
- page.content = Transformer.process(page.content, page.site)
121
+ Jekyll::Hooks.register :pages, :pre_render do |page|
122
+ next unless markdown_file?(page.relative_path)
123
+ next unless transform_pages_enabled?(page.site)
124
+
125
+ # Sync configuration from Jekyll to Markawesome
126
+ sync_configuration(page.site)
127
+
128
+ puts "Jekyll::WebAwesome Processing page (pre-render): #{page.relative_path}\n" if debug_enabled?(page.site)
129
+
130
+ # Build options for Markawesome
131
+ options = {}
132
+ if image_dialog_enabled?(page.site)
133
+ options[:image_dialog] = image_dialog_config(page.site)
134
+ end
135
+
136
+ page.content = Markawesome::Transformer.process(page.content, options)
137
+ end
102
138
  end
103
139
  end
104
140
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module WebAwesome
5
- VERSION = '0.6.1'
5
+ VERSION = '0.7.0'
6
6
  end
7
7
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'markawesome'
3
4
  require_relative 'webawesome/version'
4
- require_relative 'webawesome/transformer'
5
5
  require_relative 'webawesome/code_block_transformer'
6
6
  require_relative 'webawesome/plugin'
7
7
 
@@ -17,8 +17,20 @@ module Jekyll
17
17
  def configure
18
18
  self.configuration ||= Configuration.new
19
19
  yield(configuration) if block_given?
20
+ # Sync configuration to Markawesome
21
+ sync_to_markawesome
20
22
  configuration
21
23
  end
24
+
25
+ # Sync Jekyll WebAwesome configuration to Markawesome
26
+ def sync_to_markawesome
27
+ return unless configuration
28
+
29
+ Markawesome.configure do |config|
30
+ config.callout_icons = configuration.callout_icons if configuration.callout_icons
31
+ config.custom_components = configuration.custom_components if configuration.custom_components
32
+ end
33
+ end
22
34
  end
23
35
 
24
36
  # Configuration class for future extensibility
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-webawesome
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janne Waren
@@ -30,19 +30,19 @@ dependencies:
30
30
  - !ruby/object:Gem::Version
31
31
  version: '5.0'
32
32
  - !ruby/object:Gem::Dependency
33
- name: kramdown
33
+ name: markawesome
34
34
  requirement: !ruby/object:Gem::Requirement
35
35
  requirements:
36
36
  - - "~>"
37
37
  - !ruby/object:Gem::Version
38
- version: '2.0'
38
+ version: '0.1'
39
39
  type: :runtime
40
40
  prerelease: false
41
41
  version_requirements: !ruby/object:Gem::Requirement
42
42
  requirements:
43
43
  - - "~>"
44
44
  - !ruby/object:Gem::Version
45
- version: '2.0'
45
+ version: '0.1'
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: bundler
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -115,22 +115,6 @@ files:
115
115
  - lib/jekyll/webawesome.rb
116
116
  - lib/jekyll/webawesome/code_block_transformer.rb
117
117
  - lib/jekyll/webawesome/plugin.rb
118
- - lib/jekyll/webawesome/transformer.rb
119
- - lib/jekyll/webawesome/transformers.rb
120
- - lib/jekyll/webawesome/transformers/badge_transformer.rb
121
- - lib/jekyll/webawesome/transformers/base_transformer.rb
122
- - lib/jekyll/webawesome/transformers/button_transformer.rb
123
- - lib/jekyll/webawesome/transformers/callout_transformer.rb
124
- - lib/jekyll/webawesome/transformers/card_transformer.rb
125
- - lib/jekyll/webawesome/transformers/carousel_transformer.rb
126
- - lib/jekyll/webawesome/transformers/comparison_transformer.rb
127
- - lib/jekyll/webawesome/transformers/copy_button_transformer.rb
128
- - lib/jekyll/webawesome/transformers/details_transformer.rb
129
- - lib/jekyll/webawesome/transformers/dialog_transformer.rb
130
- - lib/jekyll/webawesome/transformers/icon_transformer.rb
131
- - lib/jekyll/webawesome/transformers/image_dialog_transformer.rb
132
- - lib/jekyll/webawesome/transformers/tabs_transformer.rb
133
- - lib/jekyll/webawesome/transformers/tag_transformer.rb
134
118
  - lib/jekyll/webawesome/version.rb
135
119
  - lib/jekyll_webawesome.rb
136
120
  homepage: https://github.com/jannewaren/jekyll-webawesome
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'jekyll'
4
- require 'kramdown'
5
- require_relative 'transformers'
6
-
7
- module Jekyll
8
- module WebAwesome
9
- # Main transformer that orchestrates all component transformers
10
- class Transformer
11
- def self.process(content, site = nil)
12
- content = BadgeTransformer.transform(content)
13
- content = ButtonTransformer.transform(content)
14
- content = CalloutTransformer.transform(content)
15
- content = CardTransformer.transform(content)
16
- content = CarouselTransformer.transform(content)
17
- content = ComparisonTransformer.transform(content)
18
- content = CopyButtonTransformer.transform(content)
19
- content = DetailsTransformer.transform(content)
20
-
21
- # Apply image dialog transformer BEFORE dialog transformer so it can generate dialog syntax
22
- content = ImageDialogTransformer.transform(content, site) if site && Plugin.image_dialog_enabled?(site)
23
-
24
- content = DialogTransformer.transform(content)
25
- content = IconTransformer.transform(content)
26
- content = TagTransformer.transform(content)
27
- TabsTransformer.transform(content)
28
- end
29
- end
30
- end
31
- end
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base_transformer'
4
-
5
- module Jekyll
6
- module WebAwesome
7
- # Transforms badge syntax into wa-badge elements
8
- # Primary syntax: !!!variant?\ncontent\n!!!
9
- # Alternative syntax: :::wa-badge variant?\ncontent\n:::
10
- # Variants: brand, success, neutral, warning, danger
11
- class BadgeTransformer < BaseTransformer
12
- def self.transform(content)
13
- # Define both regex patterns
14
- primary_regex = /^!!!(brand|success|neutral|warning|danger)?\n(.*?)\n!!!/m
15
- alternative_regex = /^:::wa-badge\s*(brand|success|neutral|warning|danger)?\n(.*?)\n:::/m
16
-
17
- # Define shared transformation logic
18
- transform_proc = proc do |variant, badge_content|
19
- badge_content = badge_content.strip
20
-
21
- build_badge_html(badge_content, variant)
22
- end
23
-
24
- # Apply both patterns
25
- patterns = dual_syntax_patterns(primary_regex, alternative_regex, transform_proc)
26
- apply_multiple_patterns(content, patterns)
27
- end
28
-
29
- class << self
30
- private
31
-
32
- def build_badge_html(content, variant)
33
- variant_attr = variant ? " variant=\"#{variant}\"" : ''
34
- badge_html = markdown_to_html(content).strip
35
-
36
- # Remove paragraph tags if the content is just text
37
- badge_html = badge_html.gsub(%r{^<p>(.*)</p>$}m, '\1')
38
-
39
- # Fix whitespace issues in Web Awesome badges by ensuring proper spacing
40
- # Replace spaces after closing tags with non-breaking spaces to prevent CSS collapse
41
- badge_html = badge_html.gsub(%r{(</\w+>)\s+}, '\1&nbsp;')
42
-
43
- "<wa-badge#{variant_attr}>#{badge_html}</wa-badge>"
44
- end
45
- end
46
- end
47
- end
48
- end
@@ -1,65 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'English'
4
- require 'jekyll'
5
- require 'kramdown'
6
-
7
- module Jekyll
8
- module WebAwesome
9
- # Base class for all Web Awesome component transformers
10
- # Each transformer should implement the transform method
11
- class BaseTransformer
12
- def self.transform(content)
13
- raise NotImplementedError, 'Subclasses must implement the transform method'
14
- end
15
-
16
- class << self
17
- protected
18
-
19
- # Helper method to convert markdown content to HTML
20
- def markdown_to_html(content)
21
- Kramdown::Document.new(content).to_html
22
- end
23
-
24
- # Helper method to apply multiple regex patterns with the same transformation logic
25
- # @param content [String] The content to transform
26
- # @param patterns [Array<Hash>] Array of pattern hashes with :regex and :block
27
- # @return [String] The transformed content
28
- def apply_multiple_patterns(content, patterns)
29
- patterns.each do |pattern|
30
- content = content.gsub(pattern[:regex]) do |match|
31
- pattern[:block].call(match, $LAST_MATCH_INFO)
32
- end
33
- end
34
- content
35
- end
36
-
37
- # Helper method to create both primary and alternative syntax patterns
38
- # @param primary_regex [Regexp] The primary syntax regex
39
- # @param alternative_regex [Regexp] The alternative syntax regex
40
- # @param transform_proc [Proc] The proc that takes captured groups and returns HTML
41
- # @return [Array<Hash>] Array of pattern hashes
42
- def dual_syntax_patterns(primary_regex, alternative_regex, transform_proc)
43
- [
44
- {
45
- regex: primary_regex,
46
- block: proc do |_match, matchdata|
47
- # Get all captured groups from the matchdata
48
- captures = matchdata.captures
49
- transform_proc.call(*captures)
50
- end
51
- },
52
- {
53
- regex: alternative_regex,
54
- block: proc do |_match, matchdata|
55
- # Get all captured groups from the matchdata
56
- captures = matchdata.captures
57
- transform_proc.call(*captures)
58
- end
59
- }
60
- ]
61
- end
62
- end
63
- end
64
- end
65
- end
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base_transformer'
4
-
5
- module Jekyll
6
- module WebAwesome
7
- # Transforms button syntax into wa-button elements
8
- # Primary syntax: %%%variant?\ncontent\n%%%
9
- # Alternative syntax: :::wa-button variant?\ncontent\n:::
10
- # Variants: brand, success, neutral, warning, danger
11
- #
12
- # Link buttons: %%%brand\n[Text](url)\n%%%
13
- # Regular buttons: %%%brand\nText\n%%%
14
- class ButtonTransformer < BaseTransformer
15
- def self.transform(content)
16
- # Define both regex patterns
17
- primary_regex = /^%%%(brand|success|neutral|warning|danger)?\n(.*?)\n%%%/m
18
- alternative_regex = /^:::wa-button\s*(brand|success|neutral|warning|danger)?\n(.*?)\n:::/m
19
-
20
- # Define shared transformation logic
21
- transform_proc = proc do |variant, button_content|
22
- button_content = button_content.strip
23
-
24
- build_button_html(button_content, variant)
25
- end
26
-
27
- # Apply both patterns
28
- patterns = dual_syntax_patterns(primary_regex, alternative_regex, transform_proc)
29
- apply_multiple_patterns(content, patterns)
30
- end
31
-
32
- class << self
33
- private
34
-
35
- def build_button_html(content, variant)
36
- variant_attr = variant ? " variant=\"#{variant}\"" : ''
37
-
38
- # Check if content contains a markdown link
39
- link_match = content.match(/^\[([^\]]+)\]\(([^)]+)\)$/)
40
-
41
- if link_match
42
- # It's a link button
43
- link_text = link_match[1]
44
- link_url = link_match[2]
45
-
46
- # Process any markdown in the link text (bold, italic, etc.)
47
- button_html = markdown_to_html(link_text).strip
48
- button_html = button_html.gsub(%r{^<p>(.*)</p>$}m, '\1')
49
-
50
- # Fix whitespace issues like in badges
51
- button_html = button_html.gsub(%r{(</\w+>)\s+}, '\1&nbsp;')
52
-
53
- "<wa-button#{variant_attr} href=\"#{link_url}\">#{button_html}</wa-button>"
54
- else
55
- # It's a regular button
56
- button_html = markdown_to_html(content).strip
57
- button_html = button_html.gsub(%r{^<p>(.*)</p>$}m, '\1')
58
-
59
- # Fix whitespace issues like in badges
60
- button_html = button_html.gsub(%r{(</\w+>)\s+}, '\1&nbsp;')
61
-
62
- "<wa-button#{variant_attr}>#{button_html}</wa-button>"
63
- end
64
- end
65
- end
66
- end
67
- end
68
- end
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base_transformer'
4
-
5
- module Jekyll
6
- module WebAwesome
7
- # Transforms callout syntax into wa-callout elements
8
- # Primary syntax: :::variant\ncontent\n:::
9
- # Alternative syntax: :::wa-callout variant\ncontent\n:::
10
- # Variants: info, success, neutral, warning, danger
11
- class CalloutTransformer < BaseTransformer
12
- def self.transform(content)
13
- # Define both regex patterns
14
- primary_regex = /^:::(info|success|neutral|warning|danger)\n(.*?)\n:::/m
15
- alternative_regex = /^:::wa-callout\s+(info|success|neutral|warning|danger)\n(.*?)\n:::/m
16
-
17
- # Define shared transformation logic
18
- transform_proc = proc do |variant, inner_content|
19
- attrs = callout_attributes(variant)
20
-
21
- element_tag = "wa-callout#{attrs[:additional_params]}"
22
- html_content = "#{attrs[:inner_prepend]}#{markdown_to_html(inner_content)}"
23
-
24
- "<#{element_tag}>#{html_content}</wa-callout>"
25
- end
26
-
27
- # Apply both patterns
28
- patterns = dual_syntax_patterns(primary_regex, alternative_regex, transform_proc)
29
- apply_multiple_patterns(content, patterns)
30
- end
31
-
32
- class << self
33
- private
34
-
35
- def callout_attributes(variant)
36
- case variant
37
- when 'info'
38
- {
39
- additional_params: ' variant="brand"',
40
- inner_prepend: '<wa-icon slot="icon" name="circle-info" variant="solid"></wa-icon>'
41
- }
42
- when 'success'
43
- {
44
- additional_params: ' variant="success"',
45
- inner_prepend: '<wa-icon slot="icon" name="circle-check" variant="solid"></wa-icon>'
46
- }
47
- when 'neutral'
48
- {
49
- additional_params: ' variant="neutral"',
50
- inner_prepend: '<wa-icon slot="icon" name="gear" variant="solid"></wa-icon>'
51
- }
52
- when 'warning'
53
- {
54
- additional_params: ' variant="warning"',
55
- inner_prepend: '<wa-icon slot="icon" name="triangle-exclamation" variant="solid"></wa-icon>'
56
- }
57
- when 'danger'
58
- {
59
- additional_params: ' variant="danger"',
60
- inner_prepend: '<wa-icon slot="icon" name="circle-exclamation" variant="solid"></wa-icon>'
61
- }
62
- else
63
- {
64
- additional_params: '',
65
- inner_prepend: ''
66
- }
67
- end
68
- end
69
- end
70
- end
71
- end
72
- end