* others. All Rights Reserved.\r
*******************************************************************************\r
*/\r
-package com.ibm.icu.text;\r
+package com.ibm.icu.impl;\r
\r
import java.text.CharacterIterator;\r
import java.util.HashSet;\r
\r
-import com.ibm.icu.impl.ICUResourceBundle;\r
+import com.ibm.icu.text.BreakIterator;\r
+import com.ibm.icu.text.FilteredBreakIteratorBuilder;\r
+import com.ibm.icu.text.UCharacterIterator;\r
import com.ibm.icu.util.BytesTrie;\r
import com.ibm.icu.util.CharsTrie;\r
import com.ibm.icu.util.CharsTrieBuilder;\r
/**\r
* @author tomzhang\r
*/\r
-class SimpleFilteredSentenceBreakIterator extends BreakIterator {\r
+public class SimpleFilteredSentenceBreakIterator extends BreakIterator {\r
\r
private BreakIterator delegate;\r
private UCharacterIterator text; // TODO(Tom): suffice to move into the local scope in next() ?\r
}\r
\r
if (bestPosn >= 0) {\r
- if (bestValue == SimpleFilteredBreakIteratorBuilder.MATCH) { // exact match!\r
+ if (bestValue == Builder.MATCH) { // exact match!\r
n = delegate.next(); // skip this one. Find the next lowerlevel break.\r
if (n == BreakIterator.DONE)\r
return n;\r
continue; // See if the next is another exception.\r
- } else if (bestValue == SimpleFilteredBreakIteratorBuilder.PARTIAL && forwardsPartialTrie != null) {\r
+ } else if (bestValue == Builder.PARTIAL && forwardsPartialTrie != null) {\r
// make sure there's a forward trie\r
// We matched the "Ph." in "Ph.D." - now we need to run everything through the forwards trie\r
// to see if it matches something going forward.\r
\r
@Override\r
public int next(int n) {\r
- return delegate.next(n);\r
+ // TODO\r
+ throw new UnsupportedOperationException("next(int) is not yet implemented");\r
}\r
\r
@Override\r
public int previous() {\r
- return delegate.previous();\r
+ // TODO\r
+ throw new UnsupportedOperationException("previous() is not yet implemented");\r
}\r
\r
@Override\r
public int following(int offset) {\r
- return delegate.following(offset);\r
+ // TODO\r
+ throw new UnsupportedOperationException("following(int) is not yet implemented");\r
}\r
\r
@Override\r
return delegate.current();\r
}\r
\r
+ @Override\r
+ public int preceding(int offset) {\r
+ // TODO\r
+ throw new UnsupportedOperationException("preceding(int) is not yet implemented");\r
+ }\r
+\r
@Override\r
public CharacterIterator getText() {\r
return delegate.getText();\r
public void setText(CharacterIterator newText) {\r
delegate.setText(newText);\r
}\r
-}\r
-\r
-public class SimpleFilteredBreakIteratorBuilder extends FilteredBreakIteratorBuilder {\r
- /**\r
- * filter set to store all exceptions\r
- */\r
- private HashSet<String> filterSet;\r
\r
- static final int PARTIAL = (1 << 0); // < partial - need to run through forward trie\r
- static final int MATCH = (1 << 1); // < exact match - skip this one.\r
- static final int SuppressInReverse = (1 << 0);\r
- static final int AddToForward = (1 << 1);\r
+ public static class Builder extends FilteredBreakIteratorBuilder {\r
+ /**\r
+ * filter set to store all exceptions\r
+ */\r
+ private HashSet<String> filterSet;\r
+\r
+ static final int PARTIAL = (1 << 0); // < partial - need to run through forward trie\r
+ static final int MATCH = (1 << 1); // < exact match - skip this one.\r
+ static final int SuppressInReverse = (1 << 0);\r
+ static final int AddToForward = (1 << 1);\r
+\r
+ /**\r
+ * Create SimpleFilteredBreakIteratorBuilder using given locale\r
+ * @param loc the locale to get filtered iterators\r
+ */\r
+ public Builder(ULocale loc) {\r
+ ICUResourceBundle rb = (ICUResourceBundle) UResourceBundle.getBundleInstance(\r
+ ICUResourceBundle.ICU_BRKITR_BASE_NAME, loc);\r
+ ICUResourceBundle exceptions = rb.findWithFallback("exceptions");\r
+ ICUResourceBundle breaks = exceptions.findWithFallback("SentenceBreak");\r
\r
- /**\r
- * Create SimpleFilteredBreakIteratorBuilder using given locale\r
- * @param loc the locale to get filtered iterators\r
- */\r
- public SimpleFilteredBreakIteratorBuilder(ULocale loc) {\r
- ICUResourceBundle rb = (ICUResourceBundle) UResourceBundle.getBundleInstance(\r
- ICUResourceBundle.ICU_BRKITR_BASE_NAME, loc);\r
- ICUResourceBundle exceptions = rb.findWithFallback("exceptions");\r
- ICUResourceBundle breaks = exceptions.findWithFallback("SentenceBreak");\r
-\r
- filterSet = new HashSet<String>();\r
- if (breaks != null) {\r
- for (int index = 0, size = breaks.getSize(); index < size; ++index) {\r
- ICUResourceBundle b = (ICUResourceBundle) breaks.get(index);\r
- String br = b.getString();\r
- filterSet.add(br);\r
+ filterSet = new HashSet<String>();\r
+ if (breaks != null) {\r
+ for (int index = 0, size = breaks.getSize(); index < size; ++index) {\r
+ ICUResourceBundle b = (ICUResourceBundle) breaks.get(index);\r
+ String br = b.getString();\r
+ filterSet.add(br);\r
+ }\r
}\r
}\r
- }\r
-\r
- /**\r
- * Create SimpleFilteredBreakIteratorBuilder with no exception\r
- */\r
- public SimpleFilteredBreakIteratorBuilder() {\r
- filterSet = new HashSet<String>();\r
- }\r
\r
- @Override\r
- public boolean suppressBreakAfter(String str) {\r
- if (filterSet == null) {\r
+ /**\r
+ * Create SimpleFilteredBreakIteratorBuilder with no exception\r
+ */\r
+ public Builder() {\r
filterSet = new HashSet<String>();\r
}\r
- return filterSet.add(str);\r
- }\r
\r
- @Override\r
- public boolean unsuppressBreakAfter(String str) {\r
- if (filterSet == null) {\r
- return false;\r
- } else {\r
- return filterSet.remove(str);\r
+ @Override\r
+ public boolean suppressBreakAfter(String str) {\r
+ if (filterSet == null) {\r
+ filterSet = new HashSet<String>();\r
+ }\r
+ return filterSet.add(str);\r
}\r
- }\r
\r
- @Override\r
- public BreakIterator build(BreakIterator adoptBreakIterator) {\r
- CharsTrieBuilder builder = new CharsTrieBuilder();\r
- CharsTrieBuilder builder2 = new CharsTrieBuilder();\r
+ @Override\r
+ public boolean unsuppressBreakAfter(String str) {\r
+ if (filterSet == null) {\r
+ return false;\r
+ } else {\r
+ return filterSet.remove(str);\r
+ }\r
+ }\r
\r
- int revCount = 0;\r
- int fwdCount = 0;\r
+ @Override\r
+ public BreakIterator build(BreakIterator adoptBreakIterator) {\r
+ CharsTrieBuilder builder = new CharsTrieBuilder();\r
+ CharsTrieBuilder builder2 = new CharsTrieBuilder();\r
\r
- int subCount = filterSet.size();\r
- String[] ustrs = new String[subCount];\r
- int[] partials = new int[subCount];\r
+ int revCount = 0;\r
+ int fwdCount = 0;\r
\r
- CharsTrie backwardsTrie = null; // i.e. ".srM" for Mrs.\r
- CharsTrie forwardsPartialTrie = null; // Has ".a" for "a.M."\r
+ int subCount = filterSet.size();\r
+ String[] ustrs = new String[subCount];\r
+ int[] partials = new int[subCount];\r
\r
- int i = 0;\r
- for (String s : filterSet) {\r
- ustrs[i] = s; // copy by value?\r
- partials[i] = 0; // default: no partial\r
- i++;\r
- }\r
+ CharsTrie backwardsTrie = null; // i.e. ".srM" for Mrs.\r
+ CharsTrie forwardsPartialTrie = null; // Has ".a" for "a.M."\r
\r
- for (i = 0; i < subCount; i++) {\r
- int nn = ustrs[i].indexOf('.'); // TODO: non-'.' abbreviations\r
- if (nn > -1 && (nn + 1) != ustrs[i].length()) {\r
- // is partial.\r
- // is it unique?\r
- int sameAs = -1;\r
- for (int j = 0; j < subCount; j++) {\r
- if (j == i)\r
- continue;\r
- if (ustrs[i].regionMatches(0, ustrs[j], 0, nn + 1)) {\r
- if (partials[j] == 0) { // hasn't been processed yet\r
- partials[j] = SuppressInReverse | AddToForward;\r
- } else if ((partials[j] & SuppressInReverse) != 0) {\r
- sameAs = j; // the other entry is already in the reverse table.\r
+ int i = 0;\r
+ for (String s : filterSet) {\r
+ ustrs[i] = s; // copy by value?\r
+ partials[i] = 0; // default: no partial\r
+ i++;\r
+ }\r
+\r
+ for (i = 0; i < subCount; i++) {\r
+ int nn = ustrs[i].indexOf('.'); // TODO: non-'.' abbreviations\r
+ if (nn > -1 && (nn + 1) != ustrs[i].length()) {\r
+ // is partial.\r
+ // is it unique?\r
+ int sameAs = -1;\r
+ for (int j = 0; j < subCount; j++) {\r
+ if (j == i)\r
+ continue;\r
+ if (ustrs[i].regionMatches(0, ustrs[j], 0, nn + 1)) {\r
+ if (partials[j] == 0) { // hasn't been processed yet\r
+ partials[j] = SuppressInReverse | AddToForward;\r
+ } else if ((partials[j] & SuppressInReverse) != 0) {\r
+ sameAs = j; // the other entry is already in the reverse table.\r
+ }\r
}\r
}\r
+\r
+ if ((sameAs == -1) && (partials[i] == 0)) {\r
+ StringBuilder prefix = new StringBuilder(ustrs[i].substring(0, nn + 1));\r
+ // first one - add the prefix to the reverse table.\r
+ prefix.reverse();\r
+ builder.add(prefix, PARTIAL);\r
+ revCount++;\r
+ partials[i] = SuppressInReverse | AddToForward;\r
+ }\r
}\r
+ }\r
\r
- if ((sameAs == -1) && (partials[i] == 0)) {\r
- StringBuilder prefix = new StringBuilder(ustrs[i].substring(0, nn + 1));\r
- // first one - add the prefix to the reverse table.\r
- prefix.reverse();\r
- builder.add(prefix, PARTIAL);\r
+ for (i = 0; i < subCount; i++) {\r
+ if (partials[i] == 0) {\r
+ StringBuilder reversed = new StringBuilder(ustrs[i]).reverse();\r
+ builder.add(reversed, MATCH);\r
revCount++;\r
- partials[i] = SuppressInReverse | AddToForward;\r
+ } else {\r
+ // an optimization would be to only add the portion after the '.'\r
+ // for example, for "Ph.D." we store ".hP" in the reverse table. We could just store "D." in the\r
+ // forward,\r
+ // instead of "Ph.D." since we already know the "Ph." part is a match.\r
+ // would need the trie to be able to hold 0-length strings, though.\r
+ builder2.add(ustrs[i], MATCH); // forward\r
+ fwdCount++;\r
}\r
}\r
- }\r
\r
- for (i = 0; i < subCount; i++) {\r
- if (partials[i] == 0) {\r
- StringBuilder reversed = new StringBuilder(ustrs[i]).reverse();\r
- builder.add(reversed, MATCH);\r
- revCount++;\r
- } else {\r
- // an optimization would be to only add the portion after the '.'\r
- // for example, for "Ph.D." we store ".hP" in the reverse table. We could just store "D." in the\r
- // forward,\r
- // instead of "Ph.D." since we already know the "Ph." part is a match.\r
- // would need the trie to be able to hold 0-length strings, though.\r
- builder2.add(ustrs[i], MATCH); // forward\r
- fwdCount++;\r
+ if (revCount > 0) {\r
+ backwardsTrie = builder.build(StringTrieBuilder.Option.FAST);\r
}\r
- }\r
\r
- if (revCount > 0) {\r
- backwardsTrie = builder.build(StringTrieBuilder.Option.FAST);\r
- }\r
-\r
- if (fwdCount > 0) {\r
- forwardsPartialTrie = builder2.build(StringTrieBuilder.Option.FAST);\r
+ if (fwdCount > 0) {\r
+ forwardsPartialTrie = builder2.build(StringTrieBuilder.Option.FAST);\r
+ }\r
+ return new SimpleFilteredSentenceBreakIterator(adoptBreakIterator, forwardsPartialTrie, backwardsTrie);\r
}\r
- return new SimpleFilteredSentenceBreakIterator(adoptBreakIterator, forwardsPartialTrie, backwardsTrie);\r
}\r
}\r