⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parseutils.pm

📁 视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.
💻 PM
📖 第 1 页 / 共 2 页
字号:
############################################################################## Pod/ParseUtils.pm -- helpers for POD parsing and conversion## Copyright (C) 1999-2000 by Marek Rouchal. All rights reserved.# This file is part of "PodParser". PodParser is free software;# you can redistribute it and/or modify it under the same terms# as Perl itself.#############################################################################package Pod::ParseUtils;use vars qw($VERSION);$VERSION = 1.35;   ## Current version of this packagerequire  5.005;    ## requires this Perl version or later=head1 NAMEPod::ParseUtils - helpers for POD parsing and conversion=head1 SYNOPSIS  use Pod::ParseUtils;  my $list = new Pod::List;  my $link = Pod::Hyperlink->new('Pod::Parser');=head1 DESCRIPTIONB<Pod::ParseUtils> contains a few object-oriented helper packages forPOD parsing and processing (i.e. in POD formatters and translators).=cut#-----------------------------------------------------------------------------# Pod::List## class to hold POD list info (=over, =item, =back)#-----------------------------------------------------------------------------package Pod::List;use Carp;=head2 Pod::ListB<Pod::List> can be used to hold information about POD lists(written as =over ... =item ... =back) for further processing.The following methods are available:=over 4=item Pod::List-E<gt>new()Create a new list object. Properties may be specified through a hashreference like this:  my $list = Pod::List->new({ -start => $., -indent => 4 });See the individual methods/properties for details.=cutsub new {    my $this = shift;    my $class = ref($this) || $this;    my %params = @_;    my $self = {%params};    bless $self, $class;    $self->initialize();    return $self;}sub initialize {    my $self = shift;    $self->{-file} ||= 'unknown';    $self->{-start} ||= 'unknown';    $self->{-indent} ||= 4; # perlpod: "should be the default"    $self->{_items} = [];    $self->{-type} ||= '';}=item $list-E<gt>file()Without argument, retrieves the file name the list is in. This musthave been set before by either specifying B<-file> in the B<new()>method or by calling the B<file()> method with a scalar argument.=cut# The POD file name the list appears insub file {   return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};}=item $list-E<gt>start()Without argument, retrieves the line number where the list started.This must have been set before by either specifying B<-start> in theB<new()> method or by calling the B<start()> method with a scalarargument.=cut# The line in the file the node appearssub start {   return (@_ > 1) ? ($_[0]->{-start} = $_[1]) : $_[0]->{-start};}=item $list-E<gt>indent()Without argument, retrieves the indent level of the list as specifiedin C<=over n>. This must have been set before by either specifyingB<-indent> in the B<new()> method or by calling the B<indent()> methodwith a scalar argument.=cut# indent levelsub indent {   return (@_ > 1) ? ($_[0]->{-indent} = $_[1]) : $_[0]->{-indent};}=item $list-E<gt>type()Without argument, retrieves the list type, which can be an arbitrary value,e.g. C<OL>, C<UL>, ... when thinking the HTML way.This must have been set before by either specifyingB<-type> in the B<new()> method or by calling the B<type()> methodwith a scalar argument.=cut# The type of the list (UL, OL, ...)sub type {   return (@_ > 1) ? ($_[0]->{-type} = $_[1]) : $_[0]->{-type};}=item $list-E<gt>rx()Without argument, retrieves a regular expression for simplifying the individual item strings once the list type has been determined. Usage:E.g. when converting to HTML, one might strip the leading number inan ordered list as C<E<lt>OLE<gt>> already prints numbers itself.This must have been set before by either specifyingB<-rx> in the B<new()> method or by calling the B<rx()> methodwith a scalar argument.=cut# The regular expression to simplify the itemssub rx {   return (@_ > 1) ? ($_[0]->{-rx} = $_[1]) : $_[0]->{-rx};}=item $list-E<gt>item()Without argument, retrieves the array of the items in this list.The items may be represented by any scalar.If an argument has been given, it is pushed on the list of items.=cut# The individual =items of this listsub item {    my ($self,$item) = @_;    if(defined $item) {        push(@{$self->{_items}}, $item);        return $item;    }    else {        return @{$self->{_items}};    }}=item $list-E<gt>parent()Without argument, retrieves information about the parent holding thislist, which is represented as an arbitrary scalar.This must have been set before by either specifyingB<-parent> in the B<new()> method or by calling the B<parent()> methodwith a scalar argument.=cut# possibility for parsers/translators to store information about the# lists's parent objectsub parent {   return (@_ > 1) ? ($_[0]->{-parent} = $_[1]) : $_[0]->{-parent};}=item $list-E<gt>tag()Without argument, retrieves information about the list tag, which can beany scalar.This must have been set before by either specifyingB<-tag> in the B<new()> method or by calling the B<tag()> methodwith a scalar argument.=back=cut# possibility for parsers/translators to store information about the# list's objectsub tag {   return (@_ > 1) ? ($_[0]->{-tag} = $_[1]) : $_[0]->{-tag};}#-----------------------------------------------------------------------------# Pod::Hyperlink## class to manipulate POD hyperlinks (L<>)#-----------------------------------------------------------------------------package Pod::Hyperlink;=head2 Pod::HyperlinkB<Pod::Hyperlink> is a class for manipulation of POD hyperlinks. Usage:  my $link = Pod::Hyperlink->new('alternative text|page/"section in page"');The B<Pod::Hyperlink> class is mainly designed to parse the contents of theC<LE<lt>...E<gt>> sequence, providing a simple interface for accessing thedifferent parts of a POD hyperlink for further processing. It can also beused to construct hyperlinks.=over 4=item Pod::Hyperlink-E<gt>new()The B<new()> method can either be passed a set of key/value pairs or a singlescalar value, namely the contents of a C<LE<lt>...E<gt>> sequence. An objectof the class C<Pod::Hyperlink> is returned. The value C<undef> indicates afailure, the error message is stored in C<$@>.=cutuse Carp;sub new {    my $this = shift;    my $class = ref($this) || $this;    my $self = +{};    bless $self, $class;    $self->initialize();    if(defined $_[0]) {        if(ref($_[0])) {            # called with a list of parameters            %$self = %{$_[0]};            $self->_construct_text();        }        else {            # called with L<> contents            return undef unless($self->parse($_[0]));        }    }    return $self;}sub initialize {    my $self = shift;    $self->{-line} ||= 'undef';    $self->{-file} ||= 'undef';    $self->{-page} ||= '';    $self->{-node} ||= '';    $self->{-alttext} ||= '';    $self->{-type} ||= 'undef';    $self->{_warnings} = [];}=item $link-E<gt>parse($string)This method can be used to (re)parse a (new) hyperlink, i.e. the contentsof a C<LE<lt>...E<gt>> sequence. The result is stored in the current object.Warnings are stored in the B<warnings> property.E.g. sections like C<LE<lt>open(2)E<gt>> are deprecated, as they do not pointto Perl documents. C<LE<lt>DBI::foo(3p)E<gt>> is wrong as well, the manpagesection can simply be dropped.=cutsub parse {    my $self = shift;    local($_) = $_[0];    # syntax check the link and extract destination    my ($alttext,$page,$node,$type,$quoted) = (undef,'','','',0);    $self->{_warnings} = [];    # collapse newlines with whitespace    s/\s*\n+\s*/ /g;    # strip leading/trailing whitespace    if(s/^[\s\n]+//) {        $self->warning("ignoring leading whitespace in link");    }    if(s/[\s\n]+$//) {        $self->warning("ignoring trailing whitespace in link");    }    unless(length($_)) {        _invalid_link("empty link");        return undef;    }    ## Check for different possibilities. This is tedious and error-prone    # we match all possibilities (alttext, page, section/item)    #warn "DEBUG: link=$_\n";    # only page    # problem: a lot of people use (), or (1) or the like to indicate    # man page sections. But this collides with L<func()> that is supposed    # to point to an internal funtion...    my $page_rx = '[\w.-]+(?:::[\w.-]+)*(?:[(](?:\d\w*|)[)]|)';    # page name only    if(m!^($page_rx)$!o) {        $page = $1;        $type = 'page';    }    # alttext, page and "section"    elsif(m!^(.*?)\s*[|]\s*($page_rx)\s*/\s*"(.+)"$!o) {        ($alttext, $page, $node) = ($1, $2, $3);        $type = 'section';        $quoted = 1; #... therefore | and / are allowed    }    # alttext and page    elsif(m!^(.*?)\s*[|]\s*($page_rx)$!o) {        ($alttext, $page) = ($1, $2);        $type = 'page';    }    # alttext and "section"    elsif(m!^(.*?)\s*[|]\s*(?:/\s*|)"(.+)"$!) {        ($alttext, $node) = ($1,$2);        $type = 'section';        $quoted = 1;    }    # page and "section"    elsif(m!^($page_rx)\s*/\s*"(.+)"$!o) {        ($page, $node) = ($1, $2);        $type = 'section';        $quoted = 1;    }    # page and item    elsif(m!^($page_rx)\s*/\s*(.+)$!o) {        ($page, $node) = ($1, $2);        $type = 'item';    }    # only "section"    elsif(m!^/?"(.+)"$!) {        $node = $1;        $type = 'section';        $quoted = 1;    }    # only item    elsif(m!^\s*/(.+)$!) {        $node = $1;        $type = 'item';    }    # non-standard: Hyperlink with alt-text - doesn't remove protocol prefix, maybe it should?    elsif(m!^ \s* (.*?) \s* [|] \s* (\w+:[^:\s] [^\s|]*?) \s* $!ix) {      ($alttext,$node) = ($1,$2);      $type = 'hyperlink';    }    # non-standard: Hyperlink    elsif(m!^(\w+:[^:\s]\S*)$!i) {        $node = $1;        $type = 'hyperlink';    }    # alttext, page and item    elsif(m!^(.*?)\s*[|]\s*($page_rx)\s*/\s*(.+)$!o) {        ($alttext, $page, $node) = ($1, $2, $3);        $type = 'item';    }    # alttext and item    elsif(m!^(.*?)\s*[|]\s*/(.+)$!) {        ($alttext, $node) = ($1,$2);    }    # must be an item or a "malformed" section (without "")    else {        $node = $_;        $type = 'item';    }    # collapse whitespace in nodes    $node =~ s/\s+/ /gs;    # empty alternative text expands to node name    if(defined $alttext) {        if(!length($alttext)) {          $alttext = $node | $page;        }    }    else {        $alttext = '';    }    if($page =~ /[(]\w*[)]$/) {        $self->warning("(section) in '$page' deprecated");    }    if(!$quoted && $node =~ m:[|/]: && $type ne 'hyperlink') {        $self->warning("node '$node' contains non-escaped | or /");    }    if($alttext =~ m:[|/]:) {        $self->warning("alternative text '$node' contains non-escaped | or /");    }    $self->{-page} = $page;    $self->{-node} = $node;    $self->{-alttext} = $alttext;    #warn "DEBUG: page=$page section=$section item=$item alttext=$alttext\n";    $self->{-type} = $type;    $self->_construct_text();    1;}sub _construct_text {    my $self = shift;    my $alttext = $self->alttext();    my $type = $self->type();    my $section = $self->node();    my $page = $self->page();    my $page_ext = '';    $page =~ s/([(]\w*[)])$// && ($page_ext = $1);    if($alttext) {        $self->{_text} = $alttext;    }    elsif($type eq 'hyperlink') {        $self->{_text} = $section;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -