Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions src/formatters/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
Базовые функции форматирования списка источников
"""

from formatters.styles.base import BaseCitationStyle
from logger import get_logger
from src.formatters.styles.base import BaseCitationStyle
from src.logger import get_logger


logger = get_logger(__name__)
Expand All @@ -17,7 +17,6 @@ class BaseCitationFormatter:
def __init__(self, formatted_items: list[BaseCitationStyle]) -> None:
"""
Конструктор.

:param formatted_items: Список объектов для итогового форматирования
"""

Expand Down
55 changes: 55 additions & 0 deletions src/formatters/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from typing import Optional


from pydantic import BaseModel, Field


Expand Down Expand Up @@ -78,3 +79,57 @@ class ArticlesCollectionModel(BaseModel):
publishing_house: str
year: int = Field(..., gt=0)
pages: str


class MagazineReaderModel(BaseModel):

"""
Модель сборника статей из журнала:

.. code-block::

MagazineReaderModel(
authors="Иванов И.М., Петров С.Н.",
article_title="Наука как искусство",
magazine_title="Образование и наука",
year=2020,
number=10,
pages="25-30",
)
"""

authors: str
article_title: str
magazine_title: str
year: int = Field(..., gt=0)
number: int = Field(..., gt=0)
pages: str


class DissertationReaderModel(BaseModel):

"""
Модель диссертаций:

.. code-block::

MagazineReaderModel(
authors="Иванов И.М., Петров С.Н.",
article_title="Наука как искусство",
academic_degree="д-р",
branch="экон.",
code="01.01.01",
city="СПб.",
year=2020,
pages="199",
)
"""

authors: str
article_title: str
academic_degree: str
branch: str
code: str
city: str
year: int = Field(..., gt=0)
pages: str
189 changes: 189 additions & 0 deletions src/formatters/styles/apa.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
"""
Стиль цитирования по ГОСТ Р 7.0.5-2008.
"""
from string import Template

from pydantic import BaseModel

from src.formatters.models import BookModel, InternetResourceModel, ArticlesCollectionModel, MagazineReaderModel, \
DissertationReaderModel
from src.formatters.styles.base import BaseCitationStyle
from src.logger import get_logger


logger = get_logger(__name__)


class APABook(BaseCitationStyle):
"""
Форматирование для книг.
"""

data: BookModel

@property
def template(self) -> Template:
return Template(
"$authors ($year). $title. $publishing_house."
)

def substitute(self) -> str:
logger.info('Форматирование книги "%s" ...', self.data.title)

return self.template.substitute(
authors=self.data.authors,
title=self.data.title,
publishing_house=self.data.publishing_house,
year=self.data.year,
)

def get_edition(self) -> str:
"""
Получение отформатированной информации об издательстве.
:return: Информация об издательстве.
"""

return f"{self.data.edition} изд. – " if self.data.edition else ""


class APAInternetResource(BaseCitationStyle):
"""
Форматирование для интернет-ресурсов.
"""

data: InternetResourceModel

@property
def template(self) -> Template:
return Template(
"$article ($access_date) $website $link"
)

def substitute(self) -> str:

logger.info('Форматирование интернет-ресурса "%s" ...', self.data.article)

return self.template.substitute(
article=self.data.article,
website=self.data.website,
link=self.data.link,
access_date=self.data.access_date,
)


class APACollectionArticle(BaseCitationStyle):
"""
Форматирование для статьи из сборника.
"""

data: ArticlesCollectionModel

@property
def template(self) -> Template:
return Template(
"$authors ($year) $article_title, $collection_title $city: $publishing_house, $pages p."
)

def substitute(self) -> str:

logger.info('Форматирование сборника статей "%s" ...', self.data.article_title)

return self.template.substitute(
authors=self.data.authors,
article_title=self.data.article_title,
collection_title=self.data.collection_title,
city=self.data.city,
publishing_house=self.data.publishing_house,
year=self.data.year,
pages=self.data.pages,
)


class APAMagazineReader(BaseCitationStyle):
"""
Форматирование для статьи из сборника.
"""

data: MagazineReaderModel

@property
def template(self) -> Template:
return Template(
"$authors ($year) $article_title. $magazine_title, $number $pages p."
)

def substitute(self) -> str:

logger.info('Форматирование сборника статей "%s" ...', self.data.article_title)

return self.template.substitute(
authors=self.data.authors,
article_title=self.data.article_title,
magazine_title=self.data.magazine_title,
year=self.data.year,
number=self.data.number,
pages=self.data.pages,
)


class APADissertationReader(BaseCitationStyle):
"""
Форматирование для статьи из сборника.
"""

data: DissertationReaderModel

@property
def template(self) -> Template:
return Template(
"$authors ($year) $article_title, дис. [$branch: $code] $city, $pages p."
)

def substitute(self) -> str:

logger.info('Форматирование сборника статей "%s" ...', self.data.article_title)

return self.template.substitute(
authors=self.data.authors,
article_title=self.data.article_title,
academic_degree=self.data.academic_degree,
branch=self.data.branch,
code=self.data.code,
city=self.data.city,
year=self.data.year,
pages=self.data.pages,
)


class APACitationFormatter:
"""
Базовый класс для итогового форматирования списка источников.
"""

formatters_map = {
BookModel.__name__: APABook,
InternetResourceModel.__name__: APAInternetResource,
ArticlesCollectionModel.__name__: APACollectionArticle,
DissertationReaderModel.__name__: APADissertationReader,
MagazineReaderModel.__name__: APAMagazineReader,
}

def __init__(self, models: list[BaseModel]) -> None:
"""
Конструктор.
:param models: Список объектов для форматирования
"""

formatted_items = []
for model in models:
formatted_items.append(self.formatters_map.get(type(model).__name__)(model)) # type: ignore

self.formatted_items = formatted_items

def format(self) -> list[BaseCitationStyle]:
"""
Форматирование списка источников.
:return:
"""

return sorted(self.formatted_items, key=lambda item: item.formatted)
67 changes: 62 additions & 5 deletions src/formatters/styles/gost.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@

from pydantic import BaseModel

from formatters.models import BookModel, InternetResourceModel, ArticlesCollectionModel
from formatters.styles.base import BaseCitationStyle
from logger import get_logger
from src.formatters.models import BookModel, InternetResourceModel, ArticlesCollectionModel, MagazineReaderModel, \
DissertationReaderModel
from src.formatters.styles.base import BaseCitationStyle
from src.logger import get_logger


logger = get_logger(__name__)
Expand Down Expand Up @@ -103,6 +104,62 @@ def substitute(self) -> str:
)


class GOSTMagazineReader(BaseCitationStyle):
"""
Форматирование для статьи из сборника.
"""

data: MagazineReaderModel

@property
def template(self) -> Template:
return Template(
"$authors $article_title // $magazine_title. – $year. – №$number. – С. $pages."
)

def substitute(self) -> str:

logger.info('Форматирование сборника статей "%s" ...', self.data.article_title)

return self.template.substitute(
authors=self.data.authors,
article_title=self.data.article_title,
magazine_title=self.data.magazine_title,
year=self.data.year,
number=self.data.number,
pages=self.data.pages,
)


class GOSTDissertationReader(BaseCitationStyle):
"""
Форматирование для статьи из сборника.
"""

data: DissertationReaderModel

@property
def template(self) -> Template:
return Template(
"$authors $article_title: $academic_degree $branch наук: $code. – $city, $year. – $pages с."
)

def substitute(self) -> str:

logger.info('Форматирование сборника статей "%s" ...', self.data.article_title)

return self.template.substitute(
authors=self.data.authors,
article_title=self.data.article_title,
academic_degree=self.data.academic_degree,
branch=self.data.branch,
code=self.data.code,
city=self.data.city,
year=self.data.year,
pages=self.data.pages,
)


class GOSTCitationFormatter:
"""
Базовый класс для итогового форматирования списка источников.
Expand All @@ -112,12 +169,13 @@ class GOSTCitationFormatter:
BookModel.__name__: GOSTBook,
InternetResourceModel.__name__: GOSTInternetResource,
ArticlesCollectionModel.__name__: GOSTCollectionArticle,
DissertationReaderModel.__name__: GOSTDissertationReader,
MagazineReaderModel.__name__: GOSTMagazineReader,
}

def __init__(self, models: list[BaseModel]) -> None:
"""
Конструктор.

:param models: Список объектов для форматирования
"""

Expand All @@ -130,7 +188,6 @@ def __init__(self, models: list[BaseModel]) -> None:
def format(self) -> list[BaseCitationStyle]:
"""
Форматирование списка источников.

:return:
"""

Expand Down
Loading