summaryrefslogtreecommitdiff
path: root/themes/new_theme/layouts/partials/ranklist_fts5.html
diff options
context:
space:
mode:
Diffstat (limited to 'themes/new_theme/layouts/partials/ranklist_fts5.html')
-rw-r--r--themes/new_theme/layouts/partials/ranklist_fts5.html152
1 files changed, 152 insertions, 0 deletions
diff --git a/themes/new_theme/layouts/partials/ranklist_fts5.html b/themes/new_theme/layouts/partials/ranklist_fts5.html
new file mode 100644
index 0000000..69c0f39
--- /dev/null
+++ b/themes/new_theme/layouts/partials/ranklist_fts5.html
@@ -0,0 +1,152 @@
+<script src="/js/jquery.js" type="text/javascript"></script>
+<script src="/js/url-search-params.js" type="text/javascript"></script>
+<script src="/js/loadingoverlay.min.js" type="text/javascript"></script>
+<script src="/js/require.js" type="text/javascript"></script>
+
+<script language="Javascript">
+
+ function escapeHtml( text ) {
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;" );
+ }
+
+ function draw_ranklist( query, results ) {
+ var html = '';
+
+ if( results.length == 0 ) {
+ return "<p>No hits for query '" + query + "'...</p>";
+ } else {
+ html += "<p>" + results.length + " hits found</p>";
+ }
+
+ var start = 1;
+ html += "<ol class=\"ranklist\" start=\"" + start + "\">";
+ for( var i = 0; i < results.length; i++ ) {
+ var rank = results[i];
+ var docid = rank['docid'];
+ var abstract = rank['abstract'];
+ var title = rank['title'];
+ if( title == '' ) {
+ title = 'No title';
+ }
+ html += "<li>";
+ html += "<div class='title'>"
+ html += "<a href=\"" + docid + "\">" + title + "</a></div>";
+ if( abstract != '' ) {
+ html += "<div class='abstract'>" + abstract + "</div>";
+ }
+ html += "</li>";
+ }
+ html += "</ol>";
+
+ return html;
+ }
+
+ function submitQuery( ) {
+ try {
+ if( window.location.pathname.includes( "/search/") ) {
+ var q = $( "#query" ).val( );
+ executeQuery( q );
+ return false;
+ } else {
+ return true;
+ }
+ } catch( e ) {
+ alert( e );
+ }
+ }
+
+ var index_loaded = false;
+ var SQL;
+ var db;
+ var stmt;
+
+ function loadIndex( success, fail ) {
+ if( !index_loaded ) {
+ const xhr = new XMLHttpRequest( );
+ xhr.open( 'GET', '/index/posts.db', true );
+ xhr.responseType = 'arraybuffer';
+ xhr.onload = e => {
+ if( ( xhr.status == 0 ) || ( xhr.status == 200 ) ) {
+ const uInt8Array = new Uint8Array( xhr.response );
+ requirejs(["/js/sql-wasm.js"], function(initSqlJs) {
+
+ SQL = initSqlJs( {
+ locateFile: file => `/js/${file}`
+ } );
+
+ initSqlJs( ).then( function( SQL ) {
+ db = new SQL.Database(uInt8Array);
+ stmt = db.prepare( "select uri as docid,title,snippet(posts, 2, '<b>', '</b>', '...', 50) as abstract from posts where posts MATCH @query ORDER BY bm25(posts)" );
+
+ index_loaded = true;
+
+ success( );
+ } );
+ } );
+ } else {
+ const uInt8Array = new Uint8Array( xhr.response );
+ const decoder = new TextDecoder( );
+ const msg = decoder.decode( uInt8Array );
+ fail( xhr.status, xhr.statusText, msg );
+ }
+ }
+ xhr.send( );
+ } else {
+ success( );
+ }
+ }
+
+ function executeQuery( query ) {
+ $( "#query" ).LoadingOverlay( "show" );
+
+ loadIndex(
+ function( ) {
+ stmt.bind( {'@query' : query} );
+
+ var html;
+ try {
+ var results = [];
+ while( stmt.step( ) ) {
+ var row = stmt.getAsObject( );
+ results.push( row );
+ }
+
+ html = draw_ranklist( query, results );
+ } catch( e ) {
+ html = "<pre><font color='red'>There was an error executing the query '" + query + "', reason: " + e + "</font></pre>\n";
+ }
+
+ $( '#ranklist' ).html( html );
+
+ $( "#query" ).LoadingOverlay( "hide" );
+ },
+ function( status, statusText, msg ) {
+ var html = "<pre><font color='red'>There was an error executing the query '" + query + "', reason: " + status + " " + statusText + "</font></pre>\n";
+ $( '#ranklist' ).html( html );
+ $( "#query" ).LoadingOverlay( "hide" );
+ }
+ );
+ }
+
+ $( window ).load( function( ) {
+ var paramsString = window.location.search;
+ var searchParams = new URLSearchParams( paramsString );
+ if( searchParams.has( "q" ) ) {
+ var q = searchParams.get( "q" )
+ $( "#query" ).val( q );
+ executeQuery( q );
+ } else {
+ // TODO: come up with something here
+ } // Show full page LoadingOverlay
+ } );
+
+ $( window ).unload( function( ) {
+ if( index_loaded ) {
+ stmt.free( );
+ db.close( );
+ index_loaded = false;
+ }
+ } );
+</script>
+<div id="ranklist">
+</div>