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
        Administrator

          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
              Administrator

                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
                Administrator

                  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
                    Administrator

                      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
                        Administrator

                          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.