feat: Removed docx and added PDF support
This commit is contained in:
@@ -1,34 +1,50 @@
|
||||
import re
|
||||
import openpyxl
|
||||
from typing import Union, IO
|
||||
from openpyxl.cell import Cell
|
||||
from typing import Union, Tuple, Iterator, IO
|
||||
import locale
|
||||
|
||||
|
||||
class XlsxReplacement:
|
||||
def __init__(self, file: Union[str, IO]):
|
||||
self.file = file
|
||||
self.xlsx = openpyxl.load_workbook(file, read_only=True, data_only=True)
|
||||
self.re_replace = re.compile('\[\[(?:(\w+):)?([a-zA-Z]+\d+)\]\]')
|
||||
self.errors = []
|
||||
self.reset_settings = {}
|
||||
|
||||
def find_replace_text(self, text: str):
|
||||
if '[[' not in text:
|
||||
return text
|
||||
def get_replacements(self) -> Iterator[Tuple[int, int, str]]:
|
||||
self._get_settings()
|
||||
sheet = self.xlsx['replacements']
|
||||
for row in sheet.iter_rows(min_row=1, max_col=5):
|
||||
content = [c.value for c in row]
|
||||
x = int(content[0])
|
||||
y = int(content[1])
|
||||
value = content[2]
|
||||
if len(content) == 5:
|
||||
value_format = content[3]
|
||||
str_format = content[4]
|
||||
print(value_format)
|
||||
print(str_format)
|
||||
if value_format is not None and isinstance(value_format, str) and len(value_format) > 0:
|
||||
value = locale.format(value_format, value)
|
||||
if str_format is not None and isinstance(str_format, str) and len(str_format) > 0:
|
||||
value = str_format.format(value)
|
||||
if not isinstance(value, str):
|
||||
value = str(value)
|
||||
yield x, y, value
|
||||
|
||||
return self.re_replace.sub(self._regex_replacement, text)
|
||||
def _get_settings(self):
|
||||
sheet = self.xlsx['settings']
|
||||
for row in sheet.iter_rows(max_col=2):
|
||||
key, value = [i.value for i in row]
|
||||
if key == 'locale':
|
||||
print("Using locale %s" % value)
|
||||
old_locale = '.'.join(locale.getlocale())
|
||||
locale.setlocale(locale.LC_ALL, value)
|
||||
self.reset_settings['locale'] = old_locale
|
||||
|
||||
def _regex_replacement(self, match):
|
||||
sheet, cell = match.groups()
|
||||
if sheet is None:
|
||||
sheet = self.xlsx.active
|
||||
else:
|
||||
try:
|
||||
sheet = self.xlsx[sheet]
|
||||
except IndexError:
|
||||
self.errors.append('Unknown sheet {sheet}'.format(sheet=sheet))
|
||||
return 'ERR Unknown sheet'
|
||||
try:
|
||||
return str(sheet[cell].value)
|
||||
except (IndexError, ValueError):
|
||||
self.errors.append('Unknown cell {sheet}:{cell}'.format(sheet=sheet, cell=cell))
|
||||
return 'ERR Unknown cell'
|
||||
def _reset_settings(self):
|
||||
for key, value in self.reset_settings:
|
||||
if key == 'locale':
|
||||
locale.setlocale(locale.LC_ALL, value)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user