]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetQuotes.cpp
listerrors.lyx : Update a link.
[lyx.git] / src / insets / InsetQuotes.cpp
index c1c1edc3b853830adedcc6701fda03b52709b622..8586ce18d5372382689ae1cbcacbb93ddede55f5 100644 (file)
 #include "BufferParams.h"
 #include "BufferView.h"
 #include "Dimension.h"
+#include "Font.h"
 #include "Language.h"
 #include "LaTeXFeatures.h"
 #include "Lexer.h"
 #include "LyXRC.h"
 #include "MetricsInfo.h"
 #include "OutputParams.h"
+#include "output_xhtml.h"
 
 #include "frontends/FontMetrics.h"
 #include "frontends/Painter.h"
@@ -40,7 +42,7 @@ namespace {
 
 /* codes used to read/write quotes to LyX files
  * e    ``english''
- * s    ''spanish''
+ * s    ''swedish''
  * g    ,,german``
  * p    ,,polish''
  * f    <<french>>
@@ -54,6 +56,12 @@ char const * const times_char = "sd";
 // List of known quote chars
 char const * const quote_char = ",'`<>";
 
+// Unicode characters needed by each quote type
+char_type const display_quote_char[2][5] = {
+       { 0x201a, 0x2019, 0x2018, 0x2039, 0x203a},
+       { 0x201e, 0x201d, 0x201c, 0x00ab, 0x00bb}
+};
+
 // Index of chars used for the quote. Index is [side, language]
 int quote_index[2][6] = {
        { 2, 1, 0, 0, 3, 4 },    // "'',,<>"
@@ -82,33 +90,31 @@ char const * const latex_quote_babel[2][5] = {
 } // namespace anon
 
 
-InsetQuotes::InsetQuotes(string const & str)
+InsetQuotes::InsetQuotes(Buffer * buf, string const & str) : Inset(buf)
 {
        parseString(str);
 }
 
-
-InsetQuotes::InsetQuotes(QuoteLanguage l, QuoteSide s, QuoteTimes t)
-       : language_(l), side_(s), times_(t)
-{
-}
-
-
-InsetQuotes::InsetQuotes(Buffer const & buf, char_type c)
-       : language_(buf.params().quotes_language), times_(buf.params().quotes_times)
+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(char_type c, QuoteLanguage l, QuoteTimes t)
-       : language_(l), times_(t)
+InsetQuotes::InsetQuotes(Buffer * buf, char_type c, QuoteTimes t)
+       : Inset(buf), times_(t)
 {
+       if (buf)
+               language_ = buf->params().quotes_language;
        setSide(c);
 }
 
 
-docstring InsetQuotes::name() const
+docstring InsetQuotes::layoutName() const
 {
        return from_ascii("Quotes");
 }
@@ -180,42 +186,14 @@ void InsetQuotes::parseString(string const & s)
 
 docstring InsetQuotes::displayString() const
 {
-       Language const * loclang = buffer().params().language;
-       string disp;
-       disp += quote_char[quote_index[side_][language_]];
-       if (times_ == DoubleQuotes)
-               disp += disp;
-
-
-       docstring retdisp;
-       if (disp == "<<")
-               retdisp = docstring(1, 0x00ab); //'«';
-       else if (disp == ">>")
-               retdisp = docstring(1, 0x00bb); //'»';
-#if 0
-       // The below are supposed to work, but something fails.
-       else if (disp == ",,")
-               retdisp = docstring(1, 0x201e);
-       else if (disp == "''")
-               retdisp == docstring(1, 0x201d);
-       else if (disp == "``")
-               retdisp == docstring(1, 0x201c);
-       else if (disp == "<")
-               retdisp = docstring(1, 0x2039);
-       else if (disp == ">")
-               retdisp = docstring(1, 0x203a);
-       else if (disp == ",")
-               retdisp = docstring(1, 0x201a);
-       else if (disp == "'")
-               retdisp = docstring(1, 0x2019);
-       else if (disp == "`")
-               retdisp = docstring(1, 0x2018);
-#endif
-       else
-               retdisp = from_ascii(disp);
+       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
-       if (times_ == DoubleQuotes && prefixIs(loclang->code(), "fr")) {
+       // FIXME: this should be done by a separate quote type.
+       if (times_ == DoubleQuotes && loclang && prefixIs(loclang->code(), "fr")) {
                if (side_ == LeftQuote)
                        retdisp += ' ';
                else
@@ -276,44 +254,46 @@ void InsetQuotes::write(ostream & os) const
 
 void InsetQuotes::read(Lexer & lex)
 {
+       lex.setContext("InsetQuotes::read");
        lex.next();
        parseString(lex.getString());
-       lex.next();
-       if (lex.getString() != "\\end_inset") {
-               lex.printError("Missing \\end_inset at this point");
-       }
+       lex >> "\\end_inset";
 }
 
 
-int InsetQuotes::latex(odocstream & os, OutputParams const & runparams) const
+void InsetQuotes::latex(otexstream & os, OutputParams const & runparams) const
 {
        const int quoteind = quote_index[side_][language_];
        string qstr;
 
        if (language_ == FrenchQuotes && times_ == DoubleQuotes
-           && prefixIs(runparams.local_font->language()->code(), "fr")) {
+           && prefixIs(runparams.local_font->language()->code(), "fr")
+           && !runparams.use_polyglossia) {
                if (side_ == LeftQuote)
                        qstr = "\\og "; //the spaces are important here
                else
                        qstr = " \\fg{}"; //and here
-       } else if (lyxrc.fontenc == "T1") {
+       } else if (lyxrc.fontenc == "T1" && !runparams.use_polyglossia) {
                qstr = latex_quote_t1[times_][quoteind];
 #ifdef DO_USE_DEFAULT_LANGUAGE
        } else if (doclang == "default") {
 #else
        } else if (!runparams.use_babel) {
 #endif
+               // these are also used by polyglossia
                qstr = latex_quote_ot1[times_][quoteind];
        } else {
                qstr = latex_quote_babel[times_][quoteind];
        }
 
        // Always guard against unfortunate ligatures (!` ?`)
-       if (prefixIs(qstr, "`"))
-               qstr.insert(0, "{}");
+       if (prefixIs(qstr, "`")) {
+               char_type const lastchar = os.lastChar();
+               if (lastchar == '!' || lastchar == '?')
+                       qstr.insert(0, "{}");
+       }
 
        os << from_ascii(qstr);
-       return 0;
 }
 
 
@@ -342,12 +322,25 @@ int InsetQuotes::docbook(odocstream & os, OutputParams const &) const
 }
 
 
-void InsetQuotes::textString(odocstream & os) const
+docstring InsetQuotes::xhtml(XHTMLStream & xs, OutputParams const & op) const
+{
+       docbook(xs.os(), op);
+       return docstring();
+}
+
+
+void InsetQuotes::toString(odocstream & os) const
 {
        os << displayString();
 }
 
 
+void InsetQuotes::forToc(docstring & os, size_t) const
+{
+       os += displayString();
+}
+
+
 void InsetQuotes::validate(LaTeXFeatures & features) const
 {
        bool const use_babel = features.useBabel();