Fb2Formatter::Fb2Formatter(HtmlFormatterArgs *args, Fb2Doc *doc) : HtmlFormatter(args), fb2Doc(doc), section(1), titleCount(0) { if (args->reparseIdx != 0) return; ImageData *cover = doc->GetCoverImage(); if (!cover) return; EmitImage(cover); // render larger images alone on the cover page, // smaller images just separated by a horizontal line if (0 == currLineInstr.Count()) /* the image was broken */; else if (currLineInstr.Last().bbox.Height > args->pageDy / 2) ForceNewPage(); else EmitHr(); }
void MobiFormatter::HandleHtmlTag(HtmlToken *t) { CrashIf(!t->IsTag()); if (Tag_P == t->tag || Tag_Blockquote == t->tag) { HtmlFormatter::HandleHtmlTag(t); HandleSpacing_Mobi(t); } else if (Tag_Mbp_Pagebreak == t->tag) { ForceNewPage(); } else if (Tag_A == t->tag) { HandleAnchorAttr(t); // handle internal and external links (prefer internal ones) if (!HandleTagA(t, "filepos")) HandleTagA(t); } else if (Tag_Hr == t->tag) { // imitating Kindle: hr is proceeded by an empty line FlushCurrLine(false); EmitEmptyLine(lineSpacing); EmitHr(); } else { HtmlFormatter::HandleHtmlTag(t); } }
void HtmlFormatter::HandleHtmlTag(HtmlToken* t) { CrashIf(!t->IsTag()); UpdateTagNesting(t); HtmlTag tag = t->tag; if (Tag_P == tag) { HandleTagP(t); } else if (Tag_Hr == tag) { EmitHr(); } else if ((Tag_B == tag) || (Tag_Strong == tag)) { ChangeFontStyle(FontStyleBold, t->IsStartTag()); } else if ((Tag_I == tag) || (Tag_Em == tag)) { ChangeFontStyle(FontStyleItalic, t->IsStartTag()); } else if (Tag_U == tag) { if (!currLinkIdx) ChangeFontStyle(FontStyleUnderline, t->IsStartTag()); } else if (Tag_Strike == tag) { ChangeFontStyle(FontStyleStrikeout, t->IsStartTag()); } else if (Tag_Br == tag) { HandleTagBr(); } else if (Tag_Font == tag) { HandleTagFont(t); } else if (Tag_A == tag) { HandleTagA(t); } else if (Tag_Blockquote == tag) { // TODO: implement me HandleTagList(t); } else if (Tag_Div == tag) { // TODO: implement me HandleTagP(t, true); } else if (IsTagH(tag)) { HandleTagHx(t); } else if (Tag_Sup == tag) { // TODO: implement me } else if (Tag_Sub == tag) { // TODO: implement me } else if (Tag_Span == tag) { // TODO: implement me } else if (Tag_Center == tag) { HandleTagP(t, true); if (!t->IsEndTag()) CurrStyle()->align = Align_Center; } else if ((Tag_Ul == tag) || (Tag_Ol == tag)) { HandleTagList(t); } else if (Tag_Li == tag) { // TODO: display bullet/number FlushCurrLine(true); } else if (Tag_Dt == tag) { FlushCurrLine(true); ChangeFontStyle(FontStyleBold, t->IsStartTag()); if (t->IsStartTag()) CurrStyle()->align = Align_Left; } else if (Tag_Dd == tag) { // TODO: separate indentation from list depth HandleTagList(t); } else if (Tag_Table == tag) { // TODO: implement me HandleTagList(t); } else if (Tag_Tr == tag) { // display tables row-by-row for now FlushCurrLine(true); if (t->IsStartTag()) SetAlignment(Align_Left); else if (t->IsEndTag()) RevertStyleChange(); } else if (Tag_Code == tag || Tag_Tt == tag) { if (t->IsStartTag()) SetFont(L"Courier New", (FontStyle)CurrFont()->GetStyle()); else if (t->IsEndTag()) RevertStyleChange(); } else if (Tag_Pre == tag) { HandleTagPre(t); } else if (Tag_Img == tag) { HandleTagImg(t); } else if (Tag_Pagebreak == tag) { // not really a HTML tag, but many ebook // formats use it HandleTagPagebreak(t); } else if (Tag_Link == tag) { HandleTagLink(t); } else if (Tag_Style == tag) { HandleTagStyle(t); } else { // TODO: temporary debugging // lf("unhandled tag: %d", tag); } // any tag could contain anchor information HandleAnchorAttr(t); // any tag could contain a reading direction change HandleDirAttr(t); }