Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/mkws
authorMike Taylor <mike@indexdata.com>
Mon, 10 Nov 2014 17:05:39 +0000 (17:05 +0000)
committerMike Taylor <mike@indexdata.com>
Mon, 10 Nov 2014 17:05:39 +0000 (17:05 +0000)
doc/index.markdown
doc/mkws-developer.markdown
doc/mkws-manual.markdown

index 6c4424a..a366166 100644 (file)
@@ -1,6 +1,6 @@
 % MKWS: the MasterKey Widget Set
 % Mike Taylor
-% October 2014
+% November 2014
 
 
 Add metasearching to your web-site painlessly
index a6ca04b..ffa831b 100644 (file)
@@ -1,14 +1,25 @@
 % The MasterKey Widget Set developer's guide
 % Mike Taylor
-% 11 August 2014
+% November 2014
+
+
+Introduction
+============
+
+This manual is for people who want to build the widget set from
+source, develop the widget set's core code, or (more likely) create
+their own widgets as extensions to the main set.
+
+Those who want to use existing widgets should read
+[The MKWS manual: embedded metasearching with the MasterKey Widget
+Set](mkws-manual.html) instead.
 
 
 Required development tools
 ==========================
 
-If you are building the widget set, as opposed to just using it, you
-will need the following Debian packages (or their equivalents on your
-operating system):
+If you are building the widget set, you will need the following Debian
+packages (or their equivalents on your operating system):
 
        $ sudo apt-get install curl git make unzip apache2 \
            pandoc yui-compressor libbsd-resource-perl
@@ -20,42 +31,86 @@ http://nodejs.org/download/ and build it yourself. You need both Node
 itself and its package manager NPM: `make install` puts them into
 `/usr/local/bin`.
 
-To compile the default templates you'll need to install the stable
-version of Handlebars. Currently it's at 2.0.0 and available by npm:
 
-       $ npm install handlebars@2.0.0 -g
+Concepts
+========
+
+Code structure
+--------------
+
+The code of the widget set is in four main layers, described here from
+the bottom up:
+
+1. The core code, which manages the set of widget teams, default
+options, authentication onto the Service Proxy, and the creation of
+widgets from HTML elements.
+This code is in `mkws-core.js`
+
+2. The team code, which manages teams of widgets. This is responsible
+for the collections of widgets that make up teams, event queues, and
+handling search-and-retrieval events
+This code is in `mkws-team.js`
+
+3. The generic widget code, which handles the creation of widget
+objects, parsing configuration attributes from their HTML elements,
+and firing off automatic searches.
+
+4. The code for individual widgets, which is specific to those
+widgets. It often involves subscribing to events and responding to
+them by setting the HTML of the widget element, but need not do
+so. The code for many of the most important widgets is in
+`mkws-widget-main.js`, but certain other widgets are defined in other
+files beginning with the prefix `mkws-widget-`.
+
+In addition to this code, there are several source files containing
+support code:
+
+* `mkws-filter.js` contains support routine implementing the
+filter-set data structure, which contains information about which
+filters (e.g. by target, or by facet) are in force.
+
+* `mkws-handlebars.js` contains Handlebars helpers which can be used
+by the HTML templates.
+
+* `mkws-popup.js` defines a special widget for creating popup
+  windows. These may, but need not, contain other MKWS widgets,
+  forming a popup searching application.
+
+The final component of the source code is the set of Handlebars
+templates, in the `templates` directory, which are used to emit the
+HTML of the various widgets' contents. These are compiled into the
+file `mkws-templates.js`.
 
 
-Overview
-========
 
-Core concepts
--------------
+Defining new types of widget
+----------------------------
 
 Development with MKWS consists primarily of defining new types of
-widgets. These can interact with the core functionality is several
-defined ways.
+widgets. This is done using exactly the same API as the the widgets
+that come as part of the set: they have no privileged access.
 
 You create a new widget type by calling the `mkws.registerWidgetType`
 function, passing in the widget name and a function. The name is used
 to recognise HTML elements as being widgets of this type -- for
-example, if you register a `Foo` widget, elements like
-`<div class="mkwsFoo">` will be widgets of this type.
+example, if you register a `foo` widget, elements like
+`<div class="mkws-foo">` will become widgets of this type.
 
-The function promotes a bare widget object (passed as `this`) into a
+The function promotes a bare widget object (which is created by the
+core widget code and passed in as `this`) into a
 widget of the appropriate type. MKWS doesn't use classes or explicit
 prototypes: it just makes objects that have the necessary
 behaviours. There are _no_ behaviours that Widgets are obliged to
 provide: you can make a doesn't-do-anything-at-all widget if you like:
 
-       mkws.registerWidgetType('Sluggard', function() {});
+       mkws.registerWidgetType('sluggard', function() {});
 
 More commonly, widgets will subscribe to one or more events, so that
 they're notified when something interesting happens. For example, the
-`Log` widget asks to be notified when a `log` event happens, and
+`log` widget asks to be notified when a `log` event happens, and
 appends the logged message to its node, as follows:
 
-       mkws.registerWidgetType('Log', function() {
+       mkws.registerWidgetType('log', function() {
          var that = this;
 
          this.team.queue("log").subscribe(function(teamName, timestamp, message) {
@@ -77,11 +132,11 @@ This simple widget illustrates several important points:
 * You can add functionality to a widget by subscribing it to an
   event's queue using `this.team.queue("EVENT").subscribe`. The
   argument is a function which is called whenever the event is
-  published. The arguments to the function are different for different
-  events.
+  published. The arguments to the event-callback function are
+  different for different events.
 
 * As with so much JavaScript programming, the value of the special
-  variable `this` is lost inside the `subscribez` callback function,
+  variable `this` is lost inside the `subscribe` callback function,
   so it must be saved if it's to be used inside that callback
   (typically as a local variable named `that`).
 
index 8fd07e3..d5332cb 100644 (file)
@@ -1,6 +1,6 @@
 % The MKWS manual: embedded metasearching with the MasterKey Widget Set
 % Mike Taylor
-% October 2014
+% November 2014
 
 
 Introduction