I am writing a wiki2html conversion subroutine and need help when it comes to lists and tables. Wiki syntax for a lists and tables is as follows:
Unorderd List:
* level 1
** level 2
*** level 3
Ordered Lists
# level 1
## level 2
### level 3
#3 restart numbering from 3
Tables
[col1][col2][col3]
[col1][col2][col3]
Any suggestions on how to do this? Here is what I have so far.
Update: I tried several existing modules with no success but I was able to get it working on my own... Code updated to reflect my changes.
use strict;
my $text=qq|
-This is a h1 title
''This is italized''
and here, ''''this is bold'''' on this line
''''''this is bold italic'''''' on this line
----
*list1
**list2
***list3
#unordered list1
##unordered list2
###unordered list3
[''''name''''][''color''][''''''age'''''']
[bob][red][32]
[fred][orange][55]
|;
my $html=wiki2html($text);
print $html;
exit;
#############
sub wiki2html{
my $str=shift || return;
#http://wiki.beyondunreal.com/wiki/Wiki_Markup
#---- <hr>
#At the beginning, - <h1>, -- <h2>, --- <h3>
#Unorderd lists *, **
#Ordered lists #, ##
#tables [col1][col2]
#''sdfs'' <i>, ''''sdfs'''' <b>, ''''''sddfs'''''' <b><i>
my @lines=split(/[\r\n]/,$str);
my $linecnt=@lines;
my $dot='&#' . '9679' . ';';
my $space='&' . 'nbsp' . ';';
my %Marker=(
ul => 0,
ol => 0,
table => 0,
);
for(my $x=0;$x<$linecnt;$x++){
$lines[$x]=strip($lines[$x]);
my $original=$lines[$x];
my $break=1;
#---- <hr>
$lines[$x]=~s/\-{4,4}/\<hr size\=\"1\"\>/sig;
#At the beginning, - <h1>, -- <h2>, --- <h3>
if($lines[$x]=~/^(\-{1,3})(.+)/s){
my $dashes=$1;
my $txt=$2;
my $count = $dashes =~ tr/\-//;
$lines[$x]=qq|<h$count>$txt</h$count>|;
$break=0;
}
#Unorderd lists *, **
if($lines[$x]=~/^([\*\.\0]+)(.+)/s){
my $stars=$1;
my $txt=$2;
my $count = $stars =~ tr/[\*\.\0]//;
#$txt .= qq|<!-- ul: $Marker{ul} ,$count -->|;
if($count > $Marker{ul}){
$lines[$x]="<ul><li>" . $txt;
$Marker{ul}=$count;
}
elsif($count == $Marker{ul}){
$lines[$x]="<li>" . $txt;
}
else{
$lines[$x] = "</ul>";
if(length($txt)){$lines[$x] .= "<li>" . $txt ;}
$Marker{ul}=$count;
}
$break=0;
}
elsif($Marker{ul}){
for(my $u=0;$u<$Marker{ul};$u++){
$lines[$x] = "</ul>" . $lines[$x];
}
$Marker{ul}=0;
}
#Orderd lists #, ##
if($lines[$x]=~/^([\#]+)(.+)/s){
my $stars=$1;
my $txt=$2;
my $count = $stars =~ tr/[\#]//;
#$txt .= qq|<!-- ul: $Marker{ul} ,$count -->|;
if($count > $Marker{ol}){
$lines[$x]="<ol><li>" . $txt;
$Marker{ol}=$count;
}
elsif($count == $Marker{ol}){
$lines[$x]="<li>" . $txt;
}
else{
$lines[$x] = "</ol>";
if(length($txt)){$lines[$x] .= "<li>" . $txt ;}
$Marker{ol}=$count;
}
$break=0;
}
elsif($Marker{ol}){
for(my $u=0;$u<$Marker{ol};$u++){
$lines[$x] = "</ol>" . $lines[$x];
}
$Marker{ol}=0;
}
if(length($lines[$x])==0){$break=0;}
#''sdfs'' <i>, ''''sdfs'''' <b>, ''''''sddfs'''''' <b><i>
$lines[$x]=~s/\'{6,6}(.+?)\'{6,6}/<b><i>\1<\/i><\/b>/s
+ig;
$lines[$x]=~s/\'{4,4}(.+?)\'{4,4}/<b>\1<\/b>/sig;
$lines[$x]=~s/\'{2,2}(.+?)\'{2,2}/<i>\1<\/i>/sig;
#links [[ ]]
if($lines[$x]=~/\[\[(.+?)\]\]/s){
$lines[$x]=~s/\[\[(.+?)\]\]/\<a href=\"\1\"\ target="_new"
+>\1<\/a>/sg;
}
#tables [col1][col2]
my @cols=();
while($lines[$x]=~/\[(.+?)\]/sg){
push(@cols,$1);
}
my $colcnt=@cols;
if($colcnt){
$break=0;
$lines[$x]='';
if(!$Marker{table}){
$lines[$x] .= qq|<table cellspacing="0" cellpadding="2
+" border="1" style="border-collapse:collapse">\n|;
$Marker{table}=1;
}
$lines[$x] .= "<tr>";
foreach my $col (@cols){$lines[$x] .= qq|<td>$col</td>|;}
$lines[$x] .= "</tr>";
}
elsif($Marker{table}){
$lines[$x] = "</table>";
$Marker{table}=0;
}
#$lines[$x]=qq|<!--colcnt:$colcnt, table:$Marker{table}, Origi
+nal: $original -->\n| . $lines[$x];
if($break){$lines[$x] .= "<br>";}
}
if($Marker{ul}){
for(my $u=0;$u<$Marker{ul};$u++){
push(@lines,"</ul>");
}
$Marker{ul}=0;
}
if($Marker{ol}){
for(my $u=0;$u<$Marker{ol};$u++){
push(@lines,"</ol>");
}
$Marker{ol}=0;
}
if($Marker{table}){
push(@lines,"</table>");
$Marker{table}=0;
}
return join("\r\n",@lines);
}
###############
sub strip{
#usage: $str=strip($str);
#info: strips off beginning and endings returns, newlines, tabs, a
+nd spaces
my $str=shift;
if(length($str)==0){return;}
$str=~s/^[\r\n\s\t]+//s;
$str=~s/[\r\n\s\t]+$//s;
return $str;
}
2006-02-13 Retitled by Steve_p, as per Monastery guidelines
Original title: 'wiki2html'