Subject: Re: [dssslist] Re: Problems with ? for page numbers in index From: Ian Zimmerman <nobrowser@xxxxxxxxx> Date: Tue, 14 Mar 2006 19:41:03 -0800 (PST) |
Jeremy> An index entry is only placed where there is an <indexterm> in Jeremy> my SGML document, so if I want the same word indexed whenever it Jeremy> occurs I still have to manually insert <indexterm>s at each Jeremy> occurence. Raghavendra> AFAIK that is true even with LaTeX indexing, cf., the Raghavendra> `makeindex' documentation. For highly structured documents such as software documentation, this can be at least partly automated. Here's a bit of Perl I use: #! /usr/bin/perl -w use SGMLS; our $VERSION = '$Id: specindex.pl,v 1.6 2003/04/03 21:16:12 itz Exp $'; our $parse = SGMLS->new(STDIN); our %index_elements = ( function => 'function', classname => 'class', structname => 'struct', type => 'type', varname => 'variable', constant => 'constant', command => 'program', ); our %section_elements = map {$_, 1} qw(preface chapter appendix glossary bibliography sect1 sect2 sect3 sect4 section simplesect glossdiv bibliodiv); our $content = ''; our %indexmap = ( ); sub find_target { my $element = $_[0]; PARENT: while(1) { my $parent = $element->parent; (ref $parent) eq 'SGMLS_Element' or return undef; my $name = $parent->name; $element = $parent, next PARENT unless $section_elements{lc $name} && ref $parent->attribute('ID') eq 'SGMLS_Attribute'; my $id = $parent->attribute('ID')->value; $element = $parent, next PARENT unless $id; return $id; } } EVENT: while (1) { my $event = $parse->next_event; (ref $event) eq SGMLS_Event or die "unexpected end of file, not conforming?\n"; for ($event->type) { /^conforming/ and last EVENT; /^start_element/ and do { my $element = $event->data; # class SGMLS_Element my $name = $element->name; $content = '' if $index_elements{lc $name}; next EVENT; }; /^end_element/ and do { my $element = $event->data; # class SGMLS_Element my $name = $element->name; if ($index_elements{lc $name}) { my $id = &find_target($element); defined $id or next EVENT; $indexmap{"$content ($index_elements{lc $name})"} ->{lc $id} = 1; } next EVENT; }; /^cdata/ and do { my $cdata = $event->data; # A string my $element = $event->element; my $name = $element->name; $content .= $cdata if $index_elements{lc $name}; next EVENT; }; } } our $idgen = 1; foreach my $entry (sort(keys %indexmap)) { print '<indexterm id="IDX-ID', $idgen++,'" zone="', join(' ',keys %{$indexmap{$entry}}); print '"><primary>', $entry, '</primary></indexterm>', "\n"; } -- A true pessimist won't be discouraged by a little success.
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [dssslist] Re: Problems with ? , N. Raghavendra | Thread | [dssslist] how to process title wit, JtoEE JtoME |
Re: [dssslist] how to produce page , Mulberry Technologie | Date | [dssslist] how to process title wit, JtoEE JtoME |
Month |