MindMap/frontend/node_modules/vditor/dist/index.js

15995 lines
685 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*!
* 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, '&amp;').replace(pattern_lt, '&lt;').replace(pattern_gt, '&gt;').replace(pattern_para, '&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 &nbsp;").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;
}
};
// MacWindows 快捷键展示
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, "&amp;").replace(/</g, "&lt;"), "<wbr></code></pre></div>");
}
return "\n```\n" + code.replace(/&/g, "&amp;").replace(/</g, "&lt;") + "\n```";
}
else {
if (type === "wysiwyg") {
return "<code>".concat(code.replace(/&/g, "&amp;").replace(/</g, "&lt;"), "</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 则解析 blockquoteblockquote 中有列表则解析列表
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 ? " &lt;".concat((0,compatibility/* updateHotkeyTip */.ns)(menuItem.hotkey), "&gt;") : "";
}
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, " &lt;").concat((0,compatibility/* updateHotkeyTip */.ns)("⌥⌘7"), "></button>\n<button data-mode=\"ir\">").concat(window.VditorI18n.instantRendering, " &lt;").concat((0,compatibility/* updateHotkeyTip */.ns)("⌥⌘8"), "></button>\n<button data-mode=\"sv\">").concat(window.VditorI18n.splitView, " &lt;").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>&lt;audio controls=\"controls\" src=\"".concat(path, "\"&gt;&lt;/audio&gt;</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(filename, "](").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 strongs。以防止多个相同元素在一起时不满足 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(/&amp;/g, "&").replace(/<(|\/)(html|body|meta)[^>]*?>/ig, "").trim() ===
"<a href=\"".concat(textPlain, "\">").concat(textPlain, "</a>") ||
textHTML.replace(/&amp;/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, "&amp;").replace(/</g, "&lt;"));
}
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(file_1.name, "](").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)("&lt;⌥⌘1>"), "</button>\n<button data-tag=\"h2\" data-value=\"## \">").concat(window.VditorI18n.heading2, " &lt;").concat((0,compatibility/* updateHotkeyTip */.ns)("⌥⌘2"), "></button>\n<button data-tag=\"h3\" data-value=\"### \">").concat(window.VditorI18n.heading3, " &lt;").concat((0,compatibility/* updateHotkeyTip */.ns)("⌥⌘3"), "></button>\n<button data-tag=\"h4\" data-value=\"#### \">").concat(window.VditorI18n.heading4, " &lt;").concat((0,compatibility/* updateHotkeyTip */.ns)("⌥⌘4"), "></button>\n<button data-tag=\"h5\" data-value=\"##### \">").concat(window.VditorI18n.heading5, " &lt;").concat((0,compatibility/* updateHotkeyTip */.ns)("⌥⌘5"), "></button>\n<button data-tag=\"h6\" data-value=\"###### \">").concat(window.VditorI18n.heading6, " &lt;").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>&nbsp;&nbsp;</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__;
/******/ })()
;
});