8 @EXPORT = qw(getSubstitutes getConverters applyChanges);
11 sub getSubstitutes($$@);
12 sub getConverters($$$);
15 sub writeConverters($$);
16 sub createConvLine($$);
18 sub getSubstitutes($$@)
20 my ($rAllowedKeys, $rSubst, @args) = @_;
26 push(@ctestpars, $arg);
29 if ($arg =~ /^([^=]+)=(.*)$/) {
33 if (defined($rAllowedKeys->{$key})) {
34 if (ref($rAllowedKeys->{$key}) eq "ARRAY") {
35 for my $val (@{$rAllowedKeys->{$key}}) {
42 elsif ($rAllowedKeys->{$key} eq "integer") {
43 if ($value =~ /^\d+$/) {
47 elsif ($rAllowedKeys->{$key} eq "string") {
52 $rSubst->{$key} = [$value, 0];
55 die("invalid key or value specified in \"$arg\"");
60 push(@ctestpars, $arg);
67 sub getConverters($$$)
69 my ($userdir, $rConverter, $add) = @_;
71 if (open(FI, "$userdir/lyxrc.defaults")) {
72 while (my $l = <FI>) {
73 if ($l =~ s/^\s*\\converter\s+//) {
74 my $entry = &getConverter($l, $add);
75 if (defined($entry)) {
76 $rConverter->{$entry->[0]} = $entry->[1];
88 my ($from, $to, $cmd, $par);
89 ($l, $from) = getNext($l);
90 return undef if ($from !~ /(ps|tex|dvi)$/);
91 ($l, $to) = getNext($l);
92 return undef if ($to !~ /^((dvi3?|pdf[23456]?)(log)?)$/);
93 my ($checkfor, $substitute, $extrapar);
95 $checkfor = qr/\s+\-shell\-(escape|restricted)/;
96 $substitute = "-shell-escape";
97 $extrapar = qr/^latex/;
99 elsif ($from =~ /ps$/) {
100 $checkfor = qr/\s+\-dALLOWPSTRANSPARENCY/;
101 $substitute = "-dALLOWPSTRANSPARENCY";
102 $extrapar = qr/hyperref-driver=dvips/;
105 $checkfor = qr/\s+-i\s+dvipdfmx-unsafe.cfg/;
106 $substitute = "-i dvipdfmx-unsafe.cfg";
107 $extrapar = qr/^hyperref-driver=dvipdfm/;
109 ($l, $cmd) = getNext($l);
111 if ($cmd !~ $checkfor) {
112 if ($cmd =~ /^(\S+)\s*(.*)$/) {
113 $cmd = "$1 $substitute $2";
119 $cmd =~ s/$checkfor//;
121 ($l, $par) = getNext($l);
122 return undef if ($par !~ $extrapar);
123 my $key = "\"$from\" \"$to\"";
125 return([$key, [$cmd, $par]]);
128 # Removes entry from prefs
129 return([$key, [$cmd, $par, 1]]);
138 if ($l =~ /^\s*\"([^\"]*)\"\s*(.*)$/) {
142 elsif ($l =~ /^\s*(\S+)\s*(.*)$/) {
152 sub writeConverters($$)
154 my ($fo, $rConverter) = @_;
155 for my $key (sort keys %{$rConverter}) {
156 if (! defined($rConverter->{$key}->[2])) {
157 $rConverter->{$key}->[2] = 1;
158 my $l = &createConvLine($key, $rConverter);
164 sub createConvLine($$)
166 my ($key, $rConverter) = @_;
167 my $l = "\\converter $key \"$rConverter->{$key}->[0]\" \"$rConverter->{$key}->[1]\"\n";
171 sub applyChanges($$$$)
173 my ($userdir, $rSubst, $rConverter, $add) = @_;
175 if (open(FO, '>', "$userdir/preferences.tmp")) {
176 if (open(FI, "$userdir/preferences")) {
177 my $conv_section = -1;
178 while (my $l = <FI>) {
179 if ($conv_section-- == 0) {
180 &writeConverters(*FO, $rConverter);
182 if ($l =~ /^\# CONVERTERS SECTION/) {
183 $conv_section = 2; # converters begin 2 lines later
185 if ($l =~ /^\\converter\s+(.*)$/) {
186 my $entry = &getConverter($1, $add);
187 if (defined($entry)) {
188 my $key = $entry->[0];
189 if (defined($rConverter->{$key})) {
190 if (defined($rConverter->{$key}->[2])) {
194 $rConverter->{$key}->[2] = 1;
195 $l = &createConvLine($key, $rConverter);
199 # Converter defined only in preferences
200 $rConverter->{$key} = $entry->[1];
201 $rConverter->{$key}->[2] = 1;
202 $l = &createConvLine($key, $rConverter);
207 for my $k (keys %{$rSubst}) {
208 if ($l =~ /^\\$k\b/) {
209 $l = "\\$k $rSubst->{$k}->[0]\n";
210 $rSubst->{$k}->[1] = 1;
218 for my $k (keys %{$rSubst}) {
219 if ($rSubst->{$k}->[1] == 0) {
220 print FO "\\$k $rSubst->{$k}->[0]\n";
223 &writeConverters(*FO, $rConverter);
225 rename("$userdir/preferences.tmp", "$userdir/preferences");