Tatoeba Suggest Tags of Siblings

offers to add tags from linked sentences to current sentence

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name           Tatoeba Suggest Tags of Siblings
// @copyright      Jakob V. <[email protected]>
// @license        Creative Commons Attribution 3.0 Unported (CC BY 3.0) http://creativecommons.org/licenses/by/3.0/
// @description    offers to add tags from linked sentences to current sentence
// @include        http://tatoeba.org/*/sentences/show/*
// @match          http://tatoeba.org/*/sentences/show/*
// @include        http://tatoeba.org/*/user/profile/*
// @match          http://tatoeba.org/*/user/profile/*
// @require        http://code.jquery.com/jquery-latest.min.js
// @version 0.0.1.20150423135046
// @namespace https://greasyfork.org/users/10789
// ==/UserScript==

$(document).ready(main);

function main(){
	facelang = window.location.href.split('/')[3];
	GM_log('facelang: '+facelang);
	
	thisid = window.location.href.split('/')[6];
	GM_log('thisid: '+thisid);
	
	//BEGIN SETTINGS

	direct_load = GM_getValue('direct_load');
	indirect_load = GM_getValue('indirect_load');
	show_doubles = GM_getValue('show_doubles');
	direct_load = ( direct_load==undefined ? true : direct_load );
	indirect_load = ( indirect_load==undefined ? false : indirect_load );
	show_doubles = ( show_doubles==undefined ? false : show_doubles );
	GM_log('direct_load: '+direct_load);
	GM_log('indirect_load: '+indirect_load);
	GM_log('show_doubles: '+show_doubles);

	setup = false;
	if(window.location.href.split('/')[4] == 'user' && window.location.href.split('/')[5] == 'profile' && window.location.href.split('/')[6] == $('.menuSection').attr('href').split('/')[4]){
		setup = true;
		
		if($('.userscriptSettings').is('*')){
			settings = $('.userscriptSettings');
		}
		else{
			settings = $('<div class="module profileSummary userscriptSettings"><h2>userscripts</h2></div>');
			$('.profileSummary').after(settings);
		}
		
		settings.append('<h3>Suggest Tags of Siblings</h3>');
		contentdiv = $('<div id="suggesttagsofsiblings"></div>');
		settings.append(contentdiv);
		
		contentdiv.append('<table>');
		contentdiv.append('<tr><td><label for="direct_load" class="field">direct_load</label></td><td><input type="checkbox" id="direct_load"></td></tr>');
		contentdiv.append('<tr><td><label for="indirect_load" class="field">indirect_load</label></td><td><input type="checkbox" id="indirect_load"></td></tr>');
		contentdiv.append('<tr><td><label for="show_doubles" class="field">show_doubles</label></td><td><input type="checkbox" id="show_doubles"></td></tr>');
		contentdiv.append('</table>');
		
		$('#direct_load')[0].checked = direct_load;
		$('#indirect_load')[0].checked = indirect_load;
		$('#show_doubles')[0].checked = show_doubles;
		
		
		$('#direct_load').change(function(){
			direct_load = this.checked;
			GM_setValue('direct_load',direct_load);
			GM_log('direct_load: '+direct_load);
		});
		
		$('#indirect_load').change(function(){
			indirect_load = this.checked;
			GM_setValue('indirect_load',indirect_load);
			GM_log('indirect_load: '+indirect_load);
		});
		
		$('#show_doubles').change(function(){
			show_doubles = this.checked;
			GM_setValue('show_doubles',show_doubles);
			GM_log('show_doubles: '+show_doubles);
		});
	}
	
	tags = {};
	arrayoftags = [];
	thistags = $('.tagsListOnSentence .tagName');
	thistags.each(function(index){
		arrayoftags[index] = $(this).text();
		tags[thisid] = tags[thisid] || [];
		tags[thisid][index] = $(this).text();
	});
	GM_log('tags['+thisid+']: '+tags[thisid]);
	
	thistags.hover(
		function(){
			tagname = $(this).text();
			GM_log(tagname);
			$(".sentence[tags*='"+tagname.replace(' ', '_')+"'], .mainSentence").css({'background-color':'#D3F3B9'});
		},
		function(){
			tagname = $(this).text();
			GM_log(tagname);
			$(".sentence[tags*='"+tagname.replace(' ', '_')+"'], .mainSentence").css({'background-color':'transparent'});
		}
	);
	
	thistags.each(function(){
		var targettag = $(this);
		var usernumber = targettag.attr('title').split(',')[0].split(':')[1].replace(/^\s*/, "").replace(/\s*$/, "");
		GM_log('http://tatoeba.org/'+facelang+'/users/show/'+usernumber);
		$.get(
			'http://tatoeba.org/'+facelang+'/users/show/'+usernumber,
			function(data) {
				var username = $(data).find('a').attr('href').substr('/deu/user/profile/'.length);
				GM_log(username);
				targettag.attr('title', targettag.attr('title').replace(usernumber, username));
			}
		);
	});
	
	$('.annexeLogEntry.linkAdded div:last-child a').hover(
		function(){
			sentenceid = $(this).text();
			$('.sentence[id^="translation_'+sentenceid +'"]').css({'background-color':'#D3F3B9'});
		},
		function(){
			sentenceid = $(this).text();
			$('.sentence[id^="translation_'+sentenceid +'"]').css({'background-color':'transparent'});
		}
	);
	
	direct_whohaswhichtag = {};
	indirect_whohaswhichtag = {};
	
	direct_div = $('<div class="directTagSuggestions"></div>');
	direct_div.css({'display': 'inline-block','width': '100%'});
	
	indirect_div = $('<div class="indirectTagSuggestions"></div>');
	indirect_div.css({'display': 'inline-block','width': '100%'});
	
	$('#TagAddTagPostForm').after(indirect_div);
	$('#TagAddTagPostForm').after(direct_div);
	
	direct_start = $('<a>Start loading additional tags of direct translations</a>');
	direct_start.css({'display':'block'});
	direct_start.click(function(){
		direct_buttons = $('.directTranslation a.show.button');
		GM_log(direct_buttons.length);
		if(direct_buttons.length>0){
			direct_suggestions = [];
			d = 0;
			direct_getcount = 0;
			direct_waiting = $('<img src="http://flags.tatoeba.org/img/loading-small.gif">');
			direct_start.html(direct_waiting);
			direct_buttons.each(function(index){
				getsentencetags($(this).attr('href').split('/')[4], 'direct');
			});
		}
		else{
			direct_start.text('Reload additional tags of direct translations');
		}
	});
	direct_div.append(direct_start);
	
	indirect_start = $('<a>Start loading additional tags of indirect translations</a>');
	indirect_start.css({'display':'block', 'clear':'both'});
	indirect_start.click(function(){
		indirect_buttons = $('.indirectTranslation a.show.button');
		GM_log(indirect_buttons.length);
		if(indirect_buttons.length>0){
			indirect_suggestions = [];
			i = 0;
			indirect_getcount = 0;
			indirect_waiting = $('<img src="http://flags.tatoeba.org/img/loading-small.gif">');
			indirect_start.html(indirect_waiting);
			indirect_buttons.each(function(index){
				getsentencetags($(this).attr('href').split('/')[4], 'indirect');
			});
		}
		else{
			indirect_start.text('Reload additional tags of indirect translations');
		}
	});
	indirect_div.append(indirect_start);
	
	if(direct_load){
		direct_start.click();
	}
	if(indirect_load){
		indirect_start.click();
	}
	
	function getsentencetags(sentenceid, getsentencetags_where){
		if(sentenceid){
			GM_log('getsentencetags_where: '+getsentencetags_where);
			getsentencetags_where = getsentencetags_where || 'direct';

			$.get(
				//url 
				'http://tatoeba.org/'+facelang+'/sentences/show/'+sentenceid,
				//[ data ] 
				function(data) {
					if(getsentencetags_where == 'direct'){
						direct_getcount++;
						GM_log(direct_getcount);
						if(direct_getcount>=direct_buttons.length){
							direct_start.text('Reload additional tags of direct translations');
						}
					}
					else if(getsentencetags_where == 'indirect'){
						indirect_getcount++;
						GM_log(indirect_getcount);
						if(indirect_getcount>=indirect_buttons.length){
							indirect_start.text('Reload additional tags of indirect translations');
						}
					}
					
					$(data).find('.tagName').each(function(){
						tagname = $(this).text();
						sentence = $('.sentence[id^="translation_'+sentenceid+'"]');
						previoustags = sentence.attr('tags') || '';
						sentence.attr('tags', previoustags + ' '+tagname.replace(' ', '_'));
						render(tagname, getsentencetags_where, sentenceid);
					});
				}
			);
		}
		else{
			if(getsentencetags_where == 'direct'){
				direct_getcount++;
			}
			else if(getsentencetags_where == 'indirect'){
				indirect_getcount++;
			}
		}
	}
	
	function render(tagname, render_where, sentenceid){
		render_where = render_where || 'direct';
		
		GM_log('tagname: '+tagname);
		GM_log('render_where: '+render_where);
		if(true){
			tags[sentenceid] = tags[sentenceid] || [];
			tags[sentenceid][tags[sentenceid].length] = tagname;
			GM_log('tags['+sentenceid+']: '+tags[sentenceid]);
			if(render_where == 'direct'){
				GM_log($.inArray(tagname, arrayoftags)==-1);
				GM_log(show_doubles);
				if( $.inArray(tagname, direct_suggestions)==-1 && ($.inArray(tagname, arrayoftags)==-1 || show_doubles) ){
					GM_log(tagname + ' not in direct_suggestions');
					direct_suggestions[d] = tagname;
					d++;
					taglink = $('<span class="tag"><a class="tagName" href="/'+facelang+'/tags/show_sentences_with_tag/'+tagname.replace(' ', '_')+'">'+tagname+'</a></span>');
					taglink.click(function(e){
						// Cancel the default action
						e.preventDefault();
						//put the tagname into the form field for submission by the user
						$('input#TagTagName').val(tagname);
					});
					taglink.hover(
						function(){
							tagname = $(this).text();
							GM_log(tagname);
							$(".sentence[tags*='"+tagname.replace(' ', '_')+"']").css({'background-color':'#D3F3B9'});
							if($.inArray(tagname, arrayoftags)>-1){
								$(".mainSentence").css({'background-color':'#D3F3B9'});
							}
						},
						function(){
							tagname = $(this).text();
							GM_log(tagname);
							$(".sentence[tags*='"+tagname.replace(' ', '_')+"'], .mainSentence").css({'background-color':'transparent'});
						}
					);
					taglink.css({'background-color':'#D3F3B9','color':'#257D0C'});
					direct_div.append(taglink);
				}
			}
			else if(render_where == 'indirect'){
				if( $.inArray(tagname, indirect_suggestions)==-1 && ($.inArray(tagname, arrayoftags)==-1 || show_doubles) ){
					GM_log(tagname + ' not in indirect_suggestions');
					indirect_suggestions[i] = tagname;
					i++;
					taglink = $('<span class="tag"><a class="tagName" href="/'+facelang+'/tags/show_sentences_with_tag/'+tagname.replace(' ', '_')+'">'+tagname+'</a></span>');
					taglink.click(function(e){
						// Cancel the default action
						e.preventDefault();
						//put the tagname into the form field for submission by the user
						$('input#TagTagName').val(tagname);
					});
					taglink.hover(
						function(){
							tagname = $(this).text();
							GM_log(tagname);
							$(".sentence[tags*='"+tagname.replace(' ', '_')+"']").css({'background-color':'#D3F3B9'});
							if($.inArray(tagname, arrayoftags)>-1){
								$(".mainSentence").css({'background-color':'#D3F3B9'});
							}
						},
						function(){
							tagname = $(this).text();
							GM_log(tagname);
							$(".sentence[tags*='"+tagname.replace(' ', '_')+"'], .mainSentence").css({'background-color':'transparent'});
						}
					);
					taglink.css({'background-color':'#F1F1F1','color':'#849684'});
					indirect_div.append(taglink);
				}
			}
		}
	}
}