From: Kornel Benko Date: Thu, 3 Sep 2020 09:45:04 +0000 (+0200) Subject: Tools(listFontWithLang.pl): Handle also fonts provided by lyx X-Git-Tag: lyx-2.4.0dev-acb2ca7b~235 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=a45f539bb5de76a86cc9cd5485f13db81eaed75b;hp=5c83c5c410d4a827a6c2f89d0ecd0466554ef207;p=features.git Tools(listFontWithLang.pl): Handle also fonts provided by lyx These fonts are normally not handled by fontconfig --- diff --git a/development/tools/listFontWithLang.pl b/development/tools/listFontWithLang.pl index 4683cc9d2f..562ac4cb1d 100644 --- a/development/tools/listFontWithLang.pl +++ b/development/tools/listFontWithLang.pl @@ -30,6 +30,11 @@ BEGIN { unshift(@INC, $p); } +my $lyxfontsdir = $INC[0]; +$lyxfontsdir =~ s/[\/\\]?[^\/\\]+$//; +$lyxfontsdir =~ s/[\/\\]?[^\/\\]+$//; +$lyxfontsdir .= "/lib/fonts"; + use strict; use warnings; use Encode; @@ -260,32 +265,48 @@ for my $fn ("FontName", "NFontName") { } } -my $cmd = "fc-list"; -if (defined($langs[0])) { - $cmd .= " :lang=" . join(',', @langs); -} +my @cmds = (); +{ + my $cmd = "fc-list"; + my $langs = ""; + if (defined($langs[0])) { + $langs = " :lang=" . join(',', @langs) . " "; + } -my $format = "foundry=\"%{foundry}\"" . - " postscriptname=\"%{postscriptname}\"" . - " fn=\"%{fullname}\" fnl=\"%{fullnamelang}\"" . - " family=\"%{family}\" flang=\"%{familylang}\" " . - " style=\"%{style}\" stylelang=\"%{stylelang}\""; + my $format = "foundry=\"%{foundry}\"" . + " postscriptname=\"%{postscriptname}\"" . + " fn=\"%{fullname}\" fnl=\"%{fullnamelang}\"" . + " family=\"%{family}\" flang=\"%{familylang}\" " . + " style=\"%{style}\" stylelang=\"%{stylelang}\""; -if ($iscript) { - $format .= " script=\"%{capability}\""; -} -if (exists($options{PrintLangs}) || defined($langs[0])) { - $format .= " lang=\"%{lang}\""; -} -if ($iproperty) { - $format .= " weight=%{weight} slant=%{slant} width=%{width} spacing=%{spacing}"; -} -if ($icontains) { - $format .= " charset=\"%{charset}\""; + if ($iscript) { + $format .= " script=\"%{capability}\""; + } + if (exists($options{PrintLangs}) || defined($langs[0])) { + $format .= " lang=\"%{lang}\""; + } + if ($iproperty) { + $format .= " weight=%{weight} slant=%{slant} width=%{width} spacing=%{spacing}"; + } + if ($icontains) { + $format .= " charset=\"%{charset}\""; + } + $format .= " file=\"%{file}\" abcd\\n"; + $cmd .= $langs . " -f '$format'"; + push(@cmds, $cmd); + + # Now Add also lyx fonts to be examinated + if (opendir(DI, "$lyxfontsdir")) { + while (my $l = readdir(DI)) { + chomp($l); + if ($l =~ /\.ttf$/) { + my $file = "$lyxfontsdir/$l"; + push(@cmds, "fc-query$langs -f '$format' '$file'"); + } + } + closedir(DI); + } } -$format .= " file=\"%{file}\" abcd\\n"; -$cmd .= " -f '$format'"; -#print "$cmd\n"; my %ftypes = ( @@ -496,176 +517,178 @@ my %smallcapFonts = ( "v" => qr/^vn ?cccsc\d/i, ); -if (open(FI, "$cmd |")) { - NXTLINE: while (my $l = ) { - chomp($l); - while ($l !~ /abcd$/) { - $l .= ; +for my $cmd (@cmds) { + if (open(FI, "$cmd |")) { + NXTLINE: while (my $l = ) { chomp($l); - } - my $file = ""; - my $fonttype; - if ($l =~ /file=\"([^\"]+)\"/) { - $file = $1; - #next if ($file !~ /\.(otf|ttf|pfa|pfb|pcf|ttc)$/i); - if ($file !~ /\.([a-z0-9]{2,5})$/i) { - print "Unhandled extension for file $file\n"; - next; + while ($l !~ /abcd$/) { + $l .= ; + chomp($l); } - $fonttype = lc($1); - if (! defined($fontpriority{$fonttype})) { - print "Added extension $fonttype for file $file\n"; - $fontpriority{$fonttype} = $nexttype; - $nexttype++; + my $file = ""; + my $fonttype; + if ($l =~ /file=\"([^\"]+)\"/) { + $file = $1; + #next if ($file !~ /\.(otf|ttf|pfa|pfb|pcf|ttc)$/i); + if ($file !~ /\.([a-z0-9]{2,5})$/i) { + print "Unhandled extension for file $file\n"; + next; + } + $fonttype = lc($1); + if (! defined($fontpriority{$fonttype})) { + print "Added extension $fonttype for file $file\n"; + $fontpriority{$fonttype} = $nexttype; + $nexttype++; + } } - } - my %usedlangs = (); - if ($l =~ / lang=\"([^\"]+)\"/) { - my @ll = split(/\|/, $1); - for my $lx (@ll) { - $usedlangs{&convertlang($lx)} = 1; + my %usedlangs = (); + if ($l =~ / lang=\"([^\"]+)\"/) { + my @ll = split(/\|/, $1); + for my $lx (@ll) { + $usedlangs{&convertlang($lx)} = 1; + } } - } - for my $lang (@langs) { - next NXTLINE if (! defined($usedlangs{$lang})); - } - my ($fullname, $fuidx) = &getVal($l, "fn", "fnl", -1); - my ($style, $fsidx) = &getVal($l, "style", "stylelang", $fuidx); - $style =~ s/^\\040//; - my ($family, $faidx) = &getVal($l, "family", "flang", $fsidx); - - my $postscriptname = ""; - if ($l =~ /postscriptname=\"([^\"]+)\"/) { - $postscriptname = $1; - } - my $fontname; - ($fontname, $style) = &buildFontName($family, $style); - if (defined($options{NFontName})) { - for my $fn (@{$options{NFontName}}) { - next NXTLINE if ($fontname =~ $fn); + for my $lang (@langs) { + next NXTLINE if (! defined($usedlangs{$lang})); } - } - if (defined($options{FontName})) { - for my $fn (@{$options{FontName}}) { - next NXTLINE if ($fontname !~ $fn); - } - } - my @charlist = (); - if ($icontains) { - if ($l =~ / charset=\"([^\"]+)\"/) { - my @list = split(/\s+/, $1); - for my $e (@list) { - my ($l, $h) = split('-', $e); - $h = $l if (! defined($h)); - push(@charlist, [hex($l), hex($h)]); - } - } - if ($icontains & UCCONTAINS) { - for my $g (@{$options{Contains}}) { - next NXTLINE if (! contains($g, \@charlist)); - } - } - if ($icontains & UCNCONTAINS) { - for my $g (@{$options{NContains}}) { - # Ignore if ANY char exist in @charlist - for (my $i = $g->[0]; $i <= $g->[1]; $i++) { - next NXTLINE if (contains([$i,$i], \@charlist)); - } - } + my ($fullname, $fuidx) = &getVal($l, "fn", "fnl", -1); + my ($style, $fsidx) = &getVal($l, "style", "stylelang", $fuidx); + $style =~ s/^\\040//; + my ($family, $faidx) = &getVal($l, "family", "flang", $fsidx); + + my $postscriptname = ""; + if ($l =~ /postscriptname=\"([^\"]+)\"/) { + $postscriptname = $1; } - } - my $props = ""; - my $wprops = ""; - my @errors = (); - if ($iproperty) { - my $properties = getproperties($l, $fontname, $style, \@errors); - if ($iproperty & UPPROPERTY) { - for my $pn (@{$options{Property}}) { - next NXTLINE if ($properties !~ /$pn/i); - } - } - if ($iproperty & UPNPROPERTY) { - for my $pn (@{$options{NProperty}}) { - next NXTLINE if ($properties =~ /$pn/i); - } - } - if ($iproperty & UPPPROPERTIES) { - $props .= " ($properties)"; + my $fontname; + ($fontname, $style) = &buildFontName($family, $style); + if (defined($options{NFontName})) { + for my $fn (@{$options{NFontName}}) { + next NXTLINE if ($fontname =~ $fn); + } } - if ($iproperty & UPWPROPERTIES) { - $wprops .= " ($properties)"; + if (defined($options{FontName})) { + for my $fn (@{$options{FontName}}) { + next NXTLINE if ($fontname !~ $fn); + } } - } - if (exists($options{PrintLangs})) { - $props .= '(' . join(',', sort keys %usedlangs) . ')'; - } - if (exists($options{PrintCharset})) { - $props .= '(' . &sprintIntervalls(\@charlist) . ')'; - } - if ($iscript) { - my @scripts = (); - my $scripts = ""; - if ($l =~ / script=\"([^\"]+)\"/) { - @scripts = split(/\s+/, $1); - for my $ent (@scripts) { - $ent =~ s/^\s*otlayout://; - $ent = lc($ent); + my @charlist = (); + if ($icontains) { + if ($l =~ / charset=\"([^\"]+)\"/) { + my @list = split(/\s+/, $1); + for my $e (@list) { + my ($l, $h) = split('-', $e); + $h = $l if (! defined($h)); + push(@charlist, [hex($l), hex($h)]); + } + } + if ($icontains & UCCONTAINS) { + for my $g (@{$options{Contains}}) { + next NXTLINE if (! contains($g, \@charlist)); + } + } + if ($icontains & UCNCONTAINS) { + for my $g (@{$options{NContains}}) { + # Ignore if ANY char exist in @charlist + for (my $i = $g->[0]; $i <= $g->[1]; $i++) { + next NXTLINE if (contains([$i,$i], \@charlist)); + } + } } - $scripts = join(',', @scripts); } - if ($iscript & USMSCRIPT) { - next NXTLINE if (! &ismathfont($fontname,\@scripts)); + my $props = ""; + my $wprops = ""; + my @errors = (); + if ($iproperty) { + my $properties = getproperties($l, $fontname, $style, \@errors); + if ($iproperty & UPPROPERTY) { + for my $pn (@{$options{Property}}) { + next NXTLINE if ($properties !~ /$pn/i); + } + } + if ($iproperty & UPNPROPERTY) { + for my $pn (@{$options{NProperty}}) { + next NXTLINE if ($properties =~ /$pn/i); + } + } + if ($iproperty & UPPPROPERTIES) { + $props .= " ($properties)"; + } + if ($iproperty & UPWPROPERTIES) { + $wprops .= " ($properties)"; + } } - if ($iscript & USPSCRIPT) { - $props .= "($scripts)"; + if (exists($options{PrintLangs})) { + $props .= '(' . join(',', sort keys %usedlangs) . ')'; } - if (!defined($scripts[0])) { - # No script defined in font, so check only $options{Scripts} - next NXTLINE if ($iscript & USSCRIPT); + if (exists($options{PrintCharset})) { + $props .= '(' . &sprintIntervalls(\@charlist) . ')'; } - else { - if ($iscript & USSCRIPT) { - for my $s (@{$options{Scripts}}) { - next NXTLINE if ($scripts !~ /$s/i); - } - } - if ($iscript & USNSCRIPT) { - for my $s (@{$options{NScripts}}) { - next NXTLINE if ($scripts =~ /$s/i); - } - } + if ($iscript) { + my @scripts = (); + my $scripts = ""; + if ($l =~ / script=\"([^\"]+)\"/) { + @scripts = split(/\s+/, $1); + for my $ent (@scripts) { + $ent =~ s/^\s*otlayout://; + $ent = lc($ent); + } + $scripts = join(',', @scripts); + } + if ($iscript & USMSCRIPT) { + next NXTLINE if (! &ismathfont($fontname,\@scripts)); + } + if ($iscript & USPSCRIPT) { + $props .= "($scripts)"; + } + if (!defined($scripts[0])) { + # No script defined in font, so check only $options{Scripts} + next NXTLINE if ($iscript & USSCRIPT); + } + else { + if ($iscript & USSCRIPT) { + for my $s (@{$options{Scripts}}) { + next NXTLINE if ($scripts !~ /$s/i); + } + } + if ($iscript & USNSCRIPT) { + for my $s (@{$options{NScripts}}) { + next NXTLINE if ($scripts =~ /$s/i); + } + } + } } - } - my $foundry = ""; - if ($l =~ /foundry=\"([^\"]+)\"/) { - $foundry = $1; - $foundry =~ s/^\s+//; - $foundry =~ s/\s+$//; - } - if (defined($collectedfonts{$fontname}->{$foundry}->{errors})) { - # Apparently not the first one, so add some info - my $oldfonttype = $collectedfonts{$fontname}->{$foundry}->{fonttype}; - if (defined($errors[0])) { - push(@{$collectedfonts{$fontname}->{$foundry}->{errors}}, @errors); + my $foundry = ""; + if ($l =~ /foundry=\"([^\"]+)\"/) { + $foundry = $1; + $foundry =~ s/^\s+//; + $foundry =~ s/\s+$//; } - if ($fontpriority{$oldfonttype} > $fontpriority{$fonttype}) { - push(@{$collectedfonts{$fontname}->{$foundry}->{errors}}, "Warning: overwriting old info of file: " . $collectedfonts{$fontname}->{$foundry}->{file}); + if (defined($collectedfonts{$fontname}->{$foundry}->{errors})) { + # Apparently not the first one, so add some info + my $oldfonttype = $collectedfonts{$fontname}->{$foundry}->{fonttype}; + if (defined($errors[0])) { + push(@{$collectedfonts{$fontname}->{$foundry}->{errors}}, @errors); + } + if ($fontpriority{$oldfonttype} > $fontpriority{$fonttype}) { + push(@{$collectedfonts{$fontname}->{$foundry}->{errors}}, "Warning: overwriting old info of file: " . $collectedfonts{$fontname}->{$foundry}->{file}); + } + else { + push(@{$collectedfonts{$fontname}->{$foundry}->{errors}}, "Warning: discarding new info from file: $file"); + next; + } } else { - push(@{$collectedfonts{$fontname}->{$foundry}->{errors}}, "Warning: discarding new info from file: $file"); - next; + $collectedfonts{$fontname}->{$foundry}->{errors} = \@errors; } + $collectedfonts{$fontname}->{$foundry}->{props} = $props; + $collectedfonts{$fontname}->{$foundry}->{wprops} = $wprops; + $collectedfonts{$fontname}->{$foundry}->{file} = $file; + $collectedfonts{$fontname}->{$foundry}->{fonttype} = $fonttype; } - else { - $collectedfonts{$fontname}->{$foundry}->{errors} = \@errors; - } - $collectedfonts{$fontname}->{$foundry}->{props} = $props; - $collectedfonts{$fontname}->{$foundry}->{wprops} = $wprops; - $collectedfonts{$fontname}->{$foundry}->{file} = $file; - $collectedfonts{$fontname}->{$foundry}->{fonttype} = $fonttype; + close(FI); } - close(FI); } for my $fontname (sort keys %collectedfonts) {