Seite 1 von 1

[3.2] BBCode schneidet Javascript ab

Verfasst: 26.07.2017 20:20
von Berthold
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("&","") + '</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

Re: [3.2] BBCode schneidet Javascript ab

Verfasst: 26.07.2017 21:35
von canonknipser
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'

Re: [3.2] BBCode schneidet Javascript ab

Verfasst: 27.07.2017 14:15
von Berthold
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

Re: [3.2] BBCode schneidet Javascript ab

Verfasst: 27.07.2017 15:19
von Joyce&Luna
Das könnte auch am Style liegen, probiere das mal in Prosilver aus und berichte

Anke

Re: [3.2] BBCode schneidet Javascript ab

Verfasst: 28.07.2017 11:17
von Berthold
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&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
';
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&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';
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

Re: [3.2] BBCode schneidet Javascript ab

Verfasst: 30.07.2017 07:40
von gn#36
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: KB:ext_erstellen.
Die dritte Datei gegenüber dem Beispiel ist das Skript, das in der HTML Datei dann eingebunden werden muss.