]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge remote-tracking branch 'origin/master' into 2.2 2416/head
authorJeremy Benoist <jeremy.benoist@gmail.com>
Thu, 26 Jan 2017 12:32:07 +0000 (13:32 +0100)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Thu, 26 Jan 2017 12:32:07 +0000 (13:32 +0100)
1  2 
app/config/config.yml
src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entry.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/entries.xml.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig

diff --combined app/config/config.yml
index 05c82e4347b43f3d9a2127378dda640ff8463246,ca0ba1d8f3d5b62eb4009861de3210bc733ee94a..68f70d67f51692338ebbd6cff46f076e87b76f6f
@@@ -30,7 -30,7 +30,7 @@@ framework
      assets: ~
  
  wallabag_core:
-     version: 2.1.5
+     version: 2.1.6
      paypal_url: "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9UBA65LG3FX9Y&lc=gb"
      languages:
          en: 'English'
@@@ -51,8 -51,6 +51,8 @@@
      rss_limit: 50
      reading_speed: 1
      cache_lifetime: 10
 +    action_mark_as_read: 1
 +    list_mode: 1
      fetching_error_message: |
          wallabag can't retrieve contents for this article. Please <a href="http://doc.wallabag.org/en/master/user/errors_during_fetching.html#how-can-i-help-to-fix-that">troubleshoot this issue</a>.
  
@@@ -80,7 -78,7 +80,7 @@@ doctrine
          dbname: "%database_name%"
          user: "%database_user%"
          password: "%database_password%"
 -        charset: UTF8
 +        charset: "%database_charset%"
          path: "%database_path%"
          unix_socket: "%database_socket%"
          server_version: 5.6
@@@ -117,26 -115,12 +117,26 @@@ swiftmailer
  fos_rest:
      param_fetcher_listener: true
      body_listener: true
 -    format_listener: true
      view:
 +        mime_types:
 +            csv:
 +                - 'text/csv'
 +                - 'text/plain'
 +            pdf:
 +                - 'application/pdf'
 +            epub:
 +                - 'application/epub+zip'
 +            mobi:
 +                - 'application/x-mobipocket-ebook'
          view_response_listener: 'force'
          formats:
              xml: true
 -            json : true
 +            json: true
 +            txt: true
 +            csv: true
 +            pdf: true
 +            epub: true
 +            mobi: true
          templating_formats:
              html: true
          force_redirects:
          default_engine: twig
      routing_loader:
          default_format: json
 +    format_listener:
 +        enabled: true
 +        rules:
 +            - { path: "^/api/entries/([0-9]+)/export.(.*)", priorities: ['epub', 'mobi', 'pdf', 'txt', 'csv'], fallback_format: json, prefer_extension: false }
 +            - { path: "^/api", priorities: ['json', 'xml'], fallback_format: json, prefer_extension: false }
 +            - { path: "^/annotations", priorities: ['json', 'xml'], fallback_format: json, prefer_extension: false }
 +            # for an unknown reason, EACH REQUEST goes to FOS\RestBundle\EventListener\FormatListener
 +            # so we need to add custom rule for custom api export but also for all other routes of the application...
 +            - { path: '^/', priorities: ['text/html', '*/*'], fallback_format: html, prefer_extension: false }
  
  nelmio_api_doc:
      sandbox:
          enabled: false
 +    cache:
 +        enabled: true
      name: wallabag API documentation
  
  nelmio_cors:
@@@ -212,7 -185,6 +212,7 @@@ fos_user
      from_email:
          address:        "%from_email%"
          sender_name:    wallabag
 +
  fos_oauth_server:
      db_driver:           orm
      client_class:        Wallabag\ApiBundle\Entity\Client
      refresh_token_class: Wallabag\ApiBundle\Entity\RefreshToken
      auth_code_class:     Wallabag\ApiBundle\Entity\AuthCode
      service:
 -        user_provider: fos_user.user_manager
 +        user_provider: fos_user.user_provider.username_email
          options:
              refresh_token_lifetime: 1209600
  
@@@ -241,6 -213,16 +241,6 @@@ kphoen_rulerz
      executors:
          doctrine: true
  
 -lexik_maintenance:
 -    authorized:
 -        ips: ['127.0.0.1']
 -    driver:
 -        ttl: 3600
 -        class: 'Lexik\Bundle\MaintenanceBundle\Drivers\DatabaseDriver'
 -    response:
 -        code: 503
 -        status: "wallabag Service Temporarily Unavailable"
 -
  old_sound_rabbit_mq:
      connections:
          default:
              exchange_options:
                  name: 'wallabag.import.readability'
                  type: topic
 +        import_pinboard:
 +            connection: default
 +            exchange_options:
 +                name: 'wallabag.import.pinboard'
 +                type: topic
          import_instapaper:
              connection: default
              exchange_options:
              queue_options:
                  name: 'wallabag.import.pocket'
              callback: wallabag_import.consumer.amqp.pocket
 +            qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
          import_readability:
              connection: default
              exchange_options:
              queue_options:
                  name: 'wallabag.import.readability'
              callback: wallabag_import.consumer.amqp.readability
 +            qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
          import_instapaper:
              connection: default
              exchange_options:
              queue_options:
                  name: 'wallabag.import.instapaper'
              callback: wallabag_import.consumer.amqp.instapaper
 +            qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
 +        import_pinboard:
 +            connection: default
 +            exchange_options:
 +                name: 'wallabag.import.pinboard'
 +                type: topic
 +            queue_options:
 +                name: 'wallabag.import.pinboard'
 +            callback: wallabag_import.consumer.amqp.pinboard
 +            qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
          import_wallabag_v1:
              connection: default
              exchange_options:
              queue_options:
                  name: 'wallabag.import.wallabag_v1'
              callback: wallabag_import.consumer.amqp.wallabag_v1
 +            qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
          import_wallabag_v2:
              connection: default
              exchange_options:
              queue_options:
                  name: 'wallabag.import.wallabag_v2'
              callback: wallabag_import.consumer.amqp.wallabag_v2
 +            qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
          import_firefox:
              connection: default
              exchange_options:
              queue_options:
                  name: 'wallabag.import.firefox'
              callback: wallabag_import.consumer.amqp.firefox
 +            qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
          import_chrome:
              connection: default
              exchange_options:
              queue_options:
                  name: 'wallabag.import.chrome'
              callback: wallabag_import.consumer.amqp.chrome
 +            qos_options: {prefetch_count: "%rabbitmq_prefetch_count%"}
 +
 +fos_js_routing:
 +    routes_to_expose:
 +        - homepage
 +        - starred
 +        - archive
 +        - all
 +        - tag
 +        - config
 +        - import
 +        - developer
 +        - howto
 +        - fos_user_security_logout
 +        - new
index 95c846867d8771eff6f76fe94c520ca95f7c0c3e,4679714e6398355bcdf5355dd04ece6db626821f..859b166b18c8abd4a60cfdfa070cb2c3366a3142
@@@ -1,25 -1,20 +1,25 @@@
  {% extends "WallabagCoreBundle::layout.html.twig" %}
  
  {% block title %}
 -    {% set currentTag = '' %}
 +    {% set filter = '' %}
      {% if tag is defined %}
 -        {% set currentTag = tag %}
 +        {% set filter = tag %}
      {% endif %}
 -    {% include "@WallabagCore/themes/common/Entry/_title.html.twig" with {'currentTag': currentTag} %}
 +    {% if searchTerm is defined and searchTerm is not empty %}
 +        {% set filter = searchTerm %}
 +    {% endif %}
 +    {% include "@WallabagCore/themes/common/Entry/_title.html.twig" with {'filter': filter} %}
  {% endblock %}
  
  {% block content %}
  
 +    {% set listMode = app.user.config.listMode %}
      <div class="results">
          <div class="nb-results">{{ 'entry.list.number_on_the_page'|transchoice(entries.count) }}</div>
          <div class="pagination">
 -            <i class="btn-clickable download-btn material-icons md-36">file_download</i>
 -            <i class="btn-clickable filter-btn material-icons md-36">filter_list</i>
 +            <a href="{{ path('switch_view_mode') }}"><i class="listMode-btn material-icons md-36">{% if listMode == 0 %}list{% else %}view_module{% endif %}</i></a>
 +            <i class="btn-clickable download-btn material-icons md-36 js-export-action">file_download</i>
 +            <i class="btn-clickable filter-btn material-icons md-36 js-filters-action">filter_list</i>
              {% if entries.getNbPages > 1 %}
                  {{ pagerfanta(entries, 'twitter_bootstrap_translated', {'proximity': 1}) }}
              {% endif %}
@@@ -27,8 -22,8 +27,8 @@@
      </div>
  
      {% for entry in entries %}
 -        <div id="entry-{{ entry.id|e }}" class="entry">
 +        <div id="entry-{{ entry.id|e }}" class="{% if listMode == 0 %}entry{% else %}listmode entry{% endif %}">
-             <h2><a href="{{ path('view', { 'id': entry.id }) }}" title="{{ entry.title|raw }}">{{ entry.title|raw }}</a></h2>
+             <h2><a href="{{ path('view', { 'id': entry.id }) }}" title="{{ entry.title|e|raw }}">{{ entry.title|e|raw }}</a></h2>
  
              {% set readingTime = entry.readingTime / app.user.config.readingSpeed %}
              <div class="estimatedTime">
                  <li><a title="{{ 'entry.list.delete'|trans }}" class="tool delete icon-trash icon" href="{{ path('delete_entry', { 'id': entry.id }) }}"><span>{{ 'entry.list.delete'|trans }}</span></a></li>
                  <li><a href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.list.original_article'|trans }} : {{ entry.title|e }}" class="tool link icon-link icon"><span>{{ entry.domainName|removeWww }}</span></a></li>
              </ul>
 -            {% if entry.previewPicture is null %}
 +            {% if (entry.previewPicture is null or listMode == 1) %}
                  <ul class="card-entry-tags">
                      {% for tag in entry.tags %}
                          <li><a href="{{ path('tag_entries', {'slug': tag.slug}) }}">{{ tag.label }}</a></li>
                      {% endfor %}
                  </ul>
 -                <p>{{ entry.content|striptags|slice(0, 300) }}&hellip;</p>
 +                <p {% if listMode == 1 %}class="hide"{% endif %}>{{ entry.content|striptags|slice(0, 300) }}&hellip;</p>
              {% else %}
                  <ul class="card-entry-labels">
                  {% for tag in entry.tags | slice(0, 3) %}
                      <li><a href="{{ path('tag_entries', {'slug': tag.slug}) }}">{{ tag.label }}</a></li>
                  {% endfor %}
                  </ul>
-                 <img class="preview" src="{{ entry.previewPicture }}" alt="{{ entry.title|raw }}" />
+                 <img class="preview" src="{{ entry.previewPicture }}" alt="{{ entry.title|e|raw }}" />
              {% endif %}
          </div>
      {% endfor %}
                  </div>
              </div>
  
 +            <div id="filter-http-status" class="filter-group">
 +                {{ form_label(form.httpStatus) }}
 +                <div class="input-field ">
 +                    {{ form_widget(form.httpStatus) }}
 +                </div>
 +            </div>
 +
              <div id="filter-reading-time" class="filter-group">
                  <div class="">
                      {{ form_label(form.readingTime) }}
index 8ac2bc0bfb3be1e39241170a921056c23c1acde3,8ca194f6429f71f2361619dfc2a47f23669c28ea..a555691dfae2876f6ab1f125ebaec57674fc28f5
@@@ -1,17 -1,17 +1,17 @@@
  {% extends "WallabagCoreBundle::layout.html.twig" %}
  
- {% block title %}{{ entry.title|raw }} ({{ entry.domainName|removeWww }}){% endblock %}
+ {% block title %}{{ entry.title|e|raw }} ({{ entry.domainName|removeWww }}){% endblock %}
  
  {% block content %}
      <div id="article">
          <header class="mbm">
-             <h1>{{ entry.title|raw }} <a href="{{ path('edit', { 'id': entry.id }) }}" class="nostyle" title="{{ 'entry.view.edit_title'|trans }}">✎</a></h1>
+             <h1>{{ entry.title|e|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 href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|e }}" class="tool link icon icon-link original"><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>
  
                  {% set markAsReadLabel = 'entry.view.left_menu.set_as_unread' %}
@@@ -19,8 -19,8 +19,8 @@@
                      {% set markAsReadLabel = 'entry.view.left_menu.set_as_read' %}
                  {% endif %}
  
 -                <li><a title="{{ markAsReadLabel|trans }}" class="tool icon icon-check {% if entry.isArchived == 0 %}archive-off{% else %}archive{% endif %}" href="{{ path('archive_entry', { 'id': entry.id }) }}"><span>{{ markAsReadLabel|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 title="{{ markAsReadLabel|trans }}" class="tool icon icon-check {% if entry.isArchived == 0 %}archive-off{% else %}archive{% endif %} markasread" href="{{ path('archive_entry', { 'id': entry.id }) }}"><span>{{ markAsReadLabel|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 %} favorite" 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" class="tool icon icon-price-tags" 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_public') %}
@@@ -29,9 -29,8 +29,9 @@@
                  {% endif %}
                  {% 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 icon-image icon-image--shaarli" title="shaarli"><span>shaarli</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 }}&amp;tags={{ entry.tags|join(',')|url_encode }}" target="_blank" class="tool icon-image icon-image--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('share_unmark') %}<li><a href="{{ craue_setting('unmark_url') }}/mark/add?url={{ entry.url|url_encode }}&amp;title={{entry.title|url_encode}}&amp;v=6" target="_blank" class="tool unmark icon-image icon-image--unmark" title="unmark"><span>unmark.it</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 %}
@@@ -68,7 -67,7 +68,7 @@@
              </aside>
          </div>
          {% if entry.previewPicture is not null %}
-             <div><img class="preview" src="{{ entry.previewPicture }}" alt="{{ entry.title|raw }}" /></div>
+             <div><img class="preview" src="{{ entry.previewPicture }}" alt="{{ entry.title|e|raw }}" /></div>
          {% endif %}
          <article>
              {{ entry.content | raw }}
index 16ecaa97988795818701d8b42edbabcc15d7c1dd,7103f22b7177b5f0f807c309f02f69230ec5ced2..12e8c79fd73c0d8a7555f313275a03e2a5705a10
@@@ -2,15 -2,7 +2,15 @@@
  <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
      <channel>
          <title>wallabag — {{type}} feed</title>
 -        <link>{{ url('unread') }}</link>
 +        <link>{{ url(type) }}</link>
 +        <link rel="self" href="{{ app.request.uri }}"/>
 +        {% if entries.hasPreviousPage -%}
 +            <link rel="previous" href="{{ url }}?page={{ entries.previousPage }}"/>
 +        {% endif -%}
 +        {% if entries.hasNextPage -%}
 +            <link rel="next" href="{{ url }}?page={{ entries.nextPage }}"/>
 +        {% endif -%}
 +        <link rel="last" href="{{ url }}?page={{ entries.nbPages }}"/>
          <pubDate>{{ "now"|date('D, d M Y H:i:s') }}</pubDate>
          <generator>wallabag</generator>
          <description>wallabag {{type}} elements</description>
@@@ -18,7 -10,7 +18,7 @@@
          {% for entry in entries %}
  
              <item>
-                 <title><![CDATA[{{ entry.title }}]]></title>
+                 <title><![CDATA[{{ entry.title|e }}]]></title>
                  <source url="{{ url('view', { 'id': entry.id }) }}">wallabag</source>
                  <link>{{ entry.url }}</link>
                  <guid>{{ entry.url }}</guid>
index a99bc4eae6a2e72d2c584a9099195dbced1a3f62,b445f7d5fabeb9497103987ddd763f7503d29177..15428b9231e12adf873ba3a5b507bd593ceb7a3a
@@@ -1,6 -1,6 +1,6 @@@
  {% extends "WallabagCoreBundle::layout.html.twig" %}
  
- {% block title %}{{ entry.title|raw }} ({{ entry.domainName|removeWww }}){% endblock %}
+ {% block title %}{{ entry.title|e|raw }} ({{ entry.domainName|removeWww }}){% endblock %}
  
  {% block body_class %}entry{% endblock %}
  
          </li>
  
          <li class="bold border-bottom hide-on-med-and-down">
 -            <a class="waves-effect collapsible-header" href="{{ entry.url|e }}">
 +            <a class="waves-effect collapsible-header original" href="{{ entry.url|e }}" target="_blank">
                  <i class="material-icons small">link</i>
                  <span>{{ 'entry.view.left_menu.view_original_article'|trans }}</span>
              </a>
              <div class="collapsible-body"></div>
          </li>
  
 -        <li class="bold hide-on-med-and-down">
 +        <li class="bold">
              <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="material-icons small">autorenew</i>
                  <span>{{ 'entry.view.left_menu.re_fetch_content'|trans }}</span>
@@@ -67,7 -67,7 +67,7 @@@
          {% endif %}
  
          <li class="bold hide-on-med-and-down">
 -            <a class="waves-effect collapsible-header" title="{{ markAsReadLabel|trans }}" href="{{ path('archive_entry', { 'id': entry.id }) }}" id="markAsRead">
 +            <a class="waves-effect collapsible-header markasread" title="{{ markAsReadLabel|trans }}" href="{{ path('archive_entry', { 'id': entry.id }) }}" id="markAsRead">
                  <i class="material-icons small">{% if entry.isArchived == 0 %}done{% else %}redo{% endif %}</i>
                  <span>{{ markAsReadLabel|trans }}</span>
              </a>
          </li>
  
          <li class="bold hide-on-med-and-down">
 -            <a class="waves-effect collapsible-header" title="{{ 'entry.view.left_menu.set_as_starred'|trans }}" href="{{ path('star_entry', { 'id': entry.id }) }}" id="setFav">
 +            <a class="waves-effect collapsible-header favorite" title="{{ 'entry.view.left_menu.set_as_starred'|trans }}" href="{{ path('star_entry', { 'id': entry.id }) }}" id="setFav">
                  <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 }) }}">
 +        <li class="bold border-bottom">
 +            <a class="waves-effect collapsible-header delete" title="{{ 'entry.view.left_menu.delete'|trans }}" href="{{ path('delete_entry', { 'id': entry.id }) }}">
                  <i class="material-icons small">delete</i>
                  <span>{{ 'entry.view.left_menu.delete'|trans }}</span>
              </a>
              <div class="collapsible-body"></div>
          </li>
  
 -        <li class="bold border-bottom hide-on-med-and-down">
 +        <li class="bold border-bottom">
              <a class="waves-effect collapsible-header" id="nav-btn-add-tag">
                  <i class="material-icons small">label_outline</i>
                  <span>{{ 'entry.view.left_menu.add_a_tag'|trans }}</span>
                      {% 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">
 +                        <a href="{{ craue_setting('shaarli_url') }}/index.php?post={{ entry.url|url_encode }}&amp;title={{ entry.title|url_encode }}&amp;tags={{ entry.tags|join(',')|url_encode }}" target="_blank">
                                  <i class="tool icon-image icon-image--shaarli" title="shaarli"></i>
                                  <span>shaarli</span>
                              </a>
                              </a>
                          </li>
                      {% endif %}
 +                    {% if craue_setting('share_unmark') %}
 +                        <li>
 +                            <a href="{{ craue_setting('unmark_url') }}/mark/add?url={{ entry.url|url_encode }}&amp;title={{entry.title|url_encode}}&amp;v=6" target="_blank">
 +                                <i class="tool icon-image icon-image--unmark" title="unmark"></i>
 +                                <span>unmark.it</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 }}" target="_blank" title="carrot">
              </div>
          </li>
  
 -        <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="material-icons small">delete</i>
 -                <span>{{ 'entry.view.left_menu.delete'|trans }}</span>
 -            </a>
 -            <div class="collapsible-body"></div>
 -        </li>
 -
          <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="material-icons small">error</i>
  {% 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|e|raw }} <a href="{{ path('edit', { 'id': entry.id }) }}" title="{{ 'entry.view.edit_title'|trans }}">✎</a></h1>
          </header>
          <aside>
              <ul class="tools">
                  <li>
 -                    {% set readingTime = entry.readingTime / app.user.config.readingSpeed %}
 -                    <i class="material-icons">timer</i>
 -                    {% 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 %}
 +                    {% include "@WallabagCore/themes/material/Entry/_reading_time.html.twig" with {'entry': entry} only %}
                  </li>
                  <li>
                      <i class="material-icons" title="{{ 'entry.view.created_at'|trans }}">today</i>
          <article>
              {{ entry.content | raw }}
          </article>
 +
 +        <div class="fixed-action-btn horizontal click-to-toggle hide-on-large-only">
 +            <a class="btn-floating btn-large">
 +              <i class="material-icons">menu</i>
 +            </a>
 +            <ul>
 +              <li><a class="btn-floating" href="{{ path('archive_entry', { 'id': entry.id }) }}"><i class="material-icons">done</i></a></li>
 +              <li><a class="btn-floating" href="{{ path('star_entry', { 'id': entry.id }) }}"><i class="material-icons">star_outline</i></a></li>
 +              <li><a class="btn-floating" href="{{ path('delete_entry', { 'id': entry.id }) }}"><i class="material-icons">delete</i></a></li>
 +            </ul>
 +        </div>
      </div>
  
  <script id="annotationroutes" type="application/json">