1// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// This module computes snippets of queries based on hits in the documents
6// for display in history search results.
7
8#ifndef CHROME_BROWSER_HISTORY_SNIPPET_H__
9#define CHROME_BROWSER_HISTORY_SNIPPET_H__
10
11#include <vector>
12
13#include "base/strings/string16.h"
14
15class Snippet {
16 public:
17  // Each MatchPosition is the [begin, end) positions of a match within a
18  // string.
19  typedef std::pair<size_t, size_t> MatchPosition;
20  typedef std::vector<MatchPosition> MatchPositions;
21
22  // Parses an offsets string as returned from a sqlite full text index. An
23  // offsets string encodes information about why a row matched a text query.
24  // The information is encoded in the string as a set of matches, where each
25  // match consists of the column, term-number, location, and length of the
26  // match. Each element of the match is separated by a space, as is each match
27  // from other matches.
28  //
29  // This method adds the start and end of each match whose column is
30  // column_num to match_positions. The pairs are ordered based on first,
31  // with no overlapping elements.
32  //
33  // NOTE: the positions returned are in terms of UTF8 encoding. To convert the
34  // offsets to wide, use ConvertMatchPositionsToWide.
35  static void ExtractMatchPositions(const std::string& offsets_str,
36                                    const std::string& column_num,
37                                    MatchPositions* match_positions);
38
39  // Converts match positions as returned from ExtractMatchPositions to be in
40  // terms of a wide string.
41  static void ConvertMatchPositionsToWide(
42      const std::string& utf8_string,
43      Snippet::MatchPositions* match_positions);
44
45  Snippet();
46  ~Snippet();
47
48  // Given |matches|, the match positions within |document|, compute the snippet
49  // for the document.
50  // Note that |document| is UTF-8 and the offsets in |matches| are byte
51  // offsets.
52  void ComputeSnippet(const MatchPositions& matches,
53                      const std::string& document);
54
55  const string16& text() const { return text_; }
56  const MatchPositions& matches() const { return matches_; }
57
58  // Efficiently swaps the contents of this snippet with the other.
59  void Swap(Snippet* other);
60
61 private:
62  // The text of the snippet.
63  string16 text_;
64
65  // The matches within text_.
66  MatchPositions matches_;
67};
68
69#endif  // CHROME_BROWSER_HISTORY_SNIPPET_H__
70