12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- import re
- import hashlib
- from typing import Dict, Callable, NamedTuple
- from pathlib import Path
- class Info(NamedTuple):
- path: Path
- output_ext: str
- def hash(i: Info, algo='sha1') -> str:
- try:
- hash = hashlib.new(algo)
- except ImportError:
- raise ValueError(f"'{algo}' is invalid hash algorithm")
- # TODO: is okay to hash large image?
- with open(i.path, 'rb') as file:
- hash.update(file.read())
- return hash.hexdigest()
- pattern = re.compile(r'\[([\w:]+)\]')
- # all function must returns string or raise TypeError or ValueError
- # other errors will cause the extension error
- available_formats: Dict[str, Callable] = {
- 'name': lambda i: i.path.stem,
- 'extension': lambda i: i.path.suffix[1:],
- 'hash': hash,
- 'output_extension': lambda i: i.output_ext
- }
- def format(match: re.Match, info: Info) -> str:
- matches = match[1].split(':')
- name, args = matches[0], matches[1:]
- if name not in available_formats:
- return match[0]
- return available_formats[name](info, *args)
|