Toggle Light / Dark / Auto color theme
Toggle table of contents sidebar
Source code for zensols.zotsite.itemmap
"""Contains classes that map :class:`.Item` unique identifiers.
"""
__author__ = 'Paul Landes'
from abc import ABC , abstractmethod
import logging
import re
from zensols.zotsite import Item , Library
logger = logging . getLogger ( __name__ )
[docs]
class ItemMapper ( ABC ):
"""Maps :class:`.Item` unique identifiers.
"""
EXT_RE = re . compile ( r '.+\.(.+)?$' )
def _item_to_ext ( self , item : Item ):
m = self . EXT_RE . match ( item . path . name )
return f '. { m . group ( 1 ) } ' if m is not None else ''
[docs]
@abstractmethod
def get_resource_name ( self , item : Item ) -> str :
"""Return a resource used on the browser side for ``item``."""
pass
[docs]
@abstractmethod
def get_file_name ( self , item : Item ) -> str :
"""Return a file path used on the browser side for ``item``."""
pass
[docs]
class RegexItemMapper ( ItemMapper ):
"""Map by using regular expression replacements.
"""
[docs]
def __init__ ( self , lib : Library , fmatch_re = None , repl_re = None ):
self . lib = lib
if fmatch_re is not None :
self . fmatch_re = re . compile ( fmatch_re )
else :
self . fmatch_re = None
if repl_re is not None :
self . repl_re = re . compile ( repl_re )
else :
self . repl_re = None
def _map ( self , item : Item ) -> str :
"""Return the regular expression matched/modified string of ``fname``.'
"""
fname = self . lib . attachment_resource ( item )
if fname is not None :
if self . fmatch_re and self . repl_re and self . fmatch_re . match ( fname ):
fname = self . repl_re . sub ( '_' , fname )
return fname
[docs]
def get_resource_name ( self , item : Item ) -> str :
return self . _map ( item )
[docs]
def get_file_name ( self , item : Item ) -> str :
return self . _map ( item )
[docs]
class IdItemMapper ( ItemMapper ):
"""Map by using item IDs.
"""
[docs]
def __init__ ( self , lib : Library , fmatch_re = None , repl_re = None ):
self . lib = lib
if fmatch_re is not None :
self . fmatch_re = re . compile ( fmatch_re )
else :
self . fmatch_re = None
if repl_re is not None :
self . repl_re = re . compile ( repl_re )
else :
self . repl_re = None
def _map ( self , item : Item ) -> str :
"""Return the regular expression matched/modified string of ``fname``.'
"""
if item . type == 'attachment' and item . path is not None :
ext = self . _item_to_ext ( item )
return f ' { self . lib . storage_dirname } / { item . id }{ ext } '
[docs]
def get_resource_name ( self , item : Item ) -> str :
return self . _map ( item )
[docs]
def get_file_name ( self , item : Item ) -> str :
return self . _map ( item )