[?] strip tags programm



  • Hallo Leute.

    Hier ist mal die erste version des stripBBTags Programm:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(int argc, char* argv[])
    {
      char buffer[1024];
      char* memory = NULL;
      size_t size=0, length;
      while(length=fread(buffer, 1, sizeof(buffer), stdin))
      {
        memory=realloc(memory, size+length);
        memcpy(memory+size, buffer, length);
        size+=length;
        if(length!=sizeof(buffer)) break;
      }
    
      {
        size_t i=0;
    loop:
        while(i<size)
        {
          size_t j;
          for(j=1; j<argc; ++j)
          {
            size_t argvLength=strlen(argv[j]);
            if(!strncmp(memory+i, argv[j], argvLength))
            {
              i+=argvLength;
              goto loop;
            }
          }
          putchar(memory[i]);
          ++i;
        }
      }
      free(memory);
    }
    

    es liest alles ein was es von stdin bekommt, strippt die tags (die als argv übergeben werden, man beachte: um [ b ]-tags zu strippen muss man [ b ] und [ /b ] übergeben) und schreibt alles nach stdout.

    lustig wäre jetzt noch eine konfortablere variante. praktisch wäre es, wenn das programm den text aus der zwischenablage ausliest und dann wieder dort rein schreibt... ich habe aber momentan nicht genug zeit 😞

    ich versuche aber welche zu finden 🙂

    PS: ja ich weiss, dass es keinen schönheitspreis gewinnen wird



  • Also, für Text in Zwischenablage packen hätte ich Code - aber keine Ahnung, ob du den verwenden kannst. 😞
    Hier isser trotzdem, vielleicht geht es ja:

    // ------------------------------------------------------------------------------------------------
    // Legt den gegebenen Text in die Zwischenablage
    // ------------------------------------------------------------------------------------------------
    void CSortListCtrl::CopyToClipboard(CString& f_strText)
    {
    	if(OpenClipboard())
    	{
    		// Leermachen
    		EmptyClipboard();
    
    		// Speicher reservieren (incl. \0)
    		HGLOBAL hCpDaten = GlobalAlloc(GMEM_DDESHARE, f_strText.GetLength() + 1);
    
    		// Daten in systemweiten Speicher schieben
    		char* pchData = (char*)GlobalLock(hCpDaten);
    		strcpy(pchData, LPCSTR(f_strText));
    
    		// Für andere zur Verfügung stellen
    		GlobalUnlock(hCpDaten);
    
    		// Daten in die Zwischenablage schieben
    		SetClipboardData(CF_TEXT, hCpDaten);
    
    		// Fertig
    		CloseClipboard();
    	}
    }
    

    Wie man den da raus bekommt, sollte aber rausfindbar sein.
    Soll ich parallel zu dir mal nachforschen?

    Sag am besten erstmal, ob du den Schnipsel da oben verwerten kannst, dann weiß ich, ob ich alles machen muss oder nur den Schnipsel für Zwischenablage auslesen. 🙂



  • ich wollte mir das heute ansehen, bin aber leider gescheitert weil ich beim schnellen googlen nur mfc code fand.

    meine idee des windows front ends wäre ja folgendes:

    Clipboard Daten auslesen
    stripBBTags über die kommandline aufrufen
    ausgabe von stripBBTags speichern
    Daten in Clipboard schreiben
    

    der aufwand ist vermutlich minimal. kannst du das schnell hacken? wenn du mfc verwendest, wäre eine binary super da nicht jeder mfc hat um es selber zu kompilieren...

    danke



  • Ich habe jetzt nur ein Verständnisproblem. 😞
    Wie gebe ich deinem Programm die Daten und wo kriege ich sie wieder? 😕

    Wäre es ein großer Aufwand für dich, dein Programm in eine Funktion zu wandeln, die einen nullterminierten String bekommt und den umwandelt? 🙂
    Dann würde ich die einfach rüberkopieren und verwenden. Außerdem hat man dann nicht zwei Exen.

    Das mit dem Clipboard auslesen sollte ich noch rausfinden.

    Und dass ihr eine Exe bekommt ist doch logisch. 🙂 Den Code lade ich nur hoch, damit er noch woanders als auf meiner Platte liegt.



  • estartu_de schrieb:

    Ich habe jetzt nur ein Verständnisproblem. 😞
    Wie gebe ich deinem Programm die Daten und wo kriege ich sie wieder? 😕

    Linux Style:

    das Programm liest stdin ein und gibt nach stdout aus.
    die ausgabe erfolgt sobald stdin ein EOF gelesen. also in der win32 konsole zB Strg+Z gedrückt wurde, unter linux strg+d IIRC

    Wäre es ein großer Aufwand für dich, dein Programm in eine Funktion zu wandeln, die einen nullterminierten String bekommt und den umwandelt? 🙂

    jo, mach ich. ka bis wann, aber die signatur wird folgende sein:

    void stripBBTags(char const* text, char const* tags[]);
    

    tags ist ein string array dass die einzelnen tags beinhaltet, also zB momentan [ kor ] und [ /kor ]



  • Wodurch ist das Array getrennt?
    Also, wenn ich dir da ein CStringArray anbiete, wird das wohl gegen den Baum gehen. 😉

    \0 oder Leerzeichen?

    Sorry, wenn ich so blöde frage, aber ich kann echt nur noch MFC.



  • Nabend,

    ich hab ein kleines Prograemmchen in C++/Gtkmm geschrieben. Das ist nur ein kleines
    Fenster, wo man die Tags, die gefiltert werden sollen, eintragen kann und dann einen
    Button "Strip BB-Tags and Copy Back" klicken kann. Sprich, man kopiert vorher normal
    mittels strg+c, traegt die tags ein, die entfernt werden sollen und klickt auf den
    Button. Dann einfach mit strg+v wieder einfuegen und der Text sollte tagfrei sein.

    Ich weiss noch nicht 100%ig, ob es einwandfrei funktioniert. Bei kleineren Tests
    tut es das.

    http://ahrlug.dyndns.org/christian/stripbbtags.rar

    Da ist der Quellcode. Bitte beachtet die 'helpfunctions' nicht sonderlich, da bin ich
    ein bissle am rumprobieren ;).

    Falls es jemand nicht uebersetzen mag:

    http://ahrlug.dyndns.org/christian/stripbbtagsbin.rar

    Hier eine Binary. Die Runtime von Gtkmm muss allerdings installiert sein
    (logischerweise).

    Probiert es einfach mal aus. Der Code ist natuerlich nicht der sauberste ;).

    [edit]
    Die Tags werden per Semikolon getrennt eingegeben. Bitte keine Leerzeichen zwischen
    den Tags, also nicht:

    [ b]; [/ b]
    

    sondern

    [ b];[/ b]
    

    Sicherlich kann man das beheben, ich hab den Code allerdings auch mehr schnell
    runtergeschrieben, daher hab ich solche Feinheiten nicht beachtet.
    [/edit]

    mfg
    v R



  • gtkmm? sorry aber warum?
    ich will das nicht installieren.

    ich hab doch schon den code geschrieben, da braucht man nichts mehr testen - das ding laeuft...

    die funktion sieht dann etwa so aus:

    void stripBBTags(char const* text, char* output, int tagcount, char const* tags[])
    {
        size_t i=0;
        size_t size=strlen(text);
    loop:
        while(i<size)
        {
          size_t j;
          for(j=1; j<tagcount; ++j)
          {
            size_t length=strlen(tags[j]);
            if(!strncmp(text+i, tags[j], length))
            {
              i+=length;
              goto loop;
            }
          }
          *output++=text[i]);
          ++i;
        }
      }
      *output=0;
    }
    

    das ist jetzt ungetestet, aber der algo ansisch ist richtig



  • Shade Of Mine schrieb:

    gtkmm? sorry aber warum?
    ich will das nicht installieren.

    Niemand zwingt dich dazu. Ich habs nunmal drauf und um mir die Sache leichter zu machen,
    habe ich mir das kleine Programm geschrieben.

    Text makieren, strg+c, Button klicken, strg+v, fertig.

    Ob man das nun so macht oder den Text in die Standardeingabe kopiert etc. ist ja Jacke
    wie Hose.

    mfg
    v R



  • virtuell Realisticer schrieb:

    Niemand zwingt dich dazu. Ich habs nunmal drauf und um mir die Sache leichter zu machen,
    habe ich mir das kleine Programm geschrieben.

    ja, aber wozu GUI? sinnloser aufwand... und eine non-gtkmm version muss man sowieso machen. denn wer hat schon gtk installiert unter windows?



  • Ich :p

    [BTW. Ich arbeite wieder und bin dannach meistens zu fertig noch etwas zu tun, also nicht wundern wenn ich nicht mehr soviel schreibe.]

    BR



  • mich stört halt dass ich mir arbeit mache und auch genau sage was ich mir wünsche und dann macht jemand etwas ganz eigenes. dann muss ich mich ja nicht hinsetzen.

    zumal jedesmal die tags händisch eintragen ja auch nicht der weisheit letzter schluss ist 😉

    aber macht wie ihr wollt - wenn ihr es so wollt, macht es so.



  • Shade Of Mine schrieb:

    mich stört halt dass ich mir arbeit mache und auch genau sage was ich mir wünsche und dann macht jemand etwas ganz eigenes. dann muss ich mich ja nicht hinsetzen.

    zumal jedesmal die tags händisch eintragen ja auch nicht der weisheit letzter schluss ist 😉

    aber macht wie ihr wollt - wenn ihr es so wollt, macht es so.

    Ich meine mich erinnern zu koennen, dass du gesagt hast, dass es z. B. praktisch waere,
    die Daten aus der Zwischenablage nehmen zu koennen. Das ist mit C++ an sich schlicht
    nicht moeglich, also muss ich auf etwas zurueckgreifen womit ich das machen kann.

    Von MFC oder WinAPI habe ich keine Ahnung, von daher kam nur Gtkmm fuer mich in Frage.

    Es geht nicht darum, deine Arbeit nicht zu wuerdigen, ich glaube wir alle hier wissen,
    dass du dir viel Arbeit machst.

    Es ist doch letztlich auch voellig egal, was nun eingesetzt wird. Hauptsache der Text
    ist danach Tagfrei. Wir koennen aber auch gerne bei deiner Variante bleiben, wie
    bereits gesagt, mir ist das Jacke wie Hose was ich nun einsetze.

    mfg
    v R



  • Ganz ruhig ihr beiden. 🙂

    Da ich mir das gtk-Dingsda nicht auf meinem Arbeitspc installieren möchte (der is schon instabil, da installiere ich so wenig wie möglich), werde ich mich sobald ich Zeit finde an den Teil mit "Daten aus Zwischenablage machen" und dann ist es ja nur noch zusammenbauen.



  • Shade? Kannst du bitte mal ein Beispiel geben, wie ich deine Funktion aufrufen soll?
    Ich habe:

    char *pchData = (char*)GlobalLock(hClipboardData);
    		char *pOut = NULL;
    		char pTags[] = "[kor],[/kor]";
    
    		stripBBTags(pchData, pOut, 2, pTags);
    

    Und bekomme beim Aufruf diesen Fehler:

    error C2664: 'CStripTagsApp::stripBBTags': Konvertierung des Parameters 4 von 'char [13]' in 'const char *[]' nicht möglich
    

    Danke 🙂
    Sonst bin ich soweit fertig...



  • estartu_de schrieb:

    Shade? Kannst du bitte mal ein Beispiel geben, wie ich deine Funktion aufrufen soll?

    Wie argv.

    ich dachte an ein array aus strings, also
    char* tags[]={"***", "***"};

    und pOut sollte genug speicher haben, mindestens soviel wie strlen(data)+1

    ist halt C code



  • Ähhhhhh, Leute... ich habe mir gerade das oben durchgelesen und eigentlich nix verstanden, deshalb äußere ich einfach mal meinen Wunsch, eine Exe Datei zu haben (am besten ein Windoofdialog), in den ich den Fullquote (allerdings ohne das erste und das letzte quote) einfüge (per STRG + C), auf einen Button klicke und den Text ohne ein einziges [kor]-Tag wieder herausnehmen kann, ohne vorher irgendwie eintippen zu müssen, welche Tags er wegmachen soll, denn das einzige Tag, was das Programm entfernen soll, IST doch nur [kor], oder nicht?

    Mr. B

    Edit: Das Programm sollte dann einer in für Windows und einer für Linux schreiben.



  • Mr.B, keine Sorge das Winprogramm ist durch mich in Arbeit. 🙂

    Text in die Zwischenablage holen, Programm aufrufen, gestrippten Text im forum pasten - fertig.
    Da ein Dialog für dich und mich zusätzliche Arbeit wäre hab ich den Schritt weggelassen. 😉
    Ich paste in eine Variable, rufe Shades Funktion auf und kopiere das Ergebnis wieder in die Zwischenablage.

    @Shade, danke - das war mein Gedankenhänger. Es ist einfach alles so lange her. 🙄
    Es klappt aber trotzdem nicht. 😞

    char *pchData = (char*)GlobalLock(hClipboardData);
    		char* pOut = new char[strlen(pchData)+1];
    		char* pTags[] = {"[kor]","[/kor]"};
    
    		stripBBTags(pchData, pOut, 2, pTags);
    
    error C2664: 'CStripTagsApp::stripBBTags': Konvertierung des Parameters 4 von 'char *[2]' in 'const char *[]' nicht möglich
    


  • estartu_de schrieb:

    Mr.B, keine Sorge das Winprogramm ist durch mich in Arbeit. 🙂

    Text in die Zwischenablage holen, Programm aufrufen, gestrippten Text im forum pasten - fertig.
    Da ein Dialog für dich und mich zusätzliche Arbeit wäre hab ich den Schritt weggelassen. 😉
    Ich paste in eine Variable, rufe Shades Funktion auf und kopiere das Ergebnis wieder in die Zwischenablage.

    @Shade, danke - das war mein Gedankenhänger. Es ist einfach alles so lange her. 🙄

    gut, wo gibts die exe zu holen? 🙂

    Mr. B



  • Wenn Sie sich endlich compilieren lässt (und tut, was sie soll, das konnte ich noch nicht testen), dann poste ich hier den Link. 🙂


Anmelden zum Antworten