jsajax_wizard 0.2.2 → 0.3.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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/jsajax_wizard.rb +179 -91
- metadata +24 -4
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89704032c52cf38c12530d284a7b7374bfa85bb945def3b7f3f2aefa876f9131
|
4
|
+
data.tar.gz: 54b45c9161ec895b29bec017a242ab37941ddc5f101f99582067764d00953726
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19b66ee5f96e404bbce6a6d7f6c74918a83bbd458b82c799573cf96bfa39ddc72fbdc4103cbd29ab4ba14a96e1127784040303e70a7540bae31e8275701c0aac
|
7
|
+
data.tar.gz: c227a108f313819be77e9e03a046f722030c3b7f4b97e1e4ed81e0a367b9053429819fb26ed7036aec625183cb17cda3fc53885b2f00e871156851d5ec93f6b8
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/jsajax_wizard.rb
CHANGED
@@ -21,10 +21,22 @@
|
|
21
21
|
# jaw.add_request server: 'hello', element: {type: 'timer',
|
22
22
|
# interval: '5000'}, target_element: {id: 'demo', property: :innerHTML}
|
23
23
|
|
24
|
+
# 03 Oct 2019 : An HTML document can be passed in containing an
|
25
|
+
# AJAX placeholder e.g.
|
26
|
+
# <button onclick='$[x][/someurl/]'></button><div id='demo'>$x</div>
|
27
|
+
#
|
28
|
+
|
29
|
+
# AJAX triggered from a button press with the text response passed to eval
|
30
|
+
# jaw.add_request server: 'hello', element: {type: 'button', event: 'onclick'}, target_eval: true
|
31
|
+
|
32
|
+
# AJAX triggered from a speech recognition result
|
33
|
+
# jaw.add_request server: 'hello', trigger: 'recognition.onresult', target_eval: true
|
34
|
+
|
24
35
|
|
25
36
|
|
26
37
|
|
27
38
|
require 'rexle'
|
39
|
+
require 'rxfhelper'
|
28
40
|
require 'rexle-builder'
|
29
41
|
|
30
42
|
class JsAjaxWizard
|
@@ -40,8 +52,10 @@ class JsAjaxWizard
|
|
40
52
|
|
41
53
|
end
|
42
54
|
|
43
|
-
def add_request(server: '', element: {}, target_element: {}
|
44
|
-
|
55
|
+
def add_request(server: '', element: {}, trigger: nil, target_element: {},
|
56
|
+
target_eval: false)
|
57
|
+
type = element.any? ? [:element, element] : [:trigger, trigger]
|
58
|
+
@requests << [server, type, target_element, target_eval ]
|
45
59
|
end
|
46
60
|
|
47
61
|
def to_html()
|
@@ -53,55 +67,100 @@ class JsAjaxWizard
|
|
53
67
|
doc = Rexle.new(html)
|
54
68
|
puts 'doc.xml: ' + doc.xml(pretty: true) if @debug
|
55
69
|
add_events(doc)
|
56
|
-
doc
|
70
|
+
js = build_js(doc)
|
71
|
+
doc.root.element('body').add(Rexle.new(js))
|
57
72
|
|
58
73
|
doc.xml
|
59
74
|
end
|
60
75
|
|
61
76
|
private
|
62
77
|
|
63
|
-
def
|
78
|
+
def add_element_function(element, i, server, target, target_eval)
|
79
|
+
|
80
|
+
puts ('element: ' + element.inspect).debug if @debug
|
81
|
+
puts '::' + [element, i, server, target, target_eval].inspect if @debug
|
82
|
+
|
83
|
+
a = []
|
84
|
+
|
85
|
+
a << if element.is_a?(Hash) then
|
86
|
+
|
87
|
+
if element[:type] == 'text' then
|
64
88
|
|
65
|
-
@requests.each.with_index do |x,i|
|
66
|
-
|
67
|
-
element = x[1]
|
68
|
-
|
69
|
-
selector = if element[:id] then
|
70
|
-
'#' + element[:id]
|
71
|
-
elsif element[:type]
|
72
|
-
"*[@type='%s']" % element[:type]
|
73
|
-
end
|
74
|
-
|
75
|
-
if @debug then
|
76
|
-
puts ("selector: %s" % selector.inspect).debug
|
77
|
-
puts 'doc: ' + doc.xml(pretty: true).inspect
|
78
|
-
end
|
79
|
-
|
80
|
-
e = doc.at_css(selector)
|
81
|
-
puts ('e: ' + e.inspect).debug if @debug
|
82
|
-
next unless e
|
83
|
-
puts ('e: ' + e.inspect).debug if @debug
|
84
|
-
|
85
|
-
func = 'ajaxCall' + (i+1).to_s
|
86
|
-
event = e.attributes[:type] == 'button' ? func + '()' : func + '(this)'
|
87
|
-
|
88
|
-
puts ('element: ' + element.inspect).debug if @debug
|
89
|
-
|
90
|
-
key = if element[:event] then
|
91
|
-
|
92
89
|
if element[:event].to_sym == :on_enter then
|
93
|
-
|
94
|
-
|
90
|
+
"
|
91
|
+
function ajaxCall#{i+1}(keyCode, e) {
|
92
|
+
|
93
|
+
if (keyCode==13){
|
94
|
+
ajaxRequest('#{server}' + e.value, ajaxResponse#{i+1})
|
95
|
+
}
|
96
|
+
|
97
|
+
}
|
98
|
+
"
|
95
99
|
else
|
96
|
-
|
100
|
+
"
|
101
|
+
function ajaxCall#{i+1}(e) {
|
102
|
+
ajaxRequest('#{server}' + e.value, ajaxResponse#{i+1})
|
103
|
+
}
|
104
|
+
"
|
97
105
|
end
|
98
106
|
|
107
|
+
elsif element[:type] == 'timer'
|
108
|
+
"
|
109
|
+
setInterval(
|
110
|
+
function() {
|
111
|
+
ajaxRequest('#{server}', ajaxResponse#{i+1})
|
112
|
+
}, #{element[:interval]});
|
113
|
+
"
|
99
114
|
else
|
100
|
-
|
115
|
+
"
|
116
|
+
function ajaxCall#{i+1}() {
|
117
|
+
ajaxRequest('#{server}', ajaxResponse#{i+1})
|
118
|
+
}
|
119
|
+
"
|
101
120
|
end
|
102
121
|
|
103
|
-
|
122
|
+
else
|
123
|
+
|
124
|
+
"
|
125
|
+
function ajaxCall#{i+1}(s) {
|
126
|
+
ajaxRequest('#{server}' + escape(s), ajaxResponse#{i+1})
|
127
|
+
}
|
128
|
+
"
|
129
|
+
end
|
130
|
+
|
131
|
+
a << "
|
132
|
+
function ajaxResponse#{i+1}(xhttp) {
|
133
|
+
"
|
134
|
+
|
135
|
+
if target.is_a?(Hash) and target[:id] then
|
136
|
+
|
137
|
+
a << " document.getElementById('#{target[:id]}')" +
|
138
|
+
".innerHTML = xhttp.responseText;"
|
139
|
+
end
|
140
|
+
|
141
|
+
if target_eval then
|
142
|
+
|
143
|
+
a << " eval(xhttp.responseText);"
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
a << "
|
148
|
+
}
|
149
|
+
"
|
150
|
+
|
151
|
+
a.join
|
152
|
+
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
def add_events(doc)
|
157
|
+
|
158
|
+
@requests.each.with_index do |x,i|
|
159
|
+
|
160
|
+
puts ('request x: ' + x.inspect).debug if @debug
|
104
161
|
|
162
|
+
method(('modify_' + x[1].first.to_s).to_sym).call(x[1].last, doc, i)
|
163
|
+
|
105
164
|
end
|
106
165
|
|
107
166
|
doc
|
@@ -111,7 +170,9 @@ class JsAjaxWizard
|
|
111
170
|
|
112
171
|
html = @requests.map.with_index do |x,i|
|
113
172
|
|
114
|
-
|
173
|
+
raw_e, e2 = x[1..-1]
|
174
|
+
|
175
|
+
e = raw_e.last
|
115
176
|
|
116
177
|
# e = element e.g. {type: 'button', event: 'onclick'}
|
117
178
|
# e2 = target_element: {id: '', property: :innerHTML}
|
@@ -127,8 +188,8 @@ class JsAjaxWizard
|
|
127
188
|
else
|
128
189
|
['']
|
129
190
|
end
|
130
|
-
|
131
|
-
a << "<div id='%s'></div>" % [e2[:id]]
|
191
|
+
|
192
|
+
a << "<div id='%s'></div>" % [e2[:id]] if e2.is_a? Hash
|
132
193
|
a.join("\n")
|
133
194
|
|
134
195
|
end
|
@@ -154,11 +215,8 @@ class JsAjaxWizard
|
|
154
215
|
|
155
216
|
end
|
156
217
|
|
157
|
-
def build_js()
|
218
|
+
def build_js(doc)
|
158
219
|
|
159
|
-
func_calls = @requests.length.times.map do |i|
|
160
|
-
"// ajaxCall#{i+1}();"
|
161
|
-
end
|
162
220
|
|
163
221
|
ajax=<<EOF
|
164
222
|
function ajaxRequest(url, cFunction) {
|
@@ -176,56 +234,79 @@ EOF
|
|
176
234
|
|
177
235
|
funcs_defined = @requests.map.with_index do |x,i|
|
178
236
|
|
179
|
-
|
180
|
-
server,
|
237
|
+
puts ('x: ' + x.inspect).debug if @debug
|
238
|
+
server, raw_type, target, target_eval = x
|
181
239
|
|
182
|
-
|
240
|
+
if raw_type.first == :trigger then
|
241
|
+
modify_trigger_function(raw_type.last, i, server, doc)
|
242
|
+
end
|
183
243
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
244
|
+
add_element_function(raw_type.last, i, server, target, target_eval)
|
245
|
+
|
246
|
+
end
|
247
|
+
|
248
|
+
s = "\n\n" + ajax + "\n\n" + funcs_defined.join
|
249
|
+
"\n <script>\n%s\n </script>\n" % s
|
250
|
+
|
251
|
+
end
|
191
252
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
253
|
+
def modify_element(element, doc, i)
|
254
|
+
|
255
|
+
selector = if element[:id] then
|
256
|
+
'#' + element[:id]
|
257
|
+
elsif element[:type]
|
258
|
+
"*[@type='%s']" % element[:type]
|
259
|
+
end
|
260
|
+
|
261
|
+
if @debug then
|
262
|
+
puts ("selector: %s" % selector.inspect).debug
|
263
|
+
puts 'doc: ' + doc.xml(pretty: true).inspect
|
264
|
+
end
|
265
|
+
|
266
|
+
e = doc.at_css(selector)
|
267
|
+
puts ('e: ' + e.inspect).debug if @debug
|
268
|
+
return unless e
|
269
|
+
puts ('e: ' + e.inspect).debug if @debug
|
270
|
+
|
271
|
+
func = 'ajaxCall' + (i+1).to_s
|
272
|
+
event = e.attributes[:type] == 'button' ? func + '()' : func + '(this)'
|
273
|
+
|
274
|
+
puts ('element: ' + element.inspect).debug if @debug
|
275
|
+
|
276
|
+
key = if element[:event] then
|
277
|
+
|
278
|
+
if element[:event].to_sym == :on_enter then
|
279
|
+
event = func + '(event.keyCode, this)'
|
280
|
+
:onkeyup
|
209
281
|
else
|
210
|
-
|
211
|
-
function ajaxCall#{i+1}() {
|
212
|
-
ajaxRequest('#{server}', ajaxResponse#{i+1})
|
213
|
-
}
|
214
|
-
"
|
282
|
+
element[:event].to_sym
|
215
283
|
end
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
document.getElementById('#{target_element[:id]}').innerHTML = xhttp.responseText;
|
220
|
-
}
|
221
|
-
"
|
222
|
-
|
223
|
-
a.join
|
284
|
+
|
285
|
+
else
|
286
|
+
e.attributes[:type] == 'button' ? :onclick : :onkeyup
|
224
287
|
end
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
288
|
+
|
289
|
+
e.attributes[key] = event
|
290
|
+
end
|
291
|
+
|
292
|
+
def modify_trigger(element, doc, i)
|
293
|
+
end
|
294
|
+
|
295
|
+
def modify_trigger_function(trigger, i, server, doc)
|
296
|
+
|
297
|
+
doc.root.xpath('//script').each do |script|
|
298
|
+
puts 'script: ' + script.inspect
|
299
|
+
s = script.text.to_s
|
300
|
+
|
301
|
+
script.text = s.sub(/#{trigger} = function\(\) {[^}]+/) {|x|
|
302
|
+
a = x.lines
|
303
|
+
indent = a[1][/\s+/]
|
304
|
+
a[0..-2].join + indent + "ajaxCall#{i+1}(event.results[0][0]." +
|
305
|
+
"transcript);\n" + a[-1]
|
306
|
+
}
|
307
|
+
|
308
|
+
end
|
309
|
+
|
229
310
|
end
|
230
311
|
|
231
312
|
# find the ajax requests
|
@@ -233,15 +314,15 @@ function ajaxResponse#{i+1}(xhttp) {
|
|
233
314
|
def scan_requests(html)
|
234
315
|
|
235
316
|
|
236
|
-
a = html.scan(/\$\[([^\]])
|
317
|
+
a = html.scan(/\$\[([^\]]+)?\]\(([^\)]+)/)
|
237
318
|
|
238
319
|
a.each do |var, url|
|
239
320
|
|
240
321
|
#== fetch the trigger element details
|
241
322
|
|
242
|
-
tag = html[/<[^<]+\$\[([^\]])
|
323
|
+
tag = html[/<[^<]+\$\[([^\]]+)?\]\(#{url}[^\>]+>/]
|
243
324
|
element_name = tag[/(?<=<)\w+/]
|
244
|
-
event = tag[/(\w+)=["']\$\[([^\]])
|
325
|
+
event = tag[/(\w+)=["']\$\[([^\]]+)?\]\(#{url}/,1]
|
245
326
|
|
246
327
|
# is there an id?
|
247
328
|
id = tag[/(?<=id=["'])[^"']+/]
|
@@ -254,6 +335,13 @@ function ajaxResponse#{i+1}(xhttp) {
|
|
254
335
|
|
255
336
|
element = h2.merge(event: event)
|
256
337
|
|
338
|
+
if var.nil? then
|
339
|
+
|
340
|
+
add_request(server: url, element: element, target_eval: true)
|
341
|
+
next
|
342
|
+
|
343
|
+
end
|
344
|
+
|
257
345
|
#== fetch the target element details
|
258
346
|
|
259
347
|
tag2 = html[/<[^<]+>\$#{var}</]
|
@@ -264,7 +352,7 @@ function ajaxResponse#{i+1}(xhttp) {
|
|
264
352
|
|
265
353
|
property = if inner_html then
|
266
354
|
|
267
|
-
html.sub!(/>\$#{var}</,'')
|
355
|
+
html.sub!(/>\$#{var}</,'> <')
|
268
356
|
:innerHTML
|
269
357
|
|
270
358
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsajax_wizard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
pZTsghadsRxoGiI7mehrgxkeLLA7q3Zpafsvw3mLrERdifNsVFNBUDMjfE/OnJq8
|
36
36
|
EOz+UVQEw8EJ9wHqaJYIbHBq
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date:
|
38
|
+
date: 2020-06-26 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: rexle
|
@@ -46,7 +46,7 @@ dependencies:
|
|
46
46
|
version: '1.5'
|
47
47
|
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: 1.5.
|
49
|
+
version: 1.5.7
|
50
50
|
type: :runtime
|
51
51
|
prerelease: false
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -56,7 +56,27 @@ dependencies:
|
|
56
56
|
version: '1.5'
|
57
57
|
- - ">="
|
58
58
|
- !ruby/object:Gem::Version
|
59
|
-
version: 1.5.
|
59
|
+
version: 1.5.7
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: rxfhelper
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 1.0.0
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '1.0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 1.0.0
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '1.0'
|
60
80
|
description:
|
61
81
|
email: james@jamesrobertson.eu
|
62
82
|
executables: []
|
metadata.gz.sig
CHANGED
Binary file
|