|
24 | 24 | # actual work
|
25 | 25 | my $currentRepresents = '';
|
26 | 26 | my $represents = {};
|
27 |
| -my $parserExpanderState = undef; |
28 |
| -my $parserExpanderMode = 'passthrough'; |
29 | 27 |
|
30 | 28 | while (@lines) {
|
31 | 29 | my $line = shift @lines;
|
|
82 | 80 | }
|
83 | 81 | $line =~ s|<!--REPRESENTS ([^>]+)-->| if (exists $represents->{$1}) { $represents->{$1} } else { die "\nUnknown element <$1> used in REPRESENTS pragma.\n" }|gose;
|
84 | 82 |
|
85 |
| - $line = parserExpander($line); |
| 83 | + # This seems to be necessary due to the file substitutions, for some reason. |
| 84 | + $line = normalizeNewlines($line); |
86 | 85 |
|
87 | 86 | print "$line";
|
88 | 87 | }
|
89 | 88 | report "\n";
|
90 | 89 |
|
91 |
| -sub expand { |
92 |
| - my($val) = @_; |
93 |
| - return 'a <span>space character</span>' if $val eq 'space character'; |
94 |
| - return 'a U+002D HYPHEN-MINUS character (-)' if $val eq '-'; |
95 |
| - return 'a U+002E FULL STOP character (.)' if $val eq '.'; |
96 |
| - return 'an <span data-x="ASCII digits">ASCII digit</span>' if $val eq '0-9'; |
97 |
| - return 'a U+0045 LATIN CAPITAL LETTER E character or a U+0065 LATIN SMALL LETTER E character' if $val eq 'e/E'; |
98 |
| - return 'an <span data-x="uppercase ASCII letters">uppercase ASCII letter</span> or a <span data-x="lowercase ASCII letters">lowercase ASCII letter</span>' if $val eq 'letter'; |
99 |
| - return 'EOF' if $val eq 'eof'; |
100 |
| - die "unknown value type: '$val'"; |
101 |
| -} |
102 |
| - |
103 |
| -sub parserExpander { |
| 90 | +sub normalizeNewlines { |
104 | 91 | $_ = shift;
|
105 | 92 | chomp;
|
106 |
| - my $output = ''; |
107 |
| - if ($parserExpanderMode eq 'passthrough') { |
108 |
| - if (m/^( *)<pre>parse/gs) { |
109 |
| - $parserExpanderState = { |
110 |
| - indent => $1, |
111 |
| - variables => {}, |
112 |
| - actions => {}, |
113 |
| - refs => {}, |
114 |
| - mode => '', |
115 |
| - prefix => '', |
116 |
| - level => 0, |
117 |
| - }; |
118 |
| - if (m/\G using /gs) { |
119 |
| - while (m/\G(.+?)(, |$)/gs) { |
120 |
| - die if exists $parserExpanderState->{variables}->{$1}; |
121 |
| - $parserExpanderState->{variables}->{$1} = 1; |
122 |
| - } |
123 |
| - } |
124 |
| - $output .= "$parserExpanderState->{indent}<dl class=\"switch\">\n"; |
125 |
| - $parserExpanderMode = 'parser'; |
126 |
| - } else { |
127 |
| - $output .= "$_\n"; |
128 |
| - } |
129 |
| - } elsif ($parserExpanderMode eq 'parser') { |
130 |
| - die unless $parserExpanderState; |
131 |
| - if (m/^$parserExpanderState->{indent}([^ ]+)ing to: (.+)$/s) { |
132 |
| - die if exists $parserExpanderState->{actions}->{$1}; |
133 |
| - $parserExpanderState->{actions}->{$1} = $2; |
134 |
| - } elsif (m/^$parserExpanderState->{indent}switch using (.+)/s) { |
135 |
| - die if length $parserExpanderState->{mode}; |
136 |
| - $parserExpanderState->{mode} = $1; |
137 |
| - } elsif (m/^$parserExpanderState->{indent}defined above: /gs) { |
138 |
| - while (m/\G(.+?)(, |$)/gs) { |
139 |
| - die if exists $parserExpanderState->{refs}->{$1}; |
140 |
| - $parserExpanderState->{refs}->{$1} = 1; |
141 |
| - } |
142 |
| - } elsif (m/^$parserExpanderState->{indent}prefix xrefs with "(.+)"$/gs) { |
143 |
| - die if length $parserExpanderState->{prefix}; |
144 |
| - $parserExpanderState->{prefix} = $1; |
145 |
| - } elsif (m/^$parserExpanderState->{indent} case (.+):/s) { |
146 |
| - if ($parserExpanderState->{level} >= 3) { |
147 |
| - $output .= "$parserExpanderState->{indent} </dd>\n"; |
148 |
| - } |
149 |
| - if ($parserExpanderState->{level} >= 2) { |
150 |
| - $output .= "$parserExpanderState->{indent} </dl>\n"; |
151 |
| - } |
152 |
| - if ($parserExpanderState->{level} >= 1) { |
153 |
| - $output .= "$parserExpanderState->{indent} </dd>\n"; |
154 |
| - } |
155 |
| - $output .= "$parserExpanderState->{indent} <dt>If <var data-x=\"$parserExpanderState->{prefix} $parserExpanderState->{mode}\">$parserExpanderState->{mode}</var> is \"<dfn data-x=\"$parserExpanderState->{prefix} $parserExpanderState->{mode}: $1\">$1</dfn>\"</dt>\n"; |
156 |
| - $output .= "$parserExpanderState->{indent} <dd>\n"; |
157 |
| - $parserExpanderState->{level} = 1; |
158 |
| - } elsif (m/^$parserExpanderState->{indent} (.+?)=(.+?)(?: (?:(unless) (.+)|(if numbers are coming)|(if numbers are not coming)))?:/s) { |
159 |
| - my $var = $1; |
160 |
| - my $val = $2; |
161 |
| - my $parserExpanderMode = $3 || $5 || $6; |
162 |
| - my $flag = $4; |
163 |
| - die "unknown variable $var" unless $parserExpanderState->{variables}->{$var}; |
164 |
| - die "unknown variable $flag" if defined $flag and not $parserExpanderState->{variables}->{$flag}; |
165 |
| - die if $parserExpanderState->{level} < 1; |
166 |
| - if ($parserExpanderState->{level} >= 3) { |
167 |
| - $output .= "$parserExpanderState->{indent} </dd>\n"; |
168 |
| - } elsif ($parserExpanderState->{level} < 2) { |
169 |
| - $output .= "$parserExpanderState->{indent} <p>Run the appropriate substeps from the following list:</p>\n"; |
170 |
| - $output .= "$parserExpanderState->{indent} <dl class=\"switch\">\n"; |
171 |
| - } |
172 |
| - $val = expand($val); |
173 |
| - my $condition = "If <var>$var</var> is $val"; |
174 |
| - if ($parserExpanderMode) { |
175 |
| - if ($parserExpanderMode eq 'unless') { |
176 |
| - $condition .= " and <var>$flag</var> is false"; |
177 |
| - } elsif ($parserExpanderMode eq 'if numbers are coming') { |
178 |
| - $condition .= " and any of the characters in <var>value</var> past the <var>index</var>th character are <span>ASCII digits</span>"; |
179 |
| - } elsif ($parserExpanderMode eq 'if numbers are not coming') { |
180 |
| - $condition .= " and none of the characters in <var>value</var> past the <var>index</var>th character are <span>ASCII digits</span>"; |
181 |
| - } else { |
182 |
| - die "unknown token case conditional: '$parserExpanderMode'"; |
183 |
| - } |
184 |
| - } |
185 |
| - $output .= "$parserExpanderState->{indent} <dt>$condition</dt>\n"; |
186 |
| - $output .= "$parserExpanderState->{indent} <dd>\n"; |
187 |
| - $parserExpanderState->{level} = 3; |
188 |
| - } elsif (m/^$parserExpanderState->{indent} otherwise:/s) { |
189 |
| - die if $parserExpanderState->{level} < 2; |
190 |
| - if ($parserExpanderState->{level} >= 3) { |
191 |
| - $output .= "$parserExpanderState->{indent} </dd>\n"; |
192 |
| - } |
193 |
| - $output .= "$parserExpanderState->{indent} <dt>Otherwise</dt>\n"; |
194 |
| - $output .= "$parserExpanderState->{indent} <dd>\n"; |
195 |
| - $parserExpanderState->{level} = 3; |
196 |
| - } elsif (m/^$parserExpanderState->{indent} (.+?) := (.+)/s) { |
197 |
| - my $var = $1; |
198 |
| - my $val = $2; |
199 |
| - die "unknown variable $var" unless $parserExpanderState->{variables}->{$var} or $parserExpanderState->{mode} eq $var; |
200 |
| - die if $parserExpanderState->{level} < 3; |
201 |
| - if ($parserExpanderState->{mode} eq $var) { |
202 |
| - $var = "<var data-x=\"$parserExpanderState->{prefix} $parserExpanderState->{mode}\">$var</var>"; |
203 |
| - $val = "\"<span data-x=\"$parserExpanderState->{prefix} $parserExpanderState->{mode}: $val\">$val</span>\""; |
204 |
| - } else { |
205 |
| - $var = "<var>$var</var>"; |
206 |
| - if ($parserExpanderState->{variables}->{$val}) { |
207 |
| - $val = "the value of <var>$val</var>"; |
208 |
| - } else { |
209 |
| - die unless $val eq 'false' or $val eq 'true'; |
210 |
| - } |
211 |
| - } |
212 |
| - $output .= "$parserExpanderState->{indent} <p>Set $var to $val.</p>\n"; |
213 |
| - } elsif ((m/^$parserExpanderState->{indent} (.+?) (.+)/s) and ($parserExpanderState->{actions}->{$1})) { |
214 |
| - my $action = $1; |
215 |
| - my $var = $2; |
216 |
| - die "unknown variable $var" unless $parserExpanderState->{variables}->{$var}; |
217 |
| - die if $parserExpanderState->{level} < 3; |
218 |
| - $var = "<var>$var</var>"; |
219 |
| - $output .= "$parserExpanderState->{indent} <p>Append $var to $parserExpanderState->{actions}->{$action}.</p>\n"; |
220 |
| - } elsif (m/^$parserExpanderState->{indent} (dec) (.+)/s) { |
221 |
| - my $action = $1; |
222 |
| - my $var = $2; |
223 |
| - die unless $parserExpanderState->{variables}->{$var}; |
224 |
| - die if $parserExpanderState->{level} < 3; |
225 |
| - $var = "<var>$var</var>"; |
226 |
| - $output .= "$parserExpanderState->{indent} <p>Decrement $var by one.</p>\n"; |
227 |
| - } elsif (m/^$parserExpanderState->{indent} nop/s) { |
228 |
| - die if $parserExpanderState->{level} < 3; |
229 |
| - $output .= "$parserExpanderState->{indent} <p>Do nothing.</p>\n"; |
230 |
| - } elsif ((m/^$parserExpanderState->{indent} (.+)/s) and ($parserExpanderState->{refs}->{$1})) { |
231 |
| - my $ref = $1; |
232 |
| - die if $parserExpanderState->{level} < 3; |
233 |
| - $output .= "$parserExpanderState->{indent} <p><span data-x=\"$parserExpanderState->{prefix} $ref\">\u$ref</span>.</p>\n"; |
234 |
| - } elsif (m/^$parserExpanderState->{indent}<\/pre>$/s) { |
235 |
| - if ($parserExpanderState->{level} >= 3) { |
236 |
| - $output .= "$parserExpanderState->{indent} </dd>\n"; |
237 |
| - } |
238 |
| - if ($parserExpanderState->{level} >= 2) { |
239 |
| - $output .= "$parserExpanderState->{indent} </dl>\n"; |
240 |
| - } |
241 |
| - if ($parserExpanderState->{level} >= 1) { |
242 |
| - $output .= "$parserExpanderState->{indent} </dd>\n"; |
243 |
| - } |
244 |
| - $output .= "$parserExpanderState->{indent}</dl>\n"; |
245 |
| - $parserExpanderMode = 'passthrough'; |
246 |
| - $parserExpanderState = undef; |
247 |
| - } elsif (m/^$parserExpanderState->{indent}( )*.+/s) { |
248 |
| - my $level = (length $1) / 2; |
249 |
| - die "syntax error in '$_' at level $level; you are actually at level $parserExpanderState->{level}"; |
250 |
| - } else { |
251 |
| - die "syntax error in '$_'"; |
252 |
| - } |
253 |
| - } else { |
254 |
| - die; |
255 |
| - } |
256 |
| - return $output; |
| 93 | + return "$_\n"; |
257 | 94 | }
|
0 commit comments