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.You are not allowed to attach a file to this page.