]> git.lyx.org Git - lyx.git/blob - lib/scripts/prefTest.pm
d5b34698c2b457e8d3bd1fac975bff9ae5d6d39e
[lyx.git] / lib / scripts / prefTest.pm
1 # -*- mode: perl; -*-
2 package prefTest;
3
4 our(@EXPORT, @ISA);
5 BEGIN {
6   use Exporter   ();
7   @ISA        = qw(Exporter);
8   @EXPORT     = qw(getSubstitutes getConverters applyChanges);
9 }
10
11 sub getSubstitutes($$@);
12 sub getConverters($$$);
13 sub getConverter($$);
14 sub getNext($);
15 sub writeConverters($$);
16
17 sub getSubstitutes($$@)
18 {
19   my ($rAllowedKeys, $rSubst, @args) = @_;
20
21   my @ctestpars = ();
22   my $ctestparams = 0;
23   for my $arg (@args) {
24     if ($ctestparams) {
25       push(@ctestpars, $arg);
26     }
27     else {
28       if ($arg =~ /^([^=]+)=(.*)$/) {
29         my $key = $1;
30         my $value = $2;
31         my $valid = 0;
32         if (defined($rAllowedKeys->{$key})) {
33           for my $val (@{$rAllowedKeys->{$key}}) {
34             if ($val eq $value) {
35               $valid = 1;
36               last;
37             }
38           }
39         }
40         if ($valid) {
41           $rSubst->{$key} = [$value, 0];
42         }
43         else {
44           die("invalid key or value specified in \"$arg\"");
45         }
46       }
47       else {
48         $ctestparams = 1;
49         push(@ctestpars, $arg);
50       }
51     }
52   }
53   return(@ctestpars);
54 }
55
56 sub getConverters($$$)
57 {
58   my ($userdir, $rConverter, $add) = @_;
59
60   if (open(FI, "$userdir/lyxrc.defaults")) {
61     while (my $l = <FI>) {
62       if ($l =~ s/^\s*\\converter\s+//) {
63         my $entry = &getConverter($l, $add);
64         if (defined($entry)) {
65           $rConverter->{$entry->[0]} = $entry->[1];
66         }
67       }
68     }
69     close(FI);
70   }
71 }
72
73 sub getConverter($$)
74 {
75   my ($l, $add) = @_;
76   chomp($l);
77   my ($from, $to, $cmd, $par);
78   ($l, $from) = getNext($l);
79   return undef if ($from !~ /tex$/);
80   ($l, $to) = getNext($l);
81   return undef if ($to !~ /^(dvi3?|pdf[23456]?)$/);
82   ($l, $cmd) = getNext($l);
83   if ($add) {
84     if ($cmd !~ /\-shell-escape/) {
85       if ($cmd =~ /^(\S+)\s*(.*)$/) {
86         $cmd = "$1 -shell-escape $2";
87         $cmd =~ s/\s+$//;
88       }
89     }
90   }
91   else {
92     $cmd =~ s/\s+\-shell\-escape//;
93   }
94   ($l, $par) = getNext($l);
95   return undef if ($par !~ /^latex/);
96   my $key = "\"$from\" \"$to\"";
97   if ($add) {
98     return([$key, [$cmd, $par]]);
99   }
100   else {
101     # Removes entry from prefs
102     return([$key, [$cmd, $par, 1]]);
103   }
104 }
105
106 sub getNext($)
107 {
108   my ($l) = @_;
109   my $val = undef;
110
111   if ($l =~ /^\s*\"([^\"]*)\"\s*(.*)$/) {
112     $val = $1;
113     $l = $2;
114   }
115   elsif ($l =~ /^\s*(\S+)\s*(.*)$/) {
116     $val = $1;
117     $l = $2;
118   }
119   else {
120     exit(7);
121   }
122   return($l, $val);
123 }
124
125 sub writeConverters($$)
126 {
127   my ($fo, $rConverter) = @_;
128   for my $key (sort keys %{$rConverter}) {
129     if (! defined($rConverter->{$key}->[2])) {
130       $rConverter->{$key}->[2] = 1;
131       my $l = &createConvLine($key, $rConverter);
132       print $fo $l;
133     }
134   }
135 }
136
137 sub createConvLine($$)
138 {
139   my ($key, $rConverter) = @_;
140   my $l = "\\converter $key \"$rConverter->{$key}->[0]\" \"$rConverter->{$key}->[1]\"\n";
141   return($l);
142 }
143
144 sub applyChanges($$$$)
145 {
146   my ($userdir, $rSubst, $rConverter, $add) = @_;
147
148   if (open(FO, '>', "$userdir/preferences.tmp")) {
149     if (open(FI, "$userdir/preferences")) {
150       my $conv_section = -1;
151       while (my $l = <FI>) {
152         if ($conv_section-- == 0) {
153           &writeConverters(*FO, $rConverter);
154         }
155         if ($l =~ /^\# CONVERTERS SECTION/) {
156           $conv_section = 2;    # converters begin 2 lines later
157         }
158         if ($l =~ /^\\converter\s+(.*)$/) {
159           my $entry = &getConverter($1, $add);
160           if (defined($entry)) {
161             my $key = $entry->[0];
162             if (defined($rConverter->{$key})) {
163               if (defined($rConverter->{$key}->[2])) {
164                 $l = "";
165               }
166               else {
167                 $rConverter->{$key}->[2] = 1;
168                 $l = &createConvLine($key);
169               }
170             }
171           }
172         }
173         else {
174           for my $k (keys %{$rSubst}) {
175             if ($l =~ /^\\$k\b/) {
176               $l = "\\$k $rSubst->{$k}->[0]\n";
177               $rSubst->{$k}->[1] = 1;
178             }
179           }
180         }
181         print FO $l;
182       }
183       close(FI);
184     }
185     for my $k (keys %{$rSubst}) {
186       if ($rSubst->{$k}->[1] == 0) {
187         print FO "\\$k $rSubst->{$k}->[0]\n";
188       }
189     }
190     &writeConverters(*FO, $rConverter);
191     close(FO);
192     rename("$userdir/preferences.tmp", "$userdir/preferences");
193   }
194 }
195
196 return 1;