From d591f34d0ca63ce09e709ef6f93b18cf49a2b62d Mon Sep 17 00:00:00 2001 From: Frans de Jonge Date: Wed, 31 Jan 2018 18:01:15 +0100 Subject: [PATCH] [feat] DocumentRegistry: add getProviders() and preferred by weight This is step one toward "open with". References https://github.com/koreader/koreader/issues/3345 --- frontend/document/credocument.lua | 1 + frontend/document/djvudocument.lua | 1 + frontend/document/documentregistry.lua | 35 +++++++++++++++++++++++--- frontend/document/pdfdocument.lua | 12 +++++---- frontend/document/picdocument.lua | 3 ++- spec/unit/document_registry_spec.lua | 23 +++++++++++++++++ 6 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 spec/unit/document_registry_spec.lua diff --git a/frontend/document/credocument.lua b/frontend/document/credocument.lua index 984a40689240..ec524afeab50 100644 --- a/frontend/document/credocument.lua +++ b/frontend/document/credocument.lua @@ -26,6 +26,7 @@ local CreDocument = Document:new{ fallback_font = G_reader_settings:readSetting("fallback_font") or "Noto Sans CJK SC", default_css = "./data/cr3.css", options = CreOptions, + provider_name = "Cool Reader Engine", } -- NuPogodi, 20.05.12: inspect the zipfile content diff --git a/frontend/document/djvudocument.lua b/frontend/document/djvudocument.lua index 841fae067aa8..b440063c6306 100644 --- a/frontend/document/djvudocument.lua +++ b/frontend/document/djvudocument.lua @@ -12,6 +12,7 @@ local DjvuDocument = Document:new{ options = KoptOptions, koptinterface = nil, color_bb_type = Blitbuffer.TYPE_BBRGB24, + provider_name = "DjVu Libre", } -- check DjVu magic string to validate diff --git a/frontend/document/documentregistry.lua b/frontend/document/documentregistry.lua index 027f95a7ecc4..91dbd0cc5cf0 100644 --- a/frontend/document/documentregistry.lua +++ b/frontend/document/documentregistry.lua @@ -9,22 +9,49 @@ local DocumentRegistry = { providers = {}, } -function DocumentRegistry:addProvider(extension, mimetype, provider) - table.insert(self.providers, { extension = extension, mimetype = mimetype, provider = provider }) +function DocumentRegistry:addProvider(extension, mimetype, provider, weight) + table.insert(self.providers, { + extension = extension, + mimetype = mimetype, + provider = provider, + weight = weight or 100, + }) end ---- Returns the registered document handler. +--- Returns the preferred registered document handler. -- @string file -- @treturn string provider, or nil function DocumentRegistry:getProvider(file) + local providers = self:getProviders(file) + + if providers then + return providers[1].provider + end +end + +--- Returns the registered document handlers. +-- @string file +-- @treturn table providers, or nil +function DocumentRegistry:getProviders(file) + local providers = {} + -- TODO: some implementation based on mime types? for _, provider in ipairs(self.providers) do local suffix = string.sub(file, -string.len(provider.extension) - 1) if string.lower(suffix) == "."..provider.extension then -- if extension == provider.extension then - return provider.provider + -- stick highest weighted provider at the front + if #providers >= 1 and provider.weight > providers[1].weight then + table.insert(providers, 1, provider) + else + table.insert(providers, provider) + end end end + + if #providers >= 1 then + return providers + end end function DocumentRegistry:openDocument(file) diff --git a/frontend/document/pdfdocument.lua b/frontend/document/pdfdocument.lua index 146f2aef7b7e..0178f149cd7e 100644 --- a/frontend/document/pdfdocument.lua +++ b/frontend/document/pdfdocument.lua @@ -13,6 +13,7 @@ local PdfDocument = Document:new{ dc_null = DrawContext.new(), options = KoptOptions, koptinterface = nil, + provider_name = "MuPDF", } function PdfDocument:init() @@ -237,11 +238,12 @@ function PdfDocument:drawPage(target, x, y, rect, pageno, zoom, rotation, gamma, end function PdfDocument:register(registry) - registry:addProvider("pdf", "application/pdf", self) - registry:addProvider("cbz", "application/cbz", self) - registry:addProvider("cbt", "application/cbt", self) - registry:addProvider("zip", "application/zip", self) - registry:addProvider("xps", "application/xps", self) + registry:addProvider("pdf", "application/pdf", self, 100) + registry:addProvider("epub", "application/epub", self, 50) + registry:addProvider("cbz", "application/cbz", self, 100) + registry:addProvider("cbt", "application/cbt", self, 100) + registry:addProvider("zip", "application/zip", self, 100) + registry:addProvider("xps", "application/xps", self, 100) end return PdfDocument diff --git a/frontend/document/picdocument.lua b/frontend/document/picdocument.lua index e41fef4f2f5b..7632f2044d82 100644 --- a/frontend/document/picdocument.lua +++ b/frontend/document/picdocument.lua @@ -6,7 +6,8 @@ local pic = nil local PicDocument = Document:new{ _document = false, is_pic = true, - dc_null = DrawContext.new() + dc_null = DrawContext.new(), + provider_name = "Picture Document", } function PicDocument:init() diff --git a/spec/unit/document_registry_spec.lua b/spec/unit/document_registry_spec.lua new file mode 100644 index 000000000000..c3e544b9c764 --- /dev/null +++ b/spec/unit/document_registry_spec.lua @@ -0,0 +1,23 @@ +describe("document registry module", function() + local DocumentRegistry + + setup(function() + require("commonrequire") + DocumentRegistry = require("document/documentregistry") + end) + + it("should get preferred rendering engine", function() + assert.is_equal("Cool Reader Engine", + DocumentRegistry:getProvider("bla.epub").provider_name) + assert.is_equal("MuPDF", + DocumentRegistry:getProvider("bla.pdf").provider_name) + end) + + it("should return all supported rendering engines", function() + local providers = DocumentRegistry:getProviders("bla.epub") + assert.is_equal("Cool Reader Engine", + providers[1].provider.provider_name) + assert.is_equal("MuPDF", + providers[2].provider.provider_name) + end) +end)