gwara 0.0.1

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: 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: []