Mercurial > hg > svcore
diff base/TextMatcher.cpp @ 457:ef14acd6d102
* Add beginnings of capability to search plugins that are not yet
installed -- lots more work to do here, though
author | Chris Cannam |
---|---|
date | Tue, 14 Oct 2008 16:36:35 +0000 |
parents | |
children | 48e9f538e6e9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/base/TextMatcher.cpp Tue Oct 14 16:36:35 2008 +0000 @@ -0,0 +1,124 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + This file copyright 2008 QMUL. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#include "TextMatcher.h" + +TextMatcher::TextMatcher() +{ +} + +TextMatcher::~TextMatcher() +{ +} + +void +TextMatcher::test(Match &match, QStringList keywords, QString text, + QString textType, int score) +{ +/* + if (text.toLower() == keyword.toLower()) { + match.score += score * 1.5; + match.fragments << tr("%1: <b>%2</b>").arg(textType).arg(text); + return; + } +*/ + int len = text.length(); + int prevEnd = 0; + QString fragment; + + while (1) { + + bool first = (prevEnd == 0); + + int idx = -1; + QString keyword; + + for (int ki = 0; ki < keywords.size(); ++ki) { + int midx = text.indexOf(keywords[ki], prevEnd, Qt::CaseInsensitive); + if (midx >= 0 && midx < len) { + if (midx < idx || idx == -1) { + idx = midx; + keyword = keywords[ki]; + } + } + } + + if (idx < 0 || idx >= len) break; + + int klen = keyword.length(); + + if (first) { + match.score += score; + } else { + match.score += score / 4; + } + + int start = idx; + int end = start + klen; + + if (start == 0) match.score += 1; + if (end == len) match.score += 1; + + if (start > prevEnd + 14) { + QString s = text.right((len - start) + 10); + s = XmlExportable::encodeEntities(s.left(10)) + "<b>" + + XmlExportable::encodeEntities(s.left(klen + 10).right(klen)) + + "</b>"; + fragment += QString("...%1").arg(s); + } else { + QString s = text.right(len - prevEnd); + s = XmlExportable::encodeEntities(s.left(start - prevEnd)) + "<b>" + + XmlExportable::encodeEntities(s.left(end - prevEnd).right(klen)) + + "</b>"; + fragment += s; + } + + prevEnd = end; + } + + if (prevEnd > 0 && prevEnd < len) { + int n = len - prevEnd; + fragment += + XmlExportable::encodeEntities(text.right(n).left(n < 8 ? n : 8)); + } + + if (fragment != "") { + match.fragments[textType] = fragment; + } +} + +bool +TextMatcher::Match::operator<(const Match &m) const +{ + if (score != m.score) { + return score < m.score; + } + if (key != m.key) { + return key < m.key; + } + if (fragments.size() != m.fragments.size()) { + return fragments.size() < m.fragments.size(); + } + + for (FragmentMap::const_iterator + i = fragments.begin(), + j = m.fragments.begin(); + i != fragments.end(); ++i, ++j) { + if (i->first != j->first) return i->first < j->first; + if (i->second != j->second) return i->second < j->second; + } + + return false; +}