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 +7 -0
- data/lib/liquidice/errors.rb +5 -0
- data/lib/liquidice/liquidice_grammar.treetop +99 -0
- data/lib/liquidice/parser.rb +33 -0
- data/lib/liquidice/transformer.rb +160 -0
- data/lib/liquidice/version.rb +9 -0
- data/lib/liquidice.rb +3 -0
- metadata +106 -0
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,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
|
data/lib/liquidice.rb
ADDED
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: []
|