/*---------------------------------------------------------------------------- * JavaScript for webhelp search *---------------------------------------------------------------------------- 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 */ //string initialization var htmlfileList = "htmlFileInfoList.js"; var htmlfileinfoList = "htmlFileInfoList.js"; var useCJKTokenizing = false; var w = new Object(); var scoring = new Object(); var searchTextField = ''; var no = 0; var noWords = 0; var partialSearch = "<font class=\"highlightText\">There is no page containing all the search terms.<br>Partial results:</font>"; var warningMsg = '<div style="padding: 5px;margin-right:5px;;background-color:#FFFF00;">'; warningMsg+='<b>Please note that due to security settings, Google Chrome does not highlight'; warningMsg+=' the search results in the right frame.</b><br>'; warningMsg+='This happens only when the WebHelp files are loaded from the local file system.<br>'; warningMsg+='Workarounds:'; warningMsg+='<ul>'; warningMsg+='<li>Try using another web browser.</li>'; warningMsg+='<li>Deploy the WebHelp files on a web server.</li>'; warningMsg+='</div>'; txt_filesfound = 'Results'; txt_enter_at_least_1_char = "You must enter at least one character."; txt_enter_more_than_10_words = "Only first 10 words will be processed."; txt_browser_not_supported = "Your browser is not supported. Use of Mozilla Firefox is recommended."; txt_please_wait = "Please wait. Search in progress..."; txt_results_for = "Results for: "; /* This function verify the validity of search input by the user Cette fonction verifie la validite de la recherche entrre par l utilisateur */ function Verifie(searchForm) { // Check browser compatibility if (navigator.userAgent.indexOf("Konquerer") > -1) { alert(txt_browser_not_supported); return; } searchTextField = trim(document.searchForm.textToSearch.value); searchTextField = searchTextField.replace(/['"]/g,''); var expressionInput = searchTextField; $.cookie('textToSearch', expressionInput); if (expressionInput.length < 1) { // expression is invalid alert(txt_enter_at_least_1_char); // reactive la fenetre de search (utile car cadres) document.searchForm.textToSearch.focus(); } else { var splitSpace = searchTextField.split(" "); var splitWords = []; for (var i = 0 ; i < splitSpace.length ; i++) { var splitDot = splitSpace[i].split("."); if(!(splitDot.length == 1)){ splitWords.push(splitSpace[i]); } for (var i1 = 0; i1 < splitDot.length; i1++) { var splitColon = splitDot[i1].split(":"); for (var i2 = 0; i2 < splitColon.length; i2++) { var splitDash = splitColon[i2].split("-"); for (var i3 = 0; i3 < splitDash.length; i3++) { if (splitDash[i3].split("").length > 0) { splitWords.push(splitDash[i3]); } } } } } noWords = splitWords; if (noWords.length > 9){ // Allow to search maximum 10 words alert(txt_enter_more_than_10_words); expressionInput = ''; for (var x = 0 ; x < 10 ; x++){ expressionInput = expressionInput + " " + noWords[x]; } Effectuer_recherche(expressionInput); document.searchForm.textToSearch.focus(); } else { // Effectuer la recherche expressionInput = ''; for (var x = 0 ; x < noWords.length ; x++) { expressionInput = expressionInput + " " + noWords[x]; } Effectuer_recherche(expressionInput); // reactive la fenetre de search (utile car cadres) document.searchForm.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) { /* 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 = ""; // -------------------------------------- // Begin Thu's patch /*nqu: expressionInput, la recherche est lower cased, plus remplacement des char speciaux*/ //The original replacement expression is: //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_"); //The above expression was error prone because it did not deal with words that have a . as part of the word correctly, for example, document.txt //Do not automatically replace a . with a space 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_"); //If it ends with a period, replace it with a space searchFor = searchFor.replace(/[.]$/,""); // End Thu's Patch // ------------------------------------------ searchFor = searchFor.replace(/ +/g, " "); searchFor = searchFor.replace(/ $/, "").replace(/^ /, ""); wordsList = searchFor.split(" "); wordsList.sort(); //set the tokenizing method useCJKTokenizing = typeof indexerLanguage != "undefined" && (indexerLanguage == "zh" || indexerLanguage == "ja" || indexerLanguage == "ko"); //If Lucene CJKTokenizer was used as the indexer, then useCJKTokenizing will be true. Else, do normal tokenizing. // 2-gram tokenizinghappens in CJKTokenizing, //If doStem then make tokenize with Stemmer var finalArray; if (doStem){ if(useCJKTokenizing){ finalWordsList = cjkTokenize(wordsList); finalArray = finalWordsList; } else { finalWordsList = tokenize(wordsList); finalArray = finalWordsList; } } else if(useCJKTokenizing){ finalWordsList = cjkTokenize(wordsList); finalArray = finalWordsList; } else{ //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. */ var tempTab = new Array(); // --------------------------------------- // Thu's patch //Do not use associative array in for loop, for example: //for(var t in finalWordsList) //it causes errors when finalWordList contains //stemmed words such as: kei from the stemmed word: key for(var t=0;t<finalWordsList.length;++t){ var aWord=finalWordsList[t]; //w is a Map like Object, use the current word in finalWordList as the key if(w[aWord] == undefined){ txt_wordsnotfound += aWord + " "; } else{ tempTab.push(aWord); } } finalWordsList = tempTab; //Check all the inputs to see if the root words are in the finalWordsList, if not add them there var inputs = expressionInput.split(' '); // Thu's Patch // ------------------------------------------- txt_wordsnotfound = expressionInput; finalWordsList = removeDuplicate(finalWordsList); } if (finalWordsList.length) { //search 'and' and 'or' one time fileAndWordList = SortResults(finalWordsList); if (fileAndWordList == undefined){ var cpt = 0; } else { var cpt = fileAndWordList.length; var maxNumberOfWords = fileAndWordList[0][0].motsnb; } if (cpt > 0){ var searchedWords = noWords.length; var foundedWords = fileAndWordList[0][0].motslisteDisplay.split(",").length; //console.info("search : " + noWords.length + " found : " + fileAndWordList[0][0].motslisteDisplay.split(",").length); if (searchedWords != foundedWords){ linkTab.push(partialSearch); } } for (var i = 0; i < cpt; i++) { var hundredProcent = fileAndWordList[i][0].scoring + 100 * fileAndWordList[i][0].motsnb; var ttScore_first = fileAndWordList[i][0].scoring; var numberOfWords = fileAndWordList[i][0].motsnb; 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 (t in fileAndWordList[i]) { //linkTab.push("<li><a href=\"../"+fl[fileAndWordList[i][t].filenb]+"\">"+fl[fileAndWordList[i][t].filenb]+"</a></li>"); var ttInfo = fileAndWordList[i][t].filenb; // Get scoring var ttScore = fileAndWordList[i][t].scoring; var tempInfo = fil[ttInfo]; 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); // toc.html will not be displayed on search result if (tempPath == 'toc.html'){ continue; } /* //file:///home/kasun/docbook/WEBHELP/webhelp-draft-output-format-idea/src/main/resources/web/webhelp/installation.html var linkString = "<li><a href=" + tempPath + ">" + tempTitle + "</a>"; // var linkString = "<li><a href=\"installation.html\">" + tempTitle + "</a>"; */ var split = fileAndWordList[i][t].motsliste.split(","); // var splitedValues = expressionInput.split(" "); // var finalArray = split.concat(splitedValues); arrayString = 'Array('; for(var x in finalArray){ if (finalArray[x].length > 2 || useCJKTokenizing){ arrayString+= "'" + finalArray[x] + "',"; } } arrayString = arrayString.substring(0,arrayString.length - 1) + ")"; var idLink = 'foundLink' + no; var linkString = '<li><a id="' + idLink + '" href="' + tempPath + '" class="foundResult">' + tempTitle + '</a>'; var starWidth = (ttScore * 100/ hundredProcent)/(ttScore_first/hundredProcent) * (numberOfWords/maxNumberOfWords); starWidth = starWidth < 10 ? (starWidth + 5) : starWidth; // Keep the 5 stars format if (starWidth > 85){ starWidth = 85; } /* var noFullStars = Math.ceil(starWidth/17); var fullStar = "curr"; var emptyStar = ""; if (starWidth % 17 == 0){ // am stea plina } else { } console.info(noFullStars); */ // Also check if we have a valid description if ((tempShortdesc != "null" && tempShortdesc != '...')) { linkString += "\n<div class=\"shortdesclink\">" + tempShortdesc + "</div>"; } linkString += "</li>"; // Add rating values for scoring at the list of matches linkString += "<div id=\"rightDiv\">"; linkString += "<div id=\"star\">"; //linkString += "<div style=\"color: rgb(136, 136, 136);\" id=\"starUser0\" class=\"user\">" // + ((ttScore * 100/ hundredProcent)/(ttScore_first/hundredProcent)) * 1 + "</div>"; linkString += "<ul id=\"star0\" class=\"star\">"; linkString += "<li id=\"starCur0\" class=\"curr\" style=\"width: " + starWidth + "px;\"></li>"; linkString += "</ul>"; linkString += "<br style=\"clear: both;\">"; linkString += "</div>"; linkString += "</div>"; //linkString += '<b>Rating: ' + ttScore + '</b>'; linkTab.push(linkString); no++; } 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>" + localeresource.search_no_results + " <span class=\"searchExpression\">" + txt_wordsnotfound + "</span>" + "</p>"; } // Verify if the browser is Google Chrome and the WebHelp is used on a local machine // If browser is Google Chrome and WebHelp is used on a local machine a warning message will appear // Highlighting will not work in this conditions. There is 2 workarounds if (verifyBrowser()){ document.getElementById('searchResults').innerHTML = results; } else { document.getElementById('searchResults').innerHTML = warningMsg + results; } } // Verify if the stemmed word is aproximately the same as the searched word function verifyWord(word, arr){ for (var i = 0 ; i < arr.length ; i++){ if (word[0] == arr[i][0] && word[1] == arr[i][1] //&& word[2] == arr[i][2] ){ return true; } } return false; } // Look for elements that start with searchedValue. function wordsStartsWith(searchedValue){ var toReturn = ''; for (var sv in w){ if (searchedValue.length < 3){ continue; } else { if (sv.toLowerCase().indexOf(searchedValue.toLowerCase()) == 0){ toReturn+=sv + ","; } } } return toReturn.length > 0 ? toReturn : undefined; } 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 // ------------------------------------------------- // Thu's patch for(var j=0;j<wordsList.length;++j){ var word = wordsList[j]; var originalWord=word; if(typeof stemmer != "undefined" ){ var stemmedWord=stemmer(word); if(w[stemmedWord]!=undefined){ stemQueryMap[stemmer(word)] = word; } else{ stemQueryMap[originalWord]=originalWord; } } else { if(w[word]!=undefined){ stemQueryMap[word] = word; } else{ stemQueryMap[originalWord]=originalWord; } } } //stemmedWordsList is the stemmed list of words separated by spaces. for (var t=0;t<wordsList.length;++t) { 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]); if(w[stemWord]!=undefined){ stemmedWordsList.push(stemWord); } else{ stemmedWordsList.push(cleanwordsList[i]); } } // End Thu's patch // ------------------------------------------- } 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 || mots[0].length == 0) { return null; } // In generated js file we add scoring at the end of the word // Example word1*scoringForWord1,word2*scoringForWord2 and so on // Split after * to obtain the right values var scoringArr = Array(); for (var t in mots) { // get the list of the indices of the files. var listNumerosDesFicStr = w[mots[t].toString()]; if (listNumerosDesFicStr != undefined) { //alert ("listNumerosDesFicStr "+listNumerosDesFicStr); var tab = listNumerosDesFicStr.split(","); //for each file (file's index): for (var t2 in tab) { var tmp = ''; var idx = ''; var temp = tab[t2].toString(); if (temp.indexOf('*') != -1) { idx = temp.indexOf('*'); tmp = temp.substring(idx + 3, temp.length); temp = temp.substring(0, idx); } scoringArr.push(tmp); if (fileAndWordList[temp] == undefined) { fileAndWordList[temp] = "" + mots[t]; } else { fileAndWordList[temp] += "," + mots[t]; } //console.info("fileAndWordList[" + temp + "]=" + fileAndWordList[temp] + " : " + tmp); } } } var fileAndWordListValuesOnly = new Array(); // sort results according to values var temptab = new Array(); finalObj = new Array(); for (t in fileAndWordList) { finalObj.push(new newObj(t,fileAndWordList[t])); } if ( finalObj.length == 0 ) { // None of the queried words are not in the index (stemmed or not) return null; } finalObj = removeDerivates(finalObj); for (t in finalObj) { tab = finalObj[t].wordList.split(','); var tempDisplay = new Array(); for (var x in tab) { if(stemQueryMap[tab[x]] != undefined && doStem){ 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(", "); var index; for (x in fileAndWordList) { if (x === finalObj[t].filesNo) { index = x; break; } } var scoring = findRating(fileAndWordList[index], index); temptab.push(new resultPerFile(finalObj[t].filesNo, finalObj[t].wordList, tab.length, tempDispString, scoring)); fileAndWordListValuesOnly.push(finalObj[t].wordList); } fileAndWordListValuesOnly = unique(fileAndWordListValuesOnly); fileAndWordListValuesOnly = fileAndWordListValuesOnly.sort(compare_nbMots); var listToOutput = new Array(); for (var fawlvoIdx in fileAndWordListValuesOnly) { for (t in temptab) { if (temptab[t].motsliste == fileAndWordListValuesOnly[fawlvoIdx]) { if (listToOutput[fawlvoIdx] == undefined) { listToOutput[fawlvoIdx] = new Array(temptab[t]); } else { listToOutput[fawlvoIdx].push(temptab[t]); } } } } // Sort results by scoring, descending on the same group for (var ltoIdx in listToOutput) { listToOutput[ltoIdx].sort(function(a, b){ return b.scoring - a.scoring; }); } // If we have groups with same number of words, // will sort groups by higher scoring of each group for (var i = 0; i < listToOutput.length - 1; i++) { for (var j = i + 1; j < listToOutput.length; j++) { if (listToOutput[i][0].motsnb < listToOutput[j][0].motsnb || (listToOutput[i][0].motsnb == listToOutput[j][0].motsnb && listToOutput[i][0].scoring < listToOutput[j][0].scoring) ) { var x = listToOutput[i]; listToOutput[i] = listToOutput[j]; listToOutput[j] = x; } } } return listToOutput; } // Remove derivates words from the list of words function removeDerivates(obj){ var toResultObject = new Array(); for (i in obj){ var filesNo = obj[i].filesNo; var wordList = obj[i].wordList; var wList = wordList.split(","); var searchedWords = searchTextField.toLowerCase().split(" "); for (var k = 0 ; k < searchedWords.length ; k++){ for (var j = 0 ; j < wList.length ; j++){ if (wList[j].startsWith(searchedWords[k])){ wList[j] = searchedWords[k]; } } } wList = removeDuplicate(wList); var recreateList = ''; for(var x in wList){ recreateList+=wList[x] + ","; } recreateList = recreateList.substr(0, recreateList.length - 1); toResultObject.push(new newObj(filesNo, recreateList)); } return toResultObject; } function newObj(filesNo, wordList){ this.filesNo = filesNo; this.wordList = wordList; } // Add a new parameter. Scoring. function resultPerFile(filenb, motsliste, motsnb, motslisteDisplay, scoring, group) { //10 - spring,time - 2 - spring, time - 55 - 3 this.filenb = filenb; this.motsliste = motsliste; this.motsnb = motsnb; this.motslisteDisplay= motslisteDisplay; this.scoring = scoring; } function findRating(words, nr){ var sum = 0; var xx = words.split(','); for (jj = 0 ; jj < xx.length ; jj++){ var wrd = w[xx[jj]].split(','); for (var ii = 0 ; ii < wrd.length ; ii++){ var wrdno = wrd[ii].split('*'); if (wrdno[0] == nr){ sum+=parseInt(wrdno[1]); } } } return sum; } 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); } // return false if browser is Google Chrome and WebHelp is used on a local machine, not a web server function verifyBrowser(){ var returnedValue = true; var browser = BrowserDetect.browser; var addressBar = window.location.href; if (browser == 'Chrome' && addressBar.indexOf('file://') === 0){ returnedValue = false; } return returnedValue; } // Remove duplicate values from an array function removeDuplicate(arr) { var r = new Array(); o:for(var i = 0, n = arr.length; i < n; i++) { for(var x = 0, y = r.length; x < y; x++) { if(r[x]==arr[i]) continue o; } r[r.length] = arr[i]; } return r; } // Create startsWith method String.prototype.startsWith = function(str) { return (this.match("^"+str)==str); } function trim(str, chars) { return ltrim(rtrim(str, chars), chars); } function ltrim(str, chars) { chars = chars || "\\s"; return str.replace(new RegExp("^[" + chars + "]+", "g"), ""); } function rtrim(str, chars) { chars = chars || "\\s"; return str.replace(new RegExp("[" + chars + "]+$", "g"), ""); }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 26953 | Paul Allen | Move //guest/perforce_software/p4convert to //guest/perforce_software/p4convert/main | ||
//guest/perforce_software/p4convert/docs/docbook-xsl-ns-1.78.1/webhelp/template/search/nwSearchFnt.js | |||||
#2 | 14806 | Paul Allen | Update docs and add +w. | ||
#1 | 13920 | Paul Allen | copy part 2 (no errors) | ||
//guest/paul_allen/p4convert-maven/docs/docbook-xsl-ns-1.78.1/webhelp/template/search/nwSearchFnt.js | |||||
#1 | 13895 | Paul Allen | Copying using p4convert-docbook | ||
//guest/perforce_software/doc_build/main/docbook-xsl-ns-1.78.1/webhelp/template/search/nwSearchFnt.js | |||||
#1 | 12728 | eedwards |
Upgrade ANT doc build infrastructure to assemble PDFs: - remove non-namespaced DocBook source and add namespaced DocBook source. - add Apache FOP 1.1 - copy fonts, images, XSL into _build, establishing new asset structure. The original structure remains until all guides using it can be upgraded, and several other issues can be resolved. - updated build.xml to allow for per-target build properties. - upgraded the P4SAG to use the new infrastructure. - tweaked admonition presentation in PDFs to remove admonition graphics, and resemble closely the presentation used in the new HTML layout, including the same colors. With these changes, building PDFs involves using a shell, navigating into the guide's directory (just P4SAG for now), and executing "ant pdf". Issues still to be resolved: - PDF generation encounters several warnings about missing fonts (bold versions of Symbol and ZapfDingbats), and a couple of locations where the page content exceeds the defined content area. - Due to issues within Apache FOP, PDF generation emits a substantial amount of output that is not easily suppressed without losing important warning information. - Apache FOP's interface to ANT does not expose a way to set the font base directory. The current configuration does work under Mac OSX, but further testing on Windows will need to be done to determine if the relative paths defined continue to work. The workaround is for Windows users to customize the fop-config.xml to provide absolute system paths to the required fonts. - HTML generation needs further browser testing, and exhibits broken navigation on iOS browsers within the TOC sidebar. - A number of PDF and HTML presentation tweaks still need to be made, for example: sidebars, gui* DocBook tags, whitespace, section separation, etc. |