From b5befe8eb840975da654290f0091e4e9e5c5bdb3 Mon Sep 17 00:00:00 2001 From: Alex Eng Date: Fri, 17 Nov 2017 10:52:47 +1000 Subject: [PATCH] fix: printf positional variables https://zanata.atlassian.net/browse/ZNTA-2238 --- .../action/PrintfXSIExtensionValidation.java | 18 ++++++++++++------ .../PrintfXSIExtensionValidationTest.java | 10 ++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/server/gwt-shared/src/main/java/org/zanata/webtrans/shared/validation/action/PrintfXSIExtensionValidation.java b/server/gwt-shared/src/main/java/org/zanata/webtrans/shared/validation/action/PrintfXSIExtensionValidation.java index 9fe1128310..a38a6b61a8 100644 --- a/server/gwt-shared/src/main/java/org/zanata/webtrans/shared/validation/action/PrintfXSIExtensionValidation.java +++ b/server/gwt-shared/src/main/java/org/zanata/webtrans/shared/validation/action/PrintfXSIExtensionValidation.java @@ -22,7 +22,7 @@ public class PrintfXSIExtensionValidation extends PrintfVariablesValidation { // regex to find out whether the variable has position private static final RegExp POSITIONAL_REG_EXP = RegExp - .compile("%(\\d+\\$)\\w+"); + .compile("%(\\d+\\$).+"); public PrintfXSIExtensionValidation(ValidationId id, ValidationMessages messages) { @@ -66,19 +66,25 @@ private static boolean hasPosition(ArrayList variables) { private static ArrayList appendPosition(ArrayList sourceVars) { ArrayList result = Lists.newArrayList(); + String regex = buildPosRegex(sourceVars.size()); for (int i = 0; i < sourceVars.size(); i++) { String sourceVar = sourceVars.get(i); - int position = i + 1; - String replacement = "%" + position + "$"; - if (!sourceVar.contains(replacement)) { - result.add(sourceVar.replace("%", replacement)); - } else { + if (sourceVar.matches(regex)) { result.add(sourceVar); + } else { + int position = i + 1; + String replacement = "%" + position + "$"; + result.add(sourceVar.replace("%", replacement)); } } return result; } + private static String buildPosRegex(int size) { + String numeric = "[1-" + (size + 1) + "]"; + return ".*%" + numeric + "+\\$.*"; + } + private List checkPosition(ArrayList variables, int size) { ArrayList errors = new ArrayList(); diff --git a/server/gwt-shared/src/test/java/org/zanata/webtrans/shared/validation/PrintfXSIExtensionValidationTest.java b/server/gwt-shared/src/test/java/org/zanata/webtrans/shared/validation/PrintfXSIExtensionValidationTest.java index d694d15d68..9d36e14776 100644 --- a/server/gwt-shared/src/test/java/org/zanata/webtrans/shared/validation/PrintfXSIExtensionValidationTest.java +++ b/server/gwt-shared/src/test/java/org/zanata/webtrans/shared/validation/PrintfXSIExtensionValidationTest.java @@ -60,6 +60,16 @@ public void validExplicitPositionalVariables() { assertThat(errorList).isEmpty(); } + @Test + public void validExplicitPositionalVariables2() { + String source = "%2$.3f%1$s/day"; + String target = "%2$.3f%1$s/jour"; + List errorList = + printfXSIExtensionValidation.validate(source, target); + + assertThat(errorList).isEmpty(); + } + @Test public void mixPositionalVariablesWithNotPositional() { String source = "%s: Read error at byte %s, while reading %lu byte";