From c5b527f4500b687f66f90c9e75707d59f5c92f3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90?= <73240868+JustinLiang522@users.noreply.github.com> Date: Sun, 29 May 2022 11:01:03 +0800 Subject: [PATCH] fix #4971 (#4974) --- .../commons/media/MediaDetailFragment.java | 18 ++++++++---------- .../media/MediaDetailFragmentUnitTests.kt | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 10 deletions(-) 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() {