next up previous
Next: The server interface
Up: Web-O-Matic/Rexx: A tool for writing interactive Web pages that
Previous: Translating Rexx code inserts

The run-time library

This implements <Text>, <TextField> and the many other built-in elements. Each of these is just an Object Rexx class, with a definition for its emit method, probably some set... and get... methods, and some initialisation code. WOM provides base classes which implement important abstractions such as ``triggers'' (elements that respond to input from the user, such as forms and action links) and ``user inputs'' (elements that contain data, such as fields, menus, and buttons). Many of the built-ins can be made subclasses of these.

The two examples below show the File class and a version --- simplified to save space --- of the TextField class.

/*  File.cmd  */

::class File subclass WebObject public
  /* ivars name is_html */

  ::method setup
    expose is_html
    self~setup:super
    is_html = .false
    return

  ::method getOwnAttributeNames class
    return .set~of("Name","IsHTML")

  ::method emit
    expose name is_html
    use arg output_stream, envt
    input_stream = .stream~new(name)~~open('read')
    do while input_stream~lines > 0
      line = input_stream~linein
      if is_html then
        do
        line = line~changestr('&','&amp;'),
                   ~changestr('<','&lt;'),
                   ~changestr('>','&gt;')
        end
      output_stream~lineout( line )
    end
    input_stream~close
    return

  ::method setName
    expose name
    use arg _name
    name = _name
    return

  ::method getName
    expose name
    return name

  ::method setIsHTML
    expose is_html
    use arg _is_html
    is_html = _is_html
    return

  ::method getIsHTML
    expose is_html
    return is_html

/*  TextField.cmd  */

::class TextField subclass UserInput public
  /* ivars size */

  ::method setup
    expose size
    self~setup:super
    size = 10
    self~setValue( '' )
    self~setDisplay( '' )
    self~setTypeForProgram( 'string' )
    return

  ::method getOwnAttributeNames class
    return .set~of("Size")

  ::method emit
    expose size
    use arg output_stream, envt
    self~emitPathAsComment(output_stream)
    output_stream~charout( '<INPUT',
                            'TYPE=TEXT',
                             NAME='||self~getPathForHTML(envt) ),
    output_stream~charout( ' VALUE='||self~asHTML(self~getDisplay) ),
    output_stream~charout( ' SIZE='||size )
    output_stream~charout( '>' )
    return

  ::method setSize
    expose size
    use arg _size
    size = _size
    return

  ::method getSize
    expose size
    return size

The compiler needs to know which names belong to WOM elements, otherwise it will treat them as unanalysed HTML. This is done in a table-driven fashion. The parser contains a table which, for each WOM element, gives its name, whether it is an instantiation, whether it is a container (this controls whether the parser looks for a closing bracket), and its arguments, including their type and whether they are positional or defaultable Booleans. The WOM implementor can easily update this table when adding new classes.



Jocelyn Ireson-Paine
Fri May 30 14:03:06 BST 1997