First revision, seems working. Yes, using a className of "autofill floodlight" will give your theme/whatever support for this plugin.
authorDan
Sun, 21 Dec 2008 23:10:15 -0500
changeset 0 4d19ad17b07c
child 1 c9c49ce179e9
First revision, seems working. Yes, using a className of "autofill floodlight" will give your theme/whatever support for this plugin.
Floodlight.php
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Floodlight.php	Sun Dec 21 23:10:15 2008 -0500
@@ -0,0 +1,177 @@
+<?php
+/**!info**
+{
+  "Plugin Name"  : "Floodlight",
+  "Plugin URI"   : "http://enanocms.org/plugin/floodlight",
+  "Description"  : "A much broader search than Spotlight. Adds auto-completion to the Search sidebar block.",
+  "Author"       : "Dan Fuhry",
+  "Version"      : "1.1.5",
+  "Author URI"   : "http://enanocms.org/"
+}
+**!*/
+
+$plugins->attachHook('sidebar_fetch_return', 'floodlight_inject_searchflags($return);');
+$plugins->attachHook('autofill_json_request', 'floodlight_perform_search($dataset);');
+$plugins->attachHook('session_started', 'floodlight_add_js_page();');
+$plugins->attachHook('common_post', 'floodlight_intercept_search();');
+$plugins->attachHook('compile_template', 'floodlight_add_js();');
+
+function floodlight_inject_searchflags(&$return)
+{
+  if ( strstr($return[0], '<input name="q"') )
+  {
+    $hackme =& $return[0];
+  }
+  else if ( strstr($return[1], '<input name="q"') )
+  {
+    $hackme =& $return[1];
+  }
+  else
+  {
+    return;
+  }
+  $hackme = str_replace('<input name="q"', '<input name="q" autocomplete="off" onkeyup="this.onkeyup = null; this.className = \'autofill floodlight\'; autofill_init_element(this, {});"', $hackme);
+}
+
+function floodlight_perform_search(&$dataset)
+{
+  global $db, $session, $paths, $template, $plugins; // Common objects
+  if ( $_GET['type'] == 'floodlight' )
+  {
+    $results = perform_search($_GET['userinput'], $warnings, false, $word_list);
+    if ( count($results) > 5 )
+    {
+      $results = array_slice($results, 0, 5);
+    }
+    foreach ( $results as $result )
+    {
+      $dataset[] = array(
+          0 => "go:{$paths->nslist[$result['namespace']]}{$result['page_id']}",
+          'title' => str_replace(array('<highlight>', '</highlight>'), array('<b>', '</b>'), $result['page_name']),
+          'score' => $result['score'],
+          'type' => $result['page_note'],
+          'size' => $result['page_length'],
+        );
+    }
+  }
+}
+
+function floodlight_add_js_page()
+{
+  global $db, $session, $paths, $template, $plugins; // Common objects
+  $paths->add_page(array(
+      'name' => 'Floodlight Javascript',
+      'urlname' => 'FloodlightJS',
+      'namespace' => 'Special',
+      'visible' => 0,
+      'protected' => 0,
+      'comments_on' => 0,
+      'special' => 0
+    ));
+}
+
+function floodlight_intercept_search()
+{
+  global $db, $session, $paths, $template, $plugins; // Common objects
+  if ( $paths->page_id == 'Search' && $paths->namespace == 'Special' )
+  {
+    if ( isset($_GET['q']) && preg_match('/^go:/', $_GET['q']) )
+    {
+      redirect(makeUrl(preg_replace('/^go:/', '', $_GET['q'])), '', '', 0);
+    }
+  }
+}
+
+function floodlight_add_js()
+{
+  global $db, $session, $paths, $template, $plugins; // Common objects
+  $template->add_header('<script type="text/javascript" src="' . makeUrlNS('Special', 'FloodlightJS', false, true) . '"></script>');
+}
+
+function page_Special_FloodlightJS()
+{
+  global $db, $session, $paths, $template, $plugins; // Common objects
+  header('Content-type: text/javascript');
+  header('ETag: ' . sha1(__FILE__));
+  
+  global $aggressive_optimize_html;
+  $aggressive_optimize_html = false;
+  
+  echo <<<EOF
+addOnloadHook(function()
+{
+  var autofill_schemas = window.autofill_schemas || {};
+  autofill_schemas.floodlight = {
+    init: function(element, fillclass, params)
+    {
+      params = params || {};
+      $(element).autocomplete(makeUrlNS('Special', 'Autofill', 'type=' + fillclass) + '&userinput=', {
+          minChars: 3,
+          formatItem: function(row, _, __)
+          {
+            var type = ( typeof(row.type) == 'string' ) ? row.type : '';
+            var html = '<big>' + row.title + '</big> <small>' + type + '</small>';
+            html += '<br /><small>' + \$lang.get('floodlight_lbl_score') + row.score + '% | ' + row.size + '</small>';
+            return html;
+          },
+          tableHeader: '<tr><th>' + \$lang.get('floodlight_table_heading') + '</th></tr>',
+          showWhenNoResults: true,
+          onItemSelect: function(li)
+          {
+            window.location = makeUrl(li.selectValue.replace(/^go:/, ''));
+          },
+          width: 300,
+          noResultsHTML: '<tr><td class="row1" style="font-size: smaller;">' + \$lang.get('floodlight_msg_no_results') + '</td></tr>',
+      });
+    }
+  };
+});
+EOF;
+}
+
+/**!language**
+
+The following text up to the closing comment tag is JSON language data.
+It is not PHP code but your editor or IDE may highlight it as such. This
+data is imported when the plugin is loaded for the first time; it provides
+the strings displayed by this plugin's interface.
+
+You should copy and paste this block when you create your own plugins so
+that these comments and the basic structure of the language data is
+preserved. All language data is in the same format as the Enano core
+language files in the /language/* directories. See the Enano Localization
+Guide and Enano API Documentation for further information on the format of
+language files.
+
+The exception in plugin language file format is that multiple languages
+may be specified in the language block. This should be done by way of making
+the top-level elements each a JSON language object, with elements named
+according to the ISO-639-1 language they are representing. The path should be:
+
+  root => language ID => categories array, ( strings object => category \
+  objects => strings )
+
+All text leading up to first curly brace is stripped by the parser; using
+a code tag makes jEdit and other editors do automatic indentation and
+syntax highlighting on the language data. The use of the code tag is not
+necessary; it is only included as a tool for development.
+
+<code>
+{
+  // english
+  eng: {
+    categories: [ 'meta', 'floodlight' ],
+    strings: {
+      meta: {
+        floodlight: 'Floodlight plugin'
+      },
+      floodlight: {
+        table_heading: 'Search results',
+        msg_no_results: 'No results',
+        lbl_score: 'Relevance: ',
+      }
+    }
+  }
+}
+</code>
+**!*/