亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? formatter.pm

?? ARM上的如果你對底層感興趣
?? PM
字號:
package HTML::Formatter;

# $Id: Formatter.pm,v 1.19 1998/01/06 09:51:02 aas Exp $

=head1 NAME

HTML::Formatter - Base class for HTML formatters

=head1 SYNOPSIS

 package HTML::FormatXX;
 require HTML::Formatter;
 @ISA=qw(HTML::Formatter);

=head1 DESCRIPTION

HTML formatters are able to format a HTML syntax tree into various
printable formats.  Different formatters produce output for different
output media.  Common for all formatters are that they will return the
formatted output when the format() method is called.  Format() takes a
HTML::Element as parameter.

=head1 SEE ALSO

L<HTML::FormatText>, L<HTML::FormatPS>, L<HTML::Element>

=head1 COPYRIGHT

Copyright (c) 1995-1997 Gisle Aas. All rights reserved.

This library is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.

=head1 AUTHOR

Gisle Aas <aas@oslonett.no>

=cut


require HTML::Element;

use strict;
use Carp;
use UNIVERSAL qw(can);

use vars qw($VERSION);
$VERSION = sprintf("%d.%02d", q$Revision: 1.19 $ =~ /(\d+)\.(\d+)/);

sub new
{
    my($class,%arg) = @_;
    my $self = bless { $class->default_values }, $class;
    $self->configure(\%arg) if scalar(%arg);
    $self;
}

sub default_values
{
    ();
}

sub configure
{
    my($self, $arg) = @_;
    for (keys %$arg) {
	warn "Unknown configure argument '$_'" if $^W;
    }
    $self;
}

sub format
{
    my($self, $html) = @_;
    $self->begin();
    $html->traverse(
	sub {
	    my($node, $start, $depth) = @_;
	    if (ref $node) {
		my $tag = $node->tag;
		my $func = $tag . '_' . ($start ? "start" : "end");
		# Use UNIVERSAL::can so that we can recover if
		# a handler is not defined for the tag.
		if (can($self, $func)) {
		    return $self->$func($node);
		} else {
		    return 1;
		}
	    } else {
		$self->textflow($node);
	    }
	    1;
	}
     );
    $self->end();
    join('', @{$self->{output}});
}

sub begin
{
    my $self = shift;

    # Flags
    $self->{anchor}    = 0;
    $self->{underline} = 0;
    $self->{bold}      = 0;
    $self->{italic}    = 0;
    $self->{center}    = 0;
    $self->{nobr}      = 0;

    $self->{font_size}     = [3];   # last element is current size
    $self->{basefont_size} = [3];

    $self->{markers} = [];          # last element is current marker
    $self->{vspace} = undef;        # vertical space (dimension)

    $self->{output} = [];
}

sub end
{
}

sub html_start { 1; }  sub html_end {}
sub head_start { 0; }
sub body_start { 1; }  sub body_end {}

sub header_start
{
    my($self, $level, $node) = @_;
    my $align = $node->attr('align');
    if (defined($align) && lc($align) eq 'center') {
	$self->{center}++;
    }
    1,
}

sub header_end
{
    my($self, $level, $node) = @_;
    my $align = $node->attr('align');
    if (defined($align) && lc($align) eq 'center') {
	$self->{center}--;
    }
}

sub h1_start { shift->header_start(1, @_) }
sub h2_start { shift->header_start(2, @_) }
sub h3_start { shift->header_start(3, @_) }
sub h4_start { shift->header_start(4, @_) }
sub h5_start { shift->header_start(5, @_) }
sub h6_start { shift->header_start(6, @_) }

sub h1_end   { shift->header_end(1, @_) }
sub h2_end   { shift->header_end(2, @_) }
sub h3_end   { shift->header_end(3, @_) }
sub h4_end   { shift->header_end(4, @_) }
sub h5_end   { shift->header_end(5, @_) }
sub h6_end   { shift->header_end(6, @_) }

sub br_start
{
    my $self = shift;
    $self->vspace(0, 1);
}

sub hr_start
{
    my $self = shift;
    $self->vspace(1);
}

sub img_start
{
    shift->out(shift->attr('alt') || "[IMAGE]");
}

sub a_start
{
    shift->{anchor}++;
    1;
}

sub a_end
{
    shift->{anchor}--;
}

sub u_start
{
    shift->{underline}++;
    1;
}

sub u_end
{
    shift->{underline}--;
}

sub b_start
{
    shift->{bold}++;
    1;
}

sub b_end
{
    shift->{bold}--;
}

sub tt_start
{
    shift->{teletype}++;
    1;
}

sub tt_end
{
    shift->{teletype}--;
}

sub i_start
{
    shift->{italic}++;
    1;
}

sub i_end
{
    shift->{italic}--;
}

sub center_start
{
    shift->{center}++;
    1;
}

sub center_end
{
    shift->{center}--;
}

sub nobr_start
{
    shift->{nobr}++;
    1;
}

sub nobr_end
{
    shift->{nobr}--;
}

sub wbr_start
{
    1;
}

sub font_start
{
    my($self, $elem) = @_;
    my $size = $elem->attr('size');
    return 1 unless defined $size;
    if ($size =~ /^\s*[+\-]/) {
	my $base = $self->{basefont_size}[-1];
	$size = $base + $size;
    }
    push(@{$self->{font_size}}, $size);
    1;
}

sub font_end
{
    my($self, $elem) = @_;
    my $size = $elem->attr('size');
    return unless defined $size;
    pop(@{$self->{font_size}});
}

sub basefont_start
{
    my($self, $elem) = @_;
    my $size = $elem->attr('size');
    return unless defined $size;
    push(@{$self->{basefont_size}}, $size);
    1;
}

sub basefont_end
{
    my($self, $elem) = @_;
    my $size = $elem->attr('size');
    return unless defined $size;
    pop(@{$self->{basefont_size}});
}

# Aliases for logical markup
BEGIN {
    *cite_start   = \&i_start;
    *cite_end     = \&i_end;
    *code_start   = \&tt_start;
    *code_end     = \&tt_end;
    *em_start     = \&i_start;
    *em_end       = \&i_end;
    *kbd_start    = \&tt_start;
    *kbd_end      = \&tt_end;
    *samp_start   = \&tt_start;
    *samp_end     = \&tt_end;
    *strong_start = \&b_start;
    *strong_end   = \&b_end;
    *var_start    = \&tt_start;
    *var_end      = \&tt_end;
}

sub p_start
{
    my $self = shift;
    $self->vspace(1);
    1;
}

sub p_end
{
    shift->vspace(1);
}

sub pre_start
{
    my $self = shift;
    $self->{pre}++;
    $self->vspace(1);
    1;
}

sub pre_end
{
    my $self = shift;
    $self->{pre}--;
    $self->vspace(1);
}

BEGIN {
    *listing_start = \&pre_start;
    *listing_end   = \&pre_end;
    *xmp_start     = \&pre_start;
    *xmp_end       = \&pre_end;
}

sub blockquote_start
{
    my $self = shift;
    $self->vspace(1);
    $self->adjust_lm( +2 );
    $self->adjust_rm( -2 );
    1;
}

sub blockquote_end
{
    my $self = shift;
    $self->vspace(1);
    $self->adjust_lm( -2 );
    $self->adjust_rm( +2 );
}

sub address_start
{
    my $self = shift;
    $self->vspace(1);
    $self->i_start(@_);
    1;
}

sub address_end
{
    my $self = shift;
    $self->i_end(@_);
    $self->vspace(1);
}

# Handling of list elements

sub ul_start
{
    my $self = shift;
    $self->vspace(1);
    push(@{$self->{markers}}, "*");
    $self->adjust_lm( +2 );
    1;
}

sub ul_end
{
    my $self = shift;
    pop(@{$self->{markers}});
    $self->adjust_lm( -2 );
    $self->vspace(1);
}

sub li_start
{
    my $self = shift;
    $self->bullet($self->{markers}[-1]);
    $self->adjust_lm(+2);
    1;
}

sub bullet
{
    shift->out(@_);
}

sub li_end
{
    my $self = shift;
    $self->vspace(1);
    $self->adjust_lm( -2);
    my $markers = $self->{markers};
    if ($markers->[-1] =~ /^\d+/) {
	# increment ordered markers
	$markers->[-1]++;
    }
}

BEGIN {
    *menu_start = \&ul_start;
    *menu_end   = \&ul_end;
    *dir_start  = \&ul_start;
    *dir_end    = \&ul_end;
}

sub ol_start
{
    my $self = shift;

    $self->vspace(1);
    push(@{$self->{markers}}, 1);
    $self->adjust_lm(+2);
    1;
}

sub ol_end
{
    my $self = shift;
    $self->adjust_lm(-2);
    pop(@{$self->{markers}});
    $self->vspace(1);
}


sub dl_start
{
    my $self = shift;
    $self->adjust_lm(+2);
    $self->vspace(1);
    1;
}

sub dl_end
{
    my $self = shift;
    $self->adjust_lm(-2);
    $self->vspace(1);
}

sub dt_start
{
    my $self = shift;
    $self->vspace(1);
    1;
}

sub dt_end
{
}

sub dd_start
{
    my $self = shift;
    $self->adjust_lm(+6);
    $self->vspace(0);
    1;
}

sub dd_end
{
    shift->adjust_lm(-6);
}


# Things not formated at all
sub table_start { shift->out('[TABLE NOT SHOWN]'); 0; }
sub form_start  { shift->out('[FORM NOT SHOWN]');  0; }



sub textflow
{
    my $self = shift;
    if ($self->{pre}) {
	# strip leading and trailing newlines so that the <pre> tags 
	# may be placed on lines of their own without causing extra
	# vertical space as part of the preformatted text
	$_[0] =~ s/\n$//;
	$_[0] =~ s/^\n//;
	$self->pre_out($_[0]);
    } else {
	for (split(/(\s+)/, $_[0])) {
	    next unless length $_;
	    $self->out($_);
	}
    }
}



sub vspace
{
    my($self, $min, $add) = @_;
    my $old = $self->{vspace};
    if (defined $old) {
	my $new = $old;
	$new += $add || 0;
	$new = $min if $new < $min;
	$self->{vspace} = $new;
    } else {
	$self->{vspace} = $min;
    }
    $old;
}

sub collect
{
    push(@{shift->{output}}, @_);
}

sub out
{
    confess "Must be overridden my subclass";
}

sub pre_out
{
    confess "Must be overridden my subclass";
}

1;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
视频一区国产视频| 欧美日韩在线播放一区| 一本色道综合亚洲| 99视频精品全部免费在线| 一区二区三区四区在线免费观看| 国产欧美一区二区精品仙草咪 | 在线精品亚洲一区二区不卡| 色综合视频一区二区三区高清| 欧美日韩一级视频| 中文字幕av在线一区二区三区| 国产精品免费网站在线观看| 日本女优在线视频一区二区| 国产精品一二三区| 亚洲一区二区三区四区中文字幕| 日本怡春院一区二区| 91在线码无精品| 欧美片网站yy| 一区二区三区成人| 国产传媒一区在线| 色婷婷久久99综合精品jk白丝| 日韩亚洲欧美在线| 五月天久久比比资源色| 色综合久久久久| 国产欧美日韩亚州综合| 麻豆极品一区二区三区| 欧美日韩精品一区二区天天拍小说| 精品国产乱码久久久久久浪潮| 丝袜国产日韩另类美女| 欧美日韩免费在线视频| 精品少妇一区二区三区在线播放| 日韩vs国产vs欧美| 日韩你懂的在线观看| 精品亚洲成a人在线观看| 精品国产伦理网| 亚洲影视在线观看| 色婷婷精品久久二区二区蜜臀av| 亚洲综合色婷婷| 欧美一区二区美女| 国产电影一区二区三区| 国产精品色噜噜| 欧美精品aⅴ在线视频| 日韩成人av影视| 国产亚洲欧洲一区高清在线观看| 美女国产一区二区| 久久久久综合网| 91久久国产综合久久| 喷水一区二区三区| 久久综合色婷婷| 国产成人免费视频| 国产精品美女久久久久久久久 | 国产精品久久久久久户外露出 | 亚洲国产精品精华液网站| 精品久久久久久久久久久久久久久久久| 久久福利资源站| 一区二区三区成人在线视频| 久久精品夜夜夜夜久久| 91老师国产黑色丝袜在线| 蜜桃视频一区二区三区在线观看| 中文字幕在线观看不卡| 日韩一二三区不卡| 在线视频中文字幕一区二区| 国产精品一区二区久久不卡| 日日摸夜夜添夜夜添国产精品| 久久免费视频一区| 日韩欧美自拍偷拍| 欧美一区二区免费观在线| 欧美色电影在线| 99re66热这里只有精品3直播| 国产一区二区调教| 偷拍一区二区三区| 亚洲综合丁香婷婷六月香| 国产精品进线69影院| 久久日韩精品一区二区五区| 欧美日韩另类一区| 色噜噜久久综合| 成人精品免费看| 99久久久久久| 91在线视频免费91| 91精品91久久久中77777| 丰满亚洲少妇av| 粉嫩欧美一区二区三区高清影视| 国产专区欧美精品| 97精品电影院| 精品视频全国免费看| 日韩午夜在线播放| 国产无人区一区二区三区| 国产精品美女久久久久aⅴ| 亚洲制服丝袜在线| 美女视频网站久久| 成人av资源在线观看| 欧美日韩情趣电影| 中文一区二区完整视频在线观看| 国产精品久久久久影院| 亚洲综合免费观看高清完整版 | 91精品国产综合久久精品app| 亚洲精品一线二线三线| 亚洲欧美日本在线| 国产精品一级片在线观看| 91久久精品网| 中文字幕第一区| 久久国产精品色婷婷| 欧美性猛片aaaaaaa做受| 成人精品小蝌蚪| 亚洲欧洲精品成人久久奇米网| 亚洲综合成人网| 国产成人8x视频一区二区| 欧美一区午夜视频在线观看 | 美女视频黄a大片欧美| 97久久精品人人做人人爽50路| 欧美精品一区二区三区在线| 丝袜国产日韩另类美女| 色素色在线综合| 亚洲欧美激情插| 成人手机电影网| 一区在线中文字幕| 成人sese在线| 一区二区三区精品在线观看| 国产精品亚洲综合一区在线观看| 国产成人在线看| 欧美电影免费观看高清完整版在线观看 | 久久久五月婷婷| 91一区一区三区| 国产午夜精品一区二区三区嫩草| 久久电影网站中文字幕 | 国产精品99久久久久久有的能看| 天天综合网天天综合色| 播五月开心婷婷综合| 国产精品网站在线| 91成人看片片| 丝袜美腿亚洲一区二区图片| 91精品国产欧美一区二区18 | 久久精品国产精品亚洲红杏 | 美国一区二区三区在线播放| 欧美一区二区三区播放老司机| 日韩黄色在线观看| 国产午夜精品久久久久久免费视 | 国产成人av影院| 国产精品亲子伦对白| 亚洲毛片av在线| 欧美日韩中字一区| 91丨国产丨九色丨pron| 国产高清亚洲一区| 国产成人av一区二区| 亚洲成人av一区二区三区| 日韩精品影音先锋| 成人ar影院免费观看视频| 视频一区视频二区中文字幕| 国产欧美一区二区三区沐欲| 欧美精品1区2区3区| 成人免费视频网站在线观看| 婷婷丁香久久五月婷婷| 国产精品色一区二区三区| 欧美午夜精品久久久| 久久99精品国产.久久久久久| 亚洲人吸女人奶水| 中文字幕欧美日本乱码一线二线| 亚洲国产高清不卡| 精品国产乱码久久久久久夜甘婷婷| 欧美日韩国产小视频在线观看| 欧美日韩性生活| 日韩欧美一级片| 久久久久97国产精华液好用吗| 国产日韩欧美不卡| 国产女人aaa级久久久级| 中文字幕欧美国产| 中文字幕乱码久久午夜不卡| 国产日韩欧美在线一区| 久久精品视频在线看| 亚洲国产高清aⅴ视频| 国产日韩欧美亚洲| 久久精品一区二区三区四区| 久久精品网站免费观看| 亚洲人一二三区| 亚洲美女在线一区| 美女精品一区二区| 成人激情免费视频| 欧美疯狂性受xxxxx喷水图片| 国产欧美一二三区| 日韩激情一二三区| 99精品久久99久久久久| 久久久一区二区| 精品无人码麻豆乱码1区2区| www.日韩在线| 久久久不卡影院| 强制捆绑调教一区二区| 亚洲视频一区二区免费在线观看 | 色狠狠综合天天综合综合| 91久久精品午夜一区二区| 久久久国产综合精品女国产盗摄| 天天综合色天天综合色h| 成人性生交大片免费看在线播放 | 中文字幕av一区二区三区免费看| 日韩av网站在线观看| 亚洲欧美激情视频在线观看一区二区三区 | 亚洲视频免费在线| 1000精品久久久久久久久| 亚洲色图清纯唯美| 亚洲国产精品一区二区久久恐怖片| 亚洲福利一二三区| 欧美男同性恋视频网站|