支持笔记之间双链
This commit is contained in:
parent
31bec53520
commit
13b9528840
@ -22,6 +22,8 @@ import networkSvc from '../services/networkSvc';
|
|||||||
import tempFileSvc from '../services/tempFileSvc';
|
import tempFileSvc from '../services/tempFileSvc';
|
||||||
import store from '../store';
|
import store from '../store';
|
||||||
import './common/vueGlobals';
|
import './common/vueGlobals';
|
||||||
|
import utils from '../services/utils';
|
||||||
|
import providerRegistry from '../services/providers/common/providerRegistry';
|
||||||
|
|
||||||
const themeClasses = {
|
const themeClasses = {
|
||||||
light: ['app--light'],
|
light: ['app--light'],
|
||||||
@ -49,8 +51,40 @@ export default {
|
|||||||
close() {
|
close() {
|
||||||
tempFileSvc.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() {
|
async created() {
|
||||||
|
window.viewFileByPath = this.viewFileByPath;
|
||||||
try {
|
try {
|
||||||
await syncSvc.init();
|
await syncSvc.init();
|
||||||
await networkSvc.init();
|
await networkSvc.init();
|
||||||
|
@ -216,6 +216,15 @@ const editorSvc = Object.assign(new Vue(), editorSvcDiscussions, editorSvcUtils,
|
|||||||
...imgs,
|
...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
|
// Create TOC section element
|
||||||
sectionTocElt = document.createElement('div');
|
sectionTocElt = document.createElement('div');
|
||||||
sectionTocElt.className = 'cl-toc-section';
|
sectionTocElt.className = 'cl-toc-section';
|
||||||
|
@ -320,4 +320,12 @@ export default new Provider({
|
|||||||
});
|
});
|
||||||
return Provider.parseContent(data, contentId);
|
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);
|
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);
|
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);
|
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) {
|
encodeUrlPath(path) {
|
||||||
return path ? path.split('/').map(encodeURIComponent).join('/') : '';
|
return path ? path.split('/').map(encodeURIComponent).join('/') : '';
|
||||||
},
|
},
|
||||||
|
decodeUrlPath(path) {
|
||||||
|
return path ? path.split('/').map(decodeURIComponent).join('/') : '';
|
||||||
|
},
|
||||||
parseGithubRepoUrl(url) {
|
parseGithubRepoUrl(url) {
|
||||||
const parsedRepo = url && url.match(/([^/:]+)\/([^/]+?)(?:\.git|\/)?$/);
|
const parsedRepo = url && url.match(/([^/:]+)\/([^/]+?)(?:\.git|\/)?$/);
|
||||||
return parsedRepo && {
|
return parsedRepo && {
|
||||||
@ -414,4 +417,22 @@ export default {
|
|||||||
}
|
}
|
||||||
return (path.indexOf('/') === 0 ? path : `/${path}`).replaceAll(' ', '%20');
|
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