#include <stdlib.h>
#include "expat.h"
#include <getopt.h>
-#include "disorder.h"
#include "md5.h"
#include "dtl/dtl.hpp"
#include <vector>
// title regexes
vector<pcrecpp::RE> title_regexes;
+ // regexes for checking with revisions
+ vector<string> content_regex_names;
+ vector<pcrecpp::RE> content_regexes;
+
// regexes for looking within diffs
vector<string> diff_regex_names;
vector<pcrecpp::RE> diff_regexes;
}
}
+ // search the content of the revision for a any of the regexes
+ vector<bool> content_regex_matches;
+ if (!data->content_regexes.empty()) {
+ for (vector<pcrecpp::RE>::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<string> additions;
//vector<string> deletions;
string additions;
<< data->editorid << "\t"
<< ((data->minor) ? "TRUE" : "FALSE") << "\t"
<< (unsigned int) data->text_size << "\t"
- << shannon_H(data->text, data->text_size) << "\t"
<< md5_hex_output << "\t"
<< reverted_to << "\t"
<< (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");
<< 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 content (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
<< "a tab-separated stream of revisions on standard out:" << endl
<< endl
<< "title, articleid, revid, timestamp, anon, editor, editorid, minor," << endl
- << "text_length, text_entropy, text_md5, reversion, additions_size, deletions_size" << endl
+ << "text_length, text_md5, reversion, additions_size, deletions_size" << endl
<< ".... and additional fields for each regex executed against add/delete diffs" << endl
<< endl
<< "Boolean fields are TRUE/FALSE except in the case of reversion, which is blank" << endl
<< "unless the article is a revert to a previous revision, in which case, it" << endl
<< "contains the revision ID of the revision which was reverted to." << endl
<< endl
- << "author: Erik Garrison <erik@hypervolu.me>" << endl;
+ << "authors: Erik Garrison <erik@hypervolu.me>" << endl
+ << " Benjamin Mako Hill <mako@atdot.cc>" << endl;
}
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;
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;
cout << "title" << "\t"
<< "articleid" << "\t"
<< "revid" << "\t"
- << "date" << " "
+ << "date" << "_"
<< "time" << "\t"
<< "anon" << "\t"
<< "editor" << "\t"
<< "editor_id" << "\t"
<< "minor" << "\t"
<< "text_size" << "\t"
- << "text_entropy" << "\t"
<< "text_md5" << "\t"
<< "reversion" << "\t"
<< "additions_size" << "\t"
<< "deletions_size";
int n = 0;
+ if (!data.content_regexes.empty()) {
+ for (vector<pcrecpp::RE>::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<pcrecpp::RE>::iterator r = data.diff_regexes.begin(); r != data.diff_regexes.end(); ++r, ++n) {
if (data.diff_regex_names.at(n).empty()) {
}
}
}
+
cout << endl;
// shovel data into the parser