bunch of fixes
This commit is contained in:
parent
13c5d72596
commit
111b1f7f1e
4 changed files with 91 additions and 21 deletions
|
|
@ -275,7 +275,7 @@ class TranslationWorker(QThread):
|
||||||
clear_cache()
|
clear_cache()
|
||||||
|
|
||||||
# Check for required environment variables
|
# Check for required environment variables
|
||||||
required_envs = ["api", "key", "organization", "model", "language", "timeout", "fileThreads", "threads", "width", "listWidth"]
|
required_envs = ["api", "key", "model", "language", "timeout", "fileThreads", "threads", "width", "listWidth"]
|
||||||
env_missing = False
|
env_missing = False
|
||||||
|
|
||||||
for env in required_envs:
|
for env in required_envs:
|
||||||
|
|
|
||||||
|
|
@ -261,6 +261,30 @@ class _SubprocessWorker(QThread):
|
||||||
self.done.emit(False, f"{self.label}: {exc}")
|
self.done.emit(False, f"{self.label}: {exc}")
|
||||||
|
|
||||||
|
|
||||||
|
class _JsonFormatWorker(QThread):
|
||||||
|
"""Format all JSON files in a directory using the bundled dazedformat utility."""
|
||||||
|
done = pyqtSignal(bool, str)
|
||||||
|
log = pyqtSignal(str)
|
||||||
|
|
||||||
|
def __init__(self, data_path: str):
|
||||||
|
super().__init__()
|
||||||
|
self.data_path = data_path
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
try:
|
||||||
|
from util.dazedformat import format_json_files
|
||||||
|
self.log.emit(f"Formatting JSON files in {self.data_path} …")
|
||||||
|
count, errors = format_json_files(self.data_path, log=self.log.emit)
|
||||||
|
for e in errors:
|
||||||
|
self.log.emit(f" ⚠ {e}")
|
||||||
|
if errors:
|
||||||
|
self.done.emit(False, f"dazedformat: {count} formatted, {len(errors)} error(s).")
|
||||||
|
else:
|
||||||
|
self.done.emit(True, f"dazedformat: {count} file(s) formatted successfully.")
|
||||||
|
except Exception as exc:
|
||||||
|
self.done.emit(False, f"dazedformat error: {exc}")
|
||||||
|
|
||||||
|
|
||||||
class _FileCopyWorker(QThread):
|
class _FileCopyWorker(QThread):
|
||||||
"""Recursively copy a source folder into a destination folder."""
|
"""Recursively copy a source folder into a destination folder."""
|
||||||
done = pyqtSignal(int, list) # count_copied, errors
|
done = pyqtSignal(int, list) # count_copied, errors
|
||||||
|
|
@ -533,11 +557,6 @@ class WorkflowTab(QWidget):
|
||||||
row1.addWidget(sel_core)
|
row1.addWidget(sel_core)
|
||||||
|
|
||||||
row1.addStretch()
|
row1.addStretch()
|
||||||
|
|
||||||
self.import_btn = _make_btn("⬇ Import Selected → files/", "#007acc")
|
|
||||||
self.import_btn.setEnabled(False)
|
|
||||||
self.import_btn.clicked.connect(self._import_files)
|
|
||||||
row1.addWidget(self.import_btn)
|
|
||||||
layout.addLayout(row1)
|
layout.addLayout(row1)
|
||||||
|
|
||||||
# ── Step 1: Vocab / Glossary ────────────────────────────────────────────
|
# ── Step 1: Vocab / Glossary ────────────────────────────────────────────
|
||||||
|
|
@ -933,13 +952,14 @@ class WorkflowTab(QWidget):
|
||||||
tb.setSpacing(10)
|
tb.setSpacing(10)
|
||||||
|
|
||||||
# ---- Task A: dazedformat -----------------------------------------
|
# ---- Task A: dazedformat -----------------------------------------
|
||||||
ta = QGroupBox("A — Format JSON files with dazedformat")
|
ta = QGroupBox("A — Format JSON files (dazedformat)")
|
||||||
ta.setStyleSheet(self._task_box_style())
|
ta.setStyleSheet(self._task_box_style())
|
||||||
ta_inner = QVBoxLayout(ta)
|
ta_inner = QVBoxLayout(ta)
|
||||||
ta_inner.setSpacing(4)
|
ta_inner.setSpacing(4)
|
||||||
ta_desc = QLabel(
|
ta_desc = QLabel(
|
||||||
"Runs <code>dazedformat .</code> in the game\'s data folder to "
|
"Normalises all JSON files in the game's data folder by round-tripping them "
|
||||||
"normalise all JSON files before importing."
|
"through <code>json.load / json.dump</code>. "
|
||||||
|
"Bundled — no external install required."
|
||||||
)
|
)
|
||||||
ta_desc.setTextFormat(Qt.RichText)
|
ta_desc.setTextFormat(Qt.RichText)
|
||||||
ta_desc.setWordWrap(True)
|
ta_desc.setWordWrap(True)
|
||||||
|
|
@ -1043,14 +1063,18 @@ class WorkflowTab(QWidget):
|
||||||
|
|
||||||
layout.addWidget(tasks_box)
|
layout.addWidget(tasks_box)
|
||||||
|
|
||||||
# ---- Run All button ------------------------------------------
|
# ---- Run All + Import button row --------------------------------
|
||||||
run_all_row = QHBoxLayout()
|
bottom_row = QHBoxLayout()
|
||||||
run_all_btn = _make_btn("▶▶ Run All 3 Tasks", "#007acc")
|
bottom_row.addStretch()
|
||||||
|
run_all_btn = _make_btn("▶▶ Run All 3 Tasks", "#3a4a6a")
|
||||||
run_all_btn.setToolTip("Run dazedformat, prettier, and gameupdate copy in sequence")
|
run_all_btn.setToolTip("Run dazedformat, prettier, and gameupdate copy in sequence")
|
||||||
run_all_btn.clicked.connect(self._run_all_preprocess)
|
run_all_btn.clicked.connect(self._run_all_preprocess)
|
||||||
run_all_row.addStretch()
|
bottom_row.addWidget(run_all_btn)
|
||||||
run_all_row.addWidget(run_all_btn)
|
self.import_btn = _make_btn("⬇ Import Selected → files/", "#3a4a6a")
|
||||||
layout.addLayout(run_all_row)
|
self.import_btn.setEnabled(False)
|
||||||
|
self.import_btn.clicked.connect(self._import_files)
|
||||||
|
bottom_row.addWidget(self.import_btn)
|
||||||
|
layout.addLayout(bottom_row)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _task_box_style() -> str:
|
def _task_box_style() -> str:
|
||||||
|
|
@ -2393,7 +2417,7 @@ class WorkflowTab(QWidget):
|
||||||
if not data_path:
|
if not data_path:
|
||||||
self._log("⚠ No data folder detected. Complete Step 0 first.")
|
self._log("⚠ No data folder detected. Complete Step 0 first.")
|
||||||
return
|
return
|
||||||
w = _SubprocessWorker(["dazedformat", "."], cwd=data_path, label="dazedformat")
|
w = _JsonFormatWorker(data_path)
|
||||||
w.log.connect(self._log)
|
w.log.connect(self._log)
|
||||||
w.done.connect(lambda ok, msg: self._log(("✅ " if ok else "❌ ") + msg))
|
w.done.connect(lambda ok, msg: self._log(("✅ " if ok else "❌ ") + msg))
|
||||||
self._worker = w
|
self._worker = w
|
||||||
|
|
@ -2445,13 +2469,12 @@ class WorkflowTab(QWidget):
|
||||||
gameupdate_src = self.pp_gameupdate_edit.text().strip()
|
gameupdate_src = self.pp_gameupdate_edit.text().strip()
|
||||||
skipped: list[str] = []
|
skipped: list[str] = []
|
||||||
|
|
||||||
# A — dazedformat
|
# A — dazedformat (bundled, no PATH check needed)
|
||||||
if data_path and _shutil.which("dazedformat"):
|
if data_path:
|
||||||
self._log("▶ [A] dazedformat …")
|
self._log("▶ [A] dazedformat …")
|
||||||
self._run_dazedformat()
|
self._run_dazedformat()
|
||||||
else:
|
else:
|
||||||
reason = "data folder missing" if not data_path else "dazedformat not on PATH"
|
skipped.append("A (dazedformat): data folder missing")
|
||||||
skipped.append(f"A (dazedformat): {reason}")
|
|
||||||
|
|
||||||
# B — jsbeautifier (pure Python, no Node required)
|
# B — jsbeautifier (pure Python, no Node required)
|
||||||
if plugins_js and Path(plugins_js).is_file():
|
if plugins_js and Path(plugins_js).is_file():
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,6 @@ load_dotenv()
|
||||||
for env in [
|
for env in [
|
||||||
"api",
|
"api",
|
||||||
"key",
|
"key",
|
||||||
"organization",
|
|
||||||
"model",
|
"model",
|
||||||
"language",
|
"language",
|
||||||
"timeout",
|
"timeout",
|
||||||
|
|
|
||||||
48
util/dazedformat.py
Normal file
48
util/dazedformat.py
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
"""Bundled JSON formatter (dazedformat).
|
||||||
|
|
||||||
|
Normalises all .json files in a directory tree by round-tripping them
|
||||||
|
through json.load / json.dump with indent=4, which ensures consistent
|
||||||
|
formatting before importing into files/.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Callable
|
||||||
|
|
||||||
|
|
||||||
|
def format_json_files(
|
||||||
|
directory: str | Path,
|
||||||
|
log: Callable[[str], None] | None = None,
|
||||||
|
) -> tuple[int, list[str]]:
|
||||||
|
"""Format every .json file found under *directory* in-place.
|
||||||
|
|
||||||
|
Returns (formatted_count, error_list).
|
||||||
|
"""
|
||||||
|
directory = Path(directory)
|
||||||
|
formatted = 0
|
||||||
|
errors: list[str] = []
|
||||||
|
|
||||||
|
for root, _, files in os.walk(directory):
|
||||||
|
for name in files:
|
||||||
|
if not name.lower().endswith(".json"):
|
||||||
|
continue
|
||||||
|
fp = Path(root) / name
|
||||||
|
try:
|
||||||
|
text = fp.read_text(encoding="utf-8")
|
||||||
|
data = json.loads(text)
|
||||||
|
pretty = json.dumps(data, indent=4, ensure_ascii=False)
|
||||||
|
# Only write if the content actually changed
|
||||||
|
if pretty != text:
|
||||||
|
fp.write_text(pretty, encoding="utf-8")
|
||||||
|
formatted += 1
|
||||||
|
if log:
|
||||||
|
log(f" Formatted: {fp.relative_to(directory)}")
|
||||||
|
except Exception as exc:
|
||||||
|
msg = f"Error in {fp}: {exc}"
|
||||||
|
errors.append(msg)
|
||||||
|
if log:
|
||||||
|
log(f" ⚠ {msg}")
|
||||||
|
|
||||||
|
return formatted, errors
|
||||||
Loading…
Reference in a new issue