Convert to QML
Signed-off-by: Juraj Oravec <jurajoravec@mailo.com>
@ -1,3 +1,7 @@
|
|||||||
|
2.0.0:
|
||||||
|
- Rewrite to QML
|
||||||
|
- Add Makefile build system support
|
||||||
|
|
||||||
1.1.0:
|
1.1.0:
|
||||||
- Update Readability.js
|
- Update Readability.js
|
||||||
- Add setting to change menu icon
|
- Add setting to change menu icon
|
||||||
|
35
Makefile
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
PROJECT = readability
|
||||||
|
VERSION = 2.0.0
|
||||||
|
|
||||||
|
FILES = $(PROJECT)/main.qml
|
||||||
|
FILES += $(PROJECT)/metadata.desktop
|
||||||
|
FILES += /LICENSE
|
||||||
|
FILES += $(PROJECT)/data/Call.js
|
||||||
|
FILES += $(PROJECT)/data/Readability.js
|
||||||
|
FILES += $(PROJECT)/data/Toolbar.js
|
||||||
|
FILES += $(PROJECT)/data/style.css
|
||||||
|
FILES += $(PROJECT)/data/icon-dark.png
|
||||||
|
FILES += $(PROJECT)/data/icon-light.png
|
||||||
|
|
||||||
|
IMAGES = $(PROJECT)/images/RM-close-hover.png
|
||||||
|
IMAGES += $(PROJECT)/images/RM-close.png
|
||||||
|
IMAGES += $(PROJECT)/images/RM-Delete-24x24.png
|
||||||
|
IMAGES += $(PROJECT)/images/RM-Minus-24x24.png
|
||||||
|
IMAGES += $(PROJECT)/images/RM-Plus-24x24.png
|
||||||
|
IMAGES += $(PROJECT)/images/RM-Type-Controls-24x24.png
|
||||||
|
IMAGES += $(PROJECT)/images/RM-Type-Controls-Arrow.svg
|
||||||
|
|
||||||
|
package: build
|
||||||
|
zip -X $(PROJECT)_v$(VERSION).zip $(FILES)
|
||||||
|
|
||||||
|
copy_styles:
|
||||||
|
@cp "$(PROJECT)/data/style.orig.css" "$(PROJECT)/data/style.css"
|
||||||
|
|
||||||
|
build: copy_styles
|
||||||
|
$(foreach IMG,$(IMAGES), \
|
||||||
|
$(shell sed -i "s|{$(shell basename "$(IMG)")}|data:$(shell mimetype -b "$(IMG)");base64,$(shell basenc --base64 --wrap=0 "$(IMG)")|g" "$(PROJECT)/data/style.css") \
|
||||||
|
)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm "$(PROJECT)/data/style.css"
|
||||||
|
rm "./$(PROJECT)_v$(VERSION).zip"
|
@ -1,7 +1,7 @@
|
|||||||
/* ============================================================
|
/* ============================================================
|
||||||
* Readability - plugin for Falkon
|
* Readability - plugin for Falkon
|
||||||
* Copyright (C) 2016 Jaroslav Bambas <jar.bambas@gmail.com>
|
* Copyright (C) 2016 Jaroslav Bambas <jar.bambas@gmail.com>
|
||||||
* Copyright (C) 2019 Juraj Oravec <sgd.orava@gmail.com>
|
* Copyright (C) 2019-2022 Juraj Oravec <jurajoravec@mailo.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1 +0,0 @@
|
|||||||
data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCiAgIC0gTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpcwogICAtIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cG9seWdvbiBvcGFjaXR5PSIwLjE1IiBwb2ludHM9IjE2LjU4MywwLjAxNSAxNi41NjksMCA0LjU4MywxMiAxNi41NjksMjQgMTYuNTgzLDIzLjk4NSIvPgogIDxwb2x5Z29uIGZpbGw9IiNmYmZiZmIiIHBvaW50cz0iMTYuNTc1LDEuMDIxIDE2LjU2MSwxLjAwOCA1LjU4MywxMiAxNi41NzcsMjMuMDA4IDE2LjU5MSwyMi45OTQgIi8+Cjwvc3ZnPg==
|
|
@ -1,7 +1,7 @@
|
|||||||
/* ============================================================
|
/* ============================================================
|
||||||
* Readability - plugin for Falkon
|
* Readability - plugin for Falkon
|
||||||
* Copyright (C) 2016 Jaroslav Bambas <jar.bambas@gmail.com>
|
* Copyright (C) 2016 Jaroslav Bambas <jar.bambas@gmail.com>
|
||||||
* Copyright (C) 2019 Juraj Oravec <sgd.orava@gmail.com>
|
* Copyright (C) 2019-2022 Juraj Oravec <jurajoravec@mailo.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
543
readability/data/style.orig.css
Normal file
@ -0,0 +1,543 @@
|
|||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
body {
|
||||||
|
padding: 64px 0;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 785px) {
|
||||||
|
body {
|
||||||
|
padding-top: 64px;
|
||||||
|
-moz-padding-end: 0;
|
||||||
|
padding-bottom: 64px;
|
||||||
|
-moz-padding-start: 51px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
body.loaded {
|
||||||
|
transition: color 0.4s, background-color 0.4s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container {
|
||||||
|
max-width: 40em;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.light,
|
||||||
|
.light-button {
|
||||||
|
color: #333333;
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark,
|
||||||
|
.dark-button {
|
||||||
|
color: #eeeeee;
|
||||||
|
background-color: #333333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sepia,
|
||||||
|
.sepia-button {
|
||||||
|
color: #333333;
|
||||||
|
background-color: #f0ece7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sans-serif,
|
||||||
|
.sans-serif-button,
|
||||||
|
.sans-serif .remove-button {
|
||||||
|
font-family: Helvetica, Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.serif,
|
||||||
|
.serif-button,
|
||||||
|
.serif .remove-button {
|
||||||
|
font-family: Georgia, "Times New Roman", serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.font-size1 {
|
||||||
|
font-size: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.font-size2 {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.font-size3 {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.font-size4 {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.font-size5 {
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.font-size6 {
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.font-size7 {
|
||||||
|
font-size: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.font-size8 {
|
||||||
|
font-size: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.font-size9 {
|
||||||
|
font-size: 26px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Loading/error message */
|
||||||
|
|
||||||
|
.message {
|
||||||
|
margin-top: 40px;
|
||||||
|
display: none;
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header */
|
||||||
|
|
||||||
|
.header {
|
||||||
|
text-align: start;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.domain {
|
||||||
|
font-size: 0.9em;
|
||||||
|
line-height: 1.48em;
|
||||||
|
padding-bottom: 4px;
|
||||||
|
font-family: Helvetica, Arial, sans-serif;
|
||||||
|
text-decoration: none;
|
||||||
|
border-bottom: 1px solid;
|
||||||
|
color: #0095dd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.light > .container > .header > .domain,
|
||||||
|
.sepia > .container > .header > .domain {
|
||||||
|
border-bottom-color: #333333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark > .container > .header > .domain {
|
||||||
|
border-bottom-color: #eeeeee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header > h1 {
|
||||||
|
font-size: 1.33em;
|
||||||
|
line-height: 1.25em;
|
||||||
|
width: 100%;
|
||||||
|
margin: 30px 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header > .credits {
|
||||||
|
font-size: 0.9em;
|
||||||
|
line-height: 1.48em;
|
||||||
|
margin: 0 0 30px 0;
|
||||||
|
padding: 0;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Content */
|
||||||
|
|
||||||
|
#moz-reader-content {
|
||||||
|
display: none;
|
||||||
|
font-size: 1em;
|
||||||
|
line-height: 1.6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content h1,
|
||||||
|
.content h2,
|
||||||
|
.content h3 {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#moz-reader-content h1 {
|
||||||
|
font-size: 1.33em;
|
||||||
|
line-height: 1.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#moz-reader-content h2 {
|
||||||
|
font-size: 1.1em;
|
||||||
|
line-height: 1.51em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#moz-reader-content h3 {
|
||||||
|
font-size: 1em;
|
||||||
|
line-height: 1.66em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content a {
|
||||||
|
text-decoration: underline;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content a,
|
||||||
|
.content a:visited,
|
||||||
|
.content a:hover,
|
||||||
|
.content a:active {
|
||||||
|
color: #0095dd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content * {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content p,
|
||||||
|
.content code,
|
||||||
|
.content pre,
|
||||||
|
.content blockquote,
|
||||||
|
.content ul,
|
||||||
|
.content ol,
|
||||||
|
.content li,
|
||||||
|
.content figure,
|
||||||
|
.content .wp-caption {
|
||||||
|
margin: 0 0 30px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content p > img:only-child,
|
||||||
|
.content p > a:only-child > img:only-child,
|
||||||
|
.content .wp-caption img,
|
||||||
|
.content figure img {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content img[moz-reader-center] {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#moz-reader-content .caption,
|
||||||
|
#moz-reader-content .wp-caption-text,
|
||||||
|
#moz-reader-content figcaption {
|
||||||
|
font-size: 0.9em;
|
||||||
|
line-height: 1.48em;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content code,
|
||||||
|
.content pre {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content blockquote {
|
||||||
|
padding: 0;
|
||||||
|
-moz-padding-start: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.light > .container > .content blockquote,
|
||||||
|
.sepia > .container > .content blockquote {
|
||||||
|
-moz-border-start: 2px solid #333333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark > .container > .content blockquote {
|
||||||
|
-moz-border-start: 2px solid #eeeeee;
|
||||||
|
}
|
||||||
|
.dark *::-moz-selection {
|
||||||
|
background-color: #FFFFFF;
|
||||||
|
color: #0095DD;
|
||||||
|
}
|
||||||
|
.dark a::-moz-selection {
|
||||||
|
color: #DD4800;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content ul,
|
||||||
|
.content ol {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content ul {
|
||||||
|
-moz-padding-start: 30px;
|
||||||
|
list-style: disc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content ol {
|
||||||
|
-moz-padding-start: 30px;
|
||||||
|
list-style: decimal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*======= Controls toolbar =======*/
|
||||||
|
|
||||||
|
.toolbar {
|
||||||
|
font-family: Helvetica, Arial, sans-serif;
|
||||||
|
position: fixed;
|
||||||
|
height: 100%;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
background-color: #fbfbfb;
|
||||||
|
-moz-user-select: none;
|
||||||
|
border-right: 1px solid #b5b5b5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
display: block;
|
||||||
|
background-size: 24px 24px;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
color: #333;
|
||||||
|
background-color: #fbfbfb;
|
||||||
|
height: 40px;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbar .button {
|
||||||
|
width: 40px;
|
||||||
|
background-position: center;
|
||||||
|
margin-right: -1px;
|
||||||
|
border-top: 0;
|
||||||
|
border-left: 0;
|
||||||
|
border-right: 1px solid #b5b5b5;
|
||||||
|
border-bottom: 1px solid #c1c1c1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button[hidden] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown {
|
||||||
|
text-align: center;
|
||||||
|
list-style: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown li {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*======= Font style popup =======*/
|
||||||
|
|
||||||
|
.dropdown-popup {
|
||||||
|
min-width: 300px;
|
||||||
|
text-align: start;
|
||||||
|
position: absolute;
|
||||||
|
left: 48px; /* offset to account for toolbar width */
|
||||||
|
z-index: 1000;
|
||||||
|
background-color: #fbfbfb;
|
||||||
|
visibility: hidden;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px 1px 0 1px solid #b5b5b5;
|
||||||
|
box-shadow: 0 1px 12px #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-popup > hr {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.open > .dropdown-popup {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-arrow {
|
||||||
|
position: absolute;
|
||||||
|
top: 30px; /* offset arrow from top of popup */
|
||||||
|
left: -16px;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
background-image: url({RM-Type-Controls-Arrow.svg});
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#font-type-buttons,
|
||||||
|
#font-size-buttons,
|
||||||
|
#color-scheme-buttons {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
|
||||||
|
#font-type-buttons > button:first-child {
|
||||||
|
border-top-left-radius: 3px;
|
||||||
|
}
|
||||||
|
#font-type-buttons > button:last-child {
|
||||||
|
border-top-right-radius: 3px;
|
||||||
|
}
|
||||||
|
#color-scheme-buttons > button:first-child {
|
||||||
|
border-bottom-left-radius: 3px;
|
||||||
|
}
|
||||||
|
#color-scheme-buttons > button:last-child {
|
||||||
|
border-bottom-right-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#font-type-buttons > button,
|
||||||
|
#font-size-buttons > button,
|
||||||
|
#color-scheme-buttons > button {
|
||||||
|
text-align: center;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#font-type-buttons > button,
|
||||||
|
#font-size-buttons > button {
|
||||||
|
width: 50%;
|
||||||
|
background-color: transparent;
|
||||||
|
border-left: 1px solid #B5B5B5;
|
||||||
|
border-bottom: 1px solid #B5B5B5;
|
||||||
|
}
|
||||||
|
|
||||||
|
#color-scheme-buttons > button {
|
||||||
|
width: 33.33%;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#color-scheme-buttons > .dark-button {
|
||||||
|
margin-top: -1px;
|
||||||
|
height: 61px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#font-type-buttons > button:first-child,
|
||||||
|
#font-size-buttons > button:first-child {
|
||||||
|
border-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#font-type-buttons > button {
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 62px;
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#font-size-buttons > button,
|
||||||
|
#color-scheme-buttons > button {
|
||||||
|
height: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#font-type-buttons > button:active:hover,
|
||||||
|
#font-type-buttons > button.selected,
|
||||||
|
#color-scheme-buttons > button:active:hover,
|
||||||
|
#color-scheme-buttons > button.selected {
|
||||||
|
box-shadow: inset 0 -3px 0 0 #fc6420;
|
||||||
|
}
|
||||||
|
|
||||||
|
#font-type-buttons > button:active:hover,
|
||||||
|
#font-type-buttons > button.selected {
|
||||||
|
border-bottom: 1px solid #FC6420;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make the serif button content the same size as the sans-serif button content. */
|
||||||
|
#font-type-buttons > button > .description {
|
||||||
|
color: #666;
|
||||||
|
font-size: 12px;
|
||||||
|
margin-top: -5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Font sizes are different per-platform, so we need custom CSS to line them up. */
|
||||||
|
#font-type-buttons > .sans-serif-button > .name {
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#font-type-buttons > .sans-serif-button > .description {
|
||||||
|
margin-top: -8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#font-type-buttons > .serif-button > .name {
|
||||||
|
font-size: 70px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button:hover,
|
||||||
|
#font-size-buttons > button:hover,
|
||||||
|
#font-type-buttons > button:hover {
|
||||||
|
background-color: #ebebeb;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown.open,
|
||||||
|
.button:active,
|
||||||
|
#font-size-buttons > button:active,
|
||||||
|
#font-size-buttons > button.selected {
|
||||||
|
background-color: #dadada;
|
||||||
|
}
|
||||||
|
|
||||||
|
.minus-button,
|
||||||
|
.plus-button {
|
||||||
|
background-color: transparent;
|
||||||
|
border: 0;
|
||||||
|
background-size: 18px 18px;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
height: 64px;
|
||||||
|
background-color: #ebebeb;
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
padding: 12px 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
box-shadow: 0 3px 3px -3px rgba(0, 0, 0, 0.35) inset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sepia .footer {
|
||||||
|
background-color: #dedad4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.remove-button {
|
||||||
|
background-image: url({RM-Delete-24x24.png});
|
||||||
|
margin: 0 auto;
|
||||||
|
border: 1px solid #c1c1c1;
|
||||||
|
background-position: 10px 7px;
|
||||||
|
padding-left: 42px;
|
||||||
|
padding-right: 10px;
|
||||||
|
border-radius: 2px;
|
||||||
|
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*======= Toolbar icons =======*/
|
||||||
|
|
||||||
|
.close-button {
|
||||||
|
background-image: url({RM-close.png});
|
||||||
|
height: 68px;
|
||||||
|
background-position: center 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.close-button:hover {
|
||||||
|
background-image: url({RM-close-hover.png});
|
||||||
|
background-color: #d94141;
|
||||||
|
border-bottom: 1px solid #d94141;
|
||||||
|
border-right: 1px solid #d94141;
|
||||||
|
}
|
||||||
|
|
||||||
|
.close-button:hover:active {
|
||||||
|
background-image: url({RM-close-hover.png});
|
||||||
|
background-color: #AE2325;
|
||||||
|
border-bottom: 1px solid #AE2325;
|
||||||
|
border-right: 1px solid #AE2325;
|
||||||
|
}
|
||||||
|
|
||||||
|
.style-button {
|
||||||
|
background-image: url({RM-Type-Controls-24x24.png});
|
||||||
|
}
|
||||||
|
|
||||||
|
.minus-button {
|
||||||
|
background-image: url({RM-Minus-24x24.png});
|
||||||
|
}
|
||||||
|
|
||||||
|
.plus-button {
|
||||||
|
background-image: url({RM-Plus-24x24.png});
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
.toolbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.footer {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#close-hover {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
#close {
|
||||||
|
fill: #808080;
|
||||||
|
}
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
8
readability/images/RM-Type-Controls-Arrow.svg
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||||
|
<polygon opacity="0.15" points="16.583,0.015 16.569,0 4.583,12 16.569,24 16.583,23.985"/>
|
||||||
|
<polygon fill="#fbfbfb" points="16.575,1.021 16.561,1.008 5.583,12 16.577,23.008 16.591,22.994 "/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 510 B |
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.8 KiB |
317
readability/main.qml
Normal file
@ -0,0 +1,317 @@
|
|||||||
|
import org.kde.falkon 1.0 as Falkon
|
||||||
|
import QtQuick.Controls 2.3
|
||||||
|
import QtQuick.Layouts 1.0
|
||||||
|
import QtQuick 2.3
|
||||||
|
|
||||||
|
Falkon.PluginInterface {
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
id: g_readability
|
||||||
|
property string script
|
||||||
|
}
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
id: g_config
|
||||||
|
property string icon
|
||||||
|
property bool contextMenu
|
||||||
|
property string colorTheme
|
||||||
|
property string font
|
||||||
|
property int fontSize
|
||||||
|
}
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
id: g_jsObject
|
||||||
|
signal configChanged()
|
||||||
|
signal setColorTheme(string colorTheme)
|
||||||
|
signal setFont(string colorTheme)
|
||||||
|
signal setFontSize(string colorTheme)
|
||||||
|
}
|
||||||
|
|
||||||
|
function setColorTheme(colorTheme) {
|
||||||
|
var themes = ["light", "sepia", "dark"]
|
||||||
|
if (!themes.includes(colorTheme)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_config.colorTheme != colorTheme) {
|
||||||
|
g_config.colorTheme = colorTheme
|
||||||
|
|
||||||
|
configChanged()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setFont(font) {
|
||||||
|
var fonts = ["sans-serif", "serif"]
|
||||||
|
if (!fonts.includes(font)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_config.font != font) {
|
||||||
|
g_config.font = font
|
||||||
|
|
||||||
|
configChanged()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setFontSize(fontSize) {
|
||||||
|
if (fontSize < 1 && fontSize > 9) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_config.fontSize != fontSize) {
|
||||||
|
g_config.fontSize = fontSize
|
||||||
|
|
||||||
|
configChanged()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
init: function(state, settingsPath) {
|
||||||
|
g_config.icon = "dark"
|
||||||
|
g_config.contextMenu = true
|
||||||
|
g_config.colorTheme = "sepia"
|
||||||
|
g_config.font = "sans-serif"
|
||||||
|
g_config.fontSize = 5
|
||||||
|
|
||||||
|
loadSettings()
|
||||||
|
|
||||||
|
Falkon.ExternalJsObject.registerExtraObject({
|
||||||
|
id: 'readability',
|
||||||
|
object: g_jsObject
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
testPlugin: function() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
unload: function() {
|
||||||
|
}
|
||||||
|
|
||||||
|
Falkon.Settings {
|
||||||
|
id: settings
|
||||||
|
name: 'Readability'
|
||||||
|
}
|
||||||
|
|
||||||
|
function findCurrentTab() {
|
||||||
|
var window = Falkon.Windows.getCurrent()
|
||||||
|
for (var i = 0; i < window.tabs.length; ++i) {
|
||||||
|
if (window.tabs[i].current) {
|
||||||
|
return window.tabs[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeReadability() {
|
||||||
|
if (g_readability.script.length == 0) {
|
||||||
|
var scriptReadability = Falkon.FileUtils.readAllFileContents("data/Readability.js")
|
||||||
|
var scriptToolbar = Falkon.FileUtils.readAllFileContents("data/Toolbar.js")
|
||||||
|
var style = Falkon.FileUtils.readAllFileContents("data/style.css").toString().replace(/[\n\r]/g, '')
|
||||||
|
var scriptCall = Falkon.FileUtils.readAllFileContents("data/Call.js").toString()
|
||||||
|
|
||||||
|
scriptCall = scriptCall.replace("{readability.js}", scriptReadability)
|
||||||
|
scriptCall = scriptCall.replace("{toolbar.js}", scriptToolbar)
|
||||||
|
scriptCall = scriptCall.replace("{style.css}", style)
|
||||||
|
|
||||||
|
g_readability.script = scriptCall
|
||||||
|
}
|
||||||
|
|
||||||
|
var initConfigScript = "initConfig('" + g_config.colorTheme + "', '" + g_config.font + "', " + g_config.fontSize + ");"
|
||||||
|
|
||||||
|
var currentTab = findCurrentTab()
|
||||||
|
currentTab.execJavaScript(g_readability.script + initConfigScript)
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadSettings() {
|
||||||
|
g_config.icon = settings.value({key: 'icon', defaultValue: g_config.icon})
|
||||||
|
g_config.contextMenu = settings.value({key: 'showInContextMenu', defaultValue: g_config.contextMenu})
|
||||||
|
g_config.colorTheme = settings.value({key: 'colorTheme', defaultValue: g_config.colorTheme})
|
||||||
|
g_config.font = settings.value({key: 'font', defaultValue: g_config.font})
|
||||||
|
g_config.fontSize = settings.value({key: 'fontSize', defaultValue: g_config.fontSize})
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveSettings() {
|
||||||
|
settings.setValue({key: 'icon', value: g_config.icon})
|
||||||
|
settings.setValue({key: 'showInContextMenu', value: g_config.contextMenu})
|
||||||
|
settings.setValue({key: 'colorTheme', value: g_config.colorTheme})
|
||||||
|
settings.setValue({key: 'font', value: g_config.font})
|
||||||
|
settings.setValue({key: 'fontSize', value: g_config.fontSize})
|
||||||
|
|
||||||
|
if (!settings.sync()) {
|
||||||
|
console.log("Unable to store the settings!")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
function currentIcon() {
|
||||||
|
if (g_config.icon == 'light') {
|
||||||
|
return 'data/icon-light.png'
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 'data/icon-dark.png'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
populateWebViewMenu: function(menu, webHitTestResult) {
|
||||||
|
if (g_config.contextMenu) {
|
||||||
|
var action = menu.addAction({
|
||||||
|
text: i18n('Launch Readability'),
|
||||||
|
icon: currentIcon()
|
||||||
|
})
|
||||||
|
|
||||||
|
action.triggered.connect(function() {
|
||||||
|
makeReadability()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Falkon.BrowserAction {
|
||||||
|
name: i18n('Readability')
|
||||||
|
identity: 'readability-id'
|
||||||
|
title: i18n('Readimport QtQuick.Window 2.2ability')
|
||||||
|
toolTip: i18n('Launch Readability')
|
||||||
|
icon: currentIcon()
|
||||||
|
location: Falkon.BrowserAction.NavigationToolBar | Falkon.BrowserAction.StatusBar
|
||||||
|
onClicked: makeReadability()
|
||||||
|
|
||||||
|
popup: Pane {
|
||||||
|
id: mainPane
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
Label {
|
||||||
|
id: infoLabel
|
||||||
|
text: i18n("Trying to convert the page for easier reading.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
settingsWindow: Pane {
|
||||||
|
ColumnLayout {
|
||||||
|
RowLayout {
|
||||||
|
GroupBox {
|
||||||
|
Layout.alignment: Qt.AlignTop
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
ColumnLayout {
|
||||||
|
Layout.alignment: Qt.AlignTop
|
||||||
|
Label {
|
||||||
|
text: i18n('Menu icon')
|
||||||
|
}
|
||||||
|
RadioButton {
|
||||||
|
id: radioIconLight
|
||||||
|
text: i18n('Light')
|
||||||
|
checked: g_config.icon == 'light'
|
||||||
|
}
|
||||||
|
RadioButton {
|
||||||
|
id: radioIconDark
|
||||||
|
text: i18n('Dark')
|
||||||
|
checked: g_config.icon == 'dark'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GroupBox {
|
||||||
|
Layout.alignment: Qt.AlignTop
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
ColumnLayout {
|
||||||
|
Label {
|
||||||
|
text: i18n('Color Scheme')
|
||||||
|
}
|
||||||
|
RadioButton {
|
||||||
|
id: radioColorThemeLight
|
||||||
|
text: i18n('Light')
|
||||||
|
checked: g_config.colorTheme == 'light'
|
||||||
|
}
|
||||||
|
RadioButton {
|
||||||
|
id: radioColorThemeSepia
|
||||||
|
text: i18n('Sepia')
|
||||||
|
checked: g_config.colorTheme == 'sepia'
|
||||||
|
}
|
||||||
|
RadioButton {
|
||||||
|
id: radioColorThemeDark
|
||||||
|
text: i18n('Dark')
|
||||||
|
checked: g_config.colorTheme == 'dark'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GroupBox {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
ColumnLayout {
|
||||||
|
Label {
|
||||||
|
text: i18n('Font')
|
||||||
|
}
|
||||||
|
RadioButton {
|
||||||
|
id: radioFontSansSerif
|
||||||
|
text: i18n('Sans-Serif')
|
||||||
|
checked: g_config.font == 'sans-serif'
|
||||||
|
}
|
||||||
|
RadioButton {
|
||||||
|
id: radioFontSerif
|
||||||
|
text: i18n('Serif')
|
||||||
|
checked: g_config.font == 'serif'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Label {
|
||||||
|
text: i18n('Font size')
|
||||||
|
Layout.alignment: Qt.AlignLeft
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
ComboBox {
|
||||||
|
id: comboBoxFontSize
|
||||||
|
Layout.alignment: Qt.AlignRight
|
||||||
|
currentIndex: g_config.fontSize
|
||||||
|
model: ListModel {
|
||||||
|
id: model
|
||||||
|
ListElement { text: "10 px" }
|
||||||
|
ListElement { text: "12 px" }
|
||||||
|
ListElement { text: "14 px" }
|
||||||
|
ListElement { text: "16 px" }
|
||||||
|
ListElement { text: "18 px" }
|
||||||
|
ListElement { text: "20 px" }
|
||||||
|
ListElement { text: "22 px" }
|
||||||
|
ListElement { text: "24 px" }
|
||||||
|
ListElement { text: "26 px" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CheckBox {
|
||||||
|
id: checkboxContextMenu
|
||||||
|
checked: g_config.contextMenu
|
||||||
|
text: i18n('Show in context menu')
|
||||||
|
Layout.fillWidth: true;
|
||||||
|
}
|
||||||
|
Button {
|
||||||
|
id: button
|
||||||
|
text: i18n('Save')
|
||||||
|
hoverEnabled: true
|
||||||
|
Layout.fillWidth: true;
|
||||||
|
onClicked: function() {
|
||||||
|
function selectedColorTheme() {
|
||||||
|
if (radioColorThemeLight.checked) {return "light"}
|
||||||
|
if (radioColorThemeSepia.checked) {return "sepia"}
|
||||||
|
if (radioColorThemeDark.checked) {return "dark"}
|
||||||
|
return "dark"
|
||||||
|
}
|
||||||
|
|
||||||
|
g_config.icon = radioIconLight.checked ? "light" : "dark"
|
||||||
|
g_config.contextMenu = checkboxContextMenu.checkState == Qt.Checked
|
||||||
|
g_config.colorTheme = selectedColorTheme()
|
||||||
|
g_config.font = radioFontSansSerif.checked ? "sans-serif" : "serif"
|
||||||
|
g_config.fontSize = comboBoxFontSize.currentIndex
|
||||||
|
|
||||||
|
if (saveSettings()) {
|
||||||
|
button.text = i18n('Saved!')
|
||||||
|
} else {
|
||||||
|
button.text = i18n('Error occurred, try again!')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,9 +4,9 @@ Comment=Transform webpage to easy reading.
|
|||||||
|
|
||||||
Icon=data/icon-dark.png
|
Icon=data/icon-dark.png
|
||||||
Type=Service
|
Type=Service
|
||||||
X-Falkon-Type=Extension/Python
|
X-Falkon-Type=Extension/Qml
|
||||||
|
|
||||||
X-Falkon-Author=Juraj Oravec
|
X-Falkon-Author=Juraj Oravec
|
||||||
X-Falkon-Email=sgd.orava@gmail.com
|
X-Falkon-Email=jurajoravec@mailo.com
|
||||||
X-Falkon-Version=1.0.0
|
X-Falkon-Version=1.0.0
|
||||||
X-Falkon-Settings=true
|
X-Falkon-Settings=true
|
||||||
|