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("\"'\"", "\"'\""); 105 return cleansedString; 106 } 107 } 108