Участник:BsivkoBot/Перевод cite journalОписаниеМотивацияШаблон {{cite journal}} во многом не поддерживается и остаётся для совместимости. Зачастую он попадает в русскоязычный раздел в результате копирования с других разделов Википедии, где другие правила и другой шаблон {{cite journal}}. Как следствие, остаётся много артефактов и несоответствий. Близким к нему является шаблон {{статья}}, который находится в актуальном состоянии, и более понятен русскоязычным участникам. Идея заключается в преобразовании одного шаблона в другой с минимальным количеством ошибок и потери данных. В правовом плане использовать шаблон {{cite journal}} не рекомендуется в новых статьях (см. документацию к нему). РеализацияБот находит шаблон {{cite journal}} или его аналоги и производит замену на {{статья}} согласно описанным ниже преобразованиям. Описание преобразований при переводе:
Поле «тип» задаётся в «журнал» или его эквивалент на соответствующем языке (например, если «es», то «diario»). Дополнительно удаляются обнаруженные неиспользуемые параметры 'df', 'deadurl', 'dead-url', 'unused_data', 'display-authors', 'access-date' и др. (см. таблицы). 'accessdate' оставляется в надежде, что его поддержку добавят в шаблоне {{статья}}. 'access-date' заменяется на 'accessdate'. Для параметров «издательство», «заглавие», «цитата», «место», «оригинал», «издание» проверяется наличие красных ссылок. Если такая есть, то проверяется, есть ли англоязычная статья. Если есть, то линкуется либо на ru-статью по ВД, если такой нет, то через шаблон на англоязычную. Если среди авторов обнаруживаются значения Если язык неизвестен, то проставляется поле Бот пробует определить по содержанию поля "издание" само издание. Для этого берётся полное содержимое и проверяется как ссылка в англовики. Далее, если обнаруживается статья, и она является журналом, то определяется его язык. Если язык один, то он используется для установки языка. Например, здесь бот пробует определить ссылку en:Am. J. Hum. Genet., находит по ней en:American Journal of Human Genetics. Так как есть infobox journal или свойство ВД instance of (P31) scientific journal (Q5633421), то это считается журналом и может быть обработано. Так как русскоязычной страницы нет, то используется шаблон «не переведено». Язык журнала указан в карточке, категории English-language journals или свойстве P407, то это является основанием для определения языка. Т.о. если по названию статьи или контрольному списку определить язык не удалось, то через такую схему он может быть установлен. Обработка параметров англоязычного шаблона, которые отсуствуют в русскоязычной версии:
Некоторые другие обнаруженные параметры:
Исходный кодСм. также Участник:BsivkoBot/Перевод/Исходный_код import mwparserfromhell from template_translating.common import process_date, process_author, process_editor, try_to_detect_language from text_processing.languages import lang_to_iso_639, determine_language_by_infobox, determine_language_by_wikidata from text_processing.wikilink import wikilink_to_text, make_wikilink from wiki_requests.english_wiki_links import get_end_target_page, process_text_with_likely_english_links from wiki_requests.get_wikidata import get_wikidata_item from wiki_requests.redirects import get_journal_language, add_journal_language from wiki_requests.site import en_site from wiki_template_processing.endings_format import process_leading_and_ending_param_values, detect_format_endings from wiki_template_processing.template_collector import one_of_templates_or_their_redirects_is_present_en, \ template_or_its_redirect_is_present from wiki_template_processing.template_params import adjust_template_params, names_to_lower_case, delete_params, \ search_of_english_wikilinks, check_unknown_fields, log_unknown_names, remove_equal CITE_JOURNAL_NAME = "Шаблон:cite journal" TASK_DESCRIPTION_CITE_JOURNAL_TRANSLATING = u"перевод cite journal" def simple_mapping(template): name_map = { 'language': 'язык', 'lang': 'язык', 'title': 'заглавие', 'booktitle': 'заглавие', 'url': 'ссылка', 'website': 'ссылка', 'journal': 'издание', 'journa': 'издание', 'magazine': 'издание', 'work': 'издание', 'periodical': 'издание', 'wydanie': 'издание', 'publisher': 'издательство', 'publiser': 'издательство', 'series': 'том', 'version': 'том', 'vol': 'том', 'volume': 'том', 'wolumin': 'том', 'issue': 'номер', 'ssue': 'номер', 'pages': 'страницы', 'pp': 'страницы', 'p': 'страницы', 'page': 'страницы', 'quote': 'цитата', 'description': 'цитата', 'postscript': 'цитата', 'location': 'место', 'place': 'место', 'edition': 'издание', 'publicationplace': 'место', 'publication-place': 'место', 'archive-url': 'archiveurl', 'archive-date': 'archivedate', 'access-date': 'accessdate', 'authors': 'author', 'coauthor': 'coauthors', 'at': 'страницы', 'newspaper': 'издание', 'adres czasopisma': 'место', 'czasopismo': 'издание', 'datepublished': 'date', 'publication-date': 'date', 'publicationdate': 'date', 'editor': 'ответственный', 'script-title': 'оригинал', 'miejsce': 'место', 'doix': 'doi', 'jezyk': 'язык' } n = "" i = 0 while i < 10: name_map['author-link' + n] = 'authorlink' + n name_map['author' + n + '-link'] = 'authorlink' + n name_map['author link' + n] = 'authorlink' + n name_map['autor link' + n] = 'authorlink' + n name_map['editor' + n] = 'editor-last' + n name_map['editor' + n + '-last'] = 'editor-last' + n name_map['editor' + n + '-first'] = 'editor-first' + n name_map['editor-link' + n] = 'editorlink' + n name_map['editor' + n + '-link'] = 'editorlink' + n name_map['editor link' + n] = 'editorlink' + n i += 1 n = str(i) for key, val in name_map.items(): if template.has(key): template.get(key).name = val return def set_type_by_language(template): type_map = { 'en': 'journal', 'ru': 'журнал', 'de': 'magazin', 'es': 'diario', 'it': 'diario', 'fr': 'magazine', 'sv': 'tidning' } if template.has('язык'): lang = str(template.get("язык").value) val = type_map.get(lang) if val is not None: if template.has("тип"): template.get("тип").value = str(val) else: template.add("тип", str(val)) if template.name.lower() == "cite magazine" and lang == "en": if template.has("тип"): template.get("тип").value = "magazine" else: template.add("тип", "magazine") return def determine_journal_language_by_category(text): lang_map = { "Chinese-language journals": "zh", "Croatian-language journal": "hr", "Czech-language journal": "cs", "Danish-language journal": "da", "Dutch-language journal": "nl", "English-language journal": "en", "French-language journal": "fr", "German-language journal": "de", "Hebrew-language journal": "he", "Hungarian-language journal": "bg", "Italian-language journal": "it", "Japanese-language journal": "ja", "Latin-language journal": "la", "Norwegian-language journal": "no", "Persian-language journal": "fa", "Polish-language journal": "pl", "Portuguese-language journal": "pt", "Russian-language journal": "ru", "Serbian-language journal": "sr", "Spanish-language journal": "es", "Swedish-language journal": "sv" } counter = 0 result = None for key, val in lang_map.items(): if key in text: counter += 1 result = val if counter == 1: return result else: return None def detect_journal(language, title, text): infoboxes = ["infobox journal", "infobox magazine", "infobox newspaper", "infobox book"] box_is_present = one_of_templates_or_their_redirects_is_present_en(text, infoboxes) if box_is_present: return True item = get_wikidata_item(language, title) try: p31 = item.claims.get('P31') if p31 is not None: for i in p31: try: if str(i.target._link) == "[[Q5633421]]": return True except AttributeError: continue except AttributeError: return False return False def set_type_by_journal_infobox_type(template, text): if not template.has("язык"): return lang = str(template.get("язык").value).strip().lower() if one_of_templates_or_their_redirects_is_present_en(text, ["infobox magazine"]): if lang=="en": if template.has("тип"): template.get("тип").value = "magazine" else: template.add("тип", "magazine") if one_of_templates_or_their_redirects_is_present_en(text, ["infobox newspaper"]): if lang=="en": if template.has("тип"): template.get("тип").value = "newspaper" else: template.add("тип", "newspaper") if lang=="ru": if template.has("тип"): template.get("тип").value = "газета" else: template.add("тип", "газета") if one_of_templates_or_their_redirects_is_present_en(text, ["infobox book"]): if lang=="en": if template.has("тип"): template.get("тип").value = "book" else: template.add("тип", "book") if lang=="ru": if template.has("тип"): template.get("тип").value = "книга" else: template.add("тип", "книга") pass def journal_wikilink_processing(template): if template.has('издание'): journal_name = str(template.get("издание").value).strip() journal_name = wikilink_to_text(journal_name) journal_page = get_end_target_page(en_site(), journal_name) if journal_page is None or journal_page.text is None or journal_page.text == "": return if not detect_journal("en", journal_page._link._text, journal_page.text): return journal_en_text_link = make_wikilink(str(journal_page._link._text), journal_name) text = process_text_with_likely_english_links(journal_en_text_link) template.get('издание').value = text lang = get_journal_language(journal_name) if lang is None: lang = determine_journal_language_by_category(journal_page.text) if lang is None: lang = determine_language_by_infobox(journal_page.text) if lang is None: lang = determine_language_by_wikidata("en", journal_page._link._text) if lang is not None: add_journal_language(journal_name, lang) if lang is not None: if template.has('язык'): current = str(template.get('язык').value).strip() if current == 'und' or current == 'mis': template.get('язык').value = str(lang) else: if template.has('язык'): template.get('язык').value = str(lang) else: template.add('язык', str(lang)) set_type_by_language(template) set_type_by_journal_infobox_type(template, journal_page._text) return template def translate_cite_journal_for_article(text, names, title="unknown"): if template_or_its_redirect_is_present(text, "sfnp"): return text const_names = ["cite_journal", "Cite journal", "cite journal", "cite journal", "Cite journal", "cite journal "] for i in const_names: if i not in names: names.append(i) for index, item in enumerate(names): if names[index][:7] == "Шаблон:": names[index] = names[index][7:] unknown_names = {} parsed = mwparserfromhell.parse(text) for template in parsed.ifilter_templates(): matches = False for name in names: if template.name.matches(name): matches = True break if not matches: continue adjust_template_params(template) names_to_lower_case(template) remove_equal(template) force_etal_authors = False force_etal_editors = False if template.has('display-authors'): if template.get("display-authors").value.strip() == 'etal': force_etal_authors = True if template.has('displayauthors'): if template.get("displayauthors").value.strip() == 'etal': force_etal_authors = True if template.has('displayeditors'): if template.get("displayeditors").value.strip() == 'etal': force_etal_editors = True if template.has('display-editors'): if template.get("display-editors").value.strip() == 'etal': force_etal_editors = True if template.has('last') and not template.has('ref'): template.add('ref', template.get('last').value) if template.has('last') and template.has('ref') and str(template.get('ref').value).strip() == 'harv': template.get('ref').value = str(template.get('last').value) delete_params(template, ['curly', 'df', 'format', 'deadurl', 'dead-url', 'unused_data', 'display-authors', 'url-status', 'author-separator', 'author-name-separator', 'chapter', 'data', 'department', 'authormask', 'displayauthors', 'displayeditors', 'display-editors', 'laydate', 'layurl', 'lay-url', 'laysource', 'laysummary', 'lay-date', 'lay-source', 'lay-summary', 'separator', 'number', 'trans-title', 'trans_title', 'format', 'name', 'bibcode-access', 'doi-access', 'hdl-access', 'jstor-access', 'ol-access', 'osti-access', 'via', 'registration', 'subscription', 'url-access', 'doi-broken-date', 'quotes', 'abbr', 'hdl', 'lastauthoramp', 'last-author-amp', 'name-list-format', 'editors', 'origin', 'paragraph', 'filetype', 'type', 'urlstatus']) simple_mapping(template) if not template.has('язык') and template.has('заглавие'): template_title = template.get('заглавие').value.strip() # 3 attempts because of euristic alg lang_name = try_to_detect_language(template_title, title) if lang_name == "": lang_name = try_to_detect_language(template_title, title) if lang_name == "": lang_name = try_to_detect_language(template_title, title) if lang_name != "": template.add('язык', lang_name) if template.name.lower() == "cite magazine": if template.has("тип"): template.get("тип").value = "magazine" else: template.add("тип", "magazine") if template.has('язык'): template.get("язык").value = lang_to_iso_639(template.get("язык").value) set_type_by_language(template) if not template.has('язык'): template.add('язык', "und") process_author(template, force_etal_authors, title) process_editor(template, force_etal_editors, title) process_date(template) journal_wikilink_processing(template) search_of_english_wikilinks(template, ["издательство", "заглавие", "цитата", "место", "оригинал", "издание"]) check_unknown_fields(template, unknown_names, ["язык", "автор", "doi", "издательство", "заглавие", "issn", "id", "цитата", "тип", "ответственный", "том", "год", "isbn", "страницы", "число", "arxiv", "ref", "место", "номер", 'deadlink', "ссылка", "bibcode", "месяц", "оригинал", "издание", "номер", "pmid", "archiveurl", "archivedate", "accessdate", 'citeseerx', 'jfm', 'eissn', 'jstor', 'lccn', 'mr', 'oclc', 'ol', 'osti', 'pmc', 'rfc', 'ssrn', 'pmcid']) process_leading_and_ending_param_values(template) template.name = "статья" + detect_format_endings(template) output = str(parsed) log_unknown_names(unknown_names, title, "cite journal") return output Тестированиеfrom external_sources.add import get_all_redirects_to_page from template_translating.cite_journal.translate_cite_journal_for_article import translate_cite_journal_for_article, \ CITE_JOURNAL_NAME def test_translate_cite_journal_for_article(): cite_journal_names = get_all_redirects_to_page(CITE_JOURNAL_NAME) cite_journal_names.append(CITE_JOURNAL_NAME) text = translate_cite_journal_for_article('{{cite journal |journal=Trends Immunol.}}', cite_journal_names) assert "Trends Immunol." in text text = translate_cite_journal_for_article('{{cite journal |journal=[[People (magazine)|People]]}}', cite_journal_names) assert "[[People|" in text text = translate_cite_journal_for_article('{{cite journal |title=Twenty-year-old to take centre stage. |journal=[[The Miami Herald]]}}', cite_journal_names) assert "язык=en" in text text = translate_cite_journal_for_article('{{cite journal |title=Twenty-year-old to take centre stage. |journal=Inside Sport |publisher=nextmedia Pty Ltd }}', cite_journal_names) assert "язык=en" in text text = translate_cite_journal_for_article('{{cite journal|journal=New England Journal of Medicine}}', cite_journal_names) assert "язык=en" in text text = translate_cite_journal_for_article('{{cite journal|journal=Blood (journal)}}', cite_journal_names) assert "язык=en" in text text = translate_cite_journal_for_article('{{cite journal|journal=Blood}}', cite_journal_names) assert "язык=en" not in text text = translate_cite_journal_for_article('{{cite journal |author=Swift A, Swift T |title=Ciguatera |journal=J. Toxicol. Clin. Toxicol. |volume=31 |issue=1 |pages=1–29 |year=1993 |pmid=8433404}}', cite_journal_names) assert "язык=en" in text assert "Clinical Toxicology" in text text = translate_cite_journal_for_article('{{cite journal |author=Swift A, Swift T |title=Ciguatera |journal=J. Toxicol. Clin. Toxicol. |volume=31 |issue=1 |pages=1–29 |year=1993 |pmid=8433404|lang=und}}', cite_journal_names) assert "язык=en" in text text = translate_cite_journal_for_article('{{cite journal|journal=Clin Ophthalmol}}', cite_journal_names) assert "язык=en" in text assert "Clinical Ophthalmology" in text text = translate_cite_journal_for_article('{{cite journal|journal=Terrain (journal)}}', cite_journal_names) assert "язык=fr" in text text = translate_cite_journal_for_article('{{cite journal|journal=Br J Psychiatry}}', cite_journal_names) assert "язык=en" in text assert "издание=[[Британский журнал психиатрии|British Journal of Psychiatry]]" in text text = translate_cite_journal_for_article('{{cite journal|journal=Br J Psychiatry|язык=und}}', cite_journal_names) assert "язык=en" in text text = translate_cite_journal_for_article( '{{cite journal| author = Robert K. Sitler | year = 2006 |month=February | title = The 2012 Phenomenon: New Age Appropriation of an Ancient Mayan Calendar |journal=[[Nova Religio: the Journal of Alternative and Emergent Religions]] |location=Berkeley |publisher=[[University of California Press]] |volume=9 |issue=3 |pages=24–38 |doi=10.1525/nr.2006.9.3.024 | issn = 1092-6690|oclc=357082680}}', cite_journal_names) assert "None" not in text assert translate_cite_journal_for_article( '{{cite journal |last=Бартон |first=Джефф |title=System of a Down |journal=Classic Rock |volume=10 |year=2005 |month=Февраль |pages=54|ISSN=1234}}', cite_journal_names) == \ '{{статья |заглавие=System of a Down |издание=Classic Rock |том=10 |страницы=54 |issn=1234 |ref=Бартон |язык=und |автор=Бартон, Джефф |месяц=2 |год=2005}}' assert translate_cite_journal_for_article( '{{cite journal |last1=Бартон |first1=Джефф |language=en-US|title=System of a Down |journal=Classic Rock |volume=10 |year=2005 |month=Февраль |pages=54}}', cite_journal_names) == \ '{{статья |язык=en |заглавие=System of a Down |издание=Classic Rock |том=10 |страницы=54 |тип=journal |автор=Бартон, Джефф |месяц=2 |год=2005}}' assert translate_cite_journal_for_article( '{{cite journal| author = van Roosmalen, Marc G. M | title = A taxonomic review of the titi monkeys, genus ''Callicebus'' Thomas, 1903, with the description of the two new species, ''Callicebus bernhardi'' and ''Callicebus stephennashi'', from Brazilian Amazonia | journal = Neotropical Primates | volume = 10 | issue = Suppl | year = 2002 | pages = 42}}', cite_journal_names) == \ '{{статья |заглавие=A taxonomic review of the titi monkeys, genus ''Callicebus'' Thomas, 1903, with the description of the two new species, ''Callicebus bernhardi'' and ''Callicebus stephennashi'', from Brazilian Amazonia |издание=Neotropical Primates |том=10 |номер=Suppl |страницы=42 |язык=en |тип=journal |автор=van Roosmalen, Marc G. M. |год=2002}}' assert translate_cite_journal_for_article( '{{cite journal |last1=Петров |first1=Вася |author1=Коля|authorlink1=Петров Вася|last2=Иванова |first2=Оля |authorlink2=Оля Иванова|author3=Федя|author5=Ерёма|Authorlink5=Ерёма Федин}}', cite_journal_names) == \ '{{статья |язык=und |автор=[[Петров Вася|Петров, Вася]]; [[Оля Иванова|Иванова, Оля]]; Федя; [[Ерёма Федин|Ерёма]]}}' assert translate_cite_journal_for_article( '{{cite journal |editor-last1=Петров |editor-first1=Вася |editor1=Коля|editorlink1=Петров Вася|editor-last2=Иванова |editor-first2=Оля |editorlink2=Оля Иванова|editor3=Федя|editor5=Ерёма|Editorlink5=Ерёма Федин}}', cite_journal_names) == \ '{{статья |язык=und |ответственный=[[Петров Вася|Коля, Вася]]; [[Оля Иванова|Иванова, Оля]]; Федя; [[Ерёма Федин|Ерёма]]}}' assert translate_cite_journal_for_article( '{{cite journal|last=Dargent |first=Françoise |authorlink= |editor1-first= |editor1-last= |editor1-link= |date= 18 May 2008 |title= Les fées, rien que les fées...|trans_title= fairies, nothing but fairies ...|journal=Le Figaro |volume= |series= |issue= |page= |pages= |at= |publisher= |location= |issn= |pmid= |pmc= |doi= |bibcode= |oclc= |id= |url=http://www.lefigaro.fr/livres/2008/06/19/03005-20080619ARTFIG00007-les-fees-rien-que-les-fees.php |language=french |archiveurl= |archivedate= |accessdate= |laysummary= |laysource= |laydate= |quote= |ref= |separator= |postscript= }}', cite_journal_names) == \ '{{статья |заглавие=Les fées, rien que les fées... |издание=[[Le Figaro]] |ссылка=http://www.lefigaro.fr/livres/2008/06/19/03005-20080619ARTFIG00007-les-fees-rien-que-les-fees.php |язык=fr |ref=Dargent |тип=magazine |автор=Dargent, Françoise |число=18 |месяц=5 |год=2008}}' assert translate_cite_journal_for_article( '{{cite journal|last=Dargent |first=Françoise |author1= Ben et al.|author2= Den et al.|author3=Han ''et al.''}}', cite_journal_names) == \ '{{статья |ref=Dargent |язык=und |автор=Dargent, Françoise; Ben ; Den ; Han et al.}}' assert translate_cite_journal_for_article( '{{cite journal|last=Dargent |first=Françoise |editor1= Ben et al.|editor2= Den et al.|editor3=Han ''et al.''}}', cite_journal_names) == \ '{{статья |ref=Dargent |язык=und |автор=Dargent, Françoise |ответственный=Ben ; Den ; Han et al.}}' assert translate_cite_journal_for_article( '{{cite journal|last=Dargent |first=Françoise| displayauthors=etal}}', cite_journal_names) == \ '{{статья |ref=Dargent |язык=und |автор=Dargent, Françoise et al.}}' assert translate_cite_journal_for_article( '{{cite journal|author=F. W. High| display-authors=etal\n}}', cite_journal_names) == \ '{{статья |язык=und |автор=F. W. High et al.}}' assert translate_cite_journal_for_article( '{{cite journal|author=High FW, Bush A}}', cite_journal_names) == \ '{{статья |язык=und |автор=High F. W., Bush A.}}' assert "magazine" in translate_cite_journal_for_article( '"{{cite magazine|title=Chart History|lang=en}}"', cite_journal_names) assert "magazine" in translate_cite_journal_for_article( '"{{cite magazine|title=Chart History|publisher=[[Billboard]]}}"', cite_journal_names) assert "Gromov, Mikhael" in translate_cite_journal_for_article( '{{Cite journal|first=Mikhael|author=Gromov|title=Filling Riemannian manifolds|journal=[[J. Differential Geom.]]|volume=18|year=1983|pages=1-147|issue=1|url=http://projecteuclid.org/euclid.jdg/1214509283|ref=harv}}', cite_journal_names) translate_cite_journal_for_article( '{{cite journal| last=E}}', cite_journal_names) Состояние и развитие
17:59, 18 ноября 2018 (UTC)
Обсуждение |