Bloom.Publish.EpubMaker.RemoveUnwantedContent C# (CSharp) Method

RemoveUnwantedContent() private method

Remove stuff that we don't want displayed. Some e-readers don't obey display:none. Also, not shipping it saves space.
private RemoveUnwantedContent ( HtmlDom pageDom ) : void
pageDom Bloom.Book.HtmlDom
return void
        private void RemoveUnwantedContent(HtmlDom pageDom)
        {
            var pageElt = (XmlElement) pageDom.Body.FirstChild;
            var isXMatter = HasClass(pageElt, "bloom-frontMatter") || HasClass(pageElt, "bloom-backMatter");
            if (isXMatter)
            {
                // We need a real dom, with standard stylesheets, loaded into a browser, in order to let the
                // browser figure out what is visible. So we can easily match elements in the browser DOM
                // with the one we are manipulating, make sure they ALL have IDs.
                EnsureEditableDivsHaveIds(pageElt);
                var normalDom = Book.GetHtmlDomWithJustOnePage(pageElt);
                bool done = false;
                var dummy = _browser.Handle; // gets WebBrowser created along with handle
                _browser.WebBrowser.DocumentCompleted += (sender, args) => done = true;
                // just in case something goes wrong, keep program from deadlocking a few lines below.
                _browser.WebBrowser.NavigationError += (object sender, Gecko.Events.GeckoNavigationErrorEventArgs e) => done = true;
                _browser.Navigate(normalDom);
                while (!done)
                {
                    Application.DoEvents();
                    Application.RaiseIdle(new EventArgs());		// needed on Linux to avoid deadlock starving browser navigation
                }
            }
            // Remove bloom-editable material not in one of the interesting languages
            foreach (XmlElement elt in pageDom.RawDom.SafeSelectNodes(".//div").Cast<XmlElement>().ToArray())
            {
                if (!HasClass(elt, "bloom-editable"))
                    continue;
                var langAttr = elt.Attributes["lang"];
                var lang = langAttr == null ? null : langAttr.Value;
                if (isXMatter)
                {
                    var id = elt.Attributes["id"].Value;
                    var display = _browser.RunJavaScript("getComputedStyle(document.getElementById('" + id + "'), null).display");
                    if (display != "none")
                        continue; // keep it if not hidden.
                }
                else
                {
                    // normal content page. What will be displayed here is predictable enough without
                    // the overhead of navigating a real browser to a real page.
                    if (lang == Book.MultilingualContentLanguage2 || lang == Book.MultilingualContentLanguage3 ||
                    lang == Book.CollectionSettings.Language1Iso639Code)
                    continue; // keep these
                }
                elt.ParentNode.RemoveChild(elt);
            }
            // Remove any left-over bubbles
            foreach (XmlElement elt in pageDom.RawDom.SafeSelectNodes("//label").Cast<XmlElement>().ToArray())
            {
                if (HasClass(elt, "bubble"))
                    elt.ParentNode.RemoveChild(elt);
            }
            // Remove page labels and descriptions
            foreach (XmlElement elt in pageDom.RawDom.SafeSelectNodes("//div").Cast<XmlElement>().ToArray())
            {
                if (HasClass(elt, "pageLabel"))
                    elt.ParentNode.RemoveChild(elt);
                if (HasClass(elt, "pageDescription"))
                    elt.ParentNode.RemoveChild(elt);
            }
            // Our recordingmd5 attribute is not allowed
            foreach (XmlElement elt in pageDom.RawDom.SafeSelectNodes("//span[@recordingmd5]").Cast<XmlElement>())
            {
                elt.RemoveAttribute("recordingmd5");
            }
            if (isXMatter)
                RemoveTempIds(pageElt); // don't need temporary IDs any more.
        }