#!/usr/bin/perl # $Id: parsewiki,v 1.29 2002/10/08 17:23:05 villate Exp $ # parsewiki - Parses a text file, with formatting such as that used in a Wiki sub Copying { print <<'EndTerms'; Copyright (C) 2002 Jaime Villate This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Some of the subroutines used are based on the Use Mod Wiki script , version 0.92 (April 21, 2001) by Clifford A. Adams EndTerms exit; } sub Usage { print STDERR <<"EndUsage"; Usage: $0 [OPTION]... [FILE] Options: -f, --format=FORMAT Output format; one of html, xhtml, docbook, latex. (default html) -T, --title=TITLE Title. -t, --template=FILE File with a template to use instead of thestandard. -c, --copyright Display copyright and copying permission statement. -h, --help Show this usage summary. FILE is a simple text file with wiki formating syntax. The result will be sent to the Standard Output. If FILE is not given, input will be taken from the Standard Input. Examples: $0 myfile.wiki cat file.txt | $0 -fdocbook --title="An Example" >file.xml Report bugs to . EndUsage exit 1; } use strict; use vars qw($SaveUrlIndex $UrlProtocols $UrlPattern $authorcount $figcount $UrlProtocols2 $UrlPattern2 $ImageExtensions $FS $frontmatter $FreeLinkPattern $IndentLimit $language $Format $Template $title $lang $babel $LT $GT $BL $BR $firstheading $Languages $Titles $Authors $Orgs $Addresses $Dates $Versions $Abstracts $Figures @Title @Author @Org @Address @Date @Version @Abstract @Figure @Language @BabelLang @Tag %SaveUrl %OpenTag %CloseTag %OpenItem %CloseItem %Meta %LangCode $Revision $LF); # Configuration variables and Default options %SaveUrl = (); $SaveUrlIndex = 0; $authorcount = 0; @Tag = qw(ul ol dl pre em strong code img a p dt); %OpenItem = qw(ol
  • ul
  • dl
    ); %CloseItem = qw(ol
  • ul dl ); $Format = 'html'; $Revision = q($Revision: 1.29 $); my $file = &GetOpts(); # Process command line options # Set up output format $_ = $Format; FORMAT: { if (/^html$/i) { &SetUpHTML; last FORMAT} if (/^xhtml$/i) { &SetUpXHTML; last FORMAT} if (/^docbook$/i) { &SetUpDB; last FORMAT} if (/^latex$/i) { &SetUpLatex; last FORMAT} die "$0: Unknown format \"$Format\"\n\n"; } # Get input file open (IN,"<$file") or die "$0: Cannot read file $file\n\n" ; undef $/; my $page = ; close IN; &InitLinkPatterns(); &InitLangTables(); $page =~ s/([^\\])\\\\\r?\n/$1$FS$FS/go; # Encode paragraph breaks $page =~ s/([^\\])\\\r?\n/$1 /g; # Join (text) lines ending in backslash ($firstheading) = ($page =~ /=\s+([^=]*)\s+=/); if ($Format =~ /latex/i) { $page = &QuoteLatex1($page); } else { $page = &QuoteHtml($page); } $page = &CommonMarkup($page, 1, 0); # Multi-line markup $page = &WikiLinesToHtml($page); # Line-oriented markup # Get the title, if not defined by a command-line option $title = $Meta{'title'} if ($Meta{'title'} && !$title); $title = $firstheading unless $title; $babel = $BabelLang[$language]; $lang = ' lang="' . $Meta{language} . '"' if ($Meta{language}); $_ = $Format; FORMAT: { if (/^html$/i) { &SetHTMLFront; last FORMAT } if (/^xhtml$/i) { &SetXHTMLFront; last FORMAT } if (/^docbook$/i) { &SetDBFront; last FORMAT } if (/^latex$/i) { &SetLatexFront } } $page =~ s/$FS$FS/\\\\$LF/g; # Decode \\ which are not paragraph breaks $page =~ s/$FS(\d+)$FS/$SaveUrl{$1}/ge; # Restore saved text $page =~ s/$FS(\d+)$FS/$SaveUrl{$1}/ge; # Restore nested saved text # The following statement will fail if $Template has unmatched parentheses # and will silently fail if the referred variables are undefined. print eval("qq($Template)"); exit 0; sub WikiLinesToHtml { my ($pageText) = @_; my ($pageHtml, @htmlStack, $code, $depth, $oldCode, $oldDepth); my ($hDepth, $oldhDepth, $index, $flag, $line); @htmlStack = (); $depth = 0; $hDepth = 0; $pageHtml = ""; $flag = 1; $IndentLimit = 6 if ( $IndentLimit < 1); # Process lines one-at-a-time foreach $line (split(/\n/, $pageText)) { # Search for meta-info lines if ($flag > 0) { next if ($line =~ /^\s*$/); if ($line =~ s/\s*(?:$BL)([^\s:]+):\s*(.+)(?:$BR)\s*$//o) { &StoreMeta($1, $2); next; } else { $flag = 0; } } # Process main text lines $line .= "\n" unless ($line =~ /^\s*$/); $oldDepth = $depth; $depth = 0; $oldhDepth = $hDepth; $_ = $line; # Process lines with special characters on the first column CODE: { # Descriptive lists if (s/^(\;+)\s*([^:]+\:?)\: */$OpenTag{dt}$2$CloseTag{dt}\n$OpenItem{dl}/) { $code = "dl"; $depth = length $1; last CODE; } if (s/^(\:+) */$OpenTag{dt}$CloseTag{dt}\n<$OpenItem{dl}/) { $code = "dl"; $depth = length $1; last CODE; } # Itemized lists if (s/^(\*+) */$OpenItem{ul}/) { $code = "ul"; $depth = length $1; last CODE; } # Ordered lists if (s/^(\#+) */$OpenItem{ol}/) { $code = "ol"; $depth = length $1; last CODE; } # Verbatim environment if (/^[ \t].*\S/) { $code = "pre"; $depth = 1; last CODE; } # Text line if (/^[^\s\=]/) { $code = "p"; $depth = 1; last CODE; } # Section headings if (s/^(\=+)\s*([^\=]+)\s*\=+/&WikiHeading($1, $2)/e) { $hDepth = length $1; $code = "h$depth"; last CODE; } # New paragraph if (/^\s*$/) { $code = ''; } } # Close elements as needed while (@htmlStack > $depth) { $oldCode = pop(@htmlStack); if ($oldCode =~ /^[dou]l$/) { $pageHtml =~ s/\n$/$CloseItem{$oldCode}\n/; } $pageHtml .= $CloseTag{$oldCode} . "\n"; } # Open or close new sections as needed if ($hDepth > $oldhDepth) { while ($hDepth > $oldhDepth ) { $oldhDepth++; $pageHtml .= $OpenTag{'h'.$oldhDepth} . "\n"; $pageHtml .= $OpenItem{'h'.$oldhDepth} . $CloseItem{'h'.$oldhDepth} . "\n" unless ($hDepth == $oldhDepth ); } } elsif ($hDepth < $oldhDepth) { while ($hDepth <= $oldhDepth ) { $pageHtml .= $CloseTag{'h'.$oldhDepth} . "\n"; $oldhDepth--; } $pageHtml .= $OpenTag{'h'.$hDepth}; } elsif ($code =~ /h\d/) { $pageHtml .= $CloseTag{'h'.$hDepth} . "\n" . $OpenTag{'h'.$hDepth}; } # Parse paragraphs and lists if ($depth > 0) { $depth = $IndentLimit if ($depth > $IndentLimit); if (@htmlStack) { # Non-empty stack $oldCode = pop(@htmlStack); if ($depth > $oldDepth) { # Start a nested list push(@htmlStack, $oldCode); $pageHtml .= "$OpenTag{$code}\n"; if (($depth - $oldDepth) > 1) { $pageHtml .= $OpenItem{$code} . "\n"; } } else { if ($oldCode =~ /^[dou]l$/) { $pageHtml =~ s/\n$/$CloseItem{$oldCode}\n/; } if ($oldCode ne $code) { $pageHtml .= "$CloseTag{$oldCode}\n$OpenTag{$code}\n"; } } push(@htmlStack, $code); } # Fill up stack as needed while (@htmlStack < $depth) { push(@htmlStack, $code); $pageHtml .= $OpenTag{$code} . "\n"; if ($code =~ /^[dou]l$/ && $depth > @htmlStack) { $pageHtml .= $OpenItem{$code} . "\n"; } } } # Parse line-oriented common markup unless (/^\s*$/) { $line = &CommonMarkup($_, 1, 2); $line = &QuoteLatex2($line) if ($Format =~ /latex/i && $code !~ /pre/); if ($code =~ /^[dou]l$/) { $line =~ s/$FS$FS/$CloseTag{p}\n$OpenTag{p}\n/go; # par. breaks } $pageHtml .= $line; } } while (@htmlStack > 0) { # Clear stack $oldCode = pop(@htmlStack); if ($oldCode =~ /^[dou]l$/) { $pageHtml =~ s/\n$/$CloseItem{$oldCode}\n/; } $pageHtml .= $CloseTag{$oldCode} . "\n"; } # Close open sections while ($hDepth > 0) { $pageHtml .= $CloseTag{'h'.$hDepth} . "\n"; $hDepth--; } return $pageHtml; } sub CommonMarkup { my ($text, $useImage, $doLines) = @_; local $_ = $text; if ($doLines < 2) { # HTML tags that should be replaced before other tags are # inserted into the text, to avoid mixing them up. s/(?:$LT)pre$GT((.|\n)*?)$LT\/pre$GT/&StorePre($1, "pre")/igeo; s/(?:$LT)code$GT((.|\n)*?)$LT\/code$GT/&StorePre($1, "code")/igeo; # Note that these tags are restricted to a single line s/(?:$LT)b$GT(.*?)$LT\/b$GT/$OpenTag{strong}$1$CloseTag{strong}/gio; s/(?:$LT)i$GT(.*?)$LT\/i$GT/$OpenTag{em}$1$CloseTag{em}/gio; s/(?:$LT)strong$GT(.*?)$LT\/strong$GT/$OpenTag{strong}$1$CloseTag{strong}/gio; s/(?:$LT)em$GT(.*?)$LT\/em$GT/$OpenTag{em}$1$CloseTag{em}/gio; s/(?:$LT)tt$GT(.*?)$LT\/tt$GT/$OpenTag{code}$1$CloseTag{code}/gio; s/\[$UrlPattern\s+([^\]]+?)\]/&StoreBracketUrl($1, $2)/geos; s/\[$UrlPattern\]/&StoreBracketUrl($1, "")/geo; if ($Format =~ /^html$/i) { s/$UrlPattern2/&StoreUrl($1, $useImage)/geo; } else { s/$UrlPattern2/&StoreUrl($1, 0)/geo; } s/\[\[$FreeLinkPattern\s+([^\]]+?)\]\]/&StoreBracketUrl($1, $2)/geo; s/\[\[$FreeLinkPattern\]\]/&StoreUrl($1, $useImage)/geo; } if ($doLines) # TO DO: these substitutions should not be made inside the "pre" environment { # 0 = before other tags are inserted, 1 or 2 = after that # TO DO: The quote markup patterns avoid overlapping tags (with 5 quotes) # by matching the inner quotes for the strong pattern. # s/(\'*)\'\'\'(.*?)\'\'\'/$1$OpenTag{strong}$2$CloseTag{strong}/go; s/\'\'\'(.*?)\'\'\'/&TagText($1,'strong')/ge; s/''(.*?)''/&TagText($1,'em')/ge; s/,,(.*?),,/&TagText($1,'code')/ge; } return $_; } sub WikiHeading { my ($depth, $text) = @_; $depth = length($depth); $depth = 5 if ($depth > 5); return $OpenItem{'h'.$depth} . $text . $CloseItem{'h'.$depth} . "\n"; } sub QuoteLatex1 { my ($html) = @_; my $text = ''; $BL = '\\\{'; $BR = '\\\}'; foreach (split(/\n/, $html)) { if (/^\S/) { s/\\/\\ensuremath$FS\\backslash$FS/go; s/\{/\\{/g; s/\}/\\}/g; s/$FS(\\backslash)$FS/\{$1\}/go; } $text .= $_ . "\n"; } return $text; } sub QuoteLatex2 { my ($html) = @_; $_ = $html; s/&/\\&/g; s/#/\\#/g; s/%/\\%/g; s/_/\\_/g; s/\$/\\\$/g; s/\^/\\^{}/g; s/~/\\~{}/g; s/>/\\ensuremath{>}/g; s//>/g; # $html =~ s/&([\#a-zA-Z0-9]+);/&$1;/g; # Allow character references $LT = '<'; $GT = 'gt;'; return $html; } sub InitLinkPatterns { # Field separators are used in the URL-style patterns below. $FS = "\xb3"; # The FS character is a superscript "3" $LT = '<'; $GT = '>'; $BL = '{'; $BR = '}'; $LF = "\n"; # Url-style links are delimited by one of: # 1. Whitespace (kept in output) # 2. Left or right angle-bracket (< or >) (kept in output) # 3. Right square-bracket (]) (kept in output) # 4. A single double-quote (") (kept in output) # 5. A $FS (field separator) character (kept in output) $UrlProtocols = "http|https|ftp|afs|news|nntp|mid|cid|mailto|wais|" . "prospero|telnet|gopher"; $UrlPattern = "((?:(?:$UrlProtocols):[^\\]\\s\"$FS]+))"; $UrlProtocols2 = "http|https|ftp"; $UrlPattern2 = "((?:(?:$UrlProtocols2):[^\\]\\s\"$FS]+))"; $ImageExtensions = "(gif|jpg|png|bmp|jpeg|ico)"; $FreeLinkPattern = "([-,.()\/'_0-9A-Za-z\xc0-\xff]+)"; } sub InitLangTables { $language = 0; $babel = 'english'; @BabelLang = qw(english spanish portuges); %LangCode = qw(en 0 es 1 pt 2); $Languages = 'language idioma língua'; $Titles = 'title título título'; $Authors = 'author autor autor'; $Orgs = 'organization organización organização'; $Addresses = 'address dirección endereço'; $Dates = 'date fecha data'; $Versions = 'version versión versão'; $Abstracts = 'abstract resumen resumo'; $Figures = 'Figure Figura Figura'; @Language = split(/ /,$Languages); @Title = split(/ /,$Titles); @Author = split(/ /,$Authors); @Org = split(/ /,$Orgs); @Address = split(/ /,$Addresses); @Date = split(/ /,$Dates); @Version = split(/ /,$Versions); @Abstract = split(/ /,$Abstracts); @Figure = split(/ /,$Figures); } sub StoreMeta { my ($name, $content) = @_; if ($Languages =~ /$name/i) { $language = $LangCode{$content} if ($LangCode{$content}); $Meta{language} = $content; } $content = &CommonMarkup($content, 1, 2); $content = &QuoteLatex2($content) if ($Format =~ /latex/i); $content =~ s/$FS(\d+)$FS/$SaveUrl{$1}/ge; # Restore saved text $content =~ s/$FS(\d+)$FS/$SaveUrl{$1}/ge; # Restore nested saved text META: { if ($Titles =~ /$name/i) { $Meta{title} = $content; next META; } if ($Authors =~ /$name/i) { $Meta{author}[$authorcount] = $content; $Meta{organization}[$authorcount] = ''; $Meta{address}[$authorcount] = ''; $authorcount++; next META; } if ($Orgs =~ /$name/i) { $authorcount = 1 if ($authorcount < 1); $Meta{organization}[$authorcount-1] = $content; next META; } if ($Addresses =~ /$name/i) { $authorcount = 1 if ($authorcount < 1); $Meta{address}[$authorcount-1] = $content; next META; } if ($Dates =~ /$name/i) { $Meta{date} = $content; next META; } if ($Versions =~ /$name/i) { $Meta{version} = $content; next META; } if ($Abstracts =~ /$name/i) { $content =~ s/$FS$FS/$CloseTag{p}\n$OpenTag{p}\n/go; # par. breaks $Meta{abstract} = $content; next META; } $Meta{lc($name)} = $content; } return ''; } sub TagText { my ($text, $element) = @_; my $result; if ($Format =~ /latex/i) { $_ = $text; LOOP: { if (/\G([^$FS]+)/goc) { $result .= "$OpenTag{$element}$1$CloseTag{$element}"; redo LOOP; } if (/\G$FS(\d+)$FS/goc) { $result .= "$FS$1$FS"; &TagURL($1,$element); redo LOOP; } return $result; } } else { $result = $OpenTag{$element} . $text . $CloseTag{$element}; return $result; } } sub TagURL { my ($index, $element) = @_; $SaveUrl{$index} =~ s/(\\href\{[^\}]*\})\{([^\}]*)\}/$1\{$OpenTag{$element}$2$CloseTag{$element}\}/; return $FS . $index . $FS; } sub StoreRaw { my ($html) = @_; $SaveUrl{$SaveUrlIndex} = $html; return $FS . $SaveUrlIndex++ . $FS; } sub StoreUrl { my ($name, $useImage) = @_; my ($link, $extra); ($link, $extra) = &UrlLink($name, $useImage); # Next line ensures no empty links are stored $link = &StoreRaw($link) if ($link ne ""); return $link . $extra; } sub UrlLink { my ($rawname, $useImage) = @_; my ($name, $punct, $format, $text); ($name, $punct) = &SplitUrlPunct($rawname); $text = $name; $text = &QuoteLatex2($text) if ($Format =~ /latex/i); if ($useImage && ($name =~ /\.$ImageExtensions$/)) { $name =~ /\.([^\.]+)$/; $format = uc($1); $name =~ s/\.[^\.]+$// if ($Format =~ /latex/i); return (eval("qq($OpenTag{img})"), $punct); } return (eval("qq($OpenTag{a})") . $text . $CloseTag{'a'}, $punct); } sub StoreBracketUrl { my ($name, $text) = @_; $text = $name if ($text eq ""); $text = &QuoteLatex2($text) if ($Format =~ /latex/i); return &StoreRaw(eval("qq($OpenTag{a})") . $text . $CloseTag{'a'}); } sub SplitUrlPunct { my ($url) = @_; my ($punct); $url =~ s/\<//g; $url =~ s/\&/&/g; $punct = ""; ($punct) = ($url =~ /([^a-zA-Z0-9\/\xc0-\xff\%\#\?\&\+\_\~]+)$/); $url =~ s/([^a-zA-Z0-9\/\xc0-\xff\%\#\?\&\+\_\~]+)$//; unless ($Format =~ /latex/i) { $url =~ s/\&/&/g; $punct =~ s//>/g; } return ($url, $punct); } sub SetUpHTML { my $index; my @htmltag = @Tag; foreach $index (0..$#Tag) { $OpenTag{$Tag[$index]} = '<' . $htmltag[$index] . '>'; $CloseTag{$Tag[$index]} = ''; } $OpenTag{img} = '$name'; $OpenTag{a} = ''; %OpenItem = qw(ol
  • ul

  • dl

    ); %CloseItem = qw(ol

  • ul

    dl

    ); foreach $index (1..5) { $OpenTag{'h'.$index} = ''; $CloseTag{'h'.$index} = ''; $OpenItem{'h'.$index} = ''; $CloseItem{'h'.$index} = ''; } unless ($Template) { $Template = <<' EndHTML'; $title $frontmatter $page EndHTML } } sub SetUpXHTML { my $index; my @xhtmltag = @Tag; foreach $index (0..$#Tag) { $OpenTag{$Tag[$index]} = '<' . $xhtmltag[$index] . '>'; $CloseTag{$Tag[$index]} = ''; } $OpenTag{img} = '$name'; $OpenTag{a} = '
    '; %OpenItem = qw(ol
  • ul

  • dl

    ); %CloseItem = qw(ol

  • ul

    dl

    ); foreach $index (1..5) { $OpenTag{'h'.$index} = ''; $CloseTag{'h'.$index} = ''; $OpenItem{'h'.$index} = ''; $CloseItem{'h'.$index} = ''; } unless ($Template) { $Template = <<' EndXHTML'; $title $frontmatter $page EndXHTML } } sub SetUpDB { my $index; my @dbtag = qw(itemizedlist orderedlist variablelist programlisting emphasis emphasis literal inlinegraphic ulink para term); foreach $index (0..$#Tag) { $OpenTag{$Tag[$index]} = '<' . $dbtag[$index] . '>'; $CloseTag{$Tag[$index]} = ''; } $OpenTag{dt} = ''; $OpenTag{strong} = ''; $OpenTag{img} = ''; $OpenTag{a} = ''; %OpenItem = qw(ol ul dl ); %CloseItem = qw(ol ul dl ); foreach $index (1..5) { $OpenTag{'h'.$index} = ''; $CloseTag{'h'.$index} = ''; $OpenItem{'h'.$index} = ''; $CloseItem{'h'.$index} = ''; } unless ($Template) { $Template = <<' EndDB'; $frontmatter $page EndDB } } sub SetUpLatex { my $index; @Tag = qw(ul ol dl pre em strong code img a p dt); my @latextag = qw(itemize enumerate description verbatim emph textbf texttt); foreach $index (0..2) { $OpenTag{$Tag[$index]} = "\\begin\{" . $latextag[$index] . '}'; $CloseTag{$Tag[$index]} = "\\end\{" . $latextag[$index] . '}'; } foreach $index (4..8) { $OpenTag{$Tag[$index]} = "\\$latextag[$index]\{"; $CloseTag{$Tag[$index]} = "\}"; } $OpenTag{p} = ''; $CloseTag{p} = ''; $OpenTag{dt} = '\item['; $CloseTag{dt} = ']'; $OpenTag{pre} = '\begin{small}\begin{verbatim}'; $CloseTag{pre} = '\end{verbatim}\end{small}'; $OpenTag{img} = '\\\\includegraphics\{$name\}'; $OpenTag{a} = '\\\\href\{$name\}\{'; $CloseTag{a} = '}'; %OpenItem = ('ol', '\item ', 'ul', '\item ', 'dl', ''); %CloseItem = ('ol', '', 'ul', '', 'dl', ''); $OpenItem{h1} = '\section{'; $OpenItem{h2} = '\subsection{'; $OpenItem{h3} = '\subsubsection{'; $OpenItem{h4} = '\paragraph{'; $OpenItem{h5} = '\subparagraph{'; foreach $index (1..5) { $OpenTag{'h'.$index} = ''; $CloseTag{'h'.$index} = ''; $CloseItem{'h'.$index} = '}'; } unless ($Template) { $Template = <<' EndLatex'; % Created by parsewiki $Revision \\documentclass\[12pt,a4paper\]\{article\} \\usepackage\[latin1\]\{inputenc\} \\usepackage\[$babel\]\{babel\} \\usepackage\{graphicx\} \\usepackage\[colorlinks=true,urlcolor=blue\]\{hyperref\} \\setlength\{\\oddsidemargin\}\{9pt\} \\setlength\{\\textwidth\}\{425pt\} \\setlength\{\\evensidemargin\}\{23pt\} \\setlength\{\\topmargin\}\{28pt\} \\setlength\{\\headheight\}\{17pt\} \\setlength\{\\headsep\}\{14pt\} \\setlength\{\\textheight\}\{45\\baselineskip\} \\setlength\{\\footskip\}\{26pt\} \\begin\{document\} $frontmatter $page \\end\{document\} EndLatex } } sub SetHTMLFront { $frontmatter .= "

    $title

    \n" if ($title && ($title ne $firstheading)); if ($authorcount > 0) { for my $index (1..$authorcount) { $frontmatter .= "$Meta{author}[$index-1]
    \n"; $frontmatter .= "$Meta{organization}[$index-1]
    \n" if ($Meta{organization}[$index-1]); $frontmatter .= "$Meta{address}[$index-1]
    \n" if ($Meta{address}[$index-1]); } } $frontmatter .= "
    $Version[$language] $Meta{version}
    \n" if ($Meta{version}); $frontmatter .= "
    $Meta{date}
    \n" if ($Meta{date}); $frontmatter = "
    $frontmatter
    \n" if ($frontmatter); if ($Meta{abstract}) { $Meta{abstract} =~ s/$FS$FS/<\/p>\n

    /g; $frontmatter .="

    \n

    $Meta{abstract}

    \n
    \n"; } $frontmatter .= "

    $Meta{copyright}

    \n" if ($Meta{copyright}); } sub SetXHTMLFront { $frontmatter = "

    $title

    \n" if ($title && ($title ne $firstheading)); if ($authorcount > 0) { for my $index (1..$authorcount) { $frontmatter .= "$Meta{author}[$index-1]
    \n"; $frontmatter .= "$Meta{organization}[$index-1]
    \n" if ($Meta{organization}[$index-1]); $frontmatter .= "$Meta{address}[$index-1]
    \n" if ($Meta{address}[$index-1]); } } $frontmatter .= "
    $Version[$language] $Meta{version}
    \n" if ($Meta{version}); $frontmatter .= "
    $Meta{date}
    \n" if ($Meta{date}); $frontmatter = "
    $frontmatter
    \n" if ($frontmatter); if ($Meta{abstract}) { $Meta{abstract} =~ s/$FS$FS/<\/p>\n

    /g; $frontmatter .="

    \n

    $Meta{abstract}

    \n
    \n"; } $frontmatter .= "

    $Meta{copyright}

    \n" if ($Meta{copyright}); } sub SetDBFront { $frontmatter = "$title\n"; if ($authorcount > 0) { for my $index (1..$authorcount) { my $affil; $frontmatter .= "\n"; $Meta{author}[$index-1] =~ /^(.*)\s(\S+)\s*$/; $frontmatter .= "$1\n"; $frontmatter .= "$2\n"; $affil .= "$Meta{organization}[$index-1]" . "\n" if ($Meta{organization}[$index-1]); $affil .= "
    $Meta{address}[$index-1]
    \n" if ($Meta{address}[$index-1]); $frontmatter .= "\n$affil\n\n" if ($affil); $frontmatter .= "
    \n"; } } if ($Meta{version}) { $frontmatter .= "\n$Meta{version}" . ""; $frontmatter .= "$Meta{date}" if ($Meta{date}); $frontmatter .= "\n\n"; } else { $frontmatter .= "$Meta{date}\n" if ($Meta{date}); } if ($Meta{abstract}) { $Meta{abstract} =~ s/$FS$FS/<\/para>\n/g; $frontmatter .= "\n$Meta{abstract}\n\n"; } $frontmatter .= "\n$Meta{copyright}\n" . "\n" if ($Meta{copyright}); } sub SetLatexFront { my $copyright = 0; if ($title && ($title ne $firstheading)) { $frontmatter = "\\title\{$title"; if ($Meta{copyright}) { $frontmatter .= "\n\\footnote\{$Meta{copyright}\}"; $copyright = 1; } $frontmatter .= "\}\n"; } if ($authorcount > 0) { $frontmatter .= '\author{'; for my $index (1..$authorcount) { $frontmatter .= "\\\\\n" if ($index > 1); $frontmatter .= "$Meta{author}[$index-1]"; $frontmatter .= "\\\\\n\\emph\{$Meta{organization}[$index-1]\}" if ($Meta{organization}[$index-1]); $frontmatter .= "\\\\\n$Meta{address}[$index-1]" if ($Meta{address}[$index-1]); } $frontmatter .= "\}\n"; } if ($Meta{date}) { $frontmatter .= "\\date\{"; $frontmatter .= "$Version[$language] $Meta{version}, " if ($Meta{version}); $frontmatter .= "$Meta{date}" ; $frontmatter .= "\}\n"; } $frontmatter .= "\\maketitle\n" if ($frontmatter); if ($Meta{abstract}) { $Meta{abstract} =~ s/$FS$FS/\n\n/g; $frontmatter .= "\\begin\{abstract\}\n$Meta{abstract}\n"; $frontmatter .= "\\end\{abstract\}\n"; } $frontmatter .= "\n$Meta{copyright}\n\n" if ($Meta{copyright} && $copyright == 0); } sub ReadTemplate { my $file = pop; open (IN,"<$file") or die "$0: Cannot read template file $file\n\n" ; undef $/; $Template = ; close IN; } sub GetOpts { my $file; while ($_ = $ARGV[0], /^-/) { shift(@ARGV); if (/^-f$/) { $Format = shift(@ARGV); next } if (/^-f(.*)$/) { $Format = $1; next } if (/^--format\=(.*)$/) { $Format = $1; next } if (/^-T$/) { $title = shift(@ARGV); next } if (/^-T(.*)$/) { $title = $1; next } if (/^--title\=(.*)$/) { $title = $1; next } if (/^-t$/) { &ReadTemplate(shift(@ARGV)); next } if (/^-t(.*)$/) { &ReadTemplate($1); next } if (/^--template\=(.*)$/) { &ReadTemplate($1); next } if (/^(-c|--copyright)/) { &Copying; next } if (/^(-h|--help)/) { &Usage } } unshift(@ARGV, '-') unless @ARGV; &Usage if (@ARGV > 1); $file = shift(@ARGV); return $file; }