/* 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 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; }