@yltrcc/vditor 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.css CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vditor v0.0.4 - A markdown editor written in TypeScript.
2
+ * Vditor v0.0.6 - A markdown editor written in TypeScript.
3
3
  *
4
4
  * MIT License
5
5
  *
@@ -25,7 +25,7 @@
25
25
  *
26
26
  */
27
27
  /*!
28
- * Vditor v0.0.4 - A markdown editor written in TypeScript.
28
+ * Vditor v0.0.6 - A markdown editor written in TypeScript.
29
29
  *
30
30
  * MIT License
31
31
  *
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vditor v0.0.4 - A markdown editor written in TypeScript.
2
+ * Vditor v0.0.6 - A markdown editor written in TypeScript.
3
3
  *
4
4
  * MIT License
5
5
  *
@@ -1060,7 +1060,8 @@ var insertHTML = function (html, vditor) {
1060
1060
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1061
1061
  /* harmony export */ BS: () => (/* binding */ renderDocLink),
1062
1062
  /* harmony export */ handleDocLinkClick: () => (/* binding */ handleDocLinkClick),
1063
- /* harmony export */ qo: () => (/* binding */ processDocLinkInWYSIWYG)
1063
+ /* harmony export */ qo: () => (/* binding */ processDocLinkInWYSIWYG),
1064
+ /* harmony export */ uN: () => (/* binding */ getDocLinkMarkdown)
1064
1065
  /* harmony export */ });
1065
1066
  /* unused harmony exports extractDocLinks, hasDocLink */
1066
1067
  /**
@@ -1079,7 +1080,7 @@ var renderDocLink = function (html, vditor) {
1079
1080
  if (((_b = (_a = vditor === null || vditor === void 0 ? void 0 : vditor.options) === null || _a === void 0 ? void 0 : _a.citation) === null || _b === void 0 ? void 0 : _b.enable) === false) {
1080
1081
  return html;
1081
1082
  }
1082
- return html.replace(DOCLINK_REGEX, '<span class="vditor-doclink" data-doc-id="$1" data-doc-text="$2">$2</span>');
1083
+ return html.replace(DOCLINK_REGEX, '<span class="vditor-doclink" data-doc-id="$1" data-doc-text="$2" data-doc-markdown="(($1 \'$2\'))">$2</span>');
1083
1084
  };
1084
1085
  /**
1085
1086
  * 在 WYSIWYG 编辑器中处理文档链接的实时渲染
@@ -1110,7 +1111,8 @@ var processDocLinkInWYSIWYG = function (element, vditor) {
1110
1111
  index: match.index,
1111
1112
  length: match[0].length,
1112
1113
  id: match[1],
1113
- text: match[2]
1114
+ text: match[2],
1115
+ fullMatch: match[0]
1114
1116
  });
1115
1117
  }
1116
1118
  if (matches.length === 0)
@@ -1126,19 +1128,26 @@ var processDocLinkInWYSIWYG = function (element, vditor) {
1126
1128
  if (m.index > lastIndex) {
1127
1129
  fragments.push(document.createTextNode(text.slice(lastIndex, m.index)));
1128
1130
  }
1129
- // 创建文档链接元素
1131
+ // 创建文档链接容器 - 使用 contenteditable="false" 防止编辑时破坏结构
1132
+ var container = document.createElement("span");
1133
+ container.className = "vditor-doclink-wrapper";
1134
+ container.setAttribute("contenteditable", "false");
1135
+ container.setAttribute("data-doc-id", m.id);
1136
+ container.setAttribute("data-doc-text", m.text);
1137
+ // 存储完整的 Markdown 语法,用于复制
1138
+ container.setAttribute("data-doc-markdown", m.fullMatch);
1139
+ // 创建显示文本的元素
1130
1140
  var span = document.createElement("span");
1131
1141
  span.className = "vditor-doclink";
1132
- span.setAttribute("data-doc-id", m.id);
1133
- span.setAttribute("data-doc-text", m.text);
1134
1142
  span.textContent = m.text;
1135
1143
  // 绑定点击事件
1136
- span.onclick = function (e) {
1144
+ container.onclick = function (e) {
1137
1145
  e.preventDefault();
1138
1146
  e.stopPropagation();
1139
1147
  handleDocLinkClick(m.id, m.text, vditor);
1140
1148
  };
1141
- fragments.push(span);
1149
+ container.appendChild(span);
1150
+ fragments.push(container);
1142
1151
  lastIndex = m.index + m.length;
1143
1152
  });
1144
1153
  // 添加剩余文本
@@ -1201,6 +1210,24 @@ var extractDocLinks = function (markdown) {
1201
1210
  var hasDocLink = function (text) {
1202
1211
  return DOCLINK_REGEX.test(text);
1203
1212
  };
1213
+ /**
1214
+ * 获取文档链接的 Markdown 语法
1215
+ * 用于复制操作时恢复原始语法
1216
+ */
1217
+ var getDocLinkMarkdown = function (element) {
1218
+ // 优先从 data-doc-markdown 属性获取
1219
+ var markdown = element.getAttribute("data-doc-markdown");
1220
+ if (markdown) {
1221
+ return markdown;
1222
+ }
1223
+ // 从 data-doc-id 和 data-doc-text 重建
1224
+ var id = element.getAttribute("data-doc-id");
1225
+ var text = element.getAttribute("data-doc-text");
1226
+ if (id && text) {
1227
+ return "((".concat(id, " '").concat(text, "'))");
1228
+ }
1229
+ return null;
1230
+ };
1204
1231
 
1205
1232
 
1206
1233
  /***/ },
@@ -1240,7 +1267,7 @@ var looseJsonParse = function (text) {
1240
1267
  /* harmony export */ Y: () => (/* binding */ Constants),
1241
1268
  /* harmony export */ g: () => (/* binding */ _VDITOR_VERSION)
1242
1269
  /* harmony export */ });
1243
- var _VDITOR_VERSION = "0.0.4";
1270
+ var _VDITOR_VERSION = "0.0.6";
1244
1271
 
1245
1272
  var Constants = /** @class */ (function () {
1246
1273
  function Constants() {
@@ -1288,7 +1315,7 @@ var Constants = /** @class */ (function () {
1288
1315
  // 别名
1289
1316
  "js", "ts", "html", "toml", "c#", "bat"
1290
1317
  ];
1291
- Constants.CDN = "https://unpkg.com/@yltrcc/vditor@".concat("0.0.4");
1318
+ Constants.CDN = "https://unpkg.com/@yltrcc/vditor@".concat("0.0.6");
1292
1319
  Constants.MARKDOWN_OPTIONS = {
1293
1320
  autoSpace: false,
1294
1321
  gfmAutoLink: true,
@@ -5039,15 +5066,61 @@ var constants = __webpack_require__(357);
5039
5066
  var code160to32 = __webpack_require__(435);
5040
5067
  ;// ./src/ts/markdown/getMarkdown.ts
5041
5068
 
5069
+ /**
5070
+ * 将 doclink DOM 元素转换回 Markdown 语法
5071
+ * 处理 <span class="vditor-doclink-wrapper" data-doc-markdown="((id 'text'))">text</span>
5072
+ */
5073
+ var processDocLinksInHTML = function (html) {
5074
+ // 创建临时 DOM 元素来解析 HTML
5075
+ var tempDiv = document.createElement("div");
5076
+ tempDiv.innerHTML = html;
5077
+ // 查找所有 doclink wrapper 元素
5078
+ var docLinkWrappers = tempDiv.querySelectorAll(".vditor-doclink-wrapper");
5079
+ docLinkWrappers.forEach(function (wrapper) {
5080
+ var markdown = wrapper.getAttribute("data-doc-markdown");
5081
+ if (markdown) {
5082
+ // 用文本节点替换整个 wrapper,内容为 Markdown 语法
5083
+ wrapper.replaceWith(document.createTextNode(markdown));
5084
+ }
5085
+ else {
5086
+ // 如果没有 data-doc-markdown,尝试从 data-doc-id 和 data-doc-text 重建
5087
+ var id = wrapper.getAttribute("data-doc-id");
5088
+ var text = wrapper.getAttribute("data-doc-text");
5089
+ if (id && text) {
5090
+ wrapper.replaceWith(document.createTextNode("((".concat(id, " '").concat(text, "'))")));
5091
+ }
5092
+ }
5093
+ });
5094
+ // 也处理旧的 .vditor-doclink 元素(没有 wrapper 的情况)
5095
+ var docLinks = tempDiv.querySelectorAll(".vditor-doclink");
5096
+ docLinks.forEach(function (link) {
5097
+ var markdown = link.getAttribute("data-doc-markdown");
5098
+ if (markdown) {
5099
+ link.replaceWith(document.createTextNode(markdown));
5100
+ }
5101
+ else {
5102
+ var id = link.getAttribute("data-doc-id");
5103
+ var text = link.getAttribute("data-doc-text");
5104
+ if (id && text) {
5105
+ link.replaceWith(document.createTextNode("((".concat(id, " '").concat(text, "'))")));
5106
+ }
5107
+ }
5108
+ });
5109
+ return tempDiv.innerHTML;
5110
+ };
5042
5111
  var getMarkdown = function (vditor) {
5043
5112
  if (vditor.currentMode === "sv") {
5044
5113
  return (0,code160to32/* code160to32 */.p)("".concat(vditor.sv.element.textContent, "\n").replace(/\n\n$/, "\n"));
5045
5114
  }
5046
5115
  else if (vditor.currentMode === "wysiwyg") {
5047
- return vditor.lute.VditorDOM2Md(vditor.wysiwyg.element.innerHTML);
5116
+ // 先处理 doclink 元素,将其转换回 Markdown 语法
5117
+ var processedHTML = processDocLinksInHTML(vditor.wysiwyg.element.innerHTML);
5118
+ return vditor.lute.VditorDOM2Md(processedHTML);
5048
5119
  }
5049
5120
  else if (vditor.currentMode === "ir") {
5050
- return vditor.lute.VditorIRDOM2Md(vditor.ir.element.innerHTML);
5121
+ // 同样处理 IR 模式
5122
+ var processedHTML = processDocLinksInHTML(vditor.ir.element.innerHTML);
5123
+ return vditor.lute.VditorIRDOM2Md(processedHTML);
5051
5124
  }
5052
5125
  return "";
5053
5126
  };
@@ -15123,6 +15196,7 @@ var Options = /** @class */ (function () {
15123
15196
 
15124
15197
 
15125
15198
 
15199
+
15126
15200
  var WYSIWYG = /** @class */ (function () {
15127
15201
  function WYSIWYG(vditor) {
15128
15202
  var _this = this;
@@ -15311,6 +15385,15 @@ var WYSIWYG = /** @class */ (function () {
15311
15385
  }
15312
15386
  var tempElement = document.createElement("div");
15313
15387
  tempElement.appendChild(range.cloneContents());
15388
+ // 处理文档链接的复制 - 将渲染后的元素替换为原始 Markdown 语法
15389
+ var docLinkElements = tempElement.querySelectorAll(".vditor-doclink-wrapper, .vditor-doclink");
15390
+ docLinkElements.forEach(function (el) {
15391
+ var markdown = (0,docLink/* getDocLinkMarkdown */.uN)(el);
15392
+ if (markdown) {
15393
+ // 用文本节点替换元素,内容为 Markdown 语法
15394
+ el.replaceWith(document.createTextNode(markdown));
15395
+ }
15396
+ });
15314
15397
  event.clipboardData.setData("text/plain", vditor.lute.VditorDOM2Md(tempElement.innerHTML).trim());
15315
15398
  event.clipboardData.setData("text/html", "");
15316
15399
  };