Przeglądaj źródła

feat: add put_link()

wangweimin 5 lat temu
rodzic
commit
5f24109079
3 zmienionych plików z 36 dodań i 1 usunięć
  1. 22 1
      pywebio/output.py
  2. 2 0
      webiojs/src/main.ts
  3. 12 0
      webiojs/src/utils.ts

+ 22 - 1
pywebio/output.py

@@ -34,6 +34,7 @@ r"""输出内容到用户浏览器
 .. autofunction:: put_image
 .. autofunction:: put_file
 .. autofunction:: put_collapse
+.. autofunction:: put_link
 
 .. autofunction:: put_widget
 """
@@ -57,7 +58,7 @@ logger = logging.getLogger(__name__)
 __all__ = ['Position', 'set_title', 'set_output_fixed_height', 'set_auto_scroll_bottom', 'remove', 'scroll_to',
            'put_text', 'put_html', 'put_code', 'put_markdown', 'use_scope', 'set_scope', 'clear', 'remove',
            'put_table', 'table_cell_buttons', 'put_buttons', 'put_image', 'put_file', 'PopupSize', 'popup',
-           'close_popup', 'put_widget', 'put_collapse']
+           'close_popup', 'put_widget', 'put_collapse', 'put_link']
 
 
 # popup尺寸
@@ -521,6 +522,26 @@ def put_file(name, content, scope=Scope.Current, position=OutputPosition.BOTTOM)
     return OutputReturn(spec)
 
 
+def put_link(name, url=None, app=None, new_window=False, scope=Scope.Current,
+             position=OutputPosition.BOTTOM) -> OutputReturn:
+    """输出链接到其他页面或PyWebIO App的超链接
+
+    :param str name: 链接名称
+    :param str url: 链接到的页面地址
+    :param str app: 链接到的PyWebIO应用名
+    :param bool new_window: 是否在新窗口打开链接
+    :param int scope, position: 与 `put_text` 函数的同名参数含义一致
+
+    ``url`` 和 ``app`` 参数必须指定一个但不可以同时指定
+    """
+    assert bool(url is None) != bool(app is None), "Must set `url` or `app` parameter but not both"
+
+    href = 'javascript:WebIO.openApp(%r, %d)' % (app, new_window) if app is not None else url
+    target = '_blank' if (new_window and url) else '_self'
+    html = '<a href="{href}" target="{target}">{name}</a>'.format(href=href, target=target, name=name)
+    return put_html(html, scope=scope, position=position)
+
+
 @safely_destruct_output_when_exp('content')
 def put_collapse(title, content, open=False, scope=Scope.Current, position=OutputPosition.BOTTOM) -> OutputReturn:
     """输出可折叠的内容

+ 2 - 0
webiojs/src/main.ts

@@ -5,6 +5,7 @@ import {OutputHandler} from "./handlers/output"
 import {DisplayAreaButtonOnClick} from "./models/output"
 import {CloseHandler, CommandDispatcher} from "./handlers/base"
 import {PopupHandler} from "./handlers/popup";
+import {openApp} from "./utils";
 
 // 获取后端API地址
 function get_backend_addr() {
@@ -56,5 +57,6 @@ function startWebIOClient(output_container_elem: JQuery, input_container_elem: J
 // @ts-ignore
 window.WebIO = {
     'startWebIOClient': startWebIOClient,
+    'openApp': openApp,
     'DisplayAreaButtonOnClick': DisplayAreaButtonOnClick,
 };

+ 12 - 0
webiojs/src/utils.ts

@@ -124,3 +124,15 @@ export function randomid(length: number) {
     }
     return result;
 }
+
+// 跳转PyWebIO Application
+// name: app名称
+// new_window: 是否在新窗口打开
+export function openApp(name: string, new_window: boolean) {
+    let url = new URL(window.location.href);
+    url.searchParams.set("app", name);
+    if (new_window)
+        window.open(url.href);
+    else
+        window.location.href = url.href;
+}