root/trunk/spec/verify_terms.pl

Revision 12, 2.3 KB (checked in by oren, 7 months ago)

Fix bug in naming of production link;
Enhance verifiers to catch this sort of problem.

  • Property svn:executable set to *
Line 
1#!/usr/bin/perl -w
2
3use strict;
4use XML::Parser;
5use YAML;
6
7my @parts_stack = ();
8my %def_terms = ();
9my %ref_terms = ();
10my %ref_def_terms = ();
11my %def_ref_terms = ();
12my %ok_def_ref_terms = (
13    '<term primary="\\ escaping in double-quoted style">'
14  . ' @ Characters / Escape Sequences' => 1
15);
16
17my $keep_next_title = 0;
18my $keep_next_text = 0;
19
20sub PI {
21}
22
23my $in_non_term = 0;
24
25sub StartTag {
26  my $tag = $_;
27  my $attr = \%_;
28
29  if ($tag =~ /<nonterminal def="#(.[^("]*)/) {
30    $in_non_term = $1;
31    $in_non_term =~ s/\+/\\+/g;
32    $in_non_term = 0 if $in_non_term eq 'c-reserved';
33  }
34
35  if ($tag =~ /^<sect|^<chapter|^<book>/) {
36    die if ($keep_next_title++);
37    return;
38  }
39
40  if ($tag =~ /^<title/ && $keep_next_title) {
41    $keep_next_title--;
42    die if ($keep_next_text++);
43    return;
44  }
45
46
47  if ($tag =~ /^<defterm/) {
48    $tag =~ s/(?:\s|\n)+/ /g;
49    $tag =~ s/defterm/term/g;
50    my $path = join(' / ', @parts_stack);
51    $def_terms{$tag} = $path;
52    warn "REF-DEF $tag in $path\n" if (defined($ref_terms{$tag}->{$path})
53                                    && !$ref_def_terms{$tag}++);
54    return;
55  }
56
57  if ($tag =~ /^<refterm/) {
58    $tag =~ s/(?:\s|\n)+/ /g;
59    $tag =~ s/refterm/term/g;
60    my $path = join(' / ', @parts_stack);
61    $ref_terms{$tag} = {} unless defined($ref_terms{$tag});
62    $ref_terms{$tag}->{$path} = 1;
63    warn "DEF-REF $tag in $path\n" if (defined($def_terms{$tag})
64                                   && $def_terms{$tag} eq $path
65                                   && !$ok_def_ref_terms{"$tag @ $path"}
66                                   && !$def_ref_terms{$tag}++);
67    return;
68  }
69}
70
71sub Text {
72  my $text = $_;
73  warn("PRD-REF $text => $in_non_term") if $in_non_term and $text !~ /^.$|^${in_non_term}/;
74  if ($keep_next_text) {
75    $text =~ s/(?:\s|\n)+/ /g;
76    push(@parts_stack, $text);
77    $keep_next_text--;
78  }
79}
80
81sub EndTag {
82  my $tag = $_;
83  my $attr = \%_;
84  $in_non_term = 0 if ($tag =~ /nonterminal/);
85
86  pop(@parts_stack) if ($tag =~ /sect|chapter|book/);
87}
88
89my $parser = new XML::Parser(Style => 'Stream');
90$parser->parsefile('spec.dbk');
91die "THERE WERE REF-DEF TERMS - HTML index will not highlight main entry!\n"
92    if (keys(%ref_def_terms));
93die "THERE WERE DEF-REF TERMS - referals to same-section main entry.\n"
94    if (keys(%def_ref_terms));
951;
Note: See TracBrowser for help on using the browser.