doc_demo.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. """
  2. 文档中示例代码在线运行
  3. ^^^^^^^^^^^^^^^^
  4. """
  5. from pywebio import start_server
  6. from pywebio.input import *
  7. from pywebio.output import *
  8. from pywebio.session import *
  9. from os import path, listdir
  10. from functools import partial
  11. here_dir = path.dirname(path.abspath(__file__))
  12. def gen_snippets(code):
  13. parts = code.split('\n## ----\n')
  14. for p in parts:
  15. p = p.replace('\n## ', '\n')
  16. p = p.replace('\n##\n', '\n\n')
  17. yield p.lstrip('## ').lstrip('##').strip('\n')
  18. def run_code(code, scope):
  19. with use_scope(scope):
  20. exec(code, globals())
  21. def copytoclipboard(code):
  22. run_js("navigator.clipboard.writeText(text)", text=code)
  23. toast('已复制')
  24. def handle_code(code, title):
  25. if title:
  26. put_markdown('## %s' % title)
  27. for p in gen_snippets(code):
  28. with use_scope() as scope:
  29. put_code(p, 'python')
  30. put_buttons(['运行', '复制代码'], onclick=[
  31. partial(run_code, code=p, scope=scope),
  32. partial(copytoclipboard, code=p)
  33. ])
  34. put_markdown('----')
  35. hold()
  36. def get_app():
  37. app = {}
  38. try:
  39. demos = listdir(path.join(here_dir, 'doc_domes'))
  40. except:
  41. demos = []
  42. demo_infos = []
  43. for name in demos:
  44. code = open(path.join(here_dir, 'doc_domes', name)).read()
  45. title, code = code.split('\n\n', 1)
  46. app[name] = partial(handle_code, code=code, title=title)
  47. demo_infos.append([name, title])
  48. index_html = "<ul>"
  49. for name, title in demo_infos:
  50. index_html += '''<li> <a href="javascript:WebIO.openApp('{name}', true)">{name}</a>: {desc} </li>\n'''.format(
  51. name=name, desc=title)
  52. index_html += "</ul>"
  53. def index():
  54. put_markdown('# PyWebIO Document Code Example Index')
  55. put_html(index_html)
  56. app['index'] = index
  57. return app
  58. if __name__ == '__main__':
  59. start_server(get_app(), debug=True, port=8080)