Vés al contingut

Usuari:Vriullop/creation.js: diferència entre les revisions

De Viccionari
Contingut suprimit Contingut afegit
canvi per trobar la capçalera, mw afegeix ara una nova àncora que ho trenca
Use of "wgPageName" [+"wgNamespaceNumber"] is deprecated. Use mw.config instead.
Línia 498: Línia 498:


// Mainspace only.
// Mainspace only.
if (wgNamespaceNumber && wgPageName != 'Wiktionary:Sandbox')
if (wgNamespaceNumber && wgPageName != 'Wiktionary:Sandbox')
return;
return;



Revisió del 20:29, 29 ago 2015

/*
Adaptat de en:User:Conrad.Irwin/creation.js

Automatically create form-of entries based on meta-data within entries.
*/

/**
 * Escape the values we are passing to AutoEdit
 */
//AutoEdit irritatingly doesn't undo %XX encodings, so we can't send them.
//FIXME: Not a lot we can do about &s maybe patch AutoEdit.
function get_escape (get) {
    return get.replace (/&/g,"%26"); //This shouldn't do anything to variables.
}
function clean_regexp (re) {
    return re.replace (/([\\\*\+\[\]\{\}\(\)\.~])/g,"\\$1");
}
function clean_variable (va) {
    return va.replace (/([\\~])/g,"\\$1").replace(/&/g,'{'+'{subst:⅋}}').replace(/#/,'{'+'{subst:♯}}'); //Yucky HACK
}
function variable (needle, replacement) {
    return get_escape ('s~{'+'{'+'{' + clean_regexp (needle) + '}}}~' + clean_variable (replacement) + '~g;');
}

/**
 * Variables in the templates.
 */
// The page's language.
function set_lang (lang) {
    return variable ('lang', lang);
}
// The optional language parameter to give to a template
function set_template_lang (lang, form) {
    return variable ('template-lang', '|lang=' + lang);
}
function get_gender_template (gender, lang) {

}
//The gender template with a leading space (or an empty string if no gender)
function set_gender_template (gender, lang) {

    gender = gender.replace('pl','p').replace(/([mfnc])p/, '$1-p');

    if (gender.length === 0) {
        return variable ('gender-template', '');
    } else {
        return variable ('gender-template', '{'+'{'+ gender + '}}');
    }
}

//The optional |g= argument to { {head}}
function set_template_gender (gender, lang, form) {
    if (form == 'diminutive-plural')
        return variable('template-gender','|plural=1');
    if (form == 'plural' && gender.indexOf('p') < 0)
       gender += 'p';
    if (lang == 'ca' || lang == 'es' || lang == 'it')
        return variable('template-gender','|' + gender);

    gender = gender.replace('pl','p').replace(/([mfnc])p/, '$1-p');

    if (gender.length === 0)
        return variable('template-gender','');
    else
        return variable('template-gender', '|g=' + gender);
}
//Form of templates for genders. These are the ones that exist, if we need others,
//either create them or use { {form-of}} manually.
function gender_form (gender) {

    if (gender == 'mpl') {
        return 'masculina plural';
    } else if (gender == 'f') {
        return 'femenina';
    } else if (gender == 'fpl') {
        return 'femenina plural';
    } else if (gender == 'n') {
        return 'neutra';
    } else if (gender == 'mfpl'){
        return 'plural';
    } else {
        throw("Not simple gender?!");
    }

}
// This pages name.
// Returns in PIPED format. Which, while kind of bad, works as either embedded in [[%s]] or { {template|%s}}
// and most templates take an optional display parameter as the first after the link.
function set_origin (given, lang) {

    //Remove links from given parameters, and unencode underscores to spaces
    if (given) {
        given = given.replace(/\[\[([^\|\]])*\|?([^\]]+)\]\]/g,"$2").replace(/_/g,' ');
        if (lang == "ca" || lang == "es") {
            return variable ('origin', given);
        }
        else {
            return variable ('origin', wgTitle + '|' + given);
        }
    }

    return variable ('origin', wgTitle);
}
// The page we are about to create with links on individual words.
function set_pagename_linked_and_template_head (link, lang, form) {
	var pagename = (link.innerText || link.textContent);
	
	var op = pagename;
	// pagename = pagename.replace (/([ -])/g,"]]$1[[");
	// les plantilles ja inclouen enllaços a cada mot i això sembla que està provocant errors
	
	var templateHead = '';
	
	if (op != pagename) {
		pagename = '[['+pagename+']]';
		return variable('pagename-linked', pagename) + variable('template-head','|head=' + pagename);
	} else if (form == 'trad') {
		pos = get_part_of_speech(link);
		if (lang == 'eo') {
			switch (pos) {
				case 'Adjectiu':
					templateHead = 'eo-lema'; break;
				case 'Adverbi':
					templateHead = 'eo-lema'; break;
				case 'Nom':
					templateHead = 'eo-lema'; break;
				case 'Verb':
					templateHead = 'eo-lema'; break;
				default:
					templateHead = '';
			}
		} else if (lang == 'es') {
			switch (pos) {
				case 'Adjectiu':
					templateHead = 'es-adj'; break;
				case 'Adverbi':
					templateHead = 'lema|es|adv'; break;
				case 'Nom':
					templateHead = 'es-nom|?'; break;
				case 'Verb':
					templateHead = 'es-verb'; break;
				default:
					templateHead = '';
			}
		} else if (lang == 'en') {
			switch (pos) {
				case 'Adjectiu':
					templateHead = 'en-adj|?'; break;
				case 'Adverbi':
					templateHead = 'en-adv|?'; break;
				case 'Nom':
					templateHead = 'en-nom'; break;
				default:
					templateHead = '';
			}
		} else if (lang == 'fr') {
			switch (pos) {
				case 'Adjectiu':
					templateHead = 'fr-adj'; break;
				case 'Adverbi':
					templateHead = 'lema|fr|adv'; break;
				case 'Nom':
					templateHead = 'fr-nom|?'; break;
				default:
					templateHead = '';
			}
		} else if (lang == 'it') {
			switch (pos) {
				case 'Adjectiu':
					templateHead = 'it-adj'; break;
				case 'Adverbi':
					templateHead = 'it-adv'; break;
				case 'Nom':
					templateHead = 'it-nom|?'; break;
				default:
					templateHead = '';
			}
		} else {
			switch (pos) {
				case 'Nom':
					templateHead = 'lema|' + lang +'|nom'; break;
				case 'Adjectiu':
					templateHead = 'lema|' + lang +'|adj'; break;
				case 'Adverbi':
					templateHead = 'lema|' + lang +'|adv'; break;
				default:
					templateHead = '';
			}
		}
	}
	
	return variable('pagename-linked', pagename) + variable('template-head',templateHead);
}

function set_template_sc (lang) {
    var sc;
    switch (lang) {
        case 'he':
            sc = 'Hebr';
            break;
        default:
            return variable('template-sc','');
    }
    return variable('template-sc','|sc='+sc);
}

//The form-of template we are to use - used for the basic verbs.
function set_form_template (form, lang, gender, link) {
	var formof = form.replace(/-/g,' ');
	
	if (formof == 'plural') {
		return variable('form-template', 'forma-p');
	} else if (formof == 'femenina') {
		return variable('form-template', 'forma-f');
	}
	
	return variable('form-template', 'forma-|' + formof);
}

//The part of speech, normally determined by other means.
function get_part_of_speech (link) {

    var node = link;
    while(node) {
        while (node.previousSibling) {
            node = node.previousSibling;
            if (node.nodeType == 1 && node.nodeName.match(/^[hH]3$/)) {
                return $( node ).find( ".mw-headline" ).text().replace(/^[1-9.]* /,'');
            }
        }
        node = node.parentNode;
    }
    throw("This entry seems to be formatted incorrectly.");

}
function set_part_of_speech (link,lang,form) {

    return variable('part-of-speech', get_part_of_speech(link));
}
/**
 * Check if we know of a template that will do the job.
 * Use an explicit list to make it harder to subvert.
 */
function get_preload_template (form, lang, link) {

	var prefix = 'User:Vriullop/creation/';
	var pos = get_part_of_speech(link);
	
	if (form == 'trad') {
		if (lang == 'eo' && (pos == 'Nom' || pos == 'Adjectiu' || pos == 'Adverbi' || pos == 'Verb')) {
			return prefix + 'eoTrad';
		}
		else if (lang == 'es' && (pos == 'Nom' || pos == 'Adjectiu' || pos == 'Adverbi' || pos == 'Verb')) {
			return prefix + 'esTrad';
		}
		else if (lang == 'it' && (pos == 'Nom' || pos == 'Adjectiu' || pos == 'Adverbi')) {
			return prefix + 'esTrad';
		}
		else if (pos == 'Nom' || pos == 'Adjectiu' || pos == 'Adverbi') {
			return prefix + 'baseTrad';
		}
		else {
			return false;
		}
	}
	else if ((lang == 'ca' || lang == 'es' || lang == 'it') && pos == 'Adjectiu') {
		return prefix + lang + 'Adj';
	}
	else if ((lang == 'ca' || lang == 'es' || lang == 'it') && pos == 'Nom') {
		return prefix + lang + 'Nom';
	}
	else if (lang == 'eo') {
		return prefix + 'eoBase';
	}
	else if (lang == 'en' && pos == 'Adverbi') {
		return prefix + 'baseAdv';
	}
	else if (lang == 'en' && pos == 'Adjectiu') {
		return prefix + 'baseAdj';
	}
	else if (lang == 'en' && pos == 'Nom') {
		return prefix + 'baseNom';
	}
	else {
		return false;
	}
}

function unAnchorEncode(x) {
    return decodeURI(x.replace(/\./g, '%'));
}
/**
 * Convert a raw new link into a snazzy one.
 */
function add_create_button (details, link) {

    var d = {
        lang: 'ca',
        lang2: null,
        gender: '',
        form: '',
        origin: wgTitle,
        given_origin: false,
        pos: get_part_of_speech(link),
        target: (link.innerText || link.textContent)
    }

    for (var i = 0;i < details.length; i++) {
        if (details[i].match(/(^| +)([^ ]+)-form-of( +|$)/)) {
            d.form = RegExp.$2;
        } else if (details[i].match(/(^| +)lang-([^ ]+)( +|$)/)) {
            d.lang = RegExp.$2;
        } else if (details[i].match(/(^| +)lang2-([^ ]+)( +|$)/)) {
            d.lang2 = RegExp.$2;
        } else if (details[i].match(/(^| +)gender-(([mfni]+|c)(pl)?)( +|$)/)) {
            d.gender = RegExp.$2;
        } else if (details[i].match(/(^| +)origin-(.+)( +|$)/)) {
            d.given_origin = unAnchorEncode(RegExp.$2);
        } else if (details[i].match(/(^| +)transliteration-(.+)( +|$)/)) {
            d.transliteration = unAnchorEncode(RegExp.$2);
        }

    }

    var workerHref = '';

    try {
        if (d.pos && (preload = get_preload_text(d))) {

            workerHref = '&preloadtext=' + encodeURIComponent(preload);

        } else if (d.pos && (preload = get_preload_template(d.form, d.lang, link)) ) {
                workerHref = '&preload=' + encodeURIComponent(preload) + '&autoedit='
                            + ((d.form == 'trad' || d.lang == 'eo') ? set_part_of_speech (link,d.lang,d.form) : '')
                            + set_lang (d.lang) + set_template_lang (d.lang, d.form)
                            + set_gender_template (d.gender, d.lang) + set_template_gender(d.gender, d.lang, d.form)
                            + set_origin (d.given_origin, d.lang2 ? d.lang2 : d.lang) + set_pagename_linked_and_template_head (link, d.lang, d.form)
                            + set_form_template (d.form, d.lang, d.gender, link)
                            + set_template_sc (d.lang)
        }

        if (workerHref) {

            link.href += '&editintro=User:Vriullop/creation/intro' + workerHref
                    + '&autosummary=' + encodeURIComponent(
                        'Creant forma ' + d.form + ' de ' + d.lang + '.[[' + d.origin
                        + ']] ([[VC:ACC|Accelerat]])' )
                    + '&autominor=false';

            link.style.color = '#22CC00';
        }
        }catch(e) {
        }
}

/**
 * For many languages the above is far too limiting - so let's define some more powerful functions.
 *
 * The functions are structured top-down, this allows innermost functions to just return text that is
 * wrapped by outer functions, seems to result in shorter code, but should probably be refactored out :p.
 *
 * So each "declaration function" accepts a function (f) and returns an "edit function".
 * and each "edit function" accepts some details (d) and returns the text to be wrapped (by calling f(d) where necessary)
 */
function get_preload_text(d) {
    try{
        return get_preload_text[d.lang](d);
    } catch (e) {
        return false;
    }
}

/**
    These templates are for constructing preloadtext manually.
*/

function language_header(f) {
    return function (d) { return "=={"+"{-" + d.lang + "-}}==\n\n" + f(d);};
}

// Find the part of speech by looking at the current part of speech heading
function default_pos(f) {
    return function (d) {
        return "===" + d.pos + "===\n" + f(d);
    };
}

// { {head|fr|...}}
function head_template(f) {
    return function (d) {
        return "{"+"{head|" + d.lang + "|" + (
            d.gender.indexOf('pl') > -1 ? 'plural' : d.pos.toLowerCase()
        ) + (
            (d.gender ? "|g=" + d.gender.replace('pl','') : "") + (d.gender.indexOf('pl') > -1 ? '|g2=p' : '')
        ) + "}}\n\n" + f(d);
    }
}
// { {head|nl}}
function posless_head(f) {
    return function (d) {
        return '{' + '{head|' + d.lang + '}}\n\n' + f(d);
    }
}

// { {head|nl}} or { {nl-noun-dim}}
function nl_head(f) {
    return function (d) {
        if (d.form == 'diminutive') {
            return '{' + '{nl-noun-dim}}\n\n' + f(d);
        } else if (d.pos == "Noun" && d.form == 'plural') {
        	return '{' + '{lema|nl|substantiu en plural}}\n\n' + f(d)
        } else {
            return '{' + '{lema|nl}}\n\n' + f(d);
        }
    }
}

// { {tg-word}}
function tajik_head(f) {
    return function(d) {
        var head = '{'+'{tg-word' + (d.transliteration ? ('|tr=' + d.transliteration) : '') + '}}';
        return head + "\n\n" + f(d);
    }
}

// All definition lines start with #
function definition_line(f) {
    return function (d) { return "# " + f(d) + "\n"; };
}

// Common part of eo
function eo_form_of(f) {
    return function (d) { return '{'+'{eo-form of|' + f(d) + '}}'; };
}

// These ones always seem to happen toegether
function basic_entry(f) {
    return language_header( default_pos( f ) );
}

// English
//get_preload_text.en =

// Esperanto
//get_preload_text.eo =

// French
//get_preload_text.fr =

/** A sanely named wrapper around throw */
function preload_text_error() { throw true; }

/**
 * Recursively find first red link in "form-of" spans.
 * FIXME: would be better to return an array as multiple params often occur
 */
function find_red_link (span) {

    var poss = span.firstChild;

    while (poss) {
        if(poss.nodeType == 1) {
            if (poss.nodeName.toUpperCase () == 'A' && poss.className.indexOf('new') >= 0)
                return poss;
            else if (recurse = find_red_link(poss))
                return recurse;
        }
        poss = poss.nextSibling;
    }

    return null;
}
/**
 * Recursively find anything tagged with "form-of"
 */

function find_form_of_spans () {
    if (typeof(document.getElementsByClassName) == 'function') {
        return document.getElementsByClassName('form-of');
    } else {
        var spans = document.getElementsByTagName ('span');
        var form_ofs = new Array ();

        for (var i=0; i<spans.length; i++) {
            if (spans[i].className.match(/(^| +)form-of( +|$)/)) {
                form_ofs.push (spans[i]);
            }
        }

        return form_ofs;
    }
}

/**
 * Get the show on the road
 */
jQuery(document).ready(function () {

    // Mainspace only.
    if (mw.config.get('wgNamespaceNumber') && mw.config.get('wgPageName') != 'Wiktionary:Sandbox')
        return;

    poss = find_form_of_spans ();

    for (var i = 0;i<poss.length; i++) {
        var link = find_red_link (poss[i]);
        if (link) {
            add_create_button (poss[i].className.replace(/(^| +)form-of( +|$)/,'').split(' '), link);
        }
    }

} );