Roadster: Seiteneingaben in externer Datei speichern nur mit JS?

Hallo miteinander!

Ich habe mich schonmal ein wenig eingelesen, aber so wirklich gefunden, was ich suche, habe ich bislang noch nicht, weshalb ich mich mal wieder an euch wende, die ihr mir schon so oft und so erfolgreich weitergeholfen habt! :)

Wie schon bei einigen meiner vergangenen Anfragen hier im Forum ist die Spezialität meiner Seite Auslöser für Probleme, die normalerweise keine wären, insbesondere aufgrund des Umstands, das die Seite eigentlich gar keine richtige 'Web'-seite, sondern ein in erster Linie lokal genutztes Programm ist, dass vom Datenträger gestartet wird und lediglich den Browser als Darstellungsmedium benutzt. (Zumindest vorläufig...)

Bei dem Programm handelt es sich im weitesten Sinne um eine Lernsoftware für mein Studienfach, welches ungünstigerweise Jura ist. Das bedeutet, die Seite, bzw. das Programm ist vom Inhalt her extrem Textlastig, und darüber hinaus auch kleinteilig und umfangreich - man denke nur an die ganzen Paragraphen!

...und da liegt das Problem, bzw. der Ansatz für meine Frage:

Ist es möglich, _nur_ mit JavaScript und ohne online sein zu müssen der Seite eine Funktion hinzuzufügen, die es ermöglicht, Eingaben in einem Text-Feld auszulesen und _dauerhaft_ zu speichern? Ich würde nämlich gerne den Vorgang des Hinzufügens von content auf der Seite etwas erleichtern. - Das heißt, im Prinzip müsste es eine Funktion sein, wie hier im Forum bspw., wo man Text in ein Textfeld eingibt, der dann dauerhaft gespeichert wird (und nicht nur für die jeweilige Session im Browser-Cache)!

Es gäbe sicher einige Leute in meinem Umfeld, die zu meinem Projekt inhaltlich beitragen würden, die aber mit Programmierung absolut nichts am Hut haben und da wäre es extrem vorteilhaft, wenn man in dem Programm/der Seite selbst eine Funktion hätte, Inhalte an der entsprechenden Stelle hinzuzufügen und in einer Datei abzuspeichern (von wo aus man sie wieder ins Programm laden könnte), ohne dass dabei im Code herumgewühlt werden müsste.

Dass man mit JavaScript aus verständlichen Sicherheitsgründen nicht so einfach auf die Festplatte des Users zugreifen kann ist mir klar, aber es müsste doch möglich sein, das Ganze z.B. so zu machen, dass wenn man den Text im Eingabefeld eingegeben hat, man auf den dazugehörigen Bestätigen-Button drückt und damit quasi das 'Einverständnis zum Speichern' gibt, ggf. noch mit einer [speichern unter] Anzeige, - eben wie wenn man etwas downloaded...aber wie könnte man das bewerkstelligen? Habe wie gesagt schon einiges dazu gelesen, aber konnte leider noch keinen Durchbruch verzeichnen...

function saveButtonFunction(){  
var input=document.getElementById("textAreaFiftyOne")  
var inputValue=input.value;  
  
/* ??? ??? ??? */  
  
}

Falls jemand mir dazu ein Schnippsel posten könnte, einen passenden link, oder mir sonst sachdienliche Hinweise zukommen lassen würde, sei ihm oder ihr recht viel gedankt! ;)

Beste Grüße,

Roadster.

  1. moin,

    Falls jemand mir dazu ein Schnippsel posten könnte, einen passenden link, oder mir sonst sachdienliche Hinweise zukommen lassen würde, sei ihm oder ihr recht viel gedankt! ;)

    Das hier tut mit FileSaver.js, nutzt also die File-API zum Laden und Speichern unter... von Offline-Daten.

    Viel Spaß mit dem Thema, sei Dir klar darüber, dass ein Benutzer aktiv werden muss, d.h., er muss immer erst eine Datei auswählen, bevor Inhalte im Browser zu sehen sind.

    Wegen dem Dateiformat guck mal, ob es mittlerweile JS-Serializer gibt, für meine Anwendungen habe ich mir was einfallen lassen, was sogar das Speichern von Bildern, Audio und Video zusammen mit Texten ermöglicht.

    MfG

  2. Ist es möglich, _nur_ mit JavaScript und ohne online sein zu müssen der Seite eine Funktion hinzuzufügen, die es ermöglicht, Eingaben in einem Text-Feld auszulesen und _dauerhaft_ zu speichern?

    Es gibt local storages das hilft dir aber vermutlich nicht weiter, da diese 1. begrenzten Speicherplatz haben und 2. im jeweiligen Browser gespeichert werden.
    Vieleicht hilft dir ein Server auf einem USB-Stick weiter?

  3. Hallo,

    Wie schon bei einigen meiner vergangenen Anfragen hier im Forum ist die Spezialität meiner Seite Auslöser für Probleme, die normalerweise keine wären, insbesondere aufgrund des Umstands, das die Seite eigentlich gar keine richtige 'Web'-seite, sondern ein in erster Linie lokal genutztes Programm ist, dass vom Datenträger gestartet wird und lediglich den Browser als Darstellungsmedium benutzt. (Zumindest vorläufig...)

    Bei dem Programm handelt es sich im weitesten Sinne um eine Lernsoftware für mein Studienfach, welches ungünstigerweise Jura ist. Das bedeutet, die Seite, bzw. das Programm ist vom Inhalt her extrem Textlastig, und darüber hinaus auch kleinteilig und umfangreich - man denke nur an die ganzen Paragraphen!

    Bist du dir sicher, dass deine Problematik so speziell ist, dass da niemand anderes bisher ein Programm für geschrieben hat? Beschreib doch mal was deine Anforderungen sind, vielleicht kennt jemand was für dich.
    Es sei denn, du möchtest unbedingt selbst was programmieren...

    Mir fallen spontan Mindmappingprogramme ein, die vermutlich deine Texte prima speichern könnten. Suche und Kategorien sind da im Normalfall mit bei. Vokabellernsoftware gibts dann auch noch.

    Was hast du dir denn im Vorfeld angeschaut und aus welchen Gründen verworfen?

    Gruß
    Kalk

  4. Aloha ;)

    Da stehst du jetzt vor einem Problem. Leider ist es so, dass die einzige (mir bekannte, imho kenn ich aber alle) Möglichkeit zur persistenten Speicherung von Daten allein durch JavaScript die folgenden sind:

    • URI-Missbrauch - Speichern des Inhalts in GET-Parametern und Abspeichern des Links
    • Cookies - Inhalt in Cookie speichern und während dessen Lebensdauer verfügbar haben

    Das ist aber beides sicher nicht das, was für dich praktikabel ist. Schon allein deshalb, weil diese persistente Speicherung nicht auf Ebene der Seite, sondern auf dem Client des einzelnen Anwenders passiert.

    Vorschlag: machs lieber gleich richtig. Das ist kein Hexenwerk. Und allzu viel können muss man für einfache Anwendungen (insbesondere für solche, die nicht online verfügbar sind) auch nicht. Du brauchst dafür nur einen Server lokal bei dir auf dem Rechner - meine Wahl ist da immer der xampp. xampp gibts sogar portabel. Für so ganz so einfache Sachen brauchst du eigentlich nicht mal so viel wie der xampp kann, ist aber egal.

    Jedenfalls: xampp einfach installieren, dann deine Seite im Ordner htdocs ablegen (was da schon drin ist kannst du löschen) und deine Seite in Zukunft über http://localhost abrufen. Für deine Seite ändert sich dabei nichts. Das Speichern übernimmt ein einfaches PHP-Skript save.php, in dem steht:

    <?php  
        if (!isset($_POST['content']) OR !isset($_POST['filename'])) die;  
      
        $content = $_POST['content'];  
      
        $filename = 'saves/'.$_POST['filename'];  
      
        $i = 0;  
      
        while (is_file($filename.$i)) {  
            $i++;  
        }  
      
        file_put_contents($filename.$i.'.txt',$content);  
      
        header('Location: ' . $_SERVER['HTTP_REFERER']);  
      
    ?>
    

    Natürlich musst du den Ordner saves zunächst noch anlegen. Dann kannst du ein Speichern von Inhalten als Textdate ganz einfach dadurch auslösen, dass du ein Formular mit den Feldnamen content und filename per POST nach save.php schickst. Oder durch folgende JS Funktion (nicht-optimiert, klar):

    function save(content,filename) {  
        var xhr = new XMLHttpRequest();  
      
        xhr.open('POST','save.php',true);  
      
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");  
      
        xhr.send('content='+urlencode(content)+'&filename='+urlencode(filename));  
      
    }
    

    Was xhr ist, kannst du bei Interesse auf Wikipedia nachlesen. Codebeispiele sind nicht getestet, laufen aber hoffentlich (sonst meldet sich sicher jemand mit Korrekturen). Natürlich sind das Minimalbeispiele für ganz grundlegende Funktionalität.

    Grüße,

    RIDER

    --
    Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
    ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
    1. Aloha ;)

      Hallo RIDER :)

      Also nochmal Danke für den Tip!

      Habe XAMPP installiert, bin deinen Anweisungen gefolgt und es funktioniert! (Auch wenn, wie du bereits angedeutet hast, die Funktionalität von XAMPP über meine bescheidenen Bedürfnisse 'weit' hinausgeht, und eine noch 'simplere', auf die tatsächlichen Erfordernisse beschränkte Methode natürlich wünschenswert wäre. ;)

      ...Codebeispiele sind nicht getestet, laufen aber hoffentlich (sonst meldet sich sicher jemand mit Korrekturen)...

      Da hätte ich tatsächlich was:

      urlencode(blafasel); sollte besser encodeURI(blafasel) heißen.

      Ansonsten perfekt!

      Nochmal Danke und

      beste Grüße,

      Roadster.

      1. Aloha ;)

        Da hätte ich tatsächlich was:

        urlencode(blafasel); sollte besser encodeURI(blafasel) heißen.

        Jaaa, die Funktionennamen aus PHP und JavaScript hüpfen bei mir im Hirn bisweilen durcheinander :D

        Ansonsten perfekt!

        Schön, wenn es dir dient ;)

        Grüße,

        RIDER

        --
        Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
        ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
        1. Aloha ;)

          Hallo RIDER :)

          Ein frohes Fest wünsche ich!

          Eine Frage hätte ich dann doch noch - zu dem von dir geposteten PHP-Schnippsel. ;)

              $i = 0;  
            
              while (is_file($filename.$i)) {  
                  $i++;  
              }  
            
              file_put_contents($filename.$i.'.txt',$content);
          

          Der Sinn dieses Abschnitts erschließt sich mir nicht wirklich. Das sorgt in der geübten Praxis dafür, dass an den Dateinamen, den ich der Variable (filename) in der vorgeschalteten JavaScript-Funktion mit auf den Weg gebe, eine 0 drangehängt wird;

          Führe ich die Funktion mit der selben Variablen für (filename) jedoch mehrmals aus, wird mitnichten jedesmal eine neue Datei angelegt mit ansteigender Zahl am Ende des Dateinamens, sondern es bleibt bei filename0 - nur das der Inhalt der Datei bei jedem Funktionsaufruf neu überschrieben wird!

          Wenn aber nun bei gleichbleibendem Variablenwert für (filename) ohnehin immer nur der Inhalt der bestehenden Datei überschrieben wird, - warum dann überhaupt eine 0 an den Dateinamen dranhängen???

          Du hattest mir ja mal für JavaScript den folgenden Code gepostet, damit ich meine dynamisch erstellten Seiten-Elemente auch dynamisch benennen kann:

          var n=0;  
            
          while(document.getElementById("divID"+n)!=null) {n++;}  
            
          div.id="divID"+n;
          

          Das funktioniert natürlich 1:1 nur bei document.elements, nicht bei Variablen-Benennungen, denn worauf sollte man bei einer Variablen in while(bedingung) referenzieren?

          Also, wollte ich nun für jede Eingabe eine neue Datei erstellen, müsste ich entweder VOR der Übergabe der Variable für den Dateinamen an save(content,filename){/* ... */} mit einer irgendwie angepassten JS-Funktion wie der da oben aus "filename"; sowas wie "filename"+x; machen, oder es müsste die PHP-Funktion entsprechend angepasst werden, oder?

          ...und gemäß dem Fall, ich wollte die jeweiligen input/textarea-Einträge nacheinander in der SELBEN Datei speichern, müsste ich doch wohl sowas wie das hier vorschalten:

          var request = new XMLHttpRequest();  
          request.open("get","saves/save.txt");  
          request.send();  
          request.addEventListener("load", function (e) {  
             var text = e.target.responseText;  
          });
          

          und dann beim Senden:

          var textAreaValue = textArea.value;  
            
          var content = text + textAreaValue;  
            
          save(content,filename);
          

          oder wenigstens so ähnlich...?

          Etwas Aufklärung wäre sehr willkommen! :)

          PS: Ich nehme an, es gibt auch in PHP keinen Befehl, der in der Ausgabedatei einen Zeilenumbruch à la <br> erzeugt, oder?

          var row1="In JS muss ja für jede Zeile ";  
            
          var row2="ein neuer String angelegt werden... ";  
            
          var row3="...leider!";
          ~~~ ;)  
            
          Soweit,  
            
          nochmals Dank und Gruß,  
            
          Roadster.
          
          1. Hallo

            Eine Frage hätte ich dann doch noch - zu dem von dir geposteten PHP-Schnippsel. ;)

            $i = 0;

            while (is_file($filename.$i)) {
                    $i++;
                }

            file_put_contents($filename.$i.'.txt',$content);

            
            >   
            > Der Sinn dieses Abschnitts erschließt sich mir nicht wirklich. Das sorgt in der geübten Praxis dafür, dass an den Dateinamen, den ich der Variable `(filename)`{:.language-javascript} in der vorgeschalteten JavaScript-Funktion mit auf den Weg gebe, eine `0`{:.language-javascript} drangehängt wird;  
              
            Nein. Die Bedingung in while prüft, ob es Dateinamen nach dem Schema „Inhalt der Variable `$filename`{:.language-php} gefolgt von einer oder mehreren Ziffern“ gibt. Wenn ja, dass wird `$i`{:.language-php} hochgezählt und erneut geprüft ob es eine Datei nach der formulierten Bedingung gibt.  
              
            
            > Führe ich die Funktion mit der selben Variablen für `(filename)`{:.language-javascript} jedoch mehrmals aus, wird mitnichten jedesmal eine neue Datei angelegt mit ansteigender Zahl am Ende des Dateinamens, sondern es bleibt bei `filename0`{:.language-javascript} - nur das der Inhalt der Datei bei jedem Funktionsaufruf neu überschrieben wird!  
              
            Klar, mit [file_put_contents](http://www.php.net/file_put_contents) wird der spezifizierte Inhalt in die spezifizierte Datei geschrieben. Wenn da immer der selbe Namen drin steht, wird auch immer die selbe Datei befüllt.  
              
            
            > Wenn aber nun bei gleichbleibendem Variablenwert für `(filename)`{:.language-javascript} ohnehin immer nur der Inhalt der bestehenden Datei überschrieben wird, - warum dann überhaupt eine `0`{:.language-javascript} an den Dateinamen dranhängen???  
              
            Was passieren soll, ist vermutlich, dass für die ersten übergebenen Daten `$filename."0.txt"`{:.language-php} erzeugt und beschrieben wird. Beim nächsten Aufruf wird der selbe Dateiname erzeugt, dann geprüft, ob es im Dateisystem bereits eine Datei mit dem Namen `$filename."0.txt"`{:.language-php} gibt. Gibt es die, wird ja $i um 1 hochgezählt und der neu übergebene Inhalt in `$filename."1.txt"`{:.language-php} geschrieben. Der nächste Aufruf soll `$filename."2.txt"`{:.language-php} erzeugen und so weiter und so fort.  
              
            `is_file($filename.$i)`{:.language-php} und `file_put_contents($filename.$i.'.txt',$content)`{:.language-php} sprechen aber unterschiedliche Dateinamen an. Bei is\_file fehlt die Dateiendung. Die Prüfung auf den Namen `$filename.$i.'.txt'`{:.language-php} schlägt mit `$filename.$i`{:.language-php} halt nie an, womit der Zähler `$i`{:.language-php} brav bei „0“ bleibt.  
              
            
            > PS: Ich nehme an, es gibt auch in PHP keinen Befehl, der in der Ausgabedatei einen Zeilenumbruch à la `<br>`{:.language-html} erzeugt, oder?  
              
            Wenn da schon ein Zeilenumbruch da ist, kann man den mit [nl2br](http://www.php.net/nl2br) auch für HTML aufpeppen.  
              
            Tschö, Auge  
            
            -- 
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.  
            Terry Pratchett, "Wachen! Wachen!"  
              
            ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}  
              
            [Veranstaltungsdatenbank Vdb 0.3](http://termindbase.auge8472.de/)
            
            1. Hallo

              Hallo Auge :)

              is_file($filename.$i) und file_put_contents($filename.$i.'.txt',$content) sprechen aber unterschiedliche Dateinamen an. Bei is_file fehlt die Dateiendung. Die Prüfung auf den Namen $filename.$i.'.txt' schlägt mit $filename.$i halt nie an, womit der Zähler $i brav bei „0“ bleibt.

              Jau! is_file($filename.$i.'.txt') schreiben und es wird für jede Eingabe eine neue Datei angelegt; das funktioniert!

              Danke für den Hinweis!

              Gruß,

              Roadster.

              1. Hallo miteinander!

                Mir sind noch ein paar Dinge eingefallen, zu dem was hier im Thread besprochen wurde und auch generell, bezüglich derer der ein oder andere kompetente Kommentar sicherlich hilfreich wäre! ;)

                1. Zum Speichern von Text-Input über XMLHttpRequest/PHP

                Mir ist aufgefallen, dass Zeilenumbrüche, die man beim Schreiben in der <textarea> per Return-Taste setzt, tatsächlich beim Speichern des Textes 'irgendwie' mit übernommen werden, d.h. wenn ich auf der Seite in die <textarea> schreibe...

                "Nach diesem Satz folgt ein Zeilenumbruch.
                Dann kommt der nächste Satz."

                ...dann steht das in der Ausgabedatei exakt so drin, - jedoch nicht, wenn ich diese Datei mit dem Windows-Editor öffne(!), - denn dann steht da:

                "Nach diesem Satz folgt ein Zeilenumbruch.Dann kommt der nächste Satz."

                Irgendwie muss also die Information, dass da ein Zeilenumbruch ist, zwar mit gespeichert werden, jedoch offenbar auf eine Art und Weise, dass dem Windows-Editor diese Information verborgen bleibt! Öffne ich die Datei hingegen mit einem anderen Programm - ausprobiert habe ich's mit Windows WordPad, Notepad++ sowie dem OpenOffice Writer - werden die Zeilenumbrüche ohne weiteres berücksichtigt! - Merkwürdig, oder? ;)

                Außerdem ist mir aufgefallen, dass sich mit dem Speichern über XMLHttpRequest/PHP die Kodierung der Ausgabedatei ändert:

                Ich hatte die Datei grundsätzlich mit UTF-8 w/o BOM kodiert, aber jedesmal wenn ich den Inhalt über die PHP-Speicherfunktion aktualisiere, ändert sich die Kodierung zu ANSI!

                Kann man das in der PHP-Funktion irgendwie so notieren, dass das nicht passiert, also dass die Kodierung UTF-8 ohne Byte Order Mask bestehen bleibt??

                2. Generelle Gedanken

                Ich bin ehrlich gesagt immernoch am herumexperimentieren, was die optimale - sprich, am wenigsten Aufwändige - Art ist, Inhalte auf meiner Seite hinzuzufügen, und stelle dabei fest, dass das Aufwändigste an der ganzen Prozedur eigentlich weniger das Einfügen des Textes selbst ist, - wobei es völlig unerheblich ist, ob ich meine 'library' in einer externen XML-Datei, in vielen externen TXT-Dateien oder in einem <div id="library> ... </div> auf display:none; im Quellcode der HTML-Datei unterbringe (wozu ich mittlerweile fast am ehesten tendiere), - sondern das Aufwändigste ist eigentlich die Verwaltung der Menü-Listeneinträge, die auf den entsprechenden content verweisen!

                Das heißt, ich habe ersmal meinen Textinhalt, wo auch immer er sich befinden mag ;) und um an den heranzukommen müssen mehrere, letztlich immer gleich bleibende Schritte unternommen werden.

                Das Erstellen von Listeneinträgen für meine zahlreichen Menüs habe ich in JavaScript schon soweit simplifiziert wie möglich, z.B.:

                a. Erstellen des Eintrags

                function createListItemsForList01(){  
                  
                createListItem("BGBp611","BGB §611<br>Dienstvertrag",doubleLine,"list01","blue");  
                createListItem("BGBp612","BGB §612<br>Vergütung",doubleLine,"list01","blue");  
                  
                /* ... */  
                  
                }  
                  
                function createListItem(name,text,format,list,color){  
                  
                /* ... */  
                  
                }
                

                b. Hinzufügen von EventListenern

                function addEventListenerForList01(){  
                  
                document.getElementById("BGBp611").addEventListener("click",BGBp611OnClick);  
                document.getElementById("BGBp612").addEventListener("click",BGBp612OnClick);  
                  
                /* ... */  
                  
                }
                

                c. Schließlich die dazugehörigen Funktionen

                function BGBp611OnClick(){  
                  
                var text = document.getElementById("BGBp611Text") // wenn Text in HTML-Datei-eigener library  
                  
                addContentBox("Dienstvertrag",text);  
                  
                }  
                  
                function addContentBox(headline,content){  
                  
                /* ... */  
                  
                }
                

                Dass ich die Listen dynamisch erstelle und nicht direkt in HTML liegt daran, dass sich das Aussehen und die Zusammensetzung der Listen verändern, je nach dem wo auf der Seite man sich befindet. - Würde ich die Einträge statisch ins HTML schreiben, müsste ich deutlich mehr oder deutlich komplizierteren Code schreiben um zum selben Ergebnis zu kommen.

                Der Gedanke dem ich nun nachhänge ist jedenfalls der, dass es doch möglich sein müsste, diesen Vorgang zu automatisieren.

                Es ist mir ja schon gelungen, eine Funktion zu schreiben, die aus den Eingaben in meinem Seiten-eigenen Editor Funktionen macht, die dann über den XMLHttpRequest und PHP in eine externe JavaScript-Datei geschrieben werden, welche ich in das HTML-Dokument eingebunden habe, so dass auf die Funktionen beim refresh der Seite zurückgegriffen werden kann.

                Ebenso ist es mir gelungen, die Save-Funktion im Script so zu notieren, dass der Text in der JS-Datei nicht ersetzt wird, sondern, dass ich den vorhandenen Text beibehalte und dieser dann zusammen mit dem 'neuen' Text aus der <textarea> in die Datei geschrieben wird.

                Das ist natürlich noch ein wenig grobschlächtig von der Methode her, aber wenn ich vermöge 'regulärer Ausdrücke' und vielleicht charAt(); es irgendwie hinbekommen würde, den 'vorhandenen' Text aus der JS/HTML-Datei an der richtigen Stelle aufzusplitten und den 'neuen' (durch JS-Funktion 'bearbeiteten')Text aus der <textarea> genau dort hinzuzufügen, müsste es doch möglich sein, diese nervigen Arbeitsschritte auf ein paar Eingaben in <input> oder <textarea> Feldern im Seiten-eigenen Editor zu reduzieren!

                Leider ist mir das mit den 'RegExp' noch nicht wirklich vertraut...

                Also falls jemand eine Idee hat, wie so eine Split-Funktion aussehen müsste, oder Anregungen zu sonst irgendetwas von dem, was ich hier ausgebreitet habe, wäre ich überaus dankbar! ;)

                Gruß,

                Roadster.

                1. Hallo miteinander!

                  Auf die Gefahr hin, hier Selbstgespäche zu führen...  :D

                  Ich habe mir das mit den regulären Ausdrücken nochmal angeschaut und eigentlich müsste mein zuletzt formuliertes Ansinnen doch gar nicht so schwer umzusetzen sein!

                  Wenn ich also Funktionen, in Folge von Eingaben in meinem selbstgebastelten Seiten-Editor, in mein Script einfügen will (oder Text in das HTML-Dokument), dann brauche ich ja ersteinmal den dort bereits vorhandenen Text. Den hole ich mir mit XMLHttpRequest. Unproblematisch.

                  Dann habe ich diesen (Voll-)Text als Variable, die ich nach Schlüsselbegriffen durchsuchen kann, zum Beispiel:

                  var n = text.search(/ letzter Eintrag List01 /i);

                  Das gibt mir die Stelle heraus, wo der Kommentar beginnt, der einen Abschnitt beschließt und die Stelle markiert, wo neuer Text eingefügt werden soll. Soweit, so gut!

                  Wenn ich also Funktionen wie die zum Erstellen von Listeneinträgen habe, wo auf zig Zeilen immer mehr oder weniger dasselbe steht...

                  function createListItemsForList01(){  
                    
                  createListItem("BGBp611","BGB §611<br>Dienstvertrag",doubleLine,"list01","blue");  
                  createListItem("BGBp612","BGB §612<br>Vergütung",doubleLine,"list01","blue");  
                    
                  /* ... */  
                    
                  }
                  

                  ...könnte ich ja, bei entsprechenden Eingaben im Editor auf der Seite, den zu speichernden Text so formatieren, dass er lautet...

                  createListItem("BGBp611","BGB §611<br>Dienstvertrag",doubleLine,"list01","blue");  
                  /* letzter Eintrag list01 */
                  

                  ...wobei dann der Kommentar quasi die Markierung ist (die ja dann auch nur einmal im Text so vorkommt), wo der 'nächste' Eintrag dann einzufügen ist.

                  Das heißt, ich müsste die Funktion dann so schreiben, dass zunächst aus dem bestehenden Text aus der JS oder HTML Datei die markierte Stelle herausgesucht wird, dann müsste irgendwie der Text an dieser Stelle entzweit werden, wobei der bereits dort stehende Kommentar (die vorhandene Markierung) ausgelassen/gelöscht wird, und dann müssten die Teile wieder zusammengesetzt werden, wobei die Markierung/der Kommentar dann am Ende des neu einzufügenden Textabschnitts wieder eingefügt wird, damit er beim nächsten Durchlauf wiedergefunden werden kann...

                  var text = textPt1 + textNew + textPt2;  
                    
                  save(text,filename);
                  

                  Aber wie bekomme ich es hin, den Text zu splitten, so dass ich zwei Variablen habe, zwischen die ich den neu einzufügenden Text einfügen kann?

                  Jedem Bemühen um Aufklärung sei gedankt! ;)

                  Nochmal,

                  Gruß,

                  Roadster.

                  1. Hallo miteinander!

                    Auf die Gefahr hin, hier Selbstgespäche zu führen...  :D

                    var text = textPt1 + textNew + textPt2;

                    save(text,filename);

                      
                    Ok. Also zumindest das sei geklärt! ;)  
                      
                    ~~~javascript
                    var x = new XMLHttpRequest();  
                    x.open("get","testfile.js");  
                    x.send();  
                    x.addEventListener("load",function(e){  
                    var textOld = e.target.responseText;  
                      
                    var parts = textOld.split(" letzter Eintrag List01 ");  
                      
                    var firstPt=parts[0];  
                    var secondPt=parts[1];  
                      
                    var textArea = document.getElementById("textArea");  
                    var textNew = textArea.value; // bzw. später dann das Ergebnis der Umwandlung von Text zu Code...  
                      
                    var text = firstPt + textNew + secondPt;  
                      
                    save(text,"testfile.js");  
                      
                    });
                    

                    Nochmal,

                    Gruß,

                    Roadster.

                2. Aloha ;)

                  Da mein Hirn noch tief in den Feiertagen steckt und ich das, was du zu RegExp geschrieben hast ein zweites Mal lesen müsste, um es zu verstehen, klinke ich mich mit ein paar zusätzlichen Gedanken einfach hier ein.

                  Hallo miteinander!

                  Hallöle ;)

                  1. Zum Speichern von Text-Input über XMLHttpRequest/PHP

                  "Nach diesem Satz folgt ein Zeilenumbruch.
                  Dann kommt der nächste Satz."

                  ...dann steht das in der Ausgabedatei exakt so drin, - jedoch nicht, wenn ich diese Datei mit dem Windows-Editor öffne(!), - denn dann steht da:

                  "Nach diesem Satz folgt ein Zeilenumbruch.Dann kommt der nächste Satz."

                  Das ist ein Phänomen, das wahrscheinlich mit dem Schimpfwort Windows im Namen des Editors zusammenhängt ;) Es liegt tatsächlich daran, dass die Konvention, was "newline" bedeutet, vom Betriebssystem abhängt. Das verursacht leider immer wieder Probleme. Tatsächlich ist es so, dass der Windows-Editor ("Notepad") eine unrühmliche Ausnahme darstellt, da er sich weigert, die newline-Sequenzen anderer Betriebssysteme zu interpretieren. (Tatsächlich hat Notepad sogar noch ein paar mehr Probleme)

                  Irgendwie muss also die Information, dass da ein Zeilenumbruch ist, zwar mit gespeichert werden, jedoch offenbar auf eine Art und Weise, dass dem Windows-Editor diese Information verborgen bleibt! Öffne ich die Datei hingegen mit einem anderen Programm - ausprobiert habe ich's mit Windows WordPad, Notepad++ sowie dem OpenOffice Writer - werden die Zeilenumbrüche ohne weiteres berücksichtigt! - Merkwürdig, oder? ;)

                  Außerdem ist mir aufgefallen, dass sich mit dem Speichern über XMLHttpRequest/PHP die Kodierung der Ausgabedatei ändert:

                  Ich hatte die Datei grundsätzlich mit UTF-8 w/o BOM kodiert, aber jedesmal wenn ich den Inhalt über die PHP-Speicherfunktion aktualisiere, ändert sich die Kodierung zu ANSI!

                  Kann man das in der PHP-Funktion irgendwie so notieren, dass das nicht passiert, also dass die Kodierung UTF-8 ohne Byte Order Mask bestehen bleibt??

                  file_put_contents ändert die Kodierung nicht, sondern speichert die Daten so, wie sie vorliegen, in einer Datei. Wenn du die Kodierung bewusst beeinflussen willst, so musst du dies vorher tun. Dazu kannst du die Funktion iconv nutzen. D.h. vor dem file_put_contents sowas notieren:

                  $content = iconv("CP1252","UTF-8", $content);

                  Ich hab jetzt mal angenommen, dass die input-Kodierung der Windows-Standard-Codepage für Europa entspricht. Die Bezeichnung ANSI ist leider nur ein Überbegriff. Schätze, dass das v.A. vom Betriebssystem des users abhängt. Da du aber ja eine deutsche Jura-Seite programmierst dürfte das so tun. Es kann leider aber sein, dass Notepad dann immer noch nicht damit arbeiten kann, selbst wenn es richtiges UTF-8 ist ;)

                  1. Generelle Gedanken

                  Das Erstellen von Listeneinträgen für meine zahlreichen Menüs habe ich in JavaScript schon soweit simplifiziert wie möglich, z.B.:

                  b. Hinzufügen von EventListenern

                  function addEventListenerForList01(){

                  document.getElementById("BGBp611").addEventListener("click",BGBp611OnClick);
                  document.getElementById("BGBp612").addEventListener("click",BGBp612OnClick);

                  /* ... */

                  }

                  
                  >   
                  > c. Schließlich die dazugehörigen Funktionen  
                  >   
                  > ~~~javascript
                  
                  function BGBp611OnClick(){  
                  
                  >   
                  > var text = document.getElementById("BGBp611Text") // wenn Text in HTML-Datei-eigener library  
                  >   
                  > addContentBox("Dienstvertrag",text);  
                  >   
                  > }  
                  >   
                  > function addContentBox(headline,content){  
                  >   
                  > /* ... */  
                  >   
                  > }
                  
                  

                  Wahrscheinlich geht das noch allgemeiner.

                  function pOnClick(e){  
                    
                   id = e.srcElement.id;  
                    
                   var text = document.getElementById(id+"Text") // wenn Text in HTML-Datei-eigener library  
                    
                   addContentBox(headlines[id],text);  
                    
                   }  
                   
                  

                  Im globalen Objekt headlines müsste dafür bei Initialisierung des BGBpXXX die entsprechende headline eingespeichert werden. Deutlich eleganter - kann ich aber nicht ohne entsprechendes Wisen: Statt headlines[id] kann man auch andere Mittel und Wege wählen, die Überschrift rauszubekommen, abhängig von der Verfügbarkeit der infos in deiner library...

                  function addEventListenerForList01(){  
                    
                      for (var p = 1; p <= 2385; p++) {  
                          document.getElementById("BGBp"+p).addEventListener("click",pOnClick);  
                      }  
                    
                  /* ... */  
                    
                  }
                  

                  Vielleicht hilfts ja ;)

                  Grüße,

                  RIDER

                  --
                  Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
                  ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
                  1. Aloha ;)

                    Hallo RIDER :)

                    file_put_contents ändert die Kodierung nicht, sondern speichert die Daten so, wie sie vorliegen, in einer Datei. Wenn du die Kodierung bewusst beeinflussen willst, so musst du dies vorher tun. Dazu kannst du die Funktion iconv nutzen. D.h. vor dem file_put_contents sowas notieren:

                    $content = iconv("CP1252","UTF-8", $content);

                    Werd das gleich mal ausprobieren! Interessant ist, dass wenn ich direkt die _HTML-Datei_ der Seite mit der in meinem letzten Post genannten Funktion manipuliere, also irgendwo im Body, wo ich vor dem site-load einen Kommentar <!-- content x here --> hinterlassen
                    habe, mit var parts = text.split("<!-- content x here -->"); den Text der Datei aufteile um dann das Geschreibsel aus der <textarea> zwischen den beiden Teilen einzufügen, dass ganze dann wieder zu einer einzigen Variable zusammenführe und selbige dann der 'save'-Funktion mit auf den Weg gebe, - dann wird die Kodierung der HTML-Datei nach dem reload NICHT geändert, sondern steht weiterhin auf UTF-8 w/o BOM! Werde mir das wie gesagt noch mal genauer anschauen... ;)

                    Wahrscheinlich geht das noch allgemeiner.

                    function pOnClick(e){

                    id = e.srcElement.id;

                    var text = document.getElementById(id+"Text") // wenn Text in HTML-Datei-eigener library

                    addContentBox(headlines[id],text);

                    }

                      
                    Ich habe schon lange und erfolglos nach der Bedeutung von (e) geforscht! :D  
                      
                    Dachte immer, man könne Funktionen, auf die der EventListener verweist, keine Variablen mitgeben.  
                    Deswegen habe ich mir diese Umstände bereitet! ;)  
                      
                    Ist e.srcElement.id dasselbe wie event.target.id?  
                      
                    
                    > Im globalen Objekt headlines müsste dafür bei Initialisierung des BGBpXXX die entsprechende headline eingespeichert werden. Deutlich eleganter - kann ich aber nicht ohne entsprechendes Wisen: Statt headlines[id] kann man auch andere Mittel und Wege wählen, die Überschrift rauszubekommen, abhängig von der Verfügbarkeit der infos in deiner library...  
                      
                    Statt 'library' sollte ich es wohl besser 'archive' nennen. ;)  
                      
                    Wenn meine Inhalt-Hinzufüge-Automatik erstmal installiert und funktionsfähig ist, werde ich wahrscheinlich ohnehin keinen direkten Blick mehr in den Textwust werfen, der da mit der Zeit anfällt, von daher spricht eigentlich nichts dagegen, die zu dem entsprechenden Inhalt dazugehörigen Infos einfach ebenfalls im 'Archiv' zu speichern, mit standardisierter Bennenung wie etwa BGBp611 BGBp611Text BGBp611Headline BGBp611Name BGBp611Color...  
                      
                    Meine Darstellung im Post war da nämlich etwas verkürzt, denn zu 'headline' und 'text' gesellen sich als Parameter der addContentBox-Funktion auch noch 'name' und 'color', die dann gegebenenfalls an die addStackBox-Funktion weitergereicht werden, wenn der Inhalt auf dem Ablagehaufen landet (für die ganze headline ist in der kleinen Ablagebox nämlich kein Platz und im Gegensatz zur immer einfarbig weißen 'contentBox' muss die 'stackBox' auch irgendwoher wissen, welche Farbe sie annehmen soll - schwarz für Seitenfunktionen, grün für Öffentliches Recht, blau für Privarrecht oder Rot für Strafrecht).  
                      
                    
                    >   
                    > ~~~javascript
                    
                    function addEventListenerForList01(){  
                    
                    >   
                    >     for (var p = 1; p <= 2385; p++) {  
                    >         document.getElementById("BGBp"+p).addEventListener("click",pOnClick);  
                    >     }  
                    >   
                    > /* ... */  
                    >   
                    > }
                    
                    

                    LOL - alleine die Vorstellung von 2385 Zeilen

                    document.getElementById("bla").addEventListener("click",fasel);

                    ;)

                    Vielleicht hilfts ja ;)

                    Ganz sicher! :)

                    Vielen Dank!

                    Gruß,

                    Roadster.

                    1. Aloha ;)

                      Ich habe schon lange und erfolglos nach der Bedeutung von (e) geforscht! :D

                      Dachte immer, man könne Funktionen, auf die der EventListener verweist, keine Variablen mitgeben.
                      Deswegen habe ich mir diese Umstände bereitet! ;)

                      Ja - kann man auch nicht. Nur einen einzigen, den man aber nicht selbst belegen kann. Verpasst man einem Event-Handler einen (exakt einen) Parameter, so wird der automatisch mit dem gefeuerten Event-Objekt befüllt.

                      Ist e.srcElement.id dasselbe wie event.target.id?

                      Ja - ich hab dabei was gemacht, was ich normal nicht mache - ich habe alte Internet-Explorer-Spezialsyntax benutzt statt dem standardkonformen target. Weil ich neulich festgestellt habe, dass mindestens chrome alias webkit auch srcElement zusätzlich mitwirft - mit FF hab ichs leider nicht mehr getestet... Noch besser weil in allen Browsern lauffähig:

                          e = e || window.event;  
                          var target = e.target || e.srcElement;  
                          [...] target.id [...]  
                      
                      

                      In Event-Handler sind folgende Variablen (in der Theorie) gleich belegt:

                      Standardkonform: this, e.target, IE: e.srcElement

                      Leider weist auch this erst seit IE9 auf das richtige Element.

                      Da IE9 aber auf allen offiziell unterstützten windoofs lauffähig ist, kannst du dir den ganzen e-schmu sparen und einfach von vornherein this.id benutzen ;)

                      Ich gebe zu: Das war verwirrend. Deshalb nochmal ein schöner Überblick: JS 'this' and event handlers

                      Meine Darstellung im Post war da nämlich etwas verkürzt, denn zu 'headline' und 'text' gesellen sich als Parameter der addContentBox-Funktion auch noch 'name' und 'color', die dann gegebenenfalls an die addStackBox-Funktion weitergereicht werden, wenn der Inhalt auf dem Ablagehaufen landet (für die ganze headline ist in der kleinen Ablagebox nämlich kein Platz und im Gegensatz zur immer einfarbig weißen 'contentBox' muss die 'stackBox' auch irgendwoher wissen, welche Farbe sie annehmen soll - schwarz für Seitenfunktionen, grün für Öffentliches Recht, blau für Privarrecht oder Rot für Strafrecht).

                      Umso mehr Grund, alle relevanten Daten in irgendeiner Form zentral zu hinterlegen ;)

                      LOL - alleine die Vorstellung von 2385 Zeilen

                      Deshalb ja die absolute Notwendigkeit, so weit wie möglich abstrakte Prozesse mit zentral hinterlegten Daten zu füttern und keine Individuallösung für jedes zu machen ;)

                      Grüße,

                      RIDER

                      --
                      Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
                      ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
                      1. Aloha ;)

                        Hallo RIDER :)

                        Also ich habe deine Empfehlung zur Vereinfachung der EventListener/onclick-Funktionen eingebaut und es funktioniert wirklich prima - eine echte Erleichterung! ;)

                        function addEventListenerForList01(){

                        for (var p = 1; p <= 2385; p++) {
                                document.getElementById("BGBp"+p).addEventListener("click",pOnClick);
                            }

                        /* ... */

                        }

                        
                        >   
                        
                        Dabei gibt es nun aber leider zwei Probleme:  
                          
                        1) Nicht standardkonforme Paragraphenbezeichnungen  
                          
                        Die meisten Paragraphen passen zwar wunderbar ins Schema, wie §611 oder §612 BGB - beziehungsweise deren Benennungen im Code - BGBp611 oder BGBp612 - aber es gibt eben auch eine ganze Menge (gerade im Fall des BGB wirklich viele) Paragraphen, die noch einen Buchstaben als Suffix im Namen haben, wie bspw. §612a BGB (BGBp612a), §613a BGB (BGBp613a) oder ganz extrem z.B. §651a bis §651m (!) BGB.  
                          
                        Ich habe schon darüber nachgedacht, wie man das in deine Funktion irgendwie mit einbauen könnte, aber hinbekommen hab ich's leider noch nicht!  
                          
                        2) Karteileichen  
                          
                        Zudem gibt es auch nicht wenige Paragraphen, die "weggefallen" oder "gegenstandslos" geworden sind, die ich aber trotzdem in der Liste habe, damit sich der Benutzer nicht fragt, warum z.B. zwischen §14 und §21 BGB eine Lücke ist, und denkt, dass da was fehlt.  
                          
                        Diese Paragraphen könnte man natürlich bei der Benennung irgendwie kennzeichnen, damit sie aus der addEventListener-Funktion rausgenommen werden, etwa mit einem 'z' als Suffix, also z.B. 'BGBp18z'. (Das gibt es soweit ich weiß \_noch\_ nicht ;)  
                          
                        Die Beantwortung der Frage, wie ich eine Bedingung für deine Funktion formulieren könnte, damit die Paragraphen im Fall 1) mit einbezogen und die Paragraphen im Fall 2) außenvorgelassen werden, übersteigt im Moment aber leider meine Vorstellungskraft - vielleicht hast du (oder hat jemand anderes) eine Idee, wie ich das Auflösen könnte...?  
                          
                        Für Lösungen (und Anregungen zu selbigen) wäre ich wie immer dankbar! ;)  
                          
                        Gruß,  
                          
                        Roadster.
                        
                        1. Hallo Roadster,

                          function addEventListenerForList01(){

                          for (var p = 1; p <= 2385; p++) {
                                  document.getElementById("BGBp"+p).addEventListener("click",pOnClick);
                              }

                          /* ... */

                          }

                            
                          Ich glaube, du hast Camping\_RIDER falsch verstanden. Du sollst nicht jedem Element einen Click-Handler geben, sondern dem übergeordneten. Im Eventhandler fragst du dann ab, wohin geklickt wurde.  
                            
                          
                          > Dabei gibt es nun aber leider zwei Probleme:  
                            
                          Du identifizierst die Elemente über ihre ID und bekommst daher die Probleme,  
                          - da nicht alle einen Clickhandler bekommen sollen,  
                          - da nicht alle Elemente nach deinem Schema gefunden werde.  
                            
                          Spontan fallen mir zwei Lösungen ein:  
                          Du reagierst auf alle Klicks, die aus einen Element kommen, dessen ID mit "BGB" anfängt. Für die Elemente, auf deren Klick du nicht reagieren möchtest, führst du eine Liste.  
                          Du gibst allen Elementen, bei denen auf einen Klick reagiert werden soll, eine Klasse:  
                            
                          <p id="BGB17">...  
                          <p id="BGB42" class="Klickbar">...  
                            
                          Du musst hier festlegen, ob im HTML oder im Javascript entschieden wird, ob auf einen Klick reagiert wird.  
                            
                          Falls du bei deinem Konzept mit einem Handler für jedes Element bleiben möchtest, mit document.querySelectorAll findest du auch alle Elemente einer Klasse.  
                            
                            
                          Gruß, Jürgen  
                          
                          
                          1. Hallo Roadster,

                            Hallo Jürgen :)

                            function addEventListenerForList01(){

                            for (var p = 1; p <= 2385; p++) {
                                    document.getElementById("BGBp"+p).addEventListener("click",pOnClick);
                                }

                            /* ... */

                            }

                            
                            >   
                            > Ich glaube, du hast Camping\_RIDER falsch verstanden. Du sollst nicht jedem Element einen Click-Handler geben, sondern dem übergeordneten. Im Eventhandler fragst du dann ab, wohin geklickt wurde.  
                              
                            Umh, naja, das ist ein jedenfalls ein interessanter Gedanke... ich meine, die zitierte Funktion von RIDER ist ja im Prinzip inhaltlich betrachtet nur eine (wesentlich) verkürzte Darstellung von...  
                              
                            ~~~javascript
                            function addEventListenerForListXYZ(){  
                              
                            document.getElementById("BGBp1").addEventListener("click",BGBp1OnClick);  
                            document.getELementById("BGBp2").addEventListener("click",BGBp2OnClick);  
                              
                            /* etc.. etc.. */  
                              
                            }
                            

                            ...aber eigentlich hast du ja recht: Wenn ich statt bspw. BGBp1OnClick, BGBp2OnClick usw. ohnehin eine einheitliche Zielfunktion des click-events habe, wo dann geprüft wird, wohin der click gesetzt wurde, dann könnte ich mir diese Funktion ja eigentlich auch komplett sparen, und den eventListener einfach an das Elternelement dranhängen, also nur noch...

                            function addEventListenerForListXYZ(){  
                              
                            document.getElementById("listXYZ").addEventListener("click",listXYZonClick);  
                              
                            }
                            

                            Die e.tartget.id muss ich ohnehin in der EventListener-Zielfunktion noch bearbeiten, da ich (um doppelte ID-Vergabe zu vermeiden) jeder Listitem-ID noch ein Präfix vorangestellt habe, dass ich rausnehmen muss, um den 'reinen' Namen des Elements dann dazu zu benutzen, die ID's für den Inhalt ('BGBp342Text','BGBp342Headline','BGBp342Name' usw.) zu ermitteln, welcher dann angezeigt werden soll.

                            Bislang hatte ich einfach element=e.target.id; und dann id=element.slice(6,13); plus zum Laden der Inhalte dann...

                            var headline=document.getElementById(id+"Headline");  
                            var headlineContent=headline.innerHTML;  
                            var text=document.getElementById(id+"Text");  
                            var textContent=text.innerHTML  
                            var name=document.getElementById(id+"Name");  
                            var nameContent=name.innerHTML;  
                              
                            // usw...
                            

                            ...wobei die Inhalte dementsprechend benannt sind, also bspw. wird aus element selectBGBp320 dann id BGBp320 und die dazugehörigen Informationsträger heißen dann BGBp320Text, BGBp320Headline etc.

                            Dann könnte ich an der Stelle vielleicht mit charAt() bevor ich aus 'element' 'id' mache, ein if() einbauen und checken, wie lang der String ist und dann gegebenenfalls statt var id=element.slice(6,13) eben var id=element.slice(6,14); schreiben, wenn an dem Paragraphen noch ein Suffix à la BGBp612a dran ist.

                            Und für Paragraphen, die nicht auf clicks reagieren sollen, checke ich auf gleichem Wege, ob das Suffix dann ggf. 'z' ist.

                            Das müsste funktionieren!

                            Danke für den Hinweis! ;)

                            Werde das gleich mal ausprobieren...

                            Gruß,

                            Roadster.

                            1. Hallo nochmal!

                              Also, habe das mal umgesetzt und es funktioniert prächtig!

                              Dann könnte ich an der Stelle vielleicht mit charAt() bevor ich aus 'element' 'id' mache, ein if() einbauen und checken, wie lang der String ist...

                              Ich sollte mir mein Geschreibsel immer nochmal durchlesen, bevor ich's poste! ;)

                              Mit element.length checke ich, ob ein Suffix dranhängt oder nicht, und mit charAt() finde ich raus, ob es eine Karteileiche (z) ist oder nicht.

                              Das könnte ich sogar noch vereinfachen, indem ich statt ein 'z' dranzuhängen, gleich was Längeres wie etwa 'deadlink' dranhänge, dann kann ich mir charAt() auch komplett sparen und muss nur noch die Länge des Strings checken!

                              Fabelhaft! :)

                              Nochmals Dank an dich Jürgen (und natürlich auch an RIDER)!

                              Gruß und guten Rutsch,

                              Roadster.

                  2. Tach!

                    Kann man das in der PHP-Funktion irgendwie so notieren, dass das nicht passiert, also dass die Kodierung UTF-8 ohne Byte Order Mask bestehen bleibt??

                    file_put_contents ändert die Kodierung nicht, sondern speichert die Daten so, wie sie vorliegen, in einer Datei. Wenn du die Kodierung bewusst beeinflussen willst, so musst du dies vorher tun. Dazu kannst du die Funktion iconv nutzen. D.h. vor dem file_put_contents sowas notieren:
                    $content = iconv("CP1252","UTF-8", $content);

                    Das ist ein wenig sinnvolles Vorgehen. Wenn man UTF-8 als Speicherformat nehmen möchte, dann sollte die gesamte Verarbeitungskette auf UTF-8 basieren (oder etwas anderem Unicode-kompatiblem). Es bringt doch nichts, wenn man nur maximal 256 Zeichen verarbeiten aber das gesamte Unicode-Spektrum speichern kann. Das Ziel darf nicht Konvertierung heißen sondern Sicherstellen der UTF-8-Verarbeitung auf ganzer Linie.

                    Das bedeutet - recht allgemein formuliert - zum einen, dass jedes System mit UTF-8 umgehen kann, oder es unverändert durchreicht. Und zum anderen, dass jedes System dem nachfolgenden korrekt eine Angabe zur Kodierung mitgibt und die Daten dann auch so kodiert weitergibt. Das Thema ist umfangreich aber im Wiki beschrieben: http://wiki.selfhtml.org/wiki/Zeichenkodierung

                    dedlfix.

            2. Aloha ;)

              Upsala, danke Auge, da ist mir ja echt ein Schnitzer passiert ;)

              Grüße,

              RIDER

              --
              Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
              ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
  5. Hallo Roadster,

    ich mache das so: In Datei schreiben, ohne Server.

    Gruß, Jürgen

  6. Hallo miteinander!

    Erstmal sorry für die verspätete Antwort... - Eigentlich schlafe ich nur Sonntags! :D -

    ...und vielen Dank für eure Anregungen! Ich denke, da müsste etwas dabei sein, was mir bei meinem Problem weiterhilft, jedenfalls schaut das beim ersten drüberlesen schon sehr vielversprechend aus! Werde mich gleich mal etwas intensiver damit befassen.

    @Tabellenkalk

    Bist du dir sicher, dass deine Problematik so speziell ist, dass da niemand anderes bisher ein Programm für geschrieben hat? Beschreib doch mal was deine Anforderungen sind, vielleicht kennt jemand was für dich.
    Es sei denn, du möchtest unbedingt selbst was programmieren...

    Mir fallen spontan Mindmappingprogramme ein, die vermutlich deine Texte prima speichern könnten. Suche und Kategorien sind da im Normalfall mit bei. Vokabellernsoftware gibts dann auch noch.

    Ja. Du hast recht. Es gibt wahrscheinlich für jede Funktionalität, die mir so vorschwebt, bereits ein Programm, das sie umsetzt. Es gibt sogar Programme, die mehrere Funktionen meiner Anspruchsliste in sich vereinenen! Aber es gibt wohl kein Programm, dass (auch nur annähernd) ALLE Funktionen, die ich gerne hätte, in sich vereint - und schon gar nicht auf eine Art und Weise, wie ich mir das vorstelle!

    Sagen wir, ich habe eine vage Idealvorstellung, wie so ein Programm aussehen müsste, und wenn ich diese Vorstellung mit den vorhandenen Ressourcen vergleiche (was ich, selbstverständlich innerhalb eines gewissen Rahmens, getan habe), bin ich einfach der Ansicht, dass dazwischen eine recht beachtliche Diskrepanz besteht. ;)

    ...insbesondere aufgrund des Umstands, das die Seite eigentlich gar keine richtige 'Web'-seite, sondern ein in erster Linie lokal genutztes Programm ist, dass vom Datenträger gestartet wird und lediglich den Browser als Darstellungsmedium benutzt...

    Diese Aussage meinerseits ist natürlich vor dem Hintergrund zu verstehen, dass ich mir der Schwierigkeit der Umsetzung meines Vorhabens (auch mit Blick auf meine eigenen Fähigkeiten) durchaus bewusst bin, sprich, natürlich ist es das Ziel, die Seite irgendwann online zu stellen, aber gerade aufgrund der Komplexität der Aufgabe (und des Umstands, dass ich noch andere Interessen und Verpflichtungen habe ;) rechne ich eben nicht damit, dass ich das Programm, so wie ich es mir vorstelle, von heute auf morgen realisiert bekomme, sondern im Gegenteil, rechne ich eben damit, dass das die Umsetzung, falls sie überhaupt gelingt (und gelingen kann) vermutlich sogar ein paar Jahre (!) dauern wird.

    Ich möchte einfach keine halbfertige Seite online stellen, aber dennoch für die Zeit des "work in progress" schon ein Optimum an Nutzbarkeit (in erster Linie für mich selbst) zur Verfügung haben.

    Bei meinem Projekt geht es nicht darum, innerhalb einer vorbestimmten Frist ein fertiges Produkt abzuliefern, sondern es geht darum, für mich persönlich herauszufinden, wie nahe ich meiner Idealvorstellung einer virtuellen (juristischen) Arbeitsumgebung kommen kann.

    Sollte ich bei dem Versuch scheitern, habe ich wenigstens etwas dabei gelernt, - und wenn jemand in der Zwischenzeit das gleiche (und besser) umgesetzt bekommt, bin ich der erste, der zum Gelingen gratuliert. ;)

    Soweit.

    Beste Grüße,

    Roadster.