Attachment 'FreemindSitemap_macro_for_moin_1.9.py'
Download 1 # -*- coding: iso-8859-1 -*-
2 """
3 MoinMoin - Freemind sitemap Flash Browser macro (for MoinMoin V1.9)
4
5 Thin macro based on FreeMind Browser (applet) macro and
6 FreemindFlashBrowser macro.
7
8 Creates a sitemap of your wiki in the freemind format and inserts the
9 FreeMind Flash Browser.
10
11 See http://freemind.sourceforge.net/wiki/index.php/Flash
12
13 <<FreeMindFlashBrowser()>>
14 displays the sitemap in the FreeMind browser applet with the
15 default for the width, height, and collapsedToLevel of the applet.
16
17 <<FreeMindFlashBrowser( width )>>
18 displays the FreeMind mindmap specified by urlOfMindmap in the FreeMind
19 browser applet the width is taken from the argument list there is a
20 default for the height and collapsedToLevel of the applet.
21
22 <<FreeMindFlashBrowser( width, height )>>
23 displays the FreeMind mindmap specified by urlOfMindmap in the FreeMind
24 browser applet the width and height are taken from the argument list.
25 There is a default for the collapsedToLevel of the applet.
26
27 <<FreeMindFlashBrowser( width, height, collapsedToLevel )>>
28 displays the FreeMind mindmap specified by urlOfMindmap in the FreeMind
29 browser applet the width, height and collapsedToLevel are taken from the
30 argument list.
31
32 @copyright: 2007 by Bum-seok Lee <shinsuk@gwbs.net>
33 2009 by Josef Meier <jo.meier@gmx.de>
34 @license: GNU GPL, see COPYING for details.
35 """
36
37 """
38 Changes:
39
40 2007-12-14 siemster <gregory.siems@pca.state.mn.us>
41 - Moved mmcachedir to wikiconfig ( as freemind_cache_dir )
42 - Moved mmmcacheurl to wikiconfig ( as freemind_cache_url )
43 - Moved flashurl to wikiconfig ( as freemind_flash_browser_url )
44 - Added CSSFile ( freemind_css_url in wikiconfig )
45 - Added collapsedToLevel
46 - Changed 'div id' of the applet script to a generated value
47 (for the purpose of allowing multiple instances within the
48 same wiki page)
49
50 2008-06-27 siemster <gregory.siems@pca.state.mn.us>
51 - Fix to work with Moin version 1.7
52
53 2009-09-10 Added code for automatic creation of freemind data
54 out of your wikis structure.
55
56 """
57
58 from MoinMoin import config, wikiutil, action
59 from MoinMoin.action import AttachFile
60 import os
61 import md5
62 import time
63 import codecs
64
65 debug = False
66
67 # FMBMacro class
68
69 """
70 Class FMBMacro implements the execution of a FreeMindFlashBrowser macro call.
71 One instance must be used per execution.
72 """
73 class FMBMacro:
74
75 widthDefault = '100%'
76 heightDefault= '500'
77 collapsedLevelDefault = '2'
78
79 """
80 Construct the FMBMacro with the execution arguments.
81 """
82 def __init__(self, macro, args):
83 self.macro = macro
84 self.args = args
85 self.request = macro.request
86
87 self.flashBaseUrl = macro.request.cfg.freemind_flash_browser_url
88 self.cssUrl = macro.request.cfg.freemind_css_url
89 self.mmCacheUrl = macro.request.cfg.freemind_cache_url
90 self.mmCacheDir = macro.request.cfg.freemind_cache_dir
91
92 # Check and set, if we have an HTML formatter
93 self.isHTML = '<br />\n' == self.macro.formatter.linebreak(0)
94
95 # Fix for Moin 1.7.x
96 if not self.isHTML:
97 self.isHTML = '<br>\n' == self.macro.formatter.linebreak(0)
98
99 self.isFatal = False
100 self.applet = [] # this is for the applet code
101 self.messages = [] # this is for extra messages
102
103
104 def execute( self ):
105 self.info( "Yippieh - FMBMacro is executing!" )
106 self.getFreemindSitemap()
107 self.checkArguments()
108 self.computeResult()
109 return self.result
110
111
112 """
113 Get sitemap in freemind format by using the "FreemindSitemap" action.
114 """
115 def getFreemindSitemap(self):
116 freemindSitemap = action.getHandler(self.request.cfg, 'FreemindSitemap', 'getSiteMapFreemind')
117
118 if freemindSitemap:
119 freemindContent = freemindSitemap(self.request.page.page_name, self.request)
120
121 if not os.path.isdir(self.mmCacheDir):
122 os.mkdir(self.mmCacheDir, 0755)
123
124 hashStart = time.asctime(time.gmtime()) + self.request.user.id
125
126 filename = md5.new(hashStart).hexdigest() + ".mm"
127 completeName = os.path.join ( self.mmCacheDir, filename )
128
129 filehandle = open(completeName,"w")
130 filehandle.write( freemindContent.encode( "utf-8" ) )
131 filehandle.close()
132 self.mindmapUrl = self.mmCacheUrl + "/" + filename
133
134
135 """
136 Check the arguments given with the macro call.
137 """
138 def checkArguments(self):
139 if not self.args:
140 argsList = []
141 argsLen = 0
142 else:
143 argsList = self.args.split(',')
144 argsLen = len(argsList)
145
146 self.width = FMBMacro.widthDefault
147 self.height = FMBMacro.heightDefault
148 self.collapsedLevel = FMBMacro.collapsedLevelDefault
149
150 if 1 <= argsLen:
151 temp = argsList[0].strip()
152 if temp != '':
153 self.width = temp
154
155 if 2 <= argsLen:
156 temp = argsList[1].strip()
157 if temp != '':
158 self.height = temp
159
160 if 3 <= argsLen:
161 temp = argsList[2].strip()
162 if temp != '':
163 self.collapsedLevel = temp
164
165 if 3 < argsLen:
166 self.warning( "Too many arguments!" )
167 self.usage()
168
169 if True:
170 self.info( "isHTML= '%s'" %(self.isHTML) )
171 self.info( "width= '%s'" %(self.width) )
172 self.info( "height= '%s'" %(self.height) )
173 self.info( "startCollapsedToLevel= '%s'" %(self.collapsedLevel) )
174 self.info( "mindmap-url= '%s'" %(self.mindmapUrl) )
175 self.info( "isFatal= '%s'" %(self.isFatal) )
176 self.usage()
177
178 """
179 Compute the result of the macro call.
180 """
181 def computeResult(self):
182 result = "".join( self.messages )
183
184 if not self.isFatal:
185 self.computeApplet()
186 result += "".join( self.applet )
187
188 if self.isHTML:
189 self.result = self.macro.formatter.rawHTML( result )
190 else:
191 self.result = result
192
193
194 """
195 Compute the applet link or applet tag (depending on formatter)
196 """
197 def computeApplet( self ):
198 if self.isHTML:
199 divId = md5.new(self.mindmapUrl).hexdigest()
200
201 applet = """
202 <!--
203 - code generated by FreeMindFlashBrowser flash macro -
204 - see http://freemind.sourceforge.net -
205 -->
206 <script type="text/javascript" src="%s/flashobject.js"></script>
207
208 <div id="%s">
209 FreemindSitemap isn't working. Maybe you forgot to configure it in 'wikiconfig.py'.
210 Or maybe your browsers Flash plugin or Javascript are turned off.
211 Activate both and reload to view the mindmap
212 </div>
213
214 <script type="text/javascript">
215 // <![CDATA[
216 var fo = new FlashObject("%s/visorFreemind.swf", "visorFreeMind", "%s", "%s", 6, "#9999ff");
217 fo.addVariable("openUrl", "_self");
218 fo.addVariable("initLoadFile", "%s");
219 fo.addVariable("startCollapsedToLevel", "%s");
220 fo.addVariable("CSSFile", "%s");
221 fo.write("%s");
222 // ]]>
223 </script>
224 """ %( self.flashBaseUrl, divId, self.flashBaseUrl, self.width, self.height,
225 self.mindmapUrl, self.collapsedLevel, self.cssUrl, divId, )
226 self.applet.append( applet )
227
228 else:
229 self.applet.append( self.macro.formatter.url( 1, self.mindmapUrl ) )
230 self.applet.append( self.macro.formatter.url( 0 ) )
231
232
233 # message methods
234
235 def info( self, msg ):
236 if debug:
237 self.msg( 'Info: ' + msg )
238
239 def warning( self, msg ):
240 self.msg( 'Warning: ' + msg )
241
242 def error( self, msg ):
243 self.msg( 'Error: ' + msg )
244
245 def fatal( self, msg ):
246 self.msg( 'Fatal: ' + msg )
247 self.isFatal = True
248
249 def msg( self, msg ):
250 msg = "FreemindSitemap-Macro:" + msg
251 print msg
252 if self.isHTML:
253 msg = '<h1 style="font-weight:bold;color:blue">' + msg.replace( '\n', '\n<br/>') + '</h1>'
254
255 self.messages.append(msg)
256
257
258 def usage( self ):
259 usage = """
260 Usage: <<FreemindSitemap( [,urlOfMindmap [,width [,height]] )]]
261 urlOfMindmap: an URL reaching the mindmap - allowed schemes are 'http:' and 'attachment:'.
262 width: (optional) - width of the applet; default: %s
263 height: (optional) - height of the applet; default: %s
264 startCollapsedToLevel (optional) - start collapsed to to node level; default: %s
265 """ %(self.widthDefault, self.heightDefault, self.collapsedLevelDefault)
266
267 self.info( usage )
268
269
270 """
271 Take the given URL of the mindmap, validate it and return an URL that can be linked to from the applet.
272 """
273 def getMindmapURL( self, url ):
274
275 if url.startswith( 'http:' ):
276 return url
277
278 elif url.startswith( 'attachment:'):
279 mmFileName = url[11:]
280 pagename, drawing = AttachFile.absoluteName(url, self.request.page.page_name)
281 mindmap_url = AttachFile.getAttachUrl(pagename, mmFileName, self.request)
282 return mindmap_url
283
284 else:
285 self.warning( "Unrecognized scheme in mindmap URL! Url is '%s'!" %(url) )
286 self.usage()
287 return url
288
289
290 # Macro execution interface
291
292 def execute(macro, args):
293 fmb = FMBMacro( macro, args )
294 return fmb.execute()
295
296 # vim: ai si cin noet ts=4 sw=4
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.