jsautocomplete_builder 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data/lib/jsautocomplete_builder.rb +222 -0
- data.tar.gz.sig +1 -0
- metadata +90 -0
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a481220419076acf6021cc17c4ddf3244d86948575050eb831a93197258bd886
|
4
|
+
data.tar.gz: 9fc7099338901e60269c6863b0b4251982d148430276aebfb3d7de2733c51059
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: da197ec5352eb554ec70848a410fdd429b77bd996884e2af8fbf56486c59537d59f943dbf8f4a37dafbcf68fa6674b245f50509751954034b4b05a7c847727df
|
7
|
+
data.tar.gz: 244777e4bd15a28c2fba6b78c8eb235a3ae6668adc53feda861a86645c684a0859d3e8f5acf1d950f36f0418cfe2c114bf3dddb0b838fc2605d8625edf901ec3
|
checksums.yaml.gz.sig
ADDED
Binary file
|
@@ -0,0 +1,222 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# file: jsautocomplete_builder.rb
|
4
|
+
|
5
|
+
require 'rexle'
|
6
|
+
require 'rexle-builder'
|
7
|
+
|
8
|
+
|
9
|
+
class JsAutocompleteBuilder
|
10
|
+
|
11
|
+
# list: is the url of the server which returns the list
|
12
|
+
# action: is the url of the server to process the search request
|
13
|
+
#
|
14
|
+
def initialize(server: {list: '', action: ''})
|
15
|
+
@server = server
|
16
|
+
end
|
17
|
+
|
18
|
+
# returns just the form part
|
19
|
+
def to_html()
|
20
|
+
|
21
|
+
html=<<EOF
|
22
|
+
<form action='#{@server[:action]}' method='get' name='searchForm'>
|
23
|
+
|
24
|
+
<input tabindex='2' type='text' autofocus='true' onkeyup='updateList(event.keyCode, this)' onfocus='showList()' onblur='hideList()' id='search' autocomplete='off' name='q'/>
|
25
|
+
<input type='submit' value='search'>
|
26
|
+
<ol id='autolist'></ol>
|
27
|
+
|
28
|
+
</form>
|
29
|
+
EOF
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_css()
|
34
|
+
css()
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_js()
|
38
|
+
|
39
|
+
url = @server[:list] =~ /\?\w+=$/ ? @server[:list] : @server[:list] + '?q='
|
40
|
+
("\n var serverList = '%s';\n\n" % url) + js()
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_webpage()
|
45
|
+
|
46
|
+
doc = Rexle.new(build_html())
|
47
|
+
doc.root.element('body').add Rexle::Element.new('script').add_text(to_js())
|
48
|
+
doc.root.element('head').add Rexle::Element.new('style').add_text(to_css())
|
49
|
+
|
50
|
+
doc.xml(pretty: true)
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def build_html()
|
57
|
+
|
58
|
+
RexleBuilder.build do |xml|
|
59
|
+
xml.html do
|
60
|
+
xml.head do
|
61
|
+
xml.title 'Search'
|
62
|
+
xml.meta name: "viewport", content: \
|
63
|
+
"width=device-width, initial-scale=1"
|
64
|
+
end
|
65
|
+
xml.body do
|
66
|
+
xml.div({tabindex: '1', id: 'autosuggest'}, to_html())
|
67
|
+
xml.p 'Search page generated using the jsautocomplete_builder gem'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def css()
|
74
|
+
<<EOF
|
75
|
+
|
76
|
+
|
77
|
+
body {font-family: Arial;}
|
78
|
+
|
79
|
+
form input {
|
80
|
+
background-color: transparent;
|
81
|
+
padding: 0; margin: 0;
|
82
|
+
}
|
83
|
+
ol {
|
84
|
+
background-color: #eee;
|
85
|
+
position: absolute;
|
86
|
+
left: 12px;
|
87
|
+
|
88
|
+
padding: 0; margin: 0;
|
89
|
+
list-style-type: none;
|
90
|
+
}
|
91
|
+
|
92
|
+
#autolist li {
|
93
|
+
background-color: transparent;
|
94
|
+
padding: 0; margin: 0;
|
95
|
+
cursor: pointer;
|
96
|
+
}
|
97
|
+
|
98
|
+
#autolist li:hover, #autolist li:focus {background-color: rgba(223,223,200,7)}
|
99
|
+
|
100
|
+
div#autosuggest {background-color: transparent; width: 14em; }
|
101
|
+
|
102
|
+
#autosuggest ol {display: none}
|
103
|
+
|
104
|
+
input[type=submit] {background-color: transparent; display: inline}
|
105
|
+
EOF
|
106
|
+
end
|
107
|
+
|
108
|
+
def js()
|
109
|
+
<<EOF
|
110
|
+
function ajaxRequest(url, cFunction) {
|
111
|
+
var xhttp;
|
112
|
+
xhttp = new XMLHttpRequest();
|
113
|
+
xhttp.onreadystatechange = function() {
|
114
|
+
if (this.readyState == 4 && this.status == 200) {
|
115
|
+
cFunction(this);
|
116
|
+
}
|
117
|
+
};
|
118
|
+
xhttp.open("GET", url, true);
|
119
|
+
xhttp.send();
|
120
|
+
}
|
121
|
+
|
122
|
+
function ajaxFetchList(e) {
|
123
|
+
ajaxRequest(serverList + e.value, ajaxResponseList)
|
124
|
+
}
|
125
|
+
|
126
|
+
function ajaxResponseList(xhttp) {
|
127
|
+
document.getElementById('autolist').innerHTML = xhttp.responseText;
|
128
|
+
list = document.getElementById('autolist');
|
129
|
+
list.style.display = 'block';
|
130
|
+
}
|
131
|
+
|
132
|
+
function updateList(keyCode, e) {
|
133
|
+
|
134
|
+
// esc key?
|
135
|
+
if (keyCode == 27)
|
136
|
+
return
|
137
|
+
|
138
|
+
// down arrow key?
|
139
|
+
if (keyCode == 40) {
|
140
|
+
showList();
|
141
|
+
li = document.getElementById('autolist').children.item(0);
|
142
|
+
e.value = li.textContent;
|
143
|
+
li.focus();
|
144
|
+
return
|
145
|
+
}
|
146
|
+
//e.value;
|
147
|
+
if (e.value.length > 0) {
|
148
|
+
ajaxFetchList(e);
|
149
|
+
}
|
150
|
+
}
|
151
|
+
|
152
|
+
function hideList() {
|
153
|
+
|
154
|
+
setTimeout(function(){
|
155
|
+
console.log('parent: ' + document.activeElement.nodeName);
|
156
|
+
id = document.activeElement.parentElement.id;
|
157
|
+
|
158
|
+
if (id !== 'autolist' && id !== 'autosuggest') {
|
159
|
+
list = document.getElementById('autolist');
|
160
|
+
list.style.display = 'none';
|
161
|
+
}
|
162
|
+
}, 100);
|
163
|
+
|
164
|
+
}
|
165
|
+
|
166
|
+
function itemKeyup(keyCode, e) {
|
167
|
+
|
168
|
+
console.log('keyCode: ' + keyCode);
|
169
|
+
txt = document.getElementById('search');
|
170
|
+
|
171
|
+
// enter key or spacebar key?
|
172
|
+
if (keyCode == 13 || keyCode == 32) {
|
173
|
+
itemSelected(e)
|
174
|
+
}
|
175
|
+
|
176
|
+
// up arrow?
|
177
|
+
else if (keyCode == 38) {
|
178
|
+
if (e.previousElementSibling) {
|
179
|
+
txt.value = e.previousElementSibling.textContent;
|
180
|
+
e.previousElementSibling.focus();
|
181
|
+
}
|
182
|
+
else
|
183
|
+
document.getElementById('search').focus();
|
184
|
+
}
|
185
|
+
// down arrow?
|
186
|
+
else if (keyCode == 40) {
|
187
|
+
|
188
|
+
txt.value = e.nextElementSibling.textContent;
|
189
|
+
e.nextElementSibling.focus();
|
190
|
+
}
|
191
|
+
// esc key?
|
192
|
+
else if (keyCode == 27) {
|
193
|
+
list = document.getElementById('autolist');
|
194
|
+
list.style.display = 'none';
|
195
|
+
txt.focus();
|
196
|
+
}
|
197
|
+
}
|
198
|
+
|
199
|
+
function itemSelected(e) {
|
200
|
+
txt = document.getElementById('search');
|
201
|
+
txt.value = e.textContent;
|
202
|
+
|
203
|
+
list = document.getElementById('autolist');
|
204
|
+
list.style.display = 'none';
|
205
|
+
document.searchForm.submit();
|
206
|
+
}
|
207
|
+
|
208
|
+
function showList() {
|
209
|
+
|
210
|
+
console.log('parent2: ' + document.activeElement.nodeName);
|
211
|
+
txt = document.getElementById('search');
|
212
|
+
|
213
|
+
if (txt.value.length > 0) {
|
214
|
+
list = document.getElementById('autolist');
|
215
|
+
list.style.display = 'block';
|
216
|
+
}
|
217
|
+
|
218
|
+
}
|
219
|
+
EOF
|
220
|
+
end
|
221
|
+
|
222
|
+
end
|
data.tar.gz.sig
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
��r���A"8[�\j1:F�շ�� ^�tNԭ4+U�]c/�3�;��G��!V�9����T>�S��!e��/E�z����g@�C��(�ȯ�?���>��x�[<��P+RWg��S������;��Ŧw؎�#gv���<��%�<��Á{�l��ֈm�ik�YEuK��X�����2\b4�2�e�¥�2l�5;��1AH u4�Z0�|ac���I�Ƞ9~�z)8���(]m������L$X��T�O�q��,X�ʅ�&�N�n(��T��%^F������׃~�>kF]�a�V�U��_�h��霾��>p�O��I�e߇B��Rߝ���ө��=4m�Z�R�����u��k�
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jsautocomplete_builder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- James Robertson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
|
14
|
+
YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTkwODExMTA0OTU1WhcN
|
15
|
+
MjAwODEwMTA0OTU1WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
|
16
|
+
cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC0tNWt
|
17
|
+
efY7MZcRvbWchKH1wtLkw4sG/H1Vx2TGSCJpsqrAOXZMa0CA7o8IF85LmHgqn+XW
|
18
|
+
Ue5qyZETa0lLwt2m2EQzfBUyceAaLHIUCOPBxRHqOg8Juuveoy7KTCzzoNShK4ym
|
19
|
+
qAycd1ItcRqZlR1OAAac+mrSjET6nOjijMhsuxqreRHZeP3E5XKjGTLWRR8BdSdC
|
20
|
+
3uWVQLMGpe/a0Cp/CO4pfFgtCs9eOi/z9VL1n2+GbOVC5Mlkk5PqmxD8pY3YCuWe
|
21
|
+
Nl7WrO8Jh4q/r8dHtuHP7j70SCoEjTpyaIaunwU9+0GY+EXoQ6Z8qk5BKY5nbIsY
|
22
|
+
ENJnQsescZ1h6YL5eel6EqYIOCXcCyDk0cax+ORM6t0H+5yD/3HeUCOTH9IhMp3j
|
23
|
+
WTZtqNNC9pl326+KFkt8JwgGjxpOl0ng+KFRgEPZRjrcOQGCegUT4U45Q/G2ZjK5
|
24
|
+
aSi/CgbsBCeRd8kYnFgZcQlYJN266QcFG4QNo7LGwYzeiYXk58QWIk3RNx0CAwEA
|
25
|
+
AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUJqcFjRxE
|
26
|
+
IM/uwa1/JY/PbMR3azAwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
|
27
|
+
c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
|
28
|
+
BgkqhkiG9w0BAQsFAAOCAYEATXbaTbDee/HCu4pIQgZVn8RAeLSZ3Y7XO9S36bjo
|
29
|
+
w8snZqpXuVr4AdYoxwKnVinMt6pAkNnpQOYO/cvavhQZwB9at6vjFPsnlN+nHDpC
|
30
|
+
1dRdTrC8b+EkcRDA2UqYm/W4y3lJY4bEkAw+k/QL2mvA/N7TOyXtvj5YDg+BIJu9
|
31
|
+
ve2FGZrKXCYvshg6D4+BNj180pKMf2G4JSIo8o0HpgC7KtuZXpXjyM5G+yLE+UHc
|
32
|
+
aa3XZyVg1mh1pD600/zafJOUBOf3A2EIZ7n7mVtn/oJtn2s01BMerDdIZO/ncmNl
|
33
|
+
uKsEYVwOKZYLfeMzHnyBxWdACZEd07E7fytKzouWlDpPf08pr+3rhktZ0Oc+ZAd3
|
34
|
+
4J4Qi8WDlqrmL2AwUckai9o/rhbN98h7tlAElo9xp+ETEbCPDcu93b2oU7pCVUPw
|
35
|
+
DmplinAyhjj+5ZDGg6mu65rwjE0W0/r1VK1uXHgH+HVusIp3hXu8myyYbJ8PoAHO
|
36
|
+
3UjkvNzAbcSkU3whryOaXSHI
|
37
|
+
-----END CERTIFICATE-----
|
38
|
+
date: 2019-08-11 00:00:00.000000000 Z
|
39
|
+
dependencies:
|
40
|
+
- !ruby/object:Gem::Dependency
|
41
|
+
name: rexle
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '1.5'
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 1.5.2
|
50
|
+
type: :runtime
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - "~>"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '1.5'
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 1.5.2
|
60
|
+
description:
|
61
|
+
email: james@jamesrobertson.eu
|
62
|
+
executables: []
|
63
|
+
extensions: []
|
64
|
+
extra_rdoc_files: []
|
65
|
+
files:
|
66
|
+
- lib/jsautocomplete_builder.rb
|
67
|
+
homepage: https://github.com/jrobertson/jsautocomplete_builder
|
68
|
+
licenses:
|
69
|
+
- MIT
|
70
|
+
metadata: {}
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options: []
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
requirements: []
|
86
|
+
rubygems_version: 3.0.1
|
87
|
+
signing_key:
|
88
|
+
specification_version: 4
|
89
|
+
summary: Makes it trivial to build an autocomplete search feature into a web page.
|
90
|
+
test_files: []
|
metadata.gz.sig
ADDED
Binary file
|