#!/usr/local/bin/perl -w # Module package OOXML; use strict; sub new { my ( $class, $root, %params ) = @_; my $self={}; $self->{name} = $root; $self->{nodes} = (); $self->{tags} = (); $self->{params} = {}; if ( defined %params ) { for my $param ( keys %params ) { $self->{params}{$param} = $params{$param}; } } $self->{params}{type} = "main" if ( ! exists $self->{params}{type} ); return bless $self, $class; } sub node { my ( $self, $node, %params ) = @_; push @{$self->{nodes}}, $self->new($node,type =>"node",%params); return bless $self->{nodes}[-1]; } sub tag { my ( $self, $tag, %params ) = @_; push @{$self->{tags}}, $self->new($tag,type=>"tag",%params); return bless $self->{tags}[-1]; } sub text { my ( $self, %params ) = @_; push @{$self->{nodes}}, $self->new("textnode",type=>"text",%params); return bless $self->{nodes}[-1]; } sub write { my ( $self, $levelup, $level,$doc,$class ) = @_; my $node; $level = 0 if ( ! defined $level ) || $level eq ""; $levelup = 4 if ( ! defined $levelup ) || $levelup eq ""; if ( defined $doc ) { open STDOUT, ">>$doc" || return (1,"Couldn't open output file: $!"); } print "\n" if ( $self->{params}{type} ne "text" && defined $class && $class->{params}{type} eq "text" ) ; print " " x $level if ($self->{params}{type} !~ /^text$/); print " " x $level if ($self->{params}{type} eq "text" && $class->{name} ne "textnode"); if ( $self->{params}{type} eq "text" ) { if ( exists $self->{params}{nodename} ) { print "<$self->{params}{nodename}"; for my $param ( keys %{$self->{params}} ) { next if ( $param eq "type" || $param eq "nodename" || $param eq "text" ); print " $param=\"$self->{params}{$param}\""; } print ">"; } print "$self->{params}{text}" if ( exists $self->{params}{text} ); }else { print "<$self->{name}"; for my $param ( keys %{$self->{params}} ) { next if $param eq "type"; print " $param=\"$self->{params}{$param}\""; } print ">\n"; } my $test = 0; my $lastnode; for $node ( @{$self->{nodes}} ) { bless $node; print "\n" if $node->{name} ne "textnode" and ($test == 12); $test = $node->write($levelup, $level+$levelup, $doc, $self); $lastnode = bless $node; } for my $tag ( @{$self->{tags}} ) { bless $tag; if ( defined $lastnode && $lastnode->{name} eq "textnode" ) { print "\n"; undef $lastnode; } print " " x ( $level + $levelup) . "<$tag->{name}"; for my $param ( keys %{$tag->{params}} ) { next if $param eq "type"; print " $param=\"$tag->{params}{$param}\""; } print ">\n"; } if ( $self->{params}{type} eq "text") { if ( exists $self->{params}{nodename} ) { print "{params}{nodename}>"; } return 12; } else { print "\n" if ( defined $node && $node->{name} eq "textnode"); print " " x $level . "{name}>\n"; } return 0; } 1;