Changeset 174

Show
Ignore:
Timestamp:
04/05/06 19:30:37 (3 years ago)
Author:
tim
Message:

added changes to make mirrors work and to add title attributes to links

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/tim/pyramid/build.py

    r155 r174  
    2727 
    2828 
    29 def build(data,out,verbose=0,resourcedirs=[],rebuilddirs=None,partialbuild=False,constants=None,update=False,createcache=False): 
     29def build(data,out,verbose=0,resourcedirs=[],rebuilddirs=None,partialbuild=False,constants=None,update=False,relativeurls=False,prettify=False): 
    3030 
    3131    DATADIR = os.path.abspath(data) 
     
    7070    # set constants 
    7171    ctx.constants = constants 
     72    # set relative urls flag  
     73    ctx.relativeurls = relativeurls 
     74    # set prettify flag 
     75    ctx.prettify=prettify 
    7276     
    7377    for root, dirs, files in os.walk('.'): 
     
    147151                if createcache: 
    148152                    pickle.dump(ctx,open(cachepath,'w')) 
     153            else: 
     154                if ctx.verbose > 1: 
     155                    print '.. %s Rebuilt from Cached Data' % str(ctx.relpath) 
    149156            else: 
    150157                if ctx.verbose > 1: 
     
    176183         
    177184 
    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          ) 
    179195 
    180196 
     
    191207    parser.add_option("-c", "--constants", dest="constants", help="pass in the names constants (e.g. PDO=/root/pdo,PSF=/psf", metavar="CONSTANTS") 
    192208    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")     
    193211    (options, args) = parser.parse_args() 
    194212    main(options,args) 
  • branches/tim/pyramid/flatteners.py

    r148 r174  
    5454class RestFlattener(components.Adapter): 
    5555    def flatten(self, ctx, dir): 
    56         return T.xml(restParser.html_fragment(self.original)
     56        return T.xml(restParser.parse(self.original)['fragment']
    5757     
    5858class RestFileFlattener(components.Adapter): 
     
    6666        try: 
    6767            contents = fp.read() 
    68             output = restParser.html_fragment(contents) 
     68            output = restParser.parse(contents)['fragment'] 
    6969        except UnicodeError: 
    7070            print contents 
     
    110110        body = message.fp.read() 
    111111        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']
    113113        else: 
    114114            return T.xml(body) 
     
    126126        else: 
    127127            return flatten(self.original) 
     128 
     129class 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**' 
    128140 
    129141class WikiUrlFlattener(components.Adapter): 
     
    226238        # Search for the template in this directory and above 
    227239        template = acquireTemplate(ctx,self.original.template) 
    228         return T.xml(fragmentGenerate(dir,template,flattenedMergedData)) 
     240        return T.xml(fragmentGenerate(ctx,dir,template,flattenedMergedData)) 
    229241 
    230242class FragmentFlattener(components.Adapter): 
     
    236248            template = acquireTemplate(ctx,self.original.template) 
    237249            flattenedData = flatten( self.original.globals, ctx, dir ) 
    238             return T.xml(fragmentGenerate(dir,template,flattenedData))     
     250            return T.xml(fragmentGenerate(ctx,dir,template,flattenedData))     
    239251        else: 
    240252            # Get the canonical directory and filename for this file 
     
    258270            # Search for the template in this directory and above 
    259271            template = acquireTemplate(ctx,self.original.template) 
    260             return T.xml(fragmentGenerate(dir,template,flattenedMergedData)) 
     272            return T.xml(fragmentGenerate(ctx,dir,template,flattenedMergedData)) 
    261273 
    262274def getFragmentData(self,ctx,dir,name,parentdata): 
     
    314326    return data 
    315327 
    316 def fragmentGenerate(dir,template,data): 
     328def fragmentGenerate(ctx,dir,template,data): 
    317329    # Just a wrapper for the page generate call. Adds some error reporting. 
    318330    try: 
    319         htmlfragment = page.Fragment(os.path.join(dir,template), data).generate() 
     331        htmlfragment = page.Fragment(ctx, dir, template, data).generate() 
    320332    except KeyError: 
    321333        print '*'*80 
     
    336348components.registerAdapter(RestFlattener,         Y.rest,         IFlattener) 
    337349components.registerAdapter(RestFileFlattener,     Y.restfile,     IFlattener) 
     350components.registerAdapter(RestFileDataFlattener, Y.restfiledata, IFlattener) 
    338351components.registerAdapter(HtmlFlattener,         Y.html,         IFlattener) 
    339352components.registerAdapter(HtmlFileFlattener,     Y.htmlfile,     IFlattener) 
  • branches/tim/pyramid/page.py

    r147 r174  
    22from nevow import rend, stan, flat, compy as components, tags as T 
    33from nevow.loaders import xmlstr 
     4from pyramid.path import path 
     5from BeautifulSoup import BeautifulSoup 
     6 
    47 
    58def getPatterns(ptag): 
     
    1518    return pgen 
    1619 
     20def 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 
     41def absoluteToRelativeFactory(attr,dir): 
     42    def _(uri): 
     43        return absoluteToRelative(uri,attr,dir) 
     44    return _ 
     45 
    1746class FragmentError(Exception): 
    1847    """Base class for fragment exceptions.""" 
     
    2352    ''' 
    2453 
    25     def __init__(self, template, data): 
     54    def __init__(self, ctx, dir, template, data): 
    2655        ''' initialise the data and wrap the template in a nevow namespace 
    2756        ''' 
     57        self.ctx = ctx 
    2858        self.data = data 
     59        self.dir = dir 
    2960        self.docFactory = xmlstr(self.wrap(template)) 
    3061        rend.Page.__init__(self) 
     
    4879        html = [] 
    4980        if data: 
     81            divider = pgen['divider']() 
    5082            for item in data: 
    5183                ptag = pgen['item'](data=item) 
     
    5587                selected = item.get('selected','') 
    5688                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             
    5893            ctx.tag.fillSlots('items',html) 
    5994            return ctx.tag 
     
    108143        ''' render the fragment 
    109144        ''' 
    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  
    5050    return parts 
    5151 
    52 def html_fragment(input_string, source_path=None, destination_path=None, 
     52def parse(input_string, source_path=None, destination_path=None, 
    5353                  input_encoding='unicode', output_encoding='utf8', 
    5454                  doctitle=0, initial_header_level=1): 
     
    6464      string is desired, use the default value of "unicode" . 
    6565    """ 
     66     
     67    ALLOWKEYS = ['title','subtitle','fragment'] 
    6668    try: 
    6769        input_string = input_string.decode('utf-8') 
     
    7476        input_encoding=input_encoding, doctitle=doctitle, 
    7577        initial_header_level=initial_header_level) 
    76     fragment = parts['fragment'] 
     78     
     79     
    7780    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  
    133133        except ImportError: 
    134134            from logilab.xmldiff.ezs import EzsCorrector 
    135              
     135 
    136136        strategy = EzsCorrector(formatter) 
    137137    else: 
  • branches/tim/pyramid/yamlRegistry.py

    r124 r174  
    44from pprint import pprint 
    55from cStringIO import StringIO 
     6import re 
     7from urlparse import urlsplit 
    68 
    79# set up classes for yaml parser 
     
    115117        return self.file != other.file or self.key != other.key 
    116118 
     119class 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 
    117136class rhref(str): 
    118137    ''' relative href 
     
    130149    ''' Factory to convert a string into a label and href (href is last space delimited item in string) 
    131150    ''' 
    132     from urlparse import urlsplit 
     151    # Split off the last space separated string for the url (rest is label/title) 
    133152    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) 
    135168    if urlparts[0] != '' or urlparts[2].startswith('/'): 
    136         return {'href': ahref(t[-1]), 'label': ' '.join(t[:-1])} 
     169        url = ahref(url) 
    137170    else: 
    138         return {'href': rhref(t[-1]), 'label': ' '.join(t[:-1])} 
     171        url = rhref(url) 
     172 
     173    return {'href': url, 'label': label, 'title': title} 
    139174 
    140175def linktree(node): 
     
    228263    ('yaml.org','2002','htfile'): htfile, 
    229264    ('yaml.org','2002','htfiledata'): htfiledata, 
     265    ('yaml.org','2002','restfiledata'): restfiledata, 
    230266    ('yaml.org','2002','wikiurl'): wikiurl, 
    231267    ('python.yaml.org','2002','object:pyramid.path.path'): pathconstruct,