Sfoglia il codice sorgente

[new]思维导图引用网络资源

zk 1 anno fa
parent
commit
505f57e19c

File diff suppressed because it is too large
+ 0 - 2
assets/html/d3.js


File diff suppressed because it is too large
+ 0 - 1
assets/html/dsbridge.js


+ 5 - 4
assets/html/index.html

@@ -19,10 +19,11 @@
     </style>
 
 
-    <script src="./dsbridge.js"></script>
-    <script src="./d3.js"></script>
-    <script src="./markmap-lib.js"></script>
-    <script src="./markmap-view.js"></script>
+  <script src="https://cdn.reallyshort.cn/static/markmap/dsbridge.js"></script>
+  <script src="https://cdn.reallyshort.cn/static/markmap/d3.js"></script>
+  <script src="https://cdn.reallyshort.cn/static/markmap/markmap-lib.js"></script>
+  <script src="https://cdn.reallyshort.cn/static/markmap/markmap-view.js"></script>
+
 </head>
 
 <body>

+ 5 - 11
assets/html/index_export.html

@@ -19,11 +19,11 @@
         }
     </style>
 
-    <script src="./dsbridge.js"></script>
-    <script src="./d3.js"></script>
-    <script src="./markmap-lib.js"></script>
-    <script src="./markmap-view.js"></script>
-    <script src="./svg-png.js"></script>
+    <script src="https://cdn.reallyshort.cn/static/markmap/dsbridge.js"></script>
+    <script src="https://cdn.reallyshort.cn/static/markmap/d3.js"></script>
+    <script src="https://cdn.reallyshort.cn/static/markmap/markmap-lib.js"></script>
+    <script src="https://cdn.reallyshort.cn/static/markmap/markmap-view.js"></script>
+    <script src="https://cdn.reallyshort.cn/static/markmap/svg-png.js"></script>
 </head>
 
 <body>
@@ -104,12 +104,6 @@
       });
     }
 
-
-    // 注册更新数据的方法
-    dsBridge.register("updateValue", function (value) {
-      description = value;
-      updateValue(value);
-    });
     // 导出
     dsBridge.registerAsyn("export", async (fileName,summary, responseCallback) => {
       if (fileName) {

File diff suppressed because it is too large
+ 0 - 10
assets/html/markmap-lib.js


File diff suppressed because it is too large
+ 0 - 12
assets/html/markmap-view.js


+ 0 - 58
assets/html/svg-png.js

@@ -1,58 +0,0 @@
-/**
- * Minified by jsDelivr using Terser v5.15.1.
- * Original file: /npm/d3-svg-to-png@0.3.1/index.js
- *
- * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
- */
-function inlineStyles(e, t) {
-  const n = window.getComputedStyle(e);
-  for (const e of n) t.style[e] = n[e];
-  for (let n = 0; n < e.children.length; n++) inlineStyles(e.children[n], t.children[n]);
-}
-function copyToCanvas({ source: e, target: t, scale: n, format: o, quality: l }) {
-  let a = new XMLSerializer().serializeToString(t),
-    i = document.createElement("canvas"),
-    r = e.getBoundingClientRect();
-  (i.width = r.width * n), (i.height = r.height * n), (i.style.width = r.width), (i.style.height = r.height);
-  let c = i.getContext("2d");
-  c.scale(n, n);
-  let d = document.createElement("img");
-  return (
-    d.setAttribute("src", "data:image/svg+xml;base64," + btoa(unescape(encodeURIComponent(a)))),
-    new Promise((e) => {
-      d.onload = () => {
-        c.drawImage(d, 0, 0), e(i.toDataURL(`image/${"jpg" === o ? "jpeg" : o}`, l));
-      };
-    })
-  );
-}
-function downloadImage({ file: e, name: t, format: n }) {
-  let o = document.createElement("a");
-  (o.download = `${t}.${n}`), (o.href = e), document.body.appendChild(o), o.click(), document.body.removeChild(o);
-}
-async function svgToPng(
-  e,
-  t,
-  {
-    scale: n = 1,
-    format: o = "png",
-    quality: l = 0.92,
-    download: a = !0,
-    ignore: i = null,
-    cssinline: r = 1,
-    background: c = null,
-  } = {}
-) {
-  e = e instanceof Element ? e : document.querySelector(e);
-  const d = document.createElementNS("http://www.w3.org/2000/svg", "svg");
-  d.innerHTML = e.innerHTML;
-  for (const t of e.attributes) d.setAttribute(t.name, t.value);
-  if ((1 === r && inlineStyles(e, d), c && (d.style.background = c), null != i)) {
-    const e = d.querySelectorAll(i);
-    [].forEach.call(e, (e) => e.parentNode.removeChild(e));
-  }
-  const s = await copyToCanvas({ source: e, target: d, scale: n, format: o, quality: l });
-  return a && downloadImage({ file: s, name: t, format: o }), s;
-}
-window.svgToPng = svgToPng;
-//# sourceMappingURL=/sm/14eea0125d103380ac8a8d5d87aec7122e2b707361f72c63dfeb2e62361d38e4.map

+ 1 - 0
assets/string/base/string.xml

@@ -152,4 +152,5 @@
     <string name="template_add_title">自定义模板</string>
     <string name="template_too_much">模板太多啦,去模板管理做下精简吧</string>
     <string name="template_to_manage">去管理</string>
+    <string name="mind_map_export">正在导出...</string>
 </resources>

+ 34 - 9
lib/module/talk/controller.dart

@@ -1,5 +1,4 @@
 import 'dart:async';
-import 'dart:ffi';
 import 'dart:io';
 import 'package:connectivity_plus/connectivity_plus.dart';
 import 'package:dsbridge_flutter/dsbridge_flutter.dart';
@@ -43,6 +42,7 @@ import '../../data/repositories/agenda_repository.dart';
 import '../../data/repositories/talk_repository.dart';
 import '../../dialog/add_agenda_dialog.dart';
 import '../../dialog/alert_dialog.dart';
+import '../../dialog/loading_dialog.dart';
 import '../../dialog/rename_dialog.dart';
 import '../../dialog/talk_share_dialog.dart';
 import '../../utils/common_utils.dart';
@@ -645,7 +645,7 @@ class TalkController extends BaseController {
           _shareSummaryOrOriginal(
               talkBean.value!.id, fileName, type, shareTo, tag);
         } else if (type == ShareTalkType.mindMap) {
-          _shareMindMap(fileName, talkBean.value?.summary.value, tag);
+          _shareMindMap(fileName, talkBean.value?.summary.value, shareTo, tag);
         }
       } catch (error) {
         if (error is SystemShareException) {
@@ -677,22 +677,33 @@ class TalkController extends BaseController {
     return true;
   }
 
-  void _shareMindMap(String title, String? summary, String tag) {
+  void _shareMindMap(
+      String title, String? summary, ShareTo shareTo, String tag) {
+    LoadingDialog.show(StringName.mindMapExport.tr, backDismiss: true);
     if (_temporaryController.value != null) {
       _temporaryController.value?.dispose();
       _temporaryController.value = null;
     }
     final temporaryController = MindUtil.createMindWebViewController();
+
+    VoidCallback? errorCallback = () {
+      LoadingDialog.hide();
+      temporaryController.dispose();
+      ToastUtil.showToast('思维导图导出失败');
+    };
+
     try {
       _temporaryController.value = temporaryController;
       temporaryController.loadFlutterAsset(Assets.html.indexExport);
       temporaryController.setNavigationDelegate(
         NavigationDelegate(
           onHttpError: (error) {
-            temporaryController.dispose();
+            errorCallback?.call();
+            errorCallback = null;
           },
           onWebResourceError: (error) {
-            temporaryController.dispose();
+            errorCallback?.call();
+            errorCallback = null;
           },
           onPageFinished: (String url) {
             temporaryController.callHandler(MindUtil.functionToJsExport,
@@ -700,16 +711,30 @@ class TalkController extends BaseController {
               if (value == null) {
                 throw Exception('data is null');
               }
-              await MindUtil.saveToFile(value, title);
+              File file = await MindUtil.saveToFile(value, title);
               temporaryController.dispose();
-              ToastUtil.showToast('下载成功');
+              if (shareTo == ShareTo.wechat) {
+                await SystemShareUtil.shareSystemFile(
+                    SystemShareUtil.wechatPageName, file.path,
+                    shareTitle: '分享到微信', shareFileType: 'image/*');
+              } else if (shareTo == ShareTo.qq) {
+                await SystemShareUtil.shareSystemFile(
+                    SystemShareUtil.qqPageName, file.path,
+                    shareTitle: '分享到QQ', shareFileType: 'image/*');
+              } else if (shareTo == ShareTo.ios) {
+                await Share.shareXFiles([XFile(file.path)], subject: title);
+              } else {
+                throw Exception('不支持该分享方式');
+              }
+              SmartDialog.dismiss(tag: tag);
+              LoadingDialog.hide();
             });
           },
         ),
       );
     } catch (e) {
-      temporaryController.dispose();
-      ToastUtil.showToast('思维导图导出失败');
+      errorCallback?.call();
+      errorCallback = null;
     }
   }
 

+ 3 - 2
lib/module/talk/mindmap/mind_util.dart

@@ -35,13 +35,14 @@ class MindUtil {
     return webViewController;
   }
 
-  static Future<void> convertToFile(Uint8List bytes, String fileName) async {
+  static Future<File> convertToFile(Uint8List bytes, String fileName) async {
     final directory = await getTemporaryDirectory();
     final file = File('${directory.path}/mind/$fileName');
     if (!file.existsSync()) {
       file.createSync(recursive: true);
     }
     await file.writeAsBytes(bytes);
+    return file;
   }
 
   static Future<void> convertMapDataToToFile(
@@ -89,7 +90,7 @@ class MindUtil {
     return bytes?.buffer.asUint8List();
   }
 
-  static Future<void> saveToFile(dynamic value, String fileName) async {
+  static Future<File> saveToFile(dynamic value, String fileName) async {
     Uint8List? bytes = convertToUint8List(value);
     if (bytes == null) {
       throw Exception('bytes is null');