/*---------------------------------------------------------------------------- * JavaScript for webhelp search * updated by neodoc *---------------------------------------------------------------------------- This file is part of the webhelpsearch plugin for DocBook WebHelp Copyright (c) 2007-2008 NexWave Solutions All Rights Reserved. www.nexwave.biz Nadege Quaine http://kasunbg.blogspot.com/ Kasun Gajasinghe */ /* global txt_browser_not_supported, txt_enter_at_least_1_char, indexerLanguage, w, txt_results_for, fil, txt_no_results_for */ //string initialization var htmlfileList = "htmlFileList.js"; var htmlfileinfoList = "htmlFileInfoList.js"; var useCJKTokenizing = false; /* Cette fonction verifie la validite de la recherche entrre par l utilisateur */ function Verifie(ditaSearch_Form) { // Check browser compatibitily if (navigator.userAgent.indexOf("Konquerer") > -1) { alert(txt_browser_not_supported); return; } var expressionInput = document.ditaSearch_Form.textToSearch.value; //Set a cookie to store the searched keywords $.cookie('textToSearch', ""); if (expressionInput.length < 1) { // expression is invalid alert(txt_enter_at_least_1_char); // reactive la fenetre de search (utile car cadres) document.ditaSearch_Form.textToSearch.focus(); } else { // Effectuer la recherche Effectuer_recherche(expressionInput); // reactive la fenetre de search (utile car cadres) document.ditaSearch_Form.textToSearch.focus(); } } var stemQueryMap = new Array(); // A hashtable which maps stems to query words /* This function parses the search expression, loads the indices and displays the results*/ function Effectuer_recherche(expressionInput) { var expressionInputMem = expressionInput ; // â à ç ë é ê è ï î ô û ù expressionInput = expressionInput.replace( /â/g , 'a'); expressionInput = expressionInput.replace( /à/g , 'a'); expressionInput = expressionInput.replace( /ç/g , 'c'); expressionInput = expressionInput.replace( /ë/g , 'e'); expressionInput = expressionInput.replace( /é/g , 'e'); expressionInput = expressionInput.replace( /è/g , 'e'); expressionInput = expressionInput.replace( /ê/g , 'e'); expressionInput = expressionInput.replace( /ï/g , 'i'); expressionInput = expressionInput.replace( /î/g , 'i'); expressionInput = expressionInput.replace( /ô/g , 'o'); expressionInput = expressionInput.replace( /û/g , 'u'); expressionInput = expressionInput.replace( /ù/g , 'u'); /* Display a waiting message */ //DisplayWaitingMessage(); /*data initialisation*/ var searchFor = ""; // expression en lowercase et sans les caracte res speciaux //w = new Object(); // hashtable, key=word, value = list of the index of the html files scriptLetterTab = new Scriptfirstchar(); // Array containing the first letter of each word to look for var wordsList = new Array(); // Array with the words to look for var finalWordsList = new Array(); // Array with the words to look for after removing spaces var linkTab = new Array(); var fileAndWordList = new Array(); var txt_wordsnotfound = ""; /*nqu: expressionInput, la recherche est lower cased, plus remplacement des char speciaux*/ searchFor = expressionInput.toLowerCase().replace(/<\//g, "_st_").replace(/\$_/g, "_di_").replace(/\.|%2C|%3B|%21|%3A|@|\/|\*/g, " ").replace(/(%20)+/g, " ").replace(/_st_/g, "</").replace(/_di_/g, "%24_"); searchFor = searchFor.replace(/ +/g, " "); searchFor = searchFor.replace(/ $/, "").replace(/^ /, ""); wordsList = searchFor.split(" "); wordsList.sort(); //set the tokenizing method if(typeof indexerLanguage !== "undefined" && (indexerLanguage==="zh" || indexerLanguage==="ja" ||indexerLanguage==="ko")){ useCJKTokenizing=true; } else { useCJKTokenizing=false; } //If Lucene CJKTokenizer was used as the indexer, then useCJKTokenizing will be true. Else, do normal tokenizing. // 2-gram tokenizinghappens in CJKTokenizing, if(useCJKTokenizing){ finalWordsList = cjkTokenize(wordsList); } else { finalWordsList = tokenize(wordsList); } //load the scripts with the indices: the following lines do not work on the server. To be corrected /*if (IEBrowser) { scriptsarray = loadTheIndexScripts (scriptLetterTab); } */ /** * Compare with the indexed words (in the w[] array), and push words that are in it to tempTab. */ $.cookie('textToSearch', expressionInputMem); var tempTab = new Array(); // console.log("finalWordsList : " ); // console.log( finalWordsList); for(let wordToSearch in finalWordsList){ var flagAdd = false; for(let word in w){ var wordNew = "" ; wordNew = word.replace( /â/ , 'a'); wordNew = wordNew.replace( /à/g , 'a'); wordNew = wordNew.replace( /ç/g , 'c'); wordNew = wordNew.replace( /ë/g , 'e'); wordNew = wordNew.replace( /é/g , 'e'); wordNew = wordNew.replace( /è/g , 'e'); wordNew = wordNew.replace( /ê/g , 'e'); wordNew = wordNew.replace( /ï/g , 'i'); wordNew = wordNew.replace( /î/g , 'i'); wordNew = wordNew.replace( /ô/g , 'o'); wordNew = wordNew.replace( /û/g , 'u'); wordNew = wordNew.replace( /ù/g , 'u'); if( wordNew.includes(finalWordsList[wordToSearch]) ) { // console.log("word : "+word); // console.log('word.includes("'+ finalWordsList[wordToSearch]+'")'); // console.log('tempTab'); // console.log(tempTab); // var cookie = $.cookie('textToSearch') // if (!cookie.includes(word) ){ // if (cookie.length==0) // cookie = word; // else // cookie += " " + word; // $.cookie('textToSearch', cookie); // flagAdd = true; // } if (!tempTab.includes(word)){ tempTab.push(word.trim()); flagAdd = true; } } } if(!flagAdd) txt_wordsnotfound += finalWordsList[wordToSearch] + " "; } // var tempTab = new Array(); // for (var t in finalWordsList) { // if (w[finalWordsList[t].toString()] == undefined) { // txt_wordsnotfound += finalWordsList[t] + " "; // } else { // tempTab.push(finalWordsList[t]); // } // } finalWordsList = tempTab; if (finalWordsList.length) { //search 'and' and 'or' one time fileAndWordList = SortResults(finalWordsList); var cpt = fileAndWordList.length; // console.log('finalWordsList : '); // console.log(finalWordsList); for (var i = cpt - 1; i >= 0; i--) { if (fileAndWordList[i] !== undefined) { linkTab.push("<p>" + txt_results_for + " " + "<span class=\"searchExpression\">" + fileAndWordList[i][0].motslisteDisplay + "</span>" + "</p>"); linkTab.push("<ul class='searchresult'>"); for (let t in fileAndWordList[i]) { //DEBUG: alert(": "+ fileAndWordList[i][t].filenb+" " +fileAndWordList[i][t].motsliste); //linkTab.push("<li><a href=\"../"+fl[fileAndWordList[i][t].filenb]+"\">"+fl[fileAndWordList[i][t].filenb]+"</a></li>"); var tempInfo = fil[fileAndWordList[i][t].filenb]; var pos1 = tempInfo.indexOf("@@@"); var pos2 = tempInfo.lastIndexOf("@@@"); var tempPath = tempInfo.substring(0, pos1); var tempTitle = tempInfo.substring(pos1 + 3, pos2); var tempShortdesc = tempInfo.substring(pos2 + 3, tempInfo.length); //file:///home/kasun/docbook/WEBHELP/webhelp-draft-output-format-idea/src/main/resources/web/webhelp/installation.html var linkString = "<li><a href=" + tempPath + " class='searchResultLink'>" + tempTitle + "</a>"; // var linkString = "<li><a href=\"installation.html\">" + tempTitle + "</a>"; if ((tempShortdesc !== "null")) { linkString += "\n<div class=\"shortdesclink\">" + tempShortdesc + "</div>"; } linkString += "</li>"; linkTab.push(linkString); } linkTab.push("</ul>"); } } } var results = ""; if (linkTab.length > 0) { /*writeln ("<p>" + txt_results_for + " " + "<span class=\"searchExpression\">" + cleanwordsList + "</span>" + "<br/>"+"</p>");*/ results = "<p>"; //write("<ul class='searchresult'>"); for (t in linkTab) { results += linkTab[t].toString(); } results += "</p>"; } else { results = "<p>" + txt_no_results_for + "<span class=\"searchExpression\">" + txt_wordsnotfound + "</span>" + "</p>"; } //alert(results); document.getElementById('searchResults').innerHTML = results; addHighligthToResults() ; //comes from nwSearchFnt.js } function tokenize(wordsList){ var stemmedWordsList = new Array(); // Array with the words to look for after removing spaces var cleanwordsList = new Array(); // Array with the words to look for for(var j in wordsList){ var word = wordsList[j]; if(typeof stemmer !== "undefined" ){ stemQueryMap[stemmer(word)] = word; } else { stemQueryMap[word] = word; } } //stemmedWordsList is the stemmed list of words separated by spaces. for (var t in wordsList) { wordsList[t] = wordsList[t].replace(/(%22)|^-/g, ""); if (wordsList[t] !== "%20") { scriptLetterTab.add(wordsList[t].charAt(0)); cleanwordsList.push(wordsList[t]); } } if(typeof stemmer !== "undefined" ){ //Do the stemming using Porter's stemming algorithm for (var i = 0; i < cleanwordsList.length; i++) { var stemWord = stemmer(cleanwordsList[i]); stemmedWordsList.push(stemWord); } } else { stemmedWordsList = cleanwordsList; } return stemmedWordsList; } //Invoker of CJKTokenizer class methods. function cjkTokenize(wordsList){ var allTokens= new Array(); var notCJKTokens= new Array(); var j=0; for(j=0;j<wordsList.length;j++){ var word = wordsList[j]; if(getAvgAsciiValue(word) < 127){ notCJKTokens.push(word); } else { var tokenizer = new CJKTokenizer(word); var tokensTmp = tokenizer.getAllTokens(); allTokens = allTokens.concat(tokensTmp); } } allTokens = allTokens.concat(tokenize(notCJKTokens)); return allTokens; } //A simple way to determine whether the query is in english or not. function getAvgAsciiValue(word){ var tmp = 0; var num = word.length < 5 ? word.length:5; for(var i=0;i<num;i++){ if(i===5) break; tmp += word.charCodeAt(i); } return tmp/num; } //CJKTokenizer function CJKTokenizer(input){ this.input = input; this.offset=-1; this.tokens = new Array(); this.incrementToken = incrementToken; this.tokenize = tokenize; this.getAllTokens = getAllTokens; this.unique = unique; function incrementToken(){ if(this.input.length - 2 <= this.offset){ // console.log("false "+offset); return false; } else { this.offset+=1; return true; } } function tokenize(){ //document.getElementById("content").innerHTML += x.substring(offset,offset+2)+"<br>"; return this.input.substring(this.offset,this.offset+2); } function getAllTokens(){ while(this.incrementToken()){ var tmp = this.tokenize(); this.tokens.push(tmp); } return this.unique(this.tokens); // document.getElementById("content").innerHTML += tokens+" "; // document.getElementById("content").innerHTML += "<br>dada"+sortedTokens+" "; // console.log(tokens.length+"dsdsds"); /*for(i=0;i<tokens.length;i++){ console.log(tokens[i]); var ss = tokens[i] == sortedTokens[i]; // document.getElementById("content").innerHTML += "<br>dada"+un[i]+"- "+stems[i]+" "+ ss; document.getElementById("content").innerHTML += "<br>"+sortedTokens[i]; }*/ } function unique(a) { var r = new Array(); o:for(var i = 0, n = a.length; i < n; i++) { for(var x = 0, y = r.length; x < y; x++) { if(r[x]===a[i]) continue o; } r[r.length] = a[i]; } return r; } } /* Scriptfirstchar: to gather the first letter of index js files to upload */ function Scriptfirstchar() { this.strLetters = ""; this.add = addLettre; } function addLettre(caract) { if (this.strLetters === 'undefined') { this.strLetters = caract; } else if (this.strLetters.indexOf(caract) < 0) { this.strLetters += caract; } return 0; } /* end of scriptfirstchar */ /*main loader function*/ /*tab contains the first letters of each word looked for*/ function loadTheIndexScripts(tab) { //alert (tab.strLetters); var scriptsarray = new Array(); for (var i = 0; i < tab.strLetters.length; i++) { scriptsarray[i] = "..\/search" + "\/" + tab.strLetters.charAt(i) + ".js"; } // add the list of html files i++; scriptsarray[i] = "..\/search" + "\/" + htmlfileList; //debug for (var t in scriptsarray) { //alert (scriptsarray[t]); } tab = new ScriptLoader(); for (t in scriptsarray) { tab.add(scriptsarray[t]); } tab.load(); //alert ("scripts loaded"); return (scriptsarray); } /* ScriptLoader: to load the scripts and wait that it's finished */ function ScriptLoader() { this.cpt = 0; this.scriptTab = new Array(); this.add = addAScriptInTheList; this.load = loadTheScripts; this.onScriptLoaded = onScriptLoadedFunc; } function addAScriptInTheList(scriptPath) { this.scriptTab.push(scriptPath); } function loadTheScripts() { var script; var head; head = document.getElementsByTagName('head').item(0); //script = document.createElement('script'); for (var el in this.scriptTab) { //alert (el+this.scriptTab[el]); script = document.createElement('script'); script.src = this.scriptTab[el]; script.type = 'text/javascript'; script.defer = false; head.appendChild(script); } } function onScriptLoadedFunc(e) { e = e || window.event; var target = e.target || e.srcElement; var isComplete = true; if (typeof target.readyState !== undefined) { isComplete = (target.readyState === "complete" || target.readyState === "loaded"); } if (isComplete) { ScriptLoader.cpt++; if (ScriptLoader.cpt === ScriptLoader.scripts.length) { ScriptLoader.onLoadComplete(); } } } /* function onLoadComplete() { alert("loaded !!"); } */ /* End of scriptloader functions */ // Array.unique( strict ) - Remove duplicate values function unique(tab) { var a = new Array(); var i; var l = tab.length; if (tab[0] !== undefined) { a[0] = tab[0]; } else { return -1; } for (i = 1; i < l; i++) { if (indexof(a, tab[i], 0) < 0) { a.push(tab[i]); } } return a; } function indexof(tab, element, begin) { for (var i = begin; i < tab.length; i++) { if (tab[i] === element) { return i; } } return -1; } /* end of Array functions */ /* Param: mots= list of words to look for. This function creates an hashtable: - The key is the index of a html file which contains a word to look for. - The value is the list of all words contained in the html file. Return value: the hashtable fileAndWordList */ function SortResults(mots) { var fileAndWordList = new Object(); if (mots.length === 0) { return null; } mots.forEach( function( mot ) { if (typeof mot === "string"){ // get the list of the indices of the files. var listNumerosDesFicStr = w[ mot.toString() ]; if ( typeof listNumerosDesFicStr !== "undefined"){ var tab = listNumerosDesFicStr.split(","); for (let t2 in tab) { var temp = tab[t2].toString(); if (fileAndWordList[temp] === undefined) { fileAndWordList[temp] = "" + mot; } else { fileAndWordList[temp] += "," + mot; } }}} }); var fileAndWordListValuesOnly = new Array(); // sort results according to values var temptab = new Array(); for (let t in fileAndWordList) { tab = fileAndWordList[t].split(','); var tempDisplay = new Array(); for (var x in tab) { if(typeof stemQueryMap[tab[x]] !== "undefined"){ tempDisplay.push(stemQueryMap[tab[x]]); //get the original word from the stem word. } else { tempDisplay.push(tab[x]); //no stem is available. (probably a CJK language) } } var tempDispString = tempDisplay.join(", "); temptab.push(new resultPerFile(t, fileAndWordList[t], tab.length, tempDispString)); fileAndWordListValuesOnly.push(fileAndWordList[t]); } fileAndWordListValuesOnly = unique(fileAndWordListValuesOnly); fileAndWordListValuesOnly = fileAndWordListValuesOnly.sort(compare_nbMots); var listToOutput = new Array(); for (var j in fileAndWordListValuesOnly) { for (t in temptab) { if (temptab[t].motsliste === fileAndWordListValuesOnly[j]) { if (typeof listToOutput[j] === "undefined") { listToOutput[j] = new Array(temptab[t]); } else { listToOutput[j].push(temptab[t]); } } } } return listToOutput; } function resultPerFile(filenb, motsliste, motsnb, motslisteDisplay) { this.filenb = filenb; this.motsliste = motsliste; this.motsnb = motsnb; this.motslisteDisplay= motslisteDisplay; } function compare_nbMots(s1, s2) { var t1 = s1.split(','); var t2 = s2.split(','); //alert ("s1:"+t1.length + " " +t2.length) if (t1.length === t2.length) { return 0; } else if (t1.length > t2.length) { return 1; } else { return -1; } //return t1.length - t2.length); } document.onreadystatechange = (function(){ if (document.readyState === "complete") { addHighligthToResults() ; } }) ; function addHighligthToResults(){ var links = document.querySelectorAll('.searchResultLink'); if (links.length===0){return;} for (var ilinks = 0; ilinks < links.length ;ilinks++ ) { links[ilinks].addEventListener("click", function (event) { event.preventDefault(); highlightCookie(this) ; }) ; } } function highlightCookie(link){ var href = link.getAttribute("href"); var li = link.parentNode ; var ul = li.parentNode ; var p = ul.previousSibling ; var span = p.querySelector('.searchExpression'); var wordList = span.innerHTML.replace(/,/g,'') ; console.log('wordList: '+wordList); document.cookie = 'highlight='+wordList; window.location = href; }