seitime-frappe/frappe/gettext/extractors/html_template.py
barredterra 10cfcbed67 feat: turn jinja extractor into a generic HTML template extractor
... supporting both jinja and JS microtemplates
2024-01-19 16:22:54 +01:00

26 lines
899 B
Python

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, []