/* This file is part of
* ======================================================
- *
+ *
* LyX, The Document Processor
- *
+ *
* Copyright 1995 Matthias Ettrich
- * Copyright 1995-2000 The LyX Team.
+ * Copyright 1995-2001 The LyX Team.
*
* ====================================================== */
#endif
#include "insetquotes.h"
-#include "support/lyxlib.h"
-#include "debug.h"
-#include "lyxfont.h"
-#include "lyxrc.h"
-#include "buffer.h"
-#include "LaTeXFeatures.h"
+
+#include "support/LAssert.h"
#include "support/lstrings.h"
+#include "BufferView.h"
+#include "LaTeXFeatures.h"
#include "Painter.h"
+#include "buffer.h"
+#include "debug.h"
#include "font.h"
#include "language.h"
+#include "lyxfont.h"
+#include "lyxrc.h"
+#include "paragraph.h"
using std::ostream;
using std::endl;
// Index of chars used for the quote. Index is [side, language]
int quote_index[2][6] = {
- { 2, 1, 0, 0, 3, 4 }, // "'',,<>"
+ { 2, 1, 0, 0, 3, 4 }, // "'',,<>"
{ 1, 1, 2, 1, 4, 3 } }; // "`'`'><"
// Corresponding LaTeX code, for double and single quotes.
-char const * const latex_quote_t1[2][5] =
-{ { "\\quotesinglbase{}", "'", "`",
- "\\guilsinglleft{}", "\\guilsinglright{}" },
+char const * const latex_quote_t1[2][5] =
+{ { "\\quotesinglbase{}", "'", "`",
+ "\\guilsinglleft{}", "\\guilsinglright{}" },
{ ",,", "''", "``", "<<", ">>" } };
-char const * const latex_quote_ot1[2][5] =
-{ { "\\quotesinglbase{}", "'", "`",
- "\\guilsinglleft{}", "\\guilsinglright{}" },
+char const * const latex_quote_ot1[2][5] =
+{ { "\\quotesinglbase{}", "'", "`",
+ "\\guilsinglleft{}", "\\guilsinglright{}" },
{ "\\quotedblbase{}", "''", "``",
"\\guillemotleft{}", "\\guillemotright{}" } };
-char const * const latex_quote_babel[2][5] =
+char const * const latex_quote_babel[2][5] =
{ { "\\glq{}", "'", "`", "\\flq{}", "\\frq{}" },
{ "\\glqq{}", "''", "``", "\\flqq{}", "\\frqq{}" } };
InsetQuotes::InsetQuotes(string const & str)
{
- ParseString(str);
+ parseString(str);
}
-InsetQuotes::InsetQuotes(InsetQuotes::quote_language l,
- InsetQuotes::quote_side s,
- InsetQuotes::quote_times t)
- : language(l), side(s), times(t)
+InsetQuotes::InsetQuotes(quote_language l,
+ quote_side s,
+ quote_times t)
+ : language_(l), side_(s), times_(t)
{}
InsetQuotes::InsetQuotes(char c, BufferParams const & params)
- : language(params.quotes_language), times(params.quotes_times)
+ : language_(params.quotes_language), times_(params.quotes_times)
{
- // Decide whether left or right
+ // Decide whether left or right
switch (c) {
- case ' ': case '(': case '{': case '[': case '-': case ':':
- case LyXParagraph::META_HFILL:
- case LyXParagraph::META_NEWLINE:
- side = InsetQuotes::LeftQ; // left quote
+ case ' ': case '(':
+ case Paragraph::META_HFILL:
+ case Paragraph::META_NEWLINE:
+ side_ = LeftQ; // left quote
break;
default:
- side = InsetQuotes::RightQ; // right quote
+ side_ = RightQ; // right quote
}
}
-void InsetQuotes::ParseString(string const & s)
+void InsetQuotes::parseString(string const & s)
{
string str(s);
if (str.length() != 3) {
}
int i;
-
+
for (i = 0; i < 6; ++i) {
if (str[0] == language_char[i]) {
- language = InsetQuotes::quote_language(i);
+ language_ = quote_language(i);
break;
}
}
if (i >= 6) {
lyxerr << "ERROR (InsetQuotes::InsetQuotes):"
" bad language specification." << endl;
- language = InsetQuotes::EnglishQ;
+ language_ = EnglishQ;
}
for (i = 0; i < 2; ++i) {
if (str[1] == side_char[i]) {
- side = InsetQuotes::quote_side(i);
+ side_ = quote_side(i);
break;
}
}
if (i >= 2) {
lyxerr << "ERROR (InsetQuotes::InsetQuotes):"
" bad side specification." << endl;
- side = InsetQuotes::LeftQ;
+ side_ = LeftQ;
}
for (i = 0; i < 2; ++i) {
if (str[2] == times_char[i]) {
- times = InsetQuotes::quote_times(i);
+ times_ = quote_times(i);
break;
}
}
if (i >= 2) {
lyxerr << "ERROR (InsetQuotes::InsetQuotes):"
" bad times specification." << endl;
- times = InsetQuotes::DoubleQ;
+ times_ = DoubleQ;
}
}
-string const InsetQuotes::DispString() const
+string const InsetQuotes::dispString(Language const * loclang) const
{
- string disp;
- disp += quote_char[quote_index[side][language]];
- if (times == InsetQuotes::DoubleQ)
+ string disp;
+ disp += quote_char[quote_index[side_][language_]];
+ if (times_ == DoubleQ)
disp += disp;
- if (lyxrc.font_norm_type == LyXRC::ISO_8859_1)
+ if (lyxrc.font_norm_type == LyXRC::ISO_8859_1
+ || lyxrc.font_norm_type == LyXRC::ISO_8859_3
+ || lyxrc.font_norm_type == LyXRC::ISO_8859_4
+ || lyxrc.font_norm_type == LyXRC::ISO_8859_9) {
+ if (disp == "'")
+ disp = "´";
+ else if (disp == "''")
+ disp = "´´";
+ }
+ if (lyxrc.font_norm_type == LyXRC::ISO_8859_1
+ || lyxrc.font_norm_type == LyXRC::ISO_8859_9
+ || lyxrc.font_norm_type == LyXRC::ISO_8859_15) {
if (disp == "<<")
disp = '«';
else if (disp == ">>")
disp = '»';
-
- return disp;
+ }
+
+ // in french, spaces are added inside double quotes
+ if (times_ == DoubleQ && prefixIs(loclang->code(), "fr")) {
+ if (side_ == LeftQ)
+ disp += " ";
+ else
+ disp = " " + disp;
+ }
+
+ return disp;
}
int InsetQuotes::width(BufferView *, LyXFont const & font) const
{
- string text = DispString();
+ string const text = dispString(font.language());
int w = 0;
for (string::size_type i = 0; i < text.length(); ++i) {
}
-LyXFont const InsetQuotes::ConvertFont(LyXFont const & f) const
+#if 0
+LyXFont const InsetQuotes::convertFont(LyXFont const & f) const
{
+#if 1
+ return f;
+#else
LyXFont font(f);
- // quotes-insets cannot be latex of any kind
- font.setLatex(LyXFont::OFF);
return font;
+#endif
}
+#endif
void InsetQuotes::draw(BufferView * bv, LyXFont const & font,
int baseline, float & x, bool) const
{
- string text = DispString();
+ string const text = dispString(font.language());
bv->painter().text(int(x), baseline, text, font);
x += width(bv, font);
}
-void InsetQuotes::Write(Buffer const *, ostream & os) const
+void InsetQuotes::write(Buffer const *, ostream & os) const
{
string text;
- text += language_char[language];
- text += side_char[side];
- text += times_char[times];
+ text += language_char[language_];
+ text += side_char[side_];
+ text += times_char[times_];
os << "Quotes " << text;
}
-void InsetQuotes::Read(Buffer const *, LyXLex & lex)
+void InsetQuotes::read(Buffer const *, LyXLex & lex)
{
lex.nextToken();
- ParseString(lex.GetString());
+ parseString(lex.getString());
lex.next();
- string tmp(lex.GetString());
- if (tmp != "\\end_inset")
- lyxerr << "LyX Warning: Missing \\end_inset "
- "in InsetQuotes::Read." << endl;
+ if (lex.getString() != "\\end_inset") {
+ lex.printError("Missing \\end_inset at this point");
+ }
}
extern bool use_babel;
-int InsetQuotes::Latex(Buffer const * buf, ostream & os,
- bool /*fragile*/, bool) const
+int InsetQuotes::latex(Buffer const * buf, ostream & os,
+ bool /*fragile*/, bool /* free_spc */) const
{
- string const doclang = buf->GetLanguage()->lang();
- int quoteind = quote_index[side][language];
+ // How do we get the local language here??
+ lyx::pos_type curr_pos = parOwner()->getPositionOfInset(this);
+ lyx::Assert(curr_pos != -1);
+ string const curr_lang =
+ parOwner()->getFont(buf->params,
+ curr_pos).language()->babel();
+
+ const int quoteind = quote_index[side_][language_];
string qstr;
-
- if (lyxrc.fontenc == "T1") {
- qstr = latex_quote_t1[times][quoteind];
+
+ if (language_ == FrenchQ && times_ == DoubleQ
+ && curr_lang == "frenchb") {
+ if (side_ == LeftQ)
+ qstr = "\\og "; //the spaces are important here
+ else
+ qstr = " \\fg{}"; //and here
+ } else if (language_ == FrenchQ && times_ == DoubleQ
+ && curr_lang == "french") {
+ if (side_ == LeftQ)
+ qstr = "<< "; //the spaces are important here
+ else
+ qstr = " >>"; //and here
+ } else if (lyxrc.fontenc == "T1") {
+ qstr = latex_quote_t1[times_][quoteind];
#ifdef DO_USE_DEFAULT_LANGUAGE
} else if (doclang == "default") {
#else
} else if (!use_babel) {
#endif
- qstr = latex_quote_ot1[times][quoteind];
- } else if (language == InsetQuotes::FrenchQ
- && times == InsetQuotes::DoubleQ
- && doclang == "frenchb") {
- if (side == InsetQuotes::LeftQ)
- qstr = "\\og{}";
- else
- qstr = " \\fg{}";
- } else
- qstr = latex_quote_babel[times][quoteind];
+ qstr = latex_quote_ot1[times_][quoteind];
+ } else {
+ qstr = latex_quote_babel[times_][quoteind];
+ }
// Always guard against unfortunate ligatures (!` ?`)
if (prefixIs(qstr, "`"))
}
-int InsetQuotes::Ascii(Buffer const *, ostream & os, int) const
+int InsetQuotes::ascii(Buffer const *, ostream & os, int) const
{
os << "\"";
return 0;
}
-int InsetQuotes::Linuxdoc(Buffer const *, ostream & os) const
+int InsetQuotes::linuxdoc(Buffer const *, ostream & os) const
{
os << "\"";
return 0;
}
-int InsetQuotes::DocBook(Buffer const *, ostream & os) const
+int InsetQuotes::docbook(Buffer const *, ostream & os) const
{
- if (times == InsetQuotes::DoubleQ) {
- if (side == InsetQuotes::LeftQ)
+ if (times_ == DoubleQ) {
+ if (side_ == LeftQ)
os << "“";
else
os << "”";
} else {
- if (side == InsetQuotes::LeftQ)
+ if (side_ == LeftQ)
os << "‘";
else
os << "’";
}
-void InsetQuotes::Validate(LaTeXFeatures & features) const
+void InsetQuotes::validate(LaTeXFeatures & features) const
{
- char type = quote_char[quote_index[side][language]];
+ char type = quote_char[quote_index[side_][language_]];
- if (features.bufferParams().language->lang() == "default"
+#ifdef DO_USE_DEFAULT_LANGUAGE
+ if (features.bufferParams().language->lang() == "default"
+#else
+ if (!use_babel
+#endif
&& lyxrc.fontenc != "T1") {
- if (times == InsetQuotes::SingleQ)
+ if (times_ == SingleQ)
switch (type) {
- case ',': features.quotesinglbase = true; break;
- case '<': features.guilsinglleft = true; break;
- case '>': features.guilsinglright = true; break;
+ case ',': features.require("quotesinglbase"); break;
+ case '<': features.require("guilsinglleft"); break;
+ case '>': features.require("guilsinglright"); break;
default: break;
}
- else
+ else
switch (type) {
- case ',': features.quotedblbase = true; break;
- case '<': features.guillemotleft = true; break;
- case '>': features.guillemotright = true; break;
+ case ',': features.require("quotedblbase"); break;
+ case '<': features.require("guillemotleft"); break;
+ case '>': features.require("guillemotright"); break;
default: break;
}
}
}
-Inset * InsetQuotes::Clone(Buffer const &) const
+Inset * InsetQuotes::clone(Buffer const &, bool) const
{
- return new InsetQuotes(language, side, times);
+ return new InsetQuotes(language_, side_, times_);
}
-Inset::Code InsetQuotes::LyxCode() const
+Inset::Code InsetQuotes::lyxCode() const
{
return Inset::QUOTE_CODE;
}