]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.cpp
* GuiToolbar.cpp:
[lyx.git] / src / Paragraph.cpp
index 6522bbfe72095bb71172cf7c1109e7b5873fac1e..09c13cc43b10635bf1b42bb2eb81becbdb2f0fc0 100644 (file)
@@ -566,9 +566,10 @@ int Paragraph::Private::writeScriptChars(odocstream & os,
 
        // We only arrive here when a proper language for character text_[i] has
        // not been specified (i.e., it could not be translated in the current
-       // latex encoding) and it belongs to a known script.
-       // Parameter ltx contains the latex translation of text_[i] as specified in
-       // the unicodesymbols file and is something like "\textXXX{<spec>}".
+       // latex encoding) or its latex translation has been forced, and it
+       // belongs to a known script.
+       // Parameter ltx contains the latex translation of text_[i] as specified
+       // in the unicodesymbols file and is something like "\textXXX{<spec>}".
        // The latex macro name "textXXX" specifies the script to which text_[i]
        // belongs and we use it in order to check whether characters from the
        // same script immediately follow, such that we can collect them in a
@@ -577,8 +578,16 @@ int Paragraph::Private::writeScriptChars(odocstream & os,
        docstring::size_type const brace1 = ltx.find_first_of(from_ascii("{"));
        docstring::size_type const brace2 = ltx.find_last_of(from_ascii("}"));
        string script = to_ascii(ltx.substr(1, brace1 - 1));
-       int length = ltx.substr(0, brace2).length();
-       os << ltx.substr(0, brace2);
+       int pos = 0;
+       int length = brace2;
+       bool closing_brace = true;
+       if (script == "textgreek" && encoding.latexName() == "iso-8859-7") {
+               // Correct encoding is being used, so we can avoid \textgreek.
+               pos = brace1 + 1;
+               length -= pos;
+               closing_brace = false;
+       }
+       os << ltx.substr(pos, length);
        int size = text_.size();
        while (i + 1 < size) {
                char_type const next = text_[i + 1];
@@ -612,8 +621,10 @@ int Paragraph::Private::writeScriptChars(odocstream & os,
                length += len;
                ++i;
        }
-       os << '}';
-       ++length;
+       if (closing_brace) {
+               os << '}';
+               ++length;
+       }
        return length;
 }
 
@@ -802,6 +813,8 @@ void Paragraph::Private::latexSpecialChar(
        }
 
        if (runparams.verbatim) {
+               // FIXME UNICODE: This can fail if c cannot
+               // be encoded in the current encoding.
                os.put(c);
                return;
        }
@@ -874,7 +887,6 @@ void Paragraph::Private::latexSpecialChar(
                break;
 
        default:
-
                // LyX, LaTeX etc.
                if (latexSpecialPhrase(os, i, column, runparams))
                        return;
@@ -923,11 +935,8 @@ bool Paragraph::Private::latexSpecialT1(char_type const c, odocstream & os,
                // but we should avoid ligatures
                if (i + 1 >= int(text_.size()) || text_[i + 1] != c)
                        return true;
-               os << "\\,{}";
-               column += 3;
-               // Alternative code:
-               //os << "\\textcompwordmark{}";
-               //column += 19;
+               os << "\\textcompwordmark{}";
+               column += 19;
                return true;
        case '|':
                os.put(c);
@@ -943,37 +952,19 @@ bool Paragraph::Private::latexSpecialTypewriter(char_type const c, odocstream &
 {
        switch (c) {
        case '-':
+               // within \ttfamily, "--" is merged to "-" (no endash)
+               // so we avoid this rather irritating ligature
                if (i + 1 < int(text_.size()) && text_[i + 1] == '-') {
-                       // "--" in Typewriter mode -> "-{}-"
                        os << "-{}";
                        column += 2;
                } else
                        os << '-';
                return true;
 
-       // I assume this is hack treating typewriter as verbatim
-       // FIXME UNICODE: This can fail if c cannot be encoded
-       // in the current encoding.
-
-       case '\0':
-               return true;
-
-       // Those characters are not directly supported.
-       case '\\':
-       case '\"':
-       case '$': case '&':
-       case '%': case '#': case '{':
-       case '}': case '_':
-       case '~':
-       case '^':
-       case '*': case '[':
-       case ' ':
-               return false;
-
+       // everything else has to be checked separately
+       // (depending on the encoding)
        default:
-               // With Typewriter font, these characters exist.
-               os.put(c);
-               return true;
+               return false;
        }
 }
 
@@ -1625,12 +1616,12 @@ void Paragraph::setBeginOfBody()
 }
 
 
-bool Paragraph::forceEmptyLayout() const
+bool Paragraph::forcePlainLayout() const
 {
        Inset const * const inset = inInset();
        if (!inset)
                return true;
-       return inset->forceEmptyLayout();
+       return inset->forcePlainLayout();
 }
 
 
@@ -1643,12 +1634,12 @@ bool Paragraph::allowParagraphCustomization() const
 }
 
 
-bool Paragraph::useEmptyLayout() const
+bool Paragraph::usePlainLayout() const
 {
        Inset const * const inset = inInset();
        if (!inset)
                return false;
-       return inset->useEmptyLayout();
+       return inset->usePlainLayout();
 }
 
 
@@ -1842,7 +1833,7 @@ bool Paragraph::latex(BufferParams const & bparams,
 
        bool return_value = false;
 
-       bool asdefault = forceEmptyLayout();
+       bool asdefault = forcePlainLayout();
 
        Layout const & style = asdefault ?
                bparams.documentClass().emptyLayout() :
@@ -1974,8 +1965,8 @@ bool Paragraph::latex(BufferParams const & bparams,
 
                // Switch file encoding if necessary (and allowed)
                if (!runparams.verbatim && 
-                   runparams.encoding->package() == Encoding::none &&
-                   font.language()->encoding()->package() == Encoding::none) {
+                   runparams.encoding->package() != Encoding::none &&
+                   font.language()->encoding()->package() != Encoding::none) {
                        pair<bool, int> const enc_switch = switchEncoding(os, bparams,
                                        runparams, *(font.language()->encoding()));
                        if (enc_switch.first) {
@@ -2059,7 +2050,7 @@ bool Paragraph::latex(BufferParams const & bparams,
                        }
                }
 
-               // Set the encoding to that returned from simpleTeXSpecialChars (see
+               // Set the encoding to that returned from latexSpecialChar (see
                // comment for encoding member in OutputParams.h)
                runparams.encoding = rp.encoding;
        }
@@ -2268,6 +2259,24 @@ bool Paragraph::isLetter(pos_type pos) const
 }
 
 
+bool Paragraph::isChar(pos_type pos) const
+{
+       if (Inset const * inset = getInset(pos))
+               return inset->isChar();
+       char_type const c = d->text_[pos];
+       return !isLetterChar(c) && !isDigit(c) && !lyx::isSpace(c);
+}
+
+
+bool Paragraph::isSpace(pos_type pos) const
+{
+       if (Inset const * inset = getInset(pos))
+               return inset->isSpace();
+       char_type const c = d->text_[pos];
+       return lyx::isSpace(c);
+}
+
+
 Language const *
 Paragraph::getParLanguage(BufferParams const & bparams) const
 {
@@ -2367,9 +2376,9 @@ void Paragraph::setLayout(Layout const & layout)
 }
 
 
-void Paragraph::setEmptyOrDefaultLayout(DocumentClass const & tclass)
+void Paragraph::setPlainOrDefaultLayout(DocumentClass const & tclass)
 {
-       if (useEmptyLayout())
+       if (usePlainLayout())
                setLayout(tclass.emptyLayout());
        else
                setLayout(tclass.defaultLayout());
@@ -2556,6 +2565,12 @@ InsetList const & Paragraph::insetList() const
 }
 
 
+void Paragraph::setBuffer(Buffer & b)
+{
+       d->insetlist_.setBuffer(b);
+}
+
+
 Inset * Paragraph::releaseInset(pos_type pos)
 {
        Inset * inset = d->insetlist_.release(pos);