WBCE CMS – Way Better Content Editing.
You are not logged in.
Hallo liebe Mitstreiter,
kennt ihr eine Möglichkeit den ersten "Zurück zum Anfang" Link gleich nach der erzeugten "Auf dieser Seite..." (also unter "div class toc") Section zu entfernen?
<div class="toc" style="margin:5px;padding:5px;border:1px solid #ccc;">
<a name="toc" style="font-weight:bold;">Auf dieser Seite...</a><br>
<span style="margin-left:20px;"><a href="#toc3">1. Link</a></span><br>
</div>
<a style="text-align:right;font-weight:bold;display:inherit;margin-bottom:-15px;" href="#toc" class="ZumAnfang">Zurück zum Anfang</a>
Vielen Dank
Andreas
Offline
Entweder so: Häng mal beim Droplet-Aufruf noch ein &skip=2 (oder &skip=3, je nach Template) ran, also z.B. so
[[CreateToc?float=right&skip=2]]
Dann werden die ersten beiden / die ersten drei Überschriften übergangen, allerdings auch im Inhaltsverzeichnis nicht mit aufgeführt.
Oder im Droplet-Code selbst, Zeile 57
( ( $i > 0 && $toplink ) ? '<br /><a href="#toc">'.(isset($btt[LANGUAGE]) ? $btt[LANGUAGE] : $btt['EN']).'</a><br />' : '' ).
da mal die 0 durch 1 oder 2 ersetzen:
( ( $i > 1 && $toplink ) ? '<br /><a href="#toc">'.(isset($btt[LANGUAGE]) ? $btt[LANGUAGE] : $btt['EN']).'</a><br />' : '' ).
dann erscheinen alle Headlines auf der Seite im ToC, aber bei den n ersten kein Zurücklink.
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
awuest
Es klappt leider nicht!!!
Aber sowie es aussieht, ist es nicht Nach der Tabelle, sondern vor dem ersten "Zurück zum Anfang" Link.
Mein Droplet sieht so aus ( + kleine Änderungen)
$toc = array();
$output = NULL;
$number = ( isset($number) ? true : false );
$skip = ( isset($skip) ? $skip : NULL ); // skip X headings
$toplink = ( isset($toplink)? $toplink : true ); // add 'back to top' links
$current = array( '1' => 0 );
$last = 1;
$dump = array();
$strings = array(
'DE' => 'Inhalt...',
'EN' => 'On this page...',
);
$btt = array(
'DE' => 'Zurück zum Anfang',
'EN' => 'Back to top',
);
preg_match_all( '#<h([1-6]).*>([^<].+)</h[1-6]>#i', $wb_page_data, $matches, PREG_PATTERN_ORDER );
if ( count($matches) ) {
$found = 0;
foreach( $matches[2] as $i => $text ) {
$found++;
if ( $skip && $found <= $skip ) {
continue;
}
$level = $matches[1][$i]; // current level
if ( $number ) {
if ( $level < $last ) {
for( $n=($level+1); $n<=$last; $n++ ) {
unset($current[$n]);
}
}
if ( isset( $current[$level] ) ) {
$current[$level]++;
}
else {
$current[$level]=1;
}
$prefix = array();
for( $m=1; $m<=$level; $m++ ) {
if ( ! isset($current[$m] ) ) {
$current[$m] = 1;
}
$prefix[] = $current[$m];
}
$text = implode('.', $prefix ) . ' ' . $text;
}
$last = $level;
$toc[] = '<span style="margin-left:'
. ( 10 * ( $level - 1 ) )
. 'px;"><a href="#toc'.$i.'">'.$text.'</a></span>';
$wb_page_data = str_replace(
$matches[0][$i],
( ( $i > 1 && $toplink ) ? '<a style="text-align:right;font-weight:bold;display:inherit;margin-bottom:-15px;" href="#toc" class="ZumAnfang">'.(isset($btt[LANGUAGE]) ? $btt[LANGUAGE] : $btt['EN']).'</a>' : '' ).
'<a name="toc'.$i.'"> </a>' . $matches[0][$i],
$wb_page_data
);
}
$output = '<div class="toc" style="margin:5px;padding:5px;border:1px solid #ccc;';
if ( isset($float) && $float == 'right' ) {
$output .= ' float:right;';
}
$output .= '">'
. '<a name="toc" style="font-weight:bold;">'
. ( isset($strings[LANGUAGE]) ? $strings[LANGUAGE] : $strings['EN'] )
. '</a><br />'
. implode( '<br />', $toc )
. '</div>';
}
// this removes double 'to top' links if CreateToc is called more than once
//<a href="#toc">Back to top</a><br /><a name="toc1"> </a><br /><a href="#toc">Back to top</a><br /><a name="toc1"> </a>
$regex = '('.preg_replace('~\s~','\\s*',preg_quote('<br /><a href="#toc">Back to top</a><br /><a name="toc','~').'\d+'.preg_quote('"> </a>','~')).'){2,}';
$wb_page_data = preg_replace(
'~'.$regex.'~',
'$1',
$wb_page_data
);
return $output;
Die Ausgabe ist diese:
https://photos.app.goo.gl/5v2M3Eow3atu5n619
Vielleicht habe ich durch meine Änderungen etwas anders ....
Viele Grüße
Andreas
Last edited by florian (16.07.2021 05:56:59)
Offline
Ich hatte einen Denkfehler. Der skip-Parameter kann raus.
Ändere die Zeile
( ( $i > 1 && $toplink ) ? '<a style="text-align:right;font-weight:bold;display:inherit;margin-bottom:-15px;" href="#toc" class="ZumAnfang">'.(isset($btt[LANGUAGE]) ? $btt[LANGUAGE] : $btt['EN']).'</a>' : '' ).
zu
( ( $i > 0 && $toplink ) ? '<a class="toplink'.$i.'" style="text-align:right;font-weight:bold;display:inherit;margin-bottom:-15px;" href="#toc" class="ZumAnfang">'.(isset($btt[LANGUAGE]) ? $btt[LANGUAGE] : $btt['EN']).'</a>' : '' ).
und füge vor
// this removes double 'to top' links if CreateToc is called more than once
ein:
$wb_page_data = str_replace('<a class="toplink1" style="text-align:right;font-weight:bold;display:inherit;margin-bottom:-15px;" href="#toc" class="ZumAnfang">Zurück zum Anfang</a>','',$wb_page_data);
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
Darf ich fragen, warum man $output auf NULL setzt und nicht auf "", wenn er nachher mit einem String gefüllt wird?
Vorteil? Nachteil? Egal?
Offline
habe es probiert, leider ohne Erfolg. Was jetzt passiert: jeder "Zum Anfang" Link bekommt eine class="toplink" der fortlaufend nummeriert wird: toplink1, toplink2 ... usw. Habe jetzt "Trick 17 " angewendet indem ich der Seite die body id zuweise und dieser toplink über css ausblende - nicht elegant aber es geht, bin aber für eine andere Lösung sehr dankbar. Vielen Dank, Andreas
Offline
Hast Du die 2. Zeile, die mit "$wb_page_data" beginnt, an genau der Stelle eingefügt wie beschrieben?
Wichtig ist auch, dass das, was da in den ersten einfachen Anführungszeichen steht, genau dem entspricht, was später nicht mehr auf der Seite erscheinen soll.
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
Das Droplet sieht jetzt so aus:
$toc = array();
$output = NULL;
$number = ( isset($number) ? true : false );
$skip = ( isset($skip) ? $skip : NULL ); // skip X headings
$toplink = ( isset($toplink)? $toplink : true ); // add 'back to top' links
$current = array( '1' => 0 );
$last = 1;
$dump = array();
$strings = array(
'DE' => 'Inhalt...',
'EN' => 'On this page...',
);
$btt = array(
'DE' => 'Zurück zum Anfang',
'EN' => 'Back to top',
);
preg_match_all( '#<h([1-6]).*>([^<].+)</h[1-6]>#i', $wb_page_data, $matches, PREG_PATTERN_ORDER );
if ( count($matches) ) {
$found = 0;
foreach( $matches[2] as $i => $text ) {
$found++;
if ( $skip && $found <= $skip ) {
continue;
}
$level = $matches[1][$i]; // current level
if ( $number ) {
if ( $level < $last ) {
for( $n=($level+1); $n<=$last; $n++ ) {
unset($current[$n]);
}
}
if ( isset( $current[$level] ) ) {
$current[$level]++;
}
else {
$current[$level]=1;
}
$prefix = array();
for( $m=1; $m<=$level; $m++ ) {
if ( ! isset($current[$m] ) ) {
$current[$m] = 1;
}
$prefix[] = $current[$m];
}
$text = implode('.', $prefix ) . ' ' . $text;
}
$last = $level;
$toc[] = '<span style="margin-left:'
. ( 10 * ( $level - 1 ) )
. 'px;"><a href="#toc'.$i.'">'.$text.'</a></span>';
$wb_page_data = str_replace(
$matches[0][$i],
( ( $i > 0 && $toplink ) ? '<a class="toplink'.$i.'" style="text-align:right; font-weight:bold; display:inherit;" href="#toc" class="ZumAnfang">'.(isset($btt[LANGUAGE]) ? $btt[LANGUAGE] : $btt['EN']).'</a>' : '' ).
'<a name="toc'.$i.'"> </a>' . $matches[0][$i],
$wb_page_data
);
}
$output = '<div class="toc" style="margin:5px;padding:5px;border:1px solid #ccc;';
if ( isset($float) && $float == 'right' ) {
$output .= ' float:right;';
}
$output .= '">'
. '<a name="toc" style="font-weight:bold;">'
. ( isset($strings[LANGUAGE]) ? $strings[LANGUAGE] : $strings['EN'] )
. '</a><br />'
. implode( '<br />', $toc )
. '</div>';
}
$wb_page_data = str_replace('<a class="toplink1" style="text-align:right;font-weight:bold;display:inherit;margin-bottom:-15px;" href="#toc" class="ZumAnfang">Zurück zum Anfang</a>','',$wb_page_data);
// this removes double 'to top' links if CreateToc is called more than once
//<a href="#toc">Back to top</a><br /><a name="toc1"> </a><br /><a href="#toc">Back to top</a><br /><a name="toc1"> </a>
$regex = '('.preg_replace('~\s~','\\s*',preg_quote('<br /><a href="#toc">Back to top</a><br /><a name="toc','~').'\d+'.preg_quote('"> </a>','~')).'){2,}';
$wb_page_data = preg_replace(
'~'.$regex.'~',
'$1',
$wb_page_data
);
return $output;
Offline
Na ja, siehst Du, da ist doch das Problem.
Der erzeugte Code sieht jetzt so aus:
<a class="toplink1"
style="text-align:right; font-weight:bold; display:inherit;"
href="#toc" class="ZumAnfang">Zurück zum Anfang</a>
Gesucht wird aber nach
<a class="toplink1"
style="text-align:right;font-weight:bold;display:inherit;margin-bottom:-15px;"
href="#toc" class="ZumAnfang">Zurück zum Anfang</a>
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
Auf ein Neues ;-)
$toc = array();
$output = NULL;
$number = ( isset($number) ? true : false );
$skip = ( isset($skip) ? $skip : NULL ); // skip X headings
$toplink = ( isset($toplink)? $toplink : true ); // add 'back to top' links
$current = array( '1' => 0 );
$last = 1;
$dump = array();
$strings = array(
'DE' => 'Inhalt...',
'EN' => 'On this page...',
);
$btt = array(
'DE' => 'Zurück zum Anfang',
'EN' => 'Back to top',
);
preg_match_all( '#<h([1-6]).*>([^<].+)</h[1-6]>#i', $wb_page_data, $matches, PREG_PATTERN_ORDER );
if ( count($matches) ) {
$found = 0;
foreach( $matches[2] as $i => $text ) {
$found++;
if ( $skip && $found <= $skip ) {
continue;
}
$level = $matches[1][$i]; // current level
if ( $number ) {
if ( $level < $last ) {
for( $n=($level+1); $n<=$last; $n++ ) {
unset($current[$n]);
}
}
if ( isset( $current[$level] ) ) {
$current[$level]++;
}
else {
$current[$level]=1;
}
$prefix = array();
for( $m=1; $m<=$level; $m++ ) {
if ( ! isset($current[$m] ) ) {
$current[$m] = 1;
}
$prefix[] = $current[$m];
}
$text = implode('.', $prefix ) . ' ' . $text;
}
$last = $level;
$toc[] = '<span style="margin-left:'
. ( 10 * ( $level - 1 ) )
. 'px;"><a href="#toc'.$i.'">'.$text.'</a></span>';
$wb_page_data = str_replace(
$matches[0][$i],
( ( $i > 0 && $toplink ) ? '<a class="toplink'.$i.'" style="text-align:right; font-weight:bold; display:inherit;" href="#toc">'.(isset($btt[LANGUAGE]) ? $btt[LANGUAGE] : $btt['EN']).'</a>' : '' ).
'<a name="toc'.$i.'"> </a>' . $matches[0][$i],
$wb_page_data
);
}
$output = '<div class="toc" style="margin:5px;padding:5px;border:1px solid #ccc;';
if ( isset($float) && $float == 'right' ) {
$output .= ' float:right;';
}
$output .= '">'
. '<a name="toc" style="font-weight:bold;">'
. ( isset($strings[LANGUAGE]) ? $strings[LANGUAGE] : $strings['EN'] )
. '</a><br />'
. implode( '<br />', $toc )
. '</div>';
}
$wb_page_data = str_replace('<a class="toplink1" style="text-align:right;font-weight:bold;display:inherit;" href="#toc">Zurück zum Anfang</a>','',$wb_page_data);
// this removes double 'to top' links if CreateToc is called more than once
//<a href="#toc">Back to top</a><br /><a name="toc1"> </a><br /><a href="#toc">Back to top</a><br /><a name="toc1"> </a>
$regex = '('.preg_replace('~\s~','\\s*',preg_quote('<br /><a href="#toc">Back to top</a><br /><a name="toc','~').'\d+'.preg_quote('"> </a>','~')).'){2,}';
$wb_page_data = preg_replace(
'~'.$regex.'~',
'$1',
$wb_page_data
);
return $output;
Offline
Letzter Versuch, sonst bin ich raus.
$toc = array();
$output = NULL;
$number = ( isset($number) ? true : false );
$skip = ( isset($skip) ? $skip : NULL ); // skip X headings
$toplink = ( isset($toplink)? $toplink : true ); // add 'back to top' links
$current = array( '1' => 0 );
$last = 1;
$dump = array();
$strings = array(
'DE' => 'Inhalt...',
'EN' => 'On this page...',
);
$btt = array(
'DE' => 'Zurück zum Anfang',
'EN' => 'Back to top',
);
preg_match_all( '#<h([1-6]).*>([^<].+)</h[1-6]>#i', $wb_page_data, $matches, PREG_PATTERN_ORDER );
if ( count($matches) ) {
$found = 0;
foreach( $matches[2] as $i => $text ) {
$found++;
if ( $skip && $found <= $skip ) {
continue;
}
$level = $matches[1][$i]; // current level
if ( $number ) {
if ( $level < $last ) {
for( $n=($level+1); $n<=$last; $n++ ) {
unset($current[$n]);
}
}
if ( isset( $current[$level] ) ) {
$current[$level]++;
}
else {
$current[$level]=1;
}
$prefix = array();
for( $m=1; $m<=$level; $m++ ) {
if ( ! isset($current[$m] ) ) {
$current[$m] = 1;
}
$prefix[] = $current[$m];
}
$text = implode('.', $prefix ) . ' ' . $text;
}
$last = $level;
$toc[] = '<span style="margin-left:'
. ( 10 * ( $level - 1 ) )
. 'px;"><a href="#toc'.$i.'">'.$text.'</a></span>';
$wb_page_data = str_replace(
$matches[0][$i],
( ( $i > 0 && $toplink ) ? '<a class="toplink'.$i.'" style="text-align:right; font-weight:bold; display:inherit;" href="#toc">'.(isset($btt[LANGUAGE]) ? $btt[LANGUAGE] : $btt['EN']).'</a>' : '' ).
'<a name="toc'.$i.'"> </a>' . $matches[0][$i],
$wb_page_data
);
}
$output = '<div class="toc" style="margin:5px;padding:5px;border:1px solid #ccc;';
if ( isset($float) && $float == 'right' ) {
$output .= ' float:right;';
}
$output .= '">'
. '<a name="toc" style="font-weight:bold;">'
. ( isset($strings[LANGUAGE]) ? $strings[LANGUAGE] : $strings['EN'] )
. '</a><br />'
. implode( '<br />', $toc )
. '</div>';
}
$wb_page_data = str_replace('<a class="toplink1" style="text-align:right; font-weight:bold; display:inherit;" href="#toc">Zurück zum Anfang</a>','',$wb_page_data);
// this removes double 'to top' links if CreateToc is called more than once
//<a href="#toc">Back to top</a><br /><a name="toc1"> </a><br /><a href="#toc">Back to top</a><br /><a name="toc1"> </a>
$regex = '('.preg_replace('~\s~','\\s*',preg_quote('<br /><a href="#toc">Back to top</a><br /><a name="toc','~').'\d+'.preg_quote('"> </a>','~')).'){2,}';
$wb_page_data = preg_replace(
'~'.$regex.'~',
'$1',
$wb_page_data
);
return $output;
@berny: keine Ahnung. Das Droplet ist nicht von mir.
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
Habe auch
$wb_page_data = str_replace('<a class="toplink1" mit toplink ersetzt, da tut sich nichts, Sorry
Offline
Mit dem zuletzt von mir geposteten Code funktionierts auf meiner Testwebsite.
Bei dem Droplet passieren folgende Dinge:
1. Der gesamte Output wird eingelesen und alle Überschriften identifiziert.
2. Daraus wird das Inhaltsverzeichnis generiert.
3. Über dem eigentlichen Seiteninhalt wird das Inhaltsverzeichnis eingefügt.
4. Im Seiteninhalt wird mittels einer Schleife vor jede Überschrift der Zurück-Link gesetzt.
Hinzu kommt nun noch
5. Im Seiteninhalt wird nach dem exakten Vorkommen (Zeilenumbrüche nur hier im Forum zur besseren Lesbarkeit!) von
<a class="toplink1"
style="text-align:right; font-weight:bold; display:inherit;"
href="#toc" class="ZumAnfang">Zurück zum Anfang</a>
gesucht, und, sofern dies gefunden wird, durch einen Leerstring ersetzt.
Wenn es nur eine kleine Abweichung - im konkreten Fall: Leerzeichen nach den Strichpunkten in den Inline-Style-Anweisungen - gibt, wird der betr. Vergleichsstring nicht gefunden und der unerwünschte Zurück-Link bleibt folglich drin.
Eine andere Möglichkeit wäre sonst noch, auf Schritt 5 zu verzichten und nur mittels der durch die Anpassung vorhandenen CSS-Klasse den unerwünschten Link auszublenden, also im Template-Stylesheet zu ergänzen
.toplink1 {display:none;}
Nur bei der ganzen Zeit, die jetzt hier in diese Sache versenkt worden ist, wäre es inzwischen wahrscheinlich 5x schneller gegangen, das Inhaltsverzeichnis und die Zurück-Links von Hand zu erzeugen.
Last edited by florian (16.07.2021 12:13:53)
Sorgen sind wie Nudeln: man macht sich meist zu viele.
Offline
webbird, awuest
Darf ich fragen, warum man $output auf NULL setzt und nicht auf "", wenn er nachher mit einem String gefüllt wird?
Vorteil? Nachteil? Egal?
An dieser Stelle ist es egal, an anderer ist NULL halt nicht das Gleiche wie ein leerer String, da kann das relevant sein. Gewohnheit.
Ich habe eine Amazon-Wishlist. Oder spende an das Projekt.
Ich kann, wenn ich will, aber wer will, dass ich muss, kann mich mal
Offline
berny
Danke Florian für die Erklärung und die angebotene Lösung.
Ein schönes Wochenende
Andreas
Offline
Pages: 1