File Coverage

blib/lib/DocLife/Markdown.pm
Criterion Covered Total %
statement 39 43 90.7
branch 3 6 50.0
condition 1 2 50.0
subroutine 11 11 100.0
pod 1 6 16.6
total 55 68 80.8


line stmt bran cond sub pod time code
1             package DocLife::Markdown;
2              
3 1     1   31120 use strict;
  1         2  
  1         34  
4 1     1   6 use warnings;
  1         3  
  1         32  
5 1     1   891 use parent 'DocLife';
  1         276  
  1         4  
6 1     1   157 use Plack::Util::Accessor qw(tm);
  1         4  
  1         5  
7 1     1   1287 use Text::Markdown;
  1         39984  
  1         599  
8              
9             sub prepare_app {
10 5     5 1 39961 my ($self, $env) = @_;
11 5         33 $self->SUPER::prepare_app($env);
12 5         1110 my $tm = Text::Markdown->new;
13 5         97 $self->tm($tm);
14             }
15              
16             sub format {
17 3     3 0 8 my ($self, $req, $res, $file) = @_;
18 3         16 my $text = $file->slurp;
19 3         818 my ($title) = $text=~m|^#\s(.*)|;
20 3 50       12 unless ($title) {
21 0         0 $title = $file->basename;
22 0         0 my $suffix = $self->suffix;
23 0         0 $title=~s|\Q$suffix\E$||;
24             }
25 3         14 my $body = $self->html_header($title,$req);
26 3         15 $body.= $self->tm->markdown($text);
27 3         6892 $body.= $self->html_footer;
28 3         25 $res->body($body);
29             }
30              
31             sub script {
32 3     3 0 7 my ($self,$req) = @_;
33 3 50       10 return unless $req;
34              
35 3         14 my $int = $req->param('refresh');
36 3 50       608 return '' unless $int;
37             <<"EOF"
38             window.setInterval( function() {
39             window.location.reload();
40             }, $int );
41             EOF
42 0         0 }
43              
44             sub style {
45             <<"EOF"
46             *{ margin:0; padding:0; font-family: arial,sans-serif; }
47             body{ margin: 0 auto; width: 920px; padding: 0 0 30px; font-size: 14px; line-height: 23px; overflow-y: scroll; }
48             a{ color: #4183C4; text-decoration: none; }
49             header {margin: 15px 0 15px;}
50             header nav{text-align: center;}
51             article{padding: .7em;border: 1px solid #E9E9E9;background-color: #F8F8F8;}
52             article h1,article h2,article h3,article h4,article h5,article h6{border:0!important;}
53             article h1{font-size:170%!important;border-top:4px solid #aaa!important;padding-top:.5em!important;margin-top:1.5em!important;}
54             article h1:first-child{margin-top:0!important;padding-top:.25em!important;border-top:none!important;}
55             article h2{font-size:150%!important;margin-top:1.5em!important;border-top:4px solid #e0e0e0!important;padding-top:.5em!important;}
56             article h3{margin-top:1em!important;}
57             article hr{border:1px solid #ddd;}
58             article p{margin:1em 0!important;line-height:1.5em!important;}
59             article a.absent{color:#a00;}
60             article ul{margin:1em 0 1em 2em!important;}
61             article ol{margin:1em 0 1em 2em!important;}
62             article ul li{margin-top:.5em;margin-bottom:.5em;}
63             article ul ul,article ul ol,article ol ol,article ol ul{margin-top:0!important;margin-bottom:0!important;}
64             article blockquote{margin:1em 0!important;border-left:5px solid #ddd!important;padding-left:.6em!important;color:#555!important;}
65             article dt{font-weight:bold!important;margin-left:1em!important;}
66             article dd{margin-left:2em!important;margin-bottom:1em!important;}
67             article table{margin:1em 0!important;}
68             article table th{border-bottom:1px solid #bbb!important;padding:.2em 1em!important;}
69             article table td{border-bottom:1px solid #ddd!important;padding:.2em 1em!important;}
70             article pre{margin:1em 0;font-size:12px;background-color:#eee;border:1px solid #ddd;padding:5px;line-height:1.5em;color:#444;overflow:auto;-webkit-box-shadow:rgba(0,0,0,0.07) 0 1px 2px inset;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
71             article pre::-webkit-scrollbar{height:8px;width:8px;}
72             article pre::-webkit-scrollbar-track-piece{margin-bottom:10px;background-color:#e5e5e5;border-bottom-left-radius:4px 4px;border-bottom-right-radius:4px 4px;border-top-left-radius:4px 4px;border-top-right-radius:4px 4px;}
73             article pre::-webkit-scrollbar-thumb:vertical{height:25px;background-color:#ccc;-webkit-border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(255,255,255,1);}
74             article pre::-webkit-scrollbar-thumb:horizontal{width:25px;background-color:#ccc;-webkit-border-radius:4px;}
75             article pre code{
76             font-family: Monaco, Monospace;
77             padding:0!important;font-size:12px!important;background-color:#eee!important;border:none!important;
78             }
79             article code{
80             font-size:12px!important;background-color:#f8f8ff!important;color:#444!important;padding:0 .2em!important;border:1px solid #dedede!important;
81             }
82             article a code,article a:link code,article a:visited code{color:#4183c4!important;}
83             article img{max-width:100%;}
84             EOF
85 3     3 0 8 }
86              
87             sub html_header {
88 3     3 0 6 my ($self, $title, $req) = @_;
89 3   50     10 $title ||= 'Index';
90            
91 3         12 my $style = $self->style;
92 3         14 my $script = $self->script( $req );
93              
94 3         13 my $top = $self->base_url;
95             <<"EOF"
96            
97            
98            
99             $title
100            
101            
102            
103            
104            
105             TOP
106             Auto Refresh
107            
108            
109             EOF
110 3         60 }
111              
112             sub html_footer {
113             <<"EOF"
114            
115            
116            
117             EOF
118 3     3 0 12 }
119              
120             =head1 NAME
121              
122             DocLife::Markdown - Markdown Viewer.
123              
124             =head1 SYNOPSIS
125              
126             # app.psgi
127             use DocLife::Markdown;
128             DocLife::Markdown->new( root => "./doc", suffix => ".md" );
129              
130             # one-liner
131             plackup -MDocLife::Markdown -e 'DocLife::Markdown->new( root => "./doc" )->to_app'
132              
133             =head1 SEE ALSO
134              
135             L, L
136              
137             =cut
138              
139             1;