mirror of
https://github.com/hkalexling/Mango.git
synced 2026-04-25 00:00:52 -04:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ac3df03d88 | |||
| 7c9728683c | |||
| d921d04abf | |||
| 5400c8c8ef | |||
| 58e96cd4fe | |||
| aa09f3a86f | |||
| a5daded453 | |||
| 4968cb8e18 | |||
| 27c6e02da8 | |||
| 68d1b55aea | |||
| 32dc3e84b9 | |||
| 460fcdf2f5 | |||
| c6369f9f26 |
+14
-2
@@ -5,8 +5,20 @@
|
|||||||
padding: 20px;
|
padding: 20px;
|
||||||
}
|
}
|
||||||
.uk-card-media-top {
|
.uk-card-media-top {
|
||||||
max-height: 350px;
|
height: 250px;
|
||||||
overflow: hidden;
|
}
|
||||||
|
@media (min-width: 600px) {
|
||||||
|
.uk-card-media-top {
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.uk-card-media-top > img {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
.uk-card-title {
|
||||||
|
height: 3em;
|
||||||
}
|
}
|
||||||
.acard:hover {
|
.acard:hover {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
const truncate = () => {
|
||||||
|
$('.acard .uk-card-title').each((i, e) => {
|
||||||
|
$(e).dotdotdot({
|
||||||
|
truncate: 'letter',
|
||||||
|
watch: true,
|
||||||
|
callback: (truncated) => {
|
||||||
|
if (truncated) {
|
||||||
|
$(e).attr('uk-tooltip', $(e).attr('data-title'));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$(e).removeAttr('uk-tooltip');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
truncate();
|
||||||
+10
-45
@@ -15,48 +15,20 @@ const toggleTheme = () => {
|
|||||||
saveTheme(newTheme);
|
saveTheme(newTheme);
|
||||||
};
|
};
|
||||||
|
|
||||||
// https://stackoverflow.com/a/28344281
|
|
||||||
const hasClass = (ele,cls) => {
|
|
||||||
return !!ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
|
|
||||||
};
|
|
||||||
const addClass = (ele,cls) => {
|
|
||||||
if (!hasClass(ele,cls)) ele.className += " "+cls;
|
|
||||||
};
|
|
||||||
const removeClass = (ele,cls) => {
|
|
||||||
if (hasClass(ele,cls)) {
|
|
||||||
var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
|
|
||||||
ele.className=ele.className.replace(reg,' ');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const addClassToClass = (targetCls, newCls) => {
|
|
||||||
const elements = document.getElementsByClassName(targetCls);
|
|
||||||
for (let i = 0; i < elements.length; i++) {
|
|
||||||
addClass(elements[i], newCls);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const removeClassFromClass = (targetCls, newCls) => {
|
|
||||||
const elements = document.getElementsByClassName(targetCls);
|
|
||||||
for (let i = 0; i < elements.length; i++) {
|
|
||||||
removeClass(elements[i], newCls);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const setTheme = themeStr => {
|
const setTheme = themeStr => {
|
||||||
if (themeStr === 'dark') {
|
if (themeStr === 'dark') {
|
||||||
document.getElementsByTagName('html')[0].style.background = 'rgb(20, 20, 20)';
|
$('html').css('background', 'rgb(20, 20, 20)');
|
||||||
addClass(document.getElementsByTagName('body')[0], 'uk-light');
|
$('body').addClass('uk-light');
|
||||||
addClassToClass('uk-card', 'uk-card-secondary');
|
$('.uk-card').addClass('uk-card-secondary');
|
||||||
removeClassFromClass('uk-card', 'uk-card-default');
|
$('.uk-card').removeClass('uk-card-default');
|
||||||
addClassToClass('ui-widget-content', 'dark');
|
$('.ui-widget-content').addClass('dark');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
document.getElementsByTagName('html')[0].style.background = '';
|
$('html').css('background', '');
|
||||||
removeClass(document.getElementsByTagName('body')[0], 'uk-light');
|
$('body').removeClass('uk-light');
|
||||||
removeClassFromClass('uk-card', 'uk-card-secondary');
|
$('.uk-card').removeClass('uk-card-secondary');
|
||||||
addClassToClass('uk-card', 'uk-card-default');
|
$('.uk-card').addClass('uk-card-default');
|
||||||
removeClassFromClass('ui-widget-content', 'dark');
|
$('.ui-widget-content').removeClass('dark');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -69,10 +41,3 @@ const styleModal = () => {
|
|||||||
|
|
||||||
// do it before document is ready to prevent the initial flash of white
|
// do it before document is ready to prevent the initial flash of white
|
||||||
setTheme(getTheme());
|
setTheme(getTheme());
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
|
||||||
// because this script is attached at the top of HTML, the style on uk-card
|
|
||||||
// won't be applied because the elements are not available yet. We have to
|
|
||||||
// apply the theme again for it to take effect
|
|
||||||
setTheme(getTheme());
|
|
||||||
}, false);
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: mango
|
name: mango
|
||||||
version: 0.2.3
|
version: 0.2.4
|
||||||
|
|
||||||
authors:
|
authors:
|
||||||
- Alex Ling <hkalexling@gmail.com>
|
- Alex Ling <hkalexling@gmail.com>
|
||||||
|
|||||||
+2
-2
@@ -208,11 +208,11 @@ class Title
|
|||||||
info = TitleInfo.new @dir
|
info = TitleInfo.new @dir
|
||||||
page = load_progress username, entry
|
page = load_progress username, entry
|
||||||
entry_obj = @entries.find{|e| e.title == entry}
|
entry_obj = @entries.find{|e| e.title == entry}
|
||||||
return 0 if entry_obj.nil?
|
return 0.0 if entry_obj.nil?
|
||||||
page / entry_obj.pages
|
page / entry_obj.pages
|
||||||
end
|
end
|
||||||
def load_percetage(username)
|
def load_percetage(username)
|
||||||
return 0 if @entries.empty?
|
return 0.0 if @entries.empty?
|
||||||
read_pages = total_pages = 0
|
read_pages = total_pages = 0
|
||||||
@entries.each do |e|
|
@entries.each do |e|
|
||||||
read_pages += load_progress username, e.title
|
read_pages += load_progress username, e.title
|
||||||
|
|||||||
@@ -249,6 +249,7 @@ module MangaDex
|
|||||||
|
|
||||||
class Downloader
|
class Downloader
|
||||||
property stopped = false
|
property stopped = false
|
||||||
|
@downloading = false
|
||||||
|
|
||||||
def initialize(@queue : Queue, @api : API, @library_path : String,
|
def initialize(@queue : Queue, @api : API, @library_path : String,
|
||||||
@wait_seconds : Int32, @retries : Int32,
|
@wait_seconds : Int32, @retries : Int32,
|
||||||
@@ -258,7 +259,7 @@ module MangaDex
|
|||||||
spawn do
|
spawn do
|
||||||
loop do
|
loop do
|
||||||
sleep 1.second
|
sleep 1.second
|
||||||
next if @stopped
|
next if @stopped || @downloading
|
||||||
begin
|
begin
|
||||||
job = @queue.pop
|
job = @queue.pop
|
||||||
next if job.nil?
|
next if job.nil?
|
||||||
@@ -271,7 +272,7 @@ module MangaDex
|
|||||||
end
|
end
|
||||||
|
|
||||||
private def download(job : Job)
|
private def download(job : Job)
|
||||||
@stopped = true
|
@downloading = true
|
||||||
@queue.set_status JobStatus::Downloading, job
|
@queue.set_status JobStatus::Downloading, job
|
||||||
begin
|
begin
|
||||||
chapter = @api.get_chapter(job.id)
|
chapter = @api.get_chapter(job.id)
|
||||||
@@ -281,7 +282,7 @@ module MangaDex
|
|||||||
unless e.message.nil?
|
unless e.message.nil?
|
||||||
@queue.add_message e.message.not_nil!, job
|
@queue.add_message e.message.not_nil!, job
|
||||||
end
|
end
|
||||||
@stopped = false
|
@downloading = false
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@queue.set_pages chapter.pages.size, job
|
@queue.set_pages chapter.pages.size, job
|
||||||
@@ -346,7 +347,7 @@ module MangaDex
|
|||||||
else
|
else
|
||||||
@queue.set_status JobStatus::MissingPages, job
|
@queue.set_status JobStatus::MissingPages, job
|
||||||
end
|
end
|
||||||
@stopped = false
|
@downloading = false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@ require "./context"
|
|||||||
require "./mangadex/*"
|
require "./mangadex/*"
|
||||||
require "option_parser"
|
require "option_parser"
|
||||||
|
|
||||||
VERSION = "0.2.3"
|
VERSION = "0.2.4"
|
||||||
|
|
||||||
config_path = nil
|
config_path = nil
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -33,6 +33,7 @@ class MainRouter < Router
|
|||||||
env.redirect "/login"
|
env.redirect "/login"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
get "/" do |env|
|
get "/" do |env|
|
||||||
titles = @context.library.titles
|
titles = @context.library.titles
|
||||||
username = get_username env
|
username = get_username env
|
||||||
@@ -47,8 +48,6 @@ class MainRouter < Router
|
|||||||
username = get_username env
|
username = get_username env
|
||||||
percentage = title.entries.map { |e|
|
percentage = title.entries.map { |e|
|
||||||
title.load_percetage username, e.title }
|
title.load_percetage username, e.title }
|
||||||
titles_percentage = title.titles.map { |t|
|
|
||||||
title.load_percetage username, t.title }
|
|
||||||
layout "title"
|
layout "title"
|
||||||
rescue e
|
rescue e
|
||||||
@context.error e
|
@context.error e
|
||||||
|
|||||||
+5
-3
@@ -27,16 +27,16 @@
|
|||||||
<div class="uk-card uk-card-default">
|
<div class="uk-card uk-card-default">
|
||||||
<div class="uk-card-media-top">
|
<div class="uk-card-media-top">
|
||||||
<%- if t.entries.size > 0 -%>
|
<%- if t.entries.size > 0 -%>
|
||||||
<img src="<%= t.entries[0].cover_url %>" alt="">
|
<img data-src="<%= t.entries[0].cover_url %>" data-width data-height alt="" uk-img>
|
||||||
<%- else -%>
|
<%- else -%>
|
||||||
<img src="/img/icon.png" alt="">
|
<img data-src="/img/icon.png" data-width data-height alt="" uk-img>
|
||||||
<%- end -%>
|
<%- end -%>
|
||||||
</div>
|
</div>
|
||||||
<div class="uk-card-body">
|
<div class="uk-card-body">
|
||||||
<%- if t.entries.size > 0 -%>
|
<%- if t.entries.size > 0 -%>
|
||||||
<div class="uk-card-badge uk-label"><%= (percentage[i] * 100).round(1) %>%</div>
|
<div class="uk-card-badge uk-label"><%= (percentage[i] * 100).round(1) %>%</div>
|
||||||
<%- end -%>
|
<%- end -%>
|
||||||
<h3 class="uk-card-title break-word"><%= t.title %></h3>
|
<h3 class="uk-card-title break-word" data-title="<%= t.title.gsub("\"", """) %>"><%= t.title %></h3>
|
||||||
<p><%= t.size %> entries</p>
|
<p><%= t.size %> entries</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -46,6 +46,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<% content_for "script" do %>
|
<% content_for "script" do %>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jQuery.dotdotdot/4.0.11/dotdotdot.js"></script>
|
||||||
|
<script src="/js/dots.js"></script>
|
||||||
<script src="/js/search.js"></script>
|
<script src="/js/search.js"></script>
|
||||||
<script src="/js/sort-items.js"></script>
|
<script src="/js/sort-items.js"></script>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -10,10 +10,11 @@
|
|||||||
<link rel="stylesheet" href="/css/mango.css" />
|
<link rel="stylesheet" href="/css/mango.css" />
|
||||||
<script defer src="/js/fontawesome.min.js"></script>
|
<script defer src="/js/fontawesome.min.js"></script>
|
||||||
<script defer src="/js/solid.min.js"></script>
|
<script defer src="/js/solid.min.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
|
||||||
|
<script src="/js/theme.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<script src="/js/theme.js"></script>
|
|
||||||
<div class="uk-offcanvas-content">
|
<div class="uk-offcanvas-content">
|
||||||
<div class="uk-navbar-container uk-navbar-transparent" uk-navbar="uk-navbar">
|
<div class="uk-navbar-container uk-navbar-transparent" uk-navbar="uk-navbar">
|
||||||
<div id="mobile-nav" uk-offcanvas="overlay: true">
|
<div id="mobile-nav" uk-offcanvas="overlay: true">
|
||||||
@@ -59,7 +60,9 @@
|
|||||||
<%= content %>
|
<%= content %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
|
<script>
|
||||||
|
setTheme(getTheme());
|
||||||
|
</script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/uikit@3.3.1/dist/js/uikit.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/uikit@3.3.1/dist/js/uikit.min.js"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/uikit@3.3.1/dist/js/uikit-icons.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/uikit@3.3.1/dist/js/uikit-icons.min.js"></script>
|
||||||
|
|
||||||
|
|||||||
+9
-9
@@ -31,21 +31,18 @@
|
|||||||
</div>
|
</div>
|
||||||
<div id="item-container" class="uk-child-width-1-4@m uk-child-width-1-2" uk-grid>
|
<div id="item-container" class="uk-child-width-1-4@m uk-child-width-1-2" uk-grid>
|
||||||
<%- title.titles.each_with_index do |t, i| -%>
|
<%- title.titles.each_with_index do |t, i| -%>
|
||||||
<div class="item" data-mtime="<%= t.mtime.to_unix %>" data-progress="<%= titles_percentage[i] %>">
|
<div class="item" data-mtime="<%= t.mtime.to_unix %>" data-progress="0.0">
|
||||||
<a class="acard" href="/book/<%= t.id %>">
|
<a class="acard" href="/book/<%= t.id %>">
|
||||||
<div class="uk-card uk-card-default">
|
<div class="uk-card uk-card-default">
|
||||||
<div class="uk-card-media-top">
|
<div class="uk-card-media-top">
|
||||||
<%- if t.entries.size > 0 -%>
|
<%- if t.entries.size > 0 -%>
|
||||||
<img src="<%= t.entries[0].cover_url %>" alt="">
|
<img data-src="<%= t.entries[0].cover_url %>" data-width data-height alt="" uk-img>
|
||||||
<%- else -%>
|
<%- else -%>
|
||||||
<img src="/img/icon.png" alt="">
|
<img data-src="/img/icon.png" data-width data-height alt="" uk-img>
|
||||||
<%- end -%>
|
<%- end -%>
|
||||||
</div>
|
</div>
|
||||||
<div class="uk-card-body">
|
<div class="uk-card-body">
|
||||||
<%- if t.entries.size > 0 -%>
|
<h3 class="uk-card-title break-word" data-title="<%= t.title.gsub("\"", """) %>"><%= t.title %></h3>
|
||||||
<div class="uk-card-badge uk-label"><%= (titles_percentage[i] * 100).round(1) %>%</div>
|
|
||||||
<%- end -%>
|
|
||||||
<h3 class="uk-card-title break-word"><%= t.title %></h3>
|
|
||||||
<p><%= t.size %> entries</p>
|
<p><%= t.size %> entries</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -57,11 +54,12 @@
|
|||||||
<a class="acard">
|
<a class="acard">
|
||||||
<div class="uk-card uk-card-default" onclick="showModal("<%= e.encoded_path %>", '<%= e.pages %>', <%= (percentage[i] * 100).round(1) %>, "<%= title.encoded_title %>", "<%= e.encoded_title %>", '<%= e.title_id %>', '<%= e.id %>')">
|
<div class="uk-card uk-card-default" onclick="showModal("<%= e.encoded_path %>", '<%= e.pages %>', <%= (percentage[i] * 100).round(1) %>, "<%= title.encoded_title %>", "<%= e.encoded_title %>", '<%= e.title_id %>', '<%= e.id %>')">
|
||||||
<div class="uk-card-media-top">
|
<div class="uk-card-media-top">
|
||||||
<img src="<%= e.cover_url %>" alt="">
|
<img data-src="<%= e.cover_url %>" alt="" data-width data-height uk-img>
|
||||||
</div>
|
</div>
|
||||||
<div class="uk-card-body">
|
<div class="uk-card-body">
|
||||||
<div class="uk-card-badge uk-label"><%= (percentage[i] * 100).round(1) %>%</div>
|
<div class="uk-card-badge uk-label"><%= (percentage[i] * 100).round(1) %>%</div>
|
||||||
<h3 class="uk-card-title"><%= e.title %></h3>
|
<h3 class="uk-card-title break-word" data-title="<%= e.title.gsub("\"", """) %>"><%= e.title %></h3>
|
||||||
|
<p><%= e.pages %> pages</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
@@ -93,6 +91,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<% content_for "script" do %>
|
<% content_for "script" do %>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jQuery.dotdotdot/4.0.11/dotdotdot.js"></script>
|
||||||
|
<script src="/js/dots.js"></script>
|
||||||
<script src="/js/alert.js"></script>
|
<script src="/js/alert.js"></script>
|
||||||
<script src="/js/title.js"></script>
|
<script src="/js/title.js"></script>
|
||||||
<script src="/js/search.js"></script>
|
<script src="/js/search.js"></script>
|
||||||
|
|||||||
Reference in New Issue
Block a user