jsautocomplete_builder 0.1.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.
- 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
|