📄 inputobjects.pm
字号:
splice @_, $#_, 0, '-ptree'; } ## Any remaining arguments are treated as initial values for the ## hash that is used to represent this object. Note that we default ## certain values by specifying them *before* the arguments passed. ## If they are in the argument list, they will override the defaults. my $self = { -name => (@_ == 1) ? $_[0] : undef, -file => '<unknown-file>', -line => 0, -ldelim => '<', -rdelim => '>', @_ }; ## Initialize contents if they havent been already my $ptree = $self->{'-ptree'} || new Pod::ParseTree(); if ( ref $ptree =~ /^(ARRAY)?$/ ) { ## We have an array-ref, or a normal scalar. Pass it as an ## an argument to the ptree-constructor $ptree = new Pod::ParseTree($1 ? [$ptree] : $ptree); } $self->{'-ptree'} = $ptree; ## Bless ourselves into the desired class and perform any initialization bless $self, $class; return $self;}##---------------------------------------------------------------------------=head2 $pod_seq-E<gt>B<cmd_name()> my $seq_cmd = $pod_seq->cmd_name();The name of the interior sequence command.=cutsub cmd_name { (@_ > 1) and $_[0]->{'-name'} = $_[1]; return $_[0]->{'-name'};}## let name() be an alias for cmd_name()*name = \&cmd_name;##---------------------------------------------------------------------------## Private subroutine to set the parent pointer of all the given## children that are interior-sequences to be $selfsub _set_child2parent_links { my ($self, @children) = @_; ## Make sure any sequences know who their parent is for (@children) { next unless (length and ref and ref ne 'SCALAR'); if (UNIVERSAL::isa($_, 'Pod::InteriorSequence') or UNIVERSAL::can($_, 'nested')) { $_->nested($self); } }}## Private subroutine to unset child->parent linkssub _unset_child2parent_links { my $self = shift; $self->{'-parent_sequence'} = undef; my $ptree = $self->{'-ptree'}; for (@$ptree) { next unless (length and ref and ref ne 'SCALAR'); $_->_unset_child2parent_links() if UNIVERSAL::isa($_, 'Pod::InteriorSequence'); }}##---------------------------------------------------------------------------=head2 $pod_seq-E<gt>B<prepend()> $pod_seq->prepend($text); $pod_seq1->prepend($pod_seq2);Prepends the given string or parse-tree or sequence object to the parse-treeof this interior sequence.=cutsub prepend { my $self = shift; $self->{'-ptree'}->prepend(@_); _set_child2parent_links($self, @_); return $self;} ##---------------------------------------------------------------------------=head2 $pod_seq-E<gt>B<append()> $pod_seq->append($text); $pod_seq1->append($pod_seq2);Appends the given string or parse-tree or sequence object to the parse-treeof this interior sequence.=cutsub append { my $self = shift; $self->{'-ptree'}->append(@_); _set_child2parent_links($self, @_); return $self;} ##---------------------------------------------------------------------------=head2 $pod_seq-E<gt>B<nested()> $outer_seq = $pod_seq->nested || print "not nested";If this interior sequence is nested inside of another interiorsequence, then the outer/parent sequence that contains it isreturned. Otherwise C<undef> is returned.=cutsub nested { my $self = shift; (@_ == 1) and $self->{'-parent_sequence'} = shift; return $self->{'-parent_sequence'} || undef;}##---------------------------------------------------------------------------=head2 $pod_seq-E<gt>B<raw_text()> my $seq_raw_text = $pod_seq->raw_text();This method will return the I<raw> text of the POD interior sequence,exactly as it appeared in the input.=cutsub raw_text { my $self = shift; my $text = $self->{'-name'} . $self->{'-ldelim'}; for ( $self->{'-ptree'}->children ) { $text .= (ref $_) ? $_->raw_text : $_; } $text .= $self->{'-rdelim'}; return $text;}##---------------------------------------------------------------------------=head2 $pod_seq-E<gt>B<left_delimiter()> my $ldelim = $pod_seq->left_delimiter();The leftmost delimiter beginning the argument text to the interiorsequence (should be "<").=cutsub left_delimiter { (@_ > 1) and $_[0]->{'-ldelim'} = $_[1]; return $_[0]->{'-ldelim'};}## let ldelim() be an alias for left_delimiter()*ldelim = \&left_delimiter;##---------------------------------------------------------------------------=head2 $pod_seq-E<gt>B<right_delimiter()>The rightmost delimiter beginning the argument text to the interiorsequence (should be ">").=cutsub right_delimiter { (@_ > 1) and $_[0]->{'-rdelim'} = $_[1]; return $_[0]->{'-rdelim'};}## let rdelim() be an alias for right_delimiter()*rdelim = \&right_delimiter;##---------------------------------------------------------------------------=head2 $pod_seq-E<gt>B<parse_tree()> my $ptree = $pod_parser->parse_text($paragraph_text); $pod_seq->parse_tree( $ptree ); $ptree = $pod_seq->parse_tree();This method will get/set the corresponding parse-tree of the interiorsequence's text.=cutsub parse_tree { (@_ > 1) and $_[0]->{'-ptree'} = $_[1]; return $_[0]->{'-ptree'};} ## let ptree() be an alias for parse_tree()*ptree = \&parse_tree;##---------------------------------------------------------------------------=head2 $pod_seq-E<gt>B<file_line()> my ($filename, $line_number) = $pod_seq->file_line(); my $position = $pod_seq->file_line();Returns the current filename and line number for the interior sequenceobject. If called in an array context, it returns a list of twoelements: first the filename, then the line number. If called ina scalar context, it returns a string containing the filename, followedby a colon (':'), followed by the line number.=cutsub file_line { my @loc = ($_[0]->{'-file'} || '<unknown-file>', $_[0]->{'-line'} || 0); return (wantarray) ? @loc : join(':', @loc);}##---------------------------------------------------------------------------=head2 Pod::InteriorSequence::B<DESTROY()>This method performs any necessary cleanup for the interior-sequence.If you override this method then it is B<imperative> that you invokethe parent method from within your own method, otherwiseI<interior-sequence storage will not be reclaimed upon destruction!>=cutsub DESTROY { ## We need to get rid of all child->parent pointers throughout the ## tree so their reference counts will go to zero and they can be ## garbage-collected _unset_child2parent_links(@_);}##---------------------------------------------------------------------------#############################################################################package Pod::ParseTree;##---------------------------------------------------------------------------=head1 B<Pod::ParseTree>This object corresponds to a tree of parsed POD text. As POD text isscanned from left to right, it is parsed into an ordered list oftext-strings and B<Pod::InteriorSequence> objects (in order ofappearance). A B<Pod::ParseTree> object corresponds to this list ofstrings and sequences. Each interior sequence in the parse-tree mayitself contain a parse-tree (since interior sequences may be nested).=cut##---------------------------------------------------------------------------=head2 Pod::ParseTree-E<gt>B<new()> my $ptree1 = Pod::ParseTree->new; my $ptree2 = new Pod::ParseTree; my $ptree4 = Pod::ParseTree->new($array_ref); my $ptree3 = new Pod::ParseTree($array_ref);This is a class method that constructs a C<Pod::Parse_tree> object andreturns a reference to the new parse-tree. If a single-argument is given,it must be a reference to an array, and is used to initialize the root(top) of the parse tree.=cutsub new { ## Determine if we were called via an object-ref or a classname my $this = shift; my $class = ref($this) || $this; my $self = (@_ == 1 and ref $_[0]) ? $_[0] : []; ## Bless ourselves into the desired class and perform any initialization bless $self, $class; return $self;}##---------------------------------------------------------------------------=head2 $ptree-E<gt>B<top()> my $top_node = $ptree->top(); $ptree->top( $top_node ); $ptree->top( @children );This method gets/sets the top node of the parse-tree. If no arguments aregiven, it returns the topmost node in the tree (the root), which is alsoa B<Pod::ParseTree>. If it is given a single argument that is a reference,then the reference is assumed to a parse-tree and becomes the new top node.Otherwise, if arguments are given, they are treated as the new list ofchildren for the top node.=cutsub top { my $self = shift; if (@_ > 0) { @{ $self } = (@_ == 1 and ref $_[0]) ? ${ @_ } : @_; } return $self;}## let parse_tree() & ptree() be aliases for the 'top' method*parse_tree = *ptree = \⊤##---------------------------------------------------------------------------=head2 $ptree-E<gt>B<children()>This method gets/sets the children of the top node in the parse-tree.If no arguments are given, it returns the list (array) of children(each of which should be either a string or a B<Pod::InteriorSequence>.Otherwise, if arguments are given, they are treated as the new list ofchildren for the top node.=cutsub children { my $self = shift; if (@_ > 0) { @{ $self } = (@_ == 1 and ref $_[0]) ? ${ @_ } : @_; } return @{ $self };}##---------------------------------------------------------------------------=head2 $ptree-E<gt>B<prepend()>This method prepends the given text or parse-tree to the current parse-tree.If the first item on the parse-tree is text and the argument is also text,then the text is prepended to the first item (not added as a separate string).Otherwise the argument is added as a new string or parse-tree I<before>the current one.=cutuse vars qw(@ptree); ## an alias used for performance reasonssub prepend { my $self = shift; local *ptree = $self; for (@_) { next unless length; if (@ptree and !(ref $ptree[0]) and !(ref $_)) { $ptree[0] = $_ . $ptree[0]; } else { unshift @ptree, $_; } }}##---------------------------------------------------------------------------=head2 $ptree-E<gt>B<append()>This method appends the given text or parse-tree to the current parse-tree.If the last item on the parse-tree is text and the argument is also text,then the text is appended to the last item (not added as a separate string).Otherwise the argument is added as a new string or parse-tree I<after>the current one.=cutsub append { my $self = shift; local *ptree = $self; for (@_) { next unless length; if (@ptree and !(ref $ptree[-1]) and !(ref $_)) { $ptree[-1] .= $_; } else { push @ptree, $_; } }}=head2 $ptree-E<gt>B<raw_text()> my $ptree_raw_text = $ptree->raw_text();This method will return the I<raw> text of the POD parse-treeexactly as it appeared in the input.=cutsub raw_text { my $self = shift; my $text = ""; for ( @$self ) { $text .= (ref $_) ? $_->raw_text : $_; } return $text;}##---------------------------------------------------------------------------## Private routines to set/unset child->parent linkssub _unset_child2parent_links { my $self = shift; local *ptree = $self; for (@ptree) { next unless (length and ref and ref ne 'SCALAR'); $_->_unset_child2parent_links() if UNIVERSAL::isa($_, 'Pod::InteriorSequence'); }}sub _set_child2parent_links { ## nothing to do, Pod::ParseTrees cant have parent pointers}=head2 Pod::ParseTree::B<DESTROY()>This method performs any necessary cleanup for the parse-tree.If you override this method then it is B<imperative>that you invoke the parent method from within your own method,otherwise I<parse-tree storage will not be reclaimed upon destruction!>=cutsub DESTROY { ## We need to get rid of all child->parent pointers throughout the ## tree so their reference counts will go to zero and they can be ## garbage-collected _unset_child2parent_links(@_);}#############################################################################=head1 SEE ALSOSee L<Pod::Parser>, L<Pod::Select>=head1 AUTHORBrad Appleton E<lt>bradapp@enteract.comE<gt>=cut1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -