/[suikacvs]/test/html-webhacc/WebHACC/Output.pm
Suika

Contents of /test/html-webhacc/WebHACC/Output.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations) (download)
Sun Jul 20 14:58:24 2008 UTC (16 years, 4 months ago) by wakaba
Branch: MAIN
++ ChangeLog	20 Jul 2008 14:58:20 -0000
2008-07-20  Wakaba  <wakaba@suika.fam.cx>

	* cc.cgi: Modularized.

	* WebHACC/: New directory.

1 wakaba 1.1 package WebHACC::Output;
2     use strict;
3     require IO::Handle;
4    
5     my $htescape = sub ($) {
6     my $s = $_[0];
7     $s =~ s/&/&amp;/g;
8     $s =~ s/</&lt;/g;
9     $s =~ s/>/&gt;/g;
10     $s =~ s/"/&quot;/g;
11     $s =~ s{([\x00-\x09\x0B-\x1F\x7F-\xA0\x{FEFF}\x{FFFC}-\x{FFFF}])}{
12     sprintf '<var>U+%04X</var>', ord $1;
13     }ge;
14     return $s;
15     };
16    
17     sub new ($) {
18     return bless {nav => []}, shift;
19     } # new
20    
21     sub input ($;$) {
22     if (@_ > 1) {
23     if (defined $_[1]) {
24     $_[0]->{input} = $_[1];
25     } else {
26     delete $_[0]->{input};
27     }
28     }
29    
30     return $_[0]->{input};
31     } # input
32    
33     sub handle ($;$) {
34     if (@_ > 1) {
35     if (defined $_[1]) {
36     $_[0]->{handle} = $_[1];
37     } else {
38     delete $_[0]->{handle};
39     }
40     }
41    
42     return $_[0]->{handle};
43     } # handle
44    
45     sub set_utf8 ($) {
46     binmode shift->{handle}, ':utf8';
47     } # set_utf8
48    
49     sub set_flush ($) {
50     shift->{handle}->autoflush (1);
51     } # set_flush
52    
53     sub unset_flush ($) {
54     shift->{handle}->autoflush (0);
55     } # unset_flush
56    
57     sub html ($$) {
58     shift->{handle}->print (shift);
59     } # html
60    
61     sub text ($$) {
62     shift->html ($htescape->(shift));
63     } # text
64    
65     sub url ($$%) {
66     my ($self, $url, %opt) = @_;
67     $self->html (q[<code class=uri>&lt;]);
68     $self->link ($url, %opt, url => $url);
69     $self->html (q[></code>]);
70     } # url
71    
72     sub start_tag ($$%) {
73     my ($self, $tag_name, %opt) = @_;
74     $self->html ('<' . $htescape->($tag_name)); # escape for safety
75     if (exists $opt{id}) {
76     my $id = $self->input->id_prefix . $opt{id};
77     $self->html (' id="' . $htescape->($id) . '"');
78     delete $opt{id};
79     }
80     for (keys %opt) { # for safety
81     $self->html (' ' . $htescape->($_) . '="' . $htescape->($opt{$_}) . '"');
82     }
83     $self->html ('>');
84     } # start_tag
85    
86     sub end_tag ($$) {
87     shift->html ('</' . $htescape->(shift) . '>');
88     } # end_tag
89    
90     sub start_section ($%) {
91     my ($self, %opt) = @_;
92     $self->html ('<div class=section');
93     if (defined $opt{id}) {
94     my $id = $self->input->id_prefix . $opt{id};
95     $self->html (' id="' . $htescape->($id) . '"');
96     push @{$self->{nav}}, [$id => $opt{short_title} || $opt{title}]
97     unless $self->input->nested;
98     }
99     $self->html ('><h2>' . $htescape->($opt{title}) . '</h2>');
100     } # start_section
101    
102     sub end_section ($) {
103     my $self = shift;
104     $self->html ('</div>');
105     $self->{handle}->flush;
106     } # end_section
107    
108     sub start_code_block ($) {
109     shift->html ('<pre><code>');
110     } # start_code_block
111    
112     sub end_code_block ($) {
113     shift->html ('</code></pre>');
114     } # end_code_block
115    
116     sub code ($$) {
117     shift->html ('<code>' . $htescape->(shift) . '</code>');
118     } # code
119    
120     sub link ($$%) {
121     my ($self, $content, %opt) = @_;
122     $self->html ('<a href="' . $htescape->($opt{url}) . '">');
123     $self->text ($content);
124     $self->html ('</a>');
125     } # link
126    
127     sub xref ($$%) {
128     my ($self, $content, %opt) = @_;
129     $self->html ('<a href="#' . $htescape->($self->input->id_prefix . $opt{target}) . '">');
130     $self->text ($content);
131     $self->html ('</a>');
132     } # xref
133    
134     sub nav_list ($) {
135     my $self = shift;
136     $self->html (q[<ul class="navigation" id="nav-items">]);
137     for (@{$self->{nav}}) {
138     $self->html (qq[<li><a href="@{[$htescape->($_->[0])]}">@{[$htescape->($_->[1])]}</a>]);
139     }
140     $self->html ('</ul>');
141     } # nav_list
142    
143     1;

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24