Convert RGB colors from aCalendar to CSS colors
This commit is contained in:
@@ -5,7 +5,9 @@ import java.io.FileReader;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -62,6 +64,162 @@ END:VEVENT
|
||||
*/
|
||||
|
||||
public class FixIcsTimestamps {
|
||||
|
||||
// Colors from https://www.w3.org/TR/2011/REC-css3-color-20110607/#svg-color
|
||||
// as referenced in https://tools.ietf.org/html/rfc7986#section-5.9
|
||||
static final Map<String,Integer[]> cssColors;
|
||||
static {
|
||||
cssColors = new HashMap<String, Integer[]>();
|
||||
|
||||
cssColors.put("aliceblue", new Integer[] {240,248,255});
|
||||
cssColors.put("antiquewhite", new Integer[] {250,235,215});
|
||||
cssColors.put("aqua", new Integer[] {0,255,255});
|
||||
cssColors.put("aquamarine", new Integer[] {127,255,212});
|
||||
cssColors.put("azure", new Integer[] {240,255,255});
|
||||
cssColors.put("beige", new Integer[] {245,245,220});
|
||||
cssColors.put("bisque", new Integer[] {255,228,196});
|
||||
cssColors.put("black", new Integer[] {0,0,0});
|
||||
cssColors.put("blanchedalmond", new Integer[] {255,235,205});
|
||||
cssColors.put("blue", new Integer[] {0,0,255});
|
||||
cssColors.put("blueviolet", new Integer[] {138,43,226});
|
||||
cssColors.put("brown", new Integer[] {165,42,42});
|
||||
cssColors.put("burlywood", new Integer[] {222,184,135});
|
||||
cssColors.put("cadetblue", new Integer[] {95,158,160});
|
||||
cssColors.put("chartreuse", new Integer[] {127,255,0});
|
||||
cssColors.put("chocolate", new Integer[] {210,105,30});
|
||||
cssColors.put("coral", new Integer[] {255,127,80});
|
||||
cssColors.put("cornflowerblue", new Integer[] {100,149,237});
|
||||
cssColors.put("cornsilk", new Integer[] {255,248,220});
|
||||
cssColors.put("crimson", new Integer[] {220,20,60});
|
||||
cssColors.put("cyan", new Integer[] {0,255,255});
|
||||
cssColors.put("darkblue", new Integer[] {0,0,139});
|
||||
cssColors.put("darkcyan", new Integer[] {0,139,139});
|
||||
cssColors.put("darkgoldenrod", new Integer[] {184,134,11});
|
||||
cssColors.put("darkgray", new Integer[] {169,169,169});
|
||||
cssColors.put("darkgreen", new Integer[] {0,100,0});
|
||||
cssColors.put("darkgrey", new Integer[] {169,169,169});
|
||||
cssColors.put("darkkhaki", new Integer[] {189,183,107});
|
||||
cssColors.put("darkmagenta", new Integer[] {139,0,139});
|
||||
cssColors.put("darkolivegreen", new Integer[] {85,107,47});
|
||||
cssColors.put("darkorange", new Integer[] {255,140,0});
|
||||
cssColors.put("darkorchid", new Integer[] {153,50,204});
|
||||
cssColors.put("darkred", new Integer[] {139,0,0});
|
||||
cssColors.put("darksalmon", new Integer[] {233,150,122});
|
||||
cssColors.put("darkseagreen", new Integer[] {143,188,143});
|
||||
cssColors.put("darkslateblue", new Integer[] {72,61,139});
|
||||
cssColors.put("darkslategray", new Integer[] {47,79,79});
|
||||
cssColors.put("darkslategrey", new Integer[] {47,79,79});
|
||||
cssColors.put("darkturquoise", new Integer[] {0,206,209});
|
||||
cssColors.put("darkviolet", new Integer[] {148,0,211});
|
||||
cssColors.put("deeppink", new Integer[] {255,20,147});
|
||||
cssColors.put("deepskyblue", new Integer[] {0,191,255});
|
||||
cssColors.put("dimgray", new Integer[] {105,105,105});
|
||||
cssColors.put("dimgrey", new Integer[] {105,105,105});
|
||||
cssColors.put("dodgerblue", new Integer[] {30,144,255});
|
||||
cssColors.put("firebrick", new Integer[] {178,34,34});
|
||||
cssColors.put("floralwhite", new Integer[] {255,250,240});
|
||||
cssColors.put("forestgreen", new Integer[] {34,139,34});
|
||||
cssColors.put("fuchsia", new Integer[] {255,0,255});
|
||||
cssColors.put("gainsboro", new Integer[] {220,220,220});
|
||||
cssColors.put("ghostwhite", new Integer[] {248,248,255});
|
||||
cssColors.put("gold", new Integer[] {255,215,0});
|
||||
cssColors.put("goldenrod", new Integer[] {218,165,32});
|
||||
cssColors.put("gray", new Integer[] {128,128,128});
|
||||
cssColors.put("green", new Integer[] {0,128,0});
|
||||
cssColors.put("greenyellow", new Integer[] {173,255,47});
|
||||
cssColors.put("grey", new Integer[] {128,128,128});
|
||||
cssColors.put("honeydew", new Integer[] {240,255,240});
|
||||
cssColors.put("hotpink", new Integer[] {255,105,180});
|
||||
cssColors.put("indianred", new Integer[] {205,92,92});
|
||||
cssColors.put("indigo", new Integer[] {75,0,130});
|
||||
cssColors.put("ivory", new Integer[] {255,255,240});
|
||||
cssColors.put("khaki", new Integer[] {240,230,140});
|
||||
cssColors.put("lavender", new Integer[] {230,230,250});
|
||||
cssColors.put("lavenderblush", new Integer[] {255,240,245});
|
||||
cssColors.put("lawngreen", new Integer[] {124,252,0});
|
||||
cssColors.put("lemonchiffon", new Integer[] {255,250,205});
|
||||
cssColors.put("lightblue", new Integer[] {173,216,230});
|
||||
cssColors.put("lightcoral", new Integer[] {240,128,128});
|
||||
cssColors.put("lightcyan", new Integer[] {224,255,255});
|
||||
cssColors.put("lightgoldenrodyellow", new Integer[] {250,250,210});
|
||||
cssColors.put("lightgray", new Integer[] {211,211,211});
|
||||
cssColors.put("lightgreen", new Integer[] {144,238,144});
|
||||
cssColors.put("lightgrey", new Integer[] {211,211,211});
|
||||
cssColors.put("lightpink", new Integer[] {255,182,193});
|
||||
cssColors.put("lightsalmon", new Integer[] {255,160,122});
|
||||
cssColors.put("lightseagreen", new Integer[] {32,178,170});
|
||||
cssColors.put("lightskyblue", new Integer[] {135,206,250});
|
||||
cssColors.put("lightslategray", new Integer[] {119,136,153});
|
||||
cssColors.put("lightslategrey", new Integer[] {119,136,153});
|
||||
cssColors.put("lightsteelblue", new Integer[] {176,196,222});
|
||||
cssColors.put("lightyellow", new Integer[] {255,255,224});
|
||||
cssColors.put("lime", new Integer[] {0,255,0});
|
||||
cssColors.put("limegreen", new Integer[] {50,205,50});
|
||||
cssColors.put("linen", new Integer[] {250,240,230});
|
||||
cssColors.put("magenta", new Integer[] {255,0,255});
|
||||
cssColors.put("maroon", new Integer[] {128,0,0});
|
||||
cssColors.put("mediumaquamarine", new Integer[] {102,205,170});
|
||||
cssColors.put("mediumblue", new Integer[] {0,0,205});
|
||||
cssColors.put("mediumorchid", new Integer[] {186,85,211});
|
||||
cssColors.put("mediumpurple", new Integer[] {147,112,219});
|
||||
cssColors.put("mediumseagreen", new Integer[] {60,179,113});
|
||||
cssColors.put("mediumslateblue", new Integer[] {123,104,238});
|
||||
cssColors.put("mediumspringgreen", new Integer[] {0,250,154});
|
||||
cssColors.put("mediumturquoise", new Integer[] {72,209,204});
|
||||
cssColors.put("mediumvioletred", new Integer[] {199,21,133});
|
||||
cssColors.put("midnightblue", new Integer[] {25,25,112});
|
||||
cssColors.put("mintcream", new Integer[] {245,255,250});
|
||||
cssColors.put("mistyrose", new Integer[] {255,228,225});
|
||||
cssColors.put("moccasin", new Integer[] {255,228,181});
|
||||
cssColors.put("navajowhite", new Integer[] {255,222,173});
|
||||
cssColors.put("navy", new Integer[] {0,0,128});
|
||||
cssColors.put("oldlace", new Integer[] {253,245,230});
|
||||
cssColors.put("olive", new Integer[] {128,128,0});
|
||||
cssColors.put("olivedrab", new Integer[] {107,142,35});
|
||||
cssColors.put("orange", new Integer[] {255,165,0});
|
||||
cssColors.put("orangered", new Integer[] {255,69,0});
|
||||
cssColors.put("orchid", new Integer[] {218,112,214});
|
||||
cssColors.put("palegoldenrod", new Integer[] {238,232,170});
|
||||
cssColors.put("palegreen", new Integer[] {152,251,152});
|
||||
cssColors.put("paleturquoise", new Integer[] {175,238,238});
|
||||
cssColors.put("palevioletred", new Integer[] {219,112,147});
|
||||
cssColors.put("papayawhip", new Integer[] {255,239,213});
|
||||
cssColors.put("peachpuff", new Integer[] {255,218,185});
|
||||
cssColors.put("peru", new Integer[] {205,133,63});
|
||||
cssColors.put("pink", new Integer[] {255,192,203});
|
||||
cssColors.put("plum", new Integer[] {221,160,221});
|
||||
cssColors.put("powderblue", new Integer[] {176,224,230});
|
||||
cssColors.put("purple", new Integer[] {128,0,128});
|
||||
cssColors.put("red", new Integer[] {255,0,0});
|
||||
cssColors.put("rosybrown", new Integer[] {188,143,143});
|
||||
cssColors.put("royalblue", new Integer[] {65,105,225});
|
||||
cssColors.put("saddlebrown", new Integer[] {139,69,19});
|
||||
cssColors.put("salmon", new Integer[] {250,128,114});
|
||||
cssColors.put("sandybrown", new Integer[] {244,164,96});
|
||||
cssColors.put("seagreen", new Integer[] {46,139,87});
|
||||
cssColors.put("seashell", new Integer[] {255,245,238});
|
||||
cssColors.put("sienna", new Integer[] {160,82,45});
|
||||
cssColors.put("silver", new Integer[] {192,192,192});
|
||||
cssColors.put("skyblue", new Integer[] {135,206,235});
|
||||
cssColors.put("slateblue", new Integer[] {106,90,205});
|
||||
cssColors.put("slategray", new Integer[] {112,128,144});
|
||||
cssColors.put("slategrey", new Integer[] {112,128,144});
|
||||
cssColors.put("snow", new Integer[] {255,250,250});
|
||||
cssColors.put("springgreen", new Integer[] {0,255,127});
|
||||
cssColors.put("steelblue", new Integer[] {70,130,180});
|
||||
cssColors.put("tan", new Integer[] {210,180,140});
|
||||
cssColors.put("teal", new Integer[] {0,128,128});
|
||||
cssColors.put("thistle", new Integer[] {216,191,216});
|
||||
cssColors.put("tomato", new Integer[] {255,99,71});
|
||||
cssColors.put("turquoise", new Integer[] {64,224,208});
|
||||
cssColors.put("violet", new Integer[] {238,130,238});
|
||||
cssColors.put("wheat", new Integer[] {245,222,179});
|
||||
cssColors.put("white", new Integer[] {255,255,255});
|
||||
cssColors.put("whitesmoke", new Integer[] {245,245,245});
|
||||
cssColors.put("yellow", new Integer[] {255,255,0});
|
||||
cssColors.put("yellowgreen", new Integer[] {154,205,50});
|
||||
}
|
||||
|
||||
|
||||
private final static Logger log = LoggerFactory.getLogger(FixIcsTimestamps.class);
|
||||
|
||||
@@ -72,6 +230,7 @@ public class FixIcsTimestamps {
|
||||
int dtval = 0;
|
||||
int utcEntry = 0;
|
||||
int tzEntry = 0;
|
||||
int colored = 0;
|
||||
int lineCounter = 1;
|
||||
|
||||
public FixIcsTimestamps() {
|
||||
@@ -101,14 +260,50 @@ public class FixIcsTimestamps {
|
||||
String convertedStartDate = "DTSTART;TZID=Europe/Berlin:" + dateFormat.format(date).substring(0,15);
|
||||
appointment.add(convertedStartDate);
|
||||
|
||||
log.info("input " + line + ", converted: " + convertedStartDate);
|
||||
} else if (line.startsWith("DTEND:")) { // UTC, muss konvertiert werden
|
||||
//log.info("input " + line + ", converted: " + convertedStartDate);
|
||||
}
|
||||
else if (line.startsWith("DTEND:")) { // UTC, muss konvertiert werden
|
||||
String endDate = line.substring(6, 22);
|
||||
Date date = dateFormat.parse(endDate.replaceAll("Z$", "+0000"));
|
||||
|
||||
String convertedEndDate = "DTEND;TZID=Europe/Berlin:" + dateFormat.format(date).substring(0,15);
|
||||
appointment.add(convertedEndDate);
|
||||
} else { // no conversion
|
||||
}
|
||||
else if (line.startsWith("DESCRIPTION:<font color=")) { // convert aCalendar+ color info
|
||||
colored++;
|
||||
|
||||
String color = line.substring(line.indexOf('#'), line.indexOf('>') - 1);
|
||||
|
||||
int r1 = Integer.parseInt(color.substring(1, 3), 16);
|
||||
int g1 = Integer.parseInt(color.substring(3, 5), 16);
|
||||
int b1 = Integer.parseInt(color.substring(5, 7), 16);
|
||||
|
||||
double minDistance = Double.MAX_VALUE;
|
||||
|
||||
String targetColor = null;
|
||||
|
||||
for (String s : cssColors.keySet()) {
|
||||
int r2 = cssColors.get(s)[0];
|
||||
int g2 = cssColors.get(s)[1];
|
||||
int b2 = cssColors.get(s)[2];
|
||||
|
||||
// calculate weighted distance https://stackoverflow.com/a/1847112/3761783
|
||||
//double d = Math.sqrt((r2-r1)^2 + (g2-g1)^2 + (b2-b1)^2);
|
||||
double d = Math.sqrt(((r2-r1)*0.3)*((r2-r1)*0.3) + ((g2-g1)*0.59)*((g2-g1)*0.59) + ((b2-b1)*0.11)*((b2-b1)*0.11));
|
||||
|
||||
if (d < minDistance) {
|
||||
minDistance = d;
|
||||
targetColor = s;
|
||||
}
|
||||
}
|
||||
|
||||
log.info("Color in: " + color + " - " + r1 + ", " + g1 + ", " + b1 + " ==> " + targetColor);
|
||||
appointment.add("COLOR:" + targetColor);
|
||||
|
||||
// remove color tag from description
|
||||
appointment.add("DESCRIPTION:" + line.substring(line.indexOf("</font>") + 7));
|
||||
}
|
||||
else { // no conversion
|
||||
if (line.startsWith("DTSTART;VALUE=DATE:")) { // ganztägiger Termin
|
||||
dtval++;
|
||||
} else if (line.startsWith("DTSTART;TZID=")) { // Local Timezone
|
||||
@@ -142,6 +337,7 @@ public class FixIcsTimestamps {
|
||||
log.info("UTC: " + utcEntry);
|
||||
log.info("TZ: " + tzEntry);
|
||||
log.info("DTVAL + UTC + TZ = " + (dtval + utcEntry + tzEntry));
|
||||
log.info("Colored: " + colored);
|
||||
|
||||
|
||||
for (String line : outLines) {
|
||||
|
||||
Reference in New Issue
Block a user