pytex/PyTeX/format/dict_formatter.py

95 lines
3.6 KiB
Python
Raw Normal View History

2022-02-07 18:36:30 +01:00
import csv
2022-02-06 16:50:09 +01:00
from pathlib import Path
from typing import List, Dict, Tuple, Optional
2022-02-07 18:36:30 +01:00
2022-02-06 16:50:09 +01:00
from .constants import *
2022-02-07 18:36:30 +01:00
from .pytex_formatter import PyTeXFormatter
2022-02-06 16:50:09 +01:00
from ..logger import logger
from .formatting_config import FormattingConfig
2022-02-06 15:10:38 +01:00
2022-02-06 16:50:09 +01:00
class DictFormatter(PyTeXFormatter):
def __init__(self, *args, **kwargs):
super(DictFormatter, self).__init__(*args, **kwargs)
with open(self.input_file, 'r') as file:
line = file.readline()
parts = [entry.strip() for entry in line.split(',')]
if not len(parts) >= 1:
raise NotImplementedError
if not parts[0] == DICTIONARY_KEY_COLUMN_NAME:
raise NotImplementedError
self._languages = parts[1:]
self._dict_name = self.input_file.name.split('.')[0]
self._translations = None
def dependencies(self) -> List[str]:
return [] # No dependencies for dictionaries
2022-02-06 16:50:09 +01:00
@property
def translations(self) -> Dict:
if self._translations is None:
self._translations = self.parse()
return self._translations
2022-02-08 18:26:25 +01:00
@property
2022-02-06 16:50:09 +01:00
def output_files(self) -> List[str]:
return [
DICTIONARY_NAMING_PATTERN.format(
dict_name=self._dict_name,
language=language
)
for language in self._languages
]
def parse(self) -> Dict:
with open(self.input_file, newline='') as csvfile:
spamreader = csv.reader(csvfile, delimiter=',', quotechar='|')
next(spamreader) # Skip languages line
2022-02-08 16:39:20 +01:00
translations: Dict = {}
2022-02-06 16:50:09 +01:00
for language in self._languages:
translations[language] = {}
for line in spamreader:
if not len(line) == len(self._languages) + 1:
raise NotImplementedError # Invalid file format
for n in range(1, len(line)):
translations[self._languages[n]][line[0]] = line[n]
return translations
def format(self, build_dir: Path, overwrite: bool = False) -> List[Tuple[str, FormattingConfig]]:
2022-02-06 16:50:09 +01:00
build_dir.mkdir(parents=True, exist_ok=True)
2022-02-06 18:51:49 +01:00
self.make_header()
2022-02-06 16:50:09 +01:00
for language in self._languages:
2022-02-08 16:39:20 +01:00
lines: List[str] = [self.make_header(), '']
2022-02-06 16:50:09 +01:00
lines += r'\ProvidesDictionary{{{dict_name}}}{{{language}}}'.format(
dict_name=self._dict_name,
language=language
)
2022-02-07 18:36:30 +01:00
lines += ['\n'] * 2
2022-02-06 16:50:09 +01:00
for key in self.translations[language].keys():
if self.translations[language][key].strip() != '':
lines += r'\providetranslation{{{key}}}{{{translation}}}'.format(
key=key.strip(),
translation=self.translations[language][key].strip()
)
lines += '\n'
else:
logger.warning(
'Empty translation key found in {filename}'.format(
filename=self.input_file.name
)
)
output_file = build_dir / DICTIONARY_NAMING_PATTERN.format(
language=language,
dict_name=self._dict_name
)
if not overwrite and output_file.exists():
raise NotImplementedError
else:
output_file.write_text(
'\n'.join(lines)
)
logger.info(
f'Successfully wrote dictionary file {output_file.name}.'
)
return [] # No future configuration needed