Есть ли способ включить код Python в страницы Moinmoin? - PullRequest
5 голосов
/ 25 февраля 2012

Мне было интересно, есть ли хитрость для (простого) включения некоторого кода Python в страницу moinmoin, возможно, путем добавления некоторого действия . Идея в том, что что-то вроде

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

отображается на странице как

1
3
5

Быстро и грязно - все в порядке, безопасность не проблема, я хотел бы иметь это для автономной установки " desktop-mode ".

Ответы [ 2 ]

7 голосов
/ 27 февраля 2012

Другой подход - добавить парсер.

Ниже приведена очень быстрая и грязная адаптация парсера Hello World от Moinmoin .

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

при просмотре страницы.Можно сделать безопасным (r), ограничив выполнение песочницей .

4 голосов
/ 25 февраля 2012

В вашем экземпляре 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")>>
...