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(); }
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); }
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)); }