Ejemplo n.º 1
0
        private IEnumerable <NamedRange> GetNamedRanges(LineReader reader)
        {
            List <string> segs = new List <string>();

            foreach (var count in reader.GetLines(segs, 2))
            {
                int begin;
                int end;
                if (TryParseCodeRange(segs[0], out begin, out end))
                {
                    yield return(new NamedRange(begin, end, segs[1]));
                }
            }
        }
Ejemplo n.º 2
0
        private IEnumerable <EnumRange <T> > GetRanges <T>(LineReader reader, Func <string, T> parse)
        {
            List <string> segs = new List <string>();

            foreach (var count in reader.GetLines(segs, 2))
            {
                int begin;
                int end;
                if (TryParseCodeRange(segs[0], out begin, out end))
                {
                    yield return(new EnumRange <T>(begin, end, parse(segs[1])));
                }
            }
        }
Ejemplo n.º 3
0
        private CaseFoldingEntry[] GetCaseFolding()
        {
            List <CaseFoldingEntry> list = new List <CaseFoldingEntry>();
            List <string>           segs = new List <string>();
            List <int> codeList          = new List <int>();

            using (LineReader reader = OpenLineReader("CaseFolding.txt")) {
                foreach (var count in reader.GetLines(segs, 3))
                {
                    var entry = new CaseFoldingEntry();
                    if (!TryParseHex(segs[0], out entry.Code))
                    {
                        continue;
                    }
                    var status = segs[1].Trim();
                    if (status.Length != 1)
                    {
                        continue;
                    }
                    switch (status[0])
                    {
                    case 'C':
                        entry.Status = CaseFoldingStatus.Common;
                        break;

                    case 'F':
                        entry.Status = CaseFoldingStatus.Full;
                        break;

                    case 'S':
                        entry.Status = CaseFoldingStatus.Simple;
                        break;

                    case 'T':
                        entry.Status = CaseFoldingStatus.Special;
                        break;

                    default:
                        continue;
                    }
                    if (TryParseHex(codeList, segs[2], out entry.Mapping))
                    {
                        list.Add(entry);
                    }
                }
            }
            list.Sort();
            return(list.ToArray());
        }
Ejemplo n.º 4
0
        // http://www.unicode.org/reports/tr44/#Property_And_Value_Aliases
        public void LoadAliases()
        {
            List <string> segs = new List <string>();
            Dictionary <string, AliasSection> sections =
                new Dictionary <string, AliasSection>(StringComparer.OrdinalIgnoreCase);

            using (LineReader reader = OpenLineReader("PropertyValueAliases.txt")) {
                foreach (var count in reader.GetLines(segs, 2))
                {
                    AliasSection section;
                    string       propertyName = segs[0];
                    if (!sections.TryGetValue(propertyName, out section))
                    {
                        section = new AliasSection()
                        {
                            Name = propertyName
                        };
                        sections.Add(section.Name, section);
                    }
                }
            }
        }
Ejemplo n.º 5
0
            public void LoadScripts(LineReader reader, bool standard)
            {
                string        line;
                List <string> segs    = new List <string>();
                List <int>    commons = new List <int>();

                foreach (var count in reader.GetLines(segs, 2))
                {
                    line = segs[1];
                    WritingScript script;
                    commons.Clear();
                    if (!_scripts.TryGetValue(line, out script) && !Enum.TryParse(line, true, out script))
                    {
                        if (standard || line.IndexOf(' ') < 0)
                        {
                            _owner.Error($"Unable to find script '{line}'");
                        }
                        else
                        {
                            foreach (var s in line.SplitAtSpaces())
                            {
                                if (!_scripts.TryGetValue(s, out script))
                                {
                                    _owner.Error($"Unable to find script '{s}'");
                                }
                                else
                                {
                                    commons.Add((int)script);
                                }
                            }
                            //Debug.WriteLine( line );
                        }
                    }
                    else if (!standard)
                    {
                        commons.Add((int)script);
                    }
                    int cIndex = extScripts.IndexOf(commons);
                    if (cIndex < 0)
                    {
                        cIndex = extScripts.Count;
                        extScripts.AddRange(commons);
                    }
                    line = segs[0];
                    int from;
                    int to;
                    int idx = line.IndexOf("..", StringComparison.Ordinal);
                    if (idx > 0)
                    {
                        string text = line.Substring(idx + 2);
                        if (!TryParseHex(text, out to))
                        {
                            _owner.Error("Invalid code value '{0}'", text);
                        }
                        text = line.Substring(0, idx).Trim();
                        if (!TryParseHex(text, out from))
                        {
                            _owner.Error("Invalid code value '{0}'", text);
                        }
                        if (from > _owner._maxCodePoint)
                        {
                            continue;
                        }
                    }
                    else
                    {
                        if (!TryParseHex(line, out from))
                        {
                            _owner.Error("Invalid code value '{0}'", line);
                        }
                        else
                        {
                            if (from > _owner._maxCodePoint)
                            {
                                continue;
                            }
                        }
                        to = from;
                    }
                    if (standard)
                    {
                        SetScriptsToCode(from, to, script, standard);
                    }
                    else
                    {
                        SetScriptRangeToCode(from, to, cIndex, ( byte)commons.Count, standard);
                    }
                }
            }
Ejemplo n.º 6
0
 public static IEnumerable <int> GetLines(Stream str, List <string> segs, TextReaderOptions options)
 {
     using (LineReader r = new LineReader(str, options)) {
         return(r.GetLines(segs, 1));
     }
 }
Ejemplo n.º 7
0
            public void Load(LineReader reader)
            {
                Dictionary <int, string> alternativeNames = _owner.AlternativeNames;
                List <string>            segs             = new List <string>();
                int          firstRange = 0;
                int          lastRange  = 0;
                const string FirstRange = ", First>";
                const string LastRange  = ", Last>";

                foreach (var count in reader.GetLines(segs, 15))
                {
                    if (count != 15)
                    {
                        continue;
                    }

                    _entry = new UnicodeEntry();
                    if (!TryParseHex(segs[0], out _entry.CodeValue))
                    {
                        continue;
                    }


                    if (_entry.CodeValue > _owner._maxCodePoint)
                    {
                        break;
                    }
                    string name = segs[1];
                    string dscr;
                    if ((Options & LoadOptions.AlternativeNames) != 0 &&
                        alternativeNames.TryGetValue(_entry.CodeValue, out dscr))
                    {
                        name = dscr;
                    }
                    else
                    {
                        dscr = name;
                        if (name.HasValue())
                        {
                            if (name[0] == '<')
                            {
                                if (name.SameName("<control>"))
                                {
                                    dscr = segs[10];
                                }
                                else if (name.EndsWith(FirstRange, StringComparison.OrdinalIgnoreCase))
                                {
                                    firstRange = _entry.CodeValue;
                                    name       = name.Substring(1, name.Length - 1 - FirstRange.Length);
                                    dscr       = null;
                                }
                                else if (name.EndsWith(LastRange, StringComparison.OrdinalIgnoreCase))
                                {
                                    name      = name.Substring(1, name.Length - 1 - LastRange.Length);
                                    dscr      = null;
                                    lastRange = _entry.CodeValue;
                                }
                                else
                                {
                                    Debug.WriteLine("Asd:" + name);
                                }
                            }
                        }
                    }

                    if (dscr.HasValue())
                    {
                        if ((Options & LoadOptions.EnumNames) != 0)
                        {
                            _entry.EnumName = Util.GenEnumName(dscr);
                        }
                    }
                    else if (!alternativeNames.TryGetValue(_entry.CodeValue, out dscr))
                    {
                        //Debug.WriteLine( "NO NAME " + _entry.CodeValue.ToString( "X4" ) + " " + segs[ 11 ] );
                    }
                    _entry.Name = name;
                    if (!_charTypes.TryGetValue(segs[2], out _entry.Category))
                    {
                        Error("Unknown category '{0}'", segs[2]);
                    }
                    byte comb;
                    if (!byte.TryParse(segs[3], NumberStyles.Integer, CultureInfo.InvariantCulture, out comb))
                    {
                        Error("Unknown combing class '{0}'", segs[3]);
                    }
                    _entry.Combing = (CombingClass)comb;

                    if (!_bidiMap.TryGetValue(segs[4], out _entry.Bidirectional))
                    {
                        Error("Unknown bidi category '{0}'", segs[4]);
                    }
                    if (_decomposeMap != null && !string.IsNullOrEmpty(segs[5]))
                    {
                        ParseDecombosing(segs[5]);
                    }
                    //_entry._numericType = NumericEntryType.None;
                    byte dec;

                    if (segs[6].Length > 0)
                    {
                        if (!byte.TryParse(segs[6], NumberStyles.Integer,
                                           CultureInfo.InvariantCulture, out dec) ||
                            dec > 9)
                        {
                            Error("Invalid Decimal digit value '{0}'", segs[6]);
                        }
                        _entry._numericType = NumericEntryType.Decimal;
                        _entry._value.Value = dec;
                        //_Decimals.Increment( _entry.DecimalValue );
                    }
                    if (segs[7].Length > 0)
                    {
                        if (!byte.TryParse(segs[7], NumberStyles.Integer,
                                           CultureInfo.InvariantCulture, out dec) ||
                            dec > 9)
                        {
                            Error("Invalid Digit value '{0}'", segs[7]);
                        }
                        if (!_entry.IsDecimalDigit)
                        {
                            _entry._numericType = NumericEntryType.Digit;
                            _entry._value.Value = dec;
                        }
                        else if (_entry._value.Value != dec)
                        {
                            Error("Invalid Digit value '{0}'", segs[7]);
                        }
                    }
                    else if (_entry._numericType != NumericEntryType.None)
                    {
                        Error("Invalid Digit value '{0}'", segs[7]);
                    }
                    if (segs[8].Length > 0)
                    {
                        ParseNumeric(segs[8]);
                    }
                    switch (segs[9])
                    {
                    case "":
                    case "N":
                        break;

                    case "Y":
                        _entry.Mirrored = true;
                        break;

                    default:
                        Error("Invalid Mirrored value '{0}'", segs[9]);
                        break;
                    }
                    if ((Options & LoadOptions.OldNames) != 0 &&
                        segs[10].Length > 0)
                    {
                        _entry.OldName = segs[10];
                    }
                    if ((Options & LoadOptions.Comments) != 0 &&
                        segs[11].Length > 0)
                    {
                        _entry.Comment = segs[11];
                    }
                    if (segs[12].Length > 0)
                    {
                        if (!TryParseHex(segs[12], out _entry.Uppercase))
                        {
                            Error("Invlaid code point '{0}'", segs[12]);
                        }
                    }
                    if (segs[13].Length > 0)
                    {
                        if (!TryParseHex(segs[13], out _entry.LowerCase))
                        {
                            Error("Invlaid code point '{0}'", segs[13]);
                        }
                    }
                    if (segs[14].Length > 0)
                    {
                        if (!TryParseHex(segs[14], out _entry.TitleCase))
                        {
                            Error("Invlaid code point '{0}'", segs[14]);
                        }
                    }
                    if (lastRange > 0)
                    {
                        _entry.CodeValue = firstRange + 1;
                        while (_entry.CodeValue < lastRange)
                        {
                            Add(_entry);
                            _entry.CodeValue++;
                        }
                        lastRange  = 0;
                        firstRange = 0;
                    }
                    Add(_entry);
                }
                //ShowCounts();
            }