mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-30 03:19:11 +08:00
LinkResolve: Handle complex paths such as ../foo/../bah.md
Also add some more tests for other cases.
This commit is contained in:
@ -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;
|
||||
|
@ -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<void> 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
|
||||
|
Reference in New Issue
Block a user