public void RemoveUnwantedLanguageData(string destDirName, IEnumerable <string> languagesToInclude) { // There should be only one html file with the same name as the directory it's in, but let's // not make any assumptions here. foreach (var filepath in Directory.EnumerateFiles(destDirName, "*.htm")) { var xmlDomFromHtmlFile = XmlHtmlConverter.GetXmlDomFromHtmlFile(filepath, false); var dom = new HtmlDom(xmlDomFromHtmlFile); PublishModel.RemoveUnwantedLanguageData(dom, languagesToInclude); XmlHtmlConverter.SaveDOMAsHtml5(dom.RawDom, filepath); } }
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); }
// Insert a clone of templatePage into the document before _currentPage (or after _lastContentPage, if _currentPage is null), // and make _currentPage point to the new page. private void ImportPage(XmlElement templatePage) { var newPage = _pages[0].OwnerDocument.ImportNode(templatePage, true) as XmlElement; BookStarter.SetupIdAndLineage(templatePage, newPage); _pages.Insert(_currentPageIndex, newPage); SizeAndOrientation.UpdatePageSizeAndOrientationClasses(newPage, _destLayout); // Correctly inserts at end if _currentPage is null, though this will hardly ever // be true because we normally have at least backmatter page to insert before. _pages[0].ParentNode.InsertBefore(newPage, _currentPage); // clear everything: this is useful in case it has slots we won't use. // They might have content either from the original last page, or from the // modifications we already made to it. var editables = newPage.SelectNodes(".//div[contains(@class, 'bloom-editable') and @lang != 'z']").Cast <XmlElement>().ToArray(); foreach (var e in editables) { e.ParentNode.RemoveChild(e); } var imageContainers = GetImageContainers(newPage); foreach (var c in imageContainers) { var img = GetImgFromContainer(c); img?.SetAttribute("src", "placeHolder.png"); foreach (var attr in new[] { "alt", "data-copyright", "data-creator", "data-license" }) { img?.RemoveAttribute(attr); } c.RemoveAttribute("title"); } // This is not tested yet, but we want to remove video content if any from whatever last page we're copying. foreach (var v in newPage.SelectNodes(".//div[contains(@class, 'bloom-videoContainer')]/video") .Cast <XmlElement>().ToList()) { HtmlDom.AddClass(v.ParentNode as XmlElement, "bloom-noVideoSelected"); v.ParentNode.RemoveChild(v); } // and widgets (also not tested) foreach (var w in newPage.SelectNodes(".//div[contains(@class, 'bloom-widgetContainer')]/iframe") .Cast <XmlElement>().ToList()) { HtmlDom.AddClass(w.ParentNode as XmlElement, "bloom-noWidgetSelected"); w.ParentNode.RemoveChild(w); } _currentPage = newPage; }
public void AmpersandInOriginalCopyrightHandledProperly() { // See http://issues.bloomlibrary.org/youtrack/issue/BL-4585. var dom = new HtmlDom( @"<html> <head><meta name='lockedDownAsShell' content='true'></meta></head> <body> <div id='bloomDataDiv'> <div data-book='copyright' lang='*'> Copyright © 2011, LASI & SILA </div> <div data-book='licenseUrl' lang='en'> http://creativecommons.org/licenses/by-nc-sa/4.0/ </div> </div> <div class='bloom-page cover frontCover outsideFrontCover coverColor bloom-frontMatter A4Landscape layout-style-Default' data-page='required singleton' data-export='front-matter-cover' id='2c97f5ad-24a1-47f0-8b5c-fa2181e1b129'> <div class='bloom-page cover frontCover outsideFrontCover coverColor bloom-frontMatter verso A4Landscape layout-style-Default' data-page='required singleton' data-export='front-matter-credits' id='7a220c97-07e4-47c5-835a-e37dc921f98f'> <div class='marginBox'> <div data-functiononhintclick='bookMetadataEditor' data-hint='Click to Edit Copyright & License' id='versoLicenseAndCopyright' class='bloom-metaData'> <div data-derived='copyright' lang='*' class='copyright'></div> <div data-derived='originalCopyrightAndLicense' lang='en' class='copyright'></div> </div> </div> </div> </div> </body> </html>" ); var metadata = BookCopyrightAndLicense.GetMetadata(dom); var initialCopyright = metadata.CopyrightNotice; Assert.AreEqual("Copyright © 2011, LASI & SILA", initialCopyright); var bookData = new BookData(dom, _collectionSettings, null); BookCopyrightAndLicense.SetOriginalCopyrightAndLicense(dom, bookData, _collectionSettings); var originalCopyright = GetEnglishOriginalCopyrightAndLicense(dom); Assert.AreEqual("Adapted from original, Copyright © 2011, LASI & SILA. Licensed under CC-BY-NC-SA 4.0.", originalCopyright); BookCopyrightAndLicense.UpdateDomFromDataDiv(dom, null, _collectionSettings); var nodes1 = dom.RawDom.SelectNodes("/html/body//div[@data-derived='originalCopyrightAndLicense']"); Assert.AreEqual(1, nodes1.Count); Assert.AreEqual("Adapted from original, Copyright © 2011, LASI & SILA. Licensed under CC-BY-NC-SA 4.0.", nodes1.Item(0).InnerText); Assert.AreEqual("Adapted from original, Copyright © 2011, LASI & SILA. Licensed under CC-BY-NC-SA 4.0.", nodes1.Item(0).InnerXml); var nodes2 = dom.RawDom.SelectNodes("/html/body//div[@data-derived='copyright']"); Assert.AreEqual(1, nodes2.Count); Assert.AreEqual("", nodes2.Item(0).InnerText); Assert.AreEqual("", nodes2.Item(0).InnerXml); AssertOriginalCopyrightAndLicense(dom, "Copyright © 2011, LASI & SILA", "http://creativecommons.org/licenses/by-nc-sa/4.0/"); }
private void AddStylesheetClasses(XmlDocument dom) { HtmlDom.AddPublishClassToBody(dom); if (LayoutPagesForRightToLeft) { HtmlDom.AddRightToLeftClassToBody(dom); } HtmlDom.AddHidePlaceHoldersClassToBody(dom); if (BookSelection.CurrentSelection.GetDefaultBookletLayoutMethod() == PublishModel.BookletLayoutMethod.Calendar) { HtmlDom.AddCalendarFoldClassToBody(dom); } }
public void RemoveUnwantedLanguageData_BloomDataDiv_RemovesNothingEvenWithN1() { var dom = new HtmlDom(kDataDivHtml); // Check occurrences in original HTML. VerifyDataDivValues(dom); // SUT PublishModel.RemoveUnwantedLanguageData(dom, new[] { "en" }, "en"); // Check occurrences in modified HTML. This should be exactly the same as before. VerifyDataDivValues(dom); }
public void UpdatePageNumberAndSideClassOfPages_RightToLeft_TestSideClasses() { var dom = new HtmlDom(@"<html ><head></head><body> <div id='cover' class='bloom-page side-foo'/> <div id='insideFrontCover' class='bloom-page side-foo'/> <div id='firstWhitePage' class='bloom-page side-foo'/> </body></html>" ); dom.UpdatePageNumberAndSideClassOfPages("abcdefghij", true /* rtl */); AssertThatXmlIn.Dom(dom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//div[@id='cover' and contains(@class,'side-left')]", 1); AssertThatXmlIn.Dom(dom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//div[@id='insideFrontCover' and contains(@class,'side-right')]", 1); AssertThatXmlIn.Dom(dom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//div[@id='firstWhitePage' and contains(@class,'side-left')]", 1); }
public void RemoveUnwantedLanguageData_PreserveIfEmbeddedDivWantedWithXmatter() { var dom = new HtmlDom(kEmbeddedLangDivsXMatterHtml); // Check occurrences in original HTML. VerifyOriginalEmbeddedDivsAreAllThere(dom); // SUT PublishModel.RemoveUnwantedLanguageData(dom, new[] { "en" }); // Check occurrences in modified HTML: nothing removed from xmatter unless national language is specified. VerifyOriginalEmbeddedDivsAreAllThere(dom); }
private static void DelayAllImageNodes(XmlElement pageElementForThumbnail) { var imgNodes = HtmlDom.SelectChildImgAndBackgroundImageElements(pageElementForThumbnail); if (imgNodes != null) { foreach (XmlElement imgNode in imgNodes) { imgNode.SetAttribute("thumb-src", HtmlDom.GetImageElementUrl(imgNode).UrlEncoded); HtmlDom.SetImageElementUrl(new ElementProxy(imgNode), UrlPathString.CreateFromUrlEncodedString("")); } } }
private string MergeClasses(string sourceClasses, string targetClasses, string[] classesToDrop) { var sourceDom = new XmlDocument(); sourceDom.LoadXml(string.Format("<div class='{0}'/>", sourceClasses)); var targetDom = new XmlDocument(); targetDom.LoadXml(string.Format("<div class='{0}'/>", targetClasses)); var targetNode = (XmlElement)targetDom.SelectSingleNode("div"); HtmlDom.MergeClassesIntoNewPage((XmlElement)sourceDom.SelectSingleNode("div"), targetNode, classesToDrop); return(targetNode.GetStringAttribute("class")); }
public void RemoveUnwantedLanguageData_PreserveIfEmbeddedDivWantedWithXmatterN1() { var dom = new HtmlDom(kEmbeddedLangDivsXMatterHtml); // Check occurrences in original HTML. VerifyOriginalEmbeddedDivsAreAllThere(dom); // SUT PublishModel.RemoveUnwantedLanguageData(dom, new[] { "en" }, "de"); // Check occurrences in modified HTML: German should be preserved, French and Spanish removed. VerifyOnlyUnwantedEmbeddedDivsAreRemoved(dom, true); }
public void RemoveUnwantedLanguageData_PreserveIfEmbeddedDivWanted() { var dom = new HtmlDom(kEmbeddedLangDivsHtml); // Check occurrences in original HTML. VerifyOriginalEmbeddedDivsAreAllThere(dom); // SUT PublishModel.RemoveUnwantedLanguageData(dom, new[] { "en" }); // Check occurrences in modified HTML. VerifyOnlyUnwantedEmbeddedDivsAreRemoved(dom, false); }
public void RemoveUnwantedLanguageData_FrontCoverPage_RemovesNothing() { var dom = new HtmlDom(kFrontCoverHtml); // Check occurrences in original HTML. VerifyFrontCoverValues(dom, false); // SUT PublishModel.RemoveUnwantedLanguageData(dom, new[] { "en" }); // Check occurrences in modified HTML. This should be exactly the same as before. VerifyFrontCoverValues(dom, false); }
public void RemoveUnwantedLanguageData_CreditsPage_RemovesRemovesUnwantedButKeepsN1() { var dom = new HtmlDom(kCreditsPageHtml); // Check occurrences in original HTML. VerifyCreditsPageValues(dom, false); // SUT PublishModel.RemoveUnwantedLanguageData(dom, new[] { "en" }, "en"); // Check occurrences in modified HTML. This should NOT be exactly the same as before. VerifyCreditsPageValues(dom, true); }
public void Set_Null_Removes() { var htmlDom = new HtmlDom(); var data = new BookData(htmlDom, new CollectionSettings(), null); data.Set("1", "one", "en"); data.Set("1", null, "en"); Assert.AreEqual(null, data.GetVariableOrNull("1", "en")); AssertThatXmlIn.Dom(htmlDom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//div[@lang='en']", 0); var roundTripData = new BookData(htmlDom, new CollectionSettings(), null); Assert.IsNull(roundTripData.GetVariableOrNull("1", "en")); }
public void RemoveDataDivVariableForOneLanguage_WasTwoForms_OtherRemains() { var htmlDom = new HtmlDom(); var data = new BookData(htmlDom, new CollectionSettings(), null); data.Set("1", "one", "en"); data.Set("1", "uno", "es"); var roundTripData = new BookData(htmlDom, new CollectionSettings(), null); roundTripData.RemoveSingleForm("1", "en"); Assert.IsNull(roundTripData.GetVariableOrNull("1", "en")); Assert.AreEqual("uno", roundTripData.GetVariableOrNull("1", "es")); }
public void RemoveUnwantedLanguageData_PreserveIfEmbeddedDivWantedWithN1() { var dom = new HtmlDom(kEmbeddedLangDivsHtml); // Check occurrences in original HTML. VerifyOriginalEmbeddedDivsAreAllThere(dom); // SUT PublishModel.RemoveUnwantedLanguageData(dom, new[] { "en" }, "de"); // Check occurrences in modified HTML: should be same for content page regardless of specifying national language. VerifyOnlyUnwantedEmbeddedDivsAreRemoved(dom, false); }
public void Set_DidNotHaveForm_Added() { var htmlDom = new HtmlDom(); var data = new BookData(htmlDom, new CollectionSettings(), null); data.Set("1", "one", "en"); Assert.AreEqual("one", data.GetVariableOrNull("1", "en")); AssertThatXmlIn.Dom(htmlDom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//div[@lang='en']", 1); var roundTripData = new BookData(htmlDom, new CollectionSettings(), null); var t = roundTripData.GetVariableOrNull("1", "en"); Assert.AreEqual("one", t); }
public void SortStyleSheetLinks_LeavesBasePageBeforePreviewMode() { var dom = new HtmlDom( @"<html><head> <link rel='stylesheet' href='../../previewMode.css' type='text/css' /> <link rel='stylesheet' href='basePage.css' type='text/css' /> </head></html>" ); dom.SortStyleSheetLinks(); AssertThatXmlIn.Dom(dom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//head/link[1][@href='basePage.css']", 1); AssertThatXmlIn.Dom(dom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//head/link[2][@href='../../previewMode.css']", 1); }
public void Setup() { _storage = new Moq.Mock <IBookStorage>(); _storage.Setup(x => x.GetLooksOk()).Returns(true); _bookDom = new HtmlDom(GetThreePageDom()); _storage.SetupGet(x => x.Dom).Returns(() => _bookDom); _storage.SetupGet(x => x.Key).Returns("testkey"); _storage.SetupGet(x => x.FileName).Returns("testTitle"); _storage.SetupGet(x => x.BookType).Returns(Bloom.Book.Book.BookType.Publication); _storage.Setup(x => x.GetRelocatableCopyOfDom(It.IsAny <IProgress>())).Returns(() => { return (_bookDom.Clone()); }); // review: the real thing does more than just clone _storage.Setup(x => x.MakeDomRelocatable(It.IsAny <HtmlDom>(), It.IsAny <IProgress>())).Returns( (HtmlDom x, IProgress y) => { return(x.Clone()); }); // review: the real thing does more than just clone _storage.Setup(x => x.GetFileLocator()).Returns(() => _fileLocator.Object); _testFolder = new TemporaryFolder("BookTests"); _tempFolder = new TemporaryFolder(_testFolder, "book"); MakeSamplePngImageWithMetadata(Path.Combine(_tempFolder.Path, "original.png")); _storage.SetupGet(x => x.FolderPath).Returns(_tempFolder.Path); // review: the real thing does more than just clone _templateFinder = new Moq.Mock <ITemplateFinder>(); _fileLocator = new Moq.Mock <IFileLocator>(); string root = FileLocator.GetDirectoryDistributedWithApplication("BloomBrowserUI"); string xMatter = FileLocator.GetDirectoryDistributedWithApplication("xMatter"); string factoryCollections = FileLocator.GetDirectoryDistributedWithApplication("factoryCollections"); string templates = FileLocator.GetDirectoryDistributedWithApplication("factoryCollections", "templates"); _fileLocator.Setup(x => x.LocateFileWithThrow("languageDisplayTemplate.css")).Returns(root.CombineForPath("bookLayout", "languageDisplayTemplate.css")); _fileLocator.Setup(x => x.LocateFileWithThrow("previewMode.css")).Returns("../notareallocation/previewMode.css"); _fileLocator.Setup(x => x.LocateFileWithThrow("editMode.css")).Returns("../notareallocation/editMode.css"); _fileLocator.Setup(x => x.LocateFileWithThrow("editTranslationMode.css")).Returns("../notareallocation/editTranslationMode.css"); _fileLocator.Setup(x => x.LocateFileWithThrow("editOriginalMode.css")).Returns("../notareallocation/editOriginalMode.css"); _fileLocator.Setup(x => x.LocateFileWithThrow("basePage.css")).Returns("../notareallocation/basePage.css"); _fileLocator.Setup(x => x.LocateFileWithThrow("bloomBootstrap.js")).Returns("../notareallocation/bloomBootstrap.js"); _fileLocator.Setup(x => x.LocateFileWithThrow("bloomPreviewBootstrap.js")).Returns("../notareallocation/bloomPreviewBootstrap.js"); _fileLocator.Setup(x => x.LocateDirectory("Factory-XMatter")).Returns(xMatter.CombineForPath("Factory-XMatter")); _fileLocator.Setup(x => x.LocateDirectory("Factory-XMatter", It.IsAny <string>())).Returns(xMatter.CombineForPath("Factory-XMatter")); _fileLocator.Setup(x => x.LocateFileWithThrow("Factory-XMatter".CombineForPath("Factory-XMatter.htm"))).Returns(xMatter.CombineForPath("Factory-XMatter", "Factory-XMatter.htm")); //warning: we're neutering part of what the code under test is trying to do here: _fileLocator.Setup(x => x.CloneAndCustomize(It.IsAny <IEnumerable <string> >())).Returns(_fileLocator.Object); _thumbnailer = new Moq.Mock <HtmlThumbNailer>(new object[] { 60 }); _pageSelection = new Mock <PageSelection>(); _pageListChangedEvent = new PageListChangedEvent(); }
/// <summary> /// /// </summary> /// <param name="bookFolderPath"></param> /// <param name="imgOrDivWithBackgroundImage">Can be an XmlElement (during testing)</param> /// <param name="imageInfo"></param> /// <param name="progress"></param> public void ChangePicture(string bookFolderPath, ElementProxy imgOrDivWithBackgroundImage, PalasoImage imageInfo, IProgress progress) { var isSameFile = IsSameFilePath(bookFolderPath, HtmlDom.GetImageElementUrl(imgOrDivWithBackgroundImage), imageInfo); var imageFileName = ImageUtils.ProcessAndSaveImageIntoFolder(imageInfo, bookFolderPath, isSameFile); HtmlDom.SetImageElementUrl(imgOrDivWithBackgroundImage, UrlPathString.CreateFromUnencodedString(imageFileName, true)); UpdateMetadataAttributesOnImage(imgOrDivWithBackgroundImage, imageInfo); // It would seem more natural to use a metadata-saving method on imageInfo, // but the imageInfo has the source file's path locked into it, and the API // gives us no way to change it, so such a save would go to the wrong file. imageInfo.Metadata.Write(Path.Combine(bookFolderPath, imageFileName)); }
public void SetMultilingualContentLanguage_ContentLanguageSpecifiedInHtml_ReadsIt() { var dom = new HtmlDom(@"<html ><head></head><body> <div id='bloomDataDiv'> <div data-book='contentLanguage2'>fr</div> </div> </body></html>" ); var collectionSettings = new CollectionSettings(); var data = new BookData(dom, collectionSettings, null); data.SetMultilingualContentLanguages("en", "de"); Assert.AreEqual("en", data.MultilingualContentLanguage2); Assert.AreEqual("de", data.MultilingualContentLanguage3); }
public void OneTimeSetUp() { var dom = new HtmlDom(kSimpleTwoPageBook, true); _exporter = new SpreadsheetExporter(); _sheetFromExport = _exporter.Export(dom); _rowsFromExport = _sheetFromExport.ContentRows.ToList(); using (var tempFile = TempFile.WithExtension("xslx")) { _sheetFromExport.WriteToFile(tempFile.Path); _sheetFromFile = InternalSpreadsheet.ReadFromFile(tempFile.Path); _rowsFromFile = _sheetFromFile.ContentRows.ToList(); } }
public void SetBookSetting_HadValueWithNoLanguage_RemovesItAndSavesNewValue() { var bookDom = new HtmlDom(@"<html ><head></head><body> <div id='bloomDataDiv'> <div data-book='foo'>blah</div> <div data-book='foo' lang='en'>blah</div> </div> </body></html>" ); bookDom.SetBookSetting("foo", "xyz", "hello"); AssertThatXmlIn.Dom(bookDom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//div[@data-book='foo' and @lang='xyz' and text()='hello']", 1); AssertThatXmlIn.Dom(bookDom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//div[@data-book='foo' and @lang='en' and text()='blah']", 1); AssertThatXmlIn.Dom(bookDom.RawDom).HasNoMatchForXpath("//div[@data-book='foo' and not(@lang)]"); }
public void SetBookSetting_HadADifferentValueCompletely_NewValue() { var bookDom = new HtmlDom(@"<html ><head></head><body> <div id='bloomDataDiv'> <div data-book='foo' lang='en'>blah</div> <div data-book='foo' lang='xyz'>boo</div> </div> </body></html>" ); bookDom.SetBookSetting("foo", "xyz", "hello"); AssertThatXmlIn.Dom(bookDom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//div[@data-book='foo' and @lang='xyz' and text()='hello']", 1); AssertThatXmlIn.Dom(bookDom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//div[@data-book='foo' and @lang='en' and text()='blah']", 1); AssertThatXmlIn.Dom(bookDom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//div[@data-book='foo']", 2); }
public void RemoveBookSetting_TwoVariationsWereThere_BothRemoved() { var bookDom = new HtmlDom(@"<html ><head></head><body> <div id='bloomDataDiv'> <div data-book='leaveMe' lang='en'>something unique</div> <div data-book='removeMe' lang='id'>Buku Dasar</div> <div data-book='removeMe' lang='tpi'>Nupela Buk</div> </div> </body></html>" ); bookDom.RemoveBookSetting("removeMe"); AssertThatXmlIn.Dom(bookDom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//div[@data-book='removeMe']", 0); AssertThatXmlIn.Dom(bookDom.RawDom).HasSpecifiedNumberOfMatchesForXpath("//div[@data-book='leaveMe']", 1); }
public void GetThumbnailAsync(int width, int height, HtmlDom dom, Action <Image> onReady, Action <Exception> onError) { var thumbnailOptions = new HtmlThumbNailer.ThumbnailOptions() { BackgroundColor = Color.White, BorderStyle = HtmlThumbNailer.ThumbnailOptions.BorderStyles.None, CenterImageUsingTransparentPadding = false, Height = height, Width = width }; dom.UseOriginalImages = true; // apparently these thumbnails can be big...anyway we want printable images. _thumbNailer.HtmlThumbNailer.GetThumbnailAsync(String.Empty, string.Empty, dom, thumbnailOptions, onReady, onError); }
public void PrettyPrintLanguage_AdjustsKnownLanguages() { var htmlDom = new HtmlDom(); var settingsettings = new CollectionSettings() { Language1Iso639Code = "pdc", Language1Name = "German, Kludged", Language2Iso639Code = "de", Language3Iso639Code = "fr" }; var data = new BookData(htmlDom, settingsettings, null); Assert.That(data.PrettyPrintLanguage("de"), Is.EqualTo("German")); Assert.That(data.PrettyPrintLanguage("fr"), Is.EqualTo("French")); Assert.That(data.PrettyPrintLanguage("en"), Is.EqualTo("English")); Assert.That(data.PrettyPrintLanguage("es"), Is.EqualTo("Spanish")); }
// BL-5998 Apparently Word doesn't read our CSS rules for bloom-visibility correctly. // So we're forced to control visibility more directly with inline styles. private static XmlDocument RepairWordVisibility(string content) { var xmlDoc = XmlHtmlConverter.GetXmlDomFromHtml(content); var dom = new HtmlDom(xmlDoc); var bloomEditableDivs = dom.RawDom.SafeSelectNodes("//div[contains(@class, 'bloom-editable')]"); foreach (XmlElement editableDiv in bloomEditableDivs) { HtmlDom.SetInlineStyle(editableDiv, HtmlDom.HasClass(editableDiv, "bloom-visibility-code-on") ? "display: block;" : "display: none;"); } return(dom.RawDom); }
private void ThumbnailReady(string exportFolder, HtmlDom dom, Image image) { var term = dom.SelectSingleNode("//div[contains(@data-book,'term')]").InnerText.Trim(); var week = dom.SelectSingleNode("//div[contains(@data-book,'week')]").InnerText.Trim(); //the selector for day one is different because it doesn't have @data-* attribute var day = dom.SelectSingleNode("//div[contains(@class,'DayStyle')]").InnerText.Trim(); var fileName = Language1Iso639Code + "-t" + term + "-w" + week + "-d" + day + ".png"; //just doing image.Save() works for .bmp and .jpg, but not .png using (var b = new Bitmap(image)) { b.Save(Path.Combine(exportFolder, fileName)); } }