]> git.lyx.org Git - features.git/blobdiff - src/insets/InsetSpace.cpp
DocBook: merge code duplicates for HTML and CALS tables.
[features.git] / src / insets / InsetSpace.cpp
index 84c6a2599c60ba163927bdc4b5f8e9a860a0788d..1a2eb096b775779f7e223368ff1898df5f2f4b10 100644 (file)
 #include "FuncStatus.h"
 #include "Language.h"
 #include "LaTeXFeatures.h"
-#include "Length.h"
 #include "Lexer.h"
 #include "MetricsInfo.h"
-#include "OutputParams.h"
-#include "output_xhtml.h"
 #include "texstream.h"
+#include "xml.h"
 
 #include "support/debug.h"
 #include "support/docstream.h"
 #include "support/gettext.h"
 #include "support/lassert.h"
+#include "support/Length.h"
 #include "support/lstrings.h"
 
 #include "frontends/Application.h"
@@ -45,7 +44,7 @@ namespace lyx {
 
 
 InsetSpace::InsetSpace(InsetSpaceParams const & params)
-       : Inset(0), params_(params)
+       : Inset(nullptr), params_(params)
 {}
 
 
@@ -193,7 +192,7 @@ bool InsetSpace::getStatus(Cursor & cur, FuncRequest const & cmd,
 }
 
 
-Inset::RowFlags InsetSpace::rowFlags() const
+int InsetSpace::rowFlags() const
 {
        switch (params_.kind) {
                case InsetSpaceParams::PROTECTED:
@@ -390,18 +389,18 @@ void InsetSpace::draw(PainterInfo & pi, int x, int y) const
        int const h = theFontMetrics(pi.base.font).xHeight();
        int xp[4], yp[4];
 
-       xp[0] = x + 1;
+       xp[0] = x;
        yp[0] = y - max(h / 4, 1);
        if (params_.kind == InsetSpaceParams::NORMAL ||
            params_.kind == InsetSpaceParams::PROTECTED ||
            params_.kind == InsetSpaceParams::VISIBLE) {
-               xp[1] = x + 1;     yp[1] = y;
-               xp[2] = x + w - 2; yp[2] = y;
+               xp[1] = x;         yp[1] = y;
+               xp[2] = x + w - 1; yp[2] = y;
        } else {
-               xp[1] = x + 1;     yp[1] = y + max(h / 4, 1);
-               xp[2] = x + w - 2; yp[2] = y + max(h / 4, 1);
+               xp[1] = x;         yp[1] = y + max(h / 4, 1);
+               xp[2] = x + w - 1; yp[2] = y + max(h / 4, 1);
        }
-       xp[3] = x + w - 2;
+       xp[3] = x + w - 1;
        yp[3] = y - max(h / 4, 1);
 
        Color col = Color_special;
@@ -580,78 +579,85 @@ void InsetSpace::latex(otexstream & os, OutputParams const & runparams) const
 {
        switch (params_.kind) {
        case InsetSpaceParams::NORMAL:
-               os << (runparams.free_spacing ? " " : "\\ ");
+               os << (runparams.free_spacing && (runparams.for_searchAdv == OutputParams::NoSearch) ? " " : "\\ ");
                break;
        case InsetSpaceParams::PROTECTED:
                if (runparams.local_font &&
                    runparams.local_font->language()->lang() == "polutonikogreek")
                        // in babel's polutonikogreek, ~ is active
-                       os << (runparams.free_spacing ? " " : "\\nobreakspace{}");
+                       os << (runparams.free_spacing && (runparams.for_searchAdv == OutputParams::NoSearch) ? " " : "\\nobreakspace{}");
                else
-                       os << (runparams.free_spacing ? ' ' : '~');
+                       os << (runparams.free_spacing && (runparams.for_searchAdv == OutputParams::NoSearch) ? ' ' : '~');
                break;
        case InsetSpaceParams::VISIBLE:
-               os << (runparams.free_spacing ? " " : "\\textvisiblespace{}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv == OutputParams::NoSearch) ? " " : "\\textvisiblespace{}");
                break;
        case InsetSpaceParams::THIN:
-               os << (runparams.free_spacing ? " " : "\\,");
+               if (runparams.for_searchAdv != OutputParams::NoSearch)
+                       os << "\\thinspace{}";
+               else
+                       os << (runparams.free_spacing ? " " : "\\,");
                break;
        case InsetSpaceParams::MEDIUM:
-               if (params_.math)
+               if (runparams.for_searchAdv != OutputParams::NoSearch)
+                       os << "\\medspace{}";
+               else if (params_.math)
                        os << (runparams.free_spacing ? " " : "\\:");
                else
                        os << (runparams.free_spacing ? " " : "\\medspace{}");
                break;
        case InsetSpaceParams::THICK:
-               if (params_.math)
+               if (runparams.for_searchAdv != OutputParams::NoSearch)
+                       os << "\\thickspace{}";
+               else if (params_.math)
                        os << (runparams.free_spacing ? " " : "\\;");
                else
                        os << (runparams.free_spacing ? " " : "\\thickspace{}");
                break;
        case InsetSpaceParams::QUAD:
-               os << (runparams.free_spacing ? " " : "\\quad{}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv != OutputParams::NoSearch) ? " " : "\\quad{}");
                break;
        case InsetSpaceParams::QQUAD:
-               os << (runparams.free_spacing ? " " : "\\qquad{}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv != OutputParams::NoSearch) ? " " : "\\qquad{}");
                break;
        case InsetSpaceParams::ENSPACE:
-               os << (runparams.free_spacing ? " " : "\\enspace{}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv != OutputParams::NoSearch) ? " " : "\\enspace{}");
                break;
        case InsetSpaceParams::ENSKIP:
-               os << (runparams.free_spacing ? " " : "\\enskip{}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv != OutputParams::NoSearch) ? " " : "\\enskip{}");
                break;
        case InsetSpaceParams::NEGTHIN:
-               os << (runparams.free_spacing ? " " : "\\negthinspace{}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv != OutputParams::NoSearch) ? " " : "\\negthinspace{}");
                break;
        case InsetSpaceParams::NEGMEDIUM:
-               os << (runparams.free_spacing ? " " : "\\negmedspace{}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv != OutputParams::NoSearch) ? " " : "\\negmedspace{}");
                break;
        case InsetSpaceParams::NEGTHICK:
-               os << (runparams.free_spacing ? " " : "\\negthickspace{}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv != OutputParams::NoSearch) ? " " : "\\negthickspace{}");
                break;
        case InsetSpaceParams::HFILL:
-               os << (runparams.free_spacing ? " " : "\\hfill{}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv != OutputParams::NoSearch) ? " " : "\\hfill{}");
                break;
        case InsetSpaceParams::HFILL_PROTECTED:
-               os << (runparams.free_spacing ? " " : "\\hspace*{\\fill}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv != OutputParams::NoSearch) ? " " : "\\hspace*{\\fill}");
                break;
        case InsetSpaceParams::DOTFILL:
-               os << (runparams.free_spacing ? " " : "\\dotfill{}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv != OutputParams::NoSearch) ? " " : "\\dotfill{}");
                break;
        case InsetSpaceParams::HRULEFILL:
-               os << (runparams.free_spacing ? " " : "\\hrulefill{}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv != OutputParams::NoSearch) ? " " : "\\hrulefill{}");
                break;
        case InsetSpaceParams::LEFTARROWFILL:
-               os << (runparams.free_spacing ? " " : "\\leftarrowfill{}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv != OutputParams::NoSearch) ? " " : "\\leftarrowfill{}");
                break;
        case InsetSpaceParams::RIGHTARROWFILL:
-               os << (runparams.free_spacing ? " " : "\\rightarrowfill{}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv != OutputParams::NoSearch) ? " " : "\\rightarrowfill{}");
                break;
        case InsetSpaceParams::UPBRACEFILL:
-               os << (runparams.free_spacing ? " " : "\\upbracefill{}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv != OutputParams::NoSearch) ? " " : "\\upbracefill{}");
                break;
        case InsetSpaceParams::DOWNBRACEFILL:
-               os << (runparams.free_spacing ? " " : "\\downbracefill{}");
+               os << (runparams.free_spacing && (runparams.for_searchAdv != OutputParams::NoSearch) ? " " : "\\downbracefill{}");
                break;
        case InsetSpaceParams::CUSTOM:
                if (runparams.free_spacing)
@@ -741,68 +747,57 @@ int InsetSpace::plaintext(odocstringstream & os,
 }
 
 
-int InsetSpace::docbook(odocstream & os, OutputParams const &) const
+void InsetSpace::docbook(XMLStream & xs, OutputParams const &) const
 {
        switch (params_.kind) {
        case InsetSpaceParams::NORMAL:
-               os << " ";
+               xs << XMLStream::ESCAPE_NONE << " ";
                break;
        case InsetSpaceParams::QUAD:
-               os << "&emsp;";
+               xs << XMLStream::ESCAPE_NONE << "&#x2003;"; // HTML: &emsp;
                break;
        case InsetSpaceParams::QQUAD:
-               os << "&emsp;&emsp;";
+               xs << XMLStream::ESCAPE_NONE << "&#x2003;&#x2003;"; // HTML: &emsp;&emsp;
                break;
        case InsetSpaceParams::ENSKIP:
-               os << "&ensp;";
+               xs << XMLStream::ESCAPE_NONE << "&#x2002;"; // HTML: &ensp;
                break;
        case InsetSpaceParams::PROTECTED:
-               os << "&nbsp;";
+               xs << XMLStream::ESCAPE_NONE << "&#xA0;"; // HTML: &nbsp;
                break;
        case InsetSpaceParams::VISIBLE:
-               os << "&#x2423;";
+               xs << XMLStream::ESCAPE_NONE << "&#x2423;";
                break;
-       case InsetSpaceParams::ENSPACE:
-               os << "&#x2060;&ensp;&#x2060;";
+       case InsetSpaceParams::ENSPACE: // HTML: &#x2060;&ensp;&#x2060; (word joiners)
+               xs << XMLStream::ESCAPE_NONE << "&#x2060;&#x2002;&#x2060;";
                break;
        case InsetSpaceParams::THIN:
-               os << "&thinsp;";
+               xs << XMLStream::ESCAPE_NONE << "&#x2009;"; // HTML: &thinspace;
                break;
        case InsetSpaceParams::MEDIUM:
-               os << "&emsp14;";
+               xs << XMLStream::ESCAPE_NONE << "&#x2005;"; // HTML: &emsp14;
                break;
        case InsetSpaceParams::THICK:
-               os << "&emsp13;";
+               xs << XMLStream::ESCAPE_NONE << "&#x2004;"; // HTML: &emsp13;
                break;
        case InsetSpaceParams::NEGTHIN:
        case InsetSpaceParams::NEGMEDIUM:
        case InsetSpaceParams::NEGTHICK:
-               // FIXME
-               os << "&nbsp;";
+               xs << XMLStream::ESCAPE_NONE << "&#xA0;"; // HTML: &nbsp;
                break;
        case InsetSpaceParams::HFILL:
        case InsetSpaceParams::HFILL_PROTECTED:
-               os << '\n';
-               break;
        case InsetSpaceParams::DOTFILL:
-               // FIXME
-               os << '\n';
-               break;
        case InsetSpaceParams::HRULEFILL:
-               // FIXME
-               os << '\n';
-               break;
        case InsetSpaceParams::LEFTARROWFILL:
        case InsetSpaceParams::RIGHTARROWFILL:
        case InsetSpaceParams::UPBRACEFILL:
        case InsetSpaceParams::DOWNBRACEFILL:
        case InsetSpaceParams::CUSTOM:
        case InsetSpaceParams::CUSTOM_PROTECTED:
-               // FIXME
-               os << '\n';
+               xs << '\n';
                break;
        }
-       return 0;
 }
 
 
@@ -873,6 +868,13 @@ docstring InsetSpace::xhtml(XMLStream & xs, OutputParams const &) const
 
 void InsetSpace::validate(LaTeXFeatures & features) const
 {
+       if (features.isAvailable("LaTeX-2020/10/01"))
+               // As of this version, the LaTeX kernel
+               // includes all spaces.
+               return;
+
+       // In earlier versions, we require amsmath
+       // for some text and math spaces
        if ((params_.kind == InsetSpaceParams::NEGMEDIUM
             || params_.kind == InsetSpaceParams::NEGTHICK)
            || (!params_.math