X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Flibrary%2FBasicLibrary.java;h=f6daed620f86347a5ec84a44ee3e8e80b600eb09;hp=29a3cf97efc162fb86f7035585e853fbbc25ce0a;hb=5f42f329b6d1dd0d61f49dd9947fe487c39160ee;hpb=63b9c2077a1e4baf3af3b3bb9187b71b6b706145 diff --git a/src/be/nikiroo/fanfix/library/BasicLibrary.java b/src/be/nikiroo/fanfix/library/BasicLibrary.java index 29a3cf9..f6daed6 100644 --- a/src/be/nikiroo/fanfix/library/BasicLibrary.java +++ b/src/be/nikiroo/fanfix/library/BasicLibrary.java @@ -4,9 +4,11 @@ import java.io.File; import java.io.IOException; import java.net.URL; import java.net.UnknownHostException; +import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map.Entry; import be.nikiroo.fanfix.Instance; import be.nikiroo.fanfix.data.MetaData; @@ -17,6 +19,7 @@ import be.nikiroo.fanfix.supported.BasicSupport; import be.nikiroo.fanfix.supported.SupportType; import be.nikiroo.utils.Image; import be.nikiroo.utils.Progress; +import be.nikiroo.utils.StringUtils; /** * Manage a library of Stories: import, export, list, modify. @@ -261,6 +264,114 @@ abstract public class BasicLibrary { return list; } + /** + * Return the list of authors, grouped by starting letter(s) if needed. + *

+ * If the number of author is not too high, only one group with an empty + * name and all the authors will be returned. + *

+ * If not, the authors will be separated into groups: + *

+ * Note that the letters used in the groups can vary (except * and + * 0-9, which may only be present or not). + * + * @return the authors' names, grouped by letter(s) + */ + public List>> getAuthorsGrouped() { + int MAX = 20; + + List>> groups = new ArrayList>>(); + List authors = getAuthors(); + + if (authors.size() <= MAX) { + groups.add(new SimpleEntry>("", authors)); + return groups; + } + + groups.add(new SimpleEntry>("*", getAuthorsGroup( + authors, '*'))); + groups.add(new SimpleEntry>("0-9", + getAuthorsGroup(authors, '0'))); + + for (char car = 'A'; car <= 'Z'; car++) { + groups.add(new SimpleEntry>(Character + .toString(car), getAuthorsGroup(authors, car))); + } + + // do NOT collapse * and [0-9] with the rest + for (int i = 2; i + 1 < groups.size(); i++) { + Entry> now = groups.get(i); + Entry> next = groups.get(i + 1); + int currentTotal = now.getValue().size() + next.getValue().size(); + if (currentTotal <= MAX) { + String key = now.getKey().charAt(0) + "-" + + next.getKey().charAt(next.getKey().length() - 1); + List all = new ArrayList(); + all.addAll(now.getValue()); + all.addAll(next.getValue()); + groups.set(i, new SimpleEntry>(key, all)); + groups.remove(i + 1); + i--; + } + } + + for (int i = 0; i < groups.size(); i++) { + if (groups.get(i).getValue().size() == 0) { + groups.remove(i); + i--; + } + } + + return groups; + } + + /** + * Get all the authors that start with the given character: + *
    + *
  • *: any author whose name doesn't contain letters nor numbers + *
  • + *
  • 0: any authors whose name starts with a number
  • + *
  • A (any capital latin letter): any author whose name starts + * with A
  • + *
+ * + * @param authors + * the full list of authors + * @param car + * the starting character, *, 0 or a capital + * letter + * @return the authors that fulfill the starting letter + */ + private List getAuthorsGroup(List authors, char car) { + List accepted = new ArrayList(); + for (String author : authors) { + char first = '*'; + for (int i = 0; first == '*' && i < author.length(); i++) { + String san = StringUtils.sanitize(author, true, true); + char c = san.charAt(i); + if (c >= '0' && c <= '9') { + first = '0'; + } else if (c >= 'a' && c <= 'z') { + first = (char) (c - 'a' + 'A'); + } else if (c >= 'A' && c <= 'Z') { + first = c; + } + } + + if (first == car) { + accepted.add(author); + } + } + + return accepted; + } + /** * List all the stories in the {@link BasicLibrary}. *