diff --git a/lib/core/note.dart b/lib/core/note.dart index 40bfc8b8..9a0ea43a 100644 --- a/lib/core/note.dart +++ b/lib/core/note.dart @@ -7,6 +7,7 @@ import 'package:gitjournal/core/links_loader.dart'; import 'package:gitjournal/core/md_yaml_doc_loader.dart'; import 'package:gitjournal/core/note_notifier.dart'; import 'package:gitjournal/core/notes_folder_fs.dart'; +import 'package:gitjournal/core/processors/image_extractor.dart'; import 'package:gitjournal/core/processors/inline_tags.dart'; import 'package:gitjournal/error_reporting.dart'; import 'package:gitjournal/settings.dart'; @@ -64,6 +65,7 @@ class Note with NotesNotifier { String _summary; List _links; Set _inlineTags; + Set _images; static final _mdYamlDocLoader = MdYamlDocLoader(); static final _linksLoader = LinksLoader(); @@ -153,6 +155,7 @@ class Note with NotesNotifier { _summary = null; _links = null; _inlineTags = null; + _images = null; _notifyModified(); } @@ -200,6 +203,15 @@ class Note with NotesNotifier { return _inlineTags; } + Set get images { + if (_loadState != NoteLoadState.Loaded) return {}; + + var p = ImageExtractor(); + _images ??= p.extract(body); + + return _images; + } + Map get extraProps { return _extraProps; } diff --git a/lib/core/processors/image_extractor.dart b/lib/core/processors/image_extractor.dart new file mode 100644 index 00000000..802cf59b --- /dev/null +++ b/lib/core/processors/image_extractor.dart @@ -0,0 +1,32 @@ +import 'package:equatable/equatable.dart'; +import 'package:meta/meta.dart'; + +class NoteImage extends Equatable { + final String url; + final String alt; + + NoteImage({@required this.url, @required this.alt}); + + @override + List get props => [url, alt]; + + @override + bool get stringify => true; +} + +class ImageExtractor { + static final _regexp = RegExp(r"!\[(.*)\]\((.*)\)"); + + Set extract(String body) { + var images = {}; + var matches = _regexp.allMatches(body); + for (var match in matches) { + var alt = match.group(1); + var url = match.group(2); + + images.add(NoteImage(alt: alt, url: url)); + } + + return images; + } +} diff --git a/test/processors/image_extractor_test.dart b/test/processors/image_extractor_test.dart new file mode 100644 index 00000000..7c2f8c65 --- /dev/null +++ b/test/processors/image_extractor_test.dart @@ -0,0 +1,20 @@ +import 'package:test/test.dart'; + +import 'package:gitjournal/core/processors/image_extractor.dart'; + +void main() { + test('Should parse simple tags', () { + var body = """#hello Hi +![alt](../final.img) +![alt2](../final2.img) +"""; + + var p = ImageExtractor(); + var images = p.extract(body); + + expect(images, { + NoteImage(alt: 'alt', url: '../final.img'), + NoteImage(alt: 'alt2', url: '../final2.img'), + }); + }); +}