public void XHTMLExportGetDigraphMapsFromICUSortRules_TestSecondaryTertiaryShouldNotGenerateHeader()
        {
            var ws = Cache.LangProject.DefaultVernacularWritingSystem;

            ws.SortRules = "&b << az / c <<< AZ / C" + Environment.NewLine + "&f << gz";
            ws.SortUsing = WritingSystemDefinition.SortRulesType.CustomICU;

            var    exporter = new ConfiguredExport(null, null, 0);
            string output;

            using (var stream = new MemoryStream())
            {
                using (var writer = new StreamWriter(stream))
                {
                    exporter.Initialize(Cache, null, writer, null, "xhtml", null, "dicBody");
                    Dictionary <string, string> mapChars;
                    Set <string> ignoreSet;
                    var          data = exporter.GetDigraphs(ws.Id, out mapChars, out ignoreSet);
                    Assert.AreEqual(data.Count, 0, "Header created for two wedges");
                    Assert.AreEqual(mapChars.Count, 3, "Too many characters found equivalents");
                    Assert.AreEqual(mapChars["az"], "b");
                    Assert.AreEqual(mapChars["AZ"], "b");
                    // Rules following the '/' rule should not be skipped LT-18309
                    Assert.AreEqual(mapChars["gz"], "f");
                }
            }
        }
        public void XHTMLExportGetDigraphMapsFromICUSortRules_TertiaryIgnorableDoesNotCrash()
        {
            var ws = Cache.LangProject.DefaultVernacularWritingSystem;

            ws.SortRules = "&[last tertiary ignorable] = \\";
            ws.SortUsing = WritingSystemDefinition.SortRulesType.CustomICU;

            var    exporter = new ConfiguredExport(null, null, 0);
            string output;

            using (var stream = new MemoryStream())
            {
                using (var writer = new StreamWriter(stream))
                {
                    exporter.Initialize(Cache, null, writer, null, "xhtml", null, "dicBody");
                    Dictionary <string, string> mapChars = null;
                    Set <string> ignoreSet = null;
                    Set <string> data      = null;
                    Assert.DoesNotThrow(() => data = exporter.GetDigraphs(ws.Id, out mapChars, out ignoreSet));
                    // The second test catches the real world scenario, GetDigraphs is actually called many times, but the first time
                    // is the only one that should trigger the algorithm, afterward the information is cached in the exporter.
                    Assert.DoesNotThrow(() => data = exporter.GetDigraphs(ws.Id, out mapChars, out ignoreSet));
                    Assert.AreEqual(mapChars.Count, 0, "Too many characters found equivalents");
                    Assert.AreEqual(ignoreSet.Count, 1, "Ignorable character not parsed from rule");
                }
            }
        }
        public void XHTMLExportGetDigraphMapsFromICUSortRules_BeforeRuleSecondaryIgnored()
        {
            var ws = Cache.LangProject.DefaultVernacularWritingSystem;

            ws.SortRules = "& [before 2] a < aa <<< Aa <<< AA";
            ws.SortUsing = WritingSystemDefinition.SortRulesType.CustomICU;

            var    exporter = new ConfiguredExport(null, null, 0);
            string output;

            using (var stream = new MemoryStream())
            {
                using (var writer = new StreamWriter(stream))
                {
                    exporter.Initialize(Cache, null, writer, null, "xhtml", null, "dicBody");
                    Dictionary <string, string> mapChars = null;
                    Set <string> ignoreSet = null;
                    Set <string> data      = null;
                    Assert.DoesNotThrow(() => data = exporter.GetDigraphs(ws.Id, out mapChars, out ignoreSet));
                    Assert.AreEqual(data.Count, 0, "No characters should be generated by a before 2 rule");
                    Assert.AreEqual(mapChars.Count, 0, "The rule should have been ignored, no characters ought to have been mapped");
                    Assert.AreEqual(ignoreSet.Count, 0, "Ignorable character incorrectly parsed from rule");
                }
            }
        }
        private void TestBeginCssClassForFlowType(string flowType)
        {
            var    exporter = new ConfiguredExport(null, null, 0);
            string output;

            using (var stream = new MemoryStream())
            {
                using (var writer = new StreamWriter(stream))
                {
                    exporter.Initialize(Cache, null, writer, null, "xhtml", null, "dicBody");

                    var frag = new XmlDocument();
                    frag.LoadXml("<p css='some#style' flowType='" + flowType + "'/>");

                    exporter.BeginCssClassIfNeeded(frag.DocumentElement);
                    writer.Flush();
                    stream.Seek(0, SeekOrigin.Begin);
                    using (var reader = new StreamReader(stream))
                    {
                        output = reader.ReadToEnd();
                    }
                }
            }
            Assert.That(output, Is.StringContaining("class=\"someNUMBER_SIGNstyle\""));
        }
        public void XHTMLExportGetDigraphMapsFromICUSortRules_BeforeRulePrimaryGetsADigraph()
        {
            var ws = Cache.LangProject.DefaultVernacularWritingSystem;

            ws.SortRules = "& [before 1] a < aa <<< Aa <<< AA";
            ws.SortUsing = WritingSystemDefinition.SortRulesType.CustomICU;

            var    exporter = new ConfiguredExport(null, null, 0);
            string output;

            using (var stream = new MemoryStream())
            {
                using (var writer = new StreamWriter(stream))
                {
                    exporter.Initialize(Cache, null, writer, null, "xhtml", null, "dicBody");
                    Dictionary <string, string> mapChars = null;
                    Set <string> ignoreSet = null;
                    Set <string> data      = null;
                    Assert.DoesNotThrow(() => data = exporter.GetDigraphs(ws.Id, out mapChars, out ignoreSet));
                    Assert.AreEqual(data.Count, 1, "Wrong number of character mappings found");
                    Assert.AreEqual(mapChars.Count, 2, "Wrong number of character mappings found");
                    Assert.AreEqual(ignoreSet.Count, 0, "Ignorable character incorrectly parsed from rule");
                }
            }
        }
Beispiel #6
0
        public void XHTMLExportGetDigraphMapsFirstCharactersFromICUSortRules()
        {
            CoreWritingSystemDefinition ws = Cache.LangProject.DefaultVernacularWritingSystem;

            ws.DefaultCollation = new IcuRulesCollationDefinition("standard")
            {
                IcuRules = "&b < az << a < c <<< ch"
            };

            var    exporter = new ConfiguredExport(null, null, 0);
            string output;

            using (var stream = new MemoryStream())
            {
                using (var writer = new StreamWriter(stream))
                {
                    exporter.Initialize(Cache, m_propertyTable, writer, null, "xhtml", null, "dicBody");
                    Dictionary <string, string> mapChars;
                    ISet <string> ignoreSet;
                    var           data = exporter.GetDigraphs(ws.Id, out mapChars, out ignoreSet);
                    Assert.AreEqual(mapChars.Count, 2, "Too many characters found equivalents");
                    Assert.AreEqual(mapChars["a"], "az");
                    Assert.AreEqual(mapChars["ch"], "c");
                }
            }
        }
        public void XHTMLExportGetDigraphMapsFromICUSortRules_UnicodeTertiaryIgnorableWorks()
        {
            var ws = Cache.LangProject.DefaultVernacularWritingSystem;

            ws.SortRules = "&[last tertiary ignorable] = \\uA78C";
            ws.SortUsing = WritingSystemDefinition.SortRulesType.CustomICU;

            var    exporter = new ConfiguredExport(null, null, 0);
            string output;

            using (var stream = new MemoryStream())
            {
                using (var writer = new StreamWriter(stream))
                {
                    exporter.Initialize(Cache, null, writer, null, "xhtml", null, "dicBody");
                    Dictionary <string, string> mapChars = null;
                    Set <string> ignoreSet = null;
                    Set <string> data      = null;
                    Assert.DoesNotThrow(() => data = exporter.GetDigraphs(ws.Id, out mapChars, out ignoreSet));
                    Assert.AreEqual(mapChars.Count, 0, "Too many characters found equivalents");
                    Assert.AreEqual(ignoreSet.Count, 1, "Ignorable character not parsed from rule");
                    Assert.IsTrue(ignoreSet.Contains('\uA78C'.ToString(CultureInfo.InvariantCulture)));
                }
            }
        }
Beispiel #8
0
        public void XHTMLExportGetDigraphMapsFirstCharactersFromSortRulesWithNoMapping()
        {
            var ws = Cache.LangProject.DefaultVernacularWritingSystem;

            ws.DefaultCollation = new SimpleRulesCollationDefinition("standard")
            {
                SimpleRules = "b" + Environment.NewLine + "ñe ñ"
            };

            var    exporter = new ConfiguredExport(null, null, 0);
            string output;

            using (var stream = new MemoryStream())
            {
                using (var writer = new StreamWriter(stream))
                {
                    exporter.Initialize(Cache, m_propertyTable, writer, null, "xhtml", null, "dicBody");
                    Dictionary <string, string> mapChars;
                    ISet <string> ignoreSet;
                    var           data = exporter.GetDigraphs(ws.Id, out mapChars, out ignoreSet);
                    Assert.AreEqual(data.Count, 2, "Two Digraphs should be returned");
                    Assert.AreEqual(mapChars["ñ"], "ñe");
                }
            }
        }
Beispiel #9
0
        public void XHTMLExportGetDigraphMapsFromICUSortRules_BeforeRuleCombinedWithNormalRuleWorks()
        {
            CoreWritingSystemDefinition ws = Cache.LangProject.DefaultVernacularWritingSystem;

            ws.DefaultCollation = new IcuRulesCollationDefinition("standard")
            {
                IcuRules = "& a < bb & [before 1] a < aa"
            };

            var    exporter = new ConfiguredExport(null, null, 0);
            string output;

            using (var stream = new MemoryStream())
            {
                using (var writer = new StreamWriter(stream))
                {
                    exporter.Initialize(Cache, m_propertyTable, writer, null, "xhtml", null, "dicBody");
                    Dictionary <string, string> mapChars = null;
                    ISet <string> ignoreSet = null;
                    ISet <string> data      = null;
                    Assert.DoesNotThrow(() => data = exporter.GetDigraphs(ws.Id, out mapChars, out ignoreSet));
                    Assert.AreEqual(data.Count, 2, "The [before 1] rule should have added one additional character");
                }
            }
        }
Beispiel #10
0
        public void XHTMLExportGetDigraphMapsFromICUSortRules_TertiaryIgnorableMixedSpacingWorks()
        {
            CoreWritingSystemDefinition ws = Cache.LangProject.DefaultVernacularWritingSystem;

            ws.DefaultCollation = new IcuRulesCollationDefinition("standard")
            {
                IcuRules = "&[last tertiary ignorable]= '!'\r\n&[last tertiary ignorable] ='?'"
            };

            var    exporter = new ConfiguredExport(null, null, 0);
            string output;

            using (var stream = new MemoryStream())
            {
                using (var writer = new StreamWriter(stream))
                {
                    exporter.Initialize(Cache, m_propertyTable, writer, null, "xhtml", null, "dicBody");
                    Dictionary <string, string> mapChars = null;
                    ISet <string> ignoreSet = null;
                    ISet <string> data      = null;
                    Assert.DoesNotThrow(() => data = exporter.GetDigraphs(ws.Id, out mapChars, out ignoreSet));
                    Assert.AreEqual(mapChars.Count, 0, "Too many characters found equivalents");
                    Assert.AreEqual(ignoreSet.Count, 2, "Ignorable character not parsed from rule");
                    CollectionAssert.AreEquivalent(ignoreSet, new[] { "!", "?" });
                }
            }
        }
        public void XHTMLExportGetLeadChar_SurrogatePairDoesNotCrash()
        {
            string         data = null;
            IWritingSystem wsEn;

            Cache.ServiceLocator.WritingSystemManager.GetOrSet("ipo", out wsEn);
            Cache.ServiceLocator.WritingSystems.AddToCurrentVernacularWritingSystems(wsEn);
            string entryLetter = "\U00016F00\U00016F51\U00016F61\U00016F90";
            Dictionary <string, Set <string> > wsDigraphMap = new Dictionary <string, Set <string> >();
            Dictionary <string, Dictionary <string, string> > wsCharEquivalentMap = new Dictionary <string, Dictionary <string, string> >();
            Dictionary <string, Set <string> > wsIgnorableCharMap = new Dictionary <string, Set <string> >();

            Assert.DoesNotThrow(() => data = ConfiguredExport.GetLeadChar(entryLetter, "ipo", wsDigraphMap, wsCharEquivalentMap, wsIgnorableCharMap, Cache));
            Assert.AreEqual(data.Length, 2, "Surrogate pair should contains 2 characters");
        }
        public void XHTMLExportGetDigraphMapsFirstCharactersFromOtherSortRules()
        {
            var ws = Cache.LangProject.DefaultVernacularWritingSystem;

            ws.SortRules = "fr";
            ws.SortUsing = WritingSystemDefinition.SortRulesType.OtherLanguage;

            var    exporter = new ConfiguredExport(null, null, 0);
            string output;

            using (var stream = new MemoryStream())
            {
                using (var writer = new StreamWriter(stream))
                {
                    exporter.Initialize(Cache, null, writer, null, "xhtml", null, "dicBody");
                    Dictionary <string, string> mapChars;
                    Set <string> ignoreSet;
                    var          data = exporter.GetDigraphs(ws.Id, out mapChars, out ignoreSet);
                    Assert.AreEqual(mapChars.Count, 0, "No equivalents expected");
                }
            }
        }
        public void XHTMLExportGetDigraphMapsFirstCharactersFromToolboxSortRules()
        {
            var ws = Cache.LangProject.DefaultVernacularWritingSystem;

            ws.SortRules = "b" + Environment.NewLine + "az a" + Environment.NewLine + "c ch";
            ws.SortUsing = WritingSystemDefinition.SortRulesType.CustomSimple;

            var    exporter = new ConfiguredExport(null, null, 0);
            string output;

            using (var stream = new MemoryStream())
            {
                using (var writer = new StreamWriter(stream))
                {
                    exporter.Initialize(Cache, null, writer, null, "xhtml", null, "dicBody");
                    Dictionary <string, string> mapChars;
                    Set <string> ignoreSet;
                    var          data = exporter.GetDigraphs(ws.Id, out mapChars, out ignoreSet);
                    Assert.AreEqual(mapChars.Count, 2, "Too many characters found equivalents");
                    Assert.AreEqual(mapChars["a"], "az");
                    Assert.AreEqual(mapChars["ch"], "c");
                }
            }
        }
Beispiel #14
0
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Exports the configured doc view.
        /// </summary>
        /// <param name="progressDlg">The progress dialog.</param>
        /// <param name="parameters">The parameters.</param>
        /// <returns>Always null.</returns>
        /// ------------------------------------------------------------------------------------
        private object ExportConfiguredDocView(IAdvInd4 progressDlg, params object[] parameters)
        {
            Debug.Assert(parameters.Length == 3);
            m_progressDlg = progressDlg;
            if (m_xvc == null)
            {
                return(null);
            }

            string  outPath = (string)parameters[0];
            string  fxtPath = (string)parameters[1];
            FxtType ft      = (FxtType)parameters[2];

            try
            {
                m_cache.EnableBulkLoadingIfPossible(true);

                using (TextWriter w = new StreamWriter(outPath))
                {
                    FileInfo outFile = new FileInfo(outPath);
#if DEBUG
                    string dirPath   = Path.GetTempPath();
                    int    copyCount = 1;
                    string s         = string.Format("Starting Configured Export at {0}",
                                                     System.DateTime.Now.ToLongTimeString());
                    Debug.WriteLine(s);
#endif
                    m_ce = new ConfiguredExport(null, m_cache.MainCacheAccessor, m_hvoRootObj);
                    m_ce.Initialize(m_cache, w, ft.m_sDataType, ft.m_sFormat, outPath);
                    m_ce.UpdateProgress += new SIL.FieldWorks.Common.Controls.ConfiguredExport.ProgressHandler(ce_UpdateProgress);
                    m_xvc.Display(m_ce, m_hvoRootObj, m_seqView.RootFrag);
                    m_ce.Finish(ft.m_sDataType);
                    w.Close();
#if DEBUG
                    s = string.Format("Finished Configured Export Dump at {0}",
                                      System.DateTime.Now.ToLongTimeString());
                    Debug.WriteLine(s);
#endif
                    if (ft.m_sXsltFiles != null && ft.m_sXsltFiles.Length != 0)
                    {
                        string[] rgsXslts = ft.m_sXsltFiles.Split(new char[] { ';' });
                        int      cXslts   = rgsXslts.GetLength(0);
                        progressDlg.Position = 0;
                        progressDlg.SetRange(0, cXslts);
                        progressDlg.Message =
                            xWorksStrings.ProcessingIntoFinalForm;
                        int idx = fxtPath.LastIndexOfAny(new char[] { '/', '\\' });
                        if (idx < 0)
                        {
                            idx = 0;
                        }
                        else
                        {
                            ++idx;
                        }
                        string basePath = fxtPath.Substring(0, idx);
                        for (int ix = 0; ix <= cXslts; ++ix)
                        {
#if DEBUG
                            File.Copy(outPath, Path.Combine(dirPath, "DebugOnlyExportStage" + copyCount + ".txt"), true);
                            copyCount++;
                            if (ix < cXslts)
                            {
                                s = String.Format("Starting Configured Export XSLT file {0} at {1}",
                                                  rgsXslts[ix], System.DateTime.Now.ToLongTimeString());
                            }
                            else
                            {
                                s = String.Format("Starting final postprocess phase at {0}",
                                                  System.DateTime.Now.ToLongTimeString());
                            }
                            Debug.WriteLine(s);
#endif
                            if (ix < cXslts)
                            {
                                string sXsltPath = basePath + rgsXslts[ix];
                                m_ce.PostProcess(sXsltPath, outPath, ix + 1);
                            }
                            else
                            {
                                m_ce.PostProcess(null, outPath, ix + 1);
                            }
                            progressDlg.Step(0);
                        }
                    }

                    if (ft.m_sFormat.ToLowerInvariant() == "xhtml")
                    {
                        IVwStylesheet vss = null;
                        if (m_seqView.RootBox != null)
                        {
                            vss = m_seqView.RootBox.Stylesheet;
                        }
                        m_ce.WriteCssFile(Path.ChangeExtension(outPath, ".css"), vss);
                    }
                    m_ce = null;
#if DEBUG
                    File.Copy(outPath, Path.Combine(dirPath, "DebugOnlyExportStage" + copyCount + ".txt"), true);
                    s = string.Format("Totally Finished Configured Export at {0}",
                                      System.DateTime.Now.ToLongTimeString());
                    Debug.WriteLine(s);
#endif
                }
            }
            finally
            {
                m_cache.EnableBulkLoadingIfPossible(false);
            }
            return(null);
        }
Beispiel #15
0
        protected void DoExport(string outPath, bool fLiftOutput)
        {
            string  fxtPath = (string)m_exportList.SelectedItems[0].Tag;
            FxtType ft      = m_rgFxtTypes[FxtIndex(fxtPath)];

            using (new SIL.FieldWorks.Common.Utils.WaitCursor(this))
            {
                using (ProgressDialogWithTask progressDlg = new ProgressDialogWithTask(this))
                {
                    try
                    {
                        progressDlg.Title = String.Format(xWorksStrings.Exporting0,
                                                          m_exportList.SelectedItems[0].SubItems[0].Text);
                        progressDlg.Message = xWorksStrings.Exporting_;

                        switch (ft.m_ft)
                        {
                        case FxtTypes.kftFxt:
                            using (m_dumper = new XDumper(m_cache))
                            {
                                m_dumper.UpdateProgress +=
                                    new XDumper.ProgressHandler(OnDumperUpdateProgress);
                                m_dumper.SetProgressMessage +=
                                    new EventHandler <XDumper.MessageArgs>(OnDumperSetProgressMessage);
                                progressDlg.SetRange(0, m_dumper.GetProgressMaximum());
                                progressDlg.CancelButtonVisible = true;
                                progressDlg.Restartable         = true;
                                progressDlg.ProgressBarStyle    = ProgressBarStyle.Continuous;
                                progressDlg.Cancel += new CancelHandler(Onm_progressDlg_Cancel);

                                progressDlg.RunTask(true, new BackgroundTaskInvoker(ExportFxt),
                                                    outPath, fxtPath, fLiftOutput);
                            }
                            break;

                        case FxtTypes.kftConfigured:
                        case FxtTypes.kftReversal:
                            progressDlg.SetRange(0, m_seqView.ObjectCount);
                            progressDlg.CancelButtonVisible = true;
                            progressDlg.Cancel += new CancelHandler(ce_Cancel);

                            progressDlg.RunTask(true, new BackgroundTaskInvoker(ExportConfiguredDocView),
                                                outPath, fxtPath, ft);
                            break;
                        }
                    }
                    catch (WorkerThreadException e)
                    {
                        if (e.InnerException is CancelException)
                        {
                            MessageBox.Show(this, e.InnerException.Message);
                            m_ce = null;
                        }
                        else
                        {
                            string msg = xWorksStrings.ErrorExporting_ProbablyBug + "\n" + e.InnerException.Message;
                            MessageBox.Show(this, msg);
                        }
                    }
                    finally
                    {
                        m_progressDlg = null;
                        m_dumper      = null;
                        this.Close();
                    }
                }
            }
        }