/* Copyright (c) 1999, 2000 by Kevin Forchione.  All Rights Reserved. */
/*
*  TADS ADV.T/STD.T LIBRARY EXTENSION
*  PARSEWORD.T
*  version 1.0
*
*          This TADS file is intended to assist in the conversion of
*      player input strings into a list of words for easier use by
*      preparse routines.
*
*----------------------------------------------------------------------
*  REQUIREMENTS
*
*      + HTML TADS 2.2.6 or later
*      + Requires ADV.T and STD.T
*      + Should be #included after ADV.T and STD.T.
*
*----------------------------------------------------------------------
*  IMPORTANT LIBRARY INTERFACE AND MODIFICATION
*
*      None.
*
*----------------------------------------------------------------------
*  COPYRIGHT NOTICE
*
*      You may modify and use this file in any way you want, provided that
*              if you redistribute modified copies of this file in source form, the
*      copies must include the original copyright notice (including this
*      paragraph), and must be clearly marked as modified from the original
*      version.
*
*------------------------------------------------------------------------------
*  REVISION HISTORY
*
*              99-03-10 programming begun.
*/

#define __PARSEWORD_MODULE_

parseWord: function;
parsePunct: function;

/*
*      parseWord: function
*
*      This function takes in a player's input stream
*      and returns a list consisting of 'words' (the player's
*      input as separated by spaces, but not separating
*      out punctuation.) It then goes on to call parsePunct()
*      which creates a list consisting of words and punctuation
*      marks.
*/
parseWord: function( inline )
{
       local istr := lower( inline ), j, len, pos, w, wlst := [], fstr := [ ',' '.' ';' '?' '!' ];

       len := length( istr );
       while ( len )
       {
               pos := find( istr, ' ' );
               if ( pos = nil )
                    pos := length( istr ) + 1;
               w := substr( istr, 1, pos-1 );
               wlst += [ w ];
               istr := substr( istr, pos+1, len );
               len := length( istr );
       }
       for ( j := 1; j <= length( fstr ); j++ )
       {
               wlst := parsePunct( wlst, fstr[ j ] );
       }
       return wlst;
}

/*
*      parsePunct: function
*
*      This function is called by parseWord and separates
*      out the punctuation marks in the word list. For instance
*      the statement <Doctor, give me the book.> will result in the
*      following word list from parseWord: [ 'doctor,' 'give' 'me' 'the' 'book.']
*      parsePunct will return  the following list:
*      [ 'doctor'  ','  'give' 'me' 'the' 'book'  '.' ]
*/
parsePunct: function( lst, fstr )
{
       local i, lenstr, lenword, pos, w, wlst := [];

       lenstr := length( lst );
       for ( i := 1; i <= lenstr; i++ )
       {
               pos := find( lst[ i ], fstr );
               if ( pos = nil )
               {
                       wlst += lst[ i ];
                       continue;
               }
               lenword := length( lst[ i ] );
               w := substr( lst[ i ], 1, pos-1 );
               wlst += [ w ];
               w := substr( lst[ i ], pos, 1 );
               wlst += [ w ];
               if ( pos < lenword )
               {
                       w := substr( lst[ i ], pos+1, lenword-pos );
                       wlst += [ w ];
               }
       }
       return wlst;
}