blob: dd81b3f81cd3f03967e3bd989342bb3385e2b0ae [file] [log] [blame]
#!/usr/bin/python
import yaml, codecs, sys, optparse
class YAMLHighlight:
def __init__(self, config):
parameters = yaml.load_document(config)
self.replaces = parameters['replaces']
self.substitutions = {}
for domain, items in [('Token', parameters['tokens']),
('Event', parameters['events'])]:
for code in items:
name = ''.join([part.capitalize() for part in code.split('-')]+[domain])
cls = getattr(yaml, name)
value = items[code]
if value:
if 'start' in value:
self.substitutions[cls, -1] = value['start']
if 'end' in value:
self.substitutions[cls, +1] = value['end']
def highlight(self, input):
if isinstance(input, str):
if input.startswith(codecs.BOM_UTF16_LE):
input = unicode(input, 'utf-16-le')
elif input.startswith(codecs.BOM_UTF16_BE):
input = unicode(input, 'utf-16-be')
else:
input = unicode(input, 'utf-8')
tokens = yaml.parse(input, Parser=iter)
events = yaml.parse(input)
markers = []
number = 0
for token in tokens:
number += 1
if token.start_mark.index != token.end_mark.index:
cls = token.__class__
if (cls, -1) in self.substitutions:
markers.append([token.start_mark.index, +2, number, self.substitutions[cls, -1]])
if (cls, +1) in self.substitutions:
markers.append([token.end_mark.index, -2, number, self.substitutions[cls, +1]])
number = 0
for event in events:
number += 1
cls = event.__class__
if (cls, -1) in self.substitutions:
markers.append([event.start_mark.index, +1, number, self.substitutions[cls, -1]])
if (cls, +1) in self.substitutions:
markers.append([event.end_mark.index, -1, number, self.substitutions[cls, +1]])
markers.sort()
markers.reverse()
chunks = []
position = len(input)
for index, weight1, weight2, substitution in markers:
if index < position:
chunk = input[index:position]
for substring, replacement in self.replaces:
chunk = chunk.replace(substring, replacement)
chunks.append(chunk)
position = index
chunks.append(substitution)
chunks.reverse()
result = u''.join(chunks)
return result.encode('utf-8')
if __name__ == '__main__':
parser = optparse.OptionParser()
parser.add_option('-c', '--config', dest='config', default='yaml_hl_ascii.cfg', metavar='CONFIG')
(options, args) = parser.parse_args()
hl = YAMLHighlight(file(options.config))
sys.stdout.write(hl.highlight(sys.stdin.read()))