my $verbatim = 0;
my @sections;
my $buffer;
+my $idseq = 0; # sequentual number of footnotes
+my $footnotes="";
#
# TODO italic paragaphs
# footnotes
# epigraphs
#
# print fictionbook header
-print "<?xml version=\"1.0\" encoding=\"UTF-8\">\n";
+print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print "<FictionBook xmlns=\"http://www.gribuser.ru/xml/fictionbook/2.0\"
xmlns:l=\"http://www.w3.org/1999/xlink\">\n";
my $metadata = shift @ARGV;
print $_;
}
close F;
-
+print "<body>\n";
my $header =1;
LINE:
while (<>) {
next LINE if $header;
if ((/^$/ || $environ) && $buffer) {
#output on empty line (p or stanza) depending on poetry mode
- add_to_section(tag($buffer,$poetry?"stanza":"p")."\n");
+ add_to_section(tag(flushbuffer($buffer),$poetry?"stanza":"p")."\n");
$buffer="";
}
next LINE if $environ;
# Section headings
if (/\\(part|chapter|section|subsection|subsubsection)\*?{(.*)}/) {
if ($buffer) {
- add_to_section(tag($buffer,$poetry?"stanza":"p"));
+ add_to_section(tag(flushbuffer($buffer),$poetry?"stanza":"p"));
$buffer="";
}
- pushsection($1,$2);
+ pushsection($1,tag($2,"p"));
next LINE;
}
if (/\\vspace{/) {
s/(\s)\s+/$1/g;
#replace TeX ligatures ~ --- << >> \% with appropriate unicode symbols
s/~/\xA0/g;
-s/---/-/g;
+s/---/—/g;
s/<</«/g;
s/>>/»/g;
s/\\%/%/g;
}
}
if ($buffer) {
- add_to_section(tag($buffer,"p"));
+ add_to_section(tag(flushbuffer($buffer),"p"));
$buffer="";
}
flushsection();
}
print "</body>\n";
-## FIXME print footnotes
+## print footnotes
+print "<body>\n$footnotes\n</body>" if $footnotes;
print "</FictionBook>";
sub add_to_section {
my $data = shift;
return if ($#sections<0) ;
+ if ($data =~ /^\s*<section>/ && $sections[$#sections]->{data} !~ /^\s*<section>/) {
+ $sections[$#sections]->{data} = tag($sections[$#sections]->{data},"section")."\n";
+ }
$sections[$#sections]->{data}.=$data;
}
if ($str->{title}) {
$content = tag($str->{title},"title");
}
- $content .= $str->{data};
+ if ($str->{data} =~ /^\s*$/s) {
+ $content .= "<p>\n</p>";
+ } else {
+ $content .= $str->{data};
+ }
if ($#sections >=0) {
add_to_section(tag($content,$tag)."\n");
} else {
sub tag {
my ($content,$name) = @_;
- return "" if $content =~ /^\s*$/s;
+ $content =~s/^\s+//s;
+ return "" unless $content;
return "<$name>$content</$name>";
}
+
+sub flushbuffer {
+ local $_ = shift;
+ s/{\\(em|it|bf)(?:\s+|{})([^{}]+)}/<emphasis>$2<\/emphasis>/g;
+ s/\\(emph|textit|textbf){([^{}]+)}/<emphasis>$2<\/emphasis>/g;
+ s/\\footnote{(.*)}/push_footnote($1)/e;
+ s/[{}]//g;
+ return $_;
+}
+
+
+sub push_footnote {
+ my $id = "note_".(++$idseq);
+ $footnotes.="<section id=\"$id\">".tag(shift,'p')."</section>\n";
+ return "<a l:href=\"#$id\" type=\"note\">$idseq</a>";
+}