15995 lines
685 KiB
JavaScript
15995 lines
685 KiB
JavaScript
|
|
/*!
|
|||
|
|
* Vditor v3.11.2 - A markdown editor written in TypeScript.
|
|||
|
|
*
|
|||
|
|
* MIT License
|
|||
|
|
*
|
|||
|
|
* Copyright (c) 2018-present B3log 开源, b3log.org
|
|||
|
|
*
|
|||
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|||
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|||
|
|
* in the Software without restriction, including without limitation the rights
|
|||
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|||
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|||
|
|
* furnished to do so, subject to the following conditions:
|
|||
|
|
*
|
|||
|
|
* The above copyright notice and this permission notice shall be included in all
|
|||
|
|
* copies or substantial portions of the Software.
|
|||
|
|
*
|
|||
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|||
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|||
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|||
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|||
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|||
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|||
|
|
* SOFTWARE.
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
(function webpackUniversalModuleDefinition(root, factory) {
|
|||
|
|
if(typeof exports === 'object' && typeof module === 'object')
|
|||
|
|
module.exports = factory();
|
|||
|
|
else if(typeof define === 'function' && define.amd)
|
|||
|
|
define([], factory);
|
|||
|
|
else if(typeof exports === 'object')
|
|||
|
|
exports["Vditor"] = factory();
|
|||
|
|
else
|
|||
|
|
root["Vditor"] = factory();
|
|||
|
|
})(this, function() {
|
|||
|
|
return /******/ (() => { // webpackBootstrap
|
|||
|
|
/******/ var __webpack_modules__ = ({
|
|||
|
|
|
|||
|
|
/***/ 173:
|
|||
|
|
/***/ ((module) => {
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Diff Match and Patch
|
|||
|
|
* Copyright 2018 The diff-match-patch Authors.
|
|||
|
|
* https://github.com/google/diff-match-patch
|
|||
|
|
*
|
|||
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|||
|
|
* you may not use this file except in compliance with the License.
|
|||
|
|
* You may obtain a copy of the License at
|
|||
|
|
*
|
|||
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|||
|
|
*
|
|||
|
|
* Unless required by applicable law or agreed to in writing, software
|
|||
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|||
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|||
|
|
* See the License for the specific language governing permissions and
|
|||
|
|
* limitations under the License.
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @fileoverview Computes the difference between two texts to create a patch.
|
|||
|
|
* Applies the patch onto another text, allowing for errors.
|
|||
|
|
* @author fraser@google.com (Neil Fraser)
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Class containing the diff, match and patch methods.
|
|||
|
|
* @constructor
|
|||
|
|
*/
|
|||
|
|
var diff_match_patch = function () {
|
|||
|
|
// Defaults.
|
|||
|
|
// Redefine these in your program to override the defaults.
|
|||
|
|
|
|||
|
|
// Number of seconds to map a diff before giving up (0 for infinity).
|
|||
|
|
this.Diff_Timeout = 1.0;
|
|||
|
|
// Cost of an empty edit operation in terms of edit characters.
|
|||
|
|
this.Diff_EditCost = 4;
|
|||
|
|
// At what point is no match declared (0.0 = perfection, 1.0 = very loose).
|
|||
|
|
this.Match_Threshold = 0.5;
|
|||
|
|
// How far to search for a match (0 = exact location, 1000+ = broad match).
|
|||
|
|
// A match this many characters away from the expected location will add
|
|||
|
|
// 1.0 to the score (0.0 is a perfect match).
|
|||
|
|
this.Match_Distance = 1000;
|
|||
|
|
// When deleting a large block of text (over ~64 characters), how close do
|
|||
|
|
// the contents have to be to match the expected contents. (0.0 = perfection,
|
|||
|
|
// 1.0 = very loose). Note that Match_Threshold controls how closely the
|
|||
|
|
// end points of a delete need to match.
|
|||
|
|
this.Patch_DeleteThreshold = 0.5;
|
|||
|
|
// Chunk size for context length.
|
|||
|
|
this.Patch_Margin = 4;
|
|||
|
|
|
|||
|
|
// The number of bits in an int.
|
|||
|
|
this.Match_MaxBits = 32;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// DIFF FUNCTIONS
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* The data structure representing a diff is an array of tuples:
|
|||
|
|
* [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]
|
|||
|
|
* which means: delete 'Hello', add 'Goodbye' and keep ' world.'
|
|||
|
|
*/
|
|||
|
|
var DIFF_DELETE = -1;
|
|||
|
|
var DIFF_INSERT = 1;
|
|||
|
|
var DIFF_EQUAL = 0;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Class representing one diff tuple.
|
|||
|
|
* ~Attempts to look like a two-element array (which is what this used to be).~
|
|||
|
|
* Constructor returns an actual two-element array, to allow destructing @JackuB
|
|||
|
|
* See https://github.com/JackuB/diff-match-patch/issues/14 for details
|
|||
|
|
* @param {number} op Operation, one of: DIFF_DELETE, DIFF_INSERT, DIFF_EQUAL.
|
|||
|
|
* @param {string} text Text to be deleted, inserted, or retained.
|
|||
|
|
* @constructor
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.Diff = function (op, text) {
|
|||
|
|
return [op, text];
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Find the differences between two texts. Simplifies the problem by stripping
|
|||
|
|
* any common prefix or suffix off the texts before diffing.
|
|||
|
|
* @param {string} text1 Old string to be diffed.
|
|||
|
|
* @param {string} text2 New string to be diffed.
|
|||
|
|
* @param {boolean=} opt_checklines Optional speedup flag. If present and false,
|
|||
|
|
* then don't run a line-level diff first to identify the changed areas.
|
|||
|
|
* Defaults to true, which does a faster, slightly less optimal diff.
|
|||
|
|
* @param {number=} opt_deadline Optional time when the diff should be complete
|
|||
|
|
* by. Used internally for recursive calls. Users should set DiffTimeout
|
|||
|
|
* instead.
|
|||
|
|
* @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_main = function (text1, text2, opt_checklines, opt_deadline) {
|
|||
|
|
// Set a deadline by which time the diff must be complete.
|
|||
|
|
if (typeof opt_deadline == 'undefined') {
|
|||
|
|
if (this.Diff_Timeout <= 0) {
|
|||
|
|
opt_deadline = Number.MAX_VALUE;
|
|||
|
|
} else {
|
|||
|
|
opt_deadline = new Date().getTime() + this.Diff_Timeout * 1000;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var deadline = opt_deadline;
|
|||
|
|
|
|||
|
|
// Check for null inputs.
|
|||
|
|
if (text1 == null || text2 == null) {
|
|||
|
|
throw new Error('Null input. (diff_main)');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Check for equality (speedup).
|
|||
|
|
if (text1 == text2) {
|
|||
|
|
if (text1) {
|
|||
|
|
return [new diff_match_patch.Diff(DIFF_EQUAL, text1)];
|
|||
|
|
}
|
|||
|
|
return [];
|
|||
|
|
}
|
|||
|
|
if (typeof opt_checklines == 'undefined') {
|
|||
|
|
opt_checklines = true;
|
|||
|
|
}
|
|||
|
|
var checklines = opt_checklines;
|
|||
|
|
|
|||
|
|
// Trim off common prefix (speedup).
|
|||
|
|
var commonlength = this.diff_commonPrefix(text1, text2);
|
|||
|
|
var commonprefix = text1.substring(0, commonlength);
|
|||
|
|
text1 = text1.substring(commonlength);
|
|||
|
|
text2 = text2.substring(commonlength);
|
|||
|
|
|
|||
|
|
// Trim off common suffix (speedup).
|
|||
|
|
commonlength = this.diff_commonSuffix(text1, text2);
|
|||
|
|
var commonsuffix = text1.substring(text1.length - commonlength);
|
|||
|
|
text1 = text1.substring(0, text1.length - commonlength);
|
|||
|
|
text2 = text2.substring(0, text2.length - commonlength);
|
|||
|
|
|
|||
|
|
// Compute the diff on the middle block.
|
|||
|
|
var diffs = this.diff_compute_(text1, text2, checklines, deadline);
|
|||
|
|
|
|||
|
|
// Restore the prefix and suffix.
|
|||
|
|
if (commonprefix) {
|
|||
|
|
diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, commonprefix));
|
|||
|
|
}
|
|||
|
|
if (commonsuffix) {
|
|||
|
|
diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, commonsuffix));
|
|||
|
|
}
|
|||
|
|
this.diff_cleanupMerge(diffs);
|
|||
|
|
return diffs;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Find the differences between two texts. Assumes that the texts do not
|
|||
|
|
* have any common prefix or suffix.
|
|||
|
|
* @param {string} text1 Old string to be diffed.
|
|||
|
|
* @param {string} text2 New string to be diffed.
|
|||
|
|
* @param {boolean} checklines Speedup flag. If false, then don't run a
|
|||
|
|
* line-level diff first to identify the changed areas.
|
|||
|
|
* If true, then run a faster, slightly less optimal diff.
|
|||
|
|
* @param {number} deadline Time when the diff should be complete by.
|
|||
|
|
* @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_compute_ = function (text1, text2, checklines, deadline) {
|
|||
|
|
var diffs;
|
|||
|
|
if (!text1) {
|
|||
|
|
// Just add some text (speedup).
|
|||
|
|
return [new diff_match_patch.Diff(DIFF_INSERT, text2)];
|
|||
|
|
}
|
|||
|
|
if (!text2) {
|
|||
|
|
// Just delete some text (speedup).
|
|||
|
|
return [new diff_match_patch.Diff(DIFF_DELETE, text1)];
|
|||
|
|
}
|
|||
|
|
var longtext = text1.length > text2.length ? text1 : text2;
|
|||
|
|
var shorttext = text1.length > text2.length ? text2 : text1;
|
|||
|
|
var i = longtext.indexOf(shorttext);
|
|||
|
|
if (i != -1) {
|
|||
|
|
// Shorter text is inside the longer text (speedup).
|
|||
|
|
diffs = [new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(0, i)), new diff_match_patch.Diff(DIFF_EQUAL, shorttext), new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(i + shorttext.length))];
|
|||
|
|
// Swap insertions for deletions if diff is reversed.
|
|||
|
|
if (text1.length > text2.length) {
|
|||
|
|
diffs[0][0] = diffs[2][0] = DIFF_DELETE;
|
|||
|
|
}
|
|||
|
|
return diffs;
|
|||
|
|
}
|
|||
|
|
if (shorttext.length == 1) {
|
|||
|
|
// Single character string.
|
|||
|
|
// After the previous speedup, the character can't be an equality.
|
|||
|
|
return [new diff_match_patch.Diff(DIFF_DELETE, text1), new diff_match_patch.Diff(DIFF_INSERT, text2)];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Check to see if the problem can be split in two.
|
|||
|
|
var hm = this.diff_halfMatch_(text1, text2);
|
|||
|
|
if (hm) {
|
|||
|
|
// A half-match was found, sort out the return data.
|
|||
|
|
var text1_a = hm[0];
|
|||
|
|
var text1_b = hm[1];
|
|||
|
|
var text2_a = hm[2];
|
|||
|
|
var text2_b = hm[3];
|
|||
|
|
var mid_common = hm[4];
|
|||
|
|
// Send both pairs off for separate processing.
|
|||
|
|
var diffs_a = this.diff_main(text1_a, text2_a, checklines, deadline);
|
|||
|
|
var diffs_b = this.diff_main(text1_b, text2_b, checklines, deadline);
|
|||
|
|
// Merge the results.
|
|||
|
|
return diffs_a.concat([new diff_match_patch.Diff(DIFF_EQUAL, mid_common)], diffs_b);
|
|||
|
|
}
|
|||
|
|
if (checklines && text1.length > 100 && text2.length > 100) {
|
|||
|
|
return this.diff_lineMode_(text1, text2, deadline);
|
|||
|
|
}
|
|||
|
|
return this.diff_bisect_(text1, text2, deadline);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Do a quick line-level diff on both strings, then rediff the parts for
|
|||
|
|
* greater accuracy.
|
|||
|
|
* This speedup can produce non-minimal diffs.
|
|||
|
|
* @param {string} text1 Old string to be diffed.
|
|||
|
|
* @param {string} text2 New string to be diffed.
|
|||
|
|
* @param {number} deadline Time when the diff should be complete by.
|
|||
|
|
* @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_lineMode_ = function (text1, text2, deadline) {
|
|||
|
|
// Scan the text on a line-by-line basis first.
|
|||
|
|
var a = this.diff_linesToChars_(text1, text2);
|
|||
|
|
text1 = a.chars1;
|
|||
|
|
text2 = a.chars2;
|
|||
|
|
var linearray = a.lineArray;
|
|||
|
|
var diffs = this.diff_main(text1, text2, false, deadline);
|
|||
|
|
|
|||
|
|
// Convert the diff back to original text.
|
|||
|
|
this.diff_charsToLines_(diffs, linearray);
|
|||
|
|
// Eliminate freak matches (e.g. blank lines)
|
|||
|
|
this.diff_cleanupSemantic(diffs);
|
|||
|
|
|
|||
|
|
// Rediff any replacement blocks, this time character-by-character.
|
|||
|
|
// Add a dummy entry at the end.
|
|||
|
|
diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));
|
|||
|
|
var pointer = 0;
|
|||
|
|
var count_delete = 0;
|
|||
|
|
var count_insert = 0;
|
|||
|
|
var text_delete = '';
|
|||
|
|
var text_insert = '';
|
|||
|
|
while (pointer < diffs.length) {
|
|||
|
|
switch (diffs[pointer][0]) {
|
|||
|
|
case DIFF_INSERT:
|
|||
|
|
count_insert++;
|
|||
|
|
text_insert += diffs[pointer][1];
|
|||
|
|
break;
|
|||
|
|
case DIFF_DELETE:
|
|||
|
|
count_delete++;
|
|||
|
|
text_delete += diffs[pointer][1];
|
|||
|
|
break;
|
|||
|
|
case DIFF_EQUAL:
|
|||
|
|
// Upon reaching an equality, check for prior redundancies.
|
|||
|
|
if (count_delete >= 1 && count_insert >= 1) {
|
|||
|
|
// Delete the offending records and add the merged ones.
|
|||
|
|
diffs.splice(pointer - count_delete - count_insert, count_delete + count_insert);
|
|||
|
|
pointer = pointer - count_delete - count_insert;
|
|||
|
|
var subDiff = this.diff_main(text_delete, text_insert, false, deadline);
|
|||
|
|
for (var j = subDiff.length - 1; j >= 0; j--) {
|
|||
|
|
diffs.splice(pointer, 0, subDiff[j]);
|
|||
|
|
}
|
|||
|
|
pointer = pointer + subDiff.length;
|
|||
|
|
}
|
|||
|
|
count_insert = 0;
|
|||
|
|
count_delete = 0;
|
|||
|
|
text_delete = '';
|
|||
|
|
text_insert = '';
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
pointer++;
|
|||
|
|
}
|
|||
|
|
diffs.pop(); // Remove the dummy entry at the end.
|
|||
|
|
|
|||
|
|
return diffs;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Find the 'middle snake' of a diff, split the problem in two
|
|||
|
|
* and return the recursively constructed diff.
|
|||
|
|
* See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.
|
|||
|
|
* @param {string} text1 Old string to be diffed.
|
|||
|
|
* @param {string} text2 New string to be diffed.
|
|||
|
|
* @param {number} deadline Time at which to bail if not yet complete.
|
|||
|
|
* @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_bisect_ = function (text1, text2, deadline) {
|
|||
|
|
// Cache the text lengths to prevent multiple calls.
|
|||
|
|
var text1_length = text1.length;
|
|||
|
|
var text2_length = text2.length;
|
|||
|
|
var max_d = Math.ceil((text1_length + text2_length) / 2);
|
|||
|
|
var v_offset = max_d;
|
|||
|
|
var v_length = 2 * max_d;
|
|||
|
|
var v1 = new Array(v_length);
|
|||
|
|
var v2 = new Array(v_length);
|
|||
|
|
// Setting all elements to -1 is faster in Chrome & Firefox than mixing
|
|||
|
|
// integers and undefined.
|
|||
|
|
for (var x = 0; x < v_length; x++) {
|
|||
|
|
v1[x] = -1;
|
|||
|
|
v2[x] = -1;
|
|||
|
|
}
|
|||
|
|
v1[v_offset + 1] = 0;
|
|||
|
|
v2[v_offset + 1] = 0;
|
|||
|
|
var delta = text1_length - text2_length;
|
|||
|
|
// If the total number of characters is odd, then the front path will collide
|
|||
|
|
// with the reverse path.
|
|||
|
|
var front = delta % 2 != 0;
|
|||
|
|
// Offsets for start and end of k loop.
|
|||
|
|
// Prevents mapping of space beyond the grid.
|
|||
|
|
var k1start = 0;
|
|||
|
|
var k1end = 0;
|
|||
|
|
var k2start = 0;
|
|||
|
|
var k2end = 0;
|
|||
|
|
for (var d = 0; d < max_d; d++) {
|
|||
|
|
// Bail out if deadline is reached.
|
|||
|
|
if (new Date().getTime() > deadline) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Walk the front path one step.
|
|||
|
|
for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {
|
|||
|
|
var k1_offset = v_offset + k1;
|
|||
|
|
var x1;
|
|||
|
|
if (k1 == -d || k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1]) {
|
|||
|
|
x1 = v1[k1_offset + 1];
|
|||
|
|
} else {
|
|||
|
|
x1 = v1[k1_offset - 1] + 1;
|
|||
|
|
}
|
|||
|
|
var y1 = x1 - k1;
|
|||
|
|
while (x1 < text1_length && y1 < text2_length && text1.charAt(x1) == text2.charAt(y1)) {
|
|||
|
|
x1++;
|
|||
|
|
y1++;
|
|||
|
|
}
|
|||
|
|
v1[k1_offset] = x1;
|
|||
|
|
if (x1 > text1_length) {
|
|||
|
|
// Ran off the right of the graph.
|
|||
|
|
k1end += 2;
|
|||
|
|
} else if (y1 > text2_length) {
|
|||
|
|
// Ran off the bottom of the graph.
|
|||
|
|
k1start += 2;
|
|||
|
|
} else if (front) {
|
|||
|
|
var k2_offset = v_offset + delta - k1;
|
|||
|
|
if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {
|
|||
|
|
// Mirror x2 onto top-left coordinate system.
|
|||
|
|
var x2 = text1_length - v2[k2_offset];
|
|||
|
|
if (x1 >= x2) {
|
|||
|
|
// Overlap detected.
|
|||
|
|
return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Walk the reverse path one step.
|
|||
|
|
for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {
|
|||
|
|
var k2_offset = v_offset + k2;
|
|||
|
|
var x2;
|
|||
|
|
if (k2 == -d || k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1]) {
|
|||
|
|
x2 = v2[k2_offset + 1];
|
|||
|
|
} else {
|
|||
|
|
x2 = v2[k2_offset - 1] + 1;
|
|||
|
|
}
|
|||
|
|
var y2 = x2 - k2;
|
|||
|
|
while (x2 < text1_length && y2 < text2_length && text1.charAt(text1_length - x2 - 1) == text2.charAt(text2_length - y2 - 1)) {
|
|||
|
|
x2++;
|
|||
|
|
y2++;
|
|||
|
|
}
|
|||
|
|
v2[k2_offset] = x2;
|
|||
|
|
if (x2 > text1_length) {
|
|||
|
|
// Ran off the left of the graph.
|
|||
|
|
k2end += 2;
|
|||
|
|
} else if (y2 > text2_length) {
|
|||
|
|
// Ran off the top of the graph.
|
|||
|
|
k2start += 2;
|
|||
|
|
} else if (!front) {
|
|||
|
|
var k1_offset = v_offset + delta - k2;
|
|||
|
|
if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {
|
|||
|
|
var x1 = v1[k1_offset];
|
|||
|
|
var y1 = v_offset + x1 - k1_offset;
|
|||
|
|
// Mirror x2 onto top-left coordinate system.
|
|||
|
|
x2 = text1_length - x2;
|
|||
|
|
if (x1 >= x2) {
|
|||
|
|
// Overlap detected.
|
|||
|
|
return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// Diff took too long and hit the deadline or
|
|||
|
|
// number of diffs equals number of characters, no commonality at all.
|
|||
|
|
return [new diff_match_patch.Diff(DIFF_DELETE, text1), new diff_match_patch.Diff(DIFF_INSERT, text2)];
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Given the location of the 'middle snake', split the diff in two parts
|
|||
|
|
* and recurse.
|
|||
|
|
* @param {string} text1 Old string to be diffed.
|
|||
|
|
* @param {string} text2 New string to be diffed.
|
|||
|
|
* @param {number} x Index of split point in text1.
|
|||
|
|
* @param {number} y Index of split point in text2.
|
|||
|
|
* @param {number} deadline Time at which to bail if not yet complete.
|
|||
|
|
* @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_bisectSplit_ = function (text1, text2, x, y, deadline) {
|
|||
|
|
var text1a = text1.substring(0, x);
|
|||
|
|
var text2a = text2.substring(0, y);
|
|||
|
|
var text1b = text1.substring(x);
|
|||
|
|
var text2b = text2.substring(y);
|
|||
|
|
|
|||
|
|
// Compute both diffs serially.
|
|||
|
|
var diffs = this.diff_main(text1a, text2a, false, deadline);
|
|||
|
|
var diffsb = this.diff_main(text1b, text2b, false, deadline);
|
|||
|
|
return diffs.concat(diffsb);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Split two texts into an array of strings. Reduce the texts to a string of
|
|||
|
|
* hashes where each Unicode character represents one line.
|
|||
|
|
* @param {string} text1 First string.
|
|||
|
|
* @param {string} text2 Second string.
|
|||
|
|
* @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}
|
|||
|
|
* An object containing the encoded text1, the encoded text2 and
|
|||
|
|
* the array of unique strings.
|
|||
|
|
* The zeroth element of the array of unique strings is intentionally blank.
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_linesToChars_ = function (text1, text2) {
|
|||
|
|
var lineArray = []; // e.g. lineArray[4] == 'Hello\n'
|
|||
|
|
var lineHash = {}; // e.g. lineHash['Hello\n'] == 4
|
|||
|
|
|
|||
|
|
// '\x00' is a valid character, but various debuggers don't like it.
|
|||
|
|
// So we'll insert a junk entry to avoid generating a null character.
|
|||
|
|
lineArray[0] = '';
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Split a text into an array of strings. Reduce the texts to a string of
|
|||
|
|
* hashes where each Unicode character represents one line.
|
|||
|
|
* Modifies linearray and linehash through being a closure.
|
|||
|
|
* @param {string} text String to encode.
|
|||
|
|
* @return {string} Encoded string.
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
function diff_linesToCharsMunge_(text) {
|
|||
|
|
var chars = '';
|
|||
|
|
// Walk the text, pulling out a substring for each line.
|
|||
|
|
// text.split('\n') would would temporarily double our memory footprint.
|
|||
|
|
// Modifying text would create many large strings to garbage collect.
|
|||
|
|
var lineStart = 0;
|
|||
|
|
var lineEnd = -1;
|
|||
|
|
// Keeping our own length variable is faster than looking it up.
|
|||
|
|
var lineArrayLength = lineArray.length;
|
|||
|
|
while (lineEnd < text.length - 1) {
|
|||
|
|
lineEnd = text.indexOf('\n', lineStart);
|
|||
|
|
if (lineEnd == -1) {
|
|||
|
|
lineEnd = text.length - 1;
|
|||
|
|
}
|
|||
|
|
var line = text.substring(lineStart, lineEnd + 1);
|
|||
|
|
if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : lineHash[line] !== undefined) {
|
|||
|
|
chars += String.fromCharCode(lineHash[line]);
|
|||
|
|
} else {
|
|||
|
|
if (lineArrayLength == maxLines) {
|
|||
|
|
// Bail out at 65535 because
|
|||
|
|
// String.fromCharCode(65536) == String.fromCharCode(0)
|
|||
|
|
line = text.substring(lineStart);
|
|||
|
|
lineEnd = text.length;
|
|||
|
|
}
|
|||
|
|
chars += String.fromCharCode(lineArrayLength);
|
|||
|
|
lineHash[line] = lineArrayLength;
|
|||
|
|
lineArray[lineArrayLength++] = line;
|
|||
|
|
}
|
|||
|
|
lineStart = lineEnd + 1;
|
|||
|
|
}
|
|||
|
|
return chars;
|
|||
|
|
}
|
|||
|
|
// Allocate 2/3rds of the space for text1, the rest for text2.
|
|||
|
|
var maxLines = 40000;
|
|||
|
|
var chars1 = diff_linesToCharsMunge_(text1);
|
|||
|
|
maxLines = 65535;
|
|||
|
|
var chars2 = diff_linesToCharsMunge_(text2);
|
|||
|
|
return {
|
|||
|
|
chars1: chars1,
|
|||
|
|
chars2: chars2,
|
|||
|
|
lineArray: lineArray
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Rehydrate the text in a diff from a string of line hashes to real lines of
|
|||
|
|
* text.
|
|||
|
|
* @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.
|
|||
|
|
* @param {!Array.<string>} lineArray Array of unique strings.
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_charsToLines_ = function (diffs, lineArray) {
|
|||
|
|
for (var i = 0; i < diffs.length; i++) {
|
|||
|
|
var chars = diffs[i][1];
|
|||
|
|
var text = [];
|
|||
|
|
for (var j = 0; j < chars.length; j++) {
|
|||
|
|
text[j] = lineArray[chars.charCodeAt(j)];
|
|||
|
|
}
|
|||
|
|
diffs[i][1] = text.join('');
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Determine the common prefix of two strings.
|
|||
|
|
* @param {string} text1 First string.
|
|||
|
|
* @param {string} text2 Second string.
|
|||
|
|
* @return {number} The number of characters common to the start of each
|
|||
|
|
* string.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_commonPrefix = function (text1, text2) {
|
|||
|
|
// Quick check for common null cases.
|
|||
|
|
if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
// Binary search.
|
|||
|
|
// Performance analysis: https://neil.fraser.name/news/2007/10/09/
|
|||
|
|
var pointermin = 0;
|
|||
|
|
var pointermax = Math.min(text1.length, text2.length);
|
|||
|
|
var pointermid = pointermax;
|
|||
|
|
var pointerstart = 0;
|
|||
|
|
while (pointermin < pointermid) {
|
|||
|
|
if (text1.substring(pointerstart, pointermid) == text2.substring(pointerstart, pointermid)) {
|
|||
|
|
pointermin = pointermid;
|
|||
|
|
pointerstart = pointermin;
|
|||
|
|
} else {
|
|||
|
|
pointermax = pointermid;
|
|||
|
|
}
|
|||
|
|
pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);
|
|||
|
|
}
|
|||
|
|
return pointermid;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Determine the common suffix of two strings.
|
|||
|
|
* @param {string} text1 First string.
|
|||
|
|
* @param {string} text2 Second string.
|
|||
|
|
* @return {number} The number of characters common to the end of each string.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_commonSuffix = function (text1, text2) {
|
|||
|
|
// Quick check for common null cases.
|
|||
|
|
if (!text1 || !text2 || text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
// Binary search.
|
|||
|
|
// Performance analysis: https://neil.fraser.name/news/2007/10/09/
|
|||
|
|
var pointermin = 0;
|
|||
|
|
var pointermax = Math.min(text1.length, text2.length);
|
|||
|
|
var pointermid = pointermax;
|
|||
|
|
var pointerend = 0;
|
|||
|
|
while (pointermin < pointermid) {
|
|||
|
|
if (text1.substring(text1.length - pointermid, text1.length - pointerend) == text2.substring(text2.length - pointermid, text2.length - pointerend)) {
|
|||
|
|
pointermin = pointermid;
|
|||
|
|
pointerend = pointermin;
|
|||
|
|
} else {
|
|||
|
|
pointermax = pointermid;
|
|||
|
|
}
|
|||
|
|
pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);
|
|||
|
|
}
|
|||
|
|
return pointermid;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Determine if the suffix of one string is the prefix of another.
|
|||
|
|
* @param {string} text1 First string.
|
|||
|
|
* @param {string} text2 Second string.
|
|||
|
|
* @return {number} The number of characters common to the end of the first
|
|||
|
|
* string and the start of the second string.
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_commonOverlap_ = function (text1, text2) {
|
|||
|
|
// Cache the text lengths to prevent multiple calls.
|
|||
|
|
var text1_length = text1.length;
|
|||
|
|
var text2_length = text2.length;
|
|||
|
|
// Eliminate the null case.
|
|||
|
|
if (text1_length == 0 || text2_length == 0) {
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
// Truncate the longer string.
|
|||
|
|
if (text1_length > text2_length) {
|
|||
|
|
text1 = text1.substring(text1_length - text2_length);
|
|||
|
|
} else if (text1_length < text2_length) {
|
|||
|
|
text2 = text2.substring(0, text1_length);
|
|||
|
|
}
|
|||
|
|
var text_length = Math.min(text1_length, text2_length);
|
|||
|
|
// Quick check for the worst case.
|
|||
|
|
if (text1 == text2) {
|
|||
|
|
return text_length;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Start by looking for a single character match
|
|||
|
|
// and increase length until no match is found.
|
|||
|
|
// Performance analysis: https://neil.fraser.name/news/2010/11/04/
|
|||
|
|
var best = 0;
|
|||
|
|
var length = 1;
|
|||
|
|
while (true) {
|
|||
|
|
var pattern = text1.substring(text_length - length);
|
|||
|
|
var found = text2.indexOf(pattern);
|
|||
|
|
if (found == -1) {
|
|||
|
|
return best;
|
|||
|
|
}
|
|||
|
|
length += found;
|
|||
|
|
if (found == 0 || text1.substring(text_length - length) == text2.substring(0, length)) {
|
|||
|
|
best = length;
|
|||
|
|
length++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Do the two texts share a substring which is at least half the length of the
|
|||
|
|
* longer text?
|
|||
|
|
* This speedup can produce non-minimal diffs.
|
|||
|
|
* @param {string} text1 First string.
|
|||
|
|
* @param {string} text2 Second string.
|
|||
|
|
* @return {Array.<string>} Five element Array, containing the prefix of
|
|||
|
|
* text1, the suffix of text1, the prefix of text2, the suffix of
|
|||
|
|
* text2 and the common middle. Or null if there was no match.
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_halfMatch_ = function (text1, text2) {
|
|||
|
|
if (this.Diff_Timeout <= 0) {
|
|||
|
|
// Don't risk returning a non-optimal diff if we have unlimited time.
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
var longtext = text1.length > text2.length ? text1 : text2;
|
|||
|
|
var shorttext = text1.length > text2.length ? text2 : text1;
|
|||
|
|
if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {
|
|||
|
|
return null; // Pointless.
|
|||
|
|
}
|
|||
|
|
var dmp = this; // 'this' becomes 'window' in a closure.
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Does a substring of shorttext exist within longtext such that the substring
|
|||
|
|
* is at least half the length of longtext?
|
|||
|
|
* Closure, but does not reference any external variables.
|
|||
|
|
* @param {string} longtext Longer string.
|
|||
|
|
* @param {string} shorttext Shorter string.
|
|||
|
|
* @param {number} i Start index of quarter length substring within longtext.
|
|||
|
|
* @return {Array.<string>} Five element Array, containing the prefix of
|
|||
|
|
* longtext, the suffix of longtext, the prefix of shorttext, the suffix
|
|||
|
|
* of shorttext and the common middle. Or null if there was no match.
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
function diff_halfMatchI_(longtext, shorttext, i) {
|
|||
|
|
// Start with a 1/4 length substring at position i as a seed.
|
|||
|
|
var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));
|
|||
|
|
var j = -1;
|
|||
|
|
var best_common = '';
|
|||
|
|
var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;
|
|||
|
|
while ((j = shorttext.indexOf(seed, j + 1)) != -1) {
|
|||
|
|
var prefixLength = dmp.diff_commonPrefix(longtext.substring(i), shorttext.substring(j));
|
|||
|
|
var suffixLength = dmp.diff_commonSuffix(longtext.substring(0, i), shorttext.substring(0, j));
|
|||
|
|
if (best_common.length < suffixLength + prefixLength) {
|
|||
|
|
best_common = shorttext.substring(j - suffixLength, j) + shorttext.substring(j, j + prefixLength);
|
|||
|
|
best_longtext_a = longtext.substring(0, i - suffixLength);
|
|||
|
|
best_longtext_b = longtext.substring(i + prefixLength);
|
|||
|
|
best_shorttext_a = shorttext.substring(0, j - suffixLength);
|
|||
|
|
best_shorttext_b = shorttext.substring(j + prefixLength);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (best_common.length * 2 >= longtext.length) {
|
|||
|
|
return [best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b, best_common];
|
|||
|
|
} else {
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// First check if the second quarter is the seed for a half-match.
|
|||
|
|
var hm1 = diff_halfMatchI_(longtext, shorttext, Math.ceil(longtext.length / 4));
|
|||
|
|
// Check again based on the third quarter.
|
|||
|
|
var hm2 = diff_halfMatchI_(longtext, shorttext, Math.ceil(longtext.length / 2));
|
|||
|
|
var hm;
|
|||
|
|
if (!hm1 && !hm2) {
|
|||
|
|
return null;
|
|||
|
|
} else if (!hm2) {
|
|||
|
|
hm = hm1;
|
|||
|
|
} else if (!hm1) {
|
|||
|
|
hm = hm2;
|
|||
|
|
} else {
|
|||
|
|
// Both matched. Select the longest.
|
|||
|
|
hm = hm1[4].length > hm2[4].length ? hm1 : hm2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// A half-match was found, sort out the return data.
|
|||
|
|
var text1_a, text1_b, text2_a, text2_b;
|
|||
|
|
if (text1.length > text2.length) {
|
|||
|
|
text1_a = hm[0];
|
|||
|
|
text1_b = hm[1];
|
|||
|
|
text2_a = hm[2];
|
|||
|
|
text2_b = hm[3];
|
|||
|
|
} else {
|
|||
|
|
text2_a = hm[0];
|
|||
|
|
text2_b = hm[1];
|
|||
|
|
text1_a = hm[2];
|
|||
|
|
text1_b = hm[3];
|
|||
|
|
}
|
|||
|
|
var mid_common = hm[4];
|
|||
|
|
return [text1_a, text1_b, text2_a, text2_b, mid_common];
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Reduce the number of edits by eliminating semantically trivial equalities.
|
|||
|
|
* @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_cleanupSemantic = function (diffs) {
|
|||
|
|
var changes = false;
|
|||
|
|
var equalities = []; // Stack of indices where equalities are found.
|
|||
|
|
var equalitiesLength = 0; // Keeping our own length var is faster in JS.
|
|||
|
|
/** @type {?string} */
|
|||
|
|
var lastEquality = null;
|
|||
|
|
// Always equal to diffs[equalities[equalitiesLength - 1]][1]
|
|||
|
|
var pointer = 0; // Index of current position.
|
|||
|
|
// Number of characters that changed prior to the equality.
|
|||
|
|
var length_insertions1 = 0;
|
|||
|
|
var length_deletions1 = 0;
|
|||
|
|
// Number of characters that changed after the equality.
|
|||
|
|
var length_insertions2 = 0;
|
|||
|
|
var length_deletions2 = 0;
|
|||
|
|
while (pointer < diffs.length) {
|
|||
|
|
if (diffs[pointer][0] == DIFF_EQUAL) {
|
|||
|
|
// Equality found.
|
|||
|
|
equalities[equalitiesLength++] = pointer;
|
|||
|
|
length_insertions1 = length_insertions2;
|
|||
|
|
length_deletions1 = length_deletions2;
|
|||
|
|
length_insertions2 = 0;
|
|||
|
|
length_deletions2 = 0;
|
|||
|
|
lastEquality = diffs[pointer][1];
|
|||
|
|
} else {
|
|||
|
|
// An insertion or deletion.
|
|||
|
|
if (diffs[pointer][0] == DIFF_INSERT) {
|
|||
|
|
length_insertions2 += diffs[pointer][1].length;
|
|||
|
|
} else {
|
|||
|
|
length_deletions2 += diffs[pointer][1].length;
|
|||
|
|
}
|
|||
|
|
// Eliminate an equality that is smaller or equal to the edits on both
|
|||
|
|
// sides of it.
|
|||
|
|
if (lastEquality && lastEquality.length <= Math.max(length_insertions1, length_deletions1) && lastEquality.length <= Math.max(length_insertions2, length_deletions2)) {
|
|||
|
|
// Duplicate record.
|
|||
|
|
diffs.splice(equalities[equalitiesLength - 1], 0, new diff_match_patch.Diff(DIFF_DELETE, lastEquality));
|
|||
|
|
// Change second copy to insert.
|
|||
|
|
diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;
|
|||
|
|
// Throw away the equality we just deleted.
|
|||
|
|
equalitiesLength--;
|
|||
|
|
// Throw away the previous equality (it needs to be reevaluated).
|
|||
|
|
equalitiesLength--;
|
|||
|
|
pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;
|
|||
|
|
length_insertions1 = 0; // Reset the counters.
|
|||
|
|
length_deletions1 = 0;
|
|||
|
|
length_insertions2 = 0;
|
|||
|
|
length_deletions2 = 0;
|
|||
|
|
lastEquality = null;
|
|||
|
|
changes = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
pointer++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Normalize the diff.
|
|||
|
|
if (changes) {
|
|||
|
|
this.diff_cleanupMerge(diffs);
|
|||
|
|
}
|
|||
|
|
this.diff_cleanupSemanticLossless(diffs);
|
|||
|
|
|
|||
|
|
// Find any overlaps between deletions and insertions.
|
|||
|
|
// e.g: <del>abcxxx</del><ins>xxxdef</ins>
|
|||
|
|
// -> <del>abc</del>xxx<ins>def</ins>
|
|||
|
|
// e.g: <del>xxxabc</del><ins>defxxx</ins>
|
|||
|
|
// -> <ins>def</ins>xxx<del>abc</del>
|
|||
|
|
// Only extract an overlap if it is as big as the edit ahead or behind it.
|
|||
|
|
pointer = 1;
|
|||
|
|
while (pointer < diffs.length) {
|
|||
|
|
if (diffs[pointer - 1][0] == DIFF_DELETE && diffs[pointer][0] == DIFF_INSERT) {
|
|||
|
|
var deletion = diffs[pointer - 1][1];
|
|||
|
|
var insertion = diffs[pointer][1];
|
|||
|
|
var overlap_length1 = this.diff_commonOverlap_(deletion, insertion);
|
|||
|
|
var overlap_length2 = this.diff_commonOverlap_(insertion, deletion);
|
|||
|
|
if (overlap_length1 >= overlap_length2) {
|
|||
|
|
if (overlap_length1 >= deletion.length / 2 || overlap_length1 >= insertion.length / 2) {
|
|||
|
|
// Overlap found. Insert an equality and trim the surrounding edits.
|
|||
|
|
diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL, insertion.substring(0, overlap_length1)));
|
|||
|
|
diffs[pointer - 1][1] = deletion.substring(0, deletion.length - overlap_length1);
|
|||
|
|
diffs[pointer + 1][1] = insertion.substring(overlap_length1);
|
|||
|
|
pointer++;
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
if (overlap_length2 >= deletion.length / 2 || overlap_length2 >= insertion.length / 2) {
|
|||
|
|
// Reverse overlap found.
|
|||
|
|
// Insert an equality and swap and trim the surrounding edits.
|
|||
|
|
diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL, deletion.substring(0, overlap_length2)));
|
|||
|
|
diffs[pointer - 1][0] = DIFF_INSERT;
|
|||
|
|
diffs[pointer - 1][1] = insertion.substring(0, insertion.length - overlap_length2);
|
|||
|
|
diffs[pointer + 1][0] = DIFF_DELETE;
|
|||
|
|
diffs[pointer + 1][1] = deletion.substring(overlap_length2);
|
|||
|
|
pointer++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
pointer++;
|
|||
|
|
}
|
|||
|
|
pointer++;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Look for single edits surrounded on both sides by equalities
|
|||
|
|
* which can be shifted sideways to align the edit to a word boundary.
|
|||
|
|
* e.g: The c<ins>at c</ins>ame. -> The <ins>cat </ins>came.
|
|||
|
|
* @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_cleanupSemanticLossless = function (diffs) {
|
|||
|
|
/**
|
|||
|
|
* Given two strings, compute a score representing whether the internal
|
|||
|
|
* boundary falls on logical boundaries.
|
|||
|
|
* Scores range from 6 (best) to 0 (worst).
|
|||
|
|
* Closure, but does not reference any external variables.
|
|||
|
|
* @param {string} one First string.
|
|||
|
|
* @param {string} two Second string.
|
|||
|
|
* @return {number} The score.
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
function diff_cleanupSemanticScore_(one, two) {
|
|||
|
|
if (!one || !two) {
|
|||
|
|
// Edges are the best.
|
|||
|
|
return 6;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Each port of this function behaves slightly differently due to
|
|||
|
|
// subtle differences in each language's definition of things like
|
|||
|
|
// 'whitespace'. Since this function's purpose is largely cosmetic,
|
|||
|
|
// the choice has been made to use each language's native features
|
|||
|
|
// rather than force total conformity.
|
|||
|
|
var char1 = one.charAt(one.length - 1);
|
|||
|
|
var char2 = two.charAt(0);
|
|||
|
|
var nonAlphaNumeric1 = char1.match(diff_match_patch.nonAlphaNumericRegex_);
|
|||
|
|
var nonAlphaNumeric2 = char2.match(diff_match_patch.nonAlphaNumericRegex_);
|
|||
|
|
var whitespace1 = nonAlphaNumeric1 && char1.match(diff_match_patch.whitespaceRegex_);
|
|||
|
|
var whitespace2 = nonAlphaNumeric2 && char2.match(diff_match_patch.whitespaceRegex_);
|
|||
|
|
var lineBreak1 = whitespace1 && char1.match(diff_match_patch.linebreakRegex_);
|
|||
|
|
var lineBreak2 = whitespace2 && char2.match(diff_match_patch.linebreakRegex_);
|
|||
|
|
var blankLine1 = lineBreak1 && one.match(diff_match_patch.blanklineEndRegex_);
|
|||
|
|
var blankLine2 = lineBreak2 && two.match(diff_match_patch.blanklineStartRegex_);
|
|||
|
|
if (blankLine1 || blankLine2) {
|
|||
|
|
// Five points for blank lines.
|
|||
|
|
return 5;
|
|||
|
|
} else if (lineBreak1 || lineBreak2) {
|
|||
|
|
// Four points for line breaks.
|
|||
|
|
return 4;
|
|||
|
|
} else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {
|
|||
|
|
// Three points for end of sentences.
|
|||
|
|
return 3;
|
|||
|
|
} else if (whitespace1 || whitespace2) {
|
|||
|
|
// Two points for whitespace.
|
|||
|
|
return 2;
|
|||
|
|
} else if (nonAlphaNumeric1 || nonAlphaNumeric2) {
|
|||
|
|
// One point for non-alphanumeric.
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
var pointer = 1;
|
|||
|
|
// Intentionally ignore the first and last element (don't need checking).
|
|||
|
|
while (pointer < diffs.length - 1) {
|
|||
|
|
if (diffs[pointer - 1][0] == DIFF_EQUAL && diffs[pointer + 1][0] == DIFF_EQUAL) {
|
|||
|
|
// This is a single edit surrounded by equalities.
|
|||
|
|
var equality1 = diffs[pointer - 1][1];
|
|||
|
|
var edit = diffs[pointer][1];
|
|||
|
|
var equality2 = diffs[pointer + 1][1];
|
|||
|
|
|
|||
|
|
// First, shift the edit as far left as possible.
|
|||
|
|
var commonOffset = this.diff_commonSuffix(equality1, edit);
|
|||
|
|
if (commonOffset) {
|
|||
|
|
var commonString = edit.substring(edit.length - commonOffset);
|
|||
|
|
equality1 = equality1.substring(0, equality1.length - commonOffset);
|
|||
|
|
edit = commonString + edit.substring(0, edit.length - commonOffset);
|
|||
|
|
equality2 = commonString + equality2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Second, step character by character right, looking for the best fit.
|
|||
|
|
var bestEquality1 = equality1;
|
|||
|
|
var bestEdit = edit;
|
|||
|
|
var bestEquality2 = equality2;
|
|||
|
|
var bestScore = diff_cleanupSemanticScore_(equality1, edit) + diff_cleanupSemanticScore_(edit, equality2);
|
|||
|
|
while (edit.charAt(0) === equality2.charAt(0)) {
|
|||
|
|
equality1 += edit.charAt(0);
|
|||
|
|
edit = edit.substring(1) + equality2.charAt(0);
|
|||
|
|
equality2 = equality2.substring(1);
|
|||
|
|
var score = diff_cleanupSemanticScore_(equality1, edit) + diff_cleanupSemanticScore_(edit, equality2);
|
|||
|
|
// The >= encourages trailing rather than leading whitespace on edits.
|
|||
|
|
if (score >= bestScore) {
|
|||
|
|
bestScore = score;
|
|||
|
|
bestEquality1 = equality1;
|
|||
|
|
bestEdit = edit;
|
|||
|
|
bestEquality2 = equality2;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (diffs[pointer - 1][1] != bestEquality1) {
|
|||
|
|
// We have an improvement, save it back to the diff.
|
|||
|
|
if (bestEquality1) {
|
|||
|
|
diffs[pointer - 1][1] = bestEquality1;
|
|||
|
|
} else {
|
|||
|
|
diffs.splice(pointer - 1, 1);
|
|||
|
|
pointer--;
|
|||
|
|
}
|
|||
|
|
diffs[pointer][1] = bestEdit;
|
|||
|
|
if (bestEquality2) {
|
|||
|
|
diffs[pointer + 1][1] = bestEquality2;
|
|||
|
|
} else {
|
|||
|
|
diffs.splice(pointer + 1, 1);
|
|||
|
|
pointer--;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
pointer++;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// Define some regex patterns for matching boundaries.
|
|||
|
|
diff_match_patch.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;
|
|||
|
|
diff_match_patch.whitespaceRegex_ = /\s/;
|
|||
|
|
diff_match_patch.linebreakRegex_ = /[\r\n]/;
|
|||
|
|
diff_match_patch.blanklineEndRegex_ = /\n\r?\n$/;
|
|||
|
|
diff_match_patch.blanklineStartRegex_ = /^\r?\n\r?\n/;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Reduce the number of edits by eliminating operationally trivial equalities.
|
|||
|
|
* @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_cleanupEfficiency = function (diffs) {
|
|||
|
|
var changes = false;
|
|||
|
|
var equalities = []; // Stack of indices where equalities are found.
|
|||
|
|
var equalitiesLength = 0; // Keeping our own length var is faster in JS.
|
|||
|
|
/** @type {?string} */
|
|||
|
|
var lastEquality = null;
|
|||
|
|
// Always equal to diffs[equalities[equalitiesLength - 1]][1]
|
|||
|
|
var pointer = 0; // Index of current position.
|
|||
|
|
// Is there an insertion operation before the last equality.
|
|||
|
|
var pre_ins = false;
|
|||
|
|
// Is there a deletion operation before the last equality.
|
|||
|
|
var pre_del = false;
|
|||
|
|
// Is there an insertion operation after the last equality.
|
|||
|
|
var post_ins = false;
|
|||
|
|
// Is there a deletion operation after the last equality.
|
|||
|
|
var post_del = false;
|
|||
|
|
while (pointer < diffs.length) {
|
|||
|
|
if (diffs[pointer][0] == DIFF_EQUAL) {
|
|||
|
|
// Equality found.
|
|||
|
|
if (diffs[pointer][1].length < this.Diff_EditCost && (post_ins || post_del)) {
|
|||
|
|
// Candidate found.
|
|||
|
|
equalities[equalitiesLength++] = pointer;
|
|||
|
|
pre_ins = post_ins;
|
|||
|
|
pre_del = post_del;
|
|||
|
|
lastEquality = diffs[pointer][1];
|
|||
|
|
} else {
|
|||
|
|
// Not a candidate, and can never become one.
|
|||
|
|
equalitiesLength = 0;
|
|||
|
|
lastEquality = null;
|
|||
|
|
}
|
|||
|
|
post_ins = post_del = false;
|
|||
|
|
} else {
|
|||
|
|
// An insertion or deletion.
|
|||
|
|
if (diffs[pointer][0] == DIFF_DELETE) {
|
|||
|
|
post_del = true;
|
|||
|
|
} else {
|
|||
|
|
post_ins = true;
|
|||
|
|
}
|
|||
|
|
/*
|
|||
|
|
* Five types to be split:
|
|||
|
|
* <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>
|
|||
|
|
* <ins>A</ins>X<ins>C</ins><del>D</del>
|
|||
|
|
* <ins>A</ins><del>B</del>X<ins>C</ins>
|
|||
|
|
* <ins>A</del>X<ins>C</ins><del>D</del>
|
|||
|
|
* <ins>A</ins><del>B</del>X<del>C</del>
|
|||
|
|
*/
|
|||
|
|
if (lastEquality && (pre_ins && pre_del && post_ins && post_del || lastEquality.length < this.Diff_EditCost / 2 && pre_ins + pre_del + post_ins + post_del == 3)) {
|
|||
|
|
// Duplicate record.
|
|||
|
|
diffs.splice(equalities[equalitiesLength - 1], 0, new diff_match_patch.Diff(DIFF_DELETE, lastEquality));
|
|||
|
|
// Change second copy to insert.
|
|||
|
|
diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;
|
|||
|
|
equalitiesLength--; // Throw away the equality we just deleted;
|
|||
|
|
lastEquality = null;
|
|||
|
|
if (pre_ins && pre_del) {
|
|||
|
|
// No changes made which could affect previous entry, keep going.
|
|||
|
|
post_ins = post_del = true;
|
|||
|
|
equalitiesLength = 0;
|
|||
|
|
} else {
|
|||
|
|
equalitiesLength--; // Throw away the previous equality.
|
|||
|
|
pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;
|
|||
|
|
post_ins = post_del = false;
|
|||
|
|
}
|
|||
|
|
changes = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
pointer++;
|
|||
|
|
}
|
|||
|
|
if (changes) {
|
|||
|
|
this.diff_cleanupMerge(diffs);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Reorder and merge like edit sections. Merge equalities.
|
|||
|
|
* Any edit section can move as long as it doesn't cross an equality.
|
|||
|
|
* @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_cleanupMerge = function (diffs) {
|
|||
|
|
// Add a dummy entry at the end.
|
|||
|
|
diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));
|
|||
|
|
var pointer = 0;
|
|||
|
|
var count_delete = 0;
|
|||
|
|
var count_insert = 0;
|
|||
|
|
var text_delete = '';
|
|||
|
|
var text_insert = '';
|
|||
|
|
var commonlength;
|
|||
|
|
while (pointer < diffs.length) {
|
|||
|
|
switch (diffs[pointer][0]) {
|
|||
|
|
case DIFF_INSERT:
|
|||
|
|
count_insert++;
|
|||
|
|
text_insert += diffs[pointer][1];
|
|||
|
|
pointer++;
|
|||
|
|
break;
|
|||
|
|
case DIFF_DELETE:
|
|||
|
|
count_delete++;
|
|||
|
|
text_delete += diffs[pointer][1];
|
|||
|
|
pointer++;
|
|||
|
|
break;
|
|||
|
|
case DIFF_EQUAL:
|
|||
|
|
// Upon reaching an equality, check for prior redundancies.
|
|||
|
|
if (count_delete + count_insert > 1) {
|
|||
|
|
if (count_delete !== 0 && count_insert !== 0) {
|
|||
|
|
// Factor out any common prefixies.
|
|||
|
|
commonlength = this.diff_commonPrefix(text_insert, text_delete);
|
|||
|
|
if (commonlength !== 0) {
|
|||
|
|
if (pointer - count_delete - count_insert > 0 && diffs[pointer - count_delete - count_insert - 1][0] == DIFF_EQUAL) {
|
|||
|
|
diffs[pointer - count_delete - count_insert - 1][1] += text_insert.substring(0, commonlength);
|
|||
|
|
} else {
|
|||
|
|
diffs.splice(0, 0, new diff_match_patch.Diff(DIFF_EQUAL, text_insert.substring(0, commonlength)));
|
|||
|
|
pointer++;
|
|||
|
|
}
|
|||
|
|
text_insert = text_insert.substring(commonlength);
|
|||
|
|
text_delete = text_delete.substring(commonlength);
|
|||
|
|
}
|
|||
|
|
// Factor out any common suffixies.
|
|||
|
|
commonlength = this.diff_commonSuffix(text_insert, text_delete);
|
|||
|
|
if (commonlength !== 0) {
|
|||
|
|
diffs[pointer][1] = text_insert.substring(text_insert.length - commonlength) + diffs[pointer][1];
|
|||
|
|
text_insert = text_insert.substring(0, text_insert.length - commonlength);
|
|||
|
|
text_delete = text_delete.substring(0, text_delete.length - commonlength);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// Delete the offending records and add the merged ones.
|
|||
|
|
pointer -= count_delete + count_insert;
|
|||
|
|
diffs.splice(pointer, count_delete + count_insert);
|
|||
|
|
if (text_delete.length) {
|
|||
|
|
diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_DELETE, text_delete));
|
|||
|
|
pointer++;
|
|||
|
|
}
|
|||
|
|
if (text_insert.length) {
|
|||
|
|
diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_INSERT, text_insert));
|
|||
|
|
pointer++;
|
|||
|
|
}
|
|||
|
|
pointer++;
|
|||
|
|
} else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {
|
|||
|
|
// Merge this equality with the previous one.
|
|||
|
|
diffs[pointer - 1][1] += diffs[pointer][1];
|
|||
|
|
diffs.splice(pointer, 1);
|
|||
|
|
} else {
|
|||
|
|
pointer++;
|
|||
|
|
}
|
|||
|
|
count_insert = 0;
|
|||
|
|
count_delete = 0;
|
|||
|
|
text_delete = '';
|
|||
|
|
text_insert = '';
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (diffs[diffs.length - 1][1] === '') {
|
|||
|
|
diffs.pop(); // Remove the dummy entry at the end.
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Second pass: look for single edits surrounded on both sides by equalities
|
|||
|
|
// which can be shifted sideways to eliminate an equality.
|
|||
|
|
// e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC
|
|||
|
|
var changes = false;
|
|||
|
|
pointer = 1;
|
|||
|
|
// Intentionally ignore the first and last element (don't need checking).
|
|||
|
|
while (pointer < diffs.length - 1) {
|
|||
|
|
if (diffs[pointer - 1][0] == DIFF_EQUAL && diffs[pointer + 1][0] == DIFF_EQUAL) {
|
|||
|
|
// This is a single edit surrounded by equalities.
|
|||
|
|
if (diffs[pointer][1].substring(diffs[pointer][1].length - diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {
|
|||
|
|
// Shift the edit over the previous equality.
|
|||
|
|
diffs[pointer][1] = diffs[pointer - 1][1] + diffs[pointer][1].substring(0, diffs[pointer][1].length - diffs[pointer - 1][1].length);
|
|||
|
|
diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];
|
|||
|
|
diffs.splice(pointer - 1, 1);
|
|||
|
|
changes = true;
|
|||
|
|
} else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) == diffs[pointer + 1][1]) {
|
|||
|
|
// Shift the edit over the next equality.
|
|||
|
|
diffs[pointer - 1][1] += diffs[pointer + 1][1];
|
|||
|
|
diffs[pointer][1] = diffs[pointer][1].substring(diffs[pointer + 1][1].length) + diffs[pointer + 1][1];
|
|||
|
|
diffs.splice(pointer + 1, 1);
|
|||
|
|
changes = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
pointer++;
|
|||
|
|
}
|
|||
|
|
// If shifts were made, the diff needs reordering and another shift sweep.
|
|||
|
|
if (changes) {
|
|||
|
|
this.diff_cleanupMerge(diffs);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* loc is a location in text1, compute and return the equivalent location in
|
|||
|
|
* text2.
|
|||
|
|
* e.g. 'The cat' vs 'The big cat', 1->1, 5->8
|
|||
|
|
* @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.
|
|||
|
|
* @param {number} loc Location within text1.
|
|||
|
|
* @return {number} Location within text2.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_xIndex = function (diffs, loc) {
|
|||
|
|
var chars1 = 0;
|
|||
|
|
var chars2 = 0;
|
|||
|
|
var last_chars1 = 0;
|
|||
|
|
var last_chars2 = 0;
|
|||
|
|
var x;
|
|||
|
|
for (x = 0; x < diffs.length; x++) {
|
|||
|
|
if (diffs[x][0] !== DIFF_INSERT) {
|
|||
|
|
// Equality or deletion.
|
|||
|
|
chars1 += diffs[x][1].length;
|
|||
|
|
}
|
|||
|
|
if (diffs[x][0] !== DIFF_DELETE) {
|
|||
|
|
// Equality or insertion.
|
|||
|
|
chars2 += diffs[x][1].length;
|
|||
|
|
}
|
|||
|
|
if (chars1 > loc) {
|
|||
|
|
// Overshot the location.
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
last_chars1 = chars1;
|
|||
|
|
last_chars2 = chars2;
|
|||
|
|
}
|
|||
|
|
// Was the location was deleted?
|
|||
|
|
if (diffs.length != x && diffs[x][0] === DIFF_DELETE) {
|
|||
|
|
return last_chars2;
|
|||
|
|
}
|
|||
|
|
// Add the remaining character length.
|
|||
|
|
return last_chars2 + (loc - last_chars1);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Convert a diff array into a pretty HTML report.
|
|||
|
|
* @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.
|
|||
|
|
* @return {string} HTML representation.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_prettyHtml = function (diffs) {
|
|||
|
|
var html = [];
|
|||
|
|
var pattern_amp = /&/g;
|
|||
|
|
var pattern_lt = /</g;
|
|||
|
|
var pattern_gt = />/g;
|
|||
|
|
var pattern_para = /\n/g;
|
|||
|
|
for (var x = 0; x < diffs.length; x++) {
|
|||
|
|
var op = diffs[x][0]; // Operation (insert, delete, equal)
|
|||
|
|
var data = diffs[x][1]; // Text of change.
|
|||
|
|
var text = data.replace(pattern_amp, '&').replace(pattern_lt, '<').replace(pattern_gt, '>').replace(pattern_para, '¶<br>');
|
|||
|
|
switch (op) {
|
|||
|
|
case DIFF_INSERT:
|
|||
|
|
html[x] = '<ins style="background:#e6ffe6;">' + text + '</ins>';
|
|||
|
|
break;
|
|||
|
|
case DIFF_DELETE:
|
|||
|
|
html[x] = '<del style="background:#ffe6e6;">' + text + '</del>';
|
|||
|
|
break;
|
|||
|
|
case DIFF_EQUAL:
|
|||
|
|
html[x] = '<span>' + text + '</span>';
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return html.join('');
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Compute and return the source text (all equalities and deletions).
|
|||
|
|
* @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.
|
|||
|
|
* @return {string} Source text.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_text1 = function (diffs) {
|
|||
|
|
var text = [];
|
|||
|
|
for (var x = 0; x < diffs.length; x++) {
|
|||
|
|
if (diffs[x][0] !== DIFF_INSERT) {
|
|||
|
|
text[x] = diffs[x][1];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return text.join('');
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Compute and return the destination text (all equalities and insertions).
|
|||
|
|
* @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.
|
|||
|
|
* @return {string} Destination text.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_text2 = function (diffs) {
|
|||
|
|
var text = [];
|
|||
|
|
for (var x = 0; x < diffs.length; x++) {
|
|||
|
|
if (diffs[x][0] !== DIFF_DELETE) {
|
|||
|
|
text[x] = diffs[x][1];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return text.join('');
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Compute the Levenshtein distance; the number of inserted, deleted or
|
|||
|
|
* substituted characters.
|
|||
|
|
* @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.
|
|||
|
|
* @return {number} Number of changes.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_levenshtein = function (diffs) {
|
|||
|
|
var levenshtein = 0;
|
|||
|
|
var insertions = 0;
|
|||
|
|
var deletions = 0;
|
|||
|
|
for (var x = 0; x < diffs.length; x++) {
|
|||
|
|
var op = diffs[x][0];
|
|||
|
|
var data = diffs[x][1];
|
|||
|
|
switch (op) {
|
|||
|
|
case DIFF_INSERT:
|
|||
|
|
insertions += data.length;
|
|||
|
|
break;
|
|||
|
|
case DIFF_DELETE:
|
|||
|
|
deletions += data.length;
|
|||
|
|
break;
|
|||
|
|
case DIFF_EQUAL:
|
|||
|
|
// A deletion and an insertion is one substitution.
|
|||
|
|
levenshtein += Math.max(insertions, deletions);
|
|||
|
|
insertions = 0;
|
|||
|
|
deletions = 0;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
levenshtein += Math.max(insertions, deletions);
|
|||
|
|
return levenshtein;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Crush the diff into an encoded string which describes the operations
|
|||
|
|
* required to transform text1 into text2.
|
|||
|
|
* E.g. =3\t-2\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'.
|
|||
|
|
* Operations are tab-separated. Inserted text is escaped using %xx notation.
|
|||
|
|
* @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.
|
|||
|
|
* @return {string} Delta text.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_toDelta = function (diffs) {
|
|||
|
|
var text = [];
|
|||
|
|
for (var x = 0; x < diffs.length; x++) {
|
|||
|
|
switch (diffs[x][0]) {
|
|||
|
|
case DIFF_INSERT:
|
|||
|
|
text[x] = '+' + encodeURI(diffs[x][1]);
|
|||
|
|
break;
|
|||
|
|
case DIFF_DELETE:
|
|||
|
|
text[x] = '-' + diffs[x][1].length;
|
|||
|
|
break;
|
|||
|
|
case DIFF_EQUAL:
|
|||
|
|
text[x] = '=' + diffs[x][1].length;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return text.join('\t').replace(/%20/g, ' ');
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Given the original text1, and an encoded string which describes the
|
|||
|
|
* operations required to transform text1 into text2, compute the full diff.
|
|||
|
|
* @param {string} text1 Source string for the diff.
|
|||
|
|
* @param {string} delta Delta text.
|
|||
|
|
* @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.
|
|||
|
|
* @throws {!Error} If invalid input.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.diff_fromDelta = function (text1, delta) {
|
|||
|
|
var diffs = [];
|
|||
|
|
var diffsLength = 0; // Keeping our own length var is faster in JS.
|
|||
|
|
var pointer = 0; // Cursor in text1
|
|||
|
|
var tokens = delta.split(/\t/g);
|
|||
|
|
for (var x = 0; x < tokens.length; x++) {
|
|||
|
|
// Each token begins with a one character parameter which specifies the
|
|||
|
|
// operation of this token (delete, insert, equality).
|
|||
|
|
var param = tokens[x].substring(1);
|
|||
|
|
switch (tokens[x].charAt(0)) {
|
|||
|
|
case '+':
|
|||
|
|
try {
|
|||
|
|
diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_INSERT, decodeURI(param));
|
|||
|
|
} catch (ex) {
|
|||
|
|
// Malformed URI sequence.
|
|||
|
|
throw new Error('Illegal escape in diff_fromDelta: ' + param);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case '-':
|
|||
|
|
// Fall through.
|
|||
|
|
case '=':
|
|||
|
|
var n = parseInt(param, 10);
|
|||
|
|
if (isNaN(n) || n < 0) {
|
|||
|
|
throw new Error('Invalid number in diff_fromDelta: ' + param);
|
|||
|
|
}
|
|||
|
|
var text = text1.substring(pointer, pointer += n);
|
|||
|
|
if (tokens[x].charAt(0) == '=') {
|
|||
|
|
diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_EQUAL, text);
|
|||
|
|
} else {
|
|||
|
|
diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_DELETE, text);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
// Blank tokens are ok (from a trailing \t).
|
|||
|
|
// Anything else is an error.
|
|||
|
|
if (tokens[x]) {
|
|||
|
|
throw new Error('Invalid diff operation in diff_fromDelta: ' + tokens[x]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (pointer != text1.length) {
|
|||
|
|
throw new Error('Delta length (' + pointer + ') does not equal source text length (' + text1.length + ').');
|
|||
|
|
}
|
|||
|
|
return diffs;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// MATCH FUNCTIONS
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Locate the best instance of 'pattern' in 'text' near 'loc'.
|
|||
|
|
* @param {string} text The text to search.
|
|||
|
|
* @param {string} pattern The pattern to search for.
|
|||
|
|
* @param {number} loc The location to search around.
|
|||
|
|
* @return {number} Best match index or -1.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.match_main = function (text, pattern, loc) {
|
|||
|
|
// Check for null inputs.
|
|||
|
|
if (text == null || pattern == null || loc == null) {
|
|||
|
|
throw new Error('Null input. (match_main)');
|
|||
|
|
}
|
|||
|
|
loc = Math.max(0, Math.min(loc, text.length));
|
|||
|
|
if (text == pattern) {
|
|||
|
|
// Shortcut (potentially not guaranteed by the algorithm)
|
|||
|
|
return 0;
|
|||
|
|
} else if (!text.length) {
|
|||
|
|
// Nothing to match.
|
|||
|
|
return -1;
|
|||
|
|
} else if (text.substring(loc, loc + pattern.length) == pattern) {
|
|||
|
|
// Perfect match at the perfect spot! (Includes case of null pattern)
|
|||
|
|
return loc;
|
|||
|
|
} else {
|
|||
|
|
// Do a fuzzy compare.
|
|||
|
|
return this.match_bitap_(text, pattern, loc);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Locate the best instance of 'pattern' in 'text' near 'loc' using the
|
|||
|
|
* Bitap algorithm.
|
|||
|
|
* @param {string} text The text to search.
|
|||
|
|
* @param {string} pattern The pattern to search for.
|
|||
|
|
* @param {number} loc The location to search around.
|
|||
|
|
* @return {number} Best match index or -1.
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.match_bitap_ = function (text, pattern, loc) {
|
|||
|
|
if (pattern.length > this.Match_MaxBits) {
|
|||
|
|
throw new Error('Pattern too long for this browser.');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Initialise the alphabet.
|
|||
|
|
var s = this.match_alphabet_(pattern);
|
|||
|
|
var dmp = this; // 'this' becomes 'window' in a closure.
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Compute and return the score for a match with e errors and x location.
|
|||
|
|
* Accesses loc and pattern through being a closure.
|
|||
|
|
* @param {number} e Number of errors in match.
|
|||
|
|
* @param {number} x Location of match.
|
|||
|
|
* @return {number} Overall score for match (0.0 = good, 1.0 = bad).
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
function match_bitapScore_(e, x) {
|
|||
|
|
var accuracy = e / pattern.length;
|
|||
|
|
var proximity = Math.abs(loc - x);
|
|||
|
|
if (!dmp.Match_Distance) {
|
|||
|
|
// Dodge divide by zero error.
|
|||
|
|
return proximity ? 1.0 : accuracy;
|
|||
|
|
}
|
|||
|
|
return accuracy + proximity / dmp.Match_Distance;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Highest score beyond which we give up.
|
|||
|
|
var score_threshold = this.Match_Threshold;
|
|||
|
|
// Is there a nearby exact match? (speedup)
|
|||
|
|
var best_loc = text.indexOf(pattern, loc);
|
|||
|
|
if (best_loc != -1) {
|
|||
|
|
score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);
|
|||
|
|
// What about in the other direction? (speedup)
|
|||
|
|
best_loc = text.lastIndexOf(pattern, loc + pattern.length);
|
|||
|
|
if (best_loc != -1) {
|
|||
|
|
score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Initialise the bit arrays.
|
|||
|
|
var matchmask = 1 << pattern.length - 1;
|
|||
|
|
best_loc = -1;
|
|||
|
|
var bin_min, bin_mid;
|
|||
|
|
var bin_max = pattern.length + text.length;
|
|||
|
|
var last_rd;
|
|||
|
|
for (var d = 0; d < pattern.length; d++) {
|
|||
|
|
// Scan for the best match; each iteration allows for one more error.
|
|||
|
|
// Run a binary search to determine how far from 'loc' we can stray at this
|
|||
|
|
// error level.
|
|||
|
|
bin_min = 0;
|
|||
|
|
bin_mid = bin_max;
|
|||
|
|
while (bin_min < bin_mid) {
|
|||
|
|
if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) {
|
|||
|
|
bin_min = bin_mid;
|
|||
|
|
} else {
|
|||
|
|
bin_max = bin_mid;
|
|||
|
|
}
|
|||
|
|
bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);
|
|||
|
|
}
|
|||
|
|
// Use the result from this iteration as the maximum for the next.
|
|||
|
|
bin_max = bin_mid;
|
|||
|
|
var start = Math.max(1, loc - bin_mid + 1);
|
|||
|
|
var finish = Math.min(loc + bin_mid, text.length) + pattern.length;
|
|||
|
|
var rd = Array(finish + 2);
|
|||
|
|
rd[finish + 1] = (1 << d) - 1;
|
|||
|
|
for (var j = finish; j >= start; j--) {
|
|||
|
|
// The alphabet (s) is a sparse hash, so the following line generates
|
|||
|
|
// warnings.
|
|||
|
|
var charMatch = s[text.charAt(j - 1)];
|
|||
|
|
if (d === 0) {
|
|||
|
|
// First pass: exact match.
|
|||
|
|
rd[j] = (rd[j + 1] << 1 | 1) & charMatch;
|
|||
|
|
} else {
|
|||
|
|
// Subsequent passes: fuzzy match.
|
|||
|
|
rd[j] = (rd[j + 1] << 1 | 1) & charMatch | ((last_rd[j + 1] | last_rd[j]) << 1 | 1) | last_rd[j + 1];
|
|||
|
|
}
|
|||
|
|
if (rd[j] & matchmask) {
|
|||
|
|
var score = match_bitapScore_(d, j - 1);
|
|||
|
|
// This match will almost certainly be better than any existing match.
|
|||
|
|
// But check anyway.
|
|||
|
|
if (score <= score_threshold) {
|
|||
|
|
// Told you so.
|
|||
|
|
score_threshold = score;
|
|||
|
|
best_loc = j - 1;
|
|||
|
|
if (best_loc > loc) {
|
|||
|
|
// When passing loc, don't exceed our current distance from loc.
|
|||
|
|
start = Math.max(1, 2 * loc - best_loc);
|
|||
|
|
} else {
|
|||
|
|
// Already passed loc, downhill from here on in.
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// No hope for a (better) match at greater error levels.
|
|||
|
|
if (match_bitapScore_(d + 1, loc) > score_threshold) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
last_rd = rd;
|
|||
|
|
}
|
|||
|
|
return best_loc;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Initialise the alphabet for the Bitap algorithm.
|
|||
|
|
* @param {string} pattern The text to encode.
|
|||
|
|
* @return {!Object} Hash of character locations.
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.match_alphabet_ = function (pattern) {
|
|||
|
|
var s = {};
|
|||
|
|
for (var i = 0; i < pattern.length; i++) {
|
|||
|
|
s[pattern.charAt(i)] = 0;
|
|||
|
|
}
|
|||
|
|
for (var i = 0; i < pattern.length; i++) {
|
|||
|
|
s[pattern.charAt(i)] |= 1 << pattern.length - i - 1;
|
|||
|
|
}
|
|||
|
|
return s;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// PATCH FUNCTIONS
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Increase the context until it is unique,
|
|||
|
|
* but don't let the pattern expand beyond Match_MaxBits.
|
|||
|
|
* @param {!diff_match_patch.patch_obj} patch The patch to grow.
|
|||
|
|
* @param {string} text Source text.
|
|||
|
|
* @private
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.patch_addContext_ = function (patch, text) {
|
|||
|
|
if (text.length == 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (patch.start2 === null) {
|
|||
|
|
throw Error('patch not initialized');
|
|||
|
|
}
|
|||
|
|
var pattern = text.substring(patch.start2, patch.start2 + patch.length1);
|
|||
|
|
var padding = 0;
|
|||
|
|
|
|||
|
|
// Look for the first and last matches of pattern in text. If two different
|
|||
|
|
// matches are found, increase the pattern length.
|
|||
|
|
while (text.indexOf(pattern) != text.lastIndexOf(pattern) && pattern.length < this.Match_MaxBits - this.Patch_Margin - this.Patch_Margin) {
|
|||
|
|
padding += this.Patch_Margin;
|
|||
|
|
pattern = text.substring(patch.start2 - padding, patch.start2 + patch.length1 + padding);
|
|||
|
|
}
|
|||
|
|
// Add one chunk for good luck.
|
|||
|
|
padding += this.Patch_Margin;
|
|||
|
|
|
|||
|
|
// Add the prefix.
|
|||
|
|
var prefix = text.substring(patch.start2 - padding, patch.start2);
|
|||
|
|
if (prefix) {
|
|||
|
|
patch.diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, prefix));
|
|||
|
|
}
|
|||
|
|
// Add the suffix.
|
|||
|
|
var suffix = text.substring(patch.start2 + patch.length1, patch.start2 + patch.length1 + padding);
|
|||
|
|
if (suffix) {
|
|||
|
|
patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, suffix));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Roll back the start points.
|
|||
|
|
patch.start1 -= prefix.length;
|
|||
|
|
patch.start2 -= prefix.length;
|
|||
|
|
// Extend the lengths.
|
|||
|
|
patch.length1 += prefix.length + suffix.length;
|
|||
|
|
patch.length2 += prefix.length + suffix.length;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Compute a list of patches to turn text1 into text2.
|
|||
|
|
* Use diffs if provided, otherwise compute it ourselves.
|
|||
|
|
* There are four ways to call this function, depending on what data is
|
|||
|
|
* available to the caller:
|
|||
|
|
* Method 1:
|
|||
|
|
* a = text1, b = text2
|
|||
|
|
* Method 2:
|
|||
|
|
* a = diffs
|
|||
|
|
* Method 3 (optimal):
|
|||
|
|
* a = text1, b = diffs
|
|||
|
|
* Method 4 (deprecated, use method 3):
|
|||
|
|
* a = text1, b = text2, c = diffs
|
|||
|
|
*
|
|||
|
|
* @param {string|!Array.<!diff_match_patch.Diff>} a text1 (methods 1,3,4) or
|
|||
|
|
* Array of diff tuples for text1 to text2 (method 2).
|
|||
|
|
* @param {string|!Array.<!diff_match_patch.Diff>=} opt_b text2 (methods 1,4) or
|
|||
|
|
* Array of diff tuples for text1 to text2 (method 3) or undefined (method 2).
|
|||
|
|
* @param {string|!Array.<!diff_match_patch.Diff>=} opt_c Array of diff tuples
|
|||
|
|
* for text1 to text2 (method 4) or undefined (methods 1,2,3).
|
|||
|
|
* @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.patch_make = function (a, opt_b, opt_c) {
|
|||
|
|
var text1, diffs;
|
|||
|
|
if (typeof a == 'string' && typeof opt_b == 'string' && typeof opt_c == 'undefined') {
|
|||
|
|
// Method 1: text1, text2
|
|||
|
|
// Compute diffs from text1 and text2.
|
|||
|
|
text1 = /** @type {string} */a;
|
|||
|
|
diffs = this.diff_main(text1, /** @type {string} */opt_b, true);
|
|||
|
|
if (diffs.length > 2) {
|
|||
|
|
this.diff_cleanupSemantic(diffs);
|
|||
|
|
this.diff_cleanupEfficiency(diffs);
|
|||
|
|
}
|
|||
|
|
} else if (a && typeof a == 'object' && typeof opt_b == 'undefined' && typeof opt_c == 'undefined') {
|
|||
|
|
// Method 2: diffs
|
|||
|
|
// Compute text1 from diffs.
|
|||
|
|
diffs = /** @type {!Array.<!diff_match_patch.Diff>} */a;
|
|||
|
|
text1 = this.diff_text1(diffs);
|
|||
|
|
} else if (typeof a == 'string' && opt_b && typeof opt_b == 'object' && typeof opt_c == 'undefined') {
|
|||
|
|
// Method 3: text1, diffs
|
|||
|
|
text1 = /** @type {string} */a;
|
|||
|
|
diffs = /** @type {!Array.<!diff_match_patch.Diff>} */opt_b;
|
|||
|
|
} else if (typeof a == 'string' && typeof opt_b == 'string' && opt_c && typeof opt_c == 'object') {
|
|||
|
|
// Method 4: text1, text2, diffs
|
|||
|
|
// text2 is not used.
|
|||
|
|
text1 = /** @type {string} */a;
|
|||
|
|
diffs = /** @type {!Array.<!diff_match_patch.Diff>} */opt_c;
|
|||
|
|
} else {
|
|||
|
|
throw new Error('Unknown call format to patch_make.');
|
|||
|
|
}
|
|||
|
|
if (diffs.length === 0) {
|
|||
|
|
return []; // Get rid of the null case.
|
|||
|
|
}
|
|||
|
|
var patches = [];
|
|||
|
|
var patch = new diff_match_patch.patch_obj();
|
|||
|
|
var patchDiffLength = 0; // Keeping our own length var is faster in JS.
|
|||
|
|
var char_count1 = 0; // Number of characters into the text1 string.
|
|||
|
|
var char_count2 = 0; // Number of characters into the text2 string.
|
|||
|
|
// Start with text1 (prepatch_text) and apply the diffs until we arrive at
|
|||
|
|
// text2 (postpatch_text). We recreate the patches one by one to determine
|
|||
|
|
// context info.
|
|||
|
|
var prepatch_text = text1;
|
|||
|
|
var postpatch_text = text1;
|
|||
|
|
for (var x = 0; x < diffs.length; x++) {
|
|||
|
|
var diff_type = diffs[x][0];
|
|||
|
|
var diff_text = diffs[x][1];
|
|||
|
|
if (!patchDiffLength && diff_type !== DIFF_EQUAL) {
|
|||
|
|
// A new patch starts here.
|
|||
|
|
patch.start1 = char_count1;
|
|||
|
|
patch.start2 = char_count2;
|
|||
|
|
}
|
|||
|
|
switch (diff_type) {
|
|||
|
|
case DIFF_INSERT:
|
|||
|
|
patch.diffs[patchDiffLength++] = diffs[x];
|
|||
|
|
patch.length2 += diff_text.length;
|
|||
|
|
postpatch_text = postpatch_text.substring(0, char_count2) + diff_text + postpatch_text.substring(char_count2);
|
|||
|
|
break;
|
|||
|
|
case DIFF_DELETE:
|
|||
|
|
patch.length1 += diff_text.length;
|
|||
|
|
patch.diffs[patchDiffLength++] = diffs[x];
|
|||
|
|
postpatch_text = postpatch_text.substring(0, char_count2) + postpatch_text.substring(char_count2 + diff_text.length);
|
|||
|
|
break;
|
|||
|
|
case DIFF_EQUAL:
|
|||
|
|
if (diff_text.length <= 2 * this.Patch_Margin && patchDiffLength && diffs.length != x + 1) {
|
|||
|
|
// Small equality inside a patch.
|
|||
|
|
patch.diffs[patchDiffLength++] = diffs[x];
|
|||
|
|
patch.length1 += diff_text.length;
|
|||
|
|
patch.length2 += diff_text.length;
|
|||
|
|
} else if (diff_text.length >= 2 * this.Patch_Margin) {
|
|||
|
|
// Time for a new patch.
|
|||
|
|
if (patchDiffLength) {
|
|||
|
|
this.patch_addContext_(patch, prepatch_text);
|
|||
|
|
patches.push(patch);
|
|||
|
|
patch = new diff_match_patch.patch_obj();
|
|||
|
|
patchDiffLength = 0;
|
|||
|
|
// Unlike Unidiff, our patch lists have a rolling context.
|
|||
|
|
// https://github.com/google/diff-match-patch/wiki/Unidiff
|
|||
|
|
// Update prepatch text & pos to reflect the application of the
|
|||
|
|
// just completed patch.
|
|||
|
|
prepatch_text = postpatch_text;
|
|||
|
|
char_count1 = char_count2;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Update the current character count.
|
|||
|
|
if (diff_type !== DIFF_INSERT) {
|
|||
|
|
char_count1 += diff_text.length;
|
|||
|
|
}
|
|||
|
|
if (diff_type !== DIFF_DELETE) {
|
|||
|
|
char_count2 += diff_text.length;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// Pick up the leftover patch if not empty.
|
|||
|
|
if (patchDiffLength) {
|
|||
|
|
this.patch_addContext_(patch, prepatch_text);
|
|||
|
|
patches.push(patch);
|
|||
|
|
}
|
|||
|
|
return patches;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Given an array of patches, return another array that is identical.
|
|||
|
|
* @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.
|
|||
|
|
* @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.patch_deepCopy = function (patches) {
|
|||
|
|
// Making deep copies is hard in JavaScript.
|
|||
|
|
var patchesCopy = [];
|
|||
|
|
for (var x = 0; x < patches.length; x++) {
|
|||
|
|
var patch = patches[x];
|
|||
|
|
var patchCopy = new diff_match_patch.patch_obj();
|
|||
|
|
patchCopy.diffs = [];
|
|||
|
|
for (var y = 0; y < patch.diffs.length; y++) {
|
|||
|
|
patchCopy.diffs[y] = new diff_match_patch.Diff(patch.diffs[y][0], patch.diffs[y][1]);
|
|||
|
|
}
|
|||
|
|
patchCopy.start1 = patch.start1;
|
|||
|
|
patchCopy.start2 = patch.start2;
|
|||
|
|
patchCopy.length1 = patch.length1;
|
|||
|
|
patchCopy.length2 = patch.length2;
|
|||
|
|
patchesCopy[x] = patchCopy;
|
|||
|
|
}
|
|||
|
|
return patchesCopy;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Merge a set of patches onto the text. Return a patched text, as well
|
|||
|
|
* as a list of true/false values indicating which patches were applied.
|
|||
|
|
* @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.
|
|||
|
|
* @param {string} text Old text.
|
|||
|
|
* @return {!Array.<string|!Array.<boolean>>} Two element Array, containing the
|
|||
|
|
* new text and an array of boolean values.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.patch_apply = function (patches, text) {
|
|||
|
|
if (patches.length == 0) {
|
|||
|
|
return [text, []];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Deep copy the patches so that no changes are made to originals.
|
|||
|
|
patches = this.patch_deepCopy(patches);
|
|||
|
|
var nullPadding = this.patch_addPadding(patches);
|
|||
|
|
text = nullPadding + text + nullPadding;
|
|||
|
|
this.patch_splitMax(patches);
|
|||
|
|
// delta keeps track of the offset between the expected and actual location
|
|||
|
|
// of the previous patch. If there are patches expected at positions 10 and
|
|||
|
|
// 20, but the first patch was found at 12, delta is 2 and the second patch
|
|||
|
|
// has an effective expected position of 22.
|
|||
|
|
var delta = 0;
|
|||
|
|
var results = [];
|
|||
|
|
for (var x = 0; x < patches.length; x++) {
|
|||
|
|
var expected_loc = patches[x].start2 + delta;
|
|||
|
|
var text1 = this.diff_text1(patches[x].diffs);
|
|||
|
|
var start_loc;
|
|||
|
|
var end_loc = -1;
|
|||
|
|
if (text1.length > this.Match_MaxBits) {
|
|||
|
|
// patch_splitMax will only provide an oversized pattern in the case of
|
|||
|
|
// a monster delete.
|
|||
|
|
start_loc = this.match_main(text, text1.substring(0, this.Match_MaxBits), expected_loc);
|
|||
|
|
if (start_loc != -1) {
|
|||
|
|
end_loc = this.match_main(text, text1.substring(text1.length - this.Match_MaxBits), expected_loc + text1.length - this.Match_MaxBits);
|
|||
|
|
if (end_loc == -1 || start_loc >= end_loc) {
|
|||
|
|
// Can't find valid trailing context. Drop this patch.
|
|||
|
|
start_loc = -1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
start_loc = this.match_main(text, text1, expected_loc);
|
|||
|
|
}
|
|||
|
|
if (start_loc == -1) {
|
|||
|
|
// No match found. :(
|
|||
|
|
results[x] = false;
|
|||
|
|
// Subtract the delta for this failed patch from subsequent patches.
|
|||
|
|
delta -= patches[x].length2 - patches[x].length1;
|
|||
|
|
} else {
|
|||
|
|
// Found a match. :)
|
|||
|
|
results[x] = true;
|
|||
|
|
delta = start_loc - expected_loc;
|
|||
|
|
var text2;
|
|||
|
|
if (end_loc == -1) {
|
|||
|
|
text2 = text.substring(start_loc, start_loc + text1.length);
|
|||
|
|
} else {
|
|||
|
|
text2 = text.substring(start_loc, end_loc + this.Match_MaxBits);
|
|||
|
|
}
|
|||
|
|
if (text1 == text2) {
|
|||
|
|
// Perfect match, just shove the replacement text in.
|
|||
|
|
text = text.substring(0, start_loc) + this.diff_text2(patches[x].diffs) + text.substring(start_loc + text1.length);
|
|||
|
|
} else {
|
|||
|
|
// Imperfect match. Run a diff to get a framework of equivalent
|
|||
|
|
// indices.
|
|||
|
|
var diffs = this.diff_main(text1, text2, false);
|
|||
|
|
if (text1.length > this.Match_MaxBits && this.diff_levenshtein(diffs) / text1.length > this.Patch_DeleteThreshold) {
|
|||
|
|
// The end points match, but the content is unacceptably bad.
|
|||
|
|
results[x] = false;
|
|||
|
|
} else {
|
|||
|
|
this.diff_cleanupSemanticLossless(diffs);
|
|||
|
|
var index1 = 0;
|
|||
|
|
var index2;
|
|||
|
|
for (var y = 0; y < patches[x].diffs.length; y++) {
|
|||
|
|
var mod = patches[x].diffs[y];
|
|||
|
|
if (mod[0] !== DIFF_EQUAL) {
|
|||
|
|
index2 = this.diff_xIndex(diffs, index1);
|
|||
|
|
}
|
|||
|
|
if (mod[0] === DIFF_INSERT) {
|
|||
|
|
// Insertion
|
|||
|
|
text = text.substring(0, start_loc + index2) + mod[1] + text.substring(start_loc + index2);
|
|||
|
|
} else if (mod[0] === DIFF_DELETE) {
|
|||
|
|
// Deletion
|
|||
|
|
text = text.substring(0, start_loc + index2) + text.substring(start_loc + this.diff_xIndex(diffs, index1 + mod[1].length));
|
|||
|
|
}
|
|||
|
|
if (mod[0] !== DIFF_DELETE) {
|
|||
|
|
index1 += mod[1].length;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// Strip the padding off.
|
|||
|
|
text = text.substring(nullPadding.length, text.length - nullPadding.length);
|
|||
|
|
return [text, results];
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Add some padding on text start and end so that edges can match something.
|
|||
|
|
* Intended to be called only from within patch_apply.
|
|||
|
|
* @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.
|
|||
|
|
* @return {string} The padding string added to each side.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.patch_addPadding = function (patches) {
|
|||
|
|
var paddingLength = this.Patch_Margin;
|
|||
|
|
var nullPadding = '';
|
|||
|
|
for (var x = 1; x <= paddingLength; x++) {
|
|||
|
|
nullPadding += String.fromCharCode(x);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Bump all the patches forward.
|
|||
|
|
for (var x = 0; x < patches.length; x++) {
|
|||
|
|
patches[x].start1 += paddingLength;
|
|||
|
|
patches[x].start2 += paddingLength;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Add some padding on start of first diff.
|
|||
|
|
var patch = patches[0];
|
|||
|
|
var diffs = patch.diffs;
|
|||
|
|
if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) {
|
|||
|
|
// Add nullPadding equality.
|
|||
|
|
diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));
|
|||
|
|
patch.start1 -= paddingLength; // Should be 0.
|
|||
|
|
patch.start2 -= paddingLength; // Should be 0.
|
|||
|
|
patch.length1 += paddingLength;
|
|||
|
|
patch.length2 += paddingLength;
|
|||
|
|
} else if (paddingLength > diffs[0][1].length) {
|
|||
|
|
// Grow first equality.
|
|||
|
|
var extraLength = paddingLength - diffs[0][1].length;
|
|||
|
|
diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1];
|
|||
|
|
patch.start1 -= extraLength;
|
|||
|
|
patch.start2 -= extraLength;
|
|||
|
|
patch.length1 += extraLength;
|
|||
|
|
patch.length2 += extraLength;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Add some padding on end of last diff.
|
|||
|
|
patch = patches[patches.length - 1];
|
|||
|
|
diffs = patch.diffs;
|
|||
|
|
if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) {
|
|||
|
|
// Add nullPadding equality.
|
|||
|
|
diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));
|
|||
|
|
patch.length1 += paddingLength;
|
|||
|
|
patch.length2 += paddingLength;
|
|||
|
|
} else if (paddingLength > diffs[diffs.length - 1][1].length) {
|
|||
|
|
// Grow last equality.
|
|||
|
|
var extraLength = paddingLength - diffs[diffs.length - 1][1].length;
|
|||
|
|
diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength);
|
|||
|
|
patch.length1 += extraLength;
|
|||
|
|
patch.length2 += extraLength;
|
|||
|
|
}
|
|||
|
|
return nullPadding;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Look through the patches and break up any which are longer than the maximum
|
|||
|
|
* limit of the match algorithm.
|
|||
|
|
* Intended to be called only from within patch_apply.
|
|||
|
|
* @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.patch_splitMax = function (patches) {
|
|||
|
|
var patch_size = this.Match_MaxBits;
|
|||
|
|
for (var x = 0; x < patches.length; x++) {
|
|||
|
|
if (patches[x].length1 <= patch_size) {
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
var bigpatch = patches[x];
|
|||
|
|
// Remove the big old patch.
|
|||
|
|
patches.splice(x--, 1);
|
|||
|
|
var start1 = bigpatch.start1;
|
|||
|
|
var start2 = bigpatch.start2;
|
|||
|
|
var precontext = '';
|
|||
|
|
while (bigpatch.diffs.length !== 0) {
|
|||
|
|
// Create one of several smaller patches.
|
|||
|
|
var patch = new diff_match_patch.patch_obj();
|
|||
|
|
var empty = true;
|
|||
|
|
patch.start1 = start1 - precontext.length;
|
|||
|
|
patch.start2 = start2 - precontext.length;
|
|||
|
|
if (precontext !== '') {
|
|||
|
|
patch.length1 = patch.length2 = precontext.length;
|
|||
|
|
patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, precontext));
|
|||
|
|
}
|
|||
|
|
while (bigpatch.diffs.length !== 0 && patch.length1 < patch_size - this.Patch_Margin) {
|
|||
|
|
var diff_type = bigpatch.diffs[0][0];
|
|||
|
|
var diff_text = bigpatch.diffs[0][1];
|
|||
|
|
if (diff_type === DIFF_INSERT) {
|
|||
|
|
// Insertions are harmless.
|
|||
|
|
patch.length2 += diff_text.length;
|
|||
|
|
start2 += diff_text.length;
|
|||
|
|
patch.diffs.push(bigpatch.diffs.shift());
|
|||
|
|
empty = false;
|
|||
|
|
} else if (diff_type === DIFF_DELETE && patch.diffs.length == 1 && patch.diffs[0][0] == DIFF_EQUAL && diff_text.length > 2 * patch_size) {
|
|||
|
|
// This is a large deletion. Let it pass in one chunk.
|
|||
|
|
patch.length1 += diff_text.length;
|
|||
|
|
start1 += diff_text.length;
|
|||
|
|
empty = false;
|
|||
|
|
patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));
|
|||
|
|
bigpatch.diffs.shift();
|
|||
|
|
} else {
|
|||
|
|
// Deletion or equality. Only take as much as we can stomach.
|
|||
|
|
diff_text = diff_text.substring(0, patch_size - patch.length1 - this.Patch_Margin);
|
|||
|
|
patch.length1 += diff_text.length;
|
|||
|
|
start1 += diff_text.length;
|
|||
|
|
if (diff_type === DIFF_EQUAL) {
|
|||
|
|
patch.length2 += diff_text.length;
|
|||
|
|
start2 += diff_text.length;
|
|||
|
|
} else {
|
|||
|
|
empty = false;
|
|||
|
|
}
|
|||
|
|
patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));
|
|||
|
|
if (diff_text == bigpatch.diffs[0][1]) {
|
|||
|
|
bigpatch.diffs.shift();
|
|||
|
|
} else {
|
|||
|
|
bigpatch.diffs[0][1] = bigpatch.diffs[0][1].substring(diff_text.length);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// Compute the head context for the next patch.
|
|||
|
|
precontext = this.diff_text2(patch.diffs);
|
|||
|
|
precontext = precontext.substring(precontext.length - this.Patch_Margin);
|
|||
|
|
// Append the end context for this patch.
|
|||
|
|
var postcontext = this.diff_text1(bigpatch.diffs).substring(0, this.Patch_Margin);
|
|||
|
|
if (postcontext !== '') {
|
|||
|
|
patch.length1 += postcontext.length;
|
|||
|
|
patch.length2 += postcontext.length;
|
|||
|
|
if (patch.diffs.length !== 0 && patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL) {
|
|||
|
|
patch.diffs[patch.diffs.length - 1][1] += postcontext;
|
|||
|
|
} else {
|
|||
|
|
patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, postcontext));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (!empty) {
|
|||
|
|
patches.splice(++x, 0, patch);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Take a list of patches and return a textual representation.
|
|||
|
|
* @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.
|
|||
|
|
* @return {string} Text representation of patches.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.patch_toText = function (patches) {
|
|||
|
|
var text = [];
|
|||
|
|
for (var x = 0; x < patches.length; x++) {
|
|||
|
|
text[x] = patches[x];
|
|||
|
|
}
|
|||
|
|
return text.join('');
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Parse a textual representation of patches and return a list of Patch objects.
|
|||
|
|
* @param {string} textline Text representation of patches.
|
|||
|
|
* @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.
|
|||
|
|
* @throws {!Error} If invalid input.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.prototype.patch_fromText = function (textline) {
|
|||
|
|
var patches = [];
|
|||
|
|
if (!textline) {
|
|||
|
|
return patches;
|
|||
|
|
}
|
|||
|
|
var text = textline.split('\n');
|
|||
|
|
var textPointer = 0;
|
|||
|
|
var patchHeader = /^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/;
|
|||
|
|
while (textPointer < text.length) {
|
|||
|
|
var m = text[textPointer].match(patchHeader);
|
|||
|
|
if (!m) {
|
|||
|
|
throw new Error('Invalid patch string: ' + text[textPointer]);
|
|||
|
|
}
|
|||
|
|
var patch = new diff_match_patch.patch_obj();
|
|||
|
|
patches.push(patch);
|
|||
|
|
patch.start1 = parseInt(m[1], 10);
|
|||
|
|
if (m[2] === '') {
|
|||
|
|
patch.start1--;
|
|||
|
|
patch.length1 = 1;
|
|||
|
|
} else if (m[2] == '0') {
|
|||
|
|
patch.length1 = 0;
|
|||
|
|
} else {
|
|||
|
|
patch.start1--;
|
|||
|
|
patch.length1 = parseInt(m[2], 10);
|
|||
|
|
}
|
|||
|
|
patch.start2 = parseInt(m[3], 10);
|
|||
|
|
if (m[4] === '') {
|
|||
|
|
patch.start2--;
|
|||
|
|
patch.length2 = 1;
|
|||
|
|
} else if (m[4] == '0') {
|
|||
|
|
patch.length2 = 0;
|
|||
|
|
} else {
|
|||
|
|
patch.start2--;
|
|||
|
|
patch.length2 = parseInt(m[4], 10);
|
|||
|
|
}
|
|||
|
|
textPointer++;
|
|||
|
|
while (textPointer < text.length) {
|
|||
|
|
var sign = text[textPointer].charAt(0);
|
|||
|
|
try {
|
|||
|
|
var line = decodeURI(text[textPointer].substring(1));
|
|||
|
|
} catch (ex) {
|
|||
|
|
// Malformed URI sequence.
|
|||
|
|
throw new Error('Illegal escape in patch_fromText: ' + line);
|
|||
|
|
}
|
|||
|
|
if (sign == '-') {
|
|||
|
|
// Deletion.
|
|||
|
|
patch.diffs.push(new diff_match_patch.Diff(DIFF_DELETE, line));
|
|||
|
|
} else if (sign == '+') {
|
|||
|
|
// Insertion.
|
|||
|
|
patch.diffs.push(new diff_match_patch.Diff(DIFF_INSERT, line));
|
|||
|
|
} else if (sign == ' ') {
|
|||
|
|
// Minor equality.
|
|||
|
|
patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, line));
|
|||
|
|
} else if (sign == '@') {
|
|||
|
|
// Start of next patch.
|
|||
|
|
break;
|
|||
|
|
} else if (sign === '') {
|
|||
|
|
// Blank line? Whatever.
|
|||
|
|
} else {
|
|||
|
|
// WTF?
|
|||
|
|
throw new Error('Invalid patch mode "' + sign + '" in: ' + line);
|
|||
|
|
}
|
|||
|
|
textPointer++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return patches;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Class representing one patch operation.
|
|||
|
|
* @constructor
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.patch_obj = function () {
|
|||
|
|
/** @type {!Array.<!diff_match_patch.Diff>} */
|
|||
|
|
this.diffs = [];
|
|||
|
|
/** @type {?number} */
|
|||
|
|
this.start1 = null;
|
|||
|
|
/** @type {?number} */
|
|||
|
|
this.start2 = null;
|
|||
|
|
/** @type {number} */
|
|||
|
|
this.length1 = 0;
|
|||
|
|
/** @type {number} */
|
|||
|
|
this.length2 = 0;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Emulate GNU diff's format.
|
|||
|
|
* Header: @@ -382,8 +481,9 @@
|
|||
|
|
* Indices are printed as 1-based, not 0-based.
|
|||
|
|
* @return {string} The GNU diff string.
|
|||
|
|
*/
|
|||
|
|
diff_match_patch.patch_obj.prototype.toString = function () {
|
|||
|
|
var coords1, coords2;
|
|||
|
|
if (this.length1 === 0) {
|
|||
|
|
coords1 = this.start1 + ',0';
|
|||
|
|
} else if (this.length1 == 1) {
|
|||
|
|
coords1 = this.start1 + 1;
|
|||
|
|
} else {
|
|||
|
|
coords1 = this.start1 + 1 + ',' + this.length1;
|
|||
|
|
}
|
|||
|
|
if (this.length2 === 0) {
|
|||
|
|
coords2 = this.start2 + ',0';
|
|||
|
|
} else if (this.length2 == 1) {
|
|||
|
|
coords2 = this.start2 + 1;
|
|||
|
|
} else {
|
|||
|
|
coords2 = this.start2 + 1 + ',' + this.length2;
|
|||
|
|
}
|
|||
|
|
var text = ['@@ -' + coords1 + ' +' + coords2 + ' @@\n'];
|
|||
|
|
var op;
|
|||
|
|
// Escape the body of the patch with %xx notation.
|
|||
|
|
for (var x = 0; x < this.diffs.length; x++) {
|
|||
|
|
switch (this.diffs[x][0]) {
|
|||
|
|
case DIFF_INSERT:
|
|||
|
|
op = '+';
|
|||
|
|
break;
|
|||
|
|
case DIFF_DELETE:
|
|||
|
|
op = '-';
|
|||
|
|
break;
|
|||
|
|
case DIFF_EQUAL:
|
|||
|
|
op = ' ';
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
text[x + 1] = op + encodeURI(this.diffs[x][1]) + '\n';
|
|||
|
|
}
|
|||
|
|
return text.join('').replace(/%20/g, ' ');
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// The following export code was added by @ForbesLindesay
|
|||
|
|
module.exports = diff_match_patch;
|
|||
|
|
module.exports.diff_match_patch = diff_match_patch;
|
|||
|
|
module.exports.DIFF_DELETE = DIFF_DELETE;
|
|||
|
|
module.exports.DIFF_INSERT = DIFF_INSERT;
|
|||
|
|
module.exports.DIFF_EQUAL = DIFF_EQUAL;
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 408:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
|
|||
|
|
// EXPORTS
|
|||
|
|
__webpack_require__.d(__webpack_exports__, {
|
|||
|
|
"default": () => (/* binding */ method)
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/abcRender.ts
|
|||
|
|
var abcRender = __webpack_require__(135);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/adapterRender.ts
|
|||
|
|
var adapterRender = __webpack_require__(840);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/chartRender.ts
|
|||
|
|
var chartRender = __webpack_require__(775);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/codeRender.ts
|
|||
|
|
var codeRender = __webpack_require__(428);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/flowchartRender.ts
|
|||
|
|
var flowchartRender = __webpack_require__(325);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/graphvizRender.ts
|
|||
|
|
var graphvizRender = __webpack_require__(483);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/highlightRender.ts
|
|||
|
|
var highlightRender = __webpack_require__(999);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/markdown/lazyLoadImageRender.ts
|
|||
|
|
var lazyLoadImageRender = function (element) {
|
|||
|
|
if (element === void 0) { element = document; }
|
|||
|
|
var loadImg = function (it) {
|
|||
|
|
var testImage = document.createElement("img");
|
|||
|
|
testImage.src = it.getAttribute("data-src");
|
|||
|
|
testImage.addEventListener("load", function () {
|
|||
|
|
if (!it.getAttribute("style") && !it.getAttribute("class") &&
|
|||
|
|
!it.getAttribute("width") && !it.getAttribute("height")) {
|
|||
|
|
if (testImage.naturalHeight > testImage.naturalWidth &&
|
|||
|
|
testImage.naturalWidth / testImage.naturalHeight <
|
|||
|
|
document.querySelector(".vditor-reset").clientWidth / (window.innerHeight - 40) &&
|
|||
|
|
testImage.naturalHeight > (window.innerHeight - 40)) {
|
|||
|
|
it.style.height = (window.innerHeight - 40) + "px";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
it.src = testImage.src;
|
|||
|
|
});
|
|||
|
|
it.removeAttribute("data-src");
|
|||
|
|
};
|
|||
|
|
if (!("IntersectionObserver" in window)) {
|
|||
|
|
element.querySelectorAll("img").forEach(function (imgElement) {
|
|||
|
|
if (imgElement.getAttribute("data-src")) {
|
|||
|
|
loadImg(imgElement);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (window.vditorImageIntersectionObserver) {
|
|||
|
|
window.vditorImageIntersectionObserver.disconnect();
|
|||
|
|
element.querySelectorAll("img").forEach(function (imgElement) {
|
|||
|
|
window.vditorImageIntersectionObserver.observe(imgElement);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
window.vditorImageIntersectionObserver = new IntersectionObserver(function (entries) {
|
|||
|
|
entries.forEach(function (entrie) {
|
|||
|
|
if ((typeof entrie.isIntersecting === "undefined"
|
|||
|
|
? entrie.intersectionRatio !== 0
|
|||
|
|
: entrie.isIntersecting)
|
|||
|
|
&& entrie.target.getAttribute("data-src")) {
|
|||
|
|
loadImg(entrie.target);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
element.querySelectorAll("img").forEach(function (imgElement) {
|
|||
|
|
window.vditorImageIntersectionObserver.observe(imgElement);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/mathRender.ts
|
|||
|
|
var mathRender = __webpack_require__(472);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/mediaRender.ts
|
|||
|
|
var mediaRender = __webpack_require__(280);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/mermaidRender.ts
|
|||
|
|
var mermaidRender = __webpack_require__(637);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/SMILESRender.ts
|
|||
|
|
var SMILESRender = __webpack_require__(825);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/markmapRender.ts
|
|||
|
|
var markmapRender = __webpack_require__(11);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/mindmapRender.ts
|
|||
|
|
var mindmapRender = __webpack_require__(194);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/outlineRender.ts
|
|||
|
|
var outlineRender = __webpack_require__(436);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/plantumlRender.ts
|
|||
|
|
var plantumlRender = __webpack_require__(229);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/constants.ts
|
|||
|
|
var constants = __webpack_require__(145);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/ui/setContentTheme.ts
|
|||
|
|
var setContentTheme = __webpack_require__(538);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/util/addScript.ts
|
|||
|
|
var addScript = __webpack_require__(413);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/util/hasClosest.ts
|
|||
|
|
var hasClosest = __webpack_require__(106);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/util/merge.ts
|
|||
|
|
var merge = __webpack_require__(673);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/markdown/anchorRender.ts
|
|||
|
|
var anchorRender = function (type) {
|
|||
|
|
document.querySelectorAll(".vditor-anchor").forEach(function (anchor) {
|
|||
|
|
if (type === 1) {
|
|||
|
|
anchor.classList.add("vditor-anchor--left");
|
|||
|
|
}
|
|||
|
|
anchor.onclick = function () {
|
|||
|
|
var id = anchor.getAttribute("href").substr(1);
|
|||
|
|
var top = document.getElementById("vditorAnchor-" + id).offsetTop;
|
|||
|
|
document.querySelector("html").scrollTop = top;
|
|||
|
|
};
|
|||
|
|
});
|
|||
|
|
window.onhashchange = function () {
|
|||
|
|
var element = document.getElementById("vditorAnchor-" + decodeURIComponent(window.location.hash.substr(1)));
|
|||
|
|
if (element) {
|
|||
|
|
document.querySelector("html").scrollTop = element.offsetTop;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/setLute.ts
|
|||
|
|
var setLute = __webpack_require__(214);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/util/selection.ts
|
|||
|
|
var selection = __webpack_require__(810);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/markdown/speechRender.ts
|
|||
|
|
|
|||
|
|
var speechRender = function (element, lang) {
|
|||
|
|
if (lang === void 0) { lang = "zh_CN"; }
|
|||
|
|
if (typeof speechSynthesis === "undefined" || typeof SpeechSynthesisUtterance === "undefined") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var getVoice = function () {
|
|||
|
|
var voices = speechSynthesis.getVoices();
|
|||
|
|
var currentVoice;
|
|||
|
|
var defaultVoice;
|
|||
|
|
voices.forEach(function (item) {
|
|||
|
|
if (item.lang === lang.replace("_", "-")) {
|
|||
|
|
currentVoice = item;
|
|||
|
|
}
|
|||
|
|
if (item.default) {
|
|||
|
|
defaultVoice = item;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (!currentVoice) {
|
|||
|
|
currentVoice = defaultVoice;
|
|||
|
|
}
|
|||
|
|
return currentVoice;
|
|||
|
|
};
|
|||
|
|
var playSVG = '<svg><use xlink:href="#vditor-icon-play"></use></svg>';
|
|||
|
|
var pauseSVG = '<svg><use xlink:href="#vditor-icon-pause"></use></svg>';
|
|||
|
|
if (!document.getElementById("vditorIconScript")) {
|
|||
|
|
playSVG = '<svg viewBox="0 0 32 32"><path d="M3.436 0l25.128 16-25.128 16v-32z"></path></svg>';
|
|||
|
|
pauseSVG = '<svg viewBox="0 0 32 32"><path d="M20.617 0h9.128v32h-9.128v-32zM2.255 32v-32h9.128v32h-9.128z"></path></svg>';
|
|||
|
|
}
|
|||
|
|
var speechDom = document.querySelector(".vditor-speech");
|
|||
|
|
if (!speechDom) {
|
|||
|
|
speechDom = document.createElement("button");
|
|||
|
|
speechDom.className = "vditor-speech";
|
|||
|
|
element.insertAdjacentElement("beforeend", speechDom);
|
|||
|
|
if (speechSynthesis.onvoiceschanged !== undefined) {
|
|||
|
|
speechSynthesis.onvoiceschanged = getVoice;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var voice = getVoice();
|
|||
|
|
var utterThis = new SpeechSynthesisUtterance();
|
|||
|
|
utterThis.voice = voice;
|
|||
|
|
utterThis.onend = utterThis.onerror = function () {
|
|||
|
|
speechDom.style.display = "none";
|
|||
|
|
speechSynthesis.cancel();
|
|||
|
|
speechDom.classList.remove("vditor-speech--current");
|
|||
|
|
speechDom.innerHTML = playSVG;
|
|||
|
|
};
|
|||
|
|
element.addEventListener(window.ontouchstart !== undefined ? "touchend" : "click", function (event) {
|
|||
|
|
var target = event.target;
|
|||
|
|
if (target.classList.contains("vditor-speech") || target.parentElement.classList.contains("vditor-speech")) {
|
|||
|
|
if (!speechDom.classList.contains("vditor-speech--current")) {
|
|||
|
|
utterThis.text = speechDom.getAttribute("data-text");
|
|||
|
|
speechSynthesis.speak(utterThis);
|
|||
|
|
speechDom.classList.add("vditor-speech--current");
|
|||
|
|
speechDom.innerHTML = pauseSVG;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (speechSynthesis.speaking) {
|
|||
|
|
if (speechSynthesis.paused) {
|
|||
|
|
speechSynthesis.resume();
|
|||
|
|
speechDom.innerHTML = pauseSVG;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
speechSynthesis.pause();
|
|||
|
|
speechDom.innerHTML = playSVG;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(window.vditorSpeechRange);
|
|||
|
|
element.focus();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
speechDom.style.display = "none";
|
|||
|
|
speechSynthesis.cancel();
|
|||
|
|
speechDom.classList.remove("vditor-speech--current");
|
|||
|
|
speechDom.innerHTML = playSVG;
|
|||
|
|
if (getSelection().rangeCount === 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var range = getSelection().getRangeAt(0);
|
|||
|
|
var text = range.toString().trim();
|
|||
|
|
if (!text) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
window.vditorSpeechRange = range.cloneRange();
|
|||
|
|
var rect = range.getBoundingClientRect();
|
|||
|
|
speechDom.innerHTML = playSVG;
|
|||
|
|
speechDom.style.display = "block";
|
|||
|
|
speechDom.style.top = (rect.top + rect.height + document.querySelector("html").scrollTop - 20) + "px";
|
|||
|
|
if (window.ontouchstart !== undefined) {
|
|||
|
|
speechDom.style.left = (event.changedTouches[event.changedTouches.length - 1].pageX + 2) + "px";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
speechDom.style.left = (event.clientX + 2) + "px";
|
|||
|
|
}
|
|||
|
|
speechDom.setAttribute("data-text", text);
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/markdown/previewRender.ts
|
|||
|
|
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|||
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|||
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|||
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|||
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|||
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|||
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var __generator = (undefined && undefined.__generator) || function (thisArg, body) {
|
|||
|
|
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|||
|
|
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|||
|
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|||
|
|
function step(op) {
|
|||
|
|
if (f) throw new TypeError("Generator is already executing.");
|
|||
|
|
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|||
|
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|||
|
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|||
|
|
switch (op[0]) {
|
|||
|
|
case 0: case 1: t = op; break;
|
|||
|
|
case 4: _.label++; return { value: op[1], done: false };
|
|||
|
|
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|||
|
|
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|||
|
|
default:
|
|||
|
|
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|||
|
|
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|||
|
|
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|||
|
|
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|||
|
|
if (t[2]) _.ops.pop();
|
|||
|
|
_.trys.pop(); continue;
|
|||
|
|
}
|
|||
|
|
op = body.call(thisArg, _);
|
|||
|
|
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|||
|
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var mergeOptions = function (options) {
|
|||
|
|
var _a;
|
|||
|
|
var defaultOption = {
|
|||
|
|
anchor: 0,
|
|||
|
|
cdn: constants/* Constants.CDN */.g.CDN,
|
|||
|
|
customEmoji: {},
|
|||
|
|
emojiPath: "".concat(constants/* Constants.CDN */.g.CDN, "/dist/images/emoji"),
|
|||
|
|
hljs: constants/* Constants.HLJS_OPTIONS */.g.HLJS_OPTIONS,
|
|||
|
|
icon: "ant",
|
|||
|
|
lang: "zh_CN",
|
|||
|
|
markdown: constants/* Constants.MARKDOWN_OPTIONS */.g.MARKDOWN_OPTIONS,
|
|||
|
|
math: constants/* Constants.MATH_OPTIONS */.g.MATH_OPTIONS,
|
|||
|
|
mode: "light",
|
|||
|
|
speech: {
|
|||
|
|
enable: false,
|
|||
|
|
},
|
|||
|
|
render: {
|
|||
|
|
media: {
|
|||
|
|
enable: true,
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
theme: constants/* Constants.THEME_OPTIONS */.g.THEME_OPTIONS,
|
|||
|
|
};
|
|||
|
|
if (options.cdn) {
|
|||
|
|
if (!((_a = options.theme) === null || _a === void 0 ? void 0 : _a.path)) {
|
|||
|
|
defaultOption.theme.path = "".concat(options.cdn, "/dist/css/content-theme");
|
|||
|
|
}
|
|||
|
|
if (!options.emojiPath) {
|
|||
|
|
defaultOption.emojiPath = "".concat(options.cdn, "/dist/images/emoji");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return (0,merge/* merge */.T)(defaultOption, options);
|
|||
|
|
};
|
|||
|
|
var md2html = function (mdText, options) {
|
|||
|
|
var mergedOptions = mergeOptions(options);
|
|||
|
|
return (0,addScript/* addScript */.G)("".concat(mergedOptions.cdn, "/dist/js/lute/lute.min.js"), "vditorLuteScript").then(function () {
|
|||
|
|
var lute = (0,setLute/* setLute */.X)({
|
|||
|
|
autoSpace: mergedOptions.markdown.autoSpace,
|
|||
|
|
gfmAutoLink: mergedOptions.markdown.gfmAutoLink,
|
|||
|
|
codeBlockPreview: mergedOptions.markdown.codeBlockPreview,
|
|||
|
|
emojiSite: mergedOptions.emojiPath,
|
|||
|
|
emojis: mergedOptions.customEmoji,
|
|||
|
|
fixTermTypo: mergedOptions.markdown.fixTermTypo,
|
|||
|
|
footnotes: mergedOptions.markdown.footnotes,
|
|||
|
|
headingAnchor: mergedOptions.anchor !== 0,
|
|||
|
|
inlineMathDigit: mergedOptions.math.inlineDigit,
|
|||
|
|
lazyLoadImage: mergedOptions.lazyLoadImage,
|
|||
|
|
linkBase: mergedOptions.markdown.linkBase,
|
|||
|
|
linkPrefix: mergedOptions.markdown.linkPrefix,
|
|||
|
|
listStyle: mergedOptions.markdown.listStyle,
|
|||
|
|
mark: mergedOptions.markdown.mark,
|
|||
|
|
mathBlockPreview: mergedOptions.markdown.mathBlockPreview,
|
|||
|
|
paragraphBeginningSpace: mergedOptions.markdown.paragraphBeginningSpace,
|
|||
|
|
sanitize: mergedOptions.markdown.sanitize,
|
|||
|
|
toc: mergedOptions.markdown.toc,
|
|||
|
|
});
|
|||
|
|
if (options === null || options === void 0 ? void 0 : options.renderers) {
|
|||
|
|
lute.SetJSRenderers({
|
|||
|
|
renderers: {
|
|||
|
|
Md2HTML: options.renderers,
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
lute.SetHeadingID(true);
|
|||
|
|
return lute.Md2HTML(mdText);
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var previewRender = function (previewElement, markdown, options) { return __awaiter(void 0, void 0, void 0, function () {
|
|||
|
|
var mergedOptions, html, i18nScriptPrefix, i18nScriptID_1;
|
|||
|
|
return __generator(this, function (_a) {
|
|||
|
|
switch (_a.label) {
|
|||
|
|
case 0:
|
|||
|
|
mergedOptions = mergeOptions(options);
|
|||
|
|
return [4 /*yield*/, md2html(markdown, mergedOptions)];
|
|||
|
|
case 1:
|
|||
|
|
html = _a.sent();
|
|||
|
|
if (mergedOptions.transform) {
|
|||
|
|
html = mergedOptions.transform(html);
|
|||
|
|
}
|
|||
|
|
previewElement.innerHTML = html;
|
|||
|
|
previewElement.classList.add("vditor-reset");
|
|||
|
|
if (!!mergedOptions.i18n) return [3 /*break*/, 5];
|
|||
|
|
if (!!["de_DE", "en_US", "es_ES", "fr_FR", "ja_JP", "ko_KR", "pt_BR", "ru_RU", "sv_SE", "vi_VN", "zh_CN", "zh_TW"].includes(mergedOptions.lang)) return [3 /*break*/, 2];
|
|||
|
|
throw new Error("options.lang error, see https://ld246.com/article/1549638745630#options");
|
|||
|
|
case 2:
|
|||
|
|
i18nScriptPrefix = "vditorI18nScript";
|
|||
|
|
i18nScriptID_1 = i18nScriptPrefix + mergedOptions.lang;
|
|||
|
|
document.querySelectorAll("head script[id^=\"".concat(i18nScriptPrefix, "\"]")).forEach(function (el) {
|
|||
|
|
if (el.id !== i18nScriptID_1) {
|
|||
|
|
document.head.removeChild(el);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
return [4 /*yield*/, (0,addScript/* addScript */.G)("".concat(mergedOptions.cdn, "/dist/js/i18n/").concat(mergedOptions.lang, ".js"), i18nScriptID_1)];
|
|||
|
|
case 3:
|
|||
|
|
_a.sent();
|
|||
|
|
_a.label = 4;
|
|||
|
|
case 4: return [3 /*break*/, 6];
|
|||
|
|
case 5:
|
|||
|
|
window.VditorI18n = mergedOptions.i18n;
|
|||
|
|
_a.label = 6;
|
|||
|
|
case 6:
|
|||
|
|
if (!mergedOptions.icon) return [3 /*break*/, 8];
|
|||
|
|
return [4 /*yield*/, (0,addScript/* addScript */.G)("".concat(mergedOptions.cdn, "/dist/js/icons/").concat(mergedOptions.icon, ".js"), "vditorIconScript")];
|
|||
|
|
case 7:
|
|||
|
|
_a.sent();
|
|||
|
|
_a.label = 8;
|
|||
|
|
case 8:
|
|||
|
|
(0,setContentTheme/* setContentTheme */.Z)(mergedOptions.theme.current, mergedOptions.theme.path);
|
|||
|
|
if (mergedOptions.anchor === 1) {
|
|||
|
|
previewElement.classList.add("vditor-reset--anchor");
|
|||
|
|
}
|
|||
|
|
(0,codeRender/* codeRender */.O)(previewElement, mergedOptions.hljs);
|
|||
|
|
(0,highlightRender/* highlightRender */.s)(mergedOptions.hljs, previewElement, mergedOptions.cdn);
|
|||
|
|
(0,mathRender/* mathRender */.H)(previewElement, {
|
|||
|
|
cdn: mergedOptions.cdn,
|
|||
|
|
math: mergedOptions.math,
|
|||
|
|
});
|
|||
|
|
(0,mermaidRender/* mermaidRender */.i)(previewElement, mergedOptions.cdn, mergedOptions.mode);
|
|||
|
|
(0,SMILESRender/* SMILESRender */.J)(previewElement, mergedOptions.cdn, mergedOptions.mode);
|
|||
|
|
(0,markmapRender/* markmapRender */.K)(previewElement, mergedOptions.cdn);
|
|||
|
|
(0,flowchartRender/* flowchartRender */.P)(previewElement, mergedOptions.cdn);
|
|||
|
|
(0,graphvizRender/* graphvizRender */.v)(previewElement, mergedOptions.cdn);
|
|||
|
|
(0,chartRender/* chartRender */.p)(previewElement, mergedOptions.cdn, mergedOptions.mode);
|
|||
|
|
(0,mindmapRender/* mindmapRender */.P)(previewElement, mergedOptions.cdn, mergedOptions.mode);
|
|||
|
|
(0,plantumlRender/* plantumlRender */.B)(previewElement, mergedOptions.cdn);
|
|||
|
|
(0,abcRender/* abcRender */.Q)(previewElement, mergedOptions.cdn);
|
|||
|
|
if (mergedOptions.render.media.enable) {
|
|||
|
|
(0,mediaRender/* mediaRender */.Y)(previewElement);
|
|||
|
|
}
|
|||
|
|
if (mergedOptions.speech.enable) {
|
|||
|
|
speechRender(previewElement);
|
|||
|
|
}
|
|||
|
|
if (mergedOptions.anchor !== 0) {
|
|||
|
|
anchorRender(mergedOptions.anchor);
|
|||
|
|
}
|
|||
|
|
if (mergedOptions.after) {
|
|||
|
|
mergedOptions.after();
|
|||
|
|
}
|
|||
|
|
if (mergedOptions.lazyLoadImage) {
|
|||
|
|
lazyLoadImageRender(previewElement);
|
|||
|
|
}
|
|||
|
|
previewElement.addEventListener("click", function (event) {
|
|||
|
|
var spanElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(event.target, "SPAN");
|
|||
|
|
if (spanElement && (0,hasClosest/* hasClosestByClassName */.fb)(spanElement, "vditor-toc")) {
|
|||
|
|
var headingElement = previewElement.querySelector("#" + spanElement.getAttribute("data-target-id"));
|
|||
|
|
if (headingElement) {
|
|||
|
|
window.scrollTo(window.scrollX, headingElement.offsetTop);
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}); };
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/preview/image.ts
|
|||
|
|
var preview_image = __webpack_require__(190);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/ui/setCodeTheme.ts
|
|||
|
|
var setCodeTheme = __webpack_require__(580);
|
|||
|
|
;// CONCATENATED MODULE: ./src/method.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Vditor = /** @class */ (function () {
|
|||
|
|
function Vditor() {
|
|||
|
|
}
|
|||
|
|
/** 点击图片放大 */
|
|||
|
|
Vditor.adapterRender = adapterRender;
|
|||
|
|
/** 点击图片放大 */
|
|||
|
|
Vditor.previewImage = preview_image/* previewImage */.E;
|
|||
|
|
/** 为 element 中的代码块添加复制按钮 */
|
|||
|
|
Vditor.codeRender = codeRender/* codeRender */.O;
|
|||
|
|
/** 对 graphviz 进行渲染 */
|
|||
|
|
Vditor.graphvizRender = graphvizRender/* graphvizRender */.v;
|
|||
|
|
/** 为 element 中的代码块进行高亮渲染 */
|
|||
|
|
Vditor.highlightRender = highlightRender/* highlightRender */.s;
|
|||
|
|
/** 对数学公式进行渲染 */
|
|||
|
|
Vditor.mathRender = mathRender/* mathRender */.H;
|
|||
|
|
/** 流程图/时序图/甘特图渲染 */
|
|||
|
|
Vditor.mermaidRender = mermaidRender/* mermaidRender */.i;
|
|||
|
|
/** 化学物质结构渲染 */
|
|||
|
|
Vditor.SMILESRender = SMILESRender/* SMILESRender */.J;
|
|||
|
|
/** 支持 markdown 的思维导图 */
|
|||
|
|
Vditor.markmapRender = markmapRender/* markmapRender */.K;
|
|||
|
|
/** flowchart.js 渲染 */
|
|||
|
|
Vditor.flowchartRender = flowchartRender/* flowchartRender */.P;
|
|||
|
|
/** 图表渲染 */
|
|||
|
|
Vditor.chartRender = chartRender/* chartRender */.p;
|
|||
|
|
/** 五线谱渲染 */
|
|||
|
|
Vditor.abcRender = abcRender/* abcRender */.Q;
|
|||
|
|
/** 脑图渲染 */
|
|||
|
|
Vditor.mindmapRender = mindmapRender/* mindmapRender */.P;
|
|||
|
|
/** plantuml渲染 */
|
|||
|
|
Vditor.plantumlRender = plantumlRender/* plantumlRender */.B;
|
|||
|
|
/** 大纲渲染 */
|
|||
|
|
Vditor.outlineRender = outlineRender/* outlineRender */.k;
|
|||
|
|
/** 为[特定链接](https://github.com/Vanessa219/vditor/issues/7)分别渲染为视频、音频、嵌入的 iframe */
|
|||
|
|
Vditor.mediaRender = mediaRender/* mediaRender */.Y;
|
|||
|
|
/** 对选中的文字进行阅读 */
|
|||
|
|
Vditor.speechRender = speechRender;
|
|||
|
|
/** 对图片进行懒加载 */
|
|||
|
|
Vditor.lazyLoadImageRender = lazyLoadImageRender;
|
|||
|
|
/** Markdown 文本转换为 HTML,该方法需使用[异步编程](https://ld246.com/article/1546828434083?r=Vaness) */
|
|||
|
|
Vditor.md2html = md2html;
|
|||
|
|
/** 页面 Markdown 文章渲染 */
|
|||
|
|
Vditor.preview = previewRender;
|
|||
|
|
/** 设置代码主题 */
|
|||
|
|
Vditor.setCodeTheme = setCodeTheme/* setCodeTheme */.Y;
|
|||
|
|
/** 设置内容主题 */
|
|||
|
|
Vditor.setContentTheme = setContentTheme/* setContentTheme */.Z;
|
|||
|
|
return Vditor;
|
|||
|
|
}());
|
|||
|
|
/* harmony default export */ const method = (Vditor);
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 145:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "H": () => (/* binding */ _VDITOR_VERSION),
|
|||
|
|
/* harmony export */ "g": () => (/* binding */ Constants)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
var _VDITOR_VERSION = "3.11.2";
|
|||
|
|
|
|||
|
|
var Constants = /** @class */ (function () {
|
|||
|
|
function Constants() {
|
|||
|
|
}
|
|||
|
|
Constants.ZWSP = "\u200b";
|
|||
|
|
Constants.DROP_EDITOR = "application/editor";
|
|||
|
|
Constants.MOBILE_WIDTH = 520;
|
|||
|
|
Constants.CLASS_MENU_DISABLED = "vditor-menu--disabled";
|
|||
|
|
Constants.EDIT_TOOLBARS = ["emoji", "headings", "bold", "italic", "strike", "link", "list",
|
|||
|
|
"ordered-list", "outdent", "indent", "check", "line", "quote", "code", "inline-code", "insert-after",
|
|||
|
|
"insert-before", "upload", "record", "table"];
|
|||
|
|
Constants.CODE_THEME = ["a11y-dark", "agate", "an-old-hope", "androidstudio",
|
|||
|
|
"arta", "atom-one-dark", "atom-one-dark-reasonable", "base16/3024", "base16/apathy", "base16/apprentice", "base16/ashes", "base16/atelier-cave", "base16/atelier-dune",
|
|||
|
|
"base16/atelier-estuary", "base16/atelier-forest", "base16/atelier-heath", "base16/atelier-lakeside", "base16/atelier-plateau", "base16/atelier-savanna", "base16/atelier-seaside", "base16/atelier-sulphurpool",
|
|||
|
|
"base16/atlas", "base16/bespin", "base16/black-metal", "base16/black-metal-bathory", "base16/black-metal-burzum", "base16/black-metal-dark-funeral", "base16/black-metal-gorgoroth", "base16/black-metal-immortal", "base16/black-metal-khold", "base16/black-metal-marduk", "base16/black-metal-mayhem", "base16/black-metal-nile", "base16/black-metal-venom", "base16/brewer", "base16/bright", "base16/brogrammer",
|
|||
|
|
"base16/brush-trees-dark", "base16/chalk", "base16/circus", "base16/classic-dark", "base16/codeschool", "base16/colors", "base16/danqing", "base16/darcula", "base16/dark-violet",
|
|||
|
|
"base16/darkmoss", "base16/darktooth", "base16/decaf", "base16/default-dark", "base16/dracula", "base16/edge-dark", "base16/eighties", "base16/embers", "base16/equilibrium-dark",
|
|||
|
|
"base16/equilibrium-gray-dark", "base16/espresso", "base16/eva", "base16/eva-dim", "base16/flat", "base16/framer", "base16/gigavolt", "base16/google-dark", "base16/grayscale-dark", "base16/green-screen", "base16/gruvbox-dark-hard", "base16/gruvbox-dark-medium",
|
|||
|
|
"base16/gruvbox-dark-pale", "base16/gruvbox-dark-soft", "base16/hardcore", "base16/harmonic16-dark", "base16/heetch-dark", "base16/helios", "base16/hopscotch", "base16/horizon-dark", "base16/humanoid-dark", "base16/ia-dark", "base16/icy-dark", "base16/ir-black", "base16/isotope",
|
|||
|
|
"base16/kimber", "base16/london-tube", "base16/macintosh", "base16/marrakesh", "base16/materia", "base16/material", "base16/material-darker", "base16/material-palenight", "base16/material-vivid",
|
|||
|
|
"base16/mellow-purple", "base16/mocha", "base16/monokai", "base16/nebula", "base16/nord", "base16/nova", "base16/ocean", "base16/oceanicnext", "base16/onedark", "base16/outrun-dark",
|
|||
|
|
"base16/papercolor-dark", "base16/paraiso", "base16/pasque", "base16/phd", "base16/pico", "base16/pop", "base16/porple", "base16/qualia", "base16/railscasts", "base16/rebecca",
|
|||
|
|
"base16/ros-pine", "base16/ros-pine-moon", "base16/sandcastle", "base16/seti-ui", "base16/silk-dark", "base16/snazzy", "base16/solar-flare", "base16/solarized-dark", "base16/spacemacs", "base16/summercamp", "base16/summerfruit-dark",
|
|||
|
|
"base16/synth-midnight-terminal-dark", "base16/tango", "base16/tender", "base16/tomorrow-night", "base16/twilight", "base16/unikitty-dark", "base16/vulcan",
|
|||
|
|
"base16/windows-10", "base16/windows-95", "base16/windows-high-contrast", "base16/windows-nt", "base16/woodland", "base16/xcode-dusk", "base16/zenburn", "codepen-embed", "dark",
|
|||
|
|
"devibeans", "far", "felipec", "github-dark", "github-dark-dimmed", "gml", "gradient-dark", "hybrid", "ir-black", "isbl-editor-dark", "kimbie-dark", "lioshi",
|
|||
|
|
"monokai", "monokai-sublime", "night-owl", "nnfx-dark", "nord", "obsidian", "panda-syntax-dark", "paraiso-dark", "pojoaque", "qtcreator-dark", "rainbow", "shades-of-purple", "srcery", "stackoverflow-dark",
|
|||
|
|
"sunburst", "tomorrow-night-blue", "tomorrow-night-bright", "tokyo-night-dark", "vs2015", "xt256",
|
|||
|
|
"ant-design",
|
|||
|
|
"a11y-light", "arduino-light", "ascetic", "atom-one-light", "base16/atelier-cave-light",
|
|||
|
|
"base16/atelier-dune-light", "base16/atelier-estuary-light", "base16/atelier-forest-light", "base16/atelier-heath-light",
|
|||
|
|
"base16/atelier-lakeside-light", "base16/atelier-plateau-light", "base16/atelier-savanna-light", "base16/atelier-seaside-light", "base16/atelier-sulphurpool-light", "base16/brush-trees",
|
|||
|
|
"base16/classic-light", "base16/cupcake", "base16/cupertino", "base16/default-light", "base16/dirtysea", "base16/edge-light", "base16/equilibrium-gray-light", "base16/equilibrium-light",
|
|||
|
|
"base16/fruit-soda", "base16/github", "base16/google-light", "base16/grayscale-light", "base16/gruvbox-light-hard", "base16/gruvbox-light-medium", "base16/gruvbox-light-soft",
|
|||
|
|
"base16/harmonic16-light", "base16/heetch-light", "base16/humanoid-light", "base16/horizon-light", "base16/ia-light", "base16/material-lighter", "base16/mexico-light",
|
|||
|
|
"base16/one-light", "base16/papercolor-light", "base16/ros-pine-dawn", "base16/sagelight", "base16/shapeshifter",
|
|||
|
|
"base16/silk-light", "base16/solar-flare-light", "base16/solarized-light", "base16/summerfruit-light", "base16/synth-midnight-terminal-light", "base16/tomorrow",
|
|||
|
|
"base16/unikitty-light", "base16/windows-10-light", "base16/windows-95-light", "base16/windows-high-contrast-light", "brown-paper", "base16/windows-nt-light",
|
|||
|
|
"color-brewer", "docco", "foundation", "github", "googlecode", "gradient-light", "grayscale", "idea", "intellij-light", "isbl-editor-light", "kimbie-light",
|
|||
|
|
"lightfair", "magula", "mono-blue", "nnfx-light", "panda-syntax-light", "paraiso-light", "purebasic", "qtcreator-light", "routeros", "school-book",
|
|||
|
|
"stackoverflow-light", "tokyo-night-light", "vs", "xcode", "default"];
|
|||
|
|
Constants.ALIAS_CODE_LANGUAGES = [
|
|||
|
|
// 自定义
|
|||
|
|
"abc", "plantuml", "mermaid", "flowchart", "echarts", "mindmap", "graphviz", "math", "markmap", "smiles",
|
|||
|
|
// 别名
|
|||
|
|
"js", "ts", "html", "toml", "c#", "bat"
|
|||
|
|
];
|
|||
|
|
Constants.CDN = "https://unpkg.com/vditor@".concat("3.11.2");
|
|||
|
|
Constants.MARKDOWN_OPTIONS = {
|
|||
|
|
autoSpace: false,
|
|||
|
|
gfmAutoLink: true,
|
|||
|
|
codeBlockPreview: true,
|
|||
|
|
fixTermTypo: false,
|
|||
|
|
footnotes: true,
|
|||
|
|
linkBase: "",
|
|||
|
|
linkPrefix: "",
|
|||
|
|
listStyle: false,
|
|||
|
|
mark: false,
|
|||
|
|
mathBlockPreview: true,
|
|||
|
|
paragraphBeginningSpace: false,
|
|||
|
|
sanitize: true,
|
|||
|
|
toc: false,
|
|||
|
|
};
|
|||
|
|
Constants.HLJS_OPTIONS = {
|
|||
|
|
enable: true,
|
|||
|
|
lineNumber: false,
|
|||
|
|
defaultLang: "",
|
|||
|
|
style: "github",
|
|||
|
|
};
|
|||
|
|
Constants.MATH_OPTIONS = {
|
|||
|
|
engine: "KaTeX",
|
|||
|
|
inlineDigit: false,
|
|||
|
|
macros: {},
|
|||
|
|
};
|
|||
|
|
Constants.THEME_OPTIONS = {
|
|||
|
|
current: "light",
|
|||
|
|
list: {
|
|||
|
|
"ant-design": "Ant Design",
|
|||
|
|
"dark": "Dark",
|
|||
|
|
"light": "Light",
|
|||
|
|
"wechat": "WeChat",
|
|||
|
|
},
|
|||
|
|
path: "".concat(Constants.CDN, "/dist/css/content-theme"),
|
|||
|
|
};
|
|||
|
|
return Constants;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 825:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "J": () => (/* binding */ SMILESRender)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145);
|
|||
|
|
/* harmony import */ var _util_addScript__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(413);
|
|||
|
|
/* harmony import */ var _adapterRender__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(840);
|
|||
|
|
/* harmony import */ var _util_function__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(494);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var SMILESRender = function (element, cdn, theme) {
|
|||
|
|
if (element === void 0) { element = document; }
|
|||
|
|
if (cdn === void 0) { cdn = _constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.CDN */ .g.CDN; }
|
|||
|
|
var SMILESElements = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.SMILESRenderAdapter.getElements(element);
|
|||
|
|
if (SMILESElements.length > 0) {
|
|||
|
|
(0,_util_addScript__WEBPACK_IMPORTED_MODULE_2__/* .addScript */ .G)("".concat(cdn, "/dist/js/smiles-drawer/smiles-drawer.min.js?v=2.1.7"), "vditorAbcjsScript").then(function () {
|
|||
|
|
var sd = new SmiDrawer({}, {});
|
|||
|
|
SMILESElements.forEach(function (item) {
|
|||
|
|
var code = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.SMILESRenderAdapter.getCode(item).trim();
|
|||
|
|
if (item.getAttribute("data-processed") === "true" || code.trim() === "") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var id = "smiles" + (0,_util_function__WEBPACK_IMPORTED_MODULE_3__/* .genUUID */ .Wb)();
|
|||
|
|
item.innerHTML = "<svg id=\"".concat(id, "\"></svg>");
|
|||
|
|
sd.draw(code, '#' + id, theme === "dark" ? "dark" : undefined);
|
|||
|
|
item.setAttribute("data-processed", "true");
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 135:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "Q": () => (/* binding */ abcRender)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145);
|
|||
|
|
/* harmony import */ var _util_addScript__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(413);
|
|||
|
|
/* harmony import */ var _adapterRender__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(840);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var abcRender = function (element, cdn) {
|
|||
|
|
if (element === void 0) { element = document; }
|
|||
|
|
if (cdn === void 0) { cdn = _constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.CDN */ .g.CDN; }
|
|||
|
|
var abcElements = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.abcRenderAdapter.getElements(element);
|
|||
|
|
if (abcElements.length > 0) {
|
|||
|
|
(0,_util_addScript__WEBPACK_IMPORTED_MODULE_2__/* .addScript */ .G)("".concat(cdn, "/dist/js/abcjs/abcjs_basic.min.js"), "vditorAbcjsScript").then(function () {
|
|||
|
|
abcElements.forEach(function (item) {
|
|||
|
|
if (item.parentElement.classList.contains("vditor-wysiwyg__pre") ||
|
|||
|
|
item.parentElement.classList.contains("vditor-ir__marker--pre")) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (item.getAttribute("data-processed") === "true") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
ABCJS.renderAbc(item, _adapterRender__WEBPACK_IMPORTED_MODULE_1__.abcRenderAdapter.getCode(item).trim());
|
|||
|
|
item.style.overflowX = "auto";
|
|||
|
|
item.setAttribute("data-processed", "true");
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 840:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
__webpack_require__.r(__webpack_exports__);
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "mathRenderAdapter": () => (/* binding */ mathRenderAdapter),
|
|||
|
|
/* harmony export */ "SMILESRenderAdapter": () => (/* binding */ SMILESRenderAdapter),
|
|||
|
|
/* harmony export */ "mermaidRenderAdapter": () => (/* binding */ mermaidRenderAdapter),
|
|||
|
|
/* harmony export */ "markmapRenderAdapter": () => (/* binding */ markmapRenderAdapter),
|
|||
|
|
/* harmony export */ "mindmapRenderAdapter": () => (/* binding */ mindmapRenderAdapter),
|
|||
|
|
/* harmony export */ "chartRenderAdapter": () => (/* binding */ chartRenderAdapter),
|
|||
|
|
/* harmony export */ "abcRenderAdapter": () => (/* binding */ abcRenderAdapter),
|
|||
|
|
/* harmony export */ "graphvizRenderAdapter": () => (/* binding */ graphvizRenderAdapter),
|
|||
|
|
/* harmony export */ "flowchartRenderAdapter": () => (/* binding */ flowchartRenderAdapter),
|
|||
|
|
/* harmony export */ "plantumlRenderAdapter": () => (/* binding */ plantumlRenderAdapter)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
var mathRenderAdapter = {
|
|||
|
|
getCode: function (el) { return el.textContent; },
|
|||
|
|
getElements: function (element) { return element.querySelectorAll(".language-math"); },
|
|||
|
|
};
|
|||
|
|
var SMILESRenderAdapter = {
|
|||
|
|
getCode: function (el) { return el.textContent; },
|
|||
|
|
getElements: function (element) { return element.querySelectorAll(".language-smiles"); },
|
|||
|
|
};
|
|||
|
|
var mermaidRenderAdapter = {
|
|||
|
|
/** 不仅要返回code,并且需要将 code 设置为 el 的 innerHTML */
|
|||
|
|
getCode: function (el) { return el.textContent; },
|
|||
|
|
getElements: function (element) { return element.querySelectorAll(".language-mermaid"); },
|
|||
|
|
};
|
|||
|
|
var markmapRenderAdapter = {
|
|||
|
|
getCode: function (el) { return el.textContent; },
|
|||
|
|
getElements: function (element) { return element.querySelectorAll(".language-markmap"); },
|
|||
|
|
};
|
|||
|
|
var mindmapRenderAdapter = {
|
|||
|
|
getCode: function (el) { return el.getAttribute("data-code"); },
|
|||
|
|
getElements: function (el) { return el.querySelectorAll(".language-mindmap"); },
|
|||
|
|
};
|
|||
|
|
var chartRenderAdapter = {
|
|||
|
|
getCode: function (el) { return el.innerText; },
|
|||
|
|
getElements: function (el) { return el.querySelectorAll(".language-echarts"); },
|
|||
|
|
};
|
|||
|
|
var abcRenderAdapter = {
|
|||
|
|
getCode: function (el) { return el.textContent; },
|
|||
|
|
getElements: function (el) { return el.querySelectorAll(".language-abc"); },
|
|||
|
|
};
|
|||
|
|
var graphvizRenderAdapter = {
|
|||
|
|
getCode: function (el) { return el.textContent; },
|
|||
|
|
getElements: function (el) { return el.querySelectorAll(".language-graphviz"); },
|
|||
|
|
};
|
|||
|
|
var flowchartRenderAdapter = {
|
|||
|
|
getCode: function (el) { return el.textContent; },
|
|||
|
|
getElements: function (el) { return el.querySelectorAll(".language-flowchart"); },
|
|||
|
|
};
|
|||
|
|
var plantumlRenderAdapter = {
|
|||
|
|
getCode: function (el) { return el.textContent; },
|
|||
|
|
getElements: function (el) { return el.querySelectorAll(".language-plantuml"); },
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 775:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "p": () => (/* binding */ chartRender)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145);
|
|||
|
|
/* harmony import */ var _util_addScript__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(413);
|
|||
|
|
/* harmony import */ var _adapterRender__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(840);
|
|||
|
|
/* harmony import */ var _util_function__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(494);
|
|||
|
|
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|||
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|||
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|||
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|||
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|||
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|||
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var __generator = (undefined && undefined.__generator) || function (thisArg, body) {
|
|||
|
|
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|||
|
|
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|||
|
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|||
|
|
function step(op) {
|
|||
|
|
if (f) throw new TypeError("Generator is already executing.");
|
|||
|
|
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|||
|
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|||
|
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|||
|
|
switch (op[0]) {
|
|||
|
|
case 0: case 1: t = op; break;
|
|||
|
|
case 4: _.label++; return { value: op[1], done: false };
|
|||
|
|
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|||
|
|
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|||
|
|
default:
|
|||
|
|
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|||
|
|
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|||
|
|
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|||
|
|
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|||
|
|
if (t[2]) _.ops.pop();
|
|||
|
|
_.trys.pop(); continue;
|
|||
|
|
}
|
|||
|
|
op = body.call(thisArg, _);
|
|||
|
|
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|||
|
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var chartRender = function (element, cdn, theme) {
|
|||
|
|
if (element === void 0) { element = document; }
|
|||
|
|
if (cdn === void 0) { cdn = _constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.CDN */ .g.CDN; }
|
|||
|
|
var echartsElements = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.chartRenderAdapter.getElements(element);
|
|||
|
|
if (echartsElements.length > 0) {
|
|||
|
|
(0,_util_addScript__WEBPACK_IMPORTED_MODULE_2__/* .addScript */ .G)("".concat(cdn, "/dist/js/echarts/echarts.min.js?v=5.5.1"), "vditorEchartsScript").then(function () {
|
|||
|
|
echartsElements.forEach(function (e) { return __awaiter(void 0, void 0, void 0, function () {
|
|||
|
|
var text, option, error_1;
|
|||
|
|
return __generator(this, function (_a) {
|
|||
|
|
switch (_a.label) {
|
|||
|
|
case 0:
|
|||
|
|
if (e.parentElement.classList.contains("vditor-wysiwyg__pre") ||
|
|||
|
|
e.parentElement.classList.contains("vditor-ir__marker--pre")) {
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
text = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.chartRenderAdapter.getCode(e).trim();
|
|||
|
|
if (!text) {
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
_a.label = 1;
|
|||
|
|
case 1:
|
|||
|
|
_a.trys.push([1, 3, , 4]);
|
|||
|
|
if (e.getAttribute("data-processed") === "true") {
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
return [4 /*yield*/, (0,_util_function__WEBPACK_IMPORTED_MODULE_3__/* .looseJsonParse */ .Qf)(text)];
|
|||
|
|
case 2:
|
|||
|
|
option = _a.sent();
|
|||
|
|
echarts.init(e, theme === "dark" ? "dark" : undefined).setOption(option);
|
|||
|
|
e.setAttribute("data-processed", "true");
|
|||
|
|
return [3 /*break*/, 4];
|
|||
|
|
case 3:
|
|||
|
|
error_1 = _a.sent();
|
|||
|
|
e.className = "vditor-reset--error";
|
|||
|
|
e.innerHTML = "echarts render error: <br>".concat(error_1);
|
|||
|
|
return [3 /*break*/, 4];
|
|||
|
|
case 4: return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}); });
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 428:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "O": () => (/* binding */ codeRender)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _util_code160to32__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(105);
|
|||
|
|
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145);
|
|||
|
|
|
|||
|
|
|
|||
|
|
var codeRender = function (element, option) {
|
|||
|
|
Array.from(element.querySelectorAll("pre > code")).filter(function (e, index) {
|
|||
|
|
if (e.parentElement.classList.contains("vditor-wysiwyg__pre") ||
|
|||
|
|
e.parentElement.classList.contains("vditor-ir__marker--pre")) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (e.classList.contains("language-mermaid") || e.classList.contains("language-flowchart") ||
|
|||
|
|
e.classList.contains("language-echarts") || e.classList.contains("language-mindmap") ||
|
|||
|
|
e.classList.contains("language-plantuml") || e.classList.contains("language-markmap") ||
|
|||
|
|
e.classList.contains("language-abc") || e.classList.contains("language-graphviz") ||
|
|||
|
|
e.classList.contains("language-math") || e.classList.contains("language-smiles")) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (e.style.maxHeight.indexOf("px") > -1) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
// 避免预览区在渲染后由于代码块过多产生性能问题 https://github.com/b3log/vditor/issues/67
|
|||
|
|
if (element.classList.contains("vditor-preview") && index > 5) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}).forEach(function (e) {
|
|||
|
|
var _a, _b, _c;
|
|||
|
|
var codeText = e.innerText;
|
|||
|
|
if (e.classList.contains("highlight-chroma")) {
|
|||
|
|
var codeElement = e.cloneNode(true);
|
|||
|
|
codeElement.querySelectorAll(".highlight-ln").forEach(function (item) {
|
|||
|
|
item.remove();
|
|||
|
|
});
|
|||
|
|
codeText = codeElement.innerText;
|
|||
|
|
}
|
|||
|
|
else if (codeText.endsWith("\n")) {
|
|||
|
|
codeText = codeText.substr(0, codeText.length - 1);
|
|||
|
|
}
|
|||
|
|
var iconHTML = '<svg><use xlink:href="#vditor-icon-copy"></use></svg>';
|
|||
|
|
if (!document.getElementById("vditorIconScript")) {
|
|||
|
|
iconHTML = '<svg viewBox="0 0 32 32"><path d="M22.545-0h-17.455c-1.6 0-2.909 1.309-2.909 2.909v20.364h2.909v-20.364h17.455v-2.909zM26.909 5.818h-16c-1.6 0-2.909 1.309-2.909 2.909v20.364c0 1.6 1.309 2.909 2.909 2.909h16c1.6 0 2.909-1.309 2.909-2.909v-20.364c0-1.6-1.309-2.909-2.909-2.909zM26.909 29.091h-16v-20.364h16v20.364z"></path></svg>';
|
|||
|
|
}
|
|||
|
|
var divElement = document.createElement("div");
|
|||
|
|
divElement.className = "vditor-copy";
|
|||
|
|
divElement.innerHTML = "<span aria-label=\"".concat(((_a = window.VditorI18n) === null || _a === void 0 ? void 0 : _a.copy) || "复制", "\"\nonmouseover=\"this.setAttribute('aria-label', '").concat(((_b = window.VditorI18n) === null || _b === void 0 ? void 0 : _b.copy) || "复制", "')\"\nclass=\"vditor-tooltipped vditor-tooltipped__w\"\nonclick=\"event.stopPropagation();this.previousElementSibling.select();document.execCommand('copy');this.setAttribute('aria-label', '").concat(((_c = window.VditorI18n) === null || _c === void 0 ? void 0 : _c.copied) || "已复制", "');this.previousElementSibling.blur()\">").concat(iconHTML, "</span>");
|
|||
|
|
var textarea = document.createElement("textarea");
|
|||
|
|
textarea.value = (0,_util_code160to32__WEBPACK_IMPORTED_MODULE_1__/* .code160to32 */ .X)(codeText);
|
|||
|
|
divElement.insertAdjacentElement("afterbegin", textarea);
|
|||
|
|
if (option && option.renderMenu) {
|
|||
|
|
option.renderMenu(e, divElement);
|
|||
|
|
}
|
|||
|
|
e.before(divElement);
|
|||
|
|
e.style.maxHeight = (window.outerHeight - 40) + "px";
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/1356
|
|||
|
|
e.insertAdjacentHTML("afterend", "<span style=\"position: absolute\">".concat(_constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.ZWSP */ .g.ZWSP, "</span>"));
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 325:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "P": () => (/* binding */ flowchartRender)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145);
|
|||
|
|
/* harmony import */ var _util_addScript__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(413);
|
|||
|
|
/* harmony import */ var _adapterRender__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(840);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var flowchartRender = function (element, cdn) {
|
|||
|
|
if (cdn === void 0) { cdn = _constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.CDN */ .g.CDN; }
|
|||
|
|
var flowchartElements = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.flowchartRenderAdapter.getElements(element);
|
|||
|
|
if (flowchartElements.length === 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
(0,_util_addScript__WEBPACK_IMPORTED_MODULE_2__/* .addScript */ .G)("".concat(cdn, "/dist/js/flowchart.js/flowchart.min.js"), "vditorFlowchartScript").then(function () {
|
|||
|
|
flowchartElements.forEach(function (item) {
|
|||
|
|
if (item.getAttribute("data-processed") === "true") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var flowchartObj = flowchart.parse(_adapterRender__WEBPACK_IMPORTED_MODULE_1__.flowchartRenderAdapter.getCode(item));
|
|||
|
|
item.innerHTML = "";
|
|||
|
|
flowchartObj.drawSVG(item);
|
|||
|
|
item.setAttribute("data-processed", "true");
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 483:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "v": () => (/* binding */ graphvizRender)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145);
|
|||
|
|
/* harmony import */ var _util_addScript__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(413);
|
|||
|
|
/* harmony import */ var _adapterRender__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(840);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var graphvizRender = function (element, cdn) {
|
|||
|
|
if (cdn === void 0) { cdn = _constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.CDN */ .g.CDN; }
|
|||
|
|
var graphvizElements = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.graphvizRenderAdapter.getElements(element);
|
|||
|
|
if (graphvizElements.length === 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
(0,_util_addScript__WEBPACK_IMPORTED_MODULE_2__/* .addScript */ .G)("".concat(cdn, "/dist/js/graphviz/viz.js"), "vditorGraphVizScript").then(function () {
|
|||
|
|
graphvizElements.forEach(function (e) {
|
|||
|
|
var code = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.graphvizRenderAdapter.getCode(e);
|
|||
|
|
if (e.parentElement.classList.contains("vditor-wysiwyg__pre") ||
|
|||
|
|
e.parentElement.classList.contains("vditor-ir__marker--pre")) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (e.getAttribute("data-processed") === "true" || code.trim() === "") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
var blob = new Blob(["importScripts('".concat(document.getElementById("vditorGraphVizScript").src.replace("viz.js", "full.render.js"), "');")], { type: "application/javascript" });
|
|||
|
|
var url = window.URL || window.webkitURL;
|
|||
|
|
var blobUrl = url.createObjectURL(blob);
|
|||
|
|
var worker = new Worker(blobUrl);
|
|||
|
|
new Viz({ worker: worker })
|
|||
|
|
.renderSVGElement(code).then(function (result) {
|
|||
|
|
e.innerHTML = result.outerHTML;
|
|||
|
|
}).catch(function (error) {
|
|||
|
|
e.innerHTML = "graphviz render error: <br>".concat(error);
|
|||
|
|
e.className = "vditor-reset--error";
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
catch (e) {
|
|||
|
|
console.error("graphviz error", e);
|
|||
|
|
}
|
|||
|
|
e.setAttribute("data-processed", "true");
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 999:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "s": () => (/* binding */ highlightRender)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145);
|
|||
|
|
/* harmony import */ var _util_addScript__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(413);
|
|||
|
|
/* harmony import */ var _util_addStyle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(290);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var highlightRender = function (hljsOption, element, cdn) {
|
|||
|
|
if (element === void 0) { element = document; }
|
|||
|
|
if (cdn === void 0) { cdn = _constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.CDN */ .g.CDN; }
|
|||
|
|
var style = hljsOption.style;
|
|||
|
|
if (!_constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.CODE_THEME.includes */ .g.CODE_THEME.includes(style)) {
|
|||
|
|
style = "github";
|
|||
|
|
}
|
|||
|
|
var vditorHljsStyle = document.getElementById("vditorHljsStyle");
|
|||
|
|
var href = "".concat(cdn, "/dist/js/highlight.js/styles/").concat(style, ".min.css");
|
|||
|
|
if (vditorHljsStyle && vditorHljsStyle.getAttribute('href') !== href) {
|
|||
|
|
vditorHljsStyle.remove();
|
|||
|
|
}
|
|||
|
|
(0,_util_addStyle__WEBPACK_IMPORTED_MODULE_1__/* .addStyle */ .c)("".concat(cdn, "/dist/js/highlight.js/styles/").concat(style, ".min.css"), "vditorHljsStyle");
|
|||
|
|
if (hljsOption.enable === false) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var codes = element.querySelectorAll("pre > code");
|
|||
|
|
if (codes.length === 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
(0,_util_addScript__WEBPACK_IMPORTED_MODULE_2__/* .addScript */ .G)("".concat(cdn, "/dist/js/highlight.js/highlight.min.js?v=11.7.0"), "vditorHljsScript").then(function () {
|
|||
|
|
(0,_util_addScript__WEBPACK_IMPORTED_MODULE_2__/* .addScript */ .G)("".concat(cdn, "/dist/js/highlight.js/third-languages.js?v=1.0.1"), "vditorHljsThirdScript").then(function () {
|
|||
|
|
element.querySelectorAll("pre > code").forEach(function (block) {
|
|||
|
|
// ir & wysiwyg 区域不渲染
|
|||
|
|
if (block.parentElement.classList.contains("vditor-ir__marker--pre") ||
|
|||
|
|
block.parentElement.classList.contains("vditor-wysiwyg__pre")) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (block.classList.contains("language-mermaid") || block.classList.contains("language-flowchart") ||
|
|||
|
|
block.classList.contains("language-echarts") || block.classList.contains("language-mindmap") ||
|
|||
|
|
block.classList.contains("language-plantuml") || block.classList.contains("language-smiles") ||
|
|||
|
|
block.classList.contains("language-abc") || block.classList.contains("language-graphviz") ||
|
|||
|
|
block.classList.contains("language-math")) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (hljsOption.defaultLang !== "" && block.className.indexOf("language-") === -1) {
|
|||
|
|
block.classList.add("language-" + hljsOption.defaultLang);
|
|||
|
|
}
|
|||
|
|
var language = block.className.replace("language-", "");
|
|||
|
|
if (!window.hljs.getLanguage(language)) {
|
|||
|
|
language = "plaintext";
|
|||
|
|
}
|
|||
|
|
block.innerHTML = window.hljs.highlight(block.textContent, {
|
|||
|
|
language: language,
|
|||
|
|
ignoreIllegals: true
|
|||
|
|
}).value;
|
|||
|
|
block.classList.add("hljs");
|
|||
|
|
if (!hljsOption.lineNumber) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
block.classList.add("vditor-linenumber");
|
|||
|
|
var linenNumberTemp = block.querySelector(".vditor-linenumber__temp");
|
|||
|
|
if (!linenNumberTemp) {
|
|||
|
|
linenNumberTemp = document.createElement("div");
|
|||
|
|
linenNumberTemp.className = "vditor-linenumber__temp";
|
|||
|
|
block.insertAdjacentElement("beforeend", linenNumberTemp);
|
|||
|
|
}
|
|||
|
|
var whiteSpace = getComputedStyle(block).whiteSpace;
|
|||
|
|
var isSoftWrap = false;
|
|||
|
|
if (whiteSpace === "pre-wrap" || whiteSpace === "pre-line") {
|
|||
|
|
isSoftWrap = true;
|
|||
|
|
}
|
|||
|
|
var lineNumberHTML = "";
|
|||
|
|
var lineList = block.textContent.split(/\r\n|\r|\n/g);
|
|||
|
|
lineList.pop();
|
|||
|
|
lineList.map(function (line) {
|
|||
|
|
var lineHeight = "";
|
|||
|
|
if (isSoftWrap) {
|
|||
|
|
linenNumberTemp.textContent = line || "\n";
|
|||
|
|
lineHeight = " style=\"height:".concat(linenNumberTemp.getBoundingClientRect().height, "px\"");
|
|||
|
|
}
|
|||
|
|
lineNumberHTML += "<span".concat(lineHeight, "></span>");
|
|||
|
|
});
|
|||
|
|
linenNumberTemp.style.display = "none";
|
|||
|
|
lineNumberHTML = "<span class=\"vditor-linenumber__rows\">".concat(lineNumberHTML, "</span>");
|
|||
|
|
block.insertAdjacentHTML("beforeend", lineNumberHTML);
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 11:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "K": () => (/* binding */ markmapRender)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145);
|
|||
|
|
/* harmony import */ var _util_addScript__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(413);
|
|||
|
|
/* harmony import */ var _adapterRender__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(840);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var enabled = {};
|
|||
|
|
var transform = function (transformer, content) {
|
|||
|
|
var result = transformer.transform(content);
|
|||
|
|
var keys = Object.keys(result.features).filter(function (key) { return !enabled[key]; });
|
|||
|
|
keys.forEach(function (key) {
|
|||
|
|
enabled[key] = true;
|
|||
|
|
});
|
|||
|
|
var _a = transformer.getAssets(keys), styles = _a.styles, scripts = _a.scripts;
|
|||
|
|
var markmap = window.markmap;
|
|||
|
|
if (styles)
|
|||
|
|
markmap.loadCSS(styles);
|
|||
|
|
if (scripts)
|
|||
|
|
markmap.loadJS(scripts);
|
|||
|
|
return result;
|
|||
|
|
};
|
|||
|
|
var init = function (el, code) {
|
|||
|
|
var _a = window.markmap, Transformer = _a.Transformer, Markmap = _a.Markmap, deriveOptions = _a.deriveOptions, globalCSS = _a.globalCSS;
|
|||
|
|
var transformer = new Transformer();
|
|||
|
|
el.innerHTML = '<svg style="width:100%"></svg>';
|
|||
|
|
var svg = el.firstChild;
|
|||
|
|
var mm = Markmap.create(svg, null);
|
|||
|
|
var _b = transform(transformer, code), root = _b.root, frontmatter = _b.frontmatter;
|
|||
|
|
var markmapOptions = frontmatter === null || frontmatter === void 0 ? void 0 : frontmatter.markmap;
|
|||
|
|
var frontmatterOptions = deriveOptions(markmapOptions);
|
|||
|
|
mm.setData(root, frontmatterOptions);
|
|||
|
|
mm.fit();
|
|||
|
|
};
|
|||
|
|
var markmapRender = function (element, cdn) {
|
|||
|
|
if (element === void 0) { element = document; }
|
|||
|
|
if (cdn === void 0) { cdn = _constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.CDN */ .g.CDN; }
|
|||
|
|
var markmapElements = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.markmapRenderAdapter.getElements(element);
|
|||
|
|
if (markmapElements.length === 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
(0,_util_addScript__WEBPACK_IMPORTED_MODULE_2__/* .addScript */ .G)("".concat(cdn, "/dist/js/markmap/markmap.min.js"), "vditorMarkerScript").then(function () {
|
|||
|
|
markmapElements.forEach(function (item) {
|
|||
|
|
var code = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.markmapRenderAdapter.getCode(item);
|
|||
|
|
if (item.getAttribute("data-processed") === "true" || code.trim() === "") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var render = document.createElement("div");
|
|||
|
|
render.className = "language-markmap";
|
|||
|
|
item.parentNode.appendChild(render);
|
|||
|
|
init(render, code);
|
|||
|
|
if (item.parentNode.childNodes[0].nodeName == "CODE") {
|
|||
|
|
item.parentNode.removeChild(item.parentNode.childNodes[0]);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 472:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "H": () => (/* binding */ mathRender)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145);
|
|||
|
|
/* harmony import */ var _util_addScript__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(413);
|
|||
|
|
/* harmony import */ var _util_addStyle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(290);
|
|||
|
|
/* harmony import */ var _util_code160to32__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(105);
|
|||
|
|
/* harmony import */ var _adapterRender__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(840);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var mathRender = function (element, options) {
|
|||
|
|
if (element === void 0) { element = document; }
|
|||
|
|
var mathElements = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.mathRenderAdapter.getElements(element);
|
|||
|
|
if (mathElements.length === 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var defaultOptions = {
|
|||
|
|
cdn: _constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.CDN */ .g.CDN,
|
|||
|
|
math: {
|
|||
|
|
engine: "KaTeX",
|
|||
|
|
inlineDigit: false,
|
|||
|
|
macros: {},
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
if (options && options.math) {
|
|||
|
|
options.math =
|
|||
|
|
Object.assign({}, defaultOptions.math, options.math);
|
|||
|
|
}
|
|||
|
|
options = Object.assign({}, defaultOptions, options);
|
|||
|
|
if (options.math.engine === "KaTeX") {
|
|||
|
|
(0,_util_addStyle__WEBPACK_IMPORTED_MODULE_2__/* .addStyle */ .c)("".concat(options.cdn, "/dist/js/katex/katex.min.css?v=0.16.9"), "vditorKatexStyle");
|
|||
|
|
(0,_util_addScript__WEBPACK_IMPORTED_MODULE_3__/* .addScript */ .G)("".concat(options.cdn, "/dist/js/katex/katex.min.js?v=0.16.9"), "vditorKatexScript").then(function () {
|
|||
|
|
(0,_util_addScript__WEBPACK_IMPORTED_MODULE_3__/* .addScript */ .G)("".concat(options.cdn, "/dist/js/katex/mhchem.min.js?v=0.16.9"), "vditorKatexChemScript").then(function () {
|
|||
|
|
mathElements.forEach(function (mathElement) {
|
|||
|
|
if (mathElement.parentElement.classList.contains("vditor-wysiwyg__pre") ||
|
|||
|
|
mathElement.parentElement.classList.contains("vditor-ir__marker--pre")) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (mathElement.getAttribute("data-math")) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var math = (0,_util_code160to32__WEBPACK_IMPORTED_MODULE_4__/* .code160to32 */ .X)(_adapterRender__WEBPACK_IMPORTED_MODULE_1__.mathRenderAdapter.getCode(mathElement));
|
|||
|
|
mathElement.setAttribute("data-math", math);
|
|||
|
|
try {
|
|||
|
|
mathElement.innerHTML = katex.renderToString(math, {
|
|||
|
|
displayMode: mathElement.tagName === "DIV",
|
|||
|
|
output: "html",
|
|||
|
|
macros: options.math.macros,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
catch (e) {
|
|||
|
|
mathElement.innerHTML = e.message;
|
|||
|
|
mathElement.className = "language-math vditor-reset--error";
|
|||
|
|
}
|
|||
|
|
mathElement.addEventListener("copy", function (event) {
|
|||
|
|
event.stopPropagation();
|
|||
|
|
event.preventDefault();
|
|||
|
|
var vditorMathElement = event.currentTarget.closest(".language-math");
|
|||
|
|
event.clipboardData.setData("text/html", vditorMathElement.innerHTML);
|
|||
|
|
event.clipboardData.setData("text/plain", vditorMathElement.getAttribute("data-math"));
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
else if (options.math.engine === "MathJax") {
|
|||
|
|
var chainAsync_1 = function (fns) {
|
|||
|
|
if (fns.length === 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var curr = 0;
|
|||
|
|
var last = fns[fns.length - 1];
|
|||
|
|
var next = function () {
|
|||
|
|
var fn = fns[curr++];
|
|||
|
|
fn === last ? fn() : fn(next);
|
|||
|
|
};
|
|||
|
|
next();
|
|||
|
|
};
|
|||
|
|
if (!window.MathJax) {
|
|||
|
|
window.MathJax = {
|
|||
|
|
loader: {
|
|||
|
|
paths: { mathjax: "".concat(options.cdn, "/dist/js/mathjax") },
|
|||
|
|
},
|
|||
|
|
startup: {
|
|||
|
|
typeset: false,
|
|||
|
|
},
|
|||
|
|
tex: {
|
|||
|
|
macros: options.math.macros,
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/1453
|
|||
|
|
Object.assign(window.MathJax, options.math.mathJaxOptions);
|
|||
|
|
}
|
|||
|
|
// 循环加载会抛异常
|
|||
|
|
(0,_util_addScript__WEBPACK_IMPORTED_MODULE_3__/* .addScriptSync */ .J)("".concat(options.cdn, "/dist/js/mathjax/tex-svg-full.js"), "protyleMathJaxScript");
|
|||
|
|
var renderMath_1 = function (mathElement, next) {
|
|||
|
|
var math = (0,_util_code160to32__WEBPACK_IMPORTED_MODULE_4__/* .code160to32 */ .X)(mathElement.textContent).trim();
|
|||
|
|
var mathOptions = window.MathJax.getMetricsFor(mathElement);
|
|||
|
|
mathOptions.display = mathElement.tagName === "DIV";
|
|||
|
|
window.MathJax.tex2svgPromise(math, mathOptions).then(function (node) {
|
|||
|
|
mathElement.innerHTML = "";
|
|||
|
|
mathElement.setAttribute("data-math", math);
|
|||
|
|
mathElement.append(node);
|
|||
|
|
window.MathJax.startup.document.clear();
|
|||
|
|
window.MathJax.startup.document.updateDocument();
|
|||
|
|
var errorTextElement = node.querySelector('[data-mml-node="merror"]');
|
|||
|
|
if (errorTextElement && errorTextElement.textContent.trim() !== "") {
|
|||
|
|
mathElement.innerHTML = errorTextElement.textContent.trim();
|
|||
|
|
mathElement.className = "vditor-reset--error";
|
|||
|
|
}
|
|||
|
|
if (next) {
|
|||
|
|
next();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
window.MathJax.startup.promise.then(function () {
|
|||
|
|
var chains = [];
|
|||
|
|
var _loop_1 = function (i) {
|
|||
|
|
var mathElement = mathElements[i];
|
|||
|
|
if (!mathElement.parentElement.classList.contains("vditor-wysiwyg__pre") &&
|
|||
|
|
!mathElement.parentElement.classList.contains("vditor-ir__marker--pre") &&
|
|||
|
|
!mathElement.getAttribute("data-math") && (0,_util_code160to32__WEBPACK_IMPORTED_MODULE_4__/* .code160to32 */ .X)(mathElement.textContent).trim()) {
|
|||
|
|
chains.push(function (next) {
|
|||
|
|
if (i === mathElements.length - 1) {
|
|||
|
|
renderMath_1(mathElement);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
renderMath_1(mathElement, next);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
for (var i = 0; i < mathElements.length; i++) {
|
|||
|
|
_loop_1(i);
|
|||
|
|
}
|
|||
|
|
chainAsync_1(chains);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 280:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "Y": () => (/* binding */ mediaRender)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _util_function__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(494);
|
|||
|
|
|
|||
|
|
var videoRender = function (element, url) {
|
|||
|
|
element.insertAdjacentHTML("afterend", "<video controls=\"controls\" src=\"".concat(url, "\"></video>"));
|
|||
|
|
element.remove();
|
|||
|
|
};
|
|||
|
|
var audioRender = function (element, url) {
|
|||
|
|
element.insertAdjacentHTML("afterend", "<audio controls=\"controls\" src=\"".concat(url, "\"></audio>"));
|
|||
|
|
element.remove();
|
|||
|
|
};
|
|||
|
|
var iframeRender = function (element, url) {
|
|||
|
|
var youtubeMatch = url.match(/\/\/(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))([\w|-]{11})(?:(?:[\?&]t=)(\S+))?/);
|
|||
|
|
var youkuMatch = url.match(/\/\/v\.youku\.com\/v_show\/id_(\w+)=*\.html/);
|
|||
|
|
var qqMatch = url.match(/\/\/v\.qq\.com\/x\/cover\/.*\/([^\/]+)\.html\??.*/);
|
|||
|
|
var coubMatch = url.match(/(?:www\.|\/\/)coub\.com\/view\/(\w+)/);
|
|||
|
|
var facebookMatch = url.match(/(?:www\.|\/\/)facebook\.com\/([^\/]+)\/videos\/([0-9]+)/);
|
|||
|
|
var dailymotionMatch = url.match(/.+dailymotion.com\/(video|hub)\/(\w+)\?/);
|
|||
|
|
var bilibiliMatch = url.match(/(?:www\.|\/\/)bilibili\.com\/video\/(\w+)/);
|
|||
|
|
var tedMatch = url.match(/(?:www\.|\/\/)ted\.com\/talks\/(\w+)/);
|
|||
|
|
if (youtubeMatch && youtubeMatch[1].length === 11) {
|
|||
|
|
element.insertAdjacentHTML("afterend", "<iframe class=\"iframe__video\" src=\"//www.youtube.com/embed/".concat(youtubeMatch[1] +
|
|||
|
|
(youtubeMatch[2] ? "?start=" + youtubeMatch[2] : ""), "\"></iframe>"));
|
|||
|
|
element.remove();
|
|||
|
|
}
|
|||
|
|
else if (youkuMatch && youkuMatch[1]) {
|
|||
|
|
element.insertAdjacentHTML("afterend", "<iframe class=\"iframe__video\" src=\"//player.youku.com/embed/".concat(youkuMatch[1], "\"></iframe>"));
|
|||
|
|
element.remove();
|
|||
|
|
}
|
|||
|
|
else if (qqMatch && qqMatch[1]) {
|
|||
|
|
element.insertAdjacentHTML("afterend", "<iframe class=\"iframe__video\" src=\"https://v.qq.com/txp/iframe/player.html?vid=".concat(qqMatch[1], "\"></iframe>"));
|
|||
|
|
element.remove();
|
|||
|
|
}
|
|||
|
|
else if (coubMatch && coubMatch[1]) {
|
|||
|
|
element.insertAdjacentHTML("afterend", "<iframe class=\"iframe__video\"\n src=\"//coub.com/embed/".concat(coubMatch[1], "?muted=false&autostart=false&originalSize=true&startWithHD=true\"></iframe>"));
|
|||
|
|
element.remove();
|
|||
|
|
}
|
|||
|
|
else if (facebookMatch && facebookMatch[0]) {
|
|||
|
|
element.insertAdjacentHTML("afterend", "<iframe class=\"iframe__video\"\n src=\"https://www.facebook.com/plugins/video.php?href=".concat(encodeURIComponent(facebookMatch[0]), "\"></iframe>"));
|
|||
|
|
element.remove();
|
|||
|
|
}
|
|||
|
|
else if (dailymotionMatch && dailymotionMatch[2]) {
|
|||
|
|
element.insertAdjacentHTML("afterend", "<iframe class=\"iframe__video\"\n src=\"https://www.dailymotion.com/embed/video/".concat(dailymotionMatch[2], "\"></iframe>"));
|
|||
|
|
element.remove();
|
|||
|
|
}
|
|||
|
|
else if (url.indexOf("bilibili.com") > -1 && (url.indexOf("bvid=") > -1 || (bilibiliMatch && bilibiliMatch[1]))) {
|
|||
|
|
var params_1 = {
|
|||
|
|
bvid: (0,_util_function__WEBPACK_IMPORTED_MODULE_0__/* .getSearch */ .on)("bvid", url) || (bilibiliMatch && bilibiliMatch[1]),
|
|||
|
|
page: "1",
|
|||
|
|
high_quality: "1",
|
|||
|
|
as_wide: "1",
|
|||
|
|
allowfullscreen: "true",
|
|||
|
|
autoplay: "0"
|
|||
|
|
};
|
|||
|
|
new URL(url.startsWith("http") ? url : "https:" + url).search.split("&").forEach(function (item, index) {
|
|||
|
|
if (!item) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (index === 0) {
|
|||
|
|
item = item.substr(1);
|
|||
|
|
}
|
|||
|
|
var keyValue = item.split("=");
|
|||
|
|
params_1[keyValue[0]] = keyValue[1];
|
|||
|
|
});
|
|||
|
|
var src_1 = "https://player.bilibili.com/player.html?";
|
|||
|
|
var keys_1 = Object.keys(params_1);
|
|||
|
|
keys_1.forEach(function (key, index) {
|
|||
|
|
src_1 += "".concat(key, "=").concat(params_1[key]);
|
|||
|
|
if (index < keys_1.length - 1) {
|
|||
|
|
src_1 += "&";
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
element.insertAdjacentHTML("afterend", "<iframe class=\"iframe__video\" src=\"".concat(src_1, "\"></iframe>"));
|
|||
|
|
element.remove();
|
|||
|
|
}
|
|||
|
|
else if (tedMatch && tedMatch[1]) {
|
|||
|
|
element.insertAdjacentHTML("afterend", "<iframe class=\"iframe__video\" src=\"//embed.ted.com/talks/".concat(tedMatch[1], "\"></iframe>"));
|
|||
|
|
element.remove();
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var mediaRender = function (element) {
|
|||
|
|
if (!element) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
element.querySelectorAll("a").forEach(function (aElement) {
|
|||
|
|
var url = aElement.getAttribute("href");
|
|||
|
|
if (!url) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (url.match(/^.+.(mp4|m4v|ogg|ogv|webm)$/)) {
|
|||
|
|
videoRender(aElement, url);
|
|||
|
|
}
|
|||
|
|
else if (url.match(/^.+.(mp3|wav|flac)$/)) {
|
|||
|
|
audioRender(aElement, url);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
iframeRender(aElement, url);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 637:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "i": () => (/* binding */ mermaidRender)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145);
|
|||
|
|
/* harmony import */ var _util_addScript__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(413);
|
|||
|
|
/* harmony import */ var _adapterRender__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(840);
|
|||
|
|
/* harmony import */ var _util_function__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(494);
|
|||
|
|
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|||
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|||
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|||
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|||
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|||
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|||
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var __generator = (undefined && undefined.__generator) || function (thisArg, body) {
|
|||
|
|
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|||
|
|
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|||
|
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|||
|
|
function step(op) {
|
|||
|
|
if (f) throw new TypeError("Generator is already executing.");
|
|||
|
|
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|||
|
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|||
|
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|||
|
|
switch (op[0]) {
|
|||
|
|
case 0: case 1: t = op; break;
|
|||
|
|
case 4: _.label++; return { value: op[1], done: false };
|
|||
|
|
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|||
|
|
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|||
|
|
default:
|
|||
|
|
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|||
|
|
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|||
|
|
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|||
|
|
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|||
|
|
if (t[2]) _.ops.pop();
|
|||
|
|
_.trys.pop(); continue;
|
|||
|
|
}
|
|||
|
|
op = body.call(thisArg, _);
|
|||
|
|
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|||
|
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var mermaidRender = function (element, cdn, theme) {
|
|||
|
|
if (element === void 0) { element = document; }
|
|||
|
|
if (cdn === void 0) { cdn = _constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.CDN */ .g.CDN; }
|
|||
|
|
var mermaidElements = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.mermaidRenderAdapter.getElements(element);
|
|||
|
|
if (mermaidElements.length === 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
(0,_util_addScript__WEBPACK_IMPORTED_MODULE_2__/* .addScript */ .G)("".concat(cdn, "/dist/js/mermaid/mermaid.min.js?v=11.6.0"), "vditorMermaidScript").then(function () {
|
|||
|
|
var config = {
|
|||
|
|
securityLevel: "loose",
|
|||
|
|
altFontFamily: "sans-serif",
|
|||
|
|
fontFamily: "sans-serif",
|
|||
|
|
startOnLoad: false,
|
|||
|
|
flowchart: {
|
|||
|
|
htmlLabels: true,
|
|||
|
|
useMaxWidth: !0
|
|||
|
|
},
|
|||
|
|
sequence: {
|
|||
|
|
useMaxWidth: true,
|
|||
|
|
diagramMarginX: 8,
|
|||
|
|
diagramMarginY: 8,
|
|||
|
|
boxMargin: 8,
|
|||
|
|
showSequenceNumbers: true // Mermaid 时序图增加序号 https://github.com/siyuan-note/siyuan/pull/6992 https://mermaid.js.org/syntax/sequenceDiagram.html#sequencenumbers
|
|||
|
|
},
|
|||
|
|
gantt: {
|
|||
|
|
leftPadding: 75,
|
|||
|
|
rightPadding: 20
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
if (theme === "dark") {
|
|||
|
|
config.theme = "dark";
|
|||
|
|
}
|
|||
|
|
mermaid.initialize(config);
|
|||
|
|
mermaidElements.forEach(function (item) { return __awaiter(void 0, void 0, void 0, function () {
|
|||
|
|
var code, id, mermaidData, e_1, errorElement;
|
|||
|
|
return __generator(this, function (_a) {
|
|||
|
|
switch (_a.label) {
|
|||
|
|
case 0:
|
|||
|
|
code = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.mermaidRenderAdapter.getCode(item);
|
|||
|
|
if (item.getAttribute("data-processed") === "true" || code.trim() === "") {
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
id = "mermaid" + (0,_util_function__WEBPACK_IMPORTED_MODULE_3__/* .genUUID */ .Wb)();
|
|||
|
|
_a.label = 1;
|
|||
|
|
case 1:
|
|||
|
|
_a.trys.push([1, 3, , 4]);
|
|||
|
|
return [4 /*yield*/, mermaid.render(id, item.textContent)];
|
|||
|
|
case 2:
|
|||
|
|
mermaidData = _a.sent();
|
|||
|
|
item.innerHTML = mermaidData.svg;
|
|||
|
|
return [3 /*break*/, 4];
|
|||
|
|
case 3:
|
|||
|
|
e_1 = _a.sent();
|
|||
|
|
errorElement = document.querySelector("#" + id);
|
|||
|
|
item.innerHTML = "".concat(errorElement.outerHTML, "<br>\n<div style=\"text-align: left\"><small>").concat(e_1.message.replace(/\n/, "<br>"), "</small></div>");
|
|||
|
|
errorElement.parentElement.remove();
|
|||
|
|
return [3 /*break*/, 4];
|
|||
|
|
case 4:
|
|||
|
|
item.setAttribute("data-processed", "true");
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}); });
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 194:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "P": () => (/* binding */ mindmapRender)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145);
|
|||
|
|
/* harmony import */ var _util_addScript__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(413);
|
|||
|
|
/* harmony import */ var _adapterRender__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(840);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var mindmapRender = function (element, cdn, theme) {
|
|||
|
|
if (element === void 0) { element = document; }
|
|||
|
|
if (cdn === void 0) { cdn = _constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.CDN */ .g.CDN; }
|
|||
|
|
var mindmapElements = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.mindmapRenderAdapter.getElements(element);
|
|||
|
|
if (mindmapElements.length > 0) {
|
|||
|
|
(0,_util_addScript__WEBPACK_IMPORTED_MODULE_2__/* .addScript */ .G)("".concat(cdn, "/dist/js/echarts/echarts.min.js?v=5.5.1"), "vditorEchartsScript").then(function () {
|
|||
|
|
mindmapElements.forEach(function (e) {
|
|||
|
|
if (e.parentElement.classList.contains("vditor-wysiwyg__pre") ||
|
|||
|
|
e.parentElement.classList.contains("vditor-ir__marker--pre")) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var text = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.mindmapRenderAdapter.getCode(e);
|
|||
|
|
if (!text) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
if (e.getAttribute("data-processed") === "true") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
echarts.init(e, theme === "dark" ? "dark" : undefined).setOption({
|
|||
|
|
series: [
|
|||
|
|
{
|
|||
|
|
data: [JSON.parse(decodeURIComponent(text))],
|
|||
|
|
initialTreeDepth: -1,
|
|||
|
|
itemStyle: {
|
|||
|
|
borderWidth: 0,
|
|||
|
|
color: "#4285f4",
|
|||
|
|
},
|
|||
|
|
label: {
|
|||
|
|
backgroundColor: "#f6f8fa",
|
|||
|
|
borderColor: "#d1d5da",
|
|||
|
|
borderRadius: 5,
|
|||
|
|
borderWidth: 0.5,
|
|||
|
|
color: "#586069",
|
|||
|
|
lineHeight: 20,
|
|||
|
|
offset: [-5, 0],
|
|||
|
|
padding: [0, 5],
|
|||
|
|
position: "insideRight",
|
|||
|
|
},
|
|||
|
|
lineStyle: {
|
|||
|
|
color: "#d1d5da",
|
|||
|
|
width: 1,
|
|||
|
|
},
|
|||
|
|
roam: true,
|
|||
|
|
symbol: function (value, params) {
|
|||
|
|
var _a;
|
|||
|
|
if ((_a = params === null || params === void 0 ? void 0 : params.data) === null || _a === void 0 ? void 0 : _a.children) {
|
|||
|
|
return "circle";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
return "path://";
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
type: "tree",
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
tooltip: {
|
|||
|
|
trigger: "item",
|
|||
|
|
triggerOn: "mousemove",
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
e.setAttribute("data-processed", "true");
|
|||
|
|
}
|
|||
|
|
catch (error) {
|
|||
|
|
e.className = "vditor-reset--error";
|
|||
|
|
e.innerHTML = "mindmap render error: <br>".concat(error);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 436:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "k": () => (/* binding */ outlineRender)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _util_hasClosestByHeadings__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(771);
|
|||
|
|
/* harmony import */ var _mathRender__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(472);
|
|||
|
|
|
|||
|
|
|
|||
|
|
var outlineRender = function (contentElement, targetElement, vditor) {
|
|||
|
|
var tocHTML = "";
|
|||
|
|
var ids = [];
|
|||
|
|
Array.from(contentElement.children).forEach(function (item, index) {
|
|||
|
|
if ((0,_util_hasClosestByHeadings__WEBPACK_IMPORTED_MODULE_1__/* .hasClosestByHeadings */ .W)(item)) {
|
|||
|
|
if (vditor) {
|
|||
|
|
var lastIndex = item.id.lastIndexOf("_");
|
|||
|
|
item.id = item.id.substring(0, lastIndex === -1 ? undefined : lastIndex) + "_" + index;
|
|||
|
|
}
|
|||
|
|
ids.push(item.id);
|
|||
|
|
tocHTML += item.outerHTML.replace("<wbr>", "");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (tocHTML === "") {
|
|||
|
|
targetElement.innerHTML = "";
|
|||
|
|
return "";
|
|||
|
|
}
|
|||
|
|
var tempElement = document.createElement("div");
|
|||
|
|
if (vditor) {
|
|||
|
|
vditor.lute.SetToC(true);
|
|||
|
|
if (vditor.currentMode === "wysiwyg" && !vditor.preview.element.contains(contentElement)) {
|
|||
|
|
tempElement.innerHTML = vditor.lute.SpinVditorDOM("<p>[ToC]</p>" + tocHTML);
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "ir" && !vditor.preview.element.contains(contentElement)) {
|
|||
|
|
tempElement.innerHTML = vditor.lute.SpinVditorIRDOM("<p>[ToC]</p>" + tocHTML);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
tempElement.innerHTML = vditor.lute.HTML2VditorDOM("<p>[ToC]</p>" + tocHTML);
|
|||
|
|
}
|
|||
|
|
vditor.lute.SetToC(vditor.options.preview.markdown.toc);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
targetElement.classList.add("vditor-outline");
|
|||
|
|
var lute = Lute.New();
|
|||
|
|
lute.SetToC(true);
|
|||
|
|
tempElement.innerHTML = lute.HTML2VditorDOM("<p>[ToC]</p>" + tocHTML);
|
|||
|
|
}
|
|||
|
|
var headingsElement = tempElement.firstElementChild.querySelectorAll("li > span[data-target-id]");
|
|||
|
|
headingsElement.forEach(function (item, index) {
|
|||
|
|
if (item.nextElementSibling && item.nextElementSibling.tagName === "UL") {
|
|||
|
|
var iconHTML = "<svg class='vditor-outline__action'><use xlink:href='#vditor-icon-down'></use></svg>";
|
|||
|
|
if (!document.getElementById("vditorIconScript")) {
|
|||
|
|
iconHTML = '<svg class="vditor-outline__action" viewBox="0 0 32 32"><path d="M3.76 6.12l12.24 12.213 12.24-12.213 3.76 3.76-16 16-16-16 3.76-3.76z"></path></svg>';
|
|||
|
|
}
|
|||
|
|
item.innerHTML = "".concat(iconHTML, "<span>").concat(item.innerHTML, "</span>");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
item.innerHTML = "<svg></svg><span>".concat(item.innerHTML, "</span>");
|
|||
|
|
}
|
|||
|
|
item.setAttribute("data-target-id", ids[index]);
|
|||
|
|
});
|
|||
|
|
tocHTML = tempElement.firstElementChild.innerHTML;
|
|||
|
|
if (headingsElement.length === 0) {
|
|||
|
|
targetElement.innerHTML = "";
|
|||
|
|
return tocHTML;
|
|||
|
|
}
|
|||
|
|
targetElement.innerHTML = tocHTML;
|
|||
|
|
if (vditor) {
|
|||
|
|
(0,_mathRender__WEBPACK_IMPORTED_MODULE_0__/* .mathRender */ .H)(targetElement, {
|
|||
|
|
cdn: vditor.options.cdn,
|
|||
|
|
math: vditor.options.preview.math,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
targetElement.firstElementChild.addEventListener("click", function (event) {
|
|||
|
|
var target = event.target;
|
|||
|
|
while (target && !target.isEqualNode(targetElement)) {
|
|||
|
|
if (target.classList.contains("vditor-outline__action")) {
|
|||
|
|
if (target.classList.contains("vditor-outline__action--close")) {
|
|||
|
|
target.classList.remove("vditor-outline__action--close");
|
|||
|
|
target.parentElement.nextElementSibling.setAttribute("style", "display:block");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
target.classList.add("vditor-outline__action--close");
|
|||
|
|
target.parentElement.nextElementSibling.setAttribute("style", "display:none");
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
event.stopPropagation();
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else if (target.getAttribute("data-target-id")) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
event.stopPropagation();
|
|||
|
|
var idElement = document.getElementById(target.getAttribute("data-target-id"));
|
|||
|
|
if (!idElement) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (vditor) {
|
|||
|
|
if (vditor.options.height === "auto") {
|
|||
|
|
var windowScrollY = idElement.offsetTop + vditor.element.offsetTop;
|
|||
|
|
if (!vditor.options.toolbarConfig.pin) {
|
|||
|
|
windowScrollY += vditor.toolbar.element.offsetHeight;
|
|||
|
|
}
|
|||
|
|
window.scrollTo(window.scrollX, windowScrollY);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (vditor.element.offsetTop < window.scrollY) {
|
|||
|
|
window.scrollTo(window.scrollX, vditor.element.offsetTop);
|
|||
|
|
}
|
|||
|
|
if (vditor.preview.element.contains(contentElement)) {
|
|||
|
|
contentElement.parentElement.scrollTop = idElement.offsetTop;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
contentElement.scrollTop = idElement.offsetTop;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
window.scrollTo(window.scrollX, idElement.offsetTop);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
target = target.parentElement;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
return tocHTML;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 229:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "B": () => (/* binding */ plantumlRender)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145);
|
|||
|
|
/* harmony import */ var _util_addScript__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(413);
|
|||
|
|
/* harmony import */ var _adapterRender__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(840);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var plantumlRender = function (element, cdn) {
|
|||
|
|
if (element === void 0) { element = document; }
|
|||
|
|
if (cdn === void 0) { cdn = _constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.CDN */ .g.CDN; }
|
|||
|
|
var plantumlElements = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.plantumlRenderAdapter.getElements(element);
|
|||
|
|
if (plantumlElements.length === 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
(0,_util_addScript__WEBPACK_IMPORTED_MODULE_2__/* .addScript */ .G)("".concat(cdn, "/dist/js/plantuml/plantuml-encoder.min.js"), "vditorPlantumlScript").then(function () {
|
|||
|
|
plantumlElements.forEach(function (e) {
|
|||
|
|
if (e.parentElement.classList.contains("vditor-wysiwyg__pre") ||
|
|||
|
|
e.parentElement.classList.contains("vditor-ir__marker--pre")) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var text = _adapterRender__WEBPACK_IMPORTED_MODULE_1__.plantumlRenderAdapter.getCode(e).trim();
|
|||
|
|
if (!text) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
e.innerHTML = "<object type=\"image/svg+xml\" data=\"https://www.plantuml.com/plantuml/svg/~1".concat(plantumlEncoder.encode(text), "\"/>");
|
|||
|
|
}
|
|||
|
|
catch (error) {
|
|||
|
|
e.className = "vditor-reset--error";
|
|||
|
|
e.innerHTML = "plantuml render error: <br>".concat(error);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 214:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "X": () => (/* binding */ setLute)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
var setLute = function (options) {
|
|||
|
|
var lute = Lute.New();
|
|||
|
|
lute.PutEmojis(options.emojis);
|
|||
|
|
lute.SetEmojiSite(options.emojiSite);
|
|||
|
|
lute.SetHeadingAnchor(options.headingAnchor);
|
|||
|
|
lute.SetInlineMathAllowDigitAfterOpenMarker(options.inlineMathDigit);
|
|||
|
|
lute.SetAutoSpace(options.autoSpace);
|
|||
|
|
lute.SetToC(options.toc);
|
|||
|
|
lute.SetFootnotes(options.footnotes);
|
|||
|
|
lute.SetFixTermTypo(options.fixTermTypo);
|
|||
|
|
lute.SetVditorCodeBlockPreview(options.codeBlockPreview);
|
|||
|
|
lute.SetVditorMathBlockPreview(options.mathBlockPreview);
|
|||
|
|
lute.SetSanitize(options.sanitize);
|
|||
|
|
lute.SetChineseParagraphBeginningSpace(options.paragraphBeginningSpace);
|
|||
|
|
lute.SetRenderListStyle(options.listStyle);
|
|||
|
|
lute.SetLinkBase(options.linkBase);
|
|||
|
|
lute.SetLinkPrefix(options.linkPrefix);
|
|||
|
|
lute.SetMark(options.mark);
|
|||
|
|
lute.SetGFMAutoLink(options.gfmAutoLink);
|
|||
|
|
if (options.lazyLoadImage) {
|
|||
|
|
lute.SetImageLazyLoading(options.lazyLoadImage);
|
|||
|
|
}
|
|||
|
|
return lute;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 190:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "E": () => (/* binding */ previewImage)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
var previewImage = function (oldImgElement, lang, theme) {
|
|||
|
|
if (lang === void 0) { lang = "zh_CN"; }
|
|||
|
|
if (theme === void 0) { theme = "classic"; }
|
|||
|
|
var oldImgRect = oldImgElement.getBoundingClientRect();
|
|||
|
|
var height = 36;
|
|||
|
|
document.body.insertAdjacentHTML("beforeend", "<div class=\"vditor vditor-img".concat(theme === "dark" ? " vditor--dark" : "", "\">\n <div class=\"vditor-img__bar\">\n <span class=\"vditor-img__btn\" data-deg=\"0\">\n <svg><use xlink:href=\"#vditor-icon-redo\"></use></svg>\n ").concat(window.VditorI18n.spin, "\n </span>\n <span class=\"vditor-img__btn\" onclick=\"this.parentElement.parentElement.outerHTML = '';document.body.style.overflow = ''\">\n X ").concat(window.VditorI18n.close, "\n </span>\n </div>\n <div class=\"vditor-img__img\" onclick=\"this.parentElement.outerHTML = '';document.body.style.overflow = ''\">\n <img style=\"width: ").concat(oldImgElement.width, "px;height:").concat(oldImgElement.height, "px;transform: translate3d(").concat(oldImgRect.left, "px, ").concat(oldImgRect.top - height, "px, 0)\" src=\"").concat(oldImgElement.getAttribute("src"), "\">\n </div>\n</div>"));
|
|||
|
|
document.body.style.overflow = "hidden";
|
|||
|
|
// 图片从原始位置移动到预览正中间的动画效果
|
|||
|
|
var imgElement = document.querySelector(".vditor-img img");
|
|||
|
|
var translate3d = "translate3d(".concat(Math.max(0, window.innerWidth - oldImgElement.naturalWidth) / 2, "px, ").concat(Math.max(0, window.innerHeight - height - oldImgElement.naturalHeight) / 2, "px, 0)");
|
|||
|
|
setTimeout(function () {
|
|||
|
|
imgElement.setAttribute("style", "transition: transform .3s ease-in-out;transform: ".concat(translate3d));
|
|||
|
|
setTimeout(function () {
|
|||
|
|
imgElement.parentElement.scrollTo((imgElement.parentElement.scrollWidth - imgElement.parentElement.clientWidth) / 2, (imgElement.parentElement.scrollHeight - imgElement.parentElement.clientHeight) / 2);
|
|||
|
|
}, 400);
|
|||
|
|
});
|
|||
|
|
// 旋转
|
|||
|
|
var btnElement = document.querySelector(".vditor-img__btn");
|
|||
|
|
btnElement.addEventListener("click", function () {
|
|||
|
|
var deg = parseInt(btnElement.getAttribute("data-deg"), 10) + 90;
|
|||
|
|
if ((deg / 90) % 2 === 1 && oldImgElement.naturalWidth > imgElement.parentElement.clientHeight) {
|
|||
|
|
imgElement.style.transform = "translate3d(".concat(Math.max(0, window.innerWidth - oldImgElement.naturalWidth) / 2, "px, ").concat(oldImgElement.naturalWidth / 2 - oldImgElement.naturalHeight / 2, "px, 0) rotateZ(").concat(deg, "deg)");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
imgElement.style.transform = "".concat(translate3d, " rotateZ(").concat(deg, "deg)");
|
|||
|
|
}
|
|||
|
|
btnElement.setAttribute("data-deg", deg.toString());
|
|||
|
|
setTimeout(function () {
|
|||
|
|
imgElement.parentElement.scrollTo((imgElement.parentElement.scrollWidth - imgElement.parentElement.clientWidth) / 2, (imgElement.parentElement.scrollHeight - imgElement.parentElement.clientHeight) / 2);
|
|||
|
|
}, 400);
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 580:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "Y": () => (/* binding */ setCodeTheme)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145);
|
|||
|
|
/* harmony import */ var _util_addStyle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(290);
|
|||
|
|
|
|||
|
|
|
|||
|
|
var setCodeTheme = function (codeTheme, cdn) {
|
|||
|
|
if (cdn === void 0) { cdn = _constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.CDN */ .g.CDN; }
|
|||
|
|
if (!_constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.CODE_THEME.includes */ .g.CODE_THEME.includes(codeTheme)) {
|
|||
|
|
codeTheme = "github";
|
|||
|
|
}
|
|||
|
|
var vditorHljsStyle = document.getElementById("vditorHljsStyle");
|
|||
|
|
var href = "".concat(cdn, "/dist/js/highlight.js/styles/").concat(codeTheme, ".min.css");
|
|||
|
|
if (!vditorHljsStyle) {
|
|||
|
|
(0,_util_addStyle__WEBPACK_IMPORTED_MODULE_1__/* .addStyle */ .c)(href, "vditorHljsStyle");
|
|||
|
|
}
|
|||
|
|
else if (vditorHljsStyle.getAttribute('href') !== href) {
|
|||
|
|
vditorHljsStyle.remove();
|
|||
|
|
(0,_util_addStyle__WEBPACK_IMPORTED_MODULE_1__/* .addStyle */ .c)(href, "vditorHljsStyle");
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 538:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "Z": () => (/* binding */ setContentTheme)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _util_addStyle__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(290);
|
|||
|
|
|
|||
|
|
var setContentTheme = function (contentTheme, path) {
|
|||
|
|
if (!contentTheme || !path) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var vditorContentTheme = document.getElementById("vditorContentTheme");
|
|||
|
|
var cssPath = "".concat(path, "/").concat(contentTheme, ".css");
|
|||
|
|
if (!vditorContentTheme) {
|
|||
|
|
(0,_util_addStyle__WEBPACK_IMPORTED_MODULE_0__/* .addStyle */ .c)(cssPath, "vditorContentTheme");
|
|||
|
|
}
|
|||
|
|
else if (vditorContentTheme.getAttribute("href") !== cssPath) {
|
|||
|
|
vditorContentTheme.remove();
|
|||
|
|
(0,_util_addStyle__WEBPACK_IMPORTED_MODULE_0__/* .addStyle */ .c)(cssPath, "vditorContentTheme");
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 413:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "J": () => (/* binding */ addScriptSync),
|
|||
|
|
/* harmony export */ "G": () => (/* binding */ addScript)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
var addScriptSync = function (path, id) {
|
|||
|
|
if (document.getElementById(id)) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
var xhrObj = new XMLHttpRequest();
|
|||
|
|
xhrObj.open("GET", path, false);
|
|||
|
|
xhrObj.setRequestHeader("Accept", "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01");
|
|||
|
|
xhrObj.send("");
|
|||
|
|
var scriptElement = document.createElement("script");
|
|||
|
|
scriptElement.type = "text/javascript";
|
|||
|
|
scriptElement.text = xhrObj.responseText;
|
|||
|
|
scriptElement.id = id;
|
|||
|
|
document.head.appendChild(scriptElement);
|
|||
|
|
};
|
|||
|
|
var addScript = function (path, id) {
|
|||
|
|
return new Promise(function (resolve, reject) {
|
|||
|
|
if (document.getElementById(id)) {
|
|||
|
|
// 脚本加载后再次调用直接返回
|
|||
|
|
resolve(true);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
var scriptElement = document.createElement("script");
|
|||
|
|
scriptElement.src = path;
|
|||
|
|
scriptElement.async = true;
|
|||
|
|
// 循环调用时 Chrome 不会重复请求 js
|
|||
|
|
document.head.appendChild(scriptElement);
|
|||
|
|
scriptElement.onerror = function (event) {
|
|||
|
|
reject(event);
|
|||
|
|
};
|
|||
|
|
scriptElement.onload = function () {
|
|||
|
|
if (document.getElementById(id)) {
|
|||
|
|
// 循环调用需清除 DOM 中的 script 标签
|
|||
|
|
scriptElement.remove();
|
|||
|
|
resolve(true);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
scriptElement.id = id;
|
|||
|
|
resolve(true);
|
|||
|
|
};
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 290:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "c": () => (/* binding */ addStyle)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
var addStyle = function (url, id) {
|
|||
|
|
if (!document.getElementById(id)) {
|
|||
|
|
var styleElement = document.createElement("link");
|
|||
|
|
styleElement.id = id;
|
|||
|
|
styleElement.rel = "stylesheet";
|
|||
|
|
styleElement.type = "text/css";
|
|||
|
|
styleElement.href = url;
|
|||
|
|
document.getElementsByTagName("head")[0].appendChild(styleElement);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 105:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "X": () => (/* binding */ code160to32)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
var code160to32 = function (text) {
|
|||
|
|
// 非打断空格转换为空格
|
|||
|
|
return text.replace(/\u00a0/g, " ");
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 410:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "G6": () => (/* binding */ isSafari),
|
|||
|
|
/* harmony export */ "vU": () => (/* binding */ isFirefox),
|
|||
|
|
/* harmony export */ "pK": () => (/* binding */ accessLocalStorage),
|
|||
|
|
/* harmony export */ "Le": () => (/* binding */ getEventName),
|
|||
|
|
/* harmony export */ "yl": () => (/* binding */ isCtrl),
|
|||
|
|
/* harmony export */ "ns": () => (/* binding */ updateHotkeyTip),
|
|||
|
|
/* harmony export */ "i7": () => (/* binding */ isChrome)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
var isSafari = function () {
|
|||
|
|
return navigator.userAgent.indexOf("Safari") > -1 && navigator.userAgent.indexOf("Chrome") === -1;
|
|||
|
|
};
|
|||
|
|
var isFirefox = function () {
|
|||
|
|
return navigator.userAgent.toLowerCase().indexOf("firefox") > -1;
|
|||
|
|
};
|
|||
|
|
var accessLocalStorage = function () {
|
|||
|
|
try {
|
|||
|
|
return typeof localStorage !== "undefined";
|
|||
|
|
}
|
|||
|
|
catch (e) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
// 用户 iPhone 点击延迟/需要双击的处理
|
|||
|
|
var getEventName = function () {
|
|||
|
|
if (navigator.userAgent.indexOf("iPhone") > -1) {
|
|||
|
|
return "touchstart";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
return "click";
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
// 区别 mac 上的 ctrl 和 meta
|
|||
|
|
var isCtrl = function (event) {
|
|||
|
|
if (navigator.platform.toUpperCase().indexOf("MAC") >= 0) {
|
|||
|
|
// mac
|
|||
|
|
if (event.metaKey && !event.ctrlKey) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (!event.metaKey && event.ctrlKey) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
// Mac,Windows 快捷键展示
|
|||
|
|
var updateHotkeyTip = function (hotkey) {
|
|||
|
|
if (/Mac/.test(navigator.platform) || navigator.platform === "iPhone") {
|
|||
|
|
if (hotkey.indexOf("⇧") > -1 && isFirefox()) {
|
|||
|
|
// Mac Firefox 按下 shift 后,key 同 windows 系统
|
|||
|
|
hotkey = hotkey.replace(";", ":").replace("=", "+").replace("-", "_");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (hotkey.startsWith("⌘")) {
|
|||
|
|
hotkey = hotkey.replace("⌘", "⌘+");
|
|||
|
|
}
|
|||
|
|
else if (hotkey.startsWith("⌥") && hotkey.substr(1, 1) !== "⌘") {
|
|||
|
|
hotkey = hotkey.replace("⌥", "⌥+");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
hotkey = hotkey.replace("⇧⌘", "⌘+⇧+").replace("⌥⌘", "⌥+⌘+");
|
|||
|
|
}
|
|||
|
|
hotkey = hotkey.replace("⌘", "Ctrl").replace("⇧", "Shift")
|
|||
|
|
.replace("⌥", "Alt");
|
|||
|
|
if (hotkey.indexOf("Shift") > -1) {
|
|||
|
|
hotkey = hotkey.replace(";", ":").replace("=", "+").replace("-", "_");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return hotkey;
|
|||
|
|
};
|
|||
|
|
var isChrome = function () {
|
|||
|
|
return /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 494:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "Wb": () => (/* binding */ genUUID),
|
|||
|
|
/* harmony export */ "on": () => (/* binding */ getSearch),
|
|||
|
|
/* harmony export */ "Qf": () => (/* binding */ looseJsonParse)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
var genUUID = function () { return ([1e7].toString() + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function (c) {
|
|||
|
|
return (parseInt(c, 10) ^ (window.crypto.getRandomValues(new Uint32Array(1))[0] & (15 >> (parseInt(c, 10) / 4)))).toString(16);
|
|||
|
|
}); };
|
|||
|
|
var getSearch = function (key, link) {
|
|||
|
|
if (link === void 0) { link = window.location.search; }
|
|||
|
|
var params = link.substring(link.indexOf("?"));
|
|||
|
|
var hashIndex = params.indexOf("#");
|
|||
|
|
// REF https://developer.mozilla.org/zh-CN/docs/Web/API/URLSearchParams
|
|||
|
|
var urlSearchParams = new URLSearchParams(params.substring(0, hashIndex >= 0 ? hashIndex : undefined));
|
|||
|
|
return urlSearchParams.get(key);
|
|||
|
|
};
|
|||
|
|
var looseJsonParse = function (text) {
|
|||
|
|
return Function("\"use strict\";return (".concat(text, ")"))();
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 106:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "JQ": () => (/* binding */ hasTopClosestByClassName),
|
|||
|
|
/* harmony export */ "E2": () => (/* binding */ hasTopClosestByTag),
|
|||
|
|
/* harmony export */ "O9": () => (/* binding */ getTopList),
|
|||
|
|
/* harmony export */ "a1": () => (/* binding */ hasClosestByAttribute),
|
|||
|
|
/* harmony export */ "F9": () => (/* binding */ hasClosestBlock),
|
|||
|
|
/* harmony export */ "lG": () => (/* binding */ hasClosestByMatchTag),
|
|||
|
|
/* harmony export */ "fb": () => (/* binding */ hasClosestByClassName),
|
|||
|
|
/* harmony export */ "DX": () => (/* binding */ getLastNode)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* unused harmony export hasTopClosestByAttribute */
|
|||
|
|
/* harmony import */ var _hasClosestByHeadings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(771);
|
|||
|
|
|
|||
|
|
var hasTopClosestByClassName = function (element, className) {
|
|||
|
|
var closest = hasClosestByClassName(element, className);
|
|||
|
|
var parentClosest = false;
|
|||
|
|
var findTop = false;
|
|||
|
|
while (closest && !closest.classList.contains("vditor-reset") && !findTop) {
|
|||
|
|
parentClosest = hasClosestByClassName(closest.parentElement, className);
|
|||
|
|
if (parentClosest) {
|
|||
|
|
closest = parentClosest;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
findTop = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return closest || false;
|
|||
|
|
};
|
|||
|
|
var hasTopClosestByAttribute = function (element, attr, value) {
|
|||
|
|
var closest = hasClosestByAttribute(element, attr, value);
|
|||
|
|
var parentClosest = false;
|
|||
|
|
var findTop = false;
|
|||
|
|
while (closest && !closest.classList.contains("vditor-reset") && !findTop) {
|
|||
|
|
parentClosest = hasClosestByAttribute(closest.parentElement, attr, value);
|
|||
|
|
if (parentClosest) {
|
|||
|
|
closest = parentClosest;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
findTop = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return closest || false;
|
|||
|
|
};
|
|||
|
|
var hasTopClosestByTag = function (element, nodeName) {
|
|||
|
|
var closest = (0,_hasClosestByHeadings__WEBPACK_IMPORTED_MODULE_0__/* .hasClosestByTag */ .S)(element, nodeName);
|
|||
|
|
var parentClosest = false;
|
|||
|
|
var findTop = false;
|
|||
|
|
while (closest && !closest.classList.contains("vditor-reset") && !findTop) {
|
|||
|
|
parentClosest = (0,_hasClosestByHeadings__WEBPACK_IMPORTED_MODULE_0__/* .hasClosestByTag */ .S)(closest.parentElement, nodeName);
|
|||
|
|
if (parentClosest) {
|
|||
|
|
closest = parentClosest;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
findTop = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return closest || false;
|
|||
|
|
};
|
|||
|
|
var getTopList = function (element) {
|
|||
|
|
var topUlElement = hasTopClosestByTag(element, "UL");
|
|||
|
|
var topOlElement = hasTopClosestByTag(element, "OL");
|
|||
|
|
var topListElement = topUlElement;
|
|||
|
|
if (topOlElement && (!topUlElement || (topUlElement && topOlElement.contains(topUlElement)))) {
|
|||
|
|
topListElement = topOlElement;
|
|||
|
|
}
|
|||
|
|
return topListElement;
|
|||
|
|
};
|
|||
|
|
var hasClosestByAttribute = function (element, attr, value) {
|
|||
|
|
if (!element) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (element.nodeType === 3) {
|
|||
|
|
element = element.parentElement;
|
|||
|
|
}
|
|||
|
|
var e = element;
|
|||
|
|
var isClosest = false;
|
|||
|
|
while (e && !isClosest && !e.classList.contains("vditor-reset")) {
|
|||
|
|
if (e.getAttribute(attr) === value) {
|
|||
|
|
isClosest = true;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
e = e.parentElement;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return isClosest && e;
|
|||
|
|
};
|
|||
|
|
var hasClosestBlock = function (element) {
|
|||
|
|
if (!element) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (element.nodeType === 3) {
|
|||
|
|
element = element.parentElement;
|
|||
|
|
}
|
|||
|
|
var e = element;
|
|||
|
|
var isClosest = false;
|
|||
|
|
var blockElement = hasClosestByAttribute(element, "data-block", "0");
|
|||
|
|
if (blockElement) {
|
|||
|
|
return blockElement;
|
|||
|
|
}
|
|||
|
|
while (e && !isClosest && !e.classList.contains("vditor-reset")) {
|
|||
|
|
if (e.tagName === "H1" ||
|
|||
|
|
e.tagName === "H2" ||
|
|||
|
|
e.tagName === "H3" ||
|
|||
|
|
e.tagName === "H4" ||
|
|||
|
|
e.tagName === "H5" ||
|
|||
|
|
e.tagName === "H6" ||
|
|||
|
|
e.tagName === "P" ||
|
|||
|
|
e.tagName === "BLOCKQUOTE" ||
|
|||
|
|
e.tagName === "OL" ||
|
|||
|
|
e.tagName === "UL") {
|
|||
|
|
isClosest = true;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
e = e.parentElement;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return isClosest && e;
|
|||
|
|
};
|
|||
|
|
var hasClosestByMatchTag = function (element, nodeName) {
|
|||
|
|
if (!element) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (element.nodeType === 3) {
|
|||
|
|
element = element.parentElement;
|
|||
|
|
}
|
|||
|
|
var e = element;
|
|||
|
|
var isClosest = false;
|
|||
|
|
while (e && !isClosest && !e.classList.contains("vditor-reset")) {
|
|||
|
|
if (e.nodeName === nodeName) {
|
|||
|
|
isClosest = true;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
e = e.parentElement;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return isClosest && e;
|
|||
|
|
};
|
|||
|
|
var hasClosestByClassName = function (element, className) {
|
|||
|
|
if (!element) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (element.nodeType === 3) {
|
|||
|
|
element = element.parentElement;
|
|||
|
|
}
|
|||
|
|
var e = element;
|
|||
|
|
var isClosest = false;
|
|||
|
|
while (e && !isClosest && !e.classList.contains("vditor-reset")) {
|
|||
|
|
if (e.classList.contains(className)) {
|
|||
|
|
isClosest = true;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
e = e.parentElement;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return isClosest && e;
|
|||
|
|
};
|
|||
|
|
var getLastNode = function (node) {
|
|||
|
|
while (node && node.lastChild) {
|
|||
|
|
node = node.lastChild;
|
|||
|
|
}
|
|||
|
|
return node;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 771:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "S": () => (/* binding */ hasClosestByTag),
|
|||
|
|
/* harmony export */ "W": () => (/* binding */ hasClosestByHeadings)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
// NOTE: 减少 method.ts 打包,故从 hasClosest.ts 中拆分
|
|||
|
|
var hasClosestByTag = function (element, nodeName) {
|
|||
|
|
if (!element) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (element.nodeType === 3) {
|
|||
|
|
element = element.parentElement;
|
|||
|
|
}
|
|||
|
|
var e = element;
|
|||
|
|
var isClosest = false;
|
|||
|
|
while (e && !isClosest && !e.classList.contains("vditor-reset")) {
|
|||
|
|
if (e.nodeName.indexOf(nodeName) === 0) {
|
|||
|
|
isClosest = true;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
e = e.parentElement;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return isClosest && e;
|
|||
|
|
};
|
|||
|
|
var hasClosestByHeadings = function (element) {
|
|||
|
|
var headingElement = hasClosestByTag(element, "H");
|
|||
|
|
if (headingElement && headingElement.tagName.length === 2 && headingElement.tagName !== "HR") {
|
|||
|
|
return headingElement;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 673:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "T": () => (/* binding */ merge)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
var merge = function () {
|
|||
|
|
var options = [];
|
|||
|
|
for (var _i = 0; _i < arguments.length; _i++) {
|
|||
|
|
options[_i] = arguments[_i];
|
|||
|
|
}
|
|||
|
|
var target = {};
|
|||
|
|
var merger = function (obj) {
|
|||
|
|
for (var prop in obj) {
|
|||
|
|
if (obj.hasOwnProperty(prop)) {
|
|||
|
|
if (Object.prototype.toString.call(obj[prop]) === "[object Object]") {
|
|||
|
|
target[prop] = merge(target[prop], obj[prop]);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
target[prop] = obj[prop];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
for (var i = 0; i < options.length; i++) {
|
|||
|
|
merger(options[i]);
|
|||
|
|
}
|
|||
|
|
return target;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ }),
|
|||
|
|
|
|||
|
|
/***/ 810:
|
|||
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|||
|
|
/* harmony export */ "zh": () => (/* binding */ getEditorRange),
|
|||
|
|
/* harmony export */ "Ny": () => (/* binding */ getCursorPosition),
|
|||
|
|
/* harmony export */ "Gb": () => (/* binding */ selectIsEditor),
|
|||
|
|
/* harmony export */ "Hc": () => (/* binding */ setSelectionFocus),
|
|||
|
|
/* harmony export */ "im": () => (/* binding */ getSelectPosition),
|
|||
|
|
/* harmony export */ "$j": () => (/* binding */ setSelectionByPosition),
|
|||
|
|
/* harmony export */ "ib": () => (/* binding */ setRangeByWbr),
|
|||
|
|
/* harmony export */ "oC": () => (/* binding */ insertHTML)
|
|||
|
|
/* harmony export */ });
|
|||
|
|
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145);
|
|||
|
|
/* harmony import */ var _compatibility__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(410);
|
|||
|
|
/* harmony import */ var _hasClosest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(106);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var getEditorRange = function (vditor) {
|
|||
|
|
var range;
|
|||
|
|
var element = vditor[vditor.currentMode].element;
|
|||
|
|
if (getSelection().rangeCount > 0) {
|
|||
|
|
range = getSelection().getRangeAt(0);
|
|||
|
|
if (element.isEqualNode(range.startContainer) || element.contains(range.startContainer)) {
|
|||
|
|
return range;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (vditor[vditor.currentMode].range) {
|
|||
|
|
return vditor[vditor.currentMode].range;
|
|||
|
|
}
|
|||
|
|
element.focus();
|
|||
|
|
range = element.ownerDocument.createRange();
|
|||
|
|
range.setStart(element, 0);
|
|||
|
|
range.collapse(true);
|
|||
|
|
return range;
|
|||
|
|
};
|
|||
|
|
var getCursorPosition = function (editor) {
|
|||
|
|
var range = window.getSelection().getRangeAt(0);
|
|||
|
|
if (!editor.contains(range.startContainer) && !(0,_hasClosest__WEBPACK_IMPORTED_MODULE_1__/* .hasClosestByClassName */ .fb)(range.startContainer, "vditor-panel--none")) {
|
|||
|
|
return {
|
|||
|
|
left: 0,
|
|||
|
|
top: 0,
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
var parentRect = editor.parentElement.getBoundingClientRect();
|
|||
|
|
var cursorRect;
|
|||
|
|
if (range.getClientRects().length === 0) {
|
|||
|
|
if (range.startContainer.nodeType === 3) {
|
|||
|
|
// 空行时,会出现没有 br 的情况,需要根据父元素 <p> 获取位置信息
|
|||
|
|
var parent_1 = range.startContainer.parentElement;
|
|||
|
|
if (parent_1 && parent_1.getClientRects().length > 0) {
|
|||
|
|
cursorRect = parent_1.getClientRects()[0];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
return {
|
|||
|
|
left: 0,
|
|||
|
|
top: 0,
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var children = range.startContainer.children;
|
|||
|
|
if (children[range.startOffset] &&
|
|||
|
|
children[range.startOffset].getClientRects().length > 0) {
|
|||
|
|
// markdown 模式回车
|
|||
|
|
cursorRect = children[range.startOffset].getClientRects()[0];
|
|||
|
|
}
|
|||
|
|
else if (range.startContainer.childNodes.length > 0) {
|
|||
|
|
// in table or code block
|
|||
|
|
var cloneRange = range.cloneRange();
|
|||
|
|
range.selectNode(range.startContainer.childNodes[Math.max(0, range.startOffset - 1)]);
|
|||
|
|
cursorRect = range.getClientRects()[0];
|
|||
|
|
range.setEnd(cloneRange.endContainer, cloneRange.endOffset);
|
|||
|
|
range.setStart(cloneRange.startContainer, cloneRange.startOffset);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
cursorRect = range.startContainer.getClientRects()[0];
|
|||
|
|
}
|
|||
|
|
if (!cursorRect) {
|
|||
|
|
var parentElement = range.startContainer.childNodes[range.startOffset];
|
|||
|
|
while (!parentElement.getClientRects ||
|
|||
|
|
(parentElement.getClientRects && parentElement.getClientRects().length === 0)) {
|
|||
|
|
parentElement = parentElement.parentElement;
|
|||
|
|
}
|
|||
|
|
cursorRect = parentElement.getClientRects()[0];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
cursorRect = range.getClientRects()[0];
|
|||
|
|
}
|
|||
|
|
return {
|
|||
|
|
left: cursorRect.left - parentRect.left,
|
|||
|
|
top: cursorRect.top - parentRect.top,
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
var selectIsEditor = function (editor, range) {
|
|||
|
|
if (!range) {
|
|||
|
|
if (getSelection().rangeCount === 0) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range = getSelection().getRangeAt(0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var container = range.commonAncestorContainer;
|
|||
|
|
return editor.isEqualNode(container) || editor.contains(container);
|
|||
|
|
};
|
|||
|
|
var setSelectionFocus = function (range) {
|
|||
|
|
var selection = window.getSelection();
|
|||
|
|
selection.removeAllRanges();
|
|||
|
|
selection.addRange(range);
|
|||
|
|
};
|
|||
|
|
var getSelectPosition = function (selectElement, editorElement, range) {
|
|||
|
|
var position = {
|
|||
|
|
end: 0,
|
|||
|
|
start: 0,
|
|||
|
|
};
|
|||
|
|
if (!range) {
|
|||
|
|
if (getSelection().rangeCount === 0) {
|
|||
|
|
return position;
|
|||
|
|
}
|
|||
|
|
range = window.getSelection().getRangeAt(0);
|
|||
|
|
}
|
|||
|
|
if (selectIsEditor(editorElement, range)) {
|
|||
|
|
var preSelectionRange = range.cloneRange();
|
|||
|
|
if (selectElement.childNodes[0] && selectElement.childNodes[0].childNodes[0]) {
|
|||
|
|
preSelectionRange.setStart(selectElement.childNodes[0].childNodes[0], 0);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
preSelectionRange.selectNodeContents(selectElement);
|
|||
|
|
}
|
|||
|
|
preSelectionRange.setEnd(range.startContainer, range.startOffset);
|
|||
|
|
position.start = preSelectionRange.toString().length;
|
|||
|
|
position.end = position.start + range.toString().length;
|
|||
|
|
}
|
|||
|
|
return position;
|
|||
|
|
};
|
|||
|
|
var setSelectionByPosition = function (start, end, editor) {
|
|||
|
|
var charIndex = 0;
|
|||
|
|
var line = 0;
|
|||
|
|
var pNode = editor.childNodes[line];
|
|||
|
|
var foundStart = false;
|
|||
|
|
var stop = false;
|
|||
|
|
start = Math.max(0, start);
|
|||
|
|
end = Math.max(0, end);
|
|||
|
|
var range = editor.ownerDocument.createRange();
|
|||
|
|
range.setStart(pNode || editor, 0);
|
|||
|
|
range.collapse(true);
|
|||
|
|
while (!stop && pNode) {
|
|||
|
|
var nextCharIndex = charIndex + pNode.textContent.length;
|
|||
|
|
if (!foundStart && start >= charIndex && start <= nextCharIndex) {
|
|||
|
|
if (start === 0) {
|
|||
|
|
range.setStart(pNode, 0);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (pNode.childNodes[0].nodeType === 3) {
|
|||
|
|
range.setStart(pNode.childNodes[0], start - charIndex);
|
|||
|
|
}
|
|||
|
|
else if (pNode.nextSibling) {
|
|||
|
|
range.setStartBefore(pNode.nextSibling);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.setStartAfter(pNode);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
foundStart = true;
|
|||
|
|
if (start === end) {
|
|||
|
|
stop = true;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (foundStart && end >= charIndex && end <= nextCharIndex) {
|
|||
|
|
if (end === 0) {
|
|||
|
|
range.setEnd(pNode, 0);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (pNode.childNodes[0].nodeType === 3) {
|
|||
|
|
range.setEnd(pNode.childNodes[0], end - charIndex);
|
|||
|
|
}
|
|||
|
|
else if (pNode.nextSibling) {
|
|||
|
|
range.setEndBefore(pNode.nextSibling);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.setEndAfter(pNode);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
stop = true;
|
|||
|
|
}
|
|||
|
|
charIndex = nextCharIndex;
|
|||
|
|
pNode = editor.childNodes[++line];
|
|||
|
|
}
|
|||
|
|
if (!stop && editor.childNodes[line - 1]) {
|
|||
|
|
range.setStartBefore(editor.childNodes[line - 1]);
|
|||
|
|
}
|
|||
|
|
setSelectionFocus(range);
|
|||
|
|
return range;
|
|||
|
|
};
|
|||
|
|
var setRangeByWbr = function (element, range) {
|
|||
|
|
var wbrElement = element.querySelector("wbr");
|
|||
|
|
if (!wbrElement) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (!wbrElement.previousElementSibling) {
|
|||
|
|
if (wbrElement.previousSibling) {
|
|||
|
|
// text<wbr>
|
|||
|
|
range.setStart(wbrElement.previousSibling, wbrElement.previousSibling.textContent.length);
|
|||
|
|
}
|
|||
|
|
else if (wbrElement.nextSibling) {
|
|||
|
|
if (wbrElement.nextSibling.nodeType === 3) {
|
|||
|
|
// <wbr>text
|
|||
|
|
range.setStart(wbrElement.nextSibling, 0);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// <wbr><br> https://github.com/Vanessa219/vditor/issues/400
|
|||
|
|
range.setStartBefore(wbrElement.nextSibling);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// 内容为空
|
|||
|
|
range.setStart(wbrElement.parentElement, 0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (wbrElement.previousElementSibling.isSameNode(wbrElement.previousSibling)) {
|
|||
|
|
if (wbrElement.previousElementSibling.lastChild) {
|
|||
|
|
// <em>text</em><wbr>
|
|||
|
|
range.setStartBefore(wbrElement);
|
|||
|
|
range.collapse(true);
|
|||
|
|
setSelectionFocus(range);
|
|||
|
|
// fix Chrome set range bug: **c**
|
|||
|
|
if ((0,_compatibility__WEBPACK_IMPORTED_MODULE_2__/* .isChrome */ .i7)() && (wbrElement.previousElementSibling.tagName === "EM" ||
|
|||
|
|
wbrElement.previousElementSibling.tagName === "STRONG" ||
|
|||
|
|
wbrElement.previousElementSibling.tagName === "S")) {
|
|||
|
|
range.insertNode(document.createTextNode(_constants__WEBPACK_IMPORTED_MODULE_0__/* .Constants.ZWSP */ .g.ZWSP));
|
|||
|
|
range.collapse(false);
|
|||
|
|
}
|
|||
|
|
wbrElement.remove();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// <br><wbr>
|
|||
|
|
range.setStartAfter(wbrElement.previousElementSibling);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// <em>text</em>text<wbr>
|
|||
|
|
range.setStart(wbrElement.previousSibling, wbrElement.previousSibling.textContent.length);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
range.collapse(true);
|
|||
|
|
wbrElement.remove();
|
|||
|
|
setSelectionFocus(range);
|
|||
|
|
};
|
|||
|
|
var insertHTML = function (html, vditor) {
|
|||
|
|
// 使用 lute 方法会添加 p 元素,只有一个 p 元素的时候进行删除
|
|||
|
|
var tempElement = document.createElement("div");
|
|||
|
|
tempElement.innerHTML = html;
|
|||
|
|
var tempBlockElement = tempElement.querySelectorAll("p");
|
|||
|
|
if (tempBlockElement.length === 1 && !tempBlockElement[0].previousSibling && !tempBlockElement[0].nextSibling &&
|
|||
|
|
vditor[vditor.currentMode].element.children.length > 0 && tempElement.firstElementChild.tagName === "P") {
|
|||
|
|
html = tempBlockElement[0].innerHTML.trim();
|
|||
|
|
}
|
|||
|
|
var pasteElement = document.createElement("div");
|
|||
|
|
pasteElement.innerHTML = html;
|
|||
|
|
var range = getEditorRange(vditor);
|
|||
|
|
if (range.toString() !== "") {
|
|||
|
|
vditor[vditor.currentMode].preventInput = true;
|
|||
|
|
document.execCommand("delete", false, "");
|
|||
|
|
}
|
|||
|
|
if (pasteElement.firstElementChild &&
|
|||
|
|
pasteElement.firstElementChild.getAttribute("data-block") === "0") {
|
|||
|
|
// 粘贴内容为块元素时,应在下一段落中插入
|
|||
|
|
pasteElement.lastElementChild.insertAdjacentHTML("beforeend", "<wbr>");
|
|||
|
|
var blockElement = (0,_hasClosest__WEBPACK_IMPORTED_MODULE_1__/* .hasClosestBlock */ .F9)(range.startContainer);
|
|||
|
|
if (!blockElement) {
|
|||
|
|
vditor[vditor.currentMode].element.insertAdjacentHTML("beforeend", pasteElement.innerHTML);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var liElement = (0,_hasClosest__WEBPACK_IMPORTED_MODULE_1__/* .hasClosestByMatchTag */ .lG)(range.startContainer, "LI");
|
|||
|
|
if (liElement && pasteElement.firstElementChild.tagName === "UL") {
|
|||
|
|
liElement.insertAdjacentHTML("afterend", pasteElement.firstElementChild.innerHTML);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
blockElement.insertAdjacentHTML("afterend", pasteElement.innerHTML);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
setRangeByWbr(vditor[vditor.currentMode].element, range);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var pasteTemplate = document.createElement("template");
|
|||
|
|
pasteTemplate.innerHTML = html;
|
|||
|
|
range.insertNode(pasteTemplate.content.cloneNode(true));
|
|||
|
|
range.collapse(false);
|
|||
|
|
setSelectionFocus(range);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/***/ })
|
|||
|
|
|
|||
|
|
/******/ });
|
|||
|
|
/************************************************************************/
|
|||
|
|
/******/ // The module cache
|
|||
|
|
/******/ var __webpack_module_cache__ = {};
|
|||
|
|
/******/
|
|||
|
|
/******/ // The require function
|
|||
|
|
/******/ function __webpack_require__(moduleId) {
|
|||
|
|
/******/ // Check if module is in cache
|
|||
|
|
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
|||
|
|
/******/ if (cachedModule !== undefined) {
|
|||
|
|
/******/ return cachedModule.exports;
|
|||
|
|
/******/ }
|
|||
|
|
/******/ // Create a new module (and put it into the cache)
|
|||
|
|
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|||
|
|
/******/ // no module.id needed
|
|||
|
|
/******/ // no module.loaded needed
|
|||
|
|
/******/ exports: {}
|
|||
|
|
/******/ };
|
|||
|
|
/******/
|
|||
|
|
/******/ // Execute the module function
|
|||
|
|
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|||
|
|
/******/
|
|||
|
|
/******/ // Return the exports of the module
|
|||
|
|
/******/ return module.exports;
|
|||
|
|
/******/ }
|
|||
|
|
/******/
|
|||
|
|
/************************************************************************/
|
|||
|
|
/******/ /* webpack/runtime/define property getters */
|
|||
|
|
/******/ (() => {
|
|||
|
|
/******/ // define getter functions for harmony exports
|
|||
|
|
/******/ __webpack_require__.d = (exports, definition) => {
|
|||
|
|
/******/ for(var key in definition) {
|
|||
|
|
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|||
|
|
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|||
|
|
/******/ }
|
|||
|
|
/******/ }
|
|||
|
|
/******/ };
|
|||
|
|
/******/ })();
|
|||
|
|
/******/
|
|||
|
|
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|||
|
|
/******/ (() => {
|
|||
|
|
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
|||
|
|
/******/ })();
|
|||
|
|
/******/
|
|||
|
|
/******/ /* webpack/runtime/make namespace object */
|
|||
|
|
/******/ (() => {
|
|||
|
|
/******/ // define __esModule on exports
|
|||
|
|
/******/ __webpack_require__.r = (exports) => {
|
|||
|
|
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|||
|
|
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|||
|
|
/******/ }
|
|||
|
|
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|||
|
|
/******/ };
|
|||
|
|
/******/ })();
|
|||
|
|
/******/
|
|||
|
|
/************************************************************************/
|
|||
|
|
var __webpack_exports__ = {};
|
|||
|
|
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
|
|||
|
|
(() => {
|
|||
|
|
"use strict";
|
|||
|
|
|
|||
|
|
// EXPORTS
|
|||
|
|
__webpack_require__.d(__webpack_exports__, {
|
|||
|
|
"default": () => (/* binding */ src)
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/method.ts + 4 modules
|
|||
|
|
var method = __webpack_require__(408);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/constants.ts
|
|||
|
|
var constants = __webpack_require__(145);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/util/code160to32.ts
|
|||
|
|
var code160to32 = __webpack_require__(105);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/markdown/getMarkdown.ts
|
|||
|
|
|
|||
|
|
var getMarkdown = function (vditor) {
|
|||
|
|
if (vditor.currentMode === "sv") {
|
|||
|
|
return (0,code160to32/* code160to32 */.X)("".concat(vditor.sv.element.textContent, "\n").replace(/\n\n$/, "\n"));
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
return vditor.lute.VditorDOM2Md(vditor.wysiwyg.element.innerHTML);
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "ir") {
|
|||
|
|
return vditor.lute.VditorIRDOM2Md(vditor.ir.element.innerHTML);
|
|||
|
|
}
|
|||
|
|
return "";
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/util/addScript.ts
|
|||
|
|
var addScript = __webpack_require__(413);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/devtools/index.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
var DevTools = /** @class */ (function () {
|
|||
|
|
function DevTools() {
|
|||
|
|
this.element = document.createElement("div");
|
|||
|
|
this.element.className = "vditor-devtools";
|
|||
|
|
this.element.innerHTML = '<div class="vditor-reset--error"></div><div style="height: 100%;"></div>';
|
|||
|
|
}
|
|||
|
|
DevTools.prototype.renderEchart = function (vditor) {
|
|||
|
|
var _this = this;
|
|||
|
|
if (vditor.devtools.element.style.display !== "block") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
(0,addScript/* addScript */.G)("".concat(vditor.options.cdn, "/dist/js/echarts/echarts.min.js?v=5.5.1"), "vditorEchartsScript").then(function () {
|
|||
|
|
if (!_this.ASTChart) {
|
|||
|
|
_this.ASTChart = echarts.init(vditor.devtools.element.lastElementChild);
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
_this.element.lastElementChild.style.display = "block";
|
|||
|
|
_this.element.firstElementChild.innerHTML = "";
|
|||
|
|
_this.ASTChart.setOption({
|
|||
|
|
series: [
|
|||
|
|
{
|
|||
|
|
data: JSON.parse(vditor.lute.RenderEChartsJSON(getMarkdown(vditor))),
|
|||
|
|
initialTreeDepth: -1,
|
|||
|
|
label: {
|
|||
|
|
align: "left",
|
|||
|
|
backgroundColor: "rgba(68, 77, 86, .68)",
|
|||
|
|
borderRadius: 3,
|
|||
|
|
color: "#d1d5da",
|
|||
|
|
fontSize: 12,
|
|||
|
|
lineHeight: 12,
|
|||
|
|
offset: [9, 12],
|
|||
|
|
padding: [2, 4, 2, 4],
|
|||
|
|
position: "top",
|
|||
|
|
verticalAlign: "middle",
|
|||
|
|
},
|
|||
|
|
lineStyle: {
|
|||
|
|
color: "#4285f4",
|
|||
|
|
type: "curve",
|
|||
|
|
width: 1,
|
|||
|
|
},
|
|||
|
|
orient: "vertical",
|
|||
|
|
roam: true,
|
|||
|
|
type: "tree",
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
toolbox: {
|
|||
|
|
bottom: 25,
|
|||
|
|
emphasis: {
|
|||
|
|
iconStyle: {
|
|||
|
|
color: "#4285f4",
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
feature: {
|
|||
|
|
restore: {
|
|||
|
|
show: true,
|
|||
|
|
},
|
|||
|
|
saveAsImage: {
|
|||
|
|
show: true,
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
right: 15,
|
|||
|
|
show: true,
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
_this.ASTChart.resize();
|
|||
|
|
}
|
|||
|
|
catch (e) {
|
|||
|
|
_this.element.lastElementChild.style.display = "none";
|
|||
|
|
_this.element.firstElementChild.innerHTML = e;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
return DevTools;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/util/compatibility.ts
|
|||
|
|
var compatibility = __webpack_require__(410);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/setToolbar.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
var removeCurrentToolbar = function (toolbar, names) {
|
|||
|
|
names.forEach(function (name) {
|
|||
|
|
if (!toolbar[name]) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var itemElement = toolbar[name].children[0];
|
|||
|
|
if (itemElement && itemElement.classList.contains("vditor-menu--current")) {
|
|||
|
|
itemElement.classList.remove("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var setCurrentToolbar = function (toolbar, names) {
|
|||
|
|
names.forEach(function (name) {
|
|||
|
|
if (!toolbar[name]) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var itemElement = toolbar[name].children[0];
|
|||
|
|
if (itemElement && !itemElement.classList.contains("vditor-menu--current")) {
|
|||
|
|
itemElement.classList.add("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var enableToolbar = function (toolbar, names) {
|
|||
|
|
names.forEach(function (name) {
|
|||
|
|
if (!toolbar[name]) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var itemElement = toolbar[name].children[0];
|
|||
|
|
if (itemElement && itemElement.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED)) {
|
|||
|
|
itemElement.classList.remove(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var disableToolbar = function (toolbar, names) {
|
|||
|
|
names.forEach(function (name) {
|
|||
|
|
if (!toolbar[name]) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var itemElement = toolbar[name].children[0];
|
|||
|
|
if (itemElement && !itemElement.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED)) {
|
|||
|
|
itemElement.classList.add(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var hideToolbar = function (toolbar, names) {
|
|||
|
|
names.forEach(function (name) {
|
|||
|
|
if (!toolbar[name]) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (toolbar[name]) {
|
|||
|
|
toolbar[name].style.display = "none";
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var showToolbar = function (toolbar, names) {
|
|||
|
|
names.forEach(function (name) {
|
|||
|
|
if (!toolbar[name]) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (toolbar[name]) {
|
|||
|
|
toolbar[name].style.display = "block";
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
// "subToolbar", "hint", "popover"
|
|||
|
|
var hidePanel = function (vditor, panels, exceptElement) {
|
|||
|
|
if (panels.includes("subToolbar")) {
|
|||
|
|
vditor.toolbar.element.querySelectorAll(".vditor-hint").forEach(function (item) {
|
|||
|
|
if (exceptElement && item.isEqualNode(exceptElement)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
item.style.display = "none";
|
|||
|
|
});
|
|||
|
|
if (vditor.toolbar.elements.emoji) {
|
|||
|
|
vditor.toolbar.elements.emoji.lastElementChild.style.display = "none";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (panels.includes("hint")) {
|
|||
|
|
vditor.hint.element.style.display = "none";
|
|||
|
|
}
|
|||
|
|
if (vditor.wysiwyg.popover && panels.includes("popover")) {
|
|||
|
|
vditor.wysiwyg.popover.style.display = "none";
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var toggleSubMenu = function (vditor, panelElement, actionBtn, level) {
|
|||
|
|
actionBtn.addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
event.stopPropagation();
|
|||
|
|
if (actionBtn.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
vditor.toolbar.element.querySelectorAll(".vditor-hint--current").forEach(function (item) {
|
|||
|
|
item.classList.remove("vditor-hint--current");
|
|||
|
|
});
|
|||
|
|
if (panelElement.style.display === "block") {
|
|||
|
|
panelElement.style.display = "none";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
hidePanel(vditor, ["subToolbar", "hint", "popover"], actionBtn.parentElement.parentElement);
|
|||
|
|
if (!actionBtn.classList.contains("vditor-tooltipped")) {
|
|||
|
|
actionBtn.classList.add("vditor-hint--current");
|
|||
|
|
}
|
|||
|
|
panelElement.style.display = "block";
|
|||
|
|
if (vditor.toolbar.element.getBoundingClientRect().right - actionBtn.getBoundingClientRect().right < 250) {
|
|||
|
|
panelElement.classList.add("vditor-panel--left");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
panelElement.classList.remove("vditor-panel--left");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/util/hasClosest.ts
|
|||
|
|
var hasClosest = __webpack_require__(106);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/util/hasClosestByHeadings.ts
|
|||
|
|
var hasClosestByHeadings = __webpack_require__(771);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/util/log.ts
|
|||
|
|
var log = function (method, content, type, print) {
|
|||
|
|
if (print) {
|
|||
|
|
// @ts-ignore
|
|||
|
|
console.log("".concat(method, " - ").concat(type, ": ").concat(content));
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/abcRender.ts
|
|||
|
|
var abcRender = __webpack_require__(135);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/chartRender.ts
|
|||
|
|
var chartRender = __webpack_require__(775);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/codeRender.ts
|
|||
|
|
var codeRender = __webpack_require__(428);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/flowchartRender.ts
|
|||
|
|
var flowchartRender = __webpack_require__(325);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/graphvizRender.ts
|
|||
|
|
var graphvizRender = __webpack_require__(483);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/highlightRender.ts
|
|||
|
|
var highlightRender = __webpack_require__(999);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/mathRender.ts
|
|||
|
|
var mathRender = __webpack_require__(472);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/mermaidRender.ts
|
|||
|
|
var mermaidRender = __webpack_require__(637);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/markmapRender.ts
|
|||
|
|
var markmapRender = __webpack_require__(11);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/mindmapRender.ts
|
|||
|
|
var mindmapRender = __webpack_require__(194);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/plantumlRender.ts
|
|||
|
|
var plantumlRender = __webpack_require__(229);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/SMILESRender.ts
|
|||
|
|
var SMILESRender = __webpack_require__(825);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/util/processCode.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var processPasteCode = function (html, text, type) {
|
|||
|
|
if (type === void 0) { type = "sv"; }
|
|||
|
|
var tempElement = document.createElement("div");
|
|||
|
|
tempElement.innerHTML = html;
|
|||
|
|
var isCode = false;
|
|||
|
|
if (tempElement.childElementCount === 1 &&
|
|||
|
|
tempElement.lastElementChild.style.fontFamily.indexOf("monospace") > -1) {
|
|||
|
|
// VS Code
|
|||
|
|
isCode = true;
|
|||
|
|
}
|
|||
|
|
var pres = tempElement.querySelectorAll("pre");
|
|||
|
|
if (tempElement.childElementCount === 1 && pres.length === 1
|
|||
|
|
&& pres[0].className !== "vditor-wysiwyg"
|
|||
|
|
&& pres[0].className !== "vditor-sv") {
|
|||
|
|
// IDE
|
|||
|
|
isCode = true;
|
|||
|
|
}
|
|||
|
|
if (html.indexOf('\n<p class="p1">') === 0) {
|
|||
|
|
// Xcode
|
|||
|
|
isCode = true;
|
|||
|
|
}
|
|||
|
|
if (tempElement.childElementCount === 1 && tempElement.firstElementChild.tagName === "TABLE" &&
|
|||
|
|
tempElement.querySelector(".line-number") && tempElement.querySelector(".line-content")) {
|
|||
|
|
// 网页源码
|
|||
|
|
isCode = true;
|
|||
|
|
}
|
|||
|
|
if (isCode) {
|
|||
|
|
var code = text || html;
|
|||
|
|
if (/\n/.test(code) || pres.length === 1) {
|
|||
|
|
if (type === "wysiwyg") {
|
|||
|
|
return "<div class=\"vditor-wysiwyg__block\" data-block=\"0\" data-type=\"code-block\"><pre><code>".concat(code.replace(/&/g, "&").replace(/</g, "<"), "<wbr></code></pre></div>");
|
|||
|
|
}
|
|||
|
|
return "\n```\n" + code.replace(/&/g, "&").replace(/</g, "<") + "\n```";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (type === "wysiwyg") {
|
|||
|
|
return "<code>".concat(code.replace(/&/g, "&").replace(/</g, "<"), "</code><wbr>");
|
|||
|
|
}
|
|||
|
|
return "`".concat(code, "`");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var processCodeRender = function (previewPanel, vditor) {
|
|||
|
|
if (!previewPanel) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (previewPanel.parentElement.getAttribute("data-type") === "html-block") {
|
|||
|
|
previewPanel.setAttribute("data-render", "1");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var language = previewPanel.firstElementChild.className.replace("language-", "");
|
|||
|
|
if (language === "abc") {
|
|||
|
|
(0,abcRender/* abcRender */.Q)(previewPanel, vditor.options.cdn);
|
|||
|
|
}
|
|||
|
|
else if (language === "mermaid") {
|
|||
|
|
(0,mermaidRender/* mermaidRender */.i)(previewPanel, vditor.options.cdn, vditor.options.theme);
|
|||
|
|
}
|
|||
|
|
else if (language === "smiles") {
|
|||
|
|
(0,SMILESRender/* SMILESRender */.J)(previewPanel, vditor.options.cdn, vditor.options.theme);
|
|||
|
|
}
|
|||
|
|
else if (language === "markmap") {
|
|||
|
|
(0,markmapRender/* markmapRender */.K)(previewPanel, vditor.options.cdn);
|
|||
|
|
}
|
|||
|
|
else if (language === "flowchart") {
|
|||
|
|
(0,flowchartRender/* flowchartRender */.P)(previewPanel, vditor.options.cdn);
|
|||
|
|
}
|
|||
|
|
else if (language === "echarts") {
|
|||
|
|
(0,chartRender/* chartRender */.p)(previewPanel, vditor.options.cdn, vditor.options.theme);
|
|||
|
|
}
|
|||
|
|
else if (language === "mindmap") {
|
|||
|
|
(0,mindmapRender/* mindmapRender */.P)(previewPanel, vditor.options.cdn, vditor.options.theme);
|
|||
|
|
}
|
|||
|
|
else if (language === "plantuml") {
|
|||
|
|
(0,plantumlRender/* plantumlRender */.B)(previewPanel, vditor.options.cdn);
|
|||
|
|
}
|
|||
|
|
else if (language === "graphviz") {
|
|||
|
|
(0,graphvizRender/* graphvizRender */.v)(previewPanel, vditor.options.cdn);
|
|||
|
|
}
|
|||
|
|
else if (language === "math") {
|
|||
|
|
(0,mathRender/* mathRender */.H)(previewPanel, { cdn: vditor.options.cdn, math: vditor.options.preview.math });
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var cRender = vditor.options.customRenders.find(function (item) {
|
|||
|
|
if (item.language === language) {
|
|||
|
|
item.render(previewPanel, vditor);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (!cRender) {
|
|||
|
|
(0,highlightRender/* highlightRender */.s)(Object.assign({}, vditor.options.preview.hljs), previewPanel, vditor.options.cdn);
|
|||
|
|
(0,codeRender/* codeRender */.O)(previewPanel, vditor.options.preview.hljs);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
previewPanel.setAttribute("data-render", "1");
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/util/selection.ts
|
|||
|
|
var selection = __webpack_require__(810);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/util/toc.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var renderToc = function (vditor) {
|
|||
|
|
if (vditor.currentMode === "sv") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var editorElement = vditor[vditor.currentMode].element;
|
|||
|
|
var tocHTML = vditor.outline.render(vditor);
|
|||
|
|
if (tocHTML === "") {
|
|||
|
|
tocHTML = "[ToC]";
|
|||
|
|
}
|
|||
|
|
editorElement.querySelectorAll('[data-type="toc-block"]').forEach(function (item) {
|
|||
|
|
item.innerHTML = tocHTML;
|
|||
|
|
(0,mathRender/* mathRender */.H)(item, {
|
|||
|
|
cdn: vditor.options.cdn,
|
|||
|
|
math: vditor.options.preview.math,
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var clickToc = function (event, vditor) {
|
|||
|
|
var spanElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(event.target, "SPAN");
|
|||
|
|
if (spanElement && (0,hasClosest/* hasClosestByClassName */.fb)(spanElement, "vditor-toc")) {
|
|||
|
|
var headingElement = vditor[vditor.currentMode].element.querySelector("#" + spanElement.getAttribute("data-target-id"));
|
|||
|
|
if (headingElement) {
|
|||
|
|
if (vditor.options.height === "auto") {
|
|||
|
|
var windowScrollY = headingElement.offsetTop + vditor.element.offsetTop;
|
|||
|
|
if (!vditor.options.toolbarConfig.pin) {
|
|||
|
|
windowScrollY += vditor.toolbar.element.offsetHeight;
|
|||
|
|
}
|
|||
|
|
window.scrollTo(window.scrollX, windowScrollY);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (vditor.element.offsetTop < window.scrollY) {
|
|||
|
|
window.scrollTo(window.scrollX, vditor.element.offsetTop);
|
|||
|
|
}
|
|||
|
|
vditor[vditor.currentMode].element.scrollTop = headingElement.offsetTop;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var keydownToc = function (blockElement, vditor, event, range) {
|
|||
|
|
// toc 前无元素,插入空块
|
|||
|
|
if (blockElement.previousElementSibling &&
|
|||
|
|
blockElement.previousElementSibling.classList.contains("vditor-toc")) {
|
|||
|
|
if (event.key === "Backspace" &&
|
|||
|
|
(0,selection/* getSelectPosition */.im)(blockElement, vditor[vditor.currentMode].element, range).start === 0) {
|
|||
|
|
blockElement.previousElementSibling.remove();
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (insertBeforeBlock(vditor, event, range, blockElement, blockElement.previousElementSibling)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// toc 后无元素,插入空块
|
|||
|
|
if (blockElement.nextElementSibling &&
|
|||
|
|
blockElement.nextElementSibling.classList.contains("vditor-toc")) {
|
|||
|
|
if (event.key === "Delete" &&
|
|||
|
|
(0,selection/* getSelectPosition */.im)(blockElement, vditor[vditor.currentMode].element, range).start
|
|||
|
|
>= blockElement.textContent.trimRight().length) {
|
|||
|
|
blockElement.nextElementSibling.remove();
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (insertAfterBlock(vditor, event, range, blockElement, blockElement.nextElementSibling)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// toc 删除
|
|||
|
|
if (event.key === "Backspace" || event.key === "Delete") {
|
|||
|
|
var tocElement = (0,hasClosest/* hasClosestByClassName */.fb)(range.startContainer, "vditor-toc");
|
|||
|
|
if (tocElement) {
|
|||
|
|
tocElement.remove();
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/ir/input.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var input = function (vditor, range, ignoreSpace, event) {
|
|||
|
|
if (ignoreSpace === void 0) { ignoreSpace = false; }
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestBlock */.F9)(range.startContainer);
|
|||
|
|
// 前后可以输入空格
|
|||
|
|
if (blockElement && !ignoreSpace && blockElement.getAttribute("data-type") !== "code-block") {
|
|||
|
|
if ((isHrMD(blockElement.innerHTML) && blockElement.previousElementSibling) ||
|
|||
|
|
isHeadingMD(blockElement.innerHTML)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// 前后空格处理
|
|||
|
|
var startOffset = (0,selection/* getSelectPosition */.im)(blockElement, vditor.ir.element, range).start;
|
|||
|
|
// 开始可以输入空格
|
|||
|
|
var startSpace = true;
|
|||
|
|
for (var i = startOffset - 1;
|
|||
|
|
// 软换行后有空格
|
|||
|
|
i > blockElement.textContent.substr(0, startOffset).lastIndexOf("\n"); i--) {
|
|||
|
|
if (blockElement.textContent.charAt(i) !== " " &&
|
|||
|
|
// 多个 tab 前删除不形成代码块 https://github.com/Vanessa219/vditor/issues/162 1
|
|||
|
|
blockElement.textContent.charAt(i) !== "\t") {
|
|||
|
|
startSpace = false;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (startOffset === 0) {
|
|||
|
|
startSpace = false;
|
|||
|
|
}
|
|||
|
|
// 结尾可以输入空格
|
|||
|
|
var endSpace = true;
|
|||
|
|
for (var i = startOffset - 1; i < blockElement.textContent.length; i++) {
|
|||
|
|
if (blockElement.textContent.charAt(i) !== " " && blockElement.textContent.charAt(i) !== "\n") {
|
|||
|
|
endSpace = false;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (startSpace) {
|
|||
|
|
if (typeof vditor.options.input === "function") {
|
|||
|
|
vditor.options.input(getMarkdown(vditor));
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/729
|
|||
|
|
if (endSpace && /^#{1,6} $/.test(blockElement.textContent)) {
|
|||
|
|
endSpace = false;
|
|||
|
|
}
|
|||
|
|
if (endSpace) {
|
|||
|
|
var markerElement = (0,hasClosest/* hasClosestByClassName */.fb)(range.startContainer, "vditor-ir__marker");
|
|||
|
|
if (markerElement) {
|
|||
|
|
// inline marker space https://github.com/Vanessa219/vditor/issues/239
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var previousNode = range.startContainer.previousSibling;
|
|||
|
|
if (previousNode && previousNode.nodeType !== 3 && previousNode.classList.contains("vditor-ir__node--expand")) {
|
|||
|
|
// FireFox https://github.com/Vanessa219/vditor/issues/239
|
|||
|
|
previousNode.classList.remove("vditor-ir__node--expand");
|
|||
|
|
}
|
|||
|
|
if (typeof vditor.options.input === "function") {
|
|||
|
|
vditor.options.input(getMarkdown(vditor));
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
vditor.ir.element.querySelectorAll(".vditor-ir__node--expand").forEach(function (item) {
|
|||
|
|
item.classList.remove("vditor-ir__node--expand");
|
|||
|
|
});
|
|||
|
|
if (!blockElement) {
|
|||
|
|
// 使用顶级块元素,应使用 innerHTML
|
|||
|
|
blockElement = vditor.ir.element;
|
|||
|
|
}
|
|||
|
|
// document.exeComment insertHTML 会插入 wbr
|
|||
|
|
if (!blockElement.querySelector("wbr")) {
|
|||
|
|
var previewRenderElement = (0,hasClosest/* hasClosestByClassName */.fb)(range.startContainer, "vditor-ir__preview");
|
|||
|
|
if (previewRenderElement) {
|
|||
|
|
previewRenderElement.previousElementSibling.insertAdjacentHTML("beforeend", "<wbr>");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 清除浏览器自带的样式
|
|||
|
|
blockElement.querySelectorAll("[style]").forEach(function (item) {
|
|||
|
|
item.removeAttribute("style");
|
|||
|
|
});
|
|||
|
|
if (blockElement.getAttribute("data-type") === "link-ref-defs-block") {
|
|||
|
|
// 修改链接引用
|
|||
|
|
blockElement = vditor.ir.element;
|
|||
|
|
}
|
|||
|
|
var isIRElement = blockElement.isEqualNode(vditor.ir.element);
|
|||
|
|
var footnoteElement = (0,hasClosest/* hasClosestByAttribute */.a1)(blockElement, "data-type", "footnotes-block");
|
|||
|
|
var html = "";
|
|||
|
|
if (!isIRElement) {
|
|||
|
|
var blockquoteElement = (0,hasClosestByHeadings/* hasClosestByTag */.S)(range.startContainer, "BLOCKQUOTE");
|
|||
|
|
// 列表需要到最顶层
|
|||
|
|
var topListElement = (0,hasClosest/* getTopList */.O9)(range.startContainer);
|
|||
|
|
if (topListElement) {
|
|||
|
|
blockElement = topListElement;
|
|||
|
|
}
|
|||
|
|
// 应到引用层,否则 > --- 会解析为 front-matter;列表中有 blockquote 则解析 blockquote;blockquote 中有列表则解析列表
|
|||
|
|
if (blockquoteElement && (!topListElement || (topListElement && !blockquoteElement.contains(topListElement)))) {
|
|||
|
|
blockElement = blockquoteElement;
|
|||
|
|
}
|
|||
|
|
// 修改脚注
|
|||
|
|
if (footnoteElement) {
|
|||
|
|
blockElement = footnoteElement;
|
|||
|
|
}
|
|||
|
|
html = blockElement.outerHTML;
|
|||
|
|
if (blockElement.tagName === "UL" || blockElement.tagName === "OL") {
|
|||
|
|
// 如果为列表的话,需要把上下的列表都重绘
|
|||
|
|
var listPrevElement = blockElement.previousElementSibling;
|
|||
|
|
var listNextElement = blockElement.nextElementSibling;
|
|||
|
|
if (listPrevElement && (listPrevElement.tagName === "UL" || listPrevElement.tagName === "OL")) {
|
|||
|
|
html = listPrevElement.outerHTML + html;
|
|||
|
|
listPrevElement.remove();
|
|||
|
|
}
|
|||
|
|
if (listNextElement && (listNextElement.tagName === "UL" || listNextElement.tagName === "OL")) {
|
|||
|
|
html = html + listNextElement.outerHTML;
|
|||
|
|
listNextElement.remove();
|
|||
|
|
}
|
|||
|
|
// firefox 列表回车不会产生新的 list item https://github.com/Vanessa219/vditor/issues/194
|
|||
|
|
html = html.replace("<div><wbr><br></div>", "<li><p><wbr><br></p></li>");
|
|||
|
|
}
|
|||
|
|
else if (blockElement.previousElementSibling &&
|
|||
|
|
blockElement.previousElementSibling.textContent.replace(constants/* Constants.ZWSP */.g.ZWSP, "") !== "" &&
|
|||
|
|
event && event.inputType === "insertParagraph") {
|
|||
|
|
// 换行时需要处理上一段落
|
|||
|
|
html = blockElement.previousElementSibling.outerHTML + html;
|
|||
|
|
blockElement.previousElementSibling.remove();
|
|||
|
|
}
|
|||
|
|
if (!blockElement.innerText.startsWith("```")) {
|
|||
|
|
// 添加链接引用
|
|||
|
|
vditor.ir.element.querySelectorAll("[data-type='link-ref-defs-block']").forEach(function (item) {
|
|||
|
|
if (item && !blockElement.isEqualNode(item)) {
|
|||
|
|
html += item.outerHTML;
|
|||
|
|
item.remove();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
// 添加脚注
|
|||
|
|
vditor.ir.element.querySelectorAll("[data-type='footnotes-block']").forEach(function (item) {
|
|||
|
|
if (item && !blockElement.isEqualNode(item)) {
|
|||
|
|
html += item.outerHTML;
|
|||
|
|
item.remove();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
html = blockElement.innerHTML;
|
|||
|
|
}
|
|||
|
|
log("SpinVditorIRDOM", html, "argument", vditor.options.debugger);
|
|||
|
|
html = vditor.lute.SpinVditorIRDOM(html);
|
|||
|
|
log("SpinVditorIRDOM", html, "result", vditor.options.debugger);
|
|||
|
|
if (isIRElement) {
|
|||
|
|
blockElement.innerHTML = html;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
blockElement.outerHTML = html;
|
|||
|
|
// 更新正文中的 tip
|
|||
|
|
if (footnoteElement) {
|
|||
|
|
var footnoteItemElement = (0,hasClosest/* hasClosestByAttribute */.a1)(vditor.ir.element.querySelector("wbr"), "data-type", "footnotes-def");
|
|||
|
|
if (footnoteItemElement) {
|
|||
|
|
var footnoteItemText = footnoteItemElement.textContent;
|
|||
|
|
var marker = footnoteItemText.substring(1, footnoteItemText.indexOf("]:"));
|
|||
|
|
var footnoteRefElement = vditor.ir.element.querySelector("sup[data-type=\"footnotes-ref\"][data-footnotes-label=\"".concat(marker, "\"]"));
|
|||
|
|
if (footnoteRefElement) {
|
|||
|
|
footnoteRefElement.setAttribute("aria-label", footnoteItemText.substr(marker.length + 3).trim().substr(0, 24));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// linkref 合并及添加
|
|||
|
|
var firstLinkRefDefElement;
|
|||
|
|
var allLinkRefDefsElement = vditor.ir.element.querySelectorAll("[data-type='link-ref-defs-block']");
|
|||
|
|
allLinkRefDefsElement.forEach(function (item, index) {
|
|||
|
|
if (index === 0) {
|
|||
|
|
firstLinkRefDefElement = item;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
firstLinkRefDefElement.insertAdjacentHTML("beforeend", item.innerHTML);
|
|||
|
|
item.remove();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (allLinkRefDefsElement.length > 0) {
|
|||
|
|
vditor.ir.element.insertAdjacentElement("beforeend", allLinkRefDefsElement[0]);
|
|||
|
|
}
|
|||
|
|
// 脚注合并后添加的末尾
|
|||
|
|
var firstFootnoteElement;
|
|||
|
|
var allFootnoteElement = vditor.ir.element.querySelectorAll("[data-type='footnotes-block']");
|
|||
|
|
allFootnoteElement.forEach(function (item, index) {
|
|||
|
|
if (index === 0) {
|
|||
|
|
firstFootnoteElement = item;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
firstFootnoteElement.insertAdjacentHTML("beforeend", item.innerHTML);
|
|||
|
|
item.remove();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (allFootnoteElement.length > 0) {
|
|||
|
|
vditor.ir.element.insertAdjacentElement("beforeend", allFootnoteElement[0]);
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.ir.element, range);
|
|||
|
|
vditor.ir.element.querySelectorAll(".vditor-ir__preview[data-render='2']").forEach(function (item) {
|
|||
|
|
processCodeRender(item, vditor);
|
|||
|
|
});
|
|||
|
|
renderToc(vditor);
|
|||
|
|
process_processAfterRender(vditor, {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: true,
|
|||
|
|
enableInput: true,
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/util/hotKey.ts
|
|||
|
|
|
|||
|
|
// 是否匹配 ⇧⌘[] / ⌘[] / ⌥[] / ⌥⌘[] / ⇧Tab / []
|
|||
|
|
var matchHotKey = function (hotKey, event) {
|
|||
|
|
if (hotKey === "") {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
// []
|
|||
|
|
if (hotKey.indexOf("⇧") === -1 && hotKey.indexOf("⌘") === -1 && hotKey.indexOf("⌥") === -1) {
|
|||
|
|
if (!(0,compatibility/* isCtrl */.yl)(event) && !event.altKey && !event.shiftKey && event.code === hotKey) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
// 是否匹配 ⇧Tab
|
|||
|
|
if (hotKey === "⇧Tab") {
|
|||
|
|
if (!(0,compatibility/* isCtrl */.yl)(event) && !event.altKey && event.shiftKey && event.code === "Tab") {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
var hotKeys = hotKey.split("");
|
|||
|
|
if (hotKey.startsWith("⌥")) {
|
|||
|
|
// 是否匹配 ⌥[] / ⌥⌘[]
|
|||
|
|
var keyCode = hotKeys.length === 3 ? hotKeys[2] : hotKeys[1];
|
|||
|
|
if ((hotKeys.length === 3 ? (0,compatibility/* isCtrl */.yl)(event) : !(0,compatibility/* isCtrl */.yl)(event)) && event.altKey && !event.shiftKey &&
|
|||
|
|
event.code === (/^[0-9]$/.test(keyCode) ? "Digit" : "Key") + keyCode) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
// 是否匹配 ⇧⌘[] / ⌘[]
|
|||
|
|
if (hotKey === "⌘Enter") {
|
|||
|
|
hotKeys = ["⌘", "Enter"];
|
|||
|
|
}
|
|||
|
|
var hasShift = hotKeys.length > 2 && (hotKeys[0] === "⇧");
|
|||
|
|
var key = (hasShift ? hotKeys[2] : hotKeys[1]);
|
|||
|
|
if (hasShift && ((0,compatibility/* isFirefox */.vU)() || !/Mac/.test(navigator.platform))) {
|
|||
|
|
if (key === "-") {
|
|||
|
|
key = "_";
|
|||
|
|
}
|
|||
|
|
else if (key === "=") {
|
|||
|
|
key = "+";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if ((0,compatibility/* isCtrl */.yl)(event) && event.key.toLowerCase() === key.toLowerCase() && !event.altKey
|
|||
|
|
&& ((!hasShift && !event.shiftKey) || (hasShift && event.shiftKey))) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/ir/expandMarker.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
var nextIsNode = function (range) {
|
|||
|
|
var startContainer = range.startContainer;
|
|||
|
|
if (startContainer.nodeType === 3 && startContainer.nodeValue.length !== range.startOffset) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
var nextNode = startContainer.nextSibling;
|
|||
|
|
while (nextNode && nextNode.textContent === "") {
|
|||
|
|
nextNode = nextNode.nextSibling;
|
|||
|
|
}
|
|||
|
|
if (!nextNode) {
|
|||
|
|
// *em*|**string**
|
|||
|
|
var markerElement = (0,hasClosest/* hasClosestByClassName */.fb)(startContainer, "vditor-ir__marker");
|
|||
|
|
if (markerElement && !markerElement.nextSibling) {
|
|||
|
|
var parentNextNode = startContainer.parentElement.parentElement.nextSibling;
|
|||
|
|
if (parentNextNode && parentNextNode.nodeType !== 3 &&
|
|||
|
|
parentNextNode.classList.contains("vditor-ir__node")) {
|
|||
|
|
return parentNextNode;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
else if (nextNode && nextNode.nodeType !== 3 && nextNode.classList.contains("vditor-ir__node") &&
|
|||
|
|
!nextNode.getAttribute("data-block")) {
|
|||
|
|
// test|*em*
|
|||
|
|
return nextNode;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var previousIsNode = function (range) {
|
|||
|
|
var startContainer = range.startContainer;
|
|||
|
|
var previousNode = startContainer.previousSibling;
|
|||
|
|
if (startContainer.nodeType === 3 && range.startOffset === 0 && previousNode && previousNode.nodeType !== 3 &&
|
|||
|
|
// *em*|text
|
|||
|
|
previousNode.classList.contains("vditor-ir__node") && !previousNode.getAttribute("data-block")) {
|
|||
|
|
return previousNode;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var expandMarker = function (range, vditor) {
|
|||
|
|
vditor.ir.element.querySelectorAll(".vditor-ir__node--expand").forEach(function (item) {
|
|||
|
|
item.classList.remove("vditor-ir__node--expand");
|
|||
|
|
});
|
|||
|
|
var nodeElement = (0,hasClosest/* hasTopClosestByClassName */.JQ)(range.startContainer, "vditor-ir__node");
|
|||
|
|
var nodeElementEnd = !range.collapsed && (0,hasClosest/* hasTopClosestByClassName */.JQ)(range.endContainer, "vditor-ir__node");
|
|||
|
|
// 选中文本为同一个 nodeElement 内时,需要展开
|
|||
|
|
if (!range.collapsed && (!nodeElement || nodeElement !== nodeElementEnd)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (nodeElement) {
|
|||
|
|
nodeElement.classList.add("vditor-ir__node--expand");
|
|||
|
|
nodeElement.classList.remove("vditor-ir__node--hidden");
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/615 safari中光标位置跳动
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
var nextNode = nextIsNode(range);
|
|||
|
|
if (nextNode) {
|
|||
|
|
nextNode.classList.add("vditor-ir__node--expand");
|
|||
|
|
nextNode.classList.remove("vditor-ir__node--hidden");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var previousNode = previousIsNode(range);
|
|||
|
|
if (previousNode) {
|
|||
|
|
previousNode.classList.add("vditor-ir__node--expand");
|
|||
|
|
previousNode.classList.remove("vditor-ir__node--hidden");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/ir/processKeydown.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var processKeydown = function (vditor, event) {
|
|||
|
|
vditor.ir.composingLock = event.isComposing;
|
|||
|
|
if (event.isComposing) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
// 添加第一次记录 undo 的光标
|
|||
|
|
if (event.key.indexOf("Arrow") === -1 && event.key !== "Meta" && event.key !== "Control" && event.key !== "Alt" &&
|
|||
|
|
event.key !== "Shift" && event.key !== "CapsLock" && event.key !== "Escape" && !/^F\d{1,2}$/.test(event.key)) {
|
|||
|
|
vditor.undo.recordFirstPosition(vditor, event);
|
|||
|
|
}
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
var startContainer = range.startContainer;
|
|||
|
|
if (!fixGSKeyBackspace(event, vditor, startContainer)) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
fixCJKPosition(range, vditor, event);
|
|||
|
|
fixHR(range);
|
|||
|
|
// 仅处理以下快捷键操作
|
|||
|
|
if (event.key !== "Enter" && event.key !== "Tab" && event.key !== "Backspace" && event.key.indexOf("Arrow") === -1
|
|||
|
|
&& !(0,compatibility/* isCtrl */.yl)(event) && event.key !== "Escape" && event.key !== "Delete") {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
// 斜体、粗体、内联代码块中换行
|
|||
|
|
var newlineElement = (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-newline", "1");
|
|||
|
|
if (!(0,compatibility/* isCtrl */.yl)(event) && !event.altKey && !event.shiftKey && event.key === "Enter" && newlineElement
|
|||
|
|
&& range.startOffset < newlineElement.textContent.length) {
|
|||
|
|
var beforeMarkerElement = newlineElement.previousElementSibling;
|
|||
|
|
if (beforeMarkerElement) {
|
|||
|
|
range.insertNode(document.createTextNode(beforeMarkerElement.textContent));
|
|||
|
|
range.collapse(false);
|
|||
|
|
}
|
|||
|
|
var afterMarkerElement = newlineElement.nextSibling;
|
|||
|
|
if (afterMarkerElement) {
|
|||
|
|
range.insertNode(document.createTextNode(afterMarkerElement.textContent));
|
|||
|
|
range.collapse(true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var pElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "P");
|
|||
|
|
// md 处理
|
|||
|
|
if (fixMarkdown(event, vditor, pElement, range)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// li
|
|||
|
|
if (fixList(range, vditor, pElement, event)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// blockquote
|
|||
|
|
if (fixBlockquote(vditor, range, event, pElement)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 代码块
|
|||
|
|
var preRenderElement = (0,hasClosest/* hasClosestByClassName */.fb)(startContainer, "vditor-ir__marker--pre");
|
|||
|
|
if (preRenderElement && preRenderElement.tagName === "PRE") {
|
|||
|
|
var codeRenderElement = preRenderElement.firstChild;
|
|||
|
|
if (fixCodeBlock(vditor, event, preRenderElement, range)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 数学公式上无元素,按上或左将添加新块
|
|||
|
|
if ((codeRenderElement.getAttribute("data-type") === "math-block"
|
|||
|
|
|| codeRenderElement.getAttribute("data-type") === "html-block") &&
|
|||
|
|
insertBeforeBlock(vditor, event, range, codeRenderElement, preRenderElement.parentElement)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 代码块下无元素或者为代码块/table 元素,添加空块
|
|||
|
|
if (insertAfterBlock(vditor, event, range, codeRenderElement, preRenderElement.parentElement)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 代码块语言
|
|||
|
|
var preBeforeElement = (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "code-block-info");
|
|||
|
|
if (preBeforeElement) {
|
|||
|
|
if (event.key === "Enter" || event.key === "Tab") {
|
|||
|
|
range.selectNodeContents(preBeforeElement.nextElementSibling.firstChild);
|
|||
|
|
range.collapse(true);
|
|||
|
|
event.preventDefault();
|
|||
|
|
hidePanel(vditor, ["hint"]);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (event.key === "Backspace") {
|
|||
|
|
var start = (0,selection/* getSelectPosition */.im)(preBeforeElement, vditor.ir.element).start;
|
|||
|
|
if (start === 1) { // 删除零宽空格
|
|||
|
|
range.setStart(startContainer, 0);
|
|||
|
|
}
|
|||
|
|
if (start === 2) { // 删除时清空自动补全语言
|
|||
|
|
vditor.hint.recentLanguage = "";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (insertBeforeBlock(vditor, event, range, preBeforeElement, preBeforeElement.parentElement)) {
|
|||
|
|
// 上无元素,按上或左将添加新块
|
|||
|
|
hidePanel(vditor, ["hint"]);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// table
|
|||
|
|
var cellElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TD") ||
|
|||
|
|
(0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TH");
|
|||
|
|
if (event.key.indexOf("Arrow") > -1 && cellElement) {
|
|||
|
|
var tableElement = isFirstCell(cellElement);
|
|||
|
|
if (tableElement && insertBeforeBlock(vditor, event, range, cellElement, tableElement)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
var table2Element = isLastCell(cellElement);
|
|||
|
|
if (table2Element && insertAfterBlock(vditor, event, range, cellElement, table2Element)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (fixTable(vditor, event, range)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// task list
|
|||
|
|
if (fixTask(vditor, range, event)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// tab
|
|||
|
|
if (fixTab(vditor, range, event)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
var headingElement = (0,hasClosestByHeadings/* hasClosestByHeadings */.W)(startContainer);
|
|||
|
|
if (headingElement) {
|
|||
|
|
// enter++: 标题变大
|
|||
|
|
if (matchHotKey("⌘=", event)) {
|
|||
|
|
var headingMarkerElement = headingElement.querySelector(".vditor-ir__marker--heading");
|
|||
|
|
if (headingMarkerElement && headingMarkerElement.textContent.trim().length > 1) {
|
|||
|
|
process_processHeading(vditor, headingMarkerElement.textContent.substr(1));
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// enter++: 标题变小
|
|||
|
|
if (matchHotKey("⌘-", event)) {
|
|||
|
|
var headingMarkerElement = headingElement.querySelector(".vditor-ir__marker--heading");
|
|||
|
|
if (headingMarkerElement && headingMarkerElement.textContent.trim().length < 6) {
|
|||
|
|
process_processHeading(vditor, headingMarkerElement.textContent.trim() + "# ");
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestBlock */.F9)(startContainer);
|
|||
|
|
if (event.key === "Backspace" && !(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey && !event.altKey && range.toString() === "") {
|
|||
|
|
if (fixDelete(vditor, range, event, pElement)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (blockElement && blockElement.previousElementSibling
|
|||
|
|
&& blockElement.tagName !== "UL" && blockElement.tagName !== "OL"
|
|||
|
|
&& (blockElement.previousElementSibling.getAttribute("data-type") === "code-block" ||
|
|||
|
|
blockElement.previousElementSibling.getAttribute("data-type") === "math-block")) {
|
|||
|
|
var rangeStart = (0,selection/* getSelectPosition */.im)(blockElement, vditor.ir.element, range).start;
|
|||
|
|
if (rangeStart === 0 || (rangeStart === 1 && blockElement.innerText.startsWith(constants/* Constants.ZWSP */.g.ZWSP))) {
|
|||
|
|
// 当前块删除后光标落于代码渲染块上,当前块会被删除,因此需要阻止事件,不能和 keyup 中的代码块处理合并
|
|||
|
|
range.selectNodeContents(blockElement.previousElementSibling.querySelector(".vditor-ir__marker--pre code"));
|
|||
|
|
range.collapse(false);
|
|||
|
|
expandMarker(range, vditor);
|
|||
|
|
if (blockElement.textContent.trim().replace(constants/* Constants.ZWSP */.g.ZWSP, "") === "") {
|
|||
|
|
// 当前块为空且不是最后一个时,需要删除
|
|||
|
|
blockElement.remove();
|
|||
|
|
process_processAfterRender(vditor);
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 光标位于标题前,marker 后
|
|||
|
|
if (headingElement) {
|
|||
|
|
var headingLength = headingElement.firstElementChild.textContent.length;
|
|||
|
|
if ((0,selection/* getSelectPosition */.im)(headingElement, vditor.ir.element).start === headingLength && headingLength !== 0) {
|
|||
|
|
range.setStart(headingElement.firstElementChild.firstChild, headingLength - 1);
|
|||
|
|
range.collapse(true);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if ((event.key === "ArrowUp" || event.key === "ArrowDown") && blockElement) {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/358
|
|||
|
|
blockElement.querySelectorAll(".vditor-ir__node").forEach(function (item) {
|
|||
|
|
if (!item.contains(startContainer)) {
|
|||
|
|
item.classList.add("vditor-ir__node--hidden");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (fixFirefoxArrowUpTable(event, blockElement, range)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
fixCursorDownInlineMath(range, event.key);
|
|||
|
|
if (blockElement && keydownToc(blockElement, vditor, event, range)) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/preview/image.ts
|
|||
|
|
var preview_image = __webpack_require__(190);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/sv/combineFootnote.ts
|
|||
|
|
/**
|
|||
|
|
* 合并脚注
|
|||
|
|
* @param elements vditor.sv.element
|
|||
|
|
* @param afterCombine 每个脚注块合并完成后的回调, param: root为合并后的脚注块
|
|||
|
|
*/
|
|||
|
|
var combineFootnote = function (elements, afterCombine) {
|
|||
|
|
elements.querySelectorAll("[data-type=footnotes-link]").forEach(function (el) {
|
|||
|
|
var root = el.parentElement;
|
|||
|
|
var footnote = root.nextSibling;
|
|||
|
|
// 寻找所有该脚注的块
|
|||
|
|
while (footnote) {
|
|||
|
|
if (footnote.textContent.startsWith(" ")) {
|
|||
|
|
// 解析到四个空格,加入到root并继续解析
|
|||
|
|
var thisNode = footnote;
|
|||
|
|
thisNode.childNodes.forEach(function (node) {
|
|||
|
|
root.append(node.cloneNode(true));
|
|||
|
|
});
|
|||
|
|
footnote = footnote.nextSibling;
|
|||
|
|
thisNode.remove();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// 非空格停止解析
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
afterCombine && afterCombine(root);
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/sv/inputEvent.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var inputEvent = function (vditor, event) {
|
|||
|
|
var _a;
|
|||
|
|
var range = getSelection().getRangeAt(0).cloneRange();
|
|||
|
|
var startContainer = range.startContainer;
|
|||
|
|
if (range.startContainer.nodeType !== 3 && range.startContainer.tagName === "DIV") {
|
|||
|
|
startContainer = range.startContainer.childNodes[range.startOffset - 1];
|
|||
|
|
}
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-block", "0");
|
|||
|
|
// 不调用 lute 解析
|
|||
|
|
if (blockElement && event && (event.inputType === "deleteContentBackward" || event.data === " ")) {
|
|||
|
|
// 开始可以输入空格
|
|||
|
|
var startOffset = (0,selection/* getSelectPosition */.im)(blockElement, vditor.sv.element, range).start;
|
|||
|
|
var startSpace = true;
|
|||
|
|
for (var i = startOffset - 1;
|
|||
|
|
// 软换行后有空格
|
|||
|
|
i > blockElement.textContent.substr(0, startOffset).lastIndexOf("\n"); i--) {
|
|||
|
|
if (blockElement.textContent.charAt(i) !== " " &&
|
|||
|
|
// 多个 tab 前删除不形成代码块 https://github.com/Vanessa219/vditor/issues/162 1
|
|||
|
|
blockElement.textContent.charAt(i) !== "\t") {
|
|||
|
|
startSpace = false;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (startOffset === 0) {
|
|||
|
|
startSpace = false;
|
|||
|
|
}
|
|||
|
|
if (startSpace) {
|
|||
|
|
processAfterRender(vditor);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (event.inputType === "deleteContentBackward") {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/584 代码块 marker 删除
|
|||
|
|
var codeBlockMarkerElement = (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "code-block-open-marker") ||
|
|||
|
|
(0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "code-block-close-marker");
|
|||
|
|
if (codeBlockMarkerElement) {
|
|||
|
|
if (codeBlockMarkerElement.getAttribute("data-type") === "code-block-close-marker") {
|
|||
|
|
var openMarkerElement = getSideByType(startContainer, "code-block-open-marker");
|
|||
|
|
if (openMarkerElement) {
|
|||
|
|
openMarkerElement.textContent = codeBlockMarkerElement.textContent;
|
|||
|
|
processAfterRender(vditor);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (codeBlockMarkerElement.getAttribute("data-type") === "code-block-open-marker") {
|
|||
|
|
var openMarkerElement = getSideByType(startContainer, "code-block-close-marker", false);
|
|||
|
|
if (openMarkerElement) {
|
|||
|
|
openMarkerElement.textContent = codeBlockMarkerElement.textContent;
|
|||
|
|
processAfterRender(vditor);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/877 数学公式输入删除生成节点
|
|||
|
|
var mathBlockMarkerElement = (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "math-block-open-marker");
|
|||
|
|
if (mathBlockMarkerElement) {
|
|||
|
|
var mathBlockCloseElement = mathBlockMarkerElement.nextElementSibling.nextElementSibling;
|
|||
|
|
if (mathBlockCloseElement && mathBlockCloseElement.getAttribute("data-type") === "math-block-close-marker") {
|
|||
|
|
mathBlockCloseElement.remove();
|
|||
|
|
processAfterRender(vditor);
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
blockElement.querySelectorAll('[data-type="code-block-open-marker"]').forEach(function (item) {
|
|||
|
|
if (item.textContent.length === 1) {
|
|||
|
|
item.remove();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
blockElement.querySelectorAll('[data-type="code-block-close-marker"]').forEach(function (item) {
|
|||
|
|
if (item.textContent.length === 1) {
|
|||
|
|
item.remove();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
// 标题删除
|
|||
|
|
var headingElement = (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "heading-marker");
|
|||
|
|
if (headingElement && headingElement.textContent.indexOf("#") === -1) {
|
|||
|
|
processAfterRender(vditor);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 删除或空格不解析,否则会 format 回去
|
|||
|
|
if ((event.data === " " || event.inputType === "deleteContentBackward") &&
|
|||
|
|
((0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "padding") // 场景:b 前进行删除 [> 1. a\n> b]
|
|||
|
|
|| (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "li-marker") // 场景:删除最后一个字符 [* 1\n* ]
|
|||
|
|
|| (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "task-marker") // 场景:删除最后一个字符 [* [ ] ]
|
|||
|
|
|| (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "blockquote-marker") // 场景:删除最后一个字符 [> ]
|
|||
|
|
)) {
|
|||
|
|
processAfterRender(vditor);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (blockElement && blockElement.textContent.trimRight() === "$$") {
|
|||
|
|
// 内联数学公式
|
|||
|
|
processAfterRender(vditor);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (!blockElement) {
|
|||
|
|
blockElement = vditor.sv.element;
|
|||
|
|
}
|
|||
|
|
if (((_a = blockElement.firstElementChild) === null || _a === void 0 ? void 0 : _a.getAttribute("data-type")) === "link-ref-defs-block") {
|
|||
|
|
// 修改链接引用
|
|||
|
|
blockElement = vditor.sv.element;
|
|||
|
|
}
|
|||
|
|
if ((0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "footnotes-link")) {
|
|||
|
|
// 修改脚注角标
|
|||
|
|
blockElement = vditor.sv.element;
|
|||
|
|
}
|
|||
|
|
// 添加光标位置
|
|||
|
|
if (blockElement.textContent.indexOf(Lute.Caret) === -1) {
|
|||
|
|
// 点击工具栏会插入 Caret
|
|||
|
|
range.insertNode(document.createTextNode(Lute.Caret));
|
|||
|
|
}
|
|||
|
|
// 清除浏览器自带的样式
|
|||
|
|
blockElement.querySelectorAll("[style]").forEach(function (item) {
|
|||
|
|
item.removeAttribute("style");
|
|||
|
|
});
|
|||
|
|
blockElement.querySelectorAll("font").forEach(function (item) {
|
|||
|
|
item.outerHTML = item.innerHTML;
|
|||
|
|
});
|
|||
|
|
var html = blockElement.textContent;
|
|||
|
|
var isSVElement = blockElement.isEqualNode(vditor.sv.element);
|
|||
|
|
if (isSVElement) {
|
|||
|
|
html = blockElement.textContent;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// 添加前一个块元素
|
|||
|
|
if (blockElement.previousElementSibling) {
|
|||
|
|
html = blockElement.previousElementSibling.textContent + html;
|
|||
|
|
blockElement.previousElementSibling.remove();
|
|||
|
|
}
|
|||
|
|
if (blockElement.previousElementSibling && html.indexOf("---\n") === 0) {
|
|||
|
|
// 确认 yaml-front 是否为首行
|
|||
|
|
html = blockElement.previousElementSibling.textContent + html;
|
|||
|
|
blockElement.previousElementSibling.remove();
|
|||
|
|
}
|
|||
|
|
// 添加链接引用
|
|||
|
|
var footnotes_1 = "";
|
|||
|
|
vditor.sv.element.querySelectorAll("[data-type='link-ref-defs-block']").forEach(function (item, index) {
|
|||
|
|
if (item && !blockElement.isEqualNode(item.parentElement)) {
|
|||
|
|
footnotes_1 += item.parentElement.textContent + "\n";
|
|||
|
|
item.parentElement.remove();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
// 添加脚注到文章头,便于lute处理
|
|||
|
|
vditor.sv.element.querySelectorAll("[data-type='footnotes-link']").forEach(function (item, index) {
|
|||
|
|
if (item && !blockElement.isEqualNode(item.parentElement)) {
|
|||
|
|
footnotes_1 += item.parentElement.textContent + "\n";
|
|||
|
|
item.parentElement.remove();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
html = footnotes_1 + html;
|
|||
|
|
}
|
|||
|
|
html = processSpinVditorSVDOM(html, vditor);
|
|||
|
|
if (isSVElement) {
|
|||
|
|
blockElement.innerHTML = html;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
blockElement.outerHTML = html;
|
|||
|
|
}
|
|||
|
|
vditor.sv.element.querySelectorAll("[data-type='link-ref-defs-block']").forEach(function (item) {
|
|||
|
|
vditor.sv.element.insertAdjacentElement("beforeend", item.parentElement);
|
|||
|
|
});
|
|||
|
|
// 合并脚注
|
|||
|
|
combineFootnote(vditor.sv.element, function (root) {
|
|||
|
|
vditor.sv.element.insertAdjacentElement("beforeend", root);
|
|||
|
|
});
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.sv.element, range);
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
processAfterRender(vditor, {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: true,
|
|||
|
|
enableInput: true,
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/sv/processKeydown.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var processKeydown_processKeydown = function (vditor, event) {
|
|||
|
|
var _a, _b, _c, _d, _e;
|
|||
|
|
vditor.sv.composingLock = event.isComposing;
|
|||
|
|
if (event.isComposing) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (event.key.indexOf("Arrow") === -1 && event.key !== "Meta" && event.key !== "Control" && event.key !== "Alt" &&
|
|||
|
|
event.key !== "Shift" && event.key !== "CapsLock" && event.key !== "Escape" && !/^F\d{1,2}$/.test(event.key)) {
|
|||
|
|
vditor.undo.recordFirstPosition(vditor, event);
|
|||
|
|
}
|
|||
|
|
// 仅处理以下快捷键操作
|
|||
|
|
if (event.key !== "Enter" && event.key !== "Tab" && event.key !== "Backspace" && event.key.indexOf("Arrow") === -1
|
|||
|
|
&& !(0,compatibility/* isCtrl */.yl)(event) && event.key !== "Escape") {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
var startContainer = range.startContainer;
|
|||
|
|
if (range.startContainer.nodeType !== 3 && range.startContainer.tagName === "DIV") {
|
|||
|
|
startContainer = range.startContainer.childNodes[range.startOffset - 1];
|
|||
|
|
}
|
|||
|
|
var textElement = (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "text");
|
|||
|
|
// blockquote
|
|||
|
|
var blockquoteMarkerElement = (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "blockquote-marker");
|
|||
|
|
if (!blockquoteMarkerElement && range.startOffset === 0 && textElement && textElement.previousElementSibling &&
|
|||
|
|
textElement.previousElementSibling.getAttribute("data-type") === "blockquote-marker") {
|
|||
|
|
blockquoteMarkerElement = textElement.previousElementSibling;
|
|||
|
|
}
|
|||
|
|
// 回车逐个删除 blockquote marker 标记
|
|||
|
|
if (blockquoteMarkerElement) {
|
|||
|
|
if (event.key === "Enter" && !(0,compatibility/* isCtrl */.yl)(event) && !event.altKey &&
|
|||
|
|
blockquoteMarkerElement.nextElementSibling.textContent.trim() === "" &&
|
|||
|
|
(0,selection/* getSelectPosition */.im)(blockquoteMarkerElement, vditor.sv.element, range).start ===
|
|||
|
|
blockquoteMarkerElement.textContent.length) {
|
|||
|
|
if (((_a = blockquoteMarkerElement.previousElementSibling) === null || _a === void 0 ? void 0 : _a.getAttribute("data-type")) === "padding") {
|
|||
|
|
// 列表中存在多行 BQ 时,标记回车需跳出列表
|
|||
|
|
blockquoteMarkerElement.previousElementSibling.setAttribute("data-action", "enter-remove");
|
|||
|
|
}
|
|||
|
|
blockquoteMarkerElement.remove();
|
|||
|
|
processAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// list item
|
|||
|
|
var listMarkerElement = (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "li-marker");
|
|||
|
|
var taskMarkerElement = (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "task-marker");
|
|||
|
|
var listLastMarkerElement = listMarkerElement;
|
|||
|
|
if (!listLastMarkerElement) {
|
|||
|
|
if (taskMarkerElement && taskMarkerElement.nextElementSibling.getAttribute("data-type") !== "task-marker") {
|
|||
|
|
listLastMarkerElement = taskMarkerElement;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (!listLastMarkerElement && range.startOffset === 0 && textElement && textElement.previousElementSibling &&
|
|||
|
|
(textElement.previousElementSibling.getAttribute("data-type") === "li-marker" ||
|
|||
|
|
textElement.previousElementSibling.getAttribute("data-type") === "task-marker")) {
|
|||
|
|
listLastMarkerElement = textElement.previousElementSibling;
|
|||
|
|
}
|
|||
|
|
if (listLastMarkerElement) {
|
|||
|
|
var startIndex = (0,selection/* getSelectPosition */.im)(listLastMarkerElement, vditor.sv.element, range).start;
|
|||
|
|
var isTask = listLastMarkerElement.getAttribute("data-type") === "task-marker";
|
|||
|
|
var listFirstMarkerElement = listLastMarkerElement;
|
|||
|
|
if (isTask) {
|
|||
|
|
listFirstMarkerElement = listLastMarkerElement.previousElementSibling.previousElementSibling
|
|||
|
|
.previousElementSibling;
|
|||
|
|
}
|
|||
|
|
if (startIndex === listLastMarkerElement.textContent.length) {
|
|||
|
|
// 回车清空列表标记符
|
|||
|
|
if (event.key === "Enter" && !(0,compatibility/* isCtrl */.yl)(event) && !event.altKey && !event.shiftKey &&
|
|||
|
|
listLastMarkerElement.nextElementSibling.textContent.trim() === "") {
|
|||
|
|
if (((_b = listFirstMarkerElement.previousElementSibling) === null || _b === void 0 ? void 0 : _b.getAttribute("data-type")) === "padding") {
|
|||
|
|
listFirstMarkerElement.previousElementSibling.remove();
|
|||
|
|
inputEvent(vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (isTask) {
|
|||
|
|
listFirstMarkerElement.remove();
|
|||
|
|
listLastMarkerElement.previousElementSibling.previousElementSibling.remove();
|
|||
|
|
listLastMarkerElement.previousElementSibling.remove();
|
|||
|
|
}
|
|||
|
|
listLastMarkerElement.nextElementSibling.remove();
|
|||
|
|
listLastMarkerElement.remove();
|
|||
|
|
processAfterRender(vditor);
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 第一个 marker 后 tab 进行缩进
|
|||
|
|
if (event.key === "Tab") {
|
|||
|
|
if (event.shiftKey) {
|
|||
|
|
if (listFirstMarkerElement.previousElementSibling.getAttribute("data-type") === "padding") {
|
|||
|
|
listFirstMarkerElement.previousElementSibling.remove();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
listFirstMarkerElement.insertAdjacentHTML("beforebegin", "<span data-type=\"padding\">".concat(listFirstMarkerElement.textContent.replace(/\S/g, " "), "</span>"));
|
|||
|
|
}
|
|||
|
|
if (/^\d/.test(listFirstMarkerElement.textContent)) {
|
|||
|
|
listFirstMarkerElement.textContent = listFirstMarkerElement.textContent.replace(/^\d{1,}/, "1");
|
|||
|
|
range.selectNodeContents(listLastMarkerElement.firstChild);
|
|||
|
|
range.collapse(false);
|
|||
|
|
}
|
|||
|
|
inputEvent(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// tab
|
|||
|
|
if (fixTab(vditor, range, event)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-block", "0");
|
|||
|
|
var spanElement = (0,hasClosestByHeadings/* hasClosestByTag */.S)(startContainer, "SPAN");
|
|||
|
|
// 回车
|
|||
|
|
if (event.key === "Enter" && !(0,compatibility/* isCtrl */.yl)(event) && !event.altKey && !event.shiftKey && blockElement) {
|
|||
|
|
var isFirst = false;
|
|||
|
|
var newLineMatch = blockElement.textContent.match(/^\n+/);
|
|||
|
|
if ((0,selection/* getSelectPosition */.im)(blockElement, vditor.sv.element).start <= (newLineMatch ? newLineMatch[0].length : 0)) {
|
|||
|
|
// 允许段落开始换行
|
|||
|
|
isFirst = true;
|
|||
|
|
}
|
|||
|
|
var newLineText = "\n";
|
|||
|
|
if (spanElement) {
|
|||
|
|
if (((_c = spanElement.previousElementSibling) === null || _c === void 0 ? void 0 : _c.getAttribute("data-action")) === "enter-remove") {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/596
|
|||
|
|
spanElement.previousElementSibling.remove();
|
|||
|
|
processAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
newLineText += processPreviousMarkers(spanElement);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
range.insertNode(document.createTextNode(newLineText));
|
|||
|
|
range.collapse(false);
|
|||
|
|
if (blockElement && blockElement.textContent.trim() !== "" && !isFirst) {
|
|||
|
|
inputEvent(vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
processAfterRender(vditor);
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 删除后光标前有 newline 的处理
|
|||
|
|
if (event.key === "Backspace" && !(0,compatibility/* isCtrl */.yl)(event) && !event.altKey && !event.shiftKey) {
|
|||
|
|
if (spanElement && ((_d = spanElement.previousElementSibling) === null || _d === void 0 ? void 0 : _d.getAttribute("data-type")) === "newline" &&
|
|||
|
|
(0,selection/* getSelectPosition */.im)(spanElement, vditor.sv.element, range).start === 1 &&
|
|||
|
|
// 飘号的处理需在 inputEvent 中,否则上下飘号对不齐
|
|||
|
|
spanElement.getAttribute("data-type").indexOf("code-block-") === -1) {
|
|||
|
|
// 光标在每一行的第一个字符后
|
|||
|
|
range.setStart(spanElement, 0);
|
|||
|
|
range.extractContents();
|
|||
|
|
if (spanElement.textContent.trim() !== "") {
|
|||
|
|
inputEvent(vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
processAfterRender(vditor);
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 每一段第一个字符前
|
|||
|
|
if (blockElement && (0,selection/* getSelectPosition */.im)(blockElement, vditor.sv.element, range).start === 0 &&
|
|||
|
|
blockElement.previousElementSibling) {
|
|||
|
|
range.extractContents();
|
|||
|
|
var previousLastElement = blockElement.previousElementSibling.lastElementChild;
|
|||
|
|
if (previousLastElement.getAttribute("data-type") === "newline") {
|
|||
|
|
previousLastElement.remove();
|
|||
|
|
previousLastElement = blockElement.previousElementSibling.lastElementChild;
|
|||
|
|
}
|
|||
|
|
// 场景:末尾无法删除 [```\ntext\n```\n\n]
|
|||
|
|
if (previousLastElement.getAttribute("data-type") !== "newline") {
|
|||
|
|
previousLastElement.insertAdjacentHTML("afterend", blockElement.innerHTML);
|
|||
|
|
blockElement.remove();
|
|||
|
|
}
|
|||
|
|
if (blockElement.textContent.trim() !== "" && !((_e = blockElement.previousElementSibling) === null || _e === void 0 ? void 0 : _e.querySelector('[data-type="code-block-open-marker"]'))) {
|
|||
|
|
inputEvent(vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (previousLastElement.getAttribute("data-type") !== "newline") {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/597
|
|||
|
|
range.selectNodeContents(previousLastElement.lastChild);
|
|||
|
|
range.collapse(false);
|
|||
|
|
}
|
|||
|
|
processAfterRender(vditor);
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/ui/setContentTheme.ts
|
|||
|
|
var setContentTheme = __webpack_require__(538);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/ui/setTheme.ts
|
|||
|
|
var setTheme = function (vditor) {
|
|||
|
|
if (vditor.options.theme === "dark") {
|
|||
|
|
vditor.element.classList.add("vditor--dark");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.element.classList.remove("vditor--dark");
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/ui/initUI.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var initUI = function (vditor) {
|
|||
|
|
vditor.element.innerHTML = "";
|
|||
|
|
vditor.element.classList.add("vditor");
|
|||
|
|
// 支持 RTL
|
|||
|
|
if (vditor.options.rtl) {
|
|||
|
|
vditor.element.setAttribute("dir", "rtl");
|
|||
|
|
}
|
|||
|
|
setTheme(vditor);
|
|||
|
|
(0,setContentTheme/* setContentTheme */.Z)(vditor.options.preview.theme.current, vditor.options.preview.theme.path);
|
|||
|
|
if (typeof vditor.options.height === "number") {
|
|||
|
|
vditor.element.style.height = vditor.options.height + "px";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.element.style.height = vditor.options.height;
|
|||
|
|
}
|
|||
|
|
if (typeof vditor.options.minHeight === "number") {
|
|||
|
|
vditor.element.style.minHeight = vditor.options.minHeight + "px";
|
|||
|
|
}
|
|||
|
|
if (typeof vditor.options.width === "number") {
|
|||
|
|
vditor.element.style.width = vditor.options.width + "px";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.element.style.width = vditor.options.width;
|
|||
|
|
}
|
|||
|
|
vditor.element.appendChild(vditor.toolbar.element);
|
|||
|
|
var contentElement = document.createElement("div");
|
|||
|
|
contentElement.className = "vditor-content";
|
|||
|
|
if (vditor.options.outline.position === "left") {
|
|||
|
|
contentElement.appendChild(vditor.outline.element);
|
|||
|
|
}
|
|||
|
|
contentElement.appendChild(vditor.wysiwyg.element.parentElement);
|
|||
|
|
contentElement.appendChild(vditor.sv.element);
|
|||
|
|
contentElement.appendChild(vditor.ir.element.parentElement);
|
|||
|
|
contentElement.appendChild(vditor.preview.element);
|
|||
|
|
if (vditor.toolbar.elements.devtools) {
|
|||
|
|
contentElement.appendChild(vditor.devtools.element);
|
|||
|
|
}
|
|||
|
|
if (vditor.options.outline.position === "right") {
|
|||
|
|
vditor.outline.element.classList.add("vditor-outline--right");
|
|||
|
|
contentElement.appendChild(vditor.outline.element);
|
|||
|
|
}
|
|||
|
|
if (vditor.upload) {
|
|||
|
|
contentElement.appendChild(vditor.upload.element);
|
|||
|
|
}
|
|||
|
|
if (vditor.options.resize.enable) {
|
|||
|
|
contentElement.appendChild(vditor.resize.element);
|
|||
|
|
}
|
|||
|
|
contentElement.appendChild(vditor.hint.element);
|
|||
|
|
contentElement.appendChild(vditor.tip.element);
|
|||
|
|
vditor.element.appendChild(contentElement);
|
|||
|
|
contentElement.addEventListener("click", function () {
|
|||
|
|
hidePanel(vditor, ["subToolbar"]);
|
|||
|
|
});
|
|||
|
|
if (vditor.toolbar.elements.export) {
|
|||
|
|
// for export pdf
|
|||
|
|
vditor.element.insertAdjacentHTML("beforeend", '<iframe id="vditorExportIframe" style="width: 100%;height: 0;border: 0"></iframe>');
|
|||
|
|
}
|
|||
|
|
setEditMode(vditor, vditor.options.mode, afterRender(vditor));
|
|||
|
|
document.execCommand("DefaultParagraphSeparator", false, "p");
|
|||
|
|
if (navigator.userAgent.indexOf("iPhone") > -1 && typeof window.visualViewport !== "undefined") {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/379
|
|||
|
|
var pendingUpdate_1 = false;
|
|||
|
|
var viewportHandler = function (event) {
|
|||
|
|
if (pendingUpdate_1) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
pendingUpdate_1 = true;
|
|||
|
|
requestAnimationFrame(function () {
|
|||
|
|
pendingUpdate_1 = false;
|
|||
|
|
var layoutViewport = vditor.toolbar.element;
|
|||
|
|
layoutViewport.style.transform = "none";
|
|||
|
|
if (layoutViewport.getBoundingClientRect().top < 0) {
|
|||
|
|
layoutViewport.style.transform = "translate(0, ".concat(-layoutViewport.getBoundingClientRect().top, "px)");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
window.visualViewport.addEventListener("scroll", viewportHandler);
|
|||
|
|
window.visualViewport.addEventListener("resize", viewportHandler);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var setPadding = function (vditor) {
|
|||
|
|
var minPadding = window.innerWidth <= constants/* Constants.MOBILE_WIDTH */.g.MOBILE_WIDTH ? 10 : 35;
|
|||
|
|
if (vditor.wysiwyg.element.parentElement.style.display !== "none") {
|
|||
|
|
var padding = (vditor.wysiwyg.element.parentElement.clientWidth
|
|||
|
|
- vditor.options.preview.maxWidth) / 2;
|
|||
|
|
vditor.wysiwyg.element.style.padding = "10px ".concat(Math.max(minPadding, padding), "px");
|
|||
|
|
}
|
|||
|
|
if (vditor.ir.element.parentElement.style.display !== "none") {
|
|||
|
|
var padding = (vditor.ir.element.parentElement.clientWidth
|
|||
|
|
- vditor.options.preview.maxWidth) / 2;
|
|||
|
|
vditor.ir.element.style.padding = "10px ".concat(Math.max(minPadding, padding), "px");
|
|||
|
|
}
|
|||
|
|
if (vditor.preview.element.style.display !== "block") {
|
|||
|
|
vditor.toolbar.element.style.paddingLeft = Math.max(5, parseInt(vditor[vditor.currentMode].element.style.paddingLeft || "0", 10) +
|
|||
|
|
(vditor.options.outline.position === "left" ? vditor.outline.element.offsetWidth : 0)) + "px";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.toolbar.element.style.paddingLeft = (5 +
|
|||
|
|
(vditor.options.outline.position === "left" ? vditor.outline.element.offsetWidth : 0)) + "px";
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var setTypewriterPosition = function (vditor) {
|
|||
|
|
if (!vditor.options.typewriterMode) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var height = window.innerHeight;
|
|||
|
|
if (typeof vditor.options.height === "number") {
|
|||
|
|
height = vditor.options.height;
|
|||
|
|
if (typeof vditor.options.minHeight === "number") {
|
|||
|
|
height = Math.max(height, vditor.options.minHeight);
|
|||
|
|
}
|
|||
|
|
height = Math.min(window.innerHeight, height);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
height = vditor.element.clientHeight;
|
|||
|
|
}
|
|||
|
|
if (vditor.element.classList.contains("vditor--fullscreen")) {
|
|||
|
|
height = window.innerHeight;
|
|||
|
|
}
|
|||
|
|
// 由于 Firefox padding-bottom bug,只能使用 :after
|
|||
|
|
vditor[vditor.currentMode].element.style.setProperty("--editor-bottom", ((height - vditor.toolbar.element.offsetHeight) / 2) + "px");
|
|||
|
|
};
|
|||
|
|
var resizeCb;
|
|||
|
|
function UIUnbindListener() {
|
|||
|
|
window.removeEventListener("resize", resizeCb);
|
|||
|
|
}
|
|||
|
|
var afterRender = function (vditor) {
|
|||
|
|
setTypewriterPosition(vditor);
|
|||
|
|
UIUnbindListener();
|
|||
|
|
window.addEventListener("resize", resizeCb = function () {
|
|||
|
|
setPadding(vditor);
|
|||
|
|
setTypewriterPosition(vditor);
|
|||
|
|
});
|
|||
|
|
// set default value
|
|||
|
|
var initValue = (0,compatibility/* accessLocalStorage */.pK)() && localStorage.getItem(vditor.options.cache.id);
|
|||
|
|
if (!vditor.options.cache.enable || !initValue) {
|
|||
|
|
if (vditor.options.value) {
|
|||
|
|
initValue = vditor.options.value;
|
|||
|
|
}
|
|||
|
|
else if (vditor.originalInnerHTML) {
|
|||
|
|
initValue = vditor.lute.HTML2Md(vditor.originalInnerHTML);
|
|||
|
|
}
|
|||
|
|
else if (!vditor.options.cache.enable) {
|
|||
|
|
initValue = "";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return initValue || "";
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/ir/highlightToolbarIR.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var highlightToolbarIR = function (vditor) {
|
|||
|
|
clearTimeout(vditor[vditor.currentMode].hlToolbarTimeoutId);
|
|||
|
|
vditor[vditor.currentMode].hlToolbarTimeoutId = window.setTimeout(function () {
|
|||
|
|
if (vditor[vditor.currentMode].element.getAttribute("contenteditable") === "false") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (!(0,selection/* selectIsEditor */.Gb)(vditor[vditor.currentMode].element)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
removeCurrentToolbar(vditor.toolbar.elements, constants/* Constants.EDIT_TOOLBARS */.g.EDIT_TOOLBARS);
|
|||
|
|
enableToolbar(vditor.toolbar.elements, constants/* Constants.EDIT_TOOLBARS */.g.EDIT_TOOLBARS);
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
var typeElement = range.startContainer;
|
|||
|
|
if (range.startContainer.nodeType === 3) {
|
|||
|
|
typeElement = range.startContainer.parentElement;
|
|||
|
|
}
|
|||
|
|
if (typeElement.classList.contains("vditor-reset")) {
|
|||
|
|
typeElement = typeElement.childNodes[range.startOffset];
|
|||
|
|
}
|
|||
|
|
var headingElement = vditor.currentMode === "sv" ?
|
|||
|
|
(0,hasClosest/* hasClosestByAttribute */.a1)(typeElement, "data-type", "heading") : (0,hasClosestByHeadings/* hasClosestByHeadings */.W)(typeElement);
|
|||
|
|
if (headingElement) {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["headings"]);
|
|||
|
|
}
|
|||
|
|
var quoteElement = vditor.currentMode === "sv" ? (0,hasClosest/* hasClosestByAttribute */.a1)(typeElement, "data-type", "blockquote") :
|
|||
|
|
(0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "BLOCKQUOTE");
|
|||
|
|
if (quoteElement) {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["quote"]);
|
|||
|
|
}
|
|||
|
|
var strongElement = (0,hasClosest/* hasClosestByAttribute */.a1)(typeElement, "data-type", "strong");
|
|||
|
|
if (strongElement) {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["bold"]);
|
|||
|
|
}
|
|||
|
|
var emElement = (0,hasClosest/* hasClosestByAttribute */.a1)(typeElement, "data-type", "em");
|
|||
|
|
if (emElement) {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["italic"]);
|
|||
|
|
}
|
|||
|
|
var sElement = (0,hasClosest/* hasClosestByAttribute */.a1)(typeElement, "data-type", "s");
|
|||
|
|
if (sElement) {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["strike"]);
|
|||
|
|
}
|
|||
|
|
var aElement = (0,hasClosest/* hasClosestByAttribute */.a1)(typeElement, "data-type", "a");
|
|||
|
|
if (aElement) {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["link"]);
|
|||
|
|
}
|
|||
|
|
var liElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "LI");
|
|||
|
|
if (liElement) {
|
|||
|
|
if (liElement.classList.contains("vditor-task")) {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["check"]);
|
|||
|
|
}
|
|||
|
|
else if (liElement.parentElement.tagName === "OL") {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["ordered-list"]);
|
|||
|
|
}
|
|||
|
|
else if (liElement.parentElement.tagName === "UL") {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["list"]);
|
|||
|
|
}
|
|||
|
|
enableToolbar(vditor.toolbar.elements, ["outdent", "indent"]);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
disableToolbar(vditor.toolbar.elements, ["outdent", "indent"]);
|
|||
|
|
}
|
|||
|
|
var codeBlockElement = (0,hasClosest/* hasClosestByAttribute */.a1)(typeElement, "data-type", "code-block");
|
|||
|
|
if (codeBlockElement) {
|
|||
|
|
disableToolbar(vditor.toolbar.elements, ["headings", "bold", "italic", "strike", "line", "quote",
|
|||
|
|
"list", "ordered-list", "check", "code", "inline-code", "upload", "link", "table", "record"]);
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["code"]);
|
|||
|
|
}
|
|||
|
|
var codeElement = (0,hasClosest/* hasClosestByAttribute */.a1)(typeElement, "data-type", "code");
|
|||
|
|
if (codeElement) {
|
|||
|
|
disableToolbar(vditor.toolbar.elements, ["headings", "bold", "italic", "strike", "line", "quote",
|
|||
|
|
"list", "ordered-list", "check", "code", "upload", "link", "table", "record"]);
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["inline-code"]);
|
|||
|
|
}
|
|||
|
|
var tableElement = (0,hasClosest/* hasClosestByAttribute */.a1)(typeElement, "data-type", "table");
|
|||
|
|
if (tableElement) {
|
|||
|
|
disableToolbar(vditor.toolbar.elements, ["headings", "list", "ordered-list", "check", "line",
|
|||
|
|
"quote", "code", "table"]);
|
|||
|
|
}
|
|||
|
|
}, 200);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/wysiwyg/afterRenderEvent.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
var afterRenderEvent = function (vditor, options) {
|
|||
|
|
if (options === void 0) { options = {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: false,
|
|||
|
|
enableInput: true,
|
|||
|
|
}; }
|
|||
|
|
if (options.enableHint) {
|
|||
|
|
vditor.hint.render(vditor);
|
|||
|
|
}
|
|||
|
|
clearTimeout(vditor.wysiwyg.afterRenderTimeoutId);
|
|||
|
|
vditor.wysiwyg.afterRenderTimeoutId = window.setTimeout(function () {
|
|||
|
|
if (vditor.wysiwyg.composingLock) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var text = getMarkdown(vditor);
|
|||
|
|
if (typeof vditor.options.input === "function" && options.enableInput) {
|
|||
|
|
vditor.options.input(text);
|
|||
|
|
}
|
|||
|
|
if (vditor.options.counter.enable) {
|
|||
|
|
vditor.counter.render(vditor, text);
|
|||
|
|
}
|
|||
|
|
if (vditor.options.cache.enable && (0,compatibility/* accessLocalStorage */.pK)()) {
|
|||
|
|
localStorage.setItem(vditor.options.cache.id, text);
|
|||
|
|
if (vditor.options.cache.after) {
|
|||
|
|
vditor.options.cache.after(text);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (vditor.devtools) {
|
|||
|
|
vditor.devtools.renderEchart(vditor);
|
|||
|
|
}
|
|||
|
|
if (options.enableAddUndoStack) {
|
|||
|
|
vditor.undo.addToUndoStack(vditor);
|
|||
|
|
}
|
|||
|
|
}, vditor.options.undoDelay);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/wysiwyg/inlineTag.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
var previoueIsEmptyA = function (node) {
|
|||
|
|
var previousNode = node.previousSibling;
|
|||
|
|
while (previousNode) {
|
|||
|
|
if (previousNode.nodeType !== 3 && previousNode.tagName === "A" && !previousNode.previousSibling
|
|||
|
|
&& previousNode.innerHTML.replace(constants/* Constants.ZWSP */.g.ZWSP, "") === "" && previousNode.nextSibling) {
|
|||
|
|
return previousNode;
|
|||
|
|
}
|
|||
|
|
previousNode = previousNode.previousSibling;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var nextIsCode = function (range) {
|
|||
|
|
var nextNode = range.startContainer.nextSibling;
|
|||
|
|
while (nextNode && nextNode.textContent === "") {
|
|||
|
|
nextNode = nextNode.nextSibling;
|
|||
|
|
}
|
|||
|
|
if (nextNode && nextNode.nodeType !== 3 && (nextNode.tagName === "CODE" ||
|
|||
|
|
nextNode.getAttribute("data-type") === "math-inline" ||
|
|||
|
|
nextNode.getAttribute("data-type") === "html-entity" ||
|
|||
|
|
nextNode.getAttribute("data-type") === "html-inline")) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var getNextHTML = function (node) {
|
|||
|
|
var html = "";
|
|||
|
|
var nextNode = node.nextSibling;
|
|||
|
|
while (nextNode) {
|
|||
|
|
if (nextNode.nodeType === 3) {
|
|||
|
|
html += nextNode.textContent;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
html += nextNode.outerHTML;
|
|||
|
|
}
|
|||
|
|
nextNode = nextNode.nextSibling;
|
|||
|
|
}
|
|||
|
|
return html;
|
|||
|
|
};
|
|||
|
|
var getPreviousHTML = function (node) {
|
|||
|
|
var html = "";
|
|||
|
|
var previousNode = node.previousSibling;
|
|||
|
|
while (previousNode) {
|
|||
|
|
if (previousNode.nodeType === 3) {
|
|||
|
|
html = previousNode.textContent + html;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
html = previousNode.outerHTML + html;
|
|||
|
|
}
|
|||
|
|
previousNode = previousNode.previousSibling;
|
|||
|
|
}
|
|||
|
|
return html;
|
|||
|
|
};
|
|||
|
|
var getRenderElementNextNode = function (blockCodeElement) {
|
|||
|
|
var nextNode = blockCodeElement;
|
|||
|
|
while (nextNode && !nextNode.nextSibling) {
|
|||
|
|
nextNode = nextNode.parentElement;
|
|||
|
|
}
|
|||
|
|
return nextNode.nextSibling;
|
|||
|
|
};
|
|||
|
|
var splitElement = function (range) {
|
|||
|
|
var previousHTML = getPreviousHTML(range.startContainer);
|
|||
|
|
var nextHTML = getNextHTML(range.startContainer);
|
|||
|
|
var text = range.startContainer.textContent;
|
|||
|
|
var offset = range.startOffset;
|
|||
|
|
var beforeHTML = "";
|
|||
|
|
var afterHTML = "";
|
|||
|
|
if (text.substr(0, offset) !== "" && text.substr(0, offset) !== constants/* Constants.ZWSP */.g.ZWSP || previousHTML) {
|
|||
|
|
beforeHTML = "".concat(previousHTML).concat(text.substr(0, offset));
|
|||
|
|
}
|
|||
|
|
if (text.substr(offset) !== "" && text.substr(offset) !== constants/* Constants.ZWSP */.g.ZWSP || nextHTML) {
|
|||
|
|
afterHTML = "".concat(text.substr(offset)).concat(nextHTML);
|
|||
|
|
}
|
|||
|
|
return {
|
|||
|
|
afterHTML: afterHTML,
|
|||
|
|
beforeHTML: beforeHTML,
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
var modifyPre = function (vditor, range) {
|
|||
|
|
// 没有被块元素包裹
|
|||
|
|
Array.from(vditor.wysiwyg.element.childNodes).find(function (node) {
|
|||
|
|
if (node.nodeType === 3) {
|
|||
|
|
var pElement = document.createElement("p");
|
|||
|
|
pElement.setAttribute("data-block", "0");
|
|||
|
|
pElement.textContent = node.textContent;
|
|||
|
|
// 为空按下 tab 且 tab = ' ' 时,range.startContainer 不为 node
|
|||
|
|
var cloneRangeOffset = range.startContainer.nodeType === 3 ? range.startOffset : node.textContent.length;
|
|||
|
|
node.parentNode.insertBefore(pElement, node);
|
|||
|
|
node.remove();
|
|||
|
|
range.setStart(pElement.firstChild, Math.min(pElement.firstChild.textContent.length, cloneRangeOffset));
|
|||
|
|
range.collapse(true);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
else if (!node.getAttribute("data-block")) {
|
|||
|
|
if (node.tagName === "P") {
|
|||
|
|
node.remove();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (node.tagName === "DIV") {
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
// firefox 列表换行产生 div
|
|||
|
|
node.outerHTML = "<p data-block=\"0\">".concat(node.innerHTML, "</p>");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (node.tagName === "BR") {
|
|||
|
|
// firefox 空换行产生 BR
|
|||
|
|
node.outerHTML = "<p data-block=\"0\">".concat(node.outerHTML, "<wbr></p>");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
node.outerHTML = "<p data-block=\"0\">".concat(node.outerHTML, "</p>");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
range = getSelection().getRangeAt(0);
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/wysiwyg/setHeading.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var setHeading = function (vditor, tagName) {
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestBlock */.F9)(range.startContainer);
|
|||
|
|
if (!blockElement) {
|
|||
|
|
blockElement = range.startContainer.childNodes[range.startOffset];
|
|||
|
|
}
|
|||
|
|
if (!blockElement && vditor.wysiwyg.element.children.length === 0) {
|
|||
|
|
blockElement = vditor.wysiwyg.element;
|
|||
|
|
}
|
|||
|
|
if (blockElement && !blockElement.classList.contains("vditor-wysiwyg__block")) {
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
// Firefox 需要 trim https://github.com/Vanessa219/vditor/issues/207
|
|||
|
|
if (blockElement.innerHTML.trim() === "<wbr>") {
|
|||
|
|
// Firefox 光标对不齐 https://github.com/Vanessa219/vditor/issues/199 1
|
|||
|
|
blockElement.innerHTML = "<wbr><br>";
|
|||
|
|
}
|
|||
|
|
if (blockElement.tagName === "BLOCKQUOTE" || blockElement.classList.contains("vditor-reset")) {
|
|||
|
|
blockElement.innerHTML = "<".concat(tagName, " data-block=\"0\">").concat(blockElement.innerHTML.trim(), "</").concat(tagName, ">");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
blockElement.outerHTML = "<".concat(tagName, " data-block=\"0\">").concat(blockElement.innerHTML.trim(), "</").concat(tagName, ">");
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
renderToc(vditor);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var removeHeading = function (vditor) {
|
|||
|
|
var range = getSelection().getRangeAt(0);
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestBlock */.F9)(range.startContainer);
|
|||
|
|
if (!blockElement) {
|
|||
|
|
blockElement = range.startContainer.childNodes[range.startOffset];
|
|||
|
|
}
|
|||
|
|
if (blockElement) {
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
blockElement.outerHTML = "<p data-block=\"0\">".concat(blockElement.innerHTML, "</p>");
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
}
|
|||
|
|
vditor.wysiwyg.popover.style.display = "none";
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/wysiwyg/showCode.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
var showCode = function (previewElement, vditor, first) {
|
|||
|
|
if (first === void 0) { first = true; }
|
|||
|
|
var previousElement = previewElement.previousElementSibling;
|
|||
|
|
var range = previousElement.ownerDocument.createRange();
|
|||
|
|
if (previousElement.tagName === "CODE") {
|
|||
|
|
previousElement.style.display = "inline-block";
|
|||
|
|
if (first) {
|
|||
|
|
range.setStart(previousElement.firstChild, 1);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.selectNodeContents(previousElement);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
previousElement.style.display = "block";
|
|||
|
|
if (!previousElement.firstChild.firstChild) {
|
|||
|
|
previousElement.firstChild.appendChild(document.createTextNode(""));
|
|||
|
|
}
|
|||
|
|
range.selectNodeContents(previousElement.firstChild);
|
|||
|
|
}
|
|||
|
|
if (first) {
|
|||
|
|
range.collapse(true);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.collapse(false);
|
|||
|
|
}
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
if (previewElement.firstElementChild.classList.contains("language-mindmap")) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/wysiwyg/processKeydown.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var wysiwyg_processKeydown_processKeydown = function (vditor, event) {
|
|||
|
|
// Chrome firefox 触发 compositionend 机制不一致 https://github.com/Vanessa219/vditor/issues/188
|
|||
|
|
vditor.wysiwyg.composingLock = event.isComposing;
|
|||
|
|
if (event.isComposing) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
// 添加第一次记录 undo 的光标
|
|||
|
|
if (event.key.indexOf("Arrow") === -1 && event.key !== "Meta" && event.key !== "Control" && event.key !== "Alt" &&
|
|||
|
|
event.key !== "Shift" && event.key !== "CapsLock" && event.key !== "Escape" && !/^F\d{1,2}$/.test(event.key)) {
|
|||
|
|
vditor.undo.recordFirstPosition(vditor, event);
|
|||
|
|
}
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
var startContainer = range.startContainer;
|
|||
|
|
if (!fixGSKeyBackspace(event, vditor, startContainer)) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
fixCJKPosition(range, vditor, event);
|
|||
|
|
fixHR(range);
|
|||
|
|
// 仅处理以下快捷键操作
|
|||
|
|
if (event.key !== "Enter" && event.key !== "Tab" && event.key !== "Backspace" && event.key.indexOf("Arrow") === -1
|
|||
|
|
&& !(0,compatibility/* isCtrl */.yl)(event) && event.key !== "Escape" && event.key !== "Delete") {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestBlock */.F9)(startContainer);
|
|||
|
|
var pElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "P");
|
|||
|
|
// md 处理
|
|||
|
|
if (fixMarkdown(event, vditor, pElement, range)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// li
|
|||
|
|
if (fixList(range, vditor, pElement, event)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// table
|
|||
|
|
if (fixTable(vditor, event, range)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// code render
|
|||
|
|
var codeRenderElement = (0,hasClosest/* hasClosestByClassName */.fb)(startContainer, "vditor-wysiwyg__block");
|
|||
|
|
if (codeRenderElement) {
|
|||
|
|
// esc: 退出编辑,仅展示渲染
|
|||
|
|
if (event.key === "Escape" && codeRenderElement.children.length === 2) {
|
|||
|
|
vditor.wysiwyg.popover.style.display = "none";
|
|||
|
|
codeRenderElement.firstElementChild.style.display = "none";
|
|||
|
|
vditor.wysiwyg.element.blur();
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// alt+enter: 代码块切换到语言 https://github.com/Vanessa219/vditor/issues/54
|
|||
|
|
if (!(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey && event.altKey && event.key === "Enter" &&
|
|||
|
|
codeRenderElement.getAttribute("data-type") === "code-block") {
|
|||
|
|
var inputElemment = vditor.wysiwyg.popover.querySelector(".vditor-input");
|
|||
|
|
inputElemment.focus();
|
|||
|
|
inputElemment.select();
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (codeRenderElement.getAttribute("data-block") === "0") {
|
|||
|
|
if (fixCodeBlock(vditor, event, codeRenderElement.firstElementChild, range)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (insertAfterBlock(vditor, event, range, codeRenderElement.firstElementChild, codeRenderElement)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (codeRenderElement.getAttribute("data-type") !== "yaml-front-matter" &&
|
|||
|
|
insertBeforeBlock(vditor, event, range, codeRenderElement.firstElementChild, codeRenderElement)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// blockquote
|
|||
|
|
if (fixBlockquote(vditor, range, event, pElement)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 顶层 blockquote
|
|||
|
|
var topBQElement = (0,hasClosest/* hasTopClosestByTag */.E2)(startContainer, "BLOCKQUOTE");
|
|||
|
|
if (topBQElement) {
|
|||
|
|
if (!event.shiftKey && event.altKey && event.key === "Enter") {
|
|||
|
|
if (!(0,compatibility/* isCtrl */.yl)(event)) {
|
|||
|
|
// alt+enter: 跳出多层 blockquote 嵌套之后 https://github.com/Vanessa219/vditor/issues/51
|
|||
|
|
range.setStartAfter(topBQElement);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// ctrl+alt+enter: 跳出多层 blockquote 嵌套之前
|
|||
|
|
range.setStartBefore(topBQElement);
|
|||
|
|
}
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
var node = document.createElement("p");
|
|||
|
|
node.setAttribute("data-block", "0");
|
|||
|
|
node.innerHTML = "\n";
|
|||
|
|
range.insertNode(node);
|
|||
|
|
range.collapse(true);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// h1-h6
|
|||
|
|
var headingElement = (0,hasClosestByHeadings/* hasClosestByHeadings */.W)(startContainer);
|
|||
|
|
if (headingElement) {
|
|||
|
|
if (headingElement.tagName === "H6" && startContainer.textContent.length === range.startOffset &&
|
|||
|
|
!(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey && !event.altKey && event.key === "Enter") {
|
|||
|
|
// enter: H6 回车解析问题 https://github.com/Vanessa219/vditor/issues/48
|
|||
|
|
var pTempElement = document.createElement("p");
|
|||
|
|
pTempElement.textContent = "\n";
|
|||
|
|
pTempElement.setAttribute("data-block", "0");
|
|||
|
|
startContainer.parentElement.insertAdjacentElement("afterend", pTempElement);
|
|||
|
|
range.setStart(pTempElement, 0);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// enter++: 标题变大
|
|||
|
|
if (matchHotKey("⌘=", event)) {
|
|||
|
|
var index = parseInt(headingElement.tagName.substr(1), 10) - 1;
|
|||
|
|
if (index > 0) {
|
|||
|
|
setHeading(vditor, "h".concat(index));
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// enter++: 标题变小
|
|||
|
|
if (matchHotKey("⌘-", event)) {
|
|||
|
|
var index = parseInt(headingElement.tagName.substr(1), 10) + 1;
|
|||
|
|
if (index < 7) {
|
|||
|
|
setHeading(vditor, "h".concat(index));
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (event.key === "Backspace" && !(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey && !event.altKey
|
|||
|
|
&& headingElement.textContent.length === 1) {
|
|||
|
|
// 删除后变为空
|
|||
|
|
removeHeading(vditor);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// task list
|
|||
|
|
if (fixTask(vditor, range, event)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// alt+enter
|
|||
|
|
if (event.altKey && event.key === "Enter" && !(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey) {
|
|||
|
|
// 切换到链接、链接引用、脚注引用弹出的输入框中
|
|||
|
|
var aElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "A");
|
|||
|
|
var linRefElement = (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "link-ref");
|
|||
|
|
var footnoteRefElement = (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "footnotes-ref");
|
|||
|
|
if (aElement || linRefElement || footnoteRefElement ||
|
|||
|
|
(headingElement && headingElement.tagName.length === 2)) {
|
|||
|
|
var inputElement = vditor.wysiwyg.popover.querySelector("input");
|
|||
|
|
inputElement.focus();
|
|||
|
|
inputElement.select();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 删除有子工具栏的块
|
|||
|
|
if (removeBlockElement(vditor, event)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 对有子工具栏的块上移
|
|||
|
|
if (matchHotKey("⇧⌘U", event)) {
|
|||
|
|
var itemElement = vditor.wysiwyg.popover.querySelector('[data-type="up"]');
|
|||
|
|
if (itemElement) {
|
|||
|
|
itemElement.click();
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 对有子工具栏的块下移
|
|||
|
|
if (matchHotKey("⇧⌘D", event)) {
|
|||
|
|
var itemElement = vditor.wysiwyg.popover.querySelector('[data-type="down"]');
|
|||
|
|
if (itemElement) {
|
|||
|
|
itemElement.click();
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (fixTab(vditor, range, event)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// shift+enter:软换行,但 table/hr/heading 处理、cell 内换行、block render 换行处理单独写在上面,li & p 使用浏览器默认
|
|||
|
|
if (!(0,compatibility/* isCtrl */.yl)(event) && event.shiftKey && !event.altKey && event.key === "Enter" &&
|
|||
|
|
startContainer.parentElement.tagName !== "LI" && startContainer.parentElement.tagName !== "P") {
|
|||
|
|
if (["STRONG", "STRIKE", "S", "I", "EM", "B"].includes(startContainer.parentElement.tagName)) {
|
|||
|
|
// 行内元素软换行需继续 https://github.com/Vanessa219/vditor/issues/170
|
|||
|
|
range.insertNode(document.createTextNode("\n" + constants/* Constants.ZWSP */.g.ZWSP));
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.insertNode(document.createTextNode("\n"));
|
|||
|
|
}
|
|||
|
|
range.collapse(false);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 删除
|
|||
|
|
if (event.key === "Backspace" && !(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey && !event.altKey && range.toString() === "") {
|
|||
|
|
if (fixDelete(vditor, range, event, pElement)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (blockElement) {
|
|||
|
|
if (blockElement.previousElementSibling
|
|||
|
|
&& blockElement.previousElementSibling.classList.contains("vditor-wysiwyg__block")
|
|||
|
|
&& blockElement.previousElementSibling.getAttribute("data-block") === "0"
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/946
|
|||
|
|
&& blockElement.tagName !== "UL" && blockElement.tagName !== "OL") {
|
|||
|
|
var rangeStart = (0,selection/* getSelectPosition */.im)(blockElement, vditor.wysiwyg.element, range).start;
|
|||
|
|
if ((rangeStart === 0 && range.startOffset === 0) || // https://github.com/Vanessa219/vditor/issues/894
|
|||
|
|
(rangeStart === 1 && blockElement.innerText.startsWith(constants/* Constants.ZWSP */.g.ZWSP))) {
|
|||
|
|
// 当前块删除后光标落于代码渲染块上,当前块会被删除,因此需要阻止事件,不能和 keyup 中的代码块处理合并
|
|||
|
|
showCode(blockElement.previousElementSibling.lastElementChild, vditor, false);
|
|||
|
|
if (blockElement.innerHTML.trim().replace(constants/* Constants.ZWSP */.g.ZWSP, "") === "") {
|
|||
|
|
// 当前块为空且不是最后一个时,需要删除
|
|||
|
|
blockElement.remove();
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var rangeStartOffset = range.startOffset;
|
|||
|
|
if (range.toString() === "" && startContainer.nodeType === 3 &&
|
|||
|
|
startContainer.textContent.charAt(rangeStartOffset - 2) === "\n" &&
|
|||
|
|
startContainer.textContent.charAt(rangeStartOffset - 1) !== constants/* Constants.ZWSP */.g.ZWSP
|
|||
|
|
&& ["STRONG", "STRIKE", "S", "I", "EM", "B"].includes(startContainer.parentElement.tagName)) {
|
|||
|
|
// 保持行内元素软换行需继续的一致性
|
|||
|
|
startContainer.textContent = startContainer.textContent.substring(0, rangeStartOffset - 1) +
|
|||
|
|
constants/* Constants.ZWSP */.g.ZWSP;
|
|||
|
|
range.setStart(startContainer, rangeStartOffset);
|
|||
|
|
range.collapse(true);
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// inline code、math、html 行前零宽字符后进行删除
|
|||
|
|
if (startContainer.textContent === constants/* Constants.ZWSP */.g.ZWSP && range.startOffset === 1
|
|||
|
|
&& !startContainer.previousSibling && nextIsCode(range)) {
|
|||
|
|
startContainer.textContent = "";
|
|||
|
|
// 不能返回,其前面为代码渲染块时需进行以下处理:修正光标位于 inline math/html 前,按下删除按钮 code 中内容会被删除
|
|||
|
|
}
|
|||
|
|
// 修正光标位于 inline math/html, html-entity 前,按下删除按钮 code 中内容会被删除, 不能返回,还需要进行后续处理
|
|||
|
|
blockElement.querySelectorAll("span.vditor-wysiwyg__block[data-type='math-inline']").forEach(function (item) {
|
|||
|
|
item.firstElementChild.style.display = "inline";
|
|||
|
|
item.lastElementChild.style.display = "none";
|
|||
|
|
});
|
|||
|
|
blockElement.querySelectorAll("span.vditor-wysiwyg__block[data-type='html-entity']").forEach(function (item) {
|
|||
|
|
item.firstElementChild.style.display = "inline";
|
|||
|
|
item.lastElementChild.style.display = "none";
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if ((0,compatibility/* isFirefox */.vU)() && range.startOffset === 1 && startContainer.textContent.indexOf(constants/* Constants.ZWSP */.g.ZWSP) > -1 &&
|
|||
|
|
startContainer.previousSibling && startContainer.previousSibling.nodeType !== 3 &&
|
|||
|
|
startContainer.previousSibling.tagName === "CODE" &&
|
|||
|
|
(event.key === "Backspace" || event.key === "ArrowLeft")) {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/410
|
|||
|
|
range.selectNodeContents(startContainer.previousSibling);
|
|||
|
|
range.collapse(false);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (fixFirefoxArrowUpTable(event, blockElement, range)) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
fixCursorDownInlineMath(range, event.key);
|
|||
|
|
if (event.key === "ArrowDown") {
|
|||
|
|
// 光标位于内联数学公式前,按下键无作用
|
|||
|
|
var nextElement = startContainer.nextSibling;
|
|||
|
|
if (nextElement && nextElement.nodeType !== 3 && nextElement.getAttribute("data-type") === "math-inline") {
|
|||
|
|
range.setStartAfter(nextElement);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (blockElement && keydownToc(blockElement, vditor, event, range)) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var removeBlockElement = function (vditor, event) {
|
|||
|
|
// 删除有子工具栏的块
|
|||
|
|
if (matchHotKey("⇧⌘X", event)) {
|
|||
|
|
var itemElement = vditor.wysiwyg.popover.querySelector('[data-type="remove"]');
|
|||
|
|
if (itemElement) {
|
|||
|
|
itemElement.click();
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/wysiwyg/highlightToolbarWYSIWYG.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var highlightToolbarWYSIWYG = function (vditor) {
|
|||
|
|
clearTimeout(vditor.wysiwyg.hlToolbarTimeoutId);
|
|||
|
|
vditor.wysiwyg.hlToolbarTimeoutId = window.setTimeout(function () {
|
|||
|
|
if (vditor.wysiwyg.element.getAttribute("contenteditable") === "false") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (!(0,selection/* selectIsEditor */.Gb)(vditor.wysiwyg.element)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
removeCurrentToolbar(vditor.toolbar.elements, constants/* Constants.EDIT_TOOLBARS */.g.EDIT_TOOLBARS);
|
|||
|
|
enableToolbar(vditor.toolbar.elements, constants/* Constants.EDIT_TOOLBARS */.g.EDIT_TOOLBARS);
|
|||
|
|
var range = getSelection().getRangeAt(0);
|
|||
|
|
var typeElement = range.startContainer;
|
|||
|
|
if (range.startContainer.nodeType === 3) {
|
|||
|
|
typeElement = range.startContainer.parentElement;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
typeElement = typeElement.childNodes[range.startOffset >= typeElement.childNodes.length
|
|||
|
|
? typeElement.childNodes.length - 1
|
|||
|
|
: range.startOffset];
|
|||
|
|
}
|
|||
|
|
var footnotesElement = (0,hasClosest/* hasClosestByAttribute */.a1)(typeElement, "data-type", "footnotes-block");
|
|||
|
|
if (footnotesElement) {
|
|||
|
|
vditor.wysiwyg.popover.innerHTML = "";
|
|||
|
|
genClose(footnotesElement, vditor);
|
|||
|
|
customWysiwygToolbar(vditor, "footnotes-block");
|
|||
|
|
setPopoverPosition(vditor, footnotesElement);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// 工具栏高亮和禁用
|
|||
|
|
var liElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "LI");
|
|||
|
|
if (liElement) {
|
|||
|
|
if (liElement.classList.contains("vditor-task")) {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["check"]);
|
|||
|
|
}
|
|||
|
|
else if (liElement.parentElement.tagName === "OL") {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["ordered-list"]);
|
|||
|
|
}
|
|||
|
|
else if (liElement.parentElement.tagName === "UL") {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["list"]);
|
|||
|
|
}
|
|||
|
|
enableToolbar(vditor.toolbar.elements, ["outdent", "indent"]);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
disableToolbar(vditor.toolbar.elements, ["outdent", "indent"]);
|
|||
|
|
}
|
|||
|
|
if ((0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "BLOCKQUOTE")) {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["quote"]);
|
|||
|
|
}
|
|||
|
|
if ((0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "B") ||
|
|||
|
|
(0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "STRONG")) {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["bold"]);
|
|||
|
|
}
|
|||
|
|
if ((0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "I") ||
|
|||
|
|
(0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "EM")) {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["italic"]);
|
|||
|
|
}
|
|||
|
|
if ((0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "STRIKE") ||
|
|||
|
|
(0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "S")) {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["strike"]);
|
|||
|
|
}
|
|||
|
|
// comments
|
|||
|
|
vditor.wysiwyg.element
|
|||
|
|
.querySelectorAll(".vditor-comment--focus")
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
item.classList.remove("vditor-comment--focus");
|
|||
|
|
});
|
|||
|
|
var commentElement = (0,hasClosest/* hasClosestByClassName */.fb)(typeElement, "vditor-comment");
|
|||
|
|
if (commentElement) {
|
|||
|
|
var ids_1 = commentElement.getAttribute("data-cmtids").split(" ");
|
|||
|
|
if (ids_1.length > 1 && commentElement.nextSibling.isSameNode(commentElement.nextElementSibling)) {
|
|||
|
|
var nextIds_1 = commentElement.nextElementSibling
|
|||
|
|
.getAttribute("data-cmtids")
|
|||
|
|
.split(" ");
|
|||
|
|
ids_1.find(function (id) {
|
|||
|
|
if (nextIds_1.includes(id)) {
|
|||
|
|
ids_1 = [id];
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
vditor.wysiwyg.element
|
|||
|
|
.querySelectorAll(".vditor-comment")
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
if (item.getAttribute("data-cmtids").indexOf(ids_1[0]) > -1) {
|
|||
|
|
item.classList.add("vditor-comment--focus");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
var aElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "A");
|
|||
|
|
if (aElement) {
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["link"]);
|
|||
|
|
}
|
|||
|
|
var tableElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "TABLE");
|
|||
|
|
var headingElement = (0,hasClosestByHeadings/* hasClosestByHeadings */.W)(typeElement);
|
|||
|
|
if ((0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "CODE")) {
|
|||
|
|
if ((0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "PRE")) {
|
|||
|
|
disableToolbar(vditor.toolbar.elements, [
|
|||
|
|
"headings",
|
|||
|
|
"bold",
|
|||
|
|
"italic",
|
|||
|
|
"strike",
|
|||
|
|
"line",
|
|||
|
|
"quote",
|
|||
|
|
"list",
|
|||
|
|
"ordered-list",
|
|||
|
|
"check",
|
|||
|
|
"code",
|
|||
|
|
"inline-code",
|
|||
|
|
"upload",
|
|||
|
|
"link",
|
|||
|
|
"table",
|
|||
|
|
"record",
|
|||
|
|
]);
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["code"]);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
disableToolbar(vditor.toolbar.elements, [
|
|||
|
|
"headings",
|
|||
|
|
"bold",
|
|||
|
|
"italic",
|
|||
|
|
"strike",
|
|||
|
|
"line",
|
|||
|
|
"quote",
|
|||
|
|
"list",
|
|||
|
|
"ordered-list",
|
|||
|
|
"check",
|
|||
|
|
"code",
|
|||
|
|
"upload",
|
|||
|
|
"link",
|
|||
|
|
"table",
|
|||
|
|
"record",
|
|||
|
|
]);
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["inline-code"]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (headingElement) {
|
|||
|
|
disableToolbar(vditor.toolbar.elements, ["bold"]);
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["headings"]);
|
|||
|
|
}
|
|||
|
|
else if (tableElement) {
|
|||
|
|
disableToolbar(vditor.toolbar.elements, ["table"]);
|
|||
|
|
}
|
|||
|
|
// toc popover
|
|||
|
|
var tocElement = (0,hasClosest/* hasClosestByClassName */.fb)(typeElement, "vditor-toc");
|
|||
|
|
if (tocElement) {
|
|||
|
|
vditor.wysiwyg.popover.innerHTML = "";
|
|||
|
|
genClose(tocElement, vditor);
|
|||
|
|
customWysiwygToolbar(vditor, "vditor-toc");
|
|||
|
|
setPopoverPosition(vditor, tocElement);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// quote popover
|
|||
|
|
var blockquoteElement = (0,hasClosestByHeadings/* hasClosestByTag */.S)(typeElement, "BLOCKQUOTE");
|
|||
|
|
if (blockquoteElement) {
|
|||
|
|
vditor.wysiwyg.popover.innerHTML = "";
|
|||
|
|
genUp(range, blockquoteElement, vditor);
|
|||
|
|
genDown(range, blockquoteElement, vditor);
|
|||
|
|
genClose(blockquoteElement, vditor);
|
|||
|
|
customWysiwygToolbar(vditor, "blockquote");
|
|||
|
|
setPopoverPosition(vditor, blockquoteElement);
|
|||
|
|
}
|
|||
|
|
// list item popover
|
|||
|
|
if (liElement) {
|
|||
|
|
vditor.wysiwyg.popover.innerHTML = "";
|
|||
|
|
genUp(range, liElement, vditor);
|
|||
|
|
genDown(range, liElement, vditor);
|
|||
|
|
genClose(liElement, vditor);
|
|||
|
|
customWysiwygToolbar(vditor, "li");
|
|||
|
|
setPopoverPosition(vditor, liElement);
|
|||
|
|
}
|
|||
|
|
// table popover
|
|||
|
|
if (tableElement) {
|
|||
|
|
var lang = vditor.options.lang;
|
|||
|
|
var options = vditor.options;
|
|||
|
|
vditor.wysiwyg.popover.innerHTML = "";
|
|||
|
|
var updateTable_1 = function () {
|
|||
|
|
var oldRow = tableElement.rows.length;
|
|||
|
|
var oldColumn = tableElement.rows[0].cells.length;
|
|||
|
|
var row = parseInt(input_1.value, 10) || oldRow;
|
|||
|
|
var column = parseInt(input2_1.value, 10) || oldColumn;
|
|||
|
|
if (row === oldRow && oldColumn === column) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (oldColumn !== column) {
|
|||
|
|
var columnDiff = column - oldColumn;
|
|||
|
|
for (var i = 0; i < tableElement.rows.length; i++) {
|
|||
|
|
if (columnDiff > 0) {
|
|||
|
|
for (var j = 0; j < columnDiff; j++) {
|
|||
|
|
if (i === 0) {
|
|||
|
|
tableElement.rows[i].lastElementChild.insertAdjacentHTML("afterend", "<th> </th>");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
tableElement.rows[i].lastElementChild.insertAdjacentHTML("afterend", "<td> </td>");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
for (var k = oldColumn - 1; k >= column; k--) {
|
|||
|
|
tableElement.rows[i].cells[k].remove();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (oldRow !== row) {
|
|||
|
|
var rowDiff = row - oldRow;
|
|||
|
|
if (rowDiff > 0) {
|
|||
|
|
var rowHTML = "<tr>";
|
|||
|
|
for (var m = 0; m < column; m++) {
|
|||
|
|
rowHTML += "<td> </td>";
|
|||
|
|
}
|
|||
|
|
for (var l = 0; l < rowDiff; l++) {
|
|||
|
|
if (tableElement.querySelector("tbody")) {
|
|||
|
|
tableElement
|
|||
|
|
.querySelector("tbody")
|
|||
|
|
.insertAdjacentHTML("beforeend", rowHTML);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
tableElement
|
|||
|
|
.querySelector("thead")
|
|||
|
|
.insertAdjacentHTML("afterend", rowHTML + "</tr>");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
for (var m = oldRow - 1; m >= row; m--) {
|
|||
|
|
tableElement.rows[m].remove();
|
|||
|
|
if (tableElement.rows.length === 1) {
|
|||
|
|
tableElement.querySelector("tbody").remove();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (typeof vditor.options.input === "function") {
|
|||
|
|
vditor.options.input(getMarkdown(vditor));
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var setAlign_1 = function (type) {
|
|||
|
|
setTableAlign(tableElement, type);
|
|||
|
|
if (type === "right") {
|
|||
|
|
left_1.classList.remove("vditor-icon--current");
|
|||
|
|
center_1.classList.remove("vditor-icon--current");
|
|||
|
|
right_1.classList.add("vditor-icon--current");
|
|||
|
|
}
|
|||
|
|
else if (type === "center") {
|
|||
|
|
left_1.classList.remove("vditor-icon--current");
|
|||
|
|
right_1.classList.remove("vditor-icon--current");
|
|||
|
|
center_1.classList.add("vditor-icon--current");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
center_1.classList.remove("vditor-icon--current");
|
|||
|
|
right_1.classList.remove("vditor-icon--current");
|
|||
|
|
left_1.classList.add("vditor-icon--current");
|
|||
|
|
}
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
};
|
|||
|
|
var td = (0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "TD");
|
|||
|
|
var th = (0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "TH");
|
|||
|
|
var alignType = "left";
|
|||
|
|
if (td) {
|
|||
|
|
alignType = td.getAttribute("align") || "left";
|
|||
|
|
}
|
|||
|
|
else if (th) {
|
|||
|
|
alignType = th.getAttribute("align") || "center";
|
|||
|
|
}
|
|||
|
|
var left_1 = document.createElement("button");
|
|||
|
|
left_1.setAttribute("type", "button");
|
|||
|
|
left_1.setAttribute("aria-label", window.VditorI18n.alignLeft + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⇧⌘L") + ">");
|
|||
|
|
left_1.setAttribute("data-type", "left");
|
|||
|
|
left_1.innerHTML =
|
|||
|
|
'<svg><use xlink:href="#vditor-icon-align-left"></use></svg>';
|
|||
|
|
left_1.className =
|
|||
|
|
"vditor-icon vditor-tooltipped vditor-tooltipped__n" +
|
|||
|
|
(alignType === "left" ? " vditor-icon--current" : "");
|
|||
|
|
left_1.onclick = function () {
|
|||
|
|
setAlign_1("left");
|
|||
|
|
};
|
|||
|
|
var center_1 = document.createElement("button");
|
|||
|
|
center_1.setAttribute("type", "button");
|
|||
|
|
center_1.setAttribute("aria-label", window.VditorI18n.alignCenter + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⇧⌘C") + ">");
|
|||
|
|
center_1.setAttribute("data-type", "center");
|
|||
|
|
center_1.innerHTML =
|
|||
|
|
'<svg><use xlink:href="#vditor-icon-align-center"></use></svg>';
|
|||
|
|
center_1.className =
|
|||
|
|
"vditor-icon vditor-tooltipped vditor-tooltipped__n" +
|
|||
|
|
(alignType === "center" ? " vditor-icon--current" : "");
|
|||
|
|
center_1.onclick = function () {
|
|||
|
|
setAlign_1("center");
|
|||
|
|
};
|
|||
|
|
var right_1 = document.createElement("button");
|
|||
|
|
right_1.setAttribute("type", "button");
|
|||
|
|
right_1.setAttribute("aria-label", window.VditorI18n.alignRight + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⇧⌘R") + ">");
|
|||
|
|
right_1.setAttribute("data-type", "right");
|
|||
|
|
right_1.innerHTML =
|
|||
|
|
'<svg><use xlink:href="#vditor-icon-align-right"></use></svg>';
|
|||
|
|
right_1.className =
|
|||
|
|
"vditor-icon vditor-tooltipped vditor-tooltipped__n" +
|
|||
|
|
(alignType === "right" ? " vditor-icon--current" : "");
|
|||
|
|
right_1.onclick = function () {
|
|||
|
|
setAlign_1("right");
|
|||
|
|
};
|
|||
|
|
var insertRowElement = document.createElement("button");
|
|||
|
|
insertRowElement.setAttribute("type", "button");
|
|||
|
|
insertRowElement.setAttribute("aria-label", window.VditorI18n.insertRowBelow + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⌘=") + ">");
|
|||
|
|
insertRowElement.setAttribute("data-type", "insertRow");
|
|||
|
|
insertRowElement.innerHTML =
|
|||
|
|
'<svg><use xlink:href="#vditor-icon-insert-row"></use></svg>';
|
|||
|
|
insertRowElement.className =
|
|||
|
|
"vditor-icon vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
insertRowElement.onclick = function () {
|
|||
|
|
var startContainer = getSelection().getRangeAt(0)
|
|||
|
|
.startContainer;
|
|||
|
|
var cellElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TD") ||
|
|||
|
|
(0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TH");
|
|||
|
|
if (cellElement) {
|
|||
|
|
insertRow(vditor, range, cellElement);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var insertRowBElement = document.createElement("button");
|
|||
|
|
insertRowBElement.setAttribute("type", "button");
|
|||
|
|
insertRowBElement.setAttribute("aria-label", window.VditorI18n.insertRowAbove + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⇧⌘F") + ">");
|
|||
|
|
insertRowBElement.setAttribute("data-type", "insertRow");
|
|||
|
|
insertRowBElement.innerHTML =
|
|||
|
|
'<svg><use xlink:href="#vditor-icon-insert-rowb"></use></svg>';
|
|||
|
|
insertRowBElement.className =
|
|||
|
|
"vditor-icon vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
insertRowBElement.onclick = function () {
|
|||
|
|
var startContainer = getSelection().getRangeAt(0)
|
|||
|
|
.startContainer;
|
|||
|
|
var cellElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TD") ||
|
|||
|
|
(0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TH");
|
|||
|
|
if (cellElement) {
|
|||
|
|
insertRowAbove(vditor, range, cellElement);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var insertColumnElement = document.createElement("button");
|
|||
|
|
insertColumnElement.setAttribute("type", "button");
|
|||
|
|
insertColumnElement.setAttribute("aria-label", window.VditorI18n.insertColumnRight + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⇧⌘=") + ">");
|
|||
|
|
insertColumnElement.setAttribute("data-type", "insertColumn");
|
|||
|
|
insertColumnElement.innerHTML =
|
|||
|
|
'<svg><use xlink:href="#vditor-icon-insert-column"></use></svg>';
|
|||
|
|
insertColumnElement.className =
|
|||
|
|
"vditor-icon vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
insertColumnElement.onclick = function () {
|
|||
|
|
var startContainer = getSelection().getRangeAt(0)
|
|||
|
|
.startContainer;
|
|||
|
|
var cellElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TD") ||
|
|||
|
|
(0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TH");
|
|||
|
|
if (cellElement) {
|
|||
|
|
insertColumn(vditor, tableElement, cellElement);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var insertColumnBElement = document.createElement("button");
|
|||
|
|
insertColumnBElement.setAttribute("type", "button");
|
|||
|
|
insertColumnBElement.setAttribute("aria-label", window.VditorI18n.insertColumnLeft + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⇧⌘G") + ">");
|
|||
|
|
insertColumnBElement.setAttribute("data-type", "insertColumn");
|
|||
|
|
insertColumnBElement.innerHTML =
|
|||
|
|
'<svg><use xlink:href="#vditor-icon-insert-columnb"></use></svg>';
|
|||
|
|
insertColumnBElement.className =
|
|||
|
|
"vditor-icon vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
insertColumnBElement.onclick = function () {
|
|||
|
|
var startContainer = getSelection().getRangeAt(0)
|
|||
|
|
.startContainer;
|
|||
|
|
var cellElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TD") ||
|
|||
|
|
(0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TH");
|
|||
|
|
if (cellElement) {
|
|||
|
|
insertColumn(vditor, tableElement, cellElement, "beforebegin");
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var deleteRowElement = document.createElement("button");
|
|||
|
|
deleteRowElement.setAttribute("type", "button");
|
|||
|
|
deleteRowElement.setAttribute("aria-label", window.VditorI18n["delete-row"] + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⌘-") + ">");
|
|||
|
|
deleteRowElement.setAttribute("data-type", "deleteRow");
|
|||
|
|
deleteRowElement.innerHTML =
|
|||
|
|
'<svg><use xlink:href="#vditor-icon-delete-row"></use></svg>';
|
|||
|
|
deleteRowElement.className =
|
|||
|
|
"vditor-icon vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
deleteRowElement.onclick = function () {
|
|||
|
|
var startContainer = getSelection().getRangeAt(0)
|
|||
|
|
.startContainer;
|
|||
|
|
var cellElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TD") ||
|
|||
|
|
(0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TH");
|
|||
|
|
if (cellElement) {
|
|||
|
|
deleteRow(vditor, range, cellElement);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var deleteColumnElement = document.createElement("button");
|
|||
|
|
deleteColumnElement.setAttribute("type", "button");
|
|||
|
|
deleteColumnElement.setAttribute("aria-label", window.VditorI18n["delete-column"] + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⇧⌘-") + ">");
|
|||
|
|
deleteColumnElement.setAttribute("data-type", "deleteColumn");
|
|||
|
|
deleteColumnElement.innerHTML =
|
|||
|
|
'<svg><use xlink:href="#vditor-icon-delete-column"></use></svg>';
|
|||
|
|
deleteColumnElement.className =
|
|||
|
|
"vditor-icon vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
deleteColumnElement.onclick = function () {
|
|||
|
|
var startContainer = getSelection().getRangeAt(0)
|
|||
|
|
.startContainer;
|
|||
|
|
var cellElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TD") ||
|
|||
|
|
(0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TH");
|
|||
|
|
if (cellElement) {
|
|||
|
|
deleteColumn(vditor, range, tableElement, cellElement);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var inputWrap = document.createElement("span");
|
|||
|
|
inputWrap.setAttribute("aria-label", window.VditorI18n.row);
|
|||
|
|
inputWrap.className = "vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
var input_1 = document.createElement("input");
|
|||
|
|
inputWrap.appendChild(input_1);
|
|||
|
|
input_1.type = "number";
|
|||
|
|
input_1.min = "1";
|
|||
|
|
input_1.className = "vditor-input";
|
|||
|
|
input_1.style.width = "42px";
|
|||
|
|
input_1.style.textAlign = "center";
|
|||
|
|
input_1.setAttribute("placeholder", window.VditorI18n.row);
|
|||
|
|
input_1.value = tableElement.rows.length.toString();
|
|||
|
|
input_1.oninput = function () {
|
|||
|
|
updateTable_1();
|
|||
|
|
};
|
|||
|
|
input_1.onkeydown = function (event) {
|
|||
|
|
if (event.isComposing) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (event.key === "Tab") {
|
|||
|
|
input2_1.focus();
|
|||
|
|
input2_1.select();
|
|||
|
|
event.preventDefault();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (removeBlockElement(vditor, event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (focusToElement(event, range)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var input2Wrap = document.createElement("span");
|
|||
|
|
input2Wrap.setAttribute("aria-label", window.VditorI18n.column);
|
|||
|
|
input2Wrap.className = "vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
var input2_1 = document.createElement("input");
|
|||
|
|
input2Wrap.appendChild(input2_1);
|
|||
|
|
input2_1.type = "number";
|
|||
|
|
input2_1.min = "1";
|
|||
|
|
input2_1.className = "vditor-input";
|
|||
|
|
input2_1.style.width = "42px";
|
|||
|
|
input2_1.style.textAlign = "center";
|
|||
|
|
input2_1.setAttribute("placeholder", window.VditorI18n.column);
|
|||
|
|
input2_1.value = tableElement.rows[0].cells.length.toString();
|
|||
|
|
input2_1.oninput = function () {
|
|||
|
|
updateTable_1();
|
|||
|
|
};
|
|||
|
|
input2_1.onkeydown = function (event) {
|
|||
|
|
if (event.isComposing) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (event.key === "Tab") {
|
|||
|
|
input_1.focus();
|
|||
|
|
input_1.select();
|
|||
|
|
event.preventDefault();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (removeBlockElement(vditor, event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (focusToElement(event, range)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
genUp(range, tableElement, vditor);
|
|||
|
|
genDown(range, tableElement, vditor);
|
|||
|
|
genClose(tableElement, vditor);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", left_1);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", center_1);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", right_1);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", insertRowBElement);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", insertRowElement);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", insertColumnBElement);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", insertColumnElement);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", deleteRowElement);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", deleteColumnElement);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", inputWrap);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentHTML("beforeend", " x ");
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", input2Wrap);
|
|||
|
|
customWysiwygToolbar(vditor, "table");
|
|||
|
|
setPopoverPosition(vditor, tableElement);
|
|||
|
|
}
|
|||
|
|
// link ref popover
|
|||
|
|
var linkRefElement = (0,hasClosest/* hasClosestByAttribute */.a1)(typeElement, "data-type", "link-ref");
|
|||
|
|
if (linkRefElement) {
|
|||
|
|
genLinkRefPopover(vditor, linkRefElement, range);
|
|||
|
|
}
|
|||
|
|
// footnote popover
|
|||
|
|
var footnotesRefElement = (0,hasClosest/* hasClosestByAttribute */.a1)(typeElement, "data-type", "footnotes-ref");
|
|||
|
|
if (footnotesRefElement) {
|
|||
|
|
var lang = vditor.options.lang;
|
|||
|
|
var options = vditor.options;
|
|||
|
|
vditor.wysiwyg.popover.innerHTML = "";
|
|||
|
|
var inputWrap = document.createElement("span");
|
|||
|
|
inputWrap.setAttribute("aria-label", window.VditorI18n.footnoteRef + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⌥Enter") + ">");
|
|||
|
|
inputWrap.className = "vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
var input_2 = document.createElement("input");
|
|||
|
|
inputWrap.appendChild(input_2);
|
|||
|
|
input_2.className = "vditor-input";
|
|||
|
|
input_2.setAttribute("placeholder", window.VditorI18n.footnoteRef + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⌥Enter") + ">");
|
|||
|
|
input_2.style.width = "120px";
|
|||
|
|
input_2.value = footnotesRefElement.getAttribute("data-footnotes-label");
|
|||
|
|
input_2.oninput = function () {
|
|||
|
|
if (input_2.value.trim() !== "") {
|
|||
|
|
footnotesRefElement.setAttribute("data-footnotes-label", input_2.value);
|
|||
|
|
}
|
|||
|
|
if (typeof vditor.options.input === "function") {
|
|||
|
|
vditor.options.input(getMarkdown(vditor));
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
input_2.onkeydown = function (event) {
|
|||
|
|
if (event.isComposing) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (removeBlockElement(vditor, event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (focusToElement(event, range)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
genClose(footnotesRefElement, vditor);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", inputWrap);
|
|||
|
|
customWysiwygToolbar(vditor, "footnotes-ref");
|
|||
|
|
setPopoverPosition(vditor, footnotesRefElement);
|
|||
|
|
}
|
|||
|
|
// block popover: math-inline, math-block, html-block, html-inline, code-block, html-entity
|
|||
|
|
var blockRenderElement = (0,hasClosest/* hasClosestByClassName */.fb)(typeElement, "vditor-wysiwyg__block");
|
|||
|
|
var isBlock = blockRenderElement ? blockRenderElement.getAttribute("data-type").indexOf("block") > -1 : false;
|
|||
|
|
vditor.wysiwyg.element
|
|||
|
|
.querySelectorAll(".vditor-wysiwyg__preview")
|
|||
|
|
.forEach(function (itemElement) {
|
|||
|
|
if (!blockRenderElement || (blockRenderElement && isBlock && !blockRenderElement.contains(itemElement))) {
|
|||
|
|
var previousElement = itemElement.previousElementSibling;
|
|||
|
|
previousElement.style.display = "none";
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (blockRenderElement && isBlock) {
|
|||
|
|
vditor.wysiwyg.popover.innerHTML = "";
|
|||
|
|
genUp(range, blockRenderElement, vditor);
|
|||
|
|
genDown(range, blockRenderElement, vditor);
|
|||
|
|
genClose(blockRenderElement, vditor);
|
|||
|
|
if (blockRenderElement.getAttribute("data-type") === "code-block") {
|
|||
|
|
var languageWrap = document.createElement("span");
|
|||
|
|
languageWrap.setAttribute("aria-label", window.VditorI18n.language + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⌥Enter") + ">");
|
|||
|
|
languageWrap.className = "vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
var language_1 = document.createElement("input");
|
|||
|
|
languageWrap.appendChild(language_1);
|
|||
|
|
var codeElement_1 = blockRenderElement.firstElementChild.firstElementChild;
|
|||
|
|
language_1.className = "vditor-input";
|
|||
|
|
language_1.setAttribute("placeholder", window.VditorI18n.language + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⌥Enter") + ">");
|
|||
|
|
language_1.value =
|
|||
|
|
codeElement_1.className.indexOf("language-") > -1
|
|||
|
|
? codeElement_1.className.split("-")[1].split(" ")[0]
|
|||
|
|
: "";
|
|||
|
|
language_1.oninput = function (e) {
|
|||
|
|
if (language_1.value.trim() !== "") {
|
|||
|
|
codeElement_1.className = "language-".concat(language_1.value);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
codeElement_1.className = "";
|
|||
|
|
vditor.hint.recentLanguage = "";
|
|||
|
|
}
|
|||
|
|
if (blockRenderElement.lastElementChild.classList.contains("vditor-wysiwyg__preview")) {
|
|||
|
|
blockRenderElement.lastElementChild.innerHTML =
|
|||
|
|
blockRenderElement.firstElementChild.innerHTML;
|
|||
|
|
processCodeRender(blockRenderElement.lastElementChild, vditor);
|
|||
|
|
}
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
// 当鼠标点选语言时,触发自定义input事件
|
|||
|
|
if (e.detail === 1) {
|
|||
|
|
// 选择语言后,输入焦点切换到代码输入框
|
|||
|
|
range.setStart(codeElement_1.firstChild, 0);
|
|||
|
|
range.collapse(true);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
language_1.onkeydown = function (event) {
|
|||
|
|
if (event.isComposing) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (removeBlockElement(vditor, event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (event.key === "Escape" &&
|
|||
|
|
vditor.hint.element.style.display === "block") {
|
|||
|
|
vditor.hint.element.style.display = "none";
|
|||
|
|
event.preventDefault();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
vditor.hint.select(event, vditor);
|
|||
|
|
focusToElement(event, range);
|
|||
|
|
};
|
|||
|
|
language_1.onkeyup = function (event) {
|
|||
|
|
var _a, _b;
|
|||
|
|
if (event.isComposing ||
|
|||
|
|
event.key === "Enter" ||
|
|||
|
|
event.key === "ArrowUp" ||
|
|||
|
|
event.key === "Escape" ||
|
|||
|
|
event.key === "ArrowDown") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var matchLangData = [];
|
|||
|
|
var key = language_1.value.substring(0, language_1.selectionStart);
|
|||
|
|
(vditor.options.preview.hljs.langs || constants/* Constants.ALIAS_CODE_LANGUAGES.concat */.g.ALIAS_CODE_LANGUAGES.concat(((_b = (_a = window.hljs) === null || _a === void 0 ? void 0 : _a.listLanguages()) !== null && _b !== void 0 ? _b : []).sort())).forEach(function (keyName) {
|
|||
|
|
if (keyName.indexOf(key.toLowerCase()) > -1) {
|
|||
|
|
matchLangData.push({
|
|||
|
|
html: keyName,
|
|||
|
|
value: keyName,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
vditor.hint.genHTML(matchLangData, key, vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
};
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", languageWrap);
|
|||
|
|
customWysiwygToolbar(vditor, "code-block");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
customWysiwygToolbar(vditor, "block");
|
|||
|
|
}
|
|||
|
|
setPopoverPosition(vditor, blockRenderElement);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
blockRenderElement = undefined;
|
|||
|
|
}
|
|||
|
|
if (headingElement) {
|
|||
|
|
vditor.wysiwyg.popover.innerHTML = "";
|
|||
|
|
var inputWrap = document.createElement("span");
|
|||
|
|
inputWrap.setAttribute("aria-label", "ID" + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⌥Enter") + ">");
|
|||
|
|
inputWrap.className = "vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
var input_3 = document.createElement("input");
|
|||
|
|
inputWrap.appendChild(input_3);
|
|||
|
|
input_3.className = "vditor-input";
|
|||
|
|
input_3.setAttribute("placeholder", "ID" + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⌥Enter") + ">");
|
|||
|
|
input_3.style.width = "120px";
|
|||
|
|
input_3.value = headingElement.getAttribute("data-id") || "";
|
|||
|
|
input_3.oninput = function () {
|
|||
|
|
headingElement.setAttribute("data-id", input_3.value);
|
|||
|
|
if (typeof vditor.options.input === "function") {
|
|||
|
|
vditor.options.input(getMarkdown(vditor));
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
input_3.onkeydown = function (event) {
|
|||
|
|
if (event.isComposing) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (removeBlockElement(vditor, event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (focusToElement(event, range)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
genUp(range, headingElement, vditor);
|
|||
|
|
genDown(range, headingElement, vditor);
|
|||
|
|
genClose(headingElement, vditor);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", inputWrap);
|
|||
|
|
customWysiwygToolbar(vditor, "heading");
|
|||
|
|
setPopoverPosition(vditor, headingElement);
|
|||
|
|
}
|
|||
|
|
// a popover
|
|||
|
|
if (aElement) {
|
|||
|
|
genAPopover(vditor, aElement, range);
|
|||
|
|
}
|
|||
|
|
if (!blockquoteElement &&
|
|||
|
|
!liElement &&
|
|||
|
|
!tableElement &&
|
|||
|
|
!blockRenderElement &&
|
|||
|
|
!aElement &&
|
|||
|
|
!linkRefElement &&
|
|||
|
|
!footnotesRefElement &&
|
|||
|
|
!headingElement &&
|
|||
|
|
!tocElement) {
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestByAttribute */.a1)(typeElement, "data-block", "0");
|
|||
|
|
if (blockElement &&
|
|||
|
|
blockElement.parentElement.isEqualNode(vditor.wysiwyg.element)) {
|
|||
|
|
vditor.wysiwyg.popover.innerHTML = "";
|
|||
|
|
genUp(range, blockElement, vditor);
|
|||
|
|
genDown(range, blockElement, vditor);
|
|||
|
|
genClose(blockElement, vditor);
|
|||
|
|
customWysiwygToolbar(vditor, "block");
|
|||
|
|
setPopoverPosition(vditor, blockElement);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.wysiwyg.popover.style.display = "none";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 反斜杠特殊处理
|
|||
|
|
vditor.wysiwyg.element
|
|||
|
|
.querySelectorAll('span[data-type="backslash"] > span')
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
item.style.display = "none";
|
|||
|
|
});
|
|||
|
|
var backslashElement = (0,hasClosest/* hasClosestByAttribute */.a1)(range.startContainer, "data-type", "backslash");
|
|||
|
|
if (backslashElement) {
|
|||
|
|
backslashElement.querySelector("span").style.display = "inline";
|
|||
|
|
}
|
|||
|
|
}, 200);
|
|||
|
|
};
|
|||
|
|
var setPopoverPosition = function (vditor, element) {
|
|||
|
|
var targetElement = element;
|
|||
|
|
var tableElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(element, "TABLE");
|
|||
|
|
if (tableElement) {
|
|||
|
|
targetElement = tableElement;
|
|||
|
|
}
|
|||
|
|
vditor.wysiwyg.popover.style.left = "0";
|
|||
|
|
vditor.wysiwyg.popover.style.display = "block";
|
|||
|
|
vditor.wysiwyg.popover.style.top =
|
|||
|
|
Math.max(-8, targetElement.offsetTop - 21 - vditor.wysiwyg.element.scrollTop) + "px";
|
|||
|
|
vditor.wysiwyg.popover.style.left =
|
|||
|
|
Math.min(targetElement.offsetLeft, vditor.wysiwyg.element.clientWidth - vditor.wysiwyg.popover.clientWidth) + "px";
|
|||
|
|
vditor.wysiwyg.popover.setAttribute("data-top", (targetElement.offsetTop - 21).toString());
|
|||
|
|
};
|
|||
|
|
var genLinkRefPopover = function (vditor, linkRefElement, range) {
|
|||
|
|
if (range === void 0) { range = getSelection().getRangeAt(0); }
|
|||
|
|
vditor.wysiwyg.popover.innerHTML = "";
|
|||
|
|
var updateLinkRef = function () {
|
|||
|
|
if (input.value.trim() !== "") {
|
|||
|
|
if (linkRefElement.tagName === "IMG") {
|
|||
|
|
linkRefElement.setAttribute("alt", input.value);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
linkRefElement.textContent = input.value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// data-link-label
|
|||
|
|
if (input1.value.trim() !== "") {
|
|||
|
|
linkRefElement.setAttribute("data-link-label", input1.value);
|
|||
|
|
}
|
|||
|
|
if (typeof vditor.options.input === "function") {
|
|||
|
|
vditor.options.input(getMarkdown(vditor));
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var inputWrap = document.createElement("span");
|
|||
|
|
inputWrap.setAttribute("aria-label", window.VditorI18n.textIsNotEmpty);
|
|||
|
|
inputWrap.className = "vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
var input = document.createElement("input");
|
|||
|
|
inputWrap.appendChild(input);
|
|||
|
|
input.className = "vditor-input";
|
|||
|
|
input.setAttribute("placeholder", window.VditorI18n.textIsNotEmpty);
|
|||
|
|
input.style.width = "120px";
|
|||
|
|
input.value =
|
|||
|
|
linkRefElement.getAttribute("alt") || linkRefElement.textContent;
|
|||
|
|
input.oninput = function () {
|
|||
|
|
updateLinkRef();
|
|||
|
|
};
|
|||
|
|
input.onkeydown = function (event) {
|
|||
|
|
if (removeBlockElement(vditor, event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (focusToElement(event, range)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
linkHotkey(vditor, linkRefElement, event, input1);
|
|||
|
|
};
|
|||
|
|
var input1Wrap = document.createElement("span");
|
|||
|
|
input1Wrap.setAttribute("aria-label", window.VditorI18n.linkRef);
|
|||
|
|
input1Wrap.className = "vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
var input1 = document.createElement("input");
|
|||
|
|
input1Wrap.appendChild(input1);
|
|||
|
|
input1.className = "vditor-input";
|
|||
|
|
input1.setAttribute("placeholder", window.VditorI18n.linkRef);
|
|||
|
|
input1.value = linkRefElement.getAttribute("data-link-label");
|
|||
|
|
input1.oninput = function () {
|
|||
|
|
updateLinkRef();
|
|||
|
|
};
|
|||
|
|
input1.onkeydown = function (event) {
|
|||
|
|
if (removeBlockElement(vditor, event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (focusToElement(event, range)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
linkHotkey(vditor, linkRefElement, event, input);
|
|||
|
|
};
|
|||
|
|
genClose(linkRefElement, vditor);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", inputWrap);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", input1Wrap);
|
|||
|
|
customWysiwygToolbar(vditor, "link-ref");
|
|||
|
|
setPopoverPosition(vditor, linkRefElement);
|
|||
|
|
};
|
|||
|
|
var genUp = function (range, element, vditor) {
|
|||
|
|
var previousElement = element.previousElementSibling;
|
|||
|
|
if (!previousElement ||
|
|||
|
|
(!element.parentElement.isEqualNode(vditor.wysiwyg.element) &&
|
|||
|
|
element.tagName !== "LI")) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var upElement = document.createElement("button");
|
|||
|
|
upElement.setAttribute("type", "button");
|
|||
|
|
upElement.setAttribute("data-type", "up");
|
|||
|
|
upElement.setAttribute("aria-label", window.VditorI18n.up + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⇧⌘U") + ">");
|
|||
|
|
upElement.innerHTML = '<svg><use xlink:href="#vditor-icon-up"></use></svg>';
|
|||
|
|
upElement.className = "vditor-icon vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
upElement.onclick = function () {
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
previousElement.insertAdjacentElement("beforebegin", element);
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
highlightToolbarWYSIWYG(vditor);
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
};
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", upElement);
|
|||
|
|
};
|
|||
|
|
var genDown = function (range, element, vditor) {
|
|||
|
|
var nextElement = element.nextElementSibling;
|
|||
|
|
if (!nextElement ||
|
|||
|
|
(!element.parentElement.isEqualNode(vditor.wysiwyg.element) &&
|
|||
|
|
element.tagName !== "LI")) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var downElement = document.createElement("button");
|
|||
|
|
downElement.setAttribute("type", "button");
|
|||
|
|
downElement.setAttribute("data-type", "down");
|
|||
|
|
downElement.setAttribute("aria-label", window.VditorI18n.down + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⇧⌘D") + ">");
|
|||
|
|
downElement.innerHTML =
|
|||
|
|
'<svg><use xlink:href="#vditor-icon-down"></use></svg>';
|
|||
|
|
downElement.className =
|
|||
|
|
"vditor-icon vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
downElement.onclick = function () {
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
nextElement.insertAdjacentElement("afterend", element);
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
highlightToolbarWYSIWYG(vditor);
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
};
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", downElement);
|
|||
|
|
};
|
|||
|
|
var genClose = function (element, vditor) {
|
|||
|
|
var close = document.createElement("button");
|
|||
|
|
close.setAttribute("type", "button");
|
|||
|
|
close.setAttribute("data-type", "remove");
|
|||
|
|
close.setAttribute("aria-label", window.VditorI18n.remove + "<" + (0,compatibility/* updateHotkeyTip */.ns)("⇧⌘X") + ">");
|
|||
|
|
close.innerHTML =
|
|||
|
|
'<svg><use xlink:href="#vditor-icon-trashcan"></use></svg>';
|
|||
|
|
close.className = "vditor-icon vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
close.onclick = function () {
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
range.setStartAfter(element);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
element.remove();
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
highlightToolbarWYSIWYG(vditor);
|
|||
|
|
if (["H1", "H2", "H3", "H4", "H5", "H6"].includes(element.tagName)) {
|
|||
|
|
renderToc(vditor);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", close);
|
|||
|
|
};
|
|||
|
|
var linkHotkey = function (vditor, element, event, nextInputElement) {
|
|||
|
|
if (event.isComposing) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (event.key === "Tab") {
|
|||
|
|
nextInputElement.focus();
|
|||
|
|
nextInputElement.select();
|
|||
|
|
event.preventDefault();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (!(0,compatibility/* isCtrl */.yl)(event) &&
|
|||
|
|
!event.shiftKey &&
|
|||
|
|
event.altKey &&
|
|||
|
|
event.key === "Enter") {
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
// firefox 不会打断 link https://github.com/Vanessa219/vditor/issues/193
|
|||
|
|
element.insertAdjacentHTML("afterend", constants/* Constants.ZWSP */.g.ZWSP);
|
|||
|
|
range.setStartAfter(element.nextSibling);
|
|||
|
|
range.collapse(true);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
event.preventDefault();
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var genAPopover = function (vditor, aElement, range) {
|
|||
|
|
vditor.wysiwyg.popover.innerHTML = "";
|
|||
|
|
var updateA = function () {
|
|||
|
|
if (input.value.trim() !== "") {
|
|||
|
|
aElement.innerHTML = input.value;
|
|||
|
|
}
|
|||
|
|
aElement.setAttribute("href", input1.value);
|
|||
|
|
aElement.setAttribute("title", input2.value);
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
};
|
|||
|
|
aElement.querySelectorAll("[data-marker]").forEach(function (item) {
|
|||
|
|
item.removeAttribute("data-marker");
|
|||
|
|
});
|
|||
|
|
var inputWrap = document.createElement("span");
|
|||
|
|
inputWrap.setAttribute("aria-label", window.VditorI18n.textIsNotEmpty);
|
|||
|
|
inputWrap.className = "vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
var input = document.createElement("input");
|
|||
|
|
inputWrap.appendChild(input);
|
|||
|
|
input.className = "vditor-input";
|
|||
|
|
input.setAttribute("placeholder", window.VditorI18n.textIsNotEmpty);
|
|||
|
|
input.style.width = "120px";
|
|||
|
|
input.value = aElement.innerHTML || "";
|
|||
|
|
input.oninput = function () {
|
|||
|
|
updateA();
|
|||
|
|
};
|
|||
|
|
input.onkeydown = function (event) {
|
|||
|
|
if (removeBlockElement(vditor, event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (focusToElement(event, range)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
linkHotkey(vditor, aElement, event, input1);
|
|||
|
|
};
|
|||
|
|
var input1Wrap = document.createElement("span");
|
|||
|
|
input1Wrap.setAttribute("aria-label", window.VditorI18n.link);
|
|||
|
|
input1Wrap.className = "vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
var input1 = document.createElement("input");
|
|||
|
|
input1Wrap.appendChild(input1);
|
|||
|
|
input1.className = "vditor-input";
|
|||
|
|
input1.setAttribute("placeholder", window.VditorI18n.link);
|
|||
|
|
input1.value = aElement.getAttribute("href") || "";
|
|||
|
|
input1.oninput = function () {
|
|||
|
|
updateA();
|
|||
|
|
};
|
|||
|
|
input1.onkeydown = function (event) {
|
|||
|
|
if (removeBlockElement(vditor, event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (focusToElement(event, range)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
linkHotkey(vditor, aElement, event, input2);
|
|||
|
|
};
|
|||
|
|
var input2Wrap = document.createElement("span");
|
|||
|
|
input2Wrap.setAttribute("aria-label", window.VditorI18n.tooltipText);
|
|||
|
|
input2Wrap.className = "vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
var input2 = document.createElement("input");
|
|||
|
|
input2Wrap.appendChild(input2);
|
|||
|
|
input2.className = "vditor-input";
|
|||
|
|
input2.setAttribute("placeholder", window.VditorI18n.tooltipText);
|
|||
|
|
input2.style.width = "60px";
|
|||
|
|
input2.value = aElement.getAttribute("title") || "";
|
|||
|
|
input2.oninput = function () {
|
|||
|
|
updateA();
|
|||
|
|
};
|
|||
|
|
input2.onkeydown = function (event) {
|
|||
|
|
if (removeBlockElement(vditor, event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (focusToElement(event, range)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
linkHotkey(vditor, aElement, event, input);
|
|||
|
|
};
|
|||
|
|
genClose(aElement, vditor);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", inputWrap);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", input1Wrap);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", input2Wrap);
|
|||
|
|
customWysiwygToolbar(vditor, "a");
|
|||
|
|
setPopoverPosition(vditor, aElement);
|
|||
|
|
};
|
|||
|
|
var genImagePopover = function (event, vditor) {
|
|||
|
|
var imgElement = event.target;
|
|||
|
|
vditor.wysiwyg.popover.innerHTML = "";
|
|||
|
|
var updateImg = function () {
|
|||
|
|
imgElement.setAttribute("src", inputElement.value);
|
|||
|
|
imgElement.setAttribute("alt", alt.value);
|
|||
|
|
imgElement.setAttribute("title", title.value);
|
|||
|
|
if (typeof vditor.options.input === "function") {
|
|||
|
|
vditor.options.input(getMarkdown(vditor));
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var inputWrap = document.createElement("span");
|
|||
|
|
inputWrap.setAttribute("aria-label", window.VditorI18n.imageURL);
|
|||
|
|
inputWrap.className = "vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
var inputElement = document.createElement("input");
|
|||
|
|
inputWrap.appendChild(inputElement);
|
|||
|
|
inputElement.className = "vditor-input";
|
|||
|
|
inputElement.setAttribute("placeholder", window.VditorI18n.imageURL);
|
|||
|
|
inputElement.value = imgElement.getAttribute("src") || "";
|
|||
|
|
inputElement.oninput = function () {
|
|||
|
|
updateImg();
|
|||
|
|
};
|
|||
|
|
inputElement.onkeydown = function (elementEvent) {
|
|||
|
|
removeBlockElement(vditor, elementEvent);
|
|||
|
|
};
|
|||
|
|
var altWrap = document.createElement("span");
|
|||
|
|
altWrap.setAttribute("aria-label", window.VditorI18n.alternateText);
|
|||
|
|
altWrap.className = "vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
var alt = document.createElement("input");
|
|||
|
|
altWrap.appendChild(alt);
|
|||
|
|
alt.className = "vditor-input";
|
|||
|
|
alt.setAttribute("placeholder", window.VditorI18n.alternateText);
|
|||
|
|
alt.style.width = "52px";
|
|||
|
|
alt.value = imgElement.getAttribute("alt") || "";
|
|||
|
|
alt.oninput = function () {
|
|||
|
|
updateImg();
|
|||
|
|
};
|
|||
|
|
alt.onkeydown = function (elementEvent) {
|
|||
|
|
removeBlockElement(vditor, elementEvent);
|
|||
|
|
};
|
|||
|
|
var titleWrap = document.createElement("span");
|
|||
|
|
titleWrap.setAttribute("aria-label", window.VditorI18n.title);
|
|||
|
|
titleWrap.className = "vditor-tooltipped vditor-tooltipped__n";
|
|||
|
|
var title = document.createElement("input");
|
|||
|
|
titleWrap.appendChild(title);
|
|||
|
|
title.className = "vditor-input";
|
|||
|
|
title.setAttribute("placeholder", window.VditorI18n.title);
|
|||
|
|
title.value = imgElement.getAttribute("title") || "";
|
|||
|
|
title.oninput = function () {
|
|||
|
|
updateImg();
|
|||
|
|
};
|
|||
|
|
title.onkeydown = function (elementEvent) {
|
|||
|
|
removeBlockElement(vditor, elementEvent);
|
|||
|
|
};
|
|||
|
|
genClose(imgElement, vditor);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", inputWrap);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", altWrap);
|
|||
|
|
vditor.wysiwyg.popover.insertAdjacentElement("beforeend", titleWrap);
|
|||
|
|
customWysiwygToolbar(vditor, "image");
|
|||
|
|
setPopoverPosition(vditor, imgElement);
|
|||
|
|
};
|
|||
|
|
var focusToElement = function (event, range) {
|
|||
|
|
if ((!(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey && event.key === "Enter") || event.key === "Escape") {
|
|||
|
|
if (range) {
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
event.stopPropagation();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var customWysiwygToolbar = function (vditor, type) {
|
|||
|
|
vditor.options.customWysiwygToolbar(type, vditor.wysiwyg.popover);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/util/highlightToolbar.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
var highlightToolbar = function (vditor) {
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
highlightToolbarWYSIWYG(vditor);
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "ir") {
|
|||
|
|
highlightToolbarIR(vditor);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/wysiwyg/renderDomByMd.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
var renderDomByMd = function (vditor, md, options) {
|
|||
|
|
if (options === void 0) { options = {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: false,
|
|||
|
|
enableInput: true,
|
|||
|
|
}; }
|
|||
|
|
var editorElement = vditor.wysiwyg.element;
|
|||
|
|
editorElement.innerHTML = vditor.lute.Md2VditorDOM(md);
|
|||
|
|
editorElement.querySelectorAll(".vditor-wysiwyg__preview[data-render='2']").forEach(function (item) {
|
|||
|
|
processCodeRender(item, vditor);
|
|||
|
|
item.previousElementSibling.setAttribute("style", "display:none");
|
|||
|
|
});
|
|||
|
|
afterRenderEvent(vditor, options);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/wysiwyg/toolbarEvent.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var cancelBES = function (range, vditor, commandName) {
|
|||
|
|
var element = range.startContainer.parentElement;
|
|||
|
|
var jump = false;
|
|||
|
|
var lastTagName = "";
|
|||
|
|
var lastEndTagName = "";
|
|||
|
|
var splitHTML = splitElement(range);
|
|||
|
|
var lastBeforeHTML = splitHTML.beforeHTML;
|
|||
|
|
var lastAfterHTML = splitHTML.afterHTML;
|
|||
|
|
while (element && !jump) {
|
|||
|
|
var tagName = element.tagName;
|
|||
|
|
if (tagName === "STRIKE") {
|
|||
|
|
tagName = "S";
|
|||
|
|
}
|
|||
|
|
if (tagName === "I") {
|
|||
|
|
tagName = "EM";
|
|||
|
|
}
|
|||
|
|
if (tagName === "B") {
|
|||
|
|
tagName = "STRONG";
|
|||
|
|
}
|
|||
|
|
if (tagName === "S" || tagName === "STRONG" || tagName === "EM") {
|
|||
|
|
var insertHTML = "";
|
|||
|
|
var previousHTML = "";
|
|||
|
|
var nextHTML = "";
|
|||
|
|
if (element.parentElement.getAttribute("data-block") !== "0") {
|
|||
|
|
previousHTML = getPreviousHTML(element);
|
|||
|
|
nextHTML = getNextHTML(element);
|
|||
|
|
}
|
|||
|
|
if (lastBeforeHTML || previousHTML) {
|
|||
|
|
insertHTML = "".concat(previousHTML, "<").concat(tagName, ">").concat(lastBeforeHTML, "</").concat(tagName, ">");
|
|||
|
|
lastBeforeHTML = insertHTML;
|
|||
|
|
}
|
|||
|
|
if ((commandName === "bold" && tagName === "STRONG") ||
|
|||
|
|
(commandName === "italic" && tagName === "EM") ||
|
|||
|
|
(commandName === "strikeThrough" && tagName === "S")) {
|
|||
|
|
// 取消
|
|||
|
|
insertHTML += "".concat(lastTagName).concat(constants/* Constants.ZWSP */.g.ZWSP, "<wbr>").concat(lastEndTagName);
|
|||
|
|
jump = true;
|
|||
|
|
}
|
|||
|
|
if (lastAfterHTML || nextHTML) {
|
|||
|
|
lastAfterHTML = "<".concat(tagName, ">").concat(lastAfterHTML, "</").concat(tagName, ">").concat(nextHTML);
|
|||
|
|
insertHTML += lastAfterHTML;
|
|||
|
|
}
|
|||
|
|
if (element.parentElement.getAttribute("data-block") !== "0") {
|
|||
|
|
element = element.parentElement;
|
|||
|
|
element.innerHTML = insertHTML;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
element.outerHTML = insertHTML;
|
|||
|
|
element = element.parentElement;
|
|||
|
|
}
|
|||
|
|
lastTagName = "<".concat(tagName, ">") + lastTagName;
|
|||
|
|
lastEndTagName = "</".concat(tagName, ">") + lastEndTagName;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
jump = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
};
|
|||
|
|
var toolbarEvent = function (vditor, actionBtn, event) {
|
|||
|
|
if (vditor.wysiwyg.composingLock // Mac Chrome 中韩文结束会出发此事件,导致重复末尾字符 https://github.com/Vanessa219/vditor/issues/188
|
|||
|
|
&& event instanceof CustomEvent // 点击按钮应忽略输入法 https://github.com/Vanessa219/vditor/issues/473
|
|||
|
|
) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var useHighlight = true;
|
|||
|
|
var useRender = true;
|
|||
|
|
if (vditor.wysiwyg.element.querySelector("wbr")) {
|
|||
|
|
vditor.wysiwyg.element.querySelector("wbr").remove();
|
|||
|
|
}
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
var commandName = actionBtn.getAttribute("data-type");
|
|||
|
|
// 移除
|
|||
|
|
if (actionBtn.classList.contains("vditor-menu--current")) {
|
|||
|
|
if (commandName === "strike") {
|
|||
|
|
commandName = "strikeThrough";
|
|||
|
|
}
|
|||
|
|
if (commandName === "quote") {
|
|||
|
|
var quoteElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(range.startContainer, "BLOCKQUOTE");
|
|||
|
|
if (!quoteElement) {
|
|||
|
|
quoteElement = range.startContainer.childNodes[range.startOffset];
|
|||
|
|
}
|
|||
|
|
if (quoteElement) {
|
|||
|
|
useHighlight = false;
|
|||
|
|
actionBtn.classList.remove("vditor-menu--current");
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
quoteElement.outerHTML = quoteElement.innerHTML.trim() === "" ?
|
|||
|
|
"<p data-block=\"0\">".concat(quoteElement.innerHTML, "</p>") : quoteElement.innerHTML;
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (commandName === "inline-code") {
|
|||
|
|
var inlineCodeElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(range.startContainer, "CODE");
|
|||
|
|
if (!inlineCodeElement) {
|
|||
|
|
inlineCodeElement = range.startContainer.childNodes[range.startOffset];
|
|||
|
|
}
|
|||
|
|
if (inlineCodeElement) {
|
|||
|
|
inlineCodeElement.outerHTML = inlineCodeElement.innerHTML.replace(constants/* Constants.ZWSP */.g.ZWSP, "") + "<wbr>";
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (commandName === "link") {
|
|||
|
|
if (!range.collapsed) {
|
|||
|
|
document.execCommand("unlink", false, "");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.selectNode(range.startContainer.parentElement);
|
|||
|
|
document.execCommand("unlink", false, "");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (commandName === "check" || commandName === "list" || commandName === "ordered-list") {
|
|||
|
|
listToggle(vditor, range, commandName);
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
useHighlight = false;
|
|||
|
|
actionBtn.classList.remove("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// bold, italic, strike
|
|||
|
|
useHighlight = false;
|
|||
|
|
actionBtn.classList.remove("vditor-menu--current");
|
|||
|
|
if (range.toString() === "") {
|
|||
|
|
cancelBES(range, vditor, commandName);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
document.execCommand(commandName, false, "");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// 添加
|
|||
|
|
if (vditor.wysiwyg.element.childNodes.length === 0) {
|
|||
|
|
vditor.wysiwyg.element.innerHTML = '<p data-block="0"><wbr></p>';
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
}
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestBlock */.F9)(range.startContainer);
|
|||
|
|
if (commandName === "quote") {
|
|||
|
|
if (!blockElement) {
|
|||
|
|
blockElement = range.startContainer.childNodes[range.startOffset];
|
|||
|
|
}
|
|||
|
|
if (blockElement) {
|
|||
|
|
useHighlight = false;
|
|||
|
|
actionBtn.classList.add("vditor-menu--current");
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
var liElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(range.startContainer, "LI");
|
|||
|
|
// li 中软换行
|
|||
|
|
if (liElement && blockElement.contains(liElement)) {
|
|||
|
|
liElement.innerHTML = "<blockquote data-block=\"0\">".concat(liElement.innerHTML, "</blockquote>");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
blockElement.outerHTML = "<blockquote data-block=\"0\">".concat(blockElement.outerHTML, "</blockquote>");
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (commandName === "check" || commandName === "list" || commandName === "ordered-list") {
|
|||
|
|
listToggle(vditor, range, commandName, false);
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
useHighlight = false;
|
|||
|
|
removeCurrentToolbar(vditor.toolbar.elements, ["check", "list", "ordered-list"]);
|
|||
|
|
actionBtn.classList.add("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
else if (commandName === "inline-code") {
|
|||
|
|
if (range.toString() === "") {
|
|||
|
|
var node = document.createElement("code");
|
|||
|
|
node.textContent = constants/* Constants.ZWSP */.g.ZWSP;
|
|||
|
|
range.insertNode(node);
|
|||
|
|
range.setStart(node.firstChild, 1);
|
|||
|
|
range.collapse(true);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
else if (range.startContainer.nodeType === 3) {
|
|||
|
|
var node = document.createElement("code");
|
|||
|
|
range.surroundContents(node);
|
|||
|
|
range.insertNode(node);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
actionBtn.classList.add("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
else if (commandName === "code") {
|
|||
|
|
var node = document.createElement("div");
|
|||
|
|
node.className = "vditor-wysiwyg__block";
|
|||
|
|
node.setAttribute("data-type", "code-block");
|
|||
|
|
node.setAttribute("data-block", "0");
|
|||
|
|
node.setAttribute("data-marker", "```");
|
|||
|
|
if (range.toString() === "") {
|
|||
|
|
node.innerHTML = "<pre><code><wbr>\n</code></pre>";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
node.innerHTML = "<pre><code>".concat(range.toString(), "<wbr></code></pre>");
|
|||
|
|
range.deleteContents();
|
|||
|
|
}
|
|||
|
|
range.insertNode(node);
|
|||
|
|
if (blockElement) {
|
|||
|
|
blockElement.outerHTML = vditor.lute.SpinVditorDOM(blockElement.outerHTML);
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
vditor.wysiwyg.element.querySelectorAll(".vditor-wysiwyg__preview[data-render='2']").forEach(function (item) {
|
|||
|
|
processCodeRender(item, vditor);
|
|||
|
|
});
|
|||
|
|
actionBtn.classList.add("vditor-menu--disabled");
|
|||
|
|
}
|
|||
|
|
else if (commandName === "link") {
|
|||
|
|
if (range.toString() === "") {
|
|||
|
|
var aElement = document.createElement("a");
|
|||
|
|
aElement.innerText = constants/* Constants.ZWSP */.g.ZWSP;
|
|||
|
|
range.insertNode(aElement);
|
|||
|
|
range.setStart(aElement.firstChild, 1);
|
|||
|
|
range.collapse(true);
|
|||
|
|
genAPopover(vditor, aElement, range);
|
|||
|
|
var textInputElement = vditor.wysiwyg.popover.querySelector("input");
|
|||
|
|
textInputElement.value = "";
|
|||
|
|
textInputElement.focus();
|
|||
|
|
useRender = false;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var node = document.createElement("a");
|
|||
|
|
node.setAttribute("href", "");
|
|||
|
|
node.innerHTML = range.toString();
|
|||
|
|
range.surroundContents(node);
|
|||
|
|
range.insertNode(node);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
genAPopover(vditor, node, range);
|
|||
|
|
var textInputElements = vditor.wysiwyg.popover.querySelectorAll("input");
|
|||
|
|
textInputElements[0].value = node.innerText;
|
|||
|
|
textInputElements[1].focus();
|
|||
|
|
}
|
|||
|
|
useHighlight = false;
|
|||
|
|
actionBtn.classList.add("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
else if (commandName === "table") {
|
|||
|
|
var tableHTML_1 = "<table data-block=\"0\"><thead><tr><th>col1<wbr></th><th>col2</th><th>col3</th></tr></thead><tbody><tr><td> </td><td> </td><td> </td></tr><tr><td> </td><td> </td><td> </td></tr></tbody></table>";
|
|||
|
|
if (range.toString().trim() === "") {
|
|||
|
|
if (blockElement && blockElement.innerHTML.trim().replace(constants/* Constants.ZWSP */.g.ZWSP, "") === "") {
|
|||
|
|
blockElement.outerHTML = tableHTML_1;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
document.execCommand("insertHTML", false, tableHTML_1);
|
|||
|
|
}
|
|||
|
|
range.selectNode(vditor.wysiwyg.element.querySelector("wbr").previousSibling);
|
|||
|
|
vditor.wysiwyg.element.querySelector("wbr").remove();
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
tableHTML_1 = "<table data-block=\"0\"><thead><tr>";
|
|||
|
|
var tableText = range.toString().split("\n");
|
|||
|
|
var delimiter_1 = tableText[0].split(",").length > tableText[0].split("\t").length ? "," : "\t";
|
|||
|
|
tableText.forEach(function (rows, index) {
|
|||
|
|
if (index === 0) {
|
|||
|
|
rows.split(delimiter_1).forEach(function (header, subIndex) {
|
|||
|
|
if (subIndex === 0) {
|
|||
|
|
tableHTML_1 += "<th>".concat(header, "<wbr></th>");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
tableHTML_1 += "<th>".concat(header, "</th>");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
tableHTML_1 += "</tr></thead>";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (index === 1) {
|
|||
|
|
tableHTML_1 += "<tbody><tr>";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
tableHTML_1 += "<tr>";
|
|||
|
|
}
|
|||
|
|
rows.split(delimiter_1).forEach(function (cell) {
|
|||
|
|
tableHTML_1 += "<td>".concat(cell, "</td>");
|
|||
|
|
});
|
|||
|
|
tableHTML_1 += "</tr>";
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
tableHTML_1 += "</tbody></table>";
|
|||
|
|
document.execCommand("insertHTML", false, tableHTML_1);
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
}
|
|||
|
|
useHighlight = false;
|
|||
|
|
actionBtn.classList.add("vditor-menu--disabled");
|
|||
|
|
}
|
|||
|
|
else if (commandName === "line") {
|
|||
|
|
if (blockElement) {
|
|||
|
|
var hrHTML = '<hr data-block="0"><p data-block="0"><wbr>\n</p>';
|
|||
|
|
if (blockElement.innerHTML.trim() === "") {
|
|||
|
|
blockElement.outerHTML = hrHTML;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
blockElement.insertAdjacentHTML("afterend", hrHTML);
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// bold, italic, strike
|
|||
|
|
useHighlight = false;
|
|||
|
|
actionBtn.classList.add("vditor-menu--current");
|
|||
|
|
if (commandName === "strike") {
|
|||
|
|
commandName = "strikeThrough";
|
|||
|
|
}
|
|||
|
|
if (range.toString() === "" && (commandName === "bold" || commandName === "italic" || commandName === "strikeThrough")) {
|
|||
|
|
var tagName = "strong";
|
|||
|
|
if (commandName === "italic") {
|
|||
|
|
tagName = "em";
|
|||
|
|
}
|
|||
|
|
else if (commandName === "strikeThrough") {
|
|||
|
|
tagName = "s";
|
|||
|
|
}
|
|||
|
|
var node = document.createElement(tagName);
|
|||
|
|
node.textContent = constants/* Constants.ZWSP */.g.ZWSP;
|
|||
|
|
range.insertNode(node);
|
|||
|
|
if (node.previousSibling && node.previousSibling.textContent === constants/* Constants.ZWSP */.g.ZWSP) {
|
|||
|
|
// 移除多层嵌套中的 zwsp
|
|||
|
|
node.previousSibling.textContent = "";
|
|||
|
|
}
|
|||
|
|
range.setStart(node.firstChild, 1);
|
|||
|
|
range.collapse(true);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
document.execCommand(commandName, false, "");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (useHighlight) {
|
|||
|
|
highlightToolbarWYSIWYG(vditor);
|
|||
|
|
}
|
|||
|
|
if (useRender) {
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/MenuItem.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var MenuItem = /** @class */ (function () {
|
|||
|
|
function MenuItem(vditor, menuItem) {
|
|||
|
|
var _a;
|
|||
|
|
var _this = this;
|
|||
|
|
this.element = document.createElement("div");
|
|||
|
|
if (menuItem.className) {
|
|||
|
|
(_a = this.element.classList).add.apply(_a, menuItem.className.split(" "));
|
|||
|
|
}
|
|||
|
|
var hotkey = menuItem.hotkey ? " <".concat((0,compatibility/* updateHotkeyTip */.ns)(menuItem.hotkey), ">") : "";
|
|||
|
|
if (menuItem.level === 2) {
|
|||
|
|
hotkey = menuItem.hotkey ? " <".concat((0,compatibility/* updateHotkeyTip */.ns)(menuItem.hotkey), ">") : "";
|
|||
|
|
}
|
|||
|
|
var tip = menuItem.tip ? menuItem.tip + hotkey : "".concat(window.VditorI18n[menuItem.name]).concat(hotkey);
|
|||
|
|
var tagName = menuItem.name === "upload" ? "div" : "button";
|
|||
|
|
if (menuItem.level === 2) {
|
|||
|
|
this.element.innerHTML = "<".concat(tagName, " data-type=\"").concat(menuItem.name, "\">").concat(tip, "</").concat(tagName, ">");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
this.element.classList.add("vditor-toolbar__item");
|
|||
|
|
var iconElement = document.createElement(tagName);
|
|||
|
|
iconElement.setAttribute("data-type", menuItem.name);
|
|||
|
|
iconElement.className = "vditor-tooltipped vditor-tooltipped__".concat(menuItem.tipPosition);
|
|||
|
|
iconElement.setAttribute("aria-label", tip);
|
|||
|
|
iconElement.innerHTML = menuItem.icon;
|
|||
|
|
this.element.appendChild(iconElement);
|
|||
|
|
}
|
|||
|
|
if (!menuItem.prefix) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
if (_this.element.firstElementChild.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
toolbarEvent(vditor, _this.element.children[0], event);
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "ir") {
|
|||
|
|
process_processToolbar(vditor, _this.element.children[0], menuItem.prefix || "", menuItem.suffix || "");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
processToolbar(vditor, _this.element.children[0], menuItem.prefix || "", menuItem.suffix || "");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
return MenuItem;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/EditMode.ts
|
|||
|
|
var __extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var setEditMode = function (vditor, type, event) {
|
|||
|
|
var markdownText;
|
|||
|
|
if (typeof event !== "string") {
|
|||
|
|
hidePanel(vditor, ["subToolbar", "hint"]);
|
|||
|
|
event.preventDefault();
|
|||
|
|
markdownText = getMarkdown(vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
markdownText = event;
|
|||
|
|
}
|
|||
|
|
if (vditor.currentMode === type && typeof event !== "string") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (vditor.devtools) {
|
|||
|
|
vditor.devtools.renderEchart(vditor);
|
|||
|
|
}
|
|||
|
|
if (vditor.options.preview.mode === "both" && type === "sv") {
|
|||
|
|
vditor.preview.element.style.display = "block";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.preview.element.style.display = "none";
|
|||
|
|
}
|
|||
|
|
enableToolbar(vditor.toolbar.elements, constants/* Constants.EDIT_TOOLBARS */.g.EDIT_TOOLBARS);
|
|||
|
|
removeCurrentToolbar(vditor.toolbar.elements, constants/* Constants.EDIT_TOOLBARS */.g.EDIT_TOOLBARS);
|
|||
|
|
disableToolbar(vditor.toolbar.elements, ["outdent", "indent"]);
|
|||
|
|
if (type === "ir") {
|
|||
|
|
hideToolbar(vditor.toolbar.elements, ["both"]);
|
|||
|
|
showToolbar(vditor.toolbar.elements, ["outdent", "indent", "outline", "insert-before", "insert-after"]);
|
|||
|
|
vditor.sv.element.style.display = "none";
|
|||
|
|
vditor.wysiwyg.element.parentElement.style.display = "none";
|
|||
|
|
vditor.ir.element.parentElement.style.display = "block";
|
|||
|
|
vditor.lute.SetVditorIR(true);
|
|||
|
|
vditor.lute.SetVditorWYSIWYG(false);
|
|||
|
|
vditor.lute.SetVditorSV(false);
|
|||
|
|
vditor.currentMode = "ir";
|
|||
|
|
vditor.ir.element.innerHTML = vditor.lute.Md2VditorIRDOM(markdownText);
|
|||
|
|
process_processAfterRender(vditor, {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: false,
|
|||
|
|
enableInput: false,
|
|||
|
|
});
|
|||
|
|
setPadding(vditor);
|
|||
|
|
vditor.ir.element.querySelectorAll(".vditor-ir__preview[data-render='2']").forEach(function (item) {
|
|||
|
|
processCodeRender(item, vditor);
|
|||
|
|
});
|
|||
|
|
vditor.ir.element.querySelectorAll(".vditor-toc").forEach(function (item) {
|
|||
|
|
(0,mathRender/* mathRender */.H)(item, {
|
|||
|
|
cdn: vditor.options.cdn,
|
|||
|
|
math: vditor.options.preview.math,
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
else if (type === "wysiwyg") {
|
|||
|
|
hideToolbar(vditor.toolbar.elements, ["both"]);
|
|||
|
|
showToolbar(vditor.toolbar.elements, ["outdent", "indent", "outline", "insert-before", "insert-after"]);
|
|||
|
|
vditor.sv.element.style.display = "none";
|
|||
|
|
vditor.wysiwyg.element.parentElement.style.display = "block";
|
|||
|
|
vditor.ir.element.parentElement.style.display = "none";
|
|||
|
|
vditor.lute.SetVditorIR(false);
|
|||
|
|
vditor.lute.SetVditorWYSIWYG(true);
|
|||
|
|
vditor.lute.SetVditorSV(false);
|
|||
|
|
vditor.currentMode = "wysiwyg";
|
|||
|
|
setPadding(vditor);
|
|||
|
|
renderDomByMd(vditor, markdownText, {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: false,
|
|||
|
|
enableInput: false,
|
|||
|
|
});
|
|||
|
|
vditor.wysiwyg.element.querySelectorAll(".vditor-toc").forEach(function (item) {
|
|||
|
|
(0,mathRender/* mathRender */.H)(item, {
|
|||
|
|
cdn: vditor.options.cdn,
|
|||
|
|
math: vditor.options.preview.math,
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
vditor.wysiwyg.popover.style.display = "none";
|
|||
|
|
}
|
|||
|
|
else if (type === "sv") {
|
|||
|
|
showToolbar(vditor.toolbar.elements, ["both"]);
|
|||
|
|
hideToolbar(vditor.toolbar.elements, ["outdent", "indent", "outline", "insert-before", "insert-after"]);
|
|||
|
|
vditor.wysiwyg.element.parentElement.style.display = "none";
|
|||
|
|
vditor.ir.element.parentElement.style.display = "none";
|
|||
|
|
if (vditor.options.preview.mode === "both") {
|
|||
|
|
vditor.sv.element.style.display = "block";
|
|||
|
|
}
|
|||
|
|
else if (vditor.options.preview.mode === "editor") {
|
|||
|
|
vditor.sv.element.style.display = "block";
|
|||
|
|
}
|
|||
|
|
vditor.lute.SetVditorIR(false);
|
|||
|
|
vditor.lute.SetVditorWYSIWYG(false);
|
|||
|
|
vditor.lute.SetVditorSV(true);
|
|||
|
|
vditor.currentMode = "sv";
|
|||
|
|
var svHTML = processSpinVditorSVDOM(markdownText, vditor);
|
|||
|
|
if (svHTML === "<div data-block='0'></div>") {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/654 SV 模式 Placeholder 显示问题
|
|||
|
|
svHTML = "";
|
|||
|
|
}
|
|||
|
|
vditor.sv.element.innerHTML = svHTML;
|
|||
|
|
combineFootnote(vditor.sv.element);
|
|||
|
|
processAfterRender(vditor, {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: false,
|
|||
|
|
enableInput: false,
|
|||
|
|
});
|
|||
|
|
setPadding(vditor);
|
|||
|
|
}
|
|||
|
|
vditor.undo.resetIcon(vditor);
|
|||
|
|
if (typeof event !== "string") {
|
|||
|
|
// 初始化不 focus
|
|||
|
|
vditor[vditor.currentMode].element.focus();
|
|||
|
|
highlightToolbar(vditor);
|
|||
|
|
}
|
|||
|
|
renderToc(vditor);
|
|||
|
|
setTypewriterPosition(vditor);
|
|||
|
|
if (vditor.toolbar.elements["edit-mode"]) {
|
|||
|
|
vditor.toolbar.elements["edit-mode"].querySelectorAll("button").forEach(function (item) {
|
|||
|
|
item.classList.remove("vditor-menu--current");
|
|||
|
|
});
|
|||
|
|
vditor.toolbar.elements["edit-mode"].querySelector("button[data-mode=\"".concat(vditor.currentMode, "\"]")).classList.add("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
vditor.outline.toggle(vditor, vditor.currentMode !== "sv" && vditor.options.outline.enable, typeof event !== "string");
|
|||
|
|
};
|
|||
|
|
var EditMode = /** @class */ (function (_super) {
|
|||
|
|
__extends(EditMode, _super);
|
|||
|
|
function EditMode(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
var panelElement = document.createElement("div");
|
|||
|
|
panelElement.className = "vditor-hint".concat(menuItem.level === 2 ? "" : " vditor-panel--arrow");
|
|||
|
|
panelElement.innerHTML = "<button data-mode=\"wysiwyg\">".concat(window.VditorI18n.wysiwyg, " <").concat((0,compatibility/* updateHotkeyTip */.ns)("⌥⌘7"), "></button>\n<button data-mode=\"ir\">").concat(window.VditorI18n.instantRendering, " <").concat((0,compatibility/* updateHotkeyTip */.ns)("⌥⌘8"), "></button>\n<button data-mode=\"sv\">").concat(window.VditorI18n.splitView, " <").concat((0,compatibility/* updateHotkeyTip */.ns)("⌥⌘9"), "></button>");
|
|||
|
|
_this.element.appendChild(panelElement);
|
|||
|
|
_this._bindEvent(vditor, panelElement, menuItem);
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
EditMode.prototype._bindEvent = function (vditor, panelElement, menuItem) {
|
|||
|
|
var actionBtn = this.element.children[0];
|
|||
|
|
toggleSubMenu(vditor, panelElement, actionBtn, menuItem.level);
|
|||
|
|
panelElement.children.item(0).addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
// wysiwyg
|
|||
|
|
setEditMode(vditor, "wysiwyg", event);
|
|||
|
|
event.preventDefault();
|
|||
|
|
event.stopPropagation();
|
|||
|
|
});
|
|||
|
|
panelElement.children.item(1).addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
// ir
|
|||
|
|
setEditMode(vditor, "ir", event);
|
|||
|
|
event.preventDefault();
|
|||
|
|
event.stopPropagation();
|
|||
|
|
});
|
|||
|
|
panelElement.children.item(2).addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
// markdown
|
|||
|
|
setEditMode(vditor, "sv", event);
|
|||
|
|
event.preventDefault();
|
|||
|
|
event.stopPropagation();
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
return EditMode;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/util/getSelectText.ts
|
|||
|
|
|
|||
|
|
var getSelectText = function (editor, range) {
|
|||
|
|
if ((0,selection/* selectIsEditor */.Gb)(editor, range)) {
|
|||
|
|
return getSelection().toString();
|
|||
|
|
}
|
|||
|
|
return "";
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/util/editorCommonEvent.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var focusEvent = function (vditor, editorElement) {
|
|||
|
|
editorElement.addEventListener("focus", function () {
|
|||
|
|
if (vditor.options.focus) {
|
|||
|
|
vditor.options.focus(getMarkdown(vditor));
|
|||
|
|
}
|
|||
|
|
hidePanel(vditor, ["subToolbar", "hint"]);
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var dblclickEvent = function (vditor, editorElement) {
|
|||
|
|
editorElement.addEventListener("dblclick", function (event) {
|
|||
|
|
if (event.target.tagName === "IMG") {
|
|||
|
|
if (vditor.options.image.preview) {
|
|||
|
|
vditor.options.image.preview(event.target);
|
|||
|
|
}
|
|||
|
|
else if (vditor.options.image.isPreview) {
|
|||
|
|
(0,preview_image/* previewImage */.E)(event.target, vditor.options.lang, vditor.options.theme);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var blurEvent = function (vditor, editorElement) {
|
|||
|
|
editorElement.addEventListener("blur", function (event) {
|
|||
|
|
if (vditor.currentMode === "ir") {
|
|||
|
|
var expandElement = vditor.ir.element.querySelector(".vditor-ir__node--expand");
|
|||
|
|
if (expandElement) {
|
|||
|
|
expandElement.classList.remove("vditor-ir__node--expand");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "wysiwyg" &&
|
|||
|
|
!vditor.wysiwyg.selectPopover.contains(event.relatedTarget)) {
|
|||
|
|
vditor.wysiwyg.hideComment();
|
|||
|
|
}
|
|||
|
|
vditor[vditor.currentMode].range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
if (vditor.options.blur) {
|
|||
|
|
vditor.options.blur(getMarkdown(vditor));
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var dropEvent = function (vditor, editorElement) {
|
|||
|
|
editorElement.addEventListener("dragstart", function (event) {
|
|||
|
|
// 选中编辑器中的文字进行拖拽
|
|||
|
|
event.dataTransfer.setData(constants/* Constants.DROP_EDITOR */.g.DROP_EDITOR, constants/* Constants.DROP_EDITOR */.g.DROP_EDITOR);
|
|||
|
|
});
|
|||
|
|
editorElement.addEventListener("drop", function (event) {
|
|||
|
|
if (event.dataTransfer.getData(constants/* Constants.DROP_EDITOR */.g.DROP_EDITOR)) {
|
|||
|
|
// 编辑器内选中文字拖拽
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
}
|
|||
|
|
else if (event.dataTransfer.types.includes("Files") || event.dataTransfer.types.includes("text/html")) {
|
|||
|
|
// 外部文件拖入编辑器中或者编辑器内选中文字拖拽
|
|||
|
|
paste(vditor, event, {
|
|||
|
|
pasteCode: function (code) {
|
|||
|
|
document.execCommand("insertHTML", false, code);
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var copyEvent = function (vditor, editorElement, copy) {
|
|||
|
|
editorElement.addEventListener("copy", function (event) { return copy(event, vditor); });
|
|||
|
|
};
|
|||
|
|
var cutEvent = function (vditor, editorElement, copy) {
|
|||
|
|
editorElement.addEventListener("cut", function (event) {
|
|||
|
|
copy(event, vditor);
|
|||
|
|
// 获取 comment
|
|||
|
|
if (vditor.options.comment.enable && vditor.currentMode === "wysiwyg") {
|
|||
|
|
vditor.wysiwyg.getComments(vditor);
|
|||
|
|
}
|
|||
|
|
document.execCommand("delete");
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var scrollCenter = function (vditor) {
|
|||
|
|
if (vditor.currentMode === "wysiwyg" && vditor.options.comment.enable) {
|
|||
|
|
vditor.options.comment.adjustTop(vditor.wysiwyg.getComments(vditor, true));
|
|||
|
|
}
|
|||
|
|
if (!vditor.options.typewriterMode) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var editorElement = vditor[vditor.currentMode].element;
|
|||
|
|
var cursorTop = (0,selection/* getCursorPosition */.Ny)(editorElement).top;
|
|||
|
|
if (vditor.options.height === "auto" && !vditor.element.classList.contains("vditor--fullscreen")) {
|
|||
|
|
window.scrollTo(window.scrollX, cursorTop + vditor.element.offsetTop + vditor.toolbar.element.offsetHeight - window.innerHeight / 2 + 10);
|
|||
|
|
}
|
|||
|
|
if (vditor.options.height !== "auto" || vditor.element.classList.contains("vditor--fullscreen")) {
|
|||
|
|
editorElement.scrollTop = cursorTop + editorElement.scrollTop - editorElement.clientHeight / 2 + 10;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var hotkeyEvent = function (vditor, editorElement) {
|
|||
|
|
editorElement.addEventListener("keydown", function (event) {
|
|||
|
|
if (!event.isComposing && vditor.options.keydown) {
|
|||
|
|
vditor.options.keydown(event);
|
|||
|
|
}
|
|||
|
|
// hint: 上下选择
|
|||
|
|
if ((vditor.options.hint.extend.length > 1 || vditor.toolbar.elements.emoji) &&
|
|||
|
|
vditor.hint.select(event, vditor)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// 重置 comment
|
|||
|
|
if (vditor.options.comment.enable && vditor.currentMode === "wysiwyg" &&
|
|||
|
|
(event.key === "Backspace" || matchHotKey("⌘X", event))) {
|
|||
|
|
vditor.wysiwyg.getComments(vditor);
|
|||
|
|
}
|
|||
|
|
if (vditor.currentMode === "sv") {
|
|||
|
|
if (processKeydown_processKeydown(vditor, event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
if (wysiwyg_processKeydown_processKeydown(vditor, event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "ir") {
|
|||
|
|
if (processKeydown(vditor, event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (vditor.options.ctrlEnter && matchHotKey("⌘Enter", event)) {
|
|||
|
|
vditor.options.ctrlEnter(getMarkdown(vditor));
|
|||
|
|
event.preventDefault();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// undo
|
|||
|
|
if (matchHotKey("⌘Z", event) && !vditor.toolbar.elements.undo) {
|
|||
|
|
vditor.undo.undo(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// redo
|
|||
|
|
if (matchHotKey("⌘Y", event) && !vditor.toolbar.elements.redo) {
|
|||
|
|
vditor.undo.redo(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// esc
|
|||
|
|
if (event.key === "Escape") {
|
|||
|
|
if (vditor.hint.element.style.display === "block") {
|
|||
|
|
vditor.hint.element.style.display = "none";
|
|||
|
|
}
|
|||
|
|
else if (vditor.options.esc && !event.isComposing) {
|
|||
|
|
vditor.options.esc(getMarkdown(vditor));
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// h1 - h6 hotkey
|
|||
|
|
if ((0,compatibility/* isCtrl */.yl)(event) && event.altKey && !event.shiftKey && /^Digit[1-6]$/.test(event.code)) {
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
var tagName = event.code.replace("Digit", "H");
|
|||
|
|
if ((0,hasClosest/* hasClosestByMatchTag */.lG)(getSelection().getRangeAt(0).startContainer, tagName)) {
|
|||
|
|
removeHeading(vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
setHeading(vditor, tagName);
|
|||
|
|
}
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "sv") {
|
|||
|
|
processHeading(vditor, "#".repeat(parseInt(event.code.replace("Digit", ""), 10)) + " ");
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "ir") {
|
|||
|
|
process_processHeading(vditor, "#".repeat(parseInt(event.code.replace("Digit", ""), 10)) + " ");
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// toggle edit mode
|
|||
|
|
if ((0,compatibility/* isCtrl */.yl)(event) && event.altKey && !event.shiftKey && /^Digit[7-9]$/.test(event.code)) {
|
|||
|
|
if (event.code === "Digit7") {
|
|||
|
|
setEditMode(vditor, "wysiwyg", event);
|
|||
|
|
}
|
|||
|
|
else if (event.code === "Digit8") {
|
|||
|
|
setEditMode(vditor, "ir", event);
|
|||
|
|
}
|
|||
|
|
else if (event.code === "Digit9") {
|
|||
|
|
setEditMode(vditor, "sv", event);
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// toolbar action
|
|||
|
|
vditor.options.toolbar.find(function (menuItem) {
|
|||
|
|
if (!menuItem.hotkey || menuItem.toolbar) {
|
|||
|
|
if (menuItem.toolbar) {
|
|||
|
|
var sub = menuItem.toolbar.find(function (subMenuItem) {
|
|||
|
|
if (!subMenuItem.hotkey) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (matchHotKey(subMenuItem.hotkey, event)) {
|
|||
|
|
vditor.toolbar.elements[subMenuItem.name].children[0]
|
|||
|
|
.dispatchEvent(new CustomEvent((0,compatibility/* getEventName */.Le)()));
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
return sub ? true : false;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (matchHotKey(menuItem.hotkey, event)) {
|
|||
|
|
vditor.toolbar.elements[menuItem.name].children[0].dispatchEvent(new CustomEvent((0,compatibility/* getEventName */.Le)()));
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var selectEvent = function (vditor, editorElement) {
|
|||
|
|
editorElement.addEventListener("selectstart", function (event) {
|
|||
|
|
editorElement.onmouseup = function () {
|
|||
|
|
setTimeout(function () {
|
|||
|
|
var selectText = getSelectText(vditor[vditor.currentMode].element);
|
|||
|
|
if (selectText.trim()) {
|
|||
|
|
if (vditor.currentMode === "wysiwyg" && vditor.options.comment.enable) {
|
|||
|
|
if (!(0,hasClosest/* hasClosestByAttribute */.a1)(event.target, "data-type", "footnotes-block") &&
|
|||
|
|
!(0,hasClosest/* hasClosestByAttribute */.a1)(event.target, "data-type", "link-ref-defs-block")) {
|
|||
|
|
vditor.wysiwyg.showComment();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.wysiwyg.hideComment();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (vditor.options.select) {
|
|||
|
|
vditor.options.select(selectText);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (vditor.currentMode === "wysiwyg" && vditor.options.comment.enable) {
|
|||
|
|
vditor.wysiwyg.hideComment();
|
|||
|
|
}
|
|||
|
|
if (typeof vditor.options.unSelect === 'function') {
|
|||
|
|
vditor.options.unSelect();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/sv/process.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var processPaste = function (vditor, text) {
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
range.extractContents();
|
|||
|
|
range.insertNode(document.createTextNode(Lute.Caret));
|
|||
|
|
range.insertNode(document.createTextNode(text));
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestByAttribute */.a1)(range.startContainer, "data-block", "0");
|
|||
|
|
if (!blockElement) {
|
|||
|
|
blockElement = vditor.sv.element;
|
|||
|
|
}
|
|||
|
|
var spinHTML = vditor.lute.SpinVditorSVDOM(blockElement.textContent);
|
|||
|
|
spinHTML = "<div data-block='0'>" +
|
|||
|
|
spinHTML.replace(/<span data-type="newline"><br \/><span style="display: none">\n<\/span><\/span><span data-type="newline"><br \/><span style="display: none">\n<\/span><\/span></g, '<span data-type="newline"><br /><span style="display: none">\n</span></span><span data-type="newline"><br /><span style="display: none">\n</span></span></div><div data-block="0"><') +
|
|||
|
|
"</div>";
|
|||
|
|
if (blockElement.isEqualNode(vditor.sv.element)) {
|
|||
|
|
blockElement.innerHTML = spinHTML;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
blockElement.outerHTML = spinHTML;
|
|||
|
|
}
|
|||
|
|
combineFootnote(vditor.sv.element);
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.sv.element, range);
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
};
|
|||
|
|
var getSideByType = function (spanNode, type, isPrevious) {
|
|||
|
|
if (isPrevious === void 0) { isPrevious = true; }
|
|||
|
|
var sideElement = spanNode;
|
|||
|
|
if (sideElement.nodeType === 3) {
|
|||
|
|
sideElement = sideElement.parentElement;
|
|||
|
|
}
|
|||
|
|
while (sideElement) {
|
|||
|
|
if (sideElement.getAttribute("data-type") === type) {
|
|||
|
|
return sideElement;
|
|||
|
|
}
|
|||
|
|
if (isPrevious) {
|
|||
|
|
sideElement = sideElement.previousElementSibling;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
sideElement = sideElement.nextElementSibling;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var processSpinVditorSVDOM = function (html, vditor) {
|
|||
|
|
log("SpinVditorSVDOM", html, "argument", vditor.options.debugger);
|
|||
|
|
var spinHTML = vditor.lute.SpinVditorSVDOM(html);
|
|||
|
|
html = "<div data-block='0'>" +
|
|||
|
|
spinHTML.replace(/<span data-type="newline"><br \/><span style="display: none">\n<\/span><\/span><span data-type="newline"><br \/><span style="display: none">\n<\/span><\/span></g, '<span data-type="newline"><br /><span style="display: none">\n</span></span><span data-type="newline"><br /><span style="display: none">\n</span></span></div><div data-block="0"><') +
|
|||
|
|
"</div>";
|
|||
|
|
log("SpinVditorSVDOM", html, "result", vditor.options.debugger);
|
|||
|
|
return html;
|
|||
|
|
};
|
|||
|
|
var processPreviousMarkers = function (spanElement) {
|
|||
|
|
var spanType = spanElement.getAttribute("data-type");
|
|||
|
|
var previousElement = spanElement.previousElementSibling;
|
|||
|
|
// 有内容的子列表/标题,在其 marker 后换行
|
|||
|
|
var markerText = (spanType && spanType !== "text" && spanType !== "table" && spanType !== "heading-marker" &&
|
|||
|
|
spanType !== "newline" && spanType !== "yaml-front-matter-open-marker" && spanType !== "yaml-front-matter-close-marker"
|
|||
|
|
&& spanType !== "code-block-info" && spanType !== "code-block-close-marker" && spanType !== "code-block-open-marker") ?
|
|||
|
|
spanElement.textContent : "";
|
|||
|
|
var hasNL = false;
|
|||
|
|
if (spanType === "newline") {
|
|||
|
|
hasNL = true;
|
|||
|
|
}
|
|||
|
|
while (previousElement && !hasNL) {
|
|||
|
|
var previousType = previousElement.getAttribute("data-type");
|
|||
|
|
if (previousType === "li-marker" || previousType === "blockquote-marker" || previousType === "task-marker" ||
|
|||
|
|
previousType === "padding") {
|
|||
|
|
var previousText = previousElement.textContent;
|
|||
|
|
if (previousType === "li-marker" &&
|
|||
|
|
(spanType === "code-block-open-marker" || spanType === "code-block-info")) {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/586
|
|||
|
|
markerText = previousText.replace(/\S/g, " ") + markerText;
|
|||
|
|
}
|
|||
|
|
else if (spanType === "code-block-close-marker" &&
|
|||
|
|
previousElement.nextElementSibling.isSameNode(spanElement)) {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/594
|
|||
|
|
var openMarker = getSideByType(spanElement, "code-block-open-marker");
|
|||
|
|
if (openMarker && openMarker.previousElementSibling) {
|
|||
|
|
previousElement = openMarker.previousElementSibling;
|
|||
|
|
markerText = previousText + markerText;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
markerText = previousText + markerText;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (previousType === "newline") {
|
|||
|
|
hasNL = true;
|
|||
|
|
}
|
|||
|
|
previousElement = previousElement.previousElementSibling;
|
|||
|
|
}
|
|||
|
|
return markerText;
|
|||
|
|
};
|
|||
|
|
var processAfterRender = function (vditor, options) {
|
|||
|
|
if (options === void 0) { options = {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: false,
|
|||
|
|
enableInput: true,
|
|||
|
|
}; }
|
|||
|
|
if (options.enableHint) {
|
|||
|
|
vditor.hint.render(vditor);
|
|||
|
|
}
|
|||
|
|
vditor.preview.render(vditor);
|
|||
|
|
var text = getMarkdown(vditor);
|
|||
|
|
if (typeof vditor.options.input === "function" && options.enableInput) {
|
|||
|
|
vditor.options.input(text);
|
|||
|
|
}
|
|||
|
|
if (vditor.options.counter.enable) {
|
|||
|
|
vditor.counter.render(vditor, text);
|
|||
|
|
}
|
|||
|
|
if (vditor.options.cache.enable && (0,compatibility/* accessLocalStorage */.pK)()) {
|
|||
|
|
localStorage.setItem(vditor.options.cache.id, text);
|
|||
|
|
if (vditor.options.cache.after) {
|
|||
|
|
vditor.options.cache.after(text);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (vditor.devtools) {
|
|||
|
|
vditor.devtools.renderEchart(vditor);
|
|||
|
|
}
|
|||
|
|
clearTimeout(vditor.sv.processTimeoutId);
|
|||
|
|
vditor.sv.processTimeoutId = window.setTimeout(function () {
|
|||
|
|
if (options.enableAddUndoStack && !vditor.sv.composingLock) {
|
|||
|
|
vditor.undo.addToUndoStack(vditor);
|
|||
|
|
}
|
|||
|
|
}, vditor.options.undoDelay);
|
|||
|
|
};
|
|||
|
|
var processHeading = function (vditor, value) {
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
var headingElement = (0,hasClosestByHeadings/* hasClosestByTag */.S)(range.startContainer, "SPAN");
|
|||
|
|
if (headingElement && headingElement.textContent.trim() !== "") {
|
|||
|
|
value = "\n" + value;
|
|||
|
|
}
|
|||
|
|
range.collapse(true);
|
|||
|
|
document.execCommand("insertHTML", false, value);
|
|||
|
|
};
|
|||
|
|
var processToolbar = function (vditor, actionBtn, prefix, suffix) {
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
var commandName = actionBtn.getAttribute("data-type");
|
|||
|
|
// 添加
|
|||
|
|
if (vditor.sv.element.childNodes.length === 0) {
|
|||
|
|
vditor.sv.element.innerHTML = "<span data-type=\"p\" data-block=\"0\"><span data-type=\"text\"><wbr></span></span><span data-type=\"newline\"><br><span style=\"display: none\">\n</span></span>";
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.sv.element, range);
|
|||
|
|
}
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestBlock */.F9)(range.startContainer);
|
|||
|
|
var spanElement = (0,hasClosestByHeadings/* hasClosestByTag */.S)(range.startContainer, "SPAN");
|
|||
|
|
if (!blockElement) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (commandName === "link") {
|
|||
|
|
var html = void 0;
|
|||
|
|
if (range.toString() === "") {
|
|||
|
|
html = "".concat(prefix).concat(Lute.Caret).concat(suffix);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
html = "".concat(prefix).concat(range.toString()).concat(suffix.replace(")", Lute.Caret + ")"));
|
|||
|
|
}
|
|||
|
|
document.execCommand("insertHTML", false, html);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
else if (commandName === "italic" || commandName === "bold" || commandName === "strike" ||
|
|||
|
|
commandName === "inline-code" || commandName === "code" || commandName === "table" || commandName === "line") {
|
|||
|
|
var html = void 0;
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/563 代码块不需要后面的 ```
|
|||
|
|
if (range.toString() === "") {
|
|||
|
|
html = "".concat(prefix).concat(Lute.Caret).concat(commandName === "code" ? "" : suffix);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
html = "".concat(prefix).concat(range.toString()).concat(Lute.Caret).concat(commandName === "code" ? "" : suffix);
|
|||
|
|
}
|
|||
|
|
if (commandName === "table" || (commandName === "code" && spanElement && spanElement.textContent !== "")) {
|
|||
|
|
html = "\n\n" + html;
|
|||
|
|
}
|
|||
|
|
else if (commandName === "line") {
|
|||
|
|
html = "\n\n".concat(prefix, "\n").concat(Lute.Caret);
|
|||
|
|
}
|
|||
|
|
document.execCommand("insertHTML", false, html);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
else if (commandName === "check" || commandName === "list" || commandName === "ordered-list" ||
|
|||
|
|
commandName === "quote") {
|
|||
|
|
if (spanElement) {
|
|||
|
|
var marker = "* ";
|
|||
|
|
if (commandName === "check") {
|
|||
|
|
marker = "* [ ] ";
|
|||
|
|
}
|
|||
|
|
else if (commandName === "ordered-list") {
|
|||
|
|
marker = "1. ";
|
|||
|
|
}
|
|||
|
|
else if (commandName === "quote") {
|
|||
|
|
marker = "> ";
|
|||
|
|
}
|
|||
|
|
var newLine = getSideByType(spanElement, "newline");
|
|||
|
|
if (newLine) {
|
|||
|
|
newLine.insertAdjacentText("afterend", marker);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
blockElement.insertAdjacentText("afterbegin", marker);
|
|||
|
|
}
|
|||
|
|
inputEvent(vditor);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.sv.element, range);
|
|||
|
|
processAfterRender(vditor);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/upload/getElement.ts
|
|||
|
|
var getElement = function (vditor) {
|
|||
|
|
switch (vditor.currentMode) {
|
|||
|
|
case "ir":
|
|||
|
|
return vditor.ir.element;
|
|||
|
|
case "wysiwyg":
|
|||
|
|
return vditor.wysiwyg.element;
|
|||
|
|
case "sv":
|
|||
|
|
return vditor.sv.element;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/upload/setHeaders.ts
|
|||
|
|
var setHeaders = function (vditor, xhr) {
|
|||
|
|
if (vditor.options.upload.setHeaders) {
|
|||
|
|
vditor.options.upload.headers = vditor.options.upload.setHeaders();
|
|||
|
|
}
|
|||
|
|
if (vditor.options.upload.headers) {
|
|||
|
|
Object.keys(vditor.options.upload.headers).forEach(function (key) {
|
|||
|
|
xhr.setRequestHeader(key, vditor.options.upload.headers[key]);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/upload/index.ts
|
|||
|
|
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|||
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|||
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|||
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|||
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|||
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|||
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var __generator = (undefined && undefined.__generator) || function (thisArg, body) {
|
|||
|
|
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|||
|
|
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|||
|
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|||
|
|
function step(op) {
|
|||
|
|
if (f) throw new TypeError("Generator is already executing.");
|
|||
|
|
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|||
|
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|||
|
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|||
|
|
switch (op[0]) {
|
|||
|
|
case 0: case 1: t = op; break;
|
|||
|
|
case 4: _.label++; return { value: op[1], done: false };
|
|||
|
|
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|||
|
|
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|||
|
|
default:
|
|||
|
|
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|||
|
|
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|||
|
|
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|||
|
|
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|||
|
|
if (t[2]) _.ops.pop();
|
|||
|
|
_.trys.pop(); continue;
|
|||
|
|
}
|
|||
|
|
op = body.call(thisArg, _);
|
|||
|
|
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|||
|
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Upload = /** @class */ (function () {
|
|||
|
|
function Upload() {
|
|||
|
|
this.isUploading = false;
|
|||
|
|
this.element = document.createElement("div");
|
|||
|
|
this.element.className = "vditor-upload";
|
|||
|
|
}
|
|||
|
|
return Upload;
|
|||
|
|
}());
|
|||
|
|
var validateFile = function (vditor, files) {
|
|||
|
|
vditor.tip.hide();
|
|||
|
|
var uploadFileList = [];
|
|||
|
|
var errorTip = "";
|
|||
|
|
var uploadingStr = "";
|
|||
|
|
var lang = vditor.options.lang;
|
|||
|
|
var options = vditor.options;
|
|||
|
|
var _loop_1 = function (iMax, i) {
|
|||
|
|
var file = files[i];
|
|||
|
|
var validate = true;
|
|||
|
|
if (!file.name) {
|
|||
|
|
errorTip += "<li>".concat(window.VditorI18n.nameEmpty, "</li>");
|
|||
|
|
validate = false;
|
|||
|
|
}
|
|||
|
|
if (file.size > vditor.options.upload.max) {
|
|||
|
|
errorTip += "<li>".concat(file.name, " ").concat(window.VditorI18n.over, " ").concat(vditor.options.upload.max / 1024 / 1024, "M</li>");
|
|||
|
|
validate = false;
|
|||
|
|
}
|
|||
|
|
var lastIndex = file.name.lastIndexOf(".");
|
|||
|
|
var fileExt = file.name.substr(lastIndex);
|
|||
|
|
var filename = vditor.options.upload.filename(file.name.substr(0, lastIndex)) + fileExt;
|
|||
|
|
if (vditor.options.upload.accept) {
|
|||
|
|
var isAccept = vditor.options.upload.accept.split(",").some(function (item) {
|
|||
|
|
var type = item.trim();
|
|||
|
|
if (type.indexOf(".") === 0) {
|
|||
|
|
if (fileExt.toLowerCase() === type.toLowerCase()) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (file.type.split("/")[0] === type.split("/")[0]) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
});
|
|||
|
|
if (!isAccept) {
|
|||
|
|
errorTip += "<li>".concat(file.name, " ").concat(window.VditorI18n.fileTypeError, "</li>");
|
|||
|
|
validate = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (validate) {
|
|||
|
|
uploadFileList.push(file);
|
|||
|
|
uploadingStr += "<li>".concat(filename, " ").concat(window.VditorI18n.uploading, " <a class=\"vditorCancelUpload\" href=\"javascript:void(0)\">").concat(window.VditorI18n.cancelUpload, "</a></li>");
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
for (var iMax = files.length, i = 0; i < iMax; i++) {
|
|||
|
|
_loop_1(iMax, i);
|
|||
|
|
}
|
|||
|
|
vditor.tip.show("<ul>".concat(errorTip).concat(uploadingStr, "</ul>"));
|
|||
|
|
if (vditor.options.upload.cancel) {
|
|||
|
|
var vditorCancelUploadElement = vditor.tip.element.querySelector(".vditorCancelUpload");
|
|||
|
|
if (vditorCancelUploadElement) {
|
|||
|
|
vditorCancelUploadElement.addEventListener("click", function () {
|
|||
|
|
vditor.options.upload.cancel(uploadFileList);
|
|||
|
|
vditor.tip.hide();
|
|||
|
|
vditor.upload.isUploading = false;
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return uploadFileList;
|
|||
|
|
};
|
|||
|
|
var genUploadedLabel = function (responseText, vditor) {
|
|||
|
|
var editorElement = getElement(vditor);
|
|||
|
|
editorElement.focus();
|
|||
|
|
var response = JSON.parse(responseText);
|
|||
|
|
var errorTip = "";
|
|||
|
|
if (response.code === 1) {
|
|||
|
|
errorTip = "".concat(response.msg);
|
|||
|
|
}
|
|||
|
|
if (response.data.errFiles && response.data.errFiles.length > 0) {
|
|||
|
|
errorTip = "<ul><li>".concat(errorTip, "</li>");
|
|||
|
|
response.data.errFiles.forEach(function (data) {
|
|||
|
|
var lastIndex = data.lastIndexOf(".");
|
|||
|
|
var filename = vditor.options.upload.filename(data.substr(0, lastIndex)) + data.substr(lastIndex);
|
|||
|
|
errorTip += "<li>".concat(filename, " ").concat(window.VditorI18n.uploadError, "</li>");
|
|||
|
|
});
|
|||
|
|
errorTip += "</ul>";
|
|||
|
|
}
|
|||
|
|
if (errorTip) {
|
|||
|
|
vditor.tip.show(errorTip);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.tip.hide();
|
|||
|
|
}
|
|||
|
|
var succFileText = "";
|
|||
|
|
Object.keys(response.data.succMap).forEach(function (key) {
|
|||
|
|
var path = response.data.succMap[key];
|
|||
|
|
var lastIndex = key.lastIndexOf(".");
|
|||
|
|
var type = key.substr(lastIndex);
|
|||
|
|
var filename = vditor.options.upload.filename(key.substr(0, lastIndex)) + type;
|
|||
|
|
type = type.toLowerCase();
|
|||
|
|
if (type.indexOf(".wav") === 0 || type.indexOf(".mp3") === 0 || type.indexOf(".ogg") === 0) {
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
succFileText += "<div class=\"vditor-wysiwyg__block\" data-type=\"html-block\"\n data-block=\"0\"><pre><code><audio controls=\"controls\" src=\"".concat(path, "\"></audio></code></pre><pre class=\"vditor-wysiwyg__preview\" data-render=\"1\"><audio controls=\"controls\" src=\"").concat(path, "\"></audio></pre></div>\n");
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "ir") {
|
|||
|
|
succFileText += "<audio controls=\"controls\" src=\"".concat(path, "\"></audio>\n");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
succFileText += "[".concat(filename, "](").concat(path, ")\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (type.indexOf(".apng") === 0
|
|||
|
|
|| type.indexOf(".bmp") === 0
|
|||
|
|
|| type.indexOf(".gif") === 0
|
|||
|
|
|| type.indexOf(".ico") === 0 || type.indexOf(".cur") === 0
|
|||
|
|
|| type.indexOf(".jpg") === 0 || type.indexOf(".jpeg") === 0 || type.indexOf(".jfif") === 0 || type.indexOf(".pjp") === 0 || type.indexOf(".pjpeg") === 0
|
|||
|
|
|| type.indexOf(".png") === 0
|
|||
|
|
|| type.indexOf(".svg") === 0
|
|||
|
|
|| type.indexOf(".webp") === 0) {
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
succFileText += "<img alt=\"".concat(filename, "\" src=\"").concat(path, "\">\n");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
succFileText += ".concat(path, ")\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
succFileText += "<a href=\"".concat(path, "\">").concat(filename, "</a>\n");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
succFileText += "[".concat(filename, "](").concat(path, ")\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(vditor.upload.range);
|
|||
|
|
document.execCommand("insertHTML", false, succFileText);
|
|||
|
|
vditor.upload.range = getSelection().getRangeAt(0).cloneRange();
|
|||
|
|
};
|
|||
|
|
var uploadFiles = function (vditor, files, element) { return __awaiter(void 0, void 0, void 0, function () {
|
|||
|
|
var fileList, filesMax, i, fileItem, isValidate, isValidate, editorElement, validateResult, formData, extraData, _i, _a, key, i, iMax, xhr;
|
|||
|
|
return __generator(this, function (_b) {
|
|||
|
|
switch (_b.label) {
|
|||
|
|
case 0:
|
|||
|
|
fileList = [];
|
|||
|
|
filesMax = vditor.options.upload.multiple === true ? files.length : 1;
|
|||
|
|
for (i = 0; i < filesMax; i++) {
|
|||
|
|
fileItem = files[i];
|
|||
|
|
if (fileItem instanceof DataTransferItem) {
|
|||
|
|
fileItem = fileItem.getAsFile();
|
|||
|
|
}
|
|||
|
|
fileList.push(fileItem);
|
|||
|
|
}
|
|||
|
|
if (!vditor.options.upload.handler) return [3 /*break*/, 2];
|
|||
|
|
return [4 /*yield*/, vditor.options.upload.handler(fileList)];
|
|||
|
|
case 1:
|
|||
|
|
isValidate = _b.sent();
|
|||
|
|
if (element) {
|
|||
|
|
element.value = "";
|
|||
|
|
}
|
|||
|
|
if (typeof isValidate === "string") {
|
|||
|
|
vditor.tip.show(isValidate);
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
case 2:
|
|||
|
|
if (!vditor.options.upload.url || !vditor.upload) {
|
|||
|
|
if (element) {
|
|||
|
|
element.value = "";
|
|||
|
|
}
|
|||
|
|
vditor.tip.show("please config: options.upload.url");
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
if (!vditor.options.upload.file) return [3 /*break*/, 4];
|
|||
|
|
return [4 /*yield*/, vditor.options.upload.file(fileList)];
|
|||
|
|
case 3:
|
|||
|
|
fileList = _b.sent();
|
|||
|
|
_b.label = 4;
|
|||
|
|
case 4:
|
|||
|
|
if (vditor.options.upload.validate) {
|
|||
|
|
isValidate = vditor.options.upload.validate(fileList);
|
|||
|
|
if (typeof isValidate === "string") {
|
|||
|
|
vditor.tip.show(isValidate);
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
editorElement = getElement(vditor);
|
|||
|
|
vditor.upload.range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
validateResult = validateFile(vditor, fileList);
|
|||
|
|
if (validateResult.length === 0) {
|
|||
|
|
if (element) {
|
|||
|
|
element.value = "";
|
|||
|
|
}
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
formData = new FormData();
|
|||
|
|
extraData = vditor.options.upload.extraData;
|
|||
|
|
for (_i = 0, _a = Object.keys(extraData); _i < _a.length; _i++) {
|
|||
|
|
key = _a[_i];
|
|||
|
|
formData.append(key, extraData[key]);
|
|||
|
|
}
|
|||
|
|
for (i = 0, iMax = validateResult.length; i < iMax; i++) {
|
|||
|
|
formData.append(vditor.options.upload.fieldName, validateResult[i]);
|
|||
|
|
}
|
|||
|
|
xhr = new XMLHttpRequest();
|
|||
|
|
vditor.upload.xhr = xhr;
|
|||
|
|
xhr.open("POST", vditor.options.upload.url);
|
|||
|
|
if (vditor.options.upload.token) {
|
|||
|
|
xhr.setRequestHeader("X-Upload-Token", vditor.options.upload.token);
|
|||
|
|
}
|
|||
|
|
if (vditor.options.upload.withCredentials) {
|
|||
|
|
xhr.withCredentials = true;
|
|||
|
|
}
|
|||
|
|
setHeaders(vditor, xhr);
|
|||
|
|
vditor.upload.isUploading = true;
|
|||
|
|
editorElement.setAttribute("contenteditable", "false");
|
|||
|
|
xhr.onreadystatechange = function () {
|
|||
|
|
if (xhr.readyState === XMLHttpRequest.DONE) {
|
|||
|
|
vditor.upload.isUploading = false;
|
|||
|
|
editorElement.setAttribute("contenteditable", "true");
|
|||
|
|
if (xhr.status >= 200 && xhr.status < 300) {
|
|||
|
|
if (vditor.options.upload.success) {
|
|||
|
|
vditor.options.upload.success(editorElement, xhr.responseText);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var responseText = xhr.responseText;
|
|||
|
|
if (vditor.options.upload.format) {
|
|||
|
|
responseText = vditor.options.upload.format(files, xhr.responseText);
|
|||
|
|
}
|
|||
|
|
genUploadedLabel(responseText, vditor);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (vditor.options.upload.error) {
|
|||
|
|
vditor.options.upload.error(xhr.responseText);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.tip.show(xhr.responseText);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (element) {
|
|||
|
|
element.value = "";
|
|||
|
|
}
|
|||
|
|
vditor.upload.element.style.display = "none";
|
|||
|
|
vditor.upload.xhr = undefined;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
xhr.upload.onprogress = function (event) {
|
|||
|
|
if (!event.lengthComputable) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var progress = event.loaded / event.total * 100;
|
|||
|
|
vditor.upload.element.style.display = "block";
|
|||
|
|
var progressBar = vditor.upload.element;
|
|||
|
|
progressBar.style.width = progress + "%";
|
|||
|
|
};
|
|||
|
|
xhr.send(formData);
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}); };
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/wysiwyg/input.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var input_input = function (vditor, range, event) {
|
|||
|
|
var _a;
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestBlock */.F9)(range.startContainer);
|
|||
|
|
if (!blockElement) {
|
|||
|
|
// 使用顶级块元素,应使用 innerHTML
|
|||
|
|
blockElement = vditor.wysiwyg.element;
|
|||
|
|
}
|
|||
|
|
if (event && event.inputType !== "formatItalic"
|
|||
|
|
&& event.inputType !== "deleteByDrag"
|
|||
|
|
&& event.inputType !== "insertFromDrop"
|
|||
|
|
&& event.inputType !== "formatBold"
|
|||
|
|
&& event.inputType !== "formatRemove"
|
|||
|
|
&& event.inputType !== "formatStrikeThrough"
|
|||
|
|
&& event.inputType !== "insertUnorderedList"
|
|||
|
|
&& event.inputType !== "insertOrderedList"
|
|||
|
|
&& event.inputType !== "formatOutdent"
|
|||
|
|
&& event.inputType !== "formatIndent"
|
|||
|
|
&& event.inputType !== "" // document.execCommand('unlink', false)
|
|||
|
|
|| !event) {
|
|||
|
|
var previousAEmptyElement = previoueIsEmptyA(range.startContainer);
|
|||
|
|
if (previousAEmptyElement) {
|
|||
|
|
// 链接结尾回车不应该复制到下一行 https://github.com/Vanessa219/vditor/issues/163
|
|||
|
|
previousAEmptyElement.remove();
|
|||
|
|
}
|
|||
|
|
// 保存光标
|
|||
|
|
vditor.wysiwyg.element.querySelectorAll("wbr").forEach(function (wbr) {
|
|||
|
|
wbr.remove();
|
|||
|
|
});
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
// 在行首进行删除,后面的元素会带有样式,需清除
|
|||
|
|
blockElement.querySelectorAll("[style]").forEach(function (item) {
|
|||
|
|
item.removeAttribute("style");
|
|||
|
|
});
|
|||
|
|
// 移除空评论
|
|||
|
|
blockElement.querySelectorAll(".vditor-comment").forEach(function (item) {
|
|||
|
|
if (item.textContent.trim() === "") {
|
|||
|
|
item.classList.remove("vditor-comment", "vditor-comment--focus");
|
|||
|
|
item.removeAttribute("data-cmtids");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
// 在有评论的行首换行后,该行的前一段会带有评论标识
|
|||
|
|
(_a = blockElement.previousElementSibling) === null || _a === void 0 ? void 0 : _a.querySelectorAll(".vditor-comment").forEach(function (item) {
|
|||
|
|
if (item.textContent.trim() === "") {
|
|||
|
|
item.classList.remove("vditor-comment", "vditor-comment--focus");
|
|||
|
|
item.removeAttribute("data-cmtids");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
var html_1 = "";
|
|||
|
|
if (blockElement.getAttribute("data-type") === "link-ref-defs-block") {
|
|||
|
|
// 修改链接引用
|
|||
|
|
blockElement = vditor.wysiwyg.element;
|
|||
|
|
}
|
|||
|
|
var isWYSIWYGElement = blockElement.isEqualNode(vditor.wysiwyg.element);
|
|||
|
|
var footnoteElement = (0,hasClosest/* hasClosestByAttribute */.a1)(blockElement, "data-type", "footnotes-block");
|
|||
|
|
if (!isWYSIWYGElement) {
|
|||
|
|
// 列表需要到最顶层
|
|||
|
|
var topListElement = (0,hasClosest/* getTopList */.O9)(range.startContainer);
|
|||
|
|
if (topListElement && !footnoteElement) {
|
|||
|
|
var blockquoteElement = (0,hasClosestByHeadings/* hasClosestByTag */.S)(range.startContainer, "BLOCKQUOTE");
|
|||
|
|
if (blockquoteElement) {
|
|||
|
|
// li 中有 blockquote 就只渲染 blockquote
|
|||
|
|
blockElement = (0,hasClosest/* hasClosestBlock */.F9)(range.startContainer) || blockElement;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
blockElement = topListElement;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 修改脚注
|
|||
|
|
if (footnoteElement) {
|
|||
|
|
blockElement = footnoteElement;
|
|||
|
|
}
|
|||
|
|
html_1 = blockElement.outerHTML;
|
|||
|
|
if (blockElement.tagName === "UL" || blockElement.tagName === "OL") {
|
|||
|
|
// 如果为列表的话,需要把上下的列表都重绘
|
|||
|
|
var listPrevElement = blockElement.previousElementSibling;
|
|||
|
|
var listNextElement = blockElement.nextElementSibling;
|
|||
|
|
if (listPrevElement && (listPrevElement.tagName === "UL" || listPrevElement.tagName === "OL")) {
|
|||
|
|
html_1 = listPrevElement.outerHTML + html_1;
|
|||
|
|
listPrevElement.remove();
|
|||
|
|
}
|
|||
|
|
if (listNextElement && (listNextElement.tagName === "UL" || listNextElement.tagName === "OL")) {
|
|||
|
|
html_1 = html_1 + listNextElement.outerHTML;
|
|||
|
|
listNextElement.remove();
|
|||
|
|
}
|
|||
|
|
// firefox 列表回车不会产生新的 list item https://github.com/Vanessa219/vditor/issues/194
|
|||
|
|
html_1 = html_1.replace("<div><wbr><br></div>", "<li><p><wbr><br></p></li>");
|
|||
|
|
}
|
|||
|
|
if (!blockElement.innerText.startsWith("```")) {
|
|||
|
|
// 添加链接引用
|
|||
|
|
vditor.wysiwyg.element.querySelectorAll("[data-type='link-ref-defs-block']").forEach(function (item) {
|
|||
|
|
if (item && !blockElement.isEqualNode(item)) {
|
|||
|
|
html_1 += item.outerHTML;
|
|||
|
|
item.remove();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
// 添加脚注
|
|||
|
|
vditor.wysiwyg.element.querySelectorAll("[data-type='footnotes-block']").forEach(function (item) {
|
|||
|
|
if (item && !blockElement.isEqualNode(item)) {
|
|||
|
|
html_1 += item.outerHTML;
|
|||
|
|
item.remove();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
html_1 = blockElement.innerHTML;
|
|||
|
|
}
|
|||
|
|
// 合并多个 em, strong,s。以防止多个相同元素在一起时不满足 commonmark 规范,出现标记符
|
|||
|
|
html_1 = html_1.replace(/<\/(strong|b)><strong data-marker="\W{2}">/g, "")
|
|||
|
|
.replace(/<\/(em|i)><em data-marker="\W{1}">/g, "")
|
|||
|
|
.replace(/<\/(s|strike)><s data-marker="~{1,2}">/g, "");
|
|||
|
|
if (html_1 === '<p data-block="0">```<wbr></p>' && vditor.hint.recentLanguage) {
|
|||
|
|
html_1 = '<p data-block="0">```<wbr></p>'.replace("```", "```" + vditor.hint.recentLanguage);
|
|||
|
|
}
|
|||
|
|
log("SpinVditorDOM", html_1, "argument", vditor.options.debugger);
|
|||
|
|
html_1 = vditor.lute.SpinVditorDOM(html_1);
|
|||
|
|
log("SpinVditorDOM", html_1, "result", vditor.options.debugger);
|
|||
|
|
if (isWYSIWYGElement) {
|
|||
|
|
blockElement.innerHTML = html_1;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
blockElement.outerHTML = html_1;
|
|||
|
|
if (footnoteElement) {
|
|||
|
|
// 更新正文中的 tip
|
|||
|
|
var footnoteItemElement = (0,hasClosest/* hasTopClosestByTag */.E2)(vditor.wysiwyg.element.querySelector("wbr"), "LI");
|
|||
|
|
if (footnoteItemElement) {
|
|||
|
|
var footnoteRefElement = vditor.wysiwyg.element.querySelector("sup[data-type=\"footnotes-ref\"][data-footnotes-label=\"".concat(footnoteItemElement.getAttribute("data-marker"), "\"]"));
|
|||
|
|
if (footnoteRefElement) {
|
|||
|
|
footnoteRefElement.setAttribute("aria-label", footnoteItemElement.textContent.trim().substr(0, 24));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var firstLinkRefDefElement_1;
|
|||
|
|
var allLinkRefDefsElement = vditor.wysiwyg.element.querySelectorAll("[data-type='link-ref-defs-block']");
|
|||
|
|
allLinkRefDefsElement.forEach(function (item, index) {
|
|||
|
|
if (index === 0) {
|
|||
|
|
firstLinkRefDefElement_1 = item;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
firstLinkRefDefElement_1.insertAdjacentHTML("beforeend", item.innerHTML);
|
|||
|
|
item.remove();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (allLinkRefDefsElement.length > 0) {
|
|||
|
|
vditor.wysiwyg.element.insertAdjacentElement("beforeend", allLinkRefDefsElement[0]);
|
|||
|
|
}
|
|||
|
|
// 脚注合并后添加的末尾
|
|||
|
|
var firstFootnoteElement_1;
|
|||
|
|
var allFootnoteElement = vditor.wysiwyg.element.querySelectorAll("[data-type='footnotes-block']");
|
|||
|
|
allFootnoteElement.forEach(function (item, index) {
|
|||
|
|
if (index === 0) {
|
|||
|
|
firstFootnoteElement_1 = item;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
firstFootnoteElement_1.insertAdjacentHTML("beforeend", item.innerHTML);
|
|||
|
|
item.remove();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (allFootnoteElement.length > 0) {
|
|||
|
|
vditor.wysiwyg.element.insertAdjacentElement("beforeend", allFootnoteElement[0]);
|
|||
|
|
}
|
|||
|
|
// 设置光标
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
vditor.wysiwyg.element.querySelectorAll(".vditor-wysiwyg__preview[data-render='2']")
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
processCodeRender(item, vditor);
|
|||
|
|
});
|
|||
|
|
if (event && (event.inputType === "deleteContentBackward" || event.inputType === "deleteContentForward") &&
|
|||
|
|
vditor.options.comment.enable) {
|
|||
|
|
vditor.wysiwyg.triggerRemoveComment(vditor);
|
|||
|
|
vditor.options.comment.adjustTop(vditor.wysiwyg.getComments(vditor, true));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
renderToc(vditor);
|
|||
|
|
afterRenderEvent(vditor, {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: true,
|
|||
|
|
enableInput: true,
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/util/fixBrowserBehavior.ts
|
|||
|
|
var __makeTemplateObject = (undefined && undefined.__makeTemplateObject) || function (cooked, raw) {
|
|||
|
|
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|||
|
|
return cooked;
|
|||
|
|
};
|
|||
|
|
var fixBrowserBehavior_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|||
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|||
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|||
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|||
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|||
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|||
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var fixBrowserBehavior_generator = (undefined && undefined.__generator) || function (thisArg, body) {
|
|||
|
|
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|||
|
|
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|||
|
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|||
|
|
function step(op) {
|
|||
|
|
if (f) throw new TypeError("Generator is already executing.");
|
|||
|
|
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|||
|
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|||
|
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|||
|
|
switch (op[0]) {
|
|||
|
|
case 0: case 1: t = op; break;
|
|||
|
|
case 4: _.label++; return { value: op[1], done: false };
|
|||
|
|
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|||
|
|
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|||
|
|
default:
|
|||
|
|
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|||
|
|
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|||
|
|
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|||
|
|
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|||
|
|
if (t[2]) _.ops.pop();
|
|||
|
|
_.trys.pop(); continue;
|
|||
|
|
}
|
|||
|
|
op = body.call(thisArg, _);
|
|||
|
|
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|||
|
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/508 软键盘无法删除空块
|
|||
|
|
var fixGSKeyBackspace = function (event, vditor, startContainer) {
|
|||
|
|
if (event.keyCode === 229 && event.code === "" && event.key === "Unidentified" && vditor.currentMode !== "sv") {
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestBlock */.F9)(startContainer);
|
|||
|
|
// 移动端的标点符号都显示为 299,因此需限定为空删除的条件
|
|||
|
|
if (blockElement && blockElement.textContent.trim() === "") {
|
|||
|
|
vditor[vditor.currentMode].composingLock = true;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
};
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/361 代码块后输入中文
|
|||
|
|
var fixCJKPosition = function (range, vditor, event) {
|
|||
|
|
if (event.key === "Enter" || event.key === "Tab" || event.key === "Backspace" || event.key.indexOf("Arrow") > -1
|
|||
|
|
|| (0,compatibility/* isCtrl */.yl)(event) || event.key === "Escape" || event.shiftKey || event.altKey) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var pLiElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(range.startContainer, "P") ||
|
|||
|
|
(0,hasClosest/* hasClosestByMatchTag */.lG)(range.startContainer, "LI");
|
|||
|
|
if (pLiElement && (0,selection/* getSelectPosition */.im)(pLiElement, vditor[vditor.currentMode].element, range).start === 0) {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/1289 WKWebView切换输入法产生六分之一空格,造成光标错位
|
|||
|
|
if (pLiElement.nodeValue) {
|
|||
|
|
pLiElement.nodeValue = pLiElement.nodeValue.replace(/\u2006/g, "");
|
|||
|
|
}
|
|||
|
|
var zwspNode = document.createTextNode(constants/* Constants.ZWSP */.g.ZWSP);
|
|||
|
|
range.insertNode(zwspNode);
|
|||
|
|
range.setStartAfter(zwspNode);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/381 光标在内联数学公式中无法向下移动
|
|||
|
|
var fixCursorDownInlineMath = function (range, key) {
|
|||
|
|
if (key === "ArrowDown" || key === "ArrowUp") {
|
|||
|
|
var inlineElement = (0,hasClosest/* hasClosestByAttribute */.a1)(range.startContainer, "data-type", "math-inline") ||
|
|||
|
|
(0,hasClosest/* hasClosestByAttribute */.a1)(range.startContainer, "data-type", "html-entity") ||
|
|||
|
|
(0,hasClosest/* hasClosestByAttribute */.a1)(range.startContainer, "data-type", "html-inline");
|
|||
|
|
if (inlineElement) {
|
|||
|
|
if (key === "ArrowDown") {
|
|||
|
|
range.setStartAfter(inlineElement.parentElement);
|
|||
|
|
}
|
|||
|
|
if (key === "ArrowUp") {
|
|||
|
|
range.setStartBefore(inlineElement.parentElement);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var insertEmptyBlock = function (vditor, position) {
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestBlock */.F9)(range.startContainer);
|
|||
|
|
if (blockElement) {
|
|||
|
|
blockElement.insertAdjacentHTML(position, "<p data-block=\"0\">".concat(constants/* Constants.ZWSP */.g.ZWSP, "<wbr>\n</p>"));
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
highlightToolbar(vditor);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var isFirstCell = function (cellElement) {
|
|||
|
|
var tableElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(cellElement, "TABLE");
|
|||
|
|
if (tableElement && tableElement.rows[0].cells[0].isSameNode(cellElement)) {
|
|||
|
|
return tableElement;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var isLastCell = function (cellElement) {
|
|||
|
|
var tableElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(cellElement, "TABLE");
|
|||
|
|
if (tableElement && tableElement.lastElementChild.lastElementChild.lastElementChild.isSameNode(cellElement)) {
|
|||
|
|
return tableElement;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
// 光标设置到前一个表格中
|
|||
|
|
var goPreviousCell = function (cellElement, range, isSelected) {
|
|||
|
|
if (isSelected === void 0) { isSelected = true; }
|
|||
|
|
var previousElement = cellElement.previousElementSibling;
|
|||
|
|
if (!previousElement) {
|
|||
|
|
if (cellElement.parentElement.previousElementSibling) {
|
|||
|
|
previousElement = cellElement.parentElement.previousElementSibling.lastElementChild;
|
|||
|
|
}
|
|||
|
|
else if (cellElement.parentElement.parentElement.tagName === "TBODY" &&
|
|||
|
|
cellElement.parentElement.parentElement.previousElementSibling) {
|
|||
|
|
previousElement = cellElement.parentElement
|
|||
|
|
.parentElement.previousElementSibling.lastElementChild.lastElementChild;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
previousElement = null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (previousElement) {
|
|||
|
|
range.selectNodeContents(previousElement);
|
|||
|
|
if (!isSelected) {
|
|||
|
|
range.collapse(false);
|
|||
|
|
}
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
return previousElement;
|
|||
|
|
};
|
|||
|
|
var insertAfterBlock = function (vditor, event, range, element, blockElement) {
|
|||
|
|
var position = (0,selection/* getSelectPosition */.im)(element, vditor[vditor.currentMode].element, range);
|
|||
|
|
if ((event.key === "ArrowDown" && element.textContent.trimRight().substr(position.start).indexOf("\n") === -1) ||
|
|||
|
|
(event.key === "ArrowRight" && position.start >= element.textContent.trimRight().length)) {
|
|||
|
|
var nextElement = blockElement.nextElementSibling;
|
|||
|
|
if (!nextElement ||
|
|||
|
|
(nextElement && (nextElement.tagName === "TABLE" || nextElement.getAttribute("data-type")))) {
|
|||
|
|
blockElement.insertAdjacentHTML("afterend", "<p data-block=\"0\">".concat(constants/* Constants.ZWSP */.g.ZWSP, "<wbr></p>"));
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.selectNodeContents(nextElement);
|
|||
|
|
range.collapse(true);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var insertBeforeBlock = function (vditor, event, range, element, blockElement) {
|
|||
|
|
var position = (0,selection/* getSelectPosition */.im)(element, vditor[vditor.currentMode].element, range);
|
|||
|
|
if ((event.key === "ArrowUp" && element.textContent.substr(0, position.start).indexOf("\n") === -1) ||
|
|||
|
|
((event.key === "ArrowLeft" || (event.key === "Backspace" && range.toString() === "")) &&
|
|||
|
|
position.start === 0)) {
|
|||
|
|
var previousElement = blockElement.previousElementSibling;
|
|||
|
|
// table || code
|
|||
|
|
if (!previousElement ||
|
|||
|
|
(previousElement && (previousElement.tagName === "TABLE" || previousElement.getAttribute("data-type")))) {
|
|||
|
|
blockElement.insertAdjacentHTML("beforebegin", "<p data-block=\"0\">".concat(constants/* Constants.ZWSP */.g.ZWSP, "<wbr></p>"));
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.selectNodeContents(previousElement);
|
|||
|
|
range.collapse(false);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var listToggle = function (vditor, range, type, cancel) {
|
|||
|
|
if (cancel === void 0) { cancel = true; }
|
|||
|
|
var itemElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(range.startContainer, "LI");
|
|||
|
|
vditor[vditor.currentMode].element.querySelectorAll("wbr").forEach(function (wbr) {
|
|||
|
|
wbr.remove();
|
|||
|
|
});
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
if (cancel && itemElement) {
|
|||
|
|
// 取消
|
|||
|
|
var pHTML = "";
|
|||
|
|
for (var i = 0; i < itemElement.parentElement.childElementCount; i++) {
|
|||
|
|
var inputElement = itemElement.parentElement.children[i].querySelector("input");
|
|||
|
|
if (inputElement) {
|
|||
|
|
inputElement.remove();
|
|||
|
|
}
|
|||
|
|
pHTML += "<p data-block=\"0\">".concat(itemElement.parentElement.children[i].innerHTML.trimLeft(), "</p>");
|
|||
|
|
}
|
|||
|
|
itemElement.parentElement.insertAdjacentHTML("beforebegin", pHTML);
|
|||
|
|
itemElement.parentElement.remove();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (!itemElement) {
|
|||
|
|
// 添加
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestByAttribute */.a1)(range.startContainer, "data-block", "0");
|
|||
|
|
if (!blockElement) {
|
|||
|
|
vditor[vditor.currentMode].element.querySelector("wbr").remove();
|
|||
|
|
blockElement = vditor[vditor.currentMode].element.querySelector("p");
|
|||
|
|
blockElement.innerHTML = "<wbr>";
|
|||
|
|
}
|
|||
|
|
if (type === "check") {
|
|||
|
|
blockElement.insertAdjacentHTML("beforebegin", "<ul data-block=\"0\"><li class=\"vditor-task\"><input type=\"checkbox\" /> ".concat(blockElement.innerHTML, "</li></ul>"));
|
|||
|
|
blockElement.remove();
|
|||
|
|
}
|
|||
|
|
else if (type === "list") {
|
|||
|
|
blockElement.insertAdjacentHTML("beforebegin", "<ul data-block=\"0\"><li>".concat(blockElement.innerHTML, "</li></ul>"));
|
|||
|
|
blockElement.remove();
|
|||
|
|
}
|
|||
|
|
else if (type === "ordered-list") {
|
|||
|
|
blockElement.insertAdjacentHTML("beforebegin", "<ol data-block=\"0\"><li>".concat(blockElement.innerHTML, "</li></ol>"));
|
|||
|
|
blockElement.remove();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// 切换
|
|||
|
|
if (type === "check") {
|
|||
|
|
itemElement.parentElement.querySelectorAll("li").forEach(function (item) {
|
|||
|
|
item.insertAdjacentHTML("afterbegin", "<input type=\"checkbox\" />".concat(item.textContent.indexOf(" ") === 0 ? "" : " "));
|
|||
|
|
item.classList.add("vditor-task");
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (itemElement.querySelector("input")) {
|
|||
|
|
itemElement.parentElement.querySelectorAll("li").forEach(function (item) {
|
|||
|
|
item.querySelector("input").remove();
|
|||
|
|
item.classList.remove("vditor-task");
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
var element = void 0;
|
|||
|
|
if (type === "list") {
|
|||
|
|
element = document.createElement("ul");
|
|||
|
|
element.setAttribute("data-marker", "*");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
element = document.createElement("ol");
|
|||
|
|
element.setAttribute("data-marker", "1.");
|
|||
|
|
}
|
|||
|
|
element.setAttribute("data-block", "0");
|
|||
|
|
element.setAttribute("data-tight", itemElement.parentElement.getAttribute("data-tight"));
|
|||
|
|
element.innerHTML = itemElement.parentElement.innerHTML;
|
|||
|
|
itemElement.parentElement.parentNode.replaceChild(element, itemElement.parentElement);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var listIndent = function (vditor, liElement, range) {
|
|||
|
|
var previousElement = liElement.previousElementSibling;
|
|||
|
|
if (liElement && previousElement) {
|
|||
|
|
var liElements_1 = [liElement];
|
|||
|
|
Array.from(range.cloneContents().children).forEach(function (item, index) {
|
|||
|
|
if (item.nodeType !== 3 && liElement && item.textContent.trim() !== ""
|
|||
|
|
&& liElement.getAttribute("data-node-id") === item.getAttribute("data-node-id")) {
|
|||
|
|
if (index !== 0) {
|
|||
|
|
liElements_1.push(liElement);
|
|||
|
|
}
|
|||
|
|
liElement = liElement.nextElementSibling;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
vditor[vditor.currentMode].element.querySelectorAll("wbr").forEach(function (wbr) {
|
|||
|
|
wbr.remove();
|
|||
|
|
});
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
var liParentElement = previousElement.parentElement;
|
|||
|
|
var liHTML_1 = "";
|
|||
|
|
liElements_1.forEach(function (item) {
|
|||
|
|
var marker = item.getAttribute("data-marker");
|
|||
|
|
if (marker.length !== 1) {
|
|||
|
|
marker = "1".concat(marker.slice(-1));
|
|||
|
|
}
|
|||
|
|
liHTML_1 += "<li data-node-id=\"".concat(item.getAttribute("data-node-id"), "\" data-marker=\"").concat(marker, "\">").concat(item.innerHTML, "</li>");
|
|||
|
|
item.remove();
|
|||
|
|
});
|
|||
|
|
previousElement.insertAdjacentHTML("beforeend", "<".concat(liParentElement.tagName, " data-block=\"0\">").concat(liHTML_1, "</").concat(liParentElement.tagName, ">"));
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
liParentElement.outerHTML = vditor.lute.SpinVditorDOM(liParentElement.outerHTML);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
liParentElement.outerHTML = vditor.lute.SpinVditorIRDOM(liParentElement.outerHTML);
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
var tempTopListElement = (0,hasClosest/* getTopList */.O9)(range.startContainer);
|
|||
|
|
if (tempTopListElement) {
|
|||
|
|
tempTopListElement.querySelectorAll(".vditor-".concat(vditor.currentMode, "__preview[data-render='2']"))
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
processCodeRender(item, vditor);
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
item.previousElementSibling.setAttribute("style", "display:none");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
highlightToolbar(vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor[vditor.currentMode].element.focus();
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var listOutdent = function (vditor, liElement, range, topListElement) {
|
|||
|
|
var liParentLiElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(liElement.parentElement, "LI");
|
|||
|
|
if (liParentLiElement) {
|
|||
|
|
vditor[vditor.currentMode].element.querySelectorAll("wbr").forEach(function (wbr) {
|
|||
|
|
wbr.remove();
|
|||
|
|
});
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
var liParentElement = liElement.parentElement;
|
|||
|
|
var liParentAfterElement = liParentElement.cloneNode();
|
|||
|
|
var liElements_2 = [liElement];
|
|||
|
|
Array.from(range.cloneContents().children).forEach(function (item, index) {
|
|||
|
|
if (item.nodeType !== 3 && liElement && item.textContent.trim() !== "" &&
|
|||
|
|
liElement.getAttribute("data-node-id") === item.getAttribute("data-node-id")) {
|
|||
|
|
if (index !== 0) {
|
|||
|
|
liElements_2.push(liElement);
|
|||
|
|
}
|
|||
|
|
liElement = liElement.nextElementSibling;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
var isMatch_1 = false;
|
|||
|
|
var afterHTML_1 = "";
|
|||
|
|
liParentElement.querySelectorAll("li").forEach(function (item) {
|
|||
|
|
if (isMatch_1) {
|
|||
|
|
afterHTML_1 += item.outerHTML;
|
|||
|
|
if (!item.nextElementSibling && !item.previousElementSibling) {
|
|||
|
|
item.parentElement.remove();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
item.remove();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (item.isSameNode(liElements_2[liElements_2.length - 1])) {
|
|||
|
|
isMatch_1 = true;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
liElements_2.reverse().forEach(function (item) {
|
|||
|
|
liParentLiElement.insertAdjacentElement("afterend", item);
|
|||
|
|
});
|
|||
|
|
if (afterHTML_1) {
|
|||
|
|
liParentAfterElement.innerHTML = afterHTML_1;
|
|||
|
|
liElements_2[0].insertAdjacentElement("beforeend", liParentAfterElement);
|
|||
|
|
}
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
topListElement.outerHTML = vditor.lute.SpinVditorDOM(topListElement.outerHTML);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
topListElement.outerHTML = vditor.lute.SpinVditorIRDOM(topListElement.outerHTML);
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
var tempTopListElement = (0,hasClosest/* getTopList */.O9)(range.startContainer);
|
|||
|
|
if (tempTopListElement) {
|
|||
|
|
tempTopListElement.querySelectorAll(".vditor-".concat(vditor.currentMode, "__preview[data-render='2']"))
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
processCodeRender(item, vditor);
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
item.previousElementSibling.setAttribute("style", "display:none");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
highlightToolbar(vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor[vditor.currentMode].element.focus();
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var setTableAlign = function (tableElement, type) {
|
|||
|
|
var cell = getSelection().getRangeAt(0).startContainer.parentElement;
|
|||
|
|
var columnCnt = tableElement.rows[0].cells.length;
|
|||
|
|
var rowCnt = tableElement.rows.length;
|
|||
|
|
var currentColumn = 0;
|
|||
|
|
for (var i = 0; i < rowCnt; i++) {
|
|||
|
|
for (var j = 0; j < columnCnt; j++) {
|
|||
|
|
if (tableElement.rows[i].cells[j].isSameNode(cell)) {
|
|||
|
|
currentColumn = j;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
for (var k = 0; k < rowCnt; k++) {
|
|||
|
|
tableElement.rows[k].cells[currentColumn].setAttribute("align", type);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var isHrMD = function (text) {
|
|||
|
|
// - _ *
|
|||
|
|
var marker = text.trimRight().split("\n").pop();
|
|||
|
|
if (marker === "") {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (marker.replace(/ |-/g, "") === ""
|
|||
|
|
|| marker.replace(/ |_/g, "") === ""
|
|||
|
|
|| marker.replace(/ |\*/g, "") === "") {
|
|||
|
|
if (marker.replace(/ /g, "").length > 2) {
|
|||
|
|
if (marker.indexOf("-") > -1 && marker.trimLeft().indexOf(" ") === -1
|
|||
|
|
&& text.trimRight().split("\n").length > 1) {
|
|||
|
|
// 满足 heading
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (marker.indexOf(" ") === 0 || marker.indexOf("\t") === 0) {
|
|||
|
|
// 代码块
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var isHeadingMD = function (text) {
|
|||
|
|
// - =
|
|||
|
|
var textArray = text.trimRight().split("\n");
|
|||
|
|
text = textArray.pop();
|
|||
|
|
if (text.indexOf(" ") === 0 || text.indexOf("\t") === 0) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
text = text.trimLeft();
|
|||
|
|
if (text === "" || textArray.length === 0) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (text.replace(/-/g, "") === ""
|
|||
|
|
|| text.replace(/=/g, "") === "") {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var execAfterRender = function (vditor, options) {
|
|||
|
|
if (options === void 0) { options = {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: false,
|
|||
|
|
enableInput: true,
|
|||
|
|
}; }
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
afterRenderEvent(vditor, options);
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "ir") {
|
|||
|
|
process_processAfterRender(vditor, options);
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "sv") {
|
|||
|
|
processAfterRender(vditor, options);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var fixList = function (range, vditor, pElement, event) {
|
|||
|
|
var _a;
|
|||
|
|
var startContainer = range.startContainer;
|
|||
|
|
var liElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "LI");
|
|||
|
|
if (liElement) {
|
|||
|
|
if (!(0,compatibility/* isCtrl */.yl)(event) && !event.altKey && event.key === "Enter" &&
|
|||
|
|
// fix li 中有多个 P 时,在第一个 P 中换行会在下方生成新的 li
|
|||
|
|
(!event.shiftKey && pElement && liElement.contains(pElement) && pElement.nextElementSibling)) {
|
|||
|
|
if (liElement && !liElement.textContent.endsWith("\n")) {
|
|||
|
|
// li 结尾需 \n
|
|||
|
|
liElement.insertAdjacentText("beforeend", "\n");
|
|||
|
|
}
|
|||
|
|
range.insertNode(document.createTextNode("\n\n"));
|
|||
|
|
range.collapse(false);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (!(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey && !event.altKey && event.key === "Backspace" &&
|
|||
|
|
!liElement.previousElementSibling && range.toString() === "" &&
|
|||
|
|
(0,selection/* getSelectPosition */.im)(liElement, vditor[vditor.currentMode].element, range).start === 0) {
|
|||
|
|
// 光标位于点和第一个字符中间时,无法删除 li 元素
|
|||
|
|
if (liElement.nextElementSibling) {
|
|||
|
|
liElement.parentElement.insertAdjacentHTML("beforebegin", "<p data-block=\"0\"><wbr>".concat(liElement.innerHTML, "</p>"));
|
|||
|
|
liElement.remove();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
liElement.parentElement.outerHTML = "<p data-block=\"0\"><wbr>".concat(liElement.innerHTML, "</p>");
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 空列表删除后与上一级段落对齐
|
|||
|
|
if (!(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey && !event.altKey && event.key === "Backspace" &&
|
|||
|
|
liElement.textContent.trim().replace(constants/* Constants.ZWSP */.g.ZWSP, "") === "" &&
|
|||
|
|
range.toString() === "" && ((_a = liElement.previousElementSibling) === null || _a === void 0 ? void 0 : _a.tagName) === "LI") {
|
|||
|
|
liElement.previousElementSibling.insertAdjacentText("beforeend", "\n\n");
|
|||
|
|
range.selectNodeContents(liElement.previousElementSibling);
|
|||
|
|
range.collapse(false);
|
|||
|
|
liElement.remove();
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (!(0,compatibility/* isCtrl */.yl)(event) && !event.altKey && event.key === "Tab") {
|
|||
|
|
// 光标位于第一/零字符时,tab 用于列表的缩进
|
|||
|
|
var isFirst = false;
|
|||
|
|
if (range.startOffset === 0
|
|||
|
|
&& ((startContainer.nodeType === 3 && !startContainer.previousSibling)
|
|||
|
|
|| (startContainer.nodeType !== 3 && startContainer.nodeName === "LI"))) {
|
|||
|
|
// 有序/无序列表
|
|||
|
|
isFirst = true;
|
|||
|
|
}
|
|||
|
|
else if (liElement.classList.contains("vditor-task") && range.startOffset === 1
|
|||
|
|
&& startContainer.previousSibling.nodeType !== 3
|
|||
|
|
&& startContainer.previousSibling.tagName === "INPUT") {
|
|||
|
|
// 任务列表
|
|||
|
|
isFirst = true;
|
|||
|
|
}
|
|||
|
|
if (isFirst || range.toString() !== "") {
|
|||
|
|
if (event.shiftKey) {
|
|||
|
|
listOutdent(vditor, liElement, range, liElement.parentElement);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
listIndent(vditor, liElement, range);
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
// tab 处理: block code render, table, 列表第一个字符中的 tab 处理单独写在上面
|
|||
|
|
var fixTab = function (vditor, range, event) {
|
|||
|
|
if (vditor.options.tab && event.key === "Tab") {
|
|||
|
|
if (event.shiftKey) {
|
|||
|
|
// TODO shift+tab
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (range.toString() === "") {
|
|||
|
|
range.insertNode(document.createTextNode(vditor.options.tab));
|
|||
|
|
range.collapse(false);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.extractContents();
|
|||
|
|
range.insertNode(document.createTextNode(vditor.options.tab));
|
|||
|
|
range.collapse(false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var fixMarkdown = function (event, vditor, pElement, range) {
|
|||
|
|
if (!pElement) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (!(0,compatibility/* isCtrl */.yl)(event) && !event.altKey && event.key === "Enter") {
|
|||
|
|
var pText = String.raw(templateObject_1 || (templateObject_1 = __makeTemplateObject(["", ""], ["", ""])), pElement.textContent).replace(/\\\|/g, "").trim();
|
|||
|
|
var pTextList = pText.split("|");
|
|||
|
|
if (pText.startsWith("|") && pText.endsWith("|") && pTextList.length > 3) {
|
|||
|
|
// table 自动完成
|
|||
|
|
var tableHeaderMD = pTextList.map(function () { return "---"; }).join("|");
|
|||
|
|
tableHeaderMD =
|
|||
|
|
pElement.textContent + "\n" + tableHeaderMD.substring(3, tableHeaderMD.length - 3) + "\n|<wbr>";
|
|||
|
|
pElement.outerHTML = vditor.lute.SpinVditorDOM(tableHeaderMD);
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// hr 渲染
|
|||
|
|
if (isHrMD(pElement.innerHTML) && pElement.previousElementSibling) {
|
|||
|
|
// 软换行后 hr 前有内容
|
|||
|
|
var pInnerHTML = "";
|
|||
|
|
var innerHTMLList = pElement.innerHTML.trimRight().split("\n");
|
|||
|
|
if (innerHTMLList.length > 1) {
|
|||
|
|
innerHTMLList.pop();
|
|||
|
|
pInnerHTML = "<p data-block=\"0\">".concat(innerHTMLList.join("\n"), "</p>");
|
|||
|
|
}
|
|||
|
|
pElement.insertAdjacentHTML("afterend", "".concat(pInnerHTML, "<hr data-block=\"0\"><p data-block=\"0\"><wbr>\n</p>"));
|
|||
|
|
pElement.remove();
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (isHeadingMD(pElement.innerHTML)) {
|
|||
|
|
// heading 渲染
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
pElement.outerHTML = vditor.lute.SpinVditorDOM(pElement.innerHTML + '<p data-block="0"><wbr>\n</p>');
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
pElement.outerHTML = vditor.lute.SpinVditorIRDOM(pElement.innerHTML + '<p data-block="0"><wbr>\n</p>');
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 软换行会被切割 https://github.com/Vanessa219/vditor/issues/220
|
|||
|
|
if (range.collapsed && pElement.previousElementSibling && event.key === "Backspace" &&
|
|||
|
|
!(0,compatibility/* isCtrl */.yl)(event) && !event.altKey && !event.shiftKey &&
|
|||
|
|
pElement.textContent.trimRight().split("\n").length > 1 &&
|
|||
|
|
(0,selection/* getSelectPosition */.im)(pElement, vditor[vditor.currentMode].element, range).start === 0) {
|
|||
|
|
var lastElement = (0,hasClosest/* getLastNode */.DX)(pElement.previousElementSibling);
|
|||
|
|
if (!lastElement.textContent.endsWith("\n")) {
|
|||
|
|
lastElement.textContent = lastElement.textContent + "\n";
|
|||
|
|
}
|
|||
|
|
lastElement.parentElement.insertAdjacentHTML("beforeend", "<wbr>".concat(pElement.innerHTML));
|
|||
|
|
pElement.remove();
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var insertRow = function (vditor, range, cellElement) {
|
|||
|
|
var rowHTML = "";
|
|||
|
|
for (var m = 0; m < cellElement.parentElement.childElementCount; m++) {
|
|||
|
|
rowHTML += "<td align=\"".concat(cellElement.parentElement.children[m].getAttribute("align"), "\"> </td>");
|
|||
|
|
}
|
|||
|
|
if (cellElement.tagName === "TH") {
|
|||
|
|
cellElement.parentElement.parentElement.insertAdjacentHTML("afterend", "<tbody><tr>".concat(rowHTML, "</tr></tbody>"));
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
cellElement.parentElement.insertAdjacentHTML("afterend", "<tr>".concat(rowHTML, "</tr>"));
|
|||
|
|
}
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
};
|
|||
|
|
var insertRowAbove = function (vditor, range, cellElement) {
|
|||
|
|
var rowHTML = "";
|
|||
|
|
for (var m = 0; m < cellElement.parentElement.childElementCount; m++) {
|
|||
|
|
if (cellElement.tagName === "TH") {
|
|||
|
|
rowHTML += "<th align=\"".concat(cellElement.parentElement.children[m].getAttribute("align"), "\"> </th>");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
rowHTML += "<td align=\"".concat(cellElement.parentElement.children[m].getAttribute("align"), "\"> </td>");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (cellElement.tagName === "TH") {
|
|||
|
|
cellElement.parentElement.parentElement.insertAdjacentHTML("beforebegin", "<thead><tr>".concat(rowHTML, "</tr></thead>"));
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
var theadHTML = cellElement.parentElement.innerHTML.replace(/<th>/g, "<td>").replace(/<\/th>/g, "</td>");
|
|||
|
|
cellElement.parentElement.parentElement.nextElementSibling.insertAdjacentHTML("afterbegin", theadHTML);
|
|||
|
|
cellElement.parentElement.parentElement.remove();
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.ir.element, range);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
cellElement.parentElement.insertAdjacentHTML("beforebegin", "<tr>".concat(rowHTML, "</tr>"));
|
|||
|
|
}
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
};
|
|||
|
|
var insertColumn = function (vditor, tableElement, cellElement, type) {
|
|||
|
|
if (type === void 0) { type = "afterend"; }
|
|||
|
|
var index = 0;
|
|||
|
|
var previousElement = cellElement.previousElementSibling;
|
|||
|
|
while (previousElement) {
|
|||
|
|
index++;
|
|||
|
|
previousElement = previousElement.previousElementSibling;
|
|||
|
|
}
|
|||
|
|
for (var i = 0; i < tableElement.rows.length; i++) {
|
|||
|
|
if (i === 0) {
|
|||
|
|
tableElement.rows[i].cells[index].insertAdjacentHTML(type, "<th> </th>");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
tableElement.rows[i].cells[index].insertAdjacentHTML(type, "<td> </td>");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
};
|
|||
|
|
var deleteRow = function (vditor, range, cellElement) {
|
|||
|
|
if (cellElement.tagName === "TD") {
|
|||
|
|
var tbodyElement = cellElement.parentElement.parentElement;
|
|||
|
|
if (cellElement.parentElement.previousElementSibling) {
|
|||
|
|
range.selectNodeContents(cellElement.parentElement.previousElementSibling.lastElementChild);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.selectNodeContents(tbodyElement.previousElementSibling.lastElementChild.lastElementChild);
|
|||
|
|
}
|
|||
|
|
if (tbodyElement.childElementCount === 1) {
|
|||
|
|
tbodyElement.remove();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
cellElement.parentElement.remove();
|
|||
|
|
}
|
|||
|
|
range.collapse(false);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var deleteColumn = function (vditor, range, tableElement, cellElement) {
|
|||
|
|
var index = 0;
|
|||
|
|
var previousElement = cellElement.previousElementSibling;
|
|||
|
|
while (previousElement) {
|
|||
|
|
index++;
|
|||
|
|
previousElement = previousElement.previousElementSibling;
|
|||
|
|
}
|
|||
|
|
if (cellElement.previousElementSibling || cellElement.nextElementSibling) {
|
|||
|
|
range.selectNodeContents(cellElement.previousElementSibling || cellElement.nextElementSibling);
|
|||
|
|
range.collapse(true);
|
|||
|
|
}
|
|||
|
|
for (var i = 0; i < tableElement.rows.length; i++) {
|
|||
|
|
var cells = tableElement.rows[i].cells;
|
|||
|
|
if (cells.length === 1) {
|
|||
|
|
tableElement.remove();
|
|||
|
|
highlightToolbar(vditor);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
cells[index].remove();
|
|||
|
|
}
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
};
|
|||
|
|
var fixTable = function (vditor, event, range) {
|
|||
|
|
var startContainer = range.startContainer;
|
|||
|
|
var cellElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TD") ||
|
|||
|
|
(0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "TH");
|
|||
|
|
if (cellElement) {
|
|||
|
|
// 换行或软换行:在 cell 中添加 br
|
|||
|
|
if (!(0,compatibility/* isCtrl */.yl)(event) && !event.altKey && event.key === "Enter") {
|
|||
|
|
if (!cellElement.lastElementChild ||
|
|||
|
|
(cellElement.lastElementChild && (!cellElement.lastElementChild.isSameNode(cellElement.lastChild) ||
|
|||
|
|
cellElement.lastElementChild.tagName !== "BR"))) {
|
|||
|
|
cellElement.insertAdjacentHTML("beforeend", "<br>");
|
|||
|
|
}
|
|||
|
|
var brElement = document.createElement("br");
|
|||
|
|
range.insertNode(brElement);
|
|||
|
|
range.setStartAfter(brElement);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// tab:光标移向下一个 cell
|
|||
|
|
if (event.key === "Tab") {
|
|||
|
|
if (event.shiftKey) {
|
|||
|
|
// shift + tab 光标移动到前一个 cell
|
|||
|
|
goPreviousCell(cellElement, range);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
var nextElement = cellElement.nextElementSibling;
|
|||
|
|
if (!nextElement) {
|
|||
|
|
if (cellElement.parentElement.nextElementSibling) {
|
|||
|
|
nextElement = cellElement.parentElement.nextElementSibling.firstElementChild;
|
|||
|
|
}
|
|||
|
|
else if (cellElement.parentElement.parentElement.tagName === "THEAD" &&
|
|||
|
|
cellElement.parentElement.parentElement.nextElementSibling) {
|
|||
|
|
nextElement =
|
|||
|
|
cellElement.parentElement.parentElement.nextElementSibling.firstElementChild.firstElementChild;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
nextElement = null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (nextElement) {
|
|||
|
|
range.selectNodeContents(nextElement);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
var tableElement = cellElement.parentElement.parentElement.parentElement;
|
|||
|
|
if (event.key === "ArrowUp") {
|
|||
|
|
event.preventDefault();
|
|||
|
|
if (cellElement.tagName === "TH") {
|
|||
|
|
if (tableElement.previousElementSibling) {
|
|||
|
|
range.selectNodeContents(tableElement.previousElementSibling);
|
|||
|
|
range.collapse(false);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
insertEmptyBlock(vditor, "beforebegin");
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
var m = 0;
|
|||
|
|
var trElement = cellElement.parentElement;
|
|||
|
|
for (; m < trElement.cells.length; m++) {
|
|||
|
|
if (trElement.cells[m].isSameNode(cellElement)) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var previousElement = trElement.previousElementSibling;
|
|||
|
|
if (!previousElement) {
|
|||
|
|
previousElement = trElement.parentElement.previousElementSibling.firstChild;
|
|||
|
|
}
|
|||
|
|
range.selectNodeContents(previousElement.cells[m]);
|
|||
|
|
range.collapse(false);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (event.key === "ArrowDown") {
|
|||
|
|
event.preventDefault();
|
|||
|
|
var trElement = cellElement.parentElement;
|
|||
|
|
if (!trElement.nextElementSibling && cellElement.tagName === "TD") {
|
|||
|
|
if (tableElement.nextElementSibling) {
|
|||
|
|
range.selectNodeContents(tableElement.nextElementSibling);
|
|||
|
|
range.collapse(true);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
insertEmptyBlock(vditor, "afterend");
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
var m = 0;
|
|||
|
|
for (; m < trElement.cells.length; m++) {
|
|||
|
|
if (trElement.cells[m].isSameNode(cellElement)) {
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var nextElement = trElement.nextElementSibling;
|
|||
|
|
if (!nextElement) {
|
|||
|
|
nextElement = trElement.parentElement.nextElementSibling.firstChild;
|
|||
|
|
}
|
|||
|
|
range.selectNodeContents(nextElement.cells[m]);
|
|||
|
|
range.collapse(true);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// focus row input, only wysiwyg
|
|||
|
|
if (vditor.currentMode === "wysiwyg" &&
|
|||
|
|
!(0,compatibility/* isCtrl */.yl)(event) && event.key === "Enter" && !event.shiftKey && event.altKey) {
|
|||
|
|
var inputElement = vditor.wysiwyg.popover.querySelector(".vditor-input");
|
|||
|
|
inputElement.focus();
|
|||
|
|
inputElement.select();
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// Backspace:光标移动到前一个 cell
|
|||
|
|
if (!(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey && !event.altKey && event.key === "Backspace"
|
|||
|
|
&& range.startOffset === 0 && range.toString() === "") {
|
|||
|
|
var previousCellElement = goPreviousCell(cellElement, range, false);
|
|||
|
|
if (!previousCellElement && tableElement) {
|
|||
|
|
if (tableElement.textContent.trim() === "") {
|
|||
|
|
tableElement.outerHTML = "<p data-block=\"0\"><wbr>\n</p>";
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.setStartBefore(tableElement);
|
|||
|
|
range.collapse(true);
|
|||
|
|
}
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 上方新添加一行
|
|||
|
|
if (matchHotKey("⇧⌘F", event)) {
|
|||
|
|
insertRowAbove(vditor, range, cellElement);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 下方新添加一行 https://github.com/Vanessa219/vditor/issues/46
|
|||
|
|
if (matchHotKey("⌘=", event)) {
|
|||
|
|
insertRow(vditor, range, cellElement);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 左方新添加一列
|
|||
|
|
if (matchHotKey("⇧⌘G", event)) {
|
|||
|
|
insertColumn(vditor, tableElement, cellElement, "beforebegin");
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 后方新添加一列
|
|||
|
|
if (matchHotKey("⇧⌘=", event)) {
|
|||
|
|
insertColumn(vditor, tableElement, cellElement);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 删除当前行
|
|||
|
|
if (matchHotKey("⌘-", event)) {
|
|||
|
|
deleteRow(vditor, range, cellElement);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 删除当前列
|
|||
|
|
if (matchHotKey("⇧⌘-", event)) {
|
|||
|
|
deleteColumn(vditor, range, tableElement, cellElement);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// 剧左
|
|||
|
|
if (matchHotKey("⇧⌘L", event)) {
|
|||
|
|
if (vditor.currentMode === "ir") {
|
|||
|
|
setTableAlign(tableElement, "left");
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var itemElement = vditor.wysiwyg.popover.querySelector('[data-type="left"]');
|
|||
|
|
if (itemElement) {
|
|||
|
|
itemElement.click();
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 剧中
|
|||
|
|
if (matchHotKey("⇧⌘C", event)) {
|
|||
|
|
if (vditor.currentMode === "ir") {
|
|||
|
|
setTableAlign(tableElement, "center");
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var itemElement = vditor.wysiwyg.popover.querySelector('[data-type="center"]');
|
|||
|
|
if (itemElement) {
|
|||
|
|
itemElement.click();
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 剧右
|
|||
|
|
if (matchHotKey("⇧⌘R", event)) {
|
|||
|
|
if (vditor.currentMode === "ir") {
|
|||
|
|
setTableAlign(tableElement, "right");
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var itemElement = vditor.wysiwyg.popover.querySelector('[data-type="right"]');
|
|||
|
|
if (itemElement) {
|
|||
|
|
itemElement.click();
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var fixCodeBlock = function (vditor, event, codeRenderElement, range) {
|
|||
|
|
// 行级代码块中 command + a,近对当前代码块进行全选
|
|||
|
|
if (codeRenderElement.tagName === "PRE" && matchHotKey("⌘A", event)) {
|
|||
|
|
range.selectNodeContents(codeRenderElement.firstElementChild);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// tab
|
|||
|
|
// TODO shift + tab, shift and 选中文字
|
|||
|
|
if (vditor.options.tab && event.key === "Tab" && !event.shiftKey && range.toString() === "") {
|
|||
|
|
range.insertNode(document.createTextNode(vditor.options.tab));
|
|||
|
|
range.collapse(false);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// Backspace: 光标位于第零个字符,仅删除代码块标签
|
|||
|
|
if (event.key === "Backspace" && !(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey && !event.altKey) {
|
|||
|
|
var codePosition = (0,selection/* getSelectPosition */.im)(codeRenderElement, vditor[vditor.currentMode].element, range);
|
|||
|
|
if ((codePosition.start === 0 ||
|
|||
|
|
(codePosition.start === 1 && codeRenderElement.innerText === "\n")) // 空代码块,光标在 \n 后
|
|||
|
|
&& range.toString() === "") {
|
|||
|
|
codeRenderElement.parentElement.outerHTML =
|
|||
|
|
"<p data-block=\"0\"><wbr>".concat(codeRenderElement.firstElementChild.innerHTML, "</p>");
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 换行
|
|||
|
|
if (!(0,compatibility/* isCtrl */.yl)(event) && !event.altKey && event.key === "Enter") {
|
|||
|
|
if (!codeRenderElement.firstElementChild.textContent.endsWith("\n")) {
|
|||
|
|
codeRenderElement.firstElementChild.insertAdjacentText("beforeend", "\n");
|
|||
|
|
}
|
|||
|
|
range.extractContents();
|
|||
|
|
range.insertNode(document.createTextNode("\n"));
|
|||
|
|
range.collapse(false);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
if (!(0,compatibility/* isFirefox */.vU)()) {
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
input_input(vditor, range);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
input(vditor, range);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var fixBlockquote = function (vditor, range, event, pElement) {
|
|||
|
|
var startContainer = range.startContainer;
|
|||
|
|
var blockquoteElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "BLOCKQUOTE");
|
|||
|
|
if (blockquoteElement && range.toString() === "") {
|
|||
|
|
if (event.key === "Backspace" && !(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey && !event.altKey &&
|
|||
|
|
(0,selection/* getSelectPosition */.im)(blockquoteElement, vditor[vditor.currentMode].element, range).start === 0) {
|
|||
|
|
// Backspace: 光标位于引用中的第零个字符,仅删除引用标签
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
blockquoteElement.outerHTML = blockquoteElement.innerHTML;
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (pElement && event.key === "Enter" && !(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey && !event.altKey
|
|||
|
|
&& pElement.parentElement.tagName === "BLOCKQUOTE") {
|
|||
|
|
// Enter: 空行回车应逐层跳出
|
|||
|
|
var isEmpty = false;
|
|||
|
|
if (pElement.innerHTML.replace(constants/* Constants.ZWSP */.g.ZWSP, "") === "\n" ||
|
|||
|
|
pElement.innerHTML.replace(constants/* Constants.ZWSP */.g.ZWSP, "") === "") {
|
|||
|
|
// 空 P
|
|||
|
|
isEmpty = true;
|
|||
|
|
pElement.remove();
|
|||
|
|
}
|
|||
|
|
else if (pElement.innerHTML.endsWith("\n\n") &&
|
|||
|
|
(0,selection/* getSelectPosition */.im)(pElement, vditor[vditor.currentMode].element, range).start ===
|
|||
|
|
pElement.textContent.length - 1) {
|
|||
|
|
// 软换行
|
|||
|
|
pElement.innerHTML = pElement.innerHTML.substr(0, pElement.innerHTML.length - 2);
|
|||
|
|
isEmpty = true;
|
|||
|
|
}
|
|||
|
|
if (isEmpty) {
|
|||
|
|
// 需添加零宽字符,否则的话无法记录 undo
|
|||
|
|
blockquoteElement.insertAdjacentHTML("afterend", "<p data-block=\"0\">".concat(constants/* Constants.ZWSP */.g.ZWSP, "<wbr>\n</p>"));
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestBlock */.F9)(startContainer);
|
|||
|
|
if (vditor.currentMode === "wysiwyg" && blockElement && matchHotKey("⇧⌘;", event)) {
|
|||
|
|
// 插入 blockquote
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
blockElement.outerHTML = "<blockquote data-block=\"0\">".concat(blockElement.outerHTML, "</blockquote>");
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (insertAfterBlock(vditor, event, range, blockquoteElement, blockquoteElement)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (insertBeforeBlock(vditor, event, range, blockquoteElement, blockquoteElement)) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var fixTask = function (vditor, range, event) {
|
|||
|
|
var startContainer = range.startContainer;
|
|||
|
|
var taskItemElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(startContainer, "LI");
|
|||
|
|
if (taskItemElement && taskItemElement.classList.contains("vditor-task")) {
|
|||
|
|
if (matchHotKey("⇧⌘J", event)) {
|
|||
|
|
// ctrl + shift: toggle checked
|
|||
|
|
var inputElement = taskItemElement.firstElementChild;
|
|||
|
|
if (inputElement.checked) {
|
|||
|
|
inputElement.removeAttribute("checked");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
inputElement.setAttribute("checked", "checked");
|
|||
|
|
}
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
// Backspace: 在选择框前进行删除
|
|||
|
|
if (event.key === "Backspace" && !(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey && !event.altKey && range.toString() === ""
|
|||
|
|
&& range.startOffset === 1
|
|||
|
|
&& ((startContainer.nodeType === 3 && startContainer.previousSibling &&
|
|||
|
|
startContainer.previousSibling.tagName === "INPUT")
|
|||
|
|
|| startContainer.nodeType !== 3)) {
|
|||
|
|
var previousElement = taskItemElement.previousElementSibling;
|
|||
|
|
taskItemElement.querySelector("input").remove();
|
|||
|
|
if (previousElement) {
|
|||
|
|
var lastNode = (0,hasClosest/* getLastNode */.DX)(previousElement);
|
|||
|
|
lastNode.parentElement.insertAdjacentHTML("beforeend", "<wbr>" + taskItemElement.innerHTML.trim());
|
|||
|
|
taskItemElement.remove();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
taskItemElement.parentElement.insertAdjacentHTML("beforebegin", "<p data-block=\"0\"><wbr>".concat(taskItemElement.innerHTML.trim() || "\n", "</p>"));
|
|||
|
|
if (taskItemElement.nextElementSibling) {
|
|||
|
|
taskItemElement.remove();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
taskItemElement.parentElement.remove();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (event.key === "Enter" && !(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey && !event.altKey) {
|
|||
|
|
if (taskItemElement.textContent.trim() === "") {
|
|||
|
|
// 当前任务列表无文字
|
|||
|
|
if ((0,hasClosest/* hasClosestByClassName */.fb)(taskItemElement.parentElement, "vditor-task")) {
|
|||
|
|
// 为子元素时,需进行反向缩进
|
|||
|
|
var topListElement = (0,hasClosest/* getTopList */.O9)(startContainer);
|
|||
|
|
if (topListElement) {
|
|||
|
|
listOutdent(vditor, taskItemElement, range, topListElement);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// 仅有一级任务列表
|
|||
|
|
if (taskItemElement.nextElementSibling) {
|
|||
|
|
// 任务列表下方还有元素,需要使用用段落隔断
|
|||
|
|
var afterHTML_2 = "";
|
|||
|
|
var beforeHTML_1 = "";
|
|||
|
|
var isAfter_1 = false;
|
|||
|
|
Array.from(taskItemElement.parentElement.children).forEach(function (taskItem) {
|
|||
|
|
if (taskItemElement.isSameNode(taskItem)) {
|
|||
|
|
isAfter_1 = true;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (isAfter_1) {
|
|||
|
|
afterHTML_2 += taskItem.outerHTML;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
beforeHTML_1 += taskItem.outerHTML;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
var parentTagName = taskItemElement.parentElement.tagName;
|
|||
|
|
var dataMarker = taskItemElement.parentElement.tagName === "OL" ? "" : " data-marker=\"".concat(taskItemElement.parentElement.getAttribute("data-marker"), "\"");
|
|||
|
|
var startAttribute = "";
|
|||
|
|
if (beforeHTML_1) {
|
|||
|
|
startAttribute = taskItemElement.parentElement.tagName === "UL" ? "" : " start=\"1\"";
|
|||
|
|
beforeHTML_1 = "<".concat(parentTagName, " data-tight=\"true\"").concat(dataMarker, " data-block=\"0\">").concat(beforeHTML_1, "</").concat(parentTagName, ">");
|
|||
|
|
}
|
|||
|
|
// <p data-block="0">\n<wbr></p> => <p data-block="0"><wbr>\n</p>
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/430
|
|||
|
|
taskItemElement.parentElement.outerHTML = "".concat(beforeHTML_1, "<p data-block=\"0\"><wbr>\n</p><").concat(parentTagName, "\n data-tight=\"true\"").concat(dataMarker, " data-block=\"0\"").concat(startAttribute, ">").concat(afterHTML_2, "</").concat(parentTagName, ">");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// 任务列表下方无任务列表元素
|
|||
|
|
taskItemElement.parentElement.insertAdjacentHTML("afterend", "<p data-block=\"0\"><wbr>\n</p>");
|
|||
|
|
if (taskItemElement.parentElement.querySelectorAll("li").length === 1) {
|
|||
|
|
// 任务列表仅有一项时,使用 p 元素替换
|
|||
|
|
taskItemElement.parentElement.remove();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// 任务列表有多项时,当前任务列表位于最后一项,移除该任务列表
|
|||
|
|
taskItemElement.remove();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (startContainer.nodeType !== 3 && range.startOffset === 0 &&
|
|||
|
|
startContainer.firstChild.tagName === "INPUT") {
|
|||
|
|
// 光标位于 input 之前
|
|||
|
|
range.setStart(startContainer.childNodes[1], 1);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// 当前任务列表有文字,光标后的文字需添加到新任务列表中
|
|||
|
|
range.setEndAfter(taskItemElement.lastChild);
|
|||
|
|
taskItemElement.insertAdjacentHTML("afterend", "<li class=\"vditor-task\" data-marker=\"".concat(taskItemElement.getAttribute("data-marker"), "\"><input type=\"checkbox\"> <wbr></li>"));
|
|||
|
|
document.querySelector("wbr").after(range.extractContents());
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var fixDelete = function (vditor, range, event, pElement) {
|
|||
|
|
if (range.startContainer.nodeType !== 3) {
|
|||
|
|
// 光标位于 hr 前,hr 前有内容
|
|||
|
|
var rangeElement = range.startContainer.children[range.startOffset];
|
|||
|
|
if (rangeElement && rangeElement.tagName === "HR") {
|
|||
|
|
range.selectNodeContents(rangeElement.previousElementSibling);
|
|||
|
|
range.collapse(false);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (pElement) {
|
|||
|
|
var previousElement = pElement.previousElementSibling;
|
|||
|
|
if (previousElement && (0,selection/* getSelectPosition */.im)(pElement, vditor[vditor.currentMode].element, range).start === 0 &&
|
|||
|
|
(((0,compatibility/* isFirefox */.vU)() && previousElement.tagName === "HR") || previousElement.tagName === "TABLE")) {
|
|||
|
|
if (previousElement.tagName === "TABLE") {
|
|||
|
|
// table 后删除 https://github.com/Vanessa219/vditor/issues/243
|
|||
|
|
var lastCellElement = previousElement.lastElementChild.lastElementChild.lastElementChild;
|
|||
|
|
lastCellElement.innerHTML =
|
|||
|
|
lastCellElement.innerHTML.trimLeft() + "<wbr>" + pElement.textContent.trim();
|
|||
|
|
pElement.remove();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// 光标位于 hr 后进行删除
|
|||
|
|
previousElement.remove();
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var fixHR = function (range) {
|
|||
|
|
if ((0,compatibility/* isFirefox */.vU)() && range.startContainer.nodeType !== 3 &&
|
|||
|
|
range.startContainer.tagName === "HR") {
|
|||
|
|
range.setStartBefore(range.startContainer);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
// firefox https://github.com/Vanessa219/vditor/issues/407
|
|||
|
|
var fixFirefoxArrowUpTable = function (event, blockElement, range) {
|
|||
|
|
var _a, _b;
|
|||
|
|
if (!(0,compatibility/* isFirefox */.vU)()) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (event.key === "ArrowUp" && blockElement && ((_a = blockElement.previousElementSibling) === null || _a === void 0 ? void 0 : _a.tagName) === "TABLE") {
|
|||
|
|
var tableElement = blockElement.previousElementSibling;
|
|||
|
|
range.selectNodeContents(tableElement.rows[tableElement.rows.length - 1].lastElementChild);
|
|||
|
|
range.collapse(false);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (event.key === "ArrowDown" && blockElement && ((_b = blockElement.nextElementSibling) === null || _b === void 0 ? void 0 : _b.tagName) === "TABLE") {
|
|||
|
|
range.selectNodeContents(blockElement.nextElementSibling.rows[0].cells[0]);
|
|||
|
|
range.collapse(true);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
var paste = function (vditor, event, callback) { return fixBrowserBehavior_awaiter(void 0, void 0, void 0, function () {
|
|||
|
|
var textHTML, textPlain, files, renderers, renderLinkDest, doc, height, code, codeElement, position, tempElement, fileReader_1, file_1, range, blockElement, range;
|
|||
|
|
var _a;
|
|||
|
|
return fixBrowserBehavior_generator(this, function (_b) {
|
|||
|
|
switch (_b.label) {
|
|||
|
|
case 0:
|
|||
|
|
if (vditor[vditor.currentMode].element.getAttribute("contenteditable") !== "true") {
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
event.stopPropagation();
|
|||
|
|
event.preventDefault();
|
|||
|
|
if ("clipboardData" in event) {
|
|||
|
|
textHTML = event.clipboardData.getData("text/html");
|
|||
|
|
textPlain = event.clipboardData.getData("text/plain");
|
|||
|
|
files = event.clipboardData.files;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
textHTML = event.dataTransfer.getData("text/html");
|
|||
|
|
textPlain = event.dataTransfer.getData("text/plain");
|
|||
|
|
if (event.dataTransfer.types.includes("Files")) {
|
|||
|
|
files = event.dataTransfer.items;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
renderers = {};
|
|||
|
|
renderLinkDest = function (node, entering) {
|
|||
|
|
if (!entering) {
|
|||
|
|
return ["", Lute.WalkContinue];
|
|||
|
|
}
|
|||
|
|
if (vditor.options.upload.renderLinkDest) {
|
|||
|
|
return vditor.options.upload.renderLinkDest(vditor, node, entering);
|
|||
|
|
}
|
|||
|
|
var src = node.TokensStr();
|
|||
|
|
if (node.__internal_object__.Parent.Type === 34 && src && src.indexOf("file://") === -1 &&
|
|||
|
|
vditor.options.upload.linkToImgUrl) {
|
|||
|
|
var xhr_1 = new XMLHttpRequest();
|
|||
|
|
xhr_1.open("POST", vditor.options.upload.linkToImgUrl);
|
|||
|
|
if (vditor.options.upload.token) {
|
|||
|
|
xhr_1.setRequestHeader("X-Upload-Token", vditor.options.upload.token);
|
|||
|
|
}
|
|||
|
|
if (vditor.options.upload.withCredentials) {
|
|||
|
|
xhr_1.withCredentials = true;
|
|||
|
|
}
|
|||
|
|
setHeaders(vditor, xhr_1);
|
|||
|
|
xhr_1.setRequestHeader("Content-Type", "application/json; charset=utf-8");
|
|||
|
|
xhr_1.onreadystatechange = function () {
|
|||
|
|
if (xhr_1.readyState === XMLHttpRequest.DONE) {
|
|||
|
|
if (xhr_1.status === 200) {
|
|||
|
|
var responseText = xhr_1.responseText;
|
|||
|
|
if (vditor.options.upload.linkToImgFormat) {
|
|||
|
|
responseText = vditor.options.upload.linkToImgFormat(xhr_1.responseText);
|
|||
|
|
}
|
|||
|
|
var responseJSON_1 = JSON.parse(responseText);
|
|||
|
|
if (responseJSON_1.code !== 0) {
|
|||
|
|
vditor.tip.show(responseJSON_1.msg);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var original_1 = responseJSON_1.data.originalURL;
|
|||
|
|
if (vditor.currentMode === "sv") {
|
|||
|
|
vditor.sv.element.querySelectorAll(".vditor-sv__marker--link")
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
if (item.textContent === original_1) {
|
|||
|
|
item.textContent = responseJSON_1.data.url;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var imgElement = vditor[vditor.currentMode].element.querySelector("img[src=\"".concat(original_1, "\"]"));
|
|||
|
|
imgElement.src = responseJSON_1.data.url;
|
|||
|
|
if (vditor.currentMode === "ir") {
|
|||
|
|
imgElement.previousElementSibling.previousElementSibling.innerHTML =
|
|||
|
|
responseJSON_1.data.url;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.tip.show(xhr_1.responseText);
|
|||
|
|
}
|
|||
|
|
if (vditor.options.upload.linkToImgCallback) {
|
|||
|
|
vditor.options.upload.linkToImgCallback(xhr_1.responseText);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
xhr_1.send(JSON.stringify({ url: src }));
|
|||
|
|
}
|
|||
|
|
if (vditor.currentMode === "ir") {
|
|||
|
|
return ["<span class=\"vditor-ir__marker vditor-ir__marker--link\">".concat(Lute.EscapeHTMLStr(src), "</span>"), Lute.WalkContinue];
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
return ["", Lute.WalkContinue];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
return ["<span class=\"vditor-sv__marker--link\">".concat(Lute.EscapeHTMLStr(src), "</span>"), Lute.WalkContinue];
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
// 浏览器地址栏拷贝处理
|
|||
|
|
if (textHTML.replace(/&/g, "&").replace(/<(|\/)(html|body|meta)[^>]*?>/ig, "").trim() ===
|
|||
|
|
"<a href=\"".concat(textPlain, "\">").concat(textPlain, "</a>") ||
|
|||
|
|
textHTML.replace(/&/g, "&").replace(/<(|\/)(html|body|meta)[^>]*?>/ig, "").trim() ===
|
|||
|
|
"<!--StartFragment--><a href=\"".concat(textPlain, "\">").concat(textPlain, "</a><!--EndFragment-->")) {
|
|||
|
|
textHTML = "";
|
|||
|
|
}
|
|||
|
|
doc = new DOMParser().parseFromString(textHTML, "text/html");
|
|||
|
|
if (doc.body) {
|
|||
|
|
textHTML = doc.body.innerHTML;
|
|||
|
|
}
|
|||
|
|
textHTML = Lute.Sanitize(textHTML);
|
|||
|
|
vditor.wysiwyg.getComments(vditor);
|
|||
|
|
height = vditor[vditor.currentMode].element.scrollHeight;
|
|||
|
|
code = processPasteCode(textHTML, textPlain, vditor.currentMode);
|
|||
|
|
codeElement = vditor.currentMode === "sv" ?
|
|||
|
|
(0,hasClosest/* hasClosestByAttribute */.a1)(event.target, "data-type", "code-block") :
|
|||
|
|
(0,hasClosest/* hasClosestByMatchTag */.lG)(event.target, "CODE");
|
|||
|
|
if (!codeElement) return [3 /*break*/, 1];
|
|||
|
|
// 粘贴在代码位置
|
|||
|
|
if (vditor.currentMode === "sv") {
|
|||
|
|
document.execCommand("insertHTML", false, textPlain.replace(/&/g, "&").replace(/</g, "<"));
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
position = (0,selection/* getSelectPosition */.im)(event.target, vditor[vditor.currentMode].element);
|
|||
|
|
if (codeElement.parentElement.tagName !== "PRE") {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/463
|
|||
|
|
textPlain += constants/* Constants.ZWSP */.g.ZWSP;
|
|||
|
|
}
|
|||
|
|
codeElement.textContent = codeElement.textContent.substring(0, position.start)
|
|||
|
|
+ textPlain + codeElement.textContent.substring(position.end);
|
|||
|
|
(0,selection/* setSelectionByPosition */.$j)(position.start + textPlain.length, position.start + textPlain.length, codeElement.parentElement);
|
|||
|
|
if ((_a = codeElement.parentElement) === null || _a === void 0 ? void 0 : _a.nextElementSibling.classList.contains("vditor-".concat(vditor.currentMode, "__preview"))) {
|
|||
|
|
codeElement.parentElement.nextElementSibling.innerHTML = codeElement.outerHTML;
|
|||
|
|
processCodeRender(codeElement.parentElement.nextElementSibling, vditor);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return [3 /*break*/, 10];
|
|||
|
|
case 1:
|
|||
|
|
if (!code) return [3 /*break*/, 2];
|
|||
|
|
callback.pasteCode(code);
|
|||
|
|
return [3 /*break*/, 10];
|
|||
|
|
case 2:
|
|||
|
|
if (!(textHTML.trim() !== "")) return [3 /*break*/, 5];
|
|||
|
|
tempElement = document.createElement("div");
|
|||
|
|
tempElement.innerHTML = textHTML;
|
|||
|
|
if (!!vditor.options.upload.base64ToLink) return [3 /*break*/, 4];
|
|||
|
|
// word 复制的图文混合,替换为 link: <v:imagedata src="file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png" o:title="">
|
|||
|
|
return [4 /*yield*/, processVMLImage(vditor, tempElement, ("clipboardData" in event ? event.clipboardData : event.dataTransfer).getData("text/rtf"))];
|
|||
|
|
case 3:
|
|||
|
|
// word 复制的图文混合,替换为 link: <v:imagedata src="file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png" o:title="">
|
|||
|
|
_b.sent();
|
|||
|
|
_b.label = 4;
|
|||
|
|
case 4:
|
|||
|
|
tempElement.querySelectorAll("[style]").forEach(function (e) {
|
|||
|
|
e.removeAttribute("style");
|
|||
|
|
});
|
|||
|
|
tempElement.querySelectorAll(".vditor-copy").forEach(function (e) {
|
|||
|
|
e.remove();
|
|||
|
|
});
|
|||
|
|
if (vditor.currentMode === "ir") {
|
|||
|
|
renderers.HTML2VditorIRDOM = { renderLinkDest: renderLinkDest };
|
|||
|
|
vditor.lute.SetJSRenderers({ renderers: renderers });
|
|||
|
|
(0,selection/* insertHTML */.oC)(vditor.lute.HTML2VditorIRDOM(tempElement.innerHTML), vditor);
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
renderers.HTML2VditorDOM = { renderLinkDest: renderLinkDest };
|
|||
|
|
vditor.lute.SetJSRenderers({ renderers: renderers });
|
|||
|
|
(0,selection/* insertHTML */.oC)(vditor.lute.HTML2VditorDOM(tempElement.innerHTML), vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
renderers.Md2VditorSVDOM = { renderLinkDest: renderLinkDest };
|
|||
|
|
vditor.lute.SetJSRenderers({ renderers: renderers });
|
|||
|
|
processPaste(vditor, vditor.lute.HTML2Md(tempElement.innerHTML).trimRight());
|
|||
|
|
}
|
|||
|
|
vditor.outline.render(vditor);
|
|||
|
|
return [3 /*break*/, 10];
|
|||
|
|
case 5:
|
|||
|
|
if (!(files.length > 0)) return [3 /*break*/, 9];
|
|||
|
|
if (!(vditor.options.upload.url || vditor.options.upload.handler)) return [3 /*break*/, 7];
|
|||
|
|
return [4 /*yield*/, uploadFiles(vditor, files)];
|
|||
|
|
case 6:
|
|||
|
|
_b.sent();
|
|||
|
|
return [3 /*break*/, 8];
|
|||
|
|
case 7:
|
|||
|
|
fileReader_1 = new FileReader();
|
|||
|
|
if ("clipboardData" in event) {
|
|||
|
|
files = event.clipboardData.files;
|
|||
|
|
file_1 = files[0];
|
|||
|
|
}
|
|||
|
|
else if (event.dataTransfer.types.includes("Files")) {
|
|||
|
|
files = event.dataTransfer.items;
|
|||
|
|
file_1 = files[0].getAsFile();
|
|||
|
|
}
|
|||
|
|
if (file_1 && file_1.type.startsWith("image")) {
|
|||
|
|
fileReader_1.readAsDataURL(file_1);
|
|||
|
|
fileReader_1.onload = function () {
|
|||
|
|
var imgHTML = "";
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
imgHTML += "<img alt=\"".concat(file_1.name, "\" src=\"").concat(fileReader_1.result.toString(), "\">\n");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
imgHTML += ".concat(fileReader_1.result.toString(), ")\n");
|
|||
|
|
}
|
|||
|
|
document.execCommand("insertHTML", false, imgHTML);
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
_b.label = 8;
|
|||
|
|
case 8: return [3 /*break*/, 10];
|
|||
|
|
case 9:
|
|||
|
|
if (textPlain.trim() !== "" && files.length === 0) {
|
|||
|
|
range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
if (range.toString() !== "" && vditor.lute.IsValidLinkDest(textPlain)) {
|
|||
|
|
textPlain = "[".concat(range.toString(), "](").concat(textPlain, ")");
|
|||
|
|
}
|
|||
|
|
if (vditor.currentMode === "ir") {
|
|||
|
|
renderers.Md2VditorIRDOM = { renderLinkDest: renderLinkDest };
|
|||
|
|
vditor.lute.SetJSRenderers({ renderers: renderers });
|
|||
|
|
(0,selection/* insertHTML */.oC)(Lute.Sanitize(vditor.lute.Md2VditorIRDOM(textPlain)), vditor);
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
renderers.Md2VditorDOM = { renderLinkDest: renderLinkDest };
|
|||
|
|
vditor.lute.SetJSRenderers({ renderers: renderers });
|
|||
|
|
(0,selection/* insertHTML */.oC)(Lute.Sanitize(vditor.lute.Md2VditorDOM(textPlain)), vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
renderers.Md2VditorSVDOM = { renderLinkDest: renderLinkDest };
|
|||
|
|
vditor.lute.SetJSRenderers({ renderers: renderers });
|
|||
|
|
processPaste(vditor, textPlain);
|
|||
|
|
}
|
|||
|
|
vditor.outline.render(vditor);
|
|||
|
|
}
|
|||
|
|
_b.label = 10;
|
|||
|
|
case 10:
|
|||
|
|
if (vditor.currentMode !== "sv") {
|
|||
|
|
blockElement = (0,hasClosest/* hasClosestBlock */.F9)((0,selection/* getEditorRange */.zh)(vditor).startContainer);
|
|||
|
|
if (blockElement) {
|
|||
|
|
range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
vditor[vditor.currentMode].element.querySelectorAll("wbr").forEach(function (wbr) {
|
|||
|
|
wbr.remove();
|
|||
|
|
});
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
blockElement.outerHTML = vditor.lute.SpinVditorDOM(blockElement.outerHTML);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
blockElement.outerHTML = vditor.lute.SpinVditorIRDOM(blockElement.outerHTML);
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, range);
|
|||
|
|
}
|
|||
|
|
vditor[vditor.currentMode].element.querySelectorAll(".vditor-".concat(vditor.currentMode, "__preview[data-render='2']"))
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
processCodeRender(item, vditor);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
vditor.wysiwyg.triggerRemoveComment(vditor);
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
if (vditor[vditor.currentMode].element.scrollHeight - height >
|
|||
|
|
Math.min(vditor[vditor.currentMode].element.clientHeight, window.innerHeight) / 2) {
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
}
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}); };
|
|||
|
|
var processVMLImage = function (vditor, root, rtfData) { return fixBrowserBehavior_awaiter(void 0, void 0, void 0, function () {
|
|||
|
|
var regexPictureHeader, regexPicture, regImages, images, _i, regImages_1, image, imageType, shapes, i, img, newSrc, imgs, i, src, _a;
|
|||
|
|
return fixBrowserBehavior_generator(this, function (_b) {
|
|||
|
|
switch (_b.label) {
|
|||
|
|
case 0:
|
|||
|
|
if (!rtfData) {
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
regexPictureHeader = /{\\pict[\s\S]+?\\bliptag-?\d+(\\blipupi-?\d+)?({\\\*\\blipuid\s?[\da-fA-F]+)?[\s}]*?/;
|
|||
|
|
regexPicture = new RegExp("(?:(" + regexPictureHeader.source + "))([\\da-fA-F\\s]+)\\}", "g");
|
|||
|
|
regImages = rtfData.match(regexPicture);
|
|||
|
|
images = [];
|
|||
|
|
if (regImages) {
|
|||
|
|
for (_i = 0, regImages_1 = regImages; _i < regImages_1.length; _i++) {
|
|||
|
|
image = regImages_1[_i];
|
|||
|
|
imageType = void 0;
|
|||
|
|
if (image.includes("\\pngblip")) {
|
|||
|
|
imageType = "image/png";
|
|||
|
|
}
|
|||
|
|
else if (image.includes("\\jpegblip")) {
|
|||
|
|
imageType = "image/jpeg";
|
|||
|
|
}
|
|||
|
|
if (imageType) {
|
|||
|
|
images.push({
|
|||
|
|
hex: image.replace(regexPictureHeader, "").replace(/[^\da-fA-F]/g, ""),
|
|||
|
|
type: imageType,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
shapes = [];
|
|||
|
|
walk(root, function (child) {
|
|||
|
|
if (child.tagName === "V:SHAPE") {
|
|||
|
|
walk(child, function (sub) {
|
|||
|
|
if (sub.tagName === "V:IMAGEDATA")
|
|||
|
|
shapes.push({ shape: child, img: sub });
|
|||
|
|
});
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
for (i = 0; i < shapes.length; i++) {
|
|||
|
|
img = document.createElement("img");
|
|||
|
|
newSrc = "data:" + images[i].type + ";base64," + btoa((images[i].hex.match(/\w{2}/g) || []).map(function (char) {
|
|||
|
|
return String.fromCharCode(parseInt(char, 16));
|
|||
|
|
}).join(""));
|
|||
|
|
img.src = newSrc;
|
|||
|
|
img.title = shapes[i].img.getAttribute("title");
|
|||
|
|
shapes[i].shape.parentNode.replaceChild(img, shapes[i].shape);
|
|||
|
|
}
|
|||
|
|
imgs = root.querySelectorAll("img");
|
|||
|
|
i = 0;
|
|||
|
|
_b.label = 1;
|
|||
|
|
case 1:
|
|||
|
|
if (!(i < imgs.length)) return [3 /*break*/, 4];
|
|||
|
|
src = imgs[i].src || "";
|
|||
|
|
if (!src) return [3 /*break*/, 3];
|
|||
|
|
_a = imgs[i];
|
|||
|
|
return [4 /*yield*/, vditor.options.upload.base64ToLink(src)];
|
|||
|
|
case 2:
|
|||
|
|
_a.src = _b.sent();
|
|||
|
|
_b.label = 3;
|
|||
|
|
case 3:
|
|||
|
|
i++;
|
|||
|
|
return [3 /*break*/, 1];
|
|||
|
|
case 4: return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}); };
|
|||
|
|
var walk = function (el, fn) {
|
|||
|
|
var goNext = fn(el);
|
|||
|
|
if (goNext !== false)
|
|||
|
|
for (var i = 0; i < el.children.length; i++) {
|
|||
|
|
walk(el.children[i], fn);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var templateObject_1;
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/ir/process.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var processHint = function (vditor) {
|
|||
|
|
var _a, _b;
|
|||
|
|
vditor.hint.render(vditor);
|
|||
|
|
var startContainer = (0,selection/* getEditorRange */.zh)(vditor).startContainer;
|
|||
|
|
// 代码块语言提示
|
|||
|
|
var preBeforeElement = (0,hasClosest/* hasClosestByAttribute */.a1)(startContainer, "data-type", "code-block-info");
|
|||
|
|
if (preBeforeElement) {
|
|||
|
|
if (preBeforeElement.textContent.replace(constants/* Constants.ZWSP */.g.ZWSP, "") === "" && vditor.hint.recentLanguage) {
|
|||
|
|
preBeforeElement.textContent = constants/* Constants.ZWSP */.g.ZWSP + vditor.hint.recentLanguage;
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
range.selectNodeContents(preBeforeElement);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var matchLangData_1 = [];
|
|||
|
|
var key_1 = preBeforeElement.textContent.substring(0, (0,selection/* getSelectPosition */.im)(preBeforeElement, vditor.ir.element).start)
|
|||
|
|
.replace(constants/* Constants.ZWSP */.g.ZWSP, "");
|
|||
|
|
(vditor.options.preview.hljs.langs || constants/* Constants.ALIAS_CODE_LANGUAGES.concat */.g.ALIAS_CODE_LANGUAGES.concat(((_b = (_a = window.hljs) === null || _a === void 0 ? void 0 : _a.listLanguages()) !== null && _b !== void 0 ? _b : []).sort())).forEach(function (keyName) {
|
|||
|
|
if (keyName.indexOf(key_1.toLowerCase()) > -1) {
|
|||
|
|
matchLangData_1.push({
|
|||
|
|
html: keyName,
|
|||
|
|
value: keyName,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
vditor.hint.genHTML(matchLangData_1, key_1, vditor);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var process_processAfterRender = function (vditor, options) {
|
|||
|
|
if (options === void 0) { options = {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: false,
|
|||
|
|
enableInput: true,
|
|||
|
|
}; }
|
|||
|
|
if (options.enableHint) {
|
|||
|
|
processHint(vditor);
|
|||
|
|
}
|
|||
|
|
clearTimeout(vditor.ir.processTimeoutId);
|
|||
|
|
vditor.ir.processTimeoutId = window.setTimeout(function () {
|
|||
|
|
if (vditor.ir.composingLock) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var text = getMarkdown(vditor);
|
|||
|
|
if (typeof vditor.options.input === "function" && options.enableInput) {
|
|||
|
|
vditor.options.input(text);
|
|||
|
|
}
|
|||
|
|
if (vditor.options.counter.enable) {
|
|||
|
|
vditor.counter.render(vditor, text);
|
|||
|
|
}
|
|||
|
|
if (vditor.options.cache.enable && (0,compatibility/* accessLocalStorage */.pK)()) {
|
|||
|
|
localStorage.setItem(vditor.options.cache.id, text);
|
|||
|
|
if (vditor.options.cache.after) {
|
|||
|
|
vditor.options.cache.after(text);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (vditor.devtools) {
|
|||
|
|
vditor.devtools.renderEchart(vditor);
|
|||
|
|
}
|
|||
|
|
if (options.enableAddUndoStack) {
|
|||
|
|
vditor.undo.addToUndoStack(vditor);
|
|||
|
|
}
|
|||
|
|
}, vditor.options.undoDelay);
|
|||
|
|
};
|
|||
|
|
var process_processHeading = function (vditor, value) {
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
var headingElement = (0,hasClosest/* hasClosestBlock */.F9)(range.startContainer) || range.startContainer;
|
|||
|
|
if (headingElement) {
|
|||
|
|
var headingMarkerElement = headingElement.querySelector(".vditor-ir__marker--heading");
|
|||
|
|
if (headingMarkerElement) {
|
|||
|
|
headingMarkerElement.innerHTML = value;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
headingElement.insertAdjacentText("afterbegin", value);
|
|||
|
|
range.selectNodeContents(headingElement);
|
|||
|
|
range.collapse(false);
|
|||
|
|
}
|
|||
|
|
input(vditor, range.cloneRange());
|
|||
|
|
highlightToolbarIR(vditor);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var removeInline = function (range, vditor, type) {
|
|||
|
|
var inlineElement = (0,hasClosest/* hasClosestByAttribute */.a1)(range.startContainer, "data-type", type);
|
|||
|
|
if (inlineElement) {
|
|||
|
|
inlineElement.firstElementChild.remove();
|
|||
|
|
inlineElement.lastElementChild.remove();
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
var tempElement = document.createElement("div");
|
|||
|
|
tempElement.innerHTML = vditor.lute.SpinVditorIRDOM(inlineElement.outerHTML);
|
|||
|
|
inlineElement.outerHTML = tempElement.firstElementChild.innerHTML.trim();
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var process_processToolbar = function (vditor, actionBtn, prefix, suffix) {
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
var commandName = actionBtn.getAttribute("data-type");
|
|||
|
|
var typeElement = range.startContainer;
|
|||
|
|
if (typeElement.nodeType === 3) {
|
|||
|
|
typeElement = typeElement.parentElement;
|
|||
|
|
}
|
|||
|
|
var useHighlight = true;
|
|||
|
|
// 移除
|
|||
|
|
if (actionBtn.classList.contains("vditor-menu--current")) {
|
|||
|
|
if (commandName === "quote") {
|
|||
|
|
var quoteElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(typeElement, "BLOCKQUOTE");
|
|||
|
|
if (quoteElement) {
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
quoteElement.outerHTML = quoteElement.innerHTML.trim() === "" ?
|
|||
|
|
"<p data-block=\"0\">".concat(quoteElement.innerHTML, "</p>") : quoteElement.innerHTML;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (commandName === "link") {
|
|||
|
|
var aElement = (0,hasClosest/* hasClosestByAttribute */.a1)(range.startContainer, "data-type", "a");
|
|||
|
|
if (aElement) {
|
|||
|
|
var aTextElement = (0,hasClosest/* hasClosestByClassName */.fb)(range.startContainer, "vditor-ir__link");
|
|||
|
|
if (aTextElement) {
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
aElement.outerHTML = aTextElement.innerHTML;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
aElement.outerHTML = aElement.querySelector(".vditor-ir__link").innerHTML + "<wbr>";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (commandName === "italic") {
|
|||
|
|
removeInline(range, vditor, "em");
|
|||
|
|
}
|
|||
|
|
else if (commandName === "bold") {
|
|||
|
|
removeInline(range, vditor, "strong");
|
|||
|
|
}
|
|||
|
|
else if (commandName === "strike") {
|
|||
|
|
removeInline(range, vditor, "s");
|
|||
|
|
}
|
|||
|
|
else if (commandName === "inline-code") {
|
|||
|
|
removeInline(range, vditor, "code");
|
|||
|
|
}
|
|||
|
|
else if (commandName === "check" || commandName === "list" || commandName === "ordered-list") {
|
|||
|
|
listToggle(vditor, range, commandName);
|
|||
|
|
useHighlight = false;
|
|||
|
|
actionBtn.classList.remove("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// 添加
|
|||
|
|
if (vditor.ir.element.childNodes.length === 0) {
|
|||
|
|
vditor.ir.element.innerHTML = '<p data-block="0"><wbr></p>';
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.ir.element, range);
|
|||
|
|
}
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestBlock */.F9)(range.startContainer);
|
|||
|
|
if (commandName === "line") {
|
|||
|
|
if (blockElement) {
|
|||
|
|
var hrHTML = '<hr data-block="0"><p data-block="0"><wbr>\n</p>';
|
|||
|
|
if (blockElement.innerHTML.trim() === "") {
|
|||
|
|
blockElement.outerHTML = hrHTML;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
blockElement.insertAdjacentHTML("afterend", hrHTML);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (commandName === "quote") {
|
|||
|
|
if (blockElement) {
|
|||
|
|
range.insertNode(document.createElement("wbr"));
|
|||
|
|
blockElement.outerHTML = "<blockquote data-block=\"0\">".concat(blockElement.outerHTML, "</blockquote>");
|
|||
|
|
useHighlight = false;
|
|||
|
|
actionBtn.classList.add("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (commandName === "link") {
|
|||
|
|
var html = void 0;
|
|||
|
|
if (range.toString() === "") {
|
|||
|
|
html = "".concat(prefix, "<wbr>").concat(suffix);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
html = "".concat(prefix).concat(range.toString()).concat(suffix.replace(")", "<wbr>)"));
|
|||
|
|
}
|
|||
|
|
document.execCommand("insertHTML", false, html);
|
|||
|
|
useHighlight = false;
|
|||
|
|
actionBtn.classList.add("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
else if (commandName === "italic" || commandName === "bold" || commandName === "strike"
|
|||
|
|
|| commandName === "inline-code" || commandName === "code" || commandName === "table") {
|
|||
|
|
var html = void 0;
|
|||
|
|
if (range.toString() === "") {
|
|||
|
|
html = "".concat(prefix, "<wbr>").concat(suffix);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (commandName === "code") {
|
|||
|
|
html = "".concat(prefix, "\n").concat(range.toString(), "<wbr>").concat(suffix);
|
|||
|
|
}
|
|||
|
|
else if (commandName === "table") {
|
|||
|
|
html = "".concat(prefix).concat(range.toString(), "<wbr>").concat(suffix);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
html = "".concat(prefix).concat(range.toString()).concat(suffix, "<wbr>");
|
|||
|
|
}
|
|||
|
|
range.deleteContents();
|
|||
|
|
}
|
|||
|
|
if (commandName === "table" || commandName === "code") {
|
|||
|
|
html = "\n" + html + "\n\n";
|
|||
|
|
}
|
|||
|
|
var spanElement = document.createElement("span");
|
|||
|
|
spanElement.innerHTML = html;
|
|||
|
|
range.insertNode(spanElement);
|
|||
|
|
input(vditor, range);
|
|||
|
|
if (commandName === "table") {
|
|||
|
|
range.selectNodeContents(getSelection().getRangeAt(0).startContainer.parentElement);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (commandName === "check" || commandName === "list" || commandName === "ordered-list") {
|
|||
|
|
listToggle(vditor, range, commandName, false);
|
|||
|
|
useHighlight = false;
|
|||
|
|
removeCurrentToolbar(vditor.toolbar.elements, ["check", "list", "ordered-list"]);
|
|||
|
|
actionBtn.classList.add("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.ir.element, range);
|
|||
|
|
process_processAfterRender(vditor);
|
|||
|
|
if (useHighlight) {
|
|||
|
|
highlightToolbarIR(vditor);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/hint/index.ts
|
|||
|
|
var hint_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|||
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|||
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|||
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|||
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|||
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|||
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
var hint_generator = (undefined && undefined.__generator) || function (thisArg, body) {
|
|||
|
|
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|||
|
|
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|||
|
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|||
|
|
function step(op) {
|
|||
|
|
if (f) throw new TypeError("Generator is already executing.");
|
|||
|
|
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|||
|
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|||
|
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|||
|
|
switch (op[0]) {
|
|||
|
|
case 0: case 1: t = op; break;
|
|||
|
|
case 4: _.label++; return { value: op[1], done: false };
|
|||
|
|
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|||
|
|
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|||
|
|
default:
|
|||
|
|
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|||
|
|
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|||
|
|
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|||
|
|
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|||
|
|
if (t[2]) _.ops.pop();
|
|||
|
|
_.trys.pop(); continue;
|
|||
|
|
}
|
|||
|
|
op = body.call(thisArg, _);
|
|||
|
|
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|||
|
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Hint = /** @class */ (function () {
|
|||
|
|
function Hint(hintExtends) {
|
|||
|
|
var _this = this;
|
|||
|
|
this.splitChar = "";
|
|||
|
|
this.lastIndex = -1;
|
|||
|
|
this.fillEmoji = function (element, vditor) {
|
|||
|
|
_this.element.style.display = "none";
|
|||
|
|
var value = decodeURIComponent(element.getAttribute("data-value"));
|
|||
|
|
var range = window.getSelection().getRangeAt(0);
|
|||
|
|
// 代码提示
|
|||
|
|
if (vditor.currentMode === "ir") {
|
|||
|
|
var preBeforeElement = (0,hasClosest/* hasClosestByAttribute */.a1)(range.startContainer, "data-type", "code-block-info");
|
|||
|
|
if (preBeforeElement) {
|
|||
|
|
preBeforeElement.textContent = constants/* Constants.ZWSP */.g.ZWSP + value.trimRight();
|
|||
|
|
range.selectNodeContents(preBeforeElement);
|
|||
|
|
range.collapse(false);
|
|||
|
|
process_processAfterRender(vditor);
|
|||
|
|
preBeforeElement.parentElement.querySelectorAll("code").forEach(function (item) {
|
|||
|
|
item.className = "language-" + value.trimRight();
|
|||
|
|
});
|
|||
|
|
processCodeRender(preBeforeElement.parentElement.querySelector(".vditor-ir__preview"), vditor);
|
|||
|
|
_this.recentLanguage = value.trimRight();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (vditor.currentMode === "wysiwyg" && range.startContainer.nodeType !== 3) {
|
|||
|
|
var startContainer = range.startContainer;
|
|||
|
|
var inputElement = void 0;
|
|||
|
|
if (startContainer.classList.contains("vditor-input")) {
|
|||
|
|
inputElement = startContainer;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
inputElement = startContainer.firstElementChild;
|
|||
|
|
}
|
|||
|
|
if (inputElement && inputElement.classList.contains("vditor-input")) {
|
|||
|
|
inputElement.value = value.trimRight();
|
|||
|
|
range.selectNodeContents(inputElement);
|
|||
|
|
range.collapse(false);
|
|||
|
|
// {detail: 1}用于标识这个自定义事件是在编程语言选择后触发的
|
|||
|
|
// 用于在鼠标选择语言后,自动聚焦到代码输入框
|
|||
|
|
inputElement.dispatchEvent(new CustomEvent("input", { detail: 1 }));
|
|||
|
|
_this.recentLanguage = value.trimRight();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
range.setStart(range.startContainer, _this.lastIndex);
|
|||
|
|
range.deleteContents();
|
|||
|
|
if (vditor.options.hint.parse) {
|
|||
|
|
if (vditor.currentMode === "sv") {
|
|||
|
|
(0,selection/* insertHTML */.oC)(vditor.lute.SpinVditorSVDOM(value), vditor);
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
(0,selection/* insertHTML */.oC)(vditor.lute.SpinVditorDOM(value), vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
(0,selection/* insertHTML */.oC)(vditor.lute.SpinVditorIRDOM(value), vditor);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
(0,selection/* insertHTML */.oC)(value, vditor);
|
|||
|
|
}
|
|||
|
|
if (_this.splitChar === ":" && value.indexOf(":") > -1 && vditor.currentMode !== "sv") {
|
|||
|
|
range.insertNode(document.createTextNode(" "));
|
|||
|
|
}
|
|||
|
|
range.collapse(false);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
var preElement = (0,hasClosest/* hasClosestByClassName */.fb)(range.startContainer, "vditor-wysiwyg__block");
|
|||
|
|
if (preElement && preElement.lastElementChild.classList.contains("vditor-wysiwyg__preview")) {
|
|||
|
|
preElement.lastElementChild.innerHTML = preElement.firstElementChild.innerHTML;
|
|||
|
|
processCodeRender(preElement.lastElementChild, vditor);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "ir") {
|
|||
|
|
var preElement = (0,hasClosest/* hasClosestByClassName */.fb)(range.startContainer, "vditor-ir__marker--pre");
|
|||
|
|
if (preElement && preElement.nextElementSibling.classList.contains("vditor-ir__preview")) {
|
|||
|
|
preElement.nextElementSibling.innerHTML = preElement.innerHTML;
|
|||
|
|
processCodeRender(preElement.nextElementSibling, vditor);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
};
|
|||
|
|
this.timeId = -1;
|
|||
|
|
this.element = document.createElement("div");
|
|||
|
|
this.element.className = "vditor-hint";
|
|||
|
|
this.recentLanguage = "";
|
|||
|
|
hintExtends.push({ key: ":" });
|
|||
|
|
}
|
|||
|
|
Hint.prototype.render = function (vditor) {
|
|||
|
|
var _this = this;
|
|||
|
|
if (!window.getSelection().focusNode) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var currentLineValue;
|
|||
|
|
var range = getSelection().getRangeAt(0);
|
|||
|
|
currentLineValue = range.startContainer.textContent.substring(0, range.startOffset) || "";
|
|||
|
|
var key = this.getKey(currentLineValue, vditor.options.hint.extend);
|
|||
|
|
if (typeof key === "undefined") {
|
|||
|
|
this.element.style.display = "none";
|
|||
|
|
clearTimeout(this.timeId);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (this.splitChar === ":") {
|
|||
|
|
var emojiHint_1 = key === "" ? vditor.options.hint.emoji : vditor.lute.GetEmojis();
|
|||
|
|
var matchEmojiData_1 = [];
|
|||
|
|
Object.keys(emojiHint_1).forEach(function (keyName) {
|
|||
|
|
if (keyName.indexOf(key.toLowerCase()) === 0) {
|
|||
|
|
if (emojiHint_1[keyName].indexOf(".") > -1) {
|
|||
|
|
matchEmojiData_1.push({
|
|||
|
|
html: "<img src=\"".concat(emojiHint_1[keyName], "\" title=\":").concat(keyName, ":\"/> :").concat(keyName, ":"),
|
|||
|
|
value: ":".concat(keyName, ":"),
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
matchEmojiData_1.push({
|
|||
|
|
html: "<span class=\"vditor-hint__emoji\">".concat(emojiHint_1[keyName], "</span>").concat(keyName),
|
|||
|
|
value: emojiHint_1[keyName],
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
this.genHTML(matchEmojiData_1, key, vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.options.hint.extend.forEach(function (item) {
|
|||
|
|
if (item.key === _this.splitChar) {
|
|||
|
|
clearTimeout(_this.timeId);
|
|||
|
|
_this.timeId = window.setTimeout(function () { return hint_awaiter(_this, void 0, void 0, function () {
|
|||
|
|
var _a;
|
|||
|
|
return hint_generator(this, function (_b) {
|
|||
|
|
switch (_b.label) {
|
|||
|
|
case 0:
|
|||
|
|
_a = this.genHTML;
|
|||
|
|
return [4 /*yield*/, item.hint(key)];
|
|||
|
|
case 1:
|
|||
|
|
_a.apply(this, [_b.sent(), key, vditor]);
|
|||
|
|
return [2 /*return*/];
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}); }, vditor.options.hint.delay);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
Hint.prototype.genHTML = function (data, key, vditor) {
|
|||
|
|
var _this = this;
|
|||
|
|
if (data.length === 0) {
|
|||
|
|
this.element.style.display = "none";
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var editorElement = vditor[vditor.currentMode].element;
|
|||
|
|
var textareaPosition = (0,selection/* getCursorPosition */.Ny)(editorElement);
|
|||
|
|
var x = textareaPosition.left +
|
|||
|
|
(vditor.options.outline.position === "left" ? vditor.outline.element.offsetWidth : 0);
|
|||
|
|
var y = textareaPosition.top;
|
|||
|
|
var hintsHTML = "";
|
|||
|
|
data.forEach(function (hintData, i) {
|
|||
|
|
if (i > 7) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// process high light
|
|||
|
|
var html = hintData.html;
|
|||
|
|
if (key !== "") {
|
|||
|
|
var lastIndex = html.lastIndexOf(">") + 1;
|
|||
|
|
var replaceHtml = html.substr(lastIndex);
|
|||
|
|
var replaceIndex = replaceHtml.toLowerCase().indexOf(key.toLowerCase());
|
|||
|
|
if (replaceIndex > -1) {
|
|||
|
|
replaceHtml = replaceHtml.substring(0, replaceIndex) + "<b>" +
|
|||
|
|
replaceHtml.substring(replaceIndex, replaceIndex + key.length) + "</b>" +
|
|||
|
|
replaceHtml.substring(replaceIndex + key.length);
|
|||
|
|
html = html.substr(0, lastIndex) + replaceHtml;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
hintsHTML += "<button type=\"button\" data-value=\"".concat(encodeURIComponent(hintData.value), " \"\n").concat(i === 0 ? "class='vditor-hint--current'" : "", "> ").concat(html, "</button>");
|
|||
|
|
});
|
|||
|
|
this.element.innerHTML = hintsHTML;
|
|||
|
|
var lineHeight = parseInt(document.defaultView.getComputedStyle(editorElement, null)
|
|||
|
|
.getPropertyValue("line-height"), 10);
|
|||
|
|
this.element.style.top = "".concat(y + (lineHeight || 22), "px");
|
|||
|
|
this.element.style.left = "".concat(x, "px");
|
|||
|
|
this.element.style.display = "block";
|
|||
|
|
this.element.style.right = "auto";
|
|||
|
|
this.element.querySelectorAll("button").forEach(function (element) {
|
|||
|
|
element.addEventListener("click", function (event) {
|
|||
|
|
_this.fillEmoji(element, vditor);
|
|||
|
|
event.preventDefault();
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
// hint 展现在上部
|
|||
|
|
if (this.element.getBoundingClientRect().bottom > window.innerHeight) {
|
|||
|
|
this.element.style.top = "".concat(y - this.element.offsetHeight, "px");
|
|||
|
|
}
|
|||
|
|
if (this.element.getBoundingClientRect().right > window.innerWidth) {
|
|||
|
|
this.element.style.left = "auto";
|
|||
|
|
this.element.style.right = "0";
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
Hint.prototype.select = function (event, vditor) {
|
|||
|
|
if (this.element.querySelectorAll("button").length === 0 ||
|
|||
|
|
this.element.style.display === "none") {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
var currentHintElement = this.element.querySelector(".vditor-hint--current");
|
|||
|
|
if (event.key === "ArrowDown") {
|
|||
|
|
event.preventDefault();
|
|||
|
|
event.stopPropagation();
|
|||
|
|
currentHintElement.removeAttribute("class");
|
|||
|
|
if (!currentHintElement.nextElementSibling) {
|
|||
|
|
this.element.children[0].className = "vditor-hint--current";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
currentHintElement.nextElementSibling.className = "vditor-hint--current";
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
else if (event.key === "ArrowUp") {
|
|||
|
|
event.preventDefault();
|
|||
|
|
event.stopPropagation();
|
|||
|
|
currentHintElement.removeAttribute("class");
|
|||
|
|
if (!currentHintElement.previousElementSibling) {
|
|||
|
|
var length_1 = this.element.children.length;
|
|||
|
|
this.element.children[length_1 - 1].className = "vditor-hint--current";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
currentHintElement.previousElementSibling.className = "vditor-hint--current";
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
else if (!(0,compatibility/* isCtrl */.yl)(event) && !event.shiftKey && !event.altKey && event.key === "Enter" && !event.isComposing) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
event.stopPropagation();
|
|||
|
|
this.fillEmoji(currentHintElement, vditor);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
};
|
|||
|
|
Hint.prototype.getKey = function (currentLineValue, extend) {
|
|||
|
|
var _this = this;
|
|||
|
|
this.lastIndex = -1;
|
|||
|
|
this.splitChar = "";
|
|||
|
|
extend.forEach(function (item) {
|
|||
|
|
var currentLastIndex = currentLineValue.lastIndexOf(item.key);
|
|||
|
|
if (_this.lastIndex < currentLastIndex) {
|
|||
|
|
_this.splitChar = item.key;
|
|||
|
|
_this.lastIndex = currentLastIndex;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
var key;
|
|||
|
|
if (this.lastIndex === -1) {
|
|||
|
|
return key;
|
|||
|
|
}
|
|||
|
|
var lineArray = currentLineValue.split(this.splitChar);
|
|||
|
|
var lastItem = lineArray[lineArray.length - 1];
|
|||
|
|
var maxLength = 32;
|
|||
|
|
if (lineArray.length > 1 && lastItem.trim() === lastItem) {
|
|||
|
|
if (lineArray.length === 2 && lineArray[0] === "" && lineArray[1].length < maxLength) {
|
|||
|
|
key = lineArray[1];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var preChar = lineArray[lineArray.length - 2].slice(-1);
|
|||
|
|
if ((0,code160to32/* code160to32 */.X)(preChar) === " " && lastItem.length < maxLength) {
|
|||
|
|
key = lastItem;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return key;
|
|||
|
|
};
|
|||
|
|
return Hint;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/ir/index.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var IR = /** @class */ (function () {
|
|||
|
|
function IR(vditor) {
|
|||
|
|
this.composingLock = false;
|
|||
|
|
var divElement = document.createElement("div");
|
|||
|
|
divElement.className = "vditor-ir";
|
|||
|
|
divElement.innerHTML = "<pre class=\"vditor-reset\" placeholder=\"".concat(vditor.options.placeholder, "\"\n contenteditable=\"true\" spellcheck=\"false\"></pre>");
|
|||
|
|
this.element = divElement.firstElementChild;
|
|||
|
|
this.bindEvent(vditor);
|
|||
|
|
focusEvent(vditor, this.element);
|
|||
|
|
dblclickEvent(vditor, this.element);
|
|||
|
|
blurEvent(vditor, this.element);
|
|||
|
|
hotkeyEvent(vditor, this.element);
|
|||
|
|
selectEvent(vditor, this.element);
|
|||
|
|
dropEvent(vditor, this.element);
|
|||
|
|
copyEvent(vditor, this.element, this.copy);
|
|||
|
|
cutEvent(vditor, this.element, this.copy);
|
|||
|
|
}
|
|||
|
|
IR.prototype.copy = function (event, vditor) {
|
|||
|
|
var range = getSelection().getRangeAt(0);
|
|||
|
|
if (range.toString() === "") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
event.stopPropagation();
|
|||
|
|
event.preventDefault();
|
|||
|
|
var tempElement = document.createElement("div");
|
|||
|
|
tempElement.appendChild(range.cloneContents());
|
|||
|
|
event.clipboardData.setData("text/plain", vditor.lute.VditorIRDOM2Md(tempElement.innerHTML).trim());
|
|||
|
|
event.clipboardData.setData("text/html", "");
|
|||
|
|
};
|
|||
|
|
IR.prototype.bindEvent = function (vditor) {
|
|||
|
|
var _this = this;
|
|||
|
|
this.element.addEventListener("paste", function (event) {
|
|||
|
|
paste(vditor, event, {
|
|||
|
|
pasteCode: function (code) {
|
|||
|
|
document.execCommand("insertHTML", false, code);
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("scroll", function () {
|
|||
|
|
hidePanel(vditor, ["hint"]);
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("compositionstart", function (event) {
|
|||
|
|
_this.composingLock = true;
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("compositionend", function (event) {
|
|||
|
|
if (!(0,compatibility/* isFirefox */.vU)()) {
|
|||
|
|
input(vditor, getSelection().getRangeAt(0).cloneRange());
|
|||
|
|
}
|
|||
|
|
_this.composingLock = false;
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("input", function (event) {
|
|||
|
|
if (event.inputType === "deleteByDrag" || event.inputType === "insertFromDrop") {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/801 编辑器内容拖拽问题
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (_this.preventInput) {
|
|||
|
|
_this.preventInput = false;
|
|||
|
|
process_processAfterRender(vditor, {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: true,
|
|||
|
|
enableInput: true,
|
|||
|
|
});
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (_this.composingLock || event.data === "‘" || event.data === "“" || event.data === "《") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
input(vditor, getSelection().getRangeAt(0).cloneRange(), false, event);
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("click", function (event) {
|
|||
|
|
if (event.target.tagName === "INPUT") {
|
|||
|
|
if (event.target.checked) {
|
|||
|
|
event.target.setAttribute("checked", "checked");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
event.target.removeAttribute("checked");
|
|||
|
|
}
|
|||
|
|
_this.preventInput = true;
|
|||
|
|
process_processAfterRender(vditor);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
// 点击后光标落于预览区
|
|||
|
|
var previewElement = (0,hasClosest/* hasClosestByClassName */.fb)(event.target, "vditor-ir__preview");
|
|||
|
|
if (!previewElement) {
|
|||
|
|
previewElement = (0,hasClosest/* hasClosestByClassName */.fb)(range.startContainer, "vditor-ir__preview");
|
|||
|
|
}
|
|||
|
|
if (previewElement) {
|
|||
|
|
if (previewElement.previousElementSibling.firstElementChild) {
|
|||
|
|
range.selectNodeContents(previewElement.previousElementSibling.firstElementChild);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// 行内数学公式
|
|||
|
|
range.selectNodeContents(previewElement.previousElementSibling);
|
|||
|
|
}
|
|||
|
|
range.collapse(true);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
}
|
|||
|
|
// 点击图片光标选中图片地址
|
|||
|
|
if (event.target.tagName === "IMG") {
|
|||
|
|
var linkElement = event.target.parentElement.querySelector(".vditor-ir__marker--link");
|
|||
|
|
if (linkElement) {
|
|||
|
|
range.selectNode(linkElement);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 打开链接
|
|||
|
|
var aElement = (0,hasClosest/* hasClosestByAttribute */.a1)(event.target, "data-type", "a");
|
|||
|
|
if (aElement && (!aElement.classList.contains("vditor-ir__node--expand"))) {
|
|||
|
|
if (vditor.options.link.click) {
|
|||
|
|
vditor.options.link.click(aElement.querySelector(":scope > .vditor-ir__marker--link"));
|
|||
|
|
}
|
|||
|
|
else if (vditor.options.link.isOpen) {
|
|||
|
|
window.open(aElement.querySelector(":scope > .vditor-ir__marker--link").textContent);
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (event.target.isEqualNode(_this.element) && _this.element.lastElementChild && range.collapsed) {
|
|||
|
|
var lastRect = _this.element.lastElementChild.getBoundingClientRect();
|
|||
|
|
if (event.y > lastRect.top + lastRect.height) {
|
|||
|
|
if (_this.element.lastElementChild.tagName === "P" &&
|
|||
|
|
_this.element.lastElementChild.textContent.trim().replace(constants/* Constants.ZWSP */.g.ZWSP, "") === "") {
|
|||
|
|
range.selectNodeContents(_this.element.lastElementChild);
|
|||
|
|
range.collapse(false);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
_this.element.insertAdjacentHTML("beforeend", "<p data-block=\"0\">".concat(constants/* Constants.ZWSP */.g.ZWSP, "<wbr></p>"));
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(_this.element, range);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (range.toString() === "") {
|
|||
|
|
expandMarker(range, vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// https://github.com/Vanessa219/vditor/pull/681 当点击选中区域时 eventTarget 与 range 不一致,需延迟等待 range 发生变化
|
|||
|
|
setTimeout(function () {
|
|||
|
|
expandMarker((0,selection/* getEditorRange */.zh)(vditor), vditor);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
clickToc(event, vditor);
|
|||
|
|
highlightToolbarIR(vditor);
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("keyup", function (event) {
|
|||
|
|
if (event.isComposing || (0,compatibility/* isCtrl */.yl)(event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (event.key === "Enter") {
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
}
|
|||
|
|
highlightToolbarIR(vditor);
|
|||
|
|
if ((event.key === "Backspace" || event.key === "Delete") &&
|
|||
|
|
vditor.ir.element.innerHTML !== "" && vditor.ir.element.childNodes.length === 1 &&
|
|||
|
|
vditor.ir.element.firstElementChild && vditor.ir.element.firstElementChild.tagName === "P"
|
|||
|
|
&& vditor.ir.element.firstElementChild.childElementCount === 0
|
|||
|
|
&& (vditor.ir.element.textContent === "" || vditor.ir.element.textContent === "\n")) {
|
|||
|
|
// 为空时显示 placeholder
|
|||
|
|
vditor.ir.element.innerHTML = "";
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
if (event.key === "Backspace") {
|
|||
|
|
// firefox headings https://github.com/Vanessa219/vditor/issues/211
|
|||
|
|
if ((0,compatibility/* isFirefox */.vU)() && range.startContainer.textContent === "\n" && range.startOffset === 1) {
|
|||
|
|
range.startContainer.textContent = "";
|
|||
|
|
expandMarker(range, vditor);
|
|||
|
|
}
|
|||
|
|
// 数学公式前是空块,空块前是 table,在空块前删除,数学公式会多一个 br
|
|||
|
|
_this.element.querySelectorAll(".language-math").forEach(function (item) {
|
|||
|
|
var brElement = item.querySelector("br");
|
|||
|
|
if (brElement) {
|
|||
|
|
brElement.remove();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
else if (event.key.indexOf("Arrow") > -1) {
|
|||
|
|
if (event.key === "ArrowLeft" || event.key === "ArrowRight") {
|
|||
|
|
processHint(vditor);
|
|||
|
|
}
|
|||
|
|
expandMarker(range, vditor);
|
|||
|
|
}
|
|||
|
|
else if (event.keyCode === 229 && event.code === "" && event.key === "Unidentified") {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/508 IR 删除到节点需展开
|
|||
|
|
expandMarker(range, vditor);
|
|||
|
|
}
|
|||
|
|
var previewRenderElement = (0,hasClosest/* hasClosestByClassName */.fb)(range.startContainer, "vditor-ir__preview");
|
|||
|
|
if (previewRenderElement) {
|
|||
|
|
if (event.key === "ArrowUp" || event.key === "ArrowLeft") {
|
|||
|
|
if (previewRenderElement.previousElementSibling.firstElementChild) {
|
|||
|
|
range.selectNodeContents(previewRenderElement.previousElementSibling.firstElementChild);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// 行内数学公式/html entity
|
|||
|
|
range.selectNodeContents(previewRenderElement.previousElementSibling);
|
|||
|
|
}
|
|||
|
|
range.collapse(false);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
if (previewRenderElement.tagName === "SPAN" &&
|
|||
|
|
(event.key === "ArrowDown" || event.key === "ArrowRight")) {
|
|||
|
|
if (previewRenderElement.parentElement.getAttribute("data-type") === "html-entity") {
|
|||
|
|
// html entity
|
|||
|
|
previewRenderElement.parentElement.insertAdjacentText("afterend", constants/* Constants.ZWSP */.g.ZWSP);
|
|||
|
|
range.setStart(previewRenderElement.parentElement.nextSibling, 1);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.selectNodeContents(previewRenderElement.parentElement.lastElementChild);
|
|||
|
|
}
|
|||
|
|
range.collapse(false);
|
|||
|
|
event.preventDefault();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
return IR;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/markdown/getHTML.ts
|
|||
|
|
|
|||
|
|
var getHTML = function (vditor) {
|
|||
|
|
if (vditor.currentMode === "sv") {
|
|||
|
|
return vditor.lute.Md2HTML(getMarkdown(vditor));
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
return vditor.lute.VditorDOM2HTML(vditor.wysiwyg.element.innerHTML);
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "ir") {
|
|||
|
|
return vditor.lute.VditorIRDOM2HTML(vditor.ir.element.innerHTML);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/setLute.ts
|
|||
|
|
var setLute = __webpack_require__(214);
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/outlineRender.ts
|
|||
|
|
var outlineRender = __webpack_require__(436);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/outline/index.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Outline = /** @class */ (function () {
|
|||
|
|
function Outline(outlineLabel) {
|
|||
|
|
this.element = document.createElement("div");
|
|||
|
|
this.element.className = "vditor-outline";
|
|||
|
|
this.element.innerHTML = "<div class=\"vditor-outline__title\">".concat(outlineLabel, "</div>\n<div class=\"vditor-outline__content\"></div>");
|
|||
|
|
}
|
|||
|
|
Outline.prototype.render = function (vditor) {
|
|||
|
|
var html = "";
|
|||
|
|
if (vditor.preview.element.style.display === "block") {
|
|||
|
|
html = (0,outlineRender/* outlineRender */.k)(vditor.preview.previewElement, this.element.lastElementChild, vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
html = (0,outlineRender/* outlineRender */.k)(vditor[vditor.currentMode].element, this.element.lastElementChild, vditor);
|
|||
|
|
}
|
|||
|
|
return html;
|
|||
|
|
};
|
|||
|
|
Outline.prototype.toggle = function (vditor, show, focus) {
|
|||
|
|
var _a;
|
|||
|
|
if (show === void 0) { show = true; }
|
|||
|
|
if (focus === void 0) { focus = true; }
|
|||
|
|
var btnElement = (_a = vditor.toolbar.elements.outline) === null || _a === void 0 ? void 0 : _a.firstElementChild;
|
|||
|
|
if (show && window.innerWidth >= constants/* Constants.MOBILE_WIDTH */.g.MOBILE_WIDTH) {
|
|||
|
|
this.element.style.display = "block";
|
|||
|
|
this.render(vditor);
|
|||
|
|
btnElement === null || btnElement === void 0 ? void 0 : btnElement.classList.add("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
this.element.style.display = "none";
|
|||
|
|
btnElement === null || btnElement === void 0 ? void 0 : btnElement.classList.remove("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
if (focus && getSelection().rangeCount > 0) {
|
|||
|
|
var range = getSelection().getRangeAt(0);
|
|||
|
|
if (vditor[vditor.currentMode].element.contains(range.startContainer)) {
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
setPadding(vditor);
|
|||
|
|
};
|
|||
|
|
return Outline;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/markdown/mediaRender.ts
|
|||
|
|
var mediaRender = __webpack_require__(280);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/preview/index.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Preview = /** @class */ (function () {
|
|||
|
|
function Preview(vditor) {
|
|||
|
|
var _this = this;
|
|||
|
|
this.element = document.createElement("div");
|
|||
|
|
this.element.className = "vditor-preview";
|
|||
|
|
this.previewElement = document.createElement("div");
|
|||
|
|
this.previewElement.className = "vditor-reset";
|
|||
|
|
if (vditor.options.classes.preview) {
|
|||
|
|
this.previewElement.classList.add(vditor.options.classes.preview);
|
|||
|
|
}
|
|||
|
|
this.previewElement.style.maxWidth = vditor.options.preview.maxWidth + "px";
|
|||
|
|
this.previewElement.addEventListener("copy", function (event) {
|
|||
|
|
if (event.target.tagName === "TEXTAREA") {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/901
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var tempElement = document.createElement("div");
|
|||
|
|
tempElement.className = "vditor-reset";
|
|||
|
|
tempElement.appendChild(getSelection().getRangeAt(0).cloneContents());
|
|||
|
|
_this.copyToX(vditor, tempElement, "default");
|
|||
|
|
event.preventDefault();
|
|||
|
|
});
|
|||
|
|
this.previewElement.addEventListener("click", function (event) {
|
|||
|
|
var spanElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(event.target, "SPAN");
|
|||
|
|
if (spanElement && (0,hasClosest/* hasClosestByClassName */.fb)(spanElement, "vditor-toc")) {
|
|||
|
|
var headingElement = _this.previewElement.querySelector("#" + spanElement.getAttribute("data-target-id"));
|
|||
|
|
if (headingElement) {
|
|||
|
|
_this.element.scrollTop = headingElement.offsetTop;
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (event.target.tagName === "A") {
|
|||
|
|
if (vditor.options.link.click) {
|
|||
|
|
vditor.options.link.click(event.target);
|
|||
|
|
}
|
|||
|
|
else if (vditor.options.link.isOpen) {
|
|||
|
|
window.open(event.target.getAttribute("href"));
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (event.target.tagName === "IMG") {
|
|||
|
|
if (vditor.options.image.preview) {
|
|||
|
|
vditor.options.image.preview(event.target);
|
|||
|
|
}
|
|||
|
|
else if (vditor.options.image.isPreview) {
|
|||
|
|
(0,preview_image/* previewImage */.E)(event.target, vditor.options.lang, vditor.options.theme);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
this.element.appendChild(this.previewElement);
|
|||
|
|
var actions = vditor.options.preview.actions;
|
|||
|
|
if (actions.length === 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var actionElement = document.createElement("div");
|
|||
|
|
actionElement.className = "vditor-preview__action";
|
|||
|
|
var actionHtml = [];
|
|||
|
|
for (var i = 0; i < actions.length; i++) {
|
|||
|
|
var action = actions[i];
|
|||
|
|
if (typeof action === "object") {
|
|||
|
|
actionHtml.push("<button type=\"button\" data-type=\"".concat(action.key, "\" class=\"").concat(action.className, "\"").concat(action.tooltip ? " aria-label=\"".concat(action.tooltip, "\"") : "", "\">").concat(action.text, "</button>"));
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
switch (action) {
|
|||
|
|
case "desktop":
|
|||
|
|
actionHtml.push("<button type=\"button\" class=\"vditor-preview__action--current\" data-type=\"desktop\">Desktop</button>");
|
|||
|
|
break;
|
|||
|
|
case "tablet":
|
|||
|
|
actionHtml.push("<button type=\"button\" data-type=\"tablet\">Tablet</button>");
|
|||
|
|
break;
|
|||
|
|
case "mobile":
|
|||
|
|
actionHtml.push("<button type=\"button\" data-type=\"mobile\">Mobile/Wechat</button>");
|
|||
|
|
break;
|
|||
|
|
case "mp-wechat":
|
|||
|
|
actionHtml.push("<button type=\"button\" data-type=\"mp-wechat\" class=\"vditor-tooltipped vditor-tooltipped__w\" aria-label=\"\u590D\u5236\u5230\u516C\u4F17\u53F7\"><svg><use xlink:href=\"#vditor-icon-mp-wechat\"></use></svg></button>");
|
|||
|
|
break;
|
|||
|
|
case "zhihu":
|
|||
|
|
actionHtml.push("<button type=\"button\" data-type=\"zhihu\" class=\"vditor-tooltipped vditor-tooltipped__w\" aria-label=\"\u590D\u5236\u5230\u77E5\u4E4E\"><svg><use xlink:href=\"#vditor-icon-zhihu\"></use></svg></button>");
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
actionElement.innerHTML = actionHtml.join("");
|
|||
|
|
actionElement.addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
var btn = (0,hasClosestByHeadings/* hasClosestByTag */.S)(event.target, "BUTTON");
|
|||
|
|
if (!btn) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var type = btn.getAttribute("data-type");
|
|||
|
|
var actionCustom = actions.find(function (w) { return (w === null || w === void 0 ? void 0 : w.key) === type; });
|
|||
|
|
if (actionCustom) {
|
|||
|
|
actionCustom.click(type);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (type === "mp-wechat" || type === "zhihu") {
|
|||
|
|
_this.copyToX(vditor, _this.previewElement.cloneNode(true), type);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (type === "desktop") {
|
|||
|
|
_this.previewElement.style.width = "auto";
|
|||
|
|
}
|
|||
|
|
else if (type === "tablet") {
|
|||
|
|
_this.previewElement.style.width = "780px";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
_this.previewElement.style.width = "360px";
|
|||
|
|
}
|
|||
|
|
if (_this.previewElement.scrollWidth > _this.previewElement.parentElement.clientWidth) {
|
|||
|
|
_this.previewElement.style.width = "auto";
|
|||
|
|
}
|
|||
|
|
_this.render(vditor);
|
|||
|
|
actionElement.querySelectorAll("button").forEach(function (item) {
|
|||
|
|
item.classList.remove("vditor-preview__action--current");
|
|||
|
|
});
|
|||
|
|
btn.classList.add("vditor-preview__action--current");
|
|||
|
|
});
|
|||
|
|
this.element.insertBefore(actionElement, this.previewElement);
|
|||
|
|
}
|
|||
|
|
Preview.prototype.render = function (vditor, value) {
|
|||
|
|
var _this = this;
|
|||
|
|
clearTimeout(this.mdTimeoutId);
|
|||
|
|
if (this.element.style.display === "none") {
|
|||
|
|
if (this.element.getAttribute("data-type") === "renderPerformance") {
|
|||
|
|
vditor.tip.hide();
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (value) {
|
|||
|
|
this.previewElement.innerHTML = value;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (getMarkdown(vditor)
|
|||
|
|
.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "") === "") {
|
|||
|
|
this.previewElement.innerHTML = "";
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var renderStartTime = new Date().getTime();
|
|||
|
|
var markdownText = getMarkdown(vditor);
|
|||
|
|
this.mdTimeoutId = window.setTimeout(function () {
|
|||
|
|
if (vditor.options.preview.url) {
|
|||
|
|
var xhr_1 = new XMLHttpRequest();
|
|||
|
|
xhr_1.open("POST", vditor.options.preview.url);
|
|||
|
|
xhr_1.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
|
|||
|
|
xhr_1.onreadystatechange = function () {
|
|||
|
|
if (xhr_1.readyState === XMLHttpRequest.DONE) {
|
|||
|
|
if (xhr_1.status === 200) {
|
|||
|
|
var responseJSON = JSON.parse(xhr_1.responseText);
|
|||
|
|
if (responseJSON.code !== 0) {
|
|||
|
|
vditor.tip.show(responseJSON.msg);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (vditor.options.preview.transform) {
|
|||
|
|
responseJSON.data = vditor.options.preview.transform(responseJSON.data);
|
|||
|
|
}
|
|||
|
|
_this.previewElement.innerHTML = responseJSON.data;
|
|||
|
|
_this.afterRender(vditor, renderStartTime);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var html = vditor.lute.Md2HTML(markdownText);
|
|||
|
|
if (vditor.options.preview.transform) {
|
|||
|
|
html = vditor.options.preview.transform(html);
|
|||
|
|
}
|
|||
|
|
_this.previewElement.innerHTML = html;
|
|||
|
|
_this.afterRender(vditor, renderStartTime);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
xhr_1.send(JSON.stringify({ markdownText: markdownText }));
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var html = vditor.lute.Md2HTML(markdownText);
|
|||
|
|
if (vditor.options.preview.transform) {
|
|||
|
|
html = vditor.options.preview.transform(html);
|
|||
|
|
}
|
|||
|
|
_this.previewElement.innerHTML = html;
|
|||
|
|
_this.afterRender(vditor, renderStartTime);
|
|||
|
|
}
|
|||
|
|
}, vditor.options.preview.delay);
|
|||
|
|
};
|
|||
|
|
Preview.prototype.afterRender = function (vditor, startTime) {
|
|||
|
|
if (vditor.options.preview.parse) {
|
|||
|
|
vditor.options.preview.parse(this.element);
|
|||
|
|
}
|
|||
|
|
var time = (new Date().getTime() - startTime);
|
|||
|
|
if ((new Date().getTime() - startTime) > 2600) {
|
|||
|
|
// https://github.com/b3log/vditor/issues/67
|
|||
|
|
vditor.tip.show(window.VditorI18n.performanceTip.replace("${x}", time.toString()));
|
|||
|
|
vditor.preview.element.setAttribute("data-type", "renderPerformance");
|
|||
|
|
}
|
|||
|
|
else if (vditor.preview.element.getAttribute("data-type") === "renderPerformance") {
|
|||
|
|
vditor.tip.hide();
|
|||
|
|
vditor.preview.element.removeAttribute("data-type");
|
|||
|
|
}
|
|||
|
|
var cmtFocusElement = vditor.preview.element.querySelector(".vditor-comment--focus");
|
|||
|
|
if (cmtFocusElement) {
|
|||
|
|
cmtFocusElement.classList.remove("vditor-comment--focus");
|
|||
|
|
}
|
|||
|
|
(0,codeRender/* codeRender */.O)(vditor.preview.previewElement, vditor.options.preview.hljs);
|
|||
|
|
(0,highlightRender/* highlightRender */.s)(vditor.options.preview.hljs, vditor.preview.previewElement, vditor.options.cdn);
|
|||
|
|
(0,mermaidRender/* mermaidRender */.i)(vditor.preview.previewElement, vditor.options.cdn, vditor.options.theme);
|
|||
|
|
(0,markmapRender/* markmapRender */.K)(vditor.preview.previewElement, vditor.options.cdn);
|
|||
|
|
(0,SMILESRender/* SMILESRender */.J)(vditor.preview.previewElement, vditor.options.cdn, vditor.options.theme);
|
|||
|
|
(0,flowchartRender/* flowchartRender */.P)(vditor.preview.previewElement, vditor.options.cdn);
|
|||
|
|
(0,graphvizRender/* graphvizRender */.v)(vditor.preview.previewElement, vditor.options.cdn);
|
|||
|
|
(0,chartRender/* chartRender */.p)(vditor.preview.previewElement, vditor.options.cdn, vditor.options.theme);
|
|||
|
|
(0,mindmapRender/* mindmapRender */.P)(vditor.preview.previewElement, vditor.options.cdn, vditor.options.theme);
|
|||
|
|
(0,plantumlRender/* plantumlRender */.B)(vditor.preview.previewElement, vditor.options.cdn);
|
|||
|
|
(0,abcRender/* abcRender */.Q)(vditor.preview.previewElement, vditor.options.cdn);
|
|||
|
|
if (vditor.options.preview.render.media.enable) {
|
|||
|
|
(0,mediaRender/* mediaRender */.Y)(vditor.preview.previewElement);
|
|||
|
|
}
|
|||
|
|
vditor.options.customRenders.forEach(function (item) {
|
|||
|
|
item.render(vditor.preview.previewElement, vditor);
|
|||
|
|
});
|
|||
|
|
// toc render
|
|||
|
|
var editorElement = vditor.preview.element;
|
|||
|
|
var tocHTML = vditor.outline.render(vditor);
|
|||
|
|
if (tocHTML === "") {
|
|||
|
|
tocHTML = "[ToC]";
|
|||
|
|
}
|
|||
|
|
editorElement.querySelectorAll('[data-type="toc-block"]').forEach(function (item) {
|
|||
|
|
item.innerHTML = tocHTML;
|
|||
|
|
(0,mathRender/* mathRender */.H)(item, {
|
|||
|
|
cdn: vditor.options.cdn,
|
|||
|
|
math: vditor.options.preview.math,
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
(0,mathRender/* mathRender */.H)(vditor.preview.previewElement, {
|
|||
|
|
cdn: vditor.options.cdn,
|
|||
|
|
math: vditor.options.preview.math,
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
Preview.prototype.copyToX = function (vditor, copyElement, type) {
|
|||
|
|
if (type === void 0) { type = "mp-wechat"; }
|
|||
|
|
// fix math render
|
|||
|
|
if (type !== "zhihu") {
|
|||
|
|
copyElement.querySelectorAll(".katex-html .base").forEach(function (item) {
|
|||
|
|
item.style.display = "initial";
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
copyElement.querySelectorAll(".language-math").forEach(function (item) {
|
|||
|
|
item.outerHTML = "<img class=\"Formula-image\" data-eeimg=\"true\" src=\"//www.zhihu.com/equation?tex=\" alt=\"".concat(item.getAttribute("data-math"), "\\\" style=\"display: block; margin: 0 auto; max-width: 100%;\">");
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
// 防止背景色被粘贴到公众号中
|
|||
|
|
copyElement.style.backgroundColor = "#fff";
|
|||
|
|
// 代码背景
|
|||
|
|
copyElement.querySelectorAll("code").forEach(function (item) {
|
|||
|
|
item.style.backgroundImage = "none";
|
|||
|
|
});
|
|||
|
|
this.element.append(copyElement);
|
|||
|
|
var range = copyElement.ownerDocument.createRange();
|
|||
|
|
range.selectNode(copyElement);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
document.execCommand("copy");
|
|||
|
|
copyElement.remove();
|
|||
|
|
vditor.tip.show(['zhihu', 'mp-wechat'].includes(type) ? "\u5DF2\u590D\u5236\uFF0C\u53EF\u5230".concat(type === "zhihu" ? "知乎" : "微信公众号平台", "\u8FDB\u884C\u7C98\u8D34") : "\u5DF2\u590D\u5236\u5230\u526A\u5207\u677F");
|
|||
|
|
};
|
|||
|
|
return Preview;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/resize/index.ts
|
|||
|
|
var Resize = /** @class */ (function () {
|
|||
|
|
function Resize(vditor) {
|
|||
|
|
this.element = document.createElement("div");
|
|||
|
|
this.element.className = "vditor-resize vditor-resize--".concat(vditor.options.resize.position);
|
|||
|
|
this.element.innerHTML = "<div><svg><use xlink:href=\"#vditor-icon-resize\"></use></svg></div>";
|
|||
|
|
this.bindEvent(vditor);
|
|||
|
|
}
|
|||
|
|
Resize.prototype.bindEvent = function (vditor) {
|
|||
|
|
var _this = this;
|
|||
|
|
this.element.addEventListener("mousedown", function (event) {
|
|||
|
|
var documentSelf = document;
|
|||
|
|
var y = event.clientY;
|
|||
|
|
var height = vditor.element.offsetHeight;
|
|||
|
|
var minHeight = 63 + vditor.element.querySelector(".vditor-toolbar").clientHeight;
|
|||
|
|
documentSelf.ondragstart = function () { return false; };
|
|||
|
|
if (window.captureEvents) {
|
|||
|
|
window.captureEvents();
|
|||
|
|
}
|
|||
|
|
_this.element.classList.add("vditor-resize--selected");
|
|||
|
|
documentSelf.onmousemove = function (moveEvent) {
|
|||
|
|
if (vditor.options.resize.position === "top") {
|
|||
|
|
vditor.element.style.height = Math.max(minHeight, height + (y - moveEvent.clientY)) + "px";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.element.style.height = Math.max(minHeight, height + (moveEvent.clientY - y)) + "px";
|
|||
|
|
}
|
|||
|
|
if (vditor.options.typewriterMode) {
|
|||
|
|
vditor.sv.element.style.paddingBottom =
|
|||
|
|
vditor.sv.element.parentElement.offsetHeight / 2 + "px";
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
documentSelf.onmouseup = function () {
|
|||
|
|
if (vditor.options.resize.after) {
|
|||
|
|
vditor.options.resize.after(vditor.element.offsetHeight - height);
|
|||
|
|
}
|
|||
|
|
if (window.captureEvents) {
|
|||
|
|
window.captureEvents();
|
|||
|
|
}
|
|||
|
|
documentSelf.onmousemove = null;
|
|||
|
|
documentSelf.onmouseup = null;
|
|||
|
|
documentSelf.ondragstart = null;
|
|||
|
|
documentSelf.onselectstart = null;
|
|||
|
|
documentSelf.onselect = null;
|
|||
|
|
_this.element.classList.remove("vditor-resize--selected");
|
|||
|
|
};
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
return Resize;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/sv/index.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Editor = /** @class */ (function () {
|
|||
|
|
function Editor(vditor) {
|
|||
|
|
this.composingLock = false;
|
|||
|
|
this.element = document.createElement("pre");
|
|||
|
|
this.element.className = "vditor-sv vditor-reset";
|
|||
|
|
this.element.setAttribute("placeholder", vditor.options.placeholder);
|
|||
|
|
this.element.setAttribute("contenteditable", "true");
|
|||
|
|
this.element.setAttribute("spellcheck", "false");
|
|||
|
|
this.bindEvent(vditor);
|
|||
|
|
focusEvent(vditor, this.element);
|
|||
|
|
blurEvent(vditor, this.element);
|
|||
|
|
hotkeyEvent(vditor, this.element);
|
|||
|
|
selectEvent(vditor, this.element);
|
|||
|
|
dropEvent(vditor, this.element);
|
|||
|
|
copyEvent(vditor, this.element, this.copy);
|
|||
|
|
cutEvent(vditor, this.element, this.copy);
|
|||
|
|
}
|
|||
|
|
Editor.prototype.copy = function (event, vditor) {
|
|||
|
|
event.stopPropagation();
|
|||
|
|
event.preventDefault();
|
|||
|
|
event.clipboardData.setData("text/plain", getSelectText(vditor[vditor.currentMode].element));
|
|||
|
|
};
|
|||
|
|
Editor.prototype.bindEvent = function (vditor) {
|
|||
|
|
var _this = this;
|
|||
|
|
this.element.addEventListener("paste", function (event) {
|
|||
|
|
paste(vditor, event, {
|
|||
|
|
pasteCode: function (code) {
|
|||
|
|
document.execCommand("insertHTML", false, code);
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("scroll", function () {
|
|||
|
|
if (vditor.preview.element.style.display !== "block") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var textScrollTop = _this.element.scrollTop;
|
|||
|
|
var textHeight = _this.element.clientHeight;
|
|||
|
|
var textScrollHeight = _this.element.scrollHeight - parseFloat(_this.element.style.paddingBottom || "0");
|
|||
|
|
var preview = vditor.preview.element;
|
|||
|
|
if ((textScrollTop / textHeight > 0.5)) {
|
|||
|
|
preview.scrollTop = (textScrollTop + textHeight) *
|
|||
|
|
preview.scrollHeight / textScrollHeight - textHeight;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
preview.scrollTop = textScrollTop *
|
|||
|
|
preview.scrollHeight / textScrollHeight;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("compositionstart", function (event) {
|
|||
|
|
_this.composingLock = true;
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("compositionend", function (event) {
|
|||
|
|
if (!(0,compatibility/* isFirefox */.vU)()) {
|
|||
|
|
inputEvent(vditor, event);
|
|||
|
|
}
|
|||
|
|
_this.composingLock = false;
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("input", function (event) {
|
|||
|
|
if (event.inputType === "deleteByDrag" || event.inputType === "insertFromDrop") {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/801 编辑器内容拖拽问题
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (_this.composingLock || event.data === "‘" || event.data === "“" || event.data === "《") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (_this.preventInput) {
|
|||
|
|
_this.preventInput = false;
|
|||
|
|
processAfterRender(vditor, {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: true,
|
|||
|
|
enableInput: true,
|
|||
|
|
});
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
inputEvent(vditor, event);
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("keyup", function (event) {
|
|||
|
|
if (event.isComposing || (0,compatibility/* isCtrl */.yl)(event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if ((event.key === "Backspace" || event.key === "Delete") &&
|
|||
|
|
vditor.sv.element.innerHTML !== "" && vditor.sv.element.childNodes.length === 1 &&
|
|||
|
|
vditor.sv.element.firstElementChild && vditor.sv.element.firstElementChild.tagName === "DIV"
|
|||
|
|
&& vditor.sv.element.firstElementChild.childElementCount === 2
|
|||
|
|
&& (vditor.sv.element.firstElementChild.textContent === "" || vditor.sv.element.textContent === "\n")) {
|
|||
|
|
// 为空时显示 placeholder
|
|||
|
|
vditor.sv.element.innerHTML = "";
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (event.key === "Enter") {
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
return Editor;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/tip/index.ts
|
|||
|
|
var Tip = /** @class */ (function () {
|
|||
|
|
function Tip() {
|
|||
|
|
this.element = document.createElement("div");
|
|||
|
|
this.element.className = "vditor-tip";
|
|||
|
|
}
|
|||
|
|
Tip.prototype.show = function (text, time) {
|
|||
|
|
var _this = this;
|
|||
|
|
if (time === void 0) { time = 6000; }
|
|||
|
|
this.element.className = "vditor-tip vditor-tip--show";
|
|||
|
|
if (time === 0) {
|
|||
|
|
this.element.innerHTML = "<div class=\"vditor-tip__content\">".concat(text, "\n<div class=\"vditor-tip__close\">X</div></div>");
|
|||
|
|
this.element.querySelector(".vditor-tip__close").addEventListener("click", function () {
|
|||
|
|
_this.hide();
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
this.element.innerHTML = "<div class=\"vditor-tip__content\">".concat(text, "</div>");
|
|||
|
|
setTimeout(function () {
|
|||
|
|
_this.hide();
|
|||
|
|
}, time);
|
|||
|
|
}
|
|||
|
|
// 需在动画结束后才能确定位置
|
|||
|
|
this.element.removeAttribute("style");
|
|||
|
|
setTimeout(function () {
|
|||
|
|
var rect = _this.element.getBoundingClientRect();
|
|||
|
|
if (rect.top < 46) {
|
|||
|
|
_this.element.style.position = "fixed";
|
|||
|
|
_this.element.style.top = "46px";
|
|||
|
|
}
|
|||
|
|
}, 150);
|
|||
|
|
};
|
|||
|
|
Tip.prototype.hide = function () {
|
|||
|
|
this.element.className = "vditor-messageElementtip";
|
|||
|
|
this.element.innerHTML = "";
|
|||
|
|
};
|
|||
|
|
return Tip;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/ui/setPreviewMode.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
var setPreviewMode = function (mode, vditor) {
|
|||
|
|
if (vditor.options.preview.mode === mode) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
vditor.options.preview.mode = mode;
|
|||
|
|
switch (mode) {
|
|||
|
|
case "both":
|
|||
|
|
vditor.sv.element.style.display = "block";
|
|||
|
|
vditor.preview.element.style.display = "block";
|
|||
|
|
vditor.preview.render(vditor);
|
|||
|
|
setCurrentToolbar(vditor.toolbar.elements, ["both"]);
|
|||
|
|
break;
|
|||
|
|
case "editor":
|
|||
|
|
vditor.sv.element.style.display = "block";
|
|||
|
|
vditor.preview.element.style.display = "none";
|
|||
|
|
removeCurrentToolbar(vditor.toolbar.elements, ["both"]);
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if (vditor.devtools) {
|
|||
|
|
vditor.devtools.renderEchart(vditor);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Both.ts
|
|||
|
|
var Both_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Both = /** @class */ (function (_super) {
|
|||
|
|
Both_extends(Both, _super);
|
|||
|
|
function Both(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
if (vditor.options.preview.mode === "both") {
|
|||
|
|
_this.element.children[0].classList.add("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
_this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
var btnElement = _this.element.firstElementChild;
|
|||
|
|
if (btnElement.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
if (vditor.currentMode !== "sv") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (vditor.options.preview.mode === "both") {
|
|||
|
|
setPreviewMode("editor", vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
setPreviewMode("both", vditor);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
return Both;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Br.ts
|
|||
|
|
var Br = /** @class */ (function () {
|
|||
|
|
function Br() {
|
|||
|
|
this.element = document.createElement("div");
|
|||
|
|
this.element.className = "vditor-toolbar__br";
|
|||
|
|
}
|
|||
|
|
return Br;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/ui/setCodeTheme.ts
|
|||
|
|
var setCodeTheme = __webpack_require__(580);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/CodeTheme.ts
|
|||
|
|
var CodeTheme_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var CodeTheme = /** @class */ (function (_super) {
|
|||
|
|
CodeTheme_extends(CodeTheme, _super);
|
|||
|
|
function CodeTheme(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
var actionBtn = _this.element.children[0];
|
|||
|
|
var panelElement = document.createElement("div");
|
|||
|
|
panelElement.className = "vditor-hint".concat(menuItem.level === 2 ? "" : " vditor-panel--arrow");
|
|||
|
|
var innerHTML = "";
|
|||
|
|
constants/* Constants.CODE_THEME.forEach */.g.CODE_THEME.forEach(function (theme) {
|
|||
|
|
innerHTML += "<button>".concat(theme, "</button>");
|
|||
|
|
});
|
|||
|
|
panelElement.innerHTML =
|
|||
|
|
"<div style=\"overflow: auto;max-height:".concat(window.innerHeight / 2, "px\">").concat(innerHTML, "</div>");
|
|||
|
|
panelElement.addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
if (event.target.tagName === "BUTTON") {
|
|||
|
|
hidePanel(vditor, ["subToolbar"]);
|
|||
|
|
vditor.options.preview.hljs.style = event.target.textContent;
|
|||
|
|
(0,setCodeTheme/* setCodeTheme */.Y)(event.target.textContent, vditor.options.cdn);
|
|||
|
|
event.preventDefault();
|
|||
|
|
event.stopPropagation();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
_this.element.appendChild(panelElement);
|
|||
|
|
toggleSubMenu(vditor, panelElement, actionBtn, menuItem.level);
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
return CodeTheme;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/ContentTheme.ts
|
|||
|
|
var ContentTheme_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var ContentTheme = /** @class */ (function (_super) {
|
|||
|
|
ContentTheme_extends(ContentTheme, _super);
|
|||
|
|
function ContentTheme(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
var actionBtn = _this.element.children[0];
|
|||
|
|
var panelElement = document.createElement("div");
|
|||
|
|
panelElement.className = "vditor-hint".concat(menuItem.level === 2 ? "" : " vditor-panel--arrow");
|
|||
|
|
var innerHTML = "";
|
|||
|
|
Object.keys(vditor.options.preview.theme.list).forEach(function (key) {
|
|||
|
|
innerHTML += "<button data-type=\"".concat(key, "\">").concat(vditor.options.preview.theme.list[key], "</button>");
|
|||
|
|
});
|
|||
|
|
panelElement.innerHTML =
|
|||
|
|
"<div style=\"overflow: auto;max-height:".concat(window.innerHeight / 2, "px\">").concat(innerHTML, "</div>");
|
|||
|
|
panelElement.addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
if (event.target.tagName === "BUTTON") {
|
|||
|
|
hidePanel(vditor, ["subToolbar"]);
|
|||
|
|
vditor.options.preview.theme.current = event.target.getAttribute("data-type");
|
|||
|
|
(0,setContentTheme/* setContentTheme */.Z)(vditor.options.preview.theme.current, vditor.options.preview.theme.path);
|
|||
|
|
event.preventDefault();
|
|||
|
|
event.stopPropagation();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
_this.element.appendChild(panelElement);
|
|||
|
|
toggleSubMenu(vditor, panelElement, actionBtn, menuItem.level);
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
return ContentTheme;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Counter.ts
|
|||
|
|
var Counter = /** @class */ (function () {
|
|||
|
|
function Counter(vditor) {
|
|||
|
|
this.element = document.createElement("span");
|
|||
|
|
this.element.className = "vditor-counter vditor-tooltipped vditor-tooltipped__nw";
|
|||
|
|
this.render(vditor, "");
|
|||
|
|
}
|
|||
|
|
Counter.prototype.render = function (vditor, mdText) {
|
|||
|
|
var length = mdText.endsWith("\n") ? mdText.length - 1 : mdText.length;
|
|||
|
|
if (vditor.options.counter.type === "text" && vditor[vditor.currentMode]) {
|
|||
|
|
var tempElement = vditor[vditor.currentMode].element.cloneNode(true);
|
|||
|
|
tempElement.querySelectorAll(".vditor-wysiwyg__preview").forEach(function (item) {
|
|||
|
|
item.remove();
|
|||
|
|
});
|
|||
|
|
length = tempElement.textContent.length;
|
|||
|
|
}
|
|||
|
|
if (typeof vditor.options.counter.max === "number") {
|
|||
|
|
if (length > vditor.options.counter.max) {
|
|||
|
|
this.element.className = "vditor-counter vditor-counter--error";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
this.element.className = "vditor-counter";
|
|||
|
|
}
|
|||
|
|
this.element.innerHTML = "".concat(length, "/").concat(vditor.options.counter.max);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
this.element.innerHTML = "".concat(length);
|
|||
|
|
}
|
|||
|
|
this.element.setAttribute("aria-label", vditor.options.counter.type);
|
|||
|
|
if (vditor.options.counter.after) {
|
|||
|
|
vditor.options.counter.after(length, {
|
|||
|
|
enable: vditor.options.counter.enable,
|
|||
|
|
max: vditor.options.counter.max,
|
|||
|
|
type: vditor.options.counter.type,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
return Counter;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Custom.ts
|
|||
|
|
var Custom_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Custom = /** @class */ (function (_super) {
|
|||
|
|
Custom_extends(Custom, _super);
|
|||
|
|
function Custom(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
_this.element.children[0].innerHTML = menuItem.icon;
|
|||
|
|
_this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
if (event.currentTarget.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
menuItem.click(event, vditor);
|
|||
|
|
});
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
return Custom;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Devtools.ts
|
|||
|
|
var Devtools_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Devtools = /** @class */ (function (_super) {
|
|||
|
|
Devtools_extends(Devtools, _super);
|
|||
|
|
function Devtools(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
_this.element.firstElementChild.addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
var btnElement = _this.element.firstElementChild;
|
|||
|
|
if (btnElement.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
if (btnElement.classList.contains("vditor-menu--current")) {
|
|||
|
|
btnElement.classList.remove("vditor-menu--current");
|
|||
|
|
vditor.devtools.element.style.display = "none";
|
|||
|
|
setPadding(vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
btnElement.classList.add("vditor-menu--current");
|
|||
|
|
vditor.devtools.element.style.display = "block";
|
|||
|
|
setPadding(vditor);
|
|||
|
|
vditor.devtools.renderEchart(vditor);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
return Devtools;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Divider.ts
|
|||
|
|
var Divider = /** @class */ (function () {
|
|||
|
|
function Divider() {
|
|||
|
|
this.element = document.createElement("div");
|
|||
|
|
this.element.className = "vditor-toolbar__divider";
|
|||
|
|
}
|
|||
|
|
return Divider;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Emoji.ts
|
|||
|
|
var Emoji_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Emoji = /** @class */ (function (_super) {
|
|||
|
|
Emoji_extends(Emoji, _super);
|
|||
|
|
function Emoji(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
var panelElement = document.createElement("div");
|
|||
|
|
panelElement.className = "vditor-panel vditor-panel--arrow";
|
|||
|
|
var commonEmojiHTML = "";
|
|||
|
|
Object.keys(vditor.options.hint.emoji).forEach(function (key) {
|
|||
|
|
var emojiValue = vditor.options.hint.emoji[key];
|
|||
|
|
if (emojiValue.indexOf(".") > -1) {
|
|||
|
|
commonEmojiHTML += "<button data-value=\":".concat(key, ": \" data-key=\":").concat(key, ":\"><img\ndata-value=\":").concat(key, ": \" data-key=\":").concat(key, ":\" class=\"vditor-emojis__icon\" src=\"").concat(emojiValue, "\"/></button>");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
commonEmojiHTML += "<button data-value=\"".concat(emojiValue, " \"\n data-key=\"").concat(key, "\"><span class=\"vditor-emojis__icon\">").concat(emojiValue, "</span></button>");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
panelElement.innerHTML = "<div class=\"vditor-emojis\" style=\"max-height: ".concat(vditor.options.height === "auto" ? "auto" : vditor.options.height - 80, "px\">").concat(commonEmojiHTML, "</div><div class=\"vditor-emojis__tail\">\n <span class=\"vditor-emojis__tip\"></span><span>").concat(vditor.options.hint.emojiTail || "", "</span>\n</div>");
|
|||
|
|
_this.element.appendChild(panelElement);
|
|||
|
|
toggleSubMenu(vditor, panelElement, _this.element.firstElementChild, menuItem.level);
|
|||
|
|
_this.bindEvent(vditor);
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
Emoji.prototype.bindEvent = function (vditor) {
|
|||
|
|
var _this = this;
|
|||
|
|
this.element.lastElementChild.addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
var btnElement = (0,hasClosestByHeadings/* hasClosestByTag */.S)(event.target, "BUTTON");
|
|||
|
|
if (btnElement) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
var value = btnElement.getAttribute("data-value");
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
var html = value;
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
html = vditor.lute.SpinVditorDOM(value);
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "ir") {
|
|||
|
|
html = vditor.lute.SpinVditorIRDOM(value);
|
|||
|
|
}
|
|||
|
|
if (value.indexOf(":") > -1 && vditor.currentMode !== "sv") {
|
|||
|
|
var tempElement = document.createElement("div");
|
|||
|
|
tempElement.innerHTML = html;
|
|||
|
|
html = tempElement.firstElementChild.firstElementChild.outerHTML + " ";
|
|||
|
|
(0,selection/* insertHTML */.oC)(html, vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.extractContents();
|
|||
|
|
range.insertNode(document.createTextNode(value));
|
|||
|
|
if (!(0,hasClosest/* hasClosestBlock */.F9)(range.startContainer)) {
|
|||
|
|
modifyPre(vditor, range);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
range.collapse(false);
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(range);
|
|||
|
|
_this.element.lastElementChild.style.display = "none";
|
|||
|
|
execAfterRender(vditor);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
this.element.lastElementChild.addEventListener("mouseover", function (event) {
|
|||
|
|
var btnElement = (0,hasClosestByHeadings/* hasClosestByTag */.S)(event.target, "BUTTON");
|
|||
|
|
if (btnElement) {
|
|||
|
|
_this.element.querySelector(".vditor-emojis__tip").innerHTML = btnElement.getAttribute("data-key");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
return Emoji;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/export/index.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
var download = function (vditor, content, filename) {
|
|||
|
|
var aElement = document.createElement("a");
|
|||
|
|
if ("download" in aElement) {
|
|||
|
|
aElement.download = filename;
|
|||
|
|
aElement.style.display = "none";
|
|||
|
|
aElement.href = URL.createObjectURL(new Blob([content]));
|
|||
|
|
document.body.appendChild(aElement);
|
|||
|
|
aElement.click();
|
|||
|
|
aElement.remove();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.tip.show(window.VditorI18n.downloadTip, 0);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
var exportMarkdown = function (vditor) {
|
|||
|
|
var content = getMarkdown(vditor);
|
|||
|
|
download(vditor, content, content.substr(0, 10) + ".md");
|
|||
|
|
};
|
|||
|
|
var exportPDF = function (vditor) {
|
|||
|
|
vditor.tip.show(window.VditorI18n.generate, 3800);
|
|||
|
|
var iframe = document.querySelector("#vditorExportIframe");
|
|||
|
|
iframe.contentDocument.open();
|
|||
|
|
iframe.contentDocument.write("<link rel=\"stylesheet\" href=\"".concat(vditor.options.cdn, "/dist/index.css\"/>\n<script src=\"").concat(vditor.options.cdn, "/dist/method.min.js\"></script>\n<div id=\"preview\" style=\"width: 800px\"></div>\n<script>\nwindow.addEventListener(\"message\", (e) => {\n if(!e.data) {\n return;\n }\n Vditor.preview(document.getElementById('preview'), e.data, {\n cdn: \"").concat(vditor.options.cdn, "\",\n markdown: {\n theme: ").concat(JSON.stringify(vditor.options.preview.theme), "\n },\n hljs: {\n style: \"").concat(vditor.options.preview.hljs.style, "\"\n }\n });\n setTimeout(() => {\n window.print();\n }, 3600);\n}, false);\n</script>"));
|
|||
|
|
iframe.contentDocument.close();
|
|||
|
|
setTimeout(function () {
|
|||
|
|
iframe.contentWindow.postMessage(getMarkdown(vditor), "*");
|
|||
|
|
}, 200);
|
|||
|
|
};
|
|||
|
|
var exportHTML = function (vditor) {
|
|||
|
|
var content = getHTML(vditor);
|
|||
|
|
var html = "<html><head><link rel=\"stylesheet\" type=\"text/css\" href=\"".concat(vditor.options.cdn, "/dist/index.css\"/>\n<script src=\"").concat(vditor.options.cdn, "/dist/js/i18n/").concat(vditor.options.lang, ".js\"></script>\n<script src=\"").concat(vditor.options.cdn, "/dist/method.min.js\"></script></head>\n<body><div class=\"vditor-reset\" id=\"preview\">").concat(content, "</div>\n<script>\n const previewElement = document.getElementById('preview')\n Vditor.setContentTheme('").concat(vditor.options.preview.theme.current, "', '").concat(vditor.options.preview.theme.path, "');\n Vditor.codeRender(previewElement);\n Vditor.highlightRender(").concat(JSON.stringify(vditor.options.preview.hljs), ", previewElement, '").concat(vditor.options.cdn, "');\n Vditor.mathRender(previewElement, {\n cdn: '").concat(vditor.options.cdn, "',\n math: ").concat(JSON.stringify(vditor.options.preview.math), ",\n });\n Vditor.mermaidRender(previewElement, '").concat(vditor.options.cdn, "', '").concat(vditor.options.theme, "');\n Vditor.SMILESRender(previewElement, '").concat(vditor.options.cdn, "', '").concat(vditor.options.theme, "');\n Vditor.markmapRender(previewElement, '").concat(vditor.options.cdn, "');\n Vditor.flowchartRender(previewElement, '").concat(vditor.options.cdn, "');\n Vditor.graphvizRender(previewElement, '").concat(vditor.options.cdn, "');\n Vditor.chartRender(previewElement, '").concat(vditor.options.cdn, "', '").concat(vditor.options.theme, "');\n Vditor.mindmapRender(previewElement, '").concat(vditor.options.cdn, "', '").concat(vditor.options.theme, "');\n Vditor.abcRender(previewElement, '").concat(vditor.options.cdn, "');\n ").concat(vditor.options.preview.render.media.enable ? 'Vditor.mediaRender(previewElement);' : "", "\n Vditor.speechRender(previewElement);\n</script>\n<script src=\"").concat(vditor.options.cdn, "/dist/js/icons/").concat(vditor.options.icon, ".js\"></script></body></html>");
|
|||
|
|
download(vditor, html, content.substr(0, 10) + ".html");
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Export.ts
|
|||
|
|
var Export_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Export = /** @class */ (function (_super) {
|
|||
|
|
Export_extends(Export, _super);
|
|||
|
|
function Export(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
var actionBtn = _this.element.children[0];
|
|||
|
|
var panelElement = document.createElement("div");
|
|||
|
|
panelElement.className = "vditor-hint".concat(menuItem.level === 2 ? "" : " vditor-panel--arrow");
|
|||
|
|
panelElement.innerHTML = "<button data-type=\"markdown\">Markdown</button>\n<button data-type=\"pdf\">PDF</button>\n<button data-type=\"html\">HTML</button>";
|
|||
|
|
panelElement.addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
var btnElement = event.target;
|
|||
|
|
if (btnElement.tagName === "BUTTON") {
|
|||
|
|
switch (btnElement.getAttribute("data-type")) {
|
|||
|
|
case "markdown":
|
|||
|
|
exportMarkdown(vditor);
|
|||
|
|
break;
|
|||
|
|
case "pdf":
|
|||
|
|
exportPDF(vditor);
|
|||
|
|
break;
|
|||
|
|
case "html":
|
|||
|
|
exportHTML(vditor);
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
hidePanel(vditor, ["subToolbar"]);
|
|||
|
|
event.preventDefault();
|
|||
|
|
event.stopPropagation();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
_this.element.appendChild(panelElement);
|
|||
|
|
toggleSubMenu(vditor, panelElement, actionBtn, menuItem.level);
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
return Export;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Fullscreen.ts
|
|||
|
|
var Fullscreen_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Fullscreen = /** @class */ (function (_super) {
|
|||
|
|
Fullscreen_extends(Fullscreen, _super);
|
|||
|
|
function Fullscreen(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
_this._bindEvent(vditor, menuItem);
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
Fullscreen.prototype._bindEvent = function (vditor, menuItem) {
|
|||
|
|
this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
if (vditor.element.className.includes("vditor--fullscreen")) {
|
|||
|
|
if (!menuItem.level) {
|
|||
|
|
this.innerHTML = menuItem.icon;
|
|||
|
|
}
|
|||
|
|
vditor.element.style.zIndex = "";
|
|||
|
|
document.body.style.overflow = "";
|
|||
|
|
vditor.element.classList.remove("vditor--fullscreen");
|
|||
|
|
Object.keys(vditor.toolbar.elements).forEach(function (key) {
|
|||
|
|
var svgElement = vditor.toolbar.elements[key].firstChild;
|
|||
|
|
if (svgElement) {
|
|||
|
|
svgElement.className = svgElement.className.replace("__s", "__n");
|
|||
|
|
vditor.options.toolbar.forEach(function (item) {
|
|||
|
|
if (typeof item !== "string" && item.tipPosition && item.name === svgElement.dataset.type) {
|
|||
|
|
svgElement.className = "vditor-tooltipped vditor-tooltipped__".concat(item.tipPosition);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (vditor.counter) {
|
|||
|
|
vditor.counter.element.className = vditor.counter.element.className.replace("__s", "__n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (!menuItem.level) {
|
|||
|
|
this.innerHTML = '<svg><use xlink:href="#vditor-icon-contract"></use></svg>';
|
|||
|
|
}
|
|||
|
|
vditor.element.style.zIndex = vditor.options.fullscreen.index.toString();
|
|||
|
|
document.body.style.overflow = "hidden";
|
|||
|
|
vditor.element.classList.add("vditor--fullscreen");
|
|||
|
|
Object.keys(vditor.toolbar.elements).forEach(function (key) {
|
|||
|
|
var svgElement = vditor.toolbar.elements[key].firstChild;
|
|||
|
|
if (svgElement) {
|
|||
|
|
svgElement.className = svgElement.className.replace("__n", "__s");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (vditor.counter) {
|
|||
|
|
vditor.counter.element.className = vditor.counter.element.className.replace("__n", "__s");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (vditor.devtools) {
|
|||
|
|
vditor.devtools.renderEchart(vditor);
|
|||
|
|
}
|
|||
|
|
if (menuItem.click) {
|
|||
|
|
menuItem.click(event, vditor);
|
|||
|
|
}
|
|||
|
|
setPadding(vditor);
|
|||
|
|
setTypewriterPosition(vditor);
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
return Fullscreen;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Headings.ts
|
|||
|
|
var Headings_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Headings = /** @class */ (function (_super) {
|
|||
|
|
Headings_extends(Headings, _super);
|
|||
|
|
function Headings(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
var panelElement = document.createElement("div");
|
|||
|
|
panelElement.className = "vditor-hint vditor-panel--arrow";
|
|||
|
|
panelElement.innerHTML = "<button data-tag=\"h1\" data-value=\"# \">".concat(window.VditorI18n.heading1, " ").concat((0,compatibility/* updateHotkeyTip */.ns)("<⌥⌘1>"), "</button>\n<button data-tag=\"h2\" data-value=\"## \">").concat(window.VditorI18n.heading2, " <").concat((0,compatibility/* updateHotkeyTip */.ns)("⌥⌘2"), "></button>\n<button data-tag=\"h3\" data-value=\"### \">").concat(window.VditorI18n.heading3, " <").concat((0,compatibility/* updateHotkeyTip */.ns)("⌥⌘3"), "></button>\n<button data-tag=\"h4\" data-value=\"#### \">").concat(window.VditorI18n.heading4, " <").concat((0,compatibility/* updateHotkeyTip */.ns)("⌥⌘4"), "></button>\n<button data-tag=\"h5\" data-value=\"##### \">").concat(window.VditorI18n.heading5, " <").concat((0,compatibility/* updateHotkeyTip */.ns)("⌥⌘5"), "></button>\n<button data-tag=\"h6\" data-value=\"###### \">").concat(window.VditorI18n.heading6, " <").concat((0,compatibility/* updateHotkeyTip */.ns)("⌥⌘6"), "></button>");
|
|||
|
|
_this.element.appendChild(panelElement);
|
|||
|
|
_this._bindEvent(vditor, panelElement);
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
Headings.prototype._bindEvent = function (vditor, panelElement) {
|
|||
|
|
var actionBtn = this.element.children[0];
|
|||
|
|
actionBtn.addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/1391
|
|||
|
|
clearTimeout(vditor.wysiwyg.afterRenderTimeoutId);
|
|||
|
|
clearTimeout(vditor.ir.processTimeoutId);
|
|||
|
|
clearTimeout(vditor.sv.processTimeoutId);
|
|||
|
|
if (actionBtn.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
actionBtn.blur();
|
|||
|
|
if (actionBtn.classList.contains("vditor-menu--current")) {
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
removeHeading(vditor);
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "ir") {
|
|||
|
|
process_processHeading(vditor, "");
|
|||
|
|
}
|
|||
|
|
actionBtn.classList.remove("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
hidePanel(vditor, ["subToolbar"]);
|
|||
|
|
panelElement.style.display = "block";
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
for (var i = 0; i < 6; i++) {
|
|||
|
|
panelElement.children.item(i).addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
if (vditor.currentMode === "wysiwyg") {
|
|||
|
|
setHeading(vditor, event.target.getAttribute("data-tag"));
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
actionBtn.classList.add("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
else if (vditor.currentMode === "ir") {
|
|||
|
|
process_processHeading(vditor, event.target.getAttribute("data-value"));
|
|||
|
|
actionBtn.classList.add("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
processHeading(vditor, event.target.getAttribute("data-value"));
|
|||
|
|
}
|
|||
|
|
panelElement.style.display = "none";
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
return Headings;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Help.ts
|
|||
|
|
var Help_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Help = /** @class */ (function (_super) {
|
|||
|
|
Help_extends(Help, _super);
|
|||
|
|
function Help(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
_this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
vditor.tip.show("<div style=\"margin-bottom:14px;font-size: 14px;line-height: 22px;min-width:300px;max-width: 360px;display: flex;\">\n<div style=\"margin-top: 14px;flex: 1\">\n <div>Markdown \u4F7F\u7528\u6307\u5357</div>\n <ul style=\"list-style: none\">\n <li><a href=\"https://ld246.com/article/1583308420519\" target=\"_blank\">\u8BED\u6CD5\u901F\u67E5\u624B\u518C</a></li>\n <li><a href=\"https://ld246.com/article/1583129520165\" target=\"_blank\">\u57FA\u7840\u8BED\u6CD5</a></li>\n <li><a href=\"https://ld246.com/article/1583305480675\" target=\"_blank\">\u6269\u5C55\u8BED\u6CD5</a></li>\n <li><a href=\"https://ld246.com/article/1582778815353\" target=\"_blank\">\u952E\u76D8\u5FEB\u6377\u952E</a></li>\n </ul>\n</div>\n<div style=\"margin-top: 14px;flex: 1\">\n <div>Vditor \u652F\u6301</div>\n <ul style=\"list-style: none\">\n <li><a href=\"https://github.com/Vanessa219/vditor/issues\" target=\"_blank\">Issues</a></li>\n <li><a href=\"https://ld246.com/tag/vditor\" target=\"_blank\">\u5B98\u65B9\u8BA8\u8BBA\u533A</a></li>\n <li><a href=\"https://ld246.com/article/1549638745630\" target=\"_blank\">\u5F00\u53D1\u624B\u518C</a></li>\n <li><a href=\"https://ld246.com/guide/markdown\" target=\"_blank\">\u6F14\u793A\u5730\u5740</a></li>\n </ul>\n</div></div>", 0);
|
|||
|
|
});
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
return Help;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Indent.ts
|
|||
|
|
var Indent_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Indent = /** @class */ (function (_super) {
|
|||
|
|
Indent_extends(Indent, _super);
|
|||
|
|
function Indent(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
_this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
if (_this.element.firstElementChild.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED) ||
|
|||
|
|
vditor.currentMode === "sv") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
var liElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(range.startContainer, "LI");
|
|||
|
|
if (liElement) {
|
|||
|
|
listIndent(vditor, liElement, range);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
return Indent;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Info.ts
|
|||
|
|
var Info_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Info = /** @class */ (function (_super) {
|
|||
|
|
Info_extends(Info, _super);
|
|||
|
|
function Info(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
_this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
vditor.tip.show("<div style=\"max-width: 520px; font-size: 14px;line-height: 22px;margin-bottom: 14px;\">\n<p style=\"text-align: center;margin: 14px 0\">\n <em>\u4E0B\u4E00\u4EE3\u7684 Markdown \u7F16\u8F91\u5668\uFF0C\u4E3A\u672A\u6765\u800C\u6784\u5EFA</em>\n</p>\n<div style=\"display: flex;margin-bottom: 14px;flex-wrap: wrap;align-items: center\">\n <img src=\"https://unpkg.com/vditor/dist/images/logo.png\" style=\"margin: 0 auto;height: 68px\"/>\n <div> </div>\n <div style=\"flex: 1;min-width: 250px\">\n Vditor \u662F\u4E00\u6B3E\u6D4F\u89C8\u5668\u7AEF\u7684 Markdown \u7F16\u8F91\u5668\uFF0C\u652F\u6301\u6240\u89C1\u5373\u6240\u5F97\u3001\u5373\u65F6\u6E32\u67D3\uFF08\u7C7B\u4F3C Typora\uFF09\u548C\u5206\u5C4F\u9884\u89C8\u6A21\u5F0F\u3002\n \u5B83\u4F7F\u7528 TypeScript \u5B9E\u73B0\uFF0C\u652F\u6301\u539F\u751F JavaScript \u4EE5\u53CA Vue\u3001React\u3001Angular \u548C Svelte \u7B49\u6846\u67B6\u3002\n </div>\n</div>\n<div style=\"display: flex;flex-wrap: wrap;\">\n <ul style=\"list-style: none;flex: 1;min-width:148px\">\n <li>\n \u9879\u76EE\u5730\u5740\uFF1A<a href=\"https://b3log.org/vditor\" target=\"_blank\">b3log.org/vditor</a>\n </li>\n <li>\n \u5F00\u6E90\u534F\u8BAE\uFF1AMIT\n </li>\n </ul>\n <ul style=\"list-style: none;margin-right: 18px\">\n <li>\n \u7EC4\u4EF6\u7248\u672C\uFF1AVditor v".concat(constants/* VDITOR_VERSION */.H, " / Lute v").concat(Lute.Version, "\n </li>\n <li>\n \u8D5E\u52A9\u6350\u8D60\uFF1A<a href=\"https://ld246.com/sponsor\" target=\"_blank\">https://ld246.com/sponsor</a>\n </li>\n </ul>\n</div>\n</div>"), 0);
|
|||
|
|
});
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
return Info;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/InsertAfter.ts
|
|||
|
|
var InsertAfter_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var InsertAfter = /** @class */ (function (_super) {
|
|||
|
|
InsertAfter_extends(InsertAfter, _super);
|
|||
|
|
function InsertAfter(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
_this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
if (_this.element.firstElementChild.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED) ||
|
|||
|
|
vditor.currentMode === "sv") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
insertEmptyBlock(vditor, "afterend");
|
|||
|
|
});
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
return InsertAfter;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/InsertBefore.ts
|
|||
|
|
var InsertBefore_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var InsertBefore = /** @class */ (function (_super) {
|
|||
|
|
InsertBefore_extends(InsertBefore, _super);
|
|||
|
|
function InsertBefore(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
_this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
if (_this.element.firstElementChild.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED) ||
|
|||
|
|
vditor.currentMode === "sv") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
insertEmptyBlock(vditor, "beforebegin");
|
|||
|
|
});
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
return InsertBefore;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Outdent.ts
|
|||
|
|
var Outdent_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Outdent = /** @class */ (function (_super) {
|
|||
|
|
Outdent_extends(Outdent, _super);
|
|||
|
|
function Outdent(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
_this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
if (_this.element.firstElementChild.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED) ||
|
|||
|
|
vditor.currentMode === "sv") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
var liElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(range.startContainer, "LI");
|
|||
|
|
if (liElement) {
|
|||
|
|
listOutdent(vditor, liElement, range, liElement.parentElement);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
return Outdent;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Outline.ts
|
|||
|
|
var Outline_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Outline_Outline = /** @class */ (function (_super) {
|
|||
|
|
Outline_extends(Outline, _super);
|
|||
|
|
function Outline(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
if (vditor.options.outline) {
|
|||
|
|
_this.element.firstElementChild.classList.add("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
_this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
var btnElement = vditor.toolbar.elements.outline.firstElementChild;
|
|||
|
|
if (btnElement.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
vditor.options.outline.enable = !_this.element.firstElementChild.classList.contains("vditor-menu--current");
|
|||
|
|
vditor.outline.toggle(vditor, vditor.options.outline.enable);
|
|||
|
|
});
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
return Outline;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Preview.ts
|
|||
|
|
var Preview_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Preview_Preview = /** @class */ (function (_super) {
|
|||
|
|
Preview_extends(Preview, _super);
|
|||
|
|
function Preview(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
_this._bindEvent(vditor);
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
Preview.prototype._bindEvent = function (vditor) {
|
|||
|
|
var _this = this;
|
|||
|
|
this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
var btnElement = _this.element.firstElementChild;
|
|||
|
|
if (btnElement.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var toolbars = constants/* Constants.EDIT_TOOLBARS.concat */.g.EDIT_TOOLBARS.concat(["both", "edit-mode", "devtools"]);
|
|||
|
|
if (btnElement.classList.contains("vditor-menu--current")) {
|
|||
|
|
btnElement.classList.remove("vditor-menu--current");
|
|||
|
|
if (vditor.currentMode === "sv") {
|
|||
|
|
vditor.sv.element.style.display = "block";
|
|||
|
|
if (vditor.options.preview.mode === "both") {
|
|||
|
|
vditor.preview.element.style.display = "block";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.preview.element.style.display = "none";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor[vditor.currentMode].element.parentElement.style.display = "block";
|
|||
|
|
vditor.preview.element.style.display = "none";
|
|||
|
|
}
|
|||
|
|
enableToolbar(vditor.toolbar.elements, toolbars);
|
|||
|
|
vditor.outline.render(vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
disableToolbar(vditor.toolbar.elements, toolbars);
|
|||
|
|
vditor.preview.element.style.display = "block";
|
|||
|
|
if (vditor.currentMode === "sv") {
|
|||
|
|
vditor.sv.element.style.display = "none";
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor[vditor.currentMode].element.parentElement.style.display = "none";
|
|||
|
|
}
|
|||
|
|
vditor.preview.render(vditor);
|
|||
|
|
btnElement.classList.add("vditor-menu--current");
|
|||
|
|
hidePanel(vditor, ["subToolbar", "hint", "popover"]);
|
|||
|
|
setTimeout(function () {
|
|||
|
|
vditor.outline.render(vditor);
|
|||
|
|
}, vditor.options.preview.delay + 10);
|
|||
|
|
}
|
|||
|
|
setPadding(vditor);
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
return Preview;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/util/RecordMedia.ts
|
|||
|
|
var RecordMedia = /** @class */ (function () {
|
|||
|
|
function RecordMedia(e) {
|
|||
|
|
this.SAMPLE_RATE = 5000; // 44100 suggested by demos;
|
|||
|
|
this.isRecording = false;
|
|||
|
|
this.readyFlag = false;
|
|||
|
|
this.leftChannel = [];
|
|||
|
|
this.rightChannel = [];
|
|||
|
|
this.recordingLength = 0;
|
|||
|
|
var context;
|
|||
|
|
// creates the audio context
|
|||
|
|
if (typeof AudioContext !== "undefined") {
|
|||
|
|
context = new AudioContext();
|
|||
|
|
}
|
|||
|
|
else if (webkitAudioContext) {
|
|||
|
|
context = new webkitAudioContext();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
this.DEFAULT_SAMPLE_RATE = context.sampleRate;
|
|||
|
|
// creates a gain node
|
|||
|
|
var volume = context.createGain();
|
|||
|
|
// creates an audio node from the microphone incoming stream
|
|||
|
|
var audioInput = context.createMediaStreamSource(e);
|
|||
|
|
// connect the stream to the gain node
|
|||
|
|
audioInput.connect(volume);
|
|||
|
|
/* From the spec: The size of the buffer controls how frequently the audioprocess event is
|
|||
|
|
dispatched and how many sample-frames need to be processed each call.
|
|||
|
|
Lower values for buffer size will result in a lower (better) latency.
|
|||
|
|
Higher values will be necessary to avoid audio breakup and glitches */
|
|||
|
|
this.recorder = context.createScriptProcessor(2048, 2, 1);
|
|||
|
|
// The onaudioprocess event needs to be defined externally, so make sure it is not set:
|
|||
|
|
this.recorder.onaudioprocess = null;
|
|||
|
|
// we connect the recorder
|
|||
|
|
volume.connect(this.recorder);
|
|||
|
|
this.recorder.connect(context.destination);
|
|||
|
|
this.readyFlag = true;
|
|||
|
|
}
|
|||
|
|
// Publicly accessible methods:
|
|||
|
|
RecordMedia.prototype.cloneChannelData = function (leftChannelData, rightChannelData) {
|
|||
|
|
this.leftChannel.push(new Float32Array(leftChannelData));
|
|||
|
|
this.rightChannel.push(new Float32Array(rightChannelData));
|
|||
|
|
this.recordingLength += 2048;
|
|||
|
|
};
|
|||
|
|
RecordMedia.prototype.startRecordingNewWavFile = function () {
|
|||
|
|
if (this.readyFlag) {
|
|||
|
|
this.isRecording = true;
|
|||
|
|
this.leftChannel.length = this.rightChannel.length = 0;
|
|||
|
|
this.recordingLength = 0;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
RecordMedia.prototype.stopRecording = function () {
|
|||
|
|
this.isRecording = false;
|
|||
|
|
};
|
|||
|
|
RecordMedia.prototype.buildWavFileBlob = function () {
|
|||
|
|
// we flat the left and right channels down
|
|||
|
|
var leftBuffer = this.mergeBuffers(this.leftChannel);
|
|||
|
|
var rightBuffer = this.mergeBuffers(this.rightChannel);
|
|||
|
|
// Interleave the left and right channels together:
|
|||
|
|
var interleaved = new Float32Array(leftBuffer.length);
|
|||
|
|
for (var i = 0; i < leftBuffer.length; ++i) {
|
|||
|
|
interleaved[i] = 0.5 * (leftBuffer[i] + rightBuffer[i]);
|
|||
|
|
}
|
|||
|
|
// Downsample the audio data if necessary:
|
|||
|
|
if (this.DEFAULT_SAMPLE_RATE > this.SAMPLE_RATE) {
|
|||
|
|
interleaved = this.downSampleBuffer(interleaved, this.SAMPLE_RATE);
|
|||
|
|
}
|
|||
|
|
var totalByteCount = (44 + interleaved.length * 2);
|
|||
|
|
var buffer = new ArrayBuffer(totalByteCount);
|
|||
|
|
var view = new DataView(buffer);
|
|||
|
|
// Build the RIFF chunk descriptor:
|
|||
|
|
this.writeUTFBytes(view, 0, "RIFF");
|
|||
|
|
view.setUint32(4, totalByteCount, true);
|
|||
|
|
this.writeUTFBytes(view, 8, "WAVE");
|
|||
|
|
// Build the FMT sub-chunk:
|
|||
|
|
this.writeUTFBytes(view, 12, "fmt "); // subchunk1 ID is format
|
|||
|
|
view.setUint32(16, 16, true); // The sub-chunk size is 16.
|
|||
|
|
view.setUint16(20, 1, true); // The audio format is 1.
|
|||
|
|
view.setUint16(22, 1, true); // Number of interleaved channels.
|
|||
|
|
view.setUint32(24, this.SAMPLE_RATE, true); // Sample rate.
|
|||
|
|
view.setUint32(28, this.SAMPLE_RATE * 2, true); // Byte rate.
|
|||
|
|
view.setUint16(32, 2, true); // Block align
|
|||
|
|
view.setUint16(34, 16, true); // Bits per sample.
|
|||
|
|
// Build the data sub-chunk:
|
|||
|
|
var subChunk2ByteCount = interleaved.length * 2;
|
|||
|
|
this.writeUTFBytes(view, 36, "data");
|
|||
|
|
view.setUint32(40, subChunk2ByteCount, true);
|
|||
|
|
// Write the PCM samples to the view:
|
|||
|
|
var lng = interleaved.length;
|
|||
|
|
var index = 44;
|
|||
|
|
var volume = 1;
|
|||
|
|
for (var j = 0; j < lng; j++) {
|
|||
|
|
view.setInt16(index, interleaved[j] * (0x7FFF * volume), true);
|
|||
|
|
index += 2;
|
|||
|
|
}
|
|||
|
|
return new Blob([view], { type: "audio/wav" });
|
|||
|
|
};
|
|||
|
|
RecordMedia.prototype.downSampleBuffer = function (buffer, rate) {
|
|||
|
|
if (rate === this.DEFAULT_SAMPLE_RATE) {
|
|||
|
|
return buffer;
|
|||
|
|
}
|
|||
|
|
if (rate > this.DEFAULT_SAMPLE_RATE) {
|
|||
|
|
// throw "downsampling rate show be smaller than original sample rate";
|
|||
|
|
return buffer;
|
|||
|
|
}
|
|||
|
|
var sampleRateRatio = this.DEFAULT_SAMPLE_RATE / rate;
|
|||
|
|
var newLength = Math.round(buffer.length / sampleRateRatio);
|
|||
|
|
var result = new Float32Array(newLength);
|
|||
|
|
var offsetResult = 0;
|
|||
|
|
var offsetBuffer = 0;
|
|||
|
|
while (offsetResult < result.length) {
|
|||
|
|
var nextOffsetBuffer = Math.round((offsetResult + 1) * sampleRateRatio);
|
|||
|
|
var accum = 0;
|
|||
|
|
var count = 0;
|
|||
|
|
for (var i = offsetBuffer; i < nextOffsetBuffer && i < buffer.length; i++) {
|
|||
|
|
accum += buffer[i];
|
|||
|
|
count++;
|
|||
|
|
}
|
|||
|
|
result[offsetResult] = accum / count;
|
|||
|
|
offsetResult++;
|
|||
|
|
offsetBuffer = nextOffsetBuffer;
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
};
|
|||
|
|
RecordMedia.prototype.mergeBuffers = function (desiredChannelBuffer) {
|
|||
|
|
var result = new Float32Array(this.recordingLength);
|
|||
|
|
var offset = 0;
|
|||
|
|
var lng = desiredChannelBuffer.length;
|
|||
|
|
for (var i = 0; i < lng; ++i) {
|
|||
|
|
var buffer = desiredChannelBuffer[i];
|
|||
|
|
result.set(buffer, offset);
|
|||
|
|
offset += buffer.length;
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
};
|
|||
|
|
RecordMedia.prototype.writeUTFBytes = function (view, offset, value) {
|
|||
|
|
var lng = value.length;
|
|||
|
|
for (var i = 0; i < lng; i++) {
|
|||
|
|
view.setUint8(offset + i, value.charCodeAt(i));
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
return RecordMedia;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Record.ts
|
|||
|
|
var Record_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Record = /** @class */ (function (_super) {
|
|||
|
|
Record_extends(Record, _super);
|
|||
|
|
function Record(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
_this._bindEvent(vditor);
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
Record.prototype._bindEvent = function (vditor) {
|
|||
|
|
var _this = this;
|
|||
|
|
var mediaRecorder;
|
|||
|
|
this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
if (_this.element.firstElementChild.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var editorElement = vditor[vditor.currentMode].element;
|
|||
|
|
if (!mediaRecorder) {
|
|||
|
|
navigator.mediaDevices.getUserMedia({ audio: true }).then(function (mediaStream) {
|
|||
|
|
mediaRecorder = new RecordMedia(mediaStream);
|
|||
|
|
mediaRecorder.recorder.onaudioprocess = function (e) {
|
|||
|
|
// Do nothing if not recording:
|
|||
|
|
if (!mediaRecorder.isRecording) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// Copy the data from the input buffers;
|
|||
|
|
var left = e.inputBuffer.getChannelData(0);
|
|||
|
|
var right = e.inputBuffer.getChannelData(1);
|
|||
|
|
mediaRecorder.cloneChannelData(left, right);
|
|||
|
|
};
|
|||
|
|
mediaRecorder.startRecordingNewWavFile();
|
|||
|
|
vditor.tip.show(window.VditorI18n.recording);
|
|||
|
|
editorElement.setAttribute("contenteditable", "false");
|
|||
|
|
_this.element.children[0].classList.add("vditor-menu--current");
|
|||
|
|
}).catch(function () {
|
|||
|
|
vditor.tip.show(window.VditorI18n["record-tip"]);
|
|||
|
|
});
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (mediaRecorder.isRecording) {
|
|||
|
|
mediaRecorder.stopRecording();
|
|||
|
|
vditor.tip.hide();
|
|||
|
|
var file = new File([mediaRecorder.buildWavFileBlob()], "record".concat((new Date()).getTime(), ".wav"), { type: "video/webm" });
|
|||
|
|
uploadFiles(vditor, [file]);
|
|||
|
|
_this.element.children[0].classList.remove("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.tip.show(window.VditorI18n.recording);
|
|||
|
|
editorElement.setAttribute("contenteditable", "false");
|
|||
|
|
mediaRecorder.startRecordingNewWavFile();
|
|||
|
|
_this.element.children[0].classList.add("vditor-menu--current");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
return Record;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Redo.ts
|
|||
|
|
var Redo_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Redo = /** @class */ (function (_super) {
|
|||
|
|
Redo_extends(Redo, _super);
|
|||
|
|
function Redo(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
disableToolbar({ redo: _this.element }, ["redo"]);
|
|||
|
|
_this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
if (_this.element.firstElementChild.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
vditor.undo.redo(vditor);
|
|||
|
|
});
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
return Redo;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Undo.ts
|
|||
|
|
var Undo_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Undo = /** @class */ (function (_super) {
|
|||
|
|
Undo_extends(Undo, _super);
|
|||
|
|
function Undo(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
disableToolbar({ undo: _this.element }, ["undo"]);
|
|||
|
|
_this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
event.preventDefault();
|
|||
|
|
if (_this.element.firstElementChild.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
vditor.undo.undo(vditor);
|
|||
|
|
});
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
return Undo;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/Upload.ts
|
|||
|
|
var Upload_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Upload_Upload = /** @class */ (function (_super) {
|
|||
|
|
Upload_extends(Upload, _super);
|
|||
|
|
function Upload(vditor, menuItem) {
|
|||
|
|
var _this = _super.call(this, vditor, menuItem) || this;
|
|||
|
|
var inputHTML = '<input type="file"';
|
|||
|
|
if (vditor.options.upload.multiple) {
|
|||
|
|
inputHTML += ' multiple="multiple"';
|
|||
|
|
}
|
|||
|
|
if (vditor.options.upload.accept) {
|
|||
|
|
inputHTML += " accept=\"".concat(vditor.options.upload.accept, "\"");
|
|||
|
|
}
|
|||
|
|
_this.element.children[0].innerHTML = "".concat((menuItem.icon || '<svg><use xlink:href="#vditor-icon-upload"></use></svg>')).concat(inputHTML, ">");
|
|||
|
|
_this._bindEvent(vditor);
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
Upload.prototype._bindEvent = function (vditor) {
|
|||
|
|
var _this = this;
|
|||
|
|
this.element.children[0].addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
if (_this.element.firstElementChild.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED)) {
|
|||
|
|
event.stopPropagation();
|
|||
|
|
event.preventDefault();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
this.element.querySelector("input").addEventListener("change", function (event) {
|
|||
|
|
if (_this.element.firstElementChild.classList.contains(constants/* Constants.CLASS_MENU_DISABLED */.g.CLASS_MENU_DISABLED)) {
|
|||
|
|
event.stopPropagation();
|
|||
|
|
event.preventDefault();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (event.target.files.length === 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
uploadFiles(vditor, event.target.files, event.target);
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
return Upload;
|
|||
|
|
}(MenuItem));
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/toolbar/index.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Toolbar = /** @class */ (function () {
|
|||
|
|
function Toolbar(vditor) {
|
|||
|
|
var _this = this;
|
|||
|
|
var options = vditor.options;
|
|||
|
|
this.elements = {};
|
|||
|
|
this.element = document.createElement("div");
|
|||
|
|
this.element.className = "vditor-toolbar";
|
|||
|
|
options.toolbar.forEach(function (menuItem, i) {
|
|||
|
|
var itemElement = _this.genItem(vditor, menuItem, i);
|
|||
|
|
_this.element.appendChild(itemElement);
|
|||
|
|
if (menuItem.toolbar) {
|
|||
|
|
var panelElement_1 = document.createElement("div");
|
|||
|
|
panelElement_1.className = "vditor-hint vditor-panel--arrow";
|
|||
|
|
panelElement_1.addEventListener((0,compatibility/* getEventName */.Le)(), function (event) {
|
|||
|
|
panelElement_1.style.display = "none";
|
|||
|
|
});
|
|||
|
|
menuItem.toolbar.forEach(function (subMenuItem, subI) {
|
|||
|
|
subMenuItem.level = 2;
|
|||
|
|
panelElement_1.appendChild(_this.genItem(vditor, subMenuItem, i + subI));
|
|||
|
|
});
|
|||
|
|
itemElement.appendChild(panelElement_1);
|
|||
|
|
toggleSubMenu(vditor, panelElement_1, itemElement.children[0], 2);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (vditor.options.toolbarConfig.hide) {
|
|||
|
|
this.element.classList.add("vditor-toolbar--hide");
|
|||
|
|
}
|
|||
|
|
if (vditor.options.toolbarConfig.pin) {
|
|||
|
|
this.element.classList.add("vditor-toolbar--pin");
|
|||
|
|
}
|
|||
|
|
if (vditor.options.counter.enable) {
|
|||
|
|
vditor.counter = new Counter(vditor);
|
|||
|
|
this.element.appendChild(vditor.counter.element);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Toolbar.prototype.updateConfig = function (vditor, options) {
|
|||
|
|
vditor.options.toolbarConfig = Object.assign({
|
|||
|
|
hide: false,
|
|||
|
|
pin: false,
|
|||
|
|
}, options);
|
|||
|
|
if (vditor.options.toolbarConfig.hide) {
|
|||
|
|
this.element.classList.add("vditor-toolbar--hide");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
this.element.classList.remove("vditor-toolbar--hide");
|
|||
|
|
}
|
|||
|
|
if (vditor.options.toolbarConfig.pin) {
|
|||
|
|
this.element.classList.add("vditor-toolbar--pin");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
this.element.classList.remove("vditor-toolbar--pin");
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
Toolbar.prototype.genItem = function (vditor, menuItem, index) {
|
|||
|
|
var menuItemObj;
|
|||
|
|
switch (menuItem.name) {
|
|||
|
|
case "bold":
|
|||
|
|
case "italic":
|
|||
|
|
case "more":
|
|||
|
|
case "strike":
|
|||
|
|
case "line":
|
|||
|
|
case "quote":
|
|||
|
|
case "list":
|
|||
|
|
case "ordered-list":
|
|||
|
|
case "check":
|
|||
|
|
case "code":
|
|||
|
|
case "inline-code":
|
|||
|
|
case "link":
|
|||
|
|
case "table":
|
|||
|
|
menuItemObj = new MenuItem(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "emoji":
|
|||
|
|
menuItemObj = new Emoji(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "headings":
|
|||
|
|
menuItemObj = new Headings(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "|":
|
|||
|
|
menuItemObj = new Divider();
|
|||
|
|
break;
|
|||
|
|
case "br":
|
|||
|
|
menuItemObj = new Br();
|
|||
|
|
break;
|
|||
|
|
case "undo":
|
|||
|
|
menuItemObj = new Undo(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "redo":
|
|||
|
|
menuItemObj = new Redo(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "help":
|
|||
|
|
menuItemObj = new Help(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "both":
|
|||
|
|
menuItemObj = new Both(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "preview":
|
|||
|
|
menuItemObj = new Preview_Preview(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "fullscreen":
|
|||
|
|
menuItemObj = new Fullscreen(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "upload":
|
|||
|
|
menuItemObj = new Upload_Upload(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "record":
|
|||
|
|
menuItemObj = new Record(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "info":
|
|||
|
|
menuItemObj = new Info(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "edit-mode":
|
|||
|
|
menuItemObj = new EditMode(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "devtools":
|
|||
|
|
menuItemObj = new Devtools(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "outdent":
|
|||
|
|
menuItemObj = new Outdent(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "indent":
|
|||
|
|
menuItemObj = new Indent(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "outline":
|
|||
|
|
menuItemObj = new Outline_Outline(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "insert-after":
|
|||
|
|
menuItemObj = new InsertAfter(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "insert-before":
|
|||
|
|
menuItemObj = new InsertBefore(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "code-theme":
|
|||
|
|
menuItemObj = new CodeTheme(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "content-theme":
|
|||
|
|
menuItemObj = new ContentTheme(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
case "export":
|
|||
|
|
menuItemObj = new Export(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
menuItemObj = new Custom(vditor, menuItem);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if (!menuItemObj) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var key = menuItem.name;
|
|||
|
|
if (key === "br" || key === "|") {
|
|||
|
|
key = key + index;
|
|||
|
|
}
|
|||
|
|
this.elements[key] = menuItemObj.element;
|
|||
|
|
return menuItemObj.element;
|
|||
|
|
};
|
|||
|
|
return Toolbar;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./node_modules/.pnpm/diff-match-patch@1.0.5/node_modules/diff-match-patch/index.js
|
|||
|
|
var diff_match_patch = __webpack_require__(173);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/undo/index.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var undo_Undo = /** @class */ (function () {
|
|||
|
|
function Undo() {
|
|||
|
|
this.stackSize = 50;
|
|||
|
|
this.resetStack();
|
|||
|
|
// @ts-ignore
|
|||
|
|
this.dmp = new diff_match_patch();
|
|||
|
|
}
|
|||
|
|
Undo.prototype.clearStack = function (vditor) {
|
|||
|
|
this.resetStack();
|
|||
|
|
this.resetIcon(vditor);
|
|||
|
|
};
|
|||
|
|
Undo.prototype.resetIcon = function (vditor) {
|
|||
|
|
if (!vditor.toolbar) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (this[vditor.currentMode].undoStack.length > 1) {
|
|||
|
|
enableToolbar(vditor.toolbar.elements, ["undo"]);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
disableToolbar(vditor.toolbar.elements, ["undo"]);
|
|||
|
|
}
|
|||
|
|
if (this[vditor.currentMode].redoStack.length !== 0) {
|
|||
|
|
enableToolbar(vditor.toolbar.elements, ["redo"]);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
disableToolbar(vditor.toolbar.elements, ["redo"]);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
Undo.prototype.undo = function (vditor) {
|
|||
|
|
if (vditor[vditor.currentMode].element.getAttribute("contenteditable") === "false") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (this[vditor.currentMode].undoStack.length < 2) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var state = this[vditor.currentMode].undoStack.pop();
|
|||
|
|
if (!state) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
this[vditor.currentMode].redoStack.push(state);
|
|||
|
|
this.renderDiff(state, vditor);
|
|||
|
|
this[vditor.currentMode].hasUndo = true;
|
|||
|
|
// undo 操作后,需要关闭 hint
|
|||
|
|
hidePanel(vditor, ["hint"]);
|
|||
|
|
};
|
|||
|
|
Undo.prototype.redo = function (vditor) {
|
|||
|
|
if (vditor[vditor.currentMode].element.getAttribute("contenteditable") === "false") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var state = this[vditor.currentMode].redoStack.pop();
|
|||
|
|
if (!state) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
this[vditor.currentMode].undoStack.push(state);
|
|||
|
|
this.renderDiff(state, vditor, true);
|
|||
|
|
};
|
|||
|
|
Undo.prototype.recordFirstPosition = function (vditor, event) {
|
|||
|
|
if (getSelection().rangeCount === 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (this[vditor.currentMode].undoStack.length !== 1 || this[vditor.currentMode].undoStack[0].length === 0 ||
|
|||
|
|
this[vditor.currentMode].redoStack.length > 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if ((0,compatibility/* isFirefox */.vU)() && event.key === "Backspace") {
|
|||
|
|
// Firefox 第一次删除无效
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if ((0,compatibility/* isSafari */.G6)()) {
|
|||
|
|
// Safari keydown 在 input 之后,不需要重复记录历史
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var text = this.addCaret(vditor);
|
|||
|
|
if (text.replace("<wbr>", "").replace(" vditor-ir__node--expand", "")
|
|||
|
|
!== this[vditor.currentMode].undoStack[0][0].diffs[0][1].replace("<wbr>", "")) {
|
|||
|
|
// 当还不没有存入 undo 栈时,按下 ctrl 后会覆盖 lastText
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
this[vditor.currentMode].undoStack[0][0].diffs[0][1] = text;
|
|||
|
|
this[vditor.currentMode].lastText = text;
|
|||
|
|
// 不能添加 setSelectionFocus(cloneRange); 否则 windows chrome 首次输入会烂
|
|||
|
|
};
|
|||
|
|
Undo.prototype.addToUndoStack = function (vditor) {
|
|||
|
|
// afterRenderEvent.ts 已经 debounce
|
|||
|
|
var text = this.addCaret(vditor, true);
|
|||
|
|
var diff = this.dmp.diff_main(text, this[vditor.currentMode].lastText, true);
|
|||
|
|
var patchList = this.dmp.patch_make(text, this[vditor.currentMode].lastText, diff);
|
|||
|
|
if (patchList.length === 0 && this[vditor.currentMode].undoStack.length > 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
this[vditor.currentMode].lastText = text;
|
|||
|
|
this[vditor.currentMode].undoStack.push(patchList);
|
|||
|
|
if (this[vditor.currentMode].undoStack.length > this.stackSize) {
|
|||
|
|
this[vditor.currentMode].undoStack.shift();
|
|||
|
|
}
|
|||
|
|
if (this[vditor.currentMode].hasUndo) {
|
|||
|
|
this[vditor.currentMode].redoStack = [];
|
|||
|
|
this[vditor.currentMode].hasUndo = false;
|
|||
|
|
disableToolbar(vditor.toolbar.elements, ["redo"]);
|
|||
|
|
}
|
|||
|
|
if (this[vditor.currentMode].undoStack.length > 1) {
|
|||
|
|
enableToolbar(vditor.toolbar.elements, ["undo"]);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
Undo.prototype.renderDiff = function (state, vditor, isRedo) {
|
|||
|
|
if (isRedo === void 0) { isRedo = false; }
|
|||
|
|
var text;
|
|||
|
|
if (isRedo) {
|
|||
|
|
var redoPatchList = this.dmp.patch_deepCopy(state).reverse();
|
|||
|
|
redoPatchList.forEach(function (patch) {
|
|||
|
|
patch.diffs.forEach(function (diff) {
|
|||
|
|
diff[0] = -diff[0];
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
text = this.dmp.patch_apply(redoPatchList, this[vditor.currentMode].lastText)[0];
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
text = this.dmp.patch_apply(state, this[vditor.currentMode].lastText)[0];
|
|||
|
|
}
|
|||
|
|
this[vditor.currentMode].lastText = text;
|
|||
|
|
vditor[vditor.currentMode].element.innerHTML = text;
|
|||
|
|
if (vditor.currentMode !== "sv") {
|
|||
|
|
vditor[vditor.currentMode].element.querySelectorAll(".vditor-".concat(vditor.currentMode, "__preview"))
|
|||
|
|
.forEach(function (blockElement) {
|
|||
|
|
if (blockElement.parentElement.querySelector(".language-echarts")) {
|
|||
|
|
if (vditor.currentMode === "ir") {
|
|||
|
|
blockElement.parentElement.outerHTML = vditor.lute.SpinVditorIRDOM(blockElement.parentElement.outerHTML);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
blockElement.parentElement.outerHTML = vditor.lute.SpinVditorDOM(blockElement.parentElement.outerHTML);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
vditor[vditor.currentMode].element.querySelectorAll(".vditor-".concat(vditor.currentMode, "__preview[data-render='2']"))
|
|||
|
|
.forEach(function (blockElement) {
|
|||
|
|
processCodeRender(blockElement, vditor);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
if (!vditor[vditor.currentMode].element.querySelector("wbr")) {
|
|||
|
|
// Safari 第一次输入没有光标,需手动定位到结尾
|
|||
|
|
var range = getSelection().getRangeAt(0);
|
|||
|
|
range.setEndBefore(vditor[vditor.currentMode].element);
|
|||
|
|
range.collapse(false);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor[vditor.currentMode].element, vditor[vditor.currentMode].element.ownerDocument.createRange());
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
}
|
|||
|
|
renderToc(vditor);
|
|||
|
|
execAfterRender(vditor, {
|
|||
|
|
enableAddUndoStack: false,
|
|||
|
|
enableHint: false,
|
|||
|
|
enableInput: true,
|
|||
|
|
});
|
|||
|
|
highlightToolbar(vditor);
|
|||
|
|
vditor[vditor.currentMode].element.querySelectorAll(".vditor-".concat(vditor.currentMode, "__preview[data-render='2']"))
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
processCodeRender(item, vditor);
|
|||
|
|
});
|
|||
|
|
if (this[vditor.currentMode].undoStack.length > 1) {
|
|||
|
|
enableToolbar(vditor.toolbar.elements, ["undo"]);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
disableToolbar(vditor.toolbar.elements, ["undo"]);
|
|||
|
|
}
|
|||
|
|
if (this[vditor.currentMode].redoStack.length !== 0) {
|
|||
|
|
enableToolbar(vditor.toolbar.elements, ["redo"]);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
disableToolbar(vditor.toolbar.elements, ["redo"]);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
Undo.prototype.resetStack = function () {
|
|||
|
|
this.ir = {
|
|||
|
|
hasUndo: false,
|
|||
|
|
lastText: "",
|
|||
|
|
redoStack: [],
|
|||
|
|
undoStack: [],
|
|||
|
|
};
|
|||
|
|
this.sv = {
|
|||
|
|
hasUndo: false,
|
|||
|
|
lastText: "",
|
|||
|
|
redoStack: [],
|
|||
|
|
undoStack: [],
|
|||
|
|
};
|
|||
|
|
this.wysiwyg = {
|
|||
|
|
hasUndo: false,
|
|||
|
|
lastText: "",
|
|||
|
|
redoStack: [],
|
|||
|
|
undoStack: [],
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
Undo.prototype.addCaret = function (vditor, setFocus) {
|
|||
|
|
if (setFocus === void 0) { setFocus = false; }
|
|||
|
|
var cloneRange;
|
|||
|
|
if (getSelection().rangeCount !== 0 && !vditor[vditor.currentMode].element.querySelector("wbr")) {
|
|||
|
|
var range = getSelection().getRangeAt(0);
|
|||
|
|
if (vditor[vditor.currentMode].element.contains(range.startContainer)) {
|
|||
|
|
cloneRange = range.cloneRange();
|
|||
|
|
var wbrElement = document.createElement("span");
|
|||
|
|
wbrElement.className = "vditor-wbr";
|
|||
|
|
range.insertNode(wbrElement);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 移除数学公式、echart 渲染 https://github.com/Vanessa219/vditor/issues/1738
|
|||
|
|
var cloneElement = vditor[vditor.currentMode].element.cloneNode(true);
|
|||
|
|
cloneElement.querySelectorAll(".vditor-".concat(vditor.currentMode, "__preview[data-render='1']"))
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
if (!item.firstElementChild) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (item.firstElementChild.classList.contains("language-echarts") ||
|
|||
|
|
item.firstElementChild.classList.contains("language-plantuml") ||
|
|||
|
|
item.firstElementChild.classList.contains("language-mindmap")) {
|
|||
|
|
item.firstElementChild.removeAttribute("_echarts_instance_");
|
|||
|
|
item.firstElementChild.removeAttribute("data-processed");
|
|||
|
|
item.firstElementChild.innerHTML = item.previousElementSibling.firstElementChild.innerHTML;
|
|||
|
|
item.setAttribute("data-render", "2");
|
|||
|
|
}
|
|||
|
|
else if (item.firstElementChild.classList.contains("language-math")) {
|
|||
|
|
item.setAttribute("data-render", "2");
|
|||
|
|
item.firstElementChild.textContent = item.firstElementChild.getAttribute("data-math");
|
|||
|
|
item.firstElementChild.removeAttribute("data-math");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
var text = cloneElement.innerHTML;
|
|||
|
|
vditor[vditor.currentMode].element.querySelectorAll(".vditor-wbr").forEach(function (item) {
|
|||
|
|
item.remove();
|
|||
|
|
// 使用 item.outerHTML = "" 会产生 https://github.com/Vanessa219/vditor/pull/686;
|
|||
|
|
});
|
|||
|
|
if (setFocus && cloneRange) {
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(cloneRange);
|
|||
|
|
}
|
|||
|
|
return text.replace('<span class="vditor-wbr"></span>', "<wbr>");
|
|||
|
|
};
|
|||
|
|
return Undo;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
// EXTERNAL MODULE: ./src/ts/util/merge.ts
|
|||
|
|
var merge = __webpack_require__(673);
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/util/Options.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Options = /** @class */ (function () {
|
|||
|
|
function Options(options) {
|
|||
|
|
this.defaultOptions = {
|
|||
|
|
rtl: false,
|
|||
|
|
after: undefined,
|
|||
|
|
cache: {
|
|||
|
|
enable: true,
|
|||
|
|
},
|
|||
|
|
cdn: constants/* Constants.CDN */.g.CDN,
|
|||
|
|
classes: {
|
|||
|
|
preview: "",
|
|||
|
|
},
|
|||
|
|
comment: {
|
|||
|
|
enable: false,
|
|||
|
|
},
|
|||
|
|
counter: {
|
|||
|
|
enable: false,
|
|||
|
|
type: "markdown",
|
|||
|
|
},
|
|||
|
|
customRenders: [],
|
|||
|
|
debugger: false,
|
|||
|
|
fullscreen: {
|
|||
|
|
index: 90,
|
|||
|
|
},
|
|||
|
|
height: "auto",
|
|||
|
|
hint: {
|
|||
|
|
delay: 200,
|
|||
|
|
emoji: {
|
|||
|
|
"+1": "👍",
|
|||
|
|
"-1": "👎",
|
|||
|
|
"confused": "😕",
|
|||
|
|
"eyes": "👀️",
|
|||
|
|
"heart": "❤️",
|
|||
|
|
"rocket": "🚀️",
|
|||
|
|
"smile": "😄",
|
|||
|
|
"tada": "🎉️",
|
|||
|
|
},
|
|||
|
|
emojiPath: "".concat(constants/* Constants.CDN */.g.CDN, "/dist/images/emoji"),
|
|||
|
|
extend: [],
|
|||
|
|
parse: true,
|
|||
|
|
},
|
|||
|
|
icon: "ant",
|
|||
|
|
lang: "zh_CN",
|
|||
|
|
mode: "ir",
|
|||
|
|
outline: {
|
|||
|
|
enable: false,
|
|||
|
|
position: "left",
|
|||
|
|
},
|
|||
|
|
placeholder: "",
|
|||
|
|
preview: {
|
|||
|
|
actions: ["desktop", "tablet", "mobile", "mp-wechat", "zhihu"],
|
|||
|
|
delay: 1000,
|
|||
|
|
hljs: constants/* Constants.HLJS_OPTIONS */.g.HLJS_OPTIONS,
|
|||
|
|
markdown: constants/* Constants.MARKDOWN_OPTIONS */.g.MARKDOWN_OPTIONS,
|
|||
|
|
math: constants/* Constants.MATH_OPTIONS */.g.MATH_OPTIONS,
|
|||
|
|
maxWidth: 800,
|
|||
|
|
mode: "both",
|
|||
|
|
theme: constants/* Constants.THEME_OPTIONS */.g.THEME_OPTIONS,
|
|||
|
|
render: {
|
|||
|
|
media: {
|
|||
|
|
enable: true,
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
link: {
|
|||
|
|
isOpen: true,
|
|||
|
|
},
|
|||
|
|
image: {
|
|||
|
|
isPreview: true,
|
|||
|
|
},
|
|||
|
|
resize: {
|
|||
|
|
enable: false,
|
|||
|
|
position: "bottom",
|
|||
|
|
},
|
|||
|
|
theme: "classic",
|
|||
|
|
toolbar: [
|
|||
|
|
"emoji",
|
|||
|
|
"headings",
|
|||
|
|
"bold",
|
|||
|
|
"italic",
|
|||
|
|
"strike",
|
|||
|
|
"link",
|
|||
|
|
"|",
|
|||
|
|
"list",
|
|||
|
|
"ordered-list",
|
|||
|
|
"check",
|
|||
|
|
"outdent",
|
|||
|
|
"indent",
|
|||
|
|
"|",
|
|||
|
|
"quote",
|
|||
|
|
"line",
|
|||
|
|
"code",
|
|||
|
|
"inline-code",
|
|||
|
|
"insert-before",
|
|||
|
|
"insert-after",
|
|||
|
|
"|",
|
|||
|
|
"upload",
|
|||
|
|
"record",
|
|||
|
|
"table",
|
|||
|
|
"|",
|
|||
|
|
"undo",
|
|||
|
|
"redo",
|
|||
|
|
"|",
|
|||
|
|
"fullscreen",
|
|||
|
|
"edit-mode",
|
|||
|
|
{
|
|||
|
|
name: "more",
|
|||
|
|
toolbar: [
|
|||
|
|
"both",
|
|||
|
|
"code-theme",
|
|||
|
|
"content-theme",
|
|||
|
|
"export",
|
|||
|
|
"outline",
|
|||
|
|
"preview",
|
|||
|
|
"devtools",
|
|||
|
|
"info",
|
|||
|
|
"help",
|
|||
|
|
],
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
toolbarConfig: {
|
|||
|
|
hide: false,
|
|||
|
|
pin: false,
|
|||
|
|
},
|
|||
|
|
typewriterMode: false,
|
|||
|
|
undoDelay: 800,
|
|||
|
|
upload: {
|
|||
|
|
extraData: {},
|
|||
|
|
fieldName: "file[]",
|
|||
|
|
filename: function (name) { return name.replace(/\W/g, ""); },
|
|||
|
|
linkToImgUrl: "",
|
|||
|
|
max: 10 * 1024 * 1024,
|
|||
|
|
multiple: true,
|
|||
|
|
url: "",
|
|||
|
|
withCredentials: false,
|
|||
|
|
},
|
|||
|
|
value: "",
|
|||
|
|
width: "auto",
|
|||
|
|
};
|
|||
|
|
this.options = options;
|
|||
|
|
}
|
|||
|
|
Options.prototype.merge = function () {
|
|||
|
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|||
|
|
if (this.options) {
|
|||
|
|
if (this.options.toolbar) {
|
|||
|
|
this.options.toolbar = this.mergeToolbar(this.options.toolbar);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
this.options.toolbar = this.mergeToolbar(this.defaultOptions.toolbar);
|
|||
|
|
}
|
|||
|
|
if ((_b = (_a = this.options.preview) === null || _a === void 0 ? void 0 : _a.theme) === null || _b === void 0 ? void 0 : _b.list) {
|
|||
|
|
this.defaultOptions.preview.theme.list = this.options.preview.theme.list;
|
|||
|
|
}
|
|||
|
|
if ((_e = (_d = (_c = this.options.preview) === null || _c === void 0 ? void 0 : _c.render) === null || _d === void 0 ? void 0 : _d.media) === null || _e === void 0 ? void 0 : _e.enable) {
|
|||
|
|
this.defaultOptions.preview.render.media.enable = this.options.preview.render.media.enable;
|
|||
|
|
}
|
|||
|
|
if ((_f = this.options.hint) === null || _f === void 0 ? void 0 : _f.emoji) {
|
|||
|
|
this.defaultOptions.hint.emoji = this.options.hint.emoji;
|
|||
|
|
}
|
|||
|
|
if (this.options.comment) {
|
|||
|
|
this.defaultOptions.comment = this.options.comment;
|
|||
|
|
}
|
|||
|
|
if (this.options.cdn) {
|
|||
|
|
if (!((_h = (_g = this.options.preview) === null || _g === void 0 ? void 0 : _g.theme) === null || _h === void 0 ? void 0 : _h.path)) {
|
|||
|
|
this.defaultOptions.preview.theme.path = "".concat(this.options.cdn, "/dist/css/content-theme");
|
|||
|
|
}
|
|||
|
|
if (!((_j = this.options.hint) === null || _j === void 0 ? void 0 : _j.emojiPath)) {
|
|||
|
|
this.defaultOptions.hint.emojiPath = "".concat(this.options.cdn, "/dist/images/emoji");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var mergedOptions = (0,merge/* merge */.T)(this.defaultOptions, this.options);
|
|||
|
|
if (mergedOptions.cache.enable && !mergedOptions.cache.id) {
|
|||
|
|
throw new Error("need options.cache.id, see https://ld246.com/article/1549638745630#options");
|
|||
|
|
}
|
|||
|
|
return mergedOptions;
|
|||
|
|
};
|
|||
|
|
Options.prototype.mergeToolbar = function (toolbar) {
|
|||
|
|
var _this = this;
|
|||
|
|
var toolbarItem = [
|
|||
|
|
{
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-export"></use></svg>',
|
|||
|
|
name: "export",
|
|||
|
|
tipPosition: "ne",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘E",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-emoji"></use></svg>',
|
|||
|
|
name: "emoji",
|
|||
|
|
tipPosition: "ne",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘H",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-headings"></use></svg>',
|
|||
|
|
name: "headings",
|
|||
|
|
tipPosition: "ne",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘B",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-bold"></use></svg>',
|
|||
|
|
name: "bold",
|
|||
|
|
prefix: "**",
|
|||
|
|
suffix: "**",
|
|||
|
|
tipPosition: "ne",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘I",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-italic"></use></svg>',
|
|||
|
|
name: "italic",
|
|||
|
|
prefix: "*",
|
|||
|
|
suffix: "*",
|
|||
|
|
tipPosition: "ne",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘D",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-strike"></use></svg>',
|
|||
|
|
name: "strike",
|
|||
|
|
prefix: "~~",
|
|||
|
|
suffix: "~~",
|
|||
|
|
tipPosition: "ne",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘K",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-link"></use></svg>',
|
|||
|
|
name: "link",
|
|||
|
|
prefix: "[",
|
|||
|
|
suffix: "](https://)",
|
|||
|
|
tipPosition: "n",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "|",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘L",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-list"></use></svg>',
|
|||
|
|
name: "list",
|
|||
|
|
prefix: "* ",
|
|||
|
|
tipPosition: "n",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘O",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-ordered-list"></use></svg>',
|
|||
|
|
name: "ordered-list",
|
|||
|
|
prefix: "1. ",
|
|||
|
|
tipPosition: "n",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘J",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-check"></use></svg>',
|
|||
|
|
name: "check",
|
|||
|
|
prefix: "* [ ] ",
|
|||
|
|
tipPosition: "n",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⇧⌘I",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-outdent"></use></svg>',
|
|||
|
|
name: "outdent",
|
|||
|
|
tipPosition: "n",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⇧⌘O",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-indent"></use></svg>',
|
|||
|
|
name: "indent",
|
|||
|
|
tipPosition: "n",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "|",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘;",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-quote"></use></svg>',
|
|||
|
|
name: "quote",
|
|||
|
|
prefix: "> ",
|
|||
|
|
tipPosition: "n",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⇧⌘H",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-line"></use></svg>',
|
|||
|
|
name: "line",
|
|||
|
|
prefix: "---",
|
|||
|
|
tipPosition: "n",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘U",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-code"></use></svg>',
|
|||
|
|
name: "code",
|
|||
|
|
prefix: "```",
|
|||
|
|
suffix: "\n```",
|
|||
|
|
tipPosition: "n",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘G",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-inline-code"></use></svg>',
|
|||
|
|
name: "inline-code",
|
|||
|
|
prefix: "`",
|
|||
|
|
suffix: "`",
|
|||
|
|
tipPosition: "n",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⇧⌘B",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-before"></use></svg>',
|
|||
|
|
name: "insert-before",
|
|||
|
|
tipPosition: "n",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⇧⌘E",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-after"></use></svg>',
|
|||
|
|
name: "insert-after",
|
|||
|
|
tipPosition: "n",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "|",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-upload"></use></svg>',
|
|||
|
|
name: "upload",
|
|||
|
|
tipPosition: "n",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-record"></use></svg>',
|
|||
|
|
name: "record",
|
|||
|
|
tipPosition: "n",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘M",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-table"></use></svg>',
|
|||
|
|
name: "table",
|
|||
|
|
prefix: "| col1",
|
|||
|
|
suffix: " | col2 | col3 |\n| --- | --- | --- |\n| | | |\n| | | |",
|
|||
|
|
tipPosition: "n",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "|",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘Z",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-undo"></use></svg>',
|
|||
|
|
name: "undo",
|
|||
|
|
tipPosition: "nw",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘Y",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-redo"></use></svg>',
|
|||
|
|
name: "redo",
|
|||
|
|
tipPosition: "nw",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "|",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-more"></use></svg>',
|
|||
|
|
name: "more",
|
|||
|
|
tipPosition: "e",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘'",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-fullscreen"></use></svg>',
|
|||
|
|
name: "fullscreen",
|
|||
|
|
tipPosition: "nw",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-edit"></use></svg>',
|
|||
|
|
name: "edit-mode",
|
|||
|
|
tipPosition: "nw",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
hotkey: "⌘P",
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-both"></use></svg>',
|
|||
|
|
name: "both",
|
|||
|
|
tipPosition: "nw",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-preview"></use></svg>',
|
|||
|
|
name: "preview",
|
|||
|
|
tipPosition: "nw",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-align-center"></use></svg>',
|
|||
|
|
name: "outline",
|
|||
|
|
tipPosition: "nw",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-theme"></use></svg>',
|
|||
|
|
name: "content-theme",
|
|||
|
|
tipPosition: "nw",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-code-theme"></use></svg>',
|
|||
|
|
name: "code-theme",
|
|||
|
|
tipPosition: "nw",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-bug"></use></svg>',
|
|||
|
|
name: "devtools",
|
|||
|
|
tipPosition: "nw",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-info"></use></svg>',
|
|||
|
|
name: "info",
|
|||
|
|
tipPosition: "nw",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
icon: '<svg><use xlink:href="#vditor-icon-help"></use></svg>',
|
|||
|
|
name: "help",
|
|||
|
|
tipPosition: "nw",
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "br",
|
|||
|
|
},
|
|||
|
|
];
|
|||
|
|
var toolbarResult = [];
|
|||
|
|
toolbar.forEach(function (menuItem) {
|
|||
|
|
var currentMenuItem = menuItem;
|
|||
|
|
toolbarItem.forEach(function (defaultMenuItem) {
|
|||
|
|
if (typeof menuItem === "string" &&
|
|||
|
|
defaultMenuItem.name === menuItem) {
|
|||
|
|
currentMenuItem = defaultMenuItem;
|
|||
|
|
}
|
|||
|
|
if (typeof menuItem === "object" &&
|
|||
|
|
defaultMenuItem.name === menuItem.name) {
|
|||
|
|
currentMenuItem = Object.assign({}, defaultMenuItem, menuItem);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (menuItem.toolbar) {
|
|||
|
|
currentMenuItem.toolbar = _this.mergeToolbar(menuItem.toolbar);
|
|||
|
|
}
|
|||
|
|
toolbarResult.push(currentMenuItem);
|
|||
|
|
});
|
|||
|
|
return toolbarResult;
|
|||
|
|
};
|
|||
|
|
return Options;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/ts/wysiwyg/index.ts
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var WYSIWYG = /** @class */ (function () {
|
|||
|
|
function WYSIWYG(vditor) {
|
|||
|
|
var _this = this;
|
|||
|
|
this.composingLock = false;
|
|||
|
|
this.commentIds = [];
|
|||
|
|
var divElement = document.createElement("div");
|
|||
|
|
divElement.className = "vditor-wysiwyg";
|
|||
|
|
divElement.innerHTML = "<pre class=\"vditor-reset\" placeholder=\"".concat(vditor.options.placeholder, "\"\n contenteditable=\"true\" spellcheck=\"false\"></pre>\n<div class=\"vditor-panel vditor-panel--none\"></div>\n<div class=\"vditor-panel vditor-panel--none\">\n <button type=\"button\" aria-label=\"").concat(window.VditorI18n.comment, "\" class=\"vditor-icon vditor-tooltipped vditor-tooltipped__n\">\n <svg><use xlink:href=\"#vditor-icon-comment\"></use></svg>\n </button>\n</div>");
|
|||
|
|
this.element = divElement.firstElementChild;
|
|||
|
|
this.popover = divElement.firstElementChild.nextElementSibling;
|
|||
|
|
this.selectPopover = divElement.lastElementChild;
|
|||
|
|
this.bindEvent(vditor);
|
|||
|
|
focusEvent(vditor, this.element);
|
|||
|
|
dblclickEvent(vditor, this.element);
|
|||
|
|
blurEvent(vditor, this.element);
|
|||
|
|
hotkeyEvent(vditor, this.element);
|
|||
|
|
selectEvent(vditor, this.element);
|
|||
|
|
dropEvent(vditor, this.element);
|
|||
|
|
copyEvent(vditor, this.element, this.copy);
|
|||
|
|
cutEvent(vditor, this.element, this.copy);
|
|||
|
|
if (vditor.options.comment.enable) {
|
|||
|
|
this.selectPopover.querySelector("button").onclick = function () {
|
|||
|
|
var id = Lute.NewNodeID();
|
|||
|
|
var range = getSelection().getRangeAt(0);
|
|||
|
|
var rangeClone = range.cloneRange();
|
|||
|
|
var contents = range.extractContents();
|
|||
|
|
var blockStartElement;
|
|||
|
|
var blockEndElement;
|
|||
|
|
var removeStart = false;
|
|||
|
|
var removeEnd = false;
|
|||
|
|
contents.childNodes.forEach(function (item, index) {
|
|||
|
|
var wrap = false;
|
|||
|
|
if (item.nodeType === 3) {
|
|||
|
|
wrap = true;
|
|||
|
|
}
|
|||
|
|
else if (!item.classList.contains("vditor-comment")) {
|
|||
|
|
wrap = true;
|
|||
|
|
}
|
|||
|
|
else if (item.classList.contains("vditor-comment")) {
|
|||
|
|
item.setAttribute("data-cmtids", item.getAttribute("data-cmtids") + " " + id);
|
|||
|
|
}
|
|||
|
|
if (wrap) {
|
|||
|
|
if (item.nodeType !== 3 && item.getAttribute("data-block") === "0"
|
|||
|
|
&& index === 0 && rangeClone.startOffset > 0) {
|
|||
|
|
item.innerHTML =
|
|||
|
|
"<span class=\"vditor-comment\" data-cmtids=\"".concat(id, "\">").concat(item.innerHTML, "</span>");
|
|||
|
|
blockStartElement = item;
|
|||
|
|
}
|
|||
|
|
else if (item.nodeType !== 3 && item.getAttribute("data-block") === "0"
|
|||
|
|
&& index === contents.childNodes.length - 1
|
|||
|
|
&& rangeClone.endOffset < rangeClone.endContainer.textContent.length) {
|
|||
|
|
item.innerHTML =
|
|||
|
|
"<span class=\"vditor-comment\" data-cmtids=\"".concat(id, "\">").concat(item.innerHTML, "</span>");
|
|||
|
|
blockEndElement = item;
|
|||
|
|
}
|
|||
|
|
else if (item.nodeType !== 3 && item.getAttribute("data-block") === "0") {
|
|||
|
|
if (index === 0) {
|
|||
|
|
removeStart = true;
|
|||
|
|
}
|
|||
|
|
else if (index === contents.childNodes.length - 1) {
|
|||
|
|
removeEnd = true;
|
|||
|
|
}
|
|||
|
|
item.innerHTML =
|
|||
|
|
"<span class=\"vditor-comment\" data-cmtids=\"".concat(id, "\">").concat(item.innerHTML, "</span>");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var commentElement = document.createElement("span");
|
|||
|
|
commentElement.classList.add("vditor-comment");
|
|||
|
|
commentElement.setAttribute("data-cmtids", id);
|
|||
|
|
item.parentNode.insertBefore(commentElement, item);
|
|||
|
|
commentElement.appendChild(item);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
var startElement = (0,hasClosest/* hasClosestBlock */.F9)(rangeClone.startContainer);
|
|||
|
|
if (startElement) {
|
|||
|
|
if (blockStartElement) {
|
|||
|
|
startElement.insertAdjacentHTML("beforeend", blockStartElement.innerHTML);
|
|||
|
|
blockStartElement.remove();
|
|||
|
|
}
|
|||
|
|
else if (startElement.textContent.trim().replace(constants/* Constants.ZWSP */.g.ZWSP, "") === "" && removeStart) {
|
|||
|
|
startElement.remove();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var endElement = (0,hasClosest/* hasClosestBlock */.F9)(rangeClone.endContainer);
|
|||
|
|
if (endElement) {
|
|||
|
|
if (blockEndElement) {
|
|||
|
|
endElement.insertAdjacentHTML("afterbegin", blockEndElement.innerHTML);
|
|||
|
|
blockEndElement.remove();
|
|||
|
|
}
|
|||
|
|
else if (endElement.textContent.trim().replace(constants/* Constants.ZWSP */.g.ZWSP, "") === "" && removeEnd) {
|
|||
|
|
endElement.remove();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
range.insertNode(contents);
|
|||
|
|
vditor.options.comment.add(id, range.toString(), _this.getComments(vditor, true));
|
|||
|
|
afterRenderEvent(vditor, {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: false,
|
|||
|
|
enableInput: false,
|
|||
|
|
});
|
|||
|
|
_this.hideComment();
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
WYSIWYG.prototype.getComments = function (vditor, getData) {
|
|||
|
|
var _this = this;
|
|||
|
|
if (getData === void 0) { getData = false; }
|
|||
|
|
if (vditor.currentMode === "wysiwyg" && vditor.options.comment.enable) {
|
|||
|
|
this.commentIds = [];
|
|||
|
|
this.element.querySelectorAll(".vditor-comment").forEach(function (item) {
|
|||
|
|
_this.commentIds =
|
|||
|
|
_this.commentIds.concat(item.getAttribute("data-cmtids").split(" "));
|
|||
|
|
});
|
|||
|
|
this.commentIds = Array.from(new Set(this.commentIds));
|
|||
|
|
var comments_1 = [];
|
|||
|
|
if (getData) {
|
|||
|
|
this.commentIds.forEach(function (id) {
|
|||
|
|
comments_1.push({
|
|||
|
|
id: id,
|
|||
|
|
top: _this.element.querySelector(".vditor-comment[data-cmtids=\"".concat(id, "\"]")).offsetTop,
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
return comments_1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
return [];
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
WYSIWYG.prototype.triggerRemoveComment = function (vditor) {
|
|||
|
|
var difference = function (a, b) {
|
|||
|
|
var s = new Set(b);
|
|||
|
|
return a.filter(function (x) { return !s.has(x); });
|
|||
|
|
};
|
|||
|
|
if (vditor.currentMode === "wysiwyg" && vditor.options.comment.enable && vditor.wysiwyg.commentIds.length > 0) {
|
|||
|
|
var oldIds = JSON.parse(JSON.stringify(this.commentIds));
|
|||
|
|
this.getComments(vditor);
|
|||
|
|
var removedIds = difference(oldIds, this.commentIds);
|
|||
|
|
if (removedIds.length > 0) {
|
|||
|
|
vditor.options.comment.remove(removedIds);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
WYSIWYG.prototype.showComment = function () {
|
|||
|
|
var position = (0,selection/* getCursorPosition */.Ny)(this.element);
|
|||
|
|
this.selectPopover.setAttribute("style", "left:".concat(position.left, "px;display:block;top:").concat(Math.max(-8, position.top - 21), "px"));
|
|||
|
|
};
|
|||
|
|
WYSIWYG.prototype.hideComment = function () {
|
|||
|
|
this.selectPopover.setAttribute("style", "display:none");
|
|||
|
|
};
|
|||
|
|
WYSIWYG.prototype.unbindListener = function () {
|
|||
|
|
window.removeEventListener("scroll", this.scrollListener);
|
|||
|
|
};
|
|||
|
|
WYSIWYG.prototype.copy = function (event, vditor) {
|
|||
|
|
var range = getSelection().getRangeAt(0);
|
|||
|
|
if (range.toString() === "") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
event.stopPropagation();
|
|||
|
|
event.preventDefault();
|
|||
|
|
var codeElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(range.startContainer, "CODE");
|
|||
|
|
var codeEndElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(range.endContainer, "CODE");
|
|||
|
|
if (codeElement && codeEndElement && codeEndElement.isSameNode(codeElement)) {
|
|||
|
|
var codeText = "";
|
|||
|
|
if (codeElement.parentElement.tagName === "PRE") {
|
|||
|
|
codeText = range.toString();
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
codeText = "`" + range.toString() + "`";
|
|||
|
|
}
|
|||
|
|
event.clipboardData.setData("text/plain", codeText);
|
|||
|
|
event.clipboardData.setData("text/html", "");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var aElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(range.startContainer, "A");
|
|||
|
|
var aEndElement = (0,hasClosest/* hasClosestByMatchTag */.lG)(range.endContainer, "A");
|
|||
|
|
if (aElement && aEndElement && aEndElement.isSameNode(aElement)) {
|
|||
|
|
var aTitle = aElement.getAttribute("title") || "";
|
|||
|
|
if (aTitle) {
|
|||
|
|
aTitle = " \"".concat(aTitle, "\"");
|
|||
|
|
}
|
|||
|
|
event.clipboardData.setData("text/plain", "[".concat(range.toString(), "](").concat(aElement.getAttribute("href")).concat(aTitle, ")"));
|
|||
|
|
event.clipboardData.setData("text/html", "");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var tempElement = document.createElement("div");
|
|||
|
|
tempElement.appendChild(range.cloneContents());
|
|||
|
|
event.clipboardData.setData("text/plain", vditor.lute.VditorDOM2Md(tempElement.innerHTML).trim());
|
|||
|
|
event.clipboardData.setData("text/html", "");
|
|||
|
|
};
|
|||
|
|
WYSIWYG.prototype.bindEvent = function (vditor) {
|
|||
|
|
var _this = this;
|
|||
|
|
this.unbindListener();
|
|||
|
|
window.addEventListener("scroll", this.scrollListener = function () {
|
|||
|
|
hidePanel(vditor, ["hint"]);
|
|||
|
|
if (_this.popover.style.display !== "block" || _this.selectPopover.style.display !== "block") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var top = parseInt(_this.popover.getAttribute("data-top"), 10);
|
|||
|
|
if (vditor.options.height !== "auto") {
|
|||
|
|
if (vditor.options.toolbarConfig.pin && vditor.toolbar.element.getBoundingClientRect().top === 0) {
|
|||
|
|
var popoverTop = Math.max(window.scrollY - vditor.element.offsetTop - 8, Math.min(top - vditor.wysiwyg.element.scrollTop, _this.element.clientHeight - 21)) + "px";
|
|||
|
|
if (_this.popover.style.display === "block") {
|
|||
|
|
_this.popover.style.top = popoverTop;
|
|||
|
|
}
|
|||
|
|
if (_this.selectPopover.style.display === "block") {
|
|||
|
|
_this.selectPopover.style.top = popoverTop;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
else if (!vditor.options.toolbarConfig.pin) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var popoverTop1 = Math.max(top, (window.scrollY - vditor.element.offsetTop - 8)) + "px";
|
|||
|
|
if (_this.popover.style.display === "block") {
|
|||
|
|
_this.popover.style.top = popoverTop1;
|
|||
|
|
}
|
|||
|
|
if (_this.selectPopover.style.display === "block") {
|
|||
|
|
_this.selectPopover.style.top = popoverTop1;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("scroll", function () {
|
|||
|
|
hidePanel(vditor, ["hint"]);
|
|||
|
|
if (vditor.options.comment && vditor.options.comment.enable && vditor.options.comment.scroll) {
|
|||
|
|
vditor.options.comment.scroll(vditor.wysiwyg.element.scrollTop);
|
|||
|
|
}
|
|||
|
|
if (_this.popover.style.display !== "block") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var top = parseInt(_this.popover.getAttribute("data-top"), 10) - vditor.wysiwyg.element.scrollTop;
|
|||
|
|
var max = -8;
|
|||
|
|
if (vditor.options.toolbarConfig.pin && vditor.toolbar.element.getBoundingClientRect().top === 0) {
|
|||
|
|
max = window.scrollY - vditor.element.offsetTop + max;
|
|||
|
|
}
|
|||
|
|
var topPx = Math.max(max, Math.min(top, _this.element.clientHeight - 21)) + "px";
|
|||
|
|
_this.popover.style.top = topPx;
|
|||
|
|
_this.selectPopover.style.top = topPx;
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("paste", function (event) {
|
|||
|
|
paste(vditor, event, {
|
|||
|
|
pasteCode: function (code) {
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
var node = document.createElement("template");
|
|||
|
|
node.innerHTML = code;
|
|||
|
|
range.insertNode(node.content.cloneNode(true));
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestByAttribute */.a1)(range.startContainer, "data-block", "0");
|
|||
|
|
if (blockElement) {
|
|||
|
|
blockElement.outerHTML = vditor.lute.SpinVditorDOM(blockElement.outerHTML);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
vditor.wysiwyg.element.innerHTML = vditor.lute.SpinVditorDOM(vditor.wysiwyg.element.innerHTML);
|
|||
|
|
}
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(vditor.wysiwyg.element, range);
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
// 中文处理
|
|||
|
|
this.element.addEventListener("compositionstart", function () {
|
|||
|
|
_this.composingLock = true;
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("compositionend", function (event) {
|
|||
|
|
var headingElement = (0,hasClosestByHeadings/* hasClosestByHeadings */.W)(getSelection().getRangeAt(0).startContainer);
|
|||
|
|
if (headingElement && headingElement.textContent === "") {
|
|||
|
|
// heading 为空删除 https://github.com/Vanessa219/vditor/issues/150
|
|||
|
|
renderToc(vditor);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (!(0,compatibility/* isFirefox */.vU)()) {
|
|||
|
|
input_input(vditor, getSelection().getRangeAt(0).cloneRange(), event);
|
|||
|
|
}
|
|||
|
|
_this.composingLock = false;
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("input", function (event) {
|
|||
|
|
if (event.inputType === "deleteByDrag" || event.inputType === "insertFromDrop") {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/801 编辑器内容拖拽问题
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (_this.preventInput) {
|
|||
|
|
_this.preventInput = false;
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (_this.composingLock || event.data === "‘" || event.data === "“" || event.data === "《") {
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var range = getSelection().getRangeAt(0);
|
|||
|
|
var blockElement = (0,hasClosest/* hasClosestBlock */.F9)(range.startContainer);
|
|||
|
|
if (!blockElement) {
|
|||
|
|
// 没有被块元素包裹
|
|||
|
|
modifyPre(vditor, range);
|
|||
|
|
blockElement = (0,hasClosest/* hasClosestBlock */.F9)(range.startContainer);
|
|||
|
|
}
|
|||
|
|
if (!blockElement) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// 前后空格处理
|
|||
|
|
var startOffset = (0,selection/* getSelectPosition */.im)(blockElement, vditor.wysiwyg.element, range).start;
|
|||
|
|
// 开始可以输入空格
|
|||
|
|
var startSpace = true;
|
|||
|
|
for (var i = startOffset - 1; i > blockElement.textContent.substr(0, startOffset).lastIndexOf("\n"); i--) {
|
|||
|
|
if (blockElement.textContent.charAt(i) !== " " &&
|
|||
|
|
// 多个 tab 前删除不形成代码块 https://github.com/Vanessa219/vditor/issues/162 1
|
|||
|
|
blockElement.textContent.charAt(i) !== "\t") {
|
|||
|
|
startSpace = false;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (startOffset === 0) {
|
|||
|
|
startSpace = false;
|
|||
|
|
}
|
|||
|
|
// 结尾可以输入空格
|
|||
|
|
var endSpace = true;
|
|||
|
|
for (var i = startOffset - 1; i < blockElement.textContent.length; i++) {
|
|||
|
|
if (blockElement.textContent.charAt(i) !== " " && blockElement.textContent.charAt(i) !== "\n") {
|
|||
|
|
endSpace = false;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/729
|
|||
|
|
if (endSpace && /^#{1,6} $/.test(blockElement.textContent)) {
|
|||
|
|
endSpace = false;
|
|||
|
|
}
|
|||
|
|
var headingElement = (0,hasClosestByHeadings/* hasClosestByHeadings */.W)(getSelection().getRangeAt(0).startContainer);
|
|||
|
|
if (headingElement && headingElement.textContent === "") {
|
|||
|
|
// heading 为空删除 https://github.com/Vanessa219/vditor/issues/150
|
|||
|
|
renderToc(vditor);
|
|||
|
|
headingElement.remove();
|
|||
|
|
}
|
|||
|
|
if ((startSpace && blockElement.getAttribute("data-type") !== "code-block")
|
|||
|
|
|| endSpace || isHeadingMD(blockElement.innerHTML) ||
|
|||
|
|
(isHrMD(blockElement.innerHTML) && blockElement.previousElementSibling)) {
|
|||
|
|
if (typeof vditor.options.input === "function") {
|
|||
|
|
vditor.options.input(getMarkdown(vditor));
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/1565
|
|||
|
|
if (event.inputType === "insertParagraph" && _this.element.innerHTML === '<p><br></p><p><br></p>') {
|
|||
|
|
blockElement.previousElementSibling.remove();
|
|||
|
|
}
|
|||
|
|
input_input(vditor, range, event);
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("click", function (event) {
|
|||
|
|
if (event.target.tagName === "INPUT") {
|
|||
|
|
var checkElement = event.target;
|
|||
|
|
if (checkElement.checked) {
|
|||
|
|
checkElement.setAttribute("checked", "checked");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
checkElement.removeAttribute("checked");
|
|||
|
|
}
|
|||
|
|
_this.preventInput = true;
|
|||
|
|
if (getSelection().rangeCount > 0) {
|
|||
|
|
(0,selection/* setSelectionFocus */.Hc)(getSelection().getRangeAt(0));
|
|||
|
|
}
|
|||
|
|
afterRenderEvent(vditor);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (event.target.tagName === "IMG" &&
|
|||
|
|
// plantuml 图片渲染不进行提示
|
|||
|
|
!event.target.parentElement.classList.contains("vditor-wysiwyg__preview")) {
|
|||
|
|
if (event.target.getAttribute("data-type") === "link-ref") {
|
|||
|
|
genLinkRefPopover(vditor, event.target);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
genImagePopover(event, vditor);
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// 打开链接
|
|||
|
|
var a = (0,hasClosest/* hasClosestByMatchTag */.lG)(event.target, "A");
|
|||
|
|
if (a) {
|
|||
|
|
if (vditor.options.link.click) {
|
|||
|
|
vditor.options.link.click(a);
|
|||
|
|
}
|
|||
|
|
else if (vditor.options.link.isOpen) {
|
|||
|
|
window.open(a.getAttribute("href"));
|
|||
|
|
}
|
|||
|
|
event.preventDefault();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
if (event.target.isEqualNode(_this.element) && _this.element.lastElementChild && range.collapsed) {
|
|||
|
|
var lastRect = _this.element.lastElementChild.getBoundingClientRect();
|
|||
|
|
if (event.y > lastRect.top + lastRect.height) {
|
|||
|
|
if (_this.element.lastElementChild.tagName === "P" &&
|
|||
|
|
_this.element.lastElementChild.textContent.trim().replace(constants/* Constants.ZWSP */.g.ZWSP, "") === "") {
|
|||
|
|
range.selectNodeContents(_this.element.lastElementChild);
|
|||
|
|
range.collapse(false);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
_this.element.insertAdjacentHTML("beforeend", "<p data-block=\"0\">".concat(constants/* Constants.ZWSP */.g.ZWSP, "<wbr></p>"));
|
|||
|
|
(0,selection/* setRangeByWbr */.ib)(_this.element, range);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
highlightToolbarWYSIWYG(vditor);
|
|||
|
|
// 点击后光标落于预览区,需展开代码块
|
|||
|
|
var previewElement = (0,hasClosest/* hasClosestByClassName */.fb)(event.target, "vditor-wysiwyg__preview");
|
|||
|
|
if (!previewElement) {
|
|||
|
|
previewElement =
|
|||
|
|
(0,hasClosest/* hasClosestByClassName */.fb)((0,selection/* getEditorRange */.zh)(vditor).startContainer, "vditor-wysiwyg__preview");
|
|||
|
|
}
|
|||
|
|
if (previewElement) {
|
|||
|
|
showCode(previewElement, vditor);
|
|||
|
|
}
|
|||
|
|
clickToc(event, vditor);
|
|||
|
|
});
|
|||
|
|
this.element.addEventListener("keyup", function (event) {
|
|||
|
|
if (event.isComposing || (0,compatibility/* isCtrl */.yl)(event)) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// 除 md 处理、cell 内换行、table 添加新行/列、代码块语言切换、block render 换行、跳出/逐层跳出 blockquote、h6 换行、
|
|||
|
|
// 任务列表换行、软换行外需在换行时调整文档位置
|
|||
|
|
if (event.key === "Enter") {
|
|||
|
|
scrollCenter(vditor);
|
|||
|
|
}
|
|||
|
|
if ((event.key === "Backspace" || event.key === "Delete") &&
|
|||
|
|
vditor.wysiwyg.element.innerHTML !== "" && vditor.wysiwyg.element.childNodes.length === 1 &&
|
|||
|
|
vditor.wysiwyg.element.firstElementChild && vditor.wysiwyg.element.firstElementChild.tagName === "P"
|
|||
|
|
&& vditor.wysiwyg.element.firstElementChild.childElementCount === 0
|
|||
|
|
&& (vditor.wysiwyg.element.textContent === "" || vditor.wysiwyg.element.textContent === "\n")) {
|
|||
|
|
// 为空时显示 placeholder
|
|||
|
|
vditor.wysiwyg.element.innerHTML = "";
|
|||
|
|
}
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(vditor);
|
|||
|
|
if (event.key === "Backspace") {
|
|||
|
|
// firefox headings https://github.com/Vanessa219/vditor/issues/211
|
|||
|
|
if ((0,compatibility/* isFirefox */.vU)() && range.startContainer.textContent === "\n" && range.startOffset === 1) {
|
|||
|
|
range.startContainer.textContent = "";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 没有被块元素包裹
|
|||
|
|
modifyPre(vditor, range);
|
|||
|
|
highlightToolbarWYSIWYG(vditor);
|
|||
|
|
if (event.key !== "ArrowDown" && event.key !== "ArrowRight" && event.key !== "Backspace"
|
|||
|
|
&& event.key !== "ArrowLeft" && event.key !== "ArrowUp") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (event.key === "ArrowLeft" || event.key === "ArrowRight") {
|
|||
|
|
vditor.hint.render(vditor);
|
|||
|
|
}
|
|||
|
|
// 上下左右,删除遇到块预览的处理
|
|||
|
|
var previewElement = (0,hasClosest/* hasClosestByClassName */.fb)(range.startContainer, "vditor-wysiwyg__preview");
|
|||
|
|
if (!previewElement && range.startContainer.nodeType !== 3 && range.startOffset > 0) {
|
|||
|
|
// table 前删除遇到代码块
|
|||
|
|
var blockRenderElement = range.startContainer;
|
|||
|
|
if (blockRenderElement.classList.contains("vditor-wysiwyg__block")) {
|
|||
|
|
previewElement = blockRenderElement.lastElementChild;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (!previewElement) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var previousElement = previewElement.previousElementSibling;
|
|||
|
|
if (previousElement.style.display === "none") {
|
|||
|
|
if (event.key === "ArrowDown" || event.key === "ArrowRight") {
|
|||
|
|
showCode(previewElement, vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
showCode(previewElement, vditor, false);
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var codeElement = previewElement.previousElementSibling;
|
|||
|
|
if (codeElement.tagName === "PRE") {
|
|||
|
|
codeElement = codeElement.firstElementChild;
|
|||
|
|
}
|
|||
|
|
if (event.key === "ArrowDown" || event.key === "ArrowRight") {
|
|||
|
|
var blockRenderElement = previewElement.parentElement;
|
|||
|
|
var nextNode = getRenderElementNextNode(blockRenderElement);
|
|||
|
|
if (nextNode && nextNode.nodeType !== 3) {
|
|||
|
|
// 下一节点依旧为代码渲染块
|
|||
|
|
var nextRenderElement = nextNode.querySelector(".vditor-wysiwyg__preview");
|
|||
|
|
if (nextRenderElement) {
|
|||
|
|
showCode(nextRenderElement, vditor);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 跳过渲染块,光标移动到下一个节点
|
|||
|
|
if (nextNode.nodeType === 3) {
|
|||
|
|
// inline
|
|||
|
|
while (nextNode.textContent.length === 0 && nextNode.nextSibling) {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/100 2
|
|||
|
|
nextNode = nextNode.nextSibling;
|
|||
|
|
}
|
|||
|
|
range.setStart(nextNode, 1);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
// block
|
|||
|
|
range.setStart(nextNode.firstChild, 0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
range.selectNodeContents(codeElement);
|
|||
|
|
range.collapse(false);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
return WYSIWYG;
|
|||
|
|
}());
|
|||
|
|
|
|||
|
|
|
|||
|
|
;// CONCATENATED MODULE: ./src/index.ts
|
|||
|
|
var src_extends = (undefined && undefined.__extends) || (function () {
|
|||
|
|
var extendStatics = function (d, b) {
|
|||
|
|
extendStatics = Object.setPrototypeOf ||
|
|||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|||
|
|
return extendStatics(d, b);
|
|||
|
|
};
|
|||
|
|
return function (d, b) {
|
|||
|
|
if (typeof b !== "function" && b !== null)
|
|||
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|||
|
|
extendStatics(d, b);
|
|||
|
|
function __() { this.constructor = d; }
|
|||
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|||
|
|
};
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
var Vditor = /** @class */ (function (_super) {
|
|||
|
|
src_extends(Vditor, _super);
|
|||
|
|
/**
|
|||
|
|
* @param id 要挂载 Vditor 的元素或者元素 ID。
|
|||
|
|
* @param options Vditor 参数
|
|||
|
|
*/
|
|||
|
|
function Vditor(id, options) {
|
|||
|
|
var _this = _super.call(this) || this;
|
|||
|
|
_this.isDestroyed = false;
|
|||
|
|
_this.version = constants/* VDITOR_VERSION */.H;
|
|||
|
|
if (typeof id === "string") {
|
|||
|
|
if (!options) {
|
|||
|
|
options = {
|
|||
|
|
cache: {
|
|||
|
|
id: "vditor".concat(id),
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
else if (!options.cache) {
|
|||
|
|
options.cache = { id: "vditor".concat(id) };
|
|||
|
|
}
|
|||
|
|
else if (!options.cache.id) {
|
|||
|
|
options.cache.id = "vditor".concat(id);
|
|||
|
|
}
|
|||
|
|
if (!document.getElementById(id)) {
|
|||
|
|
_this.showErrorTip("Failed to get element by id: ".concat(id));
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
id = document.getElementById(id);
|
|||
|
|
}
|
|||
|
|
var getOptions = new Options(options);
|
|||
|
|
var mergedOptions = getOptions.merge();
|
|||
|
|
// 支持自定义国际化
|
|||
|
|
if (!mergedOptions.i18n) {
|
|||
|
|
if (!["de_DE", "en_US", "es_ES", "fr_FR", "ja_JP", "ko_KR", "pt_BR", "ru_RU", "sv_SE", "vi_VN", "zh_CN", "zh_TW"].includes(mergedOptions.lang)) {
|
|||
|
|
throw new Error("options.lang error, see https://ld246.com/article/1549638745630#options");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
var i18nScriptPrefix = "vditorI18nScript";
|
|||
|
|
var i18nScriptID_1 = i18nScriptPrefix + mergedOptions.lang;
|
|||
|
|
document.querySelectorAll("head script[id^=\"".concat(i18nScriptPrefix, "\"]")).forEach(function (el) {
|
|||
|
|
if (el.id !== i18nScriptID_1) {
|
|||
|
|
document.head.removeChild(el);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
(0,addScript/* addScript */.G)("".concat(mergedOptions.cdn, "/dist/js/i18n/").concat(mergedOptions.lang, ".js"), i18nScriptID_1).then(function () {
|
|||
|
|
_this.init(id, mergedOptions);
|
|||
|
|
}).catch(function (error) {
|
|||
|
|
_this.showErrorTip("GET ".concat(mergedOptions.cdn, "/dist/js/i18n/").concat(mergedOptions.lang, ".js net::ERR_ABORTED 404 (Not Found)"));
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
window.VditorI18n = mergedOptions.i18n;
|
|||
|
|
_this.init(id, mergedOptions);
|
|||
|
|
}
|
|||
|
|
return _this;
|
|||
|
|
}
|
|||
|
|
Vditor.prototype.showErrorTip = function (error) {
|
|||
|
|
var tip = new Tip();
|
|||
|
|
document.body.appendChild(tip.element);
|
|||
|
|
tip.show(error, 0);
|
|||
|
|
};
|
|||
|
|
Vditor.prototype.updateToolbarConfig = function (options) {
|
|||
|
|
this.vditor.toolbar.updateConfig(this.vditor, options);
|
|||
|
|
};
|
|||
|
|
/** 设置主题 */
|
|||
|
|
Vditor.prototype.setTheme = function (theme, contentTheme, codeTheme, contentThemePath) {
|
|||
|
|
this.vditor.options.theme = theme;
|
|||
|
|
setTheme(this.vditor);
|
|||
|
|
if (contentTheme) {
|
|||
|
|
this.vditor.options.preview.theme.current = contentTheme;
|
|||
|
|
(0,setContentTheme/* setContentTheme */.Z)(contentTheme, contentThemePath || this.vditor.options.preview.theme.path);
|
|||
|
|
}
|
|||
|
|
if (codeTheme) {
|
|||
|
|
this.vditor.options.preview.hljs.style = codeTheme;
|
|||
|
|
(0,setCodeTheme/* setCodeTheme */.Y)(codeTheme, this.vditor.options.cdn);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
/** 获取 Markdown 内容 */
|
|||
|
|
Vditor.prototype.getValue = function () {
|
|||
|
|
return getMarkdown(this.vditor);
|
|||
|
|
};
|
|||
|
|
/** 获取编辑器当前编辑模式 */
|
|||
|
|
Vditor.prototype.getCurrentMode = function () {
|
|||
|
|
return this.vditor.currentMode;
|
|||
|
|
};
|
|||
|
|
/** 聚焦到编辑器 */
|
|||
|
|
Vditor.prototype.focus = function () {
|
|||
|
|
if (this.vditor.currentMode === "sv") {
|
|||
|
|
this.vditor.sv.element.focus();
|
|||
|
|
}
|
|||
|
|
else if (this.vditor.currentMode === "wysiwyg") {
|
|||
|
|
this.vditor.wysiwyg.element.focus();
|
|||
|
|
}
|
|||
|
|
else if (this.vditor.currentMode === "ir") {
|
|||
|
|
this.vditor.ir.element.focus();
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
/** 让编辑器失焦 */
|
|||
|
|
Vditor.prototype.blur = function () {
|
|||
|
|
if (this.vditor.currentMode === "sv") {
|
|||
|
|
this.vditor.sv.element.blur();
|
|||
|
|
}
|
|||
|
|
else if (this.vditor.currentMode === "wysiwyg") {
|
|||
|
|
this.vditor.wysiwyg.element.blur();
|
|||
|
|
}
|
|||
|
|
else if (this.vditor.currentMode === "ir") {
|
|||
|
|
this.vditor.ir.element.blur();
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
/** 禁用编辑器 */
|
|||
|
|
Vditor.prototype.disabled = function () {
|
|||
|
|
hidePanel(this.vditor, ["subToolbar", "hint", "popover"]);
|
|||
|
|
disableToolbar(this.vditor.toolbar.elements, constants/* Constants.EDIT_TOOLBARS.concat */.g.EDIT_TOOLBARS.concat(["undo", "redo", "fullscreen", "edit-mode"]));
|
|||
|
|
this.vditor[this.vditor.currentMode].element.setAttribute("contenteditable", "false");
|
|||
|
|
};
|
|||
|
|
/** 解除编辑器禁用 */
|
|||
|
|
Vditor.prototype.enable = function () {
|
|||
|
|
enableToolbar(this.vditor.toolbar.elements, constants/* Constants.EDIT_TOOLBARS.concat */.g.EDIT_TOOLBARS.concat(["undo", "redo", "fullscreen", "edit-mode"]));
|
|||
|
|
this.vditor.undo.resetIcon(this.vditor);
|
|||
|
|
this.vditor[this.vditor.currentMode].element.setAttribute("contenteditable", "true");
|
|||
|
|
};
|
|||
|
|
/** 返回选中的字符串 */
|
|||
|
|
Vditor.prototype.getSelection = function () {
|
|||
|
|
if (this.vditor.currentMode === "wysiwyg") {
|
|||
|
|
return getSelectText(this.vditor.wysiwyg.element);
|
|||
|
|
}
|
|||
|
|
else if (this.vditor.currentMode === "sv") {
|
|||
|
|
return getSelectText(this.vditor.sv.element);
|
|||
|
|
}
|
|||
|
|
else if (this.vditor.currentMode === "ir") {
|
|||
|
|
return getSelectText(this.vditor.ir.element);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
/** 设置预览区域内容 */
|
|||
|
|
Vditor.prototype.renderPreview = function (value) {
|
|||
|
|
this.vditor.preview.render(this.vditor, value);
|
|||
|
|
};
|
|||
|
|
/** 获取焦点位置 */
|
|||
|
|
Vditor.prototype.getCursorPosition = function () {
|
|||
|
|
return (0,selection/* getCursorPosition */.Ny)(this.vditor[this.vditor.currentMode].element);
|
|||
|
|
};
|
|||
|
|
/** 上传是否还在进行中 */
|
|||
|
|
Vditor.prototype.isUploading = function () {
|
|||
|
|
return this.vditor.upload.isUploading;
|
|||
|
|
};
|
|||
|
|
/** 清除缓存 */
|
|||
|
|
Vditor.prototype.clearCache = function () {
|
|||
|
|
if (this.vditor.options.cache.enable && (0,compatibility/* accessLocalStorage */.pK)()) {
|
|||
|
|
localStorage.removeItem(this.vditor.options.cache.id);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
/** 禁用缓存 */
|
|||
|
|
Vditor.prototype.disabledCache = function () {
|
|||
|
|
this.vditor.options.cache.enable = false;
|
|||
|
|
};
|
|||
|
|
/** 启用缓存 */
|
|||
|
|
Vditor.prototype.enableCache = function () {
|
|||
|
|
if (!this.vditor.options.cache.id) {
|
|||
|
|
throw new Error("need options.cache.id, see https://ld246.com/article/1549638745630#options");
|
|||
|
|
}
|
|||
|
|
this.vditor.options.cache.enable = true;
|
|||
|
|
};
|
|||
|
|
/** HTML 转 md */
|
|||
|
|
Vditor.prototype.html2md = function (value) {
|
|||
|
|
return this.vditor.lute.HTML2Md(value);
|
|||
|
|
};
|
|||
|
|
/** markdown 转 JSON 输出 */
|
|||
|
|
Vditor.prototype.exportJSON = function (value) {
|
|||
|
|
return this.vditor.lute.RenderJSON(value);
|
|||
|
|
};
|
|||
|
|
/** 获取 HTML */
|
|||
|
|
Vditor.prototype.getHTML = function () {
|
|||
|
|
return getHTML(this.vditor);
|
|||
|
|
};
|
|||
|
|
/** 消息提示。time 为 0 将一直显示 */
|
|||
|
|
Vditor.prototype.tip = function (text, time) {
|
|||
|
|
this.vditor.tip.show(text, time);
|
|||
|
|
};
|
|||
|
|
/** 设置预览模式 */
|
|||
|
|
Vditor.prototype.setPreviewMode = function (mode) {
|
|||
|
|
setPreviewMode(mode, this.vditor);
|
|||
|
|
};
|
|||
|
|
/** 删除选中内容 */
|
|||
|
|
Vditor.prototype.deleteValue = function () {
|
|||
|
|
if (window.getSelection().isCollapsed) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
document.execCommand("delete", false);
|
|||
|
|
};
|
|||
|
|
/** 更新选中内容 */
|
|||
|
|
Vditor.prototype.updateValue = function (value) {
|
|||
|
|
document.execCommand("insertHTML", false, value);
|
|||
|
|
};
|
|||
|
|
/** 在焦点处插入内容,并默认进行 Markdown 渲染 */
|
|||
|
|
Vditor.prototype.insertValue = function (value, render) {
|
|||
|
|
if (render === void 0) { render = true; }
|
|||
|
|
var range = (0,selection/* getEditorRange */.zh)(this.vditor);
|
|||
|
|
range.collapse(true);
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/716
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/917
|
|||
|
|
var tmpElement = document.createElement("template");
|
|||
|
|
tmpElement.innerHTML = value;
|
|||
|
|
range.insertNode(tmpElement.content.cloneNode(true));
|
|||
|
|
range.collapse(false);
|
|||
|
|
if (this.vditor.currentMode === "sv") {
|
|||
|
|
this.vditor.sv.preventInput = true;
|
|||
|
|
if (render) {
|
|||
|
|
inputEvent(this.vditor);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (this.vditor.currentMode === "wysiwyg") {
|
|||
|
|
// 由于 https://github.com/Vanessa219/vditor/issues/1566 不能使用 this.vditor.wysiwyg.preventInput = true;
|
|||
|
|
if (render) {
|
|||
|
|
input_input(this.vditor, getSelection().getRangeAt(0));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (this.vditor.currentMode === "ir") {
|
|||
|
|
this.vditor.ir.preventInput = true;
|
|||
|
|
if (render) {
|
|||
|
|
input(this.vditor, getSelection().getRangeAt(0), true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
/** 在焦点处插入 Markdown */
|
|||
|
|
Vditor.prototype.insertMD = function (md) {
|
|||
|
|
// https://github.com/Vanessa219/vditor/issues/1640
|
|||
|
|
if (this.vditor.currentMode === "ir") {
|
|||
|
|
(0,selection/* insertHTML */.oC)(this.vditor.lute.Md2VditorIRDOM(md), this.vditor);
|
|||
|
|
}
|
|||
|
|
else if (this.vditor.currentMode === "wysiwyg") {
|
|||
|
|
(0,selection/* insertHTML */.oC)(this.vditor.lute.Md2VditorDOM(md), this.vditor);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
processPaste(this.vditor, md);
|
|||
|
|
}
|
|||
|
|
this.vditor.outline.render(this.vditor);
|
|||
|
|
execAfterRender(this.vditor);
|
|||
|
|
};
|
|||
|
|
/** 设置编辑器内容 */
|
|||
|
|
Vditor.prototype.setValue = function (markdown, clearStack) {
|
|||
|
|
var _this = this;
|
|||
|
|
if (clearStack === void 0) { clearStack = false; }
|
|||
|
|
if (this.vditor.currentMode === "sv") {
|
|||
|
|
this.vditor.sv.element.innerHTML = "<div data-block='0'>".concat(this.vditor.lute.SpinVditorSVDOM(markdown), "</div>");
|
|||
|
|
processAfterRender(this.vditor, {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: false,
|
|||
|
|
enableInput: false,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
else if (this.vditor.currentMode === "wysiwyg") {
|
|||
|
|
renderDomByMd(this.vditor, markdown, {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: false,
|
|||
|
|
enableInput: false,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
this.vditor.ir.element.innerHTML = this.vditor.lute.Md2VditorIRDOM(markdown);
|
|||
|
|
this.vditor.ir.element
|
|||
|
|
.querySelectorAll(".vditor-ir__preview[data-render='2']")
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
processCodeRender(item, _this.vditor);
|
|||
|
|
});
|
|||
|
|
process_processAfterRender(this.vditor, {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: false,
|
|||
|
|
enableInput: false,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
this.vditor.outline.render(this.vditor);
|
|||
|
|
if (!markdown) {
|
|||
|
|
hidePanel(this.vditor, ["emoji", "headings", "submenu", "hint"]);
|
|||
|
|
if (this.vditor.wysiwyg.popover) {
|
|||
|
|
this.vditor.wysiwyg.popover.style.display = "none";
|
|||
|
|
}
|
|||
|
|
this.clearCache();
|
|||
|
|
}
|
|||
|
|
if (clearStack) {
|
|||
|
|
this.clearStack();
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
/** 空块 */
|
|||
|
|
Vditor.prototype.insertEmptyBlock = function (position) {
|
|||
|
|
insertEmptyBlock(this.vditor, position);
|
|||
|
|
};
|
|||
|
|
/** 清空 undo & redo 栈 */
|
|||
|
|
Vditor.prototype.clearStack = function () {
|
|||
|
|
this.vditor.undo.clearStack(this.vditor);
|
|||
|
|
this.vditor.undo.addToUndoStack(this.vditor);
|
|||
|
|
};
|
|||
|
|
/** 销毁编辑器 */
|
|||
|
|
Vditor.prototype.destroy = function () {
|
|||
|
|
this.vditor.element.innerHTML = this.vditor.originalInnerHTML;
|
|||
|
|
this.vditor.element.classList.remove("vditor");
|
|||
|
|
this.vditor.element.removeAttribute("style");
|
|||
|
|
var iconScript = document.getElementById("vditorIconScript");
|
|||
|
|
if (iconScript) {
|
|||
|
|
iconScript.remove();
|
|||
|
|
}
|
|||
|
|
this.clearCache();
|
|||
|
|
UIUnbindListener();
|
|||
|
|
this.vditor.wysiwyg.unbindListener();
|
|||
|
|
this.vditor.options.after = undefined;
|
|||
|
|
this.isDestroyed = true;
|
|||
|
|
};
|
|||
|
|
/** 获取评论 ID */
|
|||
|
|
Vditor.prototype.getCommentIds = function () {
|
|||
|
|
if (this.vditor.currentMode !== "wysiwyg") {
|
|||
|
|
return [];
|
|||
|
|
}
|
|||
|
|
return this.vditor.wysiwyg.getComments(this.vditor, true);
|
|||
|
|
};
|
|||
|
|
/** 高亮评论 */
|
|||
|
|
Vditor.prototype.hlCommentIds = function (ids) {
|
|||
|
|
if (this.vditor.currentMode !== "wysiwyg") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var hlItem = function (item) {
|
|||
|
|
item.classList.remove("vditor-comment--hover");
|
|||
|
|
ids.forEach(function (id) {
|
|||
|
|
if (item.getAttribute("data-cmtids").indexOf(id) > -1) {
|
|||
|
|
item.classList.add("vditor-comment--hover");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
this.vditor.wysiwyg.element
|
|||
|
|
.querySelectorAll(".vditor-comment")
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
hlItem(item);
|
|||
|
|
});
|
|||
|
|
if (this.vditor.preview.element.style.display !== "none") {
|
|||
|
|
this.vditor.preview.element
|
|||
|
|
.querySelectorAll(".vditor-comment")
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
hlItem(item);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
/** 取消评论高亮 */
|
|||
|
|
Vditor.prototype.unHlCommentIds = function (ids) {
|
|||
|
|
if (this.vditor.currentMode !== "wysiwyg") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var unHlItem = function (item) {
|
|||
|
|
ids.forEach(function (id) {
|
|||
|
|
if (item.getAttribute("data-cmtids").indexOf(id) > -1) {
|
|||
|
|
item.classList.remove("vditor-comment--hover");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
this.vditor.wysiwyg.element
|
|||
|
|
.querySelectorAll(".vditor-comment")
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
unHlItem(item);
|
|||
|
|
});
|
|||
|
|
if (this.vditor.preview.element.style.display !== "none") {
|
|||
|
|
this.vditor.preview.element
|
|||
|
|
.querySelectorAll(".vditor-comment")
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
unHlItem(item);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
/** 删除评论 */
|
|||
|
|
Vditor.prototype.removeCommentIds = function (removeIds) {
|
|||
|
|
var _this = this;
|
|||
|
|
if (this.vditor.currentMode !== "wysiwyg") {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var removeItem = function (item, removeId) {
|
|||
|
|
var ids = item.getAttribute("data-cmtids").split(" ");
|
|||
|
|
ids.find(function (id, index) {
|
|||
|
|
if (id === removeId) {
|
|||
|
|
ids.splice(index, 1);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (ids.length === 0) {
|
|||
|
|
item.outerHTML = item.innerHTML;
|
|||
|
|
(0,selection/* getEditorRange */.zh)(_this.vditor).collapse(true);
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
item.setAttribute("data-cmtids", ids.join(" "));
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
removeIds.forEach(function (removeId) {
|
|||
|
|
_this.vditor.wysiwyg.element
|
|||
|
|
.querySelectorAll(".vditor-comment")
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
removeItem(item, removeId);
|
|||
|
|
});
|
|||
|
|
if (_this.vditor.preview.element.style.display !== "none") {
|
|||
|
|
_this.vditor.preview.element
|
|||
|
|
.querySelectorAll(".vditor-comment")
|
|||
|
|
.forEach(function (item) {
|
|||
|
|
removeItem(item, removeId);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
afterRenderEvent(this.vditor, {
|
|||
|
|
enableAddUndoStack: true,
|
|||
|
|
enableHint: false,
|
|||
|
|
enableInput: false,
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
Vditor.prototype.init = function (id, mergedOptions) {
|
|||
|
|
var _this = this;
|
|||
|
|
if (this.isDestroyed) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
this.vditor = {
|
|||
|
|
currentMode: mergedOptions.mode,
|
|||
|
|
element: id,
|
|||
|
|
hint: new Hint(mergedOptions.hint.extend),
|
|||
|
|
lute: undefined,
|
|||
|
|
options: mergedOptions,
|
|||
|
|
originalInnerHTML: id.innerHTML,
|
|||
|
|
outline: new Outline(window.VditorI18n.outline),
|
|||
|
|
tip: new Tip(),
|
|||
|
|
};
|
|||
|
|
this.vditor.sv = new Editor(this.vditor);
|
|||
|
|
this.vditor.undo = new undo_Undo();
|
|||
|
|
this.vditor.wysiwyg = new WYSIWYG(this.vditor);
|
|||
|
|
this.vditor.ir = new IR(this.vditor);
|
|||
|
|
this.vditor.toolbar = new Toolbar(this.vditor);
|
|||
|
|
if (mergedOptions.resize.enable) {
|
|||
|
|
this.vditor.resize = new Resize(this.vditor);
|
|||
|
|
}
|
|||
|
|
if (this.vditor.toolbar.elements.devtools) {
|
|||
|
|
this.vditor.devtools = new DevTools();
|
|||
|
|
}
|
|||
|
|
if (mergedOptions.upload.url || mergedOptions.upload.handler) {
|
|||
|
|
this.vditor.upload = new Upload();
|
|||
|
|
}
|
|||
|
|
(0,addScript/* addScript */.G)(mergedOptions._lutePath ||
|
|||
|
|
"".concat(mergedOptions.cdn, "/dist/js/lute/lute.min.js"), "vditorLuteScript").then(function () {
|
|||
|
|
_this.vditor.lute = (0,setLute/* setLute */.X)({
|
|||
|
|
autoSpace: _this.vditor.options.preview.markdown.autoSpace,
|
|||
|
|
gfmAutoLink: _this.vditor.options.preview.markdown.gfmAutoLink,
|
|||
|
|
codeBlockPreview: _this.vditor.options.preview.markdown
|
|||
|
|
.codeBlockPreview,
|
|||
|
|
emojiSite: _this.vditor.options.hint.emojiPath,
|
|||
|
|
emojis: _this.vditor.options.hint.emoji,
|
|||
|
|
fixTermTypo: _this.vditor.options.preview.markdown.fixTermTypo,
|
|||
|
|
footnotes: _this.vditor.options.preview.markdown.footnotes,
|
|||
|
|
headingAnchor: false,
|
|||
|
|
inlineMathDigit: _this.vditor.options.preview.math.inlineDigit,
|
|||
|
|
linkBase: _this.vditor.options.preview.markdown.linkBase,
|
|||
|
|
linkPrefix: _this.vditor.options.preview.markdown.linkPrefix,
|
|||
|
|
listStyle: _this.vditor.options.preview.markdown.listStyle,
|
|||
|
|
mark: _this.vditor.options.preview.markdown.mark,
|
|||
|
|
mathBlockPreview: _this.vditor.options.preview.markdown
|
|||
|
|
.mathBlockPreview,
|
|||
|
|
paragraphBeginningSpace: _this.vditor.options.preview.markdown
|
|||
|
|
.paragraphBeginningSpace,
|
|||
|
|
sanitize: _this.vditor.options.preview.markdown.sanitize,
|
|||
|
|
toc: _this.vditor.options.preview.markdown.toc,
|
|||
|
|
});
|
|||
|
|
_this.vditor.preview = new Preview(_this.vditor);
|
|||
|
|
initUI(_this.vditor);
|
|||
|
|
if (mergedOptions.after) {
|
|||
|
|
mergedOptions.after();
|
|||
|
|
}
|
|||
|
|
if (mergedOptions.icon) {
|
|||
|
|
// 防止初始化 2 个编辑器时加载 2 次
|
|||
|
|
(0,addScript/* addScriptSync */.J)("".concat(mergedOptions.cdn, "/dist/js/icons/").concat(mergedOptions.icon, ".js"), "vditorIconScript");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
return Vditor;
|
|||
|
|
}(method["default"]));
|
|||
|
|
/* harmony default export */ const src = (Vditor);
|
|||
|
|
|
|||
|
|
})();
|
|||
|
|
|
|||
|
|
__webpack_exports__ = __webpack_exports__["default"];
|
|||
|
|
/******/ return __webpack_exports__;
|
|||
|
|
/******/ })()
|
|||
|
|
;
|
|||
|
|
});
|