Tatoeba Suggest Tags of Siblings

offers to add tags from linked sentences to current sentence

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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);
				}
			}
		}
	}
}