defined data structure to pass around the search term description used for highlighting and other
This commit is contained in:
@@ -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_ */
|
||||
+51
-1
@@ -36,6 +36,7 @@
|
||||
|
||||
#include "smallut.h"
|
||||
#include "utf8iter.h"
|
||||
#include "hldata.h"
|
||||
|
||||
#ifndef NO_NAMESPACES
|
||||
using namespace std;
|
||||
@@ -1038,8 +1039,57 @@ void catstrerror(string *reason, const char *what, int _errno)
|
||||
#endif
|
||||
}
|
||||
|
||||
void HighlightData::toString(std::string& out)
|
||||
{
|
||||
out.append("\nUser terms (orthograph): ");
|
||||
for (std::set<std::string>::const_iterator it = uterms.begin();
|
||||
it != uterms.end(); it++) {
|
||||
out.append(" [").append(*it).append("]");
|
||||
}
|
||||
|
||||
#else
|
||||
out.append("\nGroups: ");
|
||||
char cbuf[200];
|
||||
sprintf(cbuf, "Groups size %d grpsugidx size %d ugroups size %d",
|
||||
int(groups.size()), int(grpsugidx.size()), int(ugroups.size()));
|
||||
out.append(cbuf);
|
||||
|
||||
unsigned int ugidx = (unsigned int)-1;
|
||||
for (unsigned int i = 0; i < groups.size(); i++) {
|
||||
if (ugidx != grpsugidx[i]) {
|
||||
ugidx = grpsugidx[i];
|
||||
out.append("\n(");
|
||||
for (unsigned int j = 0; j < ugroups[ugidx].size(); j++) {
|
||||
out.append("[").append(ugroups[ugidx][j]).append("] ");
|
||||
}
|
||||
out.append(") ->");
|
||||
}
|
||||
out.append(" {");
|
||||
for (unsigned int j = 0; j < groups[i].size(); j++) {
|
||||
out.append("[").append(groups[i][j]).append("]");
|
||||
}
|
||||
sprintf(cbuf, "%d", slacks[i]);
|
||||
out.append("}").append(cbuf);
|
||||
}
|
||||
out.append("\n");
|
||||
fprintf(stderr, "toString ok\n");
|
||||
}
|
||||
|
||||
void HighlightData::append(const HighlightData& hl)
|
||||
{
|
||||
uterms.insert(hl.uterms.begin(), hl.uterms.end());
|
||||
|
||||
size_t ugsz0 = ugroups.size();
|
||||
ugroups.insert(ugroups.end(), hl.ugroups.begin(), hl.ugroups.end());
|
||||
|
||||
groups.insert(groups.end(), hl.groups.begin(), hl.groups.end());
|
||||
slacks.insert(slacks.end(), hl.slacks.begin(), hl.slacks.end());
|
||||
for (std::vector<unsigned int>::const_iterator it = hl.grpsugidx.begin();
|
||||
it != hl.grpsugidx.end(); it++) {
|
||||
grpsugidx.push_back(*it + ugsz0);
|
||||
}
|
||||
}
|
||||
|
||||
#else // TEST_SMALLUT
|
||||
|
||||
#include <string>
|
||||
using namespace std;
|
||||
|
||||
Reference in New Issue
Block a user