The R Project SVN R

Rev

Rev 6608 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6608 Rev 8090
Line 1... Line 1...
1
/*==============================================================================
1
/*============================================================================
2
 
2
 
3
  Project: Simple JAVA Search Engine for Keyword Search
3
  Project: Simple JAVA Search Engine for Keyword Search
4
  
4
  
5
  JAVA Source file for the class SearchEngine
5
  JAVA Source file for the class SearchEngine
6
  
6
  
7
  COPYRIGHT (C), 1998, Thomas Baier
7
  COPYRIGHT (C), 1998-2000, Thomas Baier, R Core Development Team
8
 
8
 
9
 *  This program is free software; you can redistribute it and/or modify
9
 *  This program is free software; you can redistribute it and/or modify
10
 *  it under the terms of the GNU General Public License as published by
10
 *  it under the terms of the GNU General Public License as published by
11
 *  the Free Software Foundation; either version 2 of the License, or
11
 *  the Free Software Foundation; either version 2 of the License, or
12
 *  (at your option) any later version.
12
 *  (at your option) any later version.
Line 18... Line 18...
18
 *
18
 *
19
 *  You should have received a copy of the GNU General Public License
19
 *  You should have received a copy of the GNU General Public License
20
 *  along with this program; if not, write to the Free Software
20
 *  along with this program; if not, write to the Free Software
21
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
 
22
 
23
  $Source: /scratch/CVS-ARCHIVE/R/doc/html/search/SearchEngine.java,v $
-
 
24
  
-
 
25
  $Revision: 1.4 $
23
  $Revision: 1.5 $
26
 
24
 
27
  $Date: 1999/11/18 12:30:58 $
25
  $Date: 2000/02/10 17:03:55 $
28
  
26
  
29
  $Author: leisch $
27
  $Author: leisch $
30
 
28
 
31
==============================================================================*/
29
============================================================================*/
32
 
-
 
33
 
30
 
34
/* -------------------------------- Imports --------------------------------- */
-
 
35
 
31
 
36
import java.applet.*;
32
import java.applet.*;
37
import java.awt.*;
33
import java.awt.*;
38
import java.net.*;
34
import java.net.*;
39
import java.io.*;
35
import java.io.*;
40
import java.util.*;
36
import java.util.*;
41
 
37
 
42
 
38
 
43
/*==============================================================================
-
 
44
                          Interface of class SearchEngine
-
 
45
==============================================================================*/
-
 
46
 
-
 
47
/*------------------------------------------------------------------------------
-
 
48
  CLASS:    SearchEngine
-
 
49
  SUPER:    Applet
-
 
50
  CONF. TO: 
-
 
51
  PURPOSE:  
-
 
52
  NOTES:    
-
 
53
 
-
 
54
  HISTORY:  98-04-26: created 
-
 
55
            98-05-15: new member for search mode
-
 
56
------------------------------------------------------------------------------*/
-
 
57
public class SearchEngine extends Applet
39
public class SearchEngine extends Applet
58
{
40
{
59
  /*============================================================================
-
 
60
                                Public methods
-
 
61
  ============================================================================*/
-
 
62
 
-
 
63
  /*----------------------------------------------------------------------------
-
 
64
    INTERFACE: 
-
 
65
    PURPOSE:   default constructor
-
 
66
  	      
-
 
67
    NOTES:     
-
 
68
  
-
 
69
    PARAMS:    
-
 
70
    THROWS:    
-
 
71
    RETURNS:   void
-
 
72
  
-
 
73
    HISTORY:   98-04-26: created
-
 
74
               98-05-03: now reads the index file
-
 
75
	       98-05-15: init new member
-
 
76
  ----------------------------------------------------------------------------*/
-
 
77
  public SearchEngine ()
41
  public SearchEngine ()
78
  {
42
  {
79
    iIndexTable = null;
43
    iIndexTable = null;
80
    iSearchTerm = null;
44
    iSearchTerm = null;
81
    iSearchMode = 0;
-
 
82
 
45
    
83
    Tracer.write ("SearchEngine initializing\n");
46
    Tracer.write ("SearchEngine initializing\n");
84
 
47
    
85
    return;
48
    return;
86
  }
49
  }
87
 
-
 
88
 
-
 
89
  /*----------------------------------------------------------------------------
-
 
90
    INTERFACE: 
-
 
91
    PURPOSE:   return general information about the applet
-
 
92
  	       
-
 
93
    NOTES:     
-
 
94
  
-
 
95
    PARAMS:    
-
 
96
    THROWS:    
-
 
97
    RETURNS:   String: the information
-
 
98
  
50
  
99
    HISTORY:   98-04-26: created
51
  
100
  ----------------------------------------------------------------------------*/
-
 
101
  public String getAppletInfo ()
52
  public String getAppletInfo ()
102
  {
53
  {
103
    return "Name: SearchEngine\r\n" +
54
    return "Name: SearchEngine\r\n" +
104
      "Author: Thomas Baier\r\n" +
55
      "Author: Thomas Baier\r\n" +
105
      "(C) 1998 Thomas Baier, ALL RIGHTS RESERVED";
56
      "(C) 1998-2000 Thomas Baier, R Core Development Team";
106
  }
57
  }
107
 
-
 
108
 
-
 
109
  /*----------------------------------------------------------------------------
-
 
110
    INTERFACE: 
-
 
111
    PURPOSE:   perform initialization
-
 
112
  	      
-
 
113
    NOTES:     creates the controls
-
 
114
  
58
  
115
    PARAMS:    
-
 
116
    THROWS:    
-
 
117
    RETURNS:   void
-
 
118
  
-
 
119
    HISTORY:   98-04-26: created
-
 
120
               98-05-03: now a do-nothing
-
 
121
  ----------------------------------------------------------------------------*/
-
 
122
  public void init ()
59
  public void init ()
123
  {
60
  {
124
    resize(640, 240);
61
    resize(640, 240);
125
 
62
    
126
    // get the name of the index file
63
    // get the name of the index file
127
    String indexName = getParameter (cIndexKeyword);
64
    String indexName = getParameter (cIndexKeyword);
128
    String searchTerm = getParameter (cSearchKeyword);
65
    String searchTerm = getParameter (cSearchKeyword);
129
 
66
    
130
    Tracer.write ("Index file is \"" + indexName + "\"\n");
67
    Tracer.write ("Index file is \"" + indexName + "\"\n");
131
    Tracer.write ("Search term is \"" + searchTerm + "\"\n");
68
    Tracer.write ("Search term is \"" + searchTerm + "\"\n");
132
 
69
    
133
    // use a default index file if none specified
70
    // use a default index file if none specified
134
    if (indexName == null) {
71
    if (indexName == null) {
135
      indexName = cIndexFile;
72
      indexName = cIndexFile;
136
    }
73
    }
137
 
74
 
Line 161... Line 98...
161
 
98
 
162
    return;
99
    return;
163
  }
100
  }
164
 
101
 
165
 
102
 
166
  /*----------------------------------------------------------------------------
-
 
167
    INTERFACE: 
-
 
168
    PURPOSE:   perform "destructor" code
-
 
169
  	      
-
 
170
    NOTES:     not required here
-
 
171
  
-
 
172
    PARAMS:    
-
 
173
    THROWS:    
-
 
174
    RETURNS:   void
-
 
175
  
-
 
176
    HISTORY:   98-04-26: created
-
 
177
  ----------------------------------------------------------------------------*/
-
 
178
  public void destroy ()
103
  public void destroy ()
179
  {
104
  {
180
    return;
105
    return;
181
  }
106
  }
182
 
107
 
183
 
108
 
184
  /*----------------------------------------------------------------------------
-
 
185
    INTERFACE: 
-
 
186
    PURPOSE:   perform painting of the applet
-
 
187
  	      
-
 
188
    NOTES:     not required for our applet, controls do everything
-
 
189
  
-
 
190
    PARAMS:    Graphics g: the graphics context to draw on
-
 
191
    THROWS:    
-
 
192
    RETURNS:   void
-
 
193
  
-
 
194
    HISTORY:   98-04-26: created
-
 
195
  ----------------------------------------------------------------------------*/
-
 
196
  public void paint (Graphics g)
109
  public void paint (Graphics g)
197
  {
110
  {
198
  
111
  
199
    return;
112
    return;
200
  }
113
  }
201
 
114
 
202
 
115
 
203
  /*----------------------------------------------------------------------------
-
 
204
    INTERFACE: 
-
 
205
    PURPOSE:   perform startup code everytime visiting the applet
-
 
206
  	      
-
 
207
    NOTES:     
-
 
208
  
-
 
209
    PARAMS:    
-
 
210
    THROWS:    
-
 
211
    RETURNS:   void
-
 
212
  
-
 
213
    HISTORY:   98-04-26: created
-
 
214
               98-05-10: start the tracer
-
 
215
  ----------------------------------------------------------------------------*/
-
 
216
  public void start ()
116
  public void start ()
217
  {
117
  {
218
    Tracer.start ();
118
    Tracer.start ();
219
    return;
119
    return;
220
  }
120
  }
221
 
-
 
222
 
-
 
223
  /*----------------------------------------------------------------------------
-
 
224
    INTERFACE: 
-
 
225
    PURPOSE:   perform cleanup evertime the applet "loses" the focus
-
 
226
  	      
-
 
227
    NOTES:     
-
 
228
  
121
  
229
    PARAMS:    
-
 
230
    THROWS:    
-
 
231
    RETURNS:   void
-
 
232
  
122
  
233
    HISTORY:   98-04-26: created
-
 
234
               98-05-10: stop the tracer
-
 
235
  ----------------------------------------------------------------------------*/
-
 
236
  public void stop ()
123
  public void stop ()
237
  {
124
  {
238
    Tracer.stop ();
125
    Tracer.stop ();
239
    return;
126
    return;
240
  }
127
  }
241
 
-
 
242
 
128
  
243
  /*----------------------------------------------------------------------------
-
 
244
    INTERFACE: 
-
 
245
    PURPOSE:   perform the search and return the search results as a string
129
  /* perform the search and return result as string */
246
  	      
130
     
247
    NOTES:     
-
 
248
  
-
 
249
    PARAMS:    
-
 
250
    THROWS:    
-
 
251
    RETURNS:   void
-
 
252
  
-
 
253
    HISTORY:   98-05-03: created
-
 
254
               98-05-08: new format for output
-
 
255
	       98-05-09: added trace
-
 
256
	       98-05-10: now a front-end for search()
131
  public String search (String key, boolean searchDesc,
257
	       98-05-15: new parameter for search-mode
-
 
258
  ----------------------------------------------------------------------------*/
-
 
259
  public String search (String key,boolean searchTitles)
132
			boolean searchKeywords, boolean searchAliases)
260
  {
133
  {
261
    iSearchTerm = key;
134
    iSearchTerm = key;
-
 
135
    
-
 
136
    Tracer.write ("Search for \"" + iSearchTerm + "\" started\n");
262
 
137
 
263
    if (searchTitles) {
138
    if(searchDesc){
264
      iSearchMode = IndexTable.cSearchDescription;
139
      Tracer.write("Searching in Descriptions\n");
265
    } else {
-
 
266
      iSearchMode = 0;
-
 
267
    }
140
    }
268
 
141
 
-
 
142
    if(searchKeywords){
269
    return internalSearch ();
143
      Tracer.write("Searching in Keywords\n");
270
  }
144
    }
271
 
-
 
272
 
145
 
273
  /*----------------------------------------------------------------------------
-
 
274
    INTERFACE: 
146
    if(searchAliases){
275
    PURPOSE:   perform the search (back-end)
147
      Tracer.write("Searching in Aliases\n");
276
  	      
-
 
277
    NOTES:     
-
 
278
  
-
 
279
    PARAMS:    
-
 
280
    THROWS:    
-
 
281
    RETURNS:   void
-
 
282
  
-
 
283
    HISTORY:   98-05-10: created
-
 
284
               98-05-15: forward search-mode
-
 
285
  ----------------------------------------------------------------------------*/
-
 
286
  public String internalSearch ()
-
 
287
  {
148
    }
288
    Tracer.write ("Search for \"" + iSearchTerm + "\" started");
-
 
289
 
149
 
290
    Vector foundItems = null;
150
    Vector foundItems = null;
291
 
151
 
292
    if (iSearchTerm != null) {
152
    if (iSearchTerm != null) {
293
      foundItems = iIndexTable.search (iSearchTerm,iSearchMode);
153
      foundItems = iIndexTable.search (iSearchTerm, searchDesc,
-
 
154
				       searchKeywords, searchAliases);
-
 
155
    }
294
    } else {
156
    else {
295
      foundItems = null;
157
      foundItems = null;
296
    }
158
    }
297
 
159
 
298
    String result = null;
160
    String result = null;
299
 
161
 
300
    // if nothing found, return a special string
162
    // if nothing found, return a special string
301
    if (foundItems == null) {
163
    if (foundItems == null) {
302
      result = "No matches for <b>\"" + 
164
      result = "No matches for <b>\"" + 
303
	iSearchTerm +
165
	iSearchTerm +
304
	"\"</b> have been found!<hr>";
166
	"\"</b> have been found!<hr>";
-
 
167
    }
305
    } else {
168
    else {
-
 
169
      
306
      Enumeration cursor = foundItems.elements ();
170
      Enumeration cursor = foundItems.elements ();
307
 
171
 
308
      result =
172
      result =
309
	"The search string was <b>\"" +
173
	"The search string was <b>\"" +
310
	iSearchTerm +
174
	iSearchTerm +
Line 313... Line 177...
313
	"<dl>";
177
	"<dl>";
314
 
178
 
315
      while (cursor.hasMoreElements ()) {
179
      while (cursor.hasMoreElements ()) {
316
	IndexEntry entry = (IndexEntry) cursor.nextElement ();
180
	IndexEntry entry = (IndexEntry) cursor.nextElement ();
317
 
181
 
318
	/*
-
 
319
	 * the format for every entry is
-
 
320
	 *
-
 
321
	 * title
-
 
322
	 *   description
-
 
323
	 */
-
 
324
 
-
 
325
	result +=
182
	result +=
326
	  "<dt><a href=\"" +
183
	  "<dt><a href=\"" +
327
	  entry.getURL () +
184
	  entry.getURL () +
328
	  "\">" +
185
	  "\">" +
329
	  entry.getTitle () +
186
	  entry.getEntry () +
330
	  "</a></dt>\n";
187
	  "</a></dt>\n";
331
	result += "<dd>" + entry.getDescription () + "</dd>\n";
188
	result += "<dd>" + entry.getDescription () + "</dd>\n";
332
      }
189
      }
333
 
190
 
334
      result += "</dl>";
191
      result += "</dl>";
335
    }
192
    }
336
 
193
 
337
    return result;
194
    return result;
338
  }
195
  }
339
 
196
 
340
 
-
 
341
  /*============================================================================
-
 
342
                              Protected methods
-
 
343
  ============================================================================*/
-
 
344
 
-
 
345
  /*============================================================================
-
 
346
                               Private methods
-
 
347
  ============================================================================*/
-
 
348
 
-
 
349
  /*----------------------------------------------------------------------------
-
 
350
    INTERFACE: 
-
 
351
    PURPOSE:   read the index file
-
 
352
  	      
-
 
353
    NOTES:     
-
 
354
  
-
 
355
    PARAMS:    
-
 
356
    THROWS:    
-
 
357
    RETURNS:   void
-
 
358
  
-
 
359
    HISTORY:   98-04-26: created
-
 
360
               98-05-08: now use an IndexStream
-
 
361
	       98-05-10: also use prefix and suffix, build URL from first key
-
 
362
	       98-05-19: add "Alias:" entry to keywords
-
 
363
	       98-06-01: bugfix: don't null the variables
-
 
364
  ----------------------------------------------------------------------------*/
-
 
365
  private void readIndexFile (String idxFile)
197
  private void readIndexFile (String idxFile)
366
  {
198
  {
367
    // create the index table
199
    // create the index table
368
    iIndexTable = new IndexTable ();
200
    iIndexTable = new IndexTable ();
369
 
201
 
Line 377... Line 209...
377
      IndexStream idxStream = new IndexStream (idxFileURL);
209
      IndexStream idxStream = new IndexStream (idxFileURL);
378
 
210
 
379
      // now start parsing...
211
      // now start parsing...
380
      
212
      
381
      /*
213
      /*
382
       * An entry consists of a title, keywords, an URL and a description.
214
       * An entry consists of a title, keywords, aliases, an URL and
-
 
215
       * a description, everything else is ignored.
383
       * everything else is ignored. Every entry starts with the keyword
216
       * Every entry starts with the keyword
384
       * "Entry" (case is ignored)
217
       * "Entry" (case is ignored)
385
       *
218
       *
386
       * must-have entries are "Entry" and "Keywords"
219
       * must-have entries are "Entry" and "Keywords"
387
       *
220
       *
388
       * 98-06-01: bugfix: don't null the variables
221
       * 98-06-01: bugfix: don't null the variables
389
       */
222
       */
390
      String entry = "";
223
      String entry = "";
391
      String keywords = "";
224
      String keywords = "";
-
 
225
      String aliases = "";
392
      String url = "";
226
      String url = "";
393
      String description = "";
227
      String description = "";
394
      String prefix = "";
228
      String prefix = "";
395
      String suffix = "";
229
      String suffix = "";
396
 
230
 
Line 398... Line 232...
398
 
232
 
399
      while (value != null) {
233
      while (value != null) {
400
	// parse the value now
234
	// parse the value now
401
	if (value.getKey ().equalsIgnoreCase ("entry")) {
235
	if (value.getKey ().equalsIgnoreCase ("entry")) {
402
	  // if a new entry is about to start, add the current one
236
	  // if a new entry is about to start, add the current one
403
	  addEntry (entry,keywords,description,url,prefix,suffix);
237
	  addEntry (entry,keywords,aliases,description,url,prefix,suffix);
404
 
238
 
405
	  entry = value.getValue ();
239
	  entry = value.getValue ();
-
 
240
	  aliases = entry;
406
	  keywords = "";
241
	  keywords = "";
407
	  url = "";
242
	  url = "";
408
	  description = "";
243
	  description = "";
409
	} else if (value.getKey ().equalsIgnoreCase ("keywords")) {
244
	} else if (value.getKey ().equalsIgnoreCase ("keywords")) {
410
	  keywords += value.getValue ();
245
	  keywords += value.getValue ();
-
 
246
	} else if (value.getKey ().equalsIgnoreCase ("aliases")) {
-
 
247
	  aliases += value.getValue ();
411
	} else if (value.getKey ().equalsIgnoreCase ("url")) {
248
	} else if (value.getKey ().equalsIgnoreCase ("url")) {
412
	  // use prefix and suffix
-
 
413
	  url = prefix + value.getValue () + suffix;
249
	  url = prefix + value.getValue () + suffix;
414
	} else if (value.getKey ().equalsIgnoreCase ("description")) {
250
	} else if (value.getKey ().equalsIgnoreCase ("description")) {
415
	  description = value.getValue ();
251
	  description = value.getValue ();
416
	} else if (value.getKey ().equalsIgnoreCase ("prefix")) {
252
	} else if (value.getKey ().equalsIgnoreCase ("prefix")) {
417
	  prefix = value.getValue ();
253
	  prefix = value.getValue ();
418
	  Tracer.write ("using new URL prefix \"" + prefix + "\"\n");
254
	  Tracer.write ("using new URL prefix \"" + prefix + "\"\n");
419
	} else if (value.getKey ().equalsIgnoreCase ("suffix")) {
255
	} else if (value.getKey ().equalsIgnoreCase ("suffix")) {
420
	  suffix = value.getValue ();
256
	  suffix = value.getValue ();
421
	  Tracer.write ("using new URL suffix \"" + suffix + "\"\n");
257
	  Tracer.write ("using new URL suffix \"" + suffix + "\"\n");
422
	} else if (value.getKey ().equalsIgnoreCase ("aliases")) {
-
 
423
	  keywords += value.getValue ();
-
 
424
	}
258
	}
425
	value = idxStream.popEntry ();
259
	value = idxStream.popEntry ();
426
      }
260
      }
427
 
261
 
428
      // the final entry just read
262
      // the final entry just read
429
      addEntry (entry,keywords,description,url,prefix,suffix);
263
      addEntry (entry,keywords,aliases,description,url,prefix,suffix);
430
    } catch (MalformedURLException exc) {
264
    } catch (MalformedURLException exc) {
431
      // an error occured while reading...
265
      // an error occured while reading...
432
    }
266
    }
433
 
267
 
434
    return;
268
    return;
435
  }
269
  }
436
 
-
 
437
  
270
  
438
  /*----------------------------------------------------------------------------
-
 
439
    INTERFACE: 
-
 
440
    PURPOSE:   
-
 
441
  	      
-
 
442
    NOTES:     
-
 
443
  
-
 
444
    PARAMS:    
-
 
445
    THROWS:    
-
 
446
    RETURNS:   void
-
 
447
  
-
 
448
    HISTORY:   98-05-10: created
-
 
449
               98-06-01: value is "", not null if empty
-
 
450
  ----------------------------------------------------------------------------*/
-
 
451
  private void addEntry (String entry,String keywords,
271
  private void addEntry (String entry,String keywords,
-
 
272
			 String aliases,
452
			 String description,String url,
273
			 String description,String url,
453
			 String prefix,String suffix)
274
			 String prefix,String suffix)
454
  {
275
  {
455
    // the entry must be set
276
    // the entry must be set
456
    if (entry.length () == 0) {
277
    if (entry.length () == 0) {
457
      return;
278
      return;
458
    }
279
    }
459
 
280
 
460
    // the keywords must be set, else ignore it
-
 
461
    if (keywords.length () != 0) {
-
 
462
      if (url.length () == 0) {
-
 
463
	// if the URL is empty, construct one following the rule:
281
    // if the URL is empty, construct one following the rule:
464
	// URL = prefix + first keyword + suffix
282
    // URL = prefix + entry + suffix
465
	int endOfFirstKeyword = keywords.indexOf (" ");
-
 
466
	
-
 
467
	// because we have trimmed the string, the first character must
-
 
468
	// not be a blank
-
 
469
	if (endOfFirstKeyword >= 0) {
283
    if (url.length () == 0) {
470
	  url = keywords.substring (0,endOfFirstKeyword);
-
 
471
	  Tracer.write ("constructing URL, keywords=\"" +
-
 
472
			keywords + "\"" +
-
 
473
			"using \"" + 
-
 
474
			url +
-
 
475
			"\" (results in \"" +
-
 
476
			prefix + url + suffix + "\")\n");
-
 
477
	} else {
-
 
478
	  // just a single keyword
-
 
479
	  url = keywords;
-
 
480
	  Tracer.write ("constructing URL, using keyword \"" + 
-
 
481
			url +
-
 
482
			"\" (results in \"" +
-
 
483
			prefix + url + suffix + "\")\n");
-
 
484
	}
-
 
485
	// add prefix and suffix
-
 
486
	url = prefix + url + suffix;
284
      url = prefix + entry + suffix;
487
      }
-
 
488
      IndexEntry idxEntry =
-
 
489
	new IndexEntry (entry,keywords,description,url);
-
 
490
      iIndexTable.addElement (idxEntry);
-
 
491
    }
285
    }
-
 
286
    IndexEntry idxEntry =
-
 
287
      new IndexEntry (entry,keywords,aliases,description,url);
-
 
288
    iIndexTable.addElement (idxEntry);
492
 
289
 
493
    return;
290
    return;
494
  }
291
  }
495
 
292
 
496
 
293
 
497
  /*============================================================================
-
 
498
                             Instance Variables
294
  /* Instance Variables */
499
  ============================================================================*/
-
 
-
 
295
 
500
  private IndexTable iIndexTable;
296
  private IndexTable iIndexTable;
501
  private String     iSearchTerm;
297
  private String     iSearchTerm;
502
  private int        iSearchMode;
-
 
503
 
-
 
504
 
298
 
505
  /*============================================================================
-
 
-
 
299
  
506
                                Static Data
300
  /* Static Data */
507
  ============================================================================*/
-
 
508
 
301
 
509
  private static final String cIndexFile = "index.txt";
302
  private static final String cIndexFile = "index.txt";
510
  private static final String cIndexKeyword = "INDEXFILE";
303
  private static final String cIndexKeyword = "INDEXFILE";
511
  private static final String cSearchKeyword = "SEARCHTERM";
304
  private static final String cSearchKeyword = "SEARCHTERM";
512
}
305
}
513
 
306
 
514
/*==============================================================================
-
 
515
 
-
 
516
  HISTORY:
-
 
517
  
-
 
518
  $Log: SearchEngine.java,v $
-
 
519
  Revision 1.4  1999/11/18 12:30:58  leisch
-
 
520
  use seperate aliases field
-
 
521
 
-
 
522
  Revision 1.3  1999/08/10 09:56:03  ripley
-
 
523
  change FSF address in copyrights
-
 
524
  add some copyrights in src/gnome and elsewhere
-
 
525
 
-
 
526
  Revision 1.2  1999/03/04 17:15:18  leisch
-
 
527
  various bugfixes
-
 
528
 
-
 
529
  Revision 1.1.4.1  1999/03/02 15:19:57  leisch
-
 
530
  search used only kewords, no titles
-
 
531
 
-
 
532
  Revision 1.6  1998/05/19 20:23:13  baier
-
 
533
  added alias support
-
 
534
 
-
 
535
  Revision 1.5  1998/05/15 22:10:05  baier
-
 
536
  allow searching in description, fix bug in results list
-
 
537
 
-
 
538
  Revision 1.4  1998/05/10 22:56:53  baier
-
 
539
  internal search function, parameter expansion
-
 
540
 
-
 
541
  Revision 1.3  1998/05/10 02:44:32  baier
-
 
542
  traces, output in HTML via JavaScript, new index generation
-
 
543
 
-
 
544
  Revision 1.2  1998/04/26 22:36:34  baier
-
 
545
  documentation changes
-
 
546
 
-
 
547
 
-
 
548
 
-
 
549
  Revision 1.1  1998/04/26 21:32:54  baier
-
 
550
  Initial revision
-
 
551
 
-
 
552
 
-
 
553
==============================================================================*/
-
 
554
 
-
 
555
 
307
 
556
// Local Variables:
308
// Local Variables:
557
// mode: Java
309
// mode: Java
558
// mode: font-lock
310
// mode: font-lock
559
// End:
311
// End: