char *text;
vector<string> last_text_tokens;
vector<pcrecpp::RE> regexes;
+ vector<pcrecpp::RE> title_regexes;
vector<string> regex_names;
map<string, string> revision_md5; // used for detecting reversions
++pos;
}
+ // look to see if (a) we've passed in a list of /any/ title_regexes
+ // and (b) if all of the title_regex_matches match
+ // if (a) is true and (b) is not, we return
+ bool any_title_regex_match = false;
+ if (!data->title_regexes.empty()) {
+ for (vector<pcrecpp::RE>::iterator r = data->title_regexes.begin(); r != data->title_regexes.end(); ++r) {
+ pcrecpp::RE& title_regex = *r;
+ if (title_regex.PartialMatch(data->title)) {
+ any_title_regex_match = true;
+ break;
+ }
+ }
+ if (!any_title_regex_match) {
+ return;
+ }
+ }
+
//vector<string> additions;
//vector<string> deletions;
string additions;
vector<bool> regex_matches_adds;
vector<bool> regex_matches_dels;
- if (!data->last_text_tokens.empty()) {
+ if (data->last_text_tokens.empty()) {
+ additions = data->text;
+ } else {
// do the diff
dtl::Diff< string, vector<string> > d(data->last_text_tokens, text_tokens);
break;
}
}
-
- if (!additions.empty()) {
- //cout << "ADD: " << additions << endl;
- for (vector<pcrecpp::RE>::iterator r = data->regexes.begin(); r != data->regexes.end(); ++r) {
- pcrecpp::RE& regex = *r;
- regex_matches_adds.push_back(regex.PartialMatch(additions));
- }
+ }
+
+ if (!additions.empty()) {
+ //cout << "ADD: " << additions << endl;
+ for (vector<pcrecpp::RE>::iterator r = data->regexes.begin(); r != data->regexes.end(); ++r) {
+ pcrecpp::RE& regex = *r;
+ regex_matches_adds.push_back(regex.PartialMatch(additions));
}
+ }
- if (!deletions.empty()) {
- //cout << "DEL: " << deletions << endl;
- for (vector<pcrecpp::RE>::iterator r = data->regexes.begin(); r != data->regexes.end(); ++r) {
- pcrecpp::RE& regex = *r;
- regex_matches_dels.push_back(regex.PartialMatch(deletions));
- }
+ if (!deletions.empty()) {
+ //cout << "DEL: " << deletions << endl;
+ for (vector<pcrecpp::RE>::iterator r = data->regexes.begin(); r != data->regexes.end(); ++r) {
+ pcrecpp::RE& regex = *r;
+ regex_matches_dels.push_back(regex.PartialMatch(deletions));
}
-
- // apply regex to the diff
-
}
data->last_text_tokens = text_tokens;
cerr << "usage: <wikimedia dump xml> | " << argv[0] << "[options]" << endl
<< endl
<< "options:" << endl
- << " -t print text and comments after each line of tab separated data" << endl
- << " -n name of the following regex (e.g. -N name -r \"...\")" << endl
+ << " -v verbose mode prints text and comments after each line of tab separated data" << endl
+ << " -n name of the following regex (e.g. -n name -r \"...\")" << endl
<< " -r regex to check against additions and deletions" << endl
+ << " -t parse revisions only from pages whose titles match regex(es)" << endl
<< endl
<< "Takes a wikimedia data dump XML stream on standard in, and produces" << endl
<< "a tab-separated stream of revisions on standard out:" << endl
// the user data struct which is passed to callback functions
revisionData data;
- while ((c = getopt(argc, argv, "htn:r:")) != -1)
+ while ((c = getopt(argc, argv, "hvn:r:t:")) != -1)
switch (c)
{
case 'd':
dry_run = 1;
break;
- case 't':
+ case 'v':
output_type = FULL;
break;
case 'n':
print_usage(argv);
exit(0);
break;
+ case 't':
+ data.title_regexes.push_back(pcrecpp::RE(optarg, pcrecpp::UTF8()));
+ break;
}
if (dry_run) { // lets us print initialization options