Switch to side-by-side view

--- a
+++ b/src/utils/hldata.h
@@ -0,0 +1,54 @@
+#ifndef _hldata_h_included_
+#define _hldata_h_included_
+
+#include <vector>
+#include <string>
+#include <set>
+
+/** Store about user terms and their expansions. This is used mostly for
+ *  highlighting result text and walking the matches.
+ */
+struct HighlightData {
+    /** The user terms, excluding those with wildcards. 
+     * This list is intended for orthographic suggestions but the terms are
+     * unaccented lowercased anyway because they are compared to the dictionary
+     * generated from the index term list (which is unaccented).
+     */
+    std::set<std::string> uterms;
+
+    /** The original user terms-or-groups. This is for displaying the matched
+     * terms or groups, ie in relation with highlighting or skipping to the 
+     * next match. These are raw, diacritics and case preserved.
+     */
+    std::vector<std::vector<std::string> > ugroups;
+
+    /** Processed/expanded terms and groups. Used for looking for
+     * regions to highlight. Terms are just groups with 1 entry. All
+     * terms in there are unaccented, and the list may include values
+     * expanded from the original terms by stem or wildcard expansion.
+     */
+    std::vector<std::vector<std::string> > groups;
+    /** Group slacks. Parallel to groups */
+    std::vector<int> slacks;
+
+    /** Index into ugroups for each group. Parallel to groups. As a
+     * user term or group may generate many processed/expanded terms
+     * or groups, this is how we relate them 
+     */
+    std::vector<unsigned int> grpsugidx;
+
+    void clear()
+    {
+	uterms.clear();
+	ugroups.clear();
+	groups.clear();
+	slacks.clear();
+	grpsugidx.clear();
+    }
+    void append(const HighlightData&);
+
+    // Print (debug)
+    void toString(std::string& out);
+};
+
+#endif /* _hldata_h_included_ */