| package org.unicode.cldr.draft.keyboard; |
| |
| import com.google.common.base.Charsets; |
| import com.google.common.collect.ImmutableList; |
| import com.google.common.io.Files; |
| import java.io.File; |
| import java.io.FileWriter; |
| import java.io.FilenameFilter; |
| import java.io.IOException; |
| import java.io.StringWriter; |
| import java.time.Instant; |
| import java.util.Arrays; |
| import org.unicode.cldr.draft.keyboard.KeyboardId.Platform; |
| import org.unicode.cldr.draft.keyboard.out.KeyboardToXml; |
| import org.unicode.cldr.draft.keyboard.out.KeycodeMapToXml; |
| // import org.unicode.cldr.draft.keyboard.windows.KlcParser; |
| import org.unicode.cldr.draft.keyboard.windows.KlcParser; |
| |
| public final class KeyboardTool { |
| |
| /** |
| * First argument is output folder, second is the location of the windows keyboard source files. |
| */ |
| public static void main(String[] args) throws IOException { |
| System.out.println(Arrays.toString(args)); |
| long timestamp = Instant.now().getEpochSecond(); |
| String output = args[0] + "/" + timestamp; |
| File outputFolder = new File(output); |
| parseWindowsKeyboards(args[1], outputFolder); |
| // parseOsxKeyboards("/Users/rwainman/Downloads/osx", outputFolder); |
| } |
| |
| /* |
| private static void parseOsxKeyboards(String inputFolder, File outputFolder) throws IOException { |
| File macosKeyboardsDirectory = new File(inputFolder); |
| File macosOutputFolder = new File(outputFolder + "/osx"); |
| macosOutputFolder.mkdirs(); |
| for (File keyboardLayout : macosKeyboardsDirectory.listFiles(KeylayoutFilenameFilter.INSTANCE)) { |
| System.out.println("Parsing " + keyboardLayout); |
| String contents = Files.toString(keyboardLayout, Charsets.UTF_8); |
| KeylayoutParser.parseLayout(contents); |
| for (Document document : KeyboardToXml.writeToXml(keyboard)) { |
| Element keyboardElement = (Element) document.getFirstChild=(); |
| String locale = keyboardElement.getAttribute("locale"); |
| File outputFile = new File(macosOutputFolder + "/" + locale + ".xml"); |
| Files.write(documentToString(document), outputFile, Charsets.UTF_8); |
| System.out.println(" Writing to " + outputFile); |
| } |
| return; |
| } |
| System.out.println(KeylayoutParser.KEYBOARD_ID_MAP.unmatchedIds()); |
| } |
| |
| private enum KeylayoutFilenameFilter implements FilenameFilter { |
| INSTANCE; |
| @Override public boolean accept(File dir, String name) { |
| return name.endsWith(".keylayout"); |
| } |
| } |
| */ |
| |
| private static void parseWindowsKeyboards(String inputFolder, File outputFolder) |
| throws IOException { |
| File windowsKeyboardsDirectory = new File(inputFolder); |
| File windowsOutputFolder = new File(outputFolder + "/windows"); |
| windowsOutputFolder.mkdirs(); |
| for (File keyboardLayout : windowsKeyboardsDirectory.listFiles(KlcFilenameFilter.INSTANCE)) { |
| System.out.println("Parsing " + keyboardLayout); |
| String contents = Files.toString(keyboardLayout, Charsets.UTF_16); |
| ImmutableList<Keyboard> keyboards = KlcParser.parseLayout(contents); |
| for (Keyboard keyboard : keyboards) { |
| String id = keyboard.keyboardId().toString(); |
| File outputFile = new File(windowsOutputFolder + "/" + id + ".xml"); |
| StringWriter keyboardStringWriter = new StringWriter(); |
| KeyboardToXml.writeToXml(keyboard, keyboardStringWriter); |
| FileWriter keyboardFileWriter = new FileWriter(outputFile); |
| keyboardFileWriter.write(doLastMinuteFixesToXml(keyboardStringWriter.toString())); |
| keyboardFileWriter.close(); |
| System.out.println(" Writing to " + outputFile); |
| } |
| } |
| System.out.println("Writing _platform.xml"); |
| FileWriter platformFileWriter = new FileWriter(windowsOutputFolder + "/_platform.xml"); |
| KeycodeMapToXml.writeToXml(KlcParser.KEYCODE_MAP, Platform.WINDOWS, platformFileWriter); |
| if (KlcParser.KEYBOARD_ID_MAP.unmatchedIds().size() != 0) { |
| System.out.println("Found the following keyboards with no id (add them to windows-locales.csv file):"); |
| System.out.println(KlcParser.KEYBOARD_ID_MAP.unmatchedIds()); |
| } |
| } |
| |
| private enum KlcFilenameFilter implements FilenameFilter { |
| INSTANCE; |
| @Override public boolean accept(File dir, String name) { |
| return name.endsWith(".klc"); |
| } |
| } |
| |
| private static String doLastMinuteFixesToXml(String ouputString) { |
| String cleansedString = ouputString |
| // The regular XML output does not escape the apostrophes. |
| .replace("\"'\"", "\"'\""); |
| return cleansedString; |
| } |
| } |