From c695f50b7f88b97d12a827338a6dfd2c53180c17 Mon Sep 17 00:00:00 2001 From: Benjamin Mako Hill Date: Fri, 11 Apr 2014 15:55:11 -0700 Subject: [PATCH 1/1] added code and docs to search for regex within the content of revisions --- wikiq.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/wikiq.cpp b/wikiq.cpp index 0343dd3..18259ea 100644 --- a/wikiq.cpp +++ b/wikiq.cpp @@ -60,6 +60,10 @@ typedef struct { // title regexes vector title_regexes; + // regexes for checking with revisions + vector content_regex_names; + vector content_regexes; + // regexes for looking within diffs vector diff_regex_names; vector diff_regexes; @@ -269,6 +273,15 @@ write_row(revisionData *data) } } + // search the content of the revision for a any of the regexes + vector content_regex_matches; + if (!data->content_regexes.empty()) { + for (vector::iterator r = data->content_regexes.begin(); r != data->content_regexes.end(); ++r) { + pcrecpp::RE& content_regex = *r; + content_regex_matches.push_back(content_regex.PartialMatch(data->text)); + } + } + //vector additions; //vector deletions; string additions; @@ -338,6 +351,11 @@ write_row(revisionData *data) << (int) additions.size() << "\t" << (int) deletions.size(); + for (int n = 0; n < data->content_regex_names.size(); ++n) { + cout << "\t" << ((!content_regex_matches.empty() + && content_regex_matches.at(n)) ? "TRUE" : "FALSE"); + } + for (int n = 0; n < data->diff_regex_names.size(); ++n) { cout << "\t" << ((!diff_regex_matches_adds.empty() && diff_regex_matches_adds.at(n)) ? "TRUE" : "FALSE") << "\t" << ((!diff_regex_matches_dels.empty() && diff_regex_matches_dels.at(n)) ? "TRUE" : "FALSE"); @@ -512,6 +530,8 @@ void print_usage(char* argv[]) { << endl << "options:" << endl << " -v verbose mode prints text and comments after each line of tab separated data" << endl + << " -n name of the following regex for contet (e.g. -n name -r \"...\")" << endl + << " -r regex to check against content of the revision" << endl << " -N name of the following regex for diffs (e.g. -N name -R \"...\")" << endl << " -R regex to check against diffs (i.e., additions and deletions)" << endl << " -t parse revisions only from pages whose titles match regex(es)" << endl @@ -541,6 +561,7 @@ main(int argc, char *argv[]) output_type = SIMPLE; char c; string diff_regex_name; + string content_regex_name; // the user data struct which is passed to callback functions revisionData data; @@ -554,6 +575,16 @@ main(int argc, char *argv[]) case 'v': output_type = FULL; break; + case 'n': + content_regex_name = optarg; + break; + case 'r': + data.content_regexes.push_back(pcrecpp::RE(optarg, pcrecpp::UTF8())); + data.content_regex_names.push_back(content_regex_name); + if (!content_regex_name.empty()) { + content_regex_name.clear(); + } + break; case 'N': diff_regex_name = optarg; break; @@ -618,6 +649,17 @@ main(int argc, char *argv[]) << "deletions_size"; int n = 0; + if (!data.content_regexes.empty()) { + for (vector::iterator r = data.content_regexes.begin(); + r != data.content_regexes.end(); ++r, ++n) { + if (data.content_regex_names.at(n).empty()) { + cout << "\t" << "regex" << n; + } else { + cout << "\t" << data.content_regex_names.at(n); + } + } + } + if (!data.diff_regexes.empty()) { for (vector::iterator r = data.diff_regexes.begin(); r != data.diff_regexes.end(); ++r, ++n) { if (data.diff_regex_names.at(n).empty()) { @@ -629,6 +671,7 @@ main(int argc, char *argv[]) } } } + cout << endl; // shovel data into the parser -- 2.39.5