Files

92 lines
2.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
预览 MVP:参数单元格替换(Phase 2)
完整 dataSource 扩展在 Phase 3 convert 引擎实现
"""
import copy
import re
from typing import Any, Dict, List
_PARAM_PATTERN = re.compile(r"#\{([^}]+)\}")
def _replace_params_in_value(value: Any, params: Dict[str, Any]) -> Any:
if not isinstance(value, str):
return value
def repl(m):
key = m.group(1).strip()
if key in params:
return str(params[key])
return m.group(0)
return _PARAM_PATTERN.sub(repl, value)
def apply_parameter_cells(
snapshot: Dict[str, Any],
cells_meta: Dict[str, Any],
params: Dict[str, Any],
) -> Dict[str, Any]:
"""将 parameter 类型绑定写入 snapshotMVP"""
result = copy.deepcopy(snapshot)
if not result or not cells_meta:
return result
cell_list = cells_meta.get("cells") or []
sheets = result.get("sheets") or {}
for cell in cell_list:
if cell.get("type") != "parameter":
continue
sheet_id = cell.get("sheet")
row = cell.get("row", 0)
col = cell.get("col", 0)
custom = cell.get("custom") or {}
text = custom.get("value") or custom.get("text") or ""
if isinstance(text, str):
text = _replace_params_in_value(text, params)
sheet = sheets.get(sheet_id)
if not sheet:
continue
cell_data = sheet.setdefault("cellData", {})
row_data = cell_data.setdefault(str(row), {})
cell_obj = row_data.setdefault(str(col), {})
cell_obj["v"] = text
if "custom" in cell_obj:
cell_obj["custom"] = {**cell_obj.get("custom", {}), "value": text}
return result
def apply_snapshot_placeholders(
snapshot: Dict[str, Any],
params: Dict[str, Any],
) -> Dict[str, Any]:
"""扫描 snapshot 所有单元格,将 v / custom 字符串中的 #{param} 替换为查询参数"""
if not snapshot or not params:
return snapshot or {}
result = copy.deepcopy(snapshot)
sheets = result.get("sheets") or {}
for sheet in sheets.values():
if not isinstance(sheet, dict):
continue
cell_data = sheet.get("cellData") or {}
for row in cell_data.values():
if not isinstance(row, dict):
continue
for cell in row.values():
if not isinstance(cell, dict):
continue
v = cell.get("v")
if isinstance(v, str) and "#{" in v:
cell["v"] = _replace_params_in_value(v, params)
custom = cell.get("custom")
if isinstance(custom, dict):
for key, val in list(custom.items()):
if isinstance(val, str) and "#{" in val:
custom[key] = _replace_params_in_value(val, params)
cell["custom"] = custom
result["sheets"] = sheets
return result