FormatStringTokenizer.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace Abp.Text.Formatting
  5. {
  6. internal class FormatStringTokenizer
  7. {
  8. public List<FormatStringToken> Tokenize(string format, bool includeBracketsForDynamicValues = false)
  9. {
  10. var tokens = new List<FormatStringToken>();
  11. var currentText = new StringBuilder();
  12. var inDynamicValue = false;
  13. for (var i = 0; i < format.Length; i++)
  14. {
  15. var c = format[i];
  16. switch (c)
  17. {
  18. case '{':
  19. if (inDynamicValue)
  20. {
  21. throw new FormatException("Incorrect syntax at char " + i + "! format string can not contain nested dynamic value expression!");
  22. }
  23. inDynamicValue = true;
  24. if (currentText.Length > 0)
  25. {
  26. tokens.Add(new FormatStringToken(currentText.ToString(), FormatStringTokenType.ConstantText));
  27. currentText.Clear();
  28. }
  29. break;
  30. case '}':
  31. if (!inDynamicValue)
  32. {
  33. throw new FormatException("Incorrect syntax at char " + i + "! These is no opening brackets for the closing bracket }.");
  34. }
  35. inDynamicValue = false;
  36. if (currentText.Length <= 0)
  37. {
  38. throw new FormatException("Incorrect syntax at char " + i + "! Brackets does not containt any chars.");
  39. }
  40. var dynamicValue = currentText.ToString();
  41. if (includeBracketsForDynamicValues)
  42. {
  43. dynamicValue = "{" + dynamicValue + "}";
  44. }
  45. tokens.Add(new FormatStringToken(dynamicValue, FormatStringTokenType.DynamicValue));
  46. currentText.Clear();
  47. break;
  48. default:
  49. currentText.Append(c);
  50. break;
  51. }
  52. }
  53. if (inDynamicValue)
  54. {
  55. throw new FormatException("There is no closing } char for an opened { char.");
  56. }
  57. if (currentText.Length > 0)
  58. {
  59. tokens.Add(new FormatStringToken(currentText.ToString(), FormatStringTokenType.ConstantText));
  60. }
  61. return tokens;
  62. }
  63. }
  64. }