/[Frey]/branches/zimbardo/lib/Frey/Web.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /branches/zimbardo/lib/Frey/Web.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 350 - (show annotations)
Sun Nov 16 00:37:34 2008 UTC (15 years, 5 months ago) by dpavlin
Original Path: trunk/lib/Frey/Web.pm
File size: 3069 byte(s)
move error into Frey::Web and use it
1 package Frey::Web;
2 use Moose::Role;
3
4 use Continuity::Widget::DomNode;
5 use Data::Dump qw/dump/;
6 use Carp qw/confess/;
7 use File::Slurp;
8
9 has 'head' => (
10 is => 'rw',
11 isa => 'ArrayRef[Str]',
12 default => sub { [ 'static/frey.css' ] },
13 );
14
15 =head2 inline_smaller_than
16
17 Inline JavaScript and CSS smaller than this size into page reducing
18 round-trips to server.
19
20 =cut
21
22 has 'inline_smaller_than' => (
23 is => 'rw',
24 isa => 'Int',
25 default => 10240,
26 );
27
28 sub dom2html {
29 # warn "## dom2html ",dump( @_ );
30 return Continuity::Widget::DomNode->create( @_ )->to_string;
31 }
32
33 sub _inline_path {
34 my ( $self, $path ) = @_;
35 -s $path < $self->inline_smaller_than;
36 }
37
38 sub _head_html {
39 my $self = shift;
40 my $out = '';
41 foreach my $path ( @{ $self->head } ) {
42 $path =~ s!^/!!;
43 if ( $path =~ m/\.js$/ ) {
44 $out .= $self->_inline_path( $path ) ?
45 qq|<!-- $path --><script type="text/javascript">\n| . read_file($path) . qq|\n</script>| :
46 qq|<script type="text/javascript" src="/$path"></script>|;
47 } elsif ( $path =~ m/\.css$/ ) {
48 $out .= $self->_inline_path( $path ) ?
49 qq|<!-- $path --><style type="text/css">\n| . read_file( $path ) . qq|\n</style>| :
50 qq|<link type="text/css" rel="stylesheet" href="/$path" media="screen">|;
51 } else {
52 confess "don't know how to render $path";
53 }
54 $out .= "\n";
55 }
56 return $out;
57 }
58
59 =head2 add_head
60
61 $o->add_head( 'path/to/external.js' );
62
63 my $size = $o->add_head( 'path/to/external.css' );
64
65 =cut
66
67 sub add_head {
68 my ( $self, $path ) = @_;
69 return if ! defined $path || $path eq '';
70 $path =~ s!^/!!;
71
72 if ( -e $path ) {
73 if ( $path =~ m/\.(?:js|css)$/ ) {
74 push @{ $self->head }, $path;
75 } else {
76 confess "can't add_head( $path ) it's not js or css";
77 }
78 } else {
79 confess "can't find $path: $!";
80 }
81
82 return -s $path;
83 }
84
85 our $reload_counter = 0;
86
87
88 =head2 page
89
90 $self->page(
91 title => 'page title',
92 head => '<!-- optional head markup -->',
93 body => '<b>Page Body</b>',
94 );
95
96 =cut
97
98 use Frey::Bookmarklet;
99 use Frey::ClassBrowser;
100
101 sub page {
102 my $self = shift;
103 my $a = {@_};
104
105 $reload_counter++;
106
107 my $html = qq|<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"><html><head>|
108 . $self->_head_html
109 . '<title>' . ( $a->{title} || ref($self) ) . '</title>'
110 . ( $a->{head} || '' )
111 . '</head><body>'
112 . ( $a->{body} || '<!-- no body -->' )
113 . qq|<div class="frey-status-line">
114 <a href="/">Frey</a> $Frey::VERSION
115 <a href="?reload=$reload_counter"><code>| . dump( $ENV{'REQUEST_URI'} ) . qq|</code></a>
116 <span class="frey-popup">Bookmarklets<span>| . Frey::Bookmarklet->markup . qq|</span></span>
117 <span class="frey-popup">ClassBrowser<span>| . Frey::ClassBrowser->markup . qq|</span></span>
118 <span class="frey-popup">ENV<span><code>| . dump( %ENV ) . qq|</code></span></span>
119 </div>
120 </body></html>
121 |;
122
123 warn "## >>> page ",length($html), " bytes\n" if $self->debug;
124
125 return $html;
126 }
127
128 sub error {
129 my ( $self, $error ) = @_;
130 warn $error;
131 $error =~ s{\s+(\S+)\s+line\s+(\d+)}{ <a href="/editor$1+$2" target="editor">$1</a> line $2}gsm;
132 return qq|<pre class="frey-error">$error</pre>|;
133 }
134
135 1;

  ViewVC Help
Powered by ViewVC 1.1.26