SyntaxEngineClass.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. using System.Collections.Generic;
  2. using System.Drawing;
  3. using System.Runtime.InteropServices;
  4. using System.Text.RegularExpressions;
  5. namespace Core.StlMes.Client.Judge.Commons
  6. {
  7. /// <summary>
  8. /// 语法分析引擎基类
  9. /// ZswangY37 wjhu111#21cn.com 2007-03-17 尊重作者,转贴请注明出处
  10. /// 日期:2007-03-17
  11. /// 设计:ZswangY37
  12. /// 支持:wjhu111#21cn.com
  13. /// 感谢CSDN中的kissknife、chinnel提供改进意见
  14. /// http://community.csdn.net/Expert/TopicView.asp?id=5400165
  15. /// </summary>
  16. public class SyntaxEngine
  17. {
  18. /// <summary>
  19. /// 语法项
  20. /// </summary>
  21. public class SyntaxItem
  22. {
  23. private string FPattern; // 正则表达式
  24. private RegexOptions FOptions; // 正则表达式附加选项
  25. private string FName; // 语法名称
  26. private int FIndex; // 序号
  27. public string Pattern { get { return FPattern; } } // 正则表达式
  28. public RegexOptions Options { get { return FOptions; } } // 正则表达式附加选项
  29. public string Name { get { return FName; } } // 名称
  30. public int Index { get { return FIndex; } } // 序号
  31. public SyntaxItem(string APattern, RegexOptions AOptions,
  32. string AName, int AIndex)
  33. {
  34. FPattern = APattern;
  35. FOptions = AOptions;
  36. FName = AName;
  37. FIndex = AIndex;
  38. }
  39. }
  40. /// <summary>
  41. /// 语法分析返回项
  42. /// </summary>
  43. public class AnalyzeReslut
  44. {
  45. private SyntaxItem FItem; // 所属语法项
  46. private string FBlock; // 文字块
  47. public SyntaxItem Item { get { return FItem; } }
  48. public string Block { get { return FBlock; } }
  49. public AnalyzeReslut(SyntaxItem AItem, string ABlock)
  50. {
  51. FItem = AItem;
  52. FBlock = ABlock;
  53. }
  54. }
  55. public class AnalyzeResultSqlStruct
  56. {
  57. private string _TableName;
  58. public string TableName
  59. {
  60. get { return _TableName; }
  61. set { _TableName = value; }
  62. }
  63. private string _TableWhere;
  64. public string TableWhere
  65. {
  66. get { return _TableWhere; }
  67. set { _TableWhere = value; }
  68. }
  69. private List<string> _TableColumns = new List<string>();
  70. public List<string> TableColumns
  71. {
  72. get { return _TableColumns; }
  73. set { _TableColumns = value; }
  74. }
  75. }
  76. private List<SyntaxItem> FSyntaxItems = new List<SyntaxItem>();
  77. private List<AnalyzeReslut> FAnalyzeResluts = new List<AnalyzeReslut>();
  78. public List<SyntaxItem> SyntaxItems { get { return FSyntaxItems; } }
  79. public List<AnalyzeReslut> AnalyzeResluts { get { return FAnalyzeResluts; } }
  80. /// <summary>
  81. /// 进行语法分析
  82. /// </summary>
  83. /// <param name="ACode">所分析的代码</param>
  84. /// <returns>返回分析是否成功</returns>
  85. public virtual bool Analyze(string ACode)
  86. {
  87. if (FSyntaxItems.Count <= 0)
  88. return false;
  89. if (ACode == null)
  90. return false;
  91. AnalyzeResluts.Clear();
  92. string vCode = ACode;
  93. bool vFind = true;
  94. while (vFind && (vCode.Length > 0))
  95. {
  96. vFind = false;
  97. foreach (SyntaxItem vSyntaxItem in FSyntaxItems)
  98. {
  99. if (Regex.IsMatch(vCode, vSyntaxItem.Pattern, vSyntaxItem.Options))
  100. {
  101. AnalyzeResluts.Add(new AnalyzeReslut(vSyntaxItem,
  102. Regex.Match(vCode, vSyntaxItem.Pattern,
  103. vSyntaxItem.Options).Value));
  104. vCode = Regex.Replace(vCode, vSyntaxItem.Pattern, "",
  105. vSyntaxItem.Options);
  106. vFind = true;
  107. break;
  108. }
  109. }
  110. }
  111. return true;
  112. }
  113. }
  114. class TSqlEngine : SyntaxEngine
  115. {
  116. public List<SyntaxEngine.AnalyzeResultSqlStruct> AnalyzeTSql(string TSqlCode)
  117. {
  118. List<AnalyzeResultSqlStruct> retSql = new List<AnalyzeResultSqlStruct>();
  119. if (this.Analyze(TSqlCode) == false) return null;
  120. List<AnalyzeReslut> ar = this.AnalyzeResluts;
  121. for (int i = 0; i < ar.Count; i++)
  122. {
  123. if (ar[i].Item.Name == "关键字" && ar[i].Block == "select")
  124. {
  125. if (CheckSelectInSegment(ar, i) == true) continue;
  126. for (int j = i; j < ar.Count; j++)
  127. {
  128. if (ar[j].Item.Name == "关键字" && ar[j].Block == "from")
  129. {
  130. if (CheckSelectIsLet(ar, i, j))
  131. {
  132. i = j + 1;
  133. break;
  134. }
  135. int wordIndex = LetTableInfo(ref retSql, ar, i, j);
  136. if (wordIndex >= j)
  137. {
  138. i = wordIndex;
  139. break;
  140. }
  141. }
  142. }
  143. }
  144. }
  145. return retSql;
  146. }
  147. private int LetTableInfo(ref List<AnalyzeResultSqlStruct> retSql, List<AnalyzeReslut> aResult, int SelectIndex, int FromIndex)
  148. {
  149. AnalyzeResultSqlStruct sqlStu = new AnalyzeResultSqlStruct();
  150. int endIndex = FromIndex;
  151. for (int k = FromIndex + 1; k < aResult.Count; k++)
  152. {
  153. if (aResult[k].Item.Name == "标识符" && string.IsNullOrEmpty(sqlStu.TableName))
  154. {
  155. sqlStu.TableName = aResult[k].Block;
  156. }
  157. else if (aResult[k].Item.Name == "关键字")
  158. {
  159. if (aResult[k].Block.ToLower() == "where")
  160. {
  161. for (int i = k + 1; i < aResult.Count; i++)
  162. {
  163. if ((aResult[i].Item.Name == "关键字") && aResult[i].Block.ToLower() != "and" && aResult[i].Block != "group")
  164. {
  165. endIndex = i - 1;
  166. break;
  167. }
  168. else
  169. {
  170. sqlStu.TableWhere += aResult[i].Block;
  171. }
  172. }
  173. }
  174. else
  175. {
  176. endIndex = FromIndex + 1;
  177. }
  178. }
  179. if (endIndex > FromIndex) break;
  180. }
  181. string strCol = "";
  182. for (int i = SelectIndex + 1; i <= FromIndex; i++)
  183. {
  184. if (i == FromIndex)
  185. {
  186. sqlStu.TableColumns.Add(strCol);
  187. break;
  188. }
  189. if (aResult[i].Item.Name == "标点符号" && aResult[i].Block == ",")
  190. {
  191. sqlStu.TableColumns.Add(strCol);
  192. strCol = "";
  193. }
  194. else
  195. {
  196. strCol += aResult[i].Block;
  197. }
  198. }
  199. retSql.Add(sqlStu);
  200. return endIndex;
  201. }
  202. private bool CheckSelectIsLet(List<AnalyzeReslut> aResult, int SelectIndex, int FromIndex)
  203. {
  204. for (int i = SelectIndex; i < FromIndex; i++)
  205. {
  206. if (aResult[i].Item.Name == "标点符号" && aResult[i].Block == "=")
  207. {
  208. return true;
  209. }
  210. }
  211. return false;
  212. }
  213. private bool CheckSelectInSegment(List<AnalyzeReslut> aResult, int i)
  214. {
  215. return false;
  216. }
  217. public TSqlEngine()
  218. {
  219. SyntaxItems.Add(new SyntaxItem(@"^\s+", RegexOptions.None,
  220. "空白", SyntaxItems.Count));
  221. SyntaxItems.Add(new SyntaxItem(@"^--[^\n]*[\n]?", RegexOptions.None,
  222. "单行注释", SyntaxItems.Count));
  223. SyntaxItems.Add(new SyntaxItem(@"^\/\*.*?\*\/", RegexOptions.None,
  224. "多行注释", SyntaxItems.Count));
  225. SyntaxItems.Add(new SyntaxItem(@"^(ABSOLUTE|ACTION|ADA|ADD|ADMIN|AFTER|AGGREGATE|ALIAS|ALL|ALLOCATE|ALTER|AND|ANY|ARE|ARRAY|AS|ASC|ASSERTION|AT|AUTHORIZATION|AVG|BACKUP|BEFORE|BEGIN|BETWEEN|BINARY|BIT|BIT_LENGTH|BLOB|BOOLEAN|BOTH|BREADTH|BREAK|BROWSE|BULK|BY|CALL|CASCADE|CASCADED|CASE|CAST|CATALOG|CHAR|CHAR_LENGTH|CHARACTER|CHARACTER_LENGTH|CHECK|CHECKPOINT|CLASS|CLOB|CLOSE|CLUSTERED|COALESCE|COLLATE|COLLATION|COLUMN|COMMIT|COMPLETION|COMPUTE|CONNECT|CONNECTION|CONSTRAINT|CONSTRAINTS|CONSTRUCTOR|CONTAINS|CONTAINSTABLE|CONTINUE|CONVERT|CORRESPONDING|COUNT|CREATE|CROSS|CUBE|CURRENT|CURRENT_DATE|CURRENT_PATH|CURRENT_ROLE|CURRENT_TIME|CURRENT_TIMESTAMP|CURRENT_USER|CURSOR|CYCLE|DATA|DATABASE|DATE|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFERRABLE|DEFERRED|DELETE|DENY|DEPTH|DEREF|DESC|DESCRIBE|DESCRIPTOR|DESTROY|DESTRUCTOR|DETERMINISTIC|DIAGNOSTICS|DICTIONARY|ISCONNECT|DISK|DISTINCT|DISTRIBUTED|DOMAIN|DOUBLE|DROP|DUMMY|DUMP|DYNAMIC|EACH|ELSE|END|END-EXEC|EQUALS|ERRLVL|ESCAPE|EVERY|EXCEPT|EXCEPTION|EXEC|EXECUTE|EXISTS|EXIT|EXTERNAL|EXTRACT|FALSE|FETCH|FILE|FILLFACTOR|FIRST|FLOAT|FOR|FOREIGN|FORTRAN|FOUND|FREE|FREETEXT|FREETEXTTABLE|FROM|FULL|FULLTEXTTABLE|FUNCTION|GENERAL|GET|GLOBAL|GO|GOTO|GRANT|GROUP|GROUPING|HAVING|HOLDLOCK|HOST|HOUR|IDENTITY|IDENTITY_INSERT|IDENTITYCOL|IF|IGNORE|IMMEDIATE|IN|INCLUDE|INDEX|INDICATOR|INITIALIZE|INITIALLY|INNER|INOUT|INPUT|INSENSITIVE|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|IS|ISOLATION|ITERATE|JOIN|KEY|KILL|LANGUAGE|LARGE|LAST|LATERAL|LEADING|LEFT|LESS|LEVEL|LIKE|LIMIT|LINENO|LOAD|LOCAL|LOCALTIME|LOCALTIMESTAMP|LOCATOR|LOWER|MAP|MATCH|MAX|MIN|MINUTE|MODIFIES|MODIFY|MODULE|MONTH|NAMES|NATIONAL|NATURAL|NCHAR|NCLOB|W|NEXT|NO|NOCHECK|NONCLUSTERED|NONE|NOT|NULL|NULLIF|NUMERIC|OBJECT|OCTET_LENGTH|OF|OFF|OFFSETS|OLD|ON|ONLY|OPEN|OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML|OPERATION|OPTION|OR|ORDER|ORDINALITY|OUT|OUTER|OUTPUT|OVER|OVERLAPS|PAD|PARAMETER|PARAMETERS|PARTIAL|PASCAL|PATH|PERCENT|PLAN|POSITION|POSTFIX|PRECISION|PREFIX|PREORDER|PREPARE|PRESERVE|PRIMARY|PRINT|PRIOR|PRIVILEGES|PROC|PROCEDURE|PUBLIC|RAISERROR|READ|READS|READTEXT|REAL|RECONFIGURE|RECURSIVE|REF|REFERENCES|REFERENCING|RELATIVE|REPLICATION|RESTORE|RESTRICT|RESULT|RETURN|RETURNS|REVOKE|RIGHT|ROLE|ROLLBACK|ROLLUP|ROUTINE|ROW|ROWCOUNT|ROWGUIDCOL|ROWS|RULE|SAVE|SAVEPOINT|SCHEMA|SCOPE|SCROLL|SEARCH|SECOND|SECTION|SELECT|SEQUENCE|SESSION|SESSION_USER|SET|SETS|SETUSER|SHUTDOWN|SIZE|SMALLINT|SOME|SPACE|SPECIFIC|SPECIFICTYPE|SQL|SQLCA|SQLCODE|SQLERROR|SQLEXCEPTION|SQLSTATE|SQLWARNING|START|STATE|STATEMENT|STATIC|STATISTICS|STRUCTURE|SUBSTRING|UM|SYSTEM_USER|TABLE|TEMPORARY|TERMINATE|TEXTSIZE|THAN|THEN|TIME|TIMESTAMP|TIMEZONE_HOUR|TIMEZONE_MINUTE|TO|TOP|TRAILING|TRAN|TRANSACTION|TRANSLATE|TRANSLATION|TREAT|TRIGGER|TRIM|TRUE|TRUNCATE|TSEQUAL|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UPDATE|UPDATETEXT|UPPER|USAGE|USE|USER|USING|VALUE|VALUES|VARCHAR|VARIABLE|VARYING|VIEW|WAITFOR|WHEN|WHENEVER|WHERE|WHILE|WITH|WITHOUT|WORK|WRITE|WRITETEXT|YEAR|ZONE)\b",
  226. RegexOptions.IgnoreCase, "关键字", SyntaxItems.Count));
  227. SyntaxItems.Add(new SyntaxItem(@"^(\+\=|\-\=|\&\&|\|\||\/\=|\&\=|\%\=|\~|\!|\+\+|\-\-|" +
  228. @"\$|\%|\^|\&|\*|\(|\)|\+|\-|\=|\{|\}|\[|\]|\\|\;|\:|\<|\>|\?|\,|\.|\/)+",
  229. RegexOptions.None, "标点符号", SyntaxItems.Count));
  230. SyntaxItems.Add(new SyntaxItem(@"^(\d+(?!\.|x|e|d|m)u?)|^0x([\da-f]+(?!\.|x|m)u?)",
  231. RegexOptions.IgnoreCase, "整数", SyntaxItems.Count));
  232. SyntaxItems.Add(new SyntaxItem(@"^(\d+)?\.\d+((\+|\-)?e\d+)?(m|d|f)?|^\d+((\+|\-)?e\d+)?(m|d|f)",
  233. RegexOptions.IgnoreCase, "浮点数", SyntaxItems.Count));
  234. SyntaxItems.Add(new SyntaxItem(@"^'(('')*([^'])*)*'?",
  235. RegexOptions.None, "字符串", SyntaxItems.Count));
  236. SyntaxItems.Add(new SyntaxItem(@"^""([^""])*""|^\[([^\[^\]])*\]|^[^""^\[]\w*|^@@*\w+|^#\w+", RegexOptions.None,
  237. "标识符", SyntaxItems.Count));
  238. }
  239. }
  240. /// <summary>
  241. /// C#语法分析引擎
  242. /// ZswangY37 wjhu111#21cn.com 2007-03-17 尊重作者,转贴请注明出处
  243. /// </summary>
  244. class CSharpEngine : SyntaxEngine
  245. {
  246. public CSharpEngine()
  247. {
  248. SyntaxItems.Add(new SyntaxItem(@"^\s+", RegexOptions.None,
  249. "空白", SyntaxItems.Count));
  250. SyntaxItems.Add(new SyntaxItem(@"^\/\/[^\n]*[\n]?", RegexOptions.None,
  251. "单行注释", SyntaxItems.Count));
  252. SyntaxItems.Add(new SyntaxItem(@"^\/\*.*?\*\/", RegexOptions.None,
  253. "多行注释", SyntaxItems.Count));
  254. SyntaxItems.Add(new SyntaxItem(@"^#\s*(define|elif|else|endif|endregion|" +
  255. @"error|if|line|pragma|region|undef|using|warning)\b[^\n]*[\n]?",
  256. RegexOptions.None, "指令", SyntaxItems.Count));
  257. SyntaxItems.Add(new SyntaxItem(@"^(abstract|event|new|struct|as|explicit|" +
  258. @"null|switch|base|extern|object|this|bool|false|operator|throw|break|" +
  259. @"finally|out|true|byte|fixed|override|try|case|float|params|typeof|" +
  260. @"catch|for|private|uint|char|foreach|protected|ulong|checked|goto|" +
  261. @"public|unchecked|class|if|readonly|unsafe|const|implicit|ref|ushort|" +
  262. @"continue|in|return|using|decimal|int|sbyte|virtual|default|interface|" +
  263. @"sealed|volatile|delegate|internal|short|void|do|is|sizeof|while|" +
  264. @"double|lock|stackalloc|else|long|static|enum|namespace|string)\b",
  265. RegexOptions.None, "关键字", SyntaxItems.Count));
  266. SyntaxItems.Add(new SyntaxItem(@"^(get|partial|set|value|where|yield)\b",
  267. RegexOptions.None, "上下文关键字", SyntaxItems.Count));
  268. SyntaxItems.Add(new SyntaxItem(@"^(\+\=|\-\=|\&\&|\|\||\/\=|\&\=|\%\=|\~|\!|\+\+|\-\-|" +
  269. @"\#|\$|\%|\^|\&|\*|\(|\)|\+|\-|\=|\{|\}|\[|\]|\\|\;|\:|\<|\>|\?|\,|\.|\/)+",
  270. RegexOptions.None, "标点符号", SyntaxItems.Count));
  271. SyntaxItems.Add(new SyntaxItem(@"^(\d+(?!\.|x|e|d|m)u?)|^0x([\da-f]+(?!\.|x|m)u?)",
  272. RegexOptions.IgnoreCase, "整数", SyntaxItems.Count));
  273. SyntaxItems.Add(new SyntaxItem(@"^(\d+)?\.\d+((\+|\-)?e\d+)?(m|d|f)?|^\d+((\+|\-)?e\d+)?(m|d|f)",
  274. RegexOptions.IgnoreCase, "浮点数", SyntaxItems.Count));
  275. SyntaxItems.Add(new SyntaxItem(@"^@""(("""")*([^""])*)*""|^""((\\\\)*(\\"")*(\\[a-z])*[^""^\\]*)*""",
  276. RegexOptions.None, "字符串", SyntaxItems.Count));
  277. SyntaxItems.Add(new SyntaxItem(@"^\'(\\\')*[^\']*\'", RegexOptions.None,
  278. "字符", SyntaxItems.Count));
  279. SyntaxItems.Add(new SyntaxItem(@"^\w*", RegexOptions.None,
  280. "标识符", SyntaxItems.Count));
  281. }
  282. /// <summary>
  283. /// 语法高亮引擎
  284. /// ZswangY37 wjhu111#21cn.com 2007-03-17 尊重作者,转贴请注明出处
  285. /// </summary>
  286. class SyntaxHighlight
  287. {
  288. public class HighlightItem
  289. {
  290. private Color FForeColor; // 前景色
  291. private bool FBold; // 是否加粗
  292. private bool FItalic; // 是否斜体
  293. private bool FUnderline; // 是否下划线
  294. public Color ForeColor { get { return FForeColor; } } // 前景色
  295. public bool Bold { get { return FBold; } } // 是否加粗
  296. public bool Italic { get { return FItalic; } } // 是否斜体
  297. public bool Underline { get { return FUnderline; } } // 是否下划线
  298. public HighlightItem(Color AForeColor, bool ABold, bool AItalic, bool AUnderline)
  299. {
  300. FForeColor = AForeColor;
  301. FBold = ABold;
  302. FItalic = AItalic;
  303. FUnderline = AUnderline;
  304. }
  305. }
  306. private List<SyntaxEngine.AnalyzeReslut> FAnalyzeResluts;
  307. private Font FDefaultFont;
  308. private List<HighlightItem> FHighlightItems = new List<HighlightItem>();
  309. public List<HighlightItem> HighlightItems { get { return FHighlightItems; } }
  310. public SyntaxHighlight(SyntaxEngine ASyntaxEngine, Font
  311. ADefaultFont)
  312. {
  313. FAnalyzeResluts = ASyntaxEngine.AnalyzeResluts;
  314. FDefaultFont = ADefaultFont;
  315. }
  316. /// <summary>
  317. /// 将文本中的RTF元素处理掉
  318. /// </summary>
  319. /// <param name="AText">输入的文本</param>
  320. /// <returns>返回处理后的RTF文本</returns>
  321. public string TextToRtf(string AText)
  322. {
  323. string Result = "";
  324. foreach (char vChar in AText)
  325. {
  326. switch (vChar)
  327. {
  328. case '\\':
  329. Result += @"\\";
  330. break;
  331. case '{':
  332. Result += @"\{";
  333. break;
  334. case '}':
  335. Result += @"\}";
  336. break;
  337. default:
  338. if (vChar > (char)127)
  339. Result += @"\u" + ((int)vChar).ToString() + "?";
  340. else
  341. Result += vChar;
  342. break;
  343. }
  344. }
  345. return Result;
  346. }
  347. [DllImport("user32.dll")]
  348. private static extern uint GetKBCodePage();
  349. [DllImport("kernel32.dll")]
  350. private static extern ushort GetSystemDefaultLangID();
  351. /// <summary>
  352. /// 将代码处理成RTF格式
  353. /// </summary>
  354. /// <returns>返回处理后的RTF文本</returns>
  355. public string MakeRtf()
  356. {
  357. if (HighlightItems.Count <= 0)
  358. return "";
  359. string Result = @"{\rtf1\ansi\ansicpg" + GetKBCodePage().ToString() +
  360. @"\deff0\deflang1033\deflangfe" + GetSystemDefaultLangID().ToString() +
  361. @"{\fonttbl{\f0\fmodern " +
  362. FDefaultFont.Name + ";}}\r\n";
  363. Result += @"{\colortbl ;";
  364. foreach (HighlightItem vHighlightItem in HighlightItems)
  365. Result += string.Format(@"\red{0}\green{1}\blue{2};",
  366. vHighlightItem.ForeColor.R, vHighlightItem.ForeColor.G,
  367. vHighlightItem.ForeColor.B);
  368. Result += "}\r\n";
  369. Result += @"\viewkind4\uc1\pard\f0\fs20" + "\r\n";
  370. bool vBold = false, vItalic = false, vUnderline = false;
  371. foreach (SyntaxEngine.AnalyzeReslut vAnalyzeReslut in
  372. FAnalyzeResluts)
  373. {
  374. int i = vAnalyzeReslut.Item.Index;
  375. if (i >= HighlightItems.Count)
  376. i = 0;
  377. if (vBold != HighlightItems[i].Bold)
  378. {
  379. if (HighlightItems[i].Bold)
  380. Result += @"\b1";
  381. else
  382. Result += @"\b0";
  383. }
  384. if (vItalic != HighlightItems[i].Italic)
  385. {
  386. if (HighlightItems[i].Italic)
  387. Result += @"\i1";
  388. else
  389. Result += @"\i0";
  390. }
  391. if (vItalic != HighlightItems[i].Underline)
  392. {
  393. if (HighlightItems[i].Underline)
  394. Result += @"\ul1";
  395. else
  396. Result += @"\ul0";
  397. }
  398. Result += string.Format(@"\cf{0} ", i + 1);
  399. vBold = HighlightItems[i].Bold;
  400. vItalic = HighlightItems[i].Italic;
  401. vUnderline = HighlightItems[i].Underline;
  402. Result += TextToRtf(vAnalyzeReslut.Block).Replace("\r\n",
  403. "\r\n" + @"\par");
  404. }
  405. return Result + "}";
  406. }
  407. /// <summary>
  408. /// 将文本中的HTML元素处理掉
  409. /// </summary>
  410. /// <param name="AText">输入的文本</param>
  411. /// <returns>返回处理后的HTML文本</returns>
  412. private string TextToHtml(string AText)
  413. {
  414. string Result = "";
  415. foreach (char vChar in AText)
  416. {
  417. switch (vChar)
  418. {
  419. case '&':
  420. Result += @"&amp;";
  421. break;
  422. case ' ':
  423. Result += @"&nbsp;";
  424. break;
  425. case '<':
  426. Result += @"&lt;";
  427. break;
  428. case '>':
  429. Result += @"&gt;";
  430. break;
  431. case '"':
  432. Result += @"&quot;";
  433. break;
  434. //case '\n':
  435. // Result += @"<br>";
  436. // break;
  437. default:
  438. if (vChar > (char)127)
  439. Result += @"&#" + ((int)vChar).ToString() + ";";
  440. else
  441. Result += vChar;
  442. break;
  443. }
  444. }
  445. return Result;
  446. }
  447. /// <summary>
  448. /// 将颜色处理为HTML表达的方式
  449. /// </summary>
  450. /// <param name="AColor">输入的颜色</param>
  451. /// <returns>返回HTML颜色表达式</returns>
  452. private string ColorToHtml(Color AColor)
  453. {
  454. return string.Format("#{0:X2}{1:X2}{2:X2}", AColor.R, AColor.G, AColor.B);
  455. }
  456. /// <summary>
  457. /// 将代码处理为HTML文本
  458. /// </summary>
  459. /// <returns>返回处理后的HTML文本</returns>
  460. public string MakeHtml()
  461. {
  462. string Result = @"<code><pre style=""font-size:" + FDefaultFont.Size +
  463. @"pt;font-family:" + FDefaultFont.Name + @""">";
  464. foreach (SyntaxEngine.AnalyzeReslut vAnalyzeReslut in
  465. FAnalyzeResluts)
  466. {
  467. int i = vAnalyzeReslut.Item.Index;
  468. if (i >= HighlightItems.Count)
  469. i = 0;
  470. string vLeft = string.Format(@"<span style=""color={0}"">",
  471. ColorToHtml(HighlightItems[i].ForeColor));
  472. string vRight = "</span>";
  473. if (HighlightItems[i].Bold)
  474. {
  475. vLeft += "<b>";
  476. vRight = "</b>" + vRight;
  477. }
  478. if (HighlightItems[i].Italic)
  479. {
  480. vLeft += "<i>";
  481. vRight = "</i>" + vRight;
  482. }
  483. if (HighlightItems[i].Underline)
  484. {
  485. vLeft += "<u>";
  486. vRight = "</u>" + vRight;
  487. }
  488. Result += vLeft + TextToHtml(vAnalyzeReslut.Block) + vRight;
  489. }
  490. return Result + "</pre></code>";
  491. }
  492. }
  493. /// <summary>
  494. /// C#语法高亮引擎
  495. /// </summary>
  496. class CSharpHighlight : SyntaxHighlight
  497. {
  498. public CSharpHighlight(SyntaxEngine ASyntaxEngine, Font
  499. ADefaultFont)
  500. : base(ASyntaxEngine, ADefaultFont)
  501. {
  502. //空白
  503. HighlightItems.Add(new HighlightItem(Color.White, false, false, false));
  504. //单行注释
  505. HighlightItems.Add(new HighlightItem(Color.Green, false, false, false));
  506. //多行注释
  507. HighlightItems.Add(new HighlightItem(Color.Green, false, false, false));
  508. //指令
  509. HighlightItems.Add(new HighlightItem(Color.Blue, false, false, false));
  510. //关键字
  511. HighlightItems.Add(new HighlightItem(Color.Black, true, false, false));
  512. //上下文关键字
  513. HighlightItems.Add(new HighlightItem(Color.Black, true, false, false));
  514. //标点符号
  515. HighlightItems.Add(new HighlightItem(Color.BlueViolet, false, false, false));
  516. //整数
  517. HighlightItems.Add(new HighlightItem(Color.Red, true, false, false));
  518. //浮点数
  519. HighlightItems.Add(new HighlightItem(Color.Red, true, false, false));
  520. //字符串
  521. HighlightItems.Add(new HighlightItem(Color.Maroon, false, false, false));
  522. //字符
  523. HighlightItems.Add(new HighlightItem(Color.Maroon, false, false, false));
  524. //标识符
  525. HighlightItems.Add(new HighlightItem(Color.Black, false, false, false));
  526. }
  527. }
  528. }
  529. }