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 for my $val (@{$rAllowedKeys->{$key}}) {
42 $rSubst->{$key} = [$value, 0];
45 die("invalid key or value specified in \"$arg\"");
50 push(@ctestpars, $arg);
57 sub getConverters($$$)
59 my ($userdir, $rConverter, $add) = @_;
61 if (open(FI, "$userdir/lyxrc.defaults")) {
62 while (my $l = <FI>) {
63 if ($l =~ s/^\s*\\converter\s+//) {
64 my $entry = &getConverter($l, $add);
65 if (defined($entry)) {
66 $rConverter->{$entry->[0]} = $entry->[1];
78 my ($from, $to, $cmd, $par);
79 ($l, $from) = getNext($l);
80 return undef if ($from !~ /tex$/);
81 ($l, $to) = getNext($l);
82 return undef if ($to !~ /^((dvi3?|pdf[23456]?)(log)?)$/);
83 ($l, $cmd) = getNext($l);
85 if ($cmd !~ /\-shell-escape/) {
86 if ($cmd =~ /^(\S+)\s*(.*)$/) {
87 $cmd = "$1 -shell-escape $2";
93 $cmd =~ s/\s+\-shell\-escape//;
95 ($l, $par) = getNext($l);
96 return undef if ($par !~ /^latex/);
97 my $key = "\"$from\" \"$to\"";
99 return([$key, [$cmd, $par]]);
102 # Removes entry from prefs
103 return([$key, [$cmd, $par, 1]]);
112 if ($l =~ /^\s*\"([^\"]*)\"\s*(.*)$/) {
116 elsif ($l =~ /^\s*(\S+)\s*(.*)$/) {
126 sub writeConverters($$)
128 my ($fo, $rConverter) = @_;
129 for my $key (sort keys %{$rConverter}) {
130 if (! defined($rConverter->{$key}->[2])) {
131 $rConverter->{$key}->[2] = 1;
132 my $l = &createConvLine($key, $rConverter);
138 sub createConvLine($$)
140 my ($key, $rConverter) = @_;
141 my $l = "\\converter $key \"$rConverter->{$key}->[0]\" \"$rConverter->{$key}->[1]\"\n";
145 sub applyChanges($$$$)
147 my ($userdir, $rSubst, $rConverter, $add) = @_;
149 if (open(FO, '>', "$userdir/preferences.tmp")) {
150 if (open(FI, "$userdir/preferences")) {
151 my $conv_section = -1;
152 while (my $l = <FI>) {
153 if ($conv_section-- == 0) {
154 &writeConverters(*FO, $rConverter);
156 if ($l =~ /^\# CONVERTERS SECTION/) {
157 $conv_section = 2; # converters begin 2 lines later
159 if ($l =~ /^\\converter\s+(.*)$/) {
160 my $entry = &getConverter($1, $add);
161 if (defined($entry)) {
162 my $key = $entry->[0];
163 if (defined($rConverter->{$key})) {
164 if (defined($rConverter->{$key}->[2])) {
168 $rConverter->{$key}->[2] = 1;
169 $l = &createConvLine($key, $rConverter);
173 # Converter defined only in preferences
174 $rConverter->{$key} = $entry->[1];
175 $rConverter->{$key}->[2] = 1;
176 $l = &createConvLine($key, $rConverter);
181 for my $k (keys %{$rSubst}) {
182 if ($l =~ /^\\$k\b/) {
183 $l = "\\$k $rSubst->{$k}->[0]\n";
184 $rSubst->{$k}->[1] = 1;
192 for my $k (keys %{$rSubst}) {
193 if ($rSubst->{$k}->[1] == 0) {
194 print FO "\\$k $rSubst->{$k}->[0]\n";
197 &writeConverters(*FO, $rConverter);
199 rename("$userdir/preferences.tmp", "$userdir/preferences");