jsautocomplete_builder 0.1.0

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