liquidice 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []