/** * Checks that this source label transforms definition, i.e. parameters of this label is a textual * part of definition, and checks that this label has a correct number of parameters e.g. "# * {{abbreviation of|July}}" -> "# July" * * @param label template to be checked * @return true if this template (known label) is a part of the definition and if known labels * have allowed number of parameters */ public static boolean isDefinitionTransformingLabel(Label source_label, int number_of_params) { for (Map.Entry<Label, int[]> entry : transforming_labels_to_number_of_params.entrySet()) { Label cur_label = entry.getKey(); if (Label.equals(cur_label, source_label)) for (int allowed : entry.getValue()) if (number_of_params == allowed) return true; } return false; }
/** * Transforms parameters of the label (template form-of) to text, e.g. "# {{abbreviation * of|July}}" -> "# July". * * <p>{{аббр.||Чехословацкая Социалистическая Республика}} -> "Чехословацкая Социалистическая * Республика" {{аббр.|en|frequently asked questions|часто задаваемые вопросы}} -> "от * [[frequently asked questions]]; часто задаваемые вопросы" * * @param label form-of template * @param template_params parameters to be converted to text * @return (1) text extracted from template parameters (known labels), (2) empty string "" * (unknown parameters for known templates) */ public static String transformTemplateToText(Label label, String[] template_params) { if ((null == template_params || template_params.length == 0) && !Label.equals(label, LabelRu.as_ru)) // exception: template {{as_ru}} has no parameters return ""; String result = ""; for (int i = 0; i < template_params.length; i++) template_params[i] = template_params[i].trim(); if (Label.equals(label, LabelRu.abbreviation)) { // template_params[0] - language code (en, de, fr...) // template_params[1] - abbreviation // template_params[2] - meaning / definition switch (template_params.length) { case 2: result = "от [[" + template_params[1] + "]]"; break; case 3: result = "от [[" + template_params[1] + "]]; " + template_params[2]; /* break; default: result = concatTemplateParametersToText(label, template_params); // wrong number of parameters, remain template in the definition */ } } else if (Label.equals(label, LabelRu.diminutive_hypocoristic)) { result = "[[" + template_params[1] + "]]"; // template_params[0] - language code (en, de, fr...) // template_params[1] - // the word } else if (Label.equals(label, LabelRu.action)) { // template_params[0] - the same as [[word]] // template_params[1] - meaning / definition switch (template_params.length) { case 1: result = "действие по значению гл. [[" + template_params[0] + "]]"; break; case 2: result = "действие по значению гл. [[" + template_params[0] + "]]; " + template_params[1]; } } else if (Label.equals(label, LabelRu.adverb)) { switch (template_params.length) { case 1: result = "[[наречие]] к [[прилагательное|прил.]] [[" + template_params[0] + "]]"; break; case 2: result = "[[наречие]] к [[прилагательное|прил.]] [[" + template_params[0] + "]]; " + template_params[1]; } } else if (Label.equals(label, LabelRu.as_ru)) { switch (template_params.length) { case 0: result = "аналогично русскому слову"; } } else if (Label.equals(label, LabelRu.equal)) { // template_params[0] - the same as [[word]] // template_params[1] - meaning / definition switch (template_params.length) { case 1: result = "то же, что [[" + template_params[0] + "]]"; break; case 2: result = "то же, что [[" + template_params[0] + "]]; " + template_params[1]; } } else if (Label.equals(label, LabelRu.element_symbol)) { switch (template_params.length) { case 2: result = "обозначение для химического элемента [[" + template_params[0] + "|" + template_params[1] + "]]"; } } else if (Label.equals(label, LabelRu.chem_element)) { // {{хим-элем|17|Cl|[[хлор]]|lang=en}} -> "[[химический элемент]] с [[атомный номер|атомным // номером]] 17, обозначается [[химический символ|химическим символом]] Cl, [[хлор]]" switch (template_params.length) { case 2: result = "[[химический элемент]] с [[атомный номер|атомным номером]] " + template_params[0] + ", обозначается [[химический символ|химическим символом]] " + template_params[1]; break; case 3: // without last unused parameter: "lang=en" case 4: result = "[[химический элемент]] с [[атомный номер|атомным номером]] " + template_params[0] + ", обозначается [[химический символ|химическим символом]] " + template_params[1] + ", " + template_params[2]; } } else if (Label.equals(label, LabelRu.frequentative)) { switch (template_params.length) { case 1: result = "[[многократно|многокр.]] к [[" + template_params[0] + "]]"; break; } } else if (Label.equals(label, LabelRu.momentane)) { switch (template_params.length) { case 1: result = "[[однократно|однокр.]] к [[" + template_params[0] + "]]"; break; } } else if (Label.equals(label, LabelRu.participle)) { switch (template_params.length) { case 1: result = "[[причастие|прич.]] от [[" + template_params[0] + "]]"; break; // {{прич.|ведать|страд}} -> "[[причастие|прич.]] [[страдательный залог|страд.]] от // [[ведать]]" // {{прич.|ведать|наст}} -> "[[причастие|прич.]] [[настоящее время|наст.]] от [[ведать]]" // {{прич.|ведать|прош}} -> "[[причастие|прич.]] [[прошедшее время|прош.]] от [[ведать]]" case 2: String s = ""; if (template_params[1].equalsIgnoreCase("страд")) s = "страдательный залог|страд."; if (template_params[1].equalsIgnoreCase("наст")) s = "настоящее время|наст."; if (template_params[1].equalsIgnoreCase("прош")) s = "прошедшее время|прош."; if (s.length() > 0) result = "[[причастие|прич.]] [[" + s + "]] от [[" + template_params[0] + "]]"; } } else if (Label.equals(label, LabelRu.property)) { // {{свойство|эгалитарный|описание|состояние=1|lang=en}} -> "[[свойство]] или [[состояние]] // по значению [[прилагательное|прил.]] [[эгалитарный]]; описание" // 1, 2, 2 или 3, 2 или 3 или 4 switch (template_params.length) { /// "[[свойство]] или [[состояние]] по значению [[прилагательное|прил.]] // [[эгалитарный]]; описание" case 1: result = "[[свойство]] по значению [[прилагательное|прил.]] [[" + template_params[0] + "]]"; break; case 2: case 3: case 4: String param_optional = ""; // состояние=1 ? String s = TemplateExtractor.getParameterValue(template_params, "состояние"); if (null != s && s.equalsIgnoreCase("1")) param_optional = " или [[состояние]]"; if (template_params[1].contains( "=")) { // == .startsWith("состояние=") || .startsWith("lang=")), then there is no // description (it should be presented as second parameter of template) result = "[[свойство]]" + param_optional + " по значению [[прилагательное|прил.]] [[" + template_params[0] + "]]"; } else { result = "[[свойство]]" + param_optional + " по значению [[прилагательное|прил.]] [[" + template_params[0] + "]]; " + template_params[1]; } } } else if (Label.equals(label, LabelRu.sostoyanie)) { switch (template_params.length) { case 1: result = "[[состояние]] по значению [[прилагательное|прил.]] [[" + template_params[0] + "]]"; break; case 2: String s = TemplateExtractor.getParameterValue(template_params, "от"); if (null != s) { if (s.equalsIgnoreCase("прил")) result = "[[состояние]] по значению [[прилагательное|прил.]] [[" + template_params[0] + "]]"; if (s.equalsIgnoreCase("гл")) result = "[[состояние]] по значению [[глагол|гл.]] [[" + template_params[0] + "]]"; } } } else if (Label.equals(label, LabelRu.sootn)) { switch (template_params.length) { // {{соотн.|бильярд}} -> "связанный, [[соотносящийся]] по значению с существительным // [[бильярд]]" case 1: result = "связанный, [[соотносящийся]] по значению с существительным [[" + template_params[0] + "]]"; break; case 2: case 3: case 4: case 5: // {{соотн.|время|свойств=1}} -> "связанный, [[соотносящийся]] по значению с // существительным [[время]]; свойственный, [[характерный]] для него" // {{соотн.|свойств=1|идиоматизм|идиома}} -> "связанный, [[соотносящийся]] по значению с // существительными [[идиоматизм]], [[идиома]]; свойственный, [[характерный]] для них" String param_svoistv = TemplateExtractor.getParameterValue(template_params, "свойств"); String[] other_params = TemplateExtractor.excludeParameter(template_params, "свойств"); String pronoun = ""; if (null != param_svoistv && param_svoistv.length() > 0 && other_params.length > 0) { // свойств — флаг свойственный, характерный (если = 1, то вставляется местоимение "его", // "их", иначе то, что передано в этом параметре) if (param_svoistv.equalsIgnoreCase("1")) { pronoun = other_params.length == 1 ? "него" : "них"; } else { pronoun = param_svoistv; } if (other_params.length == 1) { result = "связанный, [[соотносящийся]] по значению с существительным [[" + other_params[0] + "]]; свойственный, [[характерный]] для " + pronoun; } else { // length > 1 String wikified_words = StringUtil.join("]], [[", other_params); result = "связанный, [[соотносящийся]] по значению с существительными [[" + wikified_words + "]]; свойственный, [[характерный]] для " + pronoun; } } } } else if (Label.equals(label, LabelRu.sovershiti)) { switch (template_params.length) { case 1: result = "совершить действие, выраженное гл. [[" + template_params[0] + "]]; провести некоторое время, совершая такое действие"; break; } } return result; }