}
var $this = this;
loadJSLibrary('data/search.index.js', function () {
- if ($this.highlightEnabled) {
- loadJSLibrary('data/search.highlight.js', function () {
+ $this._loadTexts(function () {
+ if ($this.highlightEnabled) {
+ loadJSLibrary('data/search.highlight.js', function () {
+ $this.indexLoaded = true;
+ callback();
+ });
+ } else {
$this.indexLoaded = true;
callback();
- });
- } else {
- $this.indexLoaded = true;
- callback();
- }
+ }
+ });
});
},
+
+ _loadTexts: function (callback) {
+ if (this.fluidbook.datas.searchWordSelectionAlgorithm == 'expression') {
+ loadJSLibrary('data/search.texts.js', function () {
+ callback();
+ });
+ } else {
+ callback();
+ }
+ },
_getHints: function (q, callback) {
- var words = this.normalizeQuery(q);
+ var words = this.normalizeQuery(q, true);
q = words.pop();
var res = [];
if (q.length < 3) {
res.sort(this.sortHints);
callback(res.slice(0, 12));
},
- _find: function (q, callback) {
- var words = this.normalizeQuery(q);
+ getSearchWordSelectionAlgorithm: function (q) {
+ var a = this.fluidbook.datas.searchWordSelectionAlgorithm;
+ if (q.indexOf(' ') === -1 && a == 'expression') {
+ a = 'begins';
+ }
+ return a;
+ },
+
+ _find: function (q, callback) {
+ var algo = this.getSearchWordSelectionAlgorithm(q);
+ if (algo == 'expression') {
+ return this._findExpression(q, callback);
+ }
+ var words = this.normalizeQuery(q, true);
var res = {};
var terms = [];
var total = 0;
var doublesPages = [];
this.resultPages = [];
- var q, v, k, kk, word, wordata, page, occurences;
+ var q, v, k, kk, word, wordata, page, occurences, p;
+
for (kk in words) {
q = words[kk];
continue;
}
- if (this.fluidbook.datas.searchWordSelectionAlgorithm == 'begins' && k.indexOf(q) != 0) {
+ if (algo == 'begins' && k.indexOf(q) != 0) {
continue;
- } else if (this.fluidbook.datas.searchWordSelectionAlgorithm == 'contains' && k.indexOf(q) == -1) {
+ } else if (algo == 'contains' && k.indexOf(q) == -1) {
continue;
- } else if (this.fluidbook.datas.searchWordSelectionAlgorithm == 'exact' && k != q) {
+ } else if (algo == 'exact' && k != q) {
continue;
}
v = INDEX[k];
for (page in v.p) {
var occurences = v.p[page];
- console.log(page + ' -> ' + occurences);
page = parseInt(page);
if ((page % 2) == 1) {
page--;
callback(returnVal);
},
+
+ _findExpression: function (q, callback) {
+ q = this.normalizeQuery(q, false);
+ var words = this.normalizeQuery(q, true);
+ var res = {};
+ var terms = [];
+ var total = 0;
+ var doublesPages = [];
+
+ for (var p in TEXTS) {
+ var t = TEXTS[p];
+ var regexp = new RegExp(q, 'g');
+ var r = t.match(regexp);
+ var nb = 0;
+ try {
+ nb = r.length;
+ } catch (e) {
+
+ }
+ if (nb == 0) {
+ continue;
+ }
+ page = parseInt(p);
+ if ((page % 2) == 1) {
+ page--;
+ }
+
+ doublesPages[page] = [];
+ doublesPages[page][q] = nb;
+
+ res[page] = nb;
+ total += nb;
+ }
+ if (total > 0) {
+ terms = words;
+ }
+ var returnVal = {
+ total: total,
+ results: res,
+ terms: terms
+ };
+
+ console.log(returnVal);
+
+ callback(returnVal);
+ },
+
sortHints: function (a, b) {
return b[1] - a[1];
},
kill: function () {
},
- normalizeQuery: function (q) {
+ normalizeQuery: function (q, split) {
q = this.noAccents(q);
q = q.toLowerCase();
- return q.split(' ');
+ if (split) {
+ return q.split(' ');
+ }
+ return q;
+
},
noAccents: function (source) {
source = source.replace(/[àáâãäå]/g, "a");
if (terms.length == 0) {
return;
}
+ var algo = this.getSearchWordSelectionAlgorithm(terms.join(' '));
+ if (algo == 'expression') {
+ return;
+ }
for (var t in terms) {
var term = terms[t];
for (var w in HIGHLIGHTS) {
- if (w.length < this.fluidbook.datas.ignoreWordLimit) {
+ if (algo != 'expression' && w.length < this.fluidbook.datas.ignoreWordLimit) {
continue;
}
- if (this.fluidbook.datas.searchWordSelectionAlgorithm == 'begins' && w.indexOf(term) != 0) {
+ if (algo == 'begins' && w.indexOf(term) != 0) {
continue;
- } else if (this.fluidbook.datas.searchWordSelectionAlgorithm == 'contains' && w.indexOf(term) == -1) {
+ } else if (algo == 'contains' && w.indexOf(term) == -1) {
continue;
- } else if (this.fluidbook.datas.searchWordSelectionAlgorithm == 'exact' && w != term) {
+ } else if (algo == 'exact' && w != term) {
continue;
}
+ var color = t;
+ if (algo == 'expression') {
+ color = 0;
+ }
- var h = {occurences: HIGHLIGHTS[w], color: t, word: w, term: term};
+ var h = {occurences: HIGHLIGHTS[w], color: color, word: w, term: term};
this.highlights.push(h);
}
}
var padding = position.height * 0.2;
var z = this.fluidbook.datas.cssScale;
var h = $('<div class="highlight" data-color="' + color + '"></div>');
- var coords = {top: (position.y - position.height - padding * 2) * z, left: (position.x + x - padding) * z + offset, width: (width + 2 * padding) * z, height: (position.height + padding * 3) * z};
+ var coords = {
+ top: (position.y - position.height - padding * 2) * z,
+ left: (position.x + x - padding) * z + offset,
+ width: (width + 2 * padding) * z,
+ height: (position.height + padding * 3) * z
+ };
var transform = {};
if (position.rotation) {
transform.rotate = -position.rotation + 'deg';