liquidice 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a391144863c9ca02f6d171de7480c298f530bba3373b926d7ef73e1c083d0eaa
4
+ data.tar.gz: b9fa907d2a02fb8e8813aef8188bddf18822eca3d48d88c72770ede08d3f0789
5
+ SHA512:
6
+ metadata.gz: 6990461ad59956cadd62c96de954d745b0ac29a6eb1d3ccb1608e08bf83880c514ca4110dcd93e3c2be14303bd02ee1b4da8823344f8b41f95917ca6ef112a43
7
+ data.tar.gz: deef2278f2598f919f093d2cd4222101c551782ea56d558fb83cdefed2ebd68cf3c5a0b27ebcc93ec82e7df9f499941f1b03178cf5d403b7bb544f6ef0aefc44
@@ -0,0 +1,5 @@
1
+ module Liquidice
2
+ module Errors
3
+ class InvalidWysiwygTemplate < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,99 @@
1
+ # Liquidice grammar
2
+
3
+ grammar LiquidiceGrammar
4
+ rule liquid_template
5
+ (liquid_tag / liquid_text)*
6
+ end
7
+
8
+ rule liquid_tag
9
+ liquid_open_delimeter content_with_tags liquid_close_delimeter
10
+ end
11
+
12
+ rule liquid_open_delimeter
13
+ liquid_open_delimeter_start any_tag* (liquid_open_delimeter_start / "%")
14
+ end
15
+
16
+ rule liquid_close_delimeter
17
+ (liquid_close_delimeter_end / "%") any_tag* liquid_close_delimeter_end
18
+ end
19
+
20
+ rule liquid_open_delimeter_start
21
+ "{"
22
+ end
23
+
24
+ rule liquid_close_delimeter_end
25
+ "}"
26
+ end
27
+
28
+ rule content_with_tags
29
+ (any_tag / text_content)*
30
+ end
31
+
32
+ rule text_content
33
+ (alphabets / digits / dash / ws)*
34
+ end
35
+
36
+ rule any_tag
37
+ (tag_open / tag_empty / tag_close)
38
+ end
39
+
40
+ rule tag_open
41
+ "<" tag_name ws* attr_list? ws* ">"
42
+ end
43
+
44
+ rule tag_empty
45
+ "<" tag_name ws* attr_list? ws* "/>"
46
+ end
47
+
48
+ rule tag_close
49
+ "</" tag_name ws* ">"
50
+ end
51
+
52
+ rule attr_list
53
+ (ws+ attr)*
54
+ end
55
+
56
+ rule attr
57
+ attr_empty / attr_unquoted / attr_single_quoted / attr_double_quoted
58
+ end
59
+
60
+ rule attr_empty
61
+ attr_name
62
+ end
63
+
64
+ rule attr_unquoted
65
+ attr_name ws* "=" ws* attr_unquoted_value
66
+ end
67
+
68
+ rule attr_single_quoted
69
+ attr_name ws* "=" ws* "'" attr_single_quoted_value "'"
70
+ end
71
+
72
+ rule attr_double_quoted
73
+ attr_name ws* "=" ws* "\"" attr_double_quoted_value "\""
74
+ end
75
+
76
+ rule tag_name
77
+ (alphabets / digits / dash)+
78
+ end
79
+
80
+ rule attr_name
81
+
82
+ rule attr_unquoted_value
83
+
84
+ rule attr_single_quoted_value
85
+
86
+ rule attr_double_quoted_value
87
+
88
+ rule alphabets
89
+
90
+ rule digits
91
+
92
+ rule ws
93
+ /\s/
94
+ end
95
+
96
+ rule dash
97
+ "-"
98
+ end
99
+ end
@@ -0,0 +1,33 @@
1
+ require 'treetop'
2
+
3
+ module Liquidice
4
+ class Parser
5
+ Treetop.load(File.expand_path(File.join(File.dirname(__FILE__), 'liquidice_grammar.treetop')))
6
+
7
+ attr_accessor :strict_mode, :parser, :ast
8
+
9
+ def initialize(strict_mode: false)
10
+ @strict_mode = strict_mode
11
+ @parser = LiquidiceGrammarParser.new
12
+ end
13
+
14
+ def parse_from_wysiwyg(wysiwyg_template)
15
+ @ast = parser.parse(wysiwyg_template)
16
+
17
+ raise Liquidice::Errors::InvalidWysiwygTemplate, parser.failure_reason if @ast.nil?
18
+
19
+ @ast
20
+ end
21
+
22
+ def transform_to_liquid(ast)
23
+ # Transform the AST to a valid Liquid template
24
+ transformer = Transformer.new
25
+ transformer.apply(ast)
26
+ end
27
+
28
+ def parse_and_transform(wysiwyg_template)
29
+ ast = parse_from_wysiwyg(wysiwyg_template)
30
+ transform_to_liquid(ast)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,160 @@
1
+ module Liquidice
2
+ class Transformer < Treetop::Runtime::SyntaxNode
3
+ def apply(node)
4
+ case node
5
+ when LiquidiceGrammarParser::LiquidTemplate
6
+ transform_liquid_template(node)
7
+ when LiquidiceGrammarParser::LiquidTag
8
+ transform_liquid_tag(node)
9
+ when LiquidiceGrammarParser::LiquidOpenDelimeter
10
+ transform_liquid_open_delimeter(node)
11
+ when LiquidiceGrammarParser::LiquidCloseDelimeter
12
+ transform_liquid_close_delimeter(node)
13
+ when LiquidiceGrammarParser::ContentWithTags
14
+ transform_content_with_tags(node)
15
+ when LiquidiceGrammarParser::TextContent
16
+ transform_text_content(node)
17
+ when LiquidiceGrammarParser::AnyTag
18
+ transform_any_tag(node)
19
+ when LiquidiceGrammarParser::TagOpen
20
+ transform_tag_open(node)
21
+ when LiquidiceGrammarParser::TagEmpty
22
+ transform_tag_empty(node)
23
+ when LiquidiceGrammarParser::TagClose
24
+ transform_tag_close(node)
25
+ when LiquidiceGrammarParser::AttrList
26
+ transform_attr_list(node)
27
+ when LiquidiceGrammarParser::Attr
28
+ transform_attr(node)
29
+ when LiquidiceGrammarParser::AttrEmpty
30
+ transform_attr_empty(node)
31
+ when LiquidiceGrammarParser::AttrUnquoted
32
+ transform_attr_unquoted(node)
33
+ when LiquidiceGrammarParser::AttrSingleQuoted
34
+ transform_attr_single_quoted(node)
35
+ when LiquidiceGrammarParser::AttrDoubleQuoted
36
+ transform_attr_double_quoted(node)
37
+ when LiquidiceGrammarParser::TagName
38
+ transform_tag_name(node)
39
+ when LiquidiceGrammarParser::AttrName
40
+ transform_attr_name(node)
41
+ when LiquidiceGrammarParser::AttrUnquotedValue
42
+ transform_attr_unquoted_value(node)
43
+ when LiquidiceGrammarParser::AttrSingleQuotedValue
44
+ transform_attr_single_quoted_value(node)
45
+ when LiquidiceGrammarParser::AttrDoubleQuotedValue
46
+ transform_attr_double_quoted_value(node)
47
+ when LiquidiceGrammarParser::Alphabets
48
+ transform_alphabets(node)
49
+ when LiquidiceGrammarParser::Digits
50
+ transform_digits(node)
51
+ when LiquidiceGrammarParser::Ws
52
+ transform_ws(node)
53
+ when LiquidiceGrammarParser::Dash
54
+ transform_dash(node)
55
+ else
56
+ raise "Invalid AST node"
57
+ end
58
+ end
59
+
60
+ def transform_liquid_template(node)
61
+ node.elements.map { |element| apply(element) }.join
62
+ end
63
+
64
+ def transform_liquid_tag(node)
65
+ "{{ " + apply(node.content_with_tags) + " }}"
66
+ end
67
+
68
+ def transform_liquid_open_delimeter(node)
69
+ "{% "
70
+ end
71
+
72
+ def transform_liquid_close_delimeter(node)
73
+ " %}"
74
+ end
75
+
76
+ def transform_content_with_tags(node)
77
+ node.elements.map { |element| apply(element) }.join
78
+ end
79
+
80
+ def transform_text_content(node)
81
+ node.text_value
82
+ end
83
+
84
+ def transform_any_tag(node)
85
+ apply(node.tag_open) || apply(node.tag_empty) || apply(node.tag_close)
86
+ end
87
+
88
+ def transform_tag_open(node)
89
+ node.text_value
90
+ end
91
+
92
+ def transform_tag_empty(node)
93
+ node.text_value
94
+ end
95
+
96
+ def transform_tag_close(node)
97
+ node.text_value
98
+ end
99
+
100
+ def transform_attr_list(node)
101
+ node.elements.map { |element| apply(element) }.join
102
+ end
103
+
104
+ def transform_attr(node)
105
+ apply(node.attr_empty) || apply(node.attr_unquoted) || apply(node.attr_single_quoted) || apply(node.attr_double_quoted)
106
+ end
107
+
108
+ def transform_attr_empty(node)
109
+ node.text_value
110
+ end
111
+
112
+ def transform_attr_unquoted(node)
113
+ node.text_value
114
+ end
115
+
116
+ def transform_attr_single_quoted(node)
117
+ node.text_value
118
+ end
119
+
120
+ def transform_attr_double_quoted(node)
121
+ node.text_value
122
+ end
123
+
124
+ def transform_tag_name(node)
125
+ node.text_value
126
+ end
127
+
128
+ def transform_attr_name(node)
129
+ node.text_value
130
+ end
131
+
132
+ def transform_attr_unquoted_value(node)
133
+ node.text_value
134
+ end
135
+
136
+ def transform_attr_single_quoted_value(node)
137
+ node.text_value
138
+ end
139
+
140
+ def transform_attr_double_quoted_value(node)
141
+ node.text_value
142
+ end
143
+
144
+ def transform_alphabets(node)
145
+ node.text_value
146
+ end
147
+
148
+ def transform_digits(node)
149
+ node.text_value
150
+ end
151
+
152
+ def transform_ws(node)
153
+ node.text_value
154
+ end
155
+
156
+ def transform_dash(node)
157
+ node.text_value
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,9 @@
1
+ module Liquidice #:nodoc:
2
+ module Version #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 1
5
+ TINY = 0
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
data/lib/liquidice.rb ADDED
@@ -0,0 +1,3 @@
1
+ require "liquidice/errors"
2
+ require "liquidice/parser"
3
+ require "liquidice/transformer"
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: liquidice
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Aliaksandr Lomau
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-10-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: treetop
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '13.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '13.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ description: A gem that enables the use of Liquid templates with WYSIWYG editor output
70
+ by transforming the output to a valid Liquid template
71
+ email:
72
+ - aliaksandr.lomau@gmail.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - lib/liquidice.rb
78
+ - lib/liquidice/errors.rb
79
+ - lib/liquidice/liquidice_grammar.treetop
80
+ - lib/liquidice/parser.rb
81
+ - lib/liquidice/transformer.rb
82
+ - lib/liquidice/version.rb
83
+ homepage: https://github.com/allomov/liquidice
84
+ licenses:
85
+ - MIT
86
+ metadata: {}
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubygems_version: 3.1.6
103
+ signing_key:
104
+ specification_version: 4
105
+ summary: A gem that allows the use of Liquid templates with WYSIWYG editor output
106
+ test_files: []