#!hs2 #!load hmessage.hsm ####################################################################### # # # GetHeader.hsc (C) Philipp Wendler # # # # Version: 1.3 vom 08.02.2003 philippwendler@web.de # # # ####################################################################### # # # Syntax: # # GetHeader.hsc [ ... ] # # # # Sucht aus dem Artikel mit der die bis # # heraus und schreibt sie in die INI-Datei HScripts.ini im # # Hamsterhauptverzeichnis in die Sektion [PW-GetHeader]. # # Form des INI-Eintrags: # # [PW-GetHeader] # # Header=Inhalt # # # # "Header" besteht dabei aus dem Headernamen ohne Doppelpunkt. # # # ####################################################################### # # # History: # # 1.3 08.03.2002 # # [Chg] Drei repeat-Schleifen durch For-Schleifen ersetzt. # # [!!!] Das Header-Eingeben per InputBox funktioniert jetzt. # # [Chg] Ich verwende jetzt die MsgGetHeader-Funktion aus der # # hmessage.hsm zum Ermitteln des Header-Inhaltes; # # # # 1.2 21.10.2001 # # [Add] Beschreibung der einzelnen Abschnitte des Skriptes, um # # es Lesern leichter zu machen, das Skript zu verstehen. # # [Fix] Der Name des Ini-Eintrages besteht jetzt in jedem Fall # # im Headernamen ohne Doppelpunkt und ohne Leerzeichen. # # [Chg] Maximale Zeilenlaenge ist jetzt 80 Zeichen, fuer den # # Kommentar 72. # # [Add] Wenn keine Parameter angegeben wurden, wird jetzt in # # jeweils einer InputBox nach der MID und einem Header # # gefragt. # # [Add] In den Fehlermeldungen werden jetzt mehr Infos # # gegeben, und im Erfolgsfall wird dies auch ins Log # # geschrieben. # # # # 1.1 08.03.2001 # # [Add] Doku # # [Chg] Header duerfen jetzt auch in der Form "Header: " sein # # # # 1.0 06.03.2001 # # erstes öffentliches Release # # # ####################################################################### # Anmerkung zu den Erlaueterungen der einzelnen Abschnitte: # Ich habe sie geschrieben, weil ich ese den Benutzern des Skriptes zu # ermoeglichen, das Skript zu verstehen. Wer trotzdem noch Fragen hat, # kann mich gerne anmailen: philippwendler@web.de. Bitte vorher jedoch # folgendes beachten: Ich habe nicht erklaert, was die einzelnen # Aufrufe von im Hamster implementierten Funktionen im einzelnen genau # machen. Dies kann jedoch sehr gut in der Hamsterhilfe nachgelesen # werden. Die Namen aller Skript-Befehle sind als Indexpunkte in der # Hilfe markiert und koennen so direkt angesprungen werden. # Mit dem ErrCatch-Befehl schalten wir ein, dass der Hamster das Skript # nicht abbricht, wenn irgendein Fehler auftritt. Das ist notwendig, # weil wir unbedingt noch "Error" in die Ini-Datei schreiben muessen. ErrCatch( 1 ) Var( $MID, $InputBoxText, $Code, $SearchForHeader, $HeaderCount, $GroupHdl, $ArtText ) $SearchForHeader = "" # Jetzt pruefen wir, ob wir alle benoetigten Parameter haben. Zuerst # MID (der Parameter mit der Nummer 1), dann mindestens ein Header. # Wenn nicht, wird solange eine InputBox aufgerufen, bis der Benutzer # eine MID und mindestens einen Header eingibt oder auf Abrechen klickt. # Im letzten Fall wird die Sub Fehler, die weiter unten definiert ist, # mit einem Fehlercode aufgerufen und das Skript beendet. Eine # Erklaerung der Fehlercodes steht in der Sub. if( ParamCount < 1 ) $InputBoxText = "Es wurde keine MID als Parameter angegeben. Bitte geben " _ + "Sie die MID des Postings ein, in dem nach Headern " _ + "gesucht werden soll, oder klicken sie auf ""Abbruch"", "_ + "um das Skript abzubrechen." repeat $MID = Trim( InputBox( $InPutBoxText, "Bitte MID eingeben", "", $Code )) until( ( $MID != "" ) || ( $Code = 0 ) ) if( $Code = 0 ) Fehler( -10 ) quit endif else $MID = ParamStr( 1 ) endif if( ParamCount < 2 ) $InputBoxText = "Es wurde kein Header als Parameter angegeben. Bitte geben"_ + " Sie einen Header ein, der aus dem Posting ausgelesen " _ + "werden soll, oder klicken sie auf ""Abbruch"", um das " _ + "Skript abzubrechen." repeat $SearchForHeader = InputBox( $InputBoxText, "Bitte Header eingeben", _ "", $Code ) until( ( $SearchForHeader != "" ) || ( $Code = 0 ) ) if( $Code = 0 ) Fehler( -11 ) quit endif $HeaderCount = 1 else $HeaderCount = ParamCount - 1 endif # Zuerst werden die entsprechenden Ini-Eintraege (in der HScripts.ini, # Sektion [PW-GetHeader], Name entspricht dem gewollten Header) auf "" # gesetzt. Wir brauchen dazu eine Schleife, die alle Parameter ausser # dem 1. (das ist die MID) durchlaueft. # VarSet( $Index1, 0 ) # while( ( $Index1 + 2 ) <= Paramcount ) # IniWrite( "", "PW-GetHeader", Paramstr( $Index1 + 2), "" ) # inc( $Index1 ) # endwhile Var( $Index1 ) for( $Index1, 2, $HeaderCount+1 ) IniWrite( "", "PW-GetHeader", Paramstr( $Index1 ), "" ) endfor # Hier lesen wir einfach die MID aus dem 1. Parameter aus. Wir koennten # auch immer auf den Parameter zugreifen, aber das erspart uns ein # bisschen Schreibarbeit. # Nun schauen wir nach, ob der Hamster ueberhaupt ein Posting mit dieser # MID hat, und in welcher Gruppe das ist. Var( $GroupName, $ArtNo ) if( HamArtLocateMid( $MID, $GroupName, $ArtNo ) != 0 ) Fehler( -20 ) quit endif # Und jetzt oeffnen wir die Gruppe mit HamGroupOpen, lesen den Text mit # HamArtText aus und fuegen ihn gleichzeitig ihn die Liste $ArtText ein. # Danach schliessen wir die Gruppe dann gleich wieder, wir brauchen sie # nicht mehr. $GroupHdl = HamGroupOpen( $GroupName ) if( $GroupHdl = "" ) Fehler( -30 ) quit endif $ArtText = ListAlloc ListSetText( $ArtText, HamArtText( $GroupHdl, $ArtNo ) ) if( ListCount( $ArtText ) <= 0 ) Fehler( -40 ) quit endif HamGroupClose( $GroupHdl ) # In dieser grossen Schleife lesen wir jeden gesuchten Header aus dem # Posting aus und schreiben ihn in die Ini-Datei. # $Index1 = 0 VarSet( $Index2, 0 ) # Var( $Header, $Part1, $Part2 ) Var( $Part2 ) # Hier lesen wir den gesuchten Header aus dem Parameter aus, wenn er # nicht in der InputBox angegeben wurde. Danach wird ein angehaengtes # Leerzeichen mit der RegExp abgeschnitten und eventuelle Leerzeichen # geloescht. # repeat for( $Index1, 2, $HeaderCount+1 ) if( $SearchForHeader = "" ) # $SearchForHeader = ParamStr( $Index1+2 ) $SearchForHeader = ParamStr( $Index1 ) endif $SearchForHeader = Trim( RE_Extract( $SearchForHeader, "^\s*[^:\s]*" ) ) # In dieser While-Schleife gehen wir jede Zeile des Artikels durch und # schauen, ob der gesuchte Header darin enthalten ist. Wenn ja, dann # wird die Schleife abgebrochen. In $Index2 steht dann die Zeile. # while( $Index2 < ListCount( $ArtText ) ) # $Header = ListGet( $ArtText, $Index2 ) # break( RE_Match( $Header, "^" + $SearchForHeader + ": " ) ) # Inc( $Index2 ) # until( $Header = "" ) # Wenn der Header im Posting gefunden wurde, wird die Zeile am ersten # Doppelpunkt aufgesplittet, sodass $Part2 den Inhalt des Headers # enthaelt. # if( $Header = "" ) # Fehler( -50 ) # else # RE_Split( $Header, ": ", $Part1, $Part2 ) # if( $Part2 = "" ) # Fehler( -60 ) # else $Part2 = MsgGetHeader( $ArtText, $SearchForHeader + ":" ) if( $Part2 = "" ) Fehler( -50 ) else # Jetzt schreiben wir den Header in die Ini-Datei und pruefen gleich # danach, ob es auch geklappt hat. Dann schreiben wir noch eine Zeile # ins Log. IniWrite( "", "PW-GetHeader", $SearchForHeader, Trim( $Part2 ) ) if( IniRead( "", "PW-GetHeader", $SearchForHeader, "" ) != _ Trim( $Part2 ) ) Fehler( -70 ) endif print( "Der Inhalt des " + $SearchForHeader + _ "-Headers im Artikel " + $MID + " ist: " + $Part2 ) # endif endif # Inc( $Index1 ) $Index2 = 0 #until( ( $Index1 + 2 ) > Paramcount ) endfor # Am Schluss muessen wir noch die Liste, die den Artikeltext enthaelt, # freigeben. ListFree( $ArtText ) quit # Diese Sub wird immer dann aufgerufen, wenn irgendein Fehler # aufgetreten ist. Je nach Fehlermeldung werden dann Listen freigegeben # und offene Gruppen geschlossen. Ausserdem schreiben wir in den Ini- # Eintrag, dass ein Fehler ausgetreten ist, und eine Fehlermeldung ins # Log. Sub Fehler( $ErrNo ) # ErrNo ErrDesc # 0 Alles OK # -10 alle Parameter fehlen # -11 kein Header angegeben # -20 MID nicht gefunden # -30 Gruppe konnte nicht geöffnet werden # -40 Artikel nicht vorhanden # -50 gesuchter Header nicht vorhanden # -60 gesuchte Header ist leer # -70 Fehler beim Schreiben in Ini-Datei iif( $GroupHdl = "", 0, HamGroupClose( $GroupHdl ) ) iif( $ArtText = "", 0, ListFree( $ArtText ) ) # Wenn $SearchForHeader nicht leer ist, kann dieser Header nicht, aber # andere Header koennen vielleicht ermittelt werden. Also setzen wir nur # diesen Ini-Eintrag auf "Error". Wenn $SearchForHeader leer ist, ist # das Problem groesser, und es kann kein Header ermittelt werden. Also # muessen die Eintraege fuer alle gesuchten Header auf "Error" gesetzt # werden. If( $SearchForHeader = "" ) VarSet( $Index3, 0 ) # while( ( $Index3 + 2 ) <= Paramcount ) # IniWrite( "", "PW-GetHeader", _ # Trim( RE_Extract( Paramstr( $Index3 + 2), "^\s*[^:\s]*" )), "Error" ) # inc( $Index3 ) # endwhile for( $Index3, 2, ParamCount ) IniWrite( "", "PW-GetHeader", _ Trim( RE_Extract( Paramstr( $Index3 ), "^\s*[^:\s]*" )), "Error" ) endfor else IniWrite( "", "PW-GetHeader", $SearchForHeader, "Error" ) endif # Jetzt schreiben wir eine Fehlermeldung ins Log. Dabei wird mit icase # anhand der Fehlernummer der Beschreibungstext ermittelt. Dieser wird # mit dann zusammen mit der Fehlernummer ins Log geschrieben. Addlog( icase( $ErrNo, _ -10, "Die erforderlichen Parameter ( und
) fehlen!", _ -11, "Der erforderliche Parameter
fehlt!", _ -20, "Die MID " + $MID + " ist nicht im Datenbestand vorhanden!", _ -30, "Die Gruppe " + $GroupName + " konnte nicht geöffnet werden!", _ -40, "Der Artikel " + $MID + " ist nicht im Datenbestand vorhanden!", _ -50, "Der Artikel "+ $MID +" hat keinen " + $SearchForheader + "-Header!", _ -60, "Der " + $SearchForheader + "-Header ist leer!", _ -70, "Beim Schreiben des " + $SearchForheader +_ "-Headers in die Ini-Datei trat ein Fehler auf!", _ else, "Ein unbekannter Fehler trat auf!" ) +_ " (Fehlernummer: " + $ErrNo + ")", 5 ) Endsub