@@ -23,6 +23,8 @@ internal sealed class UnihanCharacterDataBuilder
2323 private string simplifiedVariant ;
2424 private string traditionalVariant ;
2525
26+ private readonly List < UnicodeRadicalStrokeCount > unicodeRadicalStrokeCounts = new List < UnicodeRadicalStrokeCount > ( ) ;
27+
2628 public int CodePoint { get { return codePoint ; } }
2729 public UnihanNumericType NumericType { get { return numericType ; } set { numericType = value ; } }
2830 public long NumericValue { get { return numericValue ; } set { numericValue = value ; } }
@@ -36,6 +38,7 @@ internal sealed class UnihanCharacterDataBuilder
3638 public string VietnameseReading { get { return vietnameseReading ; } set { vietnameseReading = value ; } }
3739 public string SimplifiedVariant { get { return simplifiedVariant ; } set { simplifiedVariant = value ; } }
3840 public string TraditionalVariant { get { return traditionalVariant ; } set { traditionalVariant = value ; } }
41+ public ICollection < UnicodeRadicalStrokeCount > UnicodeRadicalStrokeCounts { get { return unicodeRadicalStrokeCounts ; } }
3942
4043 internal UnihanCharacterDataBuilder ( int codePoint )
4144 {
@@ -49,6 +52,7 @@ internal UnihanCharacterData ToCharacterData()
4952 codePoint ,
5053 numericType ,
5154 numericValue ,
55+ unicodeRadicalStrokeCounts . ToArray ( ) ,
5256 definition ,
5357 mandarinReading ,
5458 cantoneseReading ,
@@ -67,6 +71,14 @@ internal void WriteToFile(BinaryWriter writer)
6771 UnihanFields fields = default ( UnihanFields ) ;
6872
6973 fields |= ( UnihanFields ) NumericType ;
74+ // For now, we have enough bits to encode the length of the array in the field specifier, so we'll do that.
75+ // (NB: A quick analysis of the files revealed thare there are almost always exactly one Radical/Stroke count, and occasionally two, yet never more.)
76+ if ( unicodeRadicalStrokeCounts . Count > 0 )
77+ {
78+ if ( unicodeRadicalStrokeCounts . Count == 1 ) fields |= UnihanFields . UnicodeRadicalStrokeCount ;
79+ else if ( unicodeRadicalStrokeCounts . Count == 2 ) fields |= UnihanFields . UnicodeRadicalStrokeCountTwice ;
80+ else fields |= UnihanFields . UnicodeRadicalStrokeCount | UnihanFields . UnicodeRadicalStrokeCountTwice ;
81+ }
7082 if ( Definition != null ) fields |= UnihanFields . Definition ;
7183 if ( MandarinReading != null ) fields |= UnihanFields . MandarinReading ;
7284 if ( CantoneseReading != null ) fields |= UnihanFields . CantoneseReading ;
@@ -81,6 +93,17 @@ internal void WriteToFile(BinaryWriter writer)
8193 writer . Write ( ( ushort ) fields ) ;
8294
8395 writer . WriteCodePoint ( UnihanCharacterData . PackCodePoint ( codePoint ) ) ;
96+ if ( ( fields & UnihanFields . UnicodeRadicalStrokeCountMore ) != 0 )
97+ {
98+ if ( ( fields & ( UnihanFields . UnicodeRadicalStrokeCountMore ) ) == UnihanFields . UnicodeRadicalStrokeCountMore )
99+ writer . Write ( checked ( ( byte ) ( unicodeRadicalStrokeCounts . Count - 3 ) ) ) ;
100+
101+ foreach ( var radicalStrokeCount in unicodeRadicalStrokeCounts )
102+ {
103+ writer . Write ( radicalStrokeCount . Radical ) ;
104+ writer . Write ( ( byte ) ( radicalStrokeCount . StrokeCount | ( radicalStrokeCount . IsSimplified ? 0x80 : 0 ) ) ) ;
105+ }
106+ }
84107 if ( ( fields & UnihanFields . OtherNumeric ) != 0 ) writer . Write ( numericValue ) ;
85108 if ( ( fields & UnihanFields . Definition ) != 0 ) writer . Write ( Definition ) ;
86109 if ( ( fields & UnihanFields . MandarinReading ) != 0 ) writer . Write ( MandarinReading ) ;
0 commit comments