diff --git a/www/js/lib/archive.js b/www/js/lib/archive.js index 55b586a4..8b80a9a1 100644 --- a/www/js/lib/archive.js +++ b/www/js/lib/archive.js @@ -346,7 +346,7 @@ define(function(require) { var normalize = this.getNormalizeFunction(); var normalizedTitleName = normalize(titleName); - titleIterators.FindPrefixOffset(this.titleFile, titleName, normalize).then(function(offset) { + titleIterators.findPrefixOffset(this.titleFile, titleName, normalize).then(function(offset) { var iterator = new titleIterators.SequentialTitleIterator(that, offset); function check(title) { if (title == null || normalize(title.name) !== normalizedTitleName) { @@ -390,7 +390,7 @@ define(function(require) { var normalize = this.getNormalizeFunction(); prefix = normalize(prefix); - titleIterators.FindPrefixOffset(this.titleFile, prefix, normalize).then(function(offset) { + titleIterators.findPrefixOffset(this.titleFile, prefix, normalize).then(function(offset) { var iterator = new titleIterators.SequentialTitleIterator(that, offset); function addNext() { if (titles.length >= maxSize) { diff --git a/www/js/lib/titleIterators.js b/www/js/lib/titleIterators.js index dfd2028b..3ee55192 100644 --- a/www/js/lib/titleIterators.js +++ b/www/js/lib/titleIterators.js @@ -72,12 +72,12 @@ define(['utf8', 'title', 'util', 'jquery'], function(utf8, evopediaTitle, util, * @param normalize function to be applied to every title before comparison * @returns jQuery promise giving the offset */ - function FindPrefixOffset(titleFile, prefix, normalize) { + function findPrefixOffset(titleFile, prefix, normalize) { prefix = normalize(prefix); var lo = 0; var hi = titleFile.size; var iterate = function() { - if (lo >= hi) { + if (lo >= hi - 1) { if (lo > 0) lo += 2; // Let lo point to the start of an entry return jQuery.when(lo); @@ -121,6 +121,6 @@ define(['utf8', 'title', 'util', 'jquery'], function(utf8, evopediaTitle, util, */ return { SequentialTitleIterator : SequentialTitleIterator, - FindPrefixOffset : FindPrefixOffset + findPrefixOffset : findPrefixOffset }; }); diff --git a/www/js/lib/util.js b/www/js/lib/util.js index b1506009..2b8d7a3e 100644 --- a/www/js/lib/util.js +++ b/www/js/lib/util.js @@ -1,148 +1,151 @@ -/** - * util.js : Utility functions - * - * Copyright 2013 Mossroy - * License GPL v3: - * - * This file is part of Evopedia. - * - * Evopedia is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Evopedia is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Evopedia (file LICENSE-GPLv3.txt). If not, see - */ -define(function(require) { - var jQuery = require('jquery'); - - /** - * Utility function : return true if the given string ends with the suffix - * @param str - * @param suffix - * @returns {Boolean} - */ - function endsWith(str, suffix) { - return str.indexOf(suffix, str.length - suffix.length) !== -1; - } - - /** - * Read an integer encoded in 4 bytes, little endian - * @param {type} byteArray - * @param {type} firstIndex - * @returns {Number} - */ - function readIntegerFrom4Bytes(byteArray, firstIndex) { - var dataView = new DataView(byteArray.buffer, firstIndex, 4); - var integer = dataView.getUint32(0, true); - return integer; - } - - /** - * Read an integer encoded in 2 bytes, little endian - * @param {type} byteArray - * @param {type} firstIndex - * @returns {Number} - */ - function readIntegerFrom2Bytes(byteArray, firstIndex) { - var dataView = new DataView(byteArray.buffer, firstIndex, 2); - var integer = dataView.getUint16(0, true); - return integer; - } - - /** - * Read a float encoded in 2 bytes - * @param {type} byteArray - * @param {type} firstIndex - * @param {bool} littleEndian (optional) - * @returns {Number} - */ - function readFloatFrom4Bytes(byteArray, firstIndex, littleEndian) { - var dataView = new DataView(byteArray.buffer, firstIndex, 4); - var float = dataView.getFloat32(0, littleEndian); - return float; - } - - /** - * Convert a Uint8Array to a lowercase hex string - * @param {type} byteArray - * @returns {String} - */ - function uint8ArrayToHex(byteArray) { - var s = ''; - var hexDigits = '0123456789abcdef'; - for (var i = 0; i < byteArray.length; i++) { - var v = byteArray[i]; - s += hexDigits[(v & 0xff) >> 4]; - s += hexDigits[v & 0xf]; - } - return s; - } - - /** - * Convert a Uint8Array to base64 - * TODO : might be replaced by btoa() built-in function? https://developer.mozilla.org/en-US/docs/Web/API/window.btoa - * @param {type} byteArray - * @returns {String} - */ - function uint8ArrayToBase64(byteArray) { - var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - var bits, h1, h2, h3, h4, i = 0; - var enc = ""; - - for (var i = 0; i < byteArray.length; ) { - bits = byteArray[i++] << 16; - bits |= byteArray[i++] << 8; - bits |= byteArray[i++]; - - h1 = bits >> 18 & 0x3f; - h2 = bits >> 12 & 0x3f; - h3 = bits >> 6 & 0x3f; - h4 = bits & 0x3f; - - enc += b64[h1] + b64[h2] + b64[h3] + b64[h4]; - } - - var r = byteArray.length % 3; - - return (r > 0 ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3); - } - - /** - * Reads a Uint8Array from the given file starting at byte offset begin and - * not including byte offset end. - * @returns jQuery promise - */ - function readFileSlice(file, begin, end) { - var deferred = jQuery.Deferred(); - var reader = new FileReader(); - reader.onload = function(e) { - deferred.resolve(new Uint8Array(e.target.result)); - } - reader.onerror = reader.onabort = function(e) { - deferred.reject(e); - } - reader.readAsArrayBuffer(file.slice(begin, end)); - return deferred.promise(); - } - - - /** - * Functions and classes exposed by this module - */ - return { - endsWith: endsWith, - readIntegerFrom4Bytes: readIntegerFrom4Bytes, - readIntegerFrom2Bytes : readIntegerFrom2Bytes, - readFloatFrom4Bytes : readFloatFrom4Bytes, - uint8ArrayToHex : uint8ArrayToHex, - uint8ArrayToBase64 : uint8ArrayToBase64, - readFileSlice : readFileSlice - }; -}); +/** + * util.js : Utility functions + * + * Copyright 2013 Mossroy + * License GPL v3: + * + * This file is part of Evopedia. + * + * Evopedia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Evopedia is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Evopedia (file LICENSE-GPLv3.txt). If not, see + */ +define(function(require) { + var jQuery = require('jquery'); + + /** + * Utility function : return true if the given string ends with the suffix + * @param str + * @param suffix + * @returns {Boolean} + */ + function endsWith(str, suffix) { + return str.indexOf(suffix, str.length - suffix.length) !== -1; + } + + /** + * Read an integer encoded in 4 bytes, little endian + * @param {type} byteArray + * @param {type} firstIndex + * @returns {Number} + */ + function readIntegerFrom4Bytes(byteArray, firstIndex) { + var dataView = new DataView(byteArray.buffer, firstIndex, 4); + var integer = dataView.getUint32(0, true); + return integer; + } + + /** + * Read an integer encoded in 2 bytes, little endian + * @param {type} byteArray + * @param {type} firstIndex + * @returns {Number} + */ + function readIntegerFrom2Bytes(byteArray, firstIndex) { + var dataView = new DataView(byteArray.buffer, firstIndex, 2); + var integer = dataView.getUint16(0, true); + return integer; + } + + /** + * Read a float encoded in 2 bytes + * @param {type} byteArray + * @param {type} firstIndex + * @param {bool} littleEndian (optional) + * @returns {Number} + */ + function readFloatFrom4Bytes(byteArray, firstIndex, littleEndian) { + var dataView = new DataView(byteArray.buffer, firstIndex, 4); + var float = dataView.getFloat32(0, littleEndian); + return float; + } + + /** + * Convert a Uint8Array to a lowercase hex string + * @param {type} byteArray + * @returns {String} + */ + function uint8ArrayToHex(byteArray) { + var s = ''; + var hexDigits = '0123456789abcdef'; + for (var i = 0; i < byteArray.length; i++) { + var v = byteArray[i]; + s += hexDigits[(v & 0xff) >> 4]; + s += hexDigits[v & 0xf]; + } + return s; + } + + /** + * Convert a Uint8Array to base64 + * TODO : might be replaced by btoa() built-in function? https://developer.mozilla.org/en-US/docs/Web/API/window.btoa + * @param {type} byteArray + * @returns {String} + */ + function uint8ArrayToBase64(byteArray) { + var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + var bits, h1, h2, h3, h4, i = 0; + var enc = ""; + + for (var i = 0; i < byteArray.length; ) { + bits = byteArray[i++] << 16; + bits |= byteArray[i++] << 8; + bits |= byteArray[i++]; + + h1 = bits >> 18 & 0x3f; + h2 = bits >> 12 & 0x3f; + h3 = bits >> 6 & 0x3f; + h4 = bits & 0x3f; + + enc += b64[h1] + b64[h2] + b64[h3] + b64[h4]; + } + + var r = byteArray.length % 3; + + return (r > 0 ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3); + } + + /** + * Reads a Uint8Array from the given file starting at byte offset begin and + * not including byte offset end. + * @param file + * @param begin + * @param end + * @returns jQuery promise + */ + function readFileSlice(file, begin, end) { + var deferred = jQuery.Deferred(); + var reader = new FileReader(); + reader.onload = function(e) { + deferred.resolve(new Uint8Array(e.target.result)); + }; + reader.onerror = reader.onabort = function(e) { + deferred.reject(e); + }; + reader.readAsArrayBuffer(file.slice(begin, end)); + return deferred.promise(); + } + + + /** + * Functions and classes exposed by this module + */ + return { + endsWith: endsWith, + readIntegerFrom4Bytes: readIntegerFrom4Bytes, + readIntegerFrom2Bytes : readIntegerFrom2Bytes, + readFloatFrom4Bytes : readFloatFrom4Bytes, + uint8ArrayToHex : uint8ArrayToHex, + uint8ArrayToBase64 : uint8ArrayToBase64, + readFileSlice : readFileSlice + }; +});