comparison piecrust/page.py @ 454:96d363e2da4b

templating: Let Jinja2 cache the parsed template for page contents.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 06 Jul 2015 21:32:40 -0700
parents 32c7c2d219d2
children 612ed0526afd
comparison
equal deleted inserted replaced
453:8351a77e13f5 454:96d363e2da4b
197 197
198 198
199 class ContentSegment(object): 199 class ContentSegment(object):
200 debug_render_func = 'debug_render' 200 debug_render_func = 'debug_render'
201 201
202 def __init__(self, content=None, fmt=None): 202 def __init__(self):
203 self.parts = [] 203 self.parts = []
204 if content is not None:
205 self.parts.append(ContentSegmentPart(content, fmt))
206 204
207 def debug_render(self): 205 def debug_render(self):
208 return '\n'.join([p.content for p in self.parts]) 206 return '\n'.join([p.content for p in self.parts])
209 207
210 208
211 class ContentSegmentPart(object): 209 class ContentSegmentPart(object):
212 def __init__(self, content, fmt=None, line=-1): 210 def __init__(self, content, fmt=None, offset=-1, line=-1):
213 self.content = content 211 self.content = content
214 self.fmt = fmt 212 self.fmt = fmt
213 self.offset = offset
215 self.line = line 214 self.line = line
216 215
217 def __str__(self): 216 def __str__(self):
218 return '%s [%s]' % (self.content, self.fmt or '<default>') 217 return '%s [%s]' % (self.content, self.fmt or '<default>')
219 218
221 def json_load_segments(data): 220 def json_load_segments(data):
222 segments = {} 221 segments = {}
223 for key, seg_data in data.items(): 222 for key, seg_data in data.items():
224 seg = ContentSegment() 223 seg = ContentSegment()
225 for p_data in seg_data: 224 for p_data in seg_data:
226 part = ContentSegmentPart(p_data['c'], p_data['f'], p_data['l']) 225 part = ContentSegmentPart(p_data['c'], p_data['f'], p_data['o'],
226 p_data['l'])
227 seg.parts.append(part) 227 seg.parts.append(part)
228 segments[key] = seg 228 segments[key] = seg
229 return segments 229 return segments
230 230
231 231
232 def json_save_segments(segments): 232 def json_save_segments(segments):
233 data = {} 233 data = {}
234 for key, seg in segments.items(): 234 for key, seg in segments.items():
235 seg_data = [] 235 seg_data = []
236 for part in seg.parts: 236 for part in seg.parts:
237 p_data = {'c': part.content, 'f': part.fmt, 'l': part.line} 237 p_data = {'c': part.content, 'f': part.fmt, 'o': part.offset,
238 'l': part.line}
238 seg_data.append(p_data) 239 seg_data.append(p_data)
239 data[key] = seg_data 240 data[key] = seg_data
240 return data 241 return data
241 242
242 243
355 parts = [] 356 parts = []
356 357
357 # First part, before the first format change. 358 # First part, before the first format change.
358 part_text = raw[start:matches[0].start()] 359 part_text = raw[start:matches[0].start()]
359 parts.append( 360 parts.append(
360 ContentSegmentPart(part_text, first_part_fmt, line_offset)) 361 ContentSegmentPart(part_text, first_part_fmt, start,
362 line_offset))
361 line_offset += _count_lines(part_text) 363 line_offset += _count_lines(part_text)
362 364
363 for i in range(1, num_matches): 365 for i in range(1, num_matches):
364 m1 = matches[i - 1] 366 m1 = matches[i - 1]
365 m2 = matches[i] 367 m2 = matches[i]
366 part_text = raw[m1.end() + 1:m2.start()] 368 part_text = raw[m1.end() + 1:m2.start()]
367 parts.append( 369 parts.append(
368 ContentSegmentPart( 370 ContentSegmentPart(
369 part_text, m1.group('fmt'), line_offset)) 371 part_text, m1.group('fmt'), m1.end() + 1,
372 line_offset))
370 line_offset += _count_lines(part_text) 373 line_offset += _count_lines(part_text)
371 374
372 lastm = matches[-1] 375 lastm = matches[-1]
373 part_text = raw[lastm.end() + 1:end] 376 part_text = raw[lastm.end() + 1:end]
374 parts.append(ContentSegmentPart( 377 parts.append(ContentSegmentPart(
375 part_text, lastm.group('fmt'), line_offset)) 378 part_text, lastm.group('fmt'), lastm.end() + 1,
379 line_offset))
376 380
377 return parts, line_offset 381 return parts, line_offset
378 else: 382 else:
379 part_text = raw[start:end] 383 part_text = raw[start:end]
380 parts = [ContentSegmentPart(part_text, first_part_fmt, line_offset)] 384 parts = [ContentSegmentPart(part_text, first_part_fmt, start,
385 line_offset)]
381 return parts, line_offset 386 return parts, line_offset
382 387