internal static ExtensionSubtag?TryParse(LanguageTag.TokenEnumerator tokens) { if (!tokens.CurrentTokenAvailable) // get singletone { return(null); } if (tokens.Token.Length != 1) { return(null); } if (tokens.TokenIs(PrivateUseSubtags.Singleton)) { return(null); } char singleton = ValidateSingleton(tokens.Token[0]); if (!tokens.NextTokenAvailable) { throw new FormatException("extension subtag '" + singleton + "' not contain elements"); } var sequence = new List <string>(); tokens.ToNextToken(); sequence.Add(ValidateElement(tokens.Token)); tokens.ToNextToken(); // get remaining elements while (tokens.CurrentTokenAvailable) { if (tokens.Token.Length == 1) // next extension subtag or private use { break; } sequence.Add(ValidateElement(tokens.Token)); tokens.ToNextToken(); } var result = new ExtensionSubtag(); result.Singleton = singleton; result._sequence = sequence.ToArray(); return(result); }
internal static PrivateUseSubtags Parse(LanguageTag.TokenEnumerator tokens) { var result = new PrivateUseSubtags(); if (!tokens.TokenIs(Singleton)) { throw new FormatException("unexpected subtag '" + tokens.Token + "'"); } var subtags = new List <string>(); while (tokens.NextTokenAvailable) // get all subtags { tokens.ToNextToken(); subtags.Add(ValidateSubtag(tokens.Token)); } if (subtags.Count == 0) { throw new FormatException("private use subtags not contain elements"); } result._subtags = subtags.ToArray(); return(result); }
internal static Region?TryParseRegion(this LanguageTag.TokenEnumerator tokens) { var region = tokens.Token.TryParseFromRegion(); if (region != null) { tokens.ToNextToken(); } return(region); }
internal static Script?TryParseScript(this LanguageTag.TokenEnumerator tokens) { var script = tokens.Token.TryParseFromScript(); if (script != null) { tokens.ToNextToken(); } return(script); }
internal static Language ParseLanguage(this LanguageTag.TokenEnumerator tokens) { if (!tokens.NextTokenAvailable) { var result = tokens.Token.TryParseFromLanguage(); if (!result.HasValue) { throw new FormatException("unexpected language '" + tokens.Token + "'"); } tokens.ToNextToken(); return(result.Value); } var lang = tokens.Token.TryParseFromLanguage(); if (lang == null) { throw new FormatException("unexpected language '" + tokens.Token + "'"); } tokens.ToNextToken(); if (!lang.Value.ExtLanguageAvailable()) { return(lang.Value); } var extLang = tokens.Token.TryParseFromExtLanguage(lang.Value); if (extLang == null) { return(lang.Value); } tokens.ToNextToken(); return(extLang.Value); }
internal static Variant?TryParseVariant(this LanguageTag.TokenEnumerator tokens) { if (!tokens.CurrentTokenAvailable) { return(null); } var variant = tokens.Token.TryParseFromVariant(); if (variant != null) { tokens.ToNextToken(); } return(variant); }