如何将新的格式说明符引入现有的 Rtf 文档

How to introduce new format specifiers into existing Rtf document

我正在尝试扩展使用 RTF 的宏解析器的功能。 (VB.NET RichTextBox 的自定义重载) 解析器为 RTF 创建一个 header 并逐行输入格式代码。 这只能处理单行表达式,我希望能够解析多行语句。 为此,我创建了一个在第一个解析器之后运行并重新解析多行语句的函数。

我面临的问题是,当我尝试从 RichTextBox (RichTextBox.Rtf) 中读取现有文本时,它 returns 是先前输入的 RichText 的简化版本,没有longer 包含整个 header,仅包含使用的位。

然后当我尝试用应该被识别的新格式代码替换一些行时,它失败了。

然后我尝试嵌套另一个 header 但这根本不起作用。

这是没有像以前那样进行多行解析的 RTF。

{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset1 MS Reference Sans Serif;}{\f1\fnil\fcharset1 MS Reference Sans Serif;}{\f2\fnil\fcharset1 MS Reference Sans Serif;}{\f3\fnil\fcharset1 MS Reference Sans Serif;}{\f4\fnil\fcharset1 MS Reference Sans Serif;}{\f5\fnil\fcharset1 MS Reference Sans Serif;}{\f6\fnil\fcharset1 MS Reference Sans Serif;}{\f7\fnil\fcharset1 MS Reference Sans Serif;}{\f8\fnil\fcharset1 MS Reference Sans Serif;}{\f9\fnil\fcharset1 MS Reference Sans Serif;}{\f10\fnil\fcharset1 MS Reference Sans Serif;}{\f11\fnil\fcharset1 MS Reference Sans Serif;}{\f12\fnil\fcharset1 MS Reference Sans Serif;}}{\colortbl ;\red255\green255\blue255;\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red255\green255\blue255;\red70\green130\blue180;\red255\green255\blue255;\red220\green20\blue60;\red255\green255\blue255;\red165\green42\blue42;\red255\green255\blue255;\red128\green0\blue0;\red255\green255\blue255;\red0\green128\blue0;\red255\green255\blue255;\red0\green0\blue0;\red255\green255\blue255;\red184\green134\blue11;\red255\green255\blue255;\red47\green79\blue79;\red255\green255\blue255;\red255\green0\blue0;\red255\green255\blue255;\red138\green43\blue226;\red255\green255\blue255;\red147\green112\blue219;}\viewkind4\uc1\pard\lang1031\fs16 \f0\cb1\cf2\b\i0\ulnone  
f6\cb13\cf14\b\i0\ulnone ! MultiMess7 macro header. Please fill in information and uncomment lines:\f0\cb1\cf2\b\i0\ulnone \par
\f6\cb13\cf14\b\i0\ulnone !-------------------------------------------------------------------------------------\f0\cb1\cf2\b\i0\ulnone \par
\f6\cb13\cf14\b\i0\ulnone ! >>> Please set user and technology <<< \f0\cb1\cf2\b\i0\ulnone \par
\f1\cb3\cf4\b\i0\ulnone SET\f0\cb1\cf2\b\i0\ulnone  \f9\cb19\cf20\b\i0\ulnone user\f0\cb1\cf2\b\i0\ulnone =\par
\f1\cb3\cf4\b\i0\ulnone SET\f0\cb1\cf2\b\i0\ulnone  \f9\cb19\cf20\b\i0\ulnone technology\f0\cb1\cf2\b\i0\ulnone =\par
\f6\cb13\cf14\b\i0\ulnone !-------------------------------------------------------------------------------------\f0\cb1\cf2\b\i0\ulnone \par
\f6\cb13\cf14\b\i0\ulnone ! SET lot=@LOT\f0\cb1\cf2\b\i0\ulnone \par
\f6\cb13\cf14\b\i0\ulnone ! SET wafer=@WAFER\f0\cb1\cf2\b\i0\ulnone \par
\f6\cb13\cf14\b\i0\ulnone ! SET slot=@SLOT\f0\cb1\cf2\b\i0\ulnone \par
\f6\cb13\cf14\b\i0\ulnone ! SET diex=@DIEX\f0\cb1\cf2\b\i0\ulnone \par
\f6\cb13\cf14\b\i0\ulnone ! SET diey=@DIEY\f0\cb1\cf2\b\i0\ulnone \par
\f6\cb13\cf14\b\i0\ulnone ! SET xy=DIE_x$diex&y$diey\f0\cb1\cf2\b\i0\ulnone \par
\f6\cb13\cf14\b\i0\ulnone ! SET temp=@TEMP\f0\cb1\cf2\b\i0\ulnone \par
\f6\cb13\cf14\b\i0\ulnone ! SET path=G:\04_Auftraege\\f0\cb1\cf2\b\i0\ulnone \par
\f6\cb13\cf14\b\i0\ulnone ! SET file=$technology&_$lot&_$wafer&_$xy&\f0\cb1\cf2\b\i0\ulnone \par
\f6\cb13\cf14\b\i0\ulnone !---------------------------------------------------------------\f0\cb1\cf2\b\i0\ulnone \par
\f6\cb13\cf14\b\i0\ulnone ! PICTURE File=$path&\$file&\f0\cb1\cf2\b\i0\ulnone \par
\f6\cb13\cf14\b\i0\ulnone ! SAVE_DATA File=$path&\$file&.DAT\f0\cb1\cf2\b\i0\ulnone \par
\f6\cb13\cf14\b\i0\ulnone !---------------------------------------------------------------\f0\cb1\cf2\b\i0\ulnone \par
\par
}

当分配给 RichTextBox.Rtf 时变成这样:

{\rtf1\ansi\deff0{\fonttbl{\f0\fnil MS Reference Sans Serif;}}
{\colortbl ;\red0\green128\blue0;\red0\green0\blue0;\red0\green0\blue255;\red47\green79\blue79;}
\viewkind4\uc1\pard\cf1\lang1031\b\f0\fs16 ! MultiMess7 macro header. Please fill in information and uncomment lines:\cf2\par
\cf1 !-------------------------------------------------------------------------------------\cf2\par
\cf1 ! >>> Please set user and technology <<< \cf2\par
\cf3 SET\cf2  \cf4 user\cf2 =\par
\cf3 SET\cf2  \cf4 technology\cf2 =\par
\cf1 !-------------------------------------------------------------------------------------\cf2\par
\cf1 ! SET lot=@LOT\cf2\par
\cf1 ! SET wafer=@WAFER\cf2\par
\cf1 ! SET slot=@SLOT\cf2\par
\cf1 ! SET diex=@DIEX\cf2\par
\cf1 ! SET diey=@DIEY\cf2\par
\cf1 ! SET xy=DIE_x$diex&y$diey\cf2\par
\cf1 ! SET temp=@TEMP\cf2\par
\cf1 ! SET path=G:\04_Auftraege\\cf2\par
\cf1 ! SET file=$technology&_$lot&_$wafer&_$xy&\cf2\par
\cf1 !---------------------------------------------------------------\cf2\par
\cf1 ! PICTURE File=$path&\$file&\cf2\par
\cf1 ! SAVE_DATA File=$path&\$file&.DAT\cf2\par
\cf1 !---------------------------------------------------------------\cf2\par
\par
}

然后我尝试添加

\f3\cb7\cf8\b\i0\ulnone $U2\f12\cb25\cf26\b\i0\ulnone  = \f12\cb25\cf26\b\i0\ulnone math.log(\f5\cb11\cf12\b\i0\ulnone §U_SMU1\f12\cb25\cf26\b\i0\ulnone *\f8\cb17\cf18\b\i0\ulnone 2\f12\cb25\cf26\b\i0\ulnone )\par
\f3\cb7\cf8\b\i0\ulnone $U3\f12\cb25\cf26\b\i0\ulnone  = \f12\cb25\cf26\b\i0\ulnone math.sin(\f5\cb11\cf12\b\i0\ulnone §U_SMU1\f12\cb25\cf26\b\i0\ulnone \f12\cb25\cf26\b\i0\ulnone )\par
\f12\cb25\cf26\b\i0\ulnone var = \f12\cb25\cf26\b\i0\ulnone math.cos(\f3\cb7\cf8\b\i0\ulnone $U3\f12\cb25\cf26\b\i0\ulnone \f12\cb25\cf26\b\i0\ulnone )\par
\f12\cb25\cf26\b\i0\ulnone hello(\f9\cb19\cf20\b\i0\ulnone 'hi' \f12\cb25\cf26\b\i0\ulnone \f12\cb25\cf26\b\i0\ulnone )\par
\f12\cb25\cf26\b\i0\ulnone import \f12\cb25\cf26\b\i0\ulnone time\par
\par
}

它显示为默认的黑色文本。

我可以在不在外部存储 RTF 的情况下附加新的格式说明符吗?旧的解析器一次只能处理片段,而我的新函数需要整个文本,然后我使用 RichTextBox.Text .

我解决了。您可以通过 RichTextBox 的 Selected Rtf 属性 将带有新 header 的附加富文本注入现有文本。

myRTB.SelectedRtf = "{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset1 MS Reference Sans Serif;}{\f1\fnil\fcharset1 MS Reference Sans Serif;}{\f2\fnil\fcharset1 MS Reference Sans Serif;}{\f3\fnil\fcharset1 MS Reference Sans Serif;}{\f4\fnil\fcharset1 MS Reference Sans Serif;}{\f5\fnil\fcharset1 MS Reference Sans Serif;}{\f6\fnil\fcharset1 MS Reference Sans Serif;}{\f7\fnil\fcharset1 MS Reference Sans Serif;}{\f8\fnil\fcharset1 MS Reference Sans Serif;}{\f9\fnil\fcharset1 MS Reference Sans Serif;}{\f10\fnil\fcharset1 MS Reference Sans Serif;}{\f11\fnil\fcharset1 MS Reference Sans Serif;}{\f12\fnil\fcharset1 MS Reference Sans Serif;}}{\colortbl ;\red255\green255\blue255;\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red255\green255\blue255;\red70\green130\blue180;\red255\green255\blue255;\red220\green20\blue60;\red255\green255\blue255;\red165\green42\blue42;\red255\green255\blue255;\red128\green0\blue0;\red255\green255\blue255;\red0\green128\blue0;\red255\green255\blue255;\red0\green0\blue0;\red255\green255\blue255;\red184\green134\blue11;\red255\green255\blue255;\red47\green79\blue79;\red255\green255\blue255;\red255\green0\blue0;\red255\green255\blue255;\red138\green43\blue226;\red255\green255\blue255;\red147\green112\blue219;}\viewkind4\uc1\pard\lang1031\fs16 \f0\cb1\cf2\b\i0\ulnone 
\f3\cb7\cf8\b\i0\ulnone $U2\f12\cb25\cf26\b\i0\ulnone  = \f12\cb25\cf26\b\i0\ulnone math.log(\f5\cb11\cf12\b\i0\ulnone §U_SMU1\f12\cb25\cf26\b\i0\ulnone *\f8\cb17\cf18\b\i0\ulnone 2\f12\cb25\cf26\b\i0\ulnone )\par
\f3\cb7\cf8\b\i0\ulnone $U3\f12\cb25\cf26\b\i0\ulnone  = \f12\cb25\cf26\b\i0\ulnone math.sin(\f5\cb11\cf12\b\i0\ulnone §U_SMU1\f12\cb25\cf26\b\i0\ulnone \f12\cb25\cf26\b\i0\ulnone )\par
\f12\cb25\cf26\b\i0\ulnone var = \f12\cb25\cf26\b\i0\ulnone math.cos(\f3\cb7\cf8\b\i0\ulnone $U3\f12\cb25\cf26\b\i0\ulnone \f12\cb25\cf26\b\i0\ulnone )\par
\f12\cb25\cf26\b\i0\ulnone hello(\f9\cb19\cf20\b\i0\ulnone 'hi' \f12\cb25\cf26\b\i0\ulnone \f12\cb25\cf26\b\i0\ulnone )\par
\f12\cb25\cf26\b\i0\ulnone import \f12\cb25\cf26\b\i0\ulnone time\par
\par
}"