UnicodeClasses.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // RichTextKit
  2. // Copyright © 2019-2020 Topten Software. All Rights Reserved.
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License"); you may
  5. // not use this product except in compliance with the License. You may obtain
  6. // a copy of the License at
  7. //
  8. // http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. // License for the specific language governing permissions and limitations
  14. // under the License.
  15. namespace Topten.RichTextKit
  16. {
  17. /// <summary>
  18. /// Helper for looking up unicode character class information
  19. /// </summary>
  20. internal static class UnicodeClasses
  21. {
  22. static UnicodeClasses()
  23. {
  24. // ATZ: assembly name
  25. string aName = typeof(LineBreaker).Assembly.GetName().Name + ".";
  26. // Load trie resources
  27. _bidiTrie = new UnicodeTrie(typeof(LineBreaker).Assembly.GetManifestResourceStream(aName + "Topten.RichTextKit.Resources.BidiClasses.trie"));
  28. _classesTrie = new UnicodeTrie(typeof(LineBreaker).Assembly.GetManifestResourceStream(aName + "Topten.RichTextKit.Resources.LineBreakClasses.trie"));
  29. _boundaryTrie = new UnicodeTrie(typeof(LineBreaker).Assembly.GetManifestResourceStream(aName + "Topten.RichTextKit.Resources.WordBoundaryClasses.trie"));
  30. _graphemeTrie= new UnicodeTrie(typeof(LineBreaker).Assembly.GetManifestResourceStream(aName + "Topten.RichTextKit.Resources.GraphemeClusterClasses.trie"));
  31. }
  32. static UnicodeTrie _bidiTrie;
  33. static UnicodeTrie _classesTrie;
  34. static UnicodeTrie _boundaryTrie;
  35. static UnicodeTrie _graphemeTrie;
  36. /// <summary>
  37. /// Get the directionality of a Unicode Code Point
  38. /// </summary>
  39. /// <param name="codePoint">The code point in question</param>
  40. /// <returns>The code point's directionality</returns>
  41. public static Directionality Directionality(int codePoint)
  42. {
  43. return (Directionality)(_bidiTrie.Get(codePoint) >> 24);
  44. }
  45. /// <summary>
  46. /// Get the directionality of a Unicode Code Point
  47. /// </summary>
  48. /// <param name="codePoint">The code point in question</param>
  49. /// <returns>The code point's directionality</returns>
  50. public static uint BidiData(int codePoint)
  51. {
  52. return _bidiTrie.Get(codePoint);
  53. }
  54. /// <summary>
  55. /// Get the bracket type for a Unicode Code Point
  56. /// </summary>
  57. /// <param name="codePoint">The code point in question</param>
  58. /// <returns>The code point's paired bracked type</returns>
  59. public static PairedBracketType PairedBracketType(int codePoint)
  60. {
  61. return (PairedBracketType)((_bidiTrie.Get(codePoint) >> 16) & 0xFF);
  62. }
  63. /// <summary>
  64. /// Get the associated bracket type for a Unicode Code Point
  65. /// </summary>
  66. /// <param name="codePoint">The code point in question</param>
  67. /// <returns>The code point's opposite bracket, or 0 if not a bracket</returns>
  68. public static int AssociatedBracket(int codePoint)
  69. {
  70. return (int)(_bidiTrie.Get(codePoint) & 0xFFFF);
  71. }
  72. /// <summary>
  73. /// Get the line break class for a Unicode Code Point
  74. /// </summary>
  75. /// <param name="codePoint">The code point in question</param>
  76. /// <returns>The code point's line break class</returns>
  77. public static LineBreakClass LineBreakClass(int codePoint)
  78. {
  79. return (LineBreakClass)_classesTrie.Get(codePoint);
  80. }
  81. /// <summary>
  82. /// Get the line break class for a Unicode Code Point
  83. /// </summary>
  84. /// <param name="codePoint">The code point in question</param>
  85. /// <returns>The code point's line break class</returns>
  86. public static WordBoundaryClass BoundaryGroup(int codePoint)
  87. {
  88. return (WordBoundaryClass)_boundaryTrie.Get(codePoint);
  89. }
  90. /// <summary>
  91. /// Get the grapheme cluster class for a Unicode Code Point
  92. /// </summary>
  93. /// <param name="codePoint">The code point in question</param>
  94. /// <returns>The code point's grapheme cluster class</returns>
  95. public static GraphemeClusterClass GraphemeClusterClass(int codePoint)
  96. {
  97. return (GraphemeClusterClass)_graphemeTrie.Get(codePoint);
  98. }
  99. }
  100. }