Page 1 of 2
xBrowse a column containing richedit
Posted:
Thu May 05, 2011 10:34 am
by MarcoBoschi
Hi,
I Have a column in a xbrowse list that refers to a memo field containing a richedit text.
oCol = oBrw:AddCol()
oCol:bStrData = { || note->nota }
oCol:cHeader = "Nota"
oCol:nEditType = EDIT_GET
oCol:nWidth = 200
note->nota contains a string like this
===========================
{\rtf1\ansi\ansicpg1252\deff0\deflang1040{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}{\f1\fnil\fcharset0 Arial;}}
{\colortbl ;\red0\green0\blue0;}
\viewkind4\uc1\pard\cf1\b\i\f0\fs36 Ciao marco\cf0\b0\i0\f1\fs20\par
}
============================
How can I extract pure text of this memo field?
Thanks in advance
Marco
Re: xBrowse a column containing richedit
Posted:
Thu May 05, 2011 5:43 pm
by nageswaragunupudi
I am also interested in a function like Rtf2Text(). I started coding a straight function but I haven't completed it. I shall post it again after doing some more work.
Meanwhile I can suggest a function using a hidden richedit control. Can you please help by testing this function?
- Code: Select all Expand view
function Rtf2text( cRtf )
static hDLL, oWnd, oRich
local cText
if ValType( cRtf ) == 'C'
if hDLL == nil
hDLL := LoadLibrary( "riched20.dll" )
DEFINE WINDOW oWnd
@ 0,0 RICHEDIT oRich VAR cRtf OF oWnd SIZE 50,50 PIXEL
cText := oRich:GetText()
ACTIVATE WINDOW oWnd HIDDEN
else
oRich:LoadRTF( cRTF )
cText := oRich:GetText()
endif
else
if hDLL != nil
oWnd:End()
oWnd := nil
oRich := nil
FreeLibrary( hDLL )
hDLL := nil
endif
endif
return cText
//----------------------------------------------------------------------------//
After done finally call Rtf2Text() without any parameters to close the window and DLL.
I would be glad to know the test results,
Meanwhile if any one can provide a direct function to strip of all rtf codes, that would be greatly welcome.
Re: xBrowse a column containing richedit
Posted:
Thu May 05, 2011 9:25 pm
by reinaldocrespo
The only drawback of MR. Rao's suggestion is that you must create the richtext control in order to extract the text. In my case I was having to report on thousands of records containing richtext. So I wrote a very short and simple function to extract only text from richtext using a regular expression.
Here is the code:
- Code: Select all Expand view
*---------------------------------------------------------------------------------------------
#DEFINE _cREGEX "\{?\\([a-z]{1,32}[0-9]* ?)([A-z, ]*;)?|}" //includes fonts
function GetTextFromRTF( cRtfText, lKeepCRLFs )
local aRet
local cStrip, i
DEFAULT cRtfText := ""
DEFAULT lKeepCRLFs := .t.
aRet := hb_RegExAll( _cREGEX, cRtfText, .f. )
if aRet == Nil ;return cRtfText ;endif
aSort( aRet,,, { |x,y| len( x[1] ) > len( y[1] ) } )
for i := 1 to len( aRet )
cRtfText := StrTran( cRtfText, aRet[ i, 1 ], "" )
Next
if !lKeepCRLFs
cRtfText := StrTran( cRtfText, CRLF, " " )
endif
Return cRtfText
Hope that helps,
Reinaldo.
Re: xBrowse a column containing richedit
Posted:
Fri May 06, 2011 2:11 am
by nageswaragunupudi
Mr. Reinaldocrespo
Thank you very much. This is the kind of function I needed too.
Yes I agree with your comments about the disadvantage of creating control.
Re: xBrowse a column containing richedit
Posted:
Mon May 09, 2011 1:32 pm
by MarcoBoschi
Reinaldo,
Your function is very good but ther is a little problem.
If I pass a string containing one of these characters "àèéìòù"
for instance the days of week in Italian :
"Lunedì
Martedì
Mercoledì
Giovedì
Venerdì
"
I have these string as return value
Marc\'e0 Marc\'e8 Marc\'ec Marc\'f2 Marc\'f9
nageswaragunupudi,
your function works very well.
But I put this function in a column of a listbox to display the content of a memo field containing a richedit text.
When I test it with larger table I can tell you if it works without problem
Thanks to all
marco
Re: xBrowse a column containing richedit
Posted:
Mon May 09, 2011 3:46 pm
by Silvio
Marco Boschi,
can you send me a test sample with this feature please , ? I'd like try it
Re: xBrowse a column containing richedit
Posted:
Mon May 09, 2011 7:56 pm
by nageswaragunupudi
Mr Marco
I don't think my method would be good in case of large tables. Function posted by Mr. Reinaldo is the way to go. Though this function has limitations as of now, we can improve it. I myself need a good function for this purpose. When I get time I try to improve that function solving some of the problems I already noticed.
Re: xBrowse a column containing richedit
Posted:
Tue May 10, 2011 10:25 am
by MarcoBoschi
nageswaragunupudi,
I confirm the problem when in the memo field there are words containing these character
widely used in italian language àèéìòù
Lunedì is Monday
Martedì is etc. etc.
Bye
I hope that reinaldo read this post
Re: xBrowse a column containing richedit
Posted:
Tue May 10, 2011 3:26 pm
by reinaldocrespo
Marco;
I apologize for being so busy. Please send me a rich edit memotext I can do tests with.
Send me for example something like:
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 ARIAL;}}
\viewkind4\uc1\pard\f0\fs20 The specimen is received fresh, wrapped in plastic, is labeled "LEFT LEG BELOW AMPUTATION" and consists of a below the knee amputation specimen measuring 30 cm from tibial amputation site to medial malleolus. The specimen is notable for gangrenous ulcers involving all toes and anterior aspect of the dorsum of the foot. The proximal soft tissue is beefy red and viable. Sections through the vessels show atheromatous plaque. (RSS 1 CASS) VCV\par
\pard\fs20\par
}
BTW and FYI - all the function does is remove all instances of richtext coded tags from the memo field sent as parameter returning everything else. For more information on regular expressions you can search the web. It is a good idea to become acquainted with regex as they are a powerful and very fast way to parse text for anything.
Again, please send me some sample richtext that does not work at your end and I will gladly test it against the function here.
Best regards,
Reinaldo.
Re: xBrowse a column containing richedit
Posted:
Tue May 10, 2011 3:40 pm
by nageswaragunupudi
I have problems with the following files in \fwh\samples folder.
MemoEdit( GetTextFromRTF( MemoRead( "testrtf.rtf" ) ) )
MemoEdit( GetTextFromRTF( MemoRead( "fiveodbc.rtf" ) ) )
Re: xBrowse a column containing richedit
Posted:
Tue May 10, 2011 3:51 pm
by MarcoBoschi
{\rtf1\ansi\ansicpg1252\deff0\deflang1040{\fonttbl{\f0\fnil\fcharset0 Arial;}}
\viewkind4\uc1\pard\fs20 Oggi \'e8 marted\'ec\par
domani \'e8 mercoled\'ec\par
dopodomani gioved\'ec\par
che ora \'e8\par
Come sar\'e0 il tempo domani?\par
}
àèéìòù
Reinaldo: too kind , no hurry
Re: xBrowse a column containing richedit
Posted:
Tue May 10, 2011 4:40 pm
by reinaldocrespo
Marco;
I see your point. I wasn't aware of how richtext implemented international characters, but I find a simple solution without having to re-touch the regular expression. Change the function to this:
- Code: Select all Expand view
function GetTextFromRTF( cRtfText, lKeepCRLFs )
local aRet
local cStrip, i
DEFAULT cRtfText := ""
DEFAULT lKeepCRLFs := .t.
aRet := hb_RegExAll( _cREGEX, cRtfText, .f. )
if aRet == Nil ;return cRtfText ;endif
aSort( aRet,,, { |x,y| len( x[1] ) > len( y[1] ) } )
for i := 1 to len( aRet )
cRtfText := StrTran( cRtfText, aRet[ i, 1 ], "" )
Next
if !lKeepCRLFs
cRtfText := StrTran( cRtfText, CRLF, " " )
endif
//International chars
cRtfText := StrTran( cRtfText, "'ec", chr(141) ) //inverted accented i
cRtfText := StrTran( cRtfText, "'e8", chr(138) ) //inverted accented e
cRtfText := StrTran( cRtfText, "'e0", chr(133) ) //inverted accented a
Return cRtfText
It should work.
For Mr. Rao, I find that my windows 7 wordpad does not want to open testrtf.rtf. In fact, my windows installation will NOT open that file. But it does open fiveodbc.rtf. So I will work with fiveodbc.rtf as soon as I get a chance.
Reinaldo.
Re: xBrowse a column containing richedit
Posted:
Wed May 11, 2011 4:45 am
by nageswaragunupudi
Mr. Reinaldo
The function posted by you does most of the work and works well on most normal rich text. It is just that it needs to be improved a bit further.
I can open testrtf.rtf in Word 2007, WordPad and FWH RichText control on my Windows 7 (32-bit).
What distinguishes these two files from other normal richtext files is that testrtf.rtf contains image and fiveodbc.rtf contains a table. We need to include logic to handle these features in rtf.
Re: xBrowse a column containing richedit
Posted:
Wed May 11, 2011 1:58 pm
by MarcoBoschi
Reinaldo,
with this sequence of replace the problem is solved!
cRtfText := StrTran( cRtfText, "\'e0", "à" )
cRtfText := StrTran( cRtfText, "\'e8", "è" )
cRtfText := StrTran( cRtfText, "\'e9", "é" )
cRtfText := StrTran( cRtfText, "\'ec", "ì" )
cRtfText := StrTran( cRtfText, "\'f2", "ò" )
cRtfText := StrTran( cRtfText, "\'f9", "ù" )
Many Thanks
Marco
Re: xBrowse a column containing richedit
Posted:
Wed May 11, 2011 2:11 pm
by reinaldocrespo
Marco -Good!
Mr. Rao. Good morning. I see the problem you are pointing to. There is no easy fix. I would have to revisit my regular expression which is already a bit cryptic. I must take care of some pressing issues today. I'm thinking perhaps tomorrow I should be able to spend time rewriting the regular expression in order to catch imbedded tables and images. Another possibility would be to use a lex or yacc utility as means to catch streams of data delimited by tags.
Reinaldo.