[3.2] BBCode schneidet Javascript ab

Fragen rund um die Installation, Administration und Benutzung von phpBB 3.1.x und höher und die Konvertierung zu phpBB 3.2.x.
Forumsregeln
Bitte im Thementitel den Präfix deiner phpBB-Version [3.1.x] oder [3.2.x] angeben.
Berthold
Mitglied
Beiträge: 12
Registriert: 23.02.2015 08:11

[3.2] BBCode schneidet Javascript ab

Beitragvon Berthold » 26.07.2017 20:20

Nach der Hochrüstung auf phpBB 3.2.0 funktionieren einige Tabellen BBCodes die Javascript enthalten nicht mehr. Da es im BBCode Parser wohl Probleme gegeben haben soll, habe ich erst einmal die Version 3.2.1 abgewartet. Nachdem die Fehler nicht verschwunden sind brauche ich euren Rat.

Es geht um folgendes Script (für den Test wird die Variabele direkt im Script gesetzt):

Code: Alles auswählen

<script language="Javascript">
// var texto = '{TEXT}';

var texto = 'L=Titel1&Titel2&Titel3 L=Z1 Spalte 1&Z1 Spalte 2&Z1 Spalte 3 L=Z2 Spalte 1&Z2 Spalte 2&Z2 Spalte 3 L=Z3 Spalte 1&Z3 Spalte 2&Z3 Spalte 3';
texto = texto.replace("\r\n","");
texto = texto.replace("<br>","");
texto = texto.replace(" ","");
var zeilen = new Array();
zeilen = texto.split('L=');

var table = '<svg height=\"0px\">\r';
table = table + '<style>\r';
table = table + '.divTable{\r';
table = table + '   display: table;\r';
table = table + '   width: 70%;\r';
table = table + '}\r';
table = table + '.divTableRow {\r';
table = table + '   display: table-row;\r';
table = table + '}\r';
table = table + '.divTableCell, .divTableHead {\r';
table = table + '   border: 1px solid #999999;\r';
table = table + '   display: table-cell;\r';
table = table + '   padding: 3px 10px;\r';
table = table + '}\r';
table = table + '.divTableHeading {\r';
table = table + '   background-color: #EEE;\r';
table = table + '   display: table-row;\r';
table = table + '   font-weight: bold;\r';
table = table + '}\r';
table = table + '.divTableFoot {\r';
table = table + '   background-color: #EEE;\r';
table = table + '   display: table-footer-group;\r';
table = table + '   font-weight: bold;\r';
table = table + '}\r';
table = table + '.divTableBody {\r';
table = table + '   display: table-row-group;\r';
table = table + '}\r';
table = table + '</style>\r';
table = table + '</svg>\r';
table = table + '\r';
table = table + '<div class=\"divTable\" style=\"width: 70%;border: 1px solid #000;\">\r';
table = table + '<div class=\"divTableBody\">\r';


for (var i=1; i<zeilen.length; i++)
{
   if (i == 1){
        table = table + '<div class=\"divTableHeading\">\r';
   }else{
        table = table + '<div class=\"divTableRow\">\r';
  }
  var coluna = new Array();
  spalten = zeilen[i].split('&');
  for (var j=0; j<spalten.length; j++)
  {
     table = table + '<div class=\"divTableCell\">' +spalten[j].replace("amp;","") +'</div>\r'
  }
  table = table + '</div>\r';
}
table = table + '</div>\r</div>\r';

document.write(table);
</script>

Das Script erzeugt eine kleine Tabelle, die aber nicht erscheint. Wenn ich mir den Seitenquelltext ansehe, fällt mir auf, dass nicht das ganze Script in die Seite eingebaut wurde. Auf der Seite finde ich dieses Script:

Code: Alles auswählen

<script language="Javascript" data-jsbunblockable="uD7aLGj42WBccqz">
// var texto = '';

var texto = 'L=Titel1&Titel2&Titel3 L=Z1 Spalte 1&Z1 Spalte 2&Z1 Spalte 3 L=Z2 Spalte 1&Z2 Spalte 2&Z2 Spalte 3 L=Z3 Spalte 1&Z3 Spalte 2&Z3 Spalte 3';
texto = texto.replace("\r\n","");
texto = texto.replace("<br>","");
texto = texto.replace(" ","");
var zeilen = new Array();
zeilen = texto.split('L=');

var table = '<svg height=\"0px\">\r';
table = table + '<style>\r';
table = table + '.divTable{\r';
table = table + '   display: table;\r';
table = table + '   width: 70%;\r';
table = table + '}\r';
table = table + '.divTableRow {\r';
table = table + '   display: table-row;\r';
table = table + '}\r';
table = table + '.divTableCell, .divTableHead {\r';
table = table + '   border: 1px solid #999999;\r';
table = table + '   display: table-cell;\r';
table = table + '   padding: 3px 10px;\r';
table = table + '}\r';
table = table + '.divTableHeading {\r';
table = table + '   background-color: #EEE;\r';
table = table + '   display: table-row;\r';
table = table + '   font-weight: bold;\r';
table = table + '}\r';
table = table + '.divTableFoot {\r';
table = table + '   background-color: #EEE;\r';
table = table + '   display: table-footer-group;\r';
table = table + '   font-weight: bold;\r';
table = table + '}\r';
table = table + '.divTableBody {\r';
table = table + '   display: table-row-group;\r';
table = table + '}\r';
table = table + '\r';
table = table + '\r';
table = table + '\r';
table = table + '<div class=\"divTable\" style=\"width: 70%;border: 1px solid #000;\">\r';
table = table + '<div class=\"divTableBody\">\r';


for (var i=1; i<zeilen.length; i++)
{
   if (i == 1){
        table = table + '<div class=\"divTableHeading\">\r';
   }else{
        table = table + '<div class=\"divTableRow\">\r';
  }
  var coluna = new Array();
  spalten = zeilen[i].split('&');
  for (var j=0; j<spalten.length; j++)
  {
     table = table + '<div class=\"divTableCell\">' + spalten[j].replace("&amp;","") + '</script>


Klar das da nichts passiert, da das Script nicht vollständig in die Seite übernommen wurde. Aber was ist dafür verantwortlich??? Gibt es eine maximale Länge für ein Script???

Gruß Berthold

Benutzeravatar
canonknipser
Supporter
Supporter
Beiträge: 1027
Registriert: 10.09.2011 11:14
Kontaktdaten:

Re: [3.2] BBCode schneidet Javascript ab

Beitragvon canonknipser » 26.07.2017 21:35

Berthold hat geschrieben: Gibt es eine maximale Länge für ein Script???
Das kann durchaus sein, oder eine maximale Länge für eine BBCode-Ersetzung im neuen BBCode-Parser.

Was ich an deiner Stelle probieren würde: Verschlanke das script, es geht ja anscheinend nur ein kleiner Teil am Ende verloren.
Also:
table (kommt am häufigsten vor) durch t oder tb ersetzen
wenn das nicht reicht: mach Spaghetti-Code (auch wenn es schwer fällt), sprich fasse Zeilen zusammen, also aus

Code: Alles auswählen

 T = T + 'a'
 T = T + 'b'
 T = T + 'c'
 T = T + 'd'

mach

Code: Alles auswählen

 T = T + 'a b c d'
Grüße, canonknipser
"there are only 10 types of people: those, who understand binary and those, who don't"
just arrived ;)
Kein Support via PN, nur im Board und (manchmal) im IRC

Berthold
Mitglied
Beiträge: 12
Registriert: 23.02.2015 08:11

Re: [3.2] BBCode schneidet Javascript ab

Beitragvon Berthold » 27.07.2017 14:15

Danke für die Hinweise. Es scheint aber nicht daran zu liegen. Auch mit kürzen der Variabelennamen und Teilspaghetti-Code hört das Script immer an der gleichen Stelle auf. Selbst wenn ich den CSS Teil komplett raus lasse ändert sich nichts. Was könne es noch sein?

Gruß Berthold

Benutzeravatar
Joyce&Luna
Mitglied
Beiträge: 1447
Registriert: 24.11.2013 18:14
Wohnort: NRW
Kontaktdaten:

Re: [3.2] BBCode schneidet Javascript ab

Beitragvon Joyce&Luna » 27.07.2017 15:19

Das könnte auch am Style liegen, probiere das mal in Prosilver aus und berichte

Anke
phpBB-Style-Design.de

Es kommt nicht darauf an, mit dem Kopf durch die Wand zu gehen, sondern mit den Augen die Tür zu finden.
Support zu meinen Styles, bitte die Fragen im Forum stellen und nicht per PN. Danke!

Berthold
Mitglied
Beiträge: 12
Registriert: 23.02.2015 08:11

Re: [3.2] BBCode schneidet Javascript ab

Beitragvon Berthold » 28.07.2017 11:17

Wir verwenden Prosilver. Daran liegt es also nicht.

Ich habe das Problem mal genauer untersucht und habe 2 Fehler gefunden.
1. Das Script wird ab einer Stelle fehlerhaft die mit </ beginnt (der nächste Begriff wird entfernt oder Script bricht ab).
2. Bei einem mehrzeiligen Übergabeparameter werden die returns vom BBCode-Parser nicht entfernt.

Fehler 1 kann man leicht beheben in dem man z. B.

Code: Alles auswählen

</div>

durch folgenden Code ersetzt.

Code: Alles auswählen

var divClose = '<' + '/';
divClose + 'div>'



Fehler 2 kann ebenfalls umgangen werden.

Code: Alles auswählen

[tabelle]
L=Titel1&Titel2&Titel3
L=Z1 Spalte 1&Z1 Spalte 2&Z1 Spalte 3
L=Z2 Spalte 1&Z2 Spalte 2&Z2 Spalte 3
L=Z3 Spalte 1&Z3 Spalte 2&Z3 Spalte 3
[/tabelle]

erzeugt diesen fehlerhaften Code (Syntaxerror)

Code: Alles auswählen

var texto = '
L=Titel1&amp;Titel2&amp;Titel3
L=Z1 Spalte 1&amp;Z1 Spalte 2&amp;Z1 Spalte 3
L=Z2 Spalte 1&amp;Z2 Spalte 2&amp;Z2 Spalte 3
L=Z3 Spalte 1&amp;Z3 Spalte 2&amp;Z3 Spalte 3
';


Schreibt man im Beitrag alles in eine Zeile, also so

Code: Alles auswählen

[tabelle]L=Titel1&Titel2&Titel3 L=Z1 Spalte 1&Z1 Spalte 2&Z1 Spalte 3 L=Z2 Spalte 1&Z2 Spalte 2&Z2 Spalte 3 L=Z3 Spalte 1&Z3 Spalte 2&Z3 Spalte 3[/tabelle]

wird dieser korrekte Code erzeugt.

Code: Alles auswählen

var texto = 'L=Titel1&amp;Titel2&amp;Titel3 L=Z1 Spalte 1&amp;Z1 Spalte 2&amp;Z1 Spalte 3 L=Z2 Spalte 1&amp;Z2 Spalte 2&amp;Z2 Spalte 3 L=Z3 Spalte 1&amp;Z3 Spalte 2&amp;Z3 Spalte 3';


Zur Behebung von Fehler 1 werde ich unsere Scripte anpassen. Bezüglich Fehler 2 hoffe ich auf eine Korrektur. Die Umgehungslösung alles in eine Zeile zu schreiben kommt nicht in Frage. Einerseits müssten alle bestehenden Tabellen geändert werden, andererseits ist die Eingabe einer größeren Tabelle einfach zu unübersichtlich.

Gruß Berthold

Benutzeravatar
gn#36
Administrator
Administrator
Beiträge: 9175
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: [3.2] BBCode schneidet Javascript ab

Beitragvon gn#36 » 30.07.2017 07:40

Vorab: ich kenne mich mit der neuen Engine für das Posting in 3.2 noch nicht wirklich aus. Die kann erheblich mehr als die Alte, aber das wird wohl dazu führen, dass du ein paar Schlüsselwörter in deinem Skript hast, die jetzt interpretiert werden.

Das Verhalten bei dem Text mit den Umbrüchen halte ich aber für normal. Die TEXT Platzhalter ersetzen halt stur 1:1 durch Inhalt mit Umbrüchen und allem.

Aber so oder so wäre mein Vorschlag, so ein umfangreiches Skript in eine Funktion zu gießen und in eine Datei zu stecken und die dann einzubinden statt das im bbcode zu machen. Die Datei kannst du z.b. in einer Mini Erweiterung platzieren und direkt im Template einbinden.

Bevor dich das abschreckt: So eine Erweiterung besteht gerade einmal aus drei Dateien und für so eine reine Template Ergänzung haben wir eine Anleitung in der KB: Eigene phpBB Erweiterungen erstellen.
Die dritte Datei gegenüber dem Beispiel ist das Skript, das in der HTML Datei dann eingebunden werden muss.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.


Zurück zu „Support-Forum“