From cc660229af797f32e475d6b89214df143bd41144 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Fri, 1 Dec 2023 09:19:10 +0100 Subject: [PATCH] working on lite variant of nudus-* --- .gitignore | 13 +- docs/source/features/mediaplayer.md | 17 + docs/source/variants.md | 6 + resources/rssguard.qrc | 3 + .../nudus-base/lite_html_enclosure_every.html | 1 + .../nudus-base/lite_html_single_message.html | 15 + .../nudus-base/lite_html_style_base.scss | 28 ++ resources/skins/nudus-light/html_style.css | 297 +++++++----------- .../skins/nudus-light/lite_html_style.css | 25 ++ .../skins/nudus-light/lite_html_style.scss | 7 + .../qtextbrowser/textbrowserviewer.cpp | 2 + 11 files changed, 218 insertions(+), 196 deletions(-) create mode 100644 docs/source/features/mediaplayer.md create mode 100644 docs/source/variants.md create mode 100644 resources/skins/nudus-base/lite_html_enclosure_every.html create mode 100644 resources/skins/nudus-base/lite_html_single_message.html create mode 100644 resources/skins/nudus-base/lite_html_style_base.scss create mode 100644 resources/skins/nudus-light/lite_html_style.css create mode 100644 resources/skins/nudus-light/lite_html_style.scss diff --git a/.gitignore b/.gitignore index c4aab041b..906aa8dd9 100755 --- a/.gitignore +++ b/.gitignore @@ -1,32 +1,23 @@ -# Compiled Object files. *.slo *.lo *.o *.obj - -# Compiled Dynamic libraries. *.so *.dylib *.dll - -# Compiled Static libraries. *.lai *.la *.a *.lib - -# Executables. *.exe *.out *.app - -# Other files. *.autosave *.user* localization/*qm *.TMP resources/skins/*/*.map - -# Build directory. +aqtinstall.log +.sass-cache build-dir/ docs/build \ No newline at end of file diff --git a/docs/source/features/mediaplayer.md b/docs/source/features/mediaplayer.md new file mode 100644 index 000000000..008031237 --- /dev/null +++ b/docs/source/features/mediaplayer.md @@ -0,0 +1,17 @@ +Media Player +============ +RSS Guard offers some abilities everyone would expect from typical podcast client. It offers built-in media player on some platforms: +* All[^1] [non-`lite`](../variants) builds offer `libmpv`-based media player which supports almost all features offered by `libmpv`, including keyboar d/mouse navigation, on-screen controller and custom configuration files loading. At this point. Also, `yt-dlp` is deployed on some[^2] platforms which allows comfortable Youtube videos playback. +* All [`lite`](../variants) include more basic media player based on `QtMultimedia` backend. This backend is usually itself based on `ffmpeg` so it can play fairly wide range of media formats. + +[^1]: At this point, precompiled binaries for Mac OS X do not have this backend enabled and rely on `QtMultimedia` backend instead. +[^2]: `yt-dlp` is contained in binaries for Windows. For other operating systems, I recommend to install `yt-dlp` or `youtube-dl` system-wide and add it to your `PATH` environment variable. Also, custom path to the tool can be tweaked in `mpv.conf`. + +## Usage +This feature is available for each hyperlink URL. You can either right-click any link in embedded article/web browser or you can use `Articles -> Play in media player` menu item. + +## Configuration +See `Settings -> Media player` configuration section in RSS Guard. User data [placeholder](userdata) is supported. + +## `libmpv` Backend +Note that this backend does support full `mpv` configuration mechanism. You can set path to custom configuration folder in settings (see above). If you select empty folder, then RSS Guard automatically copies sample configuration files into it. \ No newline at end of file diff --git a/docs/source/variants.md b/docs/source/variants.md new file mode 100644 index 000000000..fbcb4ef74 --- /dev/null +++ b/docs/source/variants.md @@ -0,0 +1,6 @@ +Variants +======== +RSS Guard is distributed in two flavours: +* Full package with `QtWebEngine`-based bundled article viewer: This variant displays articles with their full formatting and layout in embedded Chromium-based web browser. This variant of RSS Guard should be okay for everyone. Also, installation packages are relatively big. Also, this RSS Guard flavor offers more powerful [media player](features/mediaplayer). + +* Lite package with simple text-based article viewer: This variant displays article in a much simpler and much more lightweight web viewer component. All packages of this variant have `lite` keyword in their names. This flavor of RSS Guard does NOT have a JavaScript support and is meant for people who value their privacy. Also, it offers more limited media player. \ No newline at end of file diff --git a/resources/rssguard.qrc b/resources/rssguard.qrc index 551ec4d09..2a2e78e7c 100644 --- a/resources/rssguard.qrc +++ b/resources/rssguard.qrc @@ -83,6 +83,8 @@ skins/nudus-base/html_enclosure_image.html skins/nudus-base/html_single_message.html skins/nudus-base/html_wrapper.html + skins/nudus-base/lite_html_enclosure_every.html + skins/nudus-base/lite_html_single_message.html skins/nudus-dark/html_wrapper.html skins/nudus-dark/html_style.css @@ -92,6 +94,7 @@ skins/nudus-light/html_style.css skins/nudus-light/metadata.xml skins/nudus-light/qt_style.qss + skins/nudus-light/lite_html_style.css initial_feeds/feeds-en_US.opml diff --git a/resources/skins/nudus-base/lite_html_enclosure_every.html b/resources/skins/nudus-base/lite_html_enclosure_every.html new file mode 100644 index 000000000..5436edb38 --- /dev/null +++ b/resources/skins/nudus-base/lite_html_enclosure_every.html @@ -0,0 +1 @@ + %2%3 \ No newline at end of file diff --git a/resources/skins/nudus-base/lite_html_single_message.html b/resources/skins/nudus-base/lite_html_single_message.html new file mode 100644 index 000000000..a0de106e0 --- /dev/null +++ b/resources/skins/nudus-base/lite_html_single_message.html @@ -0,0 +1,15 @@ +
+ +
+
%7
+ %2 +

%1%6  URL

+ %5 +
+ +
+ +
+%4 +
+
\ No newline at end of file diff --git a/resources/skins/nudus-base/lite_html_style_base.scss b/resources/skins/nudus-base/lite_html_style_base.scss new file mode 100644 index 000000000..ef4522001 --- /dev/null +++ b/resources/skins/nudus-base/lite_html_style_base.scss @@ -0,0 +1,28 @@ +body, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +hr, +dl, +dd, +ol, +ul, +figure { + margin: 0; + padding: 0; +} + +body { + background-color: $col_back; + color: $col_front; +} + +a { + color: $col_link; +} \ No newline at end of file diff --git a/resources/skins/nudus-light/html_style.css b/resources/skins/nudus-light/html_style.css index d04d749ec..27ecf833f 100644 --- a/resources/skins/nudus-light/html_style.css +++ b/resources/skins/nudus-light/html_style.css @@ -1,15 +1,13 @@ @charset "UTF-8"; * { font-family: inherit; - font-size: inherit; -} + font-size: inherit; } body, h1, h2, h3, h4, h5, h6, p, blockquote, pre, hr, dl, dd, ol, ul, figure { margin: 0; - padding: 0; -} + padding: 0; } body { background-color: #FBFBFB; @@ -19,148 +17,115 @@ body { -webkit-font-feature-settings: "kern" 1; font-feature-settings: "kern" 1; font-kerning: normal; - min-height: 100vh; -} + min-height: 100vh; } ::selection { background-color: #5D88D2; - text-shadow: none; -} + text-shadow: none; } h1, h2, h3, h4, h5, h6, p, blockquote, pre, ul, ol, dl, figure, details { - margin-bottom: 10px; -} + margin-bottom: 10px; } hr { background-color: #CFCFCF; border: none; display: block; height: 2px; - margin: 10px 0; -} + margin: 10px 0; } h1, h2, h3, h4, h5, h6 { - font-weight: 600 !important; -} + font-weight: 600 !important; } h1 { - font-size: 1.25rem !important; -} + font-size: 1.25rem !important; } h2 { - font-size: 1.20rem !important; -} + font-size: 1.20rem !important; } h3 { - font-size: 1.15rem !important; -} + font-size: 1.15rem !important; } h4 { - font-size: 1.1rem !important; -} + font-size: 1.1rem !important; } h5 { - font-size: 1rem !important; -} + font-size: 1rem !important; } h6 { - font-size: .95rem !important; -} + font-size: .95rem !important; } b { - font-weight: bold !important; -} + font-weight: bold !important; } i { - font-style: italic !important; -} + font-style: italic !important; } strong { - font-weight: 800 !important; -} + font-weight: 800 !important; } em { - font-style: oblique !important; -} + font-style: oblique !important; } mark { - background-color: #FFECCC; -} + background-color: #FFECCC; } sub, sup { - font-size: .8rem !important; -} + font-size: .8rem !important; } small { - font-size: .9rem !important; -} + font-size: .9rem !important; } abbr { cursor: help; font-style: italic !important; - font-weight: 100 !important; -} + font-weight: 100 !important; } q { - font-style: italic !important; -} -q::before { - content: '“'; -} -q::after { - content: '”'; -} + font-style: italic !important; } + q::before { + content: '“'; } + q::after { + content: '”'; } time { - font-weight: 450 !important; -} + font-weight: 450 !important; } var { font-style: oblique !important; - font-weight: 500 !important; -} + font-weight: 500 !important; } a { - color: #5D88D2; -} -a:hover { - text-decoration: none; -} -a:focus { - box-shadow: none; - outline: none; -} + color: #5D88D2; } + a:hover { + text-decoration: none; } + a:focus { + box-shadow: none; + outline: none; } cite { font-style: italic !important; - font-weight: bold !important; -} + font-weight: bold !important; } figure { - max-width: 100%; -} + max-width: 100%; } figure > img { - display: block; -} + display: block; } figcaption { - font-size: .8rem !important; -} + font-size: .8rem !important; } blockquote { border-left: 0.3em solid #CFCFCF; margin-left: 0; - padding: 0 10px; -} -blockquote, -blockquote p { - color: #343434; -} + padding: 0 10px; } + blockquote, + blockquote p { + color: #343434; } pre, code { @@ -168,14 +133,12 @@ code { border-radius: 0.1em; color: #343434; font-family: monospace; - font-size: .95rem !important; -} + font-size: .95rem !important; } code { background-color: #F1F1F1; padding: 0 .25em; - word-break: break-word; -} + word-break: break-word; } pre { background-color: #F1F1F1; @@ -183,16 +146,14 @@ pre { padding: 7px 13px; tab-size: 2; white-space: pre !important; - width: unset !important; -} -pre > code { - background-color: unset; - border: none; - color: unset; - padding-right: 0; - padding-left: 0; - tab-size: 2; -} + width: unset !important; } + pre > code { + background-color: unset; + border: none; + color: unset; + padding-right: 0; + padding-left: 0; + tab-size: 2; } kbd { background: #F1F1F1; @@ -201,8 +162,7 @@ kbd { border-radius: 0.1em; box-shadow: 0 2px 4px #ececec, inset 0 1px #FBFBFB; font-size: .9rem !important; - padding: .1em .4em .2em .4em; -} + padding: .1em .4em .2em .4em; } select { background-color: #F1F1F1; @@ -210,138 +170,105 @@ select { border-radius: 0.1em; color: #000000; padding: .04em .25em; - width: 100%; -} -select:focus { - box-shadow: none; - outline: none; - background-color: #FBFBFB; -} -select > option { - background-color: #FBFBFB; -} + width: 100%; } + select:focus { + box-shadow: none; + outline: none; + background-color: #FBFBFB; } + select > option { + background-color: #FBFBFB; } table { border-collapse: collapse; - width: 100% !important; -} + width: 100% !important; } li { - display: list-item; -} + display: list-item; } ul, ol { - padding-left: 1.5em; -} + padding-left: 1.5em; } ul { - list-style-type: disc; -} -ul li ul { - list-style-type: square; -} + list-style-type: disc; } + ul li ul { + list-style-type: square; } ol { - list-style-type: decimal; -} -ol li ol { - list-style-type: lower-roman; -} + list-style-type: decimal; } + ol li ol { + list-style-type: lower-roman; } img { - height: auto; -} + height: auto; } details { border: 1px solid #F1F1F1; border-radius: 0.1em; - padding: .5em .5em 0; -} -details > summary { - background-color: #F1F1F1; - border-radius: 0.09em; - cursor: pointer; - margin: -.5em -.5em 0; - padding-left: .5em; -} -details > summary:focus { - box-shadow: none; - outline: none; -} -details *:last-child { - margin-bottom: 0; -} + padding: .5em .5em 0; } + details > summary { + background-color: #F1F1F1; + border-radius: 0.09em; + cursor: pointer; + margin: -.5em -.5em 0; + padding-left: .5em; } + details > summary:focus { + box-shadow: none; + outline: none; } + details *:last-child { + margin-bottom: 0; } details[open] { border-color: #DEDEDE; - padding: .5em; -} -details[open] > summary { - border-bottom: 1px solid #DEDEDE; - border-radius: 0.09em 0.09em 0 0; - margin-bottom: .5em; -} + padding: .5em; } + details[open] > summary { + border-bottom: 1px solid #DEDEDE; + border-radius: 0.09em 0.09em 0 0; + margin-bottom: .5em; } iframe { max-width: 100%; height: auto; - width: auto; -} + width: auto; } a:focus, select:focus, summary:focus { background-color: #DEDEDE; - text-shadow: 0 -1px #FBFBFB; -} + text-shadow: 0 -1px #FBFBFB; } :target { - outline: 1px solid #5D88D2; -} + outline: 1px solid #5D88D2; } .rssguard-mwrapper { - padding: 10px !important; -} -.rssguard-mwrapper .rssguard-mhead .msmall, -.rssguard-mwrapper .rssguard-mhead .mlinks { - opacity: .8; -} -.rssguard-mwrapper .rssguard-mhead > h1 { - margin: 0; -} -.rssguard-mwrapper .rssguard-mhead .msmall { - font-size: .9em; -} -.rssguard-mwrapper .rssguard-mhead .mlinks .menc { - word-break: break-word; -} -.rssguard-mwrapper .rssguard-mhead .mlinks .mwrapurl { - display: inline-flex; -} -.rssguard-mwrapper .rssguard-mhead .mlinks .mwrapurl a[href=""], .rssguard-mwrapper .rssguard-mhead .mlinks .mwrapurl a[href=""] + span { - display: none; -} -.rssguard-mwrapper .rssguard-mbody img { - max-width: 450px !important; - max-height: unset !important; -} -@media only screen and (max-width: 800px) { + padding: 10px !important; } + .rssguard-mwrapper .rssguard-mhead .msmall, + .rssguard-mwrapper .rssguard-mhead .mlinks { + opacity: .8; } + .rssguard-mwrapper .rssguard-mhead > h1 { + margin: 0; } + .rssguard-mwrapper .rssguard-mhead .msmall { + font-size: .9em; } + .rssguard-mwrapper .rssguard-mhead .mlinks .menc { + word-break: break-word; } + .rssguard-mwrapper .rssguard-mhead .mlinks .mwrapurl { + display: inline-flex; } + .rssguard-mwrapper .rssguard-mhead .mlinks .mwrapurl a[href=""], .rssguard-mwrapper .rssguard-mhead .mlinks .mwrapurl a[href=""] + span { + display: none; } .rssguard-mwrapper .rssguard-mbody img { - max-width: 100% !important; - } -} + max-width: 450px !important; + max-height: unset !important; } + @media only screen and (max-width: 800px) { + .rssguard-mwrapper .rssguard-mbody img { + max-width: 100% !important; } } .rssguard-mbody { - word-break: break-word; -} + word-break: break-word; } table { - word-break: normal; -} + word-break: normal; } ::selection { - color: #F1F1F1; -} + color: #F1F1F1; } /*# sourceMappingURL=html_style.css.map */ diff --git a/resources/skins/nudus-light/lite_html_style.css b/resources/skins/nudus-light/lite_html_style.css new file mode 100644 index 000000000..2da6139a2 --- /dev/null +++ b/resources/skins/nudus-light/lite_html_style.css @@ -0,0 +1,25 @@ +body, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +hr, +dl, +dd, +ol, +ul, +figure { + margin: 0; + padding: 0; } + +body { + background-color: #FBFBFB; + color: #000000; } + +a { + color: #0f80f1; } diff --git a/resources/skins/nudus-light/lite_html_style.scss b/resources/skins/nudus-light/lite_html_style.scss new file mode 100644 index 000000000..3a375fdad --- /dev/null +++ b/resources/skins/nudus-light/lite_html_style.scss @@ -0,0 +1,7 @@ +@charset "utf-8"; + +$col_back: #FBFBFB !default; +$col_front: #000000 !default; +$col_link: #0f80f1 !default; + +@import "../nudus-base/lite_html_style_base"; \ No newline at end of file diff --git a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp index cb3f78538..7af0774e0 100644 --- a/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp +++ b/src/librssguard/gui/webviewers/qtextbrowser/textbrowserviewer.cpp @@ -38,6 +38,7 @@ TextBrowserViewer::TextBrowserViewer(QWidget* parent) setDocument(m_document.data()); // Apply master CSS. + /* QColor a_color = qApp->skins()->colorForModel(SkinEnums::PaletteColors::FgInteresting).value(); if (!a_color.isValid()) { @@ -45,6 +46,7 @@ TextBrowserViewer::TextBrowserViewer(QWidget* parent) } m_document.data()->setDefaultStyleSheet(QSL("a { color: %1; }").arg(a_color.name())); + */ /* m_document->setDefaultStyleSheet("p {"