From 9517bda48c90b0faefc02416bcb289060d1c5734 Mon Sep 17 00:00:00 2001 From: Mat Moore Date: Sun, 27 Aug 2023 21:13:39 +0100 Subject: [PATCH] Use marcel to detect content types When pages embed content via wikilinks, the behaviour depends on the content type. For images, we can generate regular image markdown. For anything else, we generate a link. --- Gemfile.lock | 10 ++++++++++ lib/obsidian/parser.rb | 10 +++++----- lib/obsidian/parser/content_type.rb | 12 ++++++++++-- obsidian-parser.gemspec | 1 + spec/example_vault/foo/bar.jpg | Bin 0 -> 56060 bytes spec/obsidian/parser/markdown_parser_spec.rb | 11 ++++++++++- 6 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 spec/example_vault/foo/bar.jpg diff --git a/Gemfile.lock b/Gemfile.lock index bd32562..e273be7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,6 +2,7 @@ PATH remote: . specs: obsidian-parser (0.7.0) + marcel (~> 0.3.1) markly (~> 0.7.0) GEM @@ -13,8 +14,17 @@ GEM json (2.6.3) language_server-protocol (3.17.0.3) lint_roller (1.1.0) + marcel (0.3.3) + mimemagic (~> 0.3.2) markly (0.7.0) method_source (1.0.0) + mimemagic (0.3.10) + nokogiri (~> 1) + rake + nokogiri (1.15.4-x86_64-darwin) + racc (~> 1.4) + nokogiri (1.15.4-x86_64-linux) + racc (~> 1.4) parallel (1.23.0) parser (3.2.2.3) ast (~> 2.4.1) diff --git a/lib/obsidian/parser.rb b/lib/obsidian/parser.rb index d99ec9e..0933a2d 100644 --- a/lib/obsidian/parser.rb +++ b/lib/obsidian/parser.rb @@ -26,9 +26,9 @@ def initialize(vault_directory) markdown_parser = MarkdownParser.new vault_directory.glob("**/*").each do |path| - dirname, basename = path.relative_path_from(vault_directory).split + next if path.directory? - next if basename == "." + dirname, basename = path.relative_path_from(vault_directory).split # Remove the path component "./" from the start of the dirname parent_slug = dirname.to_s.gsub(/\A\.\/?/, "") @@ -36,7 +36,7 @@ def initialize(vault_directory) if basename.to_s.end_with?(".md") add_markdown_file(basename: basename, parent_slug: parent_slug, path: path, last_modified: path.mtime, markdown_parser: markdown_parser) else - add_media_file(basename: basename, parent_slug: parent_slug, last_modified: path.mtime) + add_media_file(basename: basename, parent_slug: parent_slug, last_modified: path.mtime, path: path) end end @@ -67,11 +67,11 @@ def add_markdown_file(basename:, parent_slug:, last_modified:, path:, markdown_p ) end - def add_media_file(basename:, parent_slug:, last_modified:) + def add_media_file(basename:, parent_slug:, last_modified:, path:) @media_index.add_page( Obsidian.build_slug(basename.to_s, parent_slug), last_modified: last_modified, - content_type: PretendEverythingIsAnImage.new + content_type: ContentType.new(path) ) end end diff --git a/lib/obsidian/parser/content_type.rb b/lib/obsidian/parser/content_type.rb index 8f2c777..5ef0e7f 100644 --- a/lib/obsidian/parser/content_type.rb +++ b/lib/obsidian/parser/content_type.rb @@ -1,5 +1,13 @@ -class PretendEverythingIsAnImage +require "marcel" + +class ContentType + def initialize(path) + @content_type = Marcel::MimeType.for(path) + end + def image? - true + content_type.start_with?("image/") end + + attr_reader :content_type end diff --git a/obsidian-parser.gemspec b/obsidian-parser.gemspec index 06872f8..5c3687d 100644 --- a/obsidian-parser.gemspec +++ b/obsidian-parser.gemspec @@ -31,6 +31,7 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] spec.add_dependency "markly", "~> 0.7.0" + spec.add_dependency "marcel", "~> 0.3.1" # For more information and examples about making a new gem, check out our # guide at: https://bundler.io/guides/creating_gem.html diff --git a/spec/example_vault/foo/bar.jpg b/spec/example_vault/foo/bar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..54547153213ab77978b7d279bfa0cacee414da94 GIT binary patch literal 56060 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�kwUoI+;NN>zQ=fA!@UnBlavVD(@cmDuS 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 b;2(j11pX2DN8lfUe+2#!_($OX34#9u?!9lq literal 0 HcmV?d00001 diff --git a/spec/obsidian/parser/markdown_parser_spec.rb b/spec/obsidian/parser/markdown_parser_spec.rb index 40f16cf..fde6aba 100644 --- a/spec/obsidian/parser/markdown_parser_spec.rb +++ b/spec/obsidian/parser/markdown_parser_spec.rb @@ -66,7 +66,11 @@ let(:media_root) { Obsidian::Page.create_root } before do - media_root.add_page("foo/bar.jpg", content_type: PretendEverythingIsAnImage.new) + path = Pathname.new(__dir__).join("../../example_vault/foo/bar.jpg") + media_root.add_page("foo/bar.jpg", content_type: ContentType.new(path)) + + path = Pathname.new(__dir__).join("../../example_vault/hello_world.txt") + media_root.add_page("hello_world.txt", content_type: ContentType.new(path)) end it "expands image wikilinks" do @@ -95,6 +99,11 @@ expect(result).to eq("[bar](/foo/bar)") end + it "falls back to a link if the target is not an image" do + result = parser.expand_attachments("![[hello_world.txt]]", root: index, media_root: media_root) + expect(result).to eq("[hello_world.txt](/hello_world.txt)") + end + it "falls back to plain text if there is no such page" do result = parser.expand_attachments("![[banana|a yellow banana]]", root: index, media_root: media_root) expect(result).to eq("a yellow banana")