155 lines
33 KiB
JavaScript
155 lines
33 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var obsidian = require('obsidian');
|
||
|
|
||
|
/*! *****************************************************************************
|
||
|
Copyright (c) Microsoft Corporation.
|
||
|
|
||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||
|
purpose with or without fee is hereby granted.
|
||
|
|
||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||
|
PERFORMANCE OF THIS SOFTWARE.
|
||
|
***************************************************************************** */
|
||
|
/* global Reflect, Promise */
|
||
|
|
||
|
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);
|
||
|
};
|
||
|
|
||
|
function __extends(d, b) {
|
||
|
extendStatics(d, b);
|
||
|
function __() { this.constructor = d; }
|
||
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
|
}
|
||
|
|
||
|
var WikilinksToMdlinks = /** @class */ (function (_super) {
|
||
|
__extends(WikilinksToMdlinks, _super);
|
||
|
function WikilinksToMdlinks() {
|
||
|
return _super !== null && _super.apply(this, arguments) || this;
|
||
|
}
|
||
|
WikilinksToMdlinks.prototype.onload = function () {
|
||
|
var _this = this;
|
||
|
console.log('loading wikilinks-to-mdlinks plugin...');
|
||
|
this.addCommand({
|
||
|
id: "toggle-wiki-md-links",
|
||
|
name: "Toggle selected wikilink to markdown link and vice versa",
|
||
|
checkCallback: function (checking) {
|
||
|
var currentView = _this.app.workspace.getActiveLeafOfViewType(obsidian.MarkdownView);
|
||
|
if ((currentView == null) || (currentView.getMode() !== 'source')) {
|
||
|
return false;
|
||
|
}
|
||
|
if (!checking) {
|
||
|
_this.toggleLink();
|
||
|
}
|
||
|
return true;
|
||
|
},
|
||
|
hotkeys: [{
|
||
|
modifiers: ["Mod", "Shift"],
|
||
|
key: "L"
|
||
|
}]
|
||
|
});
|
||
|
};
|
||
|
WikilinksToMdlinks.prototype.onunload = function () {
|
||
|
console.log('unloading wikilinks-to-mdlinks plugin');
|
||
|
};
|
||
|
WikilinksToMdlinks.prototype.toggleLink = function () {
|
||
|
var currentView = this.app.workspace.getActiveLeafOfViewType(obsidian.MarkdownView);
|
||
|
var editor = currentView.sourceMode.cmEditor;
|
||
|
var cursor = editor.getCursor();
|
||
|
var line = editor.getDoc().getLine(cursor.line);
|
||
|
var regexHasExtension = /^([^\\]*)\.(\w+)$/;
|
||
|
var regexWiki = /\[\[([^\]]+)\]\]/;
|
||
|
var regexParenthesis = /\((.*?)\)/;
|
||
|
var regexWikiGlobal = /\[\[([^\]]*)\]\]/g;
|
||
|
var regexMdGlobal = /\[([^\]]*)\]\(([^\(]*)\)/g;
|
||
|
var wikiMatches = line.match(regexWikiGlobal);
|
||
|
var mdMatches = line.match(regexMdGlobal);
|
||
|
var ifFoundMatch = false;
|
||
|
// If there are wikiMatches find if the cursor is inside the selected text
|
||
|
var i = 0;
|
||
|
if (wikiMatches) {
|
||
|
for (var _i = 0, wikiMatches_1 = wikiMatches; _i < wikiMatches_1.length; _i++) {
|
||
|
var item = wikiMatches_1[_i];
|
||
|
var temp = line.slice(i, line.length);
|
||
|
var index = i + temp.indexOf(item);
|
||
|
var indexEnd = index + item.length;
|
||
|
i = indexEnd;
|
||
|
if ((cursor.ch >= index) && (cursor.ch <= indexEnd)) {
|
||
|
ifFoundMatch = true;
|
||
|
var text = item.match(regexWiki)[1];
|
||
|
// Check if it is a markdown file
|
||
|
var matches = text.match(regexHasExtension);
|
||
|
var newText = text;
|
||
|
if (matches) {
|
||
|
var filename = matches[1];
|
||
|
var extension = matches[2];
|
||
|
}
|
||
|
else {
|
||
|
newText = newText + ".md";
|
||
|
}
|
||
|
var encodedText = encodeURI(newText);
|
||
|
var newItem = "[" + text + "](" + encodedText + ")";
|
||
|
var cursorStart = {
|
||
|
line: cursor.line,
|
||
|
ch: index
|
||
|
};
|
||
|
var cursorEnd = {
|
||
|
line: cursor.line,
|
||
|
ch: indexEnd
|
||
|
};
|
||
|
editor.replaceRange(newItem, cursorStart, cursorEnd);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
i = 0;
|
||
|
if (ifFoundMatch == false) {
|
||
|
if (mdMatches) {
|
||
|
for (var _a = 0, mdMatches_1 = mdMatches; _a < mdMatches_1.length; _a++) {
|
||
|
var item = mdMatches_1[_a];
|
||
|
var temp = line.slice(i, line.length);
|
||
|
var index = i + temp.indexOf(item);
|
||
|
var indexEnd = index + item.length;
|
||
|
i = indexEnd;
|
||
|
if ((cursor.ch >= index) && (cursor.ch <= indexEnd)) {
|
||
|
ifFoundMatch = true;
|
||
|
var text = item.match(regexParenthesis)[1];
|
||
|
text = decodeURI(text);
|
||
|
// Check if it is a markdown file
|
||
|
var matches = text.match(regexHasExtension);
|
||
|
if (matches) {
|
||
|
var filename = matches[1];
|
||
|
var extension = matches[2];
|
||
|
if (extension == 'md') {
|
||
|
text = filename;
|
||
|
}
|
||
|
}
|
||
|
var newItem = "[[" + text + "]]";
|
||
|
var cursorStart = {
|
||
|
line: cursor.line,
|
||
|
ch: index
|
||
|
};
|
||
|
var cursorEnd = {
|
||
|
line: cursor.line,
|
||
|
ch: indexEnd
|
||
|
};
|
||
|
editor.replaceRange(newItem, cursorStart, cursorEnd);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
return WikilinksToMdlinks;
|
||
|
}(obsidian.Plugin));
|
||
|
|
||
|
module.exports = WikilinksToMdlinks;
|
||
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmF
|