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.
}