diff --git a/frontend/src/components/wiki-markdown-viewer.js b/frontend/src/components/wiki-markdown-viewer.js index 1dfca1aa27..a6bf1b8948 100644 --- a/frontend/src/components/wiki-markdown-viewer.js +++ b/frontend/src/components/wiki-markdown-viewer.js @@ -127,21 +127,25 @@ class WikiMarkdownViewer extends React.Component { changeInlineNode = (item) => { if (item.object == 'inline') { - let url; + let url, imagePath; // change image url if (item.type == 'image' && isPublicWiki) { url = item.data.src; const re = new RegExp(serviceURL + '/lib/' + repoID +'/file.*raw=1'); // different repo - if (!re.test(url)) { + if (re.test(url)) { + // get image path + let index = url.indexOf('/file'); + let index2 = url.indexOf('?'); + imagePath = url.substring(index + 5, index2); + } else if (/^\.\.\/*/.test(url) || /^\.\/*/.test(url)) { + const path = this.props.path; + const originalPath = path.slice(0, path.lastIndexOf('/')) + '/' + url; + imagePath = Utils.pathNormalize(originalPath); + } else { return; } - // get image path - let index = url.indexOf('/file'); - let index2 = url.indexOf('?'); - const imagePath = url.substring(index + 5, index2); - // replace url item.data.src = serviceURL + '/view-image-via-public-wiki/?slug=' + slug + '&path=' + imagePath; } diff --git a/frontend/src/pages/wiki/main-panel.js b/frontend/src/pages/wiki/main-panel.js index ab9c2127c8..d53a83c9db 100644 --- a/frontend/src/pages/wiki/main-panel.js +++ b/frontend/src/pages/wiki/main-panel.js @@ -116,6 +116,7 @@ class MainPanel extends Component { latestContributor={this.props.latestContributor} onLinkClick={this.props.onLinkClick} isWiki={true} + path={this.props.path} /> )} {(!this.props.isDataLoading && !this.props.isViewFile) && ( diff --git a/frontend/src/utils/utils.js b/frontend/src/utils/utils.js index 9a80b81266..04479817e3 100644 --- a/frontend/src/utils/utils.js +++ b/frontend/src/utils/utils.js @@ -880,6 +880,21 @@ export const Utils = { return password; }, + pathNormalize: function(originalPath) { + let oldPath = originalPath.split('/'); + let newPath = []; + for (let i = 0; i < oldPath.length; i++) { + if (oldPath[i] === '.' || oldPath[i] === '') { + continue; + } else if (oldPath[i] === '..') { + newPath.pop(); + } else { + newPath.push(oldPath[i]); + } + } + return newPath.join('/'); + }, + getEventData: function(event, data) { if (event.target.dataset) { return event.target.dataset[data];