FrameMaker-MifTree
view release on metacpan or search on metacpan
lib/FrameMaker/MifTree.pm view on Meta::CPAN
}
$this->attributes('');
}
if ($this->name eq '_facet') {
print $MIF $this->facet_data;
} else {
print $MIF
' ' x (scalar $this->ancestors - 1) .
'<' . $this->name .
($this->name eq 'DocFileInfo' ? "\n"
: ' ' ) . # not very elegant huh?
($this->is_node ? "\n"
: $this->attributes . ">\n");
}
}
1; # continue recursion
},
callbackback => sub {
my $this = $_[0];
if (defined $this->mother) { # don't print anything for root...
if ($this->is_node) { # ... or for leaves
print $MIF ' ' x (scalar $this->ancestors - 1) .
'> # End of ' . $this->name . "\n";
}
} else {
print $MIF "# End of MIFFile\n";
}
}
});
return 1;
}
=item C<$OBJ-E<gt>parse_mif(STRING)>
Parses a string of MIF statements into the object. This is also a very quick
way to set up an object tree:
my $new_obj = FrameMaker::MifTree->new();
$new_obj->parse_mif(<<ENDMIF);
<MIFFile 7.00># The only required statement
<Para # Begin a paragraph
<ParaLine# Begin a line within the paragraph
<String `Hello World'># The actual text of this document
> # end of Paraline #End of ParaLine statement
> # end of Para #End of Para statement
ENDMIF
Implemented by tying the scalar to a filehandle and calling IO::Tokenizer on
the resulting handle.
The parser currently has the following limitations:
=over 8
=item *
All comments are lost.
=item *
Macro statements are not (yet) implemented.
=item *
Include statements are not (yet) implemented.
=back
Maybe I'll do something about it. Someday.
=cut
sub parse_mif {
my ($obj, $string) = @_[0, 1];
my $class = ref($obj) || croak 'Must be called on object';
my $facet_handle = 0;
my $fh = IO::Tokenized::Scalar->new();
$fh->setparser(@parserdefinition);
$fh->open(\$string);
my $cur_obj = $obj;
while ( my ($tok, $val) = $fh->gettoken ) {
if ( $tok eq 'FACET' ) {
unless ($facet_handle) {
$cur_obj->add_facet;
$facet_handle = $cur_obj->facet_handle;
}
syswrite $facet_handle, "$val\n";
} else {
$facet_handle = 0;
if ( $tok eq 'MIFTAG' ) {
$cur_obj = $cur_obj->add_node($val);
} elsif ( $tok eq 'RANGLE' ) {
$cur_obj = $cur_obj->mother;
} elsif ( $tok eq 'ATTRIBS' ) {
if (defined $cur_obj->attributes) {
$cur_obj->attributes($cur_obj->attributes . $val)
} else {
$cur_obj->attributes($val)
}
}
}
}
$fh->close;
}
=item C<$OBJ-E<gt>parse_miffile(FILENAME)>
Parses a file from disk into a DAG_Node tree structure. See L<parse_mif> for
details.
=cut
sub parse_miffile {
my ($obj, $filename) = @_[0, 1];
croak qq(File "$filename" not found) unless -f $filename;
my $class = ref($obj) || croak 'Must be called on object';
my $facet_handle = 0;
my $fh = IO::Tokenized::File->new();
( run in 2.307 seconds using v1.01-cache-2.11-cpan-13bb782fe5a )