• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.unicode.cldr.draft.keyboard;
2 
3 import java.io.File;
4 import java.io.FileWriter;
5 import java.io.FilenameFilter;
6 import java.io.IOException;
7 import java.io.StringWriter;
8 import java.time.Instant;
9 import java.util.Arrays;
10 
11 import org.unicode.cldr.draft.keyboard.KeyboardId.Platform;
12 import org.unicode.cldr.draft.keyboard.out.KeyboardToXml;
13 import org.unicode.cldr.draft.keyboard.out.KeycodeMapToXml;
14 // import org.unicode.cldr.draft.keyboard.windows.KlcParser;
15 import org.unicode.cldr.draft.keyboard.windows.KlcParser;
16 
17 import com.google.common.base.Charsets;
18 import com.google.common.collect.ImmutableList;
19 import com.google.common.io.Files;
20 
21 public final class KeyboardTool {
22 
23     /**
24      * First argument is output folder, second is the location of the windows keyboard source files.
25      */
main(String[] args)26     public static void main(String[] args) throws IOException {
27         System.out.println(Arrays.toString(args));
28         long timestamp = Instant.now().getEpochSecond();
29         String output = args[0] + "/" + timestamp;
30         File outputFolder = new File(output);
31         parseWindowsKeyboards(args[1], outputFolder);
32         // parseOsxKeyboards("/Users/rwainman/Downloads/osx", outputFolder);
33     }
34 
35     /*
36     private static void parseOsxKeyboards(String inputFolder, File outputFolder) throws IOException {
37     File macosKeyboardsDirectory = new File(inputFolder);
38     File macosOutputFolder = new File(outputFolder + "/osx");
39     macosOutputFolder.mkdirs();
40     for (File keyboardLayout : macosKeyboardsDirectory.listFiles(KeylayoutFilenameFilter.INSTANCE)) {
41       System.out.println("Parsing " + keyboardLayout);
42       String contents = Files.toString(keyboardLayout, Charsets.UTF_8);
43       KeylayoutParser.parseLayout(contents);
44       for (Document document : KeyboardToXml.writeToXml(keyboard)) {
45         Element keyboardElement = (Element) document.getFirstChild=();
46         String locale = keyboardElement.getAttribute("locale");
47         File outputFile = new File(macosOutputFolder + "/" + locale + ".xml");
48         Files.write(documentToString(document), outputFile, Charsets.UTF_8);
49         System.out.println("   Writing to " + outputFile);
50       }
51       return;
52     }
53     System.out.println(KeylayoutParser.KEYBOARD_ID_MAP.unmatchedIds());
54     }
55 
56     private enum KeylayoutFilenameFilter implements FilenameFilter {
57     INSTANCE;
58     @Override public boolean accept(File dir, String name) {
59       return name.endsWith(".keylayout");
60     }
61     }
62     */
63 
parseWindowsKeyboards(String inputFolder, File outputFolder)64     private static void parseWindowsKeyboards(String inputFolder, File outputFolder)
65         throws IOException {
66         File windowsKeyboardsDirectory = new File(inputFolder);
67         File windowsOutputFolder = new File(outputFolder + "/windows");
68         windowsOutputFolder.mkdirs();
69         for (File keyboardLayout : windowsKeyboardsDirectory.listFiles(KlcFilenameFilter.INSTANCE)) {
70             System.out.println("Parsing " + keyboardLayout);
71             String contents = Files.toString(keyboardLayout, Charsets.UTF_16);
72             ImmutableList<Keyboard> keyboards = KlcParser.parseLayout(contents);
73             for (Keyboard keyboard : keyboards) {
74                 String id = keyboard.keyboardId().toString();
75                 File outputFile = new File(windowsOutputFolder + "/" + id + ".xml");
76                 StringWriter keyboardStringWriter = new StringWriter();
77                 KeyboardToXml.writeToXml(keyboard, keyboardStringWriter);
78                 FileWriter keyboardFileWriter = new FileWriter(outputFile);
79                 keyboardFileWriter.write(doLastMinuteFixesToXml(keyboardStringWriter.toString()));
80                 keyboardFileWriter.close();
81                 System.out.println("   Writing to " + outputFile);
82             }
83         }
84         System.out.println("Writing _platform.xml");
85         FileWriter platformFileWriter = new FileWriter(windowsOutputFolder + "/_platform.xml");
86         KeycodeMapToXml.writeToXml(KlcParser.KEYCODE_MAP, Platform.WINDOWS, platformFileWriter);
87         if (KlcParser.KEYBOARD_ID_MAP.unmatchedIds().size() != 0) {
88             System.out.println("Found the following keyboards with no id (add them to windows-locales.csv file):");
89             System.out.println(KlcParser.KEYBOARD_ID_MAP.unmatchedIds());
90         }
91     }
92 
93     private enum KlcFilenameFilter implements FilenameFilter {
94         INSTANCE;
95         @Override
accept(File dir, String name)96         public boolean accept(File dir, String name) {
97             return name.endsWith(".klc");
98         }
99     }
100 
doLastMinuteFixesToXml(String ouputString)101     private static String doLastMinuteFixesToXml(String ouputString) {
102         String cleansedString = ouputString
103             // The regular XML output does not escape the apostrophes.
104             .replace("\"'\"", "\"&apos;\"");
105         return cleansedString;
106     }
107 }
108