支持笔记之间双链
This commit is contained in:
parent
31bec53520
commit
13b9528840
@ -22,6 +22,8 @@ import networkSvc from '../services/networkSvc';
|
||||
import tempFileSvc from '../services/tempFileSvc';
|
||||
import store from '../store';
|
||||
import './common/vueGlobals';
|
||||
import utils from '../services/utils';
|
||||
import providerRegistry from '../services/providers/common/providerRegistry';
|
||||
|
||||
const themeClasses = {
|
||||
light: ['app--light'],
|
||||
@ -49,8 +51,40 @@ export default {
|
||||
close() {
|
||||
tempFileSvc.close();
|
||||
},
|
||||
// 通过路径查看文件 支持相对路径
|
||||
viewFileByPath(path) {
|
||||
// 如果是md结尾
|
||||
if (!path) {
|
||||
return;
|
||||
}
|
||||
const currDirNode = store.getters['explorer/selectedNodeFolder'];
|
||||
if (path.slice(-3) === '.md') {
|
||||
const rootNode = store.getters['explorer/rootNode'];
|
||||
const node = utils.findNodeByPath(rootNode, currDirNode, path);
|
||||
if (!node) {
|
||||
return;
|
||||
}
|
||||
store.commit('explorer/setSelectedId', node.item.id);
|
||||
// Prevent from freezing the UI while loading the file
|
||||
setTimeout(() => {
|
||||
store.commit('file/setCurrentId', node.item.id);
|
||||
}, 10);
|
||||
} else {
|
||||
const workspace = store.getters['workspace/currentWorkspace'];
|
||||
const provider = providerRegistry.providersById[workspace.providerId];
|
||||
if (provider == null) {
|
||||
return;
|
||||
}
|
||||
const absolutePath = utils.getAbsoluteFilePath(currDirNode, path);
|
||||
const url = provider.getFilePathUrl(absolutePath);
|
||||
if (url) {
|
||||
window.open(url, '_blank');
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
async created() {
|
||||
window.viewFileByPath = this.viewFileByPath;
|
||||
try {
|
||||
await syncSvc.init();
|
||||
await networkSvc.init();
|
||||
|
@ -216,6 +216,15 @@ const editorSvc = Object.assign(new Vue(), editorSvcDiscussions, editorSvcUtils,
|
||||
...imgs,
|
||||
];
|
||||
|
||||
Array.prototype.slice.call(sectionPreviewElt.getElementsByTagName('a')).forEach((aElt) => {
|
||||
const url = aElt.attributes.href.nodeValue;
|
||||
if (url.indexOf('http://') >= 0 || url.indexOf('https://') >= 0) {
|
||||
return;
|
||||
}
|
||||
aElt.href = 'javascript:void(0);'; // eslint-disable-line no-script-url
|
||||
aElt.setAttribute('onclick', `window.viewFileByPath('${utils.decodeUrlPath(url)}')`);
|
||||
});
|
||||
|
||||
// Create TOC section element
|
||||
sectionTocElt = document.createElement('div');
|
||||
sectionTocElt.className = 'cl-toc-section';
|
||||
|
@ -320,4 +320,12 @@ export default new Provider({
|
||||
});
|
||||
return Provider.parseContent(data, contentId);
|
||||
},
|
||||
getFilePathUrl(path) {
|
||||
const token = this.getToken();
|
||||
if (!token) {
|
||||
return null;
|
||||
}
|
||||
const workspace = store.getters['workspace/currentWorkspace'];
|
||||
return `${token.serverUrl}/${workspace.owner}/${workspace.repo}/src/branch/${workspace.branch}${path}`;
|
||||
},
|
||||
});
|
||||
|
@ -282,4 +282,11 @@ export default new Provider({
|
||||
});
|
||||
return Provider.parseContent(data, contentId);
|
||||
},
|
||||
getFilePathUrl(path) {
|
||||
const token = this.getToken();
|
||||
if (!token) {
|
||||
return null;
|
||||
}
|
||||
return `https://gitee.com/${token.name}/${appDataRepo}/blob/${appDataBranch}${path}`;
|
||||
},
|
||||
});
|
||||
|
@ -308,4 +308,8 @@ export default new Provider({
|
||||
});
|
||||
return Provider.parseContent(data, contentId);
|
||||
},
|
||||
getFilePathUrl(path) {
|
||||
const workspace = store.getters['workspace/currentWorkspace'];
|
||||
return `https://gitee.com/${workspace.owner}/${workspace.repo}/blob/${workspace.branch}${path}`;
|
||||
},
|
||||
});
|
||||
|
@ -306,4 +306,8 @@ export default new Provider({
|
||||
});
|
||||
return Provider.parseContent(data, contentId);
|
||||
},
|
||||
getFilePathUrl(path) {
|
||||
const workspace = store.getters['workspace/currentWorkspace'];
|
||||
return `https://github.com/${workspace.owner}/${workspace.repo}/blob/${workspace.branch}${path}`;
|
||||
},
|
||||
});
|
||||
|
@ -306,6 +306,9 @@ export default {
|
||||
encodeUrlPath(path) {
|
||||
return path ? path.split('/').map(encodeURIComponent).join('/') : '';
|
||||
},
|
||||
decodeUrlPath(path) {
|
||||
return path ? path.split('/').map(decodeURIComponent).join('/') : '';
|
||||
},
|
||||
parseGithubRepoUrl(url) {
|
||||
const parsedRepo = url && url.match(/([^/:]+)\/([^/]+?)(?:\.git|\/)?$/);
|
||||
return parsedRepo && {
|
||||
@ -414,4 +417,22 @@ export default {
|
||||
}
|
||||
return (path.indexOf('/') === 0 ? path : `/${path}`).replaceAll(' ', '%20');
|
||||
},
|
||||
findNodeByPath(rootNode, currDirNode, filePath) {
|
||||
// 先获取绝对路径
|
||||
const path = this.getAbsoluteFilePath(currDirNode, filePath).replaceAll('%20', ' ');
|
||||
const pathArr = path.split('/');
|
||||
let node = rootNode;
|
||||
for (let i = 0; i < pathArr.length; i += 1) {
|
||||
if (i > 0) {
|
||||
if (i === pathArr.length - 1) {
|
||||
return node.files.find(it => `${it.item.name}.md` === pathArr[i]);
|
||||
}
|
||||
node = node.folders.find(it => it.item.name === pathArr[i]);
|
||||
if (!node) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
},
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user