11""" Splice together a planet from a cache of feed entries """
2- import glob , os
2+ import glob , os , time , shutil
33from xml .dom import minidom
44import planet , config , feedparser , reconstitute
5- from reconstitute import createTextElement
5+ from reconstitute import createTextElement , date
66from spider import filename
77
88def splice (configFile ):
@@ -11,24 +11,28 @@ def splice(configFile):
1111 config .load (configFile )
1212 log = planet .getLogger (config .log_level ())
1313
14+ log .info ("Loading cached data" )
1415 cache = config .cache_directory ()
1516 dir = [(os .stat (file ).st_mtime ,file ) for file in glob .glob (cache + "/*" )
1617 if not os .path .isdir (file )]
1718 dir .sort ()
1819 dir .reverse ()
1920
2021 items = max ([config .items_per_page (templ )
21- for templ in config .template_files ()])
22+ for templ in config .template_files () or [ 'Planet' ] ])
2223
2324 doc = minidom .parseString ('<feed xmlns="http://www.w3.org/2005/Atom"/>' )
2425 feed = doc .documentElement
2526
26- # insert Google/LiveJournal's noindex
27- feed .setAttribute ('indexing:index' ,'no' )
28- feed .setAttribute ('xmlns:indexing' ,'urn:atom-extension:indexing' )
29-
3027 # insert feed information
3128 createTextElement (feed , 'title' , config .name ())
29+ date (feed , 'updated' , time .gmtime ())
30+ gen = createTextElement (feed , 'generator' , config .generator ())
31+ gen .setAttribute ('uri' , config .generator_uri ())
32+ author = doc .createElement ('author' )
33+ createTextElement (author , 'name' , config .owner_name ())
34+ createTextElement (author , 'email' , config .owner_email ())
35+ feed .appendChild (author )
3236
3337 # insert entry information
3438 for mtime ,file in dir [:items ]:
@@ -47,3 +51,75 @@ def splice(configFile):
4751 feed .appendChild (xdoc .documentElement )
4852
4953 return doc
54+
55+ def apply (doc ):
56+ output_dir = config .output_dir ()
57+ if not os .path .exists (output_dir ): os .makedirs (output_dir )
58+ log = planet .getLogger (config .log_level ())
59+
60+ try :
61+ # if available, use the python interface to libxslt
62+ import libxml2
63+ import libxslt
64+ dom = libxml2 .parseDoc (doc )
65+ docfile = None
66+ except :
67+ # otherwise, use the command line interface
68+ dom = None
69+ import warnings
70+ warnings .simplefilter ('ignore' , RuntimeWarning )
71+ docfile = os .tmpnam ()
72+ file = open (docfile ,'w' )
73+ file .write (doc )
74+ file .close ()
75+
76+ # Go-go-gadget-template
77+ for template_file in config .template_files ():
78+ for template_dir in config .template_directories ():
79+ template_resolved = os .path .join (template_dir , template_file )
80+ if os .path .exists (template_resolved ): break
81+ else :
82+ log .error ("Unable to locate template %s" , template_file )
83+ continue
84+
85+ base ,ext = os .path .splitext (os .path .basename (template_resolved ))
86+ if ext != '.xslt' :
87+ log .warning ("Skipping template %s" , template_resolved )
88+ continue
89+
90+ log .info ("Processing template %s" , template_resolved )
91+ output_file = os .path .join (output_dir , base )
92+ if dom :
93+ styledoc = libxml2 .parseFile (template_resolved )
94+ style = libxslt .parseStylesheetDoc (styledoc )
95+ result = style .applyStylesheet (dom , None )
96+ log .info ("Writing %s" , output_file )
97+ style .saveResultToFilename (output_file , result , 0 )
98+ style .freeStylesheet ()
99+ result .freeDoc ()
100+ else :
101+ log .info ("Writing %s" , output_file )
102+ os .system ('xsltproc %s %s > %s' %
103+ (template_resolved , docfile , output_file ))
104+
105+ if dom : dom .freeDoc ()
106+ if docfile : os .unlink (docfile )
107+
108+ # Process bill of materials
109+ for copy_file in config .bill_of_materials ():
110+ dest = os .path .join (output_dir , copy_file )
111+ for template_dir in config .template_directories ():
112+ source = os .path .join (template_dir , copy_file )
113+ if os .path .exists (source ): break
114+ else :
115+ log .error ('Unable to locate %s' , copy_file )
116+ continue
117+
118+ mtime = os .stat (source ).st_mtime
119+ if not os .path .exists (dest ) or os .stat (dest ).st_mtime < mtime :
120+ dest_dir = os .path .split (dest )[0 ]
121+ if not os .path .exists (dest_dir ): os .makedirs (dest_dir )
122+
123+ log .info ("Copying %s to %s" , source , dest )
124+ shutil .copyfile (source , dest )
125+ shutil .copystat (source , dest )
0 commit comments