home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2005 August / PCpro_2005_08.ISO / files / firefox / ScrapBook.xpi / chrome / scrapbook.jar / content / fulltext.js < prev    next >
Encoding:
JavaScript  |  2005-06-04  |  16.1 KB  |  525 lines

  1. /**************************************************
  2. // fulltext.js
  3. // Implementation file for cache.xul, result.xul
  4. // 
  5. // Description: 
  6. // Author: Gomita
  7. // Contributors: michael-brueggemann
  8. // 
  9. // Version: 
  10. // License: see LICENSE.txt
  11. **************************************************/
  12.  
  13.  
  14.  
  15. var SBstatus;
  16. var SBstring;
  17.  
  18. var gCacheFile;
  19. var gQueryStrings  = { q : "", re : "", cs : "" };
  20. var gRegExpModifier;
  21. var gHit = 0;
  22. const gMax = 100;
  23.  
  24. var SBincludeWords = [];
  25. var SBexcludeWords = [];
  26.  
  27. var SBhighlightColors = ["#FFFF33","#66FFFF","#90FF90","#FF9999","#FF99FF"];
  28.  
  29.  
  30.  
  31.  
  32. function SB_initFT(type)
  33. {
  34.     SBstatus = document.getElementById("ScrapBookStatus");
  35.     SBstring = document.getElementById("ScrapBookString");
  36.     gCacheFile = SBcommon.getScrapBookDir().clone();
  37.     gCacheFile.append("cache.rdf");
  38.     switch ( type )
  39.     {
  40.         case 'SEARCH' : SB_execSearch(); break;
  41.         case 'CACHE'  : setTimeout(function() { SBcache.build(); }, 0); break;
  42.     }
  43. }
  44.  
  45.  
  46. function SB_execSearch()
  47. {
  48.     var QS = document.location.href.match(/result\.xul\?(.*)$/);
  49.     QS = RegExp.$1;
  50.     var QA = QS.split("&");
  51.     for ( var i = 0; i < QA.length; i++ )
  52.     {
  53.         gQueryStrings[QA[i].split("=")[0]] = QA[i].split("=")[1];
  54.     }
  55.     const TTSU = Components.classes['@mozilla.org/intl/texttosuburi;1'].getService(Components.interfaces.nsITextToSubURI);
  56.     gQueryStrings['q'] = TTSU.UnEscapeAndConvert("UTF-8", gQueryStrings['q']);
  57.  
  58.     SBRDF.init();
  59.     SCRDF.init();
  60.  
  61.  
  62.     gRegExpModifier = ( gQueryStrings['cs'] != "true" ) ? "im" : "m";
  63.  
  64.     if ( gQueryStrings['re'] != "true" )
  65.     {
  66.         var RegExpInclude = new Array();
  67.         var RegExpExclude = new Array();
  68.  
  69.         var query = gQueryStrings['q'].replace(/( |\u3000)+/g, " ");
  70.  
  71.         var quotePos1;
  72.         var quotePos2;
  73.         var quotedStr;
  74.  
  75.         while ( (quotePos1 = query.indexOf('"')) != -1 )
  76.         {
  77.             quotedStr = query.substring(quotePos1+1, query.length);
  78.             quotePos2 = quotedStr.indexOf('"');
  79.             if ( quotePos2 == -1 ) break;
  80.             quotedStr = quotedStr.substring(0, quotePos2);
  81.             var replaceStr = '"' + quotedStr + '"';
  82.             if ( quotePos1 >= 1 && query.charAt(quotePos1-1) == '-' )
  83.             {
  84.                 SBexcludeWords.push(quotedStr);
  85.                 RegExpExclude.push( new RegExp(quotedStr, gRegExpModifier) );
  86.                 replaceStr = "-" + replaceStr;
  87.             }
  88.             else if ( quotedStr.length > 0 )
  89.             {
  90.                 SBincludeWords.push(quotedStr);
  91.                 RegExpInclude.push( new RegExp(SB_escapeRegExpSpecialChars(quotedStr), gRegExpModifier) );
  92.             }
  93.             query = query.replace(replaceStr, "");
  94.         }
  95.  
  96.         query = query.replace(/ +/g, " ").split(' ');
  97.  
  98.         for ( var i=0; i<query.length; i++ )
  99.         {
  100.             var word = query[i];
  101.             if ( word.charAt(0) == '-' )
  102.             {
  103.                 word = word.substring(1, word.length);
  104.                 SBexcludeWords.push(word);
  105.                 RegExpExclude.push( new RegExp(SB_escapeRegExpSpecialChars(word), gRegExpModifier) );
  106.             }
  107.             else if ( word.length > 0 )
  108.             {
  109.                 SBincludeWords.push(word);
  110.                 RegExpInclude.push( new RegExp(SB_escapeRegExpSpecialChars(word), gRegExpModifier) );
  111.             }
  112.         }
  113.         if ( RegExpInclude.length == 0 ) return;
  114.     }
  115.  
  116.     SBservice.RDFC.Init(SCRDF.data, SBservice.RDF.GetResource("urn:scrapbook:cache"));
  117.     var ResSet = SBservice.RDFC.GetElements();
  118.     var ResCnt = SBservice.RDFC.GetCount() - 1;
  119.     while ( ResSet.hasMoreElements() && gHit < gMax )
  120.     {
  121.         var myRes = ResSet.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  122.         if ( myRes.Value == "urn:scrapbook:cache" ) continue;
  123.  
  124.         if ( gQueryStrings['re'] == "true" )
  125.         {
  126.             var myRE = new RegExp(gQueryStrings['q'], gRegExpModifier);
  127.             var isMatchT = SBRDF.getProperty("title",   myRes).match(myRE);
  128.             var isMatchC = SCRDF.getProperty("content", myRes).match(myRE);
  129.             var isMatchM = SBRDF.getProperty("comment", myRes).match(myRE);
  130.         }
  131.         else
  132.         {
  133.             var willContinue = false;
  134.             var myContent = SCRDF.getProperty("content", myRes);
  135.             for ( var i = 0; i < RegExpInclude.length; i++ ) {
  136.                 if ( !myContent.match(RegExpInclude[i]) ) { willContinue = true; break; }
  137.             }
  138.             if ( willContinue ) continue;
  139.             for ( var i = 0; i < RegExpExclude.length; i++ ) {
  140.                 if ( myContent.match(RegExpExclude[i]) )  { willContinue = true; break; }
  141.             }
  142.             if ( willContinue ) continue;
  143.             var isMatchC = true;
  144.         }
  145.  
  146.         if ( isMatchT || isMatchM || isMatchC )
  147.         {
  148.             gHit++;
  149.             var myIcon = SBRDF.getProperty("icon", myRes);
  150.             var myType = SBRDF.getProperty("type", myRes);
  151.             if ( !myIcon ) myIcon = SBcommon.getDefaultIcon(myType);
  152.             var SBlistitem  = document.getElementById("ScrapBookResultListTemplate").cloneNode(true);
  153.             SBlistitem.setAttribute("hidden", false);
  154.             SBlistitem.setAttribute("id", myRes.Value);
  155.             SBlistitem.setAttribute("type", myType);
  156.             SBlistitem.childNodes[0].setAttribute("image", myIcon);
  157.             SBlistitem.childNodes[0].setAttribute("label", SBRDF.getProperty("title",  myRes));
  158.             SBlistitem.childNodes[1].setAttribute("label", SB_extractRightContext(SCRDF.getProperty("content", myRes)));
  159.             SBlistitem.childNodes[2].setAttribute("label", SB_extractRightContext(SBRDF.getProperty("comment", myRes)).replace(/ __BR__ /g, " "));
  160.             SBlistitem.childNodes[3].setAttribute("label", SCRDF.getProperty("folder", myRes));
  161.             if ( isMatchT ) SBlistitem.childNodes[0].setAttribute("style", "color:#0000FF;");
  162.             if ( isMatchC ) SBlistitem.childNodes[1].setAttribute("style", "color:#0000FF;");
  163.             if ( isMatchM ) SBlistitem.childNodes[2].setAttribute("style", "color:#0000FF;");
  164.             document.getElementById("ScrapBookResultList").appendChild(SBlistitem);
  165.         }
  166.     }
  167.  
  168.     if ( gHit >= gMax ) document.getElementById("ScrapBookResult").setAttribute("class", "sb-header-ex");
  169.     var headerLabel1 = SBstring.getFormattedString( ( gHit < gMax ) ? "RESULTS_FOUND" : "RESULTS_FOUND_OVER", [gHit] );
  170.     if ( gQueryStrings['re'] == "true" )
  171.     {
  172.         var headerLabel2 = SBstring.getFormattedString("MATCHING", [ SB_localizedQuotation(gQueryStrings['q']) ]);
  173.     }
  174.     else
  175.     {
  176.         var includeQuoted = [];
  177.         for ( var i = 0; i < SBincludeWords.length; i++ ) {
  178.             includeQuoted.push(SB_localizedQuotation(SBincludeWords[i]));
  179.         }
  180.         if ( includeQuoted.length > 0 ) includeQuoted = SBstring.getFormattedString("INCLUDING", [includeQuoted.join(" ")]);
  181.         var excludeQuoted = [];
  182.         for ( var i = 0; i < SBexcludeWords.length; i++ ) {
  183.             excludeQuoted.push(SB_localizedQuotation(SBexcludeWords[i]));
  184.         }
  185.         if ( excludeQuoted.length > 0 ) excludeQuoted = SBstring.getFormattedString("EXCLUDING", [excludeQuoted.join(" ")]);
  186.         var headerLabel2 = includeQuoted + " " + excludeQuoted;
  187.     }
  188.     document.getElementById("ScrapBookResultLabel").value = headerLabel1 + " : " + headerLabel2;
  189. }
  190.  
  191.  
  192. function SB_extractRightContext(aString)
  193. {
  194.     aString = aString.replace(/\r|\n|\t/g, " ");
  195.     pattern = ( gQueryStrings['re'] == "true" ) ? gQueryStrings['q'] : SBincludeWords[0];
  196.     var RE = new RegExp("(" + pattern + ".*)", gRegExpModifier);
  197.     var ret = aString.match(RE) ? RegExp.$1 : aString;
  198.     return ( ret.length > 100 ) ? ret.substring(0, 100) : ret;
  199. }
  200.  
  201.  
  202. function SB_escapeRegExpSpecialChars(aString)
  203. {
  204.     return aString.replace(/([\*\+\?\.\^\/\$\\\|\[\]\{\}\(\)])/g, "\\$1");
  205. }
  206.  
  207.  
  208. function SB_localizedQuotation(aString)
  209. {
  210.     return SBstring.getFormattedString("QUOTATION", [aString]);
  211. }
  212.  
  213.  
  214. function SB_convertHTML2Text(aStr)
  215. {
  216.     var    FORMAT_CONVERTER = Components.classes['@mozilla.org/widget/htmlformatconverter;1'].createInstance(Components.interfaces.nsIFormatConverter);
  217.     var fromStr = Components.classes['@mozilla.org/supports-string;1'].createInstance(Components.interfaces.nsISupportsString);
  218.     var toStr   = { value: null };
  219.     fromStr.data = aStr;
  220.     try {
  221.         FORMAT_CONVERTER.convert("text/html", fromStr, fromStr.toString().length, "text/unicode", toStr, {});
  222.         toStr = toStr.value.QueryInterface(Components.interfaces.nsISupportsString);
  223.         return toStr.toString();
  224.     }
  225.     catch(ex) {
  226.         return aStr;
  227.     }
  228. }
  229.  
  230.  
  231. function SB_openResult(aEvent, type)
  232. {
  233.     if ( aEvent.originalTarget.localName != "listitem" && aEvent.originalTarget.localName != "menuitem" ) return;
  234.     var myID   = document.getElementById("ScrapBookResultList").currentItem.id.substring(18, 32);
  235.     var myType = document.getElementById("ScrapBookResultList").currentItem.getAttribute("type");
  236.     var myURL  = SBcommon.getURL(myID, myType);
  237.     switch ( type ) {
  238.         case "P" : document.getElementById("ScrapBookBrowser").setAttribute("src", myURL); break;
  239.         case "O" : SBcommon.loadURL(myURL, false); break;
  240.         case "T" : SBcommon.loadURL(myURL, true); break;
  241.     }
  242. }
  243.  
  244.  
  245. function SB_exitResult()
  246. {
  247.     window.location.href = document.getElementById("ScrapBookBrowser").contentWindow.location.href;
  248. }
  249.  
  250.  
  251. function SB_browserOnload(aEvent)
  252. {
  253.     aEvent.stopPropagation();
  254.     aEvent.preventDefault();
  255.     if ( gQueryStrings["re"] == "true" ) SBincludeWords = [gQueryStrings['q']];
  256.     for ( var i = 0; i < SBincludeWords.length; i++ )
  257.     {
  258.         SBhighlight.exec(SBhighlightColors[i % SBhighlightColors.length], SBincludeWords[i]);
  259.     }
  260. }
  261.  
  262.  
  263.  
  264.  
  265. var SBcache = {
  266.  
  267.     i : 0,
  268.     dataDir : null,
  269.     resList : [],
  270.     folderTitles : [],
  271.  
  272.     build : function()
  273.     {
  274.         window.title = "ScrapBook - " + SBstring.getString("BUILD_CACHE");
  275.         SBstatus.firstChild.value = SBstring.getString("BUILD_CACHE_INIT");
  276.         SBRDF.init();
  277.         SCRDF.init();
  278.         SCRDF.removeAllEntries();
  279.         this.dataDir = SBcommon.getScrapBookDir().clone();
  280.         this.dataDir.append("data");
  281.         this.initRecursively(SBservice.RDF.GetResource("urn:scrapbook:root"));
  282.  
  283.         this.i = 0;
  284.         this.asyncProcess(this.resList[this.i]);
  285.     },
  286.  
  287.     initRecursively : function(aContRes)
  288.     {
  289.         SBservice.RDFC.Init(SBRDF.data, aContRes);
  290.         var ResSet = SBservice.RDFC.GetElements();
  291.         while ( ResSet.hasMoreElements() )
  292.         {
  293.             var myRes  = ResSet.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  294.             var myType = SBRDF.getProperty("type", myRes);
  295.             SBstatus.firstChild.value = SBstring.getString("BUILD_CACHE_INIT") + " (" + this.i + ")";
  296.             if ( SBservice.RDFCU.IsContainer(SBRDF.data, myRes) ) {
  297.                 this.initRecursively(myRes);
  298.             } else if ( myType == "image" || myType == "file" ) {
  299.                 continue;
  300.             } else {
  301.                 this.resList[this.i]  = myRes;
  302.                 this.folderTitles[this.i] = SBRDF.getProperty("title", aContRes);
  303.                 this.i++;
  304.             }
  305.         }
  306.     },
  307.  
  308.     asyncProcess : function(aRes)
  309.     {
  310.         SBstatus.firstChild.value = SBstring.getString("BUILD_CACHE_SCAN") + " " + SBRDF.getProperty("title", aRes);
  311.         SBstatus.lastChild.value  = Math.round(this.i / this.resList.length * 100);
  312.         if ( window.title != this.folderTitles[this.i] ) window.title = this.folderTitles[this.i];
  313.         var myID    = SBRDF.getProperty("id",    aRes);
  314.         var myChars = SBRDF.getProperty("chars", aRes);
  315.         var myDir = this.dataDir.clone();
  316.         myDir.append(myID);
  317.         var myContentList = [];
  318.         var num = 0;
  319.         do {
  320.             var myFile = myDir.clone();
  321.             myFile.append("index" + ((num > 0) ? num : "") + ".html");
  322.             if ( !myFile.exists() ) break;
  323.             var myContent = SBcommon.readFile(myFile);
  324.             try {
  325.                 SBservice.UC.charset = myChars;
  326.                 myContent = SBservice.UC.ConvertToUnicode(myContent);
  327.             } catch(ex) {
  328.                 dump("*** ScrapBook Failed to ConvertToUnicode : " + SBRDF.getProperty("title", aRes) + "\n");
  329.             }
  330.             myContentList.push( SB_convertHTML2Text(myContent) );
  331.         }
  332.         while ( ++num < 10 );
  333.         myContentList = myContentList.join("\n").replace(/[\x00-\x1F\x7F]/g, " ");
  334.         SCRDF.addEntry(aRes, myContentList, this.folderTitles[this.i]);
  335.         if ( ++this.i < this.resList.length ) {
  336.             setTimeout(function() { SBcache.asyncProcess(SBcache.resList[SBcache.i]); }, 0);
  337.         } else {
  338.             this.finish();
  339.         }
  340.     },
  341.  
  342.     finish : function()
  343.     {
  344.         SBstatus.firstChild.value = "";
  345.         SCRDF.flush();
  346.         try {
  347.             if ( window.arguments[0] ) SBcommon.loadURL(window.arguments[0], true);
  348.         } catch(ex) {
  349.         }
  350.         window.close();
  351.     },
  352.  
  353.     unload : function()
  354.     {
  355.         if ( this.i != this.resList.length )
  356.         {
  357.             SCRDF.removeAllEntries();
  358.             SCRDF.flush();
  359.         }
  360.     },
  361.  
  362. };
  363.  
  364.  
  365.  
  366.  
  367. var SCRDF = {
  368.  
  369.     data : null,
  370.     cont : null,
  371.  
  372.     init : function()
  373.     {
  374.         if ( !gCacheFile.exists() ) gCacheFile.create(gCacheFile.NORMAL_FILE_TYPE, 0666);
  375.         var filePath = SBservice.IO.newFileURI(gCacheFile).spec;
  376.         this.data = SBservice.RDF.GetDataSourceBlocking(filePath);
  377.         this.initContainer("urn:scrapbook:cache");
  378.     },
  379.  
  380.     initContainer : function(aResID)
  381.     {
  382.         this.cont = Components.classes['@mozilla.org/rdf/container;1'].createInstance(Components.interfaces.nsIRDFContainer);
  383.         try {
  384.             this.cont.Init(this.data, SBservice.RDF.GetResource(aResID));
  385.         } catch(ex) {
  386.             this.cont = SBservice.RDFCU.MakeSeq(this.data, SBservice.RDF.GetResource(aResID));
  387.         }
  388.     },
  389.  
  390.     addEntry : function(aRes, aContent, aFolder)
  391.     {
  392.         SBRDF.sanitize(aContent);
  393.         SBRDF.sanitize(aFolder);
  394.         this.cont.AppendElement(aRes);
  395.         this.data.Assert(aRes, SBservice.RDF.GetResource(NS_SCRAPBOOK + "content"), SBservice.RDF.GetLiteral(aContent), true);
  396.         this.data.Assert(aRes, SBservice.RDF.GetResource(NS_SCRAPBOOK + "folder"),  SBservice.RDF.GetLiteral(aFolder),  true);
  397.     },
  398.  
  399.     getProperty : function(aProp, aRes)
  400.     {
  401.         try {
  402.             var retVal = this.data.GetTarget(aRes, SBservice.RDF.GetResource(NS_SCRAPBOOK + aProp), true);
  403.             return retVal.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
  404.         } catch(ex) {
  405.             dump("*** ScrapBook ERROR @ SCRDF::getProperty " + aProp + " " + aRes.Value + "\n");
  406.             return "";
  407.         }
  408.     },
  409.  
  410.     removeAllEntries : function()
  411.     {
  412.         var ResSet = this.data.GetAllResources();
  413.         while ( ResSet.hasMoreElements() )
  414.         {
  415.             var aRes = ResSet.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  416.             this.removeEntry(aRes);
  417.         }
  418.         SBservice.RDFCU.MakeSeq(this.data, SBservice.RDF.GetResource("urn:scrapbook:cache"));
  419.     },
  420.  
  421.     removeEntry : function(aRes)
  422.     {
  423.         this.cont.RemoveElement(aRes, true);
  424.         var names = this.data.ArcLabelsOut(aRes);
  425.         while ( names.hasMoreElements() )
  426.         {
  427.             try {
  428.                 var name  = names.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  429.                 var value = this.data.GetTarget(aRes, name, true);
  430.                 this.data.Unassert(aRes, name, value);
  431.             }
  432.             catch(ex) {
  433.             }
  434.         }
  435.     },
  436.  
  437.     flush : function()
  438.     {
  439.         this.data.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush();
  440.     }
  441.  
  442. };
  443.  
  444.  
  445.  
  446.  
  447. var SBhighlight = {
  448.  
  449.     word : "",
  450.     frameList : [],
  451.     searchRange : null,
  452.     startPoint : null,
  453.     endPoint : null,
  454.  
  455.     getFrameList : function(aWindow)
  456.     {
  457.         for ( var f = 0; f < aWindow.frames.length; f++ )
  458.         {
  459.             this.frameList.push(aWindow.frames[f]);
  460.             this.getFrameList(aWindow.frames[f]);
  461.         }
  462.     },
  463.  
  464.     exec : function(color, word)
  465.     {
  466.         this.word = word;
  467.  
  468.         var rootWin = document.getElementById("ScrapBookBrowser").contentWindow;
  469.         this.frameList = [rootWin];
  470.         this.getFrameList(rootWin);
  471.  
  472.         for ( var i = 0; i < this.frameList.length; i++ )
  473.         {
  474.             var doc = this.frameList[i].document;
  475.             var body = doc.body;
  476.             if ( !body ) return;
  477.  
  478.             var count = body.childNodes.length;
  479.             this.searchRange = doc.createRange();
  480.             this.startPoint  = doc.createRange();
  481.             this.endPoint    = doc.createRange();
  482.  
  483.             var baseNode = doc.createElement("span");
  484.             baseNode.setAttribute("style", "background-color: " + color + ";");
  485.             baseNode.setAttribute("id", "__firefox-findbar-search-id");
  486.  
  487.             this.searchRange.setStart(body, 0);
  488.             this.searchRange.setEnd(body, count);
  489.  
  490.             this.startPoint.setStart(body, 0);
  491.             this.startPoint.setEnd(body, 0);
  492.             this.endPoint.setStart(body, count);
  493.             this.endPoint.setEnd(body, count);
  494.  
  495.             var retRange = null;
  496.             var finder = Components.classes['@mozilla.org/embedcomp/rangefind;1'].createInstance().QueryInterface(Components.interfaces.nsIFind);
  497.  
  498.             while( (retRange = finder.Find(this.word, this.searchRange, this.startPoint, this.endPoint)) )
  499.             {
  500.                 var nodeSurround = baseNode.cloneNode(true);
  501.                 var node = this.highlightNode(retRange, nodeSurround);
  502.                 this.startPoint = node.ownerDocument.createRange();
  503.                 this.startPoint.setStart(node, node.childNodes.length);
  504.                 this.startPoint.setEnd(node, node.childNodes.length);
  505.             }
  506.         }
  507.     },
  508.  
  509.     highlightNode : function(range, node)
  510.     {
  511.         var startContainer = range.startContainer;
  512.         var startOffset = range.startOffset;
  513.         var endOffset = range.endOffset;
  514.         var docfrag = range.extractContents();
  515.         var before = startContainer.splitText(startOffset);
  516.         var parent = before.parentNode;
  517.         node.appendChild(docfrag);
  518.         parent.insertBefore(node, before);
  519.         return node;
  520.     }
  521.  
  522. };
  523.  
  524.  
  525.