Changeset 174
- Timestamp:
- 04/05/06 19:30:37 (3 years ago)
- Files:
-
- branches/tim/pyramid/build.py (modified) (5 diffs)
- branches/tim/pyramid/flatteners.py (modified) (9 diffs)
- branches/tim/pyramid/page.py (modified) (6 diffs)
- branches/tim/pyramid/restParser.py (modified) (3 diffs)
- branches/tim/pyramid/test/tests.py (modified) (1 diff)
- branches/tim/pyramid/yamlRegistry.py (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/tim/pyramid/build.py
r155 r174 27 27 28 28 29 def build(data,out,verbose=0,resourcedirs=[],rebuilddirs=None,partialbuild=False,constants=None,update=False, createcache=False):29 def build(data,out,verbose=0,resourcedirs=[],rebuilddirs=None,partialbuild=False,constants=None,update=False,relativeurls=False,prettify=False): 30 30 31 31 DATADIR = os.path.abspath(data) … … 70 70 # set constants 71 71 ctx.constants = constants 72 # set relative urls flag 73 ctx.relativeurls = relativeurls 74 # set prettify flag 75 ctx.prettify=prettify 72 76 73 77 for root, dirs, files in os.walk('.'): … … 147 151 if createcache: 148 152 pickle.dump(ctx,open(cachepath,'w')) 153 else: 154 if ctx.verbose > 1: 155 print '.. %s Rebuilt from Cached Data' % str(ctx.relpath) 149 156 else: 150 157 if ctx.verbose > 1: … … 176 183 177 184 178 build(options.data,options.out,verbose=options.verbose,resourcedirs=resourcedirs,rebuilddirs=rebuilddirs,constants=constants,update=options.update,createcache=options.createcache) 185 build(options.data, 186 options.out, 187 verbose=options.verbose, 188 resourcedirs=resourcedirs, 189 rebuilddirs=rebuilddirs, 190 constants=constants, 191 update=options.update, 192 relativeurls=options.relativeurls, 193 prettify=options.prettify 194 ) 179 195 180 196 … … 191 207 parser.add_option("-c", "--constants", dest="constants", help="pass in the names constants (e.g. PDO=/root/pdo,PSF=/psf", metavar="CONSTANTS") 192 208 parser.add_option("-U", "--update", action="store_true", dest="update", default=False, help="NOT WORKING DO NOT USE try to build only those pages that have changed") 209 parser.add_option("-n", "--relativeurls", action="store_true", dest="relativeurls", default=False, help="Converts urls from absolute to relative") 210 parser.add_option("-P", "--prettify", action="store_true", dest="prettify", default=False, help="Prettify output - not used on live site") 193 211 (options, args) = parser.parse_args() 194 212 main(options,args) branches/tim/pyramid/flatteners.py
r148 r174 54 54 class RestFlattener(components.Adapter): 55 55 def flatten(self, ctx, dir): 56 return T.xml(restParser. html_fragment(self.original))56 return T.xml(restParser.parse(self.original)['fragment']) 57 57 58 58 class RestFileFlattener(components.Adapter): … … 66 66 try: 67 67 contents = fp.read() 68 output = restParser. html_fragment(contents)68 output = restParser.parse(contents)['fragment'] 69 69 except UnicodeError: 70 70 print contents … … 110 110 body = message.fp.read() 111 111 if data.get('content-type',None) == 'text/x-rst': 112 return T.xml(restParser. html_fragment(body))112 return T.xml(restParser.parse(body)['fragment']) 113 113 else: 114 114 return T.xml(body) … … 126 126 else: 127 127 return flatten(self.original) 128 129 class RestFileDataFlattener(components.Adapter): 130 def flatten(self, ctx, dir): 131 fp = getFilePointer(ctx,dir,self.original.file) 132 contents = fp.read() 133 key = self.original.key 134 output = restParser.parse(contents,doctitle=1) 135 136 if key is not None and output.has_key(key): 137 return output[key] 138 else: 139 return '**missing restfile data**' 128 140 129 141 class WikiUrlFlattener(components.Adapter): … … 226 238 # Search for the template in this directory and above 227 239 template = acquireTemplate(ctx,self.original.template) 228 return T.xml(fragmentGenerate( dir,template,flattenedMergedData))240 return T.xml(fragmentGenerate(ctx,dir,template,flattenedMergedData)) 229 241 230 242 class FragmentFlattener(components.Adapter): … … 236 248 template = acquireTemplate(ctx,self.original.template) 237 249 flattenedData = flatten( self.original.globals, ctx, dir ) 238 return T.xml(fragmentGenerate( dir,template,flattenedData))250 return T.xml(fragmentGenerate(ctx,dir,template,flattenedData)) 239 251 else: 240 252 # Get the canonical directory and filename for this file … … 258 270 # Search for the template in this directory and above 259 271 template = acquireTemplate(ctx,self.original.template) 260 return T.xml(fragmentGenerate( dir,template,flattenedMergedData))272 return T.xml(fragmentGenerate(ctx,dir,template,flattenedMergedData)) 261 273 262 274 def getFragmentData(self,ctx,dir,name,parentdata): … … 314 326 return data 315 327 316 def fragmentGenerate( dir,template,data):328 def fragmentGenerate(ctx,dir,template,data): 317 329 # Just a wrapper for the page generate call. Adds some error reporting. 318 330 try: 319 htmlfragment = page.Fragment( os.path.join(dir,template), data).generate()331 htmlfragment = page.Fragment(ctx, dir, template, data).generate() 320 332 except KeyError: 321 333 print '*'*80 … … 336 348 components.registerAdapter(RestFlattener, Y.rest, IFlattener) 337 349 components.registerAdapter(RestFileFlattener, Y.restfile, IFlattener) 350 components.registerAdapter(RestFileDataFlattener, Y.restfiledata, IFlattener) 338 351 components.registerAdapter(HtmlFlattener, Y.html, IFlattener) 339 352 components.registerAdapter(HtmlFileFlattener, Y.htmlfile, IFlattener) branches/tim/pyramid/page.py
r147 r174 2 2 from nevow import rend, stan, flat, compy as components, tags as T 3 3 from nevow.loaders import xmlstr 4 from pyramid.path import path 5 from BeautifulSoup import BeautifulSoup 6 4 7 5 8 def getPatterns(ptag): … … 15 18 return pgen 16 19 20 def absoluteToRelative(tag,attr,dir): 21 VALID_URI_PREFIXES=('https://','http://','mailto:','ftp://') 22 try: 23 uri = tag[attr] 24 except KeyError: 25 return 26 27 foundprefix = False 28 for prefix in VALID_URI_PREFIXES: 29 if uri.startswith(prefix): 30 foundprefix = True 31 if foundprefix == True: 32 return 33 34 if uri.startswith('/'): 35 linkfrom = path('/') / path(dir).relpath() 36 linkto = path(uri) 37 linkrelpathto = linkfrom.relpathto(linkto) 38 tag[attr] = linkrelpathto 39 return 40 41 def absoluteToRelativeFactory(attr,dir): 42 def _(uri): 43 return absoluteToRelative(uri,attr,dir) 44 return _ 45 17 46 class FragmentError(Exception): 18 47 """Base class for fragment exceptions.""" … … 23 52 ''' 24 53 25 def __init__(self, template, data):54 def __init__(self, ctx, dir, template, data): 26 55 ''' initialise the data and wrap the template in a nevow namespace 27 56 ''' 57 self.ctx = ctx 28 58 self.data = data 59 self.dir = dir 29 60 self.docFactory = xmlstr(self.wrap(template)) 30 61 rend.Page.__init__(self) … … 48 79 html = [] 49 80 if data: 81 divider = pgen['divider']() 50 82 for item in data: 51 83 ptag = pgen['item'](data=item) … … 55 87 selected = item.get('selected','') 56 88 ptag.fillSlots('selected',selected) 57 html.append(ptag(class_=selected)) 89 html.append( (ptag(class_=selected),divider) ) 90 if html: 91 html[-1] = html[-1][0] 92 58 93 ctx.tag.fillSlots('items',html) 59 94 return ctx.tag … … 108 143 ''' render the fragment 109 144 ''' 110 return self.renderSynchronously() 145 146 html = self.renderSynchronously() 147 html = html.decode('utf8') 148 # parse the html and replace links 149 if self.ctx.relativeurls == True: 150 soup = BeautifulSoup(html) 151 map(absoluteToRelativeFactory('href',self.dir), soup('a') ) 152 map(absoluteToRelativeFactory('src',self.dir), soup('img') ) 153 map(absoluteToRelativeFactory('src',self.dir), soup('script') ) 154 map(absoluteToRelativeFactory('href',self.dir), soup('link') ) 155 if self.ctx.prettify == True: 156 html = soup.prettify(needUnicode=True).encode('utf8') 157 out = [] 158 for line in html.split('\n'): 159 if line.strip(): 160 out.append(line) 161 return '\n'.join(out) 162 else: 163 return soup.renderContents(needUnicode=True).encode('utf8') 164 else: 165 return html branches/tim/pyramid/restParser.py
r114 r174 50 50 return parts 51 51 52 def html_fragment(input_string, source_path=None, destination_path=None,52 def parse(input_string, source_path=None, destination_path=None, 53 53 input_encoding='unicode', output_encoding='utf8', 54 54 doctitle=0, initial_header_level=1): … … 64 64 string is desired, use the default value of "unicode" . 65 65 """ 66 67 ALLOWKEYS = ['title','subtitle','fragment'] 66 68 try: 67 69 input_string = input_string.decode('utf-8') … … 74 76 input_encoding=input_encoding, doctitle=doctitle, 75 77 initial_header_level=initial_header_level) 76 fragment = parts['fragment'] 78 79 77 80 if output_encoding != 'unicode': 78 fragment = fragment.encode(output_encoding) 79 return fragment 81 data = {} 82 for key in ALLOWKEYS: 83 data[key] = parts[key].encode(output_encoding) 84 return data branches/tim/pyramid/test/tests.py
r161 r174 133 133 except ImportError: 134 134 from logilab.xmldiff.ezs import EzsCorrector 135 135 136 136 strategy = EzsCorrector(formatter) 137 137 else: branches/tim/pyramid/yamlRegistry.py
r124 r174 4 4 from pprint import pprint 5 5 from cStringIO import StringIO 6 import re 7 from urlparse import urlsplit 6 8 7 9 # set up classes for yaml parser … … 115 117 return self.file != other.file or self.key != other.key 116 118 119 class restfiledata: 120 ''' a ht file for converting to ht file datafile and key 121 ''' 122 def __init__(self,node): 123 self.file = node['file'] 124 self.key = node.get('key',None) 125 126 def __repr__(self): 127 return '<htfiledata: file=%s, key=%s>'%(self.file,self.key) 128 129 def __eq__(self,other): 130 return self.file == other.file and self.key == other.key 131 132 def __ne__(self,other): 133 return self.file != other.file or self.key != other.key 134 135 117 136 class rhref(str): 118 137 ''' relative href … … 130 149 ''' Factory to convert a string into a label and href (href is last space delimited item in string) 131 150 ''' 132 from urlparse import urlsplit151 # Split off the last space separated string for the url (rest is label/title) 133 152 t = text.split(' ') 134 urlparts = urlsplit(t[-1]) 153 label = ' '.join(t[:-1]) 154 155 # Get the label and possibly the title 156 getlabelparts = re.compile('([^{}]*)(?: {(.*)})?$') 157 m = getlabelparts.match(label) 158 if m: 159 label,title = m.groups() 160 else: 161 title = None 162 if title is None: 163 title = label 164 165 # Split the url up to check the prefix and whether it is an absolute url 166 url = t[-1] 167 urlparts = urlsplit(url) 135 168 if urlparts[0] != '' or urlparts[2].startswith('/'): 136 return {'href': ahref(t[-1]), 'label': ' '.join(t[:-1])}169 url = ahref(url) 137 170 else: 138 return {'href': rhref(t[-1]), 'label': ' '.join(t[:-1])} 171 url = rhref(url) 172 173 return {'href': url, 'label': label, 'title': title} 139 174 140 175 def linktree(node): … … 228 263 ('yaml.org','2002','htfile'): htfile, 229 264 ('yaml.org','2002','htfiledata'): htfiledata, 265 ('yaml.org','2002','restfiledata'): restfiledata, 230 266 ('yaml.org','2002','wikiurl'): wikiurl, 231 267 ('python.yaml.org','2002','object:pyramid.path.path'): pathconstruct,
