From 0c62e3e74d03a6b7e01606fe2cb2373564342417 Mon Sep 17 00:00:00 2001 From: Patrick Crandol Date: Tue, 4 Dec 2018 14:00:24 -0500 Subject: Update Readme.conf (#2158) * Update Readme.conf Add information in Readme.conf to hopefully stop bug reports about intended behavior. * Update README.md Co-Authored-By: pattems * Update README.md Co-Authored-By: pattems * Update README.md Co-Authored-By: pattems * Update README.md Co-Authored-By: pattems * Update Readme * Update Documentation Section * Add main Documentation link near top of Document * Make Documentation header a link * Fix spelling mistake I didn't catch * Apply suggestions from code review Co-Authored-By: pattems * Changes per Frenzie comments * Move non-disclaiming disclaimer * Resolve #2159 --- README.md | 49 ++++++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 21 deletions(-) (limited to 'README.md') diff --git a/README.md b/README.md index 2c0366077..1e86d9f57 100644 --- a/README.md +++ b/README.md @@ -4,15 +4,18 @@ * [Version française](README.fr.md) # FreshRSS -FreshRSS is a self-hosted RSS feed aggregator such as [Leed](http://leed.idleman.fr/) or [Kriss Feed](https://tontof.net/kriss/feed/). +FreshRSS is a self-hosted RSS feed aggregator like [Leed](http://leed.idleman.fr/) or [Kriss Feed](https://tontof.net/kriss/feed/). -It is at the same time lightweight, easy to work with, powerful and customizable. +It is lightweight, easy to work with, powerful, and customizable. It is a multi-user application with an anonymous reading mode. It supports custom tags, and [PubSubHubbub](https://github.com/pubsubhubbub/PubSubHubbub) for instant notifications from compatible Web sites. There is an API for (mobile) clients, and a [Command-Line Interface](cli/README.md). Finally, it supports [extensions](#extensions) for further tuning. +Feature requests, bug reports, and other contributions are welcome. The best way to contribute is to [open an issue on GitHub](https://github.com/FreshRSS/FreshRSS/issues). We are a friendly community. + + * Official website: https://freshrss.org * Demo: https://demo.freshrss.org/ * License: [GNU AGPL 3](https://www.gnu.org/licenses/agpl-3.0.html) @@ -27,37 +30,39 @@ See the [list of releases](../../releases). * For those willing to help testing or developing the latest features, [the dev branch](https://github.com/FreshRSS/FreshRSS/tree/dev) is waiting for you! # Disclaimer -This application was developed to fulfil personal needs primarily, and comes with absolutely no warranty. -Feature requests, bug reports, and other contributions are welcome. The best way is to [open an issue on GitHub](https://github.com/FreshRSS/FreshRSS/issues). -We are a friendly community. +FreshRSS comes with absolutely no warranty. # Requirements * Light server running Linux or Windows * It even works on Raspberry Pi 1 with response time under a second (tested with 150 feeds, 22k articles) * A web server: Apache2 (recommended), nginx, lighttpd (not tested on others) -* PHP 5.3.8+ (PHP 5.4+ recommended, and PHP 5.5+ for performance, and PHP 7 for even higher performance) +* PHP 5.3.8+ (PHP 5.4+ recommended, and PHP 5.5+ for performance, or PHP 7 for even higher performance) * Required extensions: [cURL](https://secure.php.net/curl), [DOM](https://secure.php.net/dom), [XML](https://secure.php.net/xml), [session](https://secure.php.net/session), [ctype](https://secure.php.net/ctype), and [PDO_MySQL](https://secure.php.net/pdo-mysql) or [PDO_SQLite](https://secure.php.net/pdo-sqlite) or [PDO_PGSQL](https://secure.php.net/pdo-pgsql) - * Recommended extensions: [JSON](https://secure.php.net/json), [GMP](https://secure.php.net/gmp) (for API access on platforms < 64 bits), [IDN](https://secure.php.net/intl.idn) (for Internationalized Domain Names), [mbstring](https://secure.php.net/mbstring) (for Unicode strings), [iconv](https://secure.php.net/iconv) (for charset conversion), [ZIP](https://secure.php.net/zip) (for import/export), [zlib](https://secure.php.net/zlib) (for compressed feeds) + * Recommended extensions: [JSON](https://secure.php.net/json), [GMP](https://secure.php.net/gmp) (for API access on 32-bit platforms), [IDN](https://secure.php.net/intl.idn) (for Internationalized Domain Names), [mbstring](https://secure.php.net/mbstring) (for Unicode strings), [iconv](https://secure.php.net/iconv) (for charset conversion), [ZIP](https://secure.php.net/zip) (for import/export), [zlib](https://secure.php.net/zlib) (for compressed feeds) * MySQL 5.5.3+ (recommended), or SQLite 3.7.4+, or PostgreSQL 9.2+ * A recent browser like Firefox / IceCat, Internet Explorer 11 / Edge, Chromium / Chrome, Opera, Safari. * Works on mobile + * All features may not be available on mobile or Internet Explorer 11 / Edge ![FreshRSS screenshot](docs/img/FreshRSS-screenshot.png) -# Documentation -* https://freshrss.github.io/FreshRSS/en/ +# [Documentation](https://freshrss.github.io/FreshRSS/en/) +* [User documentation](https://freshrss.github.io/FreshRSS/en/users/02_First_steps.html), where you can discover all the possibilities offered by FreshRSS +* [Administrator documentation](https://freshrss.github.io/FreshRSS/en/admins/01_Index.html) for detailed installation and maintenance related tasks +* [Developer documentation](https://freshrss.github.io/FreshRSS/en/developers/01_First_steps.html) to guide you in the source code of FreshRSS and to help you if you want to contribute +* [Contributor guidelines](https://freshrss.github.io/FreshRSS/en/contributing.md) for those who want to help improve FreshRSS # [Installation](https://freshrss.github.io/FreshRSS/en/admins/02_Installation.html) 1. Get FreshRSS with git or [by downloading the archive](https://github.com/FreshRSS/FreshRSS/archive/master.zip) -2. Dump the application on your server (expose only the `./p/` folder) -3. Add write access on `./data/` folder to the webserver user +2. Put the application somewhere on your server (expose only the `./p/` folder to the web) +3. Add write access to the `./data/` folder for the webserver user 4. Access FreshRSS with your browser and follow the installation process * or use the [Command-Line Interface](cli/README.md) -5. Everything should be working :) If you encounter any problem, feel free [contact us](https://github.com/FreshRSS/FreshRSS/issues). -6. Advanced configuration settings can be seen in [config.default.php](config.default.php) and modified in `data/config.php`. +5. Everything should be working :) If you encounter any problems, feel free to [contact us](https://github.com/FreshRSS/FreshRSS/issues). +6. Advanced configuration settings can be found in [config.default.php](config.default.php) and modified in `data/config.php`. 7. When using Apache, enable [`AllowEncodedSlashes`](https://httpd.apache.org/docs/trunk/mod/core.html#allowencodedslashes) for better compatibility with mobile clients. -More information about installation and server configuration can be found in [our documentation](https://freshrss.github.io/FreshRSS/en/admins/02_Installation.html). +More detailed information about installation and server configuration can be found in [our documentation](https://freshrss.github.io/FreshRSS/en/admins/02_Installation.html). ## Automated install * [![Docker](https://www.docker.com/sites/default/files/horizontal.png)](./Docker/) @@ -108,16 +113,16 @@ sudo chown -R :www-data . && sudo chmod -R g+r . && sudo chmod -R g+w ./data/ See more commands and git commands in the [Command-Line Interface documentation](cli/README.md). ## Access control -It is needed for the multi-user mode to limit access to FreshRSS. You can: -* use form authentication (needs JavaScript, and PHP 5.5+ recommended) -* use HTTP authentication supported by your web server +This is needed if you will be using the multi-user mode, to limit access to FreshRSS. Options Available: +* form authentication (needs JavaScript, and PHP 5.5+ recommended) +* HTTP authentication supported by your web server * See [Apache documentation](https://httpd.apache.org/docs/trunk/howto/auth.html) * In that case, create a `./p/i/.htaccess` file with a matching `.htpasswd` file. ## Automatic feed update * You can add a Cron job to launch the update script. Check the Cron documentation related to your distribution ([Debian/Ubuntu](https://help.ubuntu.com/community/CronHowto), [Red Hat/Fedora](https://fedoraproject.org/wiki/Administration_Guide_Draft/Cron), [Slackware](https://docs.slackware.com/fr:slackbook:process_control?#cron), [Gentoo](https://wiki.gentoo.org/wiki/Cron), [Arch Linux](https://wiki.archlinux.org/index.php/Cron)…). -It is a good idea to use the Web server user. +It is a good idea to run the cron job as the webserver user. For instance, if you want to run the script every hour: ``` @@ -132,12 +137,14 @@ Create `/etc/cron.d/FreshRSS` with: ``` -# Advices -* For a better security, expose only the `./p/` folder on the Web. +# Advice +* For better security, expose only the `./p/` folder to the Web. * Be aware that the `./data/` folder contains all personal data, so it is a bad idea to expose it. -* The `./constants.php` file defines access to application folder. If you want to customize your installation, every thing happens here. +* The `./constants.php` file defines access to the application folder. If you want to customize your installation, look here first. * If you encounter any problem, logs are accessible from the interface or manually in `./data/users/*/log*.txt` files. * The special folder `./data/users/_/` contains the part of the logs that are shared by all users. +* The date and time in the right-hand column is the date declared by the feed, not the time at which the article was received by FreshRSS, and it is not used for sorting. + * When importing a new feed, all of its articles will appear at the top of the feed list regardless of their declared date. # Backup -- cgit v1.2.3 From 478d3e6611e73974bd3b917c625bf0d099cbf123 Mon Sep 17 00:00:00 2001 From: Patrick Crandol Date: Wed, 12 Dec 2018 06:04:31 -0500 Subject: Decouple scrolling of feeds and articles (#2117) * Remove Sticky Kit Remove sticky-kit, as functionality is unsuitable for separate scrolling. * Remove sticky-kit load in main.js Further removing the sticky-kit kruft * Finish removal of references to Sticky-kit * CSS Changes to template for Independent Scrolling * Addition of JS and supporting CSS and html * More CSS fixes to establish expected behavior Should be able to scroll navbar without it being in sticky mode now. * Fix typo in main.js sortcut.js -> shortcut.js * Fix unexpected tree scrolling behavior * Change name of generic JS function * Improve sticky-aside * CSS changes in themes to accommodate independent Scroll In themes where .aside's width is not the standard 300px, .tree's width must be specified to be equal to .aside * Remove Sticky-Kit from README files * Updates to Sticky-Aside * Update Template to fix screwup * Make Recalculating height actually work * Let sidebar fill height if nav buttons aren't visible * Make accommodating for nav buttons actually work * update Swage theme for Independent Scroll feature * Integrate sticky_aside into main.js * Add Simple Scrollbar * Patch scrollbar color for themes with dark colored asides * Increase Visibility of scrollbar on Dark Themes * Improve async loading, events, and performance * CSS typo * Fix double scrollbar on mobile * Fix regression causing sticky to not be removed * No $ for non-jQuery variables * Fix strange condition + option for nice scrollbar * Initial attempt to use css sticky * Add stickyfill * make the correct element sticky * re-add incorrectly removed sidebar code * Continue fixing mistaken deletions * decrease frequency of recalc * use minified version of simple-scrollbar. * Load stickyfill instead of injecting * put recalc back where it belongs * re-remove script injector * remove padding bottom padding was causing the last item in the feed to be hidden under the nav buttons * Manual merge of css_scrollbar Add auto-detection of -webkit-scrollbar-thumb, otherwise fall back to simple-scrollbar.js * Fix Regression Sticky recalc is still needed when using css scrollbars * Replace method of closing dropdowns Changed from an overlay href to a javascript solution, for better compatibility * Remove Treepadding Treepadding was causing dropdown menus at the bottom of the tree to be obscured. * Undo unnecessary move of dropdown-target * Move Dropdown Handler to a sensibleish place * Fix light Scrollbar color not picking up on Firefox * Minor syntax * Minor Clarification of CSS/ patch BlueLagoon * Change logic for native WebKit scrollbar detection Fix https://github.com/FreshRSS/FreshRSS/pull/2117#issuecomment-444251419 Tested with Firefox 63, Firefox 65, Chrome 71, IE11, Edge 42 * Fixes for other views E.g. reader view * Cleaner way of generating hash for dropdowns * Make dropdown-toggle an actual toggle * Prepare for CSS Scrollbars Module Level 1 * Fix regression causing my labels dropdown not to appear * remove unneeded dropdown-close css rule * Re-apply some lost changes https://github.com/FreshRSS/FreshRSS/pull/2117/commits/3c509989e890b88852e52c67c1c5507d1e0bf28c * Add standard scrollbar compatibility E.g. Firefox 64+ * Make All dropdowns click-to-close * Remove BlueLagoon template * Try to fix Firefox https://github.com/FreshRSS/FreshRSS/pull/2117#discussion_r239539984 * Add CSS rules necessary for consistent function of scrollbar in Firefox * Use inheritance to determine width * Use overlay scrollbar where possible * Test Reduced Listener * Fix Firefox 62 And show subtle scrollbar even when not hovering * Add margin at bottom To allow opening the menus https://github.com/FreshRSS/FreshRSS/pull/2117#issuecomment-444571218 * Minor - tab correction * Spaces -> tabs * Remove unneeded inheritance * Fix indenting * Revert bad merge * Messy WIP to make dropdowns work * Style Cleanup * Break it down * Lets try a move-it move-it * Update p/scripts/main.js Co-Authored-By: pattems * Update p/themes/BlueLagoon/BlueLagoon.css Co-Authored-By: pattems * separate ALL THE THINGS * erroneous commas * and to or * removing double condition that doesn't do what I want * More breaking down * fix var * Fix variable name again * Remove magic number https://github.com/FreshRSS/FreshRSS/pull/2117#discussion_r240052598 * Suuuuper inelegant solution for dropdowns * lets try that again * Inelegant Fix For Dropdowns Now with 100% more working dropdowns * Make sidebar dropdowns work correctly? * Fix reversion * Make JS scrollbar always visible * Remove unneeded CSS Added early in this pull request, didn't get pulled out when it was obsolete * Fix CSS removal I missed * CSS comment update/consistency for dark themes * Clean Up Duplicate code * Make dropdowns properly hide Downside: Can no longer click on header/nav buttons to close * Strip unneeded if statement * jshint -W018 https://github.com/FreshRSS/FreshRSS/pull/2117#discussion_r240392851 * Half-reversion to old dropdown * make overlay href scale to sidebar width * remove init of nonexistent method * remove trailing tabs * move #close href where it belongs in index.phtml * Revert all changes to index.phtml * remove whitespace accidentally added in last commit * Move var's in init_column categories * Finish putting old style dropdowns back * Make CSS changes to use support statements * Cleanup Whitespace * re-add missing class * spaces -> tabs in main.js * tabs -> spaces css * Minor whitespace * Cleanup per @Alkarex * Second attempt to add bottom margin https://github.com/FreshRSS/FreshRSS/pull/2117#discussion_r240820901 * Fix error in IE11 * Simple-scrollbar color match for dark themes --- README.fr.md | 4 +- README.md | 6 +- app/layout/aside_feed.phtml | 3 +- p/scripts/jquery.sticky-kit.min.js | 9 --- p/scripts/main.js | 116 +++++++++++++++++++++++------------ p/scripts/simple-scrollbar.min.js | 2 + p/themes/BlueLagoon/BlueLagoon.css | 26 ++++++++ p/themes/Dark/dark.css | 25 ++++++++ p/themes/Flat/flat.css | 25 ++++++++ p/themes/Screwdriver/screwdriver.css | 25 ++++++++ p/themes/Swage/swage.css | 26 ++++++++ p/themes/Swage/swage.scss | 38 ++++++++++-- p/themes/base-theme/template.css | 99 +++++++++++++++++++++++++++--- 13 files changed, 338 insertions(+), 66 deletions(-) delete mode 100644 p/scripts/jquery.sticky-kit.min.js create mode 100644 p/scripts/simple-scrollbar.min.js (limited to 'README.md') diff --git a/README.fr.md b/README.fr.md index 312fbac45..a8a8f87ff 100644 --- a/README.fr.md +++ b/README.fr.md @@ -192,13 +192,13 @@ Tout client supportant une API de type Fever ; Sélection : * [php-http-304](https://alexandre.alapetite.fr/doc-alex/php-http-304/) * [jQuery](https://jquery.com/) * [lib_opml](https://github.com/marienfressinaud/lib_opml) -* [jQuery Plugin Sticky-Kit](https://leafo.net/sticky-kit/) * [keyboard_shortcuts](http://www.openjs.com/scripts/events/keyboard_shortcuts/) * [flotr2](http://www.humblesoftware.com/flotr2) -## Uniquement pour certaines options +## Uniquement pour certaines options ou configurations * [bcrypt.js](https://github.com/dcodeIO/bcrypt.js) * [phpQuery](https://github.com/phpquery/phpquery) +* [simple-scrollbar](https://github.com/buzinas/simple-scrollbar) ## Si les fonctions natives ne sont pas disponibles * [Services_JSON](https://pear.php.net/pepr/pepr-proposal-show.php?id=198) diff --git a/README.md b/README.md index 1e86d9f57..d6e13851e 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ FreshRSS comes with absolutely no warranty. More detailed information about installation and server configuration can be found in [our documentation](https://freshrss.github.io/FreshRSS/en/admins/02_Installation.html). -## Automated install +## Automated install * [![Docker](https://www.docker.com/sites/default/files/horizontal.png)](./Docker/) * [![YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=freshrss) * [![Cloudron](https://cloudron.io/img/button.svg)](https://cloudron.io/button.html?app=org.freshrss.cloudronapp) @@ -199,13 +199,13 @@ Supported clients are: * [php-http-304](https://alexandre.alapetite.fr/doc-alex/php-http-304/) * [jQuery](https://jquery.com/) * [lib_opml](https://github.com/marienfressinaud/lib_opml) -* [jQuery Plugin Sticky-Kit](https://leafo.net/sticky-kit/) * [keyboard_shortcuts](http://www.openjs.com/scripts/events/keyboard_shortcuts/) * [flotr2](http://www.humblesoftware.com/flotr2) -## Only for some options +## Only for some options or configurations * [bcrypt.js](https://github.com/dcodeIO/bcrypt.js) * [phpQuery](https://github.com/phpquery/phpquery) +* [simple-scrollbar](https://github.com/buzinas/simple-scrollbar) ## If native functions are not available * [Services_JSON](https://pear.php.net/pepr/pepr-proposal-show.php?id=198) diff --git a/app/layout/aside_feed.phtml b/app/layout/aside_feed.phtml index 7b1645ebd..73b200686 100644 --- a/app/layout/aside_feed.phtml +++ b/app/layout/aside_feed.phtml @@ -21,7 +21,7 @@
-
    + diff --git a/p/scripts/jquery.sticky-kit.min.js b/p/scripts/jquery.sticky-kit.min.js deleted file mode 100644 index e2a3c6de9..000000000 --- a/p/scripts/jquery.sticky-kit.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/* - Sticky-kit v1.1.2 | WTFPL | Leaf Corcoran 2015 | http://leafo.net -*/ -(function(){var b,f;b=this.jQuery||window.jQuery;f=b(window);b.fn.stick_in_parent=function(d){var A,w,J,n,B,K,p,q,k,E,t;null==d&&(d={});t=d.sticky_class;B=d.inner_scrolling;E=d.recalc_every;k=d.parent;q=d.offset_top;p=d.spacer;w=d.bottoming;null==q&&(q=0);null==k&&(k=void 0);null==B&&(B=!0);null==t&&(t="is_stuck");A=b(document);null==w&&(w=!0);J=function(a,d,n,C,F,u,r,G){var v,H,m,D,I,c,g,x,y,z,h,l;if(!a.data("sticky_kit")){a.data("sticky_kit",!0);I=A.height();g=a.parent();null!=k&&(g=g.closest(k)); -if(!g.length)throw"failed to find stick parent";v=m=!1;(h=null!=p?p&&a.closest(p):b("
    "))&&h.css("position",a.css("position"));x=function(){var c,f,e;if(!G&&(I=A.height(),c=parseInt(g.css("border-top-width"),10),f=parseInt(g.css("padding-top"),10),d=parseInt(g.css("padding-bottom"),10),n=g.offset().top+c+f,C=g.height(),m&&(v=m=!1,null==p&&(a.insertAfter(h),h.detach()),a.css({position:"",top:"",width:"",bottom:""}).removeClass(t),e=!0),F=a.offset().top-(parseInt(a.css("margin-top"),10)||0)-q, -u=a.outerHeight(!0),r=a.css("float"),h&&h.css({width:a.outerWidth(!0),height:u,display:a.css("display"),"vertical-align":a.css("vertical-align"),"float":r}),e))return l()};x();if(u!==C)return D=void 0,c=q,z=E,l=function(){var b,l,e,k;if(!G&&(e=!1,null!=z&&(--z,0>=z&&(z=E,x(),e=!0)),e||A.height()===I||x(),e=f.scrollTop(),null!=D&&(l=e-D),D=e,m?(w&&(k=e+u+c>C+n,v&&!k&&(v=!1,a.css({position:"fixed",bottom:"",top:c}).trigger("sticky_kit:unbottom"))),eb&&!v&&(c-=l,c=Math.max(b-u,c),c=Math.min(q,c),m&&a.css({top:c+"px"})))):e>F&&(m=!0,b={position:"fixed",top:c},b.width="border-box"===a.css("box-sizing")?a.outerWidth()+"px":a.width()+"px",a.css(b).addClass(t),null==p&&(a.after(h),"left"!==r&&"right"!==r||h.append(a)),a.trigger("sticky_kit:stick")),m&&w&&(null==k&&(k=e+u+c>C+n),!v&&k)))return v=!0,"static"===g.css("position")&&g.css({position:"relative"}), -a.css({position:"absolute",bottom:d,top:"auto"}).trigger("sticky_kit:bottom")},y=function(){x();return l()},H=function(){G=!0;f.off("touchmove",l);f.off("scroll",l);f.off("resize",y);b(document.body).off("sticky_kit:recalc",y);a.off("sticky_kit:detach",H);a.removeData("sticky_kit");a.css({position:"",bottom:"",top:"",width:""});g.position("position","");if(m)return null==p&&("left"!==r&&"right"!==r||a.insertAfter(h),h.remove()),a.removeClass(t)},f.on("touchmove",l),f.on("scroll",l),f.on("resize", -y),b(document.body).on("sticky_kit:recalc",y),a.on("sticky_kit:detach",H),setTimeout(l,0)}};n=0;for(K=this.length;n +var sidebar = document.getElementById('sidebar'); +var useJsScrollbar = true; +try { + /*jshint -W018 */ + useJsScrollbar = sidebar && !CSS.supports('scrollbar-color: auto') && + !(parseInt(getComputedStyle(sidebar, '::-webkit-scrollbar').width) < sidebar.offsetWidth); + /*jshint +W018 */ +} catch (ex) { +} +if (useJsScrollbar) { + inject_script('simple-scrollbar.min.js'); +} + +function sticky_recalc() { + var h = 0; + if ($nav_entries && $nav_entries.length > 0) { + h = $(window).height() - sidebar.getBoundingClientRect().top - $nav_entries.height(); + } else { + h = $(window).height() - sidebar.getBoundingClientRect().top; + } + if (h > 0) { + $(sidebar).height(h); + } +} + +function init_simple_scrollbar() { + if (!window.SimpleScrollbar) { + if (window.console) { + console.log('FreshRSS waiting for simple-scrollbar…'); + } + window.setTimeout(init_simple_scrollbar, 100); + } else { + SimpleScrollbar.initEl(sidebar); + } +} +var scrollTimeout; +function init_sticky_sidebar(){ + if (!sidebar) { + return; + } + if (useJsScrollbar) { + init_simple_scrollbar(); + } + $(window).scroll(function () { + if (scrollTimeout) { + clearTimeout(scrollTimeout); + scrollTimeout = null; + } + scrollTimeout = setTimeout(sticky_recalc, 200); + }); + window.onresize = sticky_recalc; +} function init_confirm_action() { $('body').on('click', '.confirm', function () { @@ -1536,7 +1576,6 @@ function init_beforeDOM() { return; } if (['normal', 'reader', 'global'].indexOf(context.current_view) >= 0) { - inject_script('jquery.sticky-kit.min.js'); init_normal(); } } @@ -1554,6 +1593,7 @@ function init_afterDOM() { $stream = $('#stream'); if ($stream.length > 0) { init_load_more($stream); + init_sticky_sidebar(); init_posts(); init_nav_entries(); init_dynamic_tags(); diff --git a/p/scripts/simple-scrollbar.min.js b/p/scripts/simple-scrollbar.min.js new file mode 100644 index 000000000..36b7df0b8 --- /dev/null +++ b/p/scripts/simple-scrollbar.min.js @@ -0,0 +1,2 @@ +// https://github.com/buzinas/simple-scrollbar +!function(t,e){"object"==typeof exports?module.exports=e(window,document):t.SimpleScrollbar=e(window,document)}(this,function(t,e){function s(t){Object.prototype.hasOwnProperty.call(t,"data-simple-scrollbar")||Object.defineProperty(t,"data-simple-scrollbar",{value:new o(t)})}function i(t,s){function i(t){var e=t.pageY-a;a=t.pageY,n(function(){s.el.scrollTop+=e/s.scrollRatio})}function r(){t.classList.remove("ss-grabbed"),e.body.classList.remove("ss-grabbed"),e.removeEventListener("mousemove",i),e.removeEventListener("mouseup",r)}var a;t.addEventListener("mousedown",function(s){return a=s.pageY,t.classList.add("ss-grabbed"),e.body.classList.add("ss-grabbed"),e.addEventListener("mousemove",i),e.addEventListener("mouseup",r),!1})}function r(t){for(this.target=t,this.direction=window.getComputedStyle(this.target).direction,this.bar='
    ',this.wrapper=e.createElement("div"),this.wrapper.setAttribute("class","ss-wrapper"),this.el=e.createElement("div"),this.el.setAttribute("class","ss-content"),"rtl"===this.direction&&this.el.classList.add("rtl"),this.wrapper.appendChild(this.el);this.target.firstChild;)this.el.appendChild(this.target.firstChild);this.target.appendChild(this.wrapper),this.target.insertAdjacentHTML("beforeend",this.bar),this.bar=this.target.lastChild,i(this.bar,this),this.moveBar(),this.el.addEventListener("scroll",this.moveBar.bind(this)),this.el.addEventListener("mouseenter",this.moveBar.bind(this)),this.target.classList.add("ss-container");var s=window.getComputedStyle(t);"0px"===s.height&&"0px"!==s["max-height"]&&(t.style.height=s["max-height"])}function a(){for(var t=e.querySelectorAll("*[ss-container]"),i=0;i=1?i.bar.classList.add("ss-hidden"):(i.bar.classList.remove("ss-hidden"),i.bar.style.cssText="height:"+Math.max(100*i.scrollRatio,10)+"%; top:"+i.el.scrollTop/e*100+"%;right:"+a+"px;")})}},e.addEventListener("DOMContentLoaded",a),r.initEl=s,r.initAll=a;var o=r;return o}); \ No newline at end of file diff --git a/p/themes/BlueLagoon/BlueLagoon.css b/p/themes/BlueLagoon/BlueLagoon.css index f167f2051..263764a9c 100644 --- a/p/themes/BlueLagoon/BlueLagoon.css +++ b/p/themes/BlueLagoon/BlueLagoon.css @@ -564,6 +564,32 @@ a.btn { color: #0090FF } +/*=== Scrollbar */ + +@supports (scrollbar-width: thin) { + #sidebar { + scrollbar-color: rgba(255, 255, 255, 0.05) rgba(0, 0, 0, 0.0); + } + #sidebar:hover { + scrollbar-color: rgba(255, 255, 255, 0.3) rgba(0, 0, 0, 0.0); + } +} +.ss-scroll { + background: rgba(255, 255, 255, 0.1); +} +.ss-container:hover .ss-scroll, +.ss-container:active .ss-scroll { + background: rgba(255, 255, 255, 0.3); +} +@supports not (scrollbar-width: thin) { + #sidebar::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.1); + } + #sidebar:hover::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.3); + } +} + /*=== STRUCTURE */ /*===============*/ /*=== Header */ diff --git a/p/themes/Dark/dark.css b/p/themes/Dark/dark.css index 31ff514a2..b8366caeb 100644 --- a/p/themes/Dark/dark.css +++ b/p/themes/Dark/dark.css @@ -502,6 +502,31 @@ a.btn { color: #888; } +/*=== Scrollbar */ +@supports (scrollbar-width: thin) { + #sidebar { + scrollbar-color: rgba(255, 255, 255, 0.05) rgba(0, 0, 0, 0.0); + } + #sidebar:hover { + scrollbar-color: rgba(255, 255, 255, 0.3) rgba(0, 0, 0, 0.0); + } +} +.ss-scroll { + background: rgba(255, 255, 255, 0.1); +} +.ss-container:hover .ss-scroll, +.ss-container:active .ss-scroll { + background: rgba(255, 255, 255, 0.3); +} +@supports not (scrollbar-width: thin) { + #sidebar::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.1); + } + #sidebar:hover::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.3); + } +} + /*=== STRUCTURE */ /*===============*/ /*=== Header */ diff --git a/p/themes/Flat/flat.css b/p/themes/Flat/flat.css index be047a394..176a541f7 100644 --- a/p/themes/Flat/flat.css +++ b/p/themes/Flat/flat.css @@ -505,6 +505,31 @@ a.btn { color: #fff; } +/*=== Scrollbar */ +@supports (scrollbar-width: thin) { + #sidebar { + scrollbar-color: rgba(255, 255, 255, 0.05) rgba(0, 0, 0, 0.0); + } + #sidebar:hover { + scrollbar-color: rgba(255, 255, 255, 0.3) rgba(0, 0, 0, 0.0); + } +} +.ss-scroll { + background: rgba(255, 255, 255, 0.1); +} +.ss-container:hover .ss-scroll, +.ss-container:active .ss-scroll { + background: rgba(255, 255, 255, 0.3); +} +@supports not (scrollbar-width: thin) { + #sidebar::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.1); + } + #sidebar:hover::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.3); + } +} + /*=== STRUCTURE */ /*===============*/ /*=== Header */ diff --git a/p/themes/Screwdriver/screwdriver.css b/p/themes/Screwdriver/screwdriver.css index 1bc49c2db..b92dbac3e 100644 --- a/p/themes/Screwdriver/screwdriver.css +++ b/p/themes/Screwdriver/screwdriver.css @@ -559,6 +559,31 @@ a.btn { .tree-folder-items > .item.active > a { } +/*=== Scrollbar */ +@supports (scrollbar-width: thin) { + #sidebar { + scrollbar-color: rgba(255, 255, 255, 0.05) rgba(0, 0, 0, 0.0); + } + #sidebar:hover { + scrollbar-color: rgba(255, 255, 255, 0.3) rgba(0, 0, 0, 0.0); + } +} +.ss-scroll { + background: rgba(255, 255, 255, 0.1); +} +.ss-container:hover .ss-scroll, +.ss-container:active .ss-scroll { + background: rgba(255, 255, 255, 0.3); +} +@supports not (scrollbar-width: thin) { + #sidebar::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.1); + } + #sidebar:hover::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.3); + } +} + /*=== STRUCTURE */ /*===============*/ /*=== Header */ diff --git a/p/themes/Swage/swage.css b/p/themes/Swage/swage.css index 8f262da8c..a8ff0bdd5 100644 --- a/p/themes/Swage/swage.css +++ b/p/themes/Swage/swage.css @@ -529,6 +529,32 @@ text-decoration: none; color: #FCFCFC; } +@supports (scrollbar-width: thin) { + #sidebar { +scrollbar-color: rgba(255, 255, 255, 0.05) rgba(0, 0, 0, 0.0); +} +#sidebar:hover { +scrollbar-color: rgba(255, 255, 255, 0.3) rgba(0, 0, 0, 0.0); +} +} + +.ss-scroll { +background: rgba(255, 255, 255, 0.1); +} +.ss-container:hover .ss-scroll, +.ss-container:active .ss-scroll { +background: rgba(255, 255, 255, 0.3); +} + +@supports not (scrollbar-width: thin) { +#sidebar::-webkit-scrollbar-thumb { +background: rgba(255, 255, 255, 0.1); +} +#sidebar:hover::-webkit-scrollbar-thumb { +background: rgba(255, 255, 255, 0.3); +} +} + .header > .item { vertical-align: middle; } diff --git a/p/themes/Swage/swage.scss b/p/themes/Swage/swage.scss index c0c76cf14..8ddac14db 100644 --- a/p/themes/Swage/swage.scss +++ b/p/themes/Swage/swage.scss @@ -351,7 +351,7 @@ form { > a { min-width: initial; white-space: nowrap; - } + } &:hover { background: $color_nav; color: $color_light; @@ -603,6 +603,32 @@ form { } } +@supports (scrollbar-width: thin) { + #sidebar { + scrollbar-color: rgba(255, 255, 255, 0.05) rgba(0, 0, 0, 0.0); + } + #sidebar:hover { + scrollbar-color: rgba(255, 255, 255, 0.3) rgba(0, 0, 0, 0.0); + } +} + +.ss-scroll { + background: rgba(255, 255, 255, 0.1); +} +.ss-container:hover .ss-scroll, +.ss-container:active .ss-scroll { + background: rgba(255, 255, 255, 0.3); +} + +@supports not (scrollbar-width: thin) { + #sidebar::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.1); + } + #sidebar:hover::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.3); + } +} + .header { > .item { vertical-align: middle; @@ -918,7 +944,7 @@ form { #global { height: 0; } - + .header { height: 55px; background: $color_aside; @@ -936,7 +962,7 @@ form { color: $color_light; padding-left: 5px; } - + input { border-left: 5px solid; border-right: 1px darken( $color_light, 10%); @@ -984,7 +1010,7 @@ form { .dropdown-header, .dropdown-menu > .item { padding: 12px; } - + #new-article { width: 100%; bottom: initial; @@ -1207,5 +1233,5 @@ button.as-link { background: inital; } } - -} \ No newline at end of file + +} diff --git a/p/themes/base-theme/template.css b/p/themes/base-theme/template.css index fdc2f884e..60c4822ef 100644 --- a/p/themes/base-theme/template.css +++ b/p/themes/base-theme/template.css @@ -109,7 +109,7 @@ input[type="checkbox"] { min-height: 15px !important; } .dropdown-menu label > input[type="text"] { - with: 150px; + width: 150px; width: calc(99% - 5em); } .dropdown-menu input[type="checkbox"] { @@ -168,6 +168,13 @@ td.numeric { display: block; } +@supports (position: sticky) { + #mark-read-aside { + position: sticky; + top: 0; + } +} + /*=== Buttons */ .stick { display: inline-block; @@ -273,6 +280,7 @@ a.btn { left: 0; right: 0; display: block; z-index: -10; + cursor: default; } .separator { display: block; @@ -373,16 +381,90 @@ a.btn { cursor: grab; } +/*=== Scrollbar */ +.ss-wrapper { + overflow: hidden; + width: 100%; + height: 100%; + position: relative; + z-index: 1; + float: left; +} + +.ss-content { + height: 100%; + width: calc(100% + 18px); + padding: 0 0 0 0; + position: relative; + overflow-y: scroll; + box-sizing: border-box; +} + +.ss-content.rtl { + width: calc(100% + 18px); + right: auto; +} + +.ss-scroll { + position: relative; + background: rgba(0, 0, 0, 0.1); + width: 9px; + border-radius: 4px; + top: 0; + z-index: 2; + cursor: pointer; + transition: opacity 0.25s linear; +} + +.ss-hidden { + display: none; +} + +.ss-container:hover .ss-scroll, +.ss-container:active .ss-scroll { + background: rgba(0, 0, 0, 0.3); +} + +.ss-grabbed { + -o-user-select: none; + -ms-user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + user-select: none; +} + +@supports (scrollbar-width: thin) { + #sidebar { + overflow-y: scroll; + scrollbar-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.05); + scrollbar-width: thin; + } + #sidebar:hover { + scrollbar-color: rgba(0, 0, 0, 0.3) rgba(0, 0, 0, 0.05); + } +} + +@supports not (scrollbar-width: thin) { + #sidebar::-webkit-scrollbar { + background: rgba(0, 0, 0, 0.05); + width: 8px; + } + #sidebar::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.1); + border-radius: 5px; + display: unset; + } + #sidebar:hover::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.3); + } +} + /*=== Tree */ .tree { margin: 0; - padding: 0 0 2em 0; list-style: none; text-align: left; -} - -.treepadding { - padding: 0 0 15em 0; + overflow-x: hidden; } .tree-folder-items { @@ -412,6 +494,10 @@ a.btn { white-space: nowrap; text-overflow: ellipsis; } +.tree-bottom { + visibility: hidden; + margin-bottom: 15em; +} /*=== STRUCTURE */ /*===============*/ @@ -914,7 +1000,6 @@ pre.enclosure-description { } .aside:target { width: 90%; - overflow: auto; } .flux_header .item.website { -- cgit v1.2.3 From bf838e74f4ae79a2f83a8687fcd1dd18be6af78e Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Sun, 16 Dec 2018 14:33:59 +0100 Subject: French readme parity English (#2183) https://github.com/FreshRSS/FreshRSS/pull/2158#issuecomment-444217219 --- README.fr.md | 30 ++++++++++++++++++++---------- README.md | 18 ++++++++++-------- docs/en/index.md | 10 +++++----- docs/fr/index.md | 20 +++++++++++--------- 4 files changed, 46 insertions(+), 32 deletions(-) (limited to 'README.md') diff --git a/README.fr.md b/README.fr.md index a8a8f87ff..b697a9b85 100644 --- a/README.fr.md +++ b/README.fr.md @@ -13,6 +13,9 @@ Il supporte les étiquettes personnalisées, et [PubSubHubbub](https://github.co Il y a une API pour les clients (mobiles), ainsi qu’une [interface en ligne de commande](cli/README.md). Enfin, il permet l’ajout d’[extensions](#extensions) pour encore plus de personnalisation. +Les demandes de fonctionnalités, rapports de bugs, et autres contributions sont les bienvenues. Privilégiez pour cela des [demandes sur GitHub](https://github.com/FreshRSS/FreshRSS/issues). +Nous sommes une communauté amicale. + * Site officiel : https://freshrss.org * Démo : http://demo.freshrss.org/ * Licence : [GNU AGPL 3](https://www.gnu.org/licenses/agpl-3.0.fr.html) @@ -24,28 +27,29 @@ Voir la [liste des versions](../../releases). ## À propos des branches * Utilisez [la branche master](https://github.com/FreshRSS/FreshRSS/tree/master/) si vous visez la stabilité. -* Pour ceux qui veulent bien aider à tester ou déveloper les dernières fonctionnalités, [la branche dev](https://github.com/FreshRSS/FreshRSS/tree/dev) vous ouvre les bras ! +* Pour ceux qui veulent bien aider à tester ou développer les dernières fonctionnalités, [la branche dev](https://github.com/FreshRSS/FreshRSS/tree/dev) vous ouvre les bras ! # Avertissements -Cette application a été développée pour s’adapter principalement à des besoins personnels, et aucune garantie n’est fournie. -Les demandes de fonctionnalités, rapports de bugs, et autres contributions sont les bienvenues. Privilégiez pour cela des [demandes sur GitHub](https://github.com/FreshRSS/FreshRSS/issues). -Nous sommes une communauté amicale. +FreshRSS n’est fourni avec aucune garantie. # Prérequis * Serveur modeste, par exemple sous Linux ou Windows * Fonctionne même sur un Raspberry Pi 1 avec des temps de réponse < 1s (testé sur 150 flux, 22k articles) * Serveur Web Apache2 (recommandé), ou nginx, lighttpd (non testé sur les autres) -* PHP 5.3.8+ (PHP 5.4+ recommandé, et PHP 5.5+ pour les performances, et PHP 7+ pour d’encore meilleures performances) +* PHP 5.3.8+ (PHP 5.4+ recommandé, et PHP 5.5+ pour les performances, ou PHP 7+ pour d’encore meilleures performances) * Requis : [cURL](https://secure.php.net/curl), [DOM](https://secure.php.net/dom), [XML](https://secure.php.net/xml), [session](https://secure.php.net/session), [ctype](https://secure.php.net/ctype), et [PDO_MySQL](https://secure.php.net/pdo-mysql) ou [PDO_SQLite](https://secure.php.net/pdo-sqlite) ou [PDO_PGSQL](https://secure.php.net/pdo-pgsql) * Recommandés : [JSON](https://secure.php.net/json), [GMP](https://secure.php.net/gmp) (pour accès API sur plateformes < 64 bits), [IDN](https://secure.php.net/intl.idn) (pour les noms de domaines internationalisés), [mbstring](https://secure.php.net/mbstring) (pour le texte Unicode), [iconv](https://secure.php.net/iconv) (pour conversion d’encodages), [ZIP](https://secure.php.net/zip) (pour import/export), [zlib](https://secure.php.net/zlib) (pour les flux compressés) * MySQL 5.5.3+ (recommandé), ou SQLite 3.7.4+, ou PostgreSQL 9.2+ -* Un navigateur Web récent tel que Firefox / IceCat, Internet Explorer 11 / Edge, Chromium / Chrome, Opera, Safari. - * Fonctionne aussi sur mobile +* Un navigateur Web récent tel que Firefox / IceCat, Internet Explorer 11 / Edge (sauf certains détails), Chromium / Chrome, Opera, Safari. + * Fonctionne aussi sur mobile (sauf certaines fonctionnalités) ![Capture d’écran de FreshRSS](docs/img/FreshRSS-screenshot.png) -# Documentation -* https://freshrss.github.io/FreshRSS/fr/ +# [Documentation](https://freshrss.github.io/FreshRSS/fr/) +* La [documentation utilisateurs](https://freshrss.github.io/FreshRSS/fr/users/02_First_steps.md) pour découvrir les fonctionnalités de FreshRSS. +* La [documentation administrateurs](https://freshrss.github.io/FreshRSS/fr/users/01_Installation.md) pour l’installation et la maintenance de FreshRSS. +* La [documentation développeurs](https://freshrss.github.io/FreshRSS/fr/developers/01_First_steps.md) pour savoir comment contribuer et mieux comprendre le code source de FreshRSS. +* Le [guide de contribution](https://freshrss.github.io/FreshRSS/fr/contributing.md) pour nous aider à développer FreshRSS. # [Installation](https://freshrss.github.io/FreshRSS/fr/users/01_Installation.html) 1. Récupérez l’application FreshRSS via la commande git ou [en téléchargeant l’archive](../releases) @@ -140,6 +144,11 @@ Créer `/etc/cron.d/FreshRSS` avec : * Le répertoire spécial `./data/users/_/` contient la partie des logs partagés par tous les utilisateurs. +# F.A.Q. : +* La date et l’heure dans la colonne de droite sont celles déclarées par le flux, pas l’heure à laquelle les articles ont été reçus par FreshRSS, et cette colonne n’est pas utilisée pour le tri. + * En particulier, lors de l’import d’un nouveau flux, ses articles sont importés en tête de liste. + + # Sauvegarde * Il faut conserver vos fichiers `./data/config.php` ainsi que `./data/users/*/config.php` * Vous pouvez exporter votre liste de flux au format OPML soit depuis l’interface Web, soit [en ligne de commande](cli/README.md) @@ -157,7 +166,7 @@ Voir le [dépôt dédié à ces extensions](https://github.com/FreshRSS/Extensio # APIs et applications natives -FreshRSS supporte l’accès depuis des applications native pour Linux, Android, iOS, et OS X, grâce à deux APIs distinctes. +FreshRSS supporte l’accès depuis des applications natives pour Linux, Android, iOS, et OS X, grâce à deux APIs distinctes. ## Via l’API compatible Google Reader @@ -205,3 +214,4 @@ Tout client supportant une API de type Fever ; Sélection : * [password_compat](https://github.com/ircmaxell/password_compat) + diff --git a/README.md b/README.md index d6e13851e..00a1f145a 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ It supports custom tags, and [PubSubHubbub](https://github.com/pubsubhubbub/PubS There is an API for (mobile) clients, and a [Command-Line Interface](cli/README.md). Finally, it supports [extensions](#extensions) for further tuning. -Feature requests, bug reports, and other contributions are welcome. The best way to contribute is to [open an issue on GitHub](https://github.com/FreshRSS/FreshRSS/issues). We are a friendly community. - +Feature requests, bug reports, and other contributions are welcome. The best way to contribute is to [open an issue on GitHub](https://github.com/FreshRSS/FreshRSS/issues). +We are a friendly community. * Official website: https://freshrss.org * Demo: https://demo.freshrss.org/ @@ -40,9 +40,8 @@ FreshRSS comes with absolutely no warranty. * Required extensions: [cURL](https://secure.php.net/curl), [DOM](https://secure.php.net/dom), [XML](https://secure.php.net/xml), [session](https://secure.php.net/session), [ctype](https://secure.php.net/ctype), and [PDO_MySQL](https://secure.php.net/pdo-mysql) or [PDO_SQLite](https://secure.php.net/pdo-sqlite) or [PDO_PGSQL](https://secure.php.net/pdo-pgsql) * Recommended extensions: [JSON](https://secure.php.net/json), [GMP](https://secure.php.net/gmp) (for API access on 32-bit platforms), [IDN](https://secure.php.net/intl.idn) (for Internationalized Domain Names), [mbstring](https://secure.php.net/mbstring) (for Unicode strings), [iconv](https://secure.php.net/iconv) (for charset conversion), [ZIP](https://secure.php.net/zip) (for import/export), [zlib](https://secure.php.net/zlib) (for compressed feeds) * MySQL 5.5.3+ (recommended), or SQLite 3.7.4+, or PostgreSQL 9.2+ -* A recent browser like Firefox / IceCat, Internet Explorer 11 / Edge, Chromium / Chrome, Opera, Safari. - * Works on mobile - * All features may not be available on mobile or Internet Explorer 11 / Edge +* A recent browser like Firefox / IceCat, Internet Explorer 11 / Edge (minus a few details), Chromium / Chrome, Opera, Safari. + * Works on mobile (except a few features) ![FreshRSS screenshot](docs/img/FreshRSS-screenshot.png) @@ -54,7 +53,7 @@ FreshRSS comes with absolutely no warranty. # [Installation](https://freshrss.github.io/FreshRSS/en/admins/02_Installation.html) 1. Get FreshRSS with git or [by downloading the archive](https://github.com/FreshRSS/FreshRSS/archive/master.zip) -2. Put the application somewhere on your server (expose only the `./p/` folder to the web) +2. Put the application somewhere on your server (expose only the `./p/` folder to the Web) 3. Add write access to the `./data/` folder for the webserver user 4. Access FreshRSS with your browser and follow the installation process * or use the [Command-Line Interface](cli/README.md) @@ -122,7 +121,7 @@ This is needed if you will be using the multi-user mode, to limit access to Fres ## Automatic feed update * You can add a Cron job to launch the update script. Check the Cron documentation related to your distribution ([Debian/Ubuntu](https://help.ubuntu.com/community/CronHowto), [Red Hat/Fedora](https://fedoraproject.org/wiki/Administration_Guide_Draft/Cron), [Slackware](https://docs.slackware.com/fr:slackbook:process_control?#cron), [Gentoo](https://wiki.gentoo.org/wiki/Cron), [Arch Linux](https://wiki.archlinux.org/index.php/Cron)…). -It is a good idea to run the cron job as the webserver user. +It is a good idea to run the cron job as the webserver user (often “www-data”). For instance, if you want to run the script every hour: ``` @@ -143,8 +142,11 @@ Create `/etc/cron.d/FreshRSS` with: * The `./constants.php` file defines access to the application folder. If you want to customize your installation, look here first. * If you encounter any problem, logs are accessible from the interface or manually in `./data/users/*/log*.txt` files. * The special folder `./data/users/_/` contains the part of the logs that are shared by all users. + + +# F.A.Q.: * The date and time in the right-hand column is the date declared by the feed, not the time at which the article was received by FreshRSS, and it is not used for sorting. - * When importing a new feed, all of its articles will appear at the top of the feed list regardless of their declared date. + * In particular, when importing a new feed, all of its articles will appear at the top of the feed list regardless of their declared date. # Backup diff --git a/docs/en/index.md b/docs/en/index.md index 59cbdc296..1aaa6a586 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -16,9 +16,9 @@ FreshRSS has a lot of features including: - Multi-user, so you can also host for your friends and family - And a lot more! -This documentation is split into four sections: +This documentation is split into different sections: -- [user documentation](users/02_First_steps.md) so you can discover all the power of FreshRSS -- [developer documentation](developers/01_First_steps.md) to guide you in the source code of FreshRSS and to help you if you want to contribute -- [administrator documentation](admins/01_Index.md) to guide you in the source code of FreshRSS and to help you if you want to contribute -- [contributor guidelines](contributing.md) for all of you who want to help improving FreshRSS +* [User documentation](./users/02_First_steps.html), where you can discover all the possibilities offered by FreshRSS +* [Administrator documentation](./admins/01_Index.html) for detailed installation and maintenance related tasks +* [Developer documentation](./developers/01_First_steps.html) to guide you in the source code of FreshRSS and to help you if you want to contribute +* [Contributor guidelines](./contributing.md) for those who want to help improve FreshRSS diff --git a/docs/fr/index.md b/docs/fr/index.md index d43eaec4e..6a9b27cb2 100644 --- a/docs/fr/index.md +++ b/docs/fr/index.md @@ -1,22 +1,24 @@ ![Logo de FreshRSS](img/logo_freshrss.png) -FreshRSS est un agrégateur et lecteur de flux RSS. Il permet de regrouper l'actualité de plusieurs sites différents dans un endroit unique pour que vous puissiez la lire sans devoir aller de site en site. +FreshRSS est un agrégateur et lecteur de flux RSS. Il permet de regrouper l’actualité de plusieurs sites différents dans un endroit unique pour que vous puissiez la lire sans devoir aller de site en site. FreshRSS a été conçu comme un agrégateur puissant et propose des tas de fonctionnalités : - Agrégation des flux RSS et Atom. - Utilisez les favoris pour marquer les articles qui vous ont plu ou que vous souhaitez lire plus tard. - Le système de filtrage et de recherche permettent de cibler exactement les articles que vous souhaitez lire. -- Les statistiques permettent de savoir en un coup d'œil quels sont les sites qui publient le plus, ou à l'inverse, le moins. +- Les statistiques permettent de savoir en un coup d’œil quels sont les sites qui publient le plus, ou à l’inverse, le moins. - Importation / exportation des flux au format OPML. -- Multi-thèmes pour changer l'habillage de FreshRSS. -- « *Responsive design* » : l'application s'adapte aux petits écrans pour emporter FreshRSS dans votre poche. +- Multi-thèmes pour changer l’habillage de FreshRSS. +- « *Responsive design* » : l’application s’adapte aux petits écrans pour emporter FreshRSS dans votre poche. - Multi-utilisateurs pour héberger plusieurs personnes sur une même installation. - API Google Reader pour pouvoir y brancher des applications Android. -- Auto-hébergeable : le code source est libre (AGPL3) et vous pouvez donc l'héberger sur votre propre serveur. -- Et bien d'autres ! +- Auto-hébergeable : le code source est libre (AGPL3) et vous pouvez donc l’héberger sur votre propre serveur. +- Et bien d’autres ! -Cette documentation est partagée en deux parties : +Cette documentation est divisée en plusieurs parties : -- La [documentation utilisateurs](users/02_First_steps.md) pour découvrir plus en profondeur les fonctionnalités de FreshRSS. -- La [documentation développeurs](developers/01_First_steps.md) pour savoir comment contribuer et mieux comprendre le code source de FreshRSS. +* La [documentation utilisateurs](./users/02_First_steps.md) pour découvrir les fonctionnalités de FreshRSS. +* La [documentation administrateurs](./users/01_Installation.md) pour l’installation et la maintenance de FreshRSS. +* La [documentation développeurs](./developers/01_First_steps.md) pour savoir comment contribuer et mieux comprendre le code source de FreshRSS. +* Le [guide de contribution](./contributing.md) pour nous aider à développer FreshRSS. -- cgit v1.2.3 From 75a0b12c72890c69797f0d75065cc155ad9cfb7d Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Sun, 16 Dec 2018 14:43:32 +0100 Subject: Documentation Vienna (#2126) * Documentation Vienna / Open Reader https://github.com/FreshRSS/FreshRSS/issues/2091 https://github.com/FreshRSS/FreshRSS/pull/2093 https://github.com/ViennaRSS/vienna-rss/issues/1197 * Remove references to Open Reader API for now --- CHANGELOG.md | 4 ++-- README.fr.md | 2 ++ README.md | 2 ++ docs/en/users/06_Mobile_access.md | 2 ++ docs/fr/users/06_Mobile_access.md | 3 ++- p/api/index.php | 4 ++-- 6 files changed, 12 insertions(+), 5 deletions(-) (limited to 'README.md') diff --git a/CHANGELOG.md b/CHANGELOG.md index dfc982d40..74747d9cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,8 @@ ## 2018-1X-XX FreshRSS 1.12.1-dev * API - * Improvements to the Google Reader API / Open Reader API [#2093](https://github.com/FreshRSS/FreshRSS/pull/2093) - * Support for Vienna RSS (client for Mac OS X) [#2091](https://github.com/FreshRSS/FreshRSS/issues/2091) + * Improvements to the Google Reader API [#2093](https://github.com/FreshRSS/FreshRSS/pull/2093) + * Support for [Vienna RSS](http://www.vienna-rss.com/) (client for Mac OS X) [#2091](https://github.com/FreshRSS/FreshRSS/issues/2091) * Features * Ability to import XML files exported from Tiny-Tiny-RSS [#2079](https://github.com/FreshRSS/FreshRSS/issues/2079) * UI diff --git a/README.fr.md b/README.fr.md index b697a9b85..1cf1c07a0 100644 --- a/README.fr.md +++ b/README.fr.md @@ -180,6 +180,8 @@ Tout client supportant une API de type Google Reader ; Sélection : * [EasyRSS](https://github.com/Alkarex/EasyRSS) (Libre, [F-Droid](https://f-droid.org/fr/packages/org.freshrss.easyrss/)) * GNU/Linux * [FeedReader 2.0+](https://jangernert.github.io/FeedReader/) (Libre) +* MacOS + * [Vienna RSS](http://www.vienna-rss.com/) (Libre) ## Via l’API compatible Fever diff --git a/README.md b/README.md index 00a1f145a..a97edc736 100644 --- a/README.md +++ b/README.md @@ -180,6 +180,8 @@ Supported clients are: * [EasyRSS](https://github.com/Alkarex/EasyRSS) (Open source, [F-Droid](https://f-droid.org/packages/org.freshrss.easyrss/)) * GNU/Linux * [FeedReader 2.0+](https://jangernert.github.io/FeedReader/) (Open source) +* MacOS + * [Vienna RSS](http://www.vienna-rss.com/) (Open source) ## Fever API diff --git a/docs/en/users/06_Mobile_access.md b/docs/en/users/06_Mobile_access.md index c354f98f0..d1b310db3 100644 --- a/docs/en/users/06_Mobile_access.md +++ b/docs/en/users/06_Mobile_access.md @@ -53,6 +53,8 @@ See the [page about the Fever compatible API](06_Fever_API.md) for another possi * [EasyRSS](https://github.com/Alkarex/EasyRSS) (Open source, [F-Droid](https://f-droid.org/packages/org.freshrss.easyrss/)) * Linux * [FeedReader 2.0+](https://jangernert.github.io/FeedReader/) (Open source) + * MacOS + * [Vienna RSS](http://www.vienna-rss.com/) (Open source) # Google Reader compatible API diff --git a/docs/fr/users/06_Mobile_access.md b/docs/fr/users/06_Mobile_access.md index 6981a74a6..6f7d92ade 100644 --- a/docs/fr/users/06_Mobile_access.md +++ b/docs/fr/users/06_Mobile_access.md @@ -67,7 +67,8 @@ Tout client supportant une API de type Google Reader. Sélection : * [EasyRSS](https://github.com/Alkarex/EasyRSS) (Libre, F-Droid) * Linux * [FeedReader 2.0+](https://jangernert.github.io/FeedReader/) (Libre) - +* MacOS + * [Vienna RSS](http://www.vienna-rss.com/) (Libre) # API compatible Google Reader diff --git a/p/api/index.php b/p/api/index.php index 108841819..ee37b794b 100644 --- a/p/api/index.php +++ b/p/api/index.php @@ -2,13 +2,13 @@ -FreshRSS API +FreshRSS API endpoints -

    FreshRSS API

    +

    FreshRSS API endpoints

    Google Reader compatible API

    -- cgit v1.2.3 From e0e96d6a13788c539be1bcce3cde0a1d614ff2c3 Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Sun, 16 Dec 2018 15:04:46 +0100 Subject: Remove simple-scrollbar fallback (#2182) https://github.com/FreshRSS/FreshRSS/pull/2181#issuecomment-447636787 --- README.fr.md | 1 - README.md | 1 - p/scripts/main.js | 71 ++---------------------------------- p/scripts/simple-scrollbar.min.js | 2 - p/themes/BlueLagoon/BlueLagoon.css | 7 ---- p/themes/Dark/dark.css | 7 ---- p/themes/Flat/flat.css | 7 ---- p/themes/Screwdriver/screwdriver.css | 7 ---- p/themes/Swage/swage.css | 8 ---- p/themes/Swage/swage.scss | 8 ---- p/themes/base-theme/template.css | 51 -------------------------- 11 files changed, 4 insertions(+), 166 deletions(-) delete mode 100644 p/scripts/simple-scrollbar.min.js (limited to 'README.md') diff --git a/README.fr.md b/README.fr.md index 1cf1c07a0..9db5907a0 100644 --- a/README.fr.md +++ b/README.fr.md @@ -209,7 +209,6 @@ Tout client supportant une API de type Fever ; Sélection : ## Uniquement pour certaines options ou configurations * [bcrypt.js](https://github.com/dcodeIO/bcrypt.js) * [phpQuery](https://github.com/phpquery/phpquery) -* [simple-scrollbar](https://github.com/buzinas/simple-scrollbar) ## Si les fonctions natives ne sont pas disponibles * [Services_JSON](https://pear.php.net/pepr/pepr-proposal-show.php?id=198) diff --git a/README.md b/README.md index a97edc736..1904dad2c 100644 --- a/README.md +++ b/README.md @@ -209,7 +209,6 @@ Supported clients are: ## Only for some options or configurations * [bcrypt.js](https://github.com/dcodeIO/bcrypt.js) * [phpQuery](https://github.com/phpquery/phpquery) -* [simple-scrollbar](https://github.com/buzinas/simple-scrollbar) ## If native functions are not available * [Services_JSON](https://pear.php.net/pepr/pepr-proposal-show.php?id=198) diff --git a/p/scripts/main.js b/p/scripts/main.js index c8d520ef7..4ba329dc1 100644 --- a/p/scripts/main.js +++ b/p/scripts/main.js @@ -1,5 +1,5 @@ "use strict"; -/* globals $, jQuery, context, i18n, shortcut, shortcuts, SimpleScrollbar, url */ +/* globals $, jQuery, context, i18n, shortcut, shortcuts, url */ /* jshint strict:global */ var $stream = null, @@ -527,14 +527,6 @@ function init_posts() { } } -function inject_script(name) { - var script = document.createElement('script'); - script.async = 'async'; - script.defer = 'defer'; - script.src = '../scripts/' + name; - document.head.appendChild(script); -} - function init_column_categories() { if (context.current_view !== 'normal' && context.current_view !== 'reader') { return; @@ -551,15 +543,13 @@ function init_column_categories() { } }); $(this).parent().next(".tree-folder-items").slideToggle(300, function () { - if (!useJsScrollbar && //Workaround for Gecko bug in Firefox 64-65(+?): - sidebar.scrollHeight > sidebar.clientHeight && //if needs scrollbar + //Workaround for Gecko bug in Firefox 64-65(+?): + var sidebar = document.getElementById('sidebar'); + if (sidebar && sidebar.scrollHeight > sidebar.clientHeight && //if needs scrollbar sidebar.scrollWidth >= sidebar.offsetWidth) { //but no scrollbar sidebar.style['overflow-y'] = 'scroll'; //then force scrollbar setTimeout(function () { sidebar.style['overflow-y'] = ''; }, 0); } - if (useJsScrollbar && typeof(Event) === 'function') { //Refresh JS scrollbar - sidebar.querySelector('.ss-content').dispatchEvent(new Event('scroll')); - } }); return false; }); @@ -1280,58 +1270,6 @@ function init_crypto_form() { } // -var sidebar = document.getElementById('sidebar'); -var useJsScrollbar = true; -try { - /*jshint -W018 */ - useJsScrollbar = sidebar && !CSS.supports('scrollbar-color: auto') && - !(parseInt(getComputedStyle(sidebar, '::-webkit-scrollbar').width) < sidebar.scrollWidth); - /*jshint +W018 */ -} catch (ex) { -} -if (useJsScrollbar) { - inject_script('simple-scrollbar.min.js'); -} - -function sticky_recalc() { - var h = 0; - if ($nav_entries && $nav_entries.length > 0) { - h = $(window).height() - sidebar.getBoundingClientRect().top - $nav_entries.height(); - } else { - h = $(window).height() - sidebar.getBoundingClientRect().top; - } - if (h > 0) { - $(sidebar).height(h); - } -} - -function init_simple_scrollbar() { - if (!window.SimpleScrollbar) { - if (window.console) { - console.log('FreshRSS waiting for simple-scrollbar…'); - } - window.setTimeout(init_simple_scrollbar, 100); - } else { - SimpleScrollbar.initEl(sidebar); - } -} - -var scrollTimeout; -function init_sticky_sidebar(){ - if (!useJsScrollbar) { - return; - } - init_simple_scrollbar(); - $(window).scroll(function () { - if (scrollTimeout) { - clearTimeout(scrollTimeout); - scrollTimeout = null; - } - scrollTimeout = setTimeout(sticky_recalc, 200); - }); - window.onresize = sticky_recalc; -} - function init_confirm_action() { $('body').on('click', '.confirm', function () { var str_confirmation = $(this).attr('data-str-confirm'); @@ -1597,7 +1535,6 @@ function init_afterDOM() { $stream = $('#stream'); if ($stream.length > 0) { init_load_more($stream); - init_sticky_sidebar(); init_posts(); init_nav_entries(); init_dynamic_tags(); diff --git a/p/scripts/simple-scrollbar.min.js b/p/scripts/simple-scrollbar.min.js deleted file mode 100644 index 36b7df0b8..000000000 --- a/p/scripts/simple-scrollbar.min.js +++ /dev/null @@ -1,2 +0,0 @@ -// https://github.com/buzinas/simple-scrollbar -!function(t,e){"object"==typeof exports?module.exports=e(window,document):t.SimpleScrollbar=e(window,document)}(this,function(t,e){function s(t){Object.prototype.hasOwnProperty.call(t,"data-simple-scrollbar")||Object.defineProperty(t,"data-simple-scrollbar",{value:new o(t)})}function i(t,s){function i(t){var e=t.pageY-a;a=t.pageY,n(function(){s.el.scrollTop+=e/s.scrollRatio})}function r(){t.classList.remove("ss-grabbed"),e.body.classList.remove("ss-grabbed"),e.removeEventListener("mousemove",i),e.removeEventListener("mouseup",r)}var a;t.addEventListener("mousedown",function(s){return a=s.pageY,t.classList.add("ss-grabbed"),e.body.classList.add("ss-grabbed"),e.addEventListener("mousemove",i),e.addEventListener("mouseup",r),!1})}function r(t){for(this.target=t,this.direction=window.getComputedStyle(this.target).direction,this.bar='
    ',this.wrapper=e.createElement("div"),this.wrapper.setAttribute("class","ss-wrapper"),this.el=e.createElement("div"),this.el.setAttribute("class","ss-content"),"rtl"===this.direction&&this.el.classList.add("rtl"),this.wrapper.appendChild(this.el);this.target.firstChild;)this.el.appendChild(this.target.firstChild);this.target.appendChild(this.wrapper),this.target.insertAdjacentHTML("beforeend",this.bar),this.bar=this.target.lastChild,i(this.bar,this),this.moveBar(),this.el.addEventListener("scroll",this.moveBar.bind(this)),this.el.addEventListener("mouseenter",this.moveBar.bind(this)),this.target.classList.add("ss-container");var s=window.getComputedStyle(t);"0px"===s.height&&"0px"!==s["max-height"]&&(t.style.height=s["max-height"])}function a(){for(var t=e.querySelectorAll("*[ss-container]"),i=0;i=1?i.bar.classList.add("ss-hidden"):(i.bar.classList.remove("ss-hidden"),i.bar.style.cssText="height:"+Math.max(100*i.scrollRatio,10)+"%; top:"+i.el.scrollTop/e*100+"%;right:"+a+"px;")})}},e.addEventListener("DOMContentLoaded",a),r.initEl=s,r.initAll=a;var o=r;return o}); \ No newline at end of file diff --git a/p/themes/BlueLagoon/BlueLagoon.css b/p/themes/BlueLagoon/BlueLagoon.css index 263764a9c..94eb8e3a8 100644 --- a/p/themes/BlueLagoon/BlueLagoon.css +++ b/p/themes/BlueLagoon/BlueLagoon.css @@ -574,13 +574,6 @@ a.btn { scrollbar-color: rgba(255, 255, 255, 0.3) rgba(0, 0, 0, 0.0); } } -.ss-scroll { - background: rgba(255, 255, 255, 0.1); -} -.ss-container:hover .ss-scroll, -.ss-container:active .ss-scroll { - background: rgba(255, 255, 255, 0.3); -} @supports not (scrollbar-width: thin) { #sidebar::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.1); diff --git a/p/themes/Dark/dark.css b/p/themes/Dark/dark.css index b8366caeb..28ea253ff 100644 --- a/p/themes/Dark/dark.css +++ b/p/themes/Dark/dark.css @@ -511,13 +511,6 @@ a.btn { scrollbar-color: rgba(255, 255, 255, 0.3) rgba(0, 0, 0, 0.0); } } -.ss-scroll { - background: rgba(255, 255, 255, 0.1); -} -.ss-container:hover .ss-scroll, -.ss-container:active .ss-scroll { - background: rgba(255, 255, 255, 0.3); -} @supports not (scrollbar-width: thin) { #sidebar::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.1); diff --git a/p/themes/Flat/flat.css b/p/themes/Flat/flat.css index 176a541f7..1c5c3e795 100644 --- a/p/themes/Flat/flat.css +++ b/p/themes/Flat/flat.css @@ -514,13 +514,6 @@ a.btn { scrollbar-color: rgba(255, 255, 255, 0.3) rgba(0, 0, 0, 0.0); } } -.ss-scroll { - background: rgba(255, 255, 255, 0.1); -} -.ss-container:hover .ss-scroll, -.ss-container:active .ss-scroll { - background: rgba(255, 255, 255, 0.3); -} @supports not (scrollbar-width: thin) { #sidebar::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.1); diff --git a/p/themes/Screwdriver/screwdriver.css b/p/themes/Screwdriver/screwdriver.css index b92dbac3e..2576c485f 100644 --- a/p/themes/Screwdriver/screwdriver.css +++ b/p/themes/Screwdriver/screwdriver.css @@ -568,13 +568,6 @@ a.btn { scrollbar-color: rgba(255, 255, 255, 0.3) rgba(0, 0, 0, 0.0); } } -.ss-scroll { - background: rgba(255, 255, 255, 0.1); -} -.ss-container:hover .ss-scroll, -.ss-container:active .ss-scroll { - background: rgba(255, 255, 255, 0.3); -} @supports not (scrollbar-width: thin) { #sidebar::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.1); diff --git a/p/themes/Swage/swage.css b/p/themes/Swage/swage.css index a8ff0bdd5..24a3ccbed 100644 --- a/p/themes/Swage/swage.css +++ b/p/themes/Swage/swage.css @@ -538,14 +538,6 @@ scrollbar-color: rgba(255, 255, 255, 0.3) rgba(0, 0, 0, 0.0); } } -.ss-scroll { -background: rgba(255, 255, 255, 0.1); -} -.ss-container:hover .ss-scroll, -.ss-container:active .ss-scroll { -background: rgba(255, 255, 255, 0.3); -} - @supports not (scrollbar-width: thin) { #sidebar::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.1); diff --git a/p/themes/Swage/swage.scss b/p/themes/Swage/swage.scss index 8ddac14db..ecacba832 100644 --- a/p/themes/Swage/swage.scss +++ b/p/themes/Swage/swage.scss @@ -612,14 +612,6 @@ form { } } -.ss-scroll { - background: rgba(255, 255, 255, 0.1); -} -.ss-container:hover .ss-scroll, -.ss-container:active .ss-scroll { - background: rgba(255, 255, 255, 0.3); -} - @supports not (scrollbar-width: thin) { #sidebar::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.1); diff --git a/p/themes/base-theme/template.css b/p/themes/base-theme/template.css index 86c985d0c..099aee916 100644 --- a/p/themes/base-theme/template.css +++ b/p/themes/base-theme/template.css @@ -382,57 +382,6 @@ a.btn { } /*=== Scrollbar */ -.ss-wrapper { - overflow: hidden; - width: 100%; - height: 100%; - position: relative; - z-index: 1; - float: left; -} - -.ss-content { - height: 100%; - width: calc(100% + 18px); - padding: 0 0 0 0; - position: relative; - overflow-y: scroll; - box-sizing: border-box; -} - -.ss-content.rtl { - width: calc(100% + 18px); - right: auto; -} - -.ss-scroll { - position: relative; - background: rgba(0, 0, 0, 0.1); - width: 9px; - border-radius: 4px; - top: 0; - z-index: 2; - cursor: pointer; - transition: opacity 0.25s linear; -} - -.ss-hidden { - display: none; -} - -.ss-container:hover .ss-scroll, -.ss-container:active .ss-scroll { - background: rgba(0, 0, 0, 0.3); -} - -.ss-grabbed { - -o-user-select: none; - -ms-user-select: none; - -moz-user-select: none; - -webkit-user-select: none; - user-select: none; -} - @supports (scrollbar-width: thin) { #sidebar { overflow-y: auto; -- cgit v1.2.3 From 512d047f02b601dcf21f8c807117ea154967e58f Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Sun, 16 Dec 2018 17:02:03 +0100 Subject: Update naming to WebSub (#2184) Instead of PubSubHubbub / PuSH --- README.fr.md | 7 +++++-- README.md | 7 +++++-- app/Controllers/feedController.php | 12 ++++++------ app/Models/Feed.php | 18 +++++++++--------- app/i18n/cz/sub.php | 2 +- app/i18n/de/sub.php | 2 +- app/i18n/en/sub.php | 2 +- app/i18n/es/sub.php | 2 +- app/i18n/fr/sub.php | 2 +- app/i18n/he/sub.php | 2 +- app/i18n/it/sub.php | 2 +- app/i18n/kr/sub.php | 2 +- app/i18n/nl/sub.php | 2 +- app/i18n/oc/sub.php | 2 +- app/i18n/pt-br/sub.php | 2 +- app/i18n/ru/sub.php | 2 +- app/i18n/tr/sub.php | 2 +- app/i18n/zh-cn/sub.php | 2 +- app/views/helpers/feed/update.phtml | 2 +- cli/README.md | 2 +- config.default.php | 2 +- docs/en/users/05_Configuration.md | 2 +- docs/fr/contributing.md | 2 +- docs/fr/users/08_PubSubHubbub.md | 23 ++++++++++++++++------- p/api/pshb.php | 4 ++-- 25 files changed, 62 insertions(+), 47 deletions(-) (limited to 'README.md') diff --git a/README.fr.md b/README.fr.md index 9db5907a0..14d780b18 100644 --- a/README.fr.md +++ b/README.fr.md @@ -8,9 +8,12 @@ FreshRSS est un agrégateur de flux RSS à auto-héberger à l’image de [Leed] Il se veut léger et facile à prendre en main tout en étant un outil puissant et paramétrable. -Il permet de gérer plusieurs utilisateurs, et dispose d’un mode de lecture anonyme. -Il supporte les étiquettes personnalisées, et [PubSubHubbub](https://github.com/pubsubhubbub/PubSubHubbub) pour des notifications instantanées depuis les sites compatibles. +Il permet de gérer plusieurs utilisateurs, dispose d’un mode de lecture anonyme, et supporte les étiquettes personnalisées. Il y a une API pour les clients (mobiles), ainsi qu’une [interface en ligne de commande](cli/README.md). + +Grâce au standard [WebSub](https://www.w3.org/TR/websub/) (anciennement [PubSubHubbub](https://github.com/pubsubhubbub/PubSubHubbub)), +FreshRSS est capable de recevoir des notifications push instantanées depuis les sources compatibles, telles [Mastodon](https://joinmastodon.org), [Friendica](https://friendi.ca), [WordPress](https://wordpress.org/plugins/pubsubhubbub/), Blogger, FeedBurner, etc. + Enfin, il permet l’ajout d’[extensions](#extensions) pour encore plus de personnalisation. Les demandes de fonctionnalités, rapports de bugs, et autres contributions sont les bienvenues. Privilégiez pour cela des [demandes sur GitHub](https://github.com/FreshRSS/FreshRSS/issues). diff --git a/README.md b/README.md index 1904dad2c..4cf598172 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,12 @@ FreshRSS is a self-hosted RSS feed aggregator like [Leed](http://leed.idleman.fr It is lightweight, easy to work with, powerful, and customizable. -It is a multi-user application with an anonymous reading mode. -It supports custom tags, and [PubSubHubbub](https://github.com/pubsubhubbub/PubSubHubbub) for instant notifications from compatible Web sites. +It is a multi-user application with an anonymous reading mode. It supports custom tags. There is an API for (mobile) clients, and a [Command-Line Interface](cli/README.md). + +Thanks to the [WebSub](https://www.w3.org/TR/websub/) standard (formerly [PubSubHubbub](https://github.com/pubsubhubbub/PubSubHubbub)), +FreshRSS is able to receive instant push notifications from compatible sources, such as [Mastodon](https://joinmastodon.org), [Friendica](https://friendi.ca), [WordPress](https://wordpress.org/plugins/pubsubhubbub/), Blogger, FeedBurner, etc. + Finally, it supports [extensions](#extensions) for further tuning. Feature requests, bug reports, and other contributions are welcome. The best way to contribute is to [open an issue on GitHub](https://github.com/FreshRSS/FreshRSS/issues). diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php index f2b1b8960..74c9eacfa 100755 --- a/app/Controllers/feedController.php +++ b/app/Controllers/feedController.php @@ -266,7 +266,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController { $nb_month_old = max(FreshRSS_Context::$user_conf->old_entries, 1); $date_min = time() - (3600 * 24 * 30 * $nb_month_old); - // PubSubHubbub support + // WebSub (PubSubHubbub) support $pubsubhubbubEnabledGeneral = FreshRSS_Context::$system_conf->pubsubhubbub_enabled; $pshbMinAge = time() - (3600 * 24); //TODO: Make a configuration. @@ -437,13 +437,13 @@ class FreshRSS_feed_Controller extends Minz_ActionController { $entryDAO->commit(); } - if ($feed->hubUrl() && $feed->selfUrl()) { //selfUrl has priority for PubSubHubbub + if ($feed->hubUrl() && $feed->selfUrl()) { //selfUrl has priority for WebSub if ($feed->selfUrl() !== $url) { //https://code.google.com/p/pubsubhubbub/wiki/MovingFeedsOrChangingHubs $selfUrl = checkUrl($feed->selfUrl()); if ($selfUrl) { - Minz_Log::debug('PubSubHubbub unsubscribe ' . $feed->url(false)); + Minz_Log::debug('WebSub unsubscribe ' . $feed->url(false)); if (!$feed->pubSubHubbubSubscribe(false)) { //Unsubscribe - Minz_Log::warning('Error while PubSubHubbub unsubscribing from ' . $feed->url(false)); + Minz_Log::warning('Error while WebSub unsubscribing from ' . $feed->url(false)); } $feed->_url($selfUrl, false); Minz_Log::notice('Feed ' . $url . ' canonical address moved to ' . $feed->url(false)); @@ -457,9 +457,9 @@ class FreshRSS_feed_Controller extends Minz_ActionController { $feed->faviconPrepare(); if ($pubsubhubbubEnabledGeneral && $feed->pubSubHubbubPrepare()) { - Minz_Log::notice('PubSubHubbub subscribe ' . $feed->url(false)); + Minz_Log::notice('WebSub subscribe ' . $feed->url(false)); if (!$feed->pubSubHubbubSubscribe(true)) { //Subscribe - Minz_Log::warning('Error while PubSubHubbub subscribing to ' . $feed->url(false)); + Minz_Log::warning('Error while WebSub subscribing to ' . $feed->url(false)); } } $feed->unlock(); diff --git a/app/Models/Feed.php b/app/Models/Feed.php index fc7ed8c68..b21a8bbbe 100644 --- a/app/Models/Feed.php +++ b/app/Models/Feed.php @@ -498,7 +498,7 @@ class FreshRSS_Feed extends Minz_Model { @unlink($this->lockPath); } - // + // public function pubSubHubbubEnabled() { $url = $this->selfUrl ? $this->selfUrl : $this->url; @@ -534,13 +534,13 @@ class FreshRSS_Feed extends Minz_Model { if ($hubFile = @file_get_contents($hubFilename)) { $hubJson = json_decode($hubFile, true); if (!$hubJson || empty($hubJson['key']) || !ctype_xdigit($hubJson['key'])) { - $text = 'Invalid JSON for PubSubHubbub: ' . $this->url; + $text = 'Invalid JSON for WebSub: ' . $this->url; Minz_Log::warning($text); Minz_Log::warning($text, PSHB_LOG); return false; } if ((!empty($hubJson['lease_end'])) && ($hubJson['lease_end'] < (time() + (3600 * 23)))) { //TODO: Make a better policy - $text = 'PubSubHubbub lease ends at ' + $text = 'WebSub lease ends at ' . date('c', empty($hubJson['lease_end']) ? time() : $hubJson['lease_end']) . ' and needs renewal: ' . $this->url; Minz_Log::warning($text); @@ -560,7 +560,7 @@ class FreshRSS_Feed extends Minz_Model { file_put_contents($hubFilename, json_encode($hubJson)); @mkdir(PSHB_PATH . '/keys/'); file_put_contents(PSHB_PATH . '/keys/' . $key . '.txt', base64url_encode($this->selfUrl)); - $text = 'PubSubHubbub prepared for ' . $this->url; + $text = 'WebSub prepared for ' . $this->url; Minz_Log::debug($text); Minz_Log::debug($text, PSHB_LOG); } @@ -579,17 +579,17 @@ class FreshRSS_Feed extends Minz_Model { $hubFilename = PSHB_PATH . '/feeds/' . base64url_encode($url) . '/!hub.json'; $hubFile = @file_get_contents($hubFilename); if ($hubFile === false) { - Minz_Log::warning('JSON not found for PubSubHubbub: ' . $this->url); + Minz_Log::warning('JSON not found for WebSub: ' . $this->url); return false; } $hubJson = json_decode($hubFile, true); if (!$hubJson || empty($hubJson['key']) || !ctype_xdigit($hubJson['key']) || empty($hubJson['hub'])) { - Minz_Log::warning('Invalid JSON for PubSubHubbub: ' . $this->url); + Minz_Log::warning('Invalid JSON for WebSub: ' . $this->url); return false; } $callbackUrl = checkUrl(Minz_Request::getBaseUrl() . '/api/pshb.php?k=' . $hubJson['key']); if ($callbackUrl == '') { - Minz_Log::warning('Invalid callback for PubSubHubbub: ' . $this->url); + Minz_Log::warning('Invalid callback for WebSub: ' . $this->url); return false; } if (!$state) { //unsubscribe @@ -618,7 +618,7 @@ class FreshRSS_Feed extends Minz_Model { $response = curl_exec($ch); $info = curl_getinfo($ch); - Minz_Log::warning('PubSubHubbub ' . ($state ? 'subscribe' : 'unsubscribe') . ' to ' . $url . + Minz_Log::warning('WebSub ' . ($state ? 'subscribe' : 'unsubscribe') . ' to ' . $url . ' via hub ' . $hubJson['hub'] . ' with callback ' . $callbackUrl . ': ' . $info['http_code'] . ' ' . $response, PSHB_LOG); @@ -634,5 +634,5 @@ class FreshRSS_Feed extends Minz_Model { return false; } - // + // } diff --git a/app/i18n/cz/sub.php b/app/i18n/cz/sub.php index ec4c6f374..ad02f6f49 100644 --- a/app/i18n/cz/sub.php +++ b/app/i18n/cz/sub.php @@ -45,7 +45,7 @@ return array( 'main_stream' => 'Zobrazit ve “Všechny kanály”', 'normal' => 'Show in its category', //TODO - Translation ), - 'pubsubhubbub' => 'Okamžité oznámení s PubSubHubbub', + 'websub' => 'Okamžité oznámení s WebSub', 'show' => array( 'all' => 'Show all feeds', //TODO - Translation 'error' => 'Show only feeds with error', //TODO - Translation diff --git a/app/i18n/de/sub.php b/app/i18n/de/sub.php index c4455c4be..aa408e8c7 100644 --- a/app/i18n/de/sub.php +++ b/app/i18n/de/sub.php @@ -45,7 +45,7 @@ return array( 'main_stream' => 'In Haupt-Feeds zeigen', 'normal' => 'Zeige in eigener Kategorie', ), - 'pubsubhubbub' => 'Sofortbenachrichtigung mit PubSubHubbub', + 'websub' => 'Sofortbenachrichtigung mit WebSub', 'show' => array( 'all' => 'Show all feeds', //TODO - Translation 'error' => 'Show only feeds with error', //TODO - Translation diff --git a/app/i18n/en/sub.php b/app/i18n/en/sub.php index 1dac808b0..9acbcbf33 100644 --- a/app/i18n/en/sub.php +++ b/app/i18n/en/sub.php @@ -45,7 +45,7 @@ return array( 'main_stream' => 'Show in main stream', 'normal' => 'Show in its category', ), - 'pubsubhubbub' => 'Instant notification with PubSubHubbub', + 'websub' => 'Instant notification with WebSub', 'show' => array( 'all' => 'Show all feeds', 'error' => 'Show only feeds with error', diff --git a/app/i18n/es/sub.php b/app/i18n/es/sub.php index b6a7eb568..64e420dc1 100755 --- a/app/i18n/es/sub.php +++ b/app/i18n/es/sub.php @@ -45,7 +45,7 @@ return array( 'main_stream' => 'Mostrar en salida principal', 'normal' => 'Show in its category', //TODO - Translation ), - 'pubsubhubbub' => 'Notificación inmedaiata con PubSubHubbub', + 'websub' => 'Notificación inmedaiata con WebSub', 'show' => array( 'all' => 'Show all feeds', //TODO - Translation 'error' => 'Show only feeds with error', //TODO - Translation diff --git a/app/i18n/fr/sub.php b/app/i18n/fr/sub.php index b5eaccef4..6cb31414d 100644 --- a/app/i18n/fr/sub.php +++ b/app/i18n/fr/sub.php @@ -45,7 +45,7 @@ return array( 'main_stream' => 'Afficher dans le flux principal', 'normal' => 'Afficher dans sa catégorie', ), - 'pubsubhubbub' => 'Notification instantanée par PubSubHubbub', + 'websub' => 'Notification instantanée par WebSub', 'show' => array( 'all' => 'Montrer tous les flux', 'error' => 'Montrer seulement les flux en erreur', diff --git a/app/i18n/he/sub.php b/app/i18n/he/sub.php index f467df28c..e4c487b84 100644 --- a/app/i18n/he/sub.php +++ b/app/i18n/he/sub.php @@ -45,7 +45,7 @@ return array( 'main_stream' => 'הצגה בזרם המרכזי', 'normal' => 'Show in its category', //TODO - Translation ), - 'pubsubhubbub' => 'Instant notification with PubSubHubbub', //TODO - Translation + 'websub' => 'Instant notification with WebSub', //TODO - Translation 'show' => array( 'all' => 'Show all feeds', //TODO - Translation 'error' => 'Show only feeds with error', //TODO - Translation diff --git a/app/i18n/it/sub.php b/app/i18n/it/sub.php index cbb488f3e..6faa48d63 100644 --- a/app/i18n/it/sub.php +++ b/app/i18n/it/sub.php @@ -45,7 +45,7 @@ return array( 'main_stream' => 'Mostra in homepage', //TODO - Translation 'normal' => 'Show in its category', //TODO - Translation ), - 'pubsubhubbub' => 'Notifica istantanea con PubSubHubbub', + 'websub' => 'Notifica istantanea con WebSub', 'show' => array( 'all' => 'Show all feeds', //TODO - Translation 'error' => 'Show only feeds with error', //TODO - Translation diff --git a/app/i18n/kr/sub.php b/app/i18n/kr/sub.php index 785a3ea96..463496c57 100644 --- a/app/i18n/kr/sub.php +++ b/app/i18n/kr/sub.php @@ -45,7 +45,7 @@ return array( 'main_stream' => '메인 스트림에 표시하기', 'normal' => '피드가 속한 카테고리에만 표시하기', ), - 'pubsubhubbub' => 'PubSubHubbub을 사용한 즉시 알림', + 'websub' => 'WebSub을 사용한 즉시 알림', 'show' => array( 'all' => 'Show all feeds', //TODO - Translation 'error' => 'Show only feeds with error', //TODO - Translation diff --git a/app/i18n/nl/sub.php b/app/i18n/nl/sub.php index 53954ad3f..36c96b53f 100644 --- a/app/i18n/nl/sub.php +++ b/app/i18n/nl/sub.php @@ -45,7 +45,7 @@ return array( 'main_stream' => 'Zichtbaar in het overzicht', 'normal' => 'Toon in categorie', ), - 'pubsubhubbub' => 'Directe notificaties met PubSubHubbub', + 'websub' => 'Directe notificaties met WebSub', 'show' => array( 'all' => 'Show all feeds', //TODO - Translation 'error' => 'Show only feeds with error', //TODO - Translation diff --git a/app/i18n/oc/sub.php b/app/i18n/oc/sub.php index 1d2e0007b..f9ddf339a 100644 --- a/app/i18n/oc/sub.php +++ b/app/i18n/oc/sub.php @@ -44,7 +44,7 @@ return array( 'main_stream' => 'Mostar al flux màger', 'normal' => 'Mostar dins sa categoria', ), - 'pubsubhubbub' => 'Notificaciones instantáneas amb PubSubHubbub', + 'websub' => 'Notificaciones instantáneas amb WebSub', 'show' => array( 'all' => 'Show all feeds', //TODO - Translation 'error' => 'Show only feeds with error', //TODO - Translation diff --git a/app/i18n/pt-br/sub.php b/app/i18n/pt-br/sub.php index 03ae9d014..78684c14c 100644 --- a/app/i18n/pt-br/sub.php +++ b/app/i18n/pt-br/sub.php @@ -45,7 +45,7 @@ return array( 'main_stream' => 'Mostrar na tela principal', 'normal' => 'Show in its category', //TODO - Translation ), - 'pubsubhubbub' => 'Notificação instantânea com PubSubHubbub', + 'websub' => 'Notificação instantânea com WebSub', 'show' => array( 'all' => 'Show all feeds', //TODO - Translation 'error' => 'Show only feeds with error', //TODO - Translation diff --git a/app/i18n/ru/sub.php b/app/i18n/ru/sub.php index ccd3b0020..7de80586b 100644 --- a/app/i18n/ru/sub.php +++ b/app/i18n/ru/sub.php @@ -45,7 +45,7 @@ return array( 'main_stream' => 'Show in main stream', //TODO - Translation 'normal' => 'Show in its category', //TODO - Translation ), - 'pubsubhubbub' => 'Instant notification with PubSubHubbub', //TODO - Translation + 'websub' => 'Instant notification with WebSub', //TODO - Translation 'show' => array( 'all' => 'Show all feeds', //TODO - Translation 'error' => 'Show only feeds with error', //TODO - Translation diff --git a/app/i18n/tr/sub.php b/app/i18n/tr/sub.php index 4d71e3dbf..b5b56f4b8 100644 --- a/app/i18n/tr/sub.php +++ b/app/i18n/tr/sub.php @@ -45,7 +45,7 @@ return array( 'main_stream' => 'Ana akışda göster', 'normal' => 'Show in its category', //TODO - Translation ), - 'pubsubhubbub' => 'PubSubHubbub ile anlık bildirim', + 'websub' => 'WebSub ile anlık bildirim', 'show' => array( 'all' => 'Show all feeds', //TODO - Translation 'error' => 'Show only feeds with error', //TODO - Translation diff --git a/app/i18n/zh-cn/sub.php b/app/i18n/zh-cn/sub.php index 49b6e4304..e1c176bc6 100644 --- a/app/i18n/zh-cn/sub.php +++ b/app/i18n/zh-cn/sub.php @@ -45,7 +45,7 @@ return array( 'main_stream' => '在首页中显示', 'normal' => '在分类中显示', ), - 'pubsubhubbub' => 'PubSubHubbub 即时通知', + 'websub' => 'WebSub 即时通知', 'show' => array( 'all' => 'Show all feeds', //TODO - Translation 'error' => 'Show only feeds with error', //TODO - Translation diff --git a/app/views/helpers/feed/update.phtml b/app/views/helpers/feed/update.phtml index 4dbaacd04..bc90ba456 100644 --- a/app/views/helpers/feed/update.phtml +++ b/app/views/helpers/feed/update.phtml @@ -133,7 +133,7 @@
    - +