Search engine OK :)

This commit is contained in:
Ghislain Loaec 2015-08-04 19:30:26 +02:00
parent dc49af2ee9
commit 757e59f80a
5 changed files with 105 additions and 25 deletions

View File

@ -97,7 +97,7 @@
<form id="momo-search" class="navbar-form navbar-right" role="search">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" placeholder="Rechercher">
<input id="momo-search-input" name="searchInput" type="text" class="form-control" placeholder="Rechercher">
<div class="input-group-btn">
<button type="submit" class="btn btn-success">
<i class="fa fa-search"></i>
@ -214,6 +214,9 @@
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/tmpl.min.js"></script>
<script type="text/javascript" src="js/lunr.min.js"></script>
<script type="text/javascript" src="js/lunr.stemmer.support.min.js"></script>
<script type="text/javascript" src="js/lunr.fr.min.js"></script>
<script type="text/javascript" src="js/fastclick.js"></script>
<script type="text/javascript" src="js/responsive-nav.js"></script>
<script type="text/javascript" src="js/index.js"></script>

View File

@ -83,10 +83,25 @@ var app = {
// Device ready callback
onDeviceReady: function() {
app.initIndex();
app.loadManifest();
FastClick.attach(document.body);
},
// Initialize search engine index
initIndex: function(){
app.index = lunr(function () {
this.use(lunr.fr);
this.field('title', {boost: 10})
this.field('body')
this.ref('id')
this.pipeline.add(function (token, tokenIndex, tokens) {
if(token.length > 2)
return app.utils.replaceAccents(token);
});
});
},
// JSON Manifest loading function
loadManifest: function(){
if(DEBUG) console.log('load '+JSON.stringify(app.manifest));
@ -296,6 +311,9 @@ var app = {
// Default route to home
app.manifest.id = app.current_page = 'home';
// Dev page refresh : redirect to home
window.location.hash = '#home'
// Import Scripts & Styles
app.appendAssets(function(){
@ -306,6 +324,9 @@ var app = {
// Render Homepage
app.render(app.manifest);
// Listen for search form submission
var $form = document.getElementById('momo-search');
$form.addEventListener('submit', app.onSearchSubmit, false);
});
},
@ -349,6 +370,13 @@ var app = {
app.pages[data.id].seealso[i] = app.registerPage(page, false);
}
}
// Index page for search engine
app.index.add({
id: data.id,
title: data.title,
body: data.content
});
return data.id;
} else
@ -373,7 +401,7 @@ var app = {
}
// Render navigation
var nav = responsiveNav(".momo-nav-collapse", { // Selector
app.nav = responsiveNav(".momo-nav-collapse", { // Selector
animate: true, // Boolean: Use CSS3 transitions, true or false
transition: 284, // Integer: Speed of the transition, in milliseconds
//label: "Menu", // String: Label for the navigation toggle
@ -414,29 +442,6 @@ var app = {
// Change page header
document.getElementById("momo-header").innerHTML = tmpl("momo-header-tmpl", data);
// Change page title
//var elements = document.getElementsByClassName("momo-title");
//for (var i = 0; i < elements.length; i++)
// elements[i].innerHTML = data.title;
//// Change page icon
//var elements = document.getElementsByClassName("momo-icon");
//data.icon = data.icon || data.meta.icon;
//var $icon = document.createElement('img');
//$icon.height = 20;
//$icon.width = 20;
//$icon.src = data.icon;
//for (var i = 0; i < elements.length; i++)
// elements[i].innerHTML = data.title;
//// Display ot not back btn
//var elements = document.getElementsByClassName("momo-back-btn");
//for (var i = 0; i < elements.length; i++)
// if(data.id == 'home')
// elements[i].classList.add('hidden');
// else
// elements[i].classList.remove('hidden');
// Render Page
return tmpl("momo-page-tmpl", data);
} else
@ -572,6 +577,52 @@ var app = {
}
},
onSearchSubmit: function(e){
// Stop form default action
e.preventDefault();
//e.stopPropagation();
// Get search input
var $searchInput = document.getElementById('momo-search-input');
var searchInput = app.utils.replaceAccents($searchInput.value);
var id = "search-"+app.utils.hyphenate(searchInput);
// Close navigation + Keyboard
app.nav.close();
$searchInput.value = '';
$searchInput.blur();
// If search query doesn't exist
if(!document.getElementById(id)){
// Get search results
var results = app.index.search(searchInput);
// Register new search results page
app.pages[id] = {
id: id,
icon: "fa fa-search",
title: 'Recherche "'+searchInput+'"',
content: results.length ? null : '<div class="well text-center text-muted">Aucun resultat</div>',
pages: results.map(function(item){
return item.ref;
})
};
// Generate result page view
var $page = document.createElement('div');
$page.id = id
$page.className = "momo-page";
$page.innerHTML = app.renderPage(app.pages[id]);
document.getElementById('momo-pages').appendChild($page);
}
// Navigate to search result page
window.location.hash = "#"+id;
return false;
},
// Various Javascript Helpers
utils: {

18
www/js/lunr.fr.min.js vendored Normal file

File diff suppressed because one or more lines are too long

7
www/js/lunr.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
www/js/lunr.stemmer.support.min.js vendored Normal file
View File

@ -0,0 +1 @@
!function(r,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(r.lunr)}(this,function(){return function(r){r.stemmerSupport={Among:function(r,t,i,s){if(this.toCharArray=function(r){for(var t=r.length,i=new Array(t),s=0;t>s;s++)i[s]=r.charCodeAt(s);return i},!r&&""!=r||!t&&0!=t||!i)throw"Bad Among initialisation: s:"+r+", substring_i: "+t+", result: "+i;this.s_size=r.length,this.s=this.toCharArray(r),this.substring_i=t,this.result=i,this.method=s},SnowballProgram:function(){var r;return{bra:0,ket:0,limit:0,cursor:0,limit_backward:0,setCurrent:function(t){r=t,this.cursor=0,this.limit=t.length,this.limit_backward=0,this.bra=this.cursor,this.ket=this.limit},getCurrent:function(){var t=r;return r=null,t},in_grouping:function(t,i,s){if(this.cursor<this.limit){var e=r.charCodeAt(this.cursor);if(s>=e&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(s>=e&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursor<this.limit){var e=r.charCodeAt(this.cursor);if(e>s||i>e)return this.cursor++,!0;if(e-=i,!(t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||i>e)return this.cursor--,!0;if(e-=i,!(t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor<t)return!1;for(var s=0;t>s;s++)if(r.charCodeAt(this.cursor+s)!=i.charCodeAt(s))return!1;return this.cursor+=t,!0},eq_s_b:function(t,i){if(this.cursor-this.limit_backward<t)return!1;for(var s=0;t>s;s++)if(r.charCodeAt(this.cursor-t+s)!=i.charCodeAt(s))return!1;return this.cursor-=t,!0},find_among:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit,o=0,h=0,c=!1;;){for(var f=s+(e-s>>1),a=0,l=h>o?o:h,_=t[f],b=l;b<_.s_size;b++){if(n+l==u){a=-1;break}if(a=r.charCodeAt(n+l)-_.s[b])break;l++}if(0>a?(e=f,h=l):(s=f,o=l),1>=e-s){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var m=_.method();if(this.cursor=n+_.s_size,m)return _.result}if(s=_.substring_i,0>s)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var f=s+(e-s>>1),a=0,l=h>o?o:h,_=t[f],b=_.s_size-1-l;b>=0;b--){if(n-l==u){a=-1;break}if(a=r.charCodeAt(n-1-l)-_.s[b])break;l++}if(0>a?(e=f,h=l):(s=f,o=l),1>=e-s){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n-_.s_size,!_.method)return _.result;var m=_.method();if(this.cursor=n-_.s_size,m)return _.result}if(s=_.substring_i,0>s)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}}}});