5

おそらくいくつかのアクションを追加することによって、いくつかのpythonコードをmoinmoinページに(簡単に)組み込むためのトリックがあるかどうか疑問に思っていました。アイデアは、次のようなものです

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

としてページに表示されます

1
3
5

クイック アンド ダーティは問題ありません。安全性は問題ではありません。これをスタンドアロンの「デスクトップ モード」インストール用に使用したいと考えています。

4

2 に答える 2

7

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

以下は、 MoinmoinのHelloWorldパーサーの非常に迅速で汚い適応です。

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

ページを表示するとき。実行をサンドボックスに限定することで、safe(r)にすることができます。

于 2012-02-27T12:37:32.497 に答える
4

あなたのmoinmoinインスタンスで

data/macro

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

from MoinMoin.util import pysupport

modules = pysupport.getPackageModules(__file__)

次に、そこでマクロを作成します。

touch PyShell.py

これをテンプレートとして使用します。

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")>>
于 2012-02-25T11:44:30.550 に答える