#include "MetricsInfo.h"
#include "OutputParams.h"
#include "output_xhtml.h"
+#include "texstream.h"
#include "frontends/FontMetrics.h"
#include "frontends/Painter.h"
parseString(str);
}
-InsetQuotes::InsetQuotes(Buffer * buf, char_type c) : Inset(buf)
-{
- if (buf) {
- language_ = buf->params().quotes_language;
- times_ = buf->params().quotes_times;
- }
- setSide(c);
-}
-
-
InsetQuotes::InsetQuotes(Buffer * buf, char_type c, QuoteTimes t)
: Inset(buf), times_(t)
{
if (buf)
language_ = buf->params().quotes_language;
+ else
+ language_ = EnglishQuotes;
+
setSide(c);
}
}
+// FIXME: should we add a language or a font parameter member?
docstring InsetQuotes::displayString() const
{
- Language const * loclang =
+ Language const * loclang =
isBufferValid() ? buffer().params().language : 0;
int const index = quote_index[side_][language_];
docstring retdisp = docstring(1, display_quote_char[times_][index]);
- // in french, spaces are added inside double quotes
+ // in french, thin spaces are added inside double quotes
// FIXME: this should be done by a separate quote type.
if (times_ == DoubleQuotes && loclang && prefixIs(loclang->code(), "fr")) {
+ // THIN SPACE (U+2009)
+ char_type const thin_space = 0x2009;
if (side_ == LeftQuote)
- retdisp += ' ';
+ retdisp += thin_space;
else
- retdisp.insert(size_t(0), 1, ' ');
+ retdisp = thin_space + retdisp;
}
return retdisp;
void InsetQuotes::metrics(MetricsInfo & mi, Dimension & dim) const
{
FontInfo & font = mi.base.font;
- frontend::FontMetrics const & fm =
- theFontMetrics(font);
+ frontend::FontMetrics const & fm = theFontMetrics(font);
dim.asc = fm.maxAscent();
dim.des = fm.maxDescent();
- dim.wid = 0;
-
- // FIXME: should we add a language or a font parameter member?
- docstring const text = displayString();
- for (string::size_type i = 0; i < text.length(); ++i) {
- if (text[i] == ' ')
- dim.wid += fm.width('i');
- else if (i == 0 || text[i] != text[i - 1])
- dim.wid += fm.width(text[i]);
- else
- dim.wid += fm.width(',');
- }
+ dim.wid = fm.width(displayString());
}
void InsetQuotes::draw(PainterInfo & pi, int x, int y) const
{
- // FIXME: should we add a language or a font parameter member?
- docstring const text = displayString();
FontInfo font = pi.base.font;
font.setPaintColor(pi.textColor(font.realColor()));
- if (text.length() == 2 && text[0] == text[1]) {
- pi.pain.text(x, y, text[0], font);
- int const t = theFontMetrics(font)
- .width(',');
- pi.pain.text(x + t, y, text[0], font);
- } else {
- pi.pain.text(x, y, text, font);
- }
+ pi.pain.text(x, y, displayString(), font);
}
}
-int InsetQuotes::docbook(odocstream & os, OutputParams const &) const
-{
+docstring InsetQuotes::getQuoteEntity() const {
if (times_ == DoubleQuotes) {
if (side_ == LeftQuote)
- os << "“";
- else
- os << "”";
- } else {
- if (side_ == LeftQuote)
- os << "‘";
+ return from_ascii("“");
else
- os << "’";
+ return from_ascii("”");
}
+ if (side_ == LeftQuote)
+ return from_ascii("‘");
+ else
+ return from_ascii("’");
+}
+
+
+int InsetQuotes::docbook(odocstream & os, OutputParams const &) const
+{
+ os << getQuoteEntity();
return 0;
}
-docstring InsetQuotes::xhtml(XHTMLStream & xs, OutputParams const & op) const
+docstring InsetQuotes::xhtml(XHTMLStream & xs, OutputParams const &) const
{
- docbook(xs.os(), op);
+ xs << XHTMLStream::ESCAPE_NONE << getQuoteEntity();
return docstring();
}
}
-void InsetQuotes::forOutliner(docstring & os, size_t) const
+void InsetQuotes::forOutliner(docstring & os, size_t const, bool const) const
{
os += displayString();
}
void InsetQuotes::validate(LaTeXFeatures & features) const
{
- bool const use_babel = features.useBabel();
char type = quote_char[quote_index[side_][language_]];
#ifdef DO_USE_DEFAULT_LANGUAGE
if (features.bufferParams().language->lang() == "default"
#else
- if (!use_babel
+ if (!features.useBabel()
#endif
&& lyxrc.fontenc != "T1") {
if (times_ == SingleQuotes)