コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

利用者:Wasabi215/JavaScript置き場

注意

[編集]
  • Wikipediaは誰でも編集することができます(もちろんこのページも)。そのため、(Wikipedia全体にも言えることですが)ここに示すコードが第三者によって悪意のあるコードに書き換えられる恐れがありますので、使用するときには十分注意して下さい。
  • いずれのツールも、誤った出力をすることがありますから、そのまま利用することは好ましくありません。面倒な作業を半自動化する補助的なものとして、ツールの目的を理解した上でご利用ください。
  • 動作確認はChromeのみで行っています。

Citemark改

[編集]

Citemark(英語版ウィキペディア利用者のBazzargh氏作成)というツールがありますが、若干使いにくかったので改造。使用法は元のページを参照して下さい。

javascript:function%20h(t){var%20z=document.getElementsByTagName(t)[0];return%20z&&z.childNodes[0]?e(t,z.childNodes[0].nodeValue):'';}function%20e(a,b){var%20d=Date.parse(b);return%20a&&b?(' |'+a+'='+(d?f(d):b)):''}function%20z(x){return%20x<10?'0'+x:x}function%20f(x){var%20d=new%20Date(x);return%20d.getFullYear()+'-'+z(d.getMonth()+1)+'-'+z(d.getDate())}var%20s=e('url',window.location)+e('accessdate',Date())+e('title',document.title)+e('date',document.lastModified)+e('quote',window.getSelection()+'')+h('h1')+h('h2');var%20m=document.getElementsByTagName('meta');for(var%20i=0;i<m.length;i++){s+=e(m[i].getAttribute('name'),m[i].getAttribute('content'))}prompt('','{{cite%20web'+s+'}}')
  • 改造点
    • 最後のalertprompt
    • |の前に空白を入れ、改行しないように

ウェブアーカイブの検索リンク生成

[編集]

開いているページをWayback machineなどで検索するためのリンクを生成します。

javascript:function%20anc(url,value){return%20'<a%20href="'+url+'"%20target="_blank">'+value+'</a></br>';}var%20url=location.href,obj=window.open();obj.document.open();obj.document.write('<html><body>"'+url+'"へのアーカイブリンク:</br>'+anc('http://web.archive.org/web/*/'+url,'Wayback%20Machine')+anc('http://archive.is/'+location.hostname+location.pathname,'Archive.is')+anc('http://megalodon.jp/?url="'+encodeURIComponent(url),'ウェブ魚拓')+'</br>上のリンクで見つからない場合:</br>'+anc('http://www.webcitation.org/query','WebCite')+anc('http://warp.da.ndl.go.jp/','国立国会図書館インターネット資料収集保存事業')+'</body></html>');obj.document.close()

ソースコード

[編集]
function a(url,value){
	return '<a href="'+url+'">'+value+'</a><br>';
}

var url=location.href,obj=window.open();
obj.document.open();
obj.document.write('<html><head><title>test</title></head><body>"'
	+url+'"へのアーカイブリンク:</br>'
	+a('http://web.archive.org/web/*/'+url,'Wayback Machine')
	+a('http://archive.is/'+location.hostname+location.pathname,'Archive.is')
	+a('http://megalodon.jp/?url='+encodeURIComponent(url),'ウェブ魚拓')
	+'<br>上のリンクで見つからない場合:<br>'
	+a('http://www.webcitation.org/query','WebCite')
	+a('http://warp.da.ndl.go.jp/','国立国会図書館インターネット資料収集保存事業')
	+'</body></html>');
obj.document.close();

国立国会図書館サーチ(テスト中)

[編集]

国立国会図書館サーチの書誌情報をciteテンプレートに整形して出力するブックマークレットです。JSONPを用いて、かなり力技で実装されています。

国立国会図書館のデータベースとcite系テンプレートの間には出力形式の相違がありますので、ツールの出力を手作業で書き換える必要があります

javascript:function%20replaceAll(exp,org,dest){return%20exp.split(org).join(dest);}function%20contains(array,str){for(i%20in%20array){if(array[i]==str){return%20true;}}return%20false;}function%20f(name,val){return%20'%20|'+name+'='+val;}function%20getSrcId(){var%20as=document.getElementsByTagName('a');for(i%20in%20as){if(as[i].href&&as[i].href==as[i].textContent){return%20as[i].href;}}}function%20loadJS(src){var%20srp=document.createElement('script');srp.src=src;document.body.appendChild(srp);}function%20getAuthors(obj){var%20result='';var%20a=obj.dc_creator;for(i%20in%20a){result+=f('author'+(i>0?parseInt(i)+1:''),a[i].name);}return%20result;}function%20getId(obj){var%20result='';var%20id=obj.identifier;if(id){if(id.ISSN){result+=f('issn',id.ISSN[0]);}else%20if(id.ISBN){result+=f('isbn',replaceAll(id.ISBN[0],'-',''));}else%20if(id.OCLCNO){result+=f('oclc',id.OCLCNO[0]);}else%20if(id.JPNO){result+='%20|id={{全国書誌番号|'+id.JPNO[0]+'}}';}var%20ndl=id.NDLJP;if(ndl){result+='%20|id={{NDLJP|'+ndl[0].replace('info:ndljp/pid/','')+'}}%20|url=http://dl.ndl.go.jp/'+ndl[0];}}return%20result;}function%20getDate(obj){var%20dt=obj.date;var%20is=obj.issued;var%20result;if(dt&&is){result=is[0].length>dt[0].length?is[0]:dt[0];}else{result=dt?dt[0]:is[0];}return%20f('year',result.substring(0,4))+(result.length>4?f('date',replaceAll(replaceAll(result,'.','-'),'/','-')):'');}var%20result='{{cite%20';var%20caution='';function%20getPublisher(obj){var%20p=obj.publisher;for(i%20in%20p){result+=(i>0?'、':'%20|publisher=')+p[i].name;var%20pds=obj.publisher[i].description;if(pds){caution+='出版者注記:%20'+pds+'\n';}}}function%20getDesc(obj){var%20dsc=obj.description;if(dsc){caution+='注記:%20'+dsc.join('\n注記:%20');}}function%20show(){prompt(caution,result+'}}');}var%20callback%20=%20function(obj){getDesc(obj);var%20mat=obj.materialType;if(contains(mat,'記事・論文')||contains(mat,'博士論文')){result+='journal%20|和書';result+=getAuthors(obj);result+=f('title',obj.title[0].value);result+=getDate(obj);var%20pb=obj.publicationName;if(pb){var%20vl=pb.volume;if(vl){result+=f('volume',vl);}var%20nb=pb.number;if(nb){result+=f('issue',nb);}var%20is=pb.issue;if(!vl&&!nb&&is){result+=f('issue',is);}var%20pr=pb.pageRange;if(pr){result+=f((pr.indexOf('~')>-1?'pages':'page'),replaceAll(pr,'~','-'));}var%20nsrc=getSrcId();if(nsrc){loadJS(nsrc+'.json?callback=callback2');}}return;}else%20if(contains(mat,'図書')){result+='book%20|和書';result+=f('title',obj.title[0].value);result+=getAuthors(obj);var%20vl=obj.volume;if(vl){result+=f('volume',vl);}var%20ed=obj.edition;if(ed){result+=f('edition',ed.join(',%20'));}getPublisher(obj);result+=getDate(obj);result+=getId(obj);result+='%20|page=';}else%20if(contains(mat,'雑誌')){result+='journal%20|和書%20|author=%20|title=';callback2(obj);return;}else%20if(contains(mat,'政府刊行物')){result+='journal%20|和書%20|title=';result+=getAuthors(obj);result+=getDate(obj);callback2(obj);return;}else{alert(mat.join(',%20')+'は未対応形式です');return;}show();};var%20callback2%20=%20function(obj){getDesc(obj);result+=f('journal',obj.title[0].value);getPublisher(obj);result+=getId(obj);show();};loadJS(location.href+'.json?callback=callback')

使い方

[編集]
  1. 上のコードをお気に入り登録します。
  2. 国立国会図書館サーチで、目的の書誌情報を表示させます。
  3. ページのURLがhttp://iss.ndl.go.jp/books/(英数字)-(英数字)-(数字)(例えばhttp://iss.ndl.go.jp/books/R000000004-I1594544-00)の形式になっていることを確認して、ブックマークレットを実行します。
  4. 実行結果がダイアログに表示されますので、編集ボックスにコピペして下さい。このとき、書誌情報に含まれる注記が一緒に表示されます。注記には雑誌名や出版者の変更などの情報が含まれていますのでこれを確認し、必要があれば出力を書き換えて下さい。例えば次のような出力が得られます。
    {{cite journal |和書 |author=南部 陽一郎 |title=新粒子について(話題) |year=1975 |date=1975-03 |volume=30 |issue=3 |pages=p199-201 |journal=日本物理学会誌 |publisher=日本物理学会 |issn=0029-0181}}
  5. citeテンプレートの形式やその他の慣例、また参照方法に沿って、表記を修正して下さい。
    {{cite journal |和書 |author=南部陽一郎 |title=新粒子について |year=1975 |date=1975-03 |volume=30 |issue=3 |pages=199-201 |journal=日本物理学会誌 |publisher=日本物理学会 |issn=0029-0181 |ref=harv}}
    → 南部陽一郎「新粒子について」『日本物理学会誌』第30巻第3号、日本物理学会、1975年3月、199-201頁、ISSN 0029-0181 

制約事項

[編集]
  • 現状では資料の種別が「図書」、「雑誌」、「記事・論文」、「博士論文」、「政府刊行物」の書誌のみ対応しています。
  • 常に和書形式で出力されます。洋書記事の場合は和書 |を取り除き、author引数をfirst, last引数に書き換えるなどして下さい。
  • 国立国会図書館のデータベースとcite系テンプレートの間には表記形式の相違がありますので、ツールの出力を手作業で書き換える必要があります。
|author=赤間 世紀 著 → |author=赤間世紀
|author=鉄道図書刊行会 [編] → |editor=鉄道図書刊行会
|pages=p199-201 → |pages=199-201
  • 書誌情報をJSONPでリクエストするため、サーバーの混雑状況によっては結果の表示に数秒〜十数秒時間を要します。特に雑誌記事では、掲載誌の情報を取りに行くため2回のリクエストが生じますので、より時間がかかる可能性があります。
  • Wikipediaで用いられる書誌IDのうち、国立国会図書館サーチで取得できるのはISBNISSNOCLC全国書誌番号(JP番号)、NDLJPに限られます。文献のDOIなどが判明している場合、別のツールを用いたほうが正確かつ迅速に書誌情報を取得できるかもしれません。
  • Internet Explorerではブックマークの2084文字制限があります(ソースコードは約3000文字あります)ので、対応していません。

ソースコード

[編集]
// 全置換
function replaceAll(exp,org,dest){
	return exp.split(org).join(dest);
}

// ある要素が配列に含まれているか
function contains(array,str){
	for(i in array){
		if(array[i]==str){
			return true;
		}
	}
	return false;
}

// テンプレート引数の整形
function f(name,val){
	return ' |'+name+'='+val;
}

// (雑誌記事ページで)掲載誌URLを検索
function getSrcId(){
	var as=document.getElementsByTagName('a');
	for(i in as){
		if(as[i].href&&as[i].href==as[i].textContent){
			return as[i].href;
		}
	}
}

// JSONP呼び出し
function loadJS(src){
	var srp=document.createElement('script');
	srp.src=src;
	document.body.appendChild(srp);
}

// 著者をリスト化して出力
function getAuthors(obj,copost){
	var result='';
	var a=obj.dc_creator;
	var al=a.length;
	if(copost&&al>1){
		result+=f('author',a[0].name);
		var ar=new Array(al-1);
		for(i=1;i<al;i++){
			ar[i-1]=a[i].name;
		}
		result+=f('coauthors',ar.join(copost));
	}else{
		for(i in a){
			result+=f('author'+(i>0?parseInt(i)+1:''),a[i].name);
		}
	}
	return result;
}

// 文献IDを取得
function getId(obj){
	var result='';
	var id=obj.identifier;
	if(id){
		if(id.ISSN){
			result+=f('issn',id.ISSN[0]);
		}else if(id.ISBN){
			result+=f('isbn',replaceAll(id.ISBN[0],'-',''));
		}else if(id.OCLCNO){
			result+=f('oclc',id.OCLCNO[0]);
		}else if(id.JPNO){
			result+=' |id={{全国書誌番号|'+id.JPNO[0]+'}}';
		}
		var ndl=id.NDLJP;
		if(ndl){
			result+=' |id={{NDLJP|'+ndl[0].replace('info:ndljp/pid/','')+'}} |url=http://dl.ndl.go.jp/'+ndl[0];
		}
	}
	return result;
}

// 発行日を取得
function getDate(obj){
	var dt=obj.date;
	var is=obj.issued;
	var result;
	if(dt&&is){
		result=is[0].length>dt[0].length?is[0]:dt[0];
	}else{
		result=dt?dt[0]:is[0];
	}
	return f('year',result.substring(0,4))+(result.length>4?f('date',replaceAll(replaceAll(result,'.','-'),'/','-')):'');
}

var result='{{cite ';
var caution='';

// 出版者を取得
function getPublisher(obj){
	var p=obj.publisher;
	for(i in p){
		result+=(i>0?'、':' |publisher=')+p[i].name;
		var pds=obj.publisher[i].description;
		if(pds){
			caution+='出版者注記: '+pds+'\n';
		}
	}
}

// 注記
function getDesc(obj){
	var dsc=obj.description;
	if(dsc){
		caution+='注記: '+dsc.join('\n注記: ');
	}
}

// 結果表示
function show(){
	prompt(caution,result+'}}');
}

// JSONPコールバック
var callback = function(obj){
	getDesc(obj);
	var mat=obj.materialType;
	if(contains(mat,'記事・論文')||contains(mat,'博士論文')){
		result+='journal |和書';
		result+=getAuthors(obj);
		result+=f('title',obj.title[0].value);
		result+=getDate(obj);
		var pb=obj.publicationName;
		if(pb){
			var vl=pb.volume;
			if(vl){
				result+=f('volume',vl);
			}
			var nb=pb.number;
			if(nb){
				result+=f('issue',nb);
			}
			var is=pb.issue;
			if(!vl&&!nb&&is){
				result+=f('issue',is);
			}
			var pr=pb.pageRange;
			if(pr){
				result+=f((pr.indexOf('~')>-1?'pages':'page'),replaceAll(pr,'~','-'));
			}
			var nsrc=getSrcId();
			if(nsrc){
				loadJS(nsrc+'.json?callback=callback2');
			}
		}
		return;
	}else if(contains(mat,'図書')){
		result+='book |和書';
		result+=f('title',obj.title[0].value);
		result+=getAuthors(obj,'・');
		var vl=obj.volume;
		if(vl){
			result+=f('volume',vl);
		}
		var ed=obj.edition;
		if(ed){
			result+=f('edition',ed.join('、'));
		}
		getPublisher(obj);
		result+=getDate(obj);
		result+=getId(obj);
		result+=' |page=';
	}else if(contains(mat,'雑誌')){
		result+='journal |和書 |author= |title=';
		callback2(obj);
		return;
	}else if(contains(mat,'政府刊行物')){
		result+='journal |和書 |title=';
		result+=getAuthors(obj);
		result+=getDate(obj);
		callback2(obj);
		return;
	}else{
		alert(mat.join(', ')+'は未対応形式です');
		return;
	}
	show();
};

// 雑誌目録から雑誌を呼ぶ用
var callback2 = function(obj){
	getDesc(obj);
	result+=f('journal',obj.title[0].value);
	getPublisher(obj);
	result+=getId(obj);
	show();
};

loadJS(location.href+'.json?callback=callback');