Changeset 9360

Show
Ignore:
Timestamp:
04/13/08 00:17:09 (8 months ago)
Author:
drry
Message:

lang/javascript/jsAutoPageScraper/trunk/test/jsAutoPageScraper-test.js
lang/javascript/jsAutoPageScraper/trunk/index.html
lang/javascript/jsAutoPageScraper/trunk/js/scriptLoader.js
lang/javascript/jsAutoPageScraper/trunk/js/jsAutoPageScraper.js:

  • 正規表現を修正しました。
  • ほか。
Location:
lang/javascript/jsAutoPageScraper/trunk
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • lang/javascript/jsAutoPageScraper/trunk/index.html

    r9343 r9360  
    1010    <script type="text/javascript"> 
    1111var baseUrl = location.href.split('/').slice(0,-1).join('/'); 
    12 var bookmarkletScriptSrc =  
    13 "javascript:(function(u){var s=document.createElement('script');s.type='text/javascript';s.src=u;document.getElementsByTagName('head')[0].appendChild(s)})('"+baseUrl+"/js/jsAutoPageScraper.js')" 
     12var bookmarkletScriptSrc = 
     13"javascript:(function(u,d,s){s=d.createElement('script');s.type='text/javascript';s.src=u;d.documentElement.appendChild(s)})('"+baseUrl+"/js/jsAutoPageScraper.js',document)" 
    1414document.write('<a href="'+bookmarkletScriptSrc+'">load jsAutoPageScraper</a>'); 
    1515    </script> 
     
    1717<li> 
    1818    <script type="text/javascript"> 
    19 bookmarkletScriptSrc =  
    20 "javascript:(function(u){var s=document.createElement('script');s.type='text/javascript';s.src=u;document.getElementsByTagName('head')[0].appendChild(s)})('"+baseUrl+"/js/scriptLoader.js#jsAutoPageScraper.js,../test/jsAutoPageScraper-test.js:JSAutoPageScraper')" 
     19bookmarkletScriptSrc = 
     20"javascript:(function(u,d,s){s=d.createElement('script');s.type='text/javascript';s.src=u;d.documentElement.appendChild(s)})('"+baseUrl+"/js/scriptLoader.js#jsAutoPageScraper.js,../test/jsAutoPageScraper-test.js:JSAutoPageScraper',document)" 
    2121document.write('<a href="'+bookmarkletScriptSrc+'">jsAutoPageScraper Test</a>'); 
    2222    </script> 
  • lang/javascript/jsAutoPageScraper/trunk/js/jsAutoPageScraper.js

    r9343 r9360  
    77 *  For details, see the jsAutoPageScraper web site: http://www.mashmarix.com 
    88 * 
    9  **/ 
     9 */ 
    1010 
    1111 
     
    2222 
    2323function getScriptCtEl() { 
    24   return scriptCtEl ||  
     24  return scriptCtEl || 
    2525    (scriptCtEl = windoc.getElementsByTagName('head')[0] || getBodyEl()); 
    2626} 
     
    4747 * Create hidden(invisible) iframe in order to scrape contents from DOM tree 
    4848 * 
    49  * @param url - url path to scrape 
     49 * @param url - URL path to scrape 
    5050 * @param callback - callback function, invoked when iframe document load complete 
    5151 * @param scope - scope object to be applied in callback 
     
    5353function createIframe(url, callback, scope) { 
    5454  // ugly W/A to prevent cache... 
    55   if (url==window.location.href) {  
     55  if (url==window.location.href) { 
    5656    url += url.indexOf('?')>=0 ? '&' : '?'; 
    5757  } 
     
    7272 
    7373 
    74 // detect base url from own script url 
     74// detect base URL from own script URL 
    7575var baseUrl = (function() { 
    7676  var scripts = windoc.getElementsByTagName('script'); 
     
    8181})(); 
    8282 
    83 // assuming javascript-xpath lib is located in following path : 
     83// assuming JavaScript-XPath lib is located in following path : 
    8484var xpathLibUrl = baseUrl + 'javascript-xpath/javascript-xpath.js'; 
    8585 
    8686 
    8787/** 
    88  * Append JavaScript-Xpath(http://coderepos.org/share/wiki/JavaScript-XPath) to HTML Document 
    89  * 
    90  * @param doc - HTML Document to add xpath lib 
    91  * @param callback - callback function, invoked when xpath lib loaded 
     88 * Append JavaScript-XPath(http://coderepos.org/share/wiki/JavaScript-XPath) to HTML Document 
     89 * 
     90 * @param doc - HTML Document to add XPath lib 
     91 * @param callback - callback function, invoked when XPath lib loaded 
    9292 * @param scope - scope object to be applied in callback 
    9393 */ 
    94 function addXpathLibrary(doc, callback, scope) { 
     94function addXPathLibrary(doc, callback, scope) { 
    9595  if (doc.evaluate) { 
    9696    callback.call(scope, doc); 
     
    9999    scriptEl.type = 'text/javascript'; 
    100100    scriptEl.src = xpathLibUrl; 
    101     var ctEl = doc.getElementsByTagName('head')[0] || doc.body; 
     101    var ctEl = doc.documentElement; 
    102102    ctEl.appendChild(scriptEl); 
    103     pollXpathLibLoadStatus(); 
    104   } 
    105  
    106   function pollXpathLibLoadStatus() { 
     103    pollXPathLibLoadStatus(); 
     104  } 
     105 
     106  function pollXPathLibLoadStatus() { 
    107107    if (doc.evaluate) { 
    108108      callback.call(scope, doc); 
     
    121121 * @param contextNode - context node to search elements by xpath 
    122122 */ 
    123 function queryXpathElementList(doc, xpath, contextNode) { 
     123function queryXPathElementList(doc, xpath, contextNode) { 
    124124  var result = doc.evaluate(xpath, contextNode || doc, null, 7, null); 
    125125  var elements = []; 
     
    137137 * @param contextNode - context node to search elements by xpath 
    138138 */ 
    139 function queryXpathElement(doc, xpath, contextNode) { 
     139function queryXPathElement(doc, xpath, contextNode) { 
    140140  return doc.evaluate(xpath, contextNode || doc, null, 8, null).singleNodeValue; 
    141141} 
     
    152152  this.siteinfo = info; 
    153153  this.queueCount = 0; 
    154 } 
     154}; 
    155155 
    156156 
     
    170170  } 
    171171  , 
    172   
     172 
    173173  // private 
    174174  requestDocument : function() { 
     
    180180  handleIframe : function(ifr) { 
    181181    this.iframe = ifr; 
    182     addXpathLibrary(ifr.contentWindow.document, this.handleLoadLibrary, this); 
     182    addXPathLibrary(ifr.contentWindow.document, this.handleLoadLibrary, this); 
    183183  } 
    184184  , 
     
    194194  refreshQueue : function() { 
    195195    if (!this.paragraphs) { 
    196       this.paragraphs = queryXpathElementList(this.doc, this.siteinfo.paragraph); 
    197     }  
     196      this.paragraphs = queryXPathElementList(this.doc, this.siteinfo.paragraph); 
     197    } 
    198198    while (this.queueCount > 0 && this.paragraphs.length > 0) { 
    199199      var p = this.paragraphs.shift(); 
     
    206206    if (this.paragraphs.length == 0) { 
    207207      delete this.paragraphs; 
    208       this.nextUrl = queryXpathElement(this.doc, this.siteinfo.nextLink); 
     208      this.nextUrl = queryXPathElement(this.doc, this.siteinfo.nextLink); 
    209209      this.cleanupIframe(); 
    210210      if (!this.nextUrl) { 
     
    218218 
    219219  // private 
    220   cleanupIframe: function() { 
     220  cleanupIframe : function() { 
    221221    this.doc = null; 
    222222    this.iframe.parentNode.removeChild(this.iframe); 
     
    235235  , 
    236236 
    237   //abstract  
    238   onFetchParagraph : emptyFn, 
     237  //abstract 
     238  onFetchParagraph : emptyFn 
     239  , 
    239240 
    240241  //abstract 
    241242  onFinish : emptyFn 
    242243 
    243 } 
     244}; 
    244245 
    245246window.JSAutoPageScraper = JSAutoPageScraper; 
  • lang/javascript/jsAutoPageScraper/trunk/js/scriptLoader.js

    r9343 r9360  
    2929function waitLoading(scrinfo) { 
    3030  if (window[scrinfo.depends]) { 
    31     loadScript(scrinfo.url);  
     31    loadScript(scrinfo.url); 
    3232  } else { 
    3333    setTimeout(function() { waitLoading(scrinfo) }, 500); 
     
    4040  script.charset = 'utf-8'; 
    4141  script.src = url; 
    42   (document.getElementsByTagName('head')[0]||document.body).appendChild(script); 
     42  document.documentElement.appendChild(script); 
    4343} 
    4444 
  • lang/javascript/jsAutoPageScraper/trunk/test/jsAutoPageScraper-test.js

    r9334 r9360  
    22 
    33// From AutoPagerize && LDRize 
    4 var siteinfos =  
    5 [{ url: 'http://www.amazon.co.jp/gp/registry/(?:wishlist/|registry.html.*type=wishlist)', 
     4var siteinfos = 
     5[{ url: 'http://www\\.amazon\\.co\\.jp/gp/registry/wishlist/|registry\\.html.+type=wishlist', 
    66   nextLink: '//a[contains(string(.), "次")]', 
    77   insertBefore: '//form[@name="editItems"][last()]/table/following-sibling::node()', 
    88   pageElement: '//form[@name="editItems"]/table', 
    99   exampleUrl: 'http://www.amazon.co.jp/gp/registry/wishlist/ref=topnav__gw/250-9892965-2605017', 
    10    name: 'Amazon ウィッシュリスト', 
     10   name: 'Amazon.co.jp ウィッシュリスト', 
    1111   domain: 'http://www.amazon.[a-z.]+/gp/registry/wishlist/', 
    1212   paragraph: '//form[@name="editItems"]/table/tbody', 
     
    1515   stripe: true, 
    1616   height: 0 }, 
    17  { url: 'http://www.amazon.co.jp/.+/customer-reviews/', 
     17 { url: 'http://www\\.amazon\\.co\\.jp/.+/customer-reviews/', 
    1818   nextLink: '//a[text()="次へ"]', 
    1919   insertBefore: '//div[@id="customerReviews"]/div/hr/following-sibling::node()[last()]', 
    2020   pageElement: '//div[@id="customerReviews"]/div/hr[1]/following-sibling::node()', 
    2121   exampleUrl: 'http://www.amazon.co.jp/Best-1980-1990-U2/dp/customer-reviews/B00000DFSK/ref=cm_cr_dp_all_helpful?ie=UTF8&customer-reviews.sort%5Fby=-SubmissionDate&coliid=&showViewpoints=1&customer-reviews.start=1&colid=', 
    22    name: 'Amazon 商品ページ', 
     22   name: 'Amazon.co.jp 商品ページ', 
    2323   domain: 'http://www.amazon.[a-z.]+/([^./]+?/)?(o/ASIN|dp|exec/obidos/ASIN)/', 
    2424   paragraph: '(id("handleBuy") | //*[td | div][contains(concat(" ",normalize-space(@class)," ")," bucket ")])', 
    2525   height: 0 }, 
    26  { url: 'http://www.amazon.co.jp/(s/|gp/search)', 
     26 { url: 'http://www\\.amazon\\.co\\.jp/s/|gp/search', 
    2727   nextLink: 'id("pagnNextLink")', 
    2828   insertBefore: '//table[@class="headingBar"][2]', 
    2929   pageElement: 'id("Results")', 
    3030   exampleUrl: 'http://www.amazon.co.jp/s/ref=nb_ss_gw/250-9892965-2605017?field-keywords=windows', 
    31    name: 'Amazon 検索結果', 
     31   name: 'Amazon.co.jp 検索結果', 
    3232   domain: 'http://www.amazon.[a-z.]+/(s/|gp/search)', 
    3333   paragraph: '//td[contains(@class,"searchitem")]', 
     
    3535   stripe: true, 
    3636   height: 0 }, 
    37  { url: 'http://.+.blogspot.com/*', 
     37 { url: 'http://[^.]+\\.blogspot\\.com/.*', 
    3838   nextLink: 'id("blog-pager-older-link")/a', 
    3939   insertBefore: 'id("blog-pager")', 
    4040   pageElement: '//div[contains(@class,"blog-posts")]', 
    4141   exampleUrl: 'http://52pairplunge.blogspot.com/', 
    42    name: 'blogspot.com', 
     42   name: 'Blogger', 
    4343   domain: '.blogspot.com', 
    4444   paragraph: '//h3[@class="post-title"]', 
    4545   link: 'a', 
    4646   stripe: false }, 
    47  { url: 'www.citeulike.org', 
     47 { url: '//www\\.citeulike\\.org/', 
    4848   nextLink: '//div[contains(@class,"content")]/table/tbody/tr/td/b/a', 
    4949   insertBefore: 'id("navright")', 
    5050   pageElement: '//div[contains(@class,"content")]', 
    5151   exampleUrl: 'http://www.citeulike.org/', 
    52    name: 'citeulike', 
     52   name: 'CiteULike', 
    5353   domain: 'http://www.citeulike.org', 
    5454   paragraph: '//div[contains(@class,"list")]/li', 
    5555   link: 'div/a[contains(@class,"title")]' }, 
    56  { url: 'http://search.cpan.org/search*', 
     56 { url: 'http://search\\.cpan\\.org/search.*', 
    5757   nextLink: '//div[@class="pages"]//td//a[last()]', 
    5858   insertBefore: '//div[@class="footer"]', 
     
    6464   link: 'a', 
    6565   stripe: true }, 
    66  { url: 'http://((danbooru|miezaru).donmai.us|nekobooru.net|moe.imouto.org)/post', 
     66 { url: 'http://(?:(?:danbooru|miezaru)\\.donmai\\.us|nekobooru\\.net|moe\\.imouto\\.org)/post', 
    6767   nextLink: '(id("paginator")/a[@class="arrow"])[last()]', 
    6868   insertBefore: '(//span[@class="thumb"])[last()]/following-sibling::node()', 
     
    7474   link: 'a', 
    7575   view: 'a/img' }, 
    76  { url: 'http://del.icio.us/*', 
     76 { url: 'http://del\\.icio\\.us/.*', 
    7777   nextLink: '//a[@accesskey="e"]', 
    7878   insertBefore: 'id("main")/p[2]', 
     
    8686   stripe: true, 
    8787   height: 0 }, 
    88  { url: 'http://del.icio.us/search/', 
     88 { url: 'http://del\\.icio\\.us/search/', 
    8989   nextLink: '//div[@id="main"]/div/p[@class="verysmall"]/a[last()]', 
    9090   insertBefore: '//ol[@class="posts"]/following-sibling::node()[1]', 
     
    9898   stripe: true, 
    9999   height: 0 }, 
    100  { url: 'http://(www.)?digg.com/', 
     100 { url: 'http://(?:www\\.)?digg\\.com/', 
    101101   nextLink: '//div[@class="pages"]/a[last()][@class="nextprev"]', 
    102102   insertBefore: '//div[@class="pages"]', 
    103103   pageElement: '//div[contains(@class, "news-summary")]', 
    104104   exampleUrl: 'http://digg.com/', 
    105    name: 'digg.com', 
     105   name: 'Digg', 
    106106   domain: 'http://digg.com/', 
    107107   paragraph: '//div[@class="main"]//div[@class="news-summary"]', 
    108108   link: 'descendant::a[0]' }, 
    109  { url: 'http://japanese.engadget.com/', 
     109 { url: 'http://japanese\\.engadget\\.com/', 
    110110   nextLink: 'id("paging")/li[@class="newer"]/a', 
    111111   insertBefore: 'id("content")/p', 
     
    117117   link: 'h2/a', 
    118118   focus: 'id("bloginfo")/form/input[@type="text"]' }, 
    119  { url: 'https://addons.mozilla.org/w+(-w+)?/firefox/browse/', 
     119 { url: 'https://addons\\.mozilla\\.org/[a-z]{2}(?:-[A-Z]{2})?/firefox/browse/', 
    120120   nextLink: '//div[@id="pagination"]/a[starts-with(text(),"next") or starts-with(text(),"次")]', 
    121121   insertBefore: '//div[@id="content"]/div[@class="divider"]', 
     
    126126   paragraph: '//h2[contains(concat(" ",normalize-space(@class)," ")," addonname ")]', 
    127127   link: 'a' }, 
    128  { url: 'http://www.flickr.com/photos/friends', 
     128 { url: 'http://(?:www\\.)?flickr\\.com/photos/friends', 
    129129   nextLink: '//div[@id="Main"]/div[@class="Pages"]/div[@class="Paginator"]/a[@class="Next"]', 
    130130   insertBefore: '//div[@id="Main"]/div[@class="Pages"]', 
     
    136136   link: 'p[contains(@class,"Photo")]/span/a', 
    137137   height: 30 }, 
    138  { url: 'http://.*flickr.com/photos/.+/sets/', 
     138 { url: 'http://(?:[^.]+\\.)?flickr\\.com/photos/[^/]+/sets/', 
    139139   nextLink: '//a[@class="Next"]', 
    140140   insertBefore: 'id("vsPagination")', 
     
    146146   link: 'p[contains(@class,"Photo")]/span/a', 
    147147   height: 30 }, 
    148  { url: 'http://.*flickr.com/search/', 
     148 { url: 'http://(?:[^.]+\\.)?flickr\\.com/search/', 
    149149   nextLink: '//a[@class="Next"]', 
    150150   insertBefore: '//div[@class="Pages"]', 
     
    155155   paragraph: '//table[@class="DetailResults"]/tbody/tr', 
    156156   link: 'td[contains(@class,"DetailPic")]/span/a' }, 
    157  { url: 'http://.*flickr.com/photos/tags/', 
     157 { url: 'http://(?:[^.]+\\.)?flickr\\.com/photos/tags/', 
    158158   nextLink: '//a[@class="Next"]', 
    159159   insertBefore: '//div[@class="Pages"]/following-sibling::node()[1]', 
     
    165165   link: 'p[contains(@class,"Photo")]/span/a', 
    166166   height: 30 }, 
    167  { url: 'http://.*flickr.com/photos/.+/tags/', 
     167 { url: 'http://(?:[^.]+\\.)?flickr\\.com/photos/[^/]+/tags/', 
    168168   nextLink: '//a[@class="Next"]', 
    169169   insertBefore: '//div[@class="Pages"]', 
     
    176176   link: 'p[contains(@class,"Photo")]/span/a', 
    177177   height: 30 }, 
    178  { url: 'http://friendfeed.com/', 
     178 { url: 'http://friendfeed\\.com/', 
    179179   nextLink: '//div[contains(concat(" ",@class," ")," pager ")]/a[last()]', 
    180180   appendChild: '//div[@id="feed" and @class="feed"]', 
     
    185185   paragraph: '//div[contains(concat(" ",normalize-space(@class)," ")," entry ")]', 
    186186   link: './/div[@class="link"]/a' }, 
    187  { url: 'http://friendfeed.com/settings/subsc', 
     187 { url: 'http://friendfeed\\.com/settings/subsc', 
    188188   nextLink: '//div[contains(concat(" ",@class," ")," pager ")]/a[last()]', 
    189189   pageElement: '//table[@class="friends"]', 
     
    193193   paragraph: '//div[contains(concat(" ",normalize-space(@class)," ")," entry ")]', 
    194194   link: './/div[@class="link"]/a' }, 
    195  { url: 'http://friendfeed.com/', 
     195 { url: 'http://friendfeed\\.com/', 
    196196   nextLink: '//div[contains(concat(" ",@class," ")," pager ")]/a[contains(text(),"Older")]', 
    197197   pageElement: 'id("feedcontainer")', 
     
    201201   paragraph: '//div[contains(concat(" ",normalize-space(@class)," ")," entry ")]', 
    202202   link: './/div[@class="link"]/a' }, 
    203  { url: 'http://(.*).google.*/codesearch*', 
     203 { url: 'http://[^/]+\\.google\\.[^/]+/codesearch.*', 
    204204   nextLink: '(id("navbar")//td[@class="b"]/a)[last()]', 
    205205   insertBefore: 'id("navbar")', 
     
    211211   link: 'h2//a[contains(@class,"l")]', 
    212212   stripe: true }, 
    213  { pageElement: '//div[contains(concat(" ",@class," ")," directory-entry ")]', 
     213 { url: 'http://www\\.google\\.com/ig/directory', 
     214   pageElement: '//div[contains(concat(" ",@class," ")," directory-entry ")]', 
    214215   nextLink: '//p[@class="pagelinks"]//a[last()]', 
    215    url: 'http://www.google.com/ig/directory', 
    216216   exampleUrl: 'http://www.google.com/ig/directory', 
    217217   name: 'Google', 
     
    220220   link: 'h2//a[contains(@class,"l")]', 
    221221   stripe: true }, 
    222  { url: 'http://(.*).google.+/custom', 
     222 { url: 'http://[^/]+\\.google\\.[^/]+/custom', 
    223223   nextLink: '//td[@class="b"][last()]//a', 
    224224   pageElement: '//div[@class="g"]', 
     
    229229   link: 'h2//a[contains(@class,"l")]', 
    230230   stripe: true }, 
    231  { url: 'http://(.*).google.+/(search).+', 
     231 { url: 'http://[^/]+\\.google\\.[^/]+/search.+', 
    232232   nextLink: 'id("navbar")//td[last()]/a', 
    233233   insertBefore: 'id("res")/*[last()-1]', 
     
    239239   link: 'h2//a[contains(@class,"l")]', 
    240240   stripe: true }, 
    241  { url: 'http://(.*).google.*/videosearch*', 
     241 { url: 'http://[^/]+\\.google\\.[^/]+/videosearch.*', 
    242242   nextLink: 'id("nextpage")', 
    243243   insertBefore: 'id("pagenavigatortable")', 
     
    249249   link: 'table/tbody/tr/td[2]/div/a', 
    250250   stripe: true }, 
    251  { url: 'http://www.gumonji.net/cgi-bin/diary_list.cgi', 
     251 { url: 'http://www\\.gumonji\\.net/cgi-bin/diary_list\\.cgi', 
    252252   nextLink: '//div[@class="frame"]/div[@class="main"]/div[@class="page2"]/div[@class="pager_next"]/a', 
    253253   insertBefore: '//div[@id="googlead"]', 
     
    259259   link: 'td/div[contains(@class,"list_dtitle")]/p/a', 
    260260   height: 23 }, 
    261  { url: 'http://www.hmv.co.jp/search/index.asp?.+', 
     261 { url: 'http://www\\.hmv\\.co\\.jp/search/index\\.asp\\?.+', 
    262262   nextLink: '//form[@name="form2"]//table/tbody/tr/td[8]/a[last()]', 
    263263   insertBefore: '//form[@name="form2"]', 
    264264   pageElement: '//form[@name="form2"]/ancestor::td[2]/table/tbody/tr/td/table[position()!=last()]', 
    265265   exampleUrl: 'http://www.hmv.co.jp/search/index.asp?keyword=magic', 
    266    name: 'HMV検索結果', 
     266   name: 'HMV 検索結果', 
    267267   domain: 'http://www.hmv.co.jp/search/', 
    268268   paragraph: '//tr/td[@valign="top"]/table/tbody/tr/td[@valign="top"]/table/tbody/child::tr[position()=1 and position()=last()]', 
    269269   link: 'td[3]/table/tbody/tr/td/span[1]/a', 
    270270   stripe: true }, 
    271  { url: 'http://(kichiku|kikuchi).oq.la/', 
     271 { url: 'http://ki(?:chiku|kuchi)\\.oq\\.la/', 
    272272   nextLink: '//div[@id="maincontent"]/div[@class="pagerize"]/ul/li[@class="pagelink"]/a[text()=">"]', 
    273273   insertBefore: '//div[@id="maincontent"]/div[@class="pagerize"]/ul', 
     
    280280   view: '(.//div[@class="user"]/p/a/img|.//span/a/text())', 
    281281   stripe: true }, 
    282  { url: 'http://www.last.fm/user/[^/]*/charts', 
     282 { url: 'http://www\\.last\\.fm/user/[^/]+/charts', 
    283283   nextLink: '//a[@class="nextlink"]', 
    284284   insertBefore: '//div[@class="pagination"][last()]', 
     
    291291   view: 'a/text()', 
    292292   focus: 'id("searchInput")' }, 
    293  { url: 'http://lwn.net/.*', 
     293 { url: 'http://lwn\\.net/.*', 
    294294   nextLink: '//ul/li/a[contains(text(), "Next ")]', 
    295295   insertBefore: '//body/center', 
    296296   pageElement: '//div[@class="ArticleText"]', 
    297297   exampleUrl: 'http://lwn.net/', 
    298    name: 'lwn.net', 
     298   name: 'LWN.net', 
    299299   domain: 'http://lwn.net/', 
    300300   paragraph: '//div[@class="Headline"]' }, 
    301  { url: 'http://clip.livedoor.com/clips/*', 
     301 { url: 'http://clip\\.livedoor\\.com/clips/.*', 
    302302   nextLink: '//a[@rel="next"]', 
    303303   insertBefore: '//div[contains(@class,"pager-bottom")]', 
     
    311311   stripe: true, 
    312312   height: 0 }, 
    313  { url: 'http://search.(msn|live).com/', 
     313 { url: 'http://search\\.(?:msn|live)\\.com/', 
    314314   nextLink: 'id("pag")/a[@class="nP"]', 
    315315   insertBefore: 'id("pag")', 
     
    322322   stripe: true, 
    323323   height: 10 }, 
    324  { url: 'https?://www.redhat.com/docs/manuals/.*', 
     324 { url: 'https?://www\\.redhat\\.com/docs/manuals/.*', 
    325325   nextLink: '//li[@class="next"]/a', 
    326326   pageElement: '//div[@class="section" or @class="preface" or @class="part" or @class="chapter" or @class="toc" or @class="appendix"]', 
    327327   exampleUrl: 'http://www.redhat.com/docs/manuals/enterprise/RHEL-5-manual/ja-JP/Deployment_Guide/ch-fw.html', 
    328    name: 'redhat manual', 
     328   name: 'Red Hat Manuals', 
    329329   domain: 'www.redhat.com/docs/manuals/', 
    330330   paragraph: '(//h6 | //h5 | //h4 | //h3 | //h2 | //h1)' }, 
    331  { url: 'http://www.stage6.com/', 
    332    nextLink: '//*[contains(@class, "pagination-right")]', 
    333    insertBefore: '//div[@class="clear-small"]', 
    334    pageElement: '//*[@class="video" or @class="vertical-separator"]', 
    335    exampleUrl: 'http://www.stage6.com/videos/tag:horror/order:relevancy', 
    336    name: 'Stage6', 
    337    domain: 'http://(www.)?stage6.com/', 
    338    paragraph: '//div[@class="video"]', 
    339    link: 'div[2]//a', 
    340    view: 'div[2]//a/text()' }, 
    341  { url: 'http://www.tokyotosho.com/', 
     331 { url: 'http://www\\.tokyotosho\\.com/', 
    342332   nextLink: '//div[@id="main"]/form/table/tbody/tr/td[@class="nav"]/a[contains(text(),"Next")]', 
    343333   pageElement: '//div[@id="main"]/form/table[@class="listing"]', 
     
    348338   paragraph: '//div[@id="main"]//table[@class="listing"]/tbody/tr/td[@class="desc-top"]/ancestor::tr', 
    349339   link: 'td[@class="desc-top"]/a' }, 
    350  { url: 'http://twitxr.com/', 
     340 { url: 'http://twitxr\\.com/', 
    351341   nextLink: '//div[@id="divTipBody"]/div/p/a[last()]', 
    352342   pageElement: '//div[@id="divTipBody"]', 
    353343   exampleUrl: 'http://twitxr.com/kenmat/', 
    354    name: 'twitxr.com', 
     344   name: 'Twitxr', 
    355345   domain: 'http://twitxr.com/', 
    356346   paragraph: '//div[@id="frontpage"]//div[contains(concat(" ",normalize-space(@class)," ")," update ")]', 
    357347   link: 'a[2]' }, 
    358  { url: 'http://www.urbandictionary.com/define.php', 
     348 { url: 'http://www\\.urbandictionary\\.com/define\\.php', 
    359349   nextLink: '//div[contains(@class,"pager")]/a[last()]', 
    360350   insertBefore: '//div[contains(@class,"pager")]', 
    361351   pageElement: '//div[contains(@class,"pager")]/preceding-sibling::table[1]', 
    362352   exampleUrl: 'http://www.urbandictionary.com/define.php?term=dictionary', 
    363    name: 'urbandictionary', 
     353   name: 'Urban Dictionary', 
    364354   domain: 'urbandictionary.com/define', 
    365355   paragraph: '//td[contains(@class,"def_number")]', 
    366356   stripe: false }, 
    367  { url: 'http://userscripts.org/scripts/search', 
     357 { url: 'http://userscripts\\.org/scripts/search', 
    368358   nextLink: '//div[@class="pagination"]/span[@class="current"]/following-sibling::a[1]', 
    369359   pageElement: 'id("content")/table', 
     
    376366   stripe: true, 
    377367   height: 0 }, 
    378  { url: 'http://userscripts.org/scripts/show/', 
     368 { url: 'http://userscripts\\.org/scripts/show/', 
    379369   nextLink: '//div[@class="pagination"]/span[@class="current"]/following-sibling::a[1]', 
    380370   pageElement: 'id("content")/table', 
     
    384374   paragraph: '//table["wide forums"]/tbody/tr[contains(@class,"post")]', 
    385375   height: 0 }, 
    386  { url: 'http://search.*.auctions.yahoo.co.jp/.*', 
     376 { url: 'http://search[^/]*\\.auctions\\.yahoo\\.co\\.jp/.*', 
    387377   nextLink: '//td[@align="right" and @width="1%"]/small/b[last()]/a', 
    388378   insertBefore: '//center/table/tbody/tr/td[2]/table[last()-4]', 
    389379   pageElement: '//center/table/tbody/tr/td[2]/table[last()-5]', 
    390380   exampleUrl: 'http://search.auctions.yahoo.co.jp/jp/search/auc?p=123&auccat=0&alocale=0jp&acc=jp', 
    391    name: 'Yahoo!Auction', 
     381   name: 'Yahoo! オークション', 
    392382   domain: 'http://*.*.auctions.yahoo.co.jp/', 
    393383   paragraph: '//tr[@bgcolor="#eeeeee"]/td[@align="left"]', 
    394384   link: './/a' }, 
    395  { url: 'http://(list|search)d?.auctions.yahoo.co.jp/.*', 
     385 { url: 'http://(?:list|search)\\d*\\.auctions\\.yahoo\\.co\\.jp/.*', 
    396386   nextLink: '//a[contains(text(), "次の25件")]', 
    397387   pageElement: '(//b[contains(text(), "のオークション")]/ancestor::table)[last()]', 
    398388   exampleUrl: 'http://search5.auctions.yahoo.co.jp/jp/search/auc?p=%A5%EA%A5%CD%A5%F3&auccat=2084063697&alocale=0jp&acc=jp', 
    399    name: 'Yahoo!Auction', 
     389   name: 'Yahoo! オークション', 
    400390   d