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 !~ /(tex|dvi)$/);
91 ($l, $to) = getNext($l);
92 return undef if ($to !~ /^((dvi3?|pdf[23456]?)(log)?)$/);
93 my ($checkfor, $substitute);
95 $checkfor = qr/\s+\-shell\-(escape|restricted)/;
96 $substitute = "-shell-escape";
99 $checkfor = qr/\s+-i\s+dvipdfmx-unsafe.cfg/;
100 $substitute = "-i dvipdfmx-unsafe.cfg";
102 ($l, $cmd) = getNext($l);
104 if ($cmd !~ $checkfor) {
105 if ($cmd =~ /^(\S+)\s*(.*)$/) {
106 $cmd = "$1 $substitute $2";
112 $cmd =~ s/$checkfor//;
114 ($l, $par) = getNext($l);
115 return undef if ($par !~ /^(latex|hyperref-driver=dvipdfm)/);
116 my $key = "\"$from\" \"$to\"";
118 return([$key, [$cmd, $par]]);
121 # Removes entry from prefs
122 return([$key, [$cmd, $par, 1]]);
131 if ($l =~ /^\s*\"([^\"]*)\"\s*(.*)$/) {
135 elsif ($l =~ /^\s*(\S+)\s*(.*)$/) {
145 sub writeConverters($$)
147 my ($fo, $rConverter) = @_;
148 for my $key (sort keys %{$rConverter}) {
149 if (! defined($rConverter->{$key}->[2])) {
150 $rConverter->{$key}->[2] = 1;
151 my $l = &createConvLine($key, $rConverter);
157 sub createConvLine($$)
159 my ($key, $rConverter) = @_;
160 my $l = "\\converter $key \"$rConverter->{$key}->[0]\" \"$rConverter->{$key}->[1]\"\n";
164 sub applyChanges($$$$)
166 my ($userdir, $rSubst, $rConverter, $add) = @_;
168 if (open(FO, '>', "$userdir/preferences.tmp")) {
169 if (open(FI, "$userdir/preferences")) {
170 my $conv_section = -1;
171 while (my $l = <FI>) {
172 if ($conv_section-- == 0) {
173 &writeConverters(*FO, $rConverter);
175 if ($l =~ /^\# CONVERTERS SECTION/) {
176 $conv_section = 2; # converters begin 2 lines later
178 if ($l =~ /^\\converter\s+(.*)$/) {
179 my $entry = &getConverter($1, $add);
180 if (defined($entry)) {
181 my $key = $entry->[0];
182 if (defined($rConverter->{$key})) {
183 if (defined($rConverter->{$key}->[2])) {
187 $rConverter->{$key}->[2] = 1;
188 $l = &createConvLine($key, $rConverter);
192 # Converter defined only in preferences
193 $rConverter->{$key} = $entry->[1];
194 $rConverter->{$key}->[2] = 1;
195 $l = &createConvLine($key, $rConverter);
200 for my $k (keys %{$rSubst}) {
201 if ($l =~ /^\\$k\b/) {
202 $l = "\\$k $rSubst->{$k}->[0]\n";
203 $rSubst->{$k}->[1] = 1;
211 for my $k (keys %{$rSubst}) {
212 if ($rSubst->{$k}->[1] == 0) {
213 print FO "\\$k $rSubst->{$k}->[0]\n";
216 &writeConverters(*FO, $rConverter);
218 rename("$userdir/preferences.tmp", "$userdir/preferences");