gettext/gettext-tools/tests/xgettext-python-8
Bruno Haible 994c5188cb xgettext: Python: Add support for f-strings.
Reported by Ben <gnu@mail.qoben.com>
at <https://savannah.gnu.org/bugs/?61596>.

* gettext-tools/src/x-python.c (P7_498_START_OF_EXPRESSION): New macro.
(token_type_498, token_type_l498, token_type_m498, token_type_r498): New enum
items.
(free_token): Treat token_type_498 like token_type_string.
(phase7_getuc): Accept an f_string parameter. Use it to combine {{ to { and
}} to }.
(f_string_depth): New variable.
(struct f_string_level): New type.
(f_string_stack, f_string_stack_alloc): New variables.
(new_f_string_level): New function.
(open_pb): Renamed from open_pbb.
(phase5_get): Consider also the f_string_stack. Accept f"...", fr"...", rf"..."
syntax. Recognize tokens of type token_type_498, token_type_l498,
token_type_m498, token_type_r498.
(x_python_lex): Treat token_type_498 like token_type_string.
(extract_balanced): Handle the new token types.
(extract_python): Initialize f_string_depth and the f_string_stack.
* gettext-tools/tests/xgettext-python-1: Test also the backslash handling in
f-strings.
* gettext-tools/tests/xgettext-python-8: New file.
* gettext-tools/tests/Makefile.am (TESTS): Add it.
* gettext-tools/doc/lang-python.texi (Python): Explain the limitations of
f-string support.
* NEWS: Mention the change.
2023-12-05 14:39:40 +01:00

74 lines
1.7 KiB
Bash
Executable File

#!/bin/sh
. "${srcdir=.}/init.sh"; path_prepend_ . ../src
# Test of Python f-string support.
cat <<\EOF > xg-py-8.py
s0 = _(fr'An f-string without substitutions');
s1 = _(fr'''An f-string with
embedded
newlines''');
s2 = _(fr'An f-string with {n} substitutions');
s3 = _(fr'An f-string with several substitutions: {a} and {b} and {c} and so on');
s4 = fr"that's a valid string. " + _('This too');
s5 = fr'''a{fr'b{fr"c"+d}'}e''';
s6 = _("a normal string");
s7 = fr'abc{foo({},_('should be extracted'))}xyz';
return _("first normal string") + fr'{foo}' + _("second normal string");
EOF
: ${XGETTEXT=xgettext}
${XGETTEXT} --add-comments --no-location -o xg-py-8.tmp xg-py-8.py 2>xg-py-8.err
test $? = 0 || { cat xg-py-8.err; Exit 1; }
func_filter_POT_Creation_Date xg-py-8.tmp xg-py-8.pot
cat <<\EOF > xg-py-8.ok
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "An f-string without substitutions"
msgstr ""
msgid ""
"An f-string with\n"
"embedded\n"
"newlines"
msgstr ""
msgid "This too"
msgstr ""
msgid "a normal string"
msgstr ""
msgid "should be extracted"
msgstr ""
msgid "first normal string"
msgstr ""
msgid "second normal string"
msgstr ""
EOF
: ${DIFF=diff}
${DIFF} xg-py-8.ok xg-py-8.pot
result=$?
exit $result