Index: chrome/browser/spellchecker/word_trimmer.cc |
diff --git a/chrome/browser/spellchecker/word_trimmer.cc b/chrome/browser/spellchecker/word_trimmer.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..246517594bc01129b3aeb4bba0ace23e32f64889 |
--- /dev/null |
+++ b/chrome/browser/spellchecker/word_trimmer.cc |
@@ -0,0 +1,50 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/spellchecker/word_trimmer.h" |
+ |
+#include <algorithm> |
+#include <vector> |
+ |
+#include "base/i18n/break_iterator.h" |
+ |
+base::string16 TrimWords(size_t* start, |
+ size_t end, |
+ const base::string16& text, |
+ size_t keep) { |
+ if (*start > text.length() || *start > end) |
+ return text; |
+ base::i18n::BreakIterator iter(text, base::i18n::BreakIterator::BREAK_WORD); |
+ if (!iter.Init()) |
+ return text; |
+ // A circular buffer of the last |keep + 1| words seen before position |start| |
+ // in |text|. |
+ std::vector<size_t> word_offset(keep + 1, 0); |
+ size_t first = std::string::npos; |
+ size_t last = std::string::npos; |
+ while (iter.Advance()) { |
+ if (iter.IsWord()) { |
+ word_offset[keep] = iter.prev(); |
+ if ((*start >= iter.prev() && *start < iter.pos()) || |
+ (end > iter.prev() && end <= iter.pos())) { |
+ if (first == std::string::npos) |
+ first = word_offset[0]; |
+ last = iter.pos(); |
+ } |
+ if (first == std::string::npos) { |
+ std::rotate(word_offset.begin(), |
+ word_offset.begin() + 1, |
+ word_offset.end()); |
+ } |
+ if (iter.prev() > end && keep) { |
+ last = iter.pos(); |
+ keep--; |
+ } |
+ } |
+ } |
+ if (first == std::string::npos) |
+ return text; |
+ *start -= first; |
+ return text.substr(first, last - first); |
+} |