/
kuzant24
/
libre-macros
Обзор
Документация
Войти
/
kuzant24
/
libre-macros
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
new_source_processing
macro-lib/pythonpath/libre_macros_source_extra_lib.py
157 строк
5 KB
direct-dev.ru
fixed for home work
04 авг 2026, 16:06
04 авг 2026, 16:06
eb53100
Код
Авторство
О чём код?
# -*- coding: utf-8 -*- from __future__ import print_function, unicode_literals MACRO_VERSION = "3.10.359" """ Доп. параметры источника (книга ODS / XLS / XLSX / XLSM): prepare_source_in_memory и субключи. CSV-ключи — в libre_macros_csv_source_lib.py; здесь только book-extra. """ try: unicode except NameError: unicode = str SOURCE_EXTRA_DEFAULT_CHUNK_ROWS = 50000 _PREPARE_IN_MEMORY_KEYS = ( u"prepare_source_in_memory", u"подготовка_источника_в_памяти", u"prepare_in_memory", u"source_in_memory", u"матрица_в_памяти", ) _VALUES_MODE_KEYS = (u"values_mode", u"cell_values", u"значения") _MERGED_CELLS_KEYS = (u"merged_cells", u"merges", u"объединения") _TRIM_EMPTY_KEYS = (u"trim_empty", u"trim_trailing_empty", u"обрезать_пустые") _CONVERT_TYPES_KEYS = ( u"convert_types", u"types", u"типы", u"convert_numbers_dates", u"convert_where", ) _CHUNK_ROWS_KEYS = ( u"chunk_rows", u"memory_chunk_rows", u"max_chunk_rows", u"лимит_строк_чанка", ) _VALUES_MODE_CANON = frozenset((u"cached", u"formulas", u"prefer_cached")) _MERGED_CELLS_CANON = frozenset((u"top_left", u"fill")) _CONVERT_TYPES_CANON = frozenset((u"in_memory", u"uno", u"no", u"keep_text")) def _parse_source_extra_bool(raw, default=False): try: from libre_macros_csv_source_lib import _parse_source_extra_bool as _csv_bool return _csv_bool(raw, default=default) except Exception: if raw is None: return bool(default) if isinstance(raw, bool): return bool(raw) if isinstance(raw, (int, float)) and (not isinstance(raw, bool)): return bool(int(raw)) s = unicode(raw or u"").strip().lower() if s in (u"1", u"true", u"yes", u"да", u"on"): return True if s in (u"0", u"false", u"no", u"нет", u"off"): return False return bool(default) def _extra_key(extra, keys): if not isinstance(extra, dict): return None for key in keys: if key in extra: return extra.get(key) return None def _normalize_choice(raw, canon_set, default, aliases=None): if raw is None: return default text = unicode(raw or u"").strip().lower() if text == u"": return default if aliases and text in aliases: text = aliases[text] if text in canon_set: return text return default def source_extra_prepare_in_memory(extra): raw = _extra_key(extra, _PREPARE_IN_MEMORY_KEYS) if raw is None: return False return _parse_source_extra_bool(raw, default=False) def source_extra_values_mode(extra): raw = _extra_key(extra, _VALUES_MODE_KEYS) return _normalize_choice(raw, _VALUES_MODE_CANON, u"cached") def source_extra_merged_cells(extra): raw = _extra_key(extra, _MERGED_CELLS_KEYS) return _normalize_choice(raw, _MERGED_CELLS_CANON, u"top_left") def source_extra_trim_empty(extra, prepare_active=False): raw = _extra_key(extra, _TRIM_EMPTY_KEYS) if raw is None: return bool(prepare_active) return _parse_source_extra_bool(raw, default=bool(prepare_active)) def source_extra_convert_types(extra): raw = _extra_key(extra, _CONVERT_TYPES_KEYS) aliases = { u"yes": u"in_memory", u"true": u"in_memory", u"да": u"in_memory", u"auto": u"in_memory", } return _normalize_choice(raw, _CONVERT_TYPES_CANON, u"in_memory", aliases=aliases) def source_extra_chunk_rows(extra): raw = _extra_key(extra, _CHUNK_ROWS_KEYS) if raw is None: return int(SOURCE_EXTRA_DEFAULT_CHUNK_ROWS) try: n = int(raw) except (TypeError, ValueError): return int(SOURCE_EXTRA_DEFAULT_CHUNK_ROWS) if n < 1: return int(SOURCE_EXTRA_DEFAULT_CHUNK_ROWS) return int(n) def encode_source_extra_book_json(extra, prepare_active=False): """Сериализация book-extra dict в JSON (только ключи книги).""" import json if not isinstance(extra, dict): extra = {} prep = source_extra_prepare_in_memory(extra) if not prep and not prepare_active: if prep is False and _extra_key(extra, _PREPARE_IN_MEMORY_KEYS) is not None: return unicode(json.dumps({u"prepare_source_in_memory": False}, ensure_ascii=False, separators=(u",", u":"))) return u"" payload = {u"prepare_source_in_memory": bool(prep)} if prep: payload[u"values_mode"] = source_extra_values_mode(extra) payload[u"merged_cells"] = source_extra_merged_cells(extra) payload[u"trim_empty"] = source_extra_trim_empty(extra, prepare_active=True) payload[u"convert_types"] = source_extra_convert_types(extra) payload[u"chunk_rows"] = source_extra_chunk_rows(extra) try: return unicode(json.dumps(payload, ensure_ascii=False, separators=(u",", u":"))) except Exception: return u""