@node Texinfo@asis{::}Convert@asis{::}NodeNameNormalization
@chapter Texinfo::Convert::NodeNameNormalization

@node Texinfo@asis{::}Convert@asis{::}NodeNameNormalization NAME
@section Texinfo::Convert::NodeNameNormalization NAME

Texinfo::Convert::NodeNameNormalization - Normalize and transliterate Texinfo trees

@node Texinfo@asis{::}Convert@asis{::}NodeNameNormalization SYNOPSIS
@section Texinfo::Convert::NodeNameNormalization SYNOPSIS

@verbatim
  use Texinfo::Convert::NodeNameNormalization qw(convert_to_node_identifier
                                        normalize_transliterate_texinfo);

  my $normalized = convert_to_node_identifier($node_element->{'contents'}->[0]);

  my $file_name
    = normalize_transliterate_texinfo($section_element->{'contents'}->[0]);
@end verbatim

@node Texinfo@asis{::}Convert@asis{::}NodeNameNormalization NOTES
@section Texinfo::Convert::NodeNameNormalization 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.

@node Texinfo@asis{::}Convert@asis{::}NodeNameNormalization DESCRIPTION
@section Texinfo::Convert::NodeNameNormalization DESCRIPTION

@code{Texinfo::Convert::NodeNameNormalization} allows to normalize node names
with @code{convert_to_normalized} and @code{convert_to_node_identifier}.
@code{convert_to_node_identifier} follows the specification described in the Texinfo
manual @emph{HTML Xref} node.  This is useful whenever one want a unique identifier
for Texinfo content, which is only composed of letter, digits, @code{-} and @code{_},
for example for @code{@@node}, @code{@@float} and @code{@@anchor} names normalization.
@code{convert_to_identifier} leaves out the step of normalizing @code{Top}.
@code{convert_to_normalized} leaves out the step of protecting characters.

It is also possible to transliterate non-ASCII letters, instead of mangling
them, with @code{normalize_transliterate_texinfo}, losing the uniqueness feature of
normalized node names.

Another method, @code{transliterate_protect_file_name} transliterates non-ASCII
letters and protect characters that should not appear on file names.

@node Texinfo@asis{::}Convert@asis{::}NodeNameNormalization METHODS
@section Texinfo::Convert::NodeNameNormalization METHODS

@table @asis
@item $partially_normalized = convert_to_normalized($tree)
@anchor{Texinfo@asis{::}Convert@asis{::}NodeNameNormalization $partially_normalized = convert_to_normalized($tree)}
@cindex @code{convert_to_normalized}

The Texinfo @emph{$tree} is returned as a string, with @@-commands and spaces
normalized as described in the Texinfo manual @emph{HTML Xref} node.  ASCII
7-bit characters other than spaces and non-ASCII characters are left as
is in the resulting string.

@item $normalized = convert_to_node_identifier($tree)
@anchor{Texinfo@asis{::}Convert@asis{::}NodeNameNormalization $normalized = convert_to_node_identifier($tree)}

@item $normalized = convert_to_identifier($tree)
@anchor{Texinfo@asis{::}Convert@asis{::}NodeNameNormalization $normalized = convert_to_identifier($tree)}

@cindex @code{convert_to_identifier}
@cindex @code{convert_to_node_identifier}


With @code{convert_to_node_identifier}, the Texinfo @emph{$tree} is returned as a
string, normalized as described in the Texinfo manual @emph{HTML Xref} node.
@code{convert_to_identifier} leaves out the normalization of the name if it
is a @emph{Top} node name.

The result will be poor for Texinfo trees which are not @@-command arguments
(on an @@-command line or in braces), for instance if the tree contains
@code{@@node} or block commands.

@item $transliterated = normalize_transliterate_texinfo($tree)
@anchor{Texinfo@asis{::}Convert@asis{::}NodeNameNormalization $transliterated = normalize_transliterate_texinfo($tree)}
@cindex @code{normalize_transliterate_texinfo}

The Texinfo @emph{$tree} is returned as a string, with non-ASCII letters
transliterated as ASCII, but otherwise similar with @code{convert_to_identifier}
output.

@item $transliterated = transliterate_texinfo($tree)
@anchor{Texinfo@asis{::}Convert@asis{::}NodeNameNormalization $transliterated = transliterate_texinfo($tree)}
@cindex @code{transliterate_texinfo}

The Texinfo @emph{$tree} is returned as a string, with non-ASCII letters
transliterated as ASCII.

@item $file_name = transliterate_protect_file_name($string)
@anchor{Texinfo@asis{::}Convert@asis{::}NodeNameNormalization $file_name = transliterate_protect_file_name($string)}
@cindex @code{transliterate_protect_file_name}

The string @emph{$string} is returned with non-ASCII letters transliterated as
ASCII, and ASCII characters not safe in file names protected as in
node normalization.

@end table

@node Texinfo@asis{::}Convert@asis{::}NodeNameNormalization AUTHOR
@section Texinfo::Convert::NodeNameNormalization AUTHOR

Patrice Dumas, <bug-texinfo@@gnu.org>

@node Texinfo@asis{::}Convert@asis{::}NodeNameNormalization COPYRIGHT AND LICENSE
@section Texinfo::Convert::NodeNameNormalization COPYRIGHT AND LICENSE

Copyright 2010- 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.

