1: #!/usr/bin/perl -w
2: package SGML::ElementMap::Example::Identity;
3: use strict;
5: use vars qw($trace $is_sgml);
6: $trace = 0;
7: $is_sgml = 0;
10: sub Initialize {
11: my ($engine,$outfile) = @_;
13: InstallHandlers($engine);
14: #$engine->mode_set('DEFAULT');
15: $engine->stack->default_cascade;
17: if ($trace) {
18: select STDERR; $| = 1;
19: select STDOUT; $| = 1;
20: #Hash::Layered->trace;
21: #$engine->debug('general','element_path','handler_lookup','modes');
22: # 'stack'
23: #$engine->debug('visitors');
24: }
25: }
28: sub InstallHandlers {
29: my ($sgml) = @_;
30: $sgml->cdata ('',\&Identity_CData);
31: $sgml->sdata ('',\&Identity_Entity);
32: $sgml->entity ('',\&Identity_Entity);
33: $sgml->pi ('',\&Identity_PI);
34: $sgml->comment('',\&Identity_Comment);
35: $sgml->element('',\&Identity_Element);
36: }
38: sub Identity_CData {
39: my ($sgml,$data) = @_;
40: $data = $data->{'Data'};
41: #my @tmp = split '&',$data; #cant do this until can detect cdata sections
42: #$data = join '&',@tmp;
43: #$data =~ s/\</\</g;
44: print $data;
45: }
47: sub Identity_Entity {
48: my ($sgml,$data) = @_;
49: warn "[".join('][',%$data)."]\n" if $trace;
50: print "&".$data->{'Name'}.";";
51: }
53: sub Identity_Comment {
54: my ($sgml,$comment) = @_;
55: print "<!--".$comment->{'Data'}."-->";
56: }
58: sub Identity_PI {
59: my ($sgml,$data) = @_;
60: if ($is_sgml) {
61: print "<?".$data->{'Data'}.">";
62: } else {
63: #exists $data->{'Target'}
64: print "<?".$data->{'Target'}." ".$data->{'Data'}."?>";
65: }
66: }
68: sub Identity_Element {
69: my ($sgml,$element) = @_;
70: my ($atts,$att,$attname,$val,@order,$lastattr);
72: print "<" . $element->{'Name'};
74: $atts = $element->{'Attributes'};
75: $lastattr = '';
76: if (defined $element->{'AttributeOrder'}) {
77: @order = @{$element->{'AttributeOrder'}};
78: if ($element->{'Defaulted'} < @order) {
79: $lastattr = $order[$element->{'Defaulted'}];
80: }
81: if (@order > 0) {
82: warn "$element->{Name}:$element->{Defaulted}:".join(':',@order)."\n" if $trace;
83: }
84: } else {
85: @order = sort keys %$atts;
86: }
88: foreach $attname (@order) {
89: last if $attname eq $lastattr;
90: #need to test for specified attributes, attrs with entities, etc
91: $att = $$atts{$attname};
92: if (!defined $att) {
93: warn "value undefined for attribute $attname\n";
94: } elsif (ref $att) {
95: print " ".$attname.'="';
96: foreach my $seg (@$att) {
97: if (ref $seg) {
98: print '&' . $seg->name . ';';
99: } else {
100: print $seg;
101: }
102: }
103: print '"';
104: } else {
105: print " ".$attname.'="'.$att.'"';
106: }
107: }
109: print "\n>";
111: $sgml->process_content;
113: #need to test for empty element
114: print "</".$element->{'Name'}."\n>";
115: }
117: 1;