Add Zotero.Utilities.Internal.hyphenateISBN

Hyphenates ISBN-10 or ISBN-13 according to data from https://www.isbn-international.org
This commit is contained in:
Aurimas Vinckevicius 2015-02-19 02:25:15 -06:00
parent 37921b0910
commit 68e7849fcf
3 changed files with 86 additions and 0 deletions

File diff suppressed because one or more lines are too long

View file

@ -350,6 +350,80 @@ Zotero.Utilities.Internal = {
childWindow = childWindow.parent; childWindow = childWindow.parent;
if(childWindow === parentWindow) return true; if(childWindow === parentWindow) return true;
} }
},
/**
* Hyphenate an ISBN based on the registrant table available from
* https://www.isbn-international.org/range_file_generation
* See isbn.js
*
* @param {String} isbn ISBN-10 or ISBN-13
* @param {Boolean} dontValidate Do not attempt to validate check digit
* @return {String} Hyphenated ISBN or empty string if invalid ISBN is supplied
*/
"hyphenateISBN": function(isbn, dontValidate) {
isbn = Zotero.Utilities.cleanISBN(isbn, dontValidate);
if (!isbn) return '';
var ranges = Zotero.ISBN.ranges,
parts = [],
uccPref,
i = 0;
if (isbn.length == 10) {
uccPref = '978';
} else {
uccPref = isbn.substr(0,3);
if (!ranges[uccPref]) return ''; // Probably invalid ISBN, but the checksum is OK
parts.push(uccPref);
i = 3; // Skip ahead
}
var group = '',
found = false;
while (i < isbn.length-3 /* check digit, publication, registrant */) {
group += isbn.charAt(i);
if (ranges[uccPref][group]) {
parts.push(group);
found = true;
break;
}
i++;
}
if (!found) return ''; // Did not find a valid group
// Array of registrant ranges that are valid for a group
// Array always contains an even number of values (as string)
// From left to right, the values are paired so that the first indicates a
// lower bound of the range and the right indicates an upper bound
// The ranges are sorted by increasing number of characters
var regRanges = ranges[uccPref][group];
var registrant = '';
found = false;
i++; // Previous loop 'break'ed early
while (!found && i < isbn.length-2 /* check digit, publication */) {
registrant += isbn.charAt(i);
for(let j=0; j < regRanges.length && registrant.length >= regRanges[j].length; j+=2) {
if(registrant.length == regRanges[j].length
&& registrant >= regRanges[j] && registrant <= regRanges[j+1] // Falls within the range
) {
parts.push(registrant);
found = true;
break;
}
}
i++;
}
if (!found) return ''; // Outside of valid range, but maybe we need to update our data
parts.push(isbn.substring(i,isbn.length-1)); // Publication is the remainder up to last digit
parts.push(isbn.charAt(isbn.length-1)); // Check digit
return parts.join('-');
} }
} }

View file

@ -46,6 +46,7 @@ const xpcomFilesAll = [
'translation/translate_firefox', 'translation/translate_firefox',
'translation/tlds', 'translation/tlds',
'utilities', 'utilities',
'isbn',
'utilities_internal', 'utilities_internal',
'utilities_translate' 'utilities_translate'
]; ];