User:Nikki/LexemeEntitySuggester.js

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/**
 * This script adds various entity suggestions on lexeme pages.
 * 
 * Property suggestions on lexemes, senses and forms are defined below.
 * 
 * Suggestions for P5402 (homograph lexeme), P5425 (Han character in this lexeme),
 * P9531 (identifier shared by lexeme), P5238 (combines) and P5137 (item for
 * this sense) are based on the current lemma.
 * 
 * Suggestions for P5973 (synonym), P5974 (antonym), P6593 (hyperonym),
 * P8471 (pertainym) are based on the text entered into the field. For speed
 * reasons, this only returns results which are an exact match (including
 * capitalisation).
 * 
 * To use it, add the following line to your common.js:
 * mw.loader.load("//www.wikidata.org/w/index.php?title=User:Nikki/LexemeEntitySuggester.js&action=raw&ctype=text/javascript");
 */
(function () {
	"use strict";

	var suggestions = {
		"Q188": { // de, German
			"lexemes": {
				"mainsnak": [
					{ id: "P8376", label: "Duden ID" },
					{ id: "P9940", label: "DWDS lemma ID" },
					{ id: "P9947", label: "WDG lemma ID" },
					{ id: "P9384", label: "Adelung lemma ID" },
					{ id: "P9385", label: "DWB lemma ID" },
					{ id: "P9386", label: "DWB2 lemma ID" },
					{ id: "P9387", label: "GWB lemma ID" },
					{ id: "P9388", label: "Meyers lemma ID" },
					{ id: "P9389", label: "RDWB1 lemma ID" },
					{ id: "P9390", label: "Wander lemma ID" },
					{ id: "P6597", label: "DFD ID", description: "namenforschung.net", lexcat: ["Q147276"] }, 
					{ id: "P5185", label: "grammatical gender", lexcat: ["Q1084", "Q147276", "Q102047"] }, // n, propn, suffix
					{ id: "P5402", label: "homograph lexeme" },
					{ id: "P5238", label: "combines" },
					{ id: "P5191", label: "derived from" },
					{ id: "P5923", label: "creates lexeme type", lexcat: ["Q102047"] }, // suf
					{ id: "P5401", label: "auxiliary verb", lexcat: ["Q24905"] }, // v
					{ id: "P5911", label: "inflection class", lexcat: ["Q1084"] }, // n
					{ id: "P7706", label: "nominalised form", description: "adj→n, v→n or num→n", lexcat: ["Q34698", "Q24905", "Q63116"] }, // adj, v, num
					{ id: "P5713", label: "requires grammatical feature", lexcat: ["Q4833830"] }, // prep
					{ id: "P973", label: "described at URL" },
					{ id: "P1343", label: "described by source" },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
				"qualifiers": [
					{ id: "P9531", label: "identifier shared with lexeme" },
					{ id: "P585", label: "point in time" },
					{ id: "P2868", label: "subject has role" }
				]
			},
			"senses": {
				"mainsnak": [
					{ id: "P5137", label: "item for this sense" },
					{ id: "P9970", label: "predicate for" },
					{ id: "P10339", label: "semantic gender" },
					{ id: "P6084", label: "location of sense usage" },
					{ id: "P9488", label: "field of usage" },
					{ id: "P6191", label: "language style" },
					{ id: "P6271", label: "demonym of" },
					{ id: "P5972", label: "translation" },
					{ id: "P5973", label: "synonym" },
					{ id: "P5974", label: "antonym" },
					{ id: "P6593", label: "hyperonym" },
					{ id: "P8471", label: "pertainym", description: "adj→n or adv→adj, e.g. lunar→moon, slowly→slow" },
				]
			},
			"properties": {
				"P5185": [ // grammatical gender
					{ id: "Q499327", label: "masculine" },
					{ id: "Q1775415", label: "feminine" },
					{ id: "Q1775461", label: "neuter" },
				],
				"P5401": [ // auxiliary verb
					{ id: "L4179", label: "haben" },
					{ id: "L1761", label: "sein" },
				],
				"P5713": [ // requires grammatical feature
					{ id: "Q131105", label: "nominative case" },
					{ id: "Q146233", label: "genitive case" },
					{ id: "Q145599", label: "dative case" },
					{ id: "Q146078", label: "accusative case" },
				],
				"P5911": [ // inflection class
					{ id: "Q104023380", label: "n-declension" },
					{ id: "Q105099779", label: "n-declension with genitive s" },
					{ id: "Q103383087", label: "adjectival declension" },
					{ id: "Q105627457", label: "-/¨e" },
					{ id: "Q105571268", label: "-/(e)n" },
					{ id: "Q105628811", label: "-/s" },
					{ id: "Q105683521", label: "-(e)s/-" },
					{ id: "Q105658318", label: "-(e)s/s" },
				],
				"P5923": [ // creates lexeme type
					{ id: "Q1084", label: "noun" },
					{ id: "Q24905", label: "verb" },
					{ id: "Q34698", label: "adjective" },
					{ id: "Q380057", label: "adverb" },
				],
				"P6084": [ // location of sense usage
					{ id: "Q183", label: "Germany" },
					{ id: "Q40", label: "Austria" },
					{ id: "Q39", label: "Switzerland" },
					{ id: "Q15124", label: "South Tyrol" },
					{ id: "Q46613", label: "Northern Germany" },
					{ id: "Q919721", label: "Eastern Germany" },
					{ id: "Q124013999", label: "Western Germany" },
					{ id: "Q46519", label: "Southern Germany" },
					{ id: "Q524856", label: "Central Germany" },
				],
				"P11053": [ // grammatical person
					{ id: "Q21714344", label: "first person" },
					{ id: "Q51929049", label: "second person" },
					{ id: "Q51929074", label: "third person" },
				],
				"P11054": [ // grammatical number
					{ id: "Q110786", label: "singular" },
					{ id: "Q146786", label: "plural" },
				],
			},
		},
		"Q42365": { // ang, Old English
			"lexemes": {
				"mainsnak": [
					{ id: "P11575", label: "Bosworth-Toller's Anglo-Saxon Dictionary Online ID" },
					{ id: "P5185", label: "grammatical gender", lexcat: ["Q1084", "Q147276", "Q102047"] }, // n, propn, suffix
					{ id: "P5191", label: "derived from" },
					{ id: "P973", label: "described at URL" },
				],
			},
		},
		"Q13955": { // ar, Arabic
			"lexemes": {
				"mainsnak": [
					{ id: "P11038", label: "Arabic Ontology lemma ID" },
					{ id: "P5185", label: "grammatical gender", lexcat: ["Q1084", "Q147276", "Q102047"] }, // n, propn, suffix
					{ id: "P5191", label: "derived from" },
					{ id: "P973", label: "described at URL" },
				],
			},
			"forms": {
				"mainsnak": [
					{ id: "P11757", label: "Arabic Ontology form ID" },
				],
			},
		},
		"Q33000": { // bfi, BSL
			"forms": {
				"mainsnak": [
					{ id: "P10", label: "video" },
				],
			},
		},
		"Q34271": { // bo, Tibetan
			"forms": {
				"mainsnak": [
					{ id: "P4187", label: "Wylie transliteration" },
					{ id: "P443", label: "pronunciation audio" },
					{ id: "P898", label: "IPA transcription" },
				],
			},
		},
		"Q143": { // eo, Esperanto
			"lexemes": {
				"mainsnak": [
					{ id: "P8202", label: "Reta Voraro ID" },
					{ id: "P8029", label: "PIV Online ID" },
					{ id: "P5238", label: "combines" },
					{ id: "P5191", label: "derived from" },
					{ id: "P973", label: "described at URL" },
					{ id: "P1343", label: "described by source" },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
				"qualifiers": [
					{ id: "P585", label: "point in time" },
				]
			},
		},
		"Q1860": { // en, English
			"lexemes": {
				"mainsnak": [
                    { id: "P12510", label: "OED object ID" },
                    { id: "P11481", label: "Green's Slang Dictionary ID" },
                    { id: "P12448", label: "DARE (Regional American) ID" },
					{ id: "P5238", label: "combines" },
					{ id: "P5191", label: "derived from" },
					{ id: "P973", label: "described at URL" },
					{ id: "P1343", label: "described by source" },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P5275", label: "OED Online ID (pre-July 2023" }
				],
			},
		},
		"Q1412": { // fi, Finnish
			"lexemes": {
				"mainsnak": [
					{ id: "P11836", label: "Suomen etymologinen sanakirja ID" },
					{ id: "P11837", label: "Suomen murteiden sanakirja ID" },
					{ id: "P5191", label: "derived from" },
					{ id: "P973", label: "described at URL" },
				],
			},
		},
		"Q27175": { // fy, Western Frisian
			"lexemes": {
				"mainsnak": [
					{ id: "P5185", label: "grammatical gender", lexcat: ["Q1084", "Q147276"] }, // n, propn
					{ id: "P9158", label: "Wurdboek fan de Fryske taal GTB ID" },
					{ id: "P5238", label: "combines" },
					{ id: "P5191", label: "derived from" },
					{ id: "P973", label: "described at URL" },
					{ id: "P1343", label: "described by source" },
				],
			},
		},
		"Q837985": { // gmh, Middle High German
			"lexemes": {
				"mainsnak": [
					{ id: "P5185", label: "grammatical gender", lexcat: ["Q1084", "Q147276"] }, // n, propn
					{ id: "P9377", label: "BMZ lemma ID" },
					{ id: "P9378", label: "FindeB lemma ID" },
					{ id: "P9379", label: "Lexer lemma ID" },
					{ id: "P9380", label: "LexerN lemma ID" },
					{ id: "P9358", label: "MWB lemma ID" },
					{ id: "P9351", label: "MHDBDB lemma ID" },
					{ id: "P5191", label: "derived from" },
					{ id: "P973", label: "described at URL" },
					{ id: "P5238", label: "combines" },
					{ id: "P1343", label: "described by source" },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
			},
		},
		"Q35218": { // goh, Old High German
			"lexemes": {
				"mainsnak": [
					{ id: "P9312", label: "AWB lemma ID" },
					{ id: "P5185", label: "grammatical gender", lexcat: ["Q1084", "Q147276"] }, // n, propn
					{ id: "P5191", label: "derived from" },
					{ id: "P5238", label: "combines" },
					{ id: "P973", label: "described at URL" },
					{ id: "P1343", label: "described by source" },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
			},
		},
		"Q11051": { // hi/ur, Hindustani
			"lexemes": {
				"mainsnak": [
					{ id: "P11350", label: "Urdu Lughat ID" },
					{ id: "P5185", label: "grammatical gender", lexcat: ["Q1084", "Q147276", "Q102047"] }, // n, propn, suffix
					{ id: "P5191", label: "derived from" },
					{ id: "P973", label: "described at URL" },
				],
			},
		},
		"Q5287": { // ja, Japanese
			"lexemes": {
				"mainsnak": [
					{ id: "P11700", label: "JMdict sequence number" },
					{ id: "P5191", label: "derived from" },
					{ id: "P5425", label: "Han character in this lexeme" },
					{ id: "P5238", label: "combines" },
					{ id: "P973", label: "described at URL" },
					{ id: "P1343", label: "described by source" },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
			},
			"forms": {
				"mainsnak": [
					{ id: "P2125", label: "Revised Hepburn romanisation" },
					{ id: "P2440", label: "transliteration" },
					{ id: "P443", label: "pronunciation audio" },
					{ id: "P898", label: "IPA transcription" },
				],
				"qualifiers": [
					{ id: "P459", label: "determination method" },
				],
			},
		},
		"Q9176": { // ko, Korean
			"lexemes": {
				"mainsnak": [
					{ id: "P11124", label: "Basic Korean Dictionary ID" },
					{ id: "P11125", label: "Standard Korean Language Dictionary ID" },
					{ id: "P5238", label: "combines" },
					{ id: "P5191", label: "derived from" },
					{ id: "P973", label: "described at URL" },
					{ id: "P1343", label: "described by source" },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
			},
			"forms": {
				"mainsnak": [
					{ id: "P2001", label: "Revised Romanisation" },
					{ id: "P1942", label: "McCune-Reischauer romanisation" },
					{ id: "P443", label: "pronunciation audio" },
					{ id: "P898", label: "IPA transcription" },
				],
				"qualifiers": [
					{ id: "P5237", label: "pronunciation variety" },
				],
			},
		},
		"Q9051": { // lb, Luxembourgish
			"lexemes": {
				"mainsnak": [
					{ id: "P9397", label: "LOD ID" },
					{ id: "P5185", label: "grammatical gender", lexcat: ["Q1084", "Q147276"] },
					{ id: "P973", label: "described at URL", description: "lod.lu" },
					{ id: "P5238", label: "combines" },
					{ id: "P5191", label: "derived from" },
					{ id: "P1343", label: "described by source" },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
			},
		},
		"Q9246": { // mn, Mongolian
			"lexemes": {
				"mainsnak": [
					{ id: "P11264", label: "mongoltoli.mn" },
					{ id: "P11261", label: "toli.query.mn" },
					{ id: "P11262", label: "toli.gov.mn" },
					{ id: "P973", label: "described at URL", description: "dict.ac.mn" },
					{ id: "P5238", label: "combines" },
					{ id: "P5191", label: "derived from" },
					{ id: "P1343", label: "described by source" },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
			},
		},
		"Q33638": { // mnc, Manchu
			"forms": {
				"mainsnak": [
					{ id: "P5139", label: "Möllendorff transliteration" },
					{ id: "P443", label: "pronunciation audio" },
					{ id: "P898", label: "IPA transcription" },
				],
			},
		},
		"Q9166": { // mt, Maltese
			"lexemes": {
				"mainsnak": [
					{ id: "P5928", label: "Ġabra lexeme ID" },
					{ id: "P5185", label: "grammatical gender", lexcat: ["Q1084", "Q147276"] },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
			},
		},
		"Q25167": { // nb, Norwegian Bokmål
			"lexemes": {
				"mainsnak": [
					{ id: "P5911", label: "bøyningsklasse" },
					{ id: "P5238", label: "sammensatt av" },
					{ id: "P5191", label: "har opphav i" },
					{ id: "P7706", label: "substantivform" },
					{ id: "P5831", label: "brukseksempel" },
					{ id: "P5402", label: "homograf" },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
				"qualifiers": [
					{ id: "P6072", label: "demonstrerer betydning" },
					{ id: "P5830", label: "demonstrerer form" },
				],
			},
			"senses": {
				"mainsnak": [
					{ id: "P5137", label: "element for betydning" },
					{ id: "P9970", label: "predicate for" },
					{ id: "P5713", label: "requires grammatical feature" },
					{ id: "P9295", label: "transitivitet" },
					{ id: "P6271", label: "demonym for" },
					{ id: "P5974", label: "antonym" },
					{ id: "P6593", label: "hyperonym" },
					{ id: "P8471", label: "pertainym" },
					{ id: "P5973", label: "synonym" },
				]
			},
			"forms": {
				"mainsnak": [
					{ id: "P898", label: "IPA-transkripsjon" },
				],
				"qualifiers": [
					{ id: "P5237", label: "uttalevariant" },
				]
			}
		},
		"Q14549": { // sco, Scots
			"lexemes": {
				"mainsnak": [
					{ id: "P11347", label: "Scottish National Dictionary lexeme ID" },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
			}
		},
		"Q9027": { // sv, Swedish
			"lexemes": {
				"mainsnak": [
					{ id: "P8478", label: "Svenska Akademiens Ordbok-ID" },
					{ id: "P5185", label: "grammatical gender", lexcat: ["Q1084", "Q147276"] }, // n, propn
					{ id: "P5402", label: "homograph lexeme" },
					{ id: "P5238", label: "combines" },
					{ id: "P5191", label: "derived from" },
					{ id: "P5831", label: "usage example" },
					{ id: "P7706", label: "nominalised form", description: "adj→n or v→n", lexcat: ["Q34698", "Q24905"] }, // adj, v
					{ id: "P973", label: "described at URL" },
					{ id: "P1343", label: "described by source" },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
				"qualifiers": [
					{ id: "P585", label: "point in time" },
					{ id: "P5830", label: "demonstrates form" },
					{ id: "P6072", label: "demonstrates sense" },
					{ id: "P1545", label: "series ordinal" },
					{ id: "P5548", label: "derived from form" },
					{ id: "P5980", label: "derived from sense" },
					{ id: "P2868", label: "subject has role" }
				]
			},
			"senses": {
				"mainsnak": [
					{ id: "P5137", label: "item for this sense" },
					{ id: "P9970", label: "predicate for" },
					{ id: "P6084", label: "location of sense usage" },
					{ id: "P9488", label: "field of usage" },
					{ id: "P6271", label: "demonym of" },
					{ id: "P5972", label: "translation" },
					{ id: "P5973", label: "synonym" },
					{ id: "P5974", label: "antonym" },
					{ id: "P6593", label: "hyperonym" },
					{ id: "P8471", label: "pertainym", description: "adj→n or adv→adj, e.g. lunar→moon, slowly→slow" },
				]
			},
		},
		"Q9217": { // th, Thai
			"forms": {
				"mainsnak": [
					{ id: "P10694", label: "RTGS" },
					{ id: "P443", label: "pronunciation audio" },
					{ id: "P898", label: "IPA transcription" },
				],
				"qualifiers": [
					{ id: "P5237", label: "pronunciation variety" },
				],
			},
		},
		"Q8641": { // yi, Yiddish
			"lexemes": {
				"mainsnak": [
					{ id: "P5185", label: "grammatical gender", lexcat: ["Q1084", "Q147276"] },
					{ id: "P5238", label: "combines" },
					{ id: "P5191", label: "derived from" },
					{ id: "P973", label: "described at URL" },
					{ id: "P1343", label: "described by source" },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
				"qualifiers": [
					{ id: "P5237", label: "pronunciation variety" },
				],
			},
		},
		"Q9186": { // yue, Cantonese
			"lexemes": {
				"mainsnak": [
					{ id: "P9992", label: "CantoDict word ID" },
					{ id: "P9993", label: "CantoDict character ID" },
					{ id: "P973", label: "described at URL" },
					{ id: "P5425", label: "Han character in this lexeme" },
					{ id: "P5238", label: "combines" },
					{ id: "P5191", label: "derived from" },
					{ id: "P1343", label: "described by source" },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
			},
			"forms": {
				"mainsnak": [
					{ id: "P9311", label: "Jyutping" },
					{ id: "P9313", label: "Yale" },
				],
				"qualifiers": [
					{ id: "P5237", label: "pronunciation variety" },
				],
			},
		},
		"Q9192": { // zh, Mandarin
			"lexemes": {
				"mainsnak": [
					{ id: "P5425", label: "Han character in this lexeme" },
					{ id: "P5238", label: "combines" },
					{ id: "P5191", label: "derived from" },
					{ id: "P973", label: "described at URL" },
					{ id: "P1343", label: "described by source" },
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
			},
			"forms": {
				"mainsnak": [
					{ id: "P1721", label: "pinyin transliteration" },
					{ id: "P443", label: "pronunciation audio" },
					{ id: "P898", label: "IPA transcription" },
				],
				"qualifiers": [
					{ id: "P5237", label: "pronunciation variety" },
				],
			},
		},
		"*": { // All other languages
			"lexemes": {
				"mainsnak": [
					{ id: "P5238", label: "combines" },
					{ id: "P5191", label: "derived from" },
					{ id: "P973", label: "described at URL" },
					{ id: "P1343", label: "described by source" },
					{ id: "P5185", label: "grammatical gender", lexcat: ["Q1084", "Q147276", "Q102047"] }, // n, propn, suffix
					{ id: "P11053", label: "grammatical person", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P11054", label: "grammatical number", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
					{ id: "P1552", label: "has quality", lexcat: ["Q468801", "Q956030", "Q36224"] }, // personal pronoun, indefinite pronoun, pronoun
				],
				"references": [
					{ id: "P854", label: "reference URL" },
					{ id: "P813", label: "retrieved" },		
					{ id: "P248", label: "stated in" },
				],
			},
			"senses": {
				"mainsnak": [
					{ id: "P5137", label: "item for this sense" },
					{ id: "P9970", label: "predicate for" },
					{ id: "P6084", label: "location of sense usage" },
					{ id: "P9488", label: "field of usage" },
					{ id: "P6191", label: "language style" },
					{ id: "P6271", label: "demonym of" },
					{ id: "P10339", label: "semantic gender" },
					{ id: "P5972", label: "translation" },
					{ id: "P5973", label: "synonym" },
					{ id: "P5974", label: "antonym" },
					{ id: "P6593", label: "hyperonym" },
					{ id: "P8471", label: "pertainym", description: "adj→n or adv→adj, e.g. lunar→moon, slowly→slow" },
				],
				"references": [
					{ id: "P854", label: "reference URL" },
					{ id: "P813", label: "retrieved" },		
					{ id: "P248", label: "stated in" },
				],
			},
			"forms": {
				"mainsnak": [
					{ id: "P443", label: "pronunciation audio" },
					{ id: "P898", label: "IPA transcription" },
					{ id: "P5279", label: "hyphenation" },
				],
				"qualifiers": [
					{ id: "P5237", label: "pronunciation variety" },
				],
				"references": [
					{ id: "P854", label: "reference URL" },
					{ id: "P813", label: "retrieved" },		
					{ id: "P248", label: "stated in" },
				],
			},
			"properties": {
				"P5185": [ // grammatical gender
					{ id: "Q499327", label: "masculine" },
					{ id: "Q1775415", label: "feminine" },
					{ id: "Q1775461", label: "neuter" },
					{ id: "Q1305037", label: "common" },
				],
				"P11053": [ // grammatical person
					{ id: "Q21714344", label: "first person" },
					{ id: "Q51929049", label: "second person" },
					{ id: "Q51929074", label: "third person" },
				],
				"P11054": [ // grammatical number
					{ id: "Q110786", label: "singular" },
					{ id: "Q146786", label: "plural" },
					{ id: "Q110022", label: "dual" },
				],
				"P1552": [ // has quality
					{ id: "Q75365274", label: "inclusive" },
					{ id: "Q25416585", label: "exclusive" },
					{ id: "Q51927507", label: "animate" },
					{ id: "Q51927539", label: "inanimate" },
				],
			},
		},
	};

	// copy any missing lexeme/sense/form sections for specific languages from the all language section
	$.each(suggestions["*"], function (k1, v1) {
		$.each(suggestions, function (k2, v2) {
			if (!suggestions[k2][k1])
				suggestions[k2][k1] = v1;
		});
	});

	let cache = {};

	async function suggestionsFromSparqlQuery (query) {
		var results = [];
		await $.post("https://query.wikidata.org/sparql?format=json", { query: query }, function (res) {
			if (!res.results.bindings.length)
				return;
	
			$.each(res.results.bindings, function () {
				var id = this.l.value.replace(/.*\//, "");
				let obj = {
					"id": id,
					"url": this.l.value,
					"label": this.lemma.value + " (" + id + ")"
				};
				if (this.hasOwnProperty("desc"))
					obj.description = this.desc.value;
				else if (this.hasOwnProperty("lexcatLabel")) {
					var descs = [];
					descs.push(this.lexcatLabel.value);
					if (this.hasOwnProperty("createsLabel"))
						descs.push(this.createsLabel.value);
					if (this.hasOwnProperty("genderLabel"))
						descs.push(this.genderLabel.value);
					if (this.hasOwnProperty("inflectionLabel"))
						descs.push(this.inflectionLabel.value);
					obj.description = descs.join(", ");
				}
				results.push(obj);
			});
		});
		return results;
	}

	function addLexemeSuggestions (e) {
		if (!e.language) return; // only supported on lexemes

		var key = suggestions.hasOwnProperty(e.language) ? e.language : "*";

		$.each(suggestions[key], function (k1, v1) { $.each(v1, function (k2, v2) { $.each(v2, function (i, v) {
			if (v.hasOwnProperty("lexcat") && !v.lexcat.includes(e.lexicalCategory)) {
				delete v2[i];
				return;
			}
			v["url"] = "//www.wikidata.org/entity/" + v.id;
		}) }) });

		mw.hook("wikibase.entityselector.search").add(function (data, addPromise) {
			var entitycontext = "lexemes";
			$(data.element[0]).closest(".wikibase-lexeme-forms-section, .wikibase-lexeme-senses-section").each(function () {
				entitycontext = this.classList.value.replace(/^wikibase-lexeme-(forms|senses)-section$/, "$1");
			});

			var statementcontext = "";
			$(data.element[0]).closest(".wikibase-statementview-mainsnak, .wikibase-statementview-qualifiers, .wikibase-statementview-references").each(function () {
				statementcontext = this.classList.value.replace(/.*-/, "");
			});
				
			// entering a value not a property
			var propid = "";
			if (data.element[0].classList.contains("valueview-input")) {
				propid = $(data.element[0]).closest(".wikibase-snakview.wb-edit").data("snakview").propertyId();
			}

			// see [[User:Nikki/ExMusica.js]]
			let langs = [...new Set([
				mw.language.getFallbackLanguageChain().shift(),
				mw.language.getFallbackLanguageChain().slice(1, -1),
				mw.config.get("wgULSBabelLanguages") || [],
				mw.config.get("wgULSAcceptLanguageList") || [],
				Object.keys(e.lemmas),
				"en"
			].flat().map(function (x) { return x.toLowerCase(); }))].join(",");

			if (
				propid == "P5973" // synonym
				|| propid == "P5974" // antonym
				|| propid == "P6593" // hyperonym
				|| propid == "P8471" // pertainym
			) {
				let lemma = data.term.trim();
				if (!lemma)
					return; // empty string
				let lang = Object.keys(e.lemmas)[0];
				let query = `
					select (?s as ?l) ("${lemma}"@${lang} as ?lemma) (?gloss as ?desc) {
					  ?lex dct:language wd:${e.language};
					       wikibase:lemma "${lemma}"@${lang};
					       ontolex:sense ?s.
					  service wikibase:label {
					    bd:serviceParam wikibase:language "${langs}".
					    ?s skos:definition ?gloss.
					  }
					  filter (?lex != wd:${e.id}).
					}
				`;
				return addPromise(suggestionsFromSparqlQuery(query));

			} else if (
				propid == "P5972" // translation
			) {
				let lemma = data.term.trim();
				if (!lemma)
					return; // empty string
				let lang = Object.keys(e.lemmas)[0];
				let query = `
					select (?s as ?l) (strlang(concat(?lem, " (", ?langLabel, ", ", ?lexcatLabel, ")"), lang(?lem)) as ?lemma) (?gloss as ?desc) {
					  service wikibase:mwapi {
					      bd:serviceParam wikibase:endpoint "www.wikidata.org";
					                      wikibase:api "EntitySearch";
					                      mwapi:search "${lemma}";
					                      mwapi:type "lexeme";
					                      mwapi:language "en".
					      ?lex wikibase:apiOutputItem mwapi:item.
					  }
					  ?lex wikibase:lemma ?lem;
					       wikibase:lexicalCategory ?lexcat;
					       ontolex:sense ?s;
					       dct:language ?lang filter (?lang != wd:${e.language}).
					  filter (?lex != wd:${e.id}).
					  
					  service wikibase:label {
					    bd:serviceParam wikibase:language "${langs}".
					    ?s skos:definition ?gloss.
					    ?lexcat rdfs:label ?lexcatLabel.
					    ?lang rdfs:label ?langLabel.
					  }
					} order by strlen(?lem) limit 10
				`;
				return addPromise(suggestionsFromSparqlQuery(query));

			} else if (data.term.trim()) {
				// only show default suggestions if there is no text in the field already
				return;
			}

			if (propid == "P5402") { // homograph lexeme
				var lemmas = [];
				for (var lang of Object.keys(e.lemmas)) {
					lemmas.push(`"${e.lemmas[lang].value}"@${lang}`);
				}
				
				var query = `
					select * {
						values ?lemma { ${lemmas.join(" ")} }
						?l wikibase:lemma ?lemma filter (?l != wd:${e.id})
					}
				`;
				addPromise(suggestionsFromSparqlQuery(query));

			} else if (propid == "P5425") { // Han character in this lexeme
				let lemmas = [];
				for (const lang of Object.keys(e.lemmas)) {
					const chars = e.lemmas[lang].value.split("").map((c, i) => `("${c}" ${i})`).join(" ");
					lemmas.push(chars);
				}

				const query = `
					select distinct ?l (strlang(?char, "und") as ?lemma) {
						values (?char ?index) { ${lemmas.join(" ")} }
						?l wdt:P487 ?char;
							wdt:P31 wd:Q29654788.
						minus { wd:${e.id} wdt:P5425 ?l }
					} order by ?index
				`;
				addPromise(suggestionsFromSparqlQuery(query));

			} else if (propid == "P9531") { // identifier shared with lexeme
				var $input = $(data.element[0]).closest(".wikibase-statementview").find(".wikibase-statementview-mainsnak .valueview-input");
				var identifier = $input.val();
				var prop = $input.closest(".wikibase-snakview").data("snakview").propertyId();
				var query = `
					select * {
						?l wdt:${prop} "${identifier}";
							wikibase:lemma ?lemma filter (?l != wd:${e.id}).
						minus {
							?l p:${prop} [
								ps:${prop} "${identifier}";
								pq:${prop} wd:${e.id}
							]
						}
					}
				`;
				addPromise(suggestionsFromSparqlQuery(query));

			} else if (propid == "P5137") { // item for this sense
				var sid = e.id + "-" + $(data.element[0]).closest(".wikibase-lexeme-sense").attr("id");
				let lemmas = [];
				for (let lang of Object.keys(e.lemmas)) {
					lemmas.push(`"${e.lemmas[lang].value}"@${lang}`);
				}
				let query = `
					select distinct (?item as ?l) (?label as ?lemma) ?desc {
					  { wd:${ sid } skos:definition ?lem }
					  union { values ?lem { ${lemmas.join(" ")} } }
					  ?item rdfs:label|skos:altLabel ?lem.
					  minus { ?item wdt:P31 wd:Q4167410 }
					  minus { ?item wdt:P31 wd:Q5 }
					  minus { ?item wdt:P217 [] } # inventory number (artworks)
					  minus { ?item wdt:P577 [] } # publication date (articles, albums, etc)
					  minus { ?item wdt:P175 [] } # performer (songs)
					  optional { ?item wdt:P279 ?subclassof }
					  ?item wikibase:sitelinks ?sitelinks;
					        wikibase:statements ?statements.
					  service wikibase:label {
					    bd:serviceParam wikibase:language "${langs}".
					    ?item rdfs:label ?label.
					    ?item schema:description ?desc.
					  }
					} order by desc(bound(?subclassof)) desc(?sitelinks+?statements) ?label limit 20
				`;
				addPromise(suggestionsFromSparqlQuery(query));

			} else if (propid == "P6072") { // demonstrates sense
				let lang = Object.keys(e.lemmas)[0];
				let lemma = e.lemmas[lang].value;
				let query = `
					select (?s as ?l) ("${lemma}"@${lang} as ?lemma) (?gloss as ?desc) {
					  wd:${e.id} ontolex:sense ?s.
					  service wikibase:label {
					    bd:serviceParam wikibase:language "${langs}".
					    ?s skos:definition ?gloss.
					  }
					} limit 10
				`;
				addPromise(suggestionsFromSparqlQuery(query));

			} else if (propid == "P5830") { // demonstrates form
				let lang = Object.keys(e.lemmas)[0];
				let lemma = e.lemmas[lang].value;
				let query = `
					select (?f as ?l) (?r as ?lemma) (group_concat(?featLabel; separator=", ") as ?desc) {
					  wd:${e.id} ontolex:lexicalForm ?f.
					  ?f ontolex:representation ?r.
					  optional { ?f wikibase:grammaticalFeature ?feat }
					  service wikibase:label {
					    bd:serviceParam wikibase:language "${langs}".
					    ?feat rdfs:label ?featLabel.
					  }
					} group by ?f ?r limit 10
				`;
				addPromise(suggestionsFromSparqlQuery(query));

			} else if (propid == "P5238") { // combines
				// "combines" is expected to be added multiple times.
				// The query will be the same each time so unless someone
				// has added a word since the page was loaded, the results
				// will be the same each time.
				// Therefore to make it faster, it caches the results and in
				// the case that a word was added since the page was loaded,
				// people will have to refresh the page or type the word
				// manually.
				if (cache.hasOwnProperty("P5238"))
					return addPromise(cache["P5238"]);

				var lemmas = [];
				for (var lang of Object.keys(e.lemmas)) {
					let lemma = e.lemmas[lang].value;

					// For each position in the word before a character (= start of substring)
					for (let i = 0; i < lemma.length; i++) {
						// For each position in the word after a character, from the start of the substring (= end of substring)
						for (let j = i + 1; j <= lemma.length; j++) {
							// Get the corresponding substring, plus some case variants
							let text = lemma.substring(i, j);
							let textlower = text.toLocaleLowerCase(lang);
							let textupper = text.charAt(0).toLocaleUpperCase(lang) + text.substring(1);

							// Include prefixes and suffixes
							for (let substr of [text, textlower, textupper]) {
								lemmas.push(`"${substr}"@${lang}`);
								lemmas.push(`"${substr}-"@${lang}`);
								lemmas.push(`"-${substr}"@${lang}`);
							}
						}
					}
				}
				// Remove duplicate values
				lemmas = [...new Set(lemmas)];

				let languagestring = `?l dct:language wd:${e.language}`;
				if (["Q56356571","Q9168","Q9260"].includes(e.language)) {
					languagestring = `values ?language { wd:Q56356571 wd:Q9168 wd:Q9260 } ?l dct:language ?language`;
				}
				var query = `
						select distinct ?l ?lemma ?lexcatLabel ?genderLabel ?inflectionLabel ?createsLabel {
							values ?lemma { ${lemmas.join(" ")} }
							${languagestring} .
							?l wikibase:lemma ?lemma.
							filter (?l != wd:${e.id}).
							?l wikibase:lexicalCategory ?lexcat.
							optional { ?l wdt:P5911 ?inflection }
							optional { ?l wdt:P5923 ?creates }
							service wikibase:label { bd:serviceParam wikibase:language "${langs}" }
						} order by desc(strlen(?lemma)) strstarts(?lemma, "-") strends(?lemma, "-") ?lemma limit 10
				`;
				let results = suggestionsFromSparqlQuery(query);
				cache["P5238"] = results;
				addPromise(results);

			} else if (propid && suggestions[key].hasOwnProperty("properties") && suggestions[key].properties.hasOwnProperty(propid)) {
				addPromise(suggestions[key].properties[propid]);
			} else if (
				data.element[0].parentNode.classList.contains("wikibase-snakview-property")
				&& suggestions[key].hasOwnProperty(entitycontext)
				&& suggestions[key][entitycontext].hasOwnProperty(statementcontext)
			) {
				addPromise(suggestions[key][entitycontext][statementcontext]);
			}
		});
	}

	mw.hook("wikibase.entityPage.entityLoaded").add(addLexemeSuggestions);
})();