struct spec
{
unsigned int directives;
+ /* We consider a directive as "likely intentional" if it does not contain a
+ space. This prevents xgettext from flagging strings like "100% complete"
+ as 'javascript-format' if they don't occur in a context that requires a format
+ string. */
+ unsigned int likely_intentional_directives;
unsigned int numbered_arg_count;
struct numbered_arg *numbered;
};
struct spec *result;
spec.directives = 0;
+ spec.likely_intentional_directives = 0;
spec.numbered_arg_count = 0;
spec.numbered = NULL;
numbered_allocated = 0;
/* A directive. */
unsigned int number = 0;
enum format_arg_type type;
+ bool likely_intentional = true;
FDI_SET (format - 1, FMTDIR_START);
spec.directives++;
/* Parse flags. */
while (*format == '-' || *format == '+' || *format == ' '
|| *format == '0' || *format == 'I')
- format++;
+ {
+ if (*format == ' ')
+ likely_intentional = false;
+ format++;
+ }
/* Parse width. */
while (c_isdigit (*format))
}
}
+ if (likely_intentional)
+ spec.likely_intentional_directives++;
FDI_SET (format, FMTDIR_END);
format++;
return spec->directives;
}
+static bool
+format_is_unlikely_intentional (void *descr)
+{
+ struct spec *spec = (struct spec *) descr;
+
+ return spec->likely_intentional_directives == 0;
+}
+
static bool
format_check (void *msgid_descr, void *msgstr_descr, bool equality,
formatstring_error_logger_t error_logger, void *error_logger_data,
format_parse,
format_free,
format_get_number_of_directives,
- NULL,
+ format_is_unlikely_intentional,
format_check
};
format-go-1 format-go-2 format-go-3 \
format-java-1 format-java-2 \
format-java-printf-1 format-java-printf-2 \
- format-javascript-1 format-javascript-2 \
+ format-javascript-1 format-javascript-2 format-javascript-3 \
format-kde-1 format-kde-2 \
format-kde-kuit-1 format-kde-kuit-2 \
format-librep-1 format-librep-2 \
--- /dev/null
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test heuristic recognition of JavaScript format strings like "100% complete".
+
+cat <<\EOF > f-js-3.js
+gettext("Test 1a is 100% complete");
+// gettext("Test 1b is 100% complete").format(120); // TODO
+sformat(gettext("Test 1b is 100% complete"), 120);
+
+gettext("Test 2a from 0% complete to 100% complete");
+// gettext("Test 2b from 0% complete to 100% complete").format(120, 121); // TODO
+sformat(gettext("Test 2b from 0% complete to 100% complete"), 120, 121);
+
+gettext("Test 3a of %s is 100% complete");
+// gettext("Test 3b of %s is 100% complete").format("foo", 120); // TODO
+sformat(gettext("Test 3b of %s is 100% complete"), "foo", 120);
+EOF
+
+: ${XGETTEXT=xgettext}
+${XGETTEXT} --flag=sformat:1:javascript-format \
+ --omit-header --no-location -d f-js-3.tmp f-js-3.js || Exit 1
+LC_ALL=C tr -d '\r' < f-js-3.tmp.po > f-js-3.po || Exit 1
+
+cat <<\EOF > f-js-3.ok
+msgid "Test 1a is 100% complete"
+msgstr ""
+
+#, javascript-format
+msgid "Test 1b is 100% complete"
+msgstr ""
+
+msgid "Test 2a from 0% complete to 100% complete"
+msgstr ""
+
+#, javascript-format
+msgid "Test 2b from 0% complete to 100% complete"
+msgstr ""
+
+#, javascript-format
+msgid "Test 3a of %s is 100% complete"
+msgstr ""
+
+#, javascript-format
+msgid "Test 3b of %s is 100% complete"
+msgstr ""
+EOF
+
+: ${DIFF=diff}
+${DIFF} f-js-3.ok f-js-3.po
+result=$?
+
+exit $result