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$/);
91 ($l, $to) = getNext($l);
92 return undef if ($to !~ /^((dvi3?|pdf[23456]?)(log)?)$/);
93 ($l, $cmd) = getNext($l);
95 if ($cmd !~ /\-shell-(escape|restricted)/) {
96 if ($cmd =~ /^(\S+)\s*(.*)$/) {
97 $cmd = "$1 -shell-escape $2";
103 $cmd =~ s/\s+\-shell\-(escape|restricted)//;
105 ($l, $par) = getNext($l);
106 return undef if ($par !~ /^latex/);
107 my $key = "\"$from\" \"$to\"";
109 return([$key, [$cmd, $par]]);
112 # Removes entry from prefs
113 return([$key, [$cmd, $par, 1]]);
122 if ($l =~ /^\s*\"([^\"]*)\"\s*(.*)$/) {
126 elsif ($l =~ /^\s*(\S+)\s*(.*)$/) {
136 sub writeConverters($$)
138 my ($fo, $rConverter) = @_;
139 for my $key (sort keys %{$rConverter}) {
140 if (! defined($rConverter->{$key}->[2])) {
141 $rConverter->{$key}->[2] = 1;
142 my $l = &createConvLine($key, $rConverter);
148 sub createConvLine($$)
150 my ($key, $rConverter) = @_;
151 my $l = "\\converter $key \"$rConverter->{$key}->[0]\" \"$rConverter->{$key}->[1]\"\n";
155 sub applyChanges($$$$)
157 my ($userdir, $rSubst, $rConverter, $add) = @_;
159 if (open(FO, '>', "$userdir/preferences.tmp")) {
160 if (open(FI, "$userdir/preferences")) {
161 my $conv_section = -1;
162 while (my $l = <FI>) {
163 if ($conv_section-- == 0) {
164 &writeConverters(*FO, $rConverter);
166 if ($l =~ /^\# CONVERTERS SECTION/) {
167 $conv_section = 2; # converters begin 2 lines later
169 if ($l =~ /^\\converter\s+(.*)$/) {
170 my $entry = &getConverter($1, $add);
171 if (defined($entry)) {
172 my $key = $entry->[0];
173 if (defined($rConverter->{$key})) {
174 if (defined($rConverter->{$key}->[2])) {
178 $rConverter->{$key}->[2] = 1;
179 $l = &createConvLine($key, $rConverter);
183 # Converter defined only in preferences
184 $rConverter->{$key} = $entry->[1];
185 $rConverter->{$key}->[2] = 1;
186 $l = &createConvLine($key, $rConverter);
191 for my $k (keys %{$rSubst}) {
192 if ($l =~ /^\\$k\b/) {
193 $l = "\\$k $rSubst->{$k}->[0]\n";
194 $rSubst->{$k}->[1] = 1;
202 for my $k (keys %{$rSubst}) {
203 if ($rSubst->{$k}->[1] == 0) {
204 print FO "\\$k $rSubst->{$k}->[0]\n";
207 &writeConverters(*FO, $rConverter);
209 rename("$userdir/preferences.tmp", "$userdir/preferences");