#!/usr/bin/perl # $Id: filter2docs.pl,v 1.8 2013/03/02 14:38:38 fabiankeil Exp $ # $Source: /cvsroot/ijbswa/current/utils/filter2docs.pl,v $ # Parse the filter names and descriptions from a filter file and # spit out copy&paste-ready markup for the various places in # configuration and documentation where all filters are listed. use strict; use warnings; my (%comment_lines, %action_lines, %sgml_source_1, %sgml_source_2); sub main() { die "Usage: $0 filter-file\n" unless (@ARGV == 1) ; open(INPUT, "< $ARGV[0]") or die "Couldn't open input file $ARGV[0]: $!\n"; parse_file(); print_markup(); } sub sgml_escape($) { my $text = shift; $text =~ s@<@<@g; $text =~ s@>@>@g; return $text; } sub parse_file() { while () { if (/^((?:(?:SERVER|CLIENT)-HEADER-)?(?:FILTER|TAGGER)): ([-\w]+) (.*)$/) { my $type_uc = $1; my $name = $2; my $description = $3; my $type = lc($type_uc); my $sgml_description = sgml_escape($description); my $white_space = ' ' x (($type eq 'filter' ? 20 : 27) - length($name)); $comment_lines{$type} .= "# $name:" . $white_space . "$description\n"; $action_lines{$type} .= "+$type" . "{$name} \\\n"; $sgml_source_1{$type} .= " \n \n" . " +$type" . "{$name}" . $white_space . "# $sgml_description\n \n"; $sgml_source_2{$type} .= ' -$type" . "{$name} \\\n"; } } } sub print_markup() { my @filter_types = ( 'filter', 'server-header-filter', 'client-header-filter', 'server-header-tagger', 'client-header-tagger' ); foreach my $type (@filter_types) { next unless defined $action_lines{$type}; print "=" x 90; print <<" DOCMARKUP"; Producing $type markup: Comment lines for default.action.master: $comment_lines{$type} Block of $type actions for default.action.master: $action_lines{$type} SGML Source for AF chapter in U-M: $sgml_source_1{$type} SGML Source for AF Tutorial chapter in U-M: $sgml_source_2{$type} DOCMARKUP } } main();