Пример #1
0
        public override IList <UiListItem> GetUiListCompareWholeItems(ISet <ULocale> localeSet, IComparer <UiListItem> comparer)
        {
            DisplayContext capContext = GetContext(DisplayContextType.Capitalization);

            List <UiListItem> result = new List <UiListItem>();
            IDictionary <ULocale, ISet <ULocale> > baseToLocales = new Dictionary <ULocale, ISet <ULocale> >();

            ULocale.Builder builder = new ULocale.Builder();
            foreach (ULocale locOriginal in localeSet)
            {
                builder.SetLocale(locOriginal); // verify well-formed. We do this here so that we consistently throw exception
                ULocale        loc     = ULocale.AddLikelySubtags(locOriginal);
                ULocale        @base   = new ULocale(loc.GetLanguage());
                ISet <ULocale> locales = baseToLocales.Get(@base);
                if (locales == null)
                {
                    baseToLocales[@base] = locales = new HashSet <ULocale>();
                }
                locales.Add(loc);
            }
            foreach (var entry in baseToLocales)
            {
                ULocale        @base  = entry.Key;
                ISet <ULocale> values = entry.Value;
                if (values.Count == 1)
                {
                    ULocale locale = values.First();
                    result.Add(NewRow(ULocale.MinimizeSubtags(locale, ULocale.Minimize.FAVOR_SCRIPT), capContext));
                }
                else
                {
                    ISet <string> scripts = new HashSet <string>();
                    ISet <string> regions = new HashSet <string>();
                    // need the follow two steps to make sure that unusual scripts or regions are displayed
                    ULocale maxBase = ULocale.AddLikelySubtags(@base);
                    scripts.Add(maxBase.GetScript());
                    regions.Add(maxBase.GetCountry());
                    foreach (ULocale locale in values)
                    {
                        scripts.Add(locale.GetScript());
                        regions.Add(locale.GetCountry());
                    }
                    bool hasScripts = scripts.Count > 1;
                    bool hasRegions = regions.Count > 1;
                    foreach (ULocale locale in values)
                    {
                        ULocale.Builder modified = builder.SetLocale(locale);
                        if (!hasScripts)
                        {
                            modified.SetScript("");
                        }
                        if (!hasRegions)
                        {
                            modified.SetRegion("");
                        }
                        result.Add(NewRow(modified.Build(), capContext));
                    }
                }
            }
            result.Sort(comparer);
            return(result);
        }
Пример #2
0
        private void ParseSetting()
        {
            int i = ruleIndex + 1;
            int j = ReadWords(i, rawBuilder.Value);

            if (j <= i || rawBuilder.Length == 0)
            {
                SetParseError("expected a setting/option at '['");
            }
            // startsWith() etc. are available for String but not CharSequence/StringBuilder.
            string raw = rawBuilder.ToString();

            if (rules[j] == 0x5d)
            {  // words end with ]
                ++j;
                if (raw.StartsWith("reorder", StringComparison.Ordinal) &&
                    (raw.Length == 7 || raw[7] == 0x20))
                {
                    ParseReordering(raw);
                    ruleIndex = j;
                    return;
                }
                if (raw.Equals("backwards 2"))
                {
                    settings.SetFlag(CollationSettings.BackwardSecondary, true);
                    ruleIndex = j;
                    return;
                }
                string v;
                int    valueIndex = raw.LastIndexOf((char)0x20);
                if (valueIndex >= 0)
                {
                    v   = raw.Substring(valueIndex + 1);
                    raw = raw.Substring(0, valueIndex - 0); // ICU4N: Checked 2nd parameter
                }
                else
                {
                    v = "";
                }
                if (raw.Equals("strength") && v.Length == 1)
                {
                    int  value = UCOL_DEFAULT;
                    char c     = v[0];
                    if (0x31 <= c && c <= 0x34)
                    {  // 1..4
                        value = (int)CollationStrength.Primary + (c - 0x31);
                    }
                    else if (c == 0x49)
                    {  // 'I'
                        value = (int)CollationStrength.Identical;
                    }
                    if (value != UCOL_DEFAULT)
                    {
                        settings.Strength = (CollationStrength)value;
                        ruleIndex         = j;
                        return;
                    }
                }
                else if (raw.Equals("alternate"))
                {
                    int value = UCOL_DEFAULT;
                    if (v.Equals("non-ignorable"))
                    {
                        value = 0;  // UCOL_NON_IGNORABLE
                    }
                    else if (v.Equals("shifted"))
                    {
                        value = 1;  // UCOL_SHIFTED
                    }
                    if (value != UCOL_DEFAULT)
                    {
                        settings.SetAlternateHandlingShifted(value > 0);
                        ruleIndex = j;
                        return;
                    }
                }
                else if (raw.Equals("maxVariable"))
                {
                    int value = UCOL_DEFAULT;
                    if (v.Equals("space"))
                    {
                        value = CollationSettings.MaxVariableSpace;
                    }
                    else if (v.Equals("punct"))
                    {
                        value = CollationSettings.MaxVariblePunctuation;
                    }
                    else if (v.Equals("symbol"))
                    {
                        value = CollationSettings.MaxVariableSymbol;
                    }
                    else if (v.Equals("currency"))
                    {
                        value = CollationSettings.MaxVarCurrency;
                    }
                    if (value != UCOL_DEFAULT)
                    {
                        settings.SetMaxVariable(value, 0);
                        settings.VariableTop = baseData.GetLastPrimaryForGroup(
                            ReorderCodes.First + value);
                        Debug.Assert(settings.VariableTop != 0);
                        ruleIndex = j;
                        return;
                    }
                }
                else if (raw.Equals("caseFirst"))
                {
                    int value = UCOL_DEFAULT;
                    if (v.Equals("off"))
                    {
                        value = UCOL_OFF;
                    }
                    else if (v.Equals("lower"))
                    {
                        value = CollationSettings.CaseFirst;  // UCOL_LOWER_FIRST
                    }
                    else if (v.Equals("upper"))
                    {
                        value = CollationSettings.CaseFirstAndUpperMask;  // UCOL_UPPER_FIRST
                    }
                    if (value != UCOL_DEFAULT)
                    {
                        settings.SetCaseFirst(value);
                        ruleIndex = j;
                        return;
                    }
                }
                else if (raw.Equals("caseLevel"))
                {
                    int value = GetOnOffValue(v);
                    if (value != UCOL_DEFAULT)
                    {
                        settings.SetFlag(CollationSettings.CaseLevel, value > 0);
                        ruleIndex = j;
                        return;
                    }
                }
                else if (raw.Equals("normalization"))
                {
                    int value = GetOnOffValue(v);
                    if (value != UCOL_DEFAULT)
                    {
                        settings.SetFlag(CollationSettings.CheckFCD, value > 0);
                        ruleIndex = j;
                        return;
                    }
                }
                else if (raw.Equals("numericOrdering"))
                {
                    int value = GetOnOffValue(v);
                    if (value != UCOL_DEFAULT)
                    {
                        settings.SetFlag(CollationSettings.Numeric, value > 0);
                        ruleIndex = j;
                        return;
                    }
                }
                else if (raw.Equals("hiraganaQ"))
                {
                    int value = GetOnOffValue(v);
                    if (value != UCOL_DEFAULT)
                    {
                        if (value == UCOL_ON)
                        {
                            SetParseError("[hiraganaQ on] is not supported");
                        }
                        ruleIndex = j;
                        return;
                    }
                }
                else if (raw.Equals("import"))
                {
                    // BCP 47 language tag -> ICU locale ID
                    ULocale localeID;
                    try
                    {
                        localeID = new ULocale.Builder().SetLanguageTag(v).Build();
                    }
                    catch (Exception e)
                    {
                        SetParseError("expected language tag in [import langTag]", e);
                        return;
                    }
                    // localeID minus all keywords
                    string baseID = localeID.GetBaseName();
                    // @collation=type, or length=0 if not specified
                    string collationType = localeID.GetKeywordValue("collation");
                    if (importer == null)
                    {
                        SetParseError("[import langTag] is not supported");
                    }
                    else
                    {
                        String importedRules;
                        try
                        {
                            importedRules =
                                importer.GetRules(baseID,
                                                  collationType != null ? collationType : "standard");
                        }
                        catch (Exception e)
                        {
                            SetParseError("[import langTag] failed", e);
                            return;
                        }
                        string outerRules     = rules;
                        int    outerRuleIndex = ruleIndex;
                        try
                        {
                            Parse(importedRules);
                        }
                        catch (Exception e)
                        {
                            ruleIndex = outerRuleIndex;  // Restore the original index for error reporting.
                            SetParseError("parsing imported rules failed", e);
                        }
                        rules     = outerRules;
                        ruleIndex = j;
                    }
                    return;
                }
            }
            else if (rules[j] == 0x5b)
            {  // words end with [
                UnicodeSet set = new UnicodeSet();
                j = ParseUnicodeSet(j, set);
                if (raw.Equals("optimize"))
                {
                    try
                    {
                        sink.Optimize(set);
                    }
                    catch (Exception e)
                    {
                        SetParseError("[optimize set] failed", e);
                    }
                    ruleIndex = j;
                    return;
                }
                else if (raw.Equals("suppressContractions"))
                {
                    try
                    {
                        sink.SuppressContractions(set);
                    }
                    catch (Exception e)
                    {
                        SetParseError("[suppressContractions set] failed", e);
                    }
                    ruleIndex = j;
                    return;
                }
            }
            SetParseError("not a valid setting/option");
        }