random changes
[urisagit/CMS-Simple.git] / make_slides / cms.pl
CommitLineData
9e609156 1#!/usr/local/bin/perl
2
3use strict ;
4use warnings ;
5
6use CMS::Simple ;
7use CMS::Simple::Filter::Markup ;
8
9use HTML::Entities;
10use File::Slurp ;
11use Data::Dumper ;
12
13
14my $cont_file = shift @ARGV || 'compshare.cont' ;
15
16
17my @filters = (
18# {
19# name => 'html_escape',
20# tags => [ qw( code ) ],
21# code => \&html_escape,
22# },
23 {
24 name => 'markup',
25 tags => [ qw( text email image ) ],
26 code => \&CMS::Simple::Filter::Markup::filter_markup,
27 },
28) ;
29
30
31my $conf = {
32
33 output_suffix => '.html',
34
35 contents => {
36
37# page_header => 'header.cont',
38# page_footer => 'footer.cont',
39# book => 'compshare.cont',
40 },
41
42 filters => \@filters,
43
44 default_template => 'base_page',
45
46# this maps loaded contents to location in this page's data tree.
47# the location will be multilevel later on
48
49# the page key name is the base name for the output file
50
51 pages => {
52
53 chapters => {
54 template => 'chapters',
55 },
56
57 index => {
58
59 template => 'index',
60 },
61 },
62} ;
63
64
65load_book_content( $conf, $cont_file ) ;
66
67#print Dumper $conf ;
68#print Dumper $conf->{pages} ;
69
70my $cms = CMS::Simple->new( $conf ) ;
71
72$cms->build_all_pages() ;
73
74exit ;
75
76
77sub load_book_content {
78
79 my( $conf, $cont_file ) = @_ ;
80
81 my $cont_text = read_file( "contents/$cont_file" ) ;
82 my $content = CMS::Simple::Parse::parse_content( $cont_text ) ;
83
84 process_book_content( $conf, $content ) ;
85
86#print Dumper $content ;
87
88}
89
90sub process_book_content {
91
92 my( $conf, $book_cont ) = @_ ;
93
94 my $book_title = $book_cont->{book}{title} ;
95
96 my $chap_conts = $book_cont->{chapter} ;
97 $chap_conts = [ $chap_conts ] unless ref $chap_conts eq 'ARRAY' ;
98
99 my $chap_num = '01' ;
100
101 foreach my $chap_cont ( @{$chap_conts} ) {
102
103 $chap_cont->{number} = $chap_num++ ;
104 $chap_cont->{book_title} = $book_title ;
105
106 process_chap_content( $conf, $chap_cont ) ;
107 }
108
109 process_index_page( $conf, $chap_conts ) ;
110
111#print Dumper $conf ;
112
113}
114
115sub process_index_page {
116
117 my( $conf, $chap_conts ) = @_ ;
118
119 my $index_cont = $conf->{pages}{index}{contents} ||= {} ;
120
121 foreach my $chap_cont ( @{$chap_conts} ) {
122
123 my $page_titles = $chap_cont->{page_title} ;
124
125 push( @{$index_cont->{chapter}}, {
126
127 chap_title => $chap_cont->{title},
128 chap_num => $chap_cont->{number},
129 page => $page_titles,
130 } ) ;
131 }
132
133print Dumper $index_cont ;
134
135}
136
137
138
139sub process_chap_content {
140
141 my( $conf, $chap_data ) = @_ ;
142
143 my $chap_title = $chap_data->{title} ;
144
145 my $chap_page_cont = $conf->{pages}{chapters}{contents} ||= {} ;
146
147 push( @{$chap_page_cont->{chap_title}}, {
148 number => $chap_data->{number},
149 title => $chap_title
150 } ) ;
151
152 my $page_conts = $chap_data->{page} ;
153 $page_conts = [ $page_conts ] unless ref $page_conts eq 'ARRAY' ;
154
155 my $page_num = '01' ;
156
157 foreach my $page_cont ( @{$page_conts} ) {
158
159 $page_cont->{number} = $page_num++ ;
160
161#print Dumper $page_cont ;
162
163 process_page_content( $conf, $chap_data, $page_cont ) ;
164 }
165}
166
167
168sub process_page_content {
169
170 my( $conf, $chap_data, $page_data ) = @_ ;
171
172 my $chap_title = $chap_data->{title} ;
173 my $page_title = $page_data->{title} ;
174
175
176#print "TITLE $page_title\n" ;
177
178 my $chap_num = $chap_data->{number} ;
179 my $page_num = $page_data->{number} ;
180
181 my $page_name = "page-$chap_num$page_num" ;
182 my $page_url = "$page_name.html" ;
183
184 push( @{$chap_data->{page_title}}, {
185 number => $page_num,
186 title => $page_title,
187 page_link => $page_url,
188 } ) ;
189
190 my $page = {
191
192 name => $page_name,
193 template => 'page',
194 } ;
195
196 my $header_cont = {
197
198 header_title => {
199 text => $page_title,
200 },
201
202 book_title => $chap_data->{book_title} || 'FOO',
203 index_link => {
204 text => 'index.html',
205 },
206 chap_link => 'chapters.html',
207 } ;
208
209 if ( $page_num > 1 ) {
210
211 my $prev_page_num = sprintf "%02d", $page_num - 1 ;
212 $header_cont->{prev_link} = {
213 prev_page => "page-$chap_num$prev_page_num.html",
214 } ;
215 }
216
217 if ( $page_num < 50 ) {
218
219 my $next_page_num = sprintf "%02d", $page_num + 1 ;
220 $header_cont->{next_link} = {
221 next_page => "page-$chap_num$next_page_num.html",
222 } ;
223 }
224
225
226#print Dumper $page_data ;
227
228 my $items = process_page_items( $page_data ) ;
229
230 my $page_cont = {
231 page => {
232 item => $items,
233 },
234 } ;
235
236 set_page_header_data( $page_cont, $header_cont ) ;
237
238 $page->{contents} = $page_cont ;
239#print Dumper $page_cont ;
240
241 $conf->{pages}{$page_name} = $page ;
242
243}
244
245sub process_page_items {
246
247 my( $page_data ) = @_ ;
248
249 my $items = $page_data->{item} ;
250 $items = [ $items ] unless ref $items eq 'ARRAY' ;
251
252 foreach my $item ( @{$items} ) {
253
254
255 if ( ref $item ) {
256
257 $item->{title} = {
258 text => $item->{title},
259 } ;
260 }
261 else {
262
263 $item = {
264 title => {
265 text => $item,
266 },
267 } ;
268 }
269
270 process_subitems( $item ) ;
271 process_code( $item ) ;
272 }
273
274#print Dumper $items ;
275
276 return $items ;
277}
278
279sub process_subitems {
280
281 my( $item ) = @_ ;
282
283 my $subitems = $item->{subitem} ;
284
285 return unless $subitems ;
286
287 $subitems = [ $subitems ] unless ref $subitems eq 'ARRAY' ;
288
289 $item->{subitems} = [
290 map {
291
292 subitem => {
293 text => $_
294 }
295 }, @{$subitems}
296 ] ;
297}
298
299sub process_code {
300
301 my( $item ) = @_ ;
302
303 my $code = $item->{code} ;
304
305 return unless $code ;
306
307# append a newline if needed - scalar content loses a trailing newline
308
309#print "CODE: [$code]\n" ;
310
311 $code =~ s/(?<!\n)\z/\n/ ;
312 $code =~ s/^/\n\n/ ;
313
314 $code = encode_entities( $code, '<>&"') ;
315
316 $item->{code} = {
317 text => $code
318 } ;
319}
320
321
322
323sub set_page_header_data {
324
325 my( $page_cont, $data ) = @_ ;
326
327 for my $header ( qw( html_header page_header page_footer ) ) {
328
329 @{$page_cont->{$header}}{keys %{$data}} = values %{$data} ;
330 }
331}
332