Advertisement
Guest User

add domo2 search in chaika

a guest
Feb 8th, 2013
381
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. diff --git a/chrome/content/chaika/bbsmenu/page.js b/chrome/content/chaika/bbsmenu/page.js
  2. index 7c0b9f5..f6538cc 100644
  3. --- a/chrome/content/chaika/bbsmenu/page.js
  4. +++ b/chrome/content/chaika/bbsmenu/page.js
  5. @@ -239,6 +239,9 @@ var SearchBox = {
  6.             case "find2ch":
  7.                 this._textbox.emptyText = "2ch 検索";
  8.                 break;
  9. +           case "domo2":
  10. +               this._textbox.emptyText = "2ch 検索 (domo2)";
  11. +               break;
  12.             case "boardFilter":
  13.                 this._textbox.emptyText = "フィルタ";
  14.                 break;
  15. @@ -256,6 +259,9 @@ var SearchBox = {
  16.             case "find2ch":
  17.                 Find2ch.search(aSearchStr);
  18.                 break;
  19. +           case "domo2":
  20. +               Domo2.search(aSearchStr);
  21. +               break;
  22.             case "boardFilter":
  23.                 Bbsmenu.filter(aSearchStr);
  24.                 break;
  25. @@ -700,6 +706,110 @@ var Find2ch = {
  26.  
  27.  };
  28.  
  29. +var Domo2 = {
  30. +
  31. +   _downloader: null,
  32. +   _infoNode: null,
  33. +
  34. +   search: function Domo2_search(aSearchStr){
  35. +       const QUERY_URL = 'http://www.domo2.net/search/search.cgi?word=';
  36. +       const ENCODE = 'EUC-JP';
  37. +       const QUERY = escape(this._convertEncode(aSearchStr, ENCODE));
  38. +
  39. +       var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  40. +       var url = ioService.newURI(QUERY_URL + QUERY, null, null);
  41. +
  42. +       this._downloader = new ChaikaSimpleDownloader();
  43. +       this._downloader.download(url, ENCODE, this);
  44. +
  45. +       Notification.removeAll();
  46. +       this._infoNode = Notification.info("検索中");
  47. +   },
  48. +
  49. +
  50. +   onStop: function Domo2_onStop(aDownloader, aResponse, aHttpStatus){
  51. +       if(aResponse){
  52. +           this.initTree(aResponse);
  53. +       }
  54. +
  55. +       Notification.remove(this._infoNode);
  56. +       this._downloader = null;
  57. +       this._infoNode = null;
  58. +   },
  59. +
  60. +
  61. +   onError: function Domo2_onError(aDownloader, aErrorCode){
  62. +       Notification.critical("検索に失敗しました", 2500);
  63. +       Notification.remove(this._infoNode);
  64. +       this._downloader = null;
  65. +       this._infoNode = null;
  66. +   },
  67. +
  68. +   initTree: function Domo2_initTree(aResponse){
  69. +       var resultDoc = this._convertDocFromHTML(aResponse);
  70. +       Tree.initTree(resultDoc, MODE_FIND2CH);
  71. +   },
  72. +
  73. +   _convertDocFromHTML: function(aResponseStr){
  74. +       var domParser = Cc["@mozilla.org/xmlextras/domparser;1"]
  75. +               .createInstance(Ci.nsIDOMParser);
  76. +       var findDoc = domParser.parseFromString(aResponseStr, "text/html");
  77. +
  78. +       var resultDoc = document.implementation.createDocument(null, '', null);
  79. +       var root = document.createElement('category');
  80. +
  81. +       var resultObj = {};  //key: board name, value: an array of threads
  82. +       Array.slice(findDoc.querySelectorAll('table tr:not(:first-child)')).forEach(function(item){
  83. +           var cells = item.getElementsByTagName('td');
  84. +
  85. +           var thread = cells[2].getElementsByTagName('a')[0];
  86. +           var threadURI = thread.getAttribute('href').replace(/\d+-\d+$/, '');
  87. +           var threadTitle = thread.textContent;
  88. +
  89. +           var post = cells[3].textContent.replace(/\D/g, '') || '0';
  90. +           var boardTitle = cells[1].textContent;
  91. +
  92. +           var threadItem = document.createElement('thread');
  93. +           threadItem.setAttribute('url', threadURI);
  94. +           threadItem.setAttribute('title', threadTitle + ' [' + post + ']');
  95. +           threadItem.setAttribute('boardName', boardTitle);
  96. +
  97. +           if(!resultObj[boardTitle]){
  98. +               resultObj[boardTitle] = [];
  99. +           }
  100. +           resultObj[boardTitle].push(threadItem);
  101. +       });
  102. +
  103. +       for(let boardTitle in resultObj){
  104. +           var boardItem = document.createElement('board');
  105. +           boardItem.setAttribute('title', boardTitle);
  106. +           boardItem.setAttribute('isContainer', 'true');
  107. +           boardItem.setAttribute('isOpen', 'true');
  108. +
  109. +           resultObj[boardTitle].forEach(function(threadItem){
  110. +               boardItem.appendChild(threadItem);
  111. +           });
  112. +
  113. +           root.appendChild(boardItem);
  114. +       }
  115. +
  116. +       resultDoc.appendChild(root);
  117. +
  118. +       return resultDoc;
  119. +   },
  120. +
  121. +   _convertEncode: function(aStr, aEncode){
  122. +       var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].getService(Ci.nsIScriptableUnicodeConverter);
  123. +
  124. +       try{
  125. +           converter.charset = aEncode;
  126. +           return converter.ConvertFromUnicode(aStr);
  127. +       }catch(e){
  128. +           return aStr;
  129. +       }
  130. +   }
  131. +
  132. +};
  133.  
  134.  
  135.  
  136. diff --git a/chrome/content/chaika/bbsmenu/page.xul b/chrome/content/chaika/bbsmenu/page.xul
  137. index 5be1ef9..21fa0dd 100644
  138. --- a/chrome/content/chaika/bbsmenu/page.xul
  139. +++ b/chrome/content/chaika/bbsmenu/page.xul
  140. @@ -15,6 +15,8 @@
  141.     <menupopup id="searchModeMenu" onpopupshowing="SearchBox.searchModeMenuShowing(event)">
  142.          <menuitem label="find.2ch.net で検索" value="find2ch"     type="radio" name="searchModeMenuItem"
  143.                 oncommand="SearchBox.setSearchMode('find2ch')"/>
  144. +        <menuitem label="domo2 で検索" value="domo2"     type="radio" name="searchModeMenuItem"
  145. +               oncommand="SearchBox.setSearchMode('domo2')"/>
  146.          <menuitem label="板名フィルタ"  value="boardFilter" type="radio" name="searchModeMenuItem"
  147.                 oncommand="SearchBox.setSearchMode('boardFilter')"/>
  148.     </menupopup>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement