Участник:BsivkoBot/Перевод cite journal

Описание

Мотивация

Шаблон {{cite journal}} во многом не поддерживается и остаётся для совместимости. Зачастую он попадает в русскоязычный раздел в результате копирования с других разделов Википедии, где другие правила и другой шаблон {{cite journal}}. Как следствие, остаётся много артефактов и несоответствий. Близким к нему является шаблон {{статья}}, который находится в актуальном состоянии, и более понятен русскоязычным участникам. Идея заключается в преобразовании одного шаблона в другой с минимальным количеством ошибок и потери данных.

В правовом плане использовать шаблон {{cite journal}} не рекомендуется в новых статьях (см. документацию к нему).

Реализация

Бот находит шаблон {{cite journal}} или его аналоги и производит замену на {{статья}} согласно описанным ниже преобразованиям.

Описание преобразований при переводе:

Параметры шаблона

ПараметрОписаниеТипСтатус
refref

Без изменений.

Строковый (без форматирования)необязательный
authorauthor

author, first, last, authorlink, coauthors совместно в «автор».

Строковый (без форматирования)необязательный
lastlast

author, first, last, authorlink, coauthors совместно в «автор».

Строковый (без форматирования)необязательный
authorlinkauthorlink

author, first, last, authorlink, coauthors совместно в «автор».

Строковый (без форматирования)необязательный
firstfirst

author, first, last, authorlink, coauthors совместно в «автор».

Строковый (без форматирования)необязательный
coauthorscoauthors

author, first, last, authorlink, coauthors совместно в «автор».

Строковый (без форматирования)необязательный
datedate

date, year, month, day, совместно в «год», «месяц», «число».

Строковый (без форматирования)необязательный
yearyear

date, year, month, day, совместно в «год», «месяц», «число».

Строковый (без форматирования)необязательный
monthmonth

date, year, month, day, совместно в «год», «месяц», «число».

Строковый (без форматирования)необязательный
quotesquotes

Удаляется.

Строковый (без форматирования)необязательный
curlycurly

Удаляется.

Неизвестнонеобязательный
urlurl

Переименование в «ссылка».

Строковый (без форматирования)необязательный
titletitle

Переименование в «заглавие».

Строковый (без форматирования)необязательный
languagelanguage

Переименование в «язык». Значение переводится в [[ISO 639]] формат (оставляется 2 или 3 символа; сначала 3, далее если последний '-', то он убирается). Т.е. «en-GB» → «en».

Строковый (без форматирования)необязательный
langlang

Переименование в «язык»; аналогично ''language''.

Строковый (без форматирования)необязательный
formatformat

Удаляется.

Неизвестнонеобязательный
journaljournal

Переименование в «издание».

Строковый (без форматирования)необязательный
magazinemagazine

Переименование в «издание», аналогично «journal».

Строковый (без форматирования)необязательный
publisherpublisher

Переименование в «издательство».

Строковый (без форматирования)необязательный
volumevolume

Переименование в «том».

Строковый (без форматирования)необязательный
issueissue

Переименование в «номер».

Строковый (без форматирования)необязательный
locationlocation

Переименование в «место».

Строковый (без форматирования)необязательный
pagespages

Переименование в «страницы».

Строковый (без форматирования)необязательный
pagepage

Переименование в «страницы».

Строковый (без форматирования)необязательный
arxivarxiv

Без изменений.

Строковый (без форматирования)необязательный
doidoi

Без изменений.

Строковый (без форматирования)необязательный
doilabeldoilabel

Удаляется.

Неизвестнонеобязательный
issnissn

Без изменений.

Строковый (без форматирования)необязательный
pmidpmid

Без изменений.

Строковый (без форматирования)необязательный
bibcodebibcode

Без изменений.

Строковый (без форматирования)необязательный
idid

Без изменений.

Строковый (без форматирования)необязательный
accessdateaccessdate

Без изменений.

Строковый (без форматирования)необязательный
quotequote

Переименование в «цитата».

Строковый (без форматирования)необязательный

Поле «тип» задаётся в «журнал» или его эквивалент на соответствующем языке (например, если «es», то «diario»).

Дополнительно удаляются обнаруженные неиспользуемые параметры 'df', 'deadurl', 'dead-url', 'unused_data', 'display-authors', 'access-date' и др. (см. таблицы).

'accessdate' оставляется в надежде, что его поддержку добавят в шаблоне {{статья}}. 'access-date' заменяется на 'accessdate'.

Для параметров «издательство», «заглавие», «цитата», «место», «оригинал», «издание» проверяется наличие красных ссылок. Если такая есть, то проверяется, есть ли англоязычная статья. Если есть, то линкуется либо на ru-статью по ВД, если такой нет, то через шаблон на англоязычную.

Если среди авторов обнаруживаются значения ''et al.'' или et al., то они удаляются. Если было удаление, или если имеется один из параметров «displayauthors» или «display-authors» в значении «etal», то в конце авторов добавляется «et al.». Аналогично обрабатываются редакторы.

Если язык неизвестен, то проставляется поле язык=und (см. {{Ref-und}}).

Бот пробует определить по содержанию поля "издание" само издание. Для этого берётся полное содержимое и проверяется как ссылка в англовики. Далее, если обнаруживается статья, и она является журналом, то определяется его язык. Если язык один, то он используется для установки языка. Например, здесь бот пробует определить ссылку en:Am. J. Hum. Genet., находит по ней en:American Journal of Human Genetics. Так как есть infobox journal или свойство ВД instance of (P31) scientific journal (Q5633421), то это считается журналом и может быть обработано. Так как русскоязычной страницы нет, то используется шаблон «не переведено». Язык журнала указан в карточке, категории English-language journals или свойстве P407, то это является основанием для определения языка. Т.о. если по названию статьи или контрольному списку определить язык не удалось, то через такую схему он может быть установлен.

Обработка параметров англоязычного шаблона, которые отсуствуют в русскоязычной версии:

Параметры шаблона

ПараметрОписаниеТипСтатус
atat

Переименование в «страницы».

Строковый (без форматирования)необязательный
author-separatorauthor-separator

Удаляется.

Строковый (без форматирования)необязательный
author-name-separatorauthor-name-separator

Удаляется.

Строковый (без форматирования)необязательный
chapterchapter

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
datadata

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
datepublisheddatepublished

Переименование в «date» с последующей обработкой как даты.

Строковый (без форматирования)необязательный
departmentdepartment

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
descriptiondescription

Переименование в «цитата».

Строковый (без форматирования)необязательный
displayauthorsdisplayauthors

Если значение «etal», то в конце списка авторов ставится «et al.». Далее удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
display-authorsdisplay-authors

Если значение «etal», то в конце списка авторов ставится «et al.». Далее удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
displayeditorsdisplayeditors

Если значение «etal», то в конце списка редакторов (поле «ответственный») ставится «et al.». Далее удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
display-editorsdisplay-editors

Если значение «etal», то в конце списка редакторов (поле «ответственный») ставится «et al.». Далее удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
laydatelaydate

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
lay-datelay-date

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
laysourcelaysource

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
lay-sourcelay-source

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
laysummarylaysummary

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
lay-summarylay-summary

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
separatorseparator

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
placeplace

Переименование в «место».

Строковый (без форматирования)необязательный
publication-placepublication-place

Переименование в «место».

Строковый (без форматирования)необязательный
periodicalperiodical

Переименование в «издание».

Строковый (без форматирования)необязательный
othersothers

Добавляется в результирующее поле «автор».

Строковый (без форматирования)необязательный
script-titlescript-title

Переименование в «оригинал».

Строковый (без форматирования)необязательный
trans-titletrans-title

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
trans_titletrans_title

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
formatformat

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
bibcode-accessbibcode-access

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
doi-accessdoi-access

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
hdl-accesshdl-access

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
jstor-accessjstor-access

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
ol-accessol-access

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
osti-accessosti-access

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
viavia

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
postscriptpostscript

Переименование в «цитата».

Строковый (без форматирования)необязательный
registrationregistration

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
subscriptionsubscription

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
url-accessurl-access

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
doi-broken-datedoi-broken-date

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
eissneissn

Без изменений (для вероятного использования).

Строковый (без форматирования)необязательный
jfmjfm

Без изменений (для вероятного использования).

Строковый (без форматирования)необязательный
lccnlccn

Без изменений (для вероятного использования).

Строковый (без форматирования)необязательный
jstorjstor

Без изменений (для вероятного использования).

Строковый (без форматирования)необязательный
mrmr

Без изменений (для вероятного использования).

Строковый (без форматирования)необязательный
oclcoclc

Без изменений (для вероятного использования).

Строковый (без форматирования)необязательный
olol

Без изменений (для вероятного использования).

Строковый (без форматирования)необязательный
ostiosti

Без изменений (для вероятного использования).

Строковый (без форматирования)необязательный
pmcpmc

Без изменений (для вероятного использования).

Строковый (без форматирования)необязательный
rfcrfc

Без изменений (для вероятного использования).

Строковый (без форматирования)необязательный
ssrnssrn

Без изменений (для вероятного использования).

Строковый (без форматирования)необязательный
workwork

Переименование в «издание».

Строковый (без форматирования)необязательный
vauthorsvauthors

Переименование в «автор».

Строковый (без форматирования)необязательный
seriesseries

Переименование в «том».

Строковый (без форматирования)необязательный
versionversion

Переименование в «том».

Строковый (без форматирования)необязательный
hdlhdl

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный
name-list-formatname-list-format

Удаляется (отстутствие аналога).

Строковый (без форматирования)необязательный

Некоторые другие обнаруженные параметры:

Параметры шаблона

ПараметрОписаниеТипСтатус
adres czasopismaadres czasopisma

ППереименование в «место».

Строковый (без форматирования)необязательный
czasopismоczasopismо

Переименование в «издание».

Строковый (без форматирования)необязательный
deadlinkdeadlink

Не изменяется.

Строковый (без форматирования)необязательный
namename

Удаляется.

Строковый (без форматирования)необязательный
numbernumber

Удаляется.

Строковый (без форматирования)необязательный
miejscemiejsce

Переименование в «место».

Строковый (без форматирования)необязательный
jezykjezyk

Переименование в «язык».

Строковый (без форматирования)необязательный
wydaniewydanie

Переименование в «издание».

Строковый (без форматирования)необязательный
woluminwolumin

Переименование в «том».

Строковый (без форматирования)необязательный
pmcidpmcid

Удаляется.

Строковый (без форматирования)необязательный
abbrabbr

Удаляется.

Строковый (без форматирования)необязательный

Исходный код

См. также Участник: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)

  • Исправлена ошибка преобразования даты в случае, если не указан date и не указан month. Добавлен ряд параметров на удаление и на переименование, в частности, для учёта регистра. Обработка [1] по запросу. Bsivko (обс.) 00:46, 19 ноября 2018 (UTC)
  • Добавлена обработка параметров англоязычного шаблона, а также найденных параметров на странице Участник:Vort/CJ500. Добавлено удаление пустых параметров. Добавлена обработка редакторов журналов. 02:01, 20 ноября 2018 (UTC)
  • Добавлено распознавание английских викиссылок. Бот ищет ru-сайт из ВД, и перелинукет на него. Если нет, то проверяет наличие en-сайта, и тогда Нп на него. Пример обработки — Forbidden Siren 2. Проверяется только определенное множество параметров: "издательство", "заглавие", "цитата", "место", "оригинал", "издание". Bsivko (обс.) 22:45, 20 ноября 2018 (UTC)
  • quotes поставлен на удаление (т.к. значения не цитаты, а yes/no). 13:36, 24 ноября 2018 (UTC)
  • Добавлена обработка параметров «et al». Пример. Bsivko (обс.) 17:37, 5 января 2019 (UTC)
  • Добавлена вставка неизвестного языка. Оставляется параметр accessdate. Подправлена нп-ссылка - если нет ссылки на рувики, то первый параметр (ссылка на предполагаемую ру-статью) берется из англовики (менее вероятно совпадение). Добавлена функция проставления точек инициалов. Пример. Bsivko (обс.) 23:21, 5 января 2019 (UTC)
  • Добавлена обработка hdl, abbr. Bsivko (обс.) 13:52, 20 мая 2019 (UTC)
  • Обработано более 2000 статей с этим шаблоном. От него избавлены компьютерные игры, водные объекты, населенные пункты, астрономические объекты и некоторые другие категории. Bsivko (обс.) 13:34, 28 мая 2019 (UTC)
  • Заменено представление неизвестного языка. mis означает Uncoded languages, und - Undetermined; использование und вместо mis более верно. Bsivko (обс.) 15:57, 8 июня 2019 (UTC)
  • Исправлено распознавание редиректов для ссылок англовики. Добавлено распознавание научных журналов и их языков. Bsivko (обс.) 16:14, 30 июня 2019 (UTC)
  • Доработана обработка последнего символа последнего параметра. Это или пусто, или перевод строки в случае многострочного формата. Добавлено распознавание {{cite magazine}} с установкой типа magazine. Обработка ссылок с кириллическими буквами рассматриваются в контексте рувики. Внесены правки в расстуновку пробелов между инициалами. Так как все шаблоны в пространстве рувики были обработаны, то бот поставлен на дежурство по замене появляющихся шаблонов в статьях проекта. Bsivko (обс.) 12:31, 20 июля 2019 (UTC)
  • Исправлено поведение при указании авторов author/first вместо author/last (подробности). Bsivko (обс.) 15:16, 3 января 2020 (UTC)

Обсуждение