free_dom 0.3.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b331adf1af2368386b05b4d365a943d57b8252339d4af17ea5631b9f07894e36
4
+ data.tar.gz: fa9403708d030f64da8b68195d6af5819a713599070a86c5dac1752c83f3fc80
5
+ SHA512:
6
+ metadata.gz: a53b324b2126265b880d82ea254f952b33632c4bf94b4f7288542c0a7fd55217bf1beaa404042625712f346a7b8d21cfdf8c026ec8e50e4138dbce87bb6a7d4b
7
+ data.tar.gz: 01acf8d7577c0ac0153b074173fd7b5747629b74dea36ef48fb4d72a93b3a0d49a3b10769fed8f8eb261dc5472cc2a8bc6f85b1c228e198d6e19d18de1b1a439
Binary file
Binary file
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # file: free_dom.rb
4
+
5
+ require 'domle'
6
+ require 'xml_to_sliml'
7
+
8
+
9
+ class FreeDom < Domle
10
+
11
+ def initialize(s, debug: false)
12
+
13
+ @debug = debug
14
+
15
+ xml = s =~ /^</ ? s : LineTree.new(s).to_xml
16
+ @doc = Rexle.new(xml)
17
+
18
+ h = {}
19
+
20
+ @doc.root.each_recursive do |e|
21
+
22
+ h[e.name.to_sym] ||= {}
23
+
24
+ # if there's a custom attribute, add a default trigger called trigger_change
25
+ a = e.attributes.keys.reject {|x| %i(id name class).include? x }
26
+ e.attributes.merge!({trigger_change: a.first}) if a.any?
27
+
28
+ # add a trigger attribute for each *on* event attribute
29
+ events = e.attributes.keys.select {|x| x =~ /^on/}\
30
+ .map {|x| 'trigger_' + x.to_s[/(?<=^on)\w+/]}
31
+ e.attributes.merge! events.zip(['']*events.length).to_h
32
+
33
+ h[e.name.to_sym].merge!(e.attributes)
34
+ end
35
+
36
+ @defined_elements = {}
37
+
38
+ h.each do |name, attributelist|
39
+
40
+ klass = Class.new(Domle::Element) do
41
+
42
+ a = attributelist.keys
43
+
44
+ triggers = a.select {|x| x =~ /^trigger_/ }
45
+ attr2_accessor *((a - triggers) + %i(onchange)).uniq
46
+
47
+ triggers.each do |x|
48
+
49
+ trigger = x.to_s[/(?<=^trigger_).*/].to_sym
50
+ puts 'trigger: ' + trigger.inspect if @debug
51
+
52
+ define_method(trigger) do
53
+ statement = method(('on' + trigger.to_s).to_sym).call
54
+ eval statement, $env if statement
55
+ end
56
+
57
+ if trigger == :change then
58
+
59
+ attribute = attributelist[x].to_sym
60
+
61
+ define_method((attribute.to_s + '=').to_sym) do |val|
62
+
63
+ oldval = attributes[attribute]
64
+ attributes[attribute] = val
65
+
66
+ @rexle.refresh if @rexle
67
+ change() unless val == oldval
68
+
69
+ val
70
+ end
71
+
72
+ end
73
+
74
+ end
75
+
76
+ end
77
+
78
+ custom_class = FreeDom.const_set name.to_s.capitalize, klass
79
+ @defined_elements.merge!({name => custom_class})
80
+
81
+ end
82
+
83
+ # remove the trigger declaration attributes
84
+ @doc.root.each_recursive do |e|
85
+ e.attributes.keys.select {|x| x =~ /^trigger_/ }\
86
+ .each {|x| e.attributes.delete x }
87
+ end
88
+
89
+ super(@doc.root.xml, debug: @debug)
90
+ script()
91
+
92
+ end
93
+
94
+
95
+ # used within the scope of the script tags
96
+ #
97
+ def doc()
98
+ self
99
+ end
100
+
101
+ def script()
102
+ s = @doc.root.xpath('//script').map {|x| x.text.unescape }.join
103
+ eval s
104
+ $env = binding
105
+ end
106
+
107
+ def to_sliml()
108
+
109
+ xml = @doc.root.element('*').xml(pretty: true)
110
+ puts 'xml: ' + xml.inspect if @debug
111
+ XmlToSliml.new(xml.gsub(/ style=''/,"")).to_s
112
+
113
+ end
114
+
115
+
116
+ private
117
+
118
+ def defined_elements()
119
+ @defined_elements
120
+ end
121
+
122
+ end
123
+
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: free_dom
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ platform: ruby
6
+ authors:
7
+ - James Robertson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjAwNDI5MDAwMjU5WhcN
15
+ MjEwNDI5MDAwMjU5WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDJxo8z
17
+ LE3kbe2gTKh0kwQ5YsK7rW8RYTkDqV45vXNXJdVdPS+f6xkaABLZXTxkJ28hsXQJ
18
+ JvDnb3drshxPLW1GGqZCkK9aZA6W7sSR9IND0cQr2g2QyIb6SsMXWceuLsMDlZSS
19
+ zbaU7Qfp5P5MflnY+nlRFTJ995EbwzsA2vYY1BqEoxzxVu2cY43rA8q/MCcpJwUD
20
+ 5iDVm6VAogPfq07VGa2HEVKStxPGwcbTIkxGoFqWEyeET5iG3OQAfqqoBkuucJXs
21
+ RDcW+Cv7RuVP3N9GqlbpQSVfpWd+KdpUXLMuvE9lhoK3p0nfLUzQu4ExcNHByenf
22
+ VRT0RcmGjlB14BDt1fEDCXQBHLDYln7+r4n9FWVMEI/Cu1dkZ0EA+iqCE9fk984z
23
+ rIPuGL5VJhMOr297KvDcY7IcCc/Q4GSrnrTHZ7DP3oTXy7AR/nMYri4TpFRQTxxb
24
+ h1DPztcsHW01Mbnn1Kk3zF12X+j9CkCAnz6CYlLO3MloYrRxwsSFLllW4/8CAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUTEwxad+7
26
+ bYNQa63QgqUl89AdmYswJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
+ c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
+ BgkqhkiG9w0BAQsFAAOCAYEAcIlboY8Gudv/UW9j4CvT0bXK3lJ/qg/nnE0vqiKP
29
+ +ror3CE2vG0bN5J1ia7VZgepPMt55f4eMfFdYKcCzE+YM9RaSa35qnfSPUR1omNs
30
+ /Jl8KmKdgHiCvcFI0+Q7kSX1xrNgdcEaUcutvHgY4Wg5hW04cC2QPRI5PEjl5Q/4
31
+ HzUsuWKv8oP3ulRUg2z97x4TVyewO7HJ9n0swcim4uieLQHc/t/VL8KQ8Ynx1T2M
32
+ 5+McK4ekR1ed0QY8vM/zp4hsvKByre05f2XVRxe37YjPpS9xP+JGfoKU8KG+mlWt
33
+ L6oTXKicNcV/O9GCnVPArudFdeOAAvEGI2izAUI42nMPpu7rgNEPzjrLIQ4qsMFJ
34
+ 4DK35MuFK8T+fQUKswdRSdOTJsKbggzHYbZMoMiKPui5jjoucWoWhGc+jZg9SdO7
35
+ VxSuuHhAXplX7wWmd1FzAAH5bk4OPlKGt5fxQbax+FSoEzTsnoDcLTY2i0WOxwRo
36
+ 76nAi+UZoU87S6brj88/rtOL
37
+ -----END CERTIFICATE-----
38
+ date: 2020-05-02 00:00:00.000000000 Z
39
+ dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: domle
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.4'
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 0.4.1
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '0.4'
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 0.4.1
60
+ - !ruby/object:Gem::Dependency
61
+ name: xml_to_sliml
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '0.1'
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 0.1.2
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '0.1'
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 0.1.2
80
+ description:
81
+ email: james@jamesrobertson.eu
82
+ executables: []
83
+ extensions: []
84
+ extra_rdoc_files: []
85
+ files:
86
+ - lib/free_dom.rb
87
+ homepage: https://github.com/jrobertson/free_dom
88
+ licenses:
89
+ - MIT
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubygems_version: 3.0.3
107
+ signing_key:
108
+ specification_version: 4
109
+ summary: Dynamically builds a DOM from XML.
110
+ test_files: []
Binary file