Source code for relaton.serializers.bibxml.series

from typing import Union, Tuple, Callable, List

from ...models.bibdata import DocID

__all__ = (
    'DOCID_SERIES_EXTRACTORS',
)


[docs]def extract_doi_series(docid: DocID) -> Union[Tuple[str, str], None]: if docid.type.lower() == 'doi': return 'DOI', docid.id return None
[docs]def extract_rfc_series(docid: DocID) -> Union[Tuple[str, str], None]: if docid.type.lower() == 'ietf' and docid.id.lower().startswith('rfc '): return 'RFC', docid.id.replace('.', ' ').split(' ')[-1] return None
[docs]def extract_id_series(docid: DocID) -> Union[Tuple[str, str], None]: if docid.type.lower() == 'internet-draft': return 'Internet-Draft', docid.id return None
[docs]def extract_w3c_series(docid: DocID) -> Union[Tuple[str, str], None]: if docid.type.lower() == 'w3c': return 'W3C', docid.id.replace('.', ' ').split('W3C ')[-1] return None
[docs]def extract_3gpp_tr_series(docid: DocID) -> Union[Tuple[str, str], None]: if docid.type.lower() == '3gpp': ver = docid.id.split('/')[-1] # TODO: This is insufficient try: id = docid.id.split('3GPP TR ')[1].split(':')[0] except IndexError: return None return '3GPP TR', f'{id} {ver}' return None
[docs]def extract_ieee_series(docid: DocID) -> Union[Tuple[str, str], None]: if docid.type.lower() == 'ieee': try: id, year, *_ = docid.id.split(' ')[-1].lower().strip().split('.') except ValueError: return 'IEEE', docid.id else: return 'IEEE', '%s-%s' % (id.replace('-', '.'), year) return None
DOCID_SERIES_EXTRACTORS: List[ Callable[[DocID], Union[Tuple[str, str], None]] ] = [ extract_rfc_series, extract_id_series, extract_w3c_series, extract_3gpp_tr_series, extract_ieee_series, extract_doi_series, ] """A list of functions capable of extracting series information as 2-tuple (series name, document number) from a :class:`~relaton.models.bibdata.DocID`. Each function is expected to either return a tuple or ``None``, and not throw."""