gwara 0.0.1

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: 04ec5d13e01ba57fe01cab009909534d80bdb41fabc7f5d5c8b0fd9fcfb6ba9b
4
+ data.tar.gz: d3ed5cc013b2db5c70e840504412b6e1da25e7b0604e2f520e013563ec42cad3
5
+ SHA512:
6
+ metadata.gz: fbab39d963cb66c5cbea5c4932452f60d3e2ec9bfe40b9d156b4c26a555d3387238729d148a9d14ea38b19b40768f7dfca598318f0ef1ff331e34bbe63e1c020
7
+ data.tar.gz: c004c4fb1093b46290c22c9d1d7544a9c41e55ff1b59419c2a73071be22cd5c0d7416f117cc62bd2cee6dbcc8f09868d49323c6c986a037d00c0f6deb5588be2
@@ -0,0 +1,146 @@
1
+ class Gwara
2
+ class Lexer
3
+
4
+ model :parser do
5
+ @state = [:text]
6
+ @buffer = ""
7
+ end
8
+
9
+ def <<(ch)
10
+ case @state.last
11
+ when :text
12
+ case ch
13
+ when "<"
14
+ @parser.add_text @buffer
15
+ @buffer = ""
16
+ @state << :marker_begin
17
+ else
18
+ @buffer << ch
19
+ end
20
+ when :marker_begin
21
+ case ch
22
+ when ">"
23
+ @parser.close_tag
24
+ @state >> 1
25
+ when "/"
26
+ @state >> 1 << :close_tag
27
+ when /\s/
28
+ else
29
+ @state >> 1 << :marker << :tag
30
+ self << ch
31
+ end
32
+ when :close_tag
33
+ case ch
34
+ when ">"
35
+ @parser.close_tag @buffer
36
+ @buffer = ""
37
+ @state >> 1
38
+ else
39
+ @buffer << ch
40
+ end
41
+ when :tag
42
+ case ch
43
+ when /[ .\[#>]/
44
+ @parser.tag @buffer
45
+ @state >> 1
46
+ self << ch
47
+ else
48
+ @buffer << ch
49
+ end
50
+ when :marker
51
+ case ch
52
+ when "."
53
+ @buffer = ""
54
+ @state << :class
55
+ when ">"
56
+ @buffer = ""
57
+ @parser.marker_end
58
+ @state >> 1
59
+ when "#"
60
+ @buffer = ""
61
+ @state << :id
62
+ when "["
63
+ @buffer = ""
64
+ @state << :attr_before_head
65
+ when /\s/
66
+ else
67
+ @buffer = ""
68
+ @state << :token
69
+ self << ch
70
+ end
71
+ when :class
72
+ case ch
73
+ when /[ .\[#>]/
74
+ @parser.add_class @buffer
75
+ @state >> 1
76
+ self << ch
77
+ else
78
+ @buffer << ch
79
+ end
80
+ when :id
81
+ case ch
82
+ when /[ .\[#>]/
83
+ @parser.add_id @buffer
84
+ @state >> 1
85
+ self << ch
86
+ else
87
+ @buffer << ch
88
+ end
89
+ when :attr_before_head
90
+ case ch
91
+ when /\s/
92
+ when "]"
93
+ @state >> 1
94
+ else
95
+ @state >> 1 << :attr_head
96
+ self << ch
97
+ end
98
+ when :attr_head
99
+ case ch
100
+ when /[ =\]]/
101
+ @parser.add_attr_head @buffer
102
+ @state >> 1 << :attr_before_value
103
+ self << ch
104
+ else
105
+ @buffer << ch
106
+ end
107
+ when :attr_before_value
108
+ case ch
109
+ when /[ =]/
110
+ else
111
+ @buffer = ""
112
+ @state >> 1 << :attr_value
113
+ self << ch
114
+ end
115
+ when :attr_value
116
+ case ch
117
+ when "]"
118
+ @parser.add_attr_value @buffer
119
+ @state >> 1
120
+ else
121
+ @buffer << ch
122
+ end
123
+ when :token
124
+ case ch
125
+ when /[ .\[#>]/
126
+ @parser.add_token @buffer
127
+ @state >> 1
128
+ self << ch
129
+ else
130
+ @buffer << ch
131
+ end
132
+ end
133
+ end
134
+
135
+ def close
136
+ case @state.last
137
+ when :text
138
+ @parser.add_text @buffer
139
+ else
140
+ raise "Unexpected close at #{@state.last} state"
141
+ end
142
+ @state = []
143
+ @buffer = ""
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,85 @@
1
+ class Gwara
2
+ class Parser
3
+
4
+ VOID_ELEMENTS = Set[
5
+ "area", "base", "br", "col", "embed", "hr", "img",
6
+ "input", "link", "meta", "param", "source", "track", "wbr"
7
+ ]
8
+
9
+ model :lemat do
10
+ @marker_head = ""
11
+ @marker_attrs = {}
12
+ @attr_head = ""
13
+ @opened_tags = []
14
+ @buffer = ""
15
+ end
16
+
17
+ def add_text text
18
+ @buffer << text
19
+ end
20
+
21
+ def close_tag tag = ""
22
+ @buffer << html_end(tag.strip == "" ? @opened_tags.pop : tag)
23
+ end
24
+
25
+ def tag tag
26
+ @marker_head = tag
27
+ @marker_attrs = {}
28
+ @opened_tags << tag if !VOID_ELEMENTS.include?(tag)
29
+ end
30
+
31
+ def marker_end
32
+ @buffer << html(@marker_head, @marker_attrs)
33
+ end
34
+
35
+ def add_class str
36
+ @marker_attrs["class"] = "#{@marker_attrs["class"]} #{str}"
37
+ end
38
+
39
+ def add_id str
40
+ @marker_attrs["id"] = str
41
+ end
42
+
43
+ def add_attr_head str
44
+ @attr_head = str
45
+ end
46
+
47
+ def add_attr_value str
48
+ if @attr_head == "class"
49
+ add_class str
50
+ else
51
+ @marker_attrs[@attr_head] = str
52
+ end
53
+ end
54
+
55
+ def add_token str
56
+ @marker_head << " " << str
57
+ end
58
+
59
+ def html_end marker
60
+ marker ? "</#{marker}>" : ""
61
+ end
62
+
63
+ def html tag, attrs
64
+ attrs_string = attrs.map do |k, v|
65
+ if v.start_with? "'"
66
+ v = "\"#{v}\"" if !v.end_with? "'"
67
+ elsif v.start_with? '"'
68
+ v = "'#{v}'" if !v.end_with? '"'
69
+ else
70
+ v = "\"#{v.strip}\""
71
+ end
72
+ " #{k}=#{v}"
73
+ end.join
74
+ "<#{tag}#{attrs_string}>"
75
+ end
76
+
77
+ def close
78
+ if !@opened_tags.empty?
79
+ puts "There are some opened markers - closing them"
80
+ @opened_tags.size.times{ close_tag }
81
+ end
82
+ @buffer
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,3 @@
1
+ module Gwara
2
+ VERSION = "0.0.1"
3
+ end
data/lib/gwara.rb ADDED
@@ -0,0 +1,22 @@
1
+ require 'modeling'
2
+ require 'koper'
3
+ require_relative 'gwara/lexer'
4
+ require_relative 'gwara/parser'
5
+
6
+ class Gwara
7
+ model do
8
+ @parser = Parser.new self
9
+ @lexer = Lexer.new @parser
10
+ end
11
+
12
+ def <<(string)
13
+ string.each_char do |ch|
14
+ @lexer << ch
15
+ end
16
+ end
17
+
18
+ def to_s
19
+ @lexer.close
20
+ @parser.close
21
+ end
22
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gwara
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Łukasz Pomietło
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-04-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: modeling
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.5
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.5
27
+ - !ruby/object:Gem::Dependency
28
+ name: koper
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.0.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.0.2
41
+ description: 'HTML derived language compiler.
42
+
43
+ '
44
+ email: oficjalnyadreslukasza@gmail.com
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - lib/gwara.rb
50
+ - lib/gwara/lexer.rb
51
+ - lib/gwara/parser.rb
52
+ - lib/gwara/version.rb
53
+ homepage: https://github.com/lpogic/gwara
54
+ licenses:
55
+ - Zlib
56
+ metadata:
57
+ documentation_uri: https://github.com/lpogic/gwara/blob/main/doc/wiki/README.md
58
+ homepage_uri: https://github.com/lpogic/gwara
59
+ post_install_message:
60
+ rdoc_options: []
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 3.2.2
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ requirements: []
74
+ rubygems_version: 3.5.6
75
+ signing_key:
76
+ specification_version: 4
77
+ summary: Css influenced HTML dialect compiler
78
+ test_files: []