Zum Inhalt springen

Knifflige Probleme mit if und split - Jeden großen Anfangsbuchstaben wrappen

Erstellt am 12. Juni 2009 · 8 Antworten · letzte Antwort am 15. Dezember 2009

Tags: Frage

Danwe ·

Hi,

ich spiele gerade etwas mit der if-Funktion herum. Folgendes funktioniert wunderbar:

9 = TEXT
9.value = Text
9.wrap = <span style="color:red">|</span>
9.if.value = _
9.if.isLessThan < .9.text
9.if.negate = 0

Der Text wird in diesem Fall angezeigt weil 0.value = Text mit einem großen Buchstaben anfängt.
if.isLessThan bekommt diesen Text als Wert und wandelt den ersten Buchstaben in den ASCII-Wert um. Genau so mit dem "_". "_" hat einen ASCII Wert größer als alle Großbuchstaben aber kleiner als die Kleinen Buchstaben.

Nun möchte ich das Prinzip übertragen auf einen ganzen Satz. Jeder Großbuchstabe eines Wortbeginns soll in einem <b></b> gewrappt werden. Kleinbuchstaben nicht.

Mein Code...

    20 = TEXT
    20 {
      value = Noch ein ganz normaler Satz von Mir.
      split {
        token.char = 32
        cObjNum = 1
        1 {
          10 = TEXT
          10.current = 1
          10.wrap = <b>|</b>
          10.crop = 1|
          20 < .10
          20.wrap = |
          20.crop =
          20.substring = 1
          20.noTrimWrap = || |
        }
      }
    }

...wrappt momentan JEDEN Anfangs-Buchstaben JEDES Worts mit einem <b>|</b> und unterscheidet noch nicht zwischen groß- und kleinenschreibung.

Um das zu realisieren habe ich folgende Ansätze ausprobiert aber nichts funktioniert:

  • 1. wrap.if funktioniert leider nicht. Damit möchte ich dass nur gewrappt wird wenn if true zurück gibt. Leider wird wenn false zurück gegeben wird aber nicht nur nicht gewrappt, sondern das ganze wird gar nicht angezeigt.

  • 2.

        20 = TEXT
        20 {
          value = Noch ein ganz normaler Satz von Mir.
          split {
            token.char = 32
            cObjNum = 1
            1 {
              10 = TEXT
              10.current = 1
              10.wrap = <b>|</b>
              10.crop = 1|
              
              10.if.value = _
              10.if.isLessThan < [U].10.value
              10.if.negate = 0
              
              20 < .10
              20.wrap = |
              20.crop =
              20.substring = 1
              20.noTrimWrap = || |
            }
          }
        }
    

    Dieser Ansatz funktioniert leider auch nicht und ich verstehe nicht wieso. Das Problem liegt darin dass das if hier immer true zurück gibt bzw. gar nix macht weil .10.value wohl nichts zurück gibt weil wir uns hier im Split befinden und der Wert des TEXT-Elements über 10.current = 1 zugewiesen wird und nicht über 10.value.
    Man muss doch trotzdem den aktuellen Wert des Splits in das if bekommen, oder?

Wäre super wenn jemand weiter helfen kann. Das Thema wurde vor einem Jahr schon mal diskutiert, aber damals ist niemand auf den Ansatz das mit if zu machen gekommen. Das könnte jetzt endlich die Lösung sein!

Julian.​Hofmann ·

Hallo.

Da stecken einige Details drin, über die man stolpern kann:
- Wie Du schon geschrieben hast, wäre da die Zuweisung von 10.value, die so wohl nicht klappen kann. An der Stelle kann aber über current = 1 gearbeitet werden.
- Ein weiteres Problem ist die richtige Verschachtelung, sodass beim Cropen bzw. bei Substring nicht das b-Tag zerpflückt wird.
- bei if-Bedingungen ist immer auch der else-Fall mit zu bedenken. In Deinem Ansatz wäre der erste Buchstabe (das Objekt 10) nur angezeigt, wenn das if zutrifft - wenn nicht, würde der erste Buchstabe fehlen.

KLappen sollte es mit folgendem Schnipsel:

10 = TEXT
10.current = 1
10.stdWrap.wrap = <b>|</b>
10.stdWrap.substring = 0,1
10.stdWrap.if.value = _
10.stdWrap.if.isLessThan.current = 1
10.stdWrap.if.isLessThan.substring = 0,1
10.stdWrap.if.negate = 0

15 < .10
15.stdWrap.if.negate = 1
15.stdWrap.wrap = |

20 = TEXT
20.current = 1
20.substring = 1
20.noTrimWrap = || |

Kann durchaus sein, das es an mancher Stelle nicht 100%ig ist oder optimierbar ist (z.B. crop/substring). Aber es läuft.

Viele Grüße
Julian

Danwe ·

Super, vielen Dank!
Funktioniert tadellos.

Das Problem war eigentlich lediglich dass mir nicht klar war dass folgendes funktioniert:

isLessThan.current = 1
isLessThan.substring = 0,1

erscheint aber doch ganz logisch.
Hier noch mal der ganze Code für alle dies interessiert:

  20 = TEXT
  20 {
    value = Noch ein ganz normaler Satz von Mir.
    split {
      token.char = 32
      cObjNum = 1
      1 {
        10 = TEXT
        10.current = 1                    
        10.stdWrap {
          wrap = <b>|</b>
          substring = 0,1
          if {
            value = _
            isLessThan.current = 1
            isLessThan.substring = 0,1
            negate = 0
          }          
        }
        
        15 < .10
        15.stdWrap.if.negate = 1
        15.stdWrap.wrap = |
        
        20 = TEXT
        20.current = 1
        20.substring = 1
        20.noTrimWrap = || |
      }
    }
  }

Ists eigentlich irgendwie Möglich hieraus eine Art Funktion zu machen, ich brauche den Vorgang nähmlich an zwei, drei Stellen ?

30 < .20
30.value = Ein anderer Satz

funktioniert ja sicherlich. Aber gehts auch noch etwas übersichtlicher, so dass ich dem Ganzen z.B. einen Namen zuweise und dann

30 < Name
30.value = Ein anderer Satz

verwenden kann?

Julian.​Hofmann ·

Du kannst in TS Objekte auslagern und kopieren bzw. referenzieren. D.h. Du kannst alles aus dem Objekt 20.split.1 in ein eigenes Objekt auf oberster Ebene packen (z.B. als temp.meinSatz) und kopierst es dann an den entsprechenden Stellen rein:

20 = TEXT
20 {
  value = Noch ein ganz normaler Satz von Mir.
  split {
    token.char = 32
    cObjNum = 1
    1 < temp.meinSatz
  }
}

Oder noch eine Ebene mehr mit auslagern...

Knalltuete ·

Kann das ganze auch mit einem TMENU benutzt werden?
Ich habe es versucht, aber dann werden alle Leerzeichen entfernt.. Bei normalem Text funktionierts super.

lib.menu = HMENU
lib.menu {
    
    wrap = <ul id="menu">|</ul>
    
    1 = TMENU
    1 {
        NO {
            stdWrap.htmlSpecialChars = 1  
            wrapItemAndSub = <li>|</li>
            ATagTitle.field = subtitle // title
            linkWrap = |<span class="spacer">&#124;</span> |*| |<span class="spacer">&#124;</span> |*| |

            stdWrap.innerWrap.cObject = COA
            stdWrap.innerWrap.cObject {
                10 = TEXT
                10 {
                    field = title
                    split {
                        token.char = 32
                        cObjNum = 1
                        1 {
                            10 = TEXT
                            10.current = 1                   
                            10.stdWrap {
                                wrap = <span class="firstLetter">|</span>
                                substring = 0,1
                                if {
                                    value = _
                                    isLessThan.current = 1
                                    isLessThan.substring = 0,1
                                    negate = 0
                                }
                                htmlSpecialChars = 1         
                            }
                
                            15 < .10
                            15.stdWrap.if.negate = 1
                            15.stdWrap.wrap = |
                
                            20 = TEXT
                            20.current = 1
                            20.substring = 1
                            20.noTrimWrap = || |
                        }
                    }
                }
            }
        }
        
        ACT < .NO
        ACT = 1
        ACT {
            ATagParams = class="act"
        }
    }
}
Danwe ·

Habe nun zwar schon längere Zeit nicht mehr mit TypoScript gearbeitet u. die Website steht noch in der Pipeline, aber ich paste mal einen Code-Schnipsel.

Bin mir aber nicht 100% sicher dass er richtig funktioniert, sollte aber eigentlich:

#--------------------------------
#            Menü:
#--------------------------------         
  
  marks.MAINNAV = HMENU
  marks.MAINNAV {
    1 = TMENU
    1 {
      noBlur = 1
      wrap = <ul id="mainNav"> | </ul>
      
      NO {
        //Erstem u. letzten Menüeintrag kennzeichnen, Einträge in Liste einfügen:
        allWrap = <li class="firstMenuEntry">|</li> |*| <li>|</li> |*| <li class="lastMenuEntry">|</li>
        
        ATagParams = id="mainNav_{field:title}"
        allStdWrap.insertData = 1
        
        //Dafür sorgen, dass Wortanfänge groß geschrieben werden:
        stdWrap.split {
          token.char = 32
          cObjNum = 1
          1 {
            10 = TEXT
            10.current = 1
            10.wrap = <big>|</big>
            10.crop = 1|
            20 < .10
            20.wrap = |
            20.crop =
            20.substring = 1
            20.noTrimWrap = || |
          }
        }
        
      }      
    }
  }
  
  marks.SUBNAV = COA
  marks.SUBNAV {
    
    10 = HMENU
    10 {
      
      entryLevel = 1
      
      1 = TMENU
      1 {
        noBlur = 1
        collapse = 1
        expAll = 0
        
        //Überschrift für Menü=Ebene 1 des menüs:
        stdWrap.prepend = HMENU
        stdWrap.prepend {
          special = rootline
          special.range = 1|1
          1 = TMENU
          1 {
            NO.linkWrap = |
            NO.doNotLinkIt = 1
            
            //Dafür sorgen, dass Wortanfänge groß geschrieben werden:
            NO.stdWrap.split {
              token.char = 32
              cObjNum = 1
              1 {
                10 = TEXT
                10.current = 1
                10.wrap = <big>|</big>
                10.crop = 1|
                20 < .10
                20.wrap = |
                20.crop =
                20.substring = 1
                20.noTrimWrap = || |
                30 = HTML
                30.value = &nbsp;
              }
            }
          }
          wrap = <dt>|</dt><dd><dl>
        }
        stdWrap.append = HTML
        stdWrap.append {
          value = </dl></dd>
          wrap = |
        }
        
        //wrap = <dd> | </dd>
        
        NO {      
          //allWrap = <dl> | </dl>
          linkWrap = <dd> | </dd>
          
          //Bild davor:
          before.cObject = COA
          before.cObject {
            10 = IMG_RESOURCE
            10.file = GIFBUILDER
            10.file {              
              XY = 156,62
              format = jpg
              quality = 90
              10 = IMAGE              
              10.file {
                import = uploads/media/
                import.field = media
                import.listNum = 0
              }
            }
            10.stdWrap {
              dataWrap.dataWrap = <dt><a href="index.php?id={field:uid}"><img src="|" alt=""/></a></dt>
            }
          }
          
          doNotLinkIt = 1
          
          //Link des Menüs ändern, damit Shortcuts anders behandelt werden:        
          stdWrap.cObject = CASE
          stdWrap.cObject {
            key.field = doktype
            
            default = TEXT
            default {
              typolink.parameter.field = uid
              field = title
              stdWrap.htmlSpecialChars = 1
            }
            
            // 4 = shortcut
            4 = TEXT
            4 {
              field = title
              typolink.parameter.field = shortcut
            }
            
            // 3 = external url
            3 = TEXT
            3 {
              field = title
              typolink.parameter.field = url
              typolink.extTarget.field = target
            }
            
          }
          
        } //END of: 'NO'
        
      }
    }
    
    
    //Zweite Menüebene als eigenes Menü unter Menü von Ebene 1 anzeigen:
    20 < .10
    20 {
      entryLevel=2
      1.stdWrap.prepend.special.range = 2|2
    }
    
    //Dritte Menüebene als eigenes Menü unter Menü von Ebene 2 anzeigen:
    30 < .10
    30 {
      entryLevel=3
      1.stdWrap.prepend.special.range = 3|3
    }    
  }
Danwe ·

Kann mich nicht erinnern jemals so ein Problem damit gehabt zu haben. Aber wie gesagt, ich habe Typo3 hier derzeit nicht laufen und kann nichts ausprobieren #paralyzed#

Knalltuete ·

Sehr merkwuerdig das ganze.. Falls du noch irgendeine Idee hast die ich testen kann, dann wuerde ich mich sehr ueber eine Antwort freuen 🙂