/* "URN Redirecter" original Perl version made by Fuji.(KONDOU Kazuhiro) http://www.alib.jp/ http://www.alib.jp/perl/w3m_urn.html JavaScript version for XUL applications made by Piro(SHIMODA Hiroshi) https://piro.sakura.ne.jp/ */ var exRedirectURN = { // 変換テーブルのパス ietfStdTable : 'chrome://extensions/content/urn/urn-ietf-std.properties', ietfFyiTable : 'chrome://extensions/content/urn/urn-ietf-fyi.properties', ietfIdTable : 'chrome://extensions/content/urn/urn-ietf-drafts.properties', publicIdTable : 'chrome://extensions/content/urn/urn-publicids.properties', // URNをURLにリダイレクトする // 不正なURNや、リダイレクト先が見つからない場合、渡されたURIをそのまま返す getURL : function(aURI) { //return 'http://www.alib.jp/cgi-bin/urn.cgi?'+uri; var uri = aURI; var urn_part = uri.match(/^urn:([^:]+):.+$/i); if (!urn_part) return uri; switch(urn_part[1].toLowerCase()) { default: break; case 'ietf': uri = this.getURLFromIETF(uri); break; case 'issn': uri = this.getURLFromISSN(uri); break; case 'isbn': uri = this.getURLFromISBN(uri); break; case 'publicid': uri = this.getURLFromPublicId(uri); break; } return uri; }, // IETFのURNをURLにリダイレクト getURLFromIETF : function(aURI) { var uri = aURI; var urn_part = uri.match(/^urn:ietf:([^:]+):(.+)$/i); if (!urn_part) return uri; var param = urn_part[2], rfcNum = ''; switch(urn_part[1].toLowerCase()) { default: break; case 'rfc': rfcNum = param.replace(/\D/g, ''); break; case 'std': rfcNum = this.getValue(this.ietfStdTable, param.replace(/\D/g, '')); break; case 'fyi': rfcNum = this.getValue(this.ietfFyiTable, param.replace(/\D/g, '')); break; case 'id': param = this.getValue(this.ietfIdTable, param.replace(/[^a-zA-Z\d\-]/g, '')); if (param) return 'http://www.ietf.org/internet-drafts/draft-'+param+'.txt'; break; } return (rfcNum) ? 'http://www.ietf.org/rfc/rfc'+rfcNum+'.txt' : uri ; }, // ISSNのURNをURLにリダイレクト getURLFromISSN : function(aURI) { var uri = aURI; var urn_part = uri.match(/^urn:issn:(\d{4}\-\d{3}[\dx])$/i); return (urn_part) ? 'http://urn.issn.org/urn/?issn='+urn_part[1] : uri ; }, // ISBNのURNをURLにリダイレクト(Powered by Amazon) getURLFromISBN : function(aURI) { var uri = aURI; var urn_part = uri.match(/^urn:isbn:(\d-\d+-\d+-[x\d])$/i); if (!urn_part) return uri; var num = urn_part[1].replace(/-/g, ''); var countryCode = num.substring(0, 1); var lang = (countryCode == 4) ? 'ja' : (countryCode == 1) ? 'en-uk' : (countryCode == 2) ? 'fr' : (countryCode == 3) ? 'de' : 'default' ; var servers = { 'ja' : 'www.amazon.co.jp', 'en-uk' : 'www.amazon.co.uk', 'de' : 'www.amazon.de', 'fr' : 'www.amazon.fr', 'default' : 'www.amazon.com' }; return 'http://'+servers[lang]+'/exec/obidos/ASIN/'+num; }, // パブリックID(公開識別子のURI的解釈)のURNをURLにリダイレクト getURLFromPublicId : function(aURI) { var uri = aURI; var urn_part = uri.match(/^urn:publicid:(.+)$/i); if (!urn_part) return uri; var url = this.getValue(this.publicIdTable, urn_part[1].replace(/:/g, '//').replace(/\+/g, ' ')); // URNから公開識別子へ変換 return (url) ? url : uri ; }, getValue : function(aSource, aKey) { const stringBundleService = Components.classes['@mozilla.org/intl/stringbundle;1'].getService(Components.interfaces.nsIStringBundleService); var strbundle = stringBundleService.createBundle(aSource); var items = strbundle.getSimpleEnumeration(), item; while (items.hasMoreElements()) { item = items.getNext(); item = item.QueryInterface(Components.interfaces.nsIPropertyElement); if (item.key == aKey) return item.value || item.key; } return ''; } }