]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.cpp
Safer temp file creation with regards to double slash.
[lyx.git] / src / Paragraph.cpp
index 811a3deecb50bac6b01dd567b8397e67ef8e8fbb..d3e8faccb4fc1570d1f04c6ffa4341666fed8713 100644 (file)
@@ -499,7 +499,12 @@ int Paragraph::Private::latexSurrogatePair(odocstream & os, char_type c,
        // Is this correct WRT change tracking?
        docstring const latex1 = encoding.latexChar(next);
        docstring const latex2 = encoding.latexChar(c);
-       os << latex1 << '{' << latex2 << '}';
+       if (docstring(1, next) == latex1) {
+               // the encoding supports the combination
+               os << latex2 << latex1;
+               return latex1.length() + latex2.length();
+       } else
+               os << latex1 << '{' << latex2 << '}';
        return latex1.length() + latex2.length() + 2;
 }
 
@@ -561,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
@@ -572,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];
@@ -607,8 +621,10 @@ int Paragraph::Private::writeScriptChars(odocstream & os,
                length += len;
                ++i;
        }
-       os << '}';
-       ++length;
+       if (closing_brace) {
+               os << '}';
+               ++length;
+       }
        return length;
 }
 
@@ -797,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;
        }
@@ -869,7 +887,6 @@ void Paragraph::Private::latexSpecialChar(
                break;
 
        default:
-
                // LyX, LaTeX etc.
                if (latexSpecialPhrase(os, i, column, runparams))
                        return;
@@ -918,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);
@@ -938,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;
        }
 }
 
@@ -1620,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();
 }
 
 
@@ -1638,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();
 }
 
 
@@ -1837,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() :
@@ -1969,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) {
@@ -2054,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;
        }
@@ -2263,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
 {
@@ -2362,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());
@@ -2508,8 +2522,8 @@ int Paragraph::checkBiblio(Buffer const & buffer)
 
        // There was no inset at the beginning, so we need to create one with
        // the key and label of the one we erased.
-       InsetBibitem * inset = new InsetBibitem(InsetCommandParams(BIBITEM_CODE));
-       inset->setBuffer(const_cast<Buffer &>(buffer));
+       InsetBibitem * inset = 
+               new InsetBibitem(buffer, InsetCommandParams(BIBITEM_CODE));
        // restore values of previously deleted item in this par.
        if (!oldkey.empty())
                inset->setParam("key", oldkey);