Attachment 'text_yaml.py'

Download

   1 # -*- coding: iso-8859-1 -*-
   2 """
   3     MoinMoin - YAML (yaml.org) Parser
   4 
   5     @copyright: 2008 MoinMoin:ThomasWaldmann
   6     @license: GNU GPL, see COPYING for details.
   7 """
   8 # Notes:
   9 #
  10 # yaml could maybe used like the wiki parser, calling the formatter to render
  11 # an output page.
  12 #
  13 # groups/dicts/lists - once stored into the cache, can be used by a backend
  14 #
  15 # defining navi_bar or sidebar with yaml?
  16 #
  17 # entering any sort of structured data, displaying it by some renderer action/macro
  18 #  including metadata as long we have no new storage backend
  19 #  indexing metadata with xapian
  20 
  21 Dependencies = []
  22 
  23 from MoinMoin import caching
  24 
  25 class Parser:
  26     """
  27         Parse YAML source and write data to cache.
  28 	Rendering supports different modes:
  29 	* no output (if you just want the data in the cache)
  30 	* showing YAML src
  31         * pprint cache content
  32     """
  33 
  34     extensions = '.yaml'
  35     Dependencies = Dependencies
  36 
  37     def __init__(self, raw, request, **kw):
  38         self.raw = raw
  39         self.request = request
  40         self.mode = kw.get('format_args', 'raw').strip()
  41 
  42     def _load_data(self, pagename):
  43         cache = caching.CacheEntry(self.request, 'yaml', pagename, scope='wiki', use_pickle=True)
  44         try:
  45             raw, data = cache.content()
  46         except:
  47             raw = data = None
  48         if raw != self.raw:
  49             try:
  50                 import yaml
  51             except ImportError, err:
  52                 return None, str(err)
  53             try:
  54                 data = yaml.safe_load_all(self.raw)
  55                 data = list(data)  # get rid of generator
  56                 cache.update((self.raw, data))
  57             except yaml.parser.ParserError, err:
  58                 return None, str(err)
  59         return data, None
  60 
  61     def format(self, formatter):
  62         """ Send the text. """
  63         request = self.request
  64         output = []
  65 	error_msg = ''
  66         pagename = formatter.page.page_name
  67         data, error_msg = self._load_data(pagename)
  68 	if error_msg:
  69             self.mode = 'raw'
  70 
  71         if self.mode == 'raw':
  72             output.append(formatter.preformatted(1))
  73             if error_msg:
  74                 output.append(formatter.text(error_msg + '\n'))
  75             output.append(formatter.text(self.raw.expandtabs()))
  76             output.append(formatter.preformatted(0))
  77 
  78         elif self.mode == 'pprint':
  79             import pprint, StringIO
  80             output.append(formatter.preformatted(1))
  81             if error_msg:
  82                 output.append(formatter.text(error_msg))
  83             outstream = StringIO.StringIO()
  84             pprint.pprint(data, stream=outstream)
  85             output.append(formatter.text("yaml cache content pretty-printed:\n"))
  86             output.append(formatter.text(outstream.getvalue()))
  87             output.append(formatter.preformatted(0))
  88 
  89         elif self.mode == 'group':
  90             output.append(formatter.bullet_list(1))
  91             for item in data[0]:
  92                 output.append(formatter.listitem(1))
  93                 output.append(formatter.text(unicode(item)))
  94                 output.append(formatter.listitem(0))
  95             output.append(formatter.bullet_list(0))
  96 
  97         elif self.mode == 'dict':
  98             output.append(formatter.definition_list(1))
  99             for key, value in data[0].items():
 100                 output.append(formatter.definition_term(1))
 101                 output.append(formatter.text(unicode(key)))
 102                 output.append(formatter.definition_term(0))
 103                 output.append(formatter.definition_desc(1))
 104                 output.append(formatter.text(unicode(value)))
 105                 output.append(formatter.definition_desc(0))
 106             output.append(formatter.definition_list(0))
 107 
 108         request.write(u''.join(output))

Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.
  • [get | view] (2008-06-30 00:09:28, 3.7 KB) [[attachment:text_yaml.py]]
 All files | Selected Files: delete move to page copy to page

You are not allowed to attach a file to this page.