%perl> # Make a temp directory and file. mkdir "/tmp/jbovlaste_export/"; my $dir = tempdir( DIR => "/tmp/jbovlaste_export/" ); my ($fh, $filename) = tempfile( DIR => $dir, SUFFIX => ".tex" ); open(TMP, ">$filename") or die "Couldn't open a temporary file.\n"; my $langrealname = $dbh->selectrow_array("SELECT realname FROM languages WHERE tag=?", undef, $lang); my $langid = $dbh->selectrow_array("SELECT langId FROM languages WHERE tag=?", undef, $lang); # my $words = $dbh->selectall_arrayref("SELECT word, meaning, wordId FROM natlangwords WHERE langId=$langid ORDER BY word"); # my @words = map # { # my $inword=$_->[2]; # my $defwords=$dbh->selectall_arrayref("SELECT valsi.word, # pk.place FROM valsi, # placekeywordmapping pk, natlangdefs nld WHERE # pk.wordId=$inword AND # pk.definitionID = nld.definitionID AND # nld.valsiId=valsi.valsiId # "); # my @defwords=map # { # "\\item $_->[0] place $_->[1]\n" # } @{ $defwords }; # # "\n\\item [" . $_->[0] . "] " . # ( $_->[1] ? "in the sense of " . $_->[1] : " in the default sense") . # "\n" . # ( @defwords ? # "\\begin{itemize}\n" . # join("", @defwords) . # "\n\\end{itemize}" # # : "" # ) # } @{ $words }; # # my $joinedwords=join("",@words); my $shortfilename=$filename; $shortfilename =~ s{/tmp/jbovlaste_export}{/jbovlaste_export}; # Get the valsi best guesses list. my $valsibestguesses = $dbh->selectall_hashref("SELECT v.word, vbg.* from valsibestguesses vbg, valsi v WHERE vbg.langid=$langid AND v.valsiid=vbg.valsiid ORDER BY v.word", "word" ); #print Dumper( $valsibestguesses ); my $lojbanToNatLang; my @lojbanToNatLangEntries; my $natLangToLojban; my @natLangToLojbanEntries; # Print the lojban -> foo section our $unofficialwarning = '$\\triangle$ '; foreach my $valsirow ( values %{$valsibestguesses} ) { my $convenientDefinition = $dbh->selectrow_hashref("SELECT * FROM convenientdefinitions WHERE definitionid=${$valsirow}{'definitionid'}" ); my $valsitype = $dbh->selectrow_array("SELECT descriptor FROM valsi v, definitions d, valsitypes vt WHERE v.valsiid = d.valsiid AND d.definitionid = ${$valsirow}{'definitionid'} AND v.typeid=vt.typeid"); # my $valsitype = "gismu"; # Debug. my $entry .= "\n\n{\\sffamily\\bfseries "; # Alert about non-standard entries if ($valsitype eq "experimental gismu" or $valsitype eq "experimental cmavo") { $entry .= $unofficialwarning}; $entry .= massage(${$convenientDefinition}{'word'} ) ."}"; # \markboth is for the top-of-page markings. $entry .= "\\markboth{". massage(${$convenientDefinition}{'word'} ) . "}{" . massage(${$convenientDefinition}{'word'} ) . "}"; # Clear out silly rafsi spaces my $rafsi = massage( ${$convenientDefinition}{'rafsi'} ); $rafsi =~ s/\s+$//; $rafsi =~ s/^\s+//; $rafsi =~ s/\s+/ / ; if( $rafsi ) { $entry .= "\\enspace {\\ttfamily\\bfseries[$rafsi]} " } if( ${$convenientDefinition}{'selmaho'} ) { $entry .= "\\enspace {\\sffamily\\bfseries[". massage(${$convenientDefinition}{'selmaho'}) ."]} " } $entry .= " " . massage("${$convenientDefinition}{'definition'}"); if( ${$convenientDefinition}{'notes'} ) { $entry .= " (". massage(${$convenientDefinition}{'notes'}) .")"; } # This doesn't work because etymologies are in their own table. # Moreover, a definition can have more than one etymology. # if( ${$convenientDefinition}{'etymology'} ) # { # $entry .= " {\\small ". # massage(${$convenientDefinition}{'etymology'}) # ."}"; # } $entry = &inserthyphenations($entry); push @lojbanToNatLangEntries, $entry; } foreach my $valsirow ( values %{$valsibestguesses} ) { #print Dumper( $valsirow ); my $nlwbg = $dbh->selectall_hashref("SELECT nlw.word, nlw.meaning, nlwbg.* from natlangwordbestguesses nlwbg, natlangwords nlw WHERE definitionid=${$valsirow}{'definitionid'} AND nlwbg.natlangwordid = nlw.wordid ORDER BY nlw.word", "word" ); #print Dumper( $nlwbg ); foreach my $nlwbgrow (values %{$nlwbg} ) { my $entry .= "\n\n{\\sffamily\\bfseries ". massage(${$nlwbgrow}{'word'}) ."} "; # \markboth is for the top-of-page markings. $entry .= "\\markboth{". massage(${$nlwbgrow}{'word'}) ."}{". massage(${$nlwbgrow}{'word'}) ."}"; if( ${$nlwbgrow}{'meaning'} ) { $entry .= "\\textit{(". massage(${$nlwbgrow}{'meaning'}) .")} "; } my $defvalsi = $dbh->selectrow_array("SELECT word FROM valsi v, definitions d WHERE v.valsiid = d.valsiid AND d.definitionid = ${$nlwbgrow}{'definitionid'}"); #my $defvalsitype = $dbh->selectrow_array("SELECT descriptor #FROM valsi v, definitions d, valsitypes vt #WHERE v.valsiid = d.valsiid #AND d.definitionid = ${$nlwbgrow}{'definitionid'} #AND v.typeid=vt.typeid"); $entry .= " " . massage($defvalsi); #if( $defvalsitype eq "gismu" ) #{ if( ${$nlwbgrow}{'place'} > 0 ) { # $entry .= ", gloss word"; #} else { $entry .= ", place ${$nlwbgrow}{'place'}"; } #} $entry = &inserthyphenations($entry); push @natLangToLojbanEntries, $entry; #print Dumper( $nlwbgrow ); } } sub dictcollate { my $to_be_ignored = $unofficialwarning; my $temp_a = $a; my $temp_b = $b; $temp_a =~ s/\Q$to_be_ignored\E//; $temp_b =~ s/\Q$to_be_ignored\E//; lc($temp_a) cmp lc($temp_b); } $lojbanToNatLang = join('', sort dictcollate @lojbanToNatLangEntries); $natLangToLojban = join('', sort dictcollate @natLangToLojbanEntries); #print Dumper($lojbanToNatLang); #print Dumper($natLangToLojban); print TMP ' \documentclass[notitlepage,twocolumn,letter,a4paper]{book} \usepackage{ucs} \usepackage[utf8x]{inputenc} \usepackage{eurosym} %% These apply to A4 paper only \pdfpagewidth 210mm \pdfpageheight 297mm \usepackage{fancyhdr} % important, lets us actually pull this stuff off. \pagestyle{fancy} % turns on the magic provided by fancyhdr \usepackage{palatino} \fancyhead{} % empty out the header \fancyfoot{} % empty out the footer \fancyhead[LE,LO]{\rightmark} % left side, odd and even pages \fancyhead[RE,RO]{\leftmark} % right side, odd and even pages \fancyfoot[LE,RO]{\thepage} % left side even, right side odd \setlength{\parindent}{1 em} \title{'. $langrealname . ' To lojban and lojban To '. $langrealname .' Dictionary} \author{Lojbanic Community} \date{\today} \begin{document} \maketitle \chapter{lojban to '. $langrealname .'}'. $lojbanToNatLang. ' \chapter{'. $langrealname .' to lojban}'. $natLangToLojban. ' \end{document} '; #$joinedwords close( TMP ); chdir $dir; my $output = qx{cd $dir ; pdflatex $filename}; # print "
In dir $dir, ran pdflatex $filename with output: $output\n"; # Get the pdflatex generated file's name. my $pdffilename=$shortfilename; $pdffilename =~ s/.tex$/.pdf/; sub inserthyphenations{ # Suggest LaTeX linebreak points after slashes. my ($line) = @_; while( s#(^\{[^{}]\}.*)/#/\\linebreak[0]#g ) {}; return $line; } sub massage { my $input=shift(@_); $input =~ s/([&%#\\])/\\$1/g; return $input; } %perl> Here's your dictionary. Here's your dictionary in pdf. <%shared> our $titlestr; %shared> <%method title> Lojban Printable Dictionary Generation %method> <%init> our($dbh); use File::Temp qw{ tempfile tempdir }; use POSIX; use Data::Dumper; %init> <%args> $lang => undef %args>