Files
NetUnicodeInfo/UnicodeInformation.Builder/UnihanCharacterDataBuilder.cs
T
2016-08-09 00:18:46 +02:00

123 lines
5.5 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace System.Unicode.Builder
{
internal sealed class UnihanCharacterDataBuilder
{
private readonly int codePoint;
private UnihanNumericType numericType;
private long numericValue;
private string definition;
private string mandarinReading;
private string cantoneseReading;
private string japaneseKunReading;
private string japaneseOnReading;
private string koreanReading;
private string hangulReading;
private string vietnameseReading;
private string simplifiedVariant;
private string traditionalVariant;
private readonly List<UnicodeRadicalStrokeCount> unicodeRadicalStrokeCounts = new List<UnicodeRadicalStrokeCount>();
public int CodePoint { get { return codePoint; } }
public UnihanNumericType NumericType { get { return numericType; } set { numericType = value; } }
public long NumericValue { get { return numericValue; } set { numericValue = value; } }
public string Definition { get { return definition; } set { definition = value; } }
public string MandarinReading { get { return mandarinReading; } set { mandarinReading = value; } }
public string CantoneseReading { get { return cantoneseReading; } set { cantoneseReading = value; } }
public string JapaneseKunReading { get { return japaneseKunReading; } set { japaneseKunReading = value; } }
public string JapaneseOnReading { get { return japaneseOnReading; } set { japaneseOnReading = value; } }
public string KoreanReading { get { return koreanReading; } set { koreanReading = value; } }
public string HangulReading { get { return hangulReading; } set { hangulReading = value; } }
public string VietnameseReading { get { return vietnameseReading; } set { vietnameseReading = value; } }
public string SimplifiedVariant { get { return simplifiedVariant; } set { simplifiedVariant = value; } }
public string TraditionalVariant { get { return traditionalVariant; } set { traditionalVariant = value; } }
public IList<UnicodeRadicalStrokeCount> UnicodeRadicalStrokeCounts { get { return unicodeRadicalStrokeCounts; } }
internal UnihanCharacterDataBuilder(int codePoint)
{
this.codePoint = codePoint;
}
internal UnihanCharacterData ToCharacterData()
{
return new UnihanCharacterData
(
codePoint,
numericType,
numericValue,
unicodeRadicalStrokeCounts.ToArray(),
definition,
mandarinReading,
cantoneseReading,
japaneseKunReading,
japaneseOnReading,
koreanReading,
hangulReading,
vietnameseReading,
simplifiedVariant,
traditionalVariant
);
}
internal void WriteToFile(BinaryWriter writer)
{
UnihanFields fields = default(UnihanFields);
fields |= (UnihanFields)NumericType;
// For now, we have enough bits to encode the length of the array in the field specifier, so we'll do that.
// (NB: A quick analysis of the files revealed thare there are almost always exactly one Radical/Stroke count, and occasionally two, yet never more.)
if (unicodeRadicalStrokeCounts.Count > 0)
{
if (unicodeRadicalStrokeCounts.Count == 1) fields |= UnihanFields.UnicodeRadicalStrokeCount;
else if (unicodeRadicalStrokeCounts.Count == 2) fields |= UnihanFields.UnicodeRadicalStrokeCountTwice;
else fields |= UnihanFields.UnicodeRadicalStrokeCountMore;
}
if (Definition != null) fields |= UnihanFields.Definition;
if (MandarinReading != null) fields |= UnihanFields.MandarinReading;
if (CantoneseReading != null) fields |= UnihanFields.CantoneseReading;
if (JapaneseKunReading != null) fields |= UnihanFields.JapaneseKunReading;
if (JapaneseOnReading != null) fields |= UnihanFields.JapaneseOnReading;
if (KoreanReading != null) fields |= UnihanFields.KoreanReading;
if (HangulReading != null) fields |= UnihanFields.HangulReading;
if (VietnameseReading != null) fields |= UnihanFields.VietnameseReading;
if (SimplifiedVariant != null) fields |= UnihanFields.SimplifiedVariant;
if (TraditionalVariant != null) fields |= UnihanFields.TraditionalVariant;
writer.Write((ushort)fields);
writer.WriteCodePoint(UnihanCharacterData.PackCodePoint(codePoint));
if ((fields & UnihanFields.OtherNumeric) != 0) writer.Write(numericValue);
if ((fields & UnihanFields.UnicodeRadicalStrokeCountMore) != 0)
{
if ((fields & (UnihanFields.UnicodeRadicalStrokeCountMore)) == UnihanFields.UnicodeRadicalStrokeCountMore)
writer.Write(checked((byte)(unicodeRadicalStrokeCounts.Count - 3)));
foreach (var radicalStrokeCount in unicodeRadicalStrokeCounts)
{
writer.Write(radicalStrokeCount.Radical);
writer.Write(radicalStrokeCount.RawStrokeCount);
}
}
if ((fields & UnihanFields.Definition) != 0) writer.Write(Definition);
if ((fields & UnihanFields.MandarinReading) != 0) writer.Write(MandarinReading);
if ((fields & UnihanFields.CantoneseReading) != 0) writer.Write(CantoneseReading);
if ((fields & UnihanFields.JapaneseKunReading) != 0) writer.Write(JapaneseKunReading);
if ((fields & UnihanFields.JapaneseOnReading) != 0) writer.Write(JapaneseOnReading);
if ((fields & UnihanFields.KoreanReading) != 0) writer.Write(KoreanReading);
if ((fields & UnihanFields.HangulReading) != 0) writer.Write(HangulReading);
if ((fields & UnihanFields.VietnameseReading) != 0) writer.Write(VietnameseReading);
if ((fields & UnihanFields.SimplifiedVariant) != 0) writer.Write(SimplifiedVariant);
if ((fields & UnihanFields.TraditionalVariant) != 0) writer.Write(TraditionalVariant);
}
}
}