scripts: get_abi.pl: parse description line per line
authorMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Thu, 25 Mar 2021 10:38:26 +0000 (11:38 +0100)
committerJonathan Corbet <corbet@lwn.net>
Wed, 31 Mar 2021 19:53:16 +0000 (13:53 -0600)
Change the description parsing logic in rst mode in order
to parse it line per line.

The end result is the same, but doing line per line allows
to add some code to escape literal blocks when seeking for
cross-references.

Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Link: https://lore.kernel.org/r/d33cfa2e59ecf8f28d4ed7de7402468cf2168921.1616668017.git.mchehab+huawei@kernel.org
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
scripts/get_abi.pl

index eb1a231..e5d1da4 100755 (executable)
@@ -381,34 +381,41 @@ sub output_rest {
 
                                # Enrich text by creating cross-references
 
-                               $desc =~ s,Documentation/(?!devicetree)(\S+)\.rst,:doc:`/$1`,g;
-
-                               my @matches = $desc =~ m,Documentation/ABI/([\w\/\-]+),g;
-                               foreach my $f (@matches) {
-                                       my $xref = $f;
-                                       my $path = $f;
-                                       $path =~ s,.*/(.*/.*),$1,;;
-                                       $path =~ s,[/\-],_,g;;
-                                       $xref .= " <abi_file_" . $path . ">";
-                                       $desc =~ s,\bDocumentation/ABI/$f\b,:ref:`$xref`,g;
-                               }
+                               my $new_desc = "";
+                               open(my $fh, "+<", \$desc);
+                               while (my $d = <$fh>) {
+                                       $d =~ s,Documentation/(?!devicetree)(\S+)\.rst,:doc:`/$1`,g;
+
+                                       my @matches = $d =~ m,Documentation/ABI/([\w\/\-]+),g;
+                                       foreach my $f (@matches) {
+                                               my $xref = $f;
+                                               my $path = $f;
+                                               $path =~ s,.*/(.*/.*),$1,;;
+                                               $path =~ s,[/\-],_,g;;
+                                               $xref .= " <abi_file_" . $path . ">";
+                                               $d =~ s,\bDocumentation/ABI/$f\b,:ref:`$xref`,g;
+                                       }
 
-                               # Seek for cross reference symbols like /sys/...
-                               @matches = $desc =~ m/$xref_match/g;
+                                       # Seek for cross reference symbols like /sys/...
+                                       @matches = $d =~ m/$xref_match/g;
 
-                               foreach my $s (@matches) {
-                                       next if (!($s =~ m,/,));
-                                       if (defined($data{$s}) && defined($data{$s}->{label})) {
-                                               my $xref = $s;
+                                       foreach my $s (@matches) {
+                                               next if (!($s =~ m,/,));
+                                               if (defined($data{$s}) && defined($data{$s}->{label})) {
+                                                       my $xref = $s;
 
-                                               $xref =~ s/$symbols/\\$1/g;
-                                               $xref = ":ref:`$xref <" . $data{$s}->{label} . ">`";
+                                                       $xref =~ s/$symbols/\\$1/g;
+                                                       $xref = ":ref:`$xref <" . $data{$s}->{label} . ">`";
 
-                                               $desc =~ s,$start$s$bondary,$1$xref$2,g;
+                                                       $d =~ s,$start$s$bondary,$1$xref$2,g;
+                                               }
                                        }
+                                       $new_desc .= $d;
                                }
+                               close $fh;
+
 
-                               print "$desc\n\n";
+                               print "$new_desc\n\n";
                        } else {
                                $desc =~ s/^\s+//;