| Alpha Technical Note #005 | 
| How Alpha's help search engine works | 
Introduction
Since version 9.0.8, Alpha provides a mechanism for searching its 
documentation and help files. The Help menu has a Search Field where users 
can enter a search string: 
 
The results of the search are displayed in the 
Help Viewer as hyperlinks pointing to the corresponding locations.
This document explains how this functionality is implemented. 
In a nutshell, the help files and packages are indexed and a collection of 
indexed files is kept in a cache inside the application bundle. When the 
user enters a search string, Alpha looks up in the cache to find the 
targets associated with the entered word(s) and then assembles this 
information in a file in HTML format which is displayed in the help viewer.
Where is the cache ?
The helpsearch cache containing the index files is located inside
the application bundle:
Alpha.app/Contents/Resources/Libraries/AlphaTcl/Cache/helpsearch
Where are the search results ?
For every search query, the results are assembled in an HTML file which is 
displayed by the Help Viewer. These result files are stored in a 
temporary folder inside Alpha's Preferences folder:
$PREF/tmp/search
where $PREF designates the Preferences folder (its location may vary).
The result files remain available during an Alpha session but are 
erased when the application quits.
How indexing works
Normally, there is nothing to do: Alpha comes with prebuilt indices.
In some circumstances, one may want to regenerate the help search indices. 
This is quite simple:
	- activate the Alpha Developer Menu from the Menus Preferences dialog (opened via Alpha ↣ Global Setup ↣ Menus…) ;
- then, from the AlphaDev menu, select the Rebuild AlphaTcl Indices 
menu item ;
- in the dialog which is displayed, check the Packages Info and
Help Search Info checkboxes. Also check the domains you are 
interested in (like Inside the Application), 
then press OK. It takes a few seconds to buid the indices.
 
The indexing procedure scans several elements:
	- all the help files contained inside the application bundle and inside 
the Application Support folders.
- all the package names (modes, menus, features, etc.)
- all the preindexed files found in Help/Index that may be provided by 
third party extensions. See the Indexing third party  packages section. In particular, Alpha itself provides such a 
preindexed file obtained by scanning the  documentation sources written 
with the Aida markup language.
- all the keywords declarations that may be provided by packages (see 
the Package keywords section below)
Indexing third party packages
Third party packages (menus, modes, features) designed for Alpha may 
benefit from the help search mechanism if they conform to the following 
guidelines.
If their documentation is written using the 
Aida markup language (as it is 
the case for the major part of Alpha's documentation), then all section 
titles are automatically indexed, as well as many labels produced by the 
Aida macros (see Aida Macros Help). The documentation 
files should be installed in the Help subfolder of the Application Support 
folder where the third party package itself is installed.
Additionally, package writers may provide preindexed files that 
should be installed in the Index subfolder of the Help folder. Two files 
are required which should be named [packagename]_words and
[packagename]_titles respectively, where [packagename] is a name identifying 
your package. For instance: MyPackage_words and
MyPackage_titles.
The [packagename]_words file contains entries for all the 
indexed words (in lowercase): each line has the format:
word [tabulation] list of targets
where word is an indexed word followed by a tabulation followed by 
a space-separated list of "targets". The targets may be of 
different kinds: line numbers or positions in a text file, anchors in an 
HTML file, page numbers in a pdf file, etc.
The [packagename]_titles file contains entries for all the 
targets found in the [packagename]_words file. Each line has the 
form:
target [tabulation] actual title
For the mechanism to work properly, the [packagename]_titles file 
must also contain (usually near the top) a line of information of the form:
#info: format;relpath;kind
where format is the format of the help files (html, text or pdf), 
relpath is the subpath of the help files relative to the Help folder, and 
kind specifies how targets must be interpreted. The kind can be 
one of the following:
	- line
- position
- page[±offset]
- anchor
- relpath
The best way to understand this is to have a look at the preindexed files 
found in the Index subfolder of Alpha's Help folder 
(click here).
Here are a few examples:
#info: html;Extensions/TclAEHelp;relpath
#info: text;Extensions/TclXHelp;line
#info: pdf;latex_guide.pdf;page+4
In the last example, page+4 indicates that to reach page labelled
10 for instance, Alpha has to go to actual page 14 (because the 4 first pages 
correspond to the table of contents and are labelled in roman numbers)
Package keywords
The package declarations (made using the alpha::mode, alpha::menu, 
alpha::feature etc. procs) now support a keywords key. The 
value of this key is a list of words that the package wants to suggest. 
If the user performs a search on one of these words, the help search 
engine will provide a link to the package's help page.
Here is a snippet coming from Julia mode's declaration:
alpha::mode Juli 0.1 source *.jl JuliaMenu {
    # Script to execute at Alpha startup
    [...]
} keywords {
    programming language numerical computing console
} description {
    Supports the editing and processing of Julia programming files
} help { 
    [...]
}
See many examples throughout the AlphaTcl library.
Note that these keywords declarations are indexed with the
Packages Info indices (rather than the Help Search Info indices).
Related Links