X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=development%2Fautotests%2FuseSystemFonts.pl;h=98fd59acec0accae1f0a51dd29bc4b171894e49a;hb=baa93548c8d977bcd45349f46ab271a86950d022;hp=c5a59c70d51bf67f84025ce65bc20e6f66aa7980;hpb=0b991c73fa28b35aea3b0153d7b9f9065eed518b;p=lyx.git diff --git a/development/autotests/useSystemFonts.pl b/development/autotests/useSystemFonts.pl index c5a59c70d5..98fd59acec 100644 --- a/development/autotests/useSystemFonts.pl +++ b/development/autotests/useSystemFonts.pl @@ -6,8 +6,7 @@ # 2.) While copying, # 2a.) searches for relative references to files and # replaces them with absolute ones -# 2b.) In order to be able to compile with luatex or xetex -# changes default fonts to use non-tex-fonts instead +# 2b.) Changes default fonts to use non-tex-fonts # # Syntax: perl useSystemFonts.pl sourceFile destFile format # Each param represents a path to a file @@ -47,73 +46,108 @@ use File::Copy "cp"; use File::Temp qw/ :POSIX /; use lyxStatus; +# Prototypes +sub printCopiedDocuments($); +sub interpretedCopy($$$$); +sub copyFoundSubdocuments($); +sub copyJob($$); +sub isrelativeFix($$$); +sub isrelative($$$); +sub createTemporaryFileName($$$); +sub copyJobPending($$); +sub addNewJob($$$$$); +sub addFileCopyJob($$$$$); +sub getNewNameOf($$); +sub getlangs($$); +sub simplifylangs($); +sub getLangEntry(); + # convert lyx file to be compilable with xetex -my ($source, $dest, $format, $rest) = @ARGV; +my ($source, $dest, $format, $fontT, $encodingT, $languageFile, $rest) = @ARGV; +my %encodings = (); # Encoding with TeX fonts, depending on language tag -&diestack("Too many arguments") if (defined($rest)); -&diestack("Sourcefilename not defined") if (! defined($source)); -&diestack("Destfilename not defined") if (! defined($dest)); -&diestack("Format (e.g. pdf4) not defined") if (! defined($format)); +diestack("Too many arguments") if (defined($rest)); +diestack("Sourcefilename not defined") if (! defined($source)); +diestack("Destfilename not defined") if (! defined($dest)); +diestack("Format (e.g. pdf4) not defined") if (! defined($format)); +diestack("Font type (e.g. texF) not defined") if (! defined($fontT)); +diestack("Encoding (e.g. ascii) not defined") if (! defined($encodingT)); $source = File::Spec->rel2abs($source); $dest = File::Spec->rel2abs($dest); my %font = (); - -if ($source =~ /\/(he|el|ru|uk)\//) { - $font{roman} = "FreeSans"; - $font{sans} = "FreeSans"; - $font{typewriter} = "FreeSans"; +my $lang = "main"; +if ($source =~ /\/([a-z][a-z](_[A-Z][A-Z])?)[\/_]/) { + $lang = $1; } -elsif ($source =~ /\/fa\//) { - $font{roman} = "FreeFarsi"; - $font{sans} = "FreeFarsi"; - $font{typewriter} = "FreeFarsi Monospace"; + +my $inputEncoding = undef; +if ($fontT eq "systemF") { } -elsif ($source =~ /\/zh_CN\//) { - $font{roman} = "FreeSans"; - $font{sans} = "WenQuanYi Micro Hei"; - $font{typewriter} = "WenQuanYi Micro Hei"; +elsif ($encodingT ne "default") { + # set input encoding to the requested value + $inputEncoding = { + "search" => '.*', # this will be substituted from '\inputencoding'-line + "out" => $encodingT, + }; } -else { - # Nothing to do? +elsif (0) { # set to '1' to enable setting of inputencoding + # use tex font here + my %encoding = (); + if (defined($languageFile)) { + # The 2 lines below does not seem to have any effect + #&getlangs($languageFile, \%encoding); + #&simplifylangs(\%encoding); + } + if ($format =~ /^(pdf4)$/) { # xelatex + # set input encoding to 'ascii' always + $inputEncoding = { + "search" => '.*', # this will be substituted from '\inputencoding'-line + "out" => "ascii", + }; + } + elsif ($format =~ /^(dvi3|pdf5)$/) { # (dvi)?lualatex + # when to set input encoding to 'ascii'? + if (defined($encoding{$lang})) { + $inputEncoding = { + "search" => '.*', # this will be substituted from '\inputencoding'-line + "out" => $encoding{$lang}, + }; + } + } } my $sourcedir = dirname($source); my $destdir = dirname($dest); if (! -d $destdir) { - &diestack("could not make dir \"$destdir\"") if (! mkdir $destdir); + diestack("could not make dir \"$destdir\"") if (! mkpath $destdir); } my $destdirOfSubdocuments; { my ($name, $pat, $suffix) = fileparse($source, qr/\.[^.]*/); - my $ext = $format; - if ($source =~ /\/([a-z][a-z](_[A-Z][A-Z])?)\//) { - $ext .= "_$1"; - } - else { - $ext .= "_main"; - } - $destdirOfSubdocuments = "$destdir/tmp_$ext" . "_$name"; # Global var, something TODO here + my $ext = $format . "-$lang"; + $name =~ s/_/-/g; + $destdirOfSubdocuments = "$destdir/tmp-$ext" . "-$name"; # Global var, something TODO here } if(-d $destdirOfSubdocuments) { rmtree($destdirOfSubdocuments); } -mkdir($destdirOfSubdocuments); # for possibly included files +mkpath($destdirOfSubdocuments); # for possibly included files my %IncludedFiles = (); my %type2hash = ( "copy_only" => "copyonly", "interpret" => "interpret"); -&addNewJob($source, $dest, "interpret", {}, \%IncludedFiles); +addNewJob($source, $dest, "interpret", {}, \%IncludedFiles); -©FoundSubdocuments(\%IncludedFiles); +copyFoundSubdocuments(\%IncludedFiles); -#&printCopiedDocuments(\%IncludedFiles); +#printCopiedDocuments(\%IncludedFiles); exit(0); ########################################################### @@ -137,14 +171,18 @@ sub interpretedCopy($$$$) my $sourcedir = dirname($source); my $res = 0; - &diestack("could not read \"$source\"") if (!open(FI, $source)); - &diestack("could not write \"$dest\"") if (! open(FO, '>', $dest)); + diestack("could not read \"$source\"") if (!open(FI, $source)); + diestack("could not write \"$dest\"") if (! open(FO, '>', $dest)); - &initLyxStack(\%font); + initLyxStack(\%font, $fontT, $inputEncoding); + my $fi_line_no = 0; + my @path_errors = (); while (my $l = ) { - chomp($l); - my $rStatus = &checkLyxLine($l); + $fi_line_no += 1; + $l =~ s/[\n\r]+$//; + #chomp($l); + my $rStatus = checkLyxLine($l); if ($rStatus->{found}) { my $rF = $rStatus->{result}; if ($rStatus->{"filetype"} eq "replace_only") { @@ -157,32 +195,68 @@ sub interpretedCopy($$$$) my $separator = $rStatus->{"separator"}; my $foundrelative = 0; for my $f (@{$filelist}) { - my @isrel = &isrelative($f, + my @isrel = isrelative($f, $sourcedir, $rStatus->{ext}); if ($isrel[0]) { $foundrelative = 1; my $ext = $isrel[1]; if ($rStatus->{"filetype"} eq "prefix_only") { - $f = &getNewNameOf("$sourcedir/$f", $rFiles); + $f = getNewNameOf("$sourcedir/$f", $rFiles); } else { my ($newname, $res1); - ($newname, $res1) = &addFileCopyJob("$sourcedir/$f$ext", + my @extlist = (); + if (ref($rStatus->{ext}) eq "ARRAY" && defined($rStatus->{ext}->[1])) { + @extlist = @{$rStatus->{ext}}; + } + else { + @extlist = ($ext); + } + my $created = 0; + for my $extx (@extlist) { + if (-e "$sourcedir/$f$extx") { + ($newname, $res1) = addFileCopyJob("$sourcedir/$f$extx", "$destdirOfSubdocuments", $rStatus->{"filetype"}, - $rFiles); - print "Added ($res1) file \"$sourcedir/$f$ext\" to be copied to \"$newname\"\n"; - if ($ext ne "") { - $newname =~ s/$ext$//; - } + $rFiles, $created); + print "Added ($res1) file \"$sourcedir/$f$ext\" to be copied to \"$newname\"\n"; + if (!$created && $extx ne "") { + $newname =~ s/$extx$//; + } + $created = 1; + } + } $f = $newname; $res += $res1; } } + else { + if (! -e "$f") { + # Non relative (e.g. with absolute path) file should exist + if ($rStatus->{"filetype"} eq "interpret") { + # filetype::interpret should be interpreted by lyx or latex and therefore emit error + # We prinnt a warning instead + print "WARNING: Interpreted file \"$f\" not found, at \"$source:$fi_line_no\"\n"; + } + elsif ($rStatus->{"filetype"} eq "prefix_only") { + # filetype::prefix_only should be interpreted by latex + print "WARNING: Prefixed file \"$f\" not found, at \"$source:$fi_line_no\"\n"; + } + else { + # Collect the path-error-messages + push(@path_errors, "File \"$f(" . $rStatus->{"filetype"} . ")\" not found, at \"$source:$fi_line_no\""); + } + } + } } if ($foundrelative) { - $rF->[$fidx] = join($separator, @{$filelist}); + # The result can be relative too + my @rel_list = (); + for my $fr (@{$filelist}) { + push(@rel_list, File::Spec->abs2rel($fr, $destdir)); + } + $rF->[$fidx] = join($separator, @rel_list); $l = join('', @{$rF}); } } @@ -191,8 +265,14 @@ sub interpretedCopy($$$$) } close(FI); close(FO); + if (@path_errors > 0) { + for my $entry (@path_errors) { + print "ERROR: $entry\n"; + } + diestack("Aborted because of path errors in \"$source\""); + } - &closeLyxStack(); + closeLyxStack(); return($res); } @@ -205,12 +285,12 @@ sub copyFoundSubdocuments($) my %copylist = (); for my $filename (keys %{$rFiles}) { - next if (! ©JobPending($filename, $rFiles)); + next if (! copyJobPending($filename, $rFiles)); $copylist{$filename} = 1; } for my $f (keys %copylist) { # Second loop needed, because here $rFiles may change - my ($res1, @destfiles) = ©Job($f, $rFiles); + my ($res1, @destfiles) = copyJob($f, $rFiles); $res += $res1; for my $destfile (@destfiles) { print "res1 = $res1 for \"$f\" to be copied to $destfile\n"; @@ -232,11 +312,11 @@ sub copyJob($$) $rFiles->{$source}->{$k . "copied"} = 1; my $dest = $rFiles->{$source}->{$k}; push(@dest, $dest); - if ($k eq "copyonly") { - &diestack("Could not copy \"$source\" to \"$dest\"") if (! cp($source, $dest)); + if ($k =~ /^copyonly/) { + diestack("Could not copy \"$source\" to \"$dest\"") if (! cp($source, $dest)); } else { - &interpretedCopy($source, $dest, $destdirOfSubdocuments, $rFiles); + interpretedCopy($source, $dest, $destdirOfSubdocuments, $rFiles); } $res += 1; } @@ -260,7 +340,7 @@ sub isrelative($$$) if (ref($ext) eq "ARRAY") { for my $ext2 (@{$ext}) { - my @res = &isrelativeFix($f, $sourcedir, $ext2); + my @res = isrelativeFix($f, $sourcedir, $ext2); if ($res[0]) { return(@res); } @@ -268,19 +348,28 @@ sub isrelative($$$) return(0,0); } else { - return(&isrelativeFix($f, $sourcedir, $ext)); + return(isrelativeFix($f, $sourcedir, $ext)); } } -sub createTemporaryFileName($$) +my $oldfname = ""; + +sub createTemporaryFileName($$$) { - my ($source, $destdir) = @_; + my ($source, $destdir, $created) = @_; # get the basename to be used for the template my ($name, $path, $suffix) = fileparse($source, qr/\.[^.]*/); #print "source = $source, name = $name, path = $path, suffix = $suffix\n"; - my $template = "xx_$name" . "_"; - my $fname = File::Temp::tempnam($destdir, $template); + my $template = "xx-$name" . "-"; + my $fname; + if (! $created) { + $fname = File::Temp::tempnam($destdir, $template); + $oldfname = $fname; + } + else { + $fname = $oldfname; + } # Append extension from source if ($suffix ne "") { @@ -301,7 +390,7 @@ sub copyJobPending($$) return 0; } -sub addNewJob($$$) +sub addNewJob($$$$$) { my ($source, $newname, $hashname, $rJob, $rFiles) = @_; @@ -310,19 +399,19 @@ sub addNewJob($$$) $rFiles->{$source} = $rJob; } -sub addFileCopyJob($$$$) +sub addFileCopyJob($$$$$) { - my ($source, $destdirOfSubdocuments, $filetype, $rFiles) = @_; + my ($source, $destdirOfSubdocuments, $filetype, $rFiles, $created) = @_; my ($res, $newname) = (0, undef); my $rJob = $rFiles->{$source}; my $hashname = $type2hash{$filetype}; if (! defined($hashname)) { - &diestack("unknown filetype \"$filetype\""); + diestack("unknown filetype \"$filetype\""); } if (!defined($rJob->{$hashname})) { - &addNewJob($source, - &createTemporaryFileName($source, $destdirOfSubdocuments), + addNewJob($source, + createTemporaryFileName($source, $destdirOfSubdocuments, $created), "$hashname", $rJob, $rFiles); $res = 1; } @@ -345,3 +434,85 @@ sub getNewNameOf($$) } return($resultf); } + +sub getlangs($$) +{ + my ($languagefile, $rencoding) = @_; + + if (open(FI, $languagefile)) { + while (my $l = ) { + if ($l =~ /^Language/) { + my ($lng, $enc) = &getLangEntry(); + if (defined($lng)) { + $rencoding->{$lng} = $enc; + } + } + } + close(FI); + } +} + +sub simplifylangs($) +{ + my ($rencoding) = @_; + my $base = ""; + my $enc = ""; + my $differ = 0; + my @klist = (); + my @klist2 = (); + for my $k (reverse sort keys %{$rencoding}) { + my @tag = split('_', $k); + if ($tag[0] eq $base) { + push(@klist, $k); + if ($rencoding->{$k} ne $enc) { + $differ = 1; + } + } + else { + # new base, check that old base was OK + if ($base ne "") { + if ($differ == 0) { + $rencoding->{$base} = $enc; + push(@klist2, @klist); + } + } + @klist = ($k); + $base = $tag[0]; + $enc = $rencoding->{$k}; + $differ = 0; + } + } + if ($base ne "") { + # close handling for last entry too + if ($differ == 0) { + $rencoding->{$base} = $enc; + push(@klist2, @klist); + } + } + for my $k (@klist2) { + delete($rencoding->{$k}); + } +} + +sub getLangEntry() +{ + my ($lng, $enc) = (undef, undef); + while (my $l = ) { + chomp($l); + if ($l =~ /^\s*Encoding\s+([^ ]+)\s*$/) { + $enc = $1; + } + elsif ($l =~ /^\s*LangCode\s+([^ ]+)\s*$/) { + $lng = $1; + } + elsif ($l =~ /^\s*End\s*$/) { + last; + } + } + if (defined($lng) && defined($enc)) { + return($lng, $enc); + } + else { + return(undef, undef); + } +}