]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge remote-tracking branch 'origin/master' into 2.1
authorJeremy Benoist <jeremy.benoist@gmail.com>
Mon, 22 Aug 2016 21:03:16 +0000 (23:03 +0200)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Mon, 22 Aug 2016 21:03:16 +0000 (23:03 +0200)
22 files changed:
1  2 
.travis.yml
app/Resources/static/themes/baggy/css/ratatouille.css
app/Resources/static/themes/material/css/main.css
app/config/config.yml
src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entry.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
tests/Wallabag/CoreBundle/Command/InstallCommandTest.php

diff --combined .travis.yml
index 69b4f91984928960a3cae24ed311ddd6351880c1,73f9491ab62d6922eb75c83a8b29db7a88a6448f..65e7e3047520236450f84b824093b53187e5feba
@@@ -15,37 -15,46 +15,54 @@@ cache
      directories:
          - vendor
          - $HOME/.composer/cache
 +        - node_modules
 +        - $HOME/.cache/bower
 +        - $HOME/.npm
  
  php:
      - 5.5
      - 5.6
      - 7.0
+     - 7.1
      - nightly
-     - hhvm
  
 +node_js:
 +    - "5"
 +
  env:
 -    - DB=mysql
 -    - DB=pgsql
 -    - DB=sqlite
 +    - DB=mysql ASSETS=nobuild
 +    - DB=pgsql ASSETS=nobuild
 +    - DB=sqlite ASSETS=nobuild
  
  matrix:
      fast_finish: true
      include:
+         # driver for PostgreSQL currently unsupported by HHVM, requires 3rd party dependency
+         - php: hhvm-3.12
+           sudo: required
+           dist: trusty
+           group: edge
+           env: DB=mysql
+           addons:
+             apt:
+                 packages:
+                     - mysql-server-5.6
+                     - mysql-client-core-5.6
+                     - mysql-client-5.6
+           services:
+             - mysql
+         - php: hhvm-3.12
+           sudo: required
+           dist: trusty
+           group: edge
+           env: DB=sqlite
          - php: 7.0
 -          env: CS_FIXER=run VALIDATE_TRANSLATION_FILE=run DB=sqlite
 +          env: CS_FIXER=run VALIDATE_TRANSLATION_FILE=run DB=sqlite ASSETS=nobuild
 +        - php: 7.0
 +          env: DB=sqlite ASSETS=build
-     exclude:
-         - php: hhvm
-           env: DB=pgsql  # driver for PostgreSQL currently unsupported by HHVM, requires 3rd party dependency
      allow_failures:
-         - php: hhvm
+         - php: hhvm-3.12
+         - php: nightly
  
  # exclude v1 branches
  branches:
          - legacy
  
  before_script:
-     - if [[ $TRAVIS_PHP_VERSION != hhvm ]]; then echo "memory_limit=-1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini; fi;
-     - if [[ $TRAVIS_PHP_VERSION != hhvm ]]; then phpenv config-rm xdebug.ini; fi;
-     - if [ "$TRAVIS_PHP_VERSION" = "5.5" ]; then composer require "phpunit/phpunit:4.*" --no-update; fi;
+     - PHP=$TRAVIS_PHP_VERSION
+     - if [[ ! $PHP = hhvm* ]]; then echo "memory_limit=-1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini; fi;
+     # xdebug isn't enable for PHP 7.1
+     - if [[ ! $PHP = hhvm* ]]; then phpenv config-rm xdebug.ini || echo "xdebug not available"; fi
++    - if [[ $PHP = 5.5 ]]; then composer require "phpunit/phpunit:4.*" --no-update; fi;
      - composer self-update --no-progress
      - if [[ "$DB" = "pgsql" ]]; then psql -c 'create database wallabag_test;' -U postgres; fi;
  
 +install:
 +    - if [[ $ASSETS != nobuild ]]; then source ~/.nvm/nvm.sh && nvm install 5.0; fi;
 +    - if [[ $ASSETS != nobuild ]]; then npm install -g npm@latest; fi;
 +
  before_install:
      - if [[ $TRAVIS_REPO_SLUG = wallabag/wallabag ]]; then cp .composer-auth.json ~/.composer/auth.json; fi;
  
  script:
 -    - travis_wait composer install --no-interaction --no-progress --prefer-dist -o
 +    - travis_wait bash install.sh
      - ant prepare-$DB
      - phpunit -v
      - if [ "$CS_FIXER" = "run" ]; then php bin/php-cs-fixer fix src/ --verbose --dry-run ; fi;
index bf89d8816e66be7b21a2aade9c58d1769e29fed9,605eb64117e263ed03153b4d35ffbc95c4b154a2..b5aeb54e415352e81898c01e1fdaecdee27f607b
@@@ -6,8 -6,8 +6,8 @@@
  
  * {
    -webkit-box-sizing: border-box;
 -     -moz-box-sizing: border-box;
 -          box-sizing: border-box;
 +  -moz-box-sizing: border-box;
 +  box-sizing: border-box;
  }
  
  html {
@@@ -18,7 -18,7 +18,7 @@@
  
  body {
    font-size: 1em;
 -  line-height:1.5;
 +  line-height: 1.5;
    margin: 0;
  }
  
@@@ -35,7 -35,7 +35,7 @@@ h6:first-child
  p:first-child,
  ul:first-child,
  ol:first-child,
 -dl:first-child{
 +dl:first-child {
    margin-top: 0;
  }
  
@@@ -43,13 -43,14 +43,13 @@@ code
  kbd,
  pre,
  samp {
 -    font-family: monospace, serif;
 +  font-family: monospace, serif;
  }
  
  pre {
 -    white-space: pre-wrap;
 +  white-space: pre-wrap;
  }
  
 -
  .upper {
    text-transform: uppercase;
  }
  
  .inner {
    margin: 0 auto;
 -  max-width: 61.25em;/*980px*/
 +  max-width: 61.25em; /* 980px */
  }
  
- table,
- img {
+ table, img, figure {
    max-width: 100%;
 -  height :auto;
 +  heightauto;
  }
  
  iframe {
@@@ -93,13 -93,13 +92,13 @@@ button
  input,
  select,
  textarea {
 -    font-family: inherit;
 -    font-size: 100%;
 -    margin: 0;
 +  font-family: inherit;
 +  font-size: 100%;
 +  margin: 0;
  }
  
  input[type="search"] {
 -    -webkit-appearance: textfield;
 +  -webkit-appearance: textfield;
  }
  
  /* ==========================================================================
    display: none;
  }
  
 -.dtable { display:table }
 +.dtable {
 +  display: table;
 +}
  
 -  .dtable > * { display:table-row; }
 +.dtable > * {
 +  display: table-row;
 +}
  
 -    .dtable > * > * { display:table-cell; }
 +.dtable > * > * {
 +  display: table-cell;
 +}
  
  .element-invisible {
    border: 0;
  }
  
  .small {
 -  font-size:0.8em;
 +  font-size: 0.8em;
  }
  
  .big {
    font-size: 1.2em;
  }
  
 -/*Width*/
 +/* Width */
  
 -.w100 { width:100%; }
 -.w90 { width:90%; }
 -.w80 { width:80%; }
 -.w70 { width:70%; }
 -.w60 { width:60%; }
 -.w50 { width:50%; }
 -.w40 { width:40%; }
 -.w30 { width:30%; }
 -.w20 { width:20%; }
 -.w10 { width:10%; }
 +.w100 {
 +  width: 100%;
 +}
 +
 +.w90 {
 +  width: 90%;
 +}
 +
 +.w80 {
 +  width: 80%;
 +}
  
 +.w70 {
 +  width: 70%;
 +}
 +
 +.w60 {
 +  width: 60%;
 +}
 +
 +.w50 {
 +  width: 50%;
 +}
 +
 +.w40 {
 +  width: 40%;
 +}
 +
 +.w30 {
 +  width: 30%;
 +}
 +
 +.w20 {
 +  width: 20%;
 +}
 +
 +.w10 {
 +  width: 10%;
 +}
  
  /* ==========================================================================
     Internet Explorer
     ========================================================================== */
  
 -/*IE8 and IE9*/
 +/* IE8 and IE9 */
  
  article,
  aside,
@@@ -206,20 -172,40 +205,20 @@@ main
  nav,
  section,
  summary {
 -    display: block;
 +  display: block;
  }
  
 -/*IE8 and IE9*/
 +/* IE8 and IE9 */
  
  audio,
  canvas,
  video {
 -    display: inline-block;
 +  display: inline-block;
  }
  
 -@media screen and (-webkit-min-device-pixel-ratio:0){
 -  select{
 +@media screen and (-webkit-min-device-pixel-ratio: 0) {
 +  select {
      -webkit-appearance: none;
      border-radius: 0;
    }
  }
 -
 -/* ==========================================================================
 -   Medias Queries
 -   ========================================================================== */
 -
 -/*Desktop 1080px*/
 -
 -@media screen and (max-width: 67.50em) {
 -}
 -
 -/*Tablet 800px*/
 -
 -@media screen and (max-width: 50em) {
 -}
 -
 -/*Mobile 640px*/
 -
 -@media screen and (max-width: 40em) {
 -}
 -
index 2ffe0b4681846e6e306842ce137889184d250f9d,0000000000000000000000000000000000000000..cade37f634f79d6744ded02292a8bb1c3055c7b6
mode 100755,000000..100755
--- /dev/null
@@@ -1,657 -1,0 +1,658 @@@
- #article img {
 +/* ==========================================================================
 +   Sommaire
 +
 +   0 = Common
 +   1 = Nav
 +   2 = Side-nav
 +   3 = Filters slider
 +   4 = Cards
 +   5 = Article
 +   6 = Media queries
 +   7 = Font
 +   8 = Others
 +
 +   ========================================================================== */
 +
 +/* ==========================================================================
 +   0 = Common
 +   ========================================================================== */
 +
 +@font-face {
 +  font-family: icomoon;
 +  src: url("../fonts/icomoon.eot");
 +  src:
 +    url("../fonts/icomoon.eot#iefix") format("embedded-opentype"),
 +    url("../fonts/icomoon.ttf") format("truetype"),
 +    url("../fonts/icomoon.woff") format("woff"),
 +    url("../fonts/icomoon.svg#icomoon") format("svg");
 +  font-weight: normal;
 +  font-style: normal;
 +}
 +
 +@font-face {
 +  font-family: 'Material Icons';
 +  font-style: normal;
 +  font-weight: 400;
 +  src: url(../fonts/MaterialIcons-Regular.eot);
 +
 +  /* For IE6-8 */
 +  src: local("Material Icons"), local("MaterialIcons-Regular"), url(../fonts/MaterialIcons-Regular.woff2) format("woff2"), url(../fonts/MaterialIcons-Regular.woff) format("woff"), url(../fonts/MaterialIcons-Regular.ttf) format("truetype");
 +}
 +
 +.material-icons {
 +  font-family: 'Material Icons';
 +  font-weight: normal;
 +  font-style: normal;
 +  font-size: 24px;  /* Preferred icon size */
 +  width: 1em;
 +  height: 1em;
 +  display: inline-block;
 +  line-height: 1;
 +  text-transform: none;
 +  letter-spacing: normal;
 +  word-wrap: normal;
 +  white-space: nowrap;
 +  direction: ltr;
 +
 +  /* Support for all WebKit browsers. */
 +  -webkit-font-smoothing: antialiased;
 +
 +  /* Support for Safari and Chrome. */
 +  text-rendering: optimizeLegibility;
 +
 +  /* Support for Firefox. */
 +  -moz-osx-font-smoothing: grayscale;
 +
 +  /* Support for IE. */
 +  font-feature-settings: 'liga';
 +}
 +
 +[class^="icon-"],
 +[class*=" icon-"] {
 +  font-family: icomoon;
 +  speak: none;
 +  font-style: normal;
 +  font-weight: normal;
 +  font-variant: normal;
 +  text-transform: none;
 +  line-height: 1;
 +
 +  /* Better Font Rendering =========== */
 +  -webkit-font-smoothing: antialiased;
 +  -moz-osx-font-smoothing: grayscale;
 +}
 +
 +body {
 +  display: flex;
 +  min-height: 100vh;
 +  flex-direction: column;
 +  background: #f0f0f0;
 +}
 +
 +body.login main {
 +  padding: 0;
 +}
 +
 +.border-bottom {
 +  border-bottom: 1px solid #ddd;
 +}
 +
 +nav,
 +main,
 +footer {
 +  padding-left: 240px;
 +}
 +
 +main,
 +#content,
 +.valign-wrapper {
 +  height: 100%;
 +}
 +
 +#main {
 +  flex: 1 0 auto;
 +}
 +
 +.results {
 +  height: 1em;
 +  line-height: 30px;
 +}
 +
 +.results .nb-results,
 +.results .pagination {
 +  margin: 15px;
 +  margin-bottom: 0;
 +}
 +
 +.pagination {
 +  float: right;
 +}
 +
 +.pagination ul {
 +  margin: 0 !important;
 +}
 +
 +.pagination li {
 +  padding: 0;
 +}
 +
 +.pagination a {
 +  padding: 0 10px;
 +  height: 30px;
 +  display: block;
 +}
 +
 +.pagination .disabled {
 +  margin-right: 10px;
 +  margin-left: 10px;
 +}
 +
 +div.pagination ul .prev.disabled,
 +div.pagination ul .next.disabled {
 +  display: none;
 +}
 +
 +.pagination li.active span {
 +  padding: 0 10px;
 +  height: 30px;
 +  display: block;
 +  color: #fff;
 +}
 +
 +.page-footer .footer-copyright p {
 +  display: inline;
 +}
 +
 +.hidden {
 +  display: none;
 +}
 +
 +.picker__date-display {
 +  display: none;
 +}
 +
 +footer.page-footer {
 +  margin-top: 10px;
 +  padding-top: 10px;
 +}
 +
 +footer .row {
 +  margin-bottom: 10px;
 +}
 +
 +/* ==========================================================================
 +   1 = Nav
 +   ========================================================================== */
 +
 +nav input {
 +  color: #aaa;
 +}
 +
 +.nav-wrapper .button-collapse {
 +  padding: 0 15px;
 +}
 +
 +.nav-input {
 +  display: none;
 +}
 +
 +.nav-panels {
 +  overflow: hidden;
 +}
 +
 +.nav-panel-buttom li {
 +  max-height: 64px;
 +}
 +
 +.nav-panels {
 +  transition: background 0.2s ease;
 +}
 +
 +.nav-panel-add .add,
 +.nav-panel-search .search,
 +.nav-panels .close {
 +  color: #444 !important;
 +}
 +
 +.nav-panels .action {
 +  padding-left: 0.75rem;
 +  font-size: 2.1rem;
 +  white-space: nowrap;
 +}
 +
 +.nav-panels .input-field input {
 +  display: block;
 +  line-height: inherit;
 +  padding-left: 4rem !important;
 +  width: calc(100% - 8rem);
 +}
 +
 +.nav-panels .input-field input:focus {
 +  background-color: #fff;
 +  border: 0;
 +  box-shadow: none;
 +  color: #444;
 +}
 +
 +.input-field.nav-panel-add label {
 +  left: 1rem;
 +}
 +
 +.input-field.nav-panel-add .close {
 +  position: absolute;
 +  top: 0;
 +  right: 1rem;
 +  color: transparent;
 +  cursor: pointer;
 +  font-size: 2rem;
 +  transition: 0.3s color;
 +}
 +
 +#button_filters {
 +  display: none;
 +}
 +
 +#button_export {
 +  display: none;
 +}
 +
 +/* ==========================================================================
 +   2 = Side-nav
 +   ========================================================================== */
 +
 +.side-nav.fixed a {
 +  font-size: 13px;
 +  line-height: 44px;
 +  height: 44px;
 +}
 +
 +.side-nav .collapsible-header,
 +.side-nav.fixed .collapsible-header {
 +  height: 45px;
 +  line-height: 44px;
 +  padding: 0 20px;
 +}
 +
 +.bold > a {
 +  font-weight: bold;
 +}
 +
 +.side-nav > li.logo {
 +  line-height: 0;
 +  text-align: center;
 +}
 +
 +#main .logo a {
 +  height: 100pt;
 +}
 +
 +#main .logo img {
 +  height: 100pt;
 +  width: 100pt;
 +}
 +
 +#main .logo:hover {
 +  background: transparent;
 +}
 +
 +.side-nav li {
 +  padding: 0;
 +}
 +
 +.side-nav a {
 +  margin: 0 1rem;
 +}
 +
 +/* ==========================================================================
 + * 3 = Filters slider
 + * ========================================================================== */
 +
 +#filters button {
 +  padding: 0;
 +  width: 100%;
 +}
 +
 +.side-nav.fixed.right-aligned {
 +  right: -250px;
 +  left: auto !important;
 +  overflow-y: visible;
 +}
 +
 +#filters div.with-checkbox {
 +  height: 3rem;
 +  margin-top: 0;
 +}
 +
 +/* ==========================================================================
 +   4 = Cards
 +   ========================================================================== */
 +
 +main #content {
 +  padding: 0 0.5rem;
 +}
 +
 +main ul.row {
 +  padding: 0 0.75rem;
 +}
 +
 +.data .card .card-body {
 +  height: 22em;
 +  overflow: hidden;
 +}
 +
 +.card .card-content .card-title {
 +  line-height: 32px;
 +}
 +
 +.card .card-entry-labels {
 +  position: absolute;
 +  top: 10px;
 +  z-index: 90;
 +  max-width: 50%;
 +}
 +
 +.card .card-entry-labels li {
 +  margin: 10px 10px 10px auto;
 +  padding: 5px 12px 5px 16px;
 +  background-color: rgba(0, 151, 167, 0.85);
 +  border-radius: 0 3px 3px 0;
 +  color: #fff;
 +  cursor: default;
 +  max-height: 2em;
 +  overflow: hidden;
 +  text-overflow: ellipsis;
 +  white-space: nowrap;
 +}
 +
 +.card .card-entry-labels-hidden {
 +  margin-top: 5px;
 +}
 +
 +.card .card-entry-labels-hidden li {
 +  display: inline-block;
 +  background-color: rgba(0, 151, 167, 0.85);
 +  margin: 0 5px;
 +  padding: 5px 12px;
 +  border-radius: 3px;
 +  color: #fff;
 +  max-height: 2em;
 +  max-width: calc(100% - 15px);
 +  overflow: hidden;
 +  text-overflow: ellipsis;
 +  white-space: nowrap;
 +}
 +
 +.card .card-content .estimatedTime {
 +  margin-bottom: 10px;
 +}
 +
 +.card .card-action .original {
 +  line-height: 24px;
 +}
 +
 +.card .card-action ul.links {
 +  margin: 0;
 +  font-size: 24px;
 +  line-height: 24px;
 +}
 +
 +.card .card-action a {
 +  color: #fff;
 +  margin: 0;
 +}
 +
 +.card .card-action a:hover {
 +  color: #fff;
 +}
 +
 +.settings .div_tabs {
 +  padding-bottom: 15px;
 +}
 +
 +.card.sw {
 +  max-width: 370px;
 +  margin-left: auto;
 +  margin-right: auto;
 +}
 +
 +.card .card-image {
 +  height: 14em;
 +}
 +
 +.card .card-image .preview {
 +  height: 14em;
 +  background-size: cover;
 +  background-repeat: no-repeat;
 +  background-position: 50%;
 +}
 +
 +/* ==========================================================================
 +   5 = Article
 +   ========================================================================== */
 +
 +#article {
 +  font-size: 20px;
 +  margin: 0 auto;
 +  max-width: 40em;
 +}
 +
++#article img,
++#article figure {
 +  max-width: 100%;
 +  height: auto;
 +}
 +
 +#article > header > h1 {
 +  font-size: 2em;
 +}
 +
 +.reader-mode {
 +  width: 95px !important;
 +  transition: width 0.2s ease;
 +}
 +
 +.reader-mode:hover {
 +  width: 240px !important;
 +}
 +
 +.reader-mode .collapsible-body {
 +  height: 0;
 +  overflow: hidden;
 +}
 +
 +.reader-mode:hover .collapsible-body {
 +  height: auto;
 +}
 +
 +.reader-mode span {
 +  opacity: 0;
 +  transition: opacity 0.2s ease;
 +}
 +
 +.reader-mode:hover span {
 +  opacity: 1;
 +}
 +
 +.progress {
 +  position: fixed;
 +  top: 0;
 +  width: 100%;
 +  height: 3px;
 +  margin: 0;
 +  z-index: 9999;
 +}
 +
 +#article aside .link {
 +  color: #000;
 +  font-size: 0.8em;
 +  text-decoration: none;
 +}
 +
 +#article aside #list {
 +  float: right;
 +  margin: 0 15px 10px;
 +}
 +
 +#article aside .chip {
 +  background-color: rgba(0, 151, 167, 0.85);
 +  color: #fff;
 +  padding: 0 15px 0 10px;
 +}
 +
 +#article aside .chip i {
 +  color: #fff;
 +}
 +
 +/* ==========================================================================
 +   6 = Media queries
 +   ========================================================================== */
 +
 +@media only screen and (max-width: 992px) {
 +  header,
 +  main,
 +  footer {
 +    padding-left: 0;
 +  }
 +  nav,
 +  main,
 +  footer {
 +    padding-left: 0;
 +  }
 +  .pagination {
 +    width: auto;
 +  }
 +  .reader-mode {
 +    width: 240px !important;
 +  }
 +  .reader-mode span {
 +    opacity: 1;
 +  }
 +  .tabs {
 +    display: inline-block;
 +    height: auto;
 +  }
 +  .tab {
 +    min-width: 100%;
 +  }
 +  .indicator {
 +    display: none;
 +  }
 +  .pagination li.prev,
 +  .pagination li.next {
 +    width: auto;
 +  }
 +}
 +
 +@media only screen and (min-width: 400px) {
 +  .nav-panel-buttom {
 +    float: right;
 +  }
 +}
 +
 +@media only screen and (min-width: 993px) and (max-width: 1180px) {
 +  .row .col.l1 {
 +    width: 25%;
 +    margin-left: 0;
 +  }
 +  .row .col.l2 {
 +    width: 33.33333%;
 +    margin-left: 0;
 +  }
 +  .row .col.l3 {
 +    width: 41.66667%;
 +    margin-left: 0;
 +  }
 +  .row .col.l4 {
 +    width: 50%;
 +    margin-left: 0;
 +  }
 +  .row .col.l5 {
 +    width: 58.33333%;
 +    margin-left: 0;
 +  }
 +  .row .col.l6 {
 +    width: 66.66667%;
 +    margin-left: 0;
 +  }
 +  .row .col.l7 {
 +    width: 75%;
 +    margin-left: 0;
 +  }
 +  .row .col.l8 {
 +    width: 83.33333%;
 +    margin-left: 0;
 +  }
 +  .row .col.l9 {
 +    width: 91.66667%;
 +    margin-left: 0;
 +  }
 +  .row .col.l10 {
 +    width: 100%;
 +    margin-left: 0;
 +  }
 +}
 +
 +@media only screen and (max-width: 350px) {
 +  .nb-results {
 +    display: none;
 +  }
 +}
 +
 +/* ==========================================================================
 +   7 = Font
 +   ========================================================================== */
 +
 +.icon-google-plus2::before {
 +  content: "\ea89";
 +}
 +
 +.icon-facebook2::before {
 +  content: "\ea8d";
 +}
 +
 +.icon-twitter::before {
 +  content: "\ea91";
 +}
 +
 +.icon-apple::before {
 +  content: "\eabf";
 +}
 +
 +.icon-android::before {
 +  content: "\eac1";
 +}
 +
 +.icon-chrome::before {
 +  content: "\eae5";
 +}
 +
 +.icon-firefox::before {
 +  content: "\eae6";
 +}
 +
 +footer [class^="icon-"],
 +footer [class*=" icon-"] {
 +  font-size: 2em;
 +  transition: text-shadow 0.2s ease;
 +  padding-right: 10px;
 +}
 +
 +footer [class^="icon-"]:hover,
 +footer [class*=" icon-"]:hover {
 +  text-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
 +}
 +
 +/* ==========================================================================
 +   8 = Others
 +   ========================================================================== */
 +
 +/* force height on non-input field in the settings page */
 +div.settings div.input-field div,
 +div.settings div.input-field ul {
 +  margin-top: 40px;
 +}
 +
 +/* but avoid to kill all file input */
 +div.settings div.file-field div {
 +  margin-top: inherit;
 +}
diff --combined app/config/config.yml
index a1517e974eff46a3004344b50518448e421847fc,49b325a291299fa5c8073298541499abc7195e87..807543930045daf6b6640963c76366dbe9fa4986
@@@ -30,7 -30,7 +30,7 @@@ framework
      assets: ~
  
  wallabag_core:
-     version: 2.0.5
+     version: 2.0.7
      paypal_url: "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9UBA65LG3FX9Y&lc=gb"
      languages:
          en: 'English'
@@@ -61,6 -61,19 +61,6 @@@ twig
      form_themes:
          - "LexikFormFilterBundle:Form:form_div_layout.html.twig"
  
 -# Assetic Configuration
 -assetic:
 -    debug: "%kernel.debug%"
 -    use_controller: false
 -    bundles:        [ ]
 -    #java: /usr/bin/java
 -    filters:
 -        cssrewrite: ~
 -        #closure:
 -        #    jar: "%kernel.root_dir%/Resources/java/compiler.jar"
 -        #yui_css:
 -        #    jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar"
 -
  # Doctrine Configuration
  doctrine:
      dbal:
@@@ -138,6 -151,11 +138,11 @@@ nelmio_cors
          #origin_regex: false
      paths:
          '^/api/':
+             allow_origin: ['*']
+             allow_headers: ['X-Custom-Auth']
+             allow_methods: ['POST', 'PUT', 'PATCH','GET', 'DELETE']
+             max_age: 3600
+         '^/oauth/':
              allow_origin: ['*']
              allow_headers: ['X-Custom-Auth']
              allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
index 798d8cbad0c909fbb99bceb99d52c7f65a515f18,c066aaf798b52ab4ef7cbbeafb3e5e784506083e..c24475d2688b1780bd4e78a124d5a264f67e048b
@@@ -144,7 -144,8 +144,9 @@@ entry
          reading_time: 'estimeret læsetid'
          reading_time_minutes: 'estimeret læsetid: %readingTime% min'
          reading_time_less_one_minute: 'estimeret læsetid: <small class="inferieur">&lt;</small> 1 min'
 +        # number_of_tags: '{1}and one other tag|]1,Inf[and %count% other tags'
+         reading_time_minutes_short: '%readingTime% min'
+         reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
          original_article: 'original'
          toogle_as_read: 'Marker som læst'
          toogle_as_star: 'Skift favoritstatus'
              back_to_homepage: 'Tilbage'
              set_as_read: 'Marker som læst'
              # set_as_unread: 'Mark as unread'
-             set_as_favorite: 'Marker som favorit'
+             set_as_starred: 'Marker som favorit'
              view_original_article: 'Originalartikel'
              # re_fetch_content: 'Re-fetch content'
              delete: 'Slet'
          edit_title: 'Rediger titel'
          original_article: 'original'
          # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations'
+         created_at: 'Oprettelsesdato'
      new:
          page_title: 'Gem ny artikel'
          placeholder: 'http://website.com'
index 0b8516ee733ee8174613f5d7adbd584caad6873e,28d826b66d1a5c7c1c11b86411f422829a09d826..384ec09a15eeda9ad4a312f2aa5332508bae6923
@@@ -144,7 -144,8 +144,9 @@@ entry
          reading_time: 'geschätzte Lesezeit'
          reading_time_minutes: 'geschätzte Lesezeit: %readingTime% min'
          reading_time_less_one_minute: 'geschätzte Lesezeit: <small class="inferieur">&lt;</small> 1 min'
 +        # number_of_tags: '{1}and one other tag|]1,Inf[and %count% other tags'
+         reading_time_minutes_short: '%readingTime% min'
+         reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
          original_article: 'original'
          toogle_as_read: 'Gelesen-Status ändern'
          toogle_as_star: 'Favoriten-Status ändern'
              back_to_homepage: 'Zurück'
              set_as_read: 'Als gelesen markieren'
              set_as_unread: 'Als ungelesen markieren'
-             set_as_favorite: 'Favorisieren'
+             set_as_starred: 'Favorisieren'
              view_original_article: 'Original-Artikel'
              re_fetch_content: 'Inhalt neu laden'
              delete: 'Löschen'
          edit_title: 'Titel ändern'
          original_article: 'original'
          annotations_on_the_entry: '{0} Keine Anmerkungen|{1} Eine Anmerkung|]1,Inf[ %nbAnnotations% Anmerkungen'
+         created_at: 'Erstellungsdatum'
      new:
          page_title: 'Neuen Artikel speichern'
          placeholder: 'https://website.de'
@@@ -397,7 -399,7 +400,7 @@@ flashes
      entry:
          notice:
              entry_already_saved: 'Eintrag bereits am %date% gespeichert'
-             entry_saved: 'Eintag gespeichert'
+             entry_saved: 'Eintrag gespeichert'
              # entry_saved_failed: 'Failed to save entry'
              entry_updated: 'Eintrag aktualisiert'
              entry_reloaded: 'Eintrag neugeladen'
index 2c087421d33adcde57f31fbcbfb3574453ad9f1b,c6633f5ba115e04204bb0c3f64df00cfe6349f91..ea860564b9eabf177b824bd59d6dfc241d15104e
@@@ -144,10 -144,11 +144,12 @@@ entry
          reading_time: 'estimated reading time'
          reading_time_minutes: 'estimated reading time: %readingTime% min'
          reading_time_less_one_minute: 'estimated reading time: <small class="inferieur">&lt;</small> 1 min'
 +        number_of_tags: '{1}and one other tag|]1,Inf[and %count% other tags'
+         reading_time_minutes_short: '%readingTime% min'
+         reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
          original_article: 'original'
          toogle_as_read: 'Toggle mark as read'
-         toogle_as_star: 'Toggle favorite'
+         toogle_as_star: 'Toggle starred'
          delete: 'Delete'
          export_title: 'Export'
      filters:
              back_to_homepage: 'Back'
              set_as_read: 'Mark as read'
              set_as_unread: 'Mark as unread'
-             set_as_favorite: 'Favorite'
+             set_as_starred: 'Toggle starred'
              view_original_article: 'Original article'
              re_fetch_content: 'Re-fetch content'
              delete: 'Delete'
          edit_title: 'Edit title'
          original_article: 'original'
          annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations'
+         created_at: 'Creation date'
      new:
          page_title: 'Save new entry'
          placeholder: 'http://website.com'
@@@ -352,21 -354,19 +355,21 @@@ developer
          field_grant_types: 'Grant type allowed'
          no_client: 'No client yet.'
      remove:
 -        warn_message_1: 'You have the ability to remove this client. This action is IRREVERSIBLE !'
 +        warn_message_1: 'You have the ability to remove the client %name%. This action is IRREVERSIBLE !'
          warn_message_2: "If you remove it, every app configured with that client won't be able to auth on your wallabag."
 -        action: 'Remove this client'
 +        action: 'Remove the client %name%'
      client:
          page_title: 'Developer > New client'
          page_description: 'You are about to create a new client. Please fill the field below for the redirect URI of your application.'
          form:
 -            redirect_uris_label: 'Redirect URIs'
 +            name_label: 'Name of the client'
 +            redirect_uris_label: 'Redirect URIs (optional)'
              save_label: 'Create a new client'
          action_back: 'Back'
      client_parameter:
          page_title: 'Developer > Client parameters'
          page_description: 'Here are your client parameters.'
 +        field_name: 'Client name'
          field_id: 'Client ID'
          field_secret: 'Client secret'
          back: 'Back'
@@@ -419,5 -419,5 +422,5 @@@ flashes
              summary: 'Import summary: %imported% imported, %skipped% already saved.'
      developer:
          notice:
 -            client_created: 'New client created.'
 -            client_deleted: 'Client deleted'
 +            client_created: 'New client %name% created.'
 +            client_deleted: 'Client %name% deleted'
index 5a755e6c095bbc655708e015dd7171ca83144f58,266b4af5b933f3a732069b7e4a7713d6b17ff85e..f64e95d5acac8bf3943db45d55f841169e93f8d4
@@@ -144,7 -144,8 +144,9 @@@ entry
          reading_time: 'tiempo estimado de lectura'
          reading_time_minutes: 'tiempo estimado de lectura: %readingTime% min'
          reading_time_less_one_minute: 'tiempo estimado de lectura: <small class="inferieur">&lt;</small> 1 min'
 +        # number_of_tags: '{1}and one other tag|]1,Inf[and %count% other tags'
+         reading_time_minutes_short: '%readingTime% min'
+         reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
          original_article: 'original'
          toogle_as_read: 'Marcar como leído/ no leído'
          toogle_as_star: 'Marcar como favorito/ no favorito'
              back_to_homepage: 'Regrese a la página principal'
              set_as_read: 'Marcar como leído'
              set_as_unread: 'Marcar como no leído'
-             set_as_favorite: 'Marcar como favorito'
+             set_as_starred: 'Marcar como favorito'
              view_original_article: 'Artículo original'
              re_fetch_content: 'Redescargar el contenido'
              delete: 'Suprimir'
          edit_title: 'Modificar el título'
          original_article: 'original'
          annotations_on_the_entry: '{0} Sin anotaciones|{1} Una anotación|]1,Inf[ %nbAnnotations% anotaciones'
+         created_at: 'Fecha de creación'
      new:
          page_title: 'Guardar un nuevo artículo'
          placeholder: 'http://website.com'
index 5a8bc5c4b4395894e292fe9337ea09dd07371ff0,c2350019c3df9180c5801fdc334de0858f415ce8..e3592a782865c8bb0f0a6acfa7d7f116325e2086
@@@ -144,7 -144,8 +144,9 @@@ entry
          reading_time: 'زمان تخمینی برای خواندن'
          reading_time_minutes: 'زمان تخمینی برای خواندن: %readingTime% min'
          reading_time_less_one_minute: 'زمان تخمینی برای خواندن: <small class="inferieur">&lt;</small> 1 min'
 +        # number_of_tags: '{1}and one other tag|]1,Inf[and %count% other tags'
+         reading_time_minutes_short: '%readingTime% min'
+         reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
          original_article: 'original'
          toogle_as_read: 'خوانده‌شده/خوانده‌نشده'
          toogle_as_star: 'برگزیده/نابرگزیده'
              back_to_homepage: 'بازگشت'
              set_as_read: 'خوانده‌شده'
              set_as_unread: 'به عنوان خوانده‌نشده علامت بزن'
-             set_as_favorite: 'برگزیده'
+             set_as_starred: 'برگزیده'
              view_original_article: 'مقالهٔ اصلی'
              re_fetch_content: 'مقاله‌ها را دوباره دریافت کن'
              delete: 'پاک کردن'
          edit_title: 'ویرایش عنوان'
          original_article: 'اصلی'
          annotations_on_the_entry: '{0} بدون حاشیه|{1} یک حاشیه|]1,Inf[ %nbحاشیه% annotations'
+         created_at: 'زمان ساخت'
      new:
          page_title: 'ذخیرهٔ مقالهٔ تازه'
          placeholder: 'http://website.com'
index 542f61c2081e43be9581ae646816ff21826971ed,25d9ec59bacc5c9d33d380a72d9c8c581f5710e0..9e47d600a005af84c7b2faae6441c7514cfe659b
@@@ -144,7 -144,8 +144,9 @@@ entry
          reading_time: 'durée de lecture'
          reading_time_minutes: 'durée de lecture: %readingTime% min'
          reading_time_less_one_minute: 'durée de lecture: <small class="inferieur">&lt;</small> 1 min'
 +        number_of_tags: '{1}et un autre tag|]1,Inf[et %count% autres tags'
+         reading_time_minutes_short: '%readingTime% min'
+         reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
          original_article: 'original'
          toogle_as_read: 'Marquer comme lu/non lu'
          toogle_as_star: 'Marquer comme favori'
              back_to_homepage: 'Retour'
              set_as_read: 'Marquer comme lu'
              set_as_unread: 'Marquer comme non lu'
-             set_as_favorite: 'Mettre en favori'
+             set_as_starred: 'Mettre en favori'
              view_original_article: 'Article original'
              re_fetch_content: 'Recharger le contenu'
              delete: 'Supprimer'
          edit_title: 'Modifier le titre'
          original_article: 'original'
          annotations_on_the_entry: '{0} Aucune annotation|{1} Une annotation|]1,Inf[ %nbAnnotations% annotations'
+         created_at: 'Date de création'
      new:
          page_title: 'Sauvegarder un nouvel article'
          placeholder: 'http://website.com'
@@@ -343,7 -345,7 +346,7 @@@ developer
      list_methods: "Lister toutes les méthodes de l'API"
      clients:
          title: 'Clients'
 -        create_new: 'Créer une nouveau client'
 +        create_new: 'Créer un nouveau client'
      existing_clients:
          title: 'Les clients existants'
          field_id: 'ID Client'
          field_grant_types: 'Type de privilège accordé'
          no_client: 'Aucun client pour le moment'
      remove:
 -        warn_message_1: 'Vous avez la possibilité de supprimer un client. Cette action est IRREVERSIBLE !'
 -        warn_message_2: "Si vous supprimez un client, toutes les applications qui l'utilisaient ne fonctionneront plus avec votre compte wallabag."
 -        action: 'Supprimer ce client'
 +        warn_message_1: 'Vous avez la possibilité de supprimer le client %name%. Cette action est IRREVERSIBLE !'
 +        warn_message_2: "Si vous supprimez le client %name%, toutes les applications qui l'utilisaient ne fonctionneront plus avec votre compte wallabag."
 +        action: 'Supprimer le client %name%'
      client:
          page_title: 'Développeur > Nouveau client'
          page_description: "Vous allez créer un nouveau client. Merci de remplir l'url de redirection vers votre application."
          form:
 -            redirect_uris_label: 'URLs de redirection'
 +            name_label: "Nom du client"
 +            redirect_uris_label: 'URLs de redirection (optionnel)'
              save_label: 'Créer un nouveau client'
          action_back: 'Retour'
      client_parameter:
          page_title: 'Développeur > Les paramètres de votre client'
          page_description: 'Voilà les paramètres de votre client'
 +        field_name: 'Nom du client'
          field_id: 'ID Client'
          field_secret: 'Clé secrète'
          back: 'Retour'
@@@ -419,5 -419,5 +422,5 @@@ flashes
              summary: "Rapport d'import: %imported% importés, %skipped% déjà présent."
      developer:
          notice:
 -            client_created: 'Nouveau client créé'
 -            client_deleted: 'Client supprimé'
 +            client_created: 'Nouveau client %name% créé'
 +            client_deleted: 'Client %name% supprimé'
index 0bcc94a5a93e17434033eb85a7ed81964aaeadf3,231ba7596761e0f5d21970090f2c39465065f1b8..3760c2d64f4d3de3e290a48d87cee085dcbf40b7
@@@ -144,7 -144,8 +144,9 @@@ entry
          reading_time: 'tempo di lettura stimato'
          reading_time_minutes: 'tempo di lettura stimato: %readingTime% min'
          reading_time_less_one_minute: 'tempo di lettura stimato: <small class="inferieur">&lt;</small> 1 min'
 +        # number_of_tags: '{1}and one other tag|]1,Inf[and %count% other tags'
+         reading_time_minutes_short: '%readingTime% min'
+         reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
          original_article: 'originale'
          toogle_as_read: 'Segna come da leggere'
          toogle_as_star: 'Segna come non preferito'
              back_to_homepage: 'Indietro'
              set_as_read: 'Segna come già letto'
              set_as_unread: 'Segna come da leggere'
-             set_as_favorite: 'Segna come preferito'
+             set_as_starred: 'Segna come preferito'
              view_original_article: 'Contenuto originale'
              re_fetch_content: 'Ri-ottieni pagina'
              delete: 'Elimina'
          edit_title: 'Modifica titolo'
          original_article: 'originale'
          annotations_on_the_entry: '{0} Nessuna annotazione|{1} Una annotazione|]1,Inf[ %nbAnnotations% annotazioni'
+         created_at: 'Data di creazione'
      new:
          page_title: 'Salva un nuovo contenuto'
          placeholder: 'http://website.com'
index bf6b4100ba967cbd9e5e1a93b0f8d453ebba473d,6e71b850492f3ef56901cfb010005bf85b817d3a..1e23168bf7ff8c49e20837ef0f741037f4f98b45
@@@ -144,7 -144,8 +144,9 @@@ entry
          reading_time: 'durada de lectura'
          reading_time_minutes: 'durada de lectura : %readingTime% min'
          reading_time_less_one_minute: 'durada de lectura : <small class="inferieur">&lt;</small> 1 min'
 +        # number_of_tags: '{1}and one other tag|]1,Inf[and %count% other tags'
+         reading_time_minutes_short: '%readingTime% min'
+         reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
          original_article: 'original'
          toogle_as_read: 'Marcar coma legit/pas legit'
          toogle_as_star: 'Marcar coma favorit'
              back_to_homepage: 'Tornar'
              set_as_read: 'Marcar coma legit'
              set_as_unread: 'Marcar coma pas legit'
-             set_as_favorite: 'Metre en favori'
+             set_as_starred: 'Metre en favori'
              view_original_article: 'Article original'
              re_fetch_content: 'Tornar cargar lo contengut'
              delete: 'Suprimir'
          edit_title: 'Modificar lo títol'
          original_article: 'original'
          annotations_on_the_entry: "{0} Pas cap d'anotacion|{1} Una anotacion|]1,Inf[ %nbAnnotations% anotacions"
+         created_at: 'Data de creacion'
      new:
          page_title: 'Enregistrar un novèl article'
          placeholder: 'http://website.com'
index 09428c890e6c17078e5b1c457157dc683372c302,2db26cf182a1cbe8b71ba2e32c6b7eb8a26bb22d..0a325c574ff68e3857247c7bf13a9f6437071f9e
@@@ -144,7 -144,8 +144,9 @@@ entry
          reading_time: 'szacunkowy czas czytania'
          reading_time_minutes: 'szacunkowy czas czytania: %readingTime% min'
          reading_time_less_one_minute: 'szacunkowy czas czytania: <small class="inferieur">&lt;</small> 1 min'
 +        # number_of_tags: '{1}and one other tag|]1,Inf[and %count% other tags'
+         reading_time_minutes_short: '%readingTime% min'
+         reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
          original_article: 'oryginał'
          toogle_as_read: 'Oznacz jako przeczytane'
          toogle_as_star: 'Oznacz jako ulubione'
              back_to_homepage: 'Cofnij'
              set_as_read: 'Oznacz jako przeczytane'
              set_as_unread: 'Oznacz jako nieprzeczytane'
-             set_as_favorite: 'Ulubione'
+             set_as_starred: 'Ulubione'
              view_original_article: 'Oryginalny artykuł'
              re_fetch_content: 'Pobierz ponownie treść'
              delete: 'Usuń'
          edit_title: 'Edytuj tytuł'
          original_article: 'oryginalny'
          annotations_on_the_entry: '{0} Nie ma adnotacji |{1} Jedna adnotacja |]1,Inf[ %nbAnnotations% adnotacji'
+         created_at: 'Czas stworzenia'
      new:
          page_title: 'Zapisz nowy wpis'
          placeholder: 'http://website.com'
index bc16eddc1a5383b5305985903196b686cedfdb33,d8f09bc98cac95509d746cac6434a838d7ecf77e..42ad28eec58f04dd45edd9ac0cf5c9c3ff7fb7fa
@@@ -144,7 -144,8 +144,9 @@@ entry
          reading_time: 'timp estimat de citire'
          reading_time_minutes: 'timp estimat de citire: %readingTime% min'
          reading_time_less_one_minute: 'timp estimat de citire: <small class="inferieur">&lt;</small> 1 min'
 +        # number_of_tags: '{1}and one other tag|]1,Inf[and %count% other tags'
+         reading_time_minutes_short: '%readingTime% min'
+         reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
          original_article: 'original'
          toogle_as_read: 'Comută marcat ca citit'
          toogle_as_star: 'Comută marcat ca favorit'
              back_to_homepage: 'Înapoi'
              set_as_read: 'Marchează ca citit'
              # set_as_unread: 'Mark as unread'
-             set_as_favorite: 'Favorit'
+             set_as_starred: 'Favorit'
              view_original_article: 'Articol original'
              # re_fetch_content: 'Re-fetch content'
              delete: 'Șterge'
          edit_title: 'Editează titlul'
          original_article: 'original'
          # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations'
+         created_at: 'Data creării'
      new:
          page_title: 'Salvează un nou articol'
          placeholder: 'http://website.com'
index 240bc53acf41e08504ce7204d1f52475b364080c,074d13e24183f22fc6f07c04ddeb9d3ff68a79f4..a60dfc86105c9b226c4d58c485979711fd56a85b
@@@ -144,7 -144,8 +144,9 @@@ entry
          reading_time: 'tahmini okuma süresi'
          reading_time_minutes: 'tahmini okuma süresi: %readingTime% min'
          reading_time_less_one_minute: 'tahmini okuma süresi: <small class="inferieur">&lt;</small> 1 min'
 +        # number_of_tags: '{1}and one other tag|]1,Inf[and %count% other tags'
+         reading_time_minutes_short: '%readingTime% min'
+         reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
          original_article: 'orijinal'
          toogle_as_read: 'Okundu/okunmadı olarak işaretle'
          toogle_as_star: 'Favorilere ekle/çıkar'
              back_to_homepage: 'Back'
              set_as_read: 'Okundu olarak işaretle'
              set_as_unread: 'Okunmadı olarak işaretle'
-             set_as_favorite: 'Favorilere ekle/çıkar'
+             set_as_starred: 'Favorilere ekle/çıkar'
              view_original_article: 'Orijinal makale'
              re_fetch_content: 'İçeriği yenile'
              delete: 'Sil'
          edit_title: 'Başlığı düzenle'
          original_article: 'orijinal'
          # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %nbAnnotations% annotations'
+         created_at: 'Oluşturulma tarihi'
      new:
          page_title: 'Yeni makaleyi kaydet'
          placeholder: 'http://website.com'
index 40f0ae165c9ea5f4cec3cf2be81a82fd5dfc1b8e,a8abe8d3de3fb813f2f487a4552911b4cdd58ae8..f89265d403605f6943a33b8a44d652dcf3b78bbf
          </fieldset>
          {% endif %}
  
-         {{ form_rest(form.user) }}
+         {{ form_widget(form.user._token) }}
+         {{ form_widget(form.user.save) }}
      </form>
  
      <h2>{{ 'config.tab_menu.password'|trans }}</h2>
  
          {{ form_rest(form.new_tagging_rule) }}
      </form>
 -
      <div class="row">
          <div class="input-field col s12">
              <h3>{{ 'config.form_rules.faq.title'|trans }}</h3>
index 8c06cf110c32092cc3c31aaa7d737f0574670ec2,d7374dc7551a34e156395ccfc3db37ab3bf963b1..ce47a6771977718ce7a590e27f67df3483468a18
@@@ -5,35 -5,48 +5,48 @@@
  {% block content %}
      <div id="article">
          <header class="mbm">
 -            <h1>{{ entry.title|raw }} <a href="{{ path('edit', { 'id': entry.id }) }}" title="{{ 'entry.view.edit_title'|trans }}">✎</a></h1>
 +            <h1>{{ entry.title|raw }} <a href="{{ path('edit', { 'id': entry.id }) }}" class="nostyle" title="{{ 'entry.view.edit_title'|trans }}">✎</a></h1>
          </header>
  
          <div id="article_toolbar">
--        <ul class="links">
--            <li class="topPosF"><a href="#top" title="{{ 'entry.view.left_menu.back_to_top'|trans }}" class="tool top icon icon-arrow-up-thick"><span>{{ 'entry.view.left_menu.set_as_read'|trans }}</span></a></li>
--            <li><a href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|e }}" class="tool link icon icon-link"><span>{{ entry.domainName|removeWww }}</span></a></li>
--            <li><a title="{{ 'entry.view.left_menu.re_fetch_content'|trans }}" class="tool icon icon-reload" href="{{ path('reload_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.re_fetch_content'|trans }}</span></a></li>
--            <li><a title="{% if entry.isArchived == 0 %}{{ 'entry.view.left_menu.set_as_read'|trans }}{% else %}{{ 'entry.view.left_menu.set_as_unread'|trans }}{% endif %}" class="tool icon icon-check {% if entry.isArchived == 0 %}archive-off{% else %}archive{% endif %}" href="{{ path('archive_entry', { 'id': entry.id }) }}"><span>{% if entry.isArchived == 0 %}{{ 'entry.view.left_menu.set_as_read'|trans }}{% else %}{{ 'entry.view.left_menu.set_as_unread'|trans }}{% endif %}</span></a></li>
-             <li><a title="{{ 'entry.view.left_menu.set_as_favorite'|trans }}" class="tool icon icon-star {% if entry.isStarred == 0 %}fav-off{% else %}fav{% endif %}" href="{{ path('star_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.set_as_favorite'|trans }}</span></a></li>
 -            <li><a title="{{ 'entry.view.left_menu.set_as_starred'|trans }}" class="tool icon icon-star {% if entry.isStarred == 0 %}fav-off{% else %}fav{% endif %}" href="{{ path('star_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.set_as_starred'|trans }}</span></a></li>
--            <li><a id="nav-btn-add-tag" title="{{ 'entry.view.left_menu.add_a_tag'|trans }}"><span>{{ 'entry.view.left_menu.add_a_tag'|trans }}</span></a></li>
--            <li><a title="{{ 'entry.view.left_menu.delete'|trans }}" class="tool delete icon icon-trash" href="{{ path('delete_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.delete'|trans }}</span></a></li>
--            {% if craue_setting('share_twitter') %}<li><a href="https://twitter.com/home?status={{entry.title|url_encode}}%20{{ entry.url|url_encode }}%20via%20@wallabagapp" target="_blank" class="tool twitter icon icon-twitter" title="Tweet"><span>Tweet</span></a></li>{% endif %}
--            {% if craue_setting('share_mail') %}<li><a href="mailto:?subject={{ entry.title|url_encode }}&amp;body={{ entry.url|url_encode }}%20via%20@wallabagapp" class="tool email icon icon-mail" title="Email"><span>Email</span></a></li>{% endif %}
--            {% if craue_setting('share_shaarli') %}<li><a href="{{ craue_setting('shaarli_url') }}/index.php?post={{ entry.url|url_encode }}&amp;title={{ entry.title|url_encode }}" target="_blank" class="tool shaarli" title="shaarli"><span>shaarli</span></a></li>{% endif %}
--            {% if craue_setting('share_diaspora') %}<li><a href="{{ craue_setting('diaspora_url') }}/bookmarklet?url={{ entry.url|url_encode }}&title={{ entry.title|url_encode }}&notes=&v=1&noui=1&jump=doclose" target="_blank" class="tool diaspora icon-image icon-image--diaspora" title="diaspora"><span>diaspora</span></a></li>{% endif %}
--            {% if craue_setting('carrot') %}<li><a href="https://secure.carrot.org/GiveAndGetBack.do?url={{ entry.url|url_encode }}&title={{ entry.title|url_encode }}" class="tool carrot icon-image icon-image--carrot" target="_blank" title="carrot"><span>Carrot</span></a></li>{% endif %}
--            {% if craue_setting('show_printlink') %}<li><a title="{{ 'entry.view.left_menu.print'|trans }}" class="tool icon icon-print" href="javascript: window.print();"><span>{{ 'entry.view.left_menu.print'|trans }}</span></a></li>{% endif %}
--            {% if craue_setting('export_epub') %}<li><a href="?epub&amp;method=id&amp;value={{ entry.id }}" title="Generate ePub file">EPUB</a></li>{% endif %}
--            {% if craue_setting('export_mobi') %}<li><a href="?mobi&amp;method=id&amp;value={{ entry.id }}" title="Generate Mobi file">MOBI</a></li>{% endif %}
--            {% if craue_setting('export_pdf') %}<li><a href="?pdf&amp;method=id&amp;value={{ entry.id }}" title="Generate PDF file">PDF</a></li>{% endif %}
--            <li><a href="mailto:hello@wallabag.org?subject=Wrong%20display%20in%20wallabag&amp;body={{ entry.url|url_encode }}" title="{{ 'entry.view.left_menu.problem.label'|trans }}" class="tool bad-display icon icon-delete"><span>{{ 'entry.view.left_menu.problem.label'|trans }}</span></a></li>
--        </ul>
--    </div>
++            <ul class="links">
++                <li class="topPosF"><a href="#top" title="{{ 'entry.view.left_menu.back_to_top'|trans }}" class="tool top icon icon-arrow-up-thick"><span>{{ 'entry.view.left_menu.set_as_read'|trans }}</span></a></li>
++                <li><a href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|e }}" class="tool link icon icon-link"><span>{{ entry.domainName|removeWww }}</span></a></li>
++                <li><a title="{{ 'entry.view.left_menu.re_fetch_content'|trans }}" class="tool icon icon-reload" href="{{ path('reload_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.re_fetch_content'|trans }}</span></a></li>
++                <li><a title="{% if entry.isArchived == 0 %}{{ 'entry.view.left_menu.set_as_read'|trans }}{% else %}{{ 'entry.view.left_menu.set_as_unread'|trans }}{% endif %}" class="tool icon icon-check {% if entry.isArchived == 0 %}archive-off{% else %}archive{% endif %}" href="{{ path('archive_entry', { 'id': entry.id }) }}"><span>{% if entry.isArchived == 0 %}{{ 'entry.view.left_menu.set_as_read'|trans }}{% else %}{{ 'entry.view.left_menu.set_as_unread'|trans }}{% endif %}</span></a></li>
++                <li><a title="{{ 'entry.view.left_menu.set_as_starred'|trans }}" class="tool icon icon-star {% if entry.isStarred == 0 %}fav-off{% else %}fav{% endif %}" href="{{ path('star_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.set_as_starred'|trans }}</span></a></li>
++                <li><a id="nav-btn-add-tag" title="{{ 'entry.view.left_menu.add_a_tag'|trans }}"><span>{{ 'entry.view.left_menu.add_a_tag'|trans }}</span></a></li>
++                <li><a title="{{ 'entry.view.left_menu.delete'|trans }}" class="tool delete icon icon-trash" href="{{ path('delete_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.delete'|trans }}</span></a></li>
++                {% if craue_setting('share_twitter') %}<li><a href="https://twitter.com/home?status={{entry.title|url_encode}}%20{{ entry.url|url_encode }}%20via%20@wallabagapp" target="_blank" class="tool twitter icon icon-twitter" title="Tweet"><span>Tweet</span></a></li>{% endif %}
++                {% if craue_setting('share_mail') %}<li><a href="mailto:?subject={{ entry.title|url_encode }}&amp;body={{ entry.url|url_encode }}%20via%20@wallabagapp" class="tool email icon icon-mail" title="Email"><span>Email</span></a></li>{% endif %}
++                {% if craue_setting('share_shaarli') %}<li><a href="{{ craue_setting('shaarli_url') }}/index.php?post={{ entry.url|url_encode }}&amp;title={{ entry.title|url_encode }}" target="_blank" class="tool shaarli" title="shaarli"><span>shaarli</span></a></li>{% endif %}
++                {% if craue_setting('share_diaspora') %}<li><a href="{{ craue_setting('diaspora_url') }}/bookmarklet?url={{ entry.url|url_encode }}&title={{ entry.title|url_encode }}&notes=&v=1&noui=1&jump=doclose" target="_blank" class="tool diaspora icon-image icon-image--diaspora" title="diaspora"><span>diaspora</span></a></li>{% endif %}
++                {% if craue_setting('carrot') %}<li><a href="https://secure.carrot.org/GiveAndGetBack.do?url={{ entry.url|url_encode }}&title={{ entry.title|url_encode }}" class="tool carrot icon-image icon-image--carrot" target="_blank" title="carrot"><span>Carrot</span></a></li>{% endif %}
++                {% if craue_setting('show_printlink') %}<li><a title="{{ 'entry.view.left_menu.print'|trans }}" class="tool icon icon-print" href="javascript: window.print();"><span>{{ 'entry.view.left_menu.print'|trans }}</span></a></li>{% endif %}
++                {% if craue_setting('export_epub') %}<li><a href="?epub&amp;method=id&amp;value={{ entry.id }}" title="Generate ePub file">EPUB</a></li>{% endif %}
++                {% if craue_setting('export_mobi') %}<li><a href="?mobi&amp;method=id&amp;value={{ entry.id }}" title="Generate Mobi file">MOBI</a></li>{% endif %}
++                {% if craue_setting('export_pdf') %}<li><a href="?pdf&amp;method=id&amp;value={{ entry.id }}" title="Generate PDF file">PDF</a></li>{% endif %}
++                <li><a href="mailto:hello@wallabag.org?subject=Wrong%20display%20in%20wallabag&amp;body={{ entry.url|url_encode }}" title="{{ 'entry.view.left_menu.problem.label'|trans }}" class="tool bad-display icon icon-delete"><span>{{ 'entry.view.left_menu.problem.label'|trans }}</span></a></li>
++            </ul>
++        </div>
+         <div class="link mdi-action-today">
+             {{ 'entry.view.created_at'|trans }}: {{ entry.createdAt|date('Y-m-d') }}
+         </div>
+         <div class="link mdi-action-query-builder">
+             {% set readingTime = entry.readingTime / app.user.config.readingSpeed %}
+             {% if readingTime > 0 %}
+                 {{ 'entry.list.reading_time_minutes'|trans({'%readingTime%': readingTime|round})|capitalize }}
+             {% else %}
+                 {{ 'entry.list.reading_time_less_one_minute'|trans|raw }}
+             {% endif %}
+         </div>
          {% set nbAnnotations = entry.annotations | length %}
 -        <span class="tool link mdi-communication-comment"> {{ 'entry.view.annotations_on_the_entry'|transchoice(entry.annotations | length) }}</span>
 +        <span class="tool link"><i class="material-icons link">comment</i> {{ 'entry.view.annotations_on_the_entry'|transchoice(entry.annotations | length) }}</span>
          <aside class="tags">
              {% for tag in entry.tags %}
 -                <span class="mdi-action-label-outline">{{ tag.label }}</span> <a href="{{ path('remove_tag', { 'entry': entry.id, 'tag': tag.id }) }}"><i>✘</i></a>
 +                <span class="label-outline"><i class="material-icons">label_outline</i> {{ tag.label }}</span> <a href="{{ path('remove_tag', { 'entry': entry.id, 'tag': tag.id }) }}"class="nostyle"><i>✘</i></a>
              {% endfor %}
              <div class="input-field nav-panel-add-tag" style="display: none">
                  {{ render(controller( "WallabagCoreBundle:Tag:addTagForm", { 'id': entry.id } )) }}
              {{ entry.content | raw }}
          </article>
      </div>
 -
 -            // toggle read property of current article
 -          /*  $('#markAsRead').click(function(){
 -                $("body").css("cursor", "wait");
 -                $.ajax( { url: '{{ path('archive_entry', { 'id': entry.id }) }}' }).done(
 -                        function( data ) {
 -                            if ( data == '1' ) {
 -                                if ( $('#markAsRead').hasClass("archive-off") ) {
 -                                    $('#markAsRead').removeClass("archive-off");
 -                                    $('#markAsRead').addClass("archive");
 -                                }
 -                                else {
 -                                    $('#markAsRead').removeClass("archive");
 -                                    $('#markAsRead').addClass("archive-off");
 -                                }
 -                            }
 -                            else {
 -                                alert('Error! Pls check if you are logged in.');
 -                            }
 -                        });
 -                $("body").css("cursor", "auto");
 -            });*/
 -
 -            // toggle starred property of current article
 -          /*  $('#setFav').click(function(){
 -                $("body").css("cursor", "wait");
 -                $.ajax( { url: '{{ path('star_entry', { 'id': entry.id }) }}' }).done(
 -                        function( data ) {
 -                            if ( data == '1' ) {
 -                                if ( $('#setFav').hasClass("fav-off") ) {
 -                                    $('#setFav').removeClass("fav-off");
 -                                    $('#setFav').addClass("fav");
 -                                }
 -                                else {
 -                                    $('#setFav').removeClass("fav");
 -                                    $('#setFav').addClass("fav-off");
 -                                }
 -                            }
 -                            else {
 -                                alert('Error! Pls check if you are logged in.');
 -                            }
 -                        });
 -                $("body").css("cursor", "auto");
 -            });*/
 -
++
 +    <script id="annotationroutes" type="application/json">
 +    {
 +        "prefix": "",
 +        "urls": {
 +            "create": "{{ path('annotations_post_annotation', { 'entry': entry.id }) }}",
 +            "update": "{{ path('annotations_put_annotation', { 'annotation': 'idAnnotation' }) }}",
 +            "destroy": "{{ path('annotations_delete_annotation', { 'annotation': 'idAnnotation' }) }}",
 +            "search": "{{ path('annotations_get_annotations', { 'entry': entry.id }) }}"
 +        },
 +        "entryId": "{{ entry.id }}"
 +    }
 +    </script>
+     <script src="{{ asset('bundles/wallabagcore/themes/_global/js/restoreScroll.js')}}"></script>
+     <script type="text/javascript">
+         $(document).ready(function() {
 -
 -        var app = new annotator.App();
 -        app.include(annotator.ui.main, {
 -            element: document.querySelector('article')
 -        });
 -        app.include(annotator.storage.http, {
 -            prefix: '',
 -            urls: {
 -                create: '{{ path('annotations_post_annotation', { 'entry': entry.id }) }}',
 -                update: '{{ path('annotations_put_annotation', { 'annotation': 'idAnnotation' }) }}',
 -                destroy: '{{ path('annotations_delete_annotation', { 'annotation': 'idAnnotation' }) }}',
 -                search: '{{ path('annotations_get_annotations', { 'entry': entry.id }) }}'
 -            }
 -        });
 -        app
 -            .start()
 -            .then(function () {
 -                app.annotations.load({entry: {{ entry.id }}});
 -            });
+             $(window).scroll(function(e){
+                 var scrollTop = $(window).scrollTop();
+                 var docHeight = $(document).height();
+                 var scrollPercent = (scrollTop) / (docHeight);
+                 var scrollPercentRounded = Math.round(scrollPercent*100)/100;
+                 savePercent({{ entry.id }}, scrollPercentRounded);
+             });
+             retrievePercent({{ entry.id }});
+             $(window).resize(function(){
+                 retrievePercent({{ entry.id }});
+             });
+         });
 -
+     </script>
  {% endblock %}
index 9fb92d3d71ddc526978121ad988a2461967e0f76,afd5b499a0da00377c29e023c9d31eb7c10e4046..11b02294b131dc8e4cc40f9446e3c4a0525598fe
                              {% endif %}
  
                              {{ form_widget(form.user.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }}
-                             {{ form_rest(form.user) }}
+                             {{ form_widget(form.user._token) }}
                          </form>
                      </div>
  
                                          {{ 'config.form_rules.then_tag_as_label'|trans }}
                                          « {{ tagging_rule.tags|join(', ') }} »
                                          <a href="{{ path('delete_tagging_rule', {id: tagging_rule.id}) }}" title="{{ 'config.form_rules.delete_rule_label'|trans }}">
 -                                            <i class="tool grey-text delete mdi-action-delete"></i>
 +                                            <i class="tool grey-text delete material-icons">delete</i>
                                          </a>
                                      </li>
                                      {% endfor %}
index e9a2b1831063fa2ce7d0c157a916b22ca26230cf,c8e4a533902ab1ee2844a694fb72d6bc23811614..eca8924ec6149845bbc473a5f0e0f56d14c4a365
                      <div class="card-body">
                          {% if not entry.previewPicture is null %}
                              <div class="card-image waves-effect waves-block waves-light">
 +                                <ul class="card-entry-labels">
 +                                {% for tag in entry.tags | slice(0, 3) %}
 +                                    <li>{{ tag.label }}</li>
 +                                {% endfor %}
 +                                </ul>
                                  <div class="preview activator" style="background-image: url({{ entry.previewPicture }})"></div>
                              </div>
                          {% endif %}
  
                          <div class="card-content">
                              {% if not entry.previewPicture is null %}
 -                                <i class="card-title grey-text text-darken-4 activator mdi-navigation-more-horiz right"></i>
 +                                <i class="card-title grey-text text-darken-4 activator material-icons right">more_vert</i>
                              {% endif %}
  
 -                            <span class="card-title"><a href="{{ path('view', { 'id': entry.id }) }}" title="{{ entry.title|raw }}">{{ entry.title|striptags|slice(0, 42)|raw }}</a></span>
 +                            <span class="card-title"><a href="{{ path('view', { 'id': entry.id }) }}" title="{{ entry.title|striptags }}">{{ entry.title|striptags|raw }}</a></span>
  
                              <div class="estimatedTime grey-text">
                                  <span class="tool reading-time">
  
                              {% if entry.previewPicture is null %}
                                  <p>{{ entry.content|striptags|slice(0, 300)|raw }}&hellip;</p>
 +                                <ul class="card-entry-labels-hidden">
 +                                {% for tag in entry.tags | slice(0, 2) %}
 +                                    <li>{{ tag.label }}</li>
 +                                {% endfor %}
 +                            </ul>
                              {% endif %}
                          </div>
                      </div>
  
                      {% if not entry.previewPicture is null %}
                          <div class="card-reveal">
 -                            <i class="card-title grey-text text-darken-4 mdi-card-close right"></i>
 +                            <i class="card-title grey-text text-darken-4 material-icons right">clear</i>
                              <span class="card-title"><a href="{{ path('view', { 'id': entry.id }) }}">{{ entry.title|raw }}</a></span>
  
                              <div class="estimatedTime grey-text">
                              </div>
  
                              <p>{{ entry.content|striptags|slice(0, 300)|raw }}&hellip;</p>
 +
 +                            <ul class="card-entry-tags">
 +                                {% for tag in entry.tags %}
 +                                    <li>{{ tag.label }}</li>
 +                                {% endfor %}
 +                            </ul>
                          </div>
                      {% endif %}
  
                              <a href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.list.original_article'|trans }}: {{ entry.title|e }} - {{ entry.domainName|removeWww }}" class="tool original grey-text"><span>{{ entry.domainName|removeWww|truncate(18) }}</span></a>
                          </bold>
  
 -                        <ul class="tools links right">
 +                        <ul class="tools right">
                              <li>
 -                                <a title="{{ 'entry.list.toogle_as_read'|trans }}" class="tool grey-text {% if entry.isArchived == 0 %}mdi-action-done{% else %}mdi-content-redo{% endif %}" href="{{ path('archive_entry', { 'id': entry.id }) }}"></a>
 -                                <a title="{{ 'entry.list.toogle_as_star'|trans }}" class="tool grey-text {% if entry.isStarred == 0 %}mdi-toggle-star-outline{% else %}mdi-toggle-star{% endif %}" href="{{ path('star_entry', { 'id': entry.id }) }}"></a>
 -                                <a title="{{ 'entry.list.delete'|trans }}" class="tool grey-text delete mdi-action-delete " href="{{ path('delete_entry', { 'id': entry.id }) }}"></a>
 +                                <a title="{{ 'entry.list.toogle_as_read'|trans }}" class="tool grey-text" href="{{ path('archive_entry', { 'id': entry.id }) }}"><i class="material-icons">{% if entry.isArchived == 0 %}done{% else %}redo{% endif %}</i></a>
-                                 <a title="{{ 'entry.list.toogle_as_star'|trans }}" class="tool grey-text" href="{{ path('star_entry', { 'id': entry.id }) }}"><i class="material-icons">{% if entry.isStarred == 0 %}favorite_border{% else %}favorite{% endif %}</i></a>
++                                <a title="{{ 'entry.list.toogle_as_star'|trans }}" class="tool grey-text" href="{{ path('star_entry', { 'id': entry.id }) }}"><i class="material-icons">{% if entry.isStarred == 0 %}star_border{% else %}star{% endif %}</i></a>
 +                                <a title="{{ 'entry.list.delete'|trans }}" class="tool grey-text delete" href="{{ path('delete_entry', { 'id': entry.id }) }}"><i class="material-icons">delete</i></a>
                              </li>
                          </ul>
                      </div>
index 2a5cdfac1ddb419d782cd5e09fd100f0df42017a,2ee615aa03dbf467ba92d557f83e5948f1308beb..5dd2afb3e32d58d52b953067086da402ea844557
              <ul>
                  <li>
                      <a class="waves-effect" href="{{ path('homepage') }}">
 -                        <i class="mdi-action-exit-to-app"></i>
 +                        <i class="material-icons">exit_to_app</i>
                      </a>
                  </li>
              </ul>
              <ul class="right">
                  <li>
                      <a class="waves-effect" title="{{ 'entry.view.left_menu.set_as_read'|trans }}" href="{{ path('archive_entry', { 'id': entry.id }) }}" id="markAsRead">
 -                        <i class="{% if entry.isArchived == 0 %}mdi-action-done{% else %}mdi-content-redo{% endif %} small"></i>
 +                        <i class="material-icons small">{% if entry.isArchived == 0 %}done{% else %}redo{% endif %}</i>
                      </a>
                  </li>
                  <li>
-                     <a class="waves-effect" title="{{ 'entry.view.left_menu.set_as_favorite'|trans }}" href="{{ path('star_entry', { 'id': entry.id }) }}" id="setFav">
-                         <i class="material-icons small">{% if entry.isStarred == 0 %}favorite_outline{% else %}favorite{% endif %}</i>
+                     <a class="waves-effect" title="{{ 'entry.view.left_menu.set_as_starred'|trans }}" href="{{ path('star_entry', { 'id': entry.id }) }}" id="setFav">
 -                        <i class="{% if entry.isStarred == 0 %}mdi-toggle-star-outline{% else %}mdi-toggle-star{% endif %} small"></i>
++                        <i class="material-icons small">{% if entry.isStarred == 0 %}star_outline{% else %}star{% endif %}</i>
                      </a>
                  </li>
                  <li>
                      <a href="#" data-activates="slide-out" class="button-collapse right">
 -                        <i class="mdi-navigation-menu"></i>
 +                        <i class="material-icons">menu</i>
                      </a>
                  </li>
              </ul>
@@@ -39,7 -39,7 +39,7 @@@
      <ul id="slide-out" class="collapsible side-nav fixed reader-mode" data-collapsible="accordion">
          <li class="bold border-bottom hide-on-med-and-down">
              <a class="waves-effect collapsible-header" href="{{ path('homepage') }}">
 -                <i class="mdi-action-exit-to-app small"></i>
 +                <i class="material-icons small">exit_to_app</i>
                  <span>{{ 'entry.view.left_menu.back_to_homepage'|trans }}</span>
              </a>
              <div class="collapsible-body"></div>
@@@ -47,7 -47,7 +47,7 @@@
  
          <li class="bold border-bottom hide-on-med-and-down">
              <a class="waves-effect collapsible-header" href="{{ entry.url|e }}">
 -                <i class="mdi-content-link small"></i>
 +                <i class="material-icons small">link</i>
                  <span>{{ 'entry.view.left_menu.view_original_article'|trans }}</span>
              </a>
              <div class="collapsible-body"></div>
@@@ -55,7 -55,7 +55,7 @@@
  
          <li class="bold hide-on-med-and-down">
              <a class="waves-effect collapsible-header" title="{{ 'entry.view.left_menu.re_fetch_content'|trans }}" href="{{ path('reload_entry', { 'id': entry.id }) }}" id="reload">
 -                <i class="mdi-action-autorenew small"></i>
 +                <i class="material-icons small">autorenew</i>
                  <span>{{ 'entry.view.left_menu.re_fetch_content'|trans }}</span>
              </a>
              <div class="collapsible-body"></div>
  
          <li class="bold hide-on-med-and-down">
              <a class="waves-effect collapsible-header" title="{{ 'entry.view.left_menu.set_as_read'|trans }}" href="{{ path('archive_entry', { 'id': entry.id }) }}" id="markAsRead">
 -                <i class="{% if entry.isArchived == 0 %}mdi-action-done{% else %}mdi-content-redo{% endif %} small"></i>
 +                <i class="material-icons small">{% if entry.isArchived == 0 %}done{% else %}redo{% endif %}</i>
                  <span>{% if entry.isArchived == 0 %}{{ 'entry.view.left_menu.set_as_read'|trans }}{% else %}{{ 'entry.view.left_menu.set_as_unread'|trans }}{% endif %}</span>
              </a>
              <div class="collapsible-body"></div>
          </li>
  
          <li class="bold hide-on-med-and-down">
-             <a class="waves-effect collapsible-header" title="{{ 'entry.view.left_menu.set_as_favorite'|trans }}" href="{{ path('star_entry', { 'id': entry.id }) }}" id="setFav">
-                 <i class="material-icons spall">{% if entry.isStarred == 0 %}favorite_outline{% else %}favorite{% endif %}</i>
-                 <span>{{ 'entry.view.left_menu.set_as_favorite'|trans }}</span>
+             <a class="waves-effect collapsible-header" title="{{ 'entry.view.left_menu.set_as_starred'|trans }}" href="{{ path('star_entry', { 'id': entry.id }) }}" id="setFav">
 -                <i class="{% if entry.isStarred == 0 %}mdi-toggle-star-outline{% else %}mdi-toggle-star{% endif %} small"></i>
++                <i class="material-icons spall">{% if entry.isStarred == 0 %}star_outline{% else %}star{% endif %}</i>
+                 <span>{{ 'entry.view.left_menu.set_as_starred'|trans }}</span>
              </a>
              <div class="collapsible-body"></div>
          </li>
          <li class="bold border-bottom hide-on-med-and-down">
              <a class="waves-effect collapsible-header" title="{{ 'entry.view.left_menu.delete'|trans }}" href="{{ path('delete_entry', { 'id': entry.id }) }}">
 -                <i class="mdi-action-delete small"></i>
 +                <i class="material-icons small">delete</i>
                  <span>{{ 'entry.view.left_menu.delete'|trans }}</span>
              </a>
              <div class="collapsible-body"></div>
@@@ -86,7 -86,7 +86,7 @@@
  
          <li class="bold border-bottom hide-on-med-and-down">
              <a class="waves-effect collapsible-header" id="nav-btn-add-tag">
 -                <i class="mdi-action-label-outline small"></i>
 +                <i class="material-icons small">label_outline</i>
                  <span>{{ 'entry.view.left_menu.add_a_tag'|trans }}</span>
              </a>
              <div class="collapsible-body"></div>
@@@ -94,7 -94,7 +94,7 @@@
  
          <li class="bold">
              <a class="waves-effect collapsible-header">
 -                <i class="mdi-social-share small"></i>
 +                <i class="material-icons small">share</i>
                  <span>{{ 'entry.view.left_menu.share_content'|trans }}</span>
              </a>
              <div class="collapsible-body">
                      {% endif %}
                      {% if craue_setting('share_mail') %}
                          <li>
 -                            <a href="mailto:?subject={{ entry.title|url_encode }}&amp;body={{ entry.url|url_encode }}%20via%20@wallabagapp" class="tool email icon icon-mail" title="{{ 'entry.view.left_menu.share_email_label'|trans }}">
 +                            <a href="mailto:?subject={{ entry.title|url_encode }}&amp;body={{ entry.url|url_encode }}%20via%20@wallabagapp" title="{{ 'entry.view.left_menu.share_email_label'|trans }}">
 +                                <i class="material-icons">email</i>
                                  <span>{{ 'entry.view.left_menu.share_email_label'|trans }}</span>
                              </a>
                          </li>
          {% if craue_setting('show_printlink') %}
          <li class="bold border-bottom hide-on-med-and-down">
              <a class="waves-effect collapsible-header" title="{{ 'entry.view.left_menu.print'|trans }}" href="javascript: window.print();">
 -                <i class="mdi-action-print small"></i>
 +                <i class="material-icons small">print</i>
                  <span>{{ 'entry.view.left_menu.print'|trans }}</span>
              </a>
              <div class="collapsible-body"></div>
  
          <li class="bold">
              <a class="waves-effect collapsible-header">
 -                <i class="mdi-file-file-download small"></i>
 +                <i class="material-icons small">file_download</i>
                  <span>{{ 'entry.view.left_menu.download'|trans }}</span>
              </a>
              <div class="collapsible-body">
  
          <li class="bold hide-on-large-only">
              <a class="waves-effect collapsible-header" title="{{ 'entry.view.left_menu.delete'|trans }}" href="{{ path('delete_entry', { 'id': entry.id }) }}">
 -                <i class="mdi-action-delete small"></i>
 +                <i class="material-icons small">delete</i>
                  <span>{{ 'entry.view.left_menu.delete'|trans }}</span>
              </a>
              <div class="collapsible-body"></div>
  
          <li class="bold">
              <a class="waves-effect collapsible-header" href="mailto:hello@wallabag.org?subject=Wrong%20display%20in%20wallabag&amp;body={{ entry.url|url_encode }}" title="{{ 'entry.view.left_menu.problem.description'|trans }}">
 -                <i class="mdi-alert-error small"></i>
 +                <i class="material-icons small">error</i>
                  <span>{{ 'entry.view.left_menu.problem.label'|trans }}</span>
              </a>
              <div class="collapsible-body"></div>
              <h1>{{ entry.title|raw }} <a href="{{ path('edit', { 'id': entry.id }) }}" title="{{ 'entry.view.edit_title'|trans }}">✎</a></h1>
          </header>
          <aside>
 -            <span class="link mdi-action-today" title="{{ 'entry.view.created_at'|trans }}"> {{ entry.createdAt|date('Y-m-d') }}</span>
+             {% set readingTime = entry.readingTime / app.user.config.readingSpeed %}
+             <span class="link mdi-action-query-builder">
+                 {% if readingTime > 0 %}
+                     {{ 'entry.list.reading_time_minutes_short'|trans({'%readingTime%': readingTime|round}) }}
+                 {% else %}
+                     {{ 'entry.list.reading_time_less_one_minute_short'|trans|raw }}
+                 {% endif %}
+             </span>
 -            <a href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|e }}" class="tool link mdi-content-link"> <span>{{ entry.domainName|removeWww }}</span></a>
 -            <span class="tool link mdi-communication-comment"> {{ 'entry.view.annotations_on_the_entry'|transchoice(entry.annotations | length) }}</span>
++            <span class="link mdi-action-today" title="{{ 'entry.view.created_at'|trans }}"> {{ entry.createdAt|date('Y-m-d') }}</span>
 +            <a href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|e }}" class="tool">
 +            <span class="link"><i class="material-icons link">link</i> {{ entry.domainName|removeWww }}</span></a>
 +            <span class="tool link"><i class="material-icons link">comment</i> {{ 'entry.view.annotations_on_the_entry'|transchoice(entry.annotations | length) }}</span>
              <div id="list">
                  {% for tag in entry.tags %}
                      <div class="chip">
 -                    {{ tag.label }} <a href="{{ path('remove_tag', { 'entry': entry.id, 'tag': tag.id }) }}"><i class="mdi-action-delete"></i></a>
 +                    {{ tag.label }} <a href="{{ path('remove_tag', { 'entry': entry.id, 'tag': tag.id }) }}"><i class="material-icons">delete</i></a>
                      </div>
                  {% endfor %}
              </div>
          </article>
      </div>
  
 -<script type="text/javascript">
 -
 -var app = new annotator.App();
 -app.include(annotator.ui.main, {
 -    element: document.querySelector('article')
 -});
 -app.include(annotator.storage.http, {
 -    prefix: '',
 -    urls: {
 -        create: '{{ path('annotations_post_annotation', { 'entry': entry.id }) }}',
 -        update: '{{ path('annotations_put_annotation', { 'annotation': 'idAnnotation' }) }}',
 -        destroy: '{{ path('annotations_delete_annotation', { 'annotation': 'idAnnotation' }) }}',
 -        search: '{{ path('annotations_get_annotations', { 'entry': entry.id }) }}'
 -    }
 -});
 -app
 -.start()
 -.then(function () {
 -     app.annotations.load({entry: {{ entry.id }}});
 -});
 -</script>
 +<script id="annotationroutes" type="application/json">
 +{
 +    "prefix": "",
 +    "urls": {
 +        "create": "{{ path('annotations_post_annotation', { 'entry': entry.id }) }}",
 +        "update": "{{ path('annotations_put_annotation', { 'annotation': 'idAnnotation' }) }}",
 +        "destroy": "{{ path('annotations_delete_annotation', { 'annotation': 'idAnnotation' }) }}",
 +        "search": "{{ path('annotations_get_annotations', { 'entry': entry.id }) }}"
 +    },
 +    "entryId": "{{ entry.id }}"
 +}</script>
  
  {% endblock %}
  
index 563820969c42f1c92fa50e2956cdda3c2f6f4c5b,a5c16792c2716f2dad6e763d19f94f0aca47b733..50134357f942a47327a10b8c146f80c3244d94ea
@@@ -2,12 -2,17 +2,12 @@@
  
  {% block css %}
      {{ parent() }}
 -
 -    <link rel="stylesheet" href="{{ asset('bundles/wallabagcore/themes/material/css/materialize.min.css') }}"  media="screen,projection"/>
 -    <link rel="stylesheet" href="{{ asset('bundles/wallabagcore/themes/material/css/main.css') }}" media="all">
 -    <link rel="stylesheet" href="{{ asset('bundles/wallabagcore/themes/material/css/print.css') }}" media="print">
 +    <link rel="stylesheet" href="{{ asset('bundles/wallabagcore/themes/material/css/style.min.css') }}"  media="screen,projection,print"/>
  {% endblock %}
  
  {% block scripts %}
      {{ parent() }}
 -
 -    <script src="{{ asset('bundles/wallabagcore/themes/material/js/materialize.min.js') }}"></script>
 -    <script src="{{ asset('bundles/wallabagcore/themes/material/js/init.js') }}"></script>
 +    <script src="{{ asset('bundles/wallabagcore/themes/material/js/material.min.js') }}"></script>
  {% endblock %}
  
  {% block header %}
@@@ -26,8 -31,8 +26,8 @@@
          <ul id="slide-out" class="side-nav fixed">
              {% block logo %}
                  <li class="logo border-bottom">
-                     <a title="{% trans %}Back to unread articles{% endtrans %}" href="{{ path('unread') }}">
+                     <a title="{{ 'menu.left.back_to_unread'|trans }}" href="{{ path('unread') }}">
 -                        <img src="{{ asset('bundles/wallabagcore/themes/material/img/logo-square.png') }}" alt="wallabag logo" />
 +                        <img src="{{ asset('bundles/wallabagcore/themes/_global/img/logo-square.png') }}" alt="wallabag logo" />
                      </a>
                  </li>
              {% endblock %}
@@@ -71,7 -76,7 +71,7 @@@
              </li>
          </ul>
          <div class="nav-wrapper nav-panels">
 -            <a href="#" data-activates="slide-out" class="nav-panel-menu button-collapse"><i class="mdi-navigation-menu"></i></a>
 +            <a href="#" data-activates="slide-out" class="nav-panel-menu button-collapse"><i class="material-icons">menu</i></a>
              <div class="left action">
                  {% block title %}
                  {% endblock %}
                  <ul>
                      <li class="bold">
                          <a title="{{ 'menu.top.add_new_entry'|trans }}" class="waves-effect" href="{{ path('new') }}" id="nav-btn-add">
 -                            <i class="mdi-content-add"></i>
 +                            <i class="material-icons">add</i>
                          </a>
                      </li>
                      <!--<li>
                          <a title="{{ 'menu.top.search'|trans }}" class="waves-effect" href="javascript: void(null);" id="nav-btn-search">
 -                            <i class="mdi-action-search"></i>
 +                            <i class="material-icons">search</i>
                          </a>
                      </li>-->
                      <li id="button_filters">
                          <a title="{{ 'menu.top.filter_entries'|trans }}" href="#" data-activates="filters" class="nav-panel-menu button-collapse-right">
 -                            <i class="mdi-content-filter-list"></i>
 +                            <i class="material-icons">filter_list</i>
                          </a>
                      </li>
                      <li id="button_export">
 -                        <a title="{{ 'menu.top.export'|trans }}" class="nav-panel-menu button-collapse-right" href="#" data-activates="export" class="nav-panel-menu button-collapse-right">
 -                            <i class="mdi-file-file-download"></i>
 +                        <a title="{{ 'menu.top.export'|trans }}" class="nav-panel-menu button-collapse-right" href="#" data-activates="export">
 +                            <i class="material-icons">file_download</i>
                          </a>
                      </li>
                  </ul>
              <form method="get" action="index.php">
                  <div class="input-field nav-panel-search" style="display: none">
                      <input name="search" id="searchfield" type="search" required placeholder="{{ 'menu.search_form.input_label'|trans }}">
 -                    <label for="search"><i class="mdi-action-search"></i></label>
 -                    <i class="mdi-navigation-close"></i>
 +                    <label for="search"><i class="material-icons search">search</i></label>
 +                    <i class="material-icons close">clear</i>
                  </div>
              </form>
              <div class="input-field nav-panel-add" style="display: none">
                  {{ render(controller("WallabagCoreBundle:Entry:addEntryForm")) }}
 -                <label for="add" class="active"><i class="mdi-content-add"></i></label>
 -                <i class="mdi-navigation-close"></i>
 +                <label for="add" class="active"><i class="material-icons add">add</i></label>
 +                <i class="material-icons close">clear</i>
              </div>
          </div>
      </nav>
  {% endblock %}
  
  {% block footer %}
-     <footer class="page-footer cyan darken-2">
-         <div class="container">
-             <div class="row">
-                 <div class="col l6 s12">
-                     <h5 class="white-text">{{ 'footer.wallabag.elsewhere'|trans }}</h5>
-                     <p class="grey-text text-lighten-4">
-                         <a target="_blank" class="grey-text text-lighten-3" href="https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche" title="Android">
-                             <span class="icon-android"></span>
-                         </a>
-                         <a target="_blank" class="grey-text text-lighten-3" href="https://itunes.apple.com/app/id828331015" title="iOS">
-                             <span class="icon-apple"></span>
-                         </a>
-                         <a target="_blank" class="grey-text text-lighten-3" href="https://addons.mozilla.org/firefox/addon/wallabag-v2/" title="Firefox">
-                             <span class="icon-firefox"></span>
-                         </a>
-                         <a target="_blank" class="grey-text text-lighten-3" href="https://chrome.google.com/webstore/detail/wallabagger/gbmgphmejlcoihgedabhgjdkcahacjlj" title="Chrome">
-                             <span class="icon-chrome"></span>
-                         </a>
-                     </p>
-                 </div>
-                 <div class="col l4 offset-l2 s12">
-                     <h5 class="white-text">{{ 'footer.wallabag.social'|trans }}</h5>
-                     <a target="_blank" class="grey-text text-lighten-3" href="https://twitter.com/wallabagapp" title="Twitter">
-                         <span class="icon-twitter"></span>
-                     </a>
-                     <a target="_blank" class="grey-text text-lighten-3" href="https://plus.google.com/+WallabagOrg/posts" title="Google+">
-                         <span class="icon-google-plus2"></span>
-                     </a>
-                     <a target="_blank" class="grey-text text-lighten-3" href="https://facebook.com/Wallabag" title="Facebook">
-                         <span class="icon-facebook2"></span>
-                     </a>
-                 </div>
-             </div>
-         </div>
-         <div class="footer-copyright">
-             <div class="container">
-                 <p>{{ 'footer.wallabag.powered_by'|trans }} <a target="_blank" href="https://wallabag.org" class="grey-text text-lighten-4">wallabag</a></p>
-                 <a class="grey-text text-lighten-4 right" href="{{ path('about') }}">{{ 'footer.wallabag.about'|trans }}</a>
-             </div>
-         </div>
-     </footer>
+     {{ render(controller("WallabagCoreBundle:Footer:index")) }}
  {% endblock %}
index 2413d735485811761d3bb49536dcbac9be9346eb,089a1c5fee9a36a2ec6d093d66373581648859d8..c0133af4ab6cb7260dade5ca34f03dc9dacf5352
@@@ -28,16 -28,32 +28,32 @@@ class InstallCommandTest extends Wallab
               *
               * http://stackoverflow.com/a/14374832/569101
               */
-             $this->markTestSkipped('PostgreSQL spotted: can find a good way to drop current database, skipping.');
+             $this->markTestSkipped('PostgreSQL spotted: can\'t find a good way to drop current database, skipping.');
          }
      }
  
+     /**
+      * Ensure next tests will have a clean database
+      */
      public static function tearDownAfterClass()
      {
          $application = new Application(static::$kernel);
          $application->setAutoExit(false);
  
-         $code = $application->run(new ArrayInput([
+         $application->run(new ArrayInput([
+             'command' => 'doctrine:schema:drop',
+             '--no-interaction' => true,
+             '--force' => true,
+             '--env' => 'test',
+         ]), new NullOutput());
+         $application->run(new ArrayInput([
+             'command' => 'doctrine:schema:create',
+             '--no-interaction' => true,
+             '--env' => 'test',
+         ]), new NullOutput());
+         $application->run(new ArrayInput([
              'command' => 'doctrine:fixtures:load',
              '--no-interaction' => true,
              '--env' => 'test',
@@@ -71,6 -87,7 +87,6 @@@
          $this->assertContains('Setting up database.', $tester->getDisplay());
          $this->assertContains('Administration setup.', $tester->getDisplay());
          $this->assertContains('Config setup.', $tester->getDisplay());
 -        $this->assertContains('Installing assets.', $tester->getDisplay());
      }
  
      public function testRunInstallCommandWithReset()
          $this->assertContains('Droping database, creating database and schema, clearing the cache', $tester->getDisplay());
          $this->assertContains('Administration setup.', $tester->getDisplay());
          $this->assertContains('Config setup.', $tester->getDisplay());
 -        $this->assertContains('Installing assets.', $tester->getDisplay());
  
          // we force to reset everything
          $this->assertContains('Droping database, creating database and schema, clearing the cache', $tester->getDisplay());
          $this->assertContains('Setting up database.', $tester->getDisplay());
          $this->assertContains('Administration setup.', $tester->getDisplay());
          $this->assertContains('Config setup.', $tester->getDisplay());
 -        $this->assertContains('Installing assets.', $tester->getDisplay());
  
          // the current database doesn't already exist
          $this->assertContains('Creating database and schema, clearing the cache', $tester->getDisplay());
          $this->assertContains('Setting up database.', $tester->getDisplay());
          $this->assertContains('Administration setup.', $tester->getDisplay());
          $this->assertContains('Config setup.', $tester->getDisplay());
 -        $this->assertContains('Installing assets.', $tester->getDisplay());
  
          $this->assertContains('Droping schema and creating schema', $tester->getDisplay());
      }
          $this->assertContains('Setting up database.', $tester->getDisplay());
          $this->assertContains('Administration setup.', $tester->getDisplay());
          $this->assertContains('Config setup.', $tester->getDisplay());
 -        $this->assertContains('Installing assets.', $tester->getDisplay());
  
          $this->assertContains('Creating schema', $tester->getDisplay());
      }
          $this->assertContains('Setting up database.', $tester->getDisplay());
          $this->assertContains('Administration setup.', $tester->getDisplay());
          $this->assertContains('Config setup.', $tester->getDisplay());
 -        $this->assertContains('Installing assets.', $tester->getDisplay());
      }
  }