|  | #!/usr/bin/python | 
|  | # Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file | 
|  | # for details. All rights reserved. Use of this source code is governed by a | 
|  | # BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | """Templating to help generate structured text.""" | 
|  |  | 
|  | import os | 
|  | import re | 
|  | import emitter | 
|  | import logging | 
|  |  | 
|  | _logger = logging.getLogger('multiemitter') | 
|  |  | 
|  | class MultiEmitter(object): | 
|  | """A set of Emitters that write to different files. | 
|  |  | 
|  | Each entry has a key. | 
|  |  | 
|  | file --> emitter | 
|  | key --> emitter | 
|  |  | 
|  | """ | 
|  |  | 
|  | def __init__(self): | 
|  | self._key_to_emitter = {}     # key -> Emitter | 
|  | self._filename_to_emitter = {}    # filename -> Emitter | 
|  |  | 
|  |  | 
|  | def FileEmitter(self, filename, key=None): | 
|  | """Creates an emitter for writing to a file. | 
|  |  | 
|  | When this MultiEmitter is flushed, the contents of the emitter are written | 
|  | to the file. | 
|  |  | 
|  | Arguments: | 
|  | filename: a string, the path name of the file | 
|  | key: provides an access key to retrieve the emitter. | 
|  |  | 
|  | Returns: the emitter. | 
|  | """ | 
|  | e = emitter.Emitter() | 
|  | self._filename_to_emitter[filename] = e | 
|  | if key: | 
|  | self.Associate(key, e) | 
|  | return e | 
|  |  | 
|  | def Associate(self, key, emitter): | 
|  | """Associates a key with an emitter.""" | 
|  | self._key_to_emitter[key] = emitter | 
|  |  | 
|  | def Find(self, key): | 
|  | """Returns the emitter associated with |key|.""" | 
|  | return self._key_to_emitter[key] | 
|  |  | 
|  | def Flush(self, writer=None): | 
|  | """Writes all pending files. | 
|  |  | 
|  | Arguments: | 
|  | writer: a function called for each file and it's lines. | 
|  | """ | 
|  | if not writer: | 
|  | writer = _WriteFile | 
|  | for file in sorted(self._filename_to_emitter.keys()): | 
|  | emitter = self._filename_to_emitter[file] | 
|  | writer(file, emitter.Fragments()) | 
|  |  | 
|  |  | 
|  | def _WriteFile(path, lines): | 
|  | (dir, file) = os.path.split(path) | 
|  |  | 
|  | # Ensure dir exists. | 
|  | if dir: | 
|  | if not os.path.isdir(dir): | 
|  | os.makedirs(dir) | 
|  |  | 
|  | # Remove file if pre-existing. | 
|  | if os.path.exists(path): | 
|  | os.remove(path) | 
|  |  | 
|  | # Write the file. | 
|  | # _logger.info('Flushing - %s' % path) | 
|  | f = open(path, 'w') | 
|  | f.writelines(lines) | 
|  | f.close() |