From 10cfcbed676f9005053a656a0aa543425c151089 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Fri, 19 Jan 2024 16:22:54 +0100 Subject: [PATCH] feat: turn jinja extractor into a generic HTML template extractor ... supporting both jinja and JS microtemplates --- babel_extractors.csv | 2 +- frappe/gettext/extractors/html_template.py | 26 ++++++++++++++++++++++ frappe/gettext/extractors/jinja2.py | 11 --------- 3 files changed, 27 insertions(+), 12 deletions(-) create mode 100644 frappe/gettext/extractors/html_template.py delete mode 100644 frappe/gettext/extractors/jinja2.py diff --git a/babel_extractors.csv b/babel_extractors.csv index 133a13e736..37858338ba 100644 --- a/babel_extractors.csv +++ b/babel_extractors.csv @@ -6,4 +6,4 @@ hooks.py,frappe.gettext.extractors.navbar.extract **/report/*/*.json,frappe.gettext.extractors.report.extract **.py,frappe.gettext.extractors.python.extract **.js,frappe.gettext.extractors.javascript.extract -**.html,frappe.gettext.extractors.jinja2.extract \ No newline at end of file +**.html,frappe.gettext.extractors.html_template.extract \ No newline at end of file diff --git a/frappe/gettext/extractors/html_template.py b/frappe/gettext/extractors/html_template.py new file mode 100644 index 0000000000..34f51e4032 --- /dev/null +++ b/frappe/gettext/extractors/html_template.py @@ -0,0 +1,26 @@ +from jinja2.ext import babel_extract + +from .utils import extract_messages_from_code + + +def extract(*args, **kwargs): + """Extract messages from Jinja and JS microtemplates. + + Reuse the babel_extract function from jinja2.ext, but handle our own implementation of `_()`. + To handle JS microtemplates, parse all code again using regex.""" + fileobj = args[0] or kwargs["fileobj"] + print(fileobj.name) + code = fileobj.read().decode("utf-8") + + for lineno, funcname, messages, comments in babel_extract(*args, **kwargs): + if funcname == "_" and isinstance(messages, tuple) and len(messages) > 1: + funcname = "pgettext" + messages = (messages[-1], messages[0]) # (context, message) + + yield lineno, funcname, messages, comments + + for lineno, message, context in extract_messages_from_code(code): + if context: + yield lineno, "pgettext", (context, message), [] + else: + yield lineno, "_", message, [] diff --git a/frappe/gettext/extractors/jinja2.py b/frappe/gettext/extractors/jinja2.py deleted file mode 100644 index ee07ac6cee..0000000000 --- a/frappe/gettext/extractors/jinja2.py +++ /dev/null @@ -1,11 +0,0 @@ -from jinja2.ext import babel_extract - - -def extract(*args, **kwargs): - """Reuse the babel_extract function from jinja2.ext, but handle our own implementation of `_()`""" - for lineno, funcname, messages, comments in babel_extract(*args, **kwargs): - if funcname == "_" and isinstance(messages, tuple) and len(messages) > 1: - funcname = "pgettext" - messages = (messages[-1], messages[0]) # (context, message) - - yield lineno, funcname, messages, comments