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:
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!
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
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?
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...
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">|</span> |*| |<span class="spacer">|</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"
}
}
}
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 =
}
}
}
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
}
}
Leider werden mir auch hier alle Leerzeichen rausgeschmissen.. Mach ich irgendetwas falsch oder ist das bei dir auch so?
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#
Sehr merkwuerdig das ganze.. Falls du noch irgendeine Idee hast die ich testen kann, dann wuerde ich mich sehr ueber eine Antwort freuen 🙂