protected void LoadAllDefinitions()
		{
			Clear();
			foreach (string filePath in Directory.GetFiles(_path, "*.ldml"))
			{
				WritingSystemDefinition wsFromFile;
				try
				{
					wsFromFile = GetWritingSystemFromLdml(filePath);
				}
				catch(Exception e)
				{
					// Add the exception to our list of problems and continue loading
					var problem = new WritingSystemRepositoryProblem
						{
							Consequence = WritingSystemRepositoryProblem.ConsequenceType.WSWillNotBeAvailable,
							Exception = e,
							FilePath = filePath
						};
					_loadProblems.Add(problem);
					continue;
				}

				if (String.Compare(wsFromFile.StoreID, wsFromFile.Bcp47Tag, true) != 0)
				{
					bool badFileName = true;
					if (wsFromFile.StoreID != null && wsFromFile.StoreID.StartsWith("x-", StringComparison.OrdinalIgnoreCase))
					{
						var interpreter = new FlexConformPrivateUseRfc5646TagInterpreter();
						interpreter.ConvertToPalasoConformPrivateUseRfc5646Tag(wsFromFile.StoreID);
						if (interpreter.RFC5646Tag.Equals(wsFromFile.Bcp47Tag, StringComparison.OrdinalIgnoreCase))
						{
							badFileName = false;
						}
					}
					if(badFileName)
					{// Add the exception to our list of problems and continue loading
						var problem = new WritingSystemRepositoryProblem
						{
							Consequence = WritingSystemRepositoryProblem.ConsequenceType.WSWillNotBeAvailable,
							Exception = new ApplicationException(
								String.Format(
									"The writing system file {0} seems to be named inconsistently. It contains the Rfc5646 tag: '{1}'. The name should have been made consistent with its content upon migration of the writing systems.",
									filePath, wsFromFile.Bcp47Tag)),
							FilePath = filePath
						};
						_loadProblems.Add(problem);
					}
				}
				try
				{
					Set(wsFromFile);
				}
				catch(Exception e){
					// Add the exception to our list of problems and continue loading
					var problem = new WritingSystemRepositoryProblem
					{
						Consequence = WritingSystemRepositoryProblem.ConsequenceType.WSWillNotBeAvailable,
						Exception = e,
						FilePath = filePath
					};
					_loadProblems.Add(problem);
				}
			}
			LoadIdChangeMapFromExistingWritingSystems();
		}
Exemplo n.º 2
0
		private void WriteIdentityElement(XmlWriter writer, XmlReader reader, WritingSystemDefinition ws)
		{
			Debug.Assert(writer != null);
			Debug.Assert(ws != null);
			writer.WriteStartElement("identity");
			writer.WriteStartElement("version");
			writer.WriteAttributeString("number", ws.VersionNumber);
			writer.WriteString(ws.VersionDescription);
			writer.WriteEndElement();
			WriteElementWithAttribute(writer, "generation", "date", String.Format("{0:s}", ws.DateModified));

			bool copyFlexFormat = false;
			string language = String.Empty;
			string script = String.Empty;
			string territory = String.Empty;
			string variant = String.Empty;
			bool readerIsOnIdentityElement = IsReaderOnElementNodeNamed(reader, "identity");
			if(readerIsOnIdentityElement && !reader.IsEmptyElement)
			{
				reader.ReadToDescendant("language");
				while(!IsReaderOnElementNodeNamed(reader, "special") && !IsReaderOnEndElementNodeNamed(reader, "identity"))
				{
					switch(reader.Name)
					{
						case "language":
							language = reader.GetAttribute("type");
							break;
						case "script":
							script = reader.GetAttribute("type");
							break;
						case "territory":
							territory = reader.GetAttribute("type");
							break;
						case "variant":
							variant = reader.GetAttribute("type");
							break;
					}
					reader.Read();
				}
				if (_compatibilityMode == WritingSystemCompatibility.Flex7V0Compatible)
				{
					var interpreter = new FlexConformPrivateUseRfc5646TagInterpreter();
					interpreter.ConvertToPalasoConformPrivateUseRfc5646Tag(language, script, territory, variant);
					if ((language.StartsWith("x-", StringComparison.OrdinalIgnoreCase) ||  language.Equals("x", StringComparison.OrdinalIgnoreCase))&&
						interpreter.RFC5646Tag == ws.Bcp47Tag)
					{
						copyFlexFormat = true;
						_wsIsFlexPrivateUse = true;
					}
				}
			}
			if (copyFlexFormat)
			{
				WriteRFC5646TagElements(writer, language, script, territory, variant);
			}
			else
			{
				WriteRFC5646TagElements(writer, ws.Language, ws.Script, ws.Region, ws.Variant);
			}
			if (IsReaderOnElementNodeNamed(reader, "identity"))
			{
				if (reader.IsEmptyElement)
				{
					reader.Skip();
				}
			}
			if (IsReaderOnElementNodeNamed(reader, "special"))
			{
				CopyToEndElement(writer, reader);
			}
			if(IsReaderOnEndElementNodeNamed(reader, "identity"))
			{
				reader.Read();
			}
			writer.WriteEndElement();
		}
        protected void LoadAllDefinitions()
        {
            Clear();
            foreach (string filePath in Directory.GetFiles(_path, "*.ldml"))
            {
                WritingSystemDefinition wsFromFile;
                try
                {
                    wsFromFile = GetWritingSystemFromLdml(filePath);
                }
                catch (Exception e)
                {
                    // Add the exception to our list of problems and continue loading
                    var problem = new WritingSystemRepositoryProblem
                    {
                        Consequence = WritingSystemRepositoryProblem.ConsequenceType.WSWillNotBeAvailable,
                        Exception   = e,
                        FilePath    = filePath
                    };
                    _loadProblems.Add(problem);
                    continue;
                }

                if (String.Compare(wsFromFile.StoreID, wsFromFile.Bcp47Tag, true) != 0)
                {
                    bool badFileName = true;
                    if (wsFromFile.StoreID != null && wsFromFile.StoreID.StartsWith("x-", StringComparison.OrdinalIgnoreCase))
                    {
                        var interpreter = new FlexConformPrivateUseRfc5646TagInterpreter();
                        interpreter.ConvertToPalasoConformPrivateUseRfc5646Tag(wsFromFile.StoreID);
                        if (interpreter.RFC5646Tag.Equals(wsFromFile.Bcp47Tag, StringComparison.OrdinalIgnoreCase))
                        {
                            badFileName = false;
                        }
                    }
                    if (badFileName)
                    {                    // Add the exception to our list of problems and continue loading
                        var problem = new WritingSystemRepositoryProblem
                        {
                            Consequence = WritingSystemRepositoryProblem.ConsequenceType.WSWillNotBeAvailable,
                            Exception   = new ApplicationException(
                                String.Format(
                                    "The writing system file {0} seems to be named inconsistently. It contains the Rfc5646 tag: '{1}'. The name should have been made consistent with its content upon migration of the writing systems.",
                                    filePath, wsFromFile.Bcp47Tag)),
                            FilePath = filePath
                        };
                        _loadProblems.Add(problem);
                    }
                }
                try
                {
                    Set(wsFromFile);
                }
                catch (Exception e) {
                    // Add the exception to our list of problems and continue loading
                    var problem = new WritingSystemRepositoryProblem
                    {
                        Consequence = WritingSystemRepositoryProblem.ConsequenceType.WSWillNotBeAvailable,
                        Exception   = e,
                        FilePath    = filePath
                    };
                    _loadProblems.Add(problem);
                }
            }
            LoadIdChangeMapFromExistingWritingSystems();
        }
		public void ConvertToPalasoConformPrivateUseRfc5646Tag_LanguageSubtagTogetherWithPrivateUseContainsDuplicates_IsConvertedCorrectly()
		{
			var interpreter = new FlexConformPrivateUseRfc5646TagInterpreter();
			interpreter.ConvertToPalasoConformPrivateUseRfc5646Tag("x-en-x-en");
			AssertThatPropertiesAreSet("", "", "", "x-en", interpreter);
		}
Exemplo n.º 5
0
		private void ReadIdentityElement(XmlReader reader, WritingSystemDefinition ws)
		{
			Debug.Assert(reader.NodeType == XmlNodeType.Element && reader.Name == "identity");
			using (XmlReader identityReader = reader.ReadSubtree())
			{
				identityReader.MoveToContent();
				identityReader.ReadStartElement("identity");
				if (FindElement(identityReader, "version"))
				{
					ws.VersionNumber = identityReader.GetAttribute("number") ?? string.Empty;
					if (!identityReader.IsEmptyElement)
					{
						ws.VersionDescription = identityReader.ReadString();
						identityReader.ReadEndElement();
					}
				}
				string dateTime = GetSubNodeAttributeValue(identityReader, "generation", "date");
				DateTime modified = DateTime.UtcNow;
				if (!string.IsNullOrEmpty(dateTime.Trim()) && !DateTime.TryParse(dateTime, out modified))
				{
					//CVS format:    "$Date: 2008/06/18 22:52:35 $"
					modified = DateTime.ParseExact(dateTime, "'$Date: 'yyyy/MM/dd HH:mm:ss $", null,
												   DateTimeStyles.AssumeUniversal);
				}

				ws.DateModified = modified;

				string language = GetSubNodeAttributeValue(identityReader, "language", "type");
				string script = GetSubNodeAttributeValue(identityReader, "script", "type");
				string region = GetSubNodeAttributeValue(identityReader, "territory", "type");
				string variant = GetSubNodeAttributeValue(identityReader, "variant", "type");

				if ((language.StartsWith("x-", StringComparison.OrdinalIgnoreCase) || language.Equals("x", StringComparison.OrdinalIgnoreCase)))
				{
					var flexRfcTagInterpreter = new FlexConformPrivateUseRfc5646TagInterpreter();
					flexRfcTagInterpreter.ConvertToPalasoConformPrivateUseRfc5646Tag(language, script, region, variant);
					ws.SetAllComponents(flexRfcTagInterpreter.Language, flexRfcTagInterpreter.Script, flexRfcTagInterpreter.Region, flexRfcTagInterpreter.Variant);

					_wsIsFlexPrivateUse = true;
				}
				else
				{
					ws.SetAllComponents(language, script, region, variant);

					_wsIsFlexPrivateUse = false;
				}
				//Set the id simply as the concatenation of whatever was in the ldml file.
				ws.Id = String.Join("-", new[] {language, script, region, variant}.Where(subtag => !String.IsNullOrEmpty(subtag)).ToArray());
				// move to end of identity node
				while (identityReader.Read()) ;
			}
			if (!reader.IsEmptyElement)
			{
				reader.ReadEndElement();
			}
		}
		public void ConvertToPalasoConformPrivateUseRfc5646Tag_xDashZxxxDashXDashAudio_IsConvertedCorrectly()
		{
			var interpreter = new FlexConformPrivateUseRfc5646TagInterpreter();
			interpreter.ConvertToPalasoConformPrivateUseRfc5646Tag("x-Zxxx-x-AUDIO");
			AssertThatPropertiesAreSet("qaa", "Zxxx", "", "x-AUDIO", interpreter);
		}
		public void ConvertToPalasoConformPrivateUseRfc5646Tag_PrivateUseContainsDuplicates_IsConvertedCorrectly()
		{
			var interpreter = new FlexConformPrivateUseRfc5646TagInterpreter();
			interpreter.ConvertToPalasoConformPrivateUseRfc5646Tag("x-en-x-private-private");
			AssertThatPropertiesAreSet("", "", "", "x-en-private", interpreter);
		}
		public void ConvertToPalasoConformPrivateUseRfc5646Tag_NoLanguageScriptPrivateUse_IsConvertedCorrectly()
		{
			var interpreter = new FlexConformPrivateUseRfc5646TagInterpreter();
			interpreter.ConvertToPalasoConformPrivateUseRfc5646Tag("x-Zxxx-x-audio");
			AssertThatPropertiesAreSet("qaa", "Zxxx", "", "x-audio", interpreter);
		}
		public void ConvertToPalasoConformPrivateUseRfc5646Tag_LanguageVariant_IsConvertedCorrectly()
		{
			var interpreter = new FlexConformPrivateUseRfc5646TagInterpreter();
			interpreter.ConvertToPalasoConformPrivateUseRfc5646Tag("x-en-fonipa");
			AssertThatPropertiesAreSet("qaa", "", "", "fonipa-x-en", interpreter);
		}
		public void ConvertToPalasoConformPrivateUseRfc5646Tag_PrivateUseContainsMultipleXs_RemovesExtraXs()
		{
			var interpreter = new FlexConformPrivateUseRfc5646TagInterpreter();
			interpreter.ConvertToPalasoConformPrivateUseRfc5646Tag("","","","x-x-x-audio");
			AssertThatPropertiesAreSet("", "", "", "x-audio", interpreter);
		}
		public void ConvertToPalasoConformPrivateUseRfc5646Tag_LanguageIsValidRfc5646TagStartingWithX_Throws()
		{
			var interpreter = new FlexConformPrivateUseRfc5646TagInterpreter();
			Assert.That(()=>interpreter.ConvertToPalasoConformPrivateUseRfc5646Tag("xh"), Throws.Exception.TypeOf<ValidationException>());
		}
		private void AssertThatPropertiesAreSet(string language, string script, string region, string variant, FlexConformPrivateUseRfc5646TagInterpreter interpreter)
		{
			Assert.That(interpreter.Language, Is.EqualTo(language));
			Assert.That(interpreter.Script, Is.EqualTo(script));
			Assert.That(interpreter.Region, Is.EqualTo(region));
			Assert.That(interpreter.Variant, Is.EqualTo(variant));
		}