summaryrefslogtreecommitdiff
path: root/src/net/sourceforge/plantuml/webp/Portraits.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/sourceforge/plantuml/webp/Portraits.java')
-rw-r--r--src/net/sourceforge/plantuml/webp/Portraits.java80
1 files changed, 65 insertions, 15 deletions
diff --git a/src/net/sourceforge/plantuml/webp/Portraits.java b/src/net/sourceforge/plantuml/webp/Portraits.java
index fcedb90..db0d93e 100644
--- a/src/net/sourceforge/plantuml/webp/Portraits.java
+++ b/src/net/sourceforge/plantuml/webp/Portraits.java
@@ -37,24 +37,26 @@ package net.sourceforge.plantuml.webp;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.text.Normalizer;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
+import java.util.Locale;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Pattern;
import net.sourceforge.plantuml.version.PSystemVersion;
public class Portraits {
- private final List<Portrait> all = new ArrayList<Portrait>();
-
- public void all(Portrait p) {
- all.add(p);
- }
+ private final static List<Portrait> all = new ArrayList<Portrait>();
+ private final static AtomicInteger current = new AtomicInteger();
private static InputStream getInputStream() {
return PSystemVersion.class.getResourceAsStream("out.png");
}
- public Portraits() {
+ static {
final InputStream is = getInputStream();
if (is != null) {
try {
@@ -72,33 +74,81 @@ public class Portraits {
}
- private void read(InputStream is) throws IOException {
+ private static void read(InputStream is) throws IOException {
final DataInputStream dis = new DataInputStream(is);
final int nb = dis.readShort();
final List<String> names = new ArrayList<String>();
final List<Integer> ages = new ArrayList<Integer>();
+ final List<String> quotes = new ArrayList<String>();
for (int i = 0; i < nb; i++) {
names.add(dis.readUTF());
ages.add((int) dis.readByte());
+ quotes.add(dis.readUTF());
}
for (int i = 0; i < nb; i++) {
final int len = dis.readShort();
final byte data[] = new byte[len];
dis.readFully(data);
- all.add(new Portrait(names.get(i), ages.get(i), data));
+ all.add(new Portrait(names.get(i), ages.get(i), quotes.get(i), data));
}
+ Collections.shuffle(all);
}
- public static void main(String[] args) {
- final Portraits p = new Portraits();
- System.err.println(p.all);
- }
-
- public Portrait getOne() {
+ public static Portrait getOne() {
if (all.size() == 0) {
return null;
}
- return all.get(0);
+ final int nb = current.get() % all.size();
+ return all.get(nb);
+ }
+
+ public static void nextOne() {
+ current.getAndIncrement();
+ }
+
+ public static Portrait getOne(String line) {
+ Portrait candidat = null;
+ for (Portrait p : all) {
+ final int dist = similar(p.getName(), line);
+ if (dist <= 3) {
+ if (candidat != null && dist < similar(candidat.getName(), line)) {
+ continue;
+ }
+ candidat = p;
+ }
+ }
+ return candidat;
}
+ public static int similar(String s1, String s2) {
+ final int[] tab1 = countLetter(s1);
+ final int[] tab2 = countLetter(s2);
+ int result = 0;
+ for (int i = 0; i < tab1.length; i++) {
+ result += Math.abs(tab1[i] - tab2[i]);
+ }
+ return result;
+ }
+
+ private static String noAccent(String str) {
+ final String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD);
+ final Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
+ return pattern.matcher(nfdNormalizedString).replaceAll("");
+ }
+
+ private static int[] countLetter(String s) {
+ s = noAccent(s).toLowerCase(Locale.US);
+ final int[] result = new int[26];
+ for (int i = 0; i < s.length(); i++) {
+ final char c = s.charAt(i);
+ if (c >= 'a' && c <= 'z') {
+ result[c - 'a']++;
+ }
+ }
+ return result;
+ }
+
+ static final List<Portrait> getAll() {
+ return all;
+ }
}