=================================================================== RCS file: /home/cvs/edge/src/wiki/wiki.pl,v retrieving revision 1.2 diff -c -r1.2 wiki.pl *** wiki.pl 24 May 2003 12:32:24 -0000 1.2 --- wiki.pl 24 May 2003 12:51:10 -0000 *************** *** 1236,1241 **** --- 1236,1244 ---- if ($UseHeadings) { s/(^|\n)\s*(\=+)\s+([^\n]+)\s+\=+/&WikiHeading($1, $2, $3)/geo; } + ## Tables: + s/^\|([^|]*)\s*/<TR class=wikitablerow><TD class=wikitablecell>$1<\/TD>\n/g; # start of line; new table-row ## TAB + s/\|([^|]*)\s*/<td class=wikitablecell>$1<\/td>\n/g; #table new field ## TAB } return $_; } *************** *** 1243,1248 **** --- 1246,1252 ---- sub WikiLinesToHtml { my ($pageText) = @_; my ($pageHtml, @htmlStack, $code, $depth, $oldCode); + my ($tag); #table @htmlStack = (); $depth = 0; *************** *** 1264,1274 **** } elsif (/^[ \t].*\S/) { $code = "PRE"; $depth = 1; } else { $depth = 0; } while (@htmlStack > $depth) { # Close tags as needed ! $pageHtml .= "</" . pop(@htmlStack) . ">\n"; } if ($depth > 0) { $depth = $IndentLimit if ($depth > $IndentLimit); --- 1268,1285 ---- } elsif (/^[ \t].*\S/) { $code = "PRE"; $depth = 1; + } elsif (/^[\|\+].*\S/) { #table + $code = "TABLE"; #table + $depth = 1; #table } else { $depth = 0; } while (@htmlStack > $depth) { # Close tags as needed ! $tag = pop(@htmlStack); #table ! if ($tag eq "TABLE") { #table ! $pageHtml .= "</TR>\n"; #table ! $tag = "table"; } #table ! $pageHtml .= "</" . $tag . ">\n"; #table } if ($depth > 0) { $depth = $IndentLimit if ($depth > $IndentLimit); *************** *** 1281,1287 **** } while (@htmlStack < $depth) { push(@htmlStack, $code); ! $pageHtml .= "<$code>\n"; } } s/^\s*$/<p>\n/; # Blank lines become <p> tags --- 1292,1302 ---- } while (@htmlStack < $depth) { push(@htmlStack, $code); ! if ($code eq "TABLE") { #table ! $pageHtml .= "<TABLE class=wikitable>\n"; #table ## TAB ! } else { #table ! $pageHtml .= "<$code>\n"; ! } #table } } s/^\s*$/<p>\n/; # Blank lines become <p> tags
sub CommonMarkup { my ($text, $useImage, $doLines) = @_; local $_ = $text; if ($doLines < 2) { # 2 = do line-oriented only # The <nowiki> tag stores text with no markup (except quoting HTML) s/\<nowiki\>((.|\n)*?)\<\/nowiki\>/&StoreRaw($1)/ige; # The <pre> tag wraps the stored text with the HTML <pre> tag s/\<pre\>((.|\n)*?)\<\/pre\>/&StorePre($1, "pre")/ige; s/\<code\>((.|\n)*?)\<\/code\>/&StorePre($1, "code")/ige; if ($HtmlTags) { my ($t); foreach $t (@HtmlPairs) { s/\<$t(\s[^<>]+?)?\>(.*?)\<\/$t\>/<$t$1>$2<\/$t>/gis; } foreach $t (@HtmlSingle) { s/\<$t(\s[^<>]+?)?\>/<$t$1>/gi; } } else { # Note that these tags are restricted to a single line s/\<b\>(.*?)\<\/b\>/<b>$1<\/b>/gi; s/\<i\>(.*?)\<\/i\>/<i>$1<\/i>/gi; s/\<strong\>(.*?)\<\/strong\>/<strong>$1<\/strong>/gi; s/\<em\>(.*?)\<\/em\>/<em>$1<\/em>/gi; } s/\<tt\>(.*?)\<\/tt\>/<tt>$1<\/tt>/gis; # <tt> (MeatBall) if ($HtmlLinks) { s/\<A(\s[^<>]+?)\>(.*?)\<\/a\>/&StoreHref($1, $2)/gise; } if ($FreeLinks) { # Consider: should local free-link descriptions be conditional? # Also, consider that one could write [[Bad Page|Good Page]]? s/\[\[$FreeLinkPattern\|([^\]]+)\]\]/&StorePageOrEditLink($1, $2)/geo; s/\[\[$FreeLinkPattern\]\]/&StorePageOrEditLink($1, "")/geo; } if ($BracketText) { # Links like [URL text of link] s/\[$UrlPattern\s+([^\]]+?)\]/&StoreBracketUrl($1, $2)/geos; s/\[$InterLinkPattern\s+([^\]]+?)\]/&StoreBracketInterPage($1, $2)/geos; if ($WikiLinks && $BracketWiki) { # Local bracket-links s/\[$LinkPattern\s+([^\]]+?)\]/&StoreBracketLink($1, $2)/geos; } } s/\[$UrlPattern\]/&StoreBracketUrl($1, "")/geo; s/\[$InterLinkPattern\]/&StoreBracketInterPage($1, "")/geo; s/$UrlPattern/&StoreUrl($1, $useImage)/geo; s/$InterLinkPattern/&StoreInterPage($1)/geo; if ($WikiLinks) { s/$LinkPattern/&GetPageOrEditLink($1, "")/geo; } s/$RFCPattern/&StoreRFC($1)/geo; s/$ISBNPattern/&StoreISBN($1)/geo; if ($ThinLine) { s/(^|\n)\s*-------+/<hr noshade class=wikiline style="height:4px">/g; # ThinLine fix ##TAB s/(^|\n)\s*------+/<hr noshade class=wikiline style="height:3px">/g; # ThinLine fix ##TAB } else { s/(^|\n)\s*----+/<hr class=wikiline>/g; ##TAB } } if ($doLines) { # 0 = no line-oriented, 1 or 2 = do line-oriented # The quote markup patterns avoid overlapping tags (with 5 quotes) # by matching the inner quotes for the strong pattern. s/('*)'''(.*?)'''/$1<strong>$2<\/strong>/g; s/''(.*?)''/<em>$1<\/em>/g; if ($UseHeadings) { s/(^|\n)\s*(\=+)\s+([^\n]+)\s+\=+/&WikiHeading($1, $2, $3)/geo; } ## Tables: s/^\|([^|]*)\s*/<TR class=wikitablerow><TD class=wikitablecell>$1<\/TD>\n/g; # start of line; new table-row ## TAB s/\|([^|]*)\s*/<td class=wikitablecell>$1<\/td>\n/g; #table new field ## TAB } return $_; } sub WikiLinesToHtml { my ($pageText) = @_; my ($pageHtml, @htmlStack, $code, $depth, $oldCode); my ($tag); #table @htmlStack = (); $depth = 0; $pageHtml = ""; foreach (split(/\n/, $pageText)) { # Process lines one-at-a-time $_ .= "\n"; if (s/^(\;+)([^:]+\:?)\:/<dt>$2<dd>/) { $code = "DL"; $depth = length $1; } elsif (s/^(\:+)/<dt><dd>/) { $code = "DL"; $depth = length $1; } elsif (s/^(\*+)/<li>/) { $code = "UL"; $depth = length $1; } elsif (s/^(\#+)/<li>/) { $code = "OL"; $depth = length $1; } elsif (/^[ \t].*\S/) { $code = "PRE"; $depth = 1; } elsif (/^[\|\+].*\S/) { #table $code = "TABLE"; #table $depth = 1; #table } else { $depth = 0; } while (@htmlStack > $depth) { # Close tags as needed $tag = pop(@htmlStack); #table if ($tag eq "TABLE") { #table $pageHtml .= "</TR>\n"; #table $tag = "table"; } #table $pageHtml .= "</" . $tag . ">\n"; #table } if ($depth > 0) { $depth = $IndentLimit if ($depth > $IndentLimit); if (@htmlStack) { # Non-empty stack $oldCode = pop(@htmlStack); if ($oldCode ne $code) { $pageHtml .= "</$oldCode><$code>\n"; } push(@htmlStack, $code); } while (@htmlStack < $depth) { push(@htmlStack, $code); if ($code eq "TABLE") { #table $pageHtml .= "<TABLE class=wikitable>\n"; #table ## TAB } else { #table $pageHtml .= "<$code>\n"; } #table } } s/^\s*$/<p>\n/; # Blank lines become <p> tags $pageHtml .= &CommonMarkup($_, 1, 2); # Line-oriented common markup } while (@htmlStack > 0) { # Clear stack $pageHtml .= "</" . pop(@htmlStack) . ">\n"; } return $pageHtml; }