From 01415776b92f6b2450637da6308efb4e1fb77c6a Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Tue, 12 May 2026 10:34:10 +0200 Subject: [PATCH] =?UTF-8?q?Opci=C3=B3=20--no-accents=20/=20=C2=ABSense=20a?= =?UTF-8?q?ccents=C2=BB=20a=20CLI=20i=20GUI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- font_gen.py | 12 +++++++++++- font_gen_gui.py | 32 +++++++++++++++++++++----------- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/font_gen.py b/font_gen.py index 52e8aa5..ea0ac0b 100644 --- a/font_gen.py +++ b/font_gen.py @@ -103,6 +103,7 @@ def build_font_bitmap( columns: int = 15, box_width_override: int | None = None, box_height_override: int | None = None, + strip_accents: bool = False, ) -> FontBitmapResult: """Rasteriza un TTF a un bitmap de fuente en memoria. No toca disco. @@ -160,6 +161,9 @@ def build_font_bitmap( if ch.isspace(): chars_to_render.append(ch) char_render_as[ch] = ch + elif strip_accents and ch in CHAR_FALLBACKS and font.getlength(CHAR_FALLBACKS[ch]) >= 1.0: + chars_to_render.append(ch) + char_render_as[ch] = CHAR_FALLBACKS[ch] elif font.getlength(ch) >= 1.0 and not _is_notdef(ch): chars_to_render.append(ch) char_render_as[ch] = ch @@ -408,10 +412,13 @@ def render_font( columns: int, box_width_override: int | None, box_height_override: int | None, + strip_accents: bool = False, ) -> None: """Wrapper CLI: rasteriza el TTF y escribe los ficheros, con logging.""" try: - result = build_font_bitmap(ttf_path, size, columns, box_width_override, box_height_override) + result = build_font_bitmap(ttf_path, size, columns, + box_width_override, box_height_override, + strip_accents) except (FileNotFoundError, RuntimeError) as e: print(f"Error: {e}", file=sys.stderr) sys.exit(1) @@ -492,6 +499,8 @@ Notas: parser.add_argument("--box-height", default=None, type=int, help="Altura fija de celda en px (default: auto)") parser.add_argument("--cell-spacing", default=0, type=int, help="Píxeles de separación entre columnas, y borde (default: 0)") parser.add_argument("--row-spacing", default=None, type=int, help="Píxeles de separación entre filas (default: igual a --cell-spacing)") + parser.add_argument("--no-accents", action="store_true", + help="Renderiza À/É/ñ/Ç… como A/E/n/C (sin acentos). El codepoint original se conserva en el .fnt.") args = parser.parse_args() @@ -529,6 +538,7 @@ Notas: columns = args.columns, box_width_override = args.box_width, box_height_override= args.box_height, + strip_accents = args.no_accents, ) diff --git a/font_gen_gui.py b/font_gen_gui.py index 2704fc9..6561f0e 100644 --- a/font_gen_gui.py +++ b/font_gen_gui.py @@ -47,12 +47,13 @@ class FontGenApp(tk.Tk): self._last_result: font_gen.FontBitmapResult | None = None self._zoom: int | None = DEFAULT_ZOOM # None = auto-fit; int = escala explícita - self.ttf_var = tk.StringVar() - self.size_var = tk.IntVar(value=8) - self.output_var = tk.StringVar() - self.columns_var = tk.IntVar(value=15) - self.bw_var = tk.StringVar() # "" = auto - self.bh_var = tk.StringVar() # "" = auto + self.ttf_var = tk.StringVar() + self.size_var = tk.IntVar(value=8) + self.output_var = tk.StringVar() + self.columns_var = tk.IntVar(value=15) + self.bw_var = tk.StringVar() # "" = auto + self.bh_var = tk.StringVar() # "" = auto + self.strip_accents_var = tk.BooleanVar(value=False) self._adv_visible = False @@ -60,7 +61,8 @@ class FontGenApp(tk.Tk): self._load_state() # antes de los traces: el set() inicial no debe disparar preview self._update_zoom_label() - for v in (self.ttf_var, self.size_var, self.columns_var, self.bw_var, self.bh_var): + for v in (self.ttf_var, self.size_var, self.columns_var, + self.bw_var, self.bh_var, self.strip_accents_var): v.trace_add("write", lambda *_: self._schedule_preview()) # Disparar un preview inicial si _load_state nos dejó un TTF válido. @@ -86,6 +88,8 @@ class FontGenApp(tk.Tk): ttk.Spinbox(row, from_=4, to=128, width=5, textvariable=self.size_var).pack(side="left") ttk.Label(row, text="Salida:").pack(side="left", padx=(16, 4)) ttk.Entry(row, textvariable=self.output_var, width=24).pack(side="left") + ttk.Checkbutton(row, text="Sense accents", + variable=self.strip_accents_var).pack(side="left", padx=(16, 0)) self.adv_btn = ttk.Button(root, text="▸ Opciones avanzadas", command=self._toggle_advanced) self.adv_btn.pack(anchor="w", pady=(8, 0)) @@ -202,7 +206,10 @@ class FontGenApp(tk.Tk): bh = _parse_optional_positive_int(self.bh_var.get()) try: - result = font_gen.build_font_bitmap(ttf, size, columns, bw, bh) + result = font_gen.build_font_bitmap( + ttf, size, columns, bw, bh, + strip_accents=self.strip_accents_var.get(), + ) except Exception as e: self._show_preview_error(f"Error: {e}") return @@ -333,6 +340,8 @@ class FontGenApp(tk.Tk): size = state.get("size") if isinstance(size, int) and 4 <= size <= 256: self.size_var.set(size) + if isinstance(state.get("strip_accents"), bool): + self.strip_accents_var.set(state["strip_accents"]) # Zoom: None (auto), o int en [1, MANUAL_MAX_SCALE] if "zoom" in state: zoom = state["zoom"] @@ -347,9 +356,10 @@ class FontGenApp(tk.Tk): except tk.TclError: size = 8 state = { - "ttf": self.ttf_var.get().strip(), - "size": size, - "zoom": self._zoom, + "ttf": self.ttf_var.get().strip(), + "size": size, + "zoom": self._zoom, + "strip_accents": self.strip_accents_var.get(), } try: with open(STATE_FILE, "w", encoding="utf-8") as f: