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