Merge pull request #1071 from chrox/fulltext_search

various fixes
pull/1076/head
HW 10 years ago
commit 197c2f55b9

@ -1 +1 @@
Subproject commit 959f8c2160abee41b846158b2b06820617427b38
Subproject commit 3260f0494f7558f234806e68adb92606af391f8f

@ -32,21 +32,24 @@ function ReaderDictionary:onLookupWord(word, box, highlight)
return true
end
local function tidyCDATA(results)
local function tidy_markup(results)
local cdata_tag = "<!%[CDATA%[(.-)%]%]>"
local format_escape = "&[29Ib%+]{(.-)}"
for _, result in ipairs(results) do
local def = result.definition
-- preserve the <br> tag for line break
def = def:gsub("<[bB][rR] ?/?>", "\n")
-- parse CDATA text in XML
if result.definition:find(cdata_tag) then
local def = result.definition:gsub(cdata_tag, "%1")
-- ignore all tags
def = def:gsub("%b<>", "")
if def:find(cdata_tag) then
def = def:gsub(cdata_tag, "%1")
-- ignore format strings
while def:find(format_escape) do
def = def:gsub(format_escape, "%1")
end
result.definition = def
end
-- ignore all markup tags
def = def:gsub("%b<>", "")
result.definition = def
end
return results
end
@ -66,7 +69,7 @@ function ReaderDictionary:stardictLookup(word, box)
local ok, results = pcall(JSON.decode, JSON, results_str)
if ok and results then
DEBUG("lookup result table:", word, results)
self:showDict(word, tidyCDATA(results), box)
self:showDict(word, tidy_markup(results), box)
else
-- dummy results
results = {

@ -46,7 +46,6 @@ function ReaderMenu:init()
local FileManager = require("apps/filemanager/filemanager")
FileManager:restoreScreenMode()
if not FileManager.is_running then
UIManager:quit()
FileManager:showFiles()
end
end,
@ -91,8 +90,6 @@ function ReaderMenu:setUpdateItemTable()
end
-- setting tab
-- FIXME: it's curious that if this 'Screen' menu is placed after the Language
-- menu submenu in 'Screen' won't be shown. Probably a bug in the touchmenu module.
table.insert(self.tab_item_table.setting, {
text = _("Screen settings"),
sub_item_table = {
@ -143,27 +140,33 @@ function ReaderMenu:setUpdateItemTable()
end
})
--typeset tab
if KOBO_SCREEN_SAVER_LAST_BOOK then
local exclude = self.ui.doc_settings:readSetting("exclude_screensaver") or false
table.insert(self.tab_item_table.typeset, {
text = _("Use this book's cover as screensaver"),
checked_func = function() return not (self.ui.doc_settings:readSetting("exclude_screensaver") or false) end,
callback = function()
local exclude = self.ui.doc_settings:readSetting("exclude_screensaver") or false
self.ui.doc_settings:saveSetting("exclude_screensaver", not exclude)
self.ui:saveSettings()
end
})
local proportional = self.ui.doc_settings:readSetting("proportional_screensaver") or false
local excluded = function()
return self.ui.doc_settings:readSetting("exclude_screensaver") or false
end
local proportional = function()
return self.ui.doc_settings:readSetting("proportional_screensaver") or false
end
table.insert(self.tab_item_table.typeset, {
text = _("Display proportional cover image in screensaver"),
checked_func = function() return (self.ui.doc_settings:readSetting("proportional_screensaver") or false) end,
callback = function()
local proportional = self.ui.doc_settings:readSetting("proportional_screensaver") or false
self.ui.doc_settings:saveSetting("proportional_screensaver", not proportional)
self.ui:saveSettings()
end
text = "Screensaver",
sub_item_table = {
{
text = _("Use this book's cover as screensaver"),
checked_func = function() return not excluded() end,
callback = function()
self.ui.doc_settings:saveSetting("exclude_screensaver", not excluded())
self.ui:saveSettings()
end
},
{
text = _("Display proportional cover image in screensaver"),
checked_func = function() return proportional() end,
callback = function()
self.ui.doc_settings:saveSetting("proportional_screensaver", not proportional())
self.ui:saveSettings()
end
}
}
})
end
end

@ -136,8 +136,11 @@ function Cache:serialize()
-- serialize the most recently used cache
local cache_size = 0
for _, key in ipairs(self.cache_order) do
if self.cache[key].dump then
cache_size = self.cache[key]:dump(cache_path..md5(key)) or 0
local cache_item = self.cache[key]
-- only dump cache item that requests serialization explicitly
if cache_item.persistent and cache_item.dump then
DEBUG("dump cache item", key)
cache_size = cache_item:dump(cache_path..md5(key)) or 0
if cache_size > 0 then break end
end
end

@ -1,11 +1,12 @@
local TileCacheItem = require("document/tilecacheitem")
local DrawContext = require("ffi/drawcontext")
local Configurable = require("configurable")
local Blitbuffer = require("ffi/blitbuffer")
local Cache = require("cache")
local lfs = require("libs/libkoreader-lfs")
local CacheItem = require("cacheitem")
local TileCacheItem = require("document/tilecacheitem")
local Geom = require("ui/geometry")
local Configurable = require("configurable")
local Math = require("optmath")
local Cache = require("cache")
local DEBUG = require("dbg")
--[[
@ -114,6 +115,7 @@ function Document:getNativePageDimensions(pageno)
end
function Document:_readMetadata()
self.mod_time = lfs.attributes(self.file, "modification")
self.info.number_of_pages = self._document:getPages()
return true
end
@ -215,8 +217,13 @@ function Document:getCoverPageImage()
return nil
end
function Document:getFullPageHash(pageno, zoom, rotation, gamma, render_mode)
return "renderpg|"..self.file.."|"..self.mod_time.."|"..pageno.."|"
..zoom.."|"..rotation.."|"..gamma.."|"..render_mode
end
function Document:renderPage(pageno, rect, zoom, rotation, gamma, render_mode)
local hash = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..gamma.."|"..render_mode
local hash = self:getFullPageHash(pageno, zoom, rotation, gamma, render_mode)
local page_size = self:getPageDimensions(pageno, zoom, rotation)
-- this will be the size we actually render
local size = page_size
@ -231,12 +238,13 @@ function Document:renderPage(pageno, rect, zoom, rotation, gamma, render_mode)
return
end
-- only render required part
hash = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..gamma.."|"..render_mode.."|"..tostring(rect)
hash = self:getFullPageHash(pageno, zoom, rotation, gamma, render_mode).."|"..tostring(rect)
size = rect
end
-- prepare cache item with contained blitbuffer
local tile = TileCacheItem:new{
persistent = true,
size = size.w * size.h + 64, -- estimation
excerpt = size,
pageno = pageno,
@ -274,7 +282,7 @@ end
-- a hint for the cache engine to paint a full page to the cache
-- TODO: this should trigger a background operation
function Document:hintPage(pageno, zoom, rotation, gamma, render_mode)
local hash_full_page = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..gamma.."|"..render_mode
local hash_full_page = self:getFullPageHash(pageno, zoom, rotation, gamma, render_mode)
if not Cache:check(hash_full_page, TileCacheItem) then
DEBUG("hinting page", pageno)
self:renderPage(pageno, nil, zoom, rotation, gamma, render_mode)
@ -290,7 +298,7 @@ Draw page content to blitbuffer.
@rect: visible_area inside document page
--]]
function Document:drawPage(target, x, y, rect, pageno, zoom, rotation, gamma, render_mode)
local hash_full_page = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..gamma.."|"..render_mode
local hash_full_page = self:getFullPageHash(pageno, zoom, rotation, gamma, render_mode)
local hash_excerpt = hash_full_page.."|"..tostring(rect)
local tile = Cache:check(hash_full_page, TileCacheItem)
if not tile then

@ -107,7 +107,8 @@ function KoptInterface:getContextHash(doc, pageno, bbox)
local screen_size = Screen:getSize()
local screen_size_hash = screen_size.w.."|"..screen_size.h
local bbox_hash = bbox.x0.."|"..bbox.y0.."|"..bbox.x1.."|"..bbox.y1
return doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..screen_size_hash
return doc.file.."|"..doc.mod_time.."|"..pageno.."|"
..doc.configurable:hash("|").."|"..bbox_hash.."|"..screen_size_hash
end
function KoptInterface:getPageBBox(doc, pageno)
@ -215,6 +216,7 @@ function KoptInterface:getCachedContext(doc, pageno)
DEBUG("reflowed page", pageno, "fullwidth:", fullwidth, "fullheight:", fullheight)
self.last_context_size = fullwidth * fullheight + 128 -- estimation
Cache:insert(kctx_hash, ContextCacheItem:new{
persistent = true,
size = self.last_context_size,
kctx = kc
})
@ -289,7 +291,7 @@ function KoptInterface:renderReflowedPage(doc, pageno, rect, zoom, rotation, ren
end
-- prepare cache item with contained blitbuffer
local tile = TileCacheItem:new{
size = fullwidth * fullheight / 2 + 64, -- estimation
size = fullwidth * fullheight + 64, -- estimation
excerpt = Geom:new{ w = fullwidth, h = fullheight },
pageno = pageno,
}
@ -311,7 +313,7 @@ function KoptInterface:renderOptimizedPage(doc, pageno, rect, zoom, rotation, re
local context_hash = self:getContextHash(doc, pageno, bbox)
local renderpg_hash = "renderoptpg|"..context_hash..zoom
local cached = Cache:check(renderpg_hash)
local cached = Cache:check(renderpg_hash, TileCacheItem)
if not cached then
local page_size = Document.getNativePageDimensions(doc, pageno)
local bbox = {
@ -329,7 +331,8 @@ function KoptInterface:renderOptimizedPage(doc, pageno, rect, zoom, rotation, re
local fullwidth, fullheight = kc:getPageDim()
-- prepare cache item with contained blitbuffer
local tile = TileCacheItem:new{
size = fullwidth * fullheight / 2 + 64, -- estimation
persistent = true,
size = fullwidth * fullheight + 64, -- estimation
excerpt = Geom:new{
x = 0, y = 0,
w = fullwidth,

@ -132,10 +132,20 @@ function UIManager:init()
end
-- register & show a widget
-- modal widget should be always on the top
function UIManager:show(widget, x, y)
DEBUG("show widget", widget.id)
self._running = true
-- put widget on top of stack
table.insert(self._window_stack, {x = x or 0, y = y or 0, widget = widget})
local window = {x = x or 0, y = y or 0, widget = widget}
-- put this window on top of the toppest non-modal window
for i = #self._window_stack, 0, -1 do
local top_window = self._window_stack[i]
-- skip modal window
if not top_window or not top_window.widget.modal then
table.insert(self._window_stack, i + 1, window)
break
end
end
-- and schedule it to be painted
self:setDirty(widget)
-- tell the widget that it is shown now
@ -148,6 +158,7 @@ end
-- unregister a widget
function UIManager:close(widget)
DEBUG("close widget", widget.id)
Input.disable_double_tap = DGESDETECT_DISABLE_DOUBLE_TAP
local dirty = false
for i = #self._window_stack, 1, -1 do
@ -226,6 +237,7 @@ end
-- signal to quit
function UIManager:quit()
DEBUG("quit uimanager")
self._running = false
for i = #self._window_stack, 1, -1 do
table.remove(self._window_stack, i)

@ -24,6 +24,7 @@ local Blitbuffer = require("ffi/blitbuffer")
Widget that shows a message and OK/Cancel buttons
]]
local ConfirmBox = InputContainer:new{
modal = true,
text = _("no text"),
face = Font:getFace("infofont", 25),
ok_text = _("OK"),

@ -21,6 +21,7 @@ Widget that displays an informational message
it vanishes on key press or after a given timeout
]]
local InfoMessage = InputContainer:new{
modal = true,
face = Font:getFace("infofont", 25),
text = "",
timeout = nil, -- in seconds

@ -103,6 +103,7 @@ function TouchMenuItem:onTapSelect(arg, ges)
UIManager:setDirty(self.show_parent, "partial")
end)
self.menu:onMenuSelect(self.item)
return true
end
function TouchMenuItem:onHoldSelect(arg, ges)
@ -119,6 +120,7 @@ function TouchMenuItem:onHoldSelect(arg, ges)
UIManager:setDirty(self.show_parent, "partial")
end)
self.menu:onMenuHold(self.item)
return true
end
--[[
@ -331,11 +333,11 @@ function TouchMenu:init()
self.device_info = HorizontalGroup:new{
self.time_info,
self.net_info,
}
else
}
else
self.device_info = HorizontalGroup:new{
self.time_info,
}
}
end
local footer_width = self.width - self.padding*2 - self.bordersize*2
self.footer = HorizontalGroup:new{

Loading…
Cancel
Save