You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tellico/src/lccnvalidator.cpp

75 lines
2.7 KiB

/***************************************************************************
copyright : (C) 2008 by Robby Stephenson
email : robby@periapsis.org
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of version 2 of the GNU General Public License as *
* published by the Free Software Foundation; *
* *
***************************************************************************/
#include "lccnvalidator.h"
#include "tellico_debug.h"
using Tellico::LCCNValidator;
LCCNValidator::LCCNValidator(TQObject* parent_) : TQRegExpValidator(parent_) {
TQRegExp rx(TQString::fromLatin1("[a-z ]{0,3}"
"("
"\\d{2}-?\\d{1,6}"
"|"
"\\d{4}-?\\d{1,6}"
")"
" ?\\w*"));
setRegExp(rx);
}
// static
TQString LCCNValidator::formalize(const TQString& value_) {
const int len = value_.length();
// first remove alpha prefix
TQString alpha;
for(int pos = 0; pos < len; ++pos) {
TQChar c = value_.at(pos);
if(c.isNumber()) {
break;
}
alpha += value_.at(pos);
}
TQString afterAlpha = value_.mid(alpha.length());
alpha = alpha.stripWhiteSpace(); // possible to have a space at the end
TQString year;
TQString serial;
// have to be able to differentiate 2 and 4-digit years, first check for hyphen position
int pos = afterAlpha.find('-');
if(pos > -1) {
year = afterAlpha.section('-', 0, 0);
serial = afterAlpha.section('-', 1);
} else {
// make two assumptions, the user will never have a book from the year 1920
// or from any year after 2100. Reasonable, right?
// so if the string starts with '20' we take the first 4 digits as the year
// otherwise the first 2
if(afterAlpha.startsWith(TQString::fromLatin1("20"))) {
year = afterAlpha.left(4);
serial = afterAlpha.mid(4);
} else {
year = afterAlpha.left(2);
serial = afterAlpha.mid(2);
}
}
// now check for non digits in the serial
pos = 0;
for( ; pos < static_cast<int>(serial.length()) && serial.at(pos).isNumber(); ++pos) { ; }
TQString suffix = serial.mid(pos);
serial = serial.left(pos);
// serial must be left-padded with zeros to 6 characters
serial = serial.rightJustify(6, '0');
return alpha + year + serial + suffix;
}