% File:          latex_conv.sl                       -*- mode: SLang -*-
%
% Copyright (c)
%       2006--2007  Jörg Sommer <[email protected]>
%       $Id$
%
%       -*- This file is part of Jörg's LaTeX Mode (JLM) -*-
%
% Description:   This file include functions to convert LaTeX stuff into
%                each other like "a to ä or : to \colon
%
% License: This program is free software; you can redistribute it and/or
%          modify it under the terms of the GNU General Public License as
%          published by the Free Software Foundation; either version 2 of
%          the License, or (at your option) any later version.
%
%          This program is distributed in the hope that it will be
%          useful, but WITHOUT ANY WARRANTY; without even the implied
%          warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
%          PURPOSE.  See the GNU General Public License for more details.

if (length(where("latex_conv" == _get_namespaces())))
 use_namespace("latex_conv");
else
 implements("latex_conv");

autoload("Global->enable_stack_check", "stkcheck");
try
{
   enable_stack_check();
}
catch OpenError: {} % stkcheck not found in the path

define german_utf8()
{
   while ( fsearch_char('"') )
   {
       if ( blooking_at("\\") )
         continue;

       () = right(1);
       variable new;
       switch ( what_char() )
       { case 'a': new = "ä"; }
       { case 'A': new = "Ä"; }
       { case 'o': new = "ö"; }
       { case 'O': new = "Ö"; }
       { case 'u': new = "ü"; }
       { case 'U': new = "Ü"; }
       { case 's': new = "ß"; }
       { case '`' or case '\'': continue; }
       { throw ApplicationError, "Unkown sequence: \""+char(what_char()); }

       () = left(1);
       () = replace_chars(2, new);
   }
}

define german_lat1()
{
   while ( fsearch_char('"') )
   {
       % fixme: latex->is_escaped latex->is_commented
       if (blooking_at("\\") or parse_to_point() == -2)
       {
           () = right(1);
           continue;
       }

       () = right(1);
       variable new;
       switch ( what_char() )
       { case 'a': new = "�"; }
       { case 'A': new = "�"; }
       { case 'o': new = "�"; }
       { case 'O': new = "�"; }
       { case 'u': new = "�"; }
       { case 'U': new = "�"; }
       { case 's': new = "�"; }
       { case '`' or case '\'': continue; }
       { throw ApplicationError, "Unkown sequence: \""+char(what_char()); }

       () = left(1);
       () = replace_chars(2, new);
   }
}

define native_lat1()
{
   push_spot();
   try
   {
       while ( fsearch("\\\"") )
       {
           if ( blooking_at("\\") )
             continue;

           () = right(2);
           variable new;
           switch ( what_char() )
           { case 'a': new = "�"; }
           { case 'A': new = "�"; }
           { case 'o': new = "�"; }
           { case 'O': new = "�"; }
           { case 'u': new = "�"; }
           { case 'U': new = "�"; }
           { throw ApplicationError, "Unkown sequence"; }

           () = left(2);
           () = replace_chars(3, new);
       }

       pop_spot(); push_spot(); replace("\\3", "�");
       pop_spot(); push_spot(); replace("\\ss ", "�");
       pop_spot(); push_spot(); replace("\\ss{}", "�");
   }
   finally
     pop_spot();
}

define native_utf8()
{
   push_spot();
   try
   {
       while ( fsearch("\\\"") )
       {
           if ( blooking_at("\\") )
             continue;

           () = right(2);
           variable new;
           switch ( what_char() )
           { case 'a': new = "ä"; }
           { case 'A': new = "Ä"; }
           { case 'o': new = "ö"; }
           { case 'O': new = "Ö"; }
           { case 'u': new = "ü"; }
           { case 'U': new = "Ü"; }
           { throw ApplicationError, "Unkown sequence"; }

           () = left(2);
           () = replace_chars(3, new);
       }

       pop_spot(); push_spot();; replace("\\3", "ß");
       pop_spot(); push_spot();; replace("\\glqq", "„");
       pop_spot(); push_spot();; replace("\\grqq", "“");
       pop_spot(); push_spot();; replace("\\glq", "‚");
       pop_spot(); push_spot();; replace("\\grq", "‘");
   }
   finally
     pop_spot();
}

define colon()
{
   try
   {
       while ( fsearch_char(':') )
       {
           if ( andelse {not looking_at(":=")} {not blooking_at("=")}
                {not re_looking_at(": *\\[Ll]eftrightarrow"R)}
                {not re_looking_at(": *\\[Ll]ongleftrightarrow"R)}
                {not blooking_at("\\")} {latex->is_math()} )
           {
               try
               {
                   push_visible_mark();
                   () = right(1);
                   switch ( get_y_or_n("Replace this : by \\colon") )
                   { case 1:
                       () = left(1);
                       () = replace_chars(1, "\\colon");
                       variable ch = what_char();
                       if ( ('A' <= ch and ch <= 'Z') or
                            ('a' <= ch and ch <= 'z') )
                         insert_char(' ');
                   }
               }
               finally
                 pop_mark(0);
           }
           else
             () = right(1);
       }
   }
   catch UserBreakError;
}

define ltx209_ltx2e()
{
   % Fixme: {\bf \tt } is replaced by \textbf\texttt{}
   % Fixme: PCRE
   while ( latex->search_not_commented(&re_fsearch, "\\[beirst][cflmt]"R, 1) )
   {
       variable mark = create_user_mark();
       () = right(1);
       push_mark();
       skip_chars(latex->TeX_Command_Chars);

       variable short, long;
       switch ( bufsubstr() )
       { case "bf": short = "textbf"; long = "bfseries"; }
       { case "em": short = "emph"; }
       { case "it": short = "textit"; long = "itshape"; }
       { case "rm": short = "textrm"; long = "rmfamily"; }
       { case "sc": short = "textsc"; long = "scshape"; }
       { case "sl": short = "textsl"; long = "slshape"; }
       { case "tt": short = "texttt"; long = "ttfamily"; }
       { continue; }

       skip_chars(" \t\n{}");
       push_mark();
       goto_user_mark(mark);
       del_region();

       () = left(1);
       if ( looking_at_char('{') and not latex->is_escaped() )
       {
           insert("\\"+ short);
           push_spot();
           latex->fsearch_matching_brace();
           if ( left(1) and looking_at_char('/') and latex->is_escaped() )
           {
               () = left(1);
               deln(2);
           }
           pop_spot();
       }
       else
       {
           () = right(1);
           % Fixme: Check for \par and use long form
           % push_mark();
           % latex->fsearch_matching_brace();

           insert("\\" + long + " ");
       }
   }
}