home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / lyx-0.13.2.tar.gz / lyx-0.13.2.tar / lyx-0.13.2 / src / insetquotes.C < prev    next >
C/C++ Source or Header  |  1998-04-23  |  7KB  |  303 lines

  1. /* This file is part of
  2.  * ======================================================
  3.  * 
  4.  *           LyX, The Document Processor
  5.  *      
  6.  *        Copyright (C) 1995 Matthias Ettrich
  7.  *          Copyright (C) 1995-1998 The LyX Team.
  8.  *
  9.  *======================================================*/
  10.  
  11. #include <config.h>
  12.  
  13. #ifdef __GNUG__
  14. #pragma implementation
  15. #endif
  16.  
  17. #include "insetquotes.h"
  18. #include "lyxlib.h"
  19. #include "error.h"
  20. #include "lyxfont.h"
  21. #include "lyxrc.h"
  22. #include "buffer.h"
  23. #include "LaTeXFeatures.h"
  24.  
  25. //     $Id: insetquotes.C,v 1.1.1.1 1998/04/23 16:02:51 larsbj Exp $    
  26.  
  27. #if !defined(lint) && !defined(WITH_WARNINGS)
  28. static char vcid[] = "$Id: insetquotes.C,v 1.1.1.1 1998/04/23 16:02:51 larsbj Exp $";
  29. #endif /* lint */
  30.  
  31. // Quotes. Used for the various quotes. German, English, French,
  32. // Danish, Polish, all either double or single.
  33.  
  34. extern LyXRC *lyxrc;
  35. extern BufferView *current_view;
  36.  
  37. // codes used to read/write quotes to LyX files
  38. static char const *language_char = "esgpfa";
  39. static char const *side_char = "lr" ;
  40. static char const *times_char ="sd";
  41.  
  42. // List of known quote chars
  43. static char const *quote_char = ",'`<>";
  44.  
  45. // Index of chars used for the quote. Index is [side,language]
  46. int quote_index[2][6] = 
  47. { { 2, 1, 0, 0, 3, 4 },    // "'',,<>" 
  48.   { 1, 1, 2, 1, 4, 3 } };  // "`'`'><"
  49.  
  50. // Corresponding LaTeX code, for double and single quotes.
  51. static char const *latex_quote_t1[2][5] =
  52. { { "\\quotesinglbase{}",  "'", "`", 
  53.     "\\guilsinglleft{}", "\\guilsinglright{}" }, 
  54.   { ",,", "''", "``", "<<", ">>" } };
  55.  
  56. static char const *latex_quote_ot1[2][5] =
  57. { { "\\quotesinglbase{}",  "'", "`", 
  58.     "\\guilsinglleft{}", "\\guilsinglright{}" }, 
  59.   { "\\quotedblbase{}", "''", "``",
  60.     "\\guillemotleft{}", "\\guillemotright{}" } };
  61.  
  62. static char const *latex_quote_babel[2][5] =
  63. { { "\\glq{}",  "'", "`", "\\flq{}", "\\frq{}" },
  64.   { "\\glqq{}", "''", "``", "\\flqq{}", "\\frqq{}" } };
  65.  
  66.  
  67. InsetQuotes::InsetQuotes(LString const &string)
  68. {
  69.     ParseString(string);
  70. }
  71.  
  72. InsetQuotes::InsetQuotes(InsetQuotes::quote_language l,
  73.              InsetQuotes::quote_side s,
  74.              InsetQuotes::quote_times t)
  75.     : language(l), side(s), times(t)
  76. {
  77. }
  78.  
  79.  
  80. InsetQuotes::InsetQuotes(char c, BufferParams const ¶ms)
  81.     : language(params.quotes_language), times(params.quotes_times)
  82. {
  83.     // Decide whether left or right 
  84.     switch(c) {
  85.     case ' ': case '(': case '{': case '[': case '-': case ':':
  86.     case LYX_META_HFILL: case LYX_META_PROTECTED_SEPARATOR:
  87.     case LYX_META_NEWLINE: 
  88.         side = InsetQuotes::LeftQ;   // left quote 
  89.         break;
  90.     default:
  91.         side = InsetQuotes::RightQ;  // right quote
  92.     }
  93. }
  94.  
  95.  
  96. void InsetQuotes::ParseString(LString string)
  97. {
  98.     int i;
  99.     if (string.length() != 3) {
  100.         lyxerr.print("ERROR (InsetQuotes::InsetQuotes):"
  101.                   " bad string length.");
  102.         string = "eld";
  103.     }
  104.  
  105.     for (i=0;i<6;i++) {
  106.         if (string[0] == language_char[i]) {
  107.             language = (InsetQuotes::quote_language)i;
  108.             break;
  109.         }
  110.     }
  111.     if (i>=6) {
  112.         lyxerr.print("ERROR (InsetQuotes::InsetQuotes):"
  113.                   " bad language specification.");
  114.         language = InsetQuotes::EnglishQ; 
  115.     }
  116.  
  117.     for (i=0;i<2;i++) {
  118.         if (string[1] == side_char[i]) {
  119.             side = (InsetQuotes::quote_side)i;
  120.             break;
  121.         }
  122.     }
  123.     if (i>=2) {
  124.         lyxerr.print("ERROR (InsetQuotes::InsetQuotes):"
  125.                   " bad side specification.");
  126.         side = InsetQuotes::LeftQ; 
  127.     }
  128.  
  129.     for (i=0;i<2;i++) {
  130.         if (string[2] == times_char[i]) {
  131.             times = (InsetQuotes::quote_times)i;
  132.             break;
  133.         }
  134.     }
  135.     if (i>=2) {
  136.         lyxerr.print("ERROR (InsetQuotes::InsetQuotes):"
  137.                   " bad times specification.");
  138.         times = InsetQuotes::DoubleQ; 
  139.     }
  140. }
  141.  
  142. LString InsetQuotes::DispString() const
  143. {
  144.      LString disp;
  145.  
  146.     disp += quote_char[quote_index[side][language]];
  147.         
  148.     if (times == InsetQuotes::DoubleQ)
  149.         disp += disp;
  150.  
  151.      if (lyxrc->font_norm == "iso8859-1") 
  152.         if (disp == "<<")
  153.             disp = '½';
  154.         else if (disp == ">>")
  155.             disp = '╗';
  156.     
  157.      return disp;
  158. }
  159.  
  160.  
  161. int InsetQuotes::Ascent(LyXFont const &font) const
  162. {
  163.     return font.maxAscent();
  164. }
  165.  
  166.  
  167. int InsetQuotes::Descent(LyXFont const &font) const
  168. {
  169.     return font.maxDescent();
  170. }
  171.  
  172.  
  173. int InsetQuotes::Width(LyXFont const &font) const
  174. {
  175.     LString text = DispString();
  176.     int w = 0;
  177.  
  178.     for (int i = 0; i < text.length(); i++) {
  179.         if (text[i] == ' ')
  180.             w += font.width('i');
  181.         else if (i == 0 || text[i] != text[i-1])
  182.             w += font.width(text[i]);
  183.         else
  184.             w += font.width(',');
  185.     }
  186.  
  187.     return w;
  188. }
  189.  
  190.  
  191. LyXFont InsetQuotes::ConvertFont(LyXFont font)
  192. {
  193.     /* quotes-insets cannot be latex of any kind */
  194.     font.setLatex(LyXFont::OFF);
  195.     return font;
  196. }
  197.  
  198.  
  199. void InsetQuotes::Draw(LyXFont font, LyXScreen &scr,
  200.                int baseline, float &x)
  201. {
  202.     LString text = DispString();
  203.  
  204.     for (int i = 0; i < text.length(); i++) {
  205.         if (text[i] == ' ') 
  206.             x += font.width('i');
  207.         else if (i == text.length()-1 || text[i] != text[i+1]) {
  208.             scr.drawString(font, &text[i], baseline, int(x));
  209.             x += font.width(text[i]);
  210.         } else {
  211.             scr.drawString(font, &text[i+1], baseline, int(x));
  212.             x += font.width(',');
  213.         }
  214.     }
  215.     
  216. }
  217.  
  218.  
  219. void InsetQuotes::Write(FILE *file)
  220. {
  221.     LString text;
  222.     text += language_char[language];
  223.     text += side_char[side];
  224.     text += times_char[times]; 
  225.     fprintf(file, "Quotes %s", text.c_str());
  226. }
  227.  
  228.  
  229. void InsetQuotes::Read(LyXLex &lex)
  230. {
  231.     lex.nextToken();
  232.     ParseString(lex.GetString());
  233. }
  234.  
  235.  
  236. int InsetQuotes::Latex(FILE *file, signed char /*fragile*/)
  237. {
  238.     LString quote;
  239.     signed char dummy = 0;
  240.     Latex(quote, dummy);
  241.     fprintf(file, "%s", quote.c_str()); 
  242.     return 0;
  243. }
  244.  
  245. int InsetQuotes::Latex(LString &file, signed char /*fragile*/)
  246. {
  247.     LString doclang =
  248.         current_view->currentBuffer()->GetLanguage();
  249.     int quoteind = quote_index[side][language];
  250.     
  251.     if (lyxrc->fontenc == "T1") {
  252.         file += latex_quote_t1[times][quoteind];
  253.     }
  254.     else if (doclang == "default") {
  255.         file += latex_quote_ot1[times][quoteind];
  256.     } 
  257.     else if (language == InsetQuotes::FrenchQ 
  258.          && times == InsetQuotes::DoubleQ
  259.          && doclang == "frenchb") {
  260.         if (side == InsetQuotes::LeftQ) 
  261.             file += "\\og{}";
  262.         else 
  263.             file += " \\fg{}";
  264.     } 
  265.     else 
  266.         file +=    latex_quote_babel[times][quoteind];
  267.     return 0;
  268. }
  269.  
  270. void InsetQuotes::Validate(LaTeXFeatures &features) const 
  271. {
  272.     char type = quote_char[quote_index[side][language]];
  273.  
  274.     if (current_view->currentBuffer()->GetLanguage() == "default" 
  275.         && lyxrc->fontenc != "T1") {
  276.         if (times == InsetQuotes::SingleQ) 
  277.             switch (type) {
  278.             case ',': features.quotesinglbase = true; break;
  279.             case '<': features.guilsinglleft = true; break;
  280.             case '>': features.guilsinglright = true; break;
  281.             default: break;
  282.             }
  283.         else 
  284.             switch (type) {
  285.             case ',': features.quotedblbase = true; break;
  286.             case '<': features.guillemotleft = true; break;
  287.             case '>': features.guillemotright = true; break;
  288.             default: break;
  289.             }
  290.     }
  291. }
  292.  
  293. Inset* InsetQuotes::Clone()
  294. {
  295.   return new InsetQuotes(language, side, times);
  296. }
  297.  
  298.  
  299. Inset::Code InsetQuotes::LyxCode() const
  300. {
  301.   return Inset::QUOTE_CODE;
  302. }
  303.