Add a simple way to input dictionary header attributes
Just add them as an attribute to the root of the XML node. Bug: 6202812 Change-Id: Idf040bfebf20a72f9e4370930a85d97df593f484
This commit is contained in:
parent
19457316c1
commit
c734c2aca1
3 changed files with 44 additions and 5 deletions
|
@ -26,6 +26,7 @@ import java.io.OutputStream;
|
||||||
import java.io.RandomAccessFile;
|
import java.io.RandomAccessFile;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
@ -922,7 +923,14 @@ public class BinaryDictInputOutput {
|
||||||
if (version >= FIRST_VERSION_WITH_HEADER_SIZE) {
|
if (version >= FIRST_VERSION_WITH_HEADER_SIZE) {
|
||||||
final int headerSizeOffset = index;
|
final int headerSizeOffset = index;
|
||||||
index += 4; // Size of the header size
|
index += 4; // Size of the header size
|
||||||
// TODO: Write out the header contents here.
|
|
||||||
|
// Write out the options.
|
||||||
|
for (final String key : dict.mOptions.mAttributes.keySet()) {
|
||||||
|
final String value = dict.mOptions.mAttributes.get(key);
|
||||||
|
index += CharEncoding.writeString(buffer, index, key);
|
||||||
|
index += CharEncoding.writeString(buffer, index, value);
|
||||||
|
}
|
||||||
|
|
||||||
// Write out the header size.
|
// Write out the header size.
|
||||||
buffer[headerSizeOffset] = (byte) (0xFF & (index >> 24));
|
buffer[headerSizeOffset] = (byte) (0xFF & (index >> 24));
|
||||||
buffer[headerSizeOffset + 1] = (byte) (0xFF & (index >> 16));
|
buffer[headerSizeOffset + 1] = (byte) (0xFF & (index >> 16));
|
||||||
|
@ -1214,12 +1222,17 @@ public class BinaryDictInputOutput {
|
||||||
source.readUnsignedShort();
|
source.readUnsignedShort();
|
||||||
|
|
||||||
final long headerSize;
|
final long headerSize;
|
||||||
|
final HashMap<String, String> options = new HashMap<String, String>();
|
||||||
if (version < FIRST_VERSION_WITH_HEADER_SIZE) {
|
if (version < FIRST_VERSION_WITH_HEADER_SIZE) {
|
||||||
headerSize = source.getFilePointer();
|
headerSize = source.getFilePointer();
|
||||||
} else {
|
} else {
|
||||||
headerSize = (source.readUnsignedByte() << 24) + (source.readUnsignedByte() << 16)
|
headerSize = (source.readUnsignedByte() << 24) + (source.readUnsignedByte() << 16)
|
||||||
+ (source.readUnsignedByte() << 8) + source.readUnsignedByte();
|
+ (source.readUnsignedByte() << 8) + source.readUnsignedByte();
|
||||||
// read the header body
|
while (source.getFilePointer() < headerSize) {
|
||||||
|
final String key = CharEncoding.readString(source);
|
||||||
|
final String value = CharEncoding.readString(source);
|
||||||
|
options.put(key, value);
|
||||||
|
}
|
||||||
source.seek(headerSize);
|
source.seek(headerSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1228,7 +1241,7 @@ public class BinaryDictInputOutput {
|
||||||
final Node root = readNode(source, headerSize, reverseNodeMapping, reverseGroupMapping);
|
final Node root = readNode(source, headerSize, reverseNodeMapping, reverseGroupMapping);
|
||||||
|
|
||||||
FusionDictionary newDict = new FusionDictionary(root,
|
FusionDictionary newDict = new FusionDictionary(root,
|
||||||
new FusionDictionary.DictionaryOptions());
|
new FusionDictionary.DictionaryOptions(options));
|
||||||
if (null != dict) {
|
if (null != dict) {
|
||||||
for (Word w : dict) {
|
for (Word w : dict) {
|
||||||
newDict.add(w.mWord, w.mFrequency, w.mShortcutTargets, w.mBigrams);
|
newDict.add(w.mWord, w.mFrequency, w.mShortcutTargets, w.mBigrams);
|
||||||
|
|
|
@ -19,6 +19,7 @@ package com.android.inputmethod.latin.makedict;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
|
||||||
|
@ -250,6 +251,10 @@ public class FusionDictionary implements Iterable<Word> {
|
||||||
* There are no options at the moment, so this class is empty.
|
* There are no options at the moment, so this class is empty.
|
||||||
*/
|
*/
|
||||||
public static class DictionaryOptions {
|
public static class DictionaryOptions {
|
||||||
|
final HashMap<String, String> mAttributes;
|
||||||
|
public DictionaryOptions(final HashMap<String, String> attributes) {
|
||||||
|
mAttributes = attributes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -257,8 +262,13 @@ public class FusionDictionary implements Iterable<Word> {
|
||||||
public final Node mRoot;
|
public final Node mRoot;
|
||||||
|
|
||||||
public FusionDictionary() {
|
public FusionDictionary() {
|
||||||
mOptions = new DictionaryOptions();
|
|
||||||
mRoot = new Node();
|
mRoot = new Node();
|
||||||
|
mOptions = new DictionaryOptions(new HashMap<String, String>());
|
||||||
|
}
|
||||||
|
|
||||||
|
public FusionDictionary(final HashMap<String, String> attributes) {
|
||||||
|
mRoot = new Node();
|
||||||
|
mOptions = new DictionaryOptions(attributes);
|
||||||
}
|
}
|
||||||
|
|
||||||
public FusionDictionary(final Node root, final DictionaryOptions options) {
|
public FusionDictionary(final Node root, final DictionaryOptions options) {
|
||||||
|
@ -266,6 +276,10 @@ public class FusionDictionary implements Iterable<Word> {
|
||||||
mOptions = options;
|
mOptions = options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addOptionAttribute(final String key, final String value) {
|
||||||
|
mOptions.mAttributes.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper method to convert a String to an int array.
|
* Helper method to convert a String to an int array.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -40,6 +40,7 @@ import org.xml.sax.helpers.DefaultHandler;
|
||||||
*/
|
*/
|
||||||
public class XmlDictInputOutput {
|
public class XmlDictInputOutput {
|
||||||
|
|
||||||
|
private static final String ROOT_TAG = "wordlist";
|
||||||
private static final String WORD_TAG = "w";
|
private static final String WORD_TAG = "w";
|
||||||
private static final String BIGRAM_TAG = "bigram";
|
private static final String BIGRAM_TAG = "bigram";
|
||||||
private static final String SHORTCUT_TAG = "shortcut";
|
private static final String SHORTCUT_TAG = "shortcut";
|
||||||
|
@ -96,6 +97,11 @@ public class XmlDictInputOutput {
|
||||||
mFreq = Integer.parseInt(attrs.getValue(attrIndex));
|
mFreq = Integer.parseInt(attrs.getValue(attrIndex));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (ROOT_TAG.equals(localName)) {
|
||||||
|
for (int attrIndex = 0; attrIndex < attrs.getLength(); ++attrIndex) {
|
||||||
|
final String attrName = attrs.getLocalName(attrIndex);
|
||||||
|
mDictionary.mOptions.mAttributes.put(attrName, attrs.getValue(attrIndex));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
mState = UNKNOWN;
|
mState = UNKNOWN;
|
||||||
}
|
}
|
||||||
|
@ -275,7 +281,13 @@ public class XmlDictInputOutput {
|
||||||
set.add(word);
|
set.add(word);
|
||||||
}
|
}
|
||||||
// TODO: use an XMLSerializer if this gets big
|
// TODO: use an XMLSerializer if this gets big
|
||||||
destination.write("<wordlist format=\"2\">\n");
|
destination.write("<wordlist format=\"2\"");
|
||||||
|
final HashMap<String, String> options = dict.mOptions.mAttributes;
|
||||||
|
for (final String key : dict.mOptions.mAttributes.keySet()) {
|
||||||
|
final String value = dict.mOptions.mAttributes.get(key);
|
||||||
|
destination.write(" " + key + "=\"" + value + "\"");
|
||||||
|
}
|
||||||
|
destination.write(">\n");
|
||||||
destination.write("<!-- Warning: there is no code to read this format yet. -->\n");
|
destination.write("<!-- Warning: there is no code to read this format yet. -->\n");
|
||||||
for (Word word : set) {
|
for (Word word : set) {
|
||||||
destination.write(" <" + WORD_TAG + " " + WORD_ATTR + "=\"" + word.mWord + "\" "
|
destination.write(" <" + WORD_TAG + " " + WORD_ATTR + "=\"" + word.mWord + "\" "
|
||||||
|
|
Loading…
Reference in a new issue