diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index 3daf14553..2a930bdfc 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java @@ -94,6 +94,8 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.inject.Inject; import javax.inject.Named; import org.apache.commons.lang3.StringUtils; @@ -914,19 +916,15 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements * @return LinkedHashMap */ private LinkedHashMap getDescriptions(String s) { - // trim spaces next to "=" and "|" - s = s.replace(" =", "=").replace(" |", "|").replace("= ","=").replace("| ","|"); - int descriptionIndex = s.indexOf("description="); - if(descriptionIndex == -1){ - descriptionIndex = s.indexOf("Description="); + final Pattern pattern = Pattern.compile("[dD]escription *=(.*?)\n *\\|", Pattern.DOTALL); + final Matcher matcher = pattern.matcher(s); + String description = null; + if (matcher.find()) { + description = matcher.group(); } - - if( descriptionIndex == -1 ){ + if(description == null){ return new LinkedHashMap<>(); } - final String descriptionToEnd = s.substring(descriptionIndex+12); - final int descriptionEndIndex = descriptionToEnd.indexOf("\n|"); - final String description = s.substring(descriptionIndex+12, descriptionIndex+12+descriptionEndIndex); final LinkedHashMap descriptionList = new LinkedHashMap<>(); diff --git a/app/src/test/kotlin/fr/free/nrw/commons/media/MediaDetailFragmentUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/media/MediaDetailFragmentUnitTests.kt index 40fea3bc6..c7af4ebf5 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/media/MediaDetailFragmentUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/media/MediaDetailFragmentUnitTests.kt @@ -466,6 +466,25 @@ class MediaDetailFragmentUnitTests { Assert.assertEquals(map, method.invoke(fragment, s)) } + @Test + @Throws(Exception::class) + fun testGetDescriptionsWithLongSpaces() { + `when`(media.filename).thenReturn("") + val method: Method = MediaDetailFragment::class.java.getDeclaredMethod("getDescriptions", String::class.java) + method.isAccessible = true + val s = "=={{int:filedesc}}==\n" + + "{{Information\n" + + "|Description ={{en|1=The interior of Sacred Heart RC Church, Wimbledon, London.}}\n" + + "|Source ={{own}}\n" + + "|Author =[[User:Diliff|Diliff]]\n" + + "|Date =2015-02-17\n" + + "|Permission ={{Diliff/Licensing}}\n" + + "|other_versions=\n" + + "}}" + val map = linkedMapOf("en" to "The interior of Sacred Heart RC Church, Wimbledon, London.") + Assert.assertEquals(map, method.invoke(fragment, s)) + } + @Test @Throws(Exception::class) fun testGetDescriptionList() {