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

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

Separate off stream query page

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