From 75316cf1da630565b7003517e5f47ddcf7a0c4c2 Mon Sep 17 00:00:00 2001 From: Ryan Ward Date: Tue, 11 Feb 2020 21:14:14 -0500 Subject: [PATCH] Manga search kinda works. Fixed issue with threaded functions --- images/test.jpg | Bin 0 -> 17464 bytes manga/init.lua | 14 ++- multi/integration/loveManager/extensions.lua | 1 - multi/integration/loveManager/init.lua | 6 +- pages/search.lua | 111 +++++++++++++++++-- set.lua | 42 +++++++ 6 files changed, 156 insertions(+), 18 deletions(-) create mode 100644 images/test.jpg create mode 100644 set.lua diff --git a/images/test.jpg b/images/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92fa52914505082b318c6000ee02379f9a75d7da GIT binary patch literal 17464 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 Oe%t&tlnqltfB)IPTc$4n literal 0 HcmV?d00001 diff --git a/manga/init.lua b/manga/init.lua index 3666fdc..fdabd42 100644 --- a/manga/init.lua +++ b/manga/init.lua @@ -23,9 +23,10 @@ function m.storeList(list) end end m.azlist = titles + return titles end -- returns manga -m.getManga = function(title) +m.getManga = THREAD:newFunction(function(title) local http = require("socket.http") local manga = http.request(title.Link) local tab = {} @@ -45,7 +46,7 @@ m.getManga = function(title) end end return tab -end +end) local queue = multi:newSystemThreadedJobQueue(16) queue:doToAll(function() multi,thread = require("multi"):init() @@ -70,20 +71,25 @@ m.getPages = function(manga,chapter) local http = require("socket.http") local tab = {} local cc = 0 + local done = false local page = http.request(manga.Chapters[chapter].Link) tab.pages = {page:match([[id="imgholder.-src="([^"]*)]])} tab.nextChapter = "http://www.mangareader.net"..page:match([[Next Chapter:.-href="([^"]*)]]) + local lastJob local conn = queue.OnJobCompleted(function(jid,link) table.insert(tab.pages,link) cc=cc+1 + if jid==lastJob then + done = true + end end) local count = 0 for link,page in page:gmatch([[]]) do - queue:pushJob("getImage","http://www.mangareader.net"..link) + lastJob = queue:pushJob("getImage","http://www.mangareader.net"..link) count = count + 1 end thread.hold(function() - return count==#tab.pages + return done end) return tab end diff --git a/multi/integration/loveManager/extensions.lua b/multi/integration/loveManager/extensions.lua index aeb3b2d..08f8dd3 100644 --- a/multi/integration/loveManager/extensions.lua +++ b/multi/integration/loveManager/extensions.lua @@ -105,7 +105,6 @@ function multi:newSystemThreadedJobQueue(n) thread.yield() local dat = c.queueReturn:pop() if dat then - print(dat) c.OnJobCompleted:Fire(unpack(dat)) end end diff --git a/multi/integration/loveManager/init.lua b/multi/integration/loveManager/init.lua index 9097609..14a3c9e 100644 --- a/multi/integration/loveManager/init.lua +++ b/multi/integration/loveManager/init.lua @@ -49,11 +49,13 @@ local THREAD_ID = 1 local OBJECT_ID = 0 function THREAD:newFunction(func,holup) return function(...) - local t = multi:newSystemThread("SystemThreadedFunction",func,...) + local t = multi:newSystemThread("SystemThreadedFunction"..math.random(0,999999999),func,...) return thread:newFunction(function() return thread.hold(function() if t.stab["returns"] then - return unpack(t.stab.returns) + local dat = t.stab.returns + t.stab.returns = nil + return unpack(dat) end end) end,holup)() diff --git a/pages/search.lua b/pages/search.lua index 0f2479c..c022961 100644 --- a/pages/search.lua +++ b/pages/search.lua @@ -1,23 +1,112 @@ +local Set = require("set") local mangaReader = require("manga") local multi,thread = require("multi"):init() +local titles +multi:newThread(function() + titles = mangaReader.storeList(mangaReader.init()) +end) +local scale = 2 +local mangaSize = { + x=200/scale, + y=288/scale +} +function tprint (tbl, indent) + if not indent then indent = 0 end + for k, v in pairs(tbl) do + formatting = string.rep(" ", indent) .. k .. ": " + if type(v) == "table" then + print(formatting) + tprint(v, indent+1) + elseif type(v) == 'boolean' then + print(formatting .. tostring(v)) + else + print(formatting .. v) + end + end +end +function searchFor(query) + query = Set(query:split(" ")) + local list = {} + for i,v in pairs(titles) do + local t = Set(v.Title:split(" ")) + local tab = {} + for k in Set.elements(query*t) do table.insert(tab,k) end + if #tab==Set.card(query) then + table.insert(list,v) + end + end + return list +end +function searchBy(char) + local list = {} + for i,v in pairs(titles) do + if v.Title:sub(1,1):lower()==char:sub(1,1):lower() or (char=="#" and tonumber(v.Title:sub(1,1))~=nil) then + table.insert(list,v) + end + end + return list +end +local chars = {"#"} +for i=65,90 do + table.insert(chars,string.char(i)) +end local function init(page,workspace) + local holder = page:newFrame("",15,80,-30,-95,0,0,1,1) + holder.Visibility = 0 + holder.BorderSize = 0 + page.ClipDescendants = true + holder:OnUpdate(function() + local c = holder:getChildren() + for i=1,#c do + local x,y = InGridX(i,holder.width,0,mangaSize.x+5,mangaSize.y+5) + c[i]:SetDualDim(x,y+5) + end + local size = math.floor(holder.width/(mangaSize.x+5))*(mangaSize.x+5) + holder:SetDualDim((page.width-size)/2) + end) local nav = page:newFrame(10,10,-20,40,0,0,1) + local SBL = page:newFrame(0,55,540,20) + for i,v in pairs(chars) do + local temp = SBL:newTextLabel(v,v,(i-1)*20,0,20,20) + temp.Color = theme.button + temp:fitFont() + temp:OnReleased(thread:newFunction(function() + thread.hold(function() return titles end) + local list = searchBy(temp.text) + local c = holder:getChildren() + for i=#c,1,-1 do + c[i]:Destroy() + end + for i,v in pairs(list) do + thread.sleep(.5) + local manga = mangaReader.getManga(v).connect(function(manga) + print(v.Title,manga.Cover) + local temp = holder:newImageButton(nil,0,0,mangaSize.x,mangaSize.y) + temp.BorderSize = 2 + temp:SetImage(manga.Cover) + end) + end + end)) + end + --[[ + local temp = holder:newImageLabel("images/test.jpg",0,0,mangaSize.x,mangaSize.y) + temp.BorderSize = 2 + ]] + SBL:centerX() nav.Color = theme.header nav:setRoundness(5,5,60) local search = nav:newTextButton("Search","Search",5,5,60,-10,0,0,0,1) - search.Color = theme.button--Color.new("2196F3") + search.Color = theme.button search:fitFont() - local func = thread:newFunction(function() - mangaReader.storeList(mangaReader.init()) - local title = mangaReader.getList()[643] - local manga = mangaReader.getManga(title) - local page = mangaReader.getPages(manga,1) - - end) - search:OnReleased(function() - func() - end) local bar = nav:newTextBox("","",70,5,-75,-10,0,0,1,1) + search:OnReleased(thread:newFunction(function() + thread.hold(function() return titles end) + -- tprint(searchBy("a")) + -- tprint(searchFor(bar.text)) + -- local manga = mangaReader.getManga(title) + -- local page = mangaReader.getPages(manga,1) + -- print(page) + end)) bar:fitFont() bar.Color = theme.input bar.XTween = 1 diff --git a/set.lua b/set.lua new file mode 100644 index 0000000..1a612de --- /dev/null +++ b/set.lua @@ -0,0 +1,42 @@ +local pairs, setmetatable = pairs, setmetatable +local mt -- metatable +mt = { + __add = function(s1, s2) -- union + local s = {} + for e in pairs(s1) do s[e] = true end + for e in pairs(s2) do s[e] = true end + return setmetatable(s, mt) + end, + __mul = function(s1, s2) -- intersection + local s = {} + for e in pairs(s1) do + if s2[e] then s[e] = true end + end + return setmetatable(s, mt) + end, + __sub = function(s1, s2) -- set difference + local s = {} + for e in pairs(s1) do + if not s2[e] then s[e] = true end + end + return setmetatable(s, mt) + end, + __tostring = function(s) + return table.concat(s,",") + end +} + +local card = function(s) -- #elements + local n = 0 + for k in pairs(s) do n = n + 1 end + return n +end + +return setmetatable({elements = pairs, card = card}, { + __call = function(_, t) -- new set + local t = t or {} + local s = {} + for _, e in pairs(t) do s[e:lower()] = true end + return setmetatable(s, mt) + end +}) \ No newline at end of file