1
0
wangweimin 5 жил өмнө
parent
commit
0e46f09883

+ 4 - 0
doc/spec.md

@@ -85,6 +85,10 @@ output:
     type: buttons
     type: buttons
     callback_id:  
     callback_id:  
     buttons:[ {value:, label:, },...]
     buttons:[ {value:, label:, },...]
+    ----
+    type: file
+    name: 
+    content: 
     
     
 
 
 output_ctl:
 output_ctl:

+ 1 - 0
wsrepl/html/index.html

@@ -76,6 +76,7 @@
 <script src="js/mditor.min.js"></script>
 <script src="js/mditor.min.js"></script>
 <script src="js/async.min.js"></script>
 <script src="js/async.min.js"></script>
 <script src="js/form.js"></script>
 <script src="js/form.js"></script>
+<script src="js/FileSaver.min.js"></script>
 <script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"></script>
 <script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"></script>
 <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"
 <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"
         integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
         integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
wsrepl/html/js/FileSaver.min.js


+ 31 - 1
wsrepl/html/js/form.js

@@ -5,6 +5,26 @@
 }(this, (function () {
 }(this, (function () {
     'use strict';
     'use strict';
 
 
+    const b64toBlob = (b64Data, contentType = 'application/octet-stream', sliceSize = 512) => {
+        const byteCharacters = atob(b64Data);
+        const byteArrays = [];
+
+        for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
+            const slice = byteCharacters.slice(offset, offset + sliceSize);
+
+            const byteNumbers = new Array(slice.length);
+            for (let i = 0; i < slice.length; i++) {
+                byteNumbers[i] = slice.charCodeAt(i);
+            }
+
+            const byteArray = new Uint8Array(byteNumbers);
+            byteArrays.push(byteArray);
+        }
+
+        const blob = new Blob(byteArrays, {type: contentType});
+        return blob;
+    };
+
     function extend(Child, Parent) {
     function extend(Child, Parent) {
         var F = function () {
         var F = function () {
         };
         };
@@ -100,6 +120,8 @@
                     this.container_elem.append(this.md_parser.parse(msg.spec.content));  // 直接更改innerHtml会导致事件绑定失效
                     this.container_elem.append(this.md_parser.parse(msg.spec.content));  // 直接更改innerHtml会导致事件绑定失效
                 else if (msg.spec.type === 'buttons')
                 else if (msg.spec.type === 'buttons')
                     this.handle_buttons(msg);
                     this.handle_buttons(msg);
+                else if (msg.spec.type === 'file')
+                    this.handle_file(msg);
                 else
                 else
                     console.warn('Unknown output type:%s', msg.spec.type);
                     console.warn('Unknown output type:%s', msg.spec.type);
             } else if (msg.command === 'output_ctl')
             } else if (msg.command === 'output_ctl')
@@ -109,6 +131,15 @@
 
 
     OutputController.prototype.accept_command = ['output', 'output_ctl'];
     OutputController.prototype.accept_command = ['output', 'output_ctl'];
 
 
+    OutputController.prototype.handle_file = function (msg) {
+        const html = `<div class="form-group"><button type="button" class="btn btn-link">${msg.spec.name}</button></div>`;
+        var element = $(html);
+        this.container_elem.append(element);
+        var blob = b64toBlob(msg.spec.content);
+        element.on('click', 'button', function (e) {
+            saveAs(blob, msg.spec.name, {}, false);
+        });
+    };
     OutputController.prototype.handle_buttons = function (msg) {
     OutputController.prototype.handle_buttons = function (msg) {
         const btns_tpl = `<div class="form-group">{{#buttons}}
         const btns_tpl = `<div class="form-group">{{#buttons}}
                              <button value="{{value}}" class="btn btn-primary">{{label}}</button> 
                              <button value="{{value}}" class="btn btn-primary">{{label}}</button> 
@@ -125,7 +156,6 @@
                 coro_id: msg.spec.callback_id,
                 coro_id: msg.spec.callback_id,
                 data: val
                 data: val
             }));
             }));
-            return;
         })
         })
     };
     };
 
 

+ 2 - 4
wsrepl/interact.py

@@ -7,10 +7,6 @@ from .input_ctrl import send_msg, single_input, input_control
 
 
 logger = logging.getLogger(__name__)
 logger = logging.getLogger(__name__)
 
 
-
-
-
-
 TEXT = 'text'
 TEXT = 'text'
 NUMBER = "number"
 NUMBER = "number"
 PASSWORD = "password"
 PASSWORD = "password"
@@ -192,9 +188,11 @@ def file_upload(label, accept=None, name='data', placeholder='Choose file', help
 
 
     return single_input(item_spec, valid_func, read_file)
     return single_input(item_spec, valid_func, read_file)
 
 
+
 def confirm():
 def confirm():
     pass
     pass
 
 
+
 def input_group(label, inputs, valid_func=None):
 def input_group(label, inputs, valid_func=None):
     """
     """
     :param label:
     :param label:

+ 11 - 1
wsrepl/output.py

@@ -1,7 +1,7 @@
 import json
 import json
 import logging
 import logging
 from collections.abc import Mapping
 from collections.abc import Mapping
-
+from base64 import b64encode
 from .framework import Global, Task
 from .framework import Global, Task
 from .input_ctrl import send_msg, single_input, input_control, next_event, run_async
 from .input_ctrl import send_msg, single_input, input_control, next_event, run_async
 import asyncio
 import asyncio
@@ -98,3 +98,13 @@ def buttons(buttons, onclick_coro, save=None, mutex_mode=False):
     Global.active_ws.coros[callback.coro_id] = callback
     Global.active_ws.coros[callback.coro_id] = callback
 
 
     send_msg('output', dict(type='buttons', callback_id=callback.coro_id, buttons=btns))
     send_msg('output', dict(type='buttons', callback_id=callback.coro_id, buttons=btns))
+
+
+def put_file(name, content):
+    """
+    :param name: file name
+    :param content: bytes-like object
+    :return:
+    """
+    content = b64encode(content).decode('ascii')
+    send_msg('output', dict(type='file', name=name, content=content))

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно