line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
3
|
|
|
3
|
|
27004
|
use strictures 1; |
|
3
|
|
|
|
|
891
|
|
|
3
|
|
|
|
|
82
|
|
2
|
|
|
|
|
|
|
package Mojito::Template; |
3
|
|
|
|
|
|
|
{ |
4
|
|
|
|
|
|
|
$Mojito::Template::VERSION = '0.24'; |
5
|
|
|
|
|
|
|
} |
6
|
3
|
|
|
3
|
|
2207
|
use Moo; |
|
3
|
|
|
|
|
21414
|
|
|
3
|
|
|
|
|
18
|
|
7
|
3
|
|
|
3
|
|
2929
|
use 5.010; |
|
3
|
|
|
|
|
10
|
|
|
3
|
|
|
|
|
442
|
|
8
|
3
|
|
|
3
|
|
1145
|
use MooX::Types::MooseLike::Base qw(:all); |
|
3
|
|
|
|
|
14932
|
|
|
3
|
|
|
|
|
1494
|
|
9
|
3
|
|
|
3
|
|
1929
|
use Mojito::Model::Link; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
use Mojito::Collection::CRUD; |
11
|
|
|
|
|
|
|
use Mojito::Page::Publish; |
12
|
|
|
|
|
|
|
use DateTime; |
13
|
|
|
|
|
|
|
use Syntax::Keyword::Junction qw/ any /; |
14
|
|
|
|
|
|
|
use HTML::Entities; |
15
|
|
|
|
|
|
|
use Data::Dumper::Concise; |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
with('Mojito::Template::Role::Javascript'); |
18
|
|
|
|
|
|
|
with('Mojito::Template::Role::CSS'); |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
=head1 Name |
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
Mojito::Template - the main HTML class |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
=cut |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
has 'template' => ( |
27
|
|
|
|
|
|
|
is => 'rw', |
28
|
|
|
|
|
|
|
lazy => 1, |
29
|
|
|
|
|
|
|
builder => '_build_template', |
30
|
|
|
|
|
|
|
); |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
has 'page_id' => ( |
33
|
|
|
|
|
|
|
is => 'rw', |
34
|
|
|
|
|
|
|
); |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
# Allow Template to receive a db attribute upon construction |
37
|
|
|
|
|
|
|
# currently it's passed to the $mojito->tmpl handler |
38
|
|
|
|
|
|
|
has 'db' => ( is => 'ro', lazy => 1); |
39
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
has 'base_url' => ( is => 'rw', ); |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
has linker => ( |
43
|
|
|
|
|
|
|
is => 'ro', |
44
|
|
|
|
|
|
|
isa => sub { die "Need a Link Model object. Have ref($_[0]) instead." unless $_[0]->isa('Mojito::Model::Link') }, |
45
|
|
|
|
|
|
|
lazy => 1, |
46
|
|
|
|
|
|
|
handles => { |
47
|
|
|
|
|
|
|
recent_links_view => 'get_recent_links', |
48
|
|
|
|
|
|
|
collection_page_view => 'view_collection_page', |
49
|
|
|
|
|
|
|
select_collection_pages_view => 'view_selectable_page_list', |
50
|
|
|
|
|
|
|
sort_collection_pages_view => 'view_sortable_page_list', |
51
|
|
|
|
|
|
|
collections_index_view => 'view_collections_index', |
52
|
|
|
|
|
|
|
get_docs_for_month => 'get_docs_for_month', |
53
|
|
|
|
|
|
|
get_collection_list => 'get_collections_index_link_data', |
54
|
|
|
|
|
|
|
}, |
55
|
|
|
|
|
|
|
writer => '_set_linker', |
56
|
|
|
|
|
|
|
); |
57
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
has collector => ( |
59
|
|
|
|
|
|
|
is => 'ro', |
60
|
|
|
|
|
|
|
isa => sub { die "Need a Collection::CRUD object" unless $_[0]->isa('Mojito::Collection::CRUD') }, |
61
|
|
|
|
|
|
|
'default' => sub { my $self = shift; return Mojito::Collection::CRUD->new(config => $self->config, db => $self->db) }, |
62
|
|
|
|
|
|
|
lazy => 1, |
63
|
|
|
|
|
|
|
); |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
has 'home_page' => ( |
66
|
|
|
|
|
|
|
is => 'rw', |
67
|
|
|
|
|
|
|
lazy => 1, |
68
|
|
|
|
|
|
|
builder => '_build_home_page', |
69
|
|
|
|
|
|
|
); |
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
has 'collect_page_form' => ( |
72
|
|
|
|
|
|
|
is => 'ro', |
73
|
|
|
|
|
|
|
lazy => 1, |
74
|
|
|
|
|
|
|
builder => '_build_collect_page_form', |
75
|
|
|
|
|
|
|
); |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
has 'collections_index' => ( |
78
|
|
|
|
|
|
|
is => 'ro', |
79
|
|
|
|
|
|
|
lazy => 1, |
80
|
|
|
|
|
|
|
builder => '_build_collections_index', |
81
|
|
|
|
|
|
|
); |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
has 'recent_links' => ( |
84
|
|
|
|
|
|
|
is => 'ro', |
85
|
|
|
|
|
|
|
lazy => 1, |
86
|
|
|
|
|
|
|
builder => '_build_recent_links', |
87
|
|
|
|
|
|
|
); |
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
has 'wiki_language_selection' => ( |
90
|
|
|
|
|
|
|
is => 'ro', |
91
|
|
|
|
|
|
|
lazy => 1, |
92
|
|
|
|
|
|
|
builder => '_build_wiki_language_selection', |
93
|
|
|
|
|
|
|
); |
94
|
|
|
|
|
|
|
has js_css_html => ( |
95
|
|
|
|
|
|
|
is => 'ro', |
96
|
|
|
|
|
|
|
isa => Value, |
97
|
|
|
|
|
|
|
lazy => 1, |
98
|
|
|
|
|
|
|
default => sub { my $self = shift; join "\n", @{$self->javascript_html}, @{$self->css_html} } |
99
|
|
|
|
|
|
|
); |
100
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
has page_wrap_end => ( |
102
|
|
|
|
|
|
|
is => 'ro', |
103
|
|
|
|
|
|
|
lazy => 1, |
104
|
|
|
|
|
|
|
builder => '_build_page_wrap_end', |
105
|
|
|
|
|
|
|
); |
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
sub _build_template { |
108
|
|
|
|
|
|
|
my $self = shift; |
109
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
my $base_url = $self->base_url; |
111
|
|
|
|
|
|
|
my $mojito_version = $self->config->{VERSION}; |
112
|
|
|
|
|
|
|
my $wiki_language_selection = $self->wiki_language_selection; |
113
|
|
|
|
|
|
|
my $js_css = $self->js_css_html; |
114
|
|
|
|
|
|
|
my $page_id = $self->page_id||''; |
115
|
|
|
|
|
|
|
my $publisher = Mojito::Page::Publish->new(config => $self->config); |
116
|
|
|
|
|
|
|
my $publish_form = ''; |
117
|
|
|
|
|
|
|
$publish_form = $publisher->publish_form||'' if $page_id; |
118
|
|
|
|
|
|
|
my @collections_for_page = $self->collector->editer->collections_for_page($page_id); |
119
|
|
|
|
|
|
|
my $collection_list = $self->get_collection_list||[]; |
120
|
|
|
|
|
|
|
my $collection_size = scalar @{$collection_list} + 1; |
121
|
|
|
|
|
|
|
my $collection_options = "<select id='collection_select' name='collection_select' |
122
|
|
|
|
|
|
|
multiple='multiple' size='${collection_size}' form='editForm' style='font-size: 1.00em; display:none;' >\n"; |
123
|
|
|
|
|
|
|
$collection_options .= "<option value='0'>- No Collection -</option>\n"; |
124
|
|
|
|
|
|
|
foreach my $collection (@{$collection_list}) { |
125
|
|
|
|
|
|
|
$collection_options .= "<option value='$collection->{id}'"; |
126
|
|
|
|
|
|
|
if ($collection->{id} eq any(@collections_for_page)) { |
127
|
|
|
|
|
|
|
$collection_options .= " selected='selected' "; |
128
|
|
|
|
|
|
|
} |
129
|
|
|
|
|
|
|
$collection_options .= ">$collection->{title}</option>\n"; |
130
|
|
|
|
|
|
|
} |
131
|
|
|
|
|
|
|
$collection_options .= "</select>\n"; |
132
|
|
|
|
|
|
|
my $edit_page = <<"END_HTML"; |
133
|
|
|
|
|
|
|
<!doctype html> |
134
|
|
|
|
|
|
|
<html> |
135
|
|
|
|
|
|
|
<head> |
136
|
|
|
|
|
|
|
<meta charset=utf-8> |
137
|
|
|
|
|
|
|
<meta http-equiv="powered by" content="Mojito $mojito_version" /> |
138
|
|
|
|
|
|
|
<title>Mojito page</title> |
139
|
|
|
|
|
|
|
$js_css |
140
|
|
|
|
|
|
|
<script></script> |
141
|
|
|
|
|
|
|
<style></style> |
142
|
|
|
|
|
|
|
</head> |
143
|
|
|
|
|
|
|
<body class="html_body"> |
144
|
|
|
|
|
|
|
<header> |
145
|
|
|
|
|
|
|
<nav id="edit_link" class="edit_link"></nav> |
146
|
|
|
|
|
|
|
<nav id="new_link" class="new_link"> <a href=${base_url}page>New</a></nav> |
147
|
|
|
|
|
|
|
</header> |
148
|
|
|
|
|
|
|
<section id="message_area"></section> |
149
|
|
|
|
|
|
|
<section id="collection_nav_area"></section> |
150
|
|
|
|
|
|
|
<article id="body_wrapper"> |
151
|
|
|
|
|
|
|
<input type="hidden" id ="page_id" name="page_id" value="$page_id" /> |
152
|
|
|
|
|
|
|
<section id="edit_area"> |
153
|
|
|
|
|
|
|
<span style="font-size: 0.82em;"><label id="feeds_label">feeds+</label> |
154
|
|
|
|
|
|
|
<input id="feeds" name="feeds" form="editForm" value="" size="12" style="font-size: 1.00em; display:none;" /> |
155
|
|
|
|
|
|
|
</span> |
156
|
|
|
|
|
|
|
<span style="font-size: 0.82em;"> |
157
|
|
|
|
|
|
|
<label id="collection_label">collections+</label> |
158
|
|
|
|
|
|
|
$collection_options |
159
|
|
|
|
|
|
|
</span> |
160
|
|
|
|
|
|
|
<form id="editForm" action="" accept-charset="UTF-8" method="post"> |
161
|
|
|
|
|
|
|
<div id="wiki_language"> |
162
|
|
|
|
|
|
|
$wiki_language_selection |
163
|
|
|
|
|
|
|
</div> |
164
|
|
|
|
|
|
|
<input id="mongo_id" name="mongo_id" type="hidden" form="editForm" value="" /> |
165
|
|
|
|
|
|
|
<input id="wiki_language" name="wiki_language" type="hidden" form="editForm" value="" /> |
166
|
|
|
|
|
|
|
<input id="page_title" name="page_title" type="hidden" form="editForm" value="" /> |
167
|
|
|
|
|
|
|
<textarea id="content" name="content" rows="32" required="required"/></textarea> |
168
|
|
|
|
|
|
|
<input id="commit_message" name="commit_message" value="commit message" onclick="this.value == 'commit message' ? this.value = '' : true"/> |
169
|
|
|
|
|
|
|
<input id="submit_save" name="submit" type="submit" value="Save" style="font-size: 66.7%;" /> |
170
|
|
|
|
|
|
|
<input id="submit_view" name="submit" type="submit" value="Done" style="font-size: 66.7%;" /> |
171
|
|
|
|
|
|
|
<label style="font-size: 0.667em;" for="public" title="Check if you want a publicly viewable page" > |
172
|
|
|
|
|
|
|
<input id="public" name="public" value="1" type="checkbox" style="font-size: 0.667em;" /> |
173
|
|
|
|
|
|
|
public |
174
|
|
|
|
|
|
|
</label> |
175
|
|
|
|
|
|
|
</form> |
176
|
|
|
|
|
|
|
</section> |
177
|
|
|
|
|
|
|
<section id="view_area" class="view_area_edit_mode"></section> |
178
|
|
|
|
|
|
|
<nav id="side"> |
179
|
|
|
|
|
|
|
<section id="search_area"> |
180
|
|
|
|
|
|
|
<form action=${base_url}search method=POST> |
181
|
|
|
|
|
|
|
<input type="text" name="word" value="Search" onclick="this.value == 'Search' ? this.value = '' : true"/> |
182
|
|
|
|
|
|
|
</form> |
183
|
|
|
|
|
|
|
</section><br /> |
184
|
|
|
|
|
|
|
<section id="publish_area">$publish_form</section> |
185
|
|
|
|
|
|
|
<section id="collections_area"></section> |
186
|
|
|
|
|
|
|
<section id="calendar_area"><a href="${base_url}calendar">Calendar</a></section> |
187
|
|
|
|
|
|
|
<section id="recent_area"></section> |
188
|
|
|
|
|
|
|
</nav> |
189
|
|
|
|
|
|
|
</article> |
190
|
|
|
|
|
|
|
<footer id="footer_area"> |
191
|
|
|
|
|
|
|
<nav id="edit_link" class="edit_link"></nav> |
192
|
|
|
|
|
|
|
<nav id="new_link" class="new_link"> <a href=${base_url}page>New</a></nav> |
193
|
|
|
|
|
|
|
</footer> |
194
|
|
|
|
|
|
|
</body> |
195
|
|
|
|
|
|
|
</html> |
196
|
|
|
|
|
|
|
END_HTML |
197
|
|
|
|
|
|
|
$edit_page =~ s/<script><\/script>/<script>mojito.base_url = '${base_url}';<\/script>/s; |
198
|
|
|
|
|
|
|
return $edit_page; |
199
|
|
|
|
|
|
|
} |
200
|
|
|
|
|
|
|
|
201
|
|
|
|
|
|
|
sub _build_wiki_language_selection { |
202
|
|
|
|
|
|
|
my ($self) = @_; |
203
|
|
|
|
|
|
|
|
204
|
|
|
|
|
|
|
my $selection; |
205
|
|
|
|
|
|
|
my $default_wiki_language =$self->config->{default_wiki_language}||'markdown'; |
206
|
|
|
|
|
|
|
foreach my $language (qw/textile markdown creole html pod/) { |
207
|
|
|
|
|
|
|
if ($language =~ m/$default_wiki_language/) { |
208
|
|
|
|
|
|
|
$selection .= qq{<input type="radio" id="$language" name="wiki_language" value="$language" checked="checked" /><label for="$language">$language</label>}; |
209
|
|
|
|
|
|
|
} |
210
|
|
|
|
|
|
|
else { |
211
|
|
|
|
|
|
|
$selection .= qq{<input type="radio" id="$language" name="wiki_language" value="$language" /><label for="$language">$language</label>}; |
212
|
|
|
|
|
|
|
} |
213
|
|
|
|
|
|
|
} |
214
|
|
|
|
|
|
|
return $selection; |
215
|
|
|
|
|
|
|
} |
216
|
|
|
|
|
|
|
|
217
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
sub page_wrap_start { |
219
|
|
|
|
|
|
|
my ($self, $title) = @_; |
220
|
|
|
|
|
|
|
my $mojito_version = $self->config->{VERSION}; |
221
|
|
|
|
|
|
|
my $js_css = $self->js_css_html; |
222
|
|
|
|
|
|
|
my $page_start = <<"START_HTML"; |
223
|
|
|
|
|
|
|
<!doctype html> |
224
|
|
|
|
|
|
|
<html> |
225
|
|
|
|
|
|
|
<head> |
226
|
|
|
|
|
|
|
<meta charset=utf-8> |
227
|
|
|
|
|
|
|
<meta name="application-name" content="Mojito $mojito_version" /> |
228
|
|
|
|
|
|
|
<title>$title</title> |
229
|
|
|
|
|
|
|
$js_css |
230
|
|
|
|
|
|
|
<script></script> |
231
|
|
|
|
|
|
|
<style></style> |
232
|
|
|
|
|
|
|
</head> |
233
|
|
|
|
|
|
|
<body class="html_body"> |
234
|
|
|
|
|
|
|
<section id="message_area"></section> |
235
|
|
|
|
|
|
|
<article id="body_wrapper"> |
236
|
|
|
|
|
|
|
START_HTML |
237
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
return $page_start; |
239
|
|
|
|
|
|
|
} |
240
|
|
|
|
|
|
|
|
241
|
|
|
|
|
|
|
sub page_wrap_start_vanilla { |
242
|
|
|
|
|
|
|
my ($self, $title) = @_; |
243
|
|
|
|
|
|
|
my $mojito_version = $self->config->{VERSION}; |
244
|
|
|
|
|
|
|
my $static_url = $self->config->{static_url}; |
245
|
|
|
|
|
|
|
my $page_start = <<"START_HTML"; |
246
|
|
|
|
|
|
|
<!doctype html> |
247
|
|
|
|
|
|
|
<html> |
248
|
|
|
|
|
|
|
<head> |
249
|
|
|
|
|
|
|
<meta charset=utf-8> |
250
|
|
|
|
|
|
|
<meta name="application-name" content="Mojito $mojito_version" /> |
251
|
|
|
|
|
|
|
<title>$title</title> |
252
|
|
|
|
|
|
|
<link href=${static_url}css/mojito.css type=text/css rel=stylesheet /> |
253
|
|
|
|
|
|
|
</head> |
254
|
|
|
|
|
|
|
<body class="vanilla_body"> |
255
|
|
|
|
|
|
|
<article id="body_wrapper_vanilla"> |
256
|
|
|
|
|
|
|
START_HTML |
257
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
return $page_start; |
259
|
|
|
|
|
|
|
} |
260
|
|
|
|
|
|
|
|
261
|
|
|
|
|
|
|
sub _build_page_wrap_end { |
262
|
|
|
|
|
|
|
my $self = shift; |
263
|
|
|
|
|
|
|
|
264
|
|
|
|
|
|
|
my $page_end =<<'END_HTML'; |
265
|
|
|
|
|
|
|
|
266
|
|
|
|
|
|
|
</article> |
267
|
|
|
|
|
|
|
</body> |
268
|
|
|
|
|
|
|
</html> |
269
|
|
|
|
|
|
|
END_HTML |
270
|
|
|
|
|
|
|
|
271
|
|
|
|
|
|
|
return $page_end; |
272
|
|
|
|
|
|
|
} |
273
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
=head2 wrap_page |
275
|
|
|
|
|
|
|
|
276
|
|
|
|
|
|
|
Wrap a page body with start and end HTML. |
277
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
=cut |
279
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
sub wrap_page { |
281
|
|
|
|
|
|
|
my ($self, $page_body, $title) = @_; |
282
|
|
|
|
|
|
|
$title //= 'Mojito page'; |
283
|
|
|
|
|
|
|
$page_body //= 'Empty page'; |
284
|
|
|
|
|
|
|
return ($self->page_wrap_start($title) . $page_body . $self->page_wrap_end); |
285
|
|
|
|
|
|
|
} |
286
|
|
|
|
|
|
|
|
287
|
|
|
|
|
|
|
=head2 wrap_page_vanilla |
288
|
|
|
|
|
|
|
|
289
|
|
|
|
|
|
|
Wrap a page body with start and end HTML, and NO Javascript or CSS links |
290
|
|
|
|
|
|
|
|
291
|
|
|
|
|
|
|
=cut |
292
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
sub wrap_page_vanilla { |
294
|
|
|
|
|
|
|
my ($self, $page_body, $title) = @_; |
295
|
|
|
|
|
|
|
$title //= 'Mojito page'; |
296
|
|
|
|
|
|
|
$page_body //= 'Empty page'; |
297
|
|
|
|
|
|
|
return ($self->page_wrap_start_vanilla($title) . $page_body . $self->page_wrap_end); |
298
|
|
|
|
|
|
|
} |
299
|
|
|
|
|
|
|
|
300
|
|
|
|
|
|
|
sub _build_collect_page_form { |
301
|
|
|
|
|
|
|
my $self = shift; |
302
|
|
|
|
|
|
|
return $self->wrap_page($self->select_collection_pages_view); |
303
|
|
|
|
|
|
|
} |
304
|
|
|
|
|
|
|
|
305
|
|
|
|
|
|
|
sub _build_collections_index { |
306
|
|
|
|
|
|
|
my $self = shift; |
307
|
|
|
|
|
|
|
return $self->wrap_page($self->collections_index_view); |
308
|
|
|
|
|
|
|
} |
309
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
sub _build_recent_links { |
311
|
|
|
|
|
|
|
my $self = shift; |
312
|
|
|
|
|
|
|
return $self->wrap_page($self->recent_links_view({want_delete_link => 1})); |
313
|
|
|
|
|
|
|
} |
314
|
|
|
|
|
|
|
|
315
|
|
|
|
|
|
|
=head2 sort_collection_form |
316
|
|
|
|
|
|
|
|
317
|
|
|
|
|
|
|
A form to sort a collection of pages. |
318
|
|
|
|
|
|
|
|
319
|
|
|
|
|
|
|
=cut |
320
|
|
|
|
|
|
|
|
321
|
|
|
|
|
|
|
sub sort_collection_form { |
322
|
|
|
|
|
|
|
my ($self, $params) = (shift, shift); |
323
|
|
|
|
|
|
|
return $self->wrap_page($self->sort_collection_pages_view({ collection_id => $params->{id} })); |
324
|
|
|
|
|
|
|
} |
325
|
|
|
|
|
|
|
|
326
|
|
|
|
|
|
|
=head2 collection_page |
327
|
|
|
|
|
|
|
|
328
|
|
|
|
|
|
|
Given a collection id, show a list of belonging pages. |
329
|
|
|
|
|
|
|
|
330
|
|
|
|
|
|
|
=cut |
331
|
|
|
|
|
|
|
|
332
|
|
|
|
|
|
|
sub collection_page { |
333
|
|
|
|
|
|
|
my ($self, $params) = (shift, shift); |
334
|
|
|
|
|
|
|
|
335
|
|
|
|
|
|
|
my $base_url = $self->base_url; |
336
|
|
|
|
|
|
|
$base_url .= 'public/' if $params->{public}; |
337
|
|
|
|
|
|
|
my $collector = Mojito::Collection::CRUD->new(config => $self->config, db => $self->db); |
338
|
|
|
|
|
|
|
my $collection = $collector->read( $params->{id} ); |
339
|
|
|
|
|
|
|
return $self->wrap_page( |
340
|
|
|
|
|
|
|
$self->collection_page_view( { collection_id => $params->{id}, is_public => $params->{public} }), |
341
|
|
|
|
|
|
|
$collection->{collection_name}, |
342
|
|
|
|
|
|
|
); |
343
|
|
|
|
|
|
|
} |
344
|
|
|
|
|
|
|
|
345
|
|
|
|
|
|
|
sub _build_home_page { |
346
|
|
|
|
|
|
|
my $self = shift; |
347
|
|
|
|
|
|
|
|
348
|
|
|
|
|
|
|
my $base_url = $self->base_url; |
349
|
|
|
|
|
|
|
my $mojito_version = $self->config->{VERSION}; |
350
|
|
|
|
|
|
|
my $js_css = $self->js_css_html; |
351
|
|
|
|
|
|
|
my $home_page = <<"END_HTML"; |
352
|
|
|
|
|
|
|
<!doctype html> |
353
|
|
|
|
|
|
|
<html> |
354
|
|
|
|
|
|
|
<head> |
355
|
|
|
|
|
|
|
<meta charset=utf-8> |
356
|
|
|
|
|
|
|
<meta name="application-name" content="Mojito $mojito_version" /> |
357
|
|
|
|
|
|
|
<title>Mojito page</title> |
358
|
|
|
|
|
|
|
$js_css |
359
|
|
|
|
|
|
|
<script></script> |
360
|
|
|
|
|
|
|
<style></style> |
361
|
|
|
|
|
|
|
</head> |
362
|
|
|
|
|
|
|
<body class=html_body> |
363
|
|
|
|
|
|
|
<header> |
364
|
|
|
|
|
|
|
<nav id="new_link" class="new_link"> <a href=${base_url}page>New</a></nav> |
365
|
|
|
|
|
|
|
</header> |
366
|
|
|
|
|
|
|
<article id="body_wrapper"> |
367
|
|
|
|
|
|
|
<nav id="side"> |
368
|
|
|
|
|
|
|
<section id="search_area"><form action=${base_url}search method=POST><input type="text" name="word" value="Search" onclick="this.value == 'Search' ? this.value = '' : true" /></form></section><br /> |
369
|
|
|
|
|
|
|
<section id="recent_area"></section> |
370
|
|
|
|
|
|
|
</nav> |
371
|
|
|
|
|
|
|
</article> |
372
|
|
|
|
|
|
|
<footer id="footer_area"> |
373
|
|
|
|
|
|
|
<nav id="new_link" class="new_link"> <a href=${base_url}page>New</a></nav> |
374
|
|
|
|
|
|
|
</footer> |
375
|
|
|
|
|
|
|
</body> |
376
|
|
|
|
|
|
|
</html> |
377
|
|
|
|
|
|
|
END_HTML |
378
|
|
|
|
|
|
|
|
379
|
|
|
|
|
|
|
return $home_page; |
380
|
|
|
|
|
|
|
} |
381
|
|
|
|
|
|
|
|
382
|
|
|
|
|
|
|
=head1 Methods |
383
|
|
|
|
|
|
|
|
384
|
|
|
|
|
|
|
=head2 fillin_edit_page |
385
|
|
|
|
|
|
|
|
386
|
|
|
|
|
|
|
Get the contents of the edit page proper given the starting template and some data. |
387
|
|
|
|
|
|
|
|
388
|
|
|
|
|
|
|
=cut |
389
|
|
|
|
|
|
|
|
390
|
|
|
|
|
|
|
sub fillin_edit_page { |
391
|
|
|
|
|
|
|
my ( $self, $page, $page_view, $mongo_id ) = @_; |
392
|
|
|
|
|
|
|
|
393
|
|
|
|
|
|
|
# Encode source content with HTML entities since it will be displayed in a textarea |
394
|
|
|
|
|
|
|
my $page_source = encode_entities($page->{page_source}); |
395
|
|
|
|
|
|
|
my $wiki_language = $page->{default_format}; |
396
|
|
|
|
|
|
|
my $page_title = $page->{title}||'no title'; |
397
|
|
|
|
|
|
|
my @feeds = (); |
398
|
|
|
|
|
|
|
if (ref($page->{feeds}) eq 'ARRAY') { |
399
|
|
|
|
|
|
|
@feeds = @{$page->{feeds}}; |
400
|
|
|
|
|
|
|
} |
401
|
|
|
|
|
|
|
my $feeds = join ':', @feeds; |
402
|
|
|
|
|
|
|
my $public = $page->{public}; |
403
|
|
|
|
|
|
|
|
404
|
|
|
|
|
|
|
# Set page_id for the template |
405
|
|
|
|
|
|
|
$self->page_id($mongo_id); |
406
|
|
|
|
|
|
|
my $output = $self->template; |
407
|
|
|
|
|
|
|
my $base_url = $self->base_url; |
408
|
|
|
|
|
|
|
$output =~ |
409
|
|
|
|
|
|
|
s/<script><\/script>/<script>mojito.preview_url = '${base_url}preview';<\/script>/s; |
410
|
|
|
|
|
|
|
# Set some form values |
411
|
|
|
|
|
|
|
$output =~ s/(<input id="mongo_id".*?value=)""/$1"${mongo_id}"/si; |
412
|
|
|
|
|
|
|
# $output =~ s/(<input .*? id ="page_id" .*? value=)""/$1"${mongo_id}"/si; |
413
|
|
|
|
|
|
|
$output =~ s/(<input id="wiki_language".*?value=)""/$1"${wiki_language}"/si; |
414
|
|
|
|
|
|
|
$output =~ s/(<input id="page_title".*?value=)""/$1"${page_title}"/si; |
415
|
|
|
|
|
|
|
$output =~ s/(<input id="feeds".*?value=)""/$1"${feeds}"/si; |
416
|
|
|
|
|
|
|
if ($public) { |
417
|
|
|
|
|
|
|
$output =~ s/(<input id="public")/$1 checked="checked"/si; |
418
|
|
|
|
|
|
|
} |
419
|
|
|
|
|
|
|
$output =~ |
420
|
|
|
|
|
|
|
s/(<textarea\s+id="content"[^>]*>)<\/textarea>/$1${page_source}<\/textarea>/si; |
421
|
|
|
|
|
|
|
$output =~ |
422
|
|
|
|
|
|
|
s/(<section\s+id="view_area"[^>]*>)<\/section>/$1${page_view}<\/section>/si; |
423
|
|
|
|
|
|
|
|
424
|
|
|
|
|
|
|
# An Experiment in Design: take out the save button, because we have autosave every few seconds |
425
|
|
|
|
|
|
|
$output =~ s/<input id="submit_save".*?>//sig; |
426
|
|
|
|
|
|
|
|
427
|
|
|
|
|
|
|
# Remove side, recent area and wiki_language (for create only) |
428
|
|
|
|
|
|
|
$output =~ s/<nav id="side">.*?<\/nav>//si; |
429
|
|
|
|
|
|
|
# $output =~ s/<section id="recent_area".*?><\/section>//si; |
430
|
|
|
|
|
|
|
$output =~ s/<div id="wiki_language".*?>.*?<\/div>//si; |
431
|
|
|
|
|
|
|
$output =~ s|(<section id="edit_area">)|$1\n<button id="toggle_view">Toggle View</button>|si; |
432
|
|
|
|
|
|
|
|
433
|
|
|
|
|
|
|
# Remove edit and new links |
434
|
|
|
|
|
|
|
$output =~ s/<nav id="edit_link".*?><\/nav>//sig; |
435
|
|
|
|
|
|
|
$output =~ s/<nav id="new_link".*?>.*?<\/nav>//sig; |
436
|
|
|
|
|
|
|
|
437
|
|
|
|
|
|
|
# body with no style |
438
|
|
|
|
|
|
|
$output =~ s/<body.*?>/<body>/si; |
439
|
|
|
|
|
|
|
|
440
|
|
|
|
|
|
|
# Give the page a title |
441
|
|
|
|
|
|
|
if ($page_title) { |
442
|
|
|
|
|
|
|
$output =~ s/<title>.*?<\/title>/<title>${page_title}<\/title>/si; |
443
|
|
|
|
|
|
|
} |
444
|
|
|
|
|
|
|
return $output; |
445
|
|
|
|
|
|
|
} |
446
|
|
|
|
|
|
|
|
447
|
|
|
|
|
|
|
=head2 fillin_create_page |
448
|
|
|
|
|
|
|
|
449
|
|
|
|
|
|
|
Get the contents of the create page proper given the starting template and some data. |
450
|
|
|
|
|
|
|
|
451
|
|
|
|
|
|
|
=cut |
452
|
|
|
|
|
|
|
|
453
|
|
|
|
|
|
|
sub fillin_create_page { |
454
|
|
|
|
|
|
|
my ($self) = @_; |
455
|
|
|
|
|
|
|
|
456
|
|
|
|
|
|
|
my $output = $self->template; |
457
|
|
|
|
|
|
|
my $base_url = $self->base_url; |
458
|
|
|
|
|
|
|
|
459
|
|
|
|
|
|
|
# Set mojito preiview_url variable |
460
|
|
|
|
|
|
|
$output =~ |
461
|
|
|
|
|
|
|
s/<script><\/script>/<script>mojito.preview_url = '${base_url}preview'<\/script>/; |
462
|
|
|
|
|
|
|
|
463
|
|
|
|
|
|
|
# Take out view button and change save to create. |
464
|
|
|
|
|
|
|
$output =~ s/<input id="submit_view".*?>//; |
465
|
|
|
|
|
|
|
$output =~ s/<input id="submit_save"(.*?>)/<input id="submit_create"$1/; |
466
|
|
|
|
|
|
|
$output =~ s/(id="submit_create".*?value=)"Save"/$1"Create"/i; |
467
|
|
|
|
|
|
|
|
468
|
|
|
|
|
|
|
# Remove side nav area |
469
|
|
|
|
|
|
|
$output =~ s/<nav id="side">.*?<\/nav>//si; |
470
|
|
|
|
|
|
|
|
471
|
|
|
|
|
|
|
# Remove wiki_language hidden input (for edit) |
472
|
|
|
|
|
|
|
$output =~ s/<input id="wiki_language".*?\/>//sig; |
473
|
|
|
|
|
|
|
|
474
|
|
|
|
|
|
|
# Remove edit and new links |
475
|
|
|
|
|
|
|
$output =~ s/<nav id="edit_link".*?><\/nav>//sig; |
476
|
|
|
|
|
|
|
$output =~ s/<nav id="new_link".*?>.*?<\/nav>//sig; |
477
|
|
|
|
|
|
|
|
478
|
|
|
|
|
|
|
# body with no style |
479
|
|
|
|
|
|
|
$output =~ s/<body.*?>/<body>/si; |
480
|
|
|
|
|
|
|
|
481
|
|
|
|
|
|
|
return $output; |
482
|
|
|
|
|
|
|
} |
483
|
|
|
|
|
|
|
|
484
|
|
|
|
|
|
|
sub calendar_for_month { |
485
|
|
|
|
|
|
|
my $self = shift; |
486
|
|
|
|
|
|
|
my %args = ref($_[0]) ? %{ $_[0] } : @_; |
487
|
|
|
|
|
|
|
my ($month, $year, $title) = @args{qw/month year title/}; |
488
|
|
|
|
|
|
|
my $base_url = $self->base_url; |
489
|
|
|
|
|
|
|
#$title ||= 'Monthly Notes'; |
490
|
|
|
|
|
|
|
my %monthly_docs = $self->get_docs_for_month($month, $year); |
491
|
|
|
|
|
|
|
my ($m_j, $m_k, $y_j, $y_k) = next_and_previous_month_year($month, $year); |
492
|
|
|
|
|
|
|
my $calendar = "<section id='calendar_month'>\n"; |
493
|
|
|
|
|
|
|
$calendar .= "<h1>${title}</h1>\n" if $title; |
494
|
|
|
|
|
|
|
$calendar .= "<table class='monthly_calendar'>"; |
495
|
|
|
|
|
|
|
|
496
|
|
|
|
|
|
|
# Got to turn off highlight of current day else we'd have to strip the \b's around it. |
497
|
|
|
|
|
|
|
# TODO: Allow variable path to cal |
498
|
|
|
|
|
|
|
open(my $CAL, '-|', "/usr/bin/cal -h $month $year") |
499
|
|
|
|
|
|
|
|| die "Can't open /usr/bin/cal\n"; |
500
|
|
|
|
|
|
|
while (<$CAL>) { |
501
|
|
|
|
|
|
|
|
502
|
|
|
|
|
|
|
last if /^\s+$/; ## ignore cal's terminating blank line |
503
|
|
|
|
|
|
|
s/^\s*(.*?)\s*$/$1/; ## trim whitespace |
504
|
|
|
|
|
|
|
|
505
|
|
|
|
|
|
|
if ($. == 1) { |
506
|
|
|
|
|
|
|
$calendar .= |
507
|
|
|
|
|
|
|
"<tr><th class='previous' colspan='3'><a href='${base_url}calendar/year/${y_j}/month/${m_j}'>Previous Month</a></th> |
508
|
|
|
|
|
|
|
<th class='calendar_month' colspan='1'>$_</th> |
509
|
|
|
|
|
|
|
<th class='next' colspan='3'><a href='${base_url}calendar/year/${y_k}/month/${m_k}'>Next Month</a></th></tr>\n"; |
510
|
|
|
|
|
|
|
next; |
511
|
|
|
|
|
|
|
} |
512
|
|
|
|
|
|
|
|
513
|
|
|
|
|
|
|
my $tag; |
514
|
|
|
|
|
|
|
if ($. == 2) { |
515
|
|
|
|
|
|
|
$tag = "th class='weekdays'"; |
516
|
|
|
|
|
|
|
} |
517
|
|
|
|
|
|
|
else { $tag = "td" } |
518
|
|
|
|
|
|
|
|
519
|
|
|
|
|
|
|
## make a row, padding first week of the month as necessary |
520
|
|
|
|
|
|
|
my @data = (); |
521
|
|
|
|
|
|
|
@data = split(/\s+/, $_); |
522
|
|
|
|
|
|
|
$calendar .= "<tr>\n"; |
523
|
|
|
|
|
|
|
if ($. == 3) { |
524
|
|
|
|
|
|
|
for (1 .. 6 - $#data) { $calendar .= "<td> </td>\n"; } |
525
|
|
|
|
|
|
|
} |
526
|
|
|
|
|
|
|
for my $i (0 .. $#data) { |
527
|
|
|
|
|
|
|
$calendar .= "<$tag>$data[$i]"; |
528
|
|
|
|
|
|
|
# Just process the digits found. |
529
|
|
|
|
|
|
|
next if ($data[$i] !~ m/^\d+$/); |
530
|
|
|
|
|
|
|
foreach my $ref (@{ $monthly_docs{ $data[$i] } }) { |
531
|
|
|
|
|
|
|
# Make srue we have some type of title |
532
|
|
|
|
|
|
|
$ref->{title} ||= 'No title found'; |
533
|
|
|
|
|
|
|
$calendar .= |
534
|
|
|
|
|
|
|
"<div class='calendar_note'><a href='${base_url}page/$ref->{id}'>* $ref->{title}</a></div>"; |
535
|
|
|
|
|
|
|
} |
536
|
|
|
|
|
|
|
$calendar .= "</td>\n"; |
537
|
|
|
|
|
|
|
} |
538
|
|
|
|
|
|
|
$calendar .= "</tr>\n"; |
539
|
|
|
|
|
|
|
} |
540
|
|
|
|
|
|
|
close($CAL); |
541
|
|
|
|
|
|
|
$calendar .= "</table>\n</section>\n"; |
542
|
|
|
|
|
|
|
|
543
|
|
|
|
|
|
|
return $calendar; |
544
|
|
|
|
|
|
|
} |
545
|
|
|
|
|
|
|
|
546
|
|
|
|
|
|
|
sub calendar_month_page { |
547
|
|
|
|
|
|
|
my $self = shift; |
548
|
|
|
|
|
|
|
my %args = ref($_[0]) ? %{ $_[0] } : @_; |
549
|
|
|
|
|
|
|
@args{qw/month year/} = get_current_month_year() |
550
|
|
|
|
|
|
|
if not($args{month} && $args{year}); |
551
|
|
|
|
|
|
|
my ($month, $year, $title) = @args{qw/month year title/}; |
552
|
|
|
|
|
|
|
$title ||= "Notes Calendar for $month/$year"; |
553
|
|
|
|
|
|
|
return $self->wrap_page_vanilla($self->calendar_for_month(\%args), $title); |
554
|
|
|
|
|
|
|
} |
555
|
|
|
|
|
|
|
|
556
|
|
|
|
|
|
|
sub get_current_month_year { |
557
|
|
|
|
|
|
|
my $now = DateTime->now; |
558
|
|
|
|
|
|
|
return ($now->month, $now->year); |
559
|
|
|
|
|
|
|
} |
560
|
|
|
|
|
|
|
|
561
|
|
|
|
|
|
|
sub next_and_previous_month_year { |
562
|
|
|
|
|
|
|
my ($month, $year) = @_; |
563
|
|
|
|
|
|
|
## Set up for previous and next month link |
564
|
|
|
|
|
|
|
my ($m_j, $m_k, $y_j, $y_k); |
565
|
|
|
|
|
|
|
if ($month == 12) { |
566
|
|
|
|
|
|
|
$m_j = 11; |
567
|
|
|
|
|
|
|
$m_k = 1; |
568
|
|
|
|
|
|
|
$y_j = $year; |
569
|
|
|
|
|
|
|
$y_k = $year + 1; |
570
|
|
|
|
|
|
|
} |
571
|
|
|
|
|
|
|
elsif ($month == 1) { |
572
|
|
|
|
|
|
|
$m_j = 12; |
573
|
|
|
|
|
|
|
$m_k = 2; |
574
|
|
|
|
|
|
|
$y_j = $year - 1; |
575
|
|
|
|
|
|
|
$y_k = $year; |
576
|
|
|
|
|
|
|
} |
577
|
|
|
|
|
|
|
else { |
578
|
|
|
|
|
|
|
$m_j = $month - 1; |
579
|
|
|
|
|
|
|
$m_k = $month + 1; |
580
|
|
|
|
|
|
|
$y_j = $year; |
581
|
|
|
|
|
|
|
$y_k = $year; |
582
|
|
|
|
|
|
|
} |
583
|
|
|
|
|
|
|
return ($m_j, $m_k, $y_j, $y_k); |
584
|
|
|
|
|
|
|
} |
585
|
|
|
|
|
|
|
|
586
|
|
|
|
|
|
|
sub BUILD { |
587
|
|
|
|
|
|
|
my $self = shift; |
588
|
|
|
|
|
|
|
my $constructor_args_href = shift; |
589
|
|
|
|
|
|
|
|
590
|
|
|
|
|
|
|
# pass the options into the delegatees |
591
|
|
|
|
|
|
|
$self->_set_linker(Mojito::Model::Link->new($constructor_args_href)); |
592
|
|
|
|
|
|
|
} |
593
|
|
|
|
|
|
|
1 |