|
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