You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
4.5 KiB

  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Windows.Forms;
  6. namespace GroupBuyParser
  7. {
  8. public partial class MainForm : Form
  9. {
  10. public MainForm()
  11. {
  12. InitializeComponent();
  13. }
  14. private void btnPathBrowser_Click(object sender, EventArgs e)
  15. {
  16. if (dlgOpen.ShowDialog() == DialogResult.OK)
  17. {
  18. txtPath.Text = dlgOpen.FileName;
  19. rdoPath.Checked = true;
  20. }
  21. }
  22. private void btnType1_Click(object sender, EventArgs e)
  23. {
  24. txtName.Text = "A";
  25. txtLocation.Text = "蘆洲,三重";
  26. btnProcess.PerformClick();
  27. }
  28. private void btnType2_Click(object sender, EventArgs e)
  29. {
  30. txtName.Text = "A,B,C,D,E,F,G,H,I,J";
  31. txtLocation.Text = "蘆洲,三重";
  32. btnProcess.PerformClick();
  33. }
  34. private void btnType3_Click(object sender, EventArgs e)
  35. {
  36. txtName.Text = "A:M:L:XL:2XL:3XL:4XL,B:M:L:XL:2XL:3XL:4XL,C:M:L:XL:2XL:3XL:4XL,D:M:L:XL:2XL:3XL:4XL,E:M:L:XL:2XL:3XL:4XL,F:M:L:XL:2XL:3XL:4XL";
  37. txtLocation.Text = "蘆洲,三重";
  38. btnProcess.PerformClick();
  39. }
  40. private void ParseProcess(ParserSettings settings)
  41. {
  42. if (rdoPath.Checked && string.IsNullOrEmpty(txtPath.Text))
  43. {
  44. MessageBox.Show("Please select text file first", "Error");
  45. return;
  46. }
  47. var parser = new GroupBuyParser
  48. {
  49. Settings = settings
  50. };
  51. var data = GetParserData();
  52. parser.Parse(data);
  53. var successData = data.Where(x => x.Success).Select(x => $"{x.Text} => {x.NormalizeText}");
  54. var errorData = data.Where(x => !x.Success).Select(x => $"{x.Text} ({x.ErrorMessage})");
  55. UpdateListBox(successData, errorData);
  56. }
  57. private void UpdateListBox(IEnumerable<string> successData, IEnumerable<string> errorData)
  58. {
  59. lstSuccess.BeginUpdate();
  60. lstSuccess.Items.Clear();
  61. lstSuccess.Items.AddRange(successData.ToArray());
  62. lstSuccess.EndUpdate();
  63. lstError.BeginUpdate();
  64. lstError.Items.Clear();
  65. lstError.Items.AddRange(errorData.ToArray());
  66. lstError.EndUpdate();
  67. lblListCount.Text = $"成功 {lstSuccess.Items.Count} 筆,失敗 {lstError.Items.Count} 筆";
  68. }
  69. private List<ParserData> GetParserData()
  70. {
  71. if (rdoPath.Checked)
  72. {
  73. IEnumerable<string> comments;
  74. var fileContent = System.IO.File.ReadAllText(txtPath.Text);
  75. if (fileContent.StartsWith("["))
  76. {
  77. comments = JsonConvert.DeserializeObject<List<string>>(fileContent);
  78. }
  79. else
  80. {
  81. comments = GroupBuyParser.Arrange(fileContent);
  82. }
  83. var data = comments.Select(x => new ParserData { Text = x });
  84. return data.ToList();
  85. }
  86. else
  87. {
  88. return new List<ParserData> { new ParserData { Text = txtInput.Text } };
  89. }
  90. }
  91. private void btnProcess_Click(object sender, EventArgs e)
  92. {
  93. var settings = new ParserSettings
  94. {
  95. Products = txtName.Text.Split(',').Select(x => {
  96. // 如果項目有多筆,後面的當作規格輸入
  97. // Ex. "A" => 無規格 "B:M:L:XL" => M/L/XL
  98. var s = x.Split(':').ToList();
  99. var name = s[0];
  100. s.RemoveAt(0);
  101. var specs = s.Count >= 1 ? s.ToArray() : null;
  102. return new ProductInfo
  103. {
  104. Name = name,
  105. Specifications = specs
  106. };
  107. }).ToList(),
  108. Branches = GetSplitStrings(txtLocation)
  109. };
  110. ParseProcess(settings);
  111. }
  112. private List<string> GetSplitStrings(TextBox textBox)
  113. {
  114. return textBox.Text.Trim().Split(',', StringSplitOptions.RemoveEmptyEntries).ToList();
  115. }
  116. private void txtInput_KeyDown(object sender, KeyEventArgs e)
  117. {
  118. rdoInput.Checked = true;
  119. }
  120. }
  121. }