1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
//
// Author: Lorenzo Bettini <http://www.lorenzobettini.it>, (C) 2004-2008
//
// Copyright: See COPYING file that comes with this distribution
//
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "regexhighlightrule.h"
#include "highlighttoken.h"
#include "matchingparameters.h"
#include "regexpreprocessor.h"
namespace srchilite {
/// the only spaces regular expression
static boost::regex onlySpaces("[[:blank:]]*");
RegexHighlightRule::RegexHighlightRule(const std::string &s) :
regExp(s) {
}
RegexHighlightRule::RegexHighlightRule(const std::string &name,
const std::string &s) :
HighlightRule(name), regExp(s) {
}
RegexHighlightRule::~RegexHighlightRule() {
}
bool RegexHighlightRule::tryToMatch(std::string::const_iterator start,
std::string::const_iterator end, HighlightToken &token,
const MatchingParameters ¶ms) {
boost::smatch match;
boost::match_flag_type flags = boost::match_default;
// whether this rule represents multiple elements
bool hasMultipleElements = (getElemList().size() > 1);
if (!params.beginningOfLine) {
// the start of the string must not be interpreted as the beginning of the line
flags |= boost::match_not_bol;
}
if (boost::regex_search(start, end, match, regExp, flags)) {
token.prefix = match.prefix();
token.suffix = match.suffix();
// check that the prefix is empty or contains only spaces
token.prefixOnlySpaces = boost::regex_match(token.prefix, onlySpaces);
if (getHasSubexpressions()) {
// record all the matched subexpressions
for (unsigned int i = 1; i < match.size(); ++i) {
token.matchedSubExps.push_back(match[i]);
}
}
if (hasMultipleElements) {
for (unsigned int i = 1; i < match.size(); ++i) {
if (match[i].matched) {
token.addMatched(getElemList()[i - 1], match[i]);
}
}
} else {
token.addMatched(getElemList()[0], match[0]);
}
return true;
}
return false;
}
const std::string RegexHighlightRule::toString() const {
return regExp.str();
}
void RegexHighlightRule::replaceReferences(const ReplacementList &rep) {
regExp.assign(RegexPreProcessor::replace_references(regExp.str(), rep));
}
HighlightRule *RegexHighlightRule::clone() {
return new RegexHighlightRule(*this);
}
void RegexHighlightRule::setRegExp(const std::string &s) {
regExp.assign(s);
}
}
|