From 125275548f2983c97863957d7d5a1ffc45165e99 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Wed, 10 Apr 2013 19:11:28 +0530 Subject: [PATCH] Remove results of {{subst:unc}} when adding categories Also contains a braindead Template remover. Doesn't even handle identified edge cases, much less unidentified ones. --- .../commons/MultipleShareActivity.java | 16 ++-- .../org/wikimedia/commons/ShareActivity.java | 13 ++- .../java/org/wikimedia/commons/Utils.java | 2 + .../commons/modifications/PageModifier.java | 3 + .../modifications/TemplateRemoveModifier.java | 79 +++++++++++++++++++ 5 files changed, 104 insertions(+), 9 deletions(-) create mode 100644 commons/src/main/java/org/wikimedia/commons/modifications/TemplateRemoveModifier.java diff --git a/commons/src/main/java/org/wikimedia/commons/MultipleShareActivity.java b/commons/src/main/java/org/wikimedia/commons/MultipleShareActivity.java index b2625f7f7..6093ebacf 100644 --- a/commons/src/main/java/org/wikimedia/commons/MultipleShareActivity.java +++ b/commons/src/main/java/org/wikimedia/commons/MultipleShareActivity.java @@ -21,6 +21,7 @@ import org.wikimedia.commons.media.*; import org.wikimedia.commons.modifications.CategoryModifier; import org.wikimedia.commons.modifications.ModificationsContentProvider; import org.wikimedia.commons.modifications.ModifierSequence; +import org.wikimedia.commons.modifications.TemplateRemoveModifier; public class MultipleShareActivity extends AuthenticatedActivity @@ -85,12 +86,17 @@ public class MultipleShareActivity } public void onCategoriesSave(ArrayList categories) { + if(categories.size() > 0) { ContentProviderClient client = getContentResolver().acquireContentProviderClient(ModificationsContentProvider.AUTHORITY); - for(Contribution contribution: photosList) { - ModifierSequence categoriesSequence = new ModifierSequence(contribution.getContentUri()); - categoriesSequence.queueModifier(new CategoryModifier(categories.toArray(new String[]{}))); - categoriesSequence.setContentProviderClient(client); - categoriesSequence.save(); + for(Contribution contribution: photosList) { + ModifierSequence categoriesSequence = new ModifierSequence(contribution.getContentUri()); + + categoriesSequence.queueModifier(new CategoryModifier(categories.toArray(new String[]{}))); + categoriesSequence.queueModifier(new TemplateRemoveModifier("Uncategorized")); + + categoriesSequence.setContentProviderClient(client); + categoriesSequence.save(); + } } // FIXME: Make sure that the content provider is up // This is the wrong place for it, but bleh - better than not having it turned on by default for people who don't go throughl ogin diff --git a/commons/src/main/java/org/wikimedia/commons/ShareActivity.java b/commons/src/main/java/org/wikimedia/commons/ShareActivity.java index f766efccf..fcfa63f16 100644 --- a/commons/src/main/java/org/wikimedia/commons/ShareActivity.java +++ b/commons/src/main/java/org/wikimedia/commons/ShareActivity.java @@ -18,6 +18,7 @@ import org.wikimedia.commons.auth.*; import org.wikimedia.commons.modifications.CategoryModifier; import org.wikimedia.commons.modifications.ModificationsContentProvider; import org.wikimedia.commons.modifications.ModifierSequence; +import org.wikimedia.commons.modifications.TemplateRemoveModifier; import java.util.ArrayList; @@ -74,10 +75,14 @@ public class ShareActivity } public void onCategoriesSave(ArrayList categories) { - ModifierSequence categoriesSequence = new ModifierSequence(contribution.getContentUri()); - categoriesSequence.queueModifier(new CategoryModifier(categories.toArray(new String[]{}))); - categoriesSequence.setContentProviderClient(getContentResolver().acquireContentProviderClient(ModificationsContentProvider.AUTHORITY)); - categoriesSequence.save(); + if(categories.size() > 0) { + ModifierSequence categoriesSequence = new ModifierSequence(contribution.getContentUri()); + + categoriesSequence.queueModifier(new CategoryModifier(categories.toArray(new String[]{}))); + categoriesSequence.queueModifier(new TemplateRemoveModifier("Uncategorized")); + categoriesSequence.setContentProviderClient(getContentResolver().acquireContentProviderClient(ModificationsContentProvider.AUTHORITY)); + categoriesSequence.save(); + } // FIXME: Make sure that the content provider is up // This is the wrong place for it, but bleh - better than not having it turned on by default for people who don't go throughl ogin diff --git a/commons/src/main/java/org/wikimedia/commons/Utils.java b/commons/src/main/java/org/wikimedia/commons/Utils.java index 19b23fc54..5cfdeadb9 100644 --- a/commons/src/main/java/org/wikimedia/commons/Utils.java +++ b/commons/src/main/java/org/wikimedia/commons/Utils.java @@ -15,8 +15,10 @@ import java.io.*; import java.text.*; import java.util.*; import java.util.concurrent.Executor; +import java.util.regex.Pattern; public class Utils { + public static Date parseMWDate(String mwDate) { SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); // Assuming MW always gives me UTC try { diff --git a/commons/src/main/java/org/wikimedia/commons/modifications/PageModifier.java b/commons/src/main/java/org/wikimedia/commons/modifications/PageModifier.java index 803942e17..b6e66ad6b 100644 --- a/commons/src/main/java/org/wikimedia/commons/modifications/PageModifier.java +++ b/commons/src/main/java/org/wikimedia/commons/modifications/PageModifier.java @@ -10,7 +10,10 @@ public abstract class PageModifier { String name = data.optString("name"); if(name.equals(CategoryModifier.MODIFIER_NAME)) { return new CategoryModifier(data.optJSONObject("data")); + } else if(name.equals(TemplateRemoveModifier.MODIFIER_NAME)) { + return new TemplateRemoveModifier(data.optJSONObject("data")); } + return null; } diff --git a/commons/src/main/java/org/wikimedia/commons/modifications/TemplateRemoveModifier.java b/commons/src/main/java/org/wikimedia/commons/modifications/TemplateRemoveModifier.java new file mode 100644 index 000000000..dc554bd35 --- /dev/null +++ b/commons/src/main/java/org/wikimedia/commons/modifications/TemplateRemoveModifier.java @@ -0,0 +1,79 @@ +package org.wikimedia.commons.modifications; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class TemplateRemoveModifier extends PageModifier { + + public static final String MODIFIER_NAME = "TemplateRemoverModifier"; + + public static final String PARAM_TEMPLATE_NAME = "template"; + + public TemplateRemoveModifier(String templateName) { + super(MODIFIER_NAME); + try { + params.putOpt(PARAM_TEMPLATE_NAME, templateName); + } catch (JSONException e) { + throw new RuntimeException(e); + } + } + + public TemplateRemoveModifier(JSONObject data) { + super(MODIFIER_NAME); + this.params = data; + } + + @Override + public String doModification(String pageName, String pageContents) { + String templateRawName = params.optString(PARAM_TEMPLATE_NAME); + // Wikitext title normalizing rules. Spaces and _ equivalent + // They also 'condense' - any number of them reduce to just one (just like HTML) + String templateNormalized = templateRawName.trim().replaceAll("(\\s|_)+", "(\\s|_)+"); + + // Not supporting {{ inside and HTML comments yet + // (Thanks to marktraceur for reminding me of the HTML comments exception) + Pattern templateStartPattern = Pattern.compile("\\{\\{" + templateNormalized, Pattern.CASE_INSENSITIVE); + Matcher matcher = templateStartPattern.matcher(pageContents); + + while(matcher.find()) { + int braceCount = 2; + int startIndex = matcher.start(); + int curIndex = matcher.end(); + while(curIndex < pageContents.length()) { + if(pageContents.charAt(curIndex) == '{') { + braceCount++; + } else if(pageContents.charAt(curIndex) == '}') { + braceCount--; + } + curIndex++; + if(braceCount == 0) { + break; + } + } + + // Strip trailing whitespace + while(curIndex < pageContents.length()) { + if(pageContents.charAt(curIndex) == ' ' || pageContents.charAt(curIndex) == '\n') { + curIndex++; + } else { + break; + } + } + + // I am so going to hell for this, sigh + pageContents = pageContents.substring(0, startIndex) + pageContents.substring(curIndex); + matcher = templateStartPattern.matcher(pageContents); + } + + return pageContents; + + } + + @Override + public String getEditSumary() { + return "Removed template " + params.optString(PARAM_TEMPLATE_NAME) + "."; + } +}