Here a function to convert a Clob rtf text to plain text
Example of function that return the converted text into a Char variable
Good only for short text, less than 250 chars
Good only for short text, less than 250 chars
- Funprog F_RTF2TEXT(CLOB)
- Variable Clbfile CLOB
- Local Integer LENTXMT : LENTXMT = 250
- Local Integer NRIGHE : NRIGHE = 4 # 4 = 250x4 char
- Local Char XOUT(LENTXMT)(NRIGHE)
- Call S_RTF2TEXT(LENTXMT,CLOB,XOUT,NRIGHE)
- #Concatenate the row with plain text, by removing the empty space
- Local Char XRET(250) : Raz XRET
- For XI = 0 To NRIGHE
- XRET += vireblc(XOUT(XI),2)
- Next
- End XRET
Example,
Convert the header text of a sales order
Convert the header text of a sales order
- $MYTEST
- If !clalev ([F:SOH]) : Local File SORDER [F:SOH] : Endif
- If !clalev ([F:TXC]) : Local File TEXCLOB [F:TXC] : Endif
- Filter [F:SOH]
- Filter [F:TXC]
- For [F:SOH] Where SOHNUM = "000000001"
- For [F:TXC] Where CODE = [F:SOH]SOHTEX1
- local char MYTEXT(250)
- MYTEXT = func F_RTF2TEXT([F:TXC]TEXTE)
- Infbox "MYTEXT= "+ MYTEXT
- Next
- Next
- Return
Core procedures:
- ###############################################################################
- # CORE PROCEDURES
- #
- # Author: Matteo Carminati (mcarminati@ma-tica.it)
- #
- # This program is free software; you can redistribute it and/or modify it
- # under the terms version 3 of the GNU General Public License as published
- # by the Free Software Foundation. This program is distributed in the hope
- # that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
- # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- # See the GNU General Public License for more details.
- #
- ###############################################################################
- Subprog S_RTF2TEXT(PLENRIGAOUT,CLOB,PTXTOUT,PNRIGEOUT)
- Value Integer PLENRIGAOUT
- Variable Clbfile CLOB
- Variable Char PTXTOUT
- Variable Integer PNRIGEOUT
- Local Integer XRIGHE
- Local Integer XNOL
- Local Integer XNCH
- Local Char XCH(1)
- Local Char XCHPREV(1)
- Local Integer XSTRTAG1 : XSTRTAG1 = 0
- Local Integer XSTRTAG2 : XSTRTAG2 = 0
- Local Integer LENGHT : LENGHT = len(CLOB)
- Local Integer CLOTAI : CLOTAI = int(LENGHT/GCLOLNG)+1
- Local Char PRTFIN (GCLOLNG)(CLOTAI)
- Setlob PRTFIN With CLOB
- XRIGHE = dim(PRTFIN,1)
- Local Char XOUT(250)(XRIGHE)
- Local Integer XOUTRLEN(XRIGHE)
- Local Char RIGA(250)
- Local Integer XESCAPE
- #Toglie i tag RTF
- For XNOL = 0 To XRIGHE - 1
- Raz RIGA
- RIGA = PRTFIN(XNOL)
- XOUTRLEN(XNOL) = 0
- For XNCH = 1 To len(RIGA)
- XCHPREV = XCH
- XCH = mid$(RIGA,XNCH,1)
- If XCH = "\" Then
- XESCAPE = -1
- If func F_GETNEXTCHR(PRTFIN,1,XNCH,XNOL,XRIGHE)= "}" Then
- XCHPREV = XCH
- XNCH = XNCH + 1
- XCH = "}"
- XESCAPE = 1
- Endif
- If func F_GETNEXTCHR(PRTFIN,1,XNCH,XNOL,XRIGHE)= "{" Then
- XCHPREV = XCH
- XNCH = XNCH + 1
- XCH = "{"
- XESCAPE = 1
- Endif
- If func F_GETNEXTCHR(PRTFIN,4,XNCH,XNOL,XRIGHE)= "pard" Then
- XNCH = XNCH + 4
- XCH = " "
- XESCAPE = 1
- Endif
- If func F_GETNEXTCHR(PRTFIN,3,XNCH,XNOL,XRIGHE)= "par" Then
- XNCH = XNCH + 3
- XCH = " "
- XESCAPE = 1
- Endif
- If func F_GETNEXTCHR(PRTFIN,3,XNCH,XNOL,XRIGHE)= "'e0" Then
- XNCH = XNCH + 3
- XCH = "a"
- XESCAPE = 1
- Endif
- If func F_GETNEXTCHR(PRTFIN,3,XNCH,XNOL,XRIGHE)= "'e9" Then
- XNCH = XNCH + 3
- XCH = "e"
- XESCAPE = 1
- Endif
- If func F_GETNEXTCHR(PRTFIN,3,XNCH,XNOL,XRIGHE)= "'e8" Then
- XNCH = XNCH + 3
- XCH = "e"
- XESCAPE = 1
- Endif
- If func F_GETNEXTCHR(PRTFIN,3,XNCH,XNOL,XRIGHE)= "'b0" Then
- XNCH = XNCH + 3
- XCH = "°"
- XESCAPE = 1
- Endif
- If func F_GETNEXTCHR(PRTFIN,3,XNCH,XNOL,XRIGHE)= "'ec" Then
- XNCH = XNCH + 3
- XCH = "i"
- XESCAPE = 1
- Endif
- If func F_GETNEXTCHR(PRTFIN,3,XNCH,XNOL,XRIGHE)= "'f2" Then
- XNCH = XNCH + 3
- XCH = "o"
- XESCAPE = 1
- Endif
- If func F_GETNEXTCHR(PRTFIN,3,XNCH,XNOL,XRIGHE)= "'f9" Then
- XNCH = XNCH + 3
- XCH = "u"
- XESCAPE = 1
- Endif
- If func F_GETNEXTCHR(PRTFIN,2,XNCH,XNOL,XRIGHE)= "fs" Then #Font size
- XNCH = XNCH + 2
- XCH = ""
- XESCAPE = -1
- Endif
- If XESCAPE = -1 Then
- XSTRTAG1 = 1
- XNCH = XNCH + 1
- Endif
- Endif
- If XCH = "{" and XCHPREV <> "\" Then XSTRTAG2 = XSTRTAG2 + 1 : Endif
- If XSTRTAG1 = 0 and XSTRTAG2 <= 1 Then
- XOUT(XNOL) += XCH
- XOUTRLEN(XNOL) += 1
- Endif
- If XCH = " " or find(func F_GETNEXTCHR(PRTFIN,2,XNCH-1,XNOL,XRIGHE) ,'\}','\{','\\') > 0 Then XSTRTAG1 = 0 : Endif
- If XCH = "}" and XCHPREV <> "\" Then XSTRTAG2 = XSTRTAG2 - 1 : Endif
- Next
- Next
- Local Integer XNOL2
- Local Integer XCONTA2
- XNOL2 = 0
- XCONTA2 = PLENRIGAOUT
- For XNOL = 0 To XRIGHE - 1
- Raz RIGA
- RIGA = XOUT(XNOL)
- If XNOL = XRIGHE : RIGA = vireblc(RIGA,1) : Endif
- If len(RIGA) > 0 Then
- For XNCH = 1 To len(RIGA)
- XCH = mid$(RIGA,XNCH,1)
- If XCH = chr$(13) Then
- XCH = " "
- If func F_GETNEXTCHR(XOUT,1,XNCH,XNOL,XRIGHE)= chr$(10) Then
- XNCH = XNCH + 1
- Endif
- Endif
- If XCH = chr$(10) Then
- XCH = " "
- If func F_GETNEXTCHR(XOUT,1,XNCH,XNOL,XRIGHE)= chr$(13) Then
- XNCH = XNCH + 1
- Endif
- Endif
- If XNCH = 1 and XNOL = 0 and XCH = "{" Then XCH = "" : Endif
- PNRIGEOUT = XNOL2 + 1
- PTXTOUT(XNOL2) += XCH
- XCONTA2 = XCONTA2 - 1
- If XCONTA2 = 0 Then
- XNOL2 = XNOL2 + 1
- XCONTA2 = PLENRIGAOUT
- Endif
- Next
- Endif
- Next
- #tolgo la graffa finale
- RIGA = vireblc(PTXTOUT(XNOL2),1)
- If mid$(RIGA,len(RIGA),1) = "}" Then
- PTXTOUT(XNOL2) = mid$(RIGA,1,len(RIGA)-1)
- Endif
- End
- ############################
- Funprog F_GETNEXTCHR(PARRIN,NCHNEXT,NCURPOS,NCURNOL,NTOTRIGHE)
- Value Char PARRIN
- Value Integer NCHNEXT
- Value Integer NCURPOS
- Value Integer NCURNOL
- Value Integer NTOTRIGHE
- Local Char XRET(NCHNEXT) : XRET = ""
- Local Integer XNCH
- Local Char RIGA(250)
- Local Integer XCONTA
- For XNOL = NCURNOL To NTOTRIGHE - 1
- RIGA = PARRIN(NCURNOL)
- For XNCH = NCURPOS + 1 To len(RIGA) - 1
- XRET += mid$(RIGA,XNCH,1)
- XCONTA += 1
- If XCONTA = NCHNEXT Then
- Break
- Endif
- Next
- If XCONTA = NCHNEXT Then
- Break
- Endif
- NCURPOS = 0
- Next
- End XRET