DataHelper.cs 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696
  1. using System;
  2. using System.IO;
  3. using System.Windows;
  4. using System.Drawing;//using System.IO.Pipes;
  5. using FarsiLibrary.Win;
  6. using FastColoredTextBoxNS;
  7. using System.Windows.Controls;
  8. using System.Collections.Generic;
  9. using System.Text.RegularExpressions;
  10. using System.Web.Script.Serialization;
  11. namespace MPE
  12. {
  13. static class DataHelper
  14. {
  15. static Grid stateGrid;
  16. static FATabStrip Tabs;
  17. static TextBox commandsToolTip;
  18. static TabControl commandsControl;
  19. static Properties.Settings param = Properties.Settings.Default;
  20. static System.Windows.Threading.DispatcherTimer checkErrorTimer;
  21. static MenuItem commandTipsCB, commandCB, stateLineCB, codeMapCB, syntaxHighlighting;
  22. public static FastColoredTextBox field { get => Tabs.SelectedItem.Controls[0] as FastColoredTextBox; }
  23. static string iniFile = Environment.CurrentDirectory + "\\workDir\\settings.ini";
  24. public static string workDir = Environment.CurrentDirectory + "\\workDir\\";
  25. static readonly string errorSettings = "111111110111111111111";
  26. static System.Windows.Forms.Integration.WindowsFormsHost fieldProvider, codeMapProvider;
  27. public static readonly Regex brakets = new Regex(@"\s*{{\s*\[*.*}}\s*$"),
  28. brakets_1 = new Regex(@"^\s*{{\s*\[*.*}}\s*$"),
  29. brakets_from_begin = new Regex(@"^\s*{{.*}}\s*"),
  30. brakets_all = new Regex(@"{{.*}}"),
  31. brakets_begin = new Regex(@"^\s*{{\s*"),
  32. brakets_begin_all = new Regex(@"^\s*{+.*"),
  33. brakets_begin_multi_comment = new Regex(@"^\s*{{\s*\n?"),
  34. brakets_end = new Regex(@"\s*}}\s*$"),
  35. brakets_end_all = new Regex(@".*}}"),
  36. brakets_end_all_multi = new Regex(@"^\s*}}"),
  37. BREAK_POINT = new Regex(@"^\s*\[(BREAK_POINT){1}\]"),
  38. GO_TO_BREAK_POINT = new Regex(@"^\s*\[(GO_TO_BREAK_POINT){1}\]"),
  39. comment_rgx = new Regex(@"(^\s*{{(\n|\w|\W[^}])*\s*}})|({{.*}})");
  40. public static void Init(ref FATabStrip Tabs, ref TextBox commandsToolTip, ref MenuItem commandTipsCB, ref TabControl commandsControl, ref MenuItem commandCB, ref System.Windows.Threading.DispatcherTimer checkErrorTimer, ref MenuItem codeMapCB, ref System.Windows.Forms.Integration.WindowsFormsHost fieldProvider, ref Grid stateGrid, ref System.Windows.Forms.Integration.WindowsFormsHost codeMapProvider, ref MenuItem stateLineCB, ref MenuItem syntaxHighlighting)
  41. {
  42. DataHelper.Tabs = Tabs; DataHelper.commandsToolTip = commandsToolTip; DataHelper.commandTipsCB = commandTipsCB; DataHelper.commandsControl = commandsControl; DataHelper.commandCB = commandCB; DataHelper.checkErrorTimer = checkErrorTimer; DataHelper.codeMapCB = codeMapCB; DataHelper.fieldProvider = fieldProvider; DataHelper.stateGrid = stateGrid; DataHelper.codeMapProvider = codeMapProvider; DataHelper.stateLineCB = stateLineCB; DataHelper.syntaxHighlighting = syntaxHighlighting;
  43. IniFile.Init(ref iniFile);
  44. CodeMapCB_Click();//Предыдущее состояние карты кода
  45. CommandCB_Click();//Предыдущее состояние боковой панели
  46. CommandTips_Click();//Предыдущее состояние панели с подсказками
  47. StateLineCB_Click();//Предыдущее состояние строки состояния
  48. }
  49. //public static void DisposeService() => pipeClient.Dispose(); public static void SendToServer(string send) { StreamWriter sw = new StreamWriter(pipeClient); try { sw.WriteLine(send); sw.Flush(); pipeClient.Close(); } catch (Exception ex) { MessageBox.Show("Не удалось передать из-за:\n" + ex.Message); } } static NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", "MPE_pipe1", PipeDirection.InOut, PipeOptions.None); public static bool TryConnect() { try { if (pipeClient.IsConnected != true) { System.Threading.Tasks.Task t = System.Threading.Tasks.Task.Run(() => pipeClient.Connect(1)); t.Wait(5000); if (pipeClient.NumberOfServerInstances > 1) return true; return false; } return false;/* Подключились, но не прошли валидацию*/ } catch (Exception) { return false; } }
  50. #region Load_and_Save_Settings
  51. public static void loadSettings()
  52. {// Загрузка настроек приложения из ini-файла
  53. try
  54. {
  55. if (!File.Exists(iniFile)) { File.Create(iniFile).Close(); throw new Exception(); }
  56. if (bool.TryParse(IniFile.Read("Settings", "isErrorList"), out bool isErrorList))
  57. param.isErrorList = isErrorList;
  58. else { param.isErrorList = true; }
  59. if (bool.TryParse(IniFile.Read("Settings", "isCheckUpdates"), out bool isCheckUpdates))
  60. param.isCheckUpdates = isCheckUpdates;
  61. else { param.isCheckUpdates = true; }
  62. if (bool.TryParse(IniFile.Read("Settings", "isCodeMap"), out bool isCodeMap))
  63. param.isCodeMap = isCodeMap;
  64. else { param.isCodeMap = true; }
  65. if (bool.TryParse(IniFile.Read("Settings", "isCommands"), out bool isCommands))
  66. param.isCommands = isCommands;
  67. else { param.isCommands = true; }
  68. if (int.TryParse(IniFile.Read("Settings", "codeMapSize"), out int codeMapSize))
  69. param.codeMapSize = codeMapSize;
  70. else { param.codeMapSize = 140; }
  71. if (bool.TryParse(IniFile.Read("Settings", "isMakeBackUp"), out bool isMakeBackUp))
  72. param.isMakeBackUp = isMakeBackUp;
  73. else { param.isMakeBackUp = true; }
  74. if (bool.TryParse(IniFile.Read("Settings", "isOpenLastFile"), out bool isOpenLastFile))
  75. param.isOpenLastFile = isOpenLastFile;
  76. else { param.isOpenLastFile = false; }
  77. string fieldFont = IniFile.Read("Settings", "fieldFont").ToString();
  78. string[] data = fieldFont.Split(new char[] { ',' });
  79. if (data.Length >= 5)
  80. {
  81. string name = data[0].Remove(0, 12);
  82. double size;
  83. if (data.Length == 6) size = Convert.ToDouble($"{data[1].Remove(0, 6)},{data[2]}");
  84. else size = Convert.ToDouble(data[1].Remove(0, 6));
  85. param.fieldFont = new Font(name, (float)size, System.Drawing.FontStyle.Regular, GraphicsUnit.Pixel, 1, false);
  86. }
  87. else { param.fieldFont = new Font("Consolas", 16.0f); }
  88. if (bool.TryParse(IniFile.Read("Settings", "isLineNumeric"), out bool isLineNumeric))
  89. param.isLineNumeric = isLineNumeric;
  90. else { param.isLineNumeric = true; }
  91. if (bool.TryParse(IniFile.Read("Settings", "isSaveWindowSize"), out bool isSaveWindowSize))
  92. param.isSaveWindowSize = isSaveWindowSize;
  93. else { param.isSaveWindowSize = true; }
  94. MatchCollection mc = new Regex(@"\d+").Matches(IniFile.Read("Settings", "lastWindowSize"));
  95. if (mc.Count == 2)
  96. param.lastWindowSize = new System.Drawing.Size(Convert.ToInt32(mc[0].Value), Convert.ToInt32(mc[1].Value));
  97. else { param.lastWindowSize = new System.Drawing.Size(1024, 720); }
  98. param.taskFoler = IniFile.Read("Settings", "taskFoler");
  99. if (bool.TryParse(IniFile.Read("Settings", "isCommandTips"), out bool isCommandTips))
  100. param.isCommandTips = isCommandTips;
  101. else { param.isCommandTips = true; }
  102. if (bool.TryParse(IniFile.Read("Settings", "isStateLine"), out bool isStateLine))
  103. param.isStateLine = isStateLine;
  104. else { param.isStateLine = true; }
  105. if (bool.TryParse(IniFile.Read("Settings", "isFieldCurrLineColored"), out bool isFieldCurrLineColored))
  106. param.isFieldCurrLineColored = isFieldCurrLineColored;
  107. else { param.isStateLine = true; }
  108. if (int.TryParse(IniFile.Read("Settings", "errorTimer"), out int errorTimer))
  109. checkErrorTimer.Interval = new TimeSpan(0, 0, 0, 0, param.errorTimer = errorTimer);
  110. else { param.errorTimer = 100; }
  111. if (bool.TryParse(IniFile.Read("Settings", "selectedTheme"), out bool selectedTheme))
  112. param.selectedTheme = selectedTheme;
  113. else { param.selectedTheme = true; }
  114. string darkTheme = (IniFile.Read("Settings", "darkTheme"));
  115. string[] split;
  116. if (darkTheme.Length > 0)
  117. {
  118. split = darkTheme.Split(new char[] { '|' });
  119. if (split.Length > 0)
  120. {
  121. param.darkTheme = new System.Collections.Specialized.StringCollection();
  122. for (int i = 0; i < split.Length; i++) param.darkTheme.Add(split[i]);
  123. }
  124. else { setDarkColors(); }
  125. }
  126. else { setDarkColors(); }
  127. string lightTheme = (IniFile.Read("Settings", "lightTheme"));
  128. if (lightTheme.Length > 0)
  129. {
  130. split = lightTheme.Split(new char[] { '|' });
  131. if (split.Length > 0)
  132. {
  133. param.lightTheme = new System.Collections.Specialized.StringCollection();
  134. for (int i = 0; i < split.Length; i++) param.lightTheme.Add(split[i]);
  135. }
  136. else { setLightsColors(); }
  137. }
  138. else { setLightsColors(); }
  139. if (darkTheme == null || lightTheme == null)
  140. { setDarkColors(); setLightsColors(); }
  141. else { ReInitColors(); }
  142. string indentBools = (IniFile.Read("Settings", "indentBools"));
  143. if (indentBools.Length > 0)
  144. param.indentBools = indentBools;
  145. else { param.indentBools = "11000000"; }
  146. string errorSettings = (IniFile.Read("Settings", "errorSettings"));
  147. if (errorSettings.Length >= DataHelper.errorSettings.Length)
  148. param.errorSettings = errorSettings;
  149. else
  150. {
  151. while (errorSettings.Length < DataHelper.errorSettings.Length)
  152. errorSettings += '1';
  153. param.errorSettings = errorSettings;
  154. }
  155. if (int.TryParse(IniFile.Read("Settings", "popupMenuTimer"), out int popupMenuTimer) && popupMenuTimer > 0)
  156. {
  157. param.popupMenuTimer = popupMenuTimer;
  158. AutoCompleete.setTimer(popupMenuTimer);
  159. }
  160. else { param.popupMenuTimer = 1; AutoCompleete.setTimer(popupMenuTimer); }
  161. if (bool.TryParse(IniFile.Read("Settings", "isErrorTimer"), out bool isErrorTimer))
  162. param.isErrorTimer = isErrorTimer;
  163. else { param.isErrorTimer = false; }
  164. if (int.TryParse(IniFile.Read("Settings", "whenCopyErrorMsg"), out int whenCopyErrorMsg))
  165. param.whenCopyErrorMsg = whenCopyErrorMsg;
  166. else { param.whenCopyErrorMsg = 0; }
  167. if (bool.TryParse(IniFile.Read("Settings", " isSyntaxHighlighting"), out bool isSyntaxHighlighting))
  168. param.isSyntaxHighlighting = isSyntaxHighlighting;
  169. else { param.isSyntaxHighlighting = true; }
  170. param.Save();
  171. }
  172. catch
  173. {
  174. setDarkColors(); setLightsColors();
  175. param.isErrorList = param.isCheckUpdates = param.isCodeMap = param.isCommands = param.isMakeBackUp = param.isLineNumeric = param.isSaveWindowSize = param.isCommandTips = param.isStateLine = param.selectedTheme = param.isSyntaxHighlighting = true;
  176. param.fieldFont = new Font("Consolas", 16.0f);
  177. param.lastWindowSize = new System.Drawing.Size(1024, 720);
  178. param.codeMapSize = 140;
  179. param.errorTimer = 100;
  180. param.indentBools = "11000000";
  181. param.errorSettings = errorSettings;
  182. param.popupMenuTimer = 1;
  183. param.isOpenLastFile = param.isErrorTimer = false;
  184. param.whenCopyErrorMsg = 0;
  185. param.Save();
  186. }
  187. }
  188. public static void setDarkColors() { param.darkTheme = new System.Collections.Specialized.StringCollection() { "#232629", "#FFF", "#FFF", "#232629", "#00FFFF", "#D26922", "#20B2AA", "#FF2E2C", "#EEC900", "#00FF10", "#FF2E2C", "#000", "#E89F0E", "#FFF", "#d3d3d3" }; param.Save(); }
  189. public static void setLightsColors() { param.lightTheme = new System.Collections.Specialized.StringCollection() { "#FFF", "#000", "#000", "#FFF", "#FF0000", "#D26922", "#20B2AA", "#FF2E2C", "#EEC900", "#545656", "#FF2E2C", "#fff", "#E89F0E", "#FFF", "#d3d3d3" }; param.Save(); }
  190. public static void SaveSettings()
  191. {// Сохраняет настройки приложения в ini-файл
  192. if (!File.Exists(iniFile)) File.Create(iniFile).Close();
  193. IniFile.Write("Settings", "isErrorList", param.isErrorList);
  194. IniFile.Write("Settings", "isCheckUpdates", param.isCheckUpdates);
  195. IniFile.Write("Settings", "isCodeMap", param.isCodeMap);
  196. IniFile.Write("Settings", "isCommands", param.isCommands);
  197. IniFile.Write("Settings", "codeMapSize", param.codeMapSize);
  198. IniFile.Write("Settings", "isMakeBackUp", param.isMakeBackUp);
  199. IniFile.Write("Settings", "isOpenLastFile", param.isOpenLastFile);
  200. if (param.fieldFont == null) param.fieldFont = new Font("Consolas", 16.0f);
  201. IniFile.Write("Settings", "fieldFont", param.fieldFont);
  202. IniFile.Write("Settings", "isLineNumeric", param.isLineNumeric);
  203. IniFile.Write("Settings", "isSaveWindowSize", param.isSaveWindowSize);
  204. IniFile.Write("Settings", "lastWindowSize", param.lastWindowSize);
  205. IniFile.Write("Settings", "isCommandTips", param.isCommandTips);
  206. IniFile.Write("Settings", "isStateLine", param.isStateLine);
  207. IniFile.Write("Settings", "isStateLine", param.isStateLine);
  208. IniFile.Write("Settings", "taskFoler", param.taskFoler);
  209. IniFile.Write("Settings", "isFieldCurrLineColored", param.isFieldCurrLineColored);
  210. IniFile.Write("Settings", "errorTimer", param.errorTimer);
  211. IniFile.Write("Settings", "selectedTheme", param.selectedTheme);
  212. if (param.darkTheme == null || param.darkTheme.Count == 0) setDarkColors();
  213. IniFile.Write("Settings", "darkTheme", getColors(param.darkTheme));
  214. if (param.lightTheme == null || param.lightTheme.Count == 0) setLightsColors();
  215. IniFile.Write("Settings", "lightTheme", getColors(param.lightTheme));
  216. if (param.indentBools.Length == 0) param.indentBools = "11000000";
  217. IniFile.Write("Settings", "indentBools", param.indentBools);
  218. if (param.errorSettings.Length == 0) param.errorSettings = errorSettings;
  219. IniFile.Write("Settings", "errorSettings", param.errorSettings);
  220. IniFile.Write("Settings", "popupMenuTimer", param.popupMenuTimer);
  221. IniFile.Write("Settings", "isErrorTimer", param.isErrorTimer);
  222. IniFile.Write("Settings", "whenCopyErrorMsg", param.whenCopyErrorMsg);
  223. IniFile.Write("Settings", "isSyntaxHighlighting", param.isSyntaxHighlighting);
  224. }
  225. public static void setErrorTimer(int value) => checkErrorTimer.Interval = new TimeSpan(0, 0, 0, 0, value);
  226. static string getColors(System.Collections.Specialized.StringCollection theme)
  227. {
  228. System.Collections.Specialized.StringEnumerator en = theme.GetEnumerator();
  229. string output = "";
  230. while (en.MoveNext())
  231. output += en.Current + '|';
  232. return output.Length > 0 ? output.Remove(output.Length - 1, 1) : output;
  233. }
  234. #endregion
  235. #region InsertWords
  236. public static void InsertWord(ref object sender)
  237. {// Вставка функции без параметров
  238. string item = (sender as Button).Content.ToString();
  239. commandsToolTip.Text = ToolTips.getToolTipForItem(item);
  240. if (item == "[...]") field.InsertText("[]");
  241. else if (item == "{}{{ }}") field.InsertText("{{ }}");
  242. else field.InsertText(item);
  243. }
  244. public static void InsertOneBracketsWord(ref object sender)
  245. {// Вставка функции с 1-м параметром
  246. string item = (sender as Button).Content.ToString();
  247. commandsToolTip.Text = ToolTips.getToolTipForItem(item);
  248. if (item == "[COLOR_TRESHOLD]") field.InsertText(item + "[128]");
  249. else if (item == "[CUT_GRID]") field.InsertText(item + "[4:5]");
  250. else if (item == "[SPLIT_SHADES_EX]") field.InsertText(item + "[0]");
  251. else if (item == "[COMPLETE_MAKE_MODEL]") field.InsertText(item + "[$MODEL_NAME]");
  252. else if (item == "[TESSERACT]") field.InsertText(item + "[$MODEL_NAME_captcha.png]");
  253. else field.InsertText(item + "[]");
  254. }
  255. public static void InsertTwoBracketsWord(ref object sender)
  256. {// Вставка функции с 2-я параметрами
  257. string item = (sender as Button).Content.ToString();
  258. commandsToolTip.Text = ToolTips.getToolTipForItem(item);
  259. if (item == "[VERSION]") field.InsertText(item + "[1][VPATH]");
  260. else field.InsertText(item + "[][]");
  261. }
  262. public static void InsertThreeBracketsWord(ref object sender)
  263. {// Вставка функции с 3-я параметрами
  264. string item = (sender as Button).Content.ToString();
  265. commandsToolTip.Text = ToolTips.getToolTipForItem(item);
  266. field.InsertText(item + "[][][]");
  267. }
  268. #endregion
  269. #region Click_Events
  270. public static void CommandTips_Click()
  271. {
  272. if (param.isCommandTips = commandTipsCB.IsChecked) Grid.SetRowSpan(commandsControl, 1);// Показываем панель с подсказками
  273. else Grid.SetRowSpan(commandsControl, 3);// Скрываем панель с подсказками
  274. param.Save();
  275. }
  276. public static void CodeMapCB_Click()
  277. {
  278. if (param.isCodeMap = codeMapCB.IsChecked)
  279. {// Показываем карту кода
  280. if (commandCB.IsChecked) { Grid.SetColumnSpan(fieldProvider, 2); Grid.SetColumnSpan(stateGrid, 2); }
  281. else { Grid.SetColumnSpan(fieldProvider, 3); Grid.SetColumnSpan(stateGrid, 3); }
  282. codeMapProvider.Visibility = Visibility.Visible;
  283. }
  284. else
  285. {// Скрываем карту кода
  286. if (commandCB.IsChecked) { Grid.SetColumnSpan(fieldProvider, 3); Grid.SetColumnSpan(stateGrid, 3); }
  287. else { Grid.SetColumnSpan(fieldProvider, 4); Grid.SetColumnSpan(stateGrid, 4); }
  288. codeMapProvider.Visibility = Visibility.Hidden;
  289. }; param.Save();
  290. }
  291. public static void CommandCB_Click()
  292. {
  293. if (param.isCommands = commandCB.IsChecked)
  294. {// Показываем боковую панель
  295. Grid.SetColumn(fieldProvider, 1);
  296. if (codeMapCB.IsChecked) { Grid.SetColumnSpan(fieldProvider, 2); Grid.SetColumnSpan(stateGrid, 2); }
  297. else { Grid.SetColumnSpan(fieldProvider, 3); Grid.SetColumnSpan(stateGrid, 3); }
  298. Grid.SetColumn(stateGrid, 1);
  299. }
  300. else
  301. {// Скрываем боковую панель
  302. Grid.SetColumn(fieldProvider, 0);
  303. if (codeMapCB.IsChecked) { Grid.SetColumnSpan(fieldProvider, 3); Grid.SetColumnSpan(stateGrid, 3); }
  304. else { Grid.SetColumnSpan(fieldProvider, 4); Grid.SetColumnSpan(stateGrid, 4); }
  305. Grid.SetColumn(stateGrid, 0);
  306. }; param.Save();
  307. }
  308. public static void StateLineCB_Click()
  309. {// Показываем/скрываем строку состояния
  310. if (param.isStateLine = stateLineCB.IsChecked) { stateGrid.Visibility = Visibility.Visible; Grid.SetRowSpan(fieldProvider, 2); }
  311. else { stateGrid.Visibility = Visibility.Hidden; Grid.SetRowSpan(fieldProvider, 3); }; param.Save();
  312. }
  313. public static void Field_MouseDoubleClick(System.Drawing.Point e)
  314. {// Выделить параметры функции при двойном нажатии
  315. int l = field.PointToPlace(e).iLine;
  316. string currLine = field.GetLine(l).Text.Replace("\\]", "@@").Replace("\\[", "@@");
  317. int i = field.PointToPlace(e).iChar;
  318. if (i < currLine.Length)
  319. for (int j = i; j > 0; j--)
  320. if (currLine[j] == '[')
  321. {
  322. for (int d = i; d < currLine.Length; d++)
  323. if (currLine[d] == ']')
  324. {
  325. field.Selection = new Range(field, new Place(j + 1, l), new Place(d, l));
  326. break;
  327. }
  328. break;
  329. }
  330. }
  331. #endregion
  332. #region Colors
  333. public static void ReInitColors()
  334. {
  335. Brackets.ForeBrush = new SolidBrush(ColorTranslator.FromHtml(getThemeColor(5)));
  336. Command.ForeBrush = new SolidBrush(ColorTranslator.FromHtml(getThemeColor(6)));
  337. Varable.ForeBrush = new SolidBrush(ColorTranslator.FromHtml(getThemeColor(7)));
  338. Keywords.ForeBrush = new SolidBrush(ColorTranslator.FromHtml(getThemeColor(8)));
  339. Comment.ForeBrush = new SolidBrush(ColorTranslator.FromHtml(getThemeColor(9)));
  340. UserVarable.ForeBrush = new SolidBrush(ColorTranslator.FromHtml(getThemeColor(10)));
  341. }
  342. public static TextStyle Brackets { get; set; } = new TextStyle(new SolidBrush(ColorTranslator.FromHtml(getThemeColor(5))), null, System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Regular);
  343. public static TextStyle Command { get; set; } = new TextStyle(new SolidBrush(ColorTranslator.FromHtml(getThemeColor(6))), null, System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Regular);
  344. public static TextStyle Varable { get; set; } = new TextStyle(new SolidBrush(ColorTranslator.FromHtml(getThemeColor(7))), null, System.Drawing.FontStyle.Regular);
  345. public static TextStyle Keywords { get; set; } = new TextStyle(new SolidBrush(ColorTranslator.FromHtml(getThemeColor(8))), null, System.Drawing.FontStyle.Regular);
  346. public static TextStyle Comment { get; set; } = new TextStyle(new SolidBrush(ColorTranslator.FromHtml(getThemeColor(9))), null, System.Drawing.FontStyle.Regular);
  347. public static TextStyle UserVarable { get; set; } = new TextStyle(new SolidBrush(ColorTranslator.FromHtml(getThemeColor(10))), null, System.Drawing.FontStyle.Regular);
  348. public static string getThemeColor(int index)
  349. {
  350. if (param.darkTheme != null && param.lightTheme != null)
  351. return param.selectedTheme ? param.darkTheme[index] : param.lightTheme[index];
  352. if (index == 0) return param.selectedTheme ? "#232629" : "#fff";
  353. if (index == 1) return param.selectedTheme ? "#fff" : "#000";
  354. if (index == 2) return param.selectedTheme ? "#fff" : "#000";
  355. if (index == 3) return param.selectedTheme ? "#232629" : "#fff";
  356. if (index == 4) return param.selectedTheme ? "#0ff" : "#f00";
  357. if (index == 5) return "#D26922";
  358. if (index == 6) return "#20B2AA";
  359. if (index == 7) return "#FF2E2C";
  360. if (index == 8) return "#EEC900";
  361. if (index == 9) return "#00FF10";
  362. if (index == 10) return "#FF2E2C";
  363. if (index == 11) return param.selectedTheme ? "#000" : "#fff";
  364. if (index == 12) return "#E89F0E";
  365. if (index == 13) return "#FFF";
  366. if (index == 14) return "#d3d3d3";
  367. return "#000";
  368. }
  369. public static Color getColorFromHex(string hex) => ColorTranslator.FromHtml(hex);
  370. static readonly string commnd = @"(\[(LOG_DISPLAY|DISPLAY(_BUFFER|_REQUEST|_IMG|_ARRAY_IMG)?|PARSE_JSON|(REG_)?PARSE|TO_BASE64|(COMPARE_WITH|SORT|ADD_IN|USE|COOKIE_TO)_BUFFER|FROM_(BASE64(_TO_FILE)?|FILE_TO_BASE64)|FIND_(TEXT|IN_BINARY_LINE_FILE|PIXEL|ARRAY_IMG_IN_MODEL_LIST|IMG_LIST_ON_IMG)|URL_ENCODE|URL_DECODE|HASH|GEN_PASSWORD|IS_NUMERIC|CLEAR_(BUFFER|REQUEST|TEMPLATE_MEMORY|TRANSPARENT|INTERFERENCE|GRADIENT|LINES|ALL_COOKIES|ADDED_HEADERS)|SPLIT_(STR|BLACK_END|CIRCUIT(_EX)?|WIDTH|SHADES(_EX)?)|GET_CHAR|UPP_LOW_STR|STR_(REPLACE|LEN|MID)|RAND|TRIMMED|STR_TO_UTF8|OPERATIONS_WITH_BUFFERS|IF|ELSE|ENDIF|BREAK_POINT|GO_TO_BREAK_POINT|INCLUDE|PLAY_SOUND|EXIT_TASK|REPEAT_TASK|VERSION|SLEEP|SET_(MODEL_SETTINGS|INCOM|IMAGE_TO_ARRAY_IMG|SPLIT_EX_FILTER|USER_AGENT|REFERER|HOST|TIMEOUT|COOKIE|KEEP_ALIVE|PHP_GATE)|CBROWSER_COMMAND|EVALUATE_JS|JS|\/JS|EXEC_SQL|VAR|MUTEX|STATIONARY_CBROWSER_COMMAND|GDATE|WRITE_IN_FILE|ADD_TO_FILE|READ_FILE_ALL|READ_FILE_LINE|WRITE_BUFFER_IN_FILE|SAVE_CLEAR_REQUEST|DELETE(_(FILE|DIR))?|RENAME_FILE|MOVE_FILE|FILE_EXISTS|CREATE_DIR|RENAME_DIR|FOLDER_EXISTS|READ_BINARY_LINE_FILE|CREATE_BINARY_LINE_FILE|COUNT_LINE_IN_BINARI_FILE|OPEN_URL_IN_LOCAL_BROWSER|RUN_FILE|LOAD_CAPTCHA|SAVE_CAPTCHA|CONVERT_IMG|GET_IMAGE_FROM_ARRAY_IMG|DELL_IMAGE_FORM_ARRAY_IMG|ARRAY_TO_IMAGE|COMPARE_IMAGES|GET_IMAGE_INFO|ENTER_CAPTCHA|COLOR_TRESHOLD|CHANGE_COLOR_IF_NOT_THIS_COLOR|APPLY_NEGATIVE|SEAL_MICROCRACKS|RGB_COLOR_TRESHOLD|CHANGE_COLOR_ON_COLOR|ONE_OF_RGB_TO_BLACK|ALIGN_IMG_ARRAY|ALIGN_IMG|CROP_ALL_SIDE|CROP|COPY_(IMAGE|COOKIE|FILE|DIR|TO_CLIPBOARD)|CUT_GRID|COMPRESS_SHADES|START_MAKE_MODEL|END_MAKE_MODEL|COMPLETE_MAKE_MODEL|RUCAPTCHA|CAPTCHA_PROEVOLITION|TESSERACT|ABBYY_READER|LOGICAL_READER|RECAPTCHA_READER|XEVIL|GET|POST_MULTIPART|POST|PUT|PASS_CLOUDFLARE|AJAX_(GET|POST|PUT)|REQUEST_TO_UTF|SAVE_COOKIE|LOAD_COOKIE|ADD_HEADER|ADD_TEMPORARY_HEADER|DELL_ADDED_HEADER|USE_PROXY|DELL_PROXY|UNSET_PHP_GATE|TOR_NEW_IDENTITY|ON_OFF_PROXY|((LOCAL|GLOBAL)_QUEUE_(POP|PUSH|SIZE|CLEAR|PUSH_BUFFER))|IMAP_COMMAND|MATH|FLOOR|TO_FIXED)\])",
  371. keywrd = @"HTTP(S)?|SOCKS5|REPORT|CONNECT|READ_UNSEEN_LETTER|RECAPTCHA(_RESPONSE|_READER)?|NUMBER|(SPECIAL_|UPPER_)?CHAR|SET_(PROXY|USERAGENT|POSITION|WINDOW_(SIZE|MAXIMIZED|TITLE)|NULL|FIXED_WIDTH|(OWN_)?(CACHE|COOKIE)_DIR)|ERROR_(EXIT|REPEAT|CONTINUE)|VPATH|MAX_(BUFFER_SIZE|BREAK_POINT_CYCLE)|IS_LOAD|(UN)?LOCK|WRITE_WORK_LOG_IN_FILE|AUTO_REDIRECT|RED|BLUE|GREEN|FILTER_(MAX|MIN)_(WIDTH|HEIGHT)|VERTICAL|HORISONTAL|TOP(MOST)?|DOWN|LEFT|RIGHT|NOT_CLEAR_SPACE|START(_BROWSER)?|SHOW_(NORMAL|MINIMAZE)|CLOSE_WINDOW|OPEN_URL|WAIT_LOAD|GET_(URL|COOKIES)|((IS|ENABLE|DISABLE|EVAL)_)?JS|MOUSE_(EMULATION|WHEEL|MOVE)|SCREEN_SHOT|RBUTTON_CLICK|LBUTTON_(CLICK|PRESS|RELEASE)|CLOSE|ACTION|TABS|SCRIPT|url|domain|name|INFO|DELL_PROXY|IP|HOST|TYPE|standart|invisible|CHECK|SAIT|KEY|USER|PASS|FILE|EXE|(DEL_)?TOR|SCROLL_((Y|X)_(POSITION|MAX)|(TO_)?(Y|X))?|TOPMOST|SAVE_COOKIES(_TO_PATH)?|(ENABLE|DISABLE)_ACCELERATION|DELETE_ALL_COOKIES|WINDOW_MAXIMIZED|SecsSinceEpoch",
  372. varable = @"\$(\d+|count|result(encode|decode)?|IMG_ARRAY_COUNT|GLOBAL_(LOGIN|EMAIL|PASS|NAME|WMID|WMR|WMZ|PAYPAL|PAYEER|PERFECT_MONEY|RUCAPTCHA_KEY|CAPMONSTER_IP|CAPMONSTER_KEY|(BCH|BITCOIN|DASH|DOGECOIN|ETHEREUM|LITECOIN)_WALLET)|_GLOBAL_(1|2|SERVER_PORT)|SIZE_BUFFER|REQUEST_DATA|MODEL_NAME|captcha|bool|DATE|TIME|IT|WORK_TIME|_TEMPLATE_ID|current_path)";
  373. public static void SetColors(Range rng)
  374. {
  375. if (!param.isSyntaxHighlighting) return;
  376. rng.BeginUpdate();
  377. //Style0 - комментарии и пометка изменений на строке, Style1 - переменные
  378. rng.ClearStyle(StyleIndex.All);//Очистка всех стилей
  379. field.Range.SetStyle(Comment, comment_rgx.ToString(), RegexOptions.Multiline);//Комментарии
  380. rng.SetStyle(Brackets, @"\[|\]");//Скобки
  381. rng.SetStyle(Varable, varable);//Обычные переменные
  382. rng.SetStyle(UserVarable, getUserVars());//Переменные пользователя
  383. rng.SetStyle(Command, commnd);//Операторы
  384. rng.SetStyle(Keywords, keywrd);//Ключевые слова
  385. rng.EndUpdate();
  386. }
  387. #endregion
  388. #region TextEditing
  389. public readonly static Regex IF_rgx = new Regex(@"^\s*\[IF\]"), ELSE_rgx = new Regex(@"^\s*\[ELSE\]"), ENDIF_rgx = new Regex(@"^\s*\[ENDIF\]"), currentIndent_rgx = new Regex(@"^\s+"), currentIndentEnd_rgx = new Regex(@"\s+$");
  390. public static void FieldFormatter()
  391. {// Выравнивание кода
  392. string indentedText = "", nextLineIndent = "";
  393. bool JS_block = false;
  394. foreach (string currentLine in field.Lines)
  395. {
  396. if (ErrorChecker.JS.Match(currentLine).Success)
  397. { JS_block = true; indentedText += currentLine + "\n"; continue; }
  398. else if (ErrorChecker._JS.Match(currentLine).Success)
  399. {
  400. JS_block = false;
  401. }
  402. if (JS_block) { indentedText += currentLine + "\n"; continue; }
  403. Match currIndent_mtch = currentIndent_rgx.Match(currentLine);
  404. if (IF_rgx.Match(currentLine).Success)
  405. {
  406. indentedText += nextLineIndent + currentLine.Remove(0, currIndent_mtch.Length) + "\n";
  407. nextLineIndent += "\t";
  408. }
  409. else if (ENDIF_rgx.Match(currentLine).Success)
  410. {
  411. indentedText += (nextLineIndent.Length > 0 ? nextLineIndent.Remove(0, 1) : "") + currentLine.Remove(0, currIndent_mtch.Length) + "\n";
  412. if (nextLineIndent.Length > 0) nextLineIndent = nextLineIndent.Remove(0, 1);
  413. }
  414. else if (ELSE_rgx.Match(currentLine).Success)
  415. indentedText += (nextLineIndent.Length > 0 ? nextLineIndent.Remove(0, 1) : "") + currentLine.Remove(0, currIndent_mtch.Length) + "\n";
  416. else indentedText += nextLineIndent + currentLine.Remove(0, currIndent_mtch.Length) + "\n";
  417. }
  418. field.Text = indentedText.Remove(indentedText.Length - 1, 1);
  419. }
  420. readonly static Regex VAR = new Regex(@"^\s*\[VAR\]");
  421. readonly static List<string> vars = new List<string>();
  422. public static string getUserVars()
  423. {// Опреление пользовательских переменных и создание регулярного выражения под них
  424. vars.Clear();
  425. string[] split;
  426. for (int i = 0; i <= field.Range.ToLine; i++)
  427. {
  428. Range currLine = field.GetLine(i);//Проверяемая строка
  429. string clearedText = currLine.Text;
  430. if (VAR.Match(clearedText).Success)
  431. {
  432. split = currLine.Text.Split(new string[] { "]" }, StringSplitOptions.None);
  433. if (split[1].Contains("[")) split[1] = split[1].Remove(split[1].IndexOf('['), 1);
  434. if (!vars.Contains(split[1]) && split[1].Length > 0)
  435. if (!(split[1][0] == '$' && split[1].Length == 1)) vars.Add(split[1]);
  436. }
  437. else if (BREAK_POINT.Match(clearedText).Success)
  438. {
  439. split = currLine.Text.Split(new string[] { "]" }, StringSplitOptions.None);
  440. if (split[1].Contains("[")) split[1] = split[1].Remove(split[1].IndexOf('['), 1);
  441. if (!vars.Contains("$BP_" + split[1]) && split[1].Length > 0)
  442. vars.Add("$BP_" + split[1]);
  443. }
  444. }
  445. if (vars.Count == 0) return "";
  446. vars.Sort(); vars.Reverse();
  447. string output = "(";
  448. foreach (string item in vars)
  449. {
  450. if (item.Contains("$")) output += item.Replace("$", @"\$");
  451. else output += item;
  452. output += '|';
  453. }
  454. return (output.Remove(output.Length - 1, 1) + ")").Replace("[", "\\[");
  455. }
  456. public static void CookiesTransform()
  457. {// Перевод данных из плагина EditThisCookies в шаблонный вид
  458. object[] list;
  459. try { list = new JavaScriptSerializer().Deserialize<object[]>(Clipboard.GetText()); }
  460. catch (Exception) { MessageBox.Show("Ошибка парсинга данных. Проверьте правильность ввода!"); return; }
  461. string output = "";
  462. foreach (object project in list)
  463. {
  464. Dictionary<string, object> cookie = (Dictionary<string, object>)project;
  465. string domain;
  466. try
  467. {
  468. domain = (string)cookie["domain"];
  469. if (domain.Length > 0 && domain[0] == '.') domain = domain.Remove(0, 1);
  470. }
  471. catch (Exception) { MessageBox.Show("Cookie-файл не имеет поля domain"); return; }
  472. string name;
  473. try
  474. {
  475. name = (string)cookie["name"];
  476. if (name.Length == 0) { MessageBox.Show("Поле name не имеет значения"); return; }
  477. }
  478. catch (Exception) { MessageBox.Show("Cookie-файл не имеет поля name"); return; }
  479. string value;
  480. try { value = (string)cookie["value"]; }
  481. catch (Exception) { MessageBox.Show("Cookie-файл не имеет поля value"); return; }
  482. output += $"[SET_COOKIE][{domain}][{name}={value}]\n";
  483. }
  484. Clipboard.SetText(output);
  485. }
  486. public static void MakeBinaryTransform(string file)
  487. {// Перевод файла в бинарный вид
  488. if (File.Exists(file))
  489. {
  490. string[] lines = File.ReadAllLines(file);
  491. if (lines.Length > 0)
  492. {
  493. int maxLength = 0;
  494. foreach (string s in lines) if (maxLength < s.Length) maxLength = s.Length;
  495. maxLength++;
  496. for (int i = 0; i < lines.Length; i++)//Подгоняем каждую строку под длину maxLength
  497. while (lines[i].Length < maxLength) lines[i] += ' ';
  498. using (FileStream fs = new FileStream($"{file}.dat", FileMode.Create, FileAccess.Write)) using (BinaryWriter bw = new BinaryWriter(fs))
  499. {
  500. bw.Write(maxLength);//Запись максимальной длины строки
  501. for (int i = 0; i < lines.Length; i++) for (int j = 0; j < maxLength; j++) bw.Write((ushort)lines[i][j]);//Запись символов
  502. }
  503. }
  504. else MessageBox.Show("Выбранный файл пуст!");
  505. }
  506. }
  507. public static string Headers_to_Template(string selected = "")
  508. {// Перевести HTTP заголовки в шаблонный вид
  509. string data = (selected.Length > 0) ? selected : Clipboard.GetText();
  510. string result = "";
  511. if (data.Length > 0)
  512. {
  513. string[] split = data.Split(new char[] { '\n' });
  514. for (int i = 0; i < split.Length; i++)
  515. {
  516. string[] splitData = split[i].Split(new char[] { ':' });
  517. if (splitData.Length % 2 == 0)
  518. {
  519. if (splitData[1].Length > 0 && splitData[1][0] == ' ')
  520. splitData[1] = splitData[1].Remove(0, 1);
  521. result += $"[ADD_HEADER][{splitData[0]}][{splitData[1]}]\n";
  522. }
  523. }
  524. }
  525. return result.Replace("\r", "");
  526. }
  527. public static void SetFontForAllTabs() { if (Tabs.Items.Count > 1) foreach (FATabStripItem item in Tabs.Items) item.Controls[0].Font = param.fieldFont; }
  528. public static void SetColorsForAllTabs()
  529. {
  530. if (Tabs.Items.Count >= 1)
  531. {
  532. ReInitColors();
  533. foreach (FATabStripItem item in Tabs.Items)
  534. {
  535. FastColoredTextBox itm = item.Controls[0] as FastColoredTextBox;
  536. itm.BackColor = getColorFromHex(getThemeColor(0));
  537. itm.ForeColor = getColorFromHex(getThemeColor(1));
  538. itm.LineNumberColor = getColorFromHex(getThemeColor(2));
  539. itm.IndentBackColor = getColorFromHex(getThemeColor(3));
  540. itm.SelectionColor = getColorFromHex(getThemeColor(4));
  541. itm.ChangedLineColor = getColorFromHex(getThemeColor(12));
  542. itm.CaretColor = getColorFromHex(getThemeColor(13));
  543. itm.CurrentLineColor = param.isFieldCurrLineColored ? getColorFromHex(getThemeColor(14)) : Color.Transparent;
  544. }
  545. codeMapProvider.Child.BackColor = getColorFromHex(getThemeColor(11));
  546. }
  547. }
  548. public static void MakeCurrendLineColored(bool b)
  549. {
  550. if (Tabs.Items.Count >= 1)
  551. foreach (FATabStripItem item in Tabs.Items)
  552. {
  553. FastColoredTextBox itm = item.Controls[0] as FastColoredTextBox;
  554. if (b) itm.CurrentLineColor = getColorFromHex(getThemeColor(14));
  555. else itm.CurrentLineColor = Color.Transparent;
  556. }
  557. }
  558. public static void ShowLineNumbers(bool b)
  559. {
  560. if (Tabs.Items.Count >= 1) foreach (FATabStripItem item in Tabs.Items)
  561. (item.Controls[0] as FastColoredTextBox).ShowLineNumbers = b;
  562. }
  563. public static void syntaxHighlighting_Click()
  564. {
  565. if (!param.isSyntaxHighlighting) field.Range.ClearStyle(StyleIndex.All);
  566. else SetColors(field.Range);
  567. }
  568. public static void getClearedString(ref string input)
  569. {
  570. Match match = brakets.Match(input);
  571. if (match.Success) input = input.Replace(match.Value, "");
  572. match = brakets_from_begin.Match(input);
  573. if (match.Success)
  574. input = input.Replace(match.Value, "");
  575. match = brakets_begin_all.Match(input);
  576. if (match.Success) input = input.Replace(match.Value, "");
  577. match = brakets_end.Match(input);
  578. if (match.Success) input = input.Replace(match.Value, "");
  579. match = currentIndent_rgx.Match(input);
  580. if (match.Success)
  581. input = input.Replace(match.Value, "");
  582. match = currentIndentEnd_rgx.Match(input);
  583. if (match.Success)
  584. input = input.Replace(match.Value, "");
  585. }
  586. public static void gotoHint(string index1)
  587. {
  588. Regex num = new Regex(@"\d");
  589. Match mch = num.Match(index1);
  590. if (mch.Success)
  591. {
  592. int index = int.Parse(mch.Value);
  593. if (field.Hints.Count >= index)
  594. {
  595. int curr = 1;
  596. IEnumerator<Hint> en = field.Hints.GetEnumerator();
  597. while (curr < index && en.MoveNext()) curr++;
  598. if (curr == index)
  599. {
  600. en.MoveNext();
  601. int i = en.Current.Range.Start.iLine;
  602. field.Selection = new Range(field, 0, i, 0, i);
  603. field.DoSelectionVisible();
  604. }
  605. }
  606. }
  607. }
  608. #endregion
  609. }
  610. }