]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetSpecialChar.cpp
Loop refactoring
[lyx.git] / src / insets / InsetSpecialChar.cpp
index 76da971ea0bbea1e03250ea1727e658f6e96fc31..3ecdaf12e94315f2f4bbb438d0183e5e70154603 100644 (file)
 #include "InsetSpecialChar.h"
 
 #include "Dimension.h"
+#include "Encoding.h"
 #include "Font.h"
 #include "Language.h"
 #include "LaTeXFeatures.h"
 #include "Lexer.h"
 #include "MetricsInfo.h"
 #include "output_xhtml.h"
+#include "xml.h"
 #include "texstream.h"
 
 #include "frontends/FontMetrics.h"
@@ -36,7 +38,7 @@ namespace lyx {
 
 
 InsetSpecialChar::InsetSpecialChar(Kind k)
-       : Inset(0), kind_(k)
+       : Inset(nullptr), kind_(k)
 {}
 
 
@@ -81,6 +83,29 @@ docstring InsetSpecialChar::toolTip(BufferView const &, int, int) const
 }
 
 
+Inset::RowFlags InsetSpecialChar::rowFlags() const
+{
+       switch (kind_) {
+       case ALLOWBREAK:
+       case HYPHENATION:
+       case SLASH:
+               // these are the elements that allow line breaking
+               return CanBreakAfter;
+       case NOBREAKDASH:
+       case END_OF_SENTENCE:
+       case LIGATURE_BREAK:
+       case LDOTS:
+       case MENU_SEPARATOR:
+       case PHRASE_LYX:
+       case PHRASE_TEX:
+       case PHRASE_LATEX2E:
+       case PHRASE_LATEX:
+               break;
+       }
+       return Inline;
+}
+
+
 namespace {
 
 // helper function: draw text and update x.
@@ -384,6 +409,7 @@ void InsetSpecialChar::latex(otexstream & os,
                             OutputParams const & rp) const
 {
        bool const rtl = rp.local_font->isRightToLeft();
+       bool const utf8 = rp.encoding->iconvName() == "UTF-8";
        string lswitch = "";
        string lswitche = "";
        if (rtl && !rp.use_polyglossia) {
@@ -399,10 +425,15 @@ void InsetSpecialChar::latex(otexstream & os,
                os << "\\-";
                break;
        case ALLOWBREAK:
+               // U+200B not yet supported by utf8 inputenc
                os << "\\LyXZeroWidthSpace" << termcmd;
                break;
        case LIGATURE_BREAK:
-               os << "\\textcompwordmark" << termcmd;
+               if (utf8)
+                       // U+200C ZERO WIDTH NON-JOINER
+                       os.put(0x200c);
+               else
+                       os << "\\textcompwordmark" << termcmd;
                break;
        case END_OF_SENTENCE:
                os << "\\@.";
@@ -499,76 +530,82 @@ int InsetSpecialChar::plaintext(odocstringstream & os,
 }
 
 
-int InsetSpecialChar::docbook(odocstream & os, OutputParams const &) const
+void InsetSpecialChar::docbook(XMLStream & xs, OutputParams const &) const
 {
        switch (kind_) {
-       case HYPHENATION:
-               break;
-       case ALLOWBREAK:
-               // U+200B ZERO WIDTH SPACE (ZWSP)
-               os.put(0x200b);
-               break;
+    case HYPHENATION:
+       // Soft hyphen.
+        xs << XMLStream::ESCAPE_NONE << "&#xAD;";
+        break;
+    case ALLOWBREAK:
+       // Zero-width space
+        xs << XMLStream::ESCAPE_NONE << "&#x200B;";
+        break;
        case LIGATURE_BREAK:
+               // Zero width non-joiner
+               xs << XMLStream::ESCAPE_NONE << "&#x200C;";
                break;
        case END_OF_SENTENCE:
-               os << '.';
+               xs << '.';
                break;
        case LDOTS:
-               os << "&hellip;";
+               // &hellip;
+               xs << XMLStream::ESCAPE_NONE << "&#x2026;";
                break;
        case MENU_SEPARATOR:
-               os << "&lyxarrow;";
+               // &rArr;, right arrow.
+               xs << XMLStream::ESCAPE_NONE << "&#x21D2;";
                break;
        case SLASH:
-               os << '/';
+               // &frasl;, fractional slash.
+               xs << XMLStream::ESCAPE_NONE << "&#x2044;";
                break;
+               // Non-breaking hyphen.
        case NOBREAKDASH:
-               os << '-';
+               xs << XMLStream::ESCAPE_NONE << "&#x2011;";
                break;
        case PHRASE_LYX:
-               os << "LyX";
+               xs << "LyX";
                break;
        case PHRASE_TEX:
-               os << "TeX";
+               xs << "TeX";
                break;
        case PHRASE_LATEX2E:
-               os << "LaTeX2";
-               // ε U+03B5 GREEK SMALL LETTER EPSILON
-               os.put(0x03b5);
+               // Lower-case epsilon.
+               xs << "LaTeX2" << XMLStream::ESCAPE_NONE << "&#x03b5;";
                break;
        case PHRASE_LATEX:
-               os << "LaTeX";
+               xs << "LaTeX";
                break;
        }
-       return 0;
 }
 
 
-docstring InsetSpecialChar::xhtml(XHTMLStream & xs, OutputParams const &) const
+docstring InsetSpecialChar::xhtml(XMLStream & xs, OutputParams const &) const
 {
        switch (kind_) {
        case HYPHENATION:
                break;
        case ALLOWBREAK:
-               xs << XHTMLStream::ESCAPE_NONE << "&#8203;";
+               xs << XMLStream::ESCAPE_NONE << "&#8203;";
                break;
        case LIGATURE_BREAK:
-               xs << XHTMLStream::ESCAPE_NONE << "&#8204;";
+               xs << XMLStream::ESCAPE_NONE << "&#8204;";
                break;
        case END_OF_SENTENCE:
                xs << '.';
                break;
        case LDOTS:
-               xs << XHTMLStream::ESCAPE_NONE << "&hellip;";
+               xs << XMLStream::ESCAPE_NONE << "&hellip;";
                break;
        case MENU_SEPARATOR:
-               xs << XHTMLStream::ESCAPE_NONE << "&rArr;";
+               xs << XMLStream::ESCAPE_NONE << "&rArr;";
                break;
        case SLASH:
-               xs << XHTMLStream::ESCAPE_NONE << "&frasl;";
+               xs << XMLStream::ESCAPE_NONE << "&frasl;";
                break;
        case NOBREAKDASH:
-               xs << XHTMLStream::ESCAPE_NONE << "&#8209;";
+               xs << XMLStream::ESCAPE_NONE << "&#8209;";
                break;
        case PHRASE_LYX:
                xs << "LyX";
@@ -577,7 +614,7 @@ docstring InsetSpecialChar::xhtml(XHTMLStream & xs, OutputParams const &) const
                xs << "TeX";
                break;
        case PHRASE_LATEX2E:
-               xs << "LaTeX2" << XHTMLStream::ESCAPE_NONE << "&#x3b5;";
+               xs << "LaTeX2" << XMLStream::ESCAPE_NONE << "&#x3b5;";
                break;
        case PHRASE_LATEX:
                xs << "LaTeX";
@@ -635,7 +672,9 @@ bool InsetSpecialChar::isChar() const
 bool InsetSpecialChar::isLetter() const
 {
        return kind_ == HYPHENATION || kind_ == LIGATURE_BREAK
-               || kind_ == NOBREAKDASH;
+               || kind_ == NOBREAKDASH
+               || kind_ == PHRASE_LYX || kind_ == PHRASE_LATEX
+               || kind_ == PHRASE_TEX || kind_ == PHRASE_LATEX2E;
 }