@lukasbestle thank you for explaining.
is solved it using a hack. generating valid closed elements and later removing them with kirbytext::post. to be removed elements are flagged with a unicode char thats 99.9% not appearing on my clients page.
site/tags/zweispalter.php
<?php
if(!defined('ZS_REM')) define('ZS_REM', str::utf8(json_decode('"'.'\u029A'.'"')));
kirbytext::$tags['zweispalter'] = array(
'attr' => array(
'class',
'farbe',
),
'html' => function($tag) {
$c = strlen($tag->attr('class')) == 0 ? '' : str::lower($tag->attr('class'));
$f = strlen($tag->attr('farbe')) == 0 ? '' : str::lower($tag->attr('farbe'));
$r = '';
$z = str::lower($tag->attr('zweispalter'));
if(in_array($z, ['start','anfang','begin','beginn']))
$r = "<div class='row {$f} {$c}'><div class='col'>".ZS_REM."</div>".ZS_REM."</div>";
else if (in_array($z, ['break','spalte','umbruch','br']))
$r = ZS_REM."<div></div><div class='col'>".ZS_REM."</div>";
else if (in_array($z, ['end','ende','stop']))
$r = ZS_REM."<div>".ZS_REM."<div></div></div>";
return $r;
}
);
kirbytext::$post[] = function($kirbytext, $text) {
return str_replace(
[ZS_REM.'<div>', ZS_REM.'</div>', "<br />".PHP_EOL."</div><div class='col'><br />","<p></div><div class='col'><br />", "</div></div></p>","<p></p>","<p></div><div class='col'></p>"],
['','',"</p>".PHP_EOL."</div><div class='col'><p>","</div><div class='col'><p>","</p></div></div>",'',"</div><div class='col'>"], $text);
};