2012-02-25 14 views
5

おそらくいくつかのpythonコードをmoinmoinページに組み込むためのトリックがあるのだろうかと疑問に思っていました。おそらく、いくつかのコードをactionに追加しています。アイデアは、私は、スタンドアローンのためにこれを持っていると思い、何か moinmoinページにPythonコードを組み込む方法はありますか?

<<< 
for j in [1,3,5]: 
    print(i) 
>>> 

のように安全性が問題ではない、

1 
3 
5 

クイックや汚れがOKであるとしてページ上に表示されていることです"desktop-mode"がインストールされています。

from MoinMoin.util import pysupport 

modules = pysupport.getPackageModules(__file__) 

次に、あなたのマクロが作成されます:あなたのMoinMoinのインスタンスで

答えて

4

には、少なくとも次の内容の__init__.pyをがあることを確認してください

data/macro 

に行く

touch PyShell.py 

テンプレートとして使用:

あなたが今しているマクロを呼び出すことができる必要があり、あなたのwiki-ページで
import StringIO 
import sys 

def macro_PyShell(macro, code): 
    code_out = StringIO.StringIO() 
    sys.stdout = code_out 
    exec code.strip("'").strip('"') 
    sys.stdout = sys.__stdout__ 
    return macro.request.formatter.text(code_out.getvalue()) 

<<PyShell("for i in [1,2,3]:\n print i")>> 
+0

ご回答ありがとうございます。明確にするために、私ができるようにしたいのは、任意の小さなpythonコードを編集モード_に置くことです。いくつかのアクション/マクロが自分のコードを取り、Pythonインタプリタを介して実行し、そのページの出力を表示します視聴モードで。ドキュメントをもっと読んで、私は[パーサ](http://moinmo.in/HelpOnParsers)を追加するべきだと思っています。 – mitchus

+0

あなたのニーズに合わせてマクロの例を変更しました。 – hoffmaje

+0

それはかなりいいね!それは 'eval'ではなく' exec'でなければならないのでしょうか? – mitchus

7

別のアプローチは、パーサーを追加することです。

以下は、非常に迅速で汚れたMoinmoin's Hello World parserの適応です。

import StringIO 
import sys 

class Parser():   

    def __init__(self, raw, request, **kw): 
     self.raw = raw 
     self.request = request 
     self.kw=kw 

    def format(self, formatter):  
     # Execute the code 
     code_out = StringIO.StringIO() 
     sys.stdout = code_out 
     exec self.raw 
     sys.stdout = sys.__stdout__ 
     out_lines = code_out.getvalue().split("\n") 

     # Print the output 
     for out_line in out_lines: 
      self.request.write(formatter.rawHTML(out_line+"<br>")) 

それはpath/to/MoinMoin/parser/interpret_python.pyとして例えば保存されている場合は、ページに

{{{#!interpret_python 
for j in [1,3,5]: 
    print(j) 
}}} 

を入力することができますし、ページを表示する際には、テキスト

1 
3 
5 

を生成します。実行をsandboxに限定することで安全(r)にすることができます。

関連する問題