Colorizer

Schlagwörter: 

Ansicht von 10 Antwort-Themen
  • Autor
    Beiträge
    • #15152
      Torsten
      Teilnehmer

      Hi Klaus,

      eine Frage wahrscheinlich an Dich:

      Ich möchte gerne eine Einfärbung für Texte machen (in meinem Fall Domainnamen), d.h. ich will die Farbe bestimmter Wörter in einem Textfeld ändern. Erster Ansatz wäre Wort für Wort vorzugehen, aber das erscheint mir sehr langsam. Gibt es eine schnellere Möglichkeit?

      Hier mal mein Code bis dahin:

      
      on mouseUp
         
         repeat for each trueword i in field "Text" 
      
            set itemdelimiter to "."  -- die Domainnamen in der Datei sind ohne Protokoll, z.b. www.economist.com
            if the number of items in i > 1 then
               
               -- färbe den Domainnamen in blau
               
            end if
               
            end repeat
            
         end mouseUp

      Besten Gruss
      Torsten

    • #15156
      Klaus Major
      Verwalter

      Ein kleines „lock screen“ direkt nach „on mouseup“ würde die Sache schon gewaltig beschleunigen! 🙂

    • #15158
      Torsten
      Teilnehmer

      Da haste natürlich recht 🙂

    • #15164
      Torsten
      Teilnehmer

      Habs einigermassen schnell hingekriegt. Hier mal der Code als Beispiel:

      Im Interface gibt es ein field „Text“ und hinter diesem ein field „Counter“ welches sichtbar ist, wenn das Textfeld ausgeblendet wird. Dadurch erreiche ich, dass die Verarbeitung einerseits schneller wird (weil mein visuelles Update gemacht werden muss) und ich aber (im Gegensatz zu lockscreen) auch noch einen Fortschrittsindikator einbauen kann, der mir sagt, ob ích mir noch einen Kaffee machen kann 🙂

      Die Bedingung

      if i mod 500 is zero

      erreicht, dass die Anzeige des Counters auch nur alle 500 Schritte gemacht wird, weil eine zu häufige Anzeige das Programm auch wieder verlangsamt.

      
         set cursor to watch
         set the visible of field "Text" to false
         set the visible of field "Counter" to true
         put the seconds into tStartSeconds
         put the number of segments in field "Text"  into tNumberOfSegments
         
         repeat with i = 1 to the number of segments in field "Text" 
            
            if i mod 500 is zero then put i & "/" & tNumberOfSegments into word 2 of field "Counter"
            
            put segment i of field "Text" into tWord
            if tWord is empty then next repeat
            
            ## Erkennung, ob ein Segment einen Domainnamen enthält (www.web.de etc.)
            
            set itemdelimiter to "."  -- die Domainnamen in der Datei sind ohne Protokoll, z.b. www.economist.com
            if the number of items in tWord > 1 then 
               
               ## färbe den Domainnamen in blau
               set the textcolor of segment i of field "Text" to "blue"
               
            end if
            
         end repeat
         
         set the visible of field "Counter" to false
         set the visible of field "Text" to true
         set cursor to arrow
         
         answer "Die Aktion dauerte:" && the seconds - tStartSeconds  && "Sekunden"
      
    • #15166
      Klaus Major
      Verwalter

      Huch, da musste ich erst mal nachsehen, was SEGMENT eigentlich ist! 😀
      Aber ist ja nur ein Synonym für WORD, daher kannst Du Dir diese Zeile schon mal schenken:

      ...
      put segment i of field "Text" into tWord
      
      ## Die hier, da tWord NIE empty ist, denn Du loopst ja schliesslich durch alle WORDS!
            if tWord is empty then next repeat
      ...

      Dito hier, zumindest steht in dem Skriptschnipsel nichts anderes:

      ...
       set itemdelimiter to "."
      ...

      Daher reicht es wahrscheinlich, den nur einmal VOR dem Loop zu setzen.
      Das alles könnte einige wertvolle Nanosekunden einsparen! 😀

      Noch ein Tip zu einem besseren Überblick
      Statt:
      if i mod 500 is zero
      Schreib mal:
      if i mod 500 = 0

      Das ist einfacher auf einen Blick zu identifizieren, für mich jedenfalls. „is“ und „zero“ gehen im Fliesstext unter, das Gleichheitszeichen = und die Ziffer 0 stechen heraus.

      Hast Du mal die Zeit gestoppt mit LOCK SCREEN?
      Wäre mal interessant zu vergleichen.

    • #15168
      Klaus Major
      Verwalter

      Was auch mal auszuprobieren wäre, den kompletten Text als HTML zu formatieren und alle Vorkommen von
      -> www.
      durch
      -> <font color=blue>www</font>.
      ersetzen.
      Vorne und hinten noch <p> bzw. </p> anfügen und den HTMLtext des Feldes darauf setzen. Capisce?
      Da da alles im RAM passiert und LC in diesen Operationen AFFENARTIG schnell ist, wäre das mal testen. 🙂

      ...
      put the millisecs into tMS
      put "<p>" & fld "Text" & "</p>" into tText
      replace "www." with "<font color=blue>www</font>." in tText
      set the htmltext of fld "Text" to tText
      put the millisecs - tMS
      ...
    • #15238
      Torsten
      Teilnehmer

      Hi Klaus,

      danke für Deine Arbeit an den Tipps.

      Jetzt habe ich mal eine Frage an den alten Hasen: Wieso wird das segment-command in 7.0 eingeführt, wenn es eigentlich dasselbe macht wie word?

      Ich habe gedacht, dass word nur zwischen Leerzeichen trennt und segment für eine Erweiterung in Bezug auf quotes gehalten.

    • #15251
      Klaus Major
      Verwalter

      Da bin ich überfragt, ich wusste bis zu Deinem Post gar nichts von „Segment“.

    • #15267
      Torsten
      Teilnehmer

      Hi Klaus,

      ich habe jetzt mal geforscht und in den Release notes zu Version 7 folgendes gefunden:

      https://downloads.livecode.com/livecode/7_0_0/LiveCodeNotes-7_0_0_dp_1.pdf

      synonym: segment

      The segment chunk type has been added as a synonym to the existing word chunk. This in order to allow you to update your scripts to use the newer syntax in anticipation of a future change to make the behaviour of the word chunk match the new trueWord behaviour.

      We would anticipate changing the meaning of word with our ‚Open Language‘ project. It requires us to create a highly accurate script translation system to allow old scripts to be rewritten in new revised and cleaner syntax. It is at this point we can seriously think about changing the meaning of existing tokens, including word. Existing scripts will continue to run using the existing parser, and they can be converted (by the user) over time to use the newer syntax.

      In Zukunft ist als scheinbar segment das alte word
      und trueword wird zu word. Die alten Skripte müssen dann aber scheinbar angepasst werden, allerdings von Hand (by the user). Im Prinzip sollte ein intelligentes Replace durch die IDE aber auch möglich sein, oder? Denn es muss ja nur word durch segment und trueword durch word ersetzt werden, oder was meinst Du?

    • #15269
      Klaus Major
      Verwalter

      Sagen wir lieber: In Zukunft ist also anscheinend „segment“ das alte „word“.

      Im Prinzip sollte ein intelligentes Replace durch die IDE aber auch möglich sein, oder? Denn es muss ja nur word durch segment und trueword durch word ersetzt werden, oder was meinst Du?

      Da spricht soweit nichts dagegen!

    • #15273
      Torsten
      Teilnehmer

      Was ist nicht ganz verstehe, warum sie in den Release-Notes schreiben, dass der User das später von Hand machen soll (was ich mir etwas nervig vorstelle), wenn es doch eigentlich automatisch gehen sollte.
      Jeder Stack, der eine Version vor der Umstellungsversion hat (also der, ab der die neue Bedeutung gilt), kann doch autoamtisch geparsed und entsprechend ersetzt werden.

      Denn jetzt kann man zwar segment statt word benutzen, ABER nicht word statt trueword. D.h. ich kann jetzt nur einen Teil der Konvertierung vornehmen. Aber gut, ich kann dann später einfacher trueword durch word ersetzen, naja.

Ansicht von 10 Antwort-Themen
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.