All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
	qemu-devel@nongnu.org, Kashyap Chamarthy <kchamart@redhat.com>
Subject: Re: [PATCH v3 25/33] scripts/hxtool-conv: Archive script used in qemu-options.hx conversion
Date: Mon, 02 Mar 2020 12:19:53 +0000	[thread overview]
Message-ID: <87h7z79ceu.fsf@linaro.org> (raw)
In-Reply-To: <20200228153619.9906-26-peter.maydell@linaro.org>


Peter Maydell <peter.maydell@linaro.org> writes:

> This commit archives the perl script used to do conversion of the
> STEXI/ETEXI blocks in qemu-options.hx. (The other .hx files were
> manually converted, but qemu-options.hx is complicated enough that
> I felt I needed some scripting.)
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>

> ---
> Please don't critique the script, it is purely for a one-off
> conversion job, and I then did manual fixups on the output
> to get the changes in the following patch. I merely felt it
> was potentially useful to archive a copy of the mechanism used.
> Or we could drop this patch if that's not needed.
> ---
>  scripts/hxtool-conv.pl | 137 +++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 137 insertions(+)
>  create mode 100755 scripts/hxtool-conv.pl
>
> diff --git a/scripts/hxtool-conv.pl b/scripts/hxtool-conv.pl
> new file mode 100755
> index 00000000000..eede40b3462
> --- /dev/null
> +++ b/scripts/hxtool-conv.pl
> @@ -0,0 +1,137 @@
> +#!/usr/bin/perl -w
> +#
> +# Script to convert .hx file STEXI/ETEXI blocks to SRST/ERST
> +#
> +# Copyright (C) 2020 Linaro
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2 or
> +# (at your option) any later version. See the COPYING file in the
> +# top-level directory.
> +
> +# This script was only ever intended as a one-off conversion operation.
> +# Please excuse the places where it is a bit hacky.
> +# Some manual intervention after the conversion is expected, as are
> +# some warnings from makeinfo.
> +# Warning: this script is not idempotent: don't try to run it on
> +# a .hx file that already has SRST/ERST sections.
> +
> +# Expected usage:
> +# scripts/hxtool-conv.pl file.hx > file.hx.new
> +
> +use utf8;
> +
> +my $reading_texi = 0;
> +my $texiblock = '';
> +my @tables = ();
> +
> +sub update_tables($) {
> +    my ($texi) = @_;
> +    # Update our list of open table directives: every @table
> +    # line in the texi fragment is added to the list, and every
> +    # @end table line means we remove an entry from the list.
> +    # If this fragment had a completely self contained table with
> +    # both the @table and @end table lines, this will be a no-op.
> +    foreach (split(/\n/, $texi)) {
> +        push @tables, $_ if /^\@table/;
> +        pop @tables if /^\@end table/;
> +    }
> +}
> +
> +sub only_table_directives($) {
> +    # Return true if every line in the fragment is a start or end table directive
> +    my ($texi) = @_;
> +    foreach (split(/\n/, $texi)) {
> +        return 0 unless /^\@table/ or /^\@end table/;
> +    }
> +    return 1;
> +}
> +
> +sub output_rstblock($) {
> +    # Write the output to /tmp/frag.texi, wrapped in whatever current @table
> +    # lines we need.
> +    my ($texi) = @_;
> +
> +    # As a special case, if this fragment is only table directives and
> +    # nothing else, update our set of open table directives but otherwise
> +    # ignore it. This avoids emitting an empty SRST/ERST block.
> +    if (only_table_directives($texi)) {
> +        update_tables($texi);
> +        return;
> +    }
> +
> +    open(my $fragfh, '>', '/tmp/frag.texi');
> +    # First output the currently active set of open table directives
> +    print $fragfh join("\n", @tables);
> +    # Next, update our list of open table directives.
> +    # We need to do this before we emit the closing table directives
> +    # so that we emit the right number if this fragment had an
> +    # unbalanced set of directives.
> +    update_tables($texi);
> +    # Then emit the texi fragment itself.
> +    print $fragfh "\n$texi\n";
> +    # Finally, add the necessary closing table directives.
> +    print $fragfh "\@end table\n" x scalar @tables;
> +    close $fragfh;
> +
> +    # Now invoke makeinfo/pandoc on it and slurp the results into a string
> +    open(my $fh, '-|', "makeinfo --force -o - --docbook "
> +         . "-D 'qemu_system_x86 QEMU_SYSTEM_X86_MACRO' "
> +         . "-D 'qemu_system     QEMU_SYSTEM_MACRO'  /tmp/frag.texi "
> +         . " | pandoc  -f docbook -t rst")
> +        or die "can't start makeinfo/pandoc: $!";
> +
> +    binmode $fh, ':encoding(utf8)';
> +
> +    print "SRST\n";
> +
> +    # Slurp the whole thing into a string so we can do multiline
> +    # string matches on it.
> +    my $rst = do {
> +        local $/ = undef;
> +        <$fh>;
> +    };
> +    $rst =~ s/^-  − /-  /gm;
> +    $rst =~ s/“/"/gm;
> +    $rst =~ s/”/"/gm;
> +    $rst =~ s/‘/'/gm;
> +    $rst =~ s/’/'/gm;
> +    $rst =~ s/QEMU_SYSTEM_MACRO/|qemu_system|/g;
> +    $rst =~ s/QEMU_SYSTEM_X86_MACRO/|qemu_system_x86|/g;
> +    $rst =~ s/(?=::\n\n +\|qemu)/.. parsed-literal/g;
> +    $rst =~ s/:\n\n::$/::/gm;
> +
> +    # Fix up the invalid reference format makeinfo/pandoc emit:
> +    # `Some string here <#anchorname>`__
> +    # should be:
> +    # :ref:`anchorname`
> +    $rst =~ s/\`[^<`]+\<\#([^>]+)\>\`__/:ref:`$1`/gm;
> +    print $rst;
> +
> +    close $fh or die "error on close: $!";
> +    print "ERST\n";
> +}
> +
> +# Read the whole .hx input file.
> +while (<>) {
> +    # Always print the current line
> +    print;
> +    if (/STEXI/) {
> +        $reading_texi = 1;
> +        $texiblock = '';
> +        next;
> +    }
> +    if (/ETEXI/) {
> +        $reading_texi = 0;
> +        # dump RST version of block
> +        output_rstblock($texiblock);
> +        next;
> +    }
> +    if ($reading_texi) {
> +        # Accumulate the texi into a string
> +        # but drop findex entries as they will confuse makeinfo
> +        next if /^\@findex/;
> +        $texiblock .= $_;
> +    }
> +}
> +
> +die "Unexpectedly still in texi block at EOF" if $reading_texi;


-- 
Alex Bennée


  reply	other threads:[~2020-03-02 12:21 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-28 15:35 [PATCH v3 00/33] Convert qemu-doc to rST Peter Maydell
2020-02-28 15:35 ` [PATCH v3 01/33] qemu-doc: convert user-mode emulation to a separate Sphinx manual Peter Maydell
2020-03-02 11:05   ` Alex Bennée
2020-02-28 15:35 ` [PATCH v3 02/33] qemu-doc: remove target OS documentation Peter Maydell
2020-03-02 11:05   ` Alex Bennée
2020-02-28 15:35 ` [PATCH v3 03/33] texi2pod: parse @include directives outside "@c man" blocks Peter Maydell
2020-03-02 11:07   ` Alex Bennée
2020-02-28 15:35 ` [PATCH v3 04/33] qemu-doc: split CPU models doc between MIPS and x86 parts Peter Maydell
2020-03-02 11:18   ` Alex Bennée
2020-02-28 15:35 ` [PATCH v3 05/33] qemu-doc: split qemu-doc.texi in multiple files Peter Maydell
2020-03-02 11:22   ` Alex Bennée
2020-03-02 12:16     ` Peter Maydell
2020-03-02 14:18       ` Alex Bennée
2020-02-28 15:35 ` [PATCH v3 06/33] qemu-doc: extract common system emulator documentation from the PC section Peter Maydell
2020-03-02 11:25   ` Alex Bennée
2020-02-28 15:35 ` [PATCH v3 07/33] qemu-doc: move system requirements chapter inside " Peter Maydell
2020-02-28 15:35 ` [PATCH v3 08/33] qemu-doc: split target sections to separate files Peter Maydell
2020-03-02 11:28   ` Alex Bennée
2020-02-28 15:35 ` [PATCH v3 09/33] qemu-doc: Remove the "CPU emulation" part of the "Implementation notes" Peter Maydell
2020-03-02 11:30   ` Alex Bennée
2020-02-28 15:35 ` [PATCH v3 10/33] qemu-doc: move qemu-tech.texi into main section Peter Maydell
2020-03-02 11:31   ` Alex Bennée
2020-02-28 15:35 ` [PATCH v3 11/33] qemu-doc: move included files to docs/system Peter Maydell
2020-03-02 11:31   ` Alex Bennée
2020-02-28 15:35 ` [PATCH v3 12/33] qemu-doc: remove indices other than findex Peter Maydell
2020-03-02 11:32   ` Alex Bennée
2020-02-28 15:35 ` [PATCH v3 13/33] docs/system: put qemu-block-drivers body in an included file Peter Maydell
2020-03-02 11:32   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 14/33] docs: Create defs.rst.inc as a place to define substitutions Peter Maydell
2020-03-02 12:40   ` Kashyap Chamarthy
2020-02-28 15:36 ` [PATCH v3 15/33] docs/system: Convert qemu-cpu-models.texi to rST Peter Maydell
2020-03-02 12:08   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 16/33] docs/system: Convert security.texi to rST format Peter Maydell
2020-03-02 12:10   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 17/33] docs/system: convert managed startup to rST Peter Maydell
2020-03-02 12:10   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 18/33] docs/system: convert the documentation of deprecated features " Peter Maydell
2020-03-02 12:12   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 19/33] docs/system: convert Texinfo documentation " Peter Maydell
2020-03-02 12:13   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 20/33] hmp-commands.hx: Add rST documentation fragments Peter Maydell
2020-03-02 12:16   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 21/33] hmp-commands-info.hx: " Peter Maydell
2020-03-02 12:16   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 22/33] doc/scripts/hxtool.py: Strip trailing ':' from DEFHEADING/ARCHHEADING Peter Maydell
2020-03-02 12:17   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 23/33] docs: Roll semihosting option information into qemu-options.hx Peter Maydell
2020-03-02 12:18   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 24/33] docs: Roll -prom-env and -g target-specific info " Peter Maydell
2020-03-02 12:19   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 25/33] scripts/hxtool-conv: Archive script used in qemu-options.hx conversion Peter Maydell
2020-03-02 12:19   ` Alex Bennée [this message]
2020-02-28 15:36 ` [PATCH v3 26/33] qemu-options.hx: Add rST documentation fragments Peter Maydell
2020-03-02 12:20   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 27/33] qemu-options.hx: Fix up the autogenerated rST Peter Maydell
2020-03-02 12:23   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 28/33] docs: Split out sections for the manpage into .rst.inc files Peter Maydell
2020-03-02 12:24   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 29/33] docs: Generate qemu.1 manpage with Sphinx Peter Maydell
2020-03-02 12:24   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 30/33] ui/cocoa.m: Update documentation file and pathname Peter Maydell
2020-03-02 12:28   ` Alex Bennée
2020-02-28 15:36 ` [PATCH v3 31/33] docs: Stop building qemu-doc Peter Maydell
2020-03-02 12:32   ` Alex Bennée
2020-03-11 14:53   ` Markus Armbruster
2020-03-11 15:15     ` Peter Maydell
2020-03-12  6:06       ` Markus Armbruster
2020-03-12 10:11         ` Peter Maydell
2020-03-12 13:16           ` Markus Armbruster
2020-02-28 15:36 ` [PATCH v3 32/33] docs: Remove old texinfo sources Peter Maydell
2020-03-02 12:34   ` Alex Bennée
2020-03-02 12:42   ` Kashyap Chamarthy
2020-02-28 15:36 ` [PATCH v3 33/33] *.hx: Remove all the STEXI/ETEXI blocks Peter Maydell
2020-03-02 12:36   ` Alex Bennée
2020-02-28 18:36 ` [PATCH v3 00/33] Convert qemu-doc to rST Peter Maydell
2020-02-28 21:20   ` Stefan Weil
2020-02-29 11:50     ` Peter Maydell
2020-03-02 12:41 ` Alex Bennée
2020-03-03 17:35 ` Peter Maydell
2020-03-03 17:44   ` Paolo Bonzini
2020-03-03 18:19   ` Alex Bennée
2020-03-04  9:12   ` Kashyap Chamarthy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87h7z79ceu.fsf@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=kchamart@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.