From 71b3d841dad1e7ffca20d108689dc384ba7c9416 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Tue, 11 Aug 2020 13:33:50 +0200 Subject: [PATCH] LinkResolve: Handle complex paths such as ../foo/../bah.md Also add some more tests for other cases. --- lib/utils/link_resolver.dart | 6 ++++ test/link_resolver_test.dart | 58 ++++++++++++++++++++++++++++++------ 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/lib/utils/link_resolver.dart b/lib/utils/link_resolver.dart index 3295c852..5c678689 100644 --- a/lib/utils/link_resolver.dart +++ b/lib/utils/link_resolver.dart @@ -1,3 +1,5 @@ +import 'package:path/path.dart' as p; + import 'package:gitjournal/core/note.dart'; class LinkResolver { @@ -18,6 +20,10 @@ class LinkResolver { spec = link.substring(2); } + if (spec.contains(p.separator)) { + spec = p.normalize(spec); + } + var linkedNote = rootFolder.getNoteWithSpec(spec); if (linkedNote != null) { return linkedNote; diff --git a/test/link_resolver_test.dart b/test/link_resolver_test.dart index 6f199114..935b8f6f 100644 --- a/test/link_resolver_test.dart +++ b/test/link_resolver_test.dart @@ -20,6 +20,7 @@ void main() { await generateNote(tempDir.path, "Folder/Water.md"); await generateNote(tempDir.path, "Air Bender.md"); await generateNote(tempDir.path, "zeplin.txt"); + await generateNote(tempDir.path, "Goat Sim.md"); await rootFolder.loadRecursively(); }); @@ -83,6 +84,54 @@ void main() { var resolvedNote = linkResolver.resolve('[[Fire]]'); expect(resolvedNote.filePath, p.join(tempDir.path, 'Fire.md')); }); + + test('Non existing wiki link fails', () { + var note = rootFolder.notes[0]; + var linkResolver = LinkResolver(note); + + var resolvedNote = linkResolver.resolve('[[Hello2]]'); + expect(resolvedNote, null); + }); + + test('WikiLinks with extra spaces in the middle resolves correctly', () { + var note = rootFolder.notes[0]; + var linkResolver = LinkResolver(note); + + var resolvedNote = linkResolver.resolve('[[Goat Sim]]'); + expect(resolvedNote.filePath, p.join(tempDir.path, 'Goat Sim.md')); + }); + + test('Normal relative link', () { + var note = rootFolder.notes[0]; + var linkResolver = LinkResolver(note); + + var resolvedNote = linkResolver.resolve('./Hello.md'); + expect(resolvedNote.filePath, p.join(tempDir.path, 'Hello.md')); + }); + + test('Normal relative link without ./', () { + var note = rootFolder.notes[0]; + var linkResolver = LinkResolver(note); + + var resolvedNote = linkResolver.resolve('Hello.md'); + expect(resolvedNote.filePath, p.join(tempDir.path, 'Hello.md')); + }); + + test('Non existing relative link fails', () { + var note = rootFolder.notes[0]; + var linkResolver = LinkResolver(note); + + var resolvedNote = linkResolver.resolve('Hello2.md'); + expect(resolvedNote, null); + }); + + test('Complex relative link', () { + var note = rootFolder.notes[0]; + var linkResolver = LinkResolver(note); + + var resolvedNote = linkResolver.resolve('./Air Bender/../Goat Sim.md'); + expect(resolvedNote.filePath, p.join(tempDir.path, 'Goat Sim.md')); + }); } Future generateNote(String basePath, String path) async { @@ -101,12 +150,3 @@ Hello"""; return File(filePath).writeAsString(content, flush: true); } - -// Test to write -// 8. Non base path [[Fire]] should resolve to [[Fire.md]] - -// Normal Links -// 4. ./Fire.md -> resovles -// 5. Fire.md -> resolves -// 6. Fire2.md -> fails to resolve -// 7. Complex path ../../Foo/../bar/d.md