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); } }
// the name doesn't quite fit: this handles FB2 tags void Fb2Formatter::HandleHtmlTag(HtmlToken *t) { if (Tag_Title == t->tag || Tag_Subtitle == t->tag) { bool isSubtitle = Tag_Subtitle == t->tag; ScopedMem<char> name(str::Format("h%d", section + (isSubtitle ? 1 : 0))); HtmlToken tok; tok.SetTag(t->type, name, name + str::Len(name)); HandleTagHx(&tok); HandleAnchorAttr(t); if (!isSubtitle && t->IsStartTag()) { char *link = (char *)Allocator::Alloc(textAllocator, 24); sprintf_s(link, 24, FB2_TOC_ENTRY_MARK "%d", ++titleCount); currPage->instructions.Append(DrawInstr::Anchor(link, str::Len(link), RectF(0, currY, pageDx, 0))); } } else if (Tag_Section == t->tag) { if (t->IsStartTag()) section++; else if (t->IsEndTag() && section > 1) section--; FlushCurrLine(true); HandleAnchorAttr(t); } else if (Tag_P == t->tag) { if (!tagNesting.Contains(Tag_Title)) HtmlFormatter::HandleHtmlTag(t); } else if (Tag_Image == t->tag) { HandleTagImg(t); HandleAnchorAttr(t); } else if (Tag_A == t->tag) { HandleTagA(t, "href", "http://www.w3.org/1999/xlink"); HandleAnchorAttr(t, true); } else if (Tag_Pagebreak == t->tag) ForceNewPage(); else if (Tag_Strong == t->tag) HandleTagAsHtml(t, "b"); else if (t->NameIs("emphasis")) HandleTagAsHtml(t, "i"); else if (t->NameIs("epigraph")) HandleTagAsHtml(t, "blockquote"); else if (t->NameIs("empty-line")) { if (!t->IsEndTag()) EmitParagraph(0); } else if (t->NameIs("stylesheet")) HandleTagAsHtml(t, "style"); }
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); }