Ignore:
Timestamp:
05/12/06 05:14:33 (9 years ago)
Author:
xi
Message:

Remake the YAML highlighting example.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pyyaml/trunk/examples/yaml-hl/yaml_hl.py

    r145 r159  
    33import yaml, codecs, sys, optparse 
    44 
    5 #yaml.add_resolver(u'!Config', []) 
    6 #yaml.add_resolver(u'!TokensConfig', [u'tokens']) 
    7 #yaml.add_resolver(u'!EventsConfig', [u'events']) 
    8 #yaml.add_resolver(u'!StartEndConfig', [u'tokens', None]) 
    9 #yaml.add_resolver(u'!StartEndConfig', [u'events', None]) 
     5class Style: 
     6 
     7    def __init__(self, header=None, footer=None, 
     8            tokens=None, events=None, replaces=None): 
     9        self.header = header 
     10        self.footer = footer 
     11        self.replaces = replaces 
     12        self.substitutions = {} 
     13        for domain, Class in [(tokens, 'Token'), (events, 'Event')]: 
     14            if not domain: 
     15                continue 
     16            for key in domain: 
     17                name = ''.join([part.capitalize() for part in key.split('-')]) 
     18                cls = getattr(yaml, '%s%s' % (name, Class)) 
     19                value = domain[key] 
     20                if not value: 
     21                    continue 
     22                start = value.get('start') 
     23                end = value.get('end') 
     24                if start: 
     25                    self.substitutions[cls, -1] = start 
     26                if end: 
     27                    self.substitutions[cls, +1] = end 
     28 
     29    def __setstate__(self, state): 
     30        self.__init__(**state) 
     31 
     32yaml.add_path_resolver(u'tag:yaml.org,2002:python/object:__main__.Style', 
     33        [None], dict) 
     34yaml.add_path_resolver(u'tag:yaml.org,2002:pairs', 
     35        [None, u'replaces'], list) 
    1036 
    1137class YAMLHighlight: 
    1238 
    13     def __init__(self, config): 
    14         parameters = yaml.load(config) 
    15         self.replaces = parameters['replaces'] 
    16         self.substitutions = {} 
    17         for domain, items in [('Token', parameters['tokens']), 
    18                     ('Event', parameters['events'])]: 
    19             for code in items: 
    20                 name = ''.join([part.capitalize() for part in code.split('-')]+[domain]) 
    21                 cls = getattr(yaml, name) 
    22                 value = items[code] 
    23                 if value: 
    24                     if 'start' in value: 
    25                         self.substitutions[cls, -1] = value['start'] 
    26                     if 'end' in value: 
    27                         self.substitutions[cls, +1] = value['end'] 
     39    def __init__(self, options): 
     40        config = yaml.load(file(options.config, 'rb').read()) 
     41        self.style = config[options.style] 
     42        if options.input: 
     43            self.input = file(options.input, 'rb') 
     44        else: 
     45            self.input = sys.stdin 
     46        if options.output: 
     47            self.output = file(options.output, 'wb') 
     48        else: 
     49            self.output = sys.stdout 
    2850 
    29     def highlight(self, input): 
    30         if isinstance(input, str): 
    31             if input.startswith(codecs.BOM_UTF16_LE): 
    32                 input = unicode(input, 'utf-16-le') 
    33             elif input.startswith(codecs.BOM_UTF16_BE): 
    34                 input = unicode(input, 'utf-16-be') 
    35             else: 
    36                 input = unicode(input, 'utf-8') 
     51    def highlight(self): 
     52        if self.style.header: 
     53            self.output.write(self.style.header) 
     54        input = self.input.read() 
     55        if input.startswith(codecs.BOM_UTF16_LE): 
     56            input = unicode(input, 'utf-16-le') 
     57        elif input.startswith(codecs.BOM_UTF16_BE): 
     58            input = unicode(input, 'utf-16-be') 
     59        else: 
     60            input = unicode(input, 'utf-8') 
     61        substitutions = self.style.substitutions 
    3762        tokens = yaml.scan(input) 
    3863        events = yaml.parse(input) 
     
    4368            if token.start_mark.index != token.end_mark.index: 
    4469                cls = token.__class__ 
    45                 if (cls, -1) in self.substitutions: 
    46                     markers.append([token.start_mark.index, +2, number, self.substitutions[cls, -1]]) 
    47                 if (cls, +1) in self.substitutions: 
    48                     markers.append([token.end_mark.index, -2, number, self.substitutions[cls, +1]]) 
     70                if (cls, -1) in substitutions: 
     71                    markers.append([token.start_mark.index, +2, number, substitutions[cls, -1]]) 
     72                if (cls, +1) in substitutions: 
     73                    markers.append([token.end_mark.index, -2, number, substitutions[cls, +1]]) 
    4974        number = 0 
    5075        for event in events: 
    5176            number += 1 
    5277            cls = event.__class__ 
    53             if (cls, -1) in self.substitutions: 
    54                 markers.append([event.start_mark.index, +1, number, self.substitutions[cls, -1]]) 
    55             if (cls, +1) in self.substitutions: 
    56                 markers.append([event.end_mark.index, -1, number, self.substitutions[cls, +1]]) 
     78            if (cls, -1) in substitutions: 
     79                markers.append([event.start_mark.index, +1, number, substitutions[cls, -1]]) 
     80            if (cls, +1) in substitutions: 
     81                markers.append([event.end_mark.index, -1, number, substitutions[cls, +1]]) 
    5782        markers.sort() 
    5883        markers.reverse() 
     
    6287            if index < position: 
    6388                chunk = input[index:position] 
    64                 for substring, replacement in self.replaces: 
     89                for substring, replacement in self.style.replaces: 
    6590                    chunk = chunk.replace(substring, replacement) 
    6691                chunks.append(chunk) 
     
    6994        chunks.reverse() 
    7095        result = u''.join(chunks) 
    71         return result.encode('utf-8') 
     96        self.output.write(result.encode('utf-8')) 
     97        if self.style.footer: 
     98            self.output.write(self.style.footer) 
    7299 
    73100if __name__ == '__main__': 
    74101    parser = optparse.OptionParser() 
    75     parser.add_option('-c', '--config', dest='config', default='yaml_hl_ascii.cfg', metavar='CONFIG') 
     102    parser.add_option('-s', '--style', dest='style', default='ascii', 
     103            help="specify the highlighting style", metavar='STYLE') 
     104    parser.add_option('-c', '--config', dest='config', default='yaml_hl.cfg', 
     105            help="set an alternative configuration file", metavar='CONFIG') 
     106    parser.add_option('-i', '--input', dest='input', default=None, 
     107            help="set the input file (default: stdin)", metavar='FILE') 
     108    parser.add_option('-o', '--output', dest='output', default=None, 
     109            help="set the output file (default: stdout)", metavar='FILE') 
    76110    (options, args) = parser.parse_args() 
    77     hl = YAMLHighlight(file(options.config)) 
    78     sys.stdout.write(hl.highlight(sys.stdin.read())) 
     111    hl = YAMLHighlight(options) 
     112    hl.highlight() 
    79113 
Note: See TracChangeset for help on using the changeset viewer.