public void OneTimeSetUp() { var origDom = new HtmlDom(roundtripTestBook, true); _roundtrippedDom = new HtmlDom(roundtripTestBook, true); //Will get imported into // We want to test that exporting a book with branding in the data-dive and importing into a book with no branding // does not reinstate the branding. So we need to remove it from the pre-import DOM, which is otherwise // (for this test) the same as what we originally exported. var branding = _roundtrippedDom.SelectSingleNode("//div[@data-book='outside-back-cover-branding-bottom-html']"); branding.ParentNode.RemoveChild(branding); AssertThatXmlIn.Dom(origDom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//div[@id='simpleFormattingTest']", 1); AssertThatXmlIn.Dom(origDom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//div[@id='nestedFormattingTest']", 1); var mockLangDisplayNameResolver = new Mock <ILanguageDisplayNameResolver>(); mockLangDisplayNameResolver.Setup(x => x.GetLanguageDisplayName("en")).Returns("English"); var exporter = new SpreadsheetExporter(mockLangDisplayNameResolver.Object); exporter.Params = new SpreadsheetExportParams(); _sheetFromExport = exporter.Export(origDom, "fakeImagesFolderpath"); using (var tempFile = TempFile.WithExtension("xslx")) { _sheetFromExport.WriteToFile(tempFile.Path); var sheet = InternalSpreadsheet.ReadFromFile(tempFile.Path); var importer = new SpreadsheetImporter(null, _roundtrippedDom); importer.Import(sheet); } }
public static int Handle(SpreadsheetImportParameters options) { try { string folderPath = Directory.GetParent(options.BookPath).FullName; BookStorage.SaveCopyBeforeImportOverwrite(folderPath); var sheet = InternalSpreadsheet.ReadFromFile(options.InputPath); var dom = new HtmlDom(XmlHtmlConverter.GetXmlDomFromHtmlFile(options.BookPath, false)); var importer = new SpreadsheetImporter(null, dom, Path.GetDirectoryName(options.InputPath), folderPath); if (!string.IsNullOrEmpty(options.ParamsPath)) { importer.Params = SpreadsheetImportParams.FromFile(options.ParamsPath); } var messages = importer.Import(sheet); foreach (var message in messages) { Debug.WriteLine(message); Console.WriteLine(message); } // Review: A lot of other stuff happens in Book.Save() and BookStorage.SaveHtml(). // I doubt we need any of it for current purposes, but later we might. XmlHtmlConverter.SaveDOMAsHtml5(dom.RawDom, options.BookPath); Console.WriteLine("done"); return(0); // all went well } catch (Exception ex) { Debug.WriteLine(ex.Message); Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); return(1); } }
public void OneTimeSetup() { _testFolder = new TemporaryFolder("SpreadsheetImporterWithBookTests"); // We need 2 layers of temp folder because BringBookUpToDate will change the name of the book // folder to match an imported title. _bookFolder = new TemporaryFolder(_testFolder, "Book"); var settings = new NewCollectionSettings(); settings.Language1.Iso639Code = "en"; settings.Language1.SetName("English", false); settings.SettingsFilePath = Path.Combine(_bookFolder.FolderPath, "dummy"); var fileLocator = new BloomFileLocator(settings, new XMatterPackFinder(new string[] { }), ProjectContext.GetFactoryFileLocations(), ProjectContext.GetFoundFileLocations(), ProjectContext.GetAfterXMatterFileLocations()); var bookFilePath = Path.Combine(_bookFolder.FolderPath, "testBook.htm"); if (File.Exists(bookFilePath)) // Shouldn't ever happen, but... just being careful. { RobustFile.Delete(bookFilePath); } _dom = SetupTestDom(); // Write out our test book File.WriteAllText(bookFilePath, _dom.RawDom.OuterXml.ToString()); var storage = new BookStorage(_bookFolder.FolderPath, fileLocator, new BookRenamedEvent(), settings); var book = new Bloom.Book.Book(new BookInfo(_bookFolder.FolderPath, true), storage, null, settings, new Bloom.Edit.PageSelection(), new PageListChangedEvent(), new BookRefreshEvent()); // Create the regular production importer _importer = new SpreadsheetImporter(null, book, _bookFolder.FolderPath); // Set up the internal spreadsheet rows directly. var ss = new InternalSpreadsheet(); var columnForEn = ss.AddColumnForLang("en", "English"); var columnForImage = ss.GetColumnForTag(InternalSpreadsheet.ImageSourceColumnLabel); var newTitle = "My new book title"; var titleRow = new ContentRow(ss); titleRow.AddCell(InternalSpreadsheet.BookTitleRowLabel); titleRow.SetCell(columnForEn, newTitle); var coverImageRow = new ContentRow(ss); coverImageRow.AddCell(InternalSpreadsheet.CoverImageRowLabel); coverImageRow.SetCell(columnForImage, Path.Combine("images", "Othello 199.jpg")); _importer.Import(ss); _resultElement = ReadResultingBookToXml(newTitle); }
public void OneTimeSetUp() { // Cases we want to test: // - page has too many translation groups // - V1: warn, leave extras unmodified // - eventual: ? // - page has too few translation groups (special case: none) // - V1: warn, drop extra inputs // - V2: insert extra copies of page (and something else if it has no TGs) // - eventual: insert extra pages using template specified in sheet // - there are input lines for pages that don't exist (pathological, in the middle; likely, after last; test both) // - V1: warn, ignore // - eventual: insert extra pages using template specified in sheet // - there are pages that have no input lines (but later pages do) // - there are pages after the last input line // - V1: warn, leave unchanged. // - eventual: ? // In this test suite, the blocks on the last page and the pages run out before // we run out of lines. So we can't test the case of running out of lines first. // Another class tests that. _dom = new HtmlDom(inputBook, true); _sheet = new InternalSpreadsheet(); _sheet.ColumnForLang("en"); _sheet.ColumnForLang("fr"); _sheet.AddRow(MakeRow("1", "New message about tigers", "New message about French tigers")); // problem 1: input DOM has a second TG on page 1; sheet does not. _sheet.AddRow(MakeRow("2", "More about tigers", "More about French tigers")); // problem 2: input DOM has no second TG on page 2. _sheet.AddRow(MakeRow("2", "Still more about tigers", "Still more about French tigers")); _sheet.AddRow(MakeRow("2", "More and more about tigers", "More and more about French tigers")); // problem 3: input DOM has no page 3 at all. _sheet.AddRow(MakeRow("3", "Lost story about tigers", "Lost story about French tigers")); _sheet.AddRow(MakeRow("3", "Another lost story about tigers", "Another lost story about French tigers")); // problem 4: input DOM has no page 4 at all. _sheet.AddRow(MakeRow("4", "Yet another lost story about tigers", "Yet another lost story about French tigers")); _sheet.AddRow(MakeRow("5", "A good story about tigers", "A good story about French tigers")); _sheet.AddRow(MakeRow("5", "Another good story about tigers", "Another good story about French tigers")); // problem 5: an extra block on page 5 _sheet.AddRow(MakeRow("5", "Page 5 lost story about tigers", "Page 5 lost story about French tigers")); // problem 6: an extra block on after the last page _sheet.AddRow(MakeRow("6", "Page 6 lost story about tigers", "Page 6 lost story about French tigers")); var importer = new SpreadsheetImporter(this._dom, _sheet); _messages = importer.Import(); }
public void OneTimeSetUp() { _dom = new HtmlDom(SpreadsheetTests.kSimpleTwoPageBook, true); AssertThatXmlIn.Dom(_dom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//div[@lang='en']/p[text()='Riding on elephants can be risky.']", 1); // unchanged var exporter = new SpreadsheetExporter(); _sheet = exporter.Export(_dom); var indexDe = _sheet.ColumnForLang("de"); _sheet.Header.SetCell(indexDe, "[tpi]"); _sheet.ContentRows.First().SetCell(_sheet.ColumnForLang("en"), "<p>This elephant is running amok.</p>"); _sheet.ContentRows.Skip(2).First().SetCell(_sheet.ColumnForLang("fr"), "<p>Riding on French elephants can be very risky.</p>"); var importer = new SpreadsheetImporter(this._dom, _sheet); InitializeImporter(importer); importer.Import(); }
public void OneTimeSetUp() { // Cases we want to test: // - there are more blocks on the last page after we run out of input lines // - there are pages after the last input line // - V1: warn, leave unchanged. // - eventual: ? // In this test suite, lines run out before the blocks. _dom = new HtmlDom(inputBook, true); _sheet = new InternalSpreadsheet(); _sheet.ColumnForLang("en"); _sheet.ColumnForLang("fr"); _sheet.AddRow(SpreadsheetImportSyncWarnings.MakeRow("1", "New message about tigers", "New message about French tigers")); _sheet.AddRow(SpreadsheetImportSyncWarnings.MakeRow("2", "More about tigers", "More about French tigers")); // problem: there's no input corresponding to the second block on page 2, nor any of page 4. var importer = new SpreadsheetImporter(this._dom, _sheet); _messages = importer.Import(); }