Пример #1
0
 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);
     }
 }
Пример #2
0
        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);
        }
Пример #3
0
        // 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;
        }
Пример #4
0
        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 &amp; 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 &amp; 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 &amp; 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 &amp; SILA", "http://creativecommons.org/licenses/by-nc-sa/4.0/");
        }
Пример #5
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);
     }
 }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
0
        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);
        }
Пример #9
0
        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(""));
                }
            }
        }
Пример #10
0
        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"));
        }
Пример #11
0
        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);
        }
Пример #12
0
        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);
        }
Пример #13
0
        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);
        }
Пример #14
0
        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);
        }
Пример #15
0
        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"));
        }
Пример #16
0
        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"));
        }
Пример #17
0
        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);
        }
Пример #18
0
        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);
        }
Пример #19
0
        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);
        }
Пример #20
0
        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();
        }
Пример #21
0
        /// <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));
        }
Пример #22
0
        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);
        }
Пример #23
0
        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();
            }
        }
Пример #24
0
        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)]");
        }
Пример #25
0
        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);
        }
Пример #26
0
        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);
        }
Пример #27
0
        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);
        }
Пример #28
0
        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"));
        }
Пример #29
0
        // 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));
            }
        }