Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: LEXTOKN

LEXTOKN.m

Go to the documentation of this file.
  1. LEXTOKN ;ISL/KER - Parse term into words ; 04/21/2014
  1. ;;2.0;LEXICON UTILITY;**80,150**;Sep 23, 1996;Build 1
  1. ;
  1. ; Global Variables
  1. ; ^TMP("LEXTKN") SACC 2.3.2.5.1
  1. ;
  1. ; External References
  1. ; DBIA #10104
  1. ;
  1. ; External References
  1. ; $$SW^LEXTOKN2
  1. ; ORD^LEXTOKN2
  1. ; ST^LEXTOKN2
  1. ; $$UP^XLFSTR
  1. ;
  1. ; Lexicon files accessed
  1. ; ^LEX(757.01 Expression File
  1. ; ^LEX(757.04 Excluded Words
  1. ; ^LEX(757.05 Replacement Words
  1. ;
  1. ; Local Variables NEWed or KILLed Elsewhere
  1. ; DA Set and Killed by Fileman
  1. ; LEXIDX Set if parsing for indexing logic (LEXNDX*)
  1. ; LEXLOOK Set if parsing for Lookup logic (LEXA)
  1. ; LEXLOW Set of lower case is needed (LEXNDX2)
  1. ;
  1. ; Returns ^TMP("LEXTKN",$J,#,WORD) containing words
  1. ;
  1. ; Special variables:
  1. ;
  1. ; LEXIDX If set, then the Excluded Words file is used
  1. ; to selectively exclude words from the indexing
  1. ; process and both singular and plural forms are
  1. ; indexed.
  1. ;
  1. ; LEXLOOK If set, then the Excluded Words file is used
  1. ; to selectively exclude words from the look-up
  1. ; process and only singular forms are used when
  1. ; one is found.
  1. ;
  1. ; If LEXIDX or LEXLOOK exist, then LEXLOW is ignored.
  1. ;
  1. ; If LEXIDX and LEXLOOK do not exist then ALL words are
  1. ; parsed and returned in the global array.
  1. ;
  1. PT ; Entry point where DA is defined and X is unknown
  1. Q:'$D(DA) S X=^LEX(757.01,DA,0)
  1. PTX ; Entry point to parse string (X must exist)
  1. N LEXOK,LEXTOKS,LEXTOKS2,LEXTOKI,LEXTOKW,LEXTOLKN
  1. N LEXOKC,LEXOKN,LEXOKP,LEXTOKAA,LEXTOKAB,LEXTOKAC
  1. ; Prevent lowercase indexing and lookup
  1. I $D(LEXIDX)!($D(LEXLOOK)) K LEXLOW
  1. K ^TMP("LEXTKN",$J) Q:'$L($G(X)) S X=$$SW^LEXTOKN2($G(X))
  1. S LEXTOKS=$TR(X,"-"," "),LEXTOKS=$TR(LEXTOKS,$C(9)," ")
  1. ; Remove leading blanks from string
  1. F LEXOKP=1:1:$L(LEXTOKS) Q:$E(LEXTOKS,LEXOKP)'[" "
  1. S LEXTOKS=$E(LEXTOKS,LEXOKP,$L(LEXTOKS))
  1. ; Remove trailing blanks from string
  1. F LEXOKP=$L(LEXTOKS):-1:1 Q:$E(LEXTOKS,LEXOKP)'[" "
  1. S LEXTOKS=$E(LEXTOKS,1,LEXOKP)
  1. ; Remove Punctuation (less slashes)
  1. S LEXTOKS=$TR(LEXTOKS,"?`~!@#$%^&*()_-+={}[]\:;,<>"," ")
  1. ; Conditionally remove slashes
  1. S:$D(LEXIDX) LEXTOKS=$TR(LEXTOKS,"/"," ")
  1. S:$E($P(LEXTOKS,".",2),1)'?1(1N,1U) LEXTOKS=$TR(LEXTOKS,"."," ")
  1. S LEXTOKS=$TR(LEXTOKS,"""","")
  1. ; Swtich to UPPERCASE (lower case is not specified by LEXLOW)
  1. S:'$D(LEXLOW) LEXTOKS=$$UP^XLFSTR(LEXTOKS)
  1. ; Store in temporary array (based on space character)
  1. S LEXOKC=0 F LEXTOKI=1:1:$L(LEXTOKS," ") D
  1. . N LEXTOKW S LEXTOKW=$P(LEXTOKS," ",LEXTOKI) Q:LEXTOKW=""
  1. . I LEXTOKW'["/" D
  1. . . S LEXOKC=LEXOKC+1,LEXTOLKN(LEXOKC)=LEXTOKW
  1. . . S LEXTOLKN(0)=LEXOKC
  1. . I LEXTOKW["/"&('$D(^LEX(757.05,"B",LEXTOKW))) D Q
  1. . . N LEXP S LEXP=0 F S LEXP=LEXP+1 Q:$P(LEXTOKW,"/",LEXP)="" D
  1. . . . S LEXOKC=LEXOKC+1,LEXTOLKN(LEXOKC)=$P(LEXTOKW,"/",LEXP)
  1. . . . S LEXTOLKN(0)=LEXOKC
  1. . I LEXTOKW["/"&($D(^LEX(757.05,"B",LEXTOKW))) D
  1. . . N LEXOKR S LEXOKR=$O(^LEX(757.05,"B",LEXTOKW,0))
  1. . . I $P($G(^LEX(757.05,LEXOKR,0)),U,3)="R" D
  1. . . . S LEXOKC=LEXOKC+1,LEXTOLKN(LEXOKC)=LEXTOKW
  1. . . . S LEXTOLKN(0)=LEXOKC
  1. K LEXOKC,LEXOKR
  1. I +($G(LEXTOLKN(0)))=0 K LEXTOLKN S ^TMP("LEXTKN",$J,0)=0 G EXIT
  1. S LEXTOKW="",LEXOKN=0 F LEXTOKI=1:1:LEXTOLKN(0) D
  1. . S LEXTOKW=$G(LEXTOLKN(LEXTOKI))
  1. . ; Remove leading blanks
  1. . F LEXOKP=1:1:$L(LEXTOKW) Q:$E(LEXTOKW,LEXOKP)'[" "
  1. . S LEXTOKW=$E(LEXTOKW,LEXOKP,$L(LEXTOKW))
  1. . ; Remove trailing blanks
  1. . F LEXOKP=$L(LEXTOKW):-1:1 Q:$E(LEXTOKW,LEXOKP)'[" "
  1. . S LEXTOKW=$E(LEXTOKW,1,LEXOKP)
  1. . ; Apostrophy "S"
  1. . I $E(LEXTOKW,($L(LEXTOKW)-1),$L(LEXTOKW))["'S" S LEXTOKW=$E(LEXTOKW,1,($L(LEXTOKW)-2))
  1. . ; Apostrophies and spaces
  1. . S LEXTOKW=$TR(LEXTOKW,"'",""),LEXTOKW=$TR(LEXTOKW," ","")
  1. . ; Excluded Words
  1. . ; Exclude from Indexing
  1. . I $D(LEXIDX) D
  1. . . I LEXTOKW'="" S:$D(^LEX(757.04,"ACTION",LEXTOKW,"I")) LEXTOKW=""
  1. . . I LEXTOKW'="" S:$D(^LEX(757.04,"ACTION",LEXTOKW,"B")) LEXTOKW=""
  1. . ; Exclude from Lookup
  1. . I $D(LEXLOOK) D
  1. . . I LEXTOKW'="" S:$D(^LEX(757.04,"ACTION",LEXTOKW,"L")) LEXTOKW=""
  1. . . I LEXTOKW'="" S:$D(^LEX(757.04,"ACTION",LEXTOKW,"B")) LEXTOKW=""
  1. . I $D(LEXOKN),$L($G(LEXTOKW)) D
  1. . . ; Replacement Words
  1. . . I $P($G(^LEX(757.05,+($O(^LEX(757.05,"B",LEXTOKW,0))),0)),"^",3)="R" D REP(LEXTOKW) Q
  1. . . I '$D(^TMP("LEXTKN",$J,"B",LEXTOKW)) D
  1. . . . S LEXOKN=$O(^TMP("LEXTKN",$J," "),-1)+1
  1. . . . S ^TMP("LEXTKN",$J,LEXOKN,LEXTOKW)=""
  1. . . . S ^TMP("LEXTKN",$J,"B",LEXTOKW)=""
  1. . S LEXTOKW=""
  1. S LEXOKC=0 F S LEXOKC=$O(^TMP("LEXTKN",$J,LEXOKC)) Q:+LEXOKC'>0 D
  1. . S LEXTOKW="" F S LEXTOKW=$O(^TMP("LEXTKN",$J,LEXOKC,LEXTOKW)) Q:'$L(LEXTOKW) D
  1. . . N LEXSIN S LEXSIN=$$SIN(LEXTOKW) Q:'$L(LEXSIN)
  1. . . I $D(LEXIDX) D
  1. . . . S LEXI=$O(^TMP("LEXTKN",$J," "),-1)+1
  1. . . . S ^TMP("LEXTKN",$J,LEXI,LEXSIN)="",^TMP("LEXTKN",$J,"B",LEXSIN)=""
  1. . . I $D(LEXLOOK) D
  1. . . . K ^TMP("LEXTKN",$J,LEXOKC,LEXTOKW),^TMP("LEXTKN",$J,"B",LEXTOKW)
  1. . . . S ^TMP("LEXTKN",$J,LEXOKC,LEXSIN)="",^TMP("LEXTKN",$J,"B",LEXSIN)=""
  1. S (LEXOKN,LEXOKC)=0 F S LEXOKC=$O(^TMP("LEXTKN",$J,LEXOKC)) Q:+LEXOKC'>0 S LEXOKN=LEXOKN+1
  1. S ^TMP("LEXTKN",$J,0)=LEXOKN
  1. K ^TMP("LEXTKN",$J,"B")
  1. EXIT ; Clean up and quit PTX
  1. K LEXOK,LEXTOKI,LEXOKN,LEXOKP,LEXOKR,LEXTOKS,LEXTOKS2,LEXTOKW,LEXTOLKN
  1. Q
  1. ;
  1. ; Miscellaneous
  1. ORD ; Reorder Global Array
  1. D ORD^LEXTOKN2
  1. Q
  1. REP(X) ; Replace
  1. N LEXREP,LEXTXT,LEXREF,LEXFLG,LEXARY,LEXIN,LEXWITH,LEXI,LEXO
  1. S (LEXO,LEXFLG)=0,LEXIN=$G(X) Q:'$L(LEXIN)
  1. S:$D(LEXIDX)&'$D(LEXLOOK) LEXFLG=1
  1. S:'$D(LEXIDX)&$D(LEXLOOK) LEXFLG=2
  1. S:$D(LEXIDX)&$D(LEXLOOK) LEXFLG=3
  1. S LEXTXT=$P($G(^LEX(757.05,+($O(^LEX(757.05,"B",LEXIN,0))),0)),"^",2)
  1. S LEXWITH=$$WITH(LEXTXT,.LEXARY,LEXFLG)
  1. I LEXFLG=1 D
  1. . Q:$D(LEXLOOK) Q:'$L(LEXIN)
  1. . I '$D(^TMP("LEXTKN",$J,"B",LEXIN)) D
  1. . . S LEXOKN=+($G(LEXOKN))+1
  1. . . S ^TMP("LEXTKN",$J,LEXOKN,LEXIN)="",LEXO=1
  1. . . S ^TMP("LEXTKN",$J,"B",LEXIN)=""
  1. I LEXWITH>0 D
  1. . N LEXI,LEXW S LEXI=0 F S LEXI=$O(LEXARY(LEXI)) Q:+LEXI'>0 D
  1. . . S LEXW=$G(LEXARY(LEXI)) Q:'$L(LEXW)
  1. . . I '$D(^TMP("LEXTKN",$J,"B",LEXW)) D
  1. . . . S LEXOKN=+($G(LEXOKN))+1
  1. . . . S ^TMP("LEXTKN",$J,LEXOKN,LEXW)="",LEXO=1
  1. . . . S ^TMP("LEXTKN",$J,"B",LEXW)=""
  1. Q LEXO
  1. WITH(X,LEX,Y) ; Parse Replacement Words (replace with)
  1. N LEXBEG,LEXEND,LEXCHR,LEXI,LEXNUM,LEXTXT,LEXWRD,LEXFLG
  1. S LEXTXT=$$UP^XLFSTR(X) S LEXFLG=+($G(Y))
  1. K LEX S LEXBEG=1 F LEXEND=1:1:$L(LEXTXT)+1 D
  1. . S LEXCHR=$E(LEXTXT,LEXEND)
  1. . I "~!@#$%&*()_+`-=[]{};'\:|,./?<> """[LEXCHR D
  1. . . S LEXWRD=$E(LEXTXT,LEXBEG,LEXEND-1),LEXBEG=LEXEND+1
  1. . . I $L(LEXWRD)>1,$L(LEXWRD)<31,'$$EWD(LEXWRD,LEXFLG) D
  1. . . . N LEXI S LEXI=$O(LEX(" "),-1)+1
  1. . . . S LEX(LEXI)=LEXWRD,LEX(0)=LEXI
  1. Q $G(LEX(0))
  1. EWD(X,Y) ; Exclude from Replacement Words
  1. N LEXW,LEXF,LEXO S LEXW=$G(X),LEXF=+($G(Y)),LEXO=0
  1. I LEXF=1 S:$D(^LEX(757.04,"ACTION",LEXW,"I")) LEXO=1
  1. I LEXF=2 S:$D(^LEX(757.04,"ACTION",LEXW,"L")) LEXO=1
  1. I LEXF=3 D
  1. . S:$D(^LEX(757.04,"ACTION",LEXW,"I")) LEXO=1
  1. . S:$D(^LEX(757.04,"ACTION",LEXW,"L")) LEXO=1
  1. I LEXF>0 S:$D(^LEX(757.04,"ACTION",LEXW,"B")) LEXO=1
  1. Q LEXO
  1. SIN(X) ; Singular
  1. N LEXTMP,LEXI,LEXPW,LEXPC,LEXNW,LEXNC,LEXT
  1. N LEXT S LEXT=$G(X) Q:$L(LEXT)'>4 "" Q:$E(LEXT,$L(LEXT))'="S" ""
  1. S (X,LEXTMP)=$E(LEXT,1,($L(LEXT)-1)) Q:$D(LEXIDX) X S X="",LEXTMP=$E(LEXT,1,($L(LEXT)-1))
  1. S LEXPW=$O(^LEX(757.01,"AWRD",LEXTMP),-1) S LEXNW=$O(^LEX(757.01,"AWRD",LEXTMP))
  1. S LEXPC="" I $E(LEXPW,$L(LEXTMP))=$E(LEXTMP,$L(LEXTMP)) S LEXPC=$E(LEXPW,($L(LEXTMP)+1))
  1. S LEXNC="" I $E(LEXNW,$L(LEXTMP))=$E(LEXTMP,$L(LEXTMP)) S LEXNC=$E(LEXNW,($L(LEXTMP)+1))
  1. S X="" I $L((LEXPC_LEXNC)),((LEXPC="S")!(LEXNC="S")) S X=LEXTMP
  1. I $L(LEXT)>4,$E(LEXT,$L(LEXT))="S",$E(LEXT,($L(LEXT)-1))'="S",$D(LEXLOOK) D
  1. . N LEXTMP S LEXTMP=$E(LEXT,1,($L(LEXT)-1))
  1. . I $L($G(LEXNW))>0,$L($G(LEXNW))=$L($G(LEXT)),$D(^LEX(757.01,"AWRD",LEXNW)) Q
  1. . S:$D(^LEX(757.01,"AWRD",LEXTMP)) X=LEXTMP
  1. Q X
  1. ST ; Show ^TMP global array
  1. N DA,LEXIDX,LEXLOOK,LEXLOW D ST^LEXTOKN2
  1. Q