PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wiki-Code <-> HTML-Code



PierreS
19-03-2006, 13:51
Hallo,

ich komme gerade bei einem Problem nicht wirklich weiter. Es geht um Wiki-Code, den ich nach HTML umwandeln möchte und vor allem auch umgekehrt.

Beispiel:

Wiki-Code:


* a
* b
** c
* d


wird zu HTML-Code:


<ul><li>a</li><li>b<ul><li>c</li></ul></li><li>d</li></ul>


Die Umwandlung von Wiki- nach HTML-Code habe ich mittlerweile in den Griff bekommen:


private function makeList($in)
{
$in = trim(str_replace('\"', '"', $in));

$out = '';
$last = 0;

foreach (explode("\n", $in) as $line)
{
$cur = 0;

/* Ermittle die aktuelle Tiefe */
while (strlen($line) > $cur && $line[$cur] == '*')
{
$cur++;
}

/* eine Ebene tiefer */
if ($cur > $last)
{
$cur = $last + 1;

$out .= '<ul>';
}
/* eine oder mehrere Ebene höher */
elseif ($cur < $last)
{
$out .= '</li>';

for ($j = $last; $j > $cur; $j--)
{
$out .= '</ul></li>';
}
}
else
{
$out .= '</li>';
}

/* Füge Zeile ohne Ebenenzeichen und Leerzeichen (+1) hinzu */
$out .= '<li>'.substr($line, $cur+1);

$last = $cur;
}

/* Alle geöffneten Tags auf jeden Fall schließen */
while ($cur > 0)
{
$out .= '</li></ul>';
$cur--;
}

return $out;
}


Nur jetzt bekomme ich Rückwandlung nicht hin. Hat hier jemand vielleicht eine gute Idee? Ich stehe da ziemlich aufm Schlauch ;-)

Grüße

Pierre

jeebee
19-03-2006, 15:11
besorg dir den quellcode der wiki-software und schau wies da gemacht wird.

(das was für Wikipedia gebraucht wird: http://www.mediawiki.org/wiki/MediaWiki)

PierreS
19-03-2006, 16:55
Hallo,

ich habe mir mich mal vom Algorithmus von coWiki inspirieren lassen. Das Ganze habe ich vereinfacht und refaktorisiert:


private function unmakeList($in)
{
$in = str_replace('\"', '"', $in);
$in = str_replace('</li>', '', $in);

$out = '';
$depth = 0;

while (preg_match('/<([^>]*)>([^<]*)(.*)/sS', $in, $matches))
{
switch ($matches[1])
{
case 'ul' :
$depth++;
break;

case 'li' :
$out .= str_repeat('*', $depth).' '.$matches[2]."\n";
break;

case '/ul' :
$depth--;
if ($depth == 0)
{
$out .= $matches[2];
}
break;
}

$in = $matches[3];
}

return $out;
}


Bisher scheint es zu funktionieren.