source: other-projects/hathitrust/wcsa/extracted-features-solr/trunk/web-portal/index.js@ 31618

Last change on this file since 31618 was 31618, checked in by davidb, 7 years ago

Code tidy up

File size: 13.3 KB
Line 
1
2var langs_with_pos =["en","de","pt","da","nl", "sv"];
3var langs_without_pos =["af","ar","bg","bn","cs","el","es","et","fa","fi","fr","he","hi","hr","hu","id","it","ja","kn","ko","lt","lv","mk","ml","mr","ne","no","pa","pl","ro","ru","sk","sl","so","sq","sv","sw","ta","te","th","tl","tr","uk","ur","vi","zh-cn","zh-tw"];
4
5var num_rows = 20;
6
7function lang_pos_toggle(event) {
8 var $this =$(this);
9 var checked_state = $this.prop("checked");
10
11 var id = $this.attr("id");
12 var split_id = id.split("-");
13 var related_id = split_id[0] + "-pos-choice";
14
15 //console.log("checked state = " + checked_state);
16
17 var disable_state = !checked_state;
18 $('#'+related_id + " *").prop('disabled',disable_state);
19};
20
21function ajax_error(jqXHR, textStatus, errorThrown) {
22 alert('An error occurred... Look at the console (F12 or Ctrl+Shift+I, Console tab) for more information!');
23
24 console.log('jqXHR:' + jqXHR);
25 console.log('textStatus:' + textStatus);
26 console.log('errorThrown:' + errorThrown);
27}
28
29
30function add_titles(json_data) {
31 $.each( json_data, function( htid_with_prefix, htid_val ) {
32 var htid = htid_with_prefix.replace(/^htid:/,"");
33
34 $.each(htid_val.records, function( internalid, metadata ) {
35 var title = metadata.titles[0];
36 $("[name='"+htid+"']").each(function() {$(this).html(title)});
37 console.log(htid + ", title = " + metadata.titles[0]);
38 });
39 });
40}
41
42function show_new_results(delta)
43{
44 $('.search-in-progress').css("cursor","wait");
45
46 var start = parseInt(store_search_args.start)
47
48 store_search_args.start = start + parseInt(delta);
49
50 $.ajax({
51 type: 'GET',
52 url: store_search_action,
53 data: store_search_args,
54 dataType: 'json',
55 success: show_results,
56 error: ajax_error
57 });
58}
59
60function generate_item(line,id,id_pages)
61{
62 var css_class = (line%2 == 0) ? 'class="evenline"' : 'class="oddline"';
63
64 var html_item = "";
65
66 var id_pages_len = id_pages.length;
67
68 for (var pi=0; pi<id_pages_len; pi++) {
69 var page = id_pages[pi];
70
71 var seqnum = page;
72 var babel_url = "https://babel.hathitrust.org/cgi/pt?id="+id+";view=1up;seq="+seqnum;
73
74 if (id_pages_len>1) {
75
76 if (pi==0) {
77 html_item += '<p ' + css_class + '>';
78 html_item += '<span style="font-style: italic;" name="'+id+'"><span style="cursor: progress;">Loading ...</span></span><br>';
79
80
81 html_item += id + ': <a target="_blank" href="' + babel_url + '">seq ' + seqnum + '</a> ';
82 }
83 else {
84 html_item += ', <a target="_blank" href="' + babel_url + '">seq ' + seqnum + '</a> ';
85 }
86 }
87 else {
88 html_item += '<p ' + css_class + '>';
89 html_item += ' <span style="font-style: italic;" name="'+id+'"><span style="cursor: progress;">Loading ...</span></span><br>';
90 html_item += '<a target="_blank" href="' + babel_url + '">' + id + ', seq ' + seqnum + '</a>';
91 html_item += '</p>';
92 }
93
94 }
95
96 if (id_pages_len>1) {
97 html_item += "</p>";
98 }
99
100 return html_item;
101}
102
103
104
105function show_results(jsonData) {
106 var response = jsonData.response;
107 var num_found = response.numFound;
108 var docs = response.docs;
109 var num_docs = docs.length;
110
111 $('.search-in-progress').css("cursor","auto");
112
113 var $search_results = $('#search-results');
114
115 if (num_docs>0) {
116 $search_results.html("<p>Results: " + num_found + " pages matched</p>");
117 var from = parseInt(store_search_args.start);
118 var to = from + num_rows;
119 $search_results.append("<p>Showing matches: "+from+"-" + to + "</p>");
120 }
121 else {
122 $search_results.html("<p>No pages matched your query</p>");
123 }
124
125 // Example form of URL
126 // https://babel.hathitrust.org/cgi/pt?id=hvd.hnnssu;view=1up;seq=11
127
128 var htids = [];
129
130 var prev_id = null;
131 var prev_pages = [];
132
133 var i=0;
134 var line_num = 0;
135 while (i<num_docs) {
136 var doc = docs[i];
137 var id_and_page = doc.id.split(".page-");
138 var id = id_and_page[0];
139 var seqnum = parseInt(id_and_page[1]) +1; // fix up ingest error
140 var page = seqnum;
141
142 if ((prev_id != null) && (id != prev_id)) {
143 // time to output previous item
144 var html_item = generate_item(line_num,prev_id,prev_pages);
145 $search_results.append(html_item);
146 line_num++;
147 prev_pages = [page];
148 }
149 else {
150 // accumulate pages
151 prev_pages.push(page)
152 }
153
154 htids.push("htid:"+id);
155
156 prev_id = id;
157 i++;
158 }
159
160 var html_item = generate_item(line_num,prev_id,prev_pages);
161 $search_results.append(html_item);
162
163
164 document.location.href="#search-results-anchor";
165
166 var next_prev = '<p style="width:100%;"><div id="search-prev" style="float: left;"><a>&lt; Previous</a></div><div id="search-next" style="float: right;"><a>Next &gt;</a></div></p>';
167
168 $search_results.append(next_prev);
169 $('#search-prev').click(function(event) { show_new_results(-1*num_rows); });
170 $('#search-next').click(function(event) { show_new_results(num_rows); });
171
172 var search_start = store_search_args.start;
173 if (search_start==0) {
174 $('#search-prev').hide();
175 }
176
177 // Example URL for catalog metadata (multiple items)
178 // http://catalog.hathitrust.org/api/volumes/brief/json/id:552;lccn:70628581|isbn:0030110408
179
180 var htids_str = htids.join("|",htids);
181 var cat_url = "http://catalog.hathitrust.org/api/volumes/brief/json/" + htids_str;
182 $.ajax({
183 url: cat_url,
184 dataType: 'jsonp',
185 jsonpCallback: "add_titles"
186 });
187}
188
189var store_search_args = null;
190var store_search_action = null;
191
192var group_by_vol_checked = 0;
193
194
195function expand_field_lang_pos(q_text,langs_with_pos,langs_without_pos,search_all_checked)
196{
197 var fields = [];
198 var universal_pos_tags = [ "VERB", "NOUN", "ADJ", "ADV", "ADP", "CONJ", "DET", "NUM", "PRT", "X" ];
199
200 for (var li=0; li<langs_with_pos.length; li++) {
201 var lang = langs_with_pos[li];
202 var lang_enabled_id = lang + "-enabled";
203 var $lang_enabled_cb = $('#'+lang_enabled_id);
204 if ($lang_enabled_cb.is(':checked')) {
205 console.log("Extracting POS tags for: " + lang);
206
207 for (var ti=0; ti<universal_pos_tags.length; ti++) {
208 var tag = universal_pos_tags[ti];
209 var lang_tag_id = lang+"-"+tag+"-htrctoken-cb";
210 var $lang_tag_cb = $('#'+lang_tag_id);
211 if (search_all_checked || ($lang_tag_cb.is(':checked'))) {
212 var lang_tag_field = lang+"_"+tag+"_htrctoken";
213 fields.push(lang_tag_field+":"+q_text);
214 }
215 }
216 }
217 }
218
219 for (var li=0; li<langs_without_pos.length; li++) {
220 var lang = langs_without_pos[li];
221 var lang_enabled_id = lang + "-enabled";
222 var $lang_enabled_cb = $('#'+lang_enabled_id);
223
224 if (search_all_checked || ($lang_enabled_cb.is(':checked'))) {
225 console.log("Adding in non-POS field for: " + lang);
226 var lang_tag_field = lang+"_htrctoken";
227 fields.push(lang_tag_field+":"+q_text);
228 }
229 }
230
231 var fields_str = fields.join(" OR ");
232
233 return fields_str;
234}
235
236function expand_query_field_and_boolean(query,langs_with_pos,langs_without_pos,search_all_checked)
237{
238 // boolean terms
239 // => pos and lang field
240
241 var query_terms = query.split(/\s+/);
242 var query_terms_len = query_terms.length;
243
244 var bool_query_term = [];
245
246 var i=0;
247 var prev_bool = "";
248
249 for (var i=0; i<query_terms_len; i++) {
250 var term = query_terms[i];
251 if (term.match(/^(and|or)$/i)) {
252 prev_bool = term.toUpperCase();
253 }
254 else {
255 if (i>0) {
256 if (prev_bool == "") {
257 prev_bool = "AND";
258 }
259 }
260
261 var expanded_term = expand_field_lang_pos(term,langs_with_pos,langs_without_pos,search_all_checked)
262
263 term = "(" + expanded_term + ")";
264
265 if (prev_bool != "") {
266 bool_query_term.push(prev_bool);
267 prev_bool = "";
268 }
269 bool_query_term.push(term);
270 }
271 }
272
273 var bool_query = bool_query_term.join(" ");
274
275 return bool_query;
276}
277
278
279function submit_action(event)
280{
281 event.preventDefault();
282
283 $('.search-in-progress').css("cursor","wait");
284
285 store_search_action = $('#search-form').attr("action");
286
287 var arg_indent = $('#indent').attr('value');
288 var arg_wt = $('#wt').attr('value');
289 var arg_start = $('#start').attr('value');
290 var arg_rows = $('#rows').attr('value');
291 var q_text = $('#q').val();
292
293 group_by_vol_checked = $('#group-results-by-id:checked').length;
294 var search_all_checked = $('#search-all-langs:checked').length;
295 console.log("*** search all checked = " + search_all_checked);
296
297 if (q_text === "") {
298 $('.search-in-progress').css("cursor","auto");
299 alert("No query term entered");
300 return;
301 }
302
303 arg_q = expand_query_field_and_boolean(q_text,langs_with_pos,langs_without_pos,search_all_checked);
304
305 if (arg_q == "") {
306 $('.search-in-progress').css("cursor","auto");
307 alert("No languages selected");
308 return;
309 }
310
311
312 // Example search on one of the htrc-full-ef fields is:
313 // q=en_NOUN_htrctoken:farming
314
315 store_search_args = { q: arg_q, indent: arg_indent, wt: arg_wt, start: arg_start, rows: arg_rows };
316
317 if (group_by_vol_checked) {
318 store_search_args.sort="id asc";
319 }
320
321
322 $.ajax({
323 type: 'GET',
324 url: store_search_action,
325 data: store_search_args,
326 dataType: 'json',
327 success: show_results,
328 error: ajax_error
329 });
330
331}
332
333function generate_pos_langs()
334{
335 var pos_checkbox = [
336 { pos:"VERB", label:"Verbs", tooltip:"Verbs (all tenses and modes)" },
337 { pos:"NOUN", label:"Nouns", tooltip:"Nouns (common and proper)" },
338 { pos:"ADJ", label:"Adjectives", tooltip: null },
339 { pos:"ADV", label:"Adverbs", tooltip: null },
340 { pos:"ADP", label:"Adpositions", tooltip:"Adpositions (prepositions and postpositions)" },
341 { pos:"CONJ", label:"Conjunctions",tooltip: null },
342 { pos:"DET", label:"Determiners", tooltip: null },
343 { pos:"NUM", label:"Numbers", tooltip:"Cardinal numbers" },
344 { pos:"PRT", label:"Particles", tooltip:"Particles or other function words" },
345 { pos:"X", label:"Other", tooltip:"Other words, such as foreign words, typos, abbreviations"}
346 ];
347
348 var $pos_fieldsets = $('#pos-fieldsets');
349
350 for (var li=0; li<langs_with_pos.length; li++) {
351
352 var l = langs_with_pos[li];
353 var lang_full = isoLangs[l].name;
354 var lang_native_full = isoLangs[l].nativeName;
355 var opt_title = (lang_full !== lang_native_full) ? 'title="'+lang_native_full+'"' : "";
356
357 var opt_enabled = (l == "en") ? 'checked="checked"' : "";
358
359 var legend = "";
360 legend += ' <legend style="margin-bottom: 5px; padding-top: 15px;">\n';
361 legend += ' <input type="checkbox" name="'+l+'-enabled" id="'+l+'-enabled" ' + opt_enabled +'/>\n';
362 legend += ' <span ' + opt_title + '>'+lang_full+':</span>\n';
363 legend += ' </legend>\n';
364
365
366 var check_box_list = [];
367
368 for (var pi=0; pi<pos_checkbox.length; pi++) {
369 var pos_info = pos_checkbox[pi];
370 var pos = pos_info.pos;
371 var label = pos_info.label;
372 var tooltip = pos_info.tooltip;
373 var opt_tooltip = (tooltip != null) ? 'title="'+tooltip+'"' : "";
374
375 var check_box = "";
376 check_box += ' <input type="checkbox" name="'+l+'-'+pos+'-htrctoken-cb" id="'+l+'-'+pos+'-htrctoken-cb" checked="checked" />\n';
377 check_box += ' <label for="'+l+'-'+pos+'-htrctoken-cb" '+opt_tooltip+'>'+label+'</label>\n';
378
379 check_box_list.push(check_box);
380 }
381
382 var fieldset = "";
383 var opt_showhide_class = (li>0) ? 'class="show-hide-lang"' : "";
384
385 if (li==1) {
386 fieldset += '<button id="show-hide-lang">Show other languages ...</button>';
387 }
388
389 fieldset += '<fieldset ' + opt_showhide_class + '>\n';
390 fieldset += legend;
391 fieldset += ' <div id="'+l+'-pos-choice">\n';
392
393 var check_box_join = check_box_list.join('&nbsp;');
394 fieldset += check_box_join;
395
396 fieldset += ' </div>\n';
397 fieldset += '</fieldset>\n';
398
399 $pos_fieldsets.append(fieldset);
400 $('#'+l+'-enabled').click(lang_pos_toggle);
401
402 if (l == "en") {
403 $('#en-pos-choice *').prop('disabled',false);
404 }
405 else {
406 $('#'+l+'-pos-choice *').prop('disabled',true);
407 }
408 }
409
410 show_hide_lang()
411}
412
413function show_hide_lang()
414{
415 $( "#show-hide-lang" ).click(function(event) {
416 event.preventDefault();
417 if($('.show-hide-lang:visible').length) {
418 $('.show-hide-lang').hide("slide", {direction: "up" } , 1000);
419 $('#show-hide-lang').html("Show other languages ...");
420 }
421 else {
422 $('.show-hide-lang').show("slide", {direction: "up" } , 1000);
423 $('#show-hide-lang').html("Hide other languages ...");
424 }
425 });
426}
427
428function generate_other_langs()
429{
430 // setup other languages
431 // for each 'langs_without_pos' generate HTML of the form:
432 // <input type="checkbox" name="fr-enabled" id="fr-enabled" />French
433 var $other_langs = $('#other-langs');
434
435 for (var i=0; i<langs_without_pos.length; i++) {
436 var lang = langs_without_pos[i];
437 //var labeled_checkbox = '<span style="white-space:nowrap;">\n';
438 var labeled_checkbox = '<nobr>';
439
440 labeled_checkbox += '<input type="checkbox" name="'+lang+'-enabled" id="'+lang+'-enabled" />';
441 /*
442 if (lang === "zh-cn") {
443 console.log("Mapping zh-cn => zh");
444 lang = "zh";
445 }
446 if (lang === "zh-tw") {
447 console.log("Mapping zh-tw => zh");
448 lang = "zh";
449 }
450*/
451 var lang_full = isoLangs[lang].name;
452 var lang_native_full = isoLangs[lang].nativeName;
453 var opt_title = (lang_full !== lang_native_full) ? 'title="'+lang_native_full+'"' : "";
454
455 labeled_checkbox += '<label for="'+lang+'-enabled" style="padding-left: 5px; padding-right: 10px;" ' + opt_title + '>'+lang_full+'</label>';
456
457 labeled_checkbox += '</nobr> ';
458
459 $other_langs.append(labeled_checkbox);
460
461 }
462}
463
464$(function() {
465 generate_pos_langs();
466
467 generate_other_langs();
468
469 if ($('#search-submit').length>0) {
470 $('#search-submit').click(submit_action);
471 }
472
473});
Note: See TracBrowser for help on using the repository browser.