mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-23 13:31:49 +00:00
4bb00e99fb
Disable conversion cache because all lyx instances use the same cache without any locking between read and write to the cache. Thanks to Scott catching this case.
214 lines
4.3 KiB
Perl
214 lines
4.3 KiB
Perl
# -*- mode: perl; -*-
|
|
package prefTest;
|
|
|
|
our(@EXPORT, @ISA);
|
|
BEGIN {
|
|
use Exporter ();
|
|
@ISA = qw(Exporter);
|
|
@EXPORT = qw(getSubstitutes getConverters applyChanges);
|
|
}
|
|
|
|
sub getSubstitutes($$@);
|
|
sub getConverters($$$);
|
|
sub getConverter($$);
|
|
sub getNext($);
|
|
sub writeConverters($$);
|
|
sub createConvLine($$);
|
|
|
|
sub getSubstitutes($$@)
|
|
{
|
|
my ($rAllowedKeys, $rSubst, @args) = @_;
|
|
|
|
my @ctestpars = ();
|
|
my $ctestparams = 0;
|
|
for my $arg (@args) {
|
|
if ($ctestparams) {
|
|
push(@ctestpars, $arg);
|
|
}
|
|
else {
|
|
if ($arg =~ /^([^=]+)=(.*)$/) {
|
|
my $key = $1;
|
|
my $value = $2;
|
|
my $valid = 0;
|
|
if (defined($rAllowedKeys->{$key})) {
|
|
if (ref($rAllowedKeys->{$key}) eq "ARRAY") {
|
|
for my $val (@{$rAllowedKeys->{$key}}) {
|
|
if ($val eq $value) {
|
|
$valid = 1;
|
|
last;
|
|
}
|
|
}
|
|
}
|
|
elsif ($rAllowedKeys->{$key} eq "integer") {
|
|
if ($value =~ /^\d+$/) {
|
|
$valid = 1;
|
|
}
|
|
}
|
|
elsif ($rAllowedKeys->{$key} eq "string") {
|
|
$valid = 1;
|
|
}
|
|
}
|
|
if ($valid) {
|
|
$rSubst->{$key} = [$value, 0];
|
|
}
|
|
else {
|
|
die("invalid key or value specified in \"$arg\"");
|
|
}
|
|
}
|
|
else {
|
|
$ctestparams = 1;
|
|
push(@ctestpars, $arg);
|
|
}
|
|
}
|
|
}
|
|
return(@ctestpars);
|
|
}
|
|
|
|
sub getConverters($$$)
|
|
{
|
|
my ($userdir, $rConverter, $add) = @_;
|
|
|
|
if (open(FI, "$userdir/lyxrc.defaults")) {
|
|
while (my $l = <FI>) {
|
|
if ($l =~ s/^\s*\\converter\s+//) {
|
|
my $entry = &getConverter($l, $add);
|
|
if (defined($entry)) {
|
|
$rConverter->{$entry->[0]} = $entry->[1];
|
|
}
|
|
}
|
|
}
|
|
close(FI);
|
|
}
|
|
}
|
|
|
|
sub getConverter($$)
|
|
{
|
|
my ($l, $add) = @_;
|
|
chomp($l);
|
|
my ($from, $to, $cmd, $par);
|
|
($l, $from) = getNext($l);
|
|
return undef if ($from !~ /tex$/);
|
|
($l, $to) = getNext($l);
|
|
return undef if ($to !~ /^((dvi3?|pdf[23456]?)(log)?)$/);
|
|
($l, $cmd) = getNext($l);
|
|
if ($add) {
|
|
if ($cmd !~ /\-shell-(escape|restricted)/) {
|
|
if ($cmd =~ /^(\S+)\s*(.*)$/) {
|
|
$cmd = "$1 -shell-restricted $2";
|
|
$cmd =~ s/\s+$//;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
$cmd =~ s/\s+\-shell\-(escape|restricted)//;
|
|
}
|
|
($l, $par) = getNext($l);
|
|
return undef if ($par !~ /^latex/);
|
|
my $key = "\"$from\" \"$to\"";
|
|
if ($add) {
|
|
return([$key, [$cmd, $par]]);
|
|
}
|
|
else {
|
|
# Removes entry from prefs
|
|
return([$key, [$cmd, $par, 1]]);
|
|
}
|
|
}
|
|
|
|
sub getNext($)
|
|
{
|
|
my ($l) = @_;
|
|
my $val = undef;
|
|
|
|
if ($l =~ /^\s*\"([^\"]*)\"\s*(.*)$/) {
|
|
$val = $1;
|
|
$l = $2;
|
|
}
|
|
elsif ($l =~ /^\s*(\S+)\s*(.*)$/) {
|
|
$val = $1;
|
|
$l = $2;
|
|
}
|
|
else {
|
|
exit(7);
|
|
}
|
|
return($l, $val);
|
|
}
|
|
|
|
sub writeConverters($$)
|
|
{
|
|
my ($fo, $rConverter) = @_;
|
|
for my $key (sort keys %{$rConverter}) {
|
|
if (! defined($rConverter->{$key}->[2])) {
|
|
$rConverter->{$key}->[2] = 1;
|
|
my $l = &createConvLine($key, $rConverter);
|
|
print $fo $l;
|
|
}
|
|
}
|
|
}
|
|
|
|
sub createConvLine($$)
|
|
{
|
|
my ($key, $rConverter) = @_;
|
|
my $l = "\\converter $key \"$rConverter->{$key}->[0]\" \"$rConverter->{$key}->[1]\"\n";
|
|
return($l);
|
|
}
|
|
|
|
sub applyChanges($$$$)
|
|
{
|
|
my ($userdir, $rSubst, $rConverter, $add) = @_;
|
|
|
|
if (open(FO, '>', "$userdir/preferences.tmp")) {
|
|
if (open(FI, "$userdir/preferences")) {
|
|
my $conv_section = -1;
|
|
while (my $l = <FI>) {
|
|
if ($conv_section-- == 0) {
|
|
&writeConverters(*FO, $rConverter);
|
|
}
|
|
if ($l =~ /^\# CONVERTERS SECTION/) {
|
|
$conv_section = 2; # converters begin 2 lines later
|
|
}
|
|
if ($l =~ /^\\converter\s+(.*)$/) {
|
|
my $entry = &getConverter($1, $add);
|
|
if (defined($entry)) {
|
|
my $key = $entry->[0];
|
|
if (defined($rConverter->{$key})) {
|
|
if (defined($rConverter->{$key}->[2])) {
|
|
$l = "";
|
|
}
|
|
else {
|
|
$rConverter->{$key}->[2] = 1;
|
|
$l = &createConvLine($key, $rConverter);
|
|
}
|
|
}
|
|
else {
|
|
# Converter defined only in preferences
|
|
$rConverter->{$key} = $entry->[1];
|
|
$rConverter->{$key}->[2] = 1;
|
|
$l = &createConvLine($key, $rConverter);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
for my $k (keys %{$rSubst}) {
|
|
if ($l =~ /^\\$k\b/) {
|
|
$l = "\\$k $rSubst->{$k}->[0]\n";
|
|
$rSubst->{$k}->[1] = 1;
|
|
}
|
|
}
|
|
}
|
|
print FO $l;
|
|
}
|
|
close(FI);
|
|
}
|
|
for my $k (keys %{$rSubst}) {
|
|
if ($rSubst->{$k}->[1] == 0) {
|
|
print FO "\\$k $rSubst->{$k}->[0]\n";
|
|
}
|
|
}
|
|
&writeConverters(*FO, $rConverter);
|
|
close(FO);
|
|
rename("$userdir/preferences.tmp", "$userdir/preferences");
|
|
}
|
|
}
|
|
|
|
return 1;
|