Relative path link with ':ignore' dosen't work
Bug Report
As far as I know, there are no same issues on here, no same questions on StackOverflow. Sorry if already exist same one.
Steps to reproduce
- File tree will be like this:
docs/
|- index.html
|- page/
|- any_doc.md
|- any_file.pdf
- Add a docsify config to
index.html:
relativePath: true
- Write
any_doc.md:
[Click to view PDF](./any_file.pdf ':ignore')
- Execute docsify:
docsify serve docs/
-
Make any PDF file as
docs/page/any_file.pdf -
Access to
http://localhost:3000/#/page/any_doc
What is current behaviour
The link follows http://localhost:3000/#/page/./any_file.pdf
It looks ':ignore' (no compile option) and relative path resolving are not works.
What is the expected behaviour
The link follows http://localhost:3000/page/any_file.pdf
Other relevant information
-
[x] Bug does still occur when all/other plugins are disabled?
-
Your OS: Linux Mint 20.3 Uma
-
Node.js version: 16.16.0
-
npm/yarn version: 9.1.2
-
Browser version: Brave 1.45.127 Chromium: 107.0.5304.110(Official Build)
-
Docsify version: 4.13.0
-
Docsify plugins: none (running in default)
Please create a reproducible sandbox
Mention the docsify version in which this bug was not present (if any)
Supplement
I tried specifying absolute path like this:
[Click to view PDF](/page/any_file.pdf ':ignore')
It works on local environment. But on GitHub pages, not works.
On local environment:
follows: http://localhost:3000/page/any_file.pdf
On GitHub pages (github.io):
follows: https://{user_name}.github.io/page/any_file.pdf
should be: https://{user_name}.github.io/{repo_name}/page/any_file.pdf
I think, this part has some probrem...
In /src/core/render/compiler/link.js, Line 21:
(+ my guessing note)
if (
!isAbsolutePath(href) && // -> true
!compilerClass._matchNotCompileLink(href) && // -> true
!config.ignore // -> false
) {
/* in this case: this part will not run */
if (href === compilerClass.config.homepage) {
href = 'README';
}
href = router.toURL(href, null, router.getCurrentPath()); // Relative path resolving to absolute path?
} else {
/* in this case: this part will run */
if (!isAbsolutePath(href) && href.slice(0, 2) === './') {
// -> true -> true
/* in this case: this part will run */
href =
document.URL.replace(/\/(?!.*\/).*/, '/').replace('#/./', '') + href;
// Remove from last '/' to end of URL, and reemove '#/./' (for compile ignored link) ?
}
// for 'mailto:' link process?
// ...
}
About this part:
href =
document.URL.replace(/\/(?!.*\/).*/, '/').replace('#/./', '') + href;
// Remove string from last '/', remove '#/./' (for compile ignored link) ?
If current document URL: http://localhost:3000/#/page/any_doc
If wrote link: ./any_file.pdf
document.URL
// -> http://localhost:3000/#/page/any_doc
document.URL.replace(/\/(?!.*\/).*/, '/').replace('#/./', '')
// -> http://localhost:3000/#/page/
href
// -> ./any_file.pdf
document.URL.replace(/\/(?!.*\/).*/, '/').replace('#/./', '') + href
// -> http://localhost:3000/#/page/./any_file.pdf
// (but should be: http://localhost:3000/page/any_file.pdf)
I think we should be letting the browser handle URLs natively. F.e. maybe we can use new URL('./relative/file.foo', base) where base could be the site base path like http://localhost:3000/#/page/any_doc. So that we avoid doing relative path logic if the browser already can.
Does URL support having # in the base? If not, then that would prevent the idea from being feasible. Need to try it