//*********************************************************************
//*                   Quote_Correction 2020-06-04                     *
//*                   >> OnBeforeSavingMessage <<                     *
//*                                                                   *
//* Dieses Script versucht nach bestem Gewissen das Quoting eines     *
//* Artikels und / oder einer Mail zu korrigieren                     *
//*                                                                   *
//* Funktionalitaet: [x] neutral                                      *
//*                  [ ] nur Basis_Modul                              *
//*                  [ ] nur Pathfinder                               *
//*                                                                   *
//* Datum     : 10.11.2006; ueberarbeitet am: 04.06.2020              *
//* Autoren   : Thomas Barghahn                                       *
//*                                                                   *
//* DateiName : _i_OBSaveM_Quote_Correction.ds                        *
//* Einbindung: {$I _i_OBSaveM_Quote_Correction.ds}                   *
//* Aufruf    : Not_Error := Quote_Correction (Not_Error, Message,    *
//*                          IsEmail, Error_Func);                    *
//*********************************************************************


procedure Init_QuoteCorrection ( var ChangeInEmails    : Boolean;
                                 var ChangeInNews      : Boolean
);

begin
//{-------------------------------------------------------------------}
//{                 Anwenderspezifische Einstellungen                 }
//{-------------------------------------------------------------------}

    // change quoting in emails and/or postings
    // set 'true' or 'false'
    ChangeInEmails := true;
    ChangeInNews := true;
    
//{-------------------------------------------------------------------}
//{                       Ende der Einstellungen                      }
//{-------------------------------------------------------------------}
end;

//{===================================================================}
//{           !!!  Ab hier bitte nichts mehr ändern  !!!              }
//{===================================================================}

//--[ START Function Quote_Correction ]---------------------------------


Function Quote_Correction (fbkResult  : Boolean;
                           Message : TStringlist; 
                           IsEmail : boolean;
                           Error_Func : String) : Boolean;

var i, k, H_Lines, MaxInt : integer;
    ChangeInEmails        : Boolean;
    ChangeInNews          : Boolean;
    EventSwitch , Control : Boolean;
    Q_Str, Quote_Space    : String;
    rf                    : TReplaceFlags;
    Space_String          : String;
    Space_Counter         : Byte;
    // WString               : WideString;
    
begin

   // Rückgabewert entsprechend vorheriger Scriptprobleme setzen
   Result := fbkResult;

   // Wenn bereits irgendein Script einen Fehler verursacht hat,
   // dann muss der User benachrichtigt werden
   If not Result Then begin
      WriteToLog ('==== ANFANG =======================================' ,4);     
      WriteToLog ('Script *** Quote_Correction *** wird weiterhin ausgefuehrt' ,4);
      WriteToLog ('Script ' + Error_Func + ' hat diese WARNUNG verursacht!' ,4);
      WriteToLog ('==== ENDE =========================================' ,4);     
   end;   

   If Message.Count > 0 then begin
      rf := [rfReplaceAll];
      MaxInt := 2147483647;
      Control := False;
      H_Lines := 0;
      Init_QuoteCorrection ( ChangeInEmails, ChangeInNews );
      if ((IsEmail=true)  and (ChangeInEmails=true)) or
         ((IsEmail=false) and (ChangeInNews=true)) then begin
         while Message.Strings[H_Lines] <> '' do begin
            H_Lines := H_Lines + 1;
         end;
         Try  
            For i := H_Lines + 1 to ( Message.Count - 1 ) do begin
               Space_Counter := 0;
               Quote_Space := ' ';
               Space_String := '';
               Q_Str := '';
               k := 1;
               Message.Strings[i] := TrimRight(Message.Strings[i]);
               if length (Message.Strings[i]) > length (TrimLeft (Message.Strings[i])) then begin
                  Space_String := copy (Message.Strings[i], 1, length (Message.Strings[i]) - 
                                  length (TrimLeft (Message.Strings[i])));
                  Message.Strings[i] := TrimLeft (Message.Strings[i]);
               end; // if   
               if (copy ( Message.Strings[i], 1, 1 ) = '>') or 
                  (copy ( Message.Strings[i], 1, 1 ) = '|') then begin
                  Message.Strings[i] := StringReplace ( Message.Strings[i], '>  >', '>>', rf);
                  Message.Strings[i] := StringReplace ( Message.Strings[i], '|  |', '||', rf);
               end; // if   
               If Message.Strings[i] = '--' then
                  Message.Strings[i] := '-- ';
               If Message.Strings[i] = '-- ' then Break;
               if (pos('>',Message.Strings[i]) = 1) or
                  (pos(':',Message.Strings[i]) = 1) then begin
                  If Control = True then
                     WriteToLog (IntToStr(length ( Message.Strings[i])) + ' ++1++',3);
                  repeat
                     EventSwitch := True;
                     if (( Message.Strings[i][k] ) = '>') or 
                        (( Message.Strings[i][k] ) = '|') or 
                        (( Message.Strings[i][k] ) = ' ') then begin
                        Q_Str := Q_Str + Message.Strings[i][k];
                        If Message.Strings[i][k] = ' ' then
                           Space_Counter := Space_Counter + 1
                        else
                           Space_Counter := 0;   
                        If Control = True then
                           WriteToLog (Q_Str + ' ' + IntToStr(k) + ' ++2++', 3);
                        EventSwitch := false;
                     end; // if
                     k := k + 1;
                  until ( k = length ( Message.Strings[i]) + 1) or ( EventSwitch = true ) or
                        (Space_Counter = 2);
                  k := k - 1;
                  If Control = True then
                     WriteToLog ('Ich bin hier k=' + IntToStr(k), 3);
                  If ( length ( Message.Strings[i] ) = k) and
                            ((( Message.Strings[i][k] ) = '>') or 
                             (( Message.Strings[i][k] ) = '|') or
                             (( Message.Strings[i][k] ) = ' ')) then begin
                     Message.Strings[i] := '';
                     Q_Str := '';
                     Quote_Space := '';
                  end;                                                  
                  If length ( Message.Strings[i] ) >= k then begin
                     Message.Strings[i] := copy ( Message.Strings[i], k, MaxInt);
                     If Control = True then
                        WriteToLog ( Message.Strings[i] + ' ++3++', 3);
                  end;   
                  Q_Str := StringReplace ( Q_Str, ' ', '', rf);
                  Q_Str := StringReplace ( Q_Str, '>|', '> |', rf);
                  Message.Strings[i] := Q_Str + Quote_Space + Message.Strings[i];
                  If pos (':', Q_Str) > 0 then begin
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': -)', ' :-)', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': -|', ' :-|', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': -]', ' :-]', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': -[', ' :-[', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': )', ' :)', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': Þ', ' :Þ', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': o)', ' :o)', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': -(', ' :-(', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': -O', ' :-O', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': -P', ' :-P', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': -/', ' :-/', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': -\', ' :-\', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': o(', ' :o(', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': ´-)', ' :´-)', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': ´-(', ' :´-(', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': -D', ' :-D', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': *)', ' :*)', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': )', ' :)', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': ]', ' :]', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': }', ' :}', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': (', ' :(', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': -p', ' :-p', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': -b', ' :-b', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': x)', ' :x)', rf));
                     Message.Strings[i] := TrimLeft (StringReplace ( Message.Strings[i], ': ->', ' :->', rf));
                  end; // if
                  If Control = True then
                     WriteToLog ( Message.Strings[i] + ' ++4++', 3);   
               end; // if
               If (length (Message.Strings[i]) + length (Space_String)) > length (Space_String) then 
                  Message.Strings[i] := Space_String + Message.Strings[i]
               else Message.Strings[i] := '';     
            end; // for
         Except
            // Bei Problemen den User benachrichtigen.
            begin
               WriteToLog ('FEHLER im Script *** Quote_Correction ***' ,4);
               WriteToLog ('From : ' + GetHeader('From: ', Message), 4);
               WriteToLog ('Newsgroups : ' + GetHeader('Newsgroups: ', Message), 4);
               WriteToLog ('Date : ' + GetHeader('Date: ', Message), 4);
               WriteToLog ('Message-ID : ' + GetHeader('Message-ID: ', Message), 4);
               Error_Func := '*** Quote_Correction ***';    
               Result := false;
            end; // Except  
         end; // Try ... Except            
      end; // if 
   end; // if
end; // Function

//--[ ENDE Function Quote_Correction ]----------------------------------