diff --git a/templates/repo/view_file.tmpl b/templates/repo/view_file.tmpl index 91ec9b0bb..72446c3fe 100755 --- a/templates/repo/view_file.tmpl +++ b/templates/repo/view_file.tmpl @@ -133,16 +133,79 @@ function submitDeleteForm() { $("#delete-file-form").submit() } } + + +const baseUrls = {}; +const justDomain = /^[^:]+:\/*[^/]*$/; +const protocol = /^([^:]+:)[\s\S]*$/; +const domain = /^([^:]+:\/*[^/]*)[\s\S]*$/; +const originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i; +function rtrim(str, c, invert) { + const l = str.length; + if (l === 0) { + return ''; + } + let suffLen = 0; + while (suffLen < l) { + const currChar = str.charAt(l - suffLen - 1); + if (currChar === c && !invert) { + suffLen++; + } else if (currChar !== c && invert) { + suffLen++; + } else { + break; + } + } + + return str.slice(0, l - suffLen); +} +function resolveUrl(base, href) { + if (!baseUrls[' ' + base]) { + if (justDomain.test(base)) { + baseUrls[' ' + base] = base + '/'; + } else { + baseUrls[' ' + base] = rtrim(base, '/', true); + } + } + base = baseUrls[' ' + base]; + const relativeBase = base.indexOf(':') === -1; + + if (href.substring(0, 2) === '//') { + if (relativeBase) { + return href; + } + return base.replace(protocol, '$1') + href; + } else if (href.charAt(0) === '/') { + if (relativeBase) { + return href; + } + return base.replace(domain, '$1') + href; + } else { + return base + href; + } +} function showNoteBook(){ - var isNoteBook = {{.IsNoteBook}} + var isNoteBook = {{.IsNoteBook}}; if (isNoteBook) { - var jsonStr = "{{.FileContent}}" + var jsonStr = "{{.FileContent}}"; + var baseUrl={{.FileParentURL}}; nb.markdown.setOptions({ - baseUrl: {{.FileParentURL}} + baseUrl: baseUrl }); var notebook = nb.parse(JSON.parse(jsonStr)); var rendered = notebook.render(); $("#notebook").append(rendered); + + $("#notebook img").each(function(){ + + var oldSrc = $(this).attr('src'); + if (!originIndependentUrl.test(oldSrc)){ + var newSrc=resolveUrl(baseUrl,oldSrc); + $(this).attr('src', newSrc); + + } + + }); Prism.highlightAll(); } }