Есть два варианта.
Либо определять текст только между тегами, либо вне тегов (как и сделано выше).
Конечно можно попытаться извернуться и построить рег. выражение чтобы определял в обеих случаях, но у меня это пока не получилось.
Вот тот же пример но со вторым вариантом:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>
Global $sStream_File = @TempDir & '\au3_rtf.tmp'
$hGUI = GUICreate('_GUICtrlRichEdit_SetFormat Demo', 300, 200)
$hRichEdit = _GUICtrlRichEdit_Create($hGUI, 'Some data with [img]http://google.ru/asd.png[/img] tags, [b]bold[/b], and [color]color[/color].', _
20, 20, 260, 160, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
;_GUICtrlRichEdit_AutoDetectURL($hRichEdit, True)
_GUICtrlRichEdit_SetEventMask($hRichEdit, $ENM_LINK)
_GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)
GUISetState(@SW_SHOW, $hGUI)
While 1
_GUICtrlRichEdit_SetFormat()
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
_GUICtrlRichEdit_Destroy($hRichEdit)
FileDelete($sStream_File)
Exit
EndSwitch
WEnd
Func _GUICtrlRichEdit_SetFormat()
If Not _GUICtrlRichEdit_IsModified($hRichEdit) Then
Return
EndIf
Local $aPos, $sRead, $sColorTbl
_GUICtrlRichEdit_StreamToFile($hRichEdit, $sStream_File)
$aPos = _GUICtrlRichEdit_GetSel($hRichEdit)
$sRead = FileRead($sStream_File)
$sColorTbl = '\red255\green0\blue0;\red0\green150\blue0;\red0\green0\blue255;\red255\green255\blue0' ;red(cf1;green(cf2);blue(cf3);yellow(cf4)
Dim $aTags[3][3] = [['b', '\b', '\cf0'], ['img', '', '\cf2 \highlight4'], ['color', '', '\cf1']]
For $i = 0 To UBound($aTags) - 1
$sRead = StringRegExpReplace($sRead, '\[(.+?)\](http://.*?)\[/\1\]', '[\1]{\\field{\\*\\fldinst{HYPERLINK "\2"}}{\\fldrslt{\\cf3 \\ul \2}}}[/\1]')
;Попытка добавить определение ссылок вне тега (вызывает проблемы при добавлении символа пробела или " после или до ссылки)
;$sRead = StringRegExpReplace($sRead, '([^" ])(http://.*)([^"}]*)', '\1{\\field{\\*\\fldinst{HYPERLINK "\2"}}{\\fldrslt{\\cf3 \\ul \2}}}\3')
$sRead = StringRegExpReplace($sRead, '(\[' & $aTags[$i][0] & '\].*?\[/' & $aTags[$i][0] & '\])', '{' & StringReplace($aTags[$i][1] & $aTags[$i][2], '\', '\\') & ' \1}')
Next
$sRead = '{\rtf1 {\colortbl ;' & $sColorTbl & ';}' & StringReplace(StringStripCR($sRead), @LF, @LF & '\par ') & '}'
$hFile = FileOpen($sStream_File, 2)
FileWrite($hFile, $sRead)
FileClose($hFile)
_GUICtrlRichEdit_StreamFromFile($hRichEdit, $sStream_File)
_GUICtrlRichEdit_SetSel($hRichEdit, $aPos[0], $aPos[1])
_GUICtrlRichEdit_SetModified($hRichEdit, False)
EndFunc
Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
#forceref $hWnd, $iMsg, $iWparam
Local $hWndFrom, $iCode, $tNMHDR, $tEnLink, $cpMin, $cpMax, $tMsgFilter
$tNMHDR = DllStructCreate($tagNMHDR, $iLparam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hRichEdit
Select
Case $iCode = $EN_LINK
$tMsgFilter = DllStructCreate($tagMSGFILTER, $iLparam)
If DllStructGetData($tMsgFilter, "msg") = $WM_LBUTTONUP Then
$tEnLink = DllStructCreate($tagENLINK, $iLparam)
$cpMin = DllStructGetData($tEnLink, "cpMin")
$cpMax = DllStructGetData($tEnLink, "cpMax")
ShellExecute(_GUICtrlRichEdit_GetTextInRange($hRichEdit, $cpMin, $cpMax))
EndIf
EndSelect
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
|