XHTML support for font shapes.

This commit is contained in:
Richard Heck 2013-05-10 16:58:38 -04:00
parent 5cadeed4d7
commit b383d04e07
4 changed files with 93 additions and 19 deletions

View File

@ -2832,14 +2832,15 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf,
namespace { namespace {
void doFontSwitch(XHTMLStream & xs, bool startrange, void doFontSwitch(vector<html::FontTag> & tagsToOpen,
bool & flag, FontState curstate, html::FontTypes type) vector<html::EndFontTag> & tagsToClose,
bool & flag, FontState curstate, html::FontTypes type)
{ {
if (curstate == FONT_ON) { if (curstate == FONT_ON) {
xs << html::FontTag(type); tagsToOpen.push_back(html::FontTag(type));
flag = true; flag = true;
} else if (flag && !startrange) { } else if (flag) {
xs << html::EndFontTag(type); tagsToClose.push_back(html::EndFontTag(type));
flag = false; flag = false;
} }
} }
@ -2854,6 +2855,7 @@ docstring Paragraph::simpleLyXHTMLOnePar(Buffer const & buf,
{ {
docstring retval; docstring retval;
// track whether we have opened these tags
bool emph_flag = false; bool emph_flag = false;
bool bold_flag = false; bool bold_flag = false;
bool noun_flag = false; bool noun_flag = false;
@ -2861,6 +2863,8 @@ docstring Paragraph::simpleLyXHTMLOnePar(Buffer const & buf,
bool dbar_flag = false; bool dbar_flag = false;
bool sout_flag = false; bool sout_flag = false;
bool wave_flag = false; bool wave_flag = false;
// shape tags
bool shap_flag = false;
Layout const & style = *d->layout_; Layout const & style = *d->layout_;
@ -2869,6 +2873,11 @@ docstring Paragraph::simpleLyXHTMLOnePar(Buffer const & buf,
FontInfo font_old = FontInfo font_old =
style.labeltype == LABEL_MANUAL ? style.labelfont : style.font; style.labeltype == LABEL_MANUAL ? style.labelfont : style.font;
FontShape curr_fs = INHERIT_SHAPE;
vector<html::FontTag> tagsToOpen;
vector<html::EndFontTag> tagsToClose;
// parsing main loop // parsing main loop
for (pos_type i = initial; i < size(); ++i) { for (pos_type i = initial; i < size(); ++i) {
// let's not show deleted material in the output // let's not show deleted material in the output
@ -2876,47 +2885,104 @@ docstring Paragraph::simpleLyXHTMLOnePar(Buffer const & buf,
continue; continue;
Font const font = getFont(buf.masterBuffer()->params(), i, outerfont); Font const font = getFont(buf.masterBuffer()->params(), i, outerfont);
bool const at_start = (i == initial);
// emphasis // emphasis
FontState curstate = font.fontInfo().emph(); FontState curstate = font.fontInfo().emph();
if (font_old.emph() != curstate) if (font_old.emph() != curstate)
doFontSwitch(xs, at_start, emph_flag, curstate, html::FT_EMPH); doFontSwitch(tagsToOpen, tagsToClose, emph_flag, curstate, html::FT_EMPH);
// noun // noun
curstate = font.fontInfo().noun(); curstate = font.fontInfo().noun();
if (font_old.noun() != curstate) if (font_old.noun() != curstate)
doFontSwitch(xs, at_start, noun_flag, curstate, html::FT_NOUN); doFontSwitch(tagsToOpen, tagsToClose, noun_flag, curstate, html::FT_NOUN);
// underbar // underbar
curstate = font.fontInfo().underbar(); curstate = font.fontInfo().underbar();
if (font_old.underbar() != curstate) if (font_old.underbar() != curstate)
doFontSwitch(xs, at_start, ubar_flag, curstate, html::FT_UBAR); doFontSwitch(tagsToOpen, tagsToClose, ubar_flag, curstate, html::FT_UBAR);
// strikeout // strikeout
curstate = font.fontInfo().strikeout(); curstate = font.fontInfo().strikeout();
if (font_old.strikeout() != curstate) if (font_old.strikeout() != curstate)
doFontSwitch(xs, at_start, sout_flag, curstate, html::FT_SOUT); doFontSwitch(tagsToOpen, tagsToClose, sout_flag, curstate, html::FT_SOUT);
// double underbar // double underbar
curstate = font.fontInfo().uuline(); curstate = font.fontInfo().uuline();
if (font_old.uuline() != curstate) if (font_old.uuline() != curstate)
doFontSwitch(xs, at_start, dbar_flag, curstate, html::FT_DBAR); doFontSwitch(tagsToOpen, tagsToClose, dbar_flag, curstate, html::FT_DBAR);
// wavy line // wavy line
curstate = font.fontInfo().uwave(); curstate = font.fontInfo().uwave();
if (font_old.uwave() != curstate) if (font_old.uwave() != curstate)
doFontSwitch(xs, at_start, wave_flag, curstate, html::FT_WAVE); doFontSwitch(tagsToOpen, tagsToClose, wave_flag, curstate, html::FT_WAVE);
// bold // bold
// a little hackish, but allows us to reuse what we have. // a little hackish, but allows us to reuse what we have.
curstate = (font.fontInfo().series() == BOLD_SERIES ? FONT_ON : FONT_OFF); curstate = (font.fontInfo().series() == BOLD_SERIES ? FONT_ON : FONT_OFF);
if (font_old.series() != font.fontInfo().series()) if (font_old.series() != font.fontInfo().series())
doFontSwitch(xs, at_start, bold_flag, curstate, html::FT_BOLD); doFontSwitch(tagsToOpen, tagsToClose, bold_flag, curstate, html::FT_BOLD);
curr_fs = font.fontInfo().shape();
FontShape old_fs = font_old.shape();
if (old_fs != curr_fs) {
if (shap_flag) {
switch (old_fs) {
case ITALIC_SHAPE:
tagsToClose.push_back(html::EndFontTag(html::FT_ITALIC));
break;
case SLANTED_SHAPE:
tagsToClose.push_back(html::EndFontTag(html::FT_SLANTED));
break;
case SMALLCAPS_SHAPE:
tagsToClose.push_back(html::EndFontTag(html::FT_SMALLCAPS));
break;
case UP_SHAPE:
case INHERIT_SHAPE:
break;
default:
// the other tags are for internal use
LATTEST(false);
break;
}
shap_flag = false;
}
switch (curr_fs) {
case ITALIC_SHAPE:
tagsToOpen.push_back(html::FontTag(html::FT_ITALIC));
break;
case SLANTED_SHAPE:
tagsToOpen.push_back(html::FontTag(html::FT_SLANTED));
break;
case SMALLCAPS_SHAPE:
tagsToOpen.push_back(html::FontTag(html::FT_SMALLCAPS));
break;
case UP_SHAPE:
case INHERIT_SHAPE:
break;
default:
// the other tags are for internal use
LATTEST(false);
break;
}
shap_flag = true;
}
// FIXME XHTML // FIXME XHTML
// Other such tags? What about the other text ranges? // Other such tags? What about the other text ranges?
vector<html::EndFontTag>::const_iterator cit = tagsToClose.begin();
vector<html::EndFontTag>::const_iterator cen = tagsToClose.end();
for (; cit != cen; ++cit)
xs << *cit;
vector<html::FontTag>::const_iterator sit = tagsToOpen.begin();
vector<html::FontTag>::const_iterator sen = tagsToOpen.end();
for (; sit != sen; ++sit)
xs << *sit;
tagsToClose.clear();
tagsToOpen.clear();
Inset const * inset = getInset(i); Inset const * inset = getInset(i);
if (inset) { if (inset) {
if (!runparams.for_toc || inset->isInToc()) { if (!runparams.for_toc || inset->isInToc()) {

View File

@ -318,7 +318,7 @@ void Text::setFont(Cursor & cur, Font const & font, bool toggleall)
newfi.setSeries(INHERIT_SERIES); newfi.setSeries(INHERIT_SERIES);
FontShape newshp = newfi.shape(); FontShape newshp = newfi.shape();
if (newshp != INHERIT_SHAPE && newshp != IGNORE_SHAPE && if (newshp != INHERIT_SHAPE && newshp != IGNORE_SHAPE &&
newshp == oldfi.shape()) newshp == oldfi.shape())
newfi.setShape(INHERIT_SHAPE); newfi.setShape(INHERIT_SHAPE);

View File

@ -221,11 +221,12 @@ string fontToTag(html::FontTypes type)
return "del"; return "del";
case FT_ITALIC: case FT_ITALIC:
return "i"; return "i";
case FT_UPRIGHT:
case FT_SLANTED: case FT_SLANTED:
case FT_SMALLCAPS: case FT_SMALLCAPS:
case FT_ROMAN: case FT_ROMAN:
case FT_SANS: case FT_SANS:
case FT_TYPER: case FT_TYPE:
return "span"; return "span";
} }
// kill warning // kill warning
@ -252,6 +253,8 @@ StartTag fontToStartTag(html::FontTypes type)
return html::StartTag(tag, "class='wline'"); return html::StartTag(tag, "class='wline'");
case FT_ITALIC: case FT_ITALIC:
return html::StartTag(tag); return html::StartTag(tag);
case FT_UPRIGHT:
return html::StartTag(tag, "style='font-style:normal;'");
case FT_SLANTED: case FT_SLANTED:
return html::StartTag(tag, "style='font-style:oblique;'"); return html::StartTag(tag, "style='font-style:oblique;'");
case FT_SMALLCAPS: case FT_SMALLCAPS:
@ -260,7 +263,7 @@ StartTag fontToStartTag(html::FontTypes type)
return html::StartTag(tag, "style='font-family:serif;'"); return html::StartTag(tag, "style='font-family:serif;'");
case FT_SANS: case FT_SANS:
return html::StartTag(tag, "style='font-family:sans-serif;'"); return html::StartTag(tag, "style='font-family:sans-serif;'");
case FT_TYPER: case FT_TYPE:
return html::StartTag(tag, "style='font-family:monospace;'"); return html::StartTag(tag, "style='font-family:monospace;'");
} }
// kill warning // kill warning

View File

@ -129,19 +129,24 @@ struct ParTag : public StartTag
/// ///
enum FontTypes { enum FontTypes {
// ranges
FT_EMPH, FT_EMPH,
FT_BOLD,
FT_NOUN, FT_NOUN,
FT_UBAR, FT_UBAR,
FT_DBAR, FT_DBAR,
FT_SOUT,
FT_WAVE, FT_WAVE,
FT_SOUT,
// bold
FT_BOLD,
// shapes
FT_UPRIGHT,
FT_ITALIC, FT_ITALIC,
FT_SLANTED, FT_SLANTED,
FT_SMALLCAPS, FT_SMALLCAPS,
// families
FT_ROMAN, FT_ROMAN,
FT_SANS, FT_SANS,
FT_TYPER FT_TYPE
// SIZES? // SIZES?
}; };