- LEXXMC ;ISL/KER - Convert Text to Mix Case ;10/10/2017
- ;;2.0;Lexicon Utility;**103,114**;Sep 23, 1996;Build 1
- ;
- ; Global Variables
- ; ^LEX(757.07 SACC 1.3
- ;
- ; External References
- ; None
- ;
- ; Replaces Integrated Control Registration #5781 $$MIX^LEXXM(X)
- ; (released in LEX*2.0*80, Jun 17, 2014) which converts UPPERCASE
- ; to Mix Case Text.
- ;
- ; Old API New API
- ; $$MIX^LEXXM(X) $$MIX^LEXXMC(X)
- ; Hard Coded Rules Database of Rules
- ; Extremely hard to update Update in Quarterly patch
- ; Rules in LEXXM* Rules in ^LEX(757.07)
- ;
- ; The old API $$MIX^LEXXM will be re-directed to $$MIX^LEXXMC
- ;
- MIX(TEXT) ; Mixed Case Expression
- ;
- ; Input
- ;
- ; TEXT Text, any case (Required)
- ;
- ; Output
- ;
- ; $$MIX Text, Mixed Case
- ;
- N AAA,ABR,AFTER,AR,ARRAY,ARY,ASC,BEFORE,C,CAS,CC,CCTR,CH,CHR,COND,CT,CTL,CUR,DIFF,EXEC,EXP,FULL,HA,HN,I,L,LD,LEX,LEX2
- N LEXR1,LEXR2,LEXT,LEXW,ND,NPT,NXT,OIEN,ORG,OUT,P1,P2,PC,PPT,PRE,PS,PSN,REP,RP,RUL,RULE,S,SPC,ST,TA,TC,TEST,TIEN,TK
- N TKN,TOKEN,TR,TRUE,TXT,UEX,WI,WIT,WT,X,Y K:$D(TOKEN) RULE,FULL Q:'$L($G(TEXT)) ""
- S TEXT=$$DBLS($TR($G(TEXT),"""","'")),TEXT=$$CTL($G(TEXT)),TEXT=$$SPELL(TEXT),(ORG,EXP)=$$IEEG($G(TEXT))
- I '$L($G(EXP)) S TEXT=ORG Q $TR(TEXT,"""","'")
- ; Save Before Expression
- S BEFORE=ORG,UEX=$$UP(ORG)
- ; Parse
- K TA D PR(EXP,.TA)
- ; Loop through Words
- S TC=0 F S TC=$O(TA(TC)) Q:+TC'>0 D
- . N CUR,CTL,PRE,NXT,PPT,NPT,TIEN,TRUE S TRUE=0
- . ; Current Word
- . S CUR=$G(TA(TC)),CTL=$$UP(CUR) Q:'$L(CTL)
- . ; Previous Word
- . S PRE=$G(TA((TC-1)))
- . ; Next Word
- . S NXT=$G(TA((TC+1)))
- . ; Previous Punctuation
- . S PPT=$O(TA((TC-1),"B"," "),-1)
- . S PPT=$S(+PPT>0:$G(TA((TC-1),"B",+PPT)),1:"")
- . ; Special condition for the letter S and ' or (
- . S:CTL="S" PPT=$G(TA((TC-1),"B",1))
- . ; Next Punctuation
- . S NPT=$G(TA(TC,"B",1))
- . ; Token IEN
- . S TIEN=$O(^LEX(757.07,"B",CTL,0))
- . ; Token not found, use mask/mix case
- . I '$D(^LEX(757.07,"B",CTL))!(TIEN'>0) D Q
- . . D TOK S:+($G(TRUE))>0&($L($G(OUT))) TA(TC)=OUT S:+($G(TRUE))'>0 TA(TC)=$$MX(CUR)
- . D DSP1
- . I +($G(TRUE))'>0,+($G(TIEN))>0 D
- . . ; Loop through Rules
- . . N AAA,OIEN,OUT S OUT=CUR
- . . S (OIEN,TRUE)=0 F S OIEN=$O(^LEX(757.07,TIEN,1,OIEN)) Q:OIEN'>0 Q:TRUE>0 D Q:TRUE>0
- . . . Q:+($G(TRUE))>0 N COND,CCTR,CAS,SPC S CCTR=0
- . . . S CAS=$P($G(^LEX(757.07,+TIEN,1,+OIEN,0)),"^",2)
- . . . S SPC=$P($G(^LEX(757.07,+TIEN,1,+OIEN,0)),"^",3)
- . . . S:$G(CAS)="S" TA(TC,"S")=""
- . . . ; 1st Condition - Based on Expression
- . . . D EXP Q:+($G(TRUE))>0
- . . . ; 2nd Condition - Based on Previous Word
- . . . D PRE Q:+($G(TRUE))>0
- . . . ; 3rd Condition - Based on Next Word
- . . . D NXT Q:+($G(TRUE))>0
- . . . ; No Conditions
- . . . D NON Q:+($G(TRUE))>0
- . . . ; Token
- . . . D TOK Q:+($G(TRUE))>0
- . . ; Default Mix Case
- . . S:TRUE'>0&(OUT=CUR) OUT=$$MX(CUR)
- . . D DSP4("END")
- . . S TA(TC)=OUT
- ; Special Conditions - Pre-Assmebly
- D PREA
- ; Assemble After Expression
- D ASEM,DSP2
- S TEXT=$G(AFTER) S:'$L(TEXT) TEXT=ORG S TEXT=$$PS(TEXT)
- Q $TR(TEXT,"""","'")
- ;
- EXP ; Expression Rules
- ;
- ; Example: If an expression contains the words "OPERATING
- ; ROOM" then the word "OR" will be in uppercase.
- Q:'$L($G(CUR)) Q:'$L($G(CAS)) Q:'$L($G(SPC)) Q:+($G(TIEN))'>0 Q:+($G(OIEN))'>0 Q:'$L($G(EXP))
- N COND S COND=$G(^LEX(757.07,+($G(TIEN)),1,+($G(OIEN)),1)) S:$L(COND) CCTR=+($G(CCTR))+1
- I $L($G(EXP)),$L(COND) D Q:+($G(TRUE))>0
- . N EXEC,X S X=$$UP($G(EXP)) X COND S TRUE=$T
- . I +($G(TRUE))>0 S OUT=$$CAS($G(CUR),$G(CAS),$G(SPC))
- . D DSP3("EXP")
- Q
- ;
- PRE ; Previous Word Rules
- ;
- ; Example: If the previous word is numeric or "PER"
- ; then the word "OZ" will be in lower case.
- Q:'$L($G(CUR)) Q:'$L($G(CAS)) Q:'$L($G(SPC)) Q:+($G(TIEN))'>0 Q:+($G(OIEN))'>0 Q:'$L(($G(PRE)_$G(PPT)))
- N COND S COND=$G(^LEX(757.07,+($G(TIEN)),1,+($G(OIEN)),2)) S:$L(COND) CCTR=+($G(CCTR))+1
- I $L($G(PRE)),$L(COND) D Q:TRUE>0
- . N EXEC,X S X=$$UP($G(PRE)) X COND S TRUE=$T
- . I +($G(TRUE))>0 S OUT=$$CAS($G(CUR),$G(CAS),$G(SPC))
- . D DSP3("PRE")
- I $L($G(PPT)),$L(COND) D Q:TRUE>0
- . N EXEC,X S X=$G(PPT) X COND S TRUE=$T
- . I +($G(TRUE))>0 S OUT=$$CAS($G(CUR),$G(CAS),$G(SPC))
- . D DSP3("PPT")
- Q
- ;
- NXT ; Next Word Rules
- ;
- ; Example: If the next word contains "POSITIVE" or
- ; "NEGATIVE" then the word "ABL" will be
- ; in uppercase.
- Q:'$L($G(CUR)) Q:'$L($G(CAS)) Q:'$L($G(SPC)) Q:+($G(TIEN))'>0 Q:+($G(OIEN))'>0
- N COND S COND=$G(^LEX(757.07,+($G(TIEN)),1,+($G(OIEN)),3)) S:$L(COND) CCTR=+($G(CCTR))+1
- Q:'$L(($G(NXT)_$G(NPT))) I $L($G(NXT)),$L(COND) D Q:TRUE>0
- . N EXEC,X S X=$$UP($G(NXT)) X COND S TRUE=$T
- . I +($G(TRUE))>0 S OUT=$$CAS($G(CUR),$G(CAS),$G(SPC))
- . D DSP3("NXT")
- I $L($G(NPT)),$L(COND) D Q:TRUE>0
- . N EXEC,X S X=$G(NPT) X COND S TRUE=$T
- . I +($G(TRUE))>0 S OUT=$$CAS($G(CUR),$G(CAS),$G(SPC))
- . D DSP3("NPT")
- Q
- ;
- NON ; No Rules (default)
- ;
- ; Example: If the rules for the expression, the previous
- ; word and the next word fail (false) and there
- ; is a default case value then that case will
- ; be used.
- ;
- ; U UPPERCASE COPD
- ; L lower case between
- ; M Mixed Case Diabetes
- ; S Special Case IgE
- Q:+($G(TRUE))>0 Q:+($G(CCTR))>0 Q:'$L($G(CUR)) Q:'$L($G(CAS)) Q:'$L($G(SPC))
- N EXEC S OUT=$$CAS($G(CUR),$G(CAS),$G(SPC))
- S TRUE=1 D DSP3("NON")
- Q
- ;
- TOK ; Token/Word Rules
- ;
- ; Examples: If a word is an ordinal number (1st, 2nd, etc.)
- ; then the word will be in lower case.
- ;
- ; If a word is alpha numeric then the word will
- ; be in upper case.
- ;
- ; If a word is preceded or followed by a dash "-"
- ; then the word will be upper case.
- Q:+($G(TRUE))>0 Q:'$L($G(CUR))
- N AAA,CAS,COND,OIEN,SPC,TIEN,HA,HN,CH S (HA,HN)=0,AAA=$$RP("*",$L(CUR)) Q:AAA'["*"
- F CH=1:1:$L(CUR) S:$E(CUR,CH)?1A HA=1 S:$E(CUR,CH)?1N HN=1
- S TIEN=$O(^LEX(757.07,"B",AAA,0)) I TIEN'>0,HA>0,HN>0 S OUT=$$UP(CUR),TRUE=1 Q
- Q:TIEN'>0 S (TRUE,OIEN)=0
- F S OIEN=$O(^LEX(757.07,TIEN,1,OIEN)) Q:+OIEN'>0 Q:TRUE>0 D Q:TRUE>0
- . N COND,CAS,EXEC,SPC S CAS=$P($G(^LEX(757.07,+TIEN,1,+OIEN,0)),"^",2),SPC=$P($G(^LEX(757.07,+TIEN,1,+OIEN,0)),"^",3)
- . S COND=$G(^LEX(757.07,+TIEN,1,+OIEN,1)),X=$$UP(CUR)
- . I $L(COND) X COND S TRUE=$T
- . I TRUE>0 S OUT=$$CAS(CUR,CAS,SPC)
- . D DSP3("TOK")
- Q
- ; Displays used for testing Case Rules
- DSP1 ; Display Components
- Q:'$D(TEST) Q:$D(TOKEN) Q:$D(ARRAY) Q:'$D(FULL)
- W !!,"CUR: ",$G(CUR),!,"PRE: ",$G(PRE),!,"NXT: ",$G(NXT),!,"PPT: ",$G(PPT),!,"NPT: ",$G(NPT) N FULL,DIFF,ARRAY
- Q
- DSP2 ; Display Changes (Differences)
- Q:'$D(TEST) N EXEC I $D(FULL),$D(ARRAY) D
- . N AR S AR="TA(0)" F S AR=$Q(@AR) Q:'$L(AR)!($E(AR,1,2)'="TA") W AR,"=",@AR,!
- I '$D(DIFF),'$D(ARRAY) W !!,"Before: ",BEFORE,!,"After: ",AFTER
- I $D(DIFF),'$D(ARRAY),BEFORE'=AFTER W !!,"Before: ",BEFORE,!,"After: ",AFTER
- W:$D(ARRAY) !,AFTER N ARRAY,DIFF,FULL,TEST
- Q
- DSP3(X) ; Display Conditions #1
- Q:'$D(TEST) Q:'$D(RULE) Q:$D(TOKEN)
- W !!,"X: ",$G(X),!,"CUR: ",$G(CUR),!,"CAS: ",$G(CAS),!,"SPC: ",$G(SPC),!,"TRUE: ",$G(PPT),!,"OUT: ",$G(OUT),!
- N TEST,RULE,TOKEN
- Q
- DSP4(X) ; Display Conditions #2
- Q:'$D(TEST) Q:'$D(RULE) Q:$D(TOKEN) W !!,"X: ",$G(X),!,"TRUE: ",$G(PPT),!,"OUT: ",$G(OUT),!
- N TEST,RULE,TOKEN
- Q
- ;
- ; Spelling
- SPELL(X) ; Known Spelling Errors
- F Y="Pe-ripheral^Peripheral","us-ing^using","Intralu-minal^Intraluminal","Ap-proach^Approach","Endo-scopic^Endoscopic" S:$$SP(X,Y)>0 X=$$SW(X,Y)
- F Y="Technolo-gy^Technology","CR (E)St^CREST","CR(E)St^CREST" S:$$SP(X,Y)>0 X=$$SW(X,Y)
- Q X
- SP(X,Y) ; Contains Spelling Error
- Q:'$L($G(X)) 0 S Y=$P($G(Y),"^",1) Q:'$L($G(Y)) 0
- Q:$$UP^XLFSTR(X)[$$UP^XLFSTR(Y) 1
- Q 0
- SW(X,Y) ; Swap Spelling
- N TXT,RP,WT S TXT=$G(X),RP=$G(Y),WT=$P(RP,"^",2),RP=$P(RP,"^",1) S X=TXT Q:'$L(RP) X Q:'$L(WT) X
- S RP=$$UP^XLFSTR($E(RP,1))_$$LOW^XLFSTR($E(RP,2,$L(RP))) S WT=$$UP^XLFSTR($E(WT,1))_$$LOW^XLFSTR($E(WT,2,$L(WT)))
- F Q:TXT'[RP S TXT=$P(TXT,RP,1)_WT_$P(TXT,RP,2,4000)
- S RP=$$UP^XLFSTR(RP),WT=$$UP^XLFSTR(WT) F Q:TXT'[RP S TXT=$P(TXT,RP,1)_WT_$P(TXT,RP,2,4000)
- S RP=$$LOW^XLFSTR(RP),WT=$$LOW^XLFSTR(WT) F Q:TXT'[RP S TXT=$P(TXT,RP,1)_WT_$P(TXT,RP,2,4000)
- S X=TXT
- Q X
- ;
- ; Assembly
- PREA ; Pre-assembly
- N Y,TC S TC=0 F S TC=$O(TA(TC)) Q:+TC'>0 D
- . I $$UP($G(TA(TC)))="PRE" S:$G(TA(TC,"B",1))="-"&($E($G(TA((TC+1))),1)?1U) TA(TC)=$$MX($G(TA(TC)))
- Q:'$L($G(UEX)) F Y="ACTINIUM^Actinium","ALUMINUM^Aluminum","ANTIMONY^Antimony","ARSENIC^Arsenic","BARIUM^Barium","BERYLLIUM^Beryllium","BISMUTH^Bismuth" D:UEX[$P(Y,"^",1) PRES(Y)
- F Y="BROMINE^Bromine","BUDESONIDE^Budesonide","CADMIUM^Cadmium","CALCIUM^Calcium","CARBON^Carbon","CESIUM^Cesium","CHLORINE^Chlorine" D:UEX[$P(Y,"^",1) PRES(Y)
- F Y="CHROMIUM^Chromium","COBALT^Cobalt","COPPER^Copper","GALLIUM^Gallium","GERMANIUM^Germanium","HAFNIUM^Hafnium","INDIUM^Indium" D:UEX[$P(Y,"^",1) PRES(Y)
- F Y="IODINE^Iodine","IRIDIUM^Iridium","KRYPTON^Krypton","LEAD^Lead","LUTETIUM^Lutetium","MANGANESE^Manganese","MERCURY^Mercury","NICKEL^Nickel" D:UEX[$P(Y,"^",1) PRES(Y)
- F Y="OSMIUM^Osmium","OXYGEN^Oxygen","PLATINUM^Platinum","POTASSIUM^Potassium","RADON^Radon","RHODIUM^Rhodium","RUBIDIUM^Rubidium","RUTHENIUM^Ruthenium" D:UEX[$P(Y,"^",1) PRES(Y)
- F Y="SELENIUM^Selenium","SILICON^Silicon","SILVER^Silver","SODIUM^Sodium","STRONTIUM^Strontium","SULFUR^Sulfur","TANTALUM^Tantalum","THALLIUM^Thallium" D:UEX[$P(Y,"^",1) PRES(Y)
- F Y="THORIUM^Thorium","TITANIUM^Titanium","TUNGSTEN^Tungsten","URANIUM^Uranium","VANADIUM^Vanadium","XENON^Xenon","YTTRIUM^Yttrium","ZIRCONIUM^Zirconium" D:UEX[$P(Y,"^",1) PRES(Y)
- Q
- PRES(X) ; Pre-assembly Swap text
- N RP,WI,TC S RP=$P($G(X),"^",1),WI=$P($G(X),"^",2) Q:'$L(RP) S TC=0 F S TC=$O(TA(TC)) Q:+TC'>0 D
- . N X S X=$G(TA(TC)) Q:X'[RP Q:$L(X)'>3 F Q:X'[RP S X=$P(X,RP,1)_WI_$P(X,RP,2,4000)
- . S TA(TC)=X
- Q
- ASEM ; Final Assembly
- S AFTER="" S TC=0 F S TC=$O(TA(TC)) Q:+TC'>0 D
- . S AFTER=AFTER_$G(TA(TC))
- . N CC S CC=0 F S CC=$O(TA(TC,"B",CC)) Q:+CC'>0 D
- . . S AFTER=AFTER_$G(TA(TC,"B",CC))
- S:'$D(TA(1,"S")) AFTER=$$UP($E(AFTER,1))_$E(AFTER,2,$L(AFTER))
- F Y="CR (E)St^CR(E)ST","CR (E)ST^CREST","CR(E)ST^CREST"," ^ ","Vertebra (E)^Vertebra(e)" I AFTER[$P(Y,"^",1) D
- . N RP,WI S RP=$P($G(Y),"^",1),WI=$P($G(Y),"^",2) Q:'$L(RP)
- . F Q:AFTER'[RP S AFTER=$P(AFTER,RP,1)_WI_$P(AFTER,RP,2,4000)
- I $E(AFTER,$L(AFTER))="a",$E(AFTER,($L(AFTER)-1))=" " D
- . S AFTER=$E(AFTER,1,($L(AFTER)-2))_" A"
- Q
- ;
- ; Miscellaneous
- IEEG(X) ; I.E. and E.G.
- S X=$G(X) N TK F TK="IE^ie","I.E.^ie","I.E^ie","I.e.^ie","I.e^ie","i.e.^ie","i.e^ie","E.G.^eg","E.G^eg","E.g.^eg","E.g^eg","e.g.^eg","e.g^eg" D
- . N RP,WI S RP=$P(TK,"^",1),WI=$P(TK,"^",2) F Q:X'[RP S X=$P(X,RP,1)_WI_$P(X,RP,2,4000)
- Q X
- AABR(X) ; Abbreviation
- N TIEN,OIEN,ABR,TKN S TIEN=+($G(X)),ABR="",OIEN=0
- S TKN=$P($G(^LEX(757.07,+TIEN,0)),"^",1) Q:$E(TKN,1)="*" 0 Q:$E(TKN,1)?1N 0 Q:$L(TKN)'>1 0
- F S OIEN=$O(^LEX(757.07,+TIEN,1,OIEN)) Q:+OIEN'>0 D
- . N ND,CAS,RUL S ND=$G(^LEX(757.07,+TIEN,1,+OIEN,0)),CAS=$P(ND,"^",2) Q:CAS="L"
- . S RUL=$G(^LEX(757.07,+TIEN,1,+OIEN,1)) Q:$L(RUL)
- . S RUL=$G(^LEX(757.07,+TIEN,1,+OIEN,2)) Q:$L(RUL)
- . S RUL=$G(^LEX(757.07,+TIEN,1,+OIEN,3)) Q:$L(RUL)
- . S ABR=ABR_CAS
- S X=0 S:ABR["U"!(ABR["S") X=1
- Q X
- PR(X,ARY) ; Parse Expression into Tokens
- N CTL,EXP,CUR,PRE,TC,CT,OUT,P1,ST,P2,PC S EXP=$G(X) K ARY
- S CTL="^ ^!^@^#^$^%^^^&^*^(^)^_^+^-^=^{^}^|^[^]^\^:^""^;^'^<^>^?^,^.^/^"
- S (CUR,PRE)="",TC=1,CT=0,(OUT,P1,ST,P2)="" F PC=1:1:$L(EXP) D
- . N CHR S (CUR,CHR)=$E(EXP,PC)
- . I CTL'[("^"_CHR_"^") D Q
- . . S ARY(+TC)=$G(ARY(+TC))_CHR S PRE=CUR
- . I CTL[("^"_CHR_"^") D Q
- . . N CC,NXT S CC=$O(ARY(+TC,"B"," "),-1)+1
- . . S ARY(+TC,"B",CC)=CHR
- . . S NXT=$E(EXP,(PC+1))
- . . I $L(NXT),CTL'[("^"_NXT_"^") S TC=TC+1
- . . S PRE=CUR
- S TC=0 F S TC=$O(ARY(TC)) Q:+TC'>0 D
- . N TKN S TKN=$G(ARY(TC)) S:$L(TKN) ARY(TC,"O")=TKN
- Q
- ;
- CAS(X,Y,S) ; Case
- S X=$G(X),Y=$G(Y),S=$G(S)
- S:Y="L" X=$$LO(X) S:Y="U" X=$$UP(X) S:Y="M" X=$$MX(X) S:Y="S" X=S
- Q X
- MX(X) ; Mix Case
- Q $$UP($E($G(X),1))_$$LO($E($G(X),2,$L($G(X))))
- PS(X) ; Period Space
- S X=$G(X) Q:$D(A5ALEX) X I X[". " F I=1:1:($L(X,". ")-1) D
- . N LD,TR,PS S PS=". ",LD=$P(X,PS,1,I),TR=$$TM($P(X,PS,(I+1),$L(X)))
- . S X=LD_". "_$$UP($E($G(TR),1))_$E($G(TR),2,$L($G(TR)))
- N A5ALEX
- Q X
- UP(X) ; Uppercase
- Q $TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
- LO(X) ; Lower Case
- Q $TR(X,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")
- TM(X,Y) ; Trim Character Y - Default " "
- S X=$G(X) Q:X="" X S Y=$G(Y) S:'$L(Y) Y=" " F Q:$E(X,1)'=Y S X=$E(X,2,$L(X))
- F Q:$E(X,$L(X))'=Y S X=$E(X,1,($L(X)-1))
- Q X
- RP(X,Y) ; Repeat
- N C,L S C=$G(X),L=+($G(Y)) Q:$L(C)*L>245 "" S X="",$P(X,C,$G(L)+1)=""
- Q X
- CTL(X) ; Remove/Replace Control Characters
- S X=$G(X) Q:'$L(X) "" N OUT,PSN,CHR,ASC,REP,WIT
- ; Curved Apostrophe
- F CHR=145,146 S REP=$C(CHR),WIT="'" S X=$$CTLR(X,REP,WIT)
- ; Accented letter e
- F CHR=130,136,137,138 S REP=$C(CHR),WIT="e" S X=$$CTLR(X,REP,WIT)
- ; Accented letter c
- F CHR=128,135 S REP=$C(CHR),WIT="c" S X=$$CTLR(X,REP,WIT)
- ; Accented letter u
- F CHR=129,151,163 S REP=$C(CHR),WIT="u" S X=$$CTLR(X,REP,WIT)
- ; Accented letter a
- F CHR=131,132,133,134,143,145,160,166 S REP=$C(CHR),WIT="a" S X=$$CTLR(X,REP,WIT)
- ; Accented letter i
- F CHR=139,140,141 S REP=$C(CHR),WIT="i" S X=$$CTLR(X,REP,WIT)
- ; Accented letter o
- F CHR=147,148,149,153,162 S REP=$C(CHR),WIT="o" S X=$$CTLR(X,REP,WIT)
- ; En dash
- S REP=$C(150),WIT="o" S X=$$CTLR(X,REP,WIT)
- ; Inverted exclamation mark
- S REP=$C(161),WIT="a" S X=$$CTLR(X,REP,WIT)
- ; Currency sign
- S REP=$C(164),WIT="a" S X=$$CTLR(X,REP,WIT)
- ; Section Sing (double S)
- S REP=$C(167),WIT="c" S X=$$CTLR(X,REP,WIT)
- ; Spacing diaeresis - umlaut
- S REP=$C(168),WIT="e" S X=$$CTLR(X,REP,WIT)
- ; Copyright sign
- S REP=$C(169),WIT="e" S X=$$CTLR(X,REP,WIT)
- ; Left double angle quotes
- S REP=$C(171),WIT="e" S X=$$CTLR(X,REP,WIT)
- ; Pilcrow sign - paragraph sign
- S REP=$C(182),WIT="o" S X=$$CTLR(X,REP,WIT)
- ; Spacing cedilla
- S REP=$C(184),WIT="o" S X=$$CTLR(X,REP,WIT)
- ; One Fourth Fraction
- S REP=$C(188),WIT="u" S X=$$CTLR(X,REP,WIT)
- ; Small letter a with circumflex
- S REP=$C(226),WIT="o" S X=$$CTLR(X,REP,WIT)
- ; HTML En Dash
- S REP=$C(8211),WIT="o" S X=$$CTLR(X,REP,WIT)
- ; Extended ASCII Vowels
- S REP=$C(142),WIT="Z" S X=$$CTLR(X,REP,WIT)
- S REP=$C(156),WIT="oe" S X=$$CTLR(X,REP,WIT)
- S REP=$C(158),WIT="z" S X=$$CTLR(X,REP,WIT)
- S REP=$C(159),WIT="Y" S X=$$CTLR(X,REP,WIT)
- F CHR=192,193,194,195,196,197 S REP=$C(CHR),WIT="A" S X=$$CTLR(X,REP,WIT)
- S REP=$C(198),WIT="AE" S X=$$CTLR(X,REP,WIT)
- S REP=$C(199),WIT="C" S X=$$CTLR(X,REP,WIT)
- F CHR=200,201,202,203 S REP=$C(CHR),WIT="E" S X=$$CTLR(X,REP,WIT)
- F CHR=204,205,206,207 S REP=$C(CHR),WIT="I" S X=$$CTLR(X,REP,WIT)
- S REP=$C(208),WIT="ETH" S X=$$CTLR(X,REP,WIT)
- S REP=$C(209),WIT="N" S X=$$CTLR(X,REP,WIT)
- F CHR=210,211,212,213,214,216 S REP=$C(CHR),WIT="O" S X=$$CTLR(X,REP,WIT)
- F CHR=217,218,219,220 S REP=$C(CHR),WIT="U" S X=$$CTLR(X,REP,WIT)
- S REP=$C(221),WIT="Y" S X=$$CTLR(X,REP,WIT)
- F CHR=154,223 S REP=$C(CHR),WIT="s" S X=$$CTLR(X,REP,WIT)
- F CHR=224,225,226,227,228,229 S REP=$C(CHR),WIT="a" S X=$$CTLR(X,REP,WIT)
- S REP=$C(230),WIT="ae" S X=$$CTLR(X,REP,WIT)
- S REP=$C(231),WIT="c" S X=$$CTLR(X,REP,WIT)
- F CHR=232,233,234,235 S REP=$C(CHR),WIT="e" S X=$$CTLR(X,REP,WIT)
- F CHR=236,237,238,239 S REP=$C(CHR),WIT="i" S X=$$CTLR(X,REP,WIT)
- S REP=$C(240),WIT="eth" S X=$$CTLR(X,REP,WIT)
- S REP=$C(241),WIT="n" S X=$$CTLR(X,REP,WIT)
- F CHR=242,243,244,245,246,248 S REP=$C(CHR),WIT="o" S X=$$CTLR(X,REP,WIT)
- F CHR=249,250,251,252 S REP=$C(CHR),WIT="u" S X=$$CTLR(X,REP,WIT)
- F CHR=253,255 S REP=$C(CHR),WIT="y" S X=$$CTLR(X,REP,WIT)
- ; All others (remove)
- S OUT="" F PSN=1:1:$L(X) S CHR=$E(X,PSN),ASC=$A(CHR) S:ASC>31&(ASC<127) OUT=OUT_CHR
- ; Uppercase leading character
- S X=$$UP^XLFSTR($E(OUT,1))_$E(OUT,2,$L(OUT))
- Q X
- DBLS(X) ; Double Space/Special Characters
- S X=$G(X) Q:(X'[" ")&(X'["^") X
- F S X=$P(X," ",1)_" "_$P(X," ",2,300) Q:X'[" "
- F S X=$P(X,"^",1)_" "_$P(X,"^",2,300) Q:X'["^"
- F Q:$E(X,1)'=" " S X=$E(X,2,$L(X))
- F Q:$E(X,$L(X))'=" " S X=$E(X,1,($L(X)-1))
- Q X
- CTLR(LEX,X,Y) ; Control Character Replace
- N LEXT,LEXR1,LEXR2,LEX2,LEXW S LEXT=$G(LEX) Q:'$L(LEXT) "" S LEXR1=$G(X) S X=LEXT Q:'$L(LEXR1) X Q:LEXT'[LEXR1 X
- S LEXW=$G(Y),LEXR2=$C(195)_LEXR1
- I LEXT[LEXR2 F Q:LEXT'[LEXR2 S LEXT=$P(LEXT,LEXR2,1)_LEXW_$P(LEXT,LEXR2,2,4000)
- I LEXT[LEXR1 F Q:LEXT'[LEXR1 S LEXT=$P(LEXT,LEXR1,1)_LEXW_$P(LEXT,LEXR1,2,4000)
- S X=LEXT
- Q X
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HLEXXMC 17372 printed Feb 18, 2025@23:36:33 Page 2
- LEXXMC ;ISL/KER - Convert Text to Mix Case ;10/10/2017
- +1 ;;2.0;Lexicon Utility;**103,114**;Sep 23, 1996;Build 1
- +2 ;
- +3 ; Global Variables
- +4 ; ^LEX(757.07 SACC 1.3
- +5 ;
- +6 ; External References
- +7 ; None
- +8 ;
- +9 ; Replaces Integrated Control Registration #5781 $$MIX^LEXXM(X)
- +10 ; (released in LEX*2.0*80, Jun 17, 2014) which converts UPPERCASE
- +11 ; to Mix Case Text.
- +12 ;
- +13 ; Old API New API
- +14 ; $$MIX^LEXXM(X) $$MIX^LEXXMC(X)
- +15 ; Hard Coded Rules Database of Rules
- +16 ; Extremely hard to update Update in Quarterly patch
- +17 ; Rules in LEXXM* Rules in ^LEX(757.07)
- +18 ;
- +19 ; The old API $$MIX^LEXXM will be re-directed to $$MIX^LEXXMC
- +20 ;
- MIX(TEXT) ; Mixed Case Expression
- +1 ;
- +2 ; Input
- +3 ;
- +4 ; TEXT Text, any case (Required)
- +5 ;
- +6 ; Output
- +7 ;
- +8 ; $$MIX Text, Mixed Case
- +9 ;
- +10 NEW AAA,ABR,AFTER,AR,ARRAY,ARY,ASC,BEFORE,C,CAS,CC,CCTR,CH,CHR,COND,CT,CTL,CUR,DIFF,EXEC,EXP,FULL,HA,HN,I,L,LD,LEX,LEX2
- +11 NEW LEXR1,LEXR2,LEXT,LEXW,ND,NPT,NXT,OIEN,ORG,OUT,P1,P2,PC,PPT,PRE,PS,PSN,REP,RP,RUL,RULE,S,SPC,ST,TA,TC,TEST,TIEN,TK
- +12 NEW TKN,TOKEN,TR,TRUE,TXT,UEX,WI,WIT,WT,X,Y
- if $DATA(TOKEN)
- KILL RULE,FULL
- if '$LENGTH($GET(TEXT))
- QUIT ""
- +13 SET TEXT=$$DBLS($TRANSLATE($GET(TEXT),"""","'"))
- SET TEXT=$$CTL($GET(TEXT))
- SET TEXT=$$SPELL(TEXT)
- SET (ORG,EXP)=$$IEEG($GET(TEXT))
- +14 IF '$LENGTH($GET(EXP))
- SET TEXT=ORG
- QUIT $TRANSLATE(TEXT,"""","'")
- +15 ; Save Before Expression
- +16 SET BEFORE=ORG
- SET UEX=$$UP(ORG)
- +17 ; Parse
- +18 KILL TA
- DO PR(EXP,.TA)
- +19 ; Loop through Words
- +20 SET TC=0
- FOR
- SET TC=$ORDER(TA(TC))
- if +TC'>0
- QUIT
- Begin DoDot:1
- +21 NEW CUR,CTL,PRE,NXT,PPT,NPT,TIEN,TRUE
- SET TRUE=0
- +22 ; Current Word
- +23 SET CUR=$GET(TA(TC))
- SET CTL=$$UP(CUR)
- if '$LENGTH(CTL)
- QUIT
- +24 ; Previous Word
- +25 SET PRE=$GET(TA((TC-1)))
- +26 ; Next Word
- +27 SET NXT=$GET(TA((TC+1)))
- +28 ; Previous Punctuation
- +29 SET PPT=$ORDER(TA((TC-1),"B"," "),-1)
- +30 SET PPT=$SELECT(+PPT>0:$GET(TA((TC-1),"B",+PPT)),1:"")
- +31 ; Special condition for the letter S and ' or (
- +32 if CTL="S"
- SET PPT=$GET(TA((TC-1),"B",1))
- +33 ; Next Punctuation
- +34 SET NPT=$GET(TA(TC,"B",1))
- +35 ; Token IEN
- +36 SET TIEN=$ORDER(^LEX(757.07,"B",CTL,0))
- +37 ; Token not found, use mask/mix case
- +38 IF '$DATA(^LEX(757.07,"B",CTL))!(TIEN'>0)
- Begin DoDot:2
- +39 DO TOK
- if +($GET(TRUE))>0&($LENGTH($GET(OUT)))
- SET TA(TC)=OUT
- if +($GET(TRUE))'>0
- SET TA(TC)=$$MX(CUR)
- End DoDot:2
- QUIT
- +40 DO DSP1
- +41 IF +($GET(TRUE))'>0
- IF +($GET(TIEN))>0
- Begin DoDot:2
- +42 ; Loop through Rules
- +43 NEW AAA,OIEN,OUT
- SET OUT=CUR
- +44 SET (OIEN,TRUE)=0
- FOR
- SET OIEN=$ORDER(^LEX(757.07,TIEN,1,OIEN))
- if OIEN'>0
- QUIT
- if TRUE>0
- QUIT
- Begin DoDot:3
- +45 if +($GET(TRUE))>0
- QUIT
- NEW COND,CCTR,CAS,SPC
- SET CCTR=0
- +46 SET CAS=$PIECE($GET(^LEX(757.07,+TIEN,1,+OIEN,0)),"^",2)
- +47 SET SPC=$PIECE($GET(^LEX(757.07,+TIEN,1,+OIEN,0)),"^",3)
- +48 if $GET(CAS)="S"
- SET TA(TC,"S")=""
- +49 ; 1st Condition - Based on Expression
- +50 DO EXP
- if +($GET(TRUE))>0
- QUIT
- +51 ; 2nd Condition - Based on Previous Word
- +52 DO PRE
- if +($GET(TRUE))>0
- QUIT
- +53 ; 3rd Condition - Based on Next Word
- +54 DO NXT
- if +($GET(TRUE))>0
- QUIT
- +55 ; No Conditions
- +56 DO NON
- if +($GET(TRUE))>0
- QUIT
- +57 ; Token
- +58 DO TOK
- if +($GET(TRUE))>0
- QUIT
- End DoDot:3
- if TRUE>0
- QUIT
- +59 ; Default Mix Case
- +60 if TRUE'>0&(OUT=CUR)
- SET OUT=$$MX(CUR)
- +61 DO DSP4("END")
- +62 SET TA(TC)=OUT
- End DoDot:2
- End DoDot:1
- +63 ; Special Conditions - Pre-Assmebly
- +64 DO PREA
- +65 ; Assemble After Expression
- +66 DO ASEM
- DO DSP2
- +67 SET TEXT=$GET(AFTER)
- if '$LENGTH(TEXT)
- SET TEXT=ORG
- SET TEXT=$$PS(TEXT)
- +68 QUIT $TRANSLATE(TEXT,"""","'")
- +69 ;
- EXP ; Expression Rules
- +1 ;
- +2 ; Example: If an expression contains the words "OPERATING
- +3 ; ROOM" then the word "OR" will be in uppercase.
- +4 if '$LENGTH($GET(CUR))
- QUIT
- if '$LENGTH($GET(CAS))
- QUIT
- if '$LENGTH($GET(SPC))
- QUIT
- if +($GET(TIEN))'>0
- QUIT
- if +($GET(OIEN))'>0
- QUIT
- if '$LENGTH($GET(EXP))
- QUIT
- +5 NEW COND
- SET COND=$GET(^LEX(757.07,+($GET(TIEN)),1,+($GET(OIEN)),1))
- if $LENGTH(COND)
- SET CCTR=+($GET(CCTR))+1
- +6 IF $LENGTH($GET(EXP))
- IF $LENGTH(COND)
- Begin DoDot:1
- +7 NEW EXEC,X
- SET X=$$UP($GET(EXP))
- XECUTE COND
- SET TRUE=$TEST
- +8 IF +($GET(TRUE))>0
- SET OUT=$$CAS($GET(CUR),$GET(CAS),$GET(SPC))
- +9 DO DSP3("EXP")
- End DoDot:1
- if +($GET(TRUE))>0
- QUIT
- +10 QUIT
- +11 ;
- PRE ; Previous Word Rules
- +1 ;
- +2 ; Example: If the previous word is numeric or "PER"
- +3 ; then the word "OZ" will be in lower case.
- +4 if '$LENGTH($GET(CUR))
- QUIT
- if '$LENGTH($GET(CAS))
- QUIT
- if '$LENGTH($GET(SPC))
- QUIT
- if +($GET(TIEN))'>0
- QUIT
- if +($GET(OIEN))'>0
- QUIT
- if '$LENGTH(($GET(PRE)_$GET(PPT)))
- QUIT
- +5 NEW COND
- SET COND=$GET(^LEX(757.07,+($GET(TIEN)),1,+($GET(OIEN)),2))
- if $LENGTH(COND)
- SET CCTR=+($GET(CCTR))+1
- +6 IF $LENGTH($GET(PRE))
- IF $LENGTH(COND)
- Begin DoDot:1
- +7 NEW EXEC,X
- SET X=$$UP($GET(PRE))
- XECUTE COND
- SET TRUE=$TEST
- +8 IF +($GET(TRUE))>0
- SET OUT=$$CAS($GET(CUR),$GET(CAS),$GET(SPC))
- +9 DO DSP3("PRE")
- End DoDot:1
- if TRUE>0
- QUIT
- +10 IF $LENGTH($GET(PPT))
- IF $LENGTH(COND)
- Begin DoDot:1
- +11 NEW EXEC,X
- SET X=$GET(PPT)
- XECUTE COND
- SET TRUE=$TEST
- +12 IF +($GET(TRUE))>0
- SET OUT=$$CAS($GET(CUR),$GET(CAS),$GET(SPC))
- +13 DO DSP3("PPT")
- End DoDot:1
- if TRUE>0
- QUIT
- +14 QUIT
- +15 ;
- NXT ; Next Word Rules
- +1 ;
- +2 ; Example: If the next word contains "POSITIVE" or
- +3 ; "NEGATIVE" then the word "ABL" will be
- +4 ; in uppercase.
- +5 if '$LENGTH($GET(CUR))
- QUIT
- if '$LENGTH($GET(CAS))
- QUIT
- if '$LENGTH($GET(SPC))
- QUIT
- if +($GET(TIEN))'>0
- QUIT
- if +($GET(OIEN))'>0
- QUIT
- +6 NEW COND
- SET COND=$GET(^LEX(757.07,+($GET(TIEN)),1,+($GET(OIEN)),3))
- if $LENGTH(COND)
- SET CCTR=+($GET(CCTR))+1
- +7 if '$LENGTH(($GET(NXT)_$GET(NPT)))
- QUIT
- IF $LENGTH($GET(NXT))
- IF $LENGTH(COND)
- Begin DoDot:1
- +8 NEW EXEC,X
- SET X=$$UP($GET(NXT))
- XECUTE COND
- SET TRUE=$TEST
- +9 IF +($GET(TRUE))>0
- SET OUT=$$CAS($GET(CUR),$GET(CAS),$GET(SPC))
- +10 DO DSP3("NXT")
- End DoDot:1
- if TRUE>0
- QUIT
- +11 IF $LENGTH($GET(NPT))
- IF $LENGTH(COND)
- Begin DoDot:1
- +12 NEW EXEC,X
- SET X=$GET(NPT)
- XECUTE COND
- SET TRUE=$TEST
- +13 IF +($GET(TRUE))>0
- SET OUT=$$CAS($GET(CUR),$GET(CAS),$GET(SPC))
- +14 DO DSP3("NPT")
- End DoDot:1
- if TRUE>0
- QUIT
- +15 QUIT
- +16 ;
- NON ; No Rules (default)
- +1 ;
- +2 ; Example: If the rules for the expression, the previous
- +3 ; word and the next word fail (false) and there
- +4 ; is a default case value then that case will
- +5 ; be used.
- +6 ;
- +7 ; U UPPERCASE COPD
- +8 ; L lower case between
- +9 ; M Mixed Case Diabetes
- +10 ; S Special Case IgE
- +11 if +($GET(TRUE))>0
- QUIT
- if +($GET(CCTR))>0
- QUIT
- if '$LENGTH($GET(CUR))
- QUIT
- if '$LENGTH($GET(CAS))
- QUIT
- if '$LENGTH($GET(SPC))
- QUIT
- +12 NEW EXEC
- SET OUT=$$CAS($GET(CUR),$GET(CAS),$GET(SPC))
- +13 SET TRUE=1
- DO DSP3("NON")
- +14 QUIT
- +15 ;
- TOK ; Token/Word Rules
- +1 ;
- +2 ; Examples: If a word is an ordinal number (1st, 2nd, etc.)
- +3 ; then the word will be in lower case.
- +4 ;
- +5 ; If a word is alpha numeric then the word will
- +6 ; be in upper case.
- +7 ;
- +8 ; If a word is preceded or followed by a dash "-"
- +9 ; then the word will be upper case.
- +10 if +($GET(TRUE))>0
- QUIT
- if '$LENGTH($GET(CUR))
- QUIT
- +11 NEW AAA,CAS,COND,OIEN,SPC,TIEN,HA,HN,CH
- SET (HA,HN)=0
- SET AAA=$$RP("*",$LENGTH(CUR))
- if AAA'["*"
- QUIT
- +12 FOR CH=1:1:$LENGTH(CUR)
- if $EXTRACT(CUR,CH)?1A
- SET HA=1
- if $EXTRACT(CUR,CH)?1N
- SET HN=1
- +13 SET TIEN=$ORDER(^LEX(757.07,"B",AAA,0))
- IF TIEN'>0
- IF HA>0
- IF HN>0
- SET OUT=$$UP(CUR)
- SET TRUE=1
- QUIT
- +14 if TIEN'>0
- QUIT
- SET (TRUE,OIEN)=0
- +15 FOR
- SET OIEN=$ORDER(^LEX(757.07,TIEN,1,OIEN))
- if +OIEN'>0
- QUIT
- if TRUE>0
- QUIT
- Begin DoDot:1
- +16 NEW COND,CAS,EXEC,SPC
- SET CAS=$PIECE($GET(^LEX(757.07,+TIEN,1,+OIEN,0)),"^",2)
- SET SPC=$PIECE($GET(^LEX(757.07,+TIEN,1,+OIEN,0)),"^",3)
- +17 SET COND=$GET(^LEX(757.07,+TIEN,1,+OIEN,1))
- SET X=$$UP(CUR)
- +18 IF $LENGTH(COND)
- XECUTE COND
- SET TRUE=$TEST
- +19 IF TRUE>0
- SET OUT=$$CAS(CUR,CAS,SPC)
- +20 DO DSP3("TOK")
- End DoDot:1
- if TRUE>0
- QUIT
- +21 QUIT
- +22 ; Displays used for testing Case Rules
- DSP1 ; Display Components
- +1 if '$DATA(TEST)
- QUIT
- if $DATA(TOKEN)
- QUIT
- if $DATA(ARRAY)
- QUIT
- if '$DATA(FULL)
- QUIT
- +2 WRITE !!,"CUR: ",$GET(CUR),!,"PRE: ",$GET(PRE),!,"NXT: ",$GET(NXT),!,"PPT: ",$GET(PPT),!,"NPT: ",$GET(NPT)
- NEW FULL,DIFF,ARRAY
- +3 QUIT
- DSP2 ; Display Changes (Differences)
- +1 if '$DATA(TEST)
- QUIT
- NEW EXEC
- IF $DATA(FULL)
- IF $DATA(ARRAY)
- Begin DoDot:1
- +2 NEW AR
- SET AR="TA(0)"
- FOR
- SET AR=$QUERY(@AR)
- if '$LENGTH(AR)!($EXTRACT(AR,1,2)'="TA")
- QUIT
- WRITE AR,"=",@AR,!
- End DoDot:1
- +3 IF '$DATA(DIFF)
- IF '$DATA(ARRAY)
- WRITE !!,"Before: ",BEFORE,!,"After: ",AFTER
- +4 IF $DATA(DIFF)
- IF '$DATA(ARRAY)
- IF BEFORE'=AFTER
- WRITE !!,"Before: ",BEFORE,!,"After: ",AFTER
- +5 if $DATA(ARRAY)
- WRITE !,AFTER
- NEW ARRAY,DIFF,FULL,TEST
- +6 QUIT
- DSP3(X) ; Display Conditions #1
- +1 if '$DATA(TEST)
- QUIT
- if '$DATA(RULE)
- QUIT
- if $DATA(TOKEN)
- QUIT
- +2 WRITE !!,"X: ",$GET(X),!,"CUR: ",$GET(CUR),!,"CAS: ",$GET(CAS),!,"SPC: ",$GET(SPC),!,"TRUE: ",$GET(PPT),!,"OUT: ",$GET(OUT),!
- +3 NEW TEST,RULE,TOKEN
- +4 QUIT
- DSP4(X) ; Display Conditions #2
- +1 if '$DATA(TEST)
- QUIT
- if '$DATA(RULE)
- QUIT
- if $DATA(TOKEN)
- QUIT
- WRITE !!,"X: ",$GET(X),!,"TRUE: ",$GET(PPT),!,"OUT: ",$GET(OUT),!
- +2 NEW TEST,RULE,TOKEN
- +3 QUIT
- +4 ;
- +5 ; Spelling
- SPELL(X) ; Known Spelling Errors
- +1 FOR Y="Pe-ripheral^Peripheral","us-ing^using","Intralu-minal^Intraluminal","Ap-proach^Approach","Endo-scopic^Endoscopic"
- if $$SP(X,Y)>0
- SET X=$$SW(X,Y)
- +2 FOR Y="Technolo-gy^Technology","CR (E)St^CREST","CR(E)St^CREST"
- if $$SP(X,Y)>0
- SET X=$$SW(X,Y)
- +3 QUIT X
- SP(X,Y) ; Contains Spelling Error
- +1 if '$LENGTH($GET(X))
- QUIT 0
- SET Y=$PIECE($GET(Y),"^",1)
- if '$LENGTH($GET(Y))
- QUIT 0
- +2 if $$UP^XLFSTR(X)[$$UP^XLFSTR(Y)
- QUIT 1
- +3 QUIT 0
- SW(X,Y) ; Swap Spelling
- +1 NEW TXT,RP,WT
- SET TXT=$GET(X)
- SET RP=$GET(Y)
- SET WT=$PIECE(RP,"^",2)
- SET RP=$PIECE(RP,"^",1)
- SET X=TXT
- if '$LENGTH(RP)
- QUIT X
- if '$LENGTH(WT)
- QUIT X
- +2 SET RP=$$UP^XLFSTR($EXTRACT(RP,1))_$$LOW^XLFSTR($EXTRACT(RP,2,$LENGTH(RP)))
- SET WT=$$UP^XLFSTR($EXTRACT(WT,1))_$$LOW^XLFSTR($EXTRACT(WT,2,$LENGTH(WT)))
- +3 FOR
- if TXT'[RP
- QUIT
- SET TXT=$PIECE(TXT,RP,1)_WT_$PIECE(TXT,RP,2,4000)
- +4 SET RP=$$UP^XLFSTR(RP)
- SET WT=$$UP^XLFSTR(WT)
- FOR
- if TXT'[RP
- QUIT
- SET TXT=$PIECE(TXT,RP,1)_WT_$PIECE(TXT,RP,2,4000)
- +5 SET RP=$$LOW^XLFSTR(RP)
- SET WT=$$LOW^XLFSTR(WT)
- FOR
- if TXT'[RP
- QUIT
- SET TXT=$PIECE(TXT,RP,1)_WT_$PIECE(TXT,RP,2,4000)
- +6 SET X=TXT
- +7 QUIT X
- +8 ;
- +9 ; Assembly
- PREA ; Pre-assembly
- +1 NEW Y,TC
- SET TC=0
- FOR
- SET TC=$ORDER(TA(TC))
- if +TC'>0
- QUIT
- Begin DoDot:1
- +2 IF $$UP($GET(TA(TC)))="PRE"
- if $GET(TA(TC,"B",1))="-"&($EXTRACT($GET(TA((TC+1))),1)?1U)
- SET TA(TC)=$$MX($GET(TA(TC)))
- End DoDot:1
- +3 if '$LENGTH($GET(UEX))
- QUIT
- FOR Y="ACTINIUM^Actinium","ALUMINUM^Aluminum","ANTIMONY^Antimony","ARSENIC^Arsenic","BARIUM^Barium","BERYLLIUM^Beryllium","BISMUTH^Bismuth"
- if UEX[$PIECE(Y,"^",1)
- DO PRES(Y)
- +4 FOR Y="BROMINE^Bromine","BUDESONIDE^Budesonide","CADMIUM^Cadmium","CALCIUM^Calcium","CARBON^Carbon","CESIUM^Cesium","CHLORINE^Chlorine"
- if UEX[$PIECE(Y,"^",1)
- DO PRES(Y)
- +5 FOR Y="CHROMIUM^Chromium","COBALT^Cobalt","COPPER^Copper","GALLIUM^Gallium","GERMANIUM^Germanium","HAFNIUM^Hafnium","INDIUM^Indium"
- if UEX[$PIECE(Y,"^",1)
- DO PRES(Y)
- +6 FOR Y="IODINE^Iodine","IRIDIUM^Iridium","KRYPTON^Krypton","LEAD^Lead","LUTETIUM^Lutetium","MANGANESE^Manganese","MERCURY^Mercury","NICKEL^Nickel"
- if UEX[$PIECE(Y,"^",1)
- DO PRES(Y)
- +7 FOR Y="OSMIUM^Osmium","OXYGEN^Oxygen","PLATINUM^Platinum","POTASSIUM^Potassium","RADON^Radon","RHODIUM^Rhodium","RUBIDIUM^Rubidium","RUTHENIUM^Ruthenium"
- if UEX[$PIECE(Y,"^",1)
- DO PRES(Y)
- +8 FOR Y="SELENIUM^Selenium","SILICON^Silicon","SILVER^Silver","SODIUM^Sodium","STRONTIUM^Strontium","SULFUR^Sulfur","TANTALUM^Tantalum","THALLIUM^Thallium"
- if UEX[$PIECE(Y,"^",1)
- DO PRES(Y)
- +9 FOR Y="THORIUM^Thorium","TITANIUM^Titanium","TUNGSTEN^Tungsten","URANIUM^Uranium","VANADIUM^Vanadium","XENON^Xenon","YTTRIUM^Yttrium","ZIRCONIUM^Zirconium"
- if UEX[$PIECE(Y,"^",1)
- DO PRES(Y)
- +10 QUIT
- PRES(X) ; Pre-assembly Swap text
- +1 NEW RP,WI,TC
- SET RP=$PIECE($GET(X),"^",1)
- SET WI=$PIECE($GET(X),"^",2)
- if '$LENGTH(RP)
- QUIT
- SET TC=0
- FOR
- SET TC=$ORDER(TA(TC))
- if +TC'>0
- QUIT
- Begin DoDot:1
- +2 NEW X
- SET X=$GET(TA(TC))
- if X'[RP
- QUIT
- if $LENGTH(X)'>3
- QUIT
- FOR
- if X'[RP
- QUIT
- SET X=$PIECE(X,RP,1)_WI_$PIECE(X,RP,2,4000)
- +3 SET TA(TC)=X
- End DoDot:1
- +4 QUIT
- ASEM ; Final Assembly
- +1 SET AFTER=""
- SET TC=0
- FOR
- SET TC=$ORDER(TA(TC))
- if +TC'>0
- QUIT
- Begin DoDot:1
- +2 SET AFTER=AFTER_$GET(TA(TC))
- +3 NEW CC
- SET CC=0
- FOR
- SET CC=$ORDER(TA(TC,"B",CC))
- if +CC'>0
- QUIT
- Begin DoDot:2
- +4 SET AFTER=AFTER_$GET(TA(TC,"B",CC))
- End DoDot:2
- End DoDot:1
- +5 if '$DATA(TA(1,"S"))
- SET AFTER=$$UP($EXTRACT(AFTER,1))_$EXTRACT(AFTER,2,$LENGTH(AFTER))
- +6 FOR Y="CR (E)St^CR(E)ST","CR (E)ST^CREST","CR(E)ST^CREST"," ^ ","Vertebra (E)^Vertebra(e)"
- IF AFTER[$PIECE(Y,"^",1)
- Begin DoDot:1
- +7 NEW RP,WI
- SET RP=$PIECE($GET(Y),"^",1)
- SET WI=$PIECE($GET(Y),"^",2)
- if '$LENGTH(RP)
- QUIT
- +8 FOR
- if AFTER'[RP
- QUIT
- SET AFTER=$PIECE(AFTER,RP,1)_WI_$PIECE(AFTER,RP,2,4000)
- End DoDot:1
- +9 IF $EXTRACT(AFTER,$LENGTH(AFTER))="a"
- IF $EXTRACT(AFTER,($LENGTH(AFTER)-1))=" "
- Begin DoDot:1
- +10 SET AFTER=$EXTRACT(AFTER,1,($LENGTH(AFTER)-2))_" A"
- End DoDot:1
- +11 QUIT
- +12 ;
- +13 ; Miscellaneous
- IEEG(X) ; I.E. and E.G.
- +1 SET X=$GET(X)
- NEW TK
- FOR TK="IE^ie","I.E.^ie","I.E^ie","I.e.^ie","I.e^ie","i.e.^ie","i.e^ie","E.G.^eg","E.G^eg","E.g.^eg","E.g^eg","e.g.^eg","e.g^eg"
- Begin DoDot:1
- +2 NEW RP,WI
- SET RP=$PIECE(TK,"^",1)
- SET WI=$PIECE(TK,"^",2)
- FOR
- if X'[RP
- QUIT
- SET X=$PIECE(X,RP,1)_WI_$PIECE(X,RP,2,4000)
- End DoDot:1
- +3 QUIT X
- AABR(X) ; Abbreviation
- +1 NEW TIEN,OIEN,ABR,TKN
- SET TIEN=+($GET(X))
- SET ABR=""
- SET OIEN=0
- +2 SET TKN=$PIECE($GET(^LEX(757.07,+TIEN,0)),"^",1)
- if $EXTRACT(TKN,1)="*"
- QUIT 0
- if $EXTRACT(TKN,1)?1N
- QUIT 0
- if $LENGTH(TKN)'>1
- QUIT 0
- +3 FOR
- SET OIEN=$ORDER(^LEX(757.07,+TIEN,1,OIEN))
- if +OIEN'>0
- QUIT
- Begin DoDot:1
- +4 NEW ND,CAS,RUL
- SET ND=$GET(^LEX(757.07,+TIEN,1,+OIEN,0))
- SET CAS=$PIECE(ND,"^",2)
- if CAS="L"
- QUIT
- +5 SET RUL=$GET(^LEX(757.07,+TIEN,1,+OIEN,1))
- if $LENGTH(RUL)
- QUIT
- +6 SET RUL=$GET(^LEX(757.07,+TIEN,1,+OIEN,2))
- if $LENGTH(RUL)
- QUIT
- +7 SET RUL=$GET(^LEX(757.07,+TIEN,1,+OIEN,3))
- if $LENGTH(RUL)
- QUIT
- +8 SET ABR=ABR_CAS
- End DoDot:1
- +9 SET X=0
- if ABR["U"!(ABR["S")
- SET X=1
- +10 QUIT X
- PR(X,ARY) ; Parse Expression into Tokens
- +1 NEW CTL,EXP,CUR,PRE,TC,CT,OUT,P1,ST,P2,PC
- SET EXP=$GET(X)
- KILL ARY
- +2 SET CTL="^ ^!^@^#^$^%^^^&^*^(^)^_^+^-^=^{^}^|^[^]^\^:^""^;^'^<^>^?^,^.^/^"
- +3 SET (CUR,PRE)=""
- SET TC=1
- SET CT=0
SET (OUT,P1,ST,P2)=""
FOR PC=1:1:$LENGTH(EXP)
Begin DoDot:1
+4 NEW CHR
SET (CUR,CHR)=$EXTRACT(EXP,PC)
+5 IF CTL'[("^"_CHR_"^")
Begin DoDot:2
+6 SET ARY(+TC)=$GET(ARY(+TC))_CHR
SET PRE=CUR
End DoDot:2
QUIT
+7 IF CTL[("^"_CHR_"^")
Begin DoDot:2
+8 NEW CC,NXT
SET CC=$ORDER(ARY(+TC,"B"," "),-1)+1
+9 SET ARY(+TC,"B",CC)=CHR
+10 SET NXT=$EXTRACT(EXP,(PC+1))
+11 IF $LENGTH(NXT)
IF CTL'[("^"_NXT_"^")
SET TC=TC+1
+12 SET PRE=CUR
End DoDot:2
QUIT
End DoDot:1
+13 SET TC=0
FOR
SET TC=$ORDER(ARY(TC))
if +TC'>0
QUIT
Begin DoDot:1
+14 NEW TKN
SET TKN=$GET(ARY(TC))
if $LENGTH(TKN)
SET ARY(TC,"O")=TKN
End DoDot:1
+15 QUIT
+16 ;
CAS(X,Y,S) ; Case
+1 SET X=$GET(X)
SET Y=$GET(Y)
SET S=$GET(S)
+2 if Y="L"
SET X=$$LO(X)
if Y="U"
SET X=$$UP(X)
if Y="M"
SET X=$$MX(X)
if Y="S"
SET X=S
+3 QUIT X
MX(X) ; Mix Case
+1 QUIT $$UP($EXTRACT($GET(X),1))_$$LO($EXTRACT($GET(X),2,$LENGTH($GET(X))))
PS(X) ; Period Space
+1 SET X=$GET(X)
if $DATA(A5ALEX)
QUIT X
IF X[". "
FOR I=1:1:($LENGTH(X,". ")-1)
Begin DoDot:1
+2 NEW LD,TR,PS
SET PS=". "
SET LD=$PIECE(X,PS,1,I)
SET TR=$$TM($PIECE(X,PS,(I+1),$LENGTH(X)))
+3 SET X=LD_". "_$$UP($EXTRACT($GET(TR),1))_$EXTRACT($GET(TR),2,$LENGTH($GET(TR)))
End DoDot:1
+4 NEW A5ALEX
+5 QUIT X
UP(X) ; Uppercase
+1 QUIT $TRANSLATE(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
LO(X) ; Lower Case
+1 QUIT $TRANSLATE(X,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")
TM(X,Y) ; Trim Character Y - Default " "
+1 SET X=$GET(X)
if X=""
QUIT X
SET Y=$GET(Y)
if '$LENGTH(Y)
SET Y=" "
FOR
if $EXTRACT(X,1)'=Y
QUIT
SET X=$EXTRACT(X,2,$LENGTH(X))
+2 FOR
if $EXTRACT(X,$LENGTH(X))'=Y
QUIT
SET X=$EXTRACT(X,1,($LENGTH(X)-1))
+3 QUIT X
RP(X,Y) ; Repeat
+1 NEW C,L
SET C=$GET(X)
SET L=+($GET(Y))
if $LENGTH(C)*L>245
QUIT ""
SET X=""
SET $PIECE(X,C,$GET(L)+1)=""
+2 QUIT X
CTL(X) ; Remove/Replace Control Characters
+1 SET X=$GET(X)
if '$LENGTH(X)
QUIT ""
NEW OUT,PSN,CHR,ASC,REP,WIT
+2 ; Curved Apostrophe
+3 FOR CHR=145,146
SET REP=$CHAR(CHR)
SET WIT="'"
SET X=$$CTLR(X,REP,WIT)
+4 ; Accented letter e
+5 FOR CHR=130,136,137,138
SET REP=$CHAR(CHR)
SET WIT="e"
SET X=$$CTLR(X,REP,WIT)
+6 ; Accented letter c
+7 FOR CHR=128,135
SET REP=$CHAR(CHR)
SET WIT="c"
SET X=$$CTLR(X,REP,WIT)
+8 ; Accented letter u
+9 FOR CHR=129,151,163
SET REP=$CHAR(CHR)
SET WIT="u"
SET X=$$CTLR(X,REP,WIT)
+10 ; Accented letter a
+11 FOR CHR=131,132,133,134,143,145,160,166
SET REP=$CHAR(CHR)
SET WIT="a"
SET X=$$CTLR(X,REP,WIT)
+12 ; Accented letter i
+13 FOR CHR=139,140,141
SET REP=$CHAR(CHR)
SET WIT="i"
SET X=$$CTLR(X,REP,WIT)
+14 ; Accented letter o
+15 FOR CHR=147,148,149,153,162
SET REP=$CHAR(CHR)
SET WIT="o"
SET X=$$CTLR(X,REP,WIT)
+16 ; En dash
+17 SET REP=$CHAR(150)
SET WIT="o"
SET X=$$CTLR(X,REP,WIT)
+18 ; Inverted exclamation mark
+19 SET REP=$CHAR(161)
SET WIT="a"
SET X=$$CTLR(X,REP,WIT)
+20 ; Currency sign
+21 SET REP=$CHAR(164)
SET WIT="a"
SET X=$$CTLR(X,REP,WIT)
+22 ; Section Sing (double S)
+23 SET REP=$CHAR(167)
SET WIT="c"
SET X=$$CTLR(X,REP,WIT)
+24 ; Spacing diaeresis - umlaut
+25 SET REP=$CHAR(168)
SET WIT="e"
SET X=$$CTLR(X,REP,WIT)
+26 ; Copyright sign
+27 SET REP=$CHAR(169)
SET WIT="e"
SET X=$$CTLR(X,REP,WIT)
+28 ; Left double angle quotes
+29 SET REP=$CHAR(171)
SET WIT="e"
SET X=$$CTLR(X,REP,WIT)
+30 ; Pilcrow sign - paragraph sign
+31 SET REP=$CHAR(182)
SET WIT="o"
SET X=$$CTLR(X,REP,WIT)
+32 ; Spacing cedilla
+33 SET REP=$CHAR(184)
SET WIT="o"
SET X=$$CTLR(X,REP,WIT)
+34 ; One Fourth Fraction
+35 SET REP=$CHAR(188)
SET WIT="u"
SET X=$$CTLR(X,REP,WIT)
+36 ; Small letter a with circumflex
+37 SET REP=$CHAR(226)
SET WIT="o"
SET X=$$CTLR(X,REP,WIT)
+38 ; HTML En Dash
+39 SET REP=$CHAR(8211)
SET WIT="o"
SET X=$$CTLR(X,REP,WIT)
+40 ; Extended ASCII Vowels
+41 SET REP=$CHAR(142)
SET WIT="Z"
SET X=$$CTLR(X,REP,WIT)
+42 SET REP=$CHAR(156)
SET WIT="oe"
SET X=$$CTLR(X,REP,WIT)
+43 SET REP=$CHAR(158)
SET WIT="z"
SET X=$$CTLR(X,REP,WIT)
+44 SET REP=$CHAR(159)
SET WIT="Y"
SET X=$$CTLR(X,REP,WIT)
+45 FOR CHR=192,193,194,195,196,197
SET REP=$CHAR(CHR)
SET WIT="A"
SET X=$$CTLR(X,REP,WIT)
+46 SET REP=$CHAR(198)
SET WIT="AE"
SET X=$$CTLR(X,REP,WIT)
+47 SET REP=$CHAR(199)
SET WIT="C"
SET X=$$CTLR(X,REP,WIT)
+48 FOR CHR=200,201,202,203
SET REP=$CHAR(CHR)
SET WIT="E"
SET X=$$CTLR(X,REP,WIT)
+49 FOR CHR=204,205,206,207
SET REP=$CHAR(CHR)
SET WIT="I"
SET X=$$CTLR(X,REP,WIT)
+50 SET REP=$CHAR(208)
SET WIT="ETH"
SET X=$$CTLR(X,REP,WIT)
+51 SET REP=$CHAR(209)
SET WIT="N"
SET X=$$CTLR(X,REP,WIT)
+52 FOR CHR=210,211,212,213,214,216
SET REP=$CHAR(CHR)
SET WIT="O"
SET X=$$CTLR(X,REP,WIT)
+53 FOR CHR=217,218,219,220
SET REP=$CHAR(CHR)
SET WIT="U"
SET X=$$CTLR(X,REP,WIT)
+54 SET REP=$CHAR(221)
SET WIT="Y"
SET X=$$CTLR(X,REP,WIT)
+55 FOR CHR=154,223
SET REP=$CHAR(CHR)
SET WIT="s"
SET X=$$CTLR(X,REP,WIT)
+56 FOR CHR=224,225,226,227,228,229
SET REP=$CHAR(CHR)
SET WIT="a"
SET X=$$CTLR(X,REP,WIT)
+57 SET REP=$CHAR(230)
SET WIT="ae"
SET X=$$CTLR(X,REP,WIT)
+58 SET REP=$CHAR(231)
SET WIT="c"
SET X=$$CTLR(X,REP,WIT)
+59 FOR CHR=232,233,234,235
SET REP=$CHAR(CHR)
SET WIT="e"
SET X=$$CTLR(X,REP,WIT)
+60 FOR CHR=236,237,238,239
SET REP=$CHAR(CHR)
SET WIT="i"
SET X=$$CTLR(X,REP,WIT)
+61 SET REP=$CHAR(240)
SET WIT="eth"
SET X=$$CTLR(X,REP,WIT)
+62 SET REP=$CHAR(241)
SET WIT="n"
SET X=$$CTLR(X,REP,WIT)
+63 FOR CHR=242,243,244,245,246,248
SET REP=$CHAR(CHR)
SET WIT="o"
SET X=$$CTLR(X,REP,WIT)
+64 FOR CHR=249,250,251,252
SET REP=$CHAR(CHR)
SET WIT="u"
SET X=$$CTLR(X,REP,WIT)
+65 FOR CHR=253,255
SET REP=$CHAR(CHR)
SET WIT="y"
SET X=$$CTLR(X,REP,WIT)
+66 ; All others (remove)
+67 SET OUT=""
FOR PSN=1:1:$LENGTH(X)
SET CHR=$EXTRACT(X,PSN)
SET ASC=$ASCII(CHR)
if ASC>31&(ASC<127)
SET OUT=OUT_CHR
+68 ; Uppercase leading character
+69 SET X=$$UP^XLFSTR($EXTRACT(OUT,1))_$EXTRACT(OUT,2,$LENGTH(OUT))
+70 QUIT X
DBLS(X) ; Double Space/Special Characters
+1 SET X=$GET(X)
if (X'[" ")&(X'["^")
QUIT X
+2 FOR
SET X=$PIECE(X," ",1)_" "_$PIECE(X," ",2,300)
if X'[" "
QUIT
+3 FOR
SET X=$PIECE(X,"^",1)_" "_$PIECE(X,"^",2,300)
if X'["^"
QUIT
+4 FOR
if $EXTRACT(X,1)'=" "
QUIT
SET X=$EXTRACT(X,2,$LENGTH(X))
+5 FOR
if $EXTRACT(X,$LENGTH(X))'=" "
QUIT
SET X=$EXTRACT(X,1,($LENGTH(X)-1))
+6 QUIT X
CTLR(LEX,X,Y) ; Control Character Replace
+1 NEW LEXT,LEXR1,LEXR2,LEX2,LEXW
SET LEXT=$GET(LEX)
if '$LENGTH(LEXT)
QUIT ""
SET LEXR1=$GET(X)
SET X=LEXT
if '$LENGTH(LEXR1)
QUIT X
if LEXT'[LEXR1
QUIT X
+2 SET LEXW=$GET(Y)
SET LEXR2=$CHAR(195)_LEXR1
+3 IF LEXT[LEXR2
FOR
if LEXT'[LEXR2
QUIT
SET LEXT=$PIECE(LEXT,LEXR2,1)_LEXW_$PIECE(LEXT,LEXR2,2,4000)
+4 IF LEXT[LEXR1
FOR
if LEXT'[LEXR1
QUIT
SET LEXT=$PIECE(LEXT,LEXR1,1)_LEXW_$PIECE(LEXT,LEXR1,2,4000)
+5 SET X=LEXT
+6 QUIT X