| @node Texinfo@asis{::}Reader |
| @chapter Texinfo::Reader |
| |
| @node Texinfo@asis{::}Reader NAME |
| @section Texinfo::Reader NAME |
| |
| Texinfo::Reader - Texinfo tree reader |
| |
| @node Texinfo@asis{::}Reader SYNOPSIS |
| @section Texinfo::Reader SYNOPSIS |
| |
| @verbatim |
| use Texinfo::Parser; |
| use Texinfo::Reader; |
| |
| my $parser = Texinfo::Parser::parser(); |
| my $document = $parser->parse_texi_file("somefile.texi"); |
| |
| my $start_element = $document->tree(); |
| |
| my $reader = Texinfo::Reader::new($start_element); |
| |
| while (1) { |
| my $next = $reader->read(); |
| last if (!defined($next)); |
| |
| my $category = $next->{'category'}; |
| |
| my $element = $next->{'element'}; |
| |
| if ($category == Texinfo::Reader->TXI_READ_TEXT) { |
| my $text = $element->{'text'}; |
| .... |
| } elsif ($category == Texinfo::Reader->TXI_READ_ELEMENT_START) { |
| my $cmdname = $element->{'cmdname'}; |
| ... |
| .... |
| } |
| } |
| @end verbatim |
| |
| @node Texinfo@asis{::}Reader NOTES |
| @section Texinfo::Reader NOTES |
| |
| The Texinfo Perl module main purpose is to be used in @code{texi2any} to convert |
| Texinfo to other formats. There is no promise of API stability. |
| |
| Note that this module is not used in @code{texi2any}. |
| |
| Note that this module could be removed at any time. |
| |
| @node Texinfo@asis{::}Reader DESCRIPTION |
| @section Texinfo::Reader DESCRIPTION |
| |
| @code{Texinfo::Reader} offers an interface to a Texinfo tree obtained from |
| parsing Texinfo code. This interface is based on a stream of tokens associated |
| to tree elements. This interface is conceptually similar to the interface of |
| @url{https://metacpan.org/pod/XML::LibXML::Reader, XML::LibXML::Reader} or @url{https://metacpan.org/pod/Pod::Simple::PullParser, Pod::Simple::PullParser}. |
| |
| The Reader acts as a cursor going forward on the Texinfo tree and stopping |
| at each element on the way, providing with a new token. The user's code keeps |
| control of the progress and simply calls the @code{read()} function repeatedly to |
| progress to the next token in the Texinfo document order. The other |
| function provides means for skipping sub-trees. |
| |
| @node Texinfo@asis{::}Reader METHODS |
| @section Texinfo::Reader METHODS |
| |
| @table @asis |
| @item $reader = Texinfo::Reader::new ($element) |
| @anchor{Texinfo@asis{::}Reader $reader = Texinfo@asis{::}Reader@asis{::}new ($element)} |
| @cindex @code{Texinfo::Reader::new} |
| |
| Initialize a reader starting at the @emph{$element} Texinfo tree element. |
| |
| @item $token = $reader->read() |
| @anchor{Texinfo@asis{::}Reader $token = $reader->read()} |
| @cindex @code{read} |
| |
| Returns the next token or undef at the end of the tree. |
| |
| A token is an hash reference with string keys: |
| |
| @table @asis |
| @item element |
| @anchor{Texinfo@asis{::}Reader element} |
| |
| The current tree element. |
| |
| @item category |
| @anchor{Texinfo@asis{::}Reader category} |
| |
| Information on the tree element and on the position read. The possible token |
| category values are declared as constants and are accessed through |
| the @code{Texinfo::Reader} package, like |
| @code{Texinfo::Reader->TXI_READ_ELEMENT_START}. |
| |
| The token category can take the following @code{Texinfo::Reader} constant values: |
| |
| @table @asis |
| @item TXI_READ_ELEMENT_START |
| @anchor{Texinfo@asis{::}Reader TXI_READ_ELEMENT_START} |
| |
| Start of the tree element, before getting the element contents. |
| |
| @item TXI_READ_ELEMENT_END |
| @anchor{Texinfo@asis{::}Reader TXI_READ_ELEMENT_END} |
| |
| End of the tree element after having read the contents (after a closing |
| brace, an @@end, at the end of a container). |
| |
| @item TXI_READ_TEXT |
| @anchor{Texinfo@asis{::}Reader TXI_READ_TEXT} |
| |
| Text element. |
| |
| @item TXI_READ_IGNORABLE_TEXT |
| @anchor{Texinfo@asis{::}Reader TXI_READ_IGNORABLE_TEXT} |
| |
| Text element supposed to be ignored, such as spaces appearing after |
| an opening brace or around a comma delimiting arguments. |
| |
| @item TXI_READ_EMPTY |
| @anchor{Texinfo@asis{::}Reader TXI_READ_EMPTY} |
| |
| A tree element which is not a text tree element and does not hold content. For |
| Texinfo @@-commands without braces nor line argument such as @code{@@@@} and for empty |
| arguments. For example the @code{brace_container} argument container of @code{@@TeX@{@}} |
| is empty. Also for invalid constructs such as brace @@-commands without braces. |
| |
| @end table |
| |
| @end table |
| |
| The Texinfo tree element is described in @ref{Texinfo@asis{::}Parser TEXINFO TREE}. |
| |
| @item $token = $reader->skip_children($element) |
| @anchor{Texinfo@asis{::}Reader $token = $reader->skip_children($element)} |
| @cindex @code{skip_children} |
| |
| Skip the remaining of the contents currently being processed. |
| Return a token with the @emph{TXI_READ_ELEMENT_END} category, or undef at the end |
| of the tree. |
| |
| If the @emph{$element} optional argument is specified, a fatal error is emitted if |
| it does not match with the parent element of the skipped contents. |
| |
| @item $elements = reader_collect_commands_list($element, $command_names) |
| @anchor{Texinfo@asis{::}Reader $elements = reader_collect_commands_list($element@comma{} $command_names)} |
| |
| Collect all the tree elements corresponding to @@-command names in the |
| @emph{$command_names} array reference, starting at @emph{$element}. The |
| return value is an array reference of the collected elements, in the order of |
| their appearence in the Texinfo tree. |
| |
| @end table |
| |
| @node Texinfo@asis{::}Reader @code{Texinfo@asis{::}Reader} and XS extensions |
| @subsection @code{Texinfo::Reader} and XS extensions |
| |
| The Texinfo Perl modules can be setup to use Perl XS module extensions |
| in native code (written in C) that replace Perl package or methods |
| by native code for faster execution. In general, using pure Perl or XS |
| extensions is transparent. This is not fully the case for @code{Texinfo::Reader}. |
| The XS interface is designed such that the Texinfo tree actually processed is |
| not the Perl elements tree, but a tree stored in native code in XS |
| extensions, corresponding to compiled C data structures. |
| |
| If the @code{Texinfo::Reader} XS extension is used, the element used to |
| initialize the reader through |
| @ref{Texinfo@asis{::}Reader $reader = Texinfo@asis{::}Reader@asis{::}new ($element),, new} |
| need to have a link from Perl to native code C data registered in the |
| Perl element to find the C tree data corresponding to the Perl element. |
| This is done automatically if the element is the Texinfo tree root element. |
| For other elements, this link may need to be setup especially. |
| |
| To setup this link explicitly for the element associated to the |
| current Reader token or the child elements of the current Reader token |
| the following methods may be called: |
| |
| @table @asis |
| @item $reader->register_token_element() |
| @anchor{Texinfo@asis{::}Reader $reader->register_token_element()} |
| |
| Add a link from the current token Perl element to the associated C |
| data. |
| |
| @item $reader->register_token_element_child($index) |
| @anchor{Texinfo@asis{::}Reader $reader->register_token_element_child($index)} |
| |
| Add a link from the Perl element to the associated C data for the child of the |
| current token Perl element at index @emph{$index}. If the first child of the |
| current token Perl element is of type @code{arguments_line}, the child |
| of the @code{arguments_line} tree element is selected instead of the child |
| of the current token Perl element. |
| |
| @end table |
| |
| For example, to register all the elements upon reading them: |
| |
| @verbatim |
| while (1) { |
| |
| my $next = $reader->read(); |
| last if (!defined($next)); |
| |
| my $element = $next->{'element'}; |
| |
| my $registerd_element = $reader->register_token_element(); |
| |
| if (!defined($element)) { |
| $element = $registerd_element; |
| } |
| |
| ... |
| } |
| @end verbatim |
| |
| Calling these two functions is not the only possibility to create |
| a link from Perl to C data. Another possibility is to use the |
| @ref{Texinfo@asis{::}TreeElement NAME,, Texinfo::TreeElement} interface to access other elements from elements with |
| the link to C data already setup, or to use the |
| @ref{Texinfo@asis{::}Example@asis{::}TreeElementConverter NAME,, Texinfo::Example::TreeElementConverter} module methods. |
| |
| @node Texinfo@asis{::}Reader SEE ALSO |
| @section Texinfo::Reader SEE ALSO |
| |
| @ref{Texinfo@asis{::}Parser NAME,, Texinfo::Parser}. @ref{Texinfo@asis{::}Document NAME,, Texinfo::Document}. |
| @ref{Texinfo@asis{::}Example@asis{::}TreeElementConverter NAME,, Texinfo::Example::TreeElementConverter}. |
| |
| @node Texinfo@asis{::}Reader AUTHOR |
| @section Texinfo::Reader AUTHOR |
| |
| Patrice Dumas. |
| |
| @node Texinfo@asis{::}Reader COPYRIGHT AND LICENSE |
| @section Texinfo::Reader COPYRIGHT AND LICENSE |
| |
| Copyright 2025- Free Software Foundation, Inc. See the source file for |
| all copyright years. |
| |
| This library is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3 of the License, or (at |
| your option) any later version. |
| |