]> git.lyx.org Git - lyx.git/blobdiff - src/tex-accent.C
Fix loop when opening TOC widget in an empty document, basically by Richard Heck.
[lyx.git] / src / tex-accent.C
index 8b7f74067289c45f62eb25ad7939f02effb45179..adb9b1b365e4949282b9715fc7a4ccfc08c2e041 100644 (file)
 #include <config.h>
 
 #include "tex-accent.h"
-#include "support/tostr.h"
+#include "debug.h"
 
-using std::string;
+#include "support/convert.h"
+#include "support/docstream.h"
+
+
+namespace lyx {
+
+// FIXME This file has nothing to do with TeX anymore
 
 /* the names used by TeX and XWindows for deadkeys/accents are not the same
    so here follows a table to clearify the differences. Please correct this
@@ -23,49 +29,50 @@ using std::string;
    |------------------|------------------|------------------|--------------|
    |      TeX         |     XWindows     |   \bind/LFUN     | used by intl |
    |------------------|------------------|------------------|--------------|
-   |    grave         |    grave         |LFUN_GRAVE        | grave
-   |    acute         |    acute         |LFUN_ACUTE        | acute
-   |    circumflex    |    circumflex    |LFUN_CIRCUMFLEX   | circumflex
-   | umlaut/dieresis  |    diaeresis     |LFUN_UMLAUT       | umlaut
-   |    tilde         |    tilde         |LFUN_TILDE        | tilde
-   |    macron        |    maron         |LFUN_MACRON       | macron
-   |    dot           |    abovedot      |LFUN_DOT          | dot
-   |    cedilla       |    cedilla       |LFUN_CEDILLA      | cedilla
-   |    underdot      |                  |LFUN_UNDERDOT     | underdot
-   |    underbar      |                  |LFUN_UNDERBAR     | underbar
-   |    hácek         |    caron         |LFUN_CARON        | caron
-   |    breve         |    breve         |LFUN_BREVE        | breve
-   |    tie           |                  |LFUN_TIE          | tie
-   | Hungarian umlaut |    doubleacute   |LFUN_HUNG_UMLAUT  | hungarian umlaut
-   |    circle        |    abovering     |LFUN_CIRCLE       | circle
+   |    grave         |    grave         |LFUN_ACCENT_GRAVE        | grave
+   |    acute         |    acute         |LFUN_ACCENT_ACUTE        | acute
+   |    circumflex    |    circumflex    |LFUN_ACCENT_CIRCUMFLEX   | circumflex
+   | umlaut/dieresis  |    diaeresis     |LFUN_ACCENT_UMLAUT       | umlaut
+   |    tilde         |    tilde         |LFUN_ACCENT_TILDE        | tilde
+   |    macron        |    maron         |LFUN_ACCENT_MACRON       | macron
+   |    dot           |    abovedot      |LFUN_ACCENT_DOT          | dot
+   |    cedilla       |    cedilla       |LFUN_ACCENT_CEDILLA      | cedilla
+   |    underdot      |                  |LFUN_ACCENT_UNDERDOT     | underdot
+   |    underbar      |                  |LFUN_ACCENT_UNDERBAR     | underbar
+   |    hácek         |    caron         |LFUN_ACCENT_CARON        | caron
+   |    breve         |    breve         |LFUN_ACCENT_BREVE        | breve
+   |    tie           |                  |LFUN_ACCENT_TIE          | tie
+   | Hungarian umlaut |    doubleacute   |LFUN_ACCENT_HUNGARIAN_UMLAUT  | hungarian umlaut
+   |    circle        |    abovering     |LFUN_ACCENT_CIRCLE       | circle
    |                  |    ogonek        |                  |
    |                  |    iota          |                  |
    |                  |    voiced_sound  |                  |
    |                  | semivoiced_sound |                  |
-   |                  |                  |LFUN_SPECIAL_CARON| special caron
+   |                  |                  |LFUN_ACCENT_SPECIAL_CARON| special caron
    */
 // I am not sure how some of the XWindows names coresponds to the TeX ones.
 
-tex_accent_struct lyx_accent_table[18] = {
-       { static_cast<tex_accent>(0), "", /*"",*/ "", static_cast<kb_action>(0)},
-       {TEX_ACUTE,      "\\'",  /*" AEIOUYaeiouySZszRLCNrlcn",*/ "acute",   LFUN_ACUTE},
-       {TEX_GRAVE,      "\\`",  /*" aeiouAEIOU",*/           "grave",    LFUN_GRAVE},
-       {TEX_MACRON,     "\\=",  /*" EeAIOUaiou",*/           "macron",    LFUN_MACRON},
-       {TEX_TILDE,      "\\~",  /*" ANOanoIiUu",*/           "tilde",    LFUN_TILDE},
-       {TEX_UNDERBAR,   "\\b", /*" ",*/                     "underbar", LFUN_UNDERBAR},
-       {TEX_CEDILLA,    "\\c", /*" CcSsTtRLGrlgNKnk",*/     "cedilla",    LFUN_CEDILLA},
-       {TEX_UNDERDOT,   "\\d", /*" ",*/                     "underdot", LFUN_UNDERDOT},
-       {TEX_CIRCUMFLEX, "\\^",  /*" AEIOUaeiouHJhjCGScgs",*/ "circumflex",  LFUN_CIRCUMFLEX},
-       {TEX_CIRCLE,     "\\r", /*" AaUu",*/                 "circle",  LFUN_CIRCLE},
-       {TEX_TIE,        "\\t", /*" ",*/                     "tie",    LFUN_TIE},
-       {TEX_BREVE,      "\\u", /*" AaGgUu",*/               "breve",    LFUN_BREVE},
-       {TEX_CARON,      "\\v", /*" LSTZlstzCEDNRcednr",*/   "caron",    LFUN_CARON},
-//  {TEX_SPECIAL_CARON, "\\q", "", "ooo",  LFUN_SPECIAL_CARON},
-       {TEX_HUNGUML,    "\\H", /*" OUou",*/                 "hugarian_umlaut",    LFUN_HUNG_UMLAUT},
-       {TEX_UMLAUT,     "\\\"", /*" AEIOUaeiouy",*/          "umlaut",    LFUN_UMLAUT},
-       {TEX_DOT,        "\\.",  /*" ZzICGicgEe",*/           "dot",    LFUN_DOT},
-       {TEX_OGONEK,     "\\k",  /*" AaEe",*/                 "ogonek",    LFUN_OGONEK},
-       { static_cast<tex_accent>(0), "", /*"",*/ "", static_cast<kb_action>(0)}};
+tex_accent_struct lyx_accent_table[] = {
+       {TEX_NOACCENT,   0,      "",                LFUN_NOACTION},
+       {TEX_ACUTE,      0x0301, "acute",           LFUN_ACCENT_ACUTE},
+       {TEX_GRAVE,      0x0300, "grave",           LFUN_ACCENT_GRAVE},
+       {TEX_MACRON,     0x0304, "macron",          LFUN_ACCENT_MACRON},
+       {TEX_TILDE,      0x0303, "tilde",           LFUN_ACCENT_TILDE},
+       {TEX_UNDERBAR,   0x0320, "underbar",        LFUN_ACCENT_UNDERBAR},
+       {TEX_CEDILLA,    0x0327, "cedilla",         LFUN_ACCENT_CEDILLA},
+       {TEX_UNDERDOT,   0x0323, "underdot",        LFUN_ACCENT_UNDERDOT},
+       {TEX_CIRCUMFLEX, 0x0302, "circumflex",      LFUN_ACCENT_CIRCUMFLEX},
+       {TEX_CIRCLE,     0x030a, "circle",          LFUN_ACCENT_CIRCLE},
+       {TEX_TIE,        0x0361, "tie",             LFUN_ACCENT_TIE},
+       {TEX_BREVE,      0x0306, "breve",           LFUN_ACCENT_BREVE},
+       {TEX_CARON,      0x030c, "caron",           LFUN_ACCENT_CARON},
+//     {TEX_SPECIAL_CARON, 0x030c, "ooo",          LFUN_ACCENT_SPECIAL_CARON},
+       // Don't fix this typo for compatibility reasons!
+       {TEX_HUNGUML,    0x030b, "hugarian_umlaut", LFUN_ACCENT_HUNGARIAN_UMLAUT},
+       {TEX_UMLAUT,     0x0308, "umlaut",          LFUN_ACCENT_UMLAUT},
+       {TEX_DOT,        0x0307, "dot",             LFUN_ACCENT_DOT},
+       {TEX_OGONEK,     0x0328, "ogonek",          LFUN_ACCENT_OGONEK}
+};
 
 
 tex_accent_struct get_accent(kb_action action)
@@ -82,22 +89,28 @@ tex_accent_struct get_accent(kb_action action)
 }
 
 
-string const DoAccent(string const & s, tex_accent accent)
+docstring const DoAccent(docstring const & s, tex_accent accent)
 {
-       string res;
+       if (s.empty())
+               return docstring(1, lyx_accent_table[accent].ucs4);
 
-       res += lyx_accent_table[accent].cmd;
-       res += '{';
-       if (s == "i" || s == "j") {
-               res += '\\';
+       odocstringstream os;
+       os.put(s[0]);
+       os.put(lyx_accent_table[accent].ucs4);
+       if (s.length() > 1) {
+               if (accent != TEX_TIE || s.length() > 2)
+                       lyxerr << "Warning: Too many characters given for accent "
+                              << lyx_accent_table[accent].name << '.' << std::endl;
+               os << s.substr(1);
        }
-       res += s;
-       res += '}';
-       return res;
+       return normalize_kc(os.str());
 }
 
 
-string const DoAccent(char c, tex_accent accent)
+docstring const DoAccent(char_type c, tex_accent accent)
 {
-       return DoAccent(convert<string>(c), accent);
+       return DoAccent(docstring(1, c), accent);
 }
+
+
+} // namespace lyx