aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--README.md4
-rw-r--r--app/Resources/CraueConfigBundle/translations/CraueConfigBundle.en.yml5
-rw-r--r--app/Resources/CraueConfigBundle/translations/CraueConfigBundle.fr.yml5
-rw-r--r--src/Wallabag/CoreBundle/Controller/TagController.php20
-rw-r--r--src/Wallabag/CoreBundle/Entity/Tag.php10
-rw-r--r--src/Wallabag/CoreBundle/Repository/TagRepository.php16
-rwxr-xr-xsrc/Wallabag/CoreBundle/Resources/public/themes/material/css/main.css14
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml51
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig16
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig2
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig2
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/new_form.html.twig2
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig2
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig2
-rw-r--r--src/Wallabag/CoreBundle/Tests/Controller/TagControllerTest.php30
-rw-r--r--src/Wallabag/ImportBundle/Import/WallabagV1Import.php20
-rw-r--r--src/Wallabag/ImportBundle/Import/WallabagV2Import.php2
-rw-r--r--src/Wallabag/ImportBundle/Resources/config/services.yml2
-rw-r--r--src/Wallabag/ImportBundle/Resources/views/Pocket/index.html.twig7
-rw-r--r--src/Wallabag/ImportBundle/Tests/Import/WallabagV1ImportTest.php22
-rw-r--r--src/Wallabag/ImportBundle/Tests/Import/WallabagV2ImportTest.php11
-rw-r--r--src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v1.json16
-rw-r--r--src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2.json41
23 files changed, 262 insertions, 40 deletions
diff --git a/README.md b/README.md
index 07b4cb78..39d497d8 100644
--- a/README.md
+++ b/README.md
@@ -15,8 +15,8 @@ If you don't have it yet, please [install composer](https://getcomposer.org/down
15 15
16``` 16```
17SYMFONY_ENV=prod composer create-project wallabag/wallabag wallabag "2.0.*alpha" --no-dev 17SYMFONY_ENV=prod composer create-project wallabag/wallabag wallabag "2.0.*alpha" --no-dev
18php bin/console wallabag:install 18php bin/console wallabag:install --env=prod
19php bin/console server:run 19php bin/console server:run --env=prod
20``` 20```
21 21
22## License 22## License
diff --git a/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.en.yml b/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.en.yml
index 6d86eab6..1c47ed2d 100644
--- a/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.en.yml
+++ b/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.en.yml
@@ -17,3 +17,8 @@ share_twitter: Enable share to Twitter
17show_printlink: Display a link to print content 17show_printlink: Display a link to print content
18wallabag_support_url: Support URL for wallabag 18wallabag_support_url: Support URL for wallabag
19wallabag_url: URL of *your* wallabag instance 19wallabag_url: URL of *your* wallabag instance
20entry: "article"
21export: "export"
22import: "import"
23misc: "misc"
24modify_settings: "apply"
diff --git a/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.fr.yml b/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.fr.yml
index cdd56acd..ddb78a13 100644
--- a/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.fr.yml
+++ b/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.fr.yml
@@ -17,3 +17,8 @@ share_twitter: Activer le partage vers Twitter
17show_printlink: Afficher un lien pour imprimer 17show_printlink: Afficher un lien pour imprimer
18wallabag_support_url: URL de support de wallabag 18wallabag_support_url: URL de support de wallabag
19wallabag_url: URL de *votre* instance de wallabag 19wallabag_url: URL de *votre* instance de wallabag
20entry: "article"
21export: "export"
22import: "import"
23misc: "divers"
24modify_settings: "appliquer"
diff --git a/src/Wallabag/CoreBundle/Controller/TagController.php b/src/Wallabag/CoreBundle/Controller/TagController.php
index ff4d64a8..7b34939d 100644
--- a/src/Wallabag/CoreBundle/Controller/TagController.php
+++ b/src/Wallabag/CoreBundle/Controller/TagController.php
@@ -56,6 +56,26 @@ class TagController extends Controller
56 } 56 }
57 57
58 /** 58 /**
59 * Removes tag from entry.
60 *
61 * @Route("/remove-tag/{entry}/{tag}", requirements={"entry" = "\d+", "tag" = "\d+"}, name="remove_tag")
62 *
63 * @return \Symfony\Component\HttpFoundation\Response
64 */
65 public function removeTagFromEntry(Request $request, Entry $entry, Tag $tag)
66 {
67 $entry->removeTag($tag);
68 $em = $this->getDoctrine()->getManager();
69 $em->flush();
70 if (count($tag->getEntries()) == 0) {
71 $em->remove($tag);
72 }
73 $em->flush();
74
75 return $this->redirect($request->headers->get('referer'));
76 }
77
78 /**
59 * Shows tags for current user. 79 * Shows tags for current user.
60 * 80 *
61 * @Route("/tag/list", name="tag") 81 * @Route("/tag/list", name="tag")
diff --git a/src/Wallabag/CoreBundle/Entity/Tag.php b/src/Wallabag/CoreBundle/Entity/Tag.php
index c1940e99..a6e2d023 100644
--- a/src/Wallabag/CoreBundle/Entity/Tag.php
+++ b/src/Wallabag/CoreBundle/Entity/Tag.php
@@ -107,4 +107,14 @@ class Tag
107 { 107 {
108 return $this->entries->contains($entry); 108 return $this->entries->contains($entry);
109 } 109 }
110
111 /**
112 * Get entries for this tag.
113 *
114 * @return ArrayCollection<Entry>
115 */
116 public function getEntries()
117 {
118 return $this->entries;
119 }
110} 120}
diff --git a/src/Wallabag/CoreBundle/Repository/TagRepository.php b/src/Wallabag/CoreBundle/Repository/TagRepository.php
index c4aeb594..afeb985b 100644
--- a/src/Wallabag/CoreBundle/Repository/TagRepository.php
+++ b/src/Wallabag/CoreBundle/Repository/TagRepository.php
@@ -51,4 +51,20 @@ class TagRepository extends EntityRepository
51 ->getQuery() 51 ->getQuery()
52 ->getResult(); 52 ->getResult();
53 } 53 }
54
55 /**
56 * Used only in test case to get a tag for our entry.
57 *
58 * @return Tag
59 */
60 public function findOneByEntryAndTagLabel($entry, $label)
61 {
62 return $this->createQueryBuilder('t')
63 ->leftJoin('t.entries', 'e')
64 ->where('e.id = :entryId')->setParameter('entryId', $entry->getId())
65 ->andWhere('t.label = :label')->setParameter('label', $label)
66 ->setMaxResults(1)
67 ->getQuery()
68 ->getSingleResult();
69 }
54} 70}
diff --git a/src/Wallabag/CoreBundle/Resources/public/themes/material/css/main.css b/src/Wallabag/CoreBundle/Resources/public/themes/material/css/main.css
index 0ce334a3..f88880cc 100755
--- a/src/Wallabag/CoreBundle/Resources/public/themes/material/css/main.css
+++ b/src/Wallabag/CoreBundle/Resources/public/themes/material/css/main.css
@@ -149,10 +149,6 @@ nav input {
149 max-height: 64px; 149 max-height: 64px;
150} 150}
151 151
152.nav-panel-buttom {
153 float: right;
154}
155
156.nav-panels { 152.nav-panels {
157 transition: background 0.2s ease; 153 transition: background 0.2s ease;
158} 154}
@@ -395,6 +391,10 @@ main ul.row {
395 color: #ffffff; 391 color: #ffffff;
396} 392}
397 393
394#article aside .chip i {
395 color: #ffffff;
396}
397
398/* ========================================================================== 398/* ==========================================================================
399 6 = Media queries 399 6 = Media queries
400 ========================================================================== */ 400 ========================================================================== */
@@ -417,6 +417,12 @@ main ul.row {
417 } 417 }
418 } 418 }
419 419
420@media only screen and (min-width : 400px) {
421 .nav-panel-buttom {
422 float: right;
423 }
424}
425
420@media only screen and (min-width : 993px) and (max-width : 1180px) { 426@media only screen and (min-width : 993px) and (max-width : 1180px) {
421 .row .col.l1 { 427 .row .col.l1 {
422 width: 25%; 428 width: 25%;
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
index cc814cc4..c7186c34 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
@@ -52,12 +52,50 @@ New password: 'Nouveau mot de passe'
52Repeat new password: 'Confirmez votre nouveau mot de passe' 52Repeat new password: 'Confirmez votre nouveau mot de passe'
53Username: "Nom d'utilisateur" 53Username: "Nom d'utilisateur"
54 54
55# Tagging rules
56Tagging rules: "Règles de tag automatiques"
57What does « tagging rules » mean?: "Que signifient les règles de tag automatiques ?"
58"They are rules used by Wallabag to automatically tag new entries.<br />Each time a new entry is added, all the tagging rules will be used to add the tags you configured, thus saving you the trouble to manually classify your entries.": "Ce sont des règles utilisées par wallabag pour classer automatiquement vos nouveaux articles.<br />À chaque fois qu'un nouvel article est ajouté, toutes les règles de tag automatiques seront utilisées afin d'ajouter les tags que vous avez configuré, vous épargnant ainsi l'effort de classifier vos articles manuellement."
59How do I use them?: "Comment les utiliser ?"
60"Let assume you want to tag new entries as « <i>short reading</i> » when the reading time is inferior to 3 minutes.<br />In that case, you should put « readingTime &lt;= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i> field.<br />Several tags can added simultaneously by separating them by a comma: « <i>short reading, must read</i> »<br />Complex rules can be written by using predefined operators: if « <i>readingTime &gt;= 5 AND domainName = \"github.com\"</i> » then tag as « <i>long reading, github </i> »": "Imaginons que voulez attribuer aux nouveaux articles le tag « <i>lecture courte</i> » lorsque le temps de lecture est inférieur à 3 minutes.<br />Dans ce cas, vous devriez mettre « readingTime &lt;= 3 » dans le champ <i>Règle</i> et « <i>lecture courte</i> » dans le champ <i>Tag</i>.<br />Plusieurs tags peuvent être ajoutés simultanément en les séparant par des virgules : « <i>lecture courte, à lire</i> »<br />Des règles complexes peuvent être créées en utilisant des opérateurs prédéfinis: si « <i>readingTime &gt;= 5 AND domainName = \"github.com\"</i> » alors attribuer les tags « <i>lecteur longue, github </i> »"
61Which variables and operators can I use to write rules?: "Quelles variables et opérateurs puis-je utiliser pour écrire des règles ?"
62The following variables and operators can be used to create tagging rules:: "Les variables et opérateurs suivants peuvent être utilisés pour écrire des règles de tag automatiques :"
63Variable: "Variable"
64Meaning: "Signification"
65Operator: "Opérateur"
66Title of the entry: "Titre de l'article"
67Less than…: "Moins que…"
68URL of the entry: "URL de l'article"
69Strictly less than…: "Strictement moins que…"
70Whether the entry is archived or not: "Si l'article est archivé ou non"
71Greater than…: "Plus que…"
72Whether the entry is starred or not: "Si l'article est favori ou non"
73Strictly greater than…: "Strictement plus que…"
74The entry's content: "Le contenu de l'article"
75Equal to…: "Égal à…"
76The entry's language: "La langue de l'article"
77Not equal to…: "Différent de…"
78The entry's mime-type: "Le Type MIME de l'article"
79One rule or another: "Une règle ou l'autre"
80The estimated entry's reading time, in minutes: "Le temps de lecture estimé de l'article, en minutes"
81One rule and another: "Une règle et l'autre"
82The domain name of the entry: "Le nom de domaine de l'article"
83"Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches \"football\"</code>": "Teste si un <i>sujet</i> correspond à une <i>recherche</i> (non sensible à la casse).<br />Exemple : <code>title matches \"football\"</code>"
84Rule: "Règle"
85
55# Entries 86# Entries
56'estimated reading time': 'durée de lecture' 87'estimated reading time': 'durée de lecture'
57original: "original" 88original: "original"
58Toggle mark as read: 'Marquer comme lu/non lu' 89Toggle mark as read: 'Marquer comme lu/non lu'
59Toggle favorite: 'Marquer comme favori' 90Toggle favorite: 'Marquer comme favori'
60Delete: 'Supprimer' 91Delete: 'Supprimer'
92"{0} There is no entry.|{1} There is one entry.|]1,Inf[ There are %count% entries.": "{0} Il n'y a pas d'articles.|{1} Il y a un article.|]1,Inf[ Il y a %count% articles."
93http://website: "http://siteweb"
94
95# Edit entry
96Edit an entry: "Éditer un article"
97Title: "Titre"
98Is public: "Public"
61 99
62# Filters 100# Filters
63Filters: 'Filtres' 101Filters: 'Filtres'
@@ -75,8 +113,10 @@ Creation date: 'Date de création'
75dd/mm/yyyy: 'dd/mm/aaaa' 113dd/mm/yyyy: 'dd/mm/aaaa'
76Clear: 'Effacer' 114Clear: 'Effacer'
77Filter: 'Filtrer' 115Filter: 'Filtrer'
116website.com: "siteweb.com"
78 117
79# About 118# About
119About: "À propos"
80Who is behind wallabag: "L'équipe derrière wallabag" 120Who is behind wallabag: "L'équipe derrière wallabag"
81Getting help: "Besoin d'aide" 121Getting help: "Besoin d'aide"
82Helping wallabag: "Aider wallabag" 122Helping wallabag: "Aider wallabag"
@@ -95,6 +135,10 @@ or: "ou"
95"by contributing to the project:": "en contribuant au projet :" 135"by contributing to the project:": "en contribuant au projet :"
96an issue lists all our needs: "un ticket recense tous nos besoins" 136an issue lists all our needs: "un ticket recense tous nos besoins"
97via Paypal: "via Paypal" 137via Paypal: "via Paypal"
138Take wallabag with you: "Emportez wallabag avec vous"
139Social: "Social"
140powered by: "propulsé par"
141
98 142
99# Howto 143# Howto
100Form: "Formulaire" 144Form: "Formulaire"
@@ -134,8 +178,13 @@ Edit title: "Modifier le titre"
134Welcome on wallabag importer. Please select your previous service that you want to migrate.: "Bienvenue dans l'outil de migration de wallabag. Choisissez ci-dessous le service depuis lequel vous souhaitez migrer." 178Welcome on wallabag importer. Please select your previous service that you want to migrate.: "Bienvenue dans l'outil de migration de wallabag. Choisissez ci-dessous le service depuis lequel vous souhaitez migrer."
135"This importer will import all your Pocket data. Pocket doesn't allow us to retrieve content from their service, so the readable content of each article will be re-fetched by wallabag.": "Cet outil va importer toutes vos données de Pocket. Pocket ne nous autorise pas à récupérer le contenu depuis leur service, donc wallabag doit reparcourir chaque article pour récupérer son contenu." 179"This importer will import all your Pocket data. Pocket doesn't allow us to retrieve content from their service, so the readable content of each article will be re-fetched by wallabag.": "Cet outil va importer toutes vos données de Pocket. Pocket ne nous autorise pas à récupérer le contenu depuis leur service, donc wallabag doit reparcourir chaque article pour récupérer son contenu."
136"This importer will import all your wallabag v1 articles. On your config page, click on \"JSON export\" in the \"Export your wallabag data\" section. You will have a \"wallabag-export-1-xxxx-xx-xx.json\" file.": "Cet outil va importer toutes vos données de wallabag v1. Sur votre page de configuration de wallabag v1, cliquez sur \"Export JSON\" dans la section \"Exporter vos données de wallabag\". Vous allez récupérer un fichier \"wallabag-export-1-xxxx-xx-xx.json\"." 180"This importer will import all your wallabag v1 articles. On your config page, click on \"JSON export\" in the \"Export your wallabag data\" section. You will have a \"wallabag-export-1-xxxx-xx-xx.json\" file.": "Cet outil va importer toutes vos données de wallabag v1. Sur votre page de configuration de wallabag v1, cliquez sur \"Export JSON\" dans la section \"Exporter vos données de wallabag\". Vous allez récupérer un fichier \"wallabag-export-1-xxxx-xx-xx.json\"."
181"This importer will import all your wallabag v2 articles. Go to All articles, then, on the export sidebar, click on \"JSON\". You will have a \"All articles.json\" file.": "Cet outil va importer toutes vos articles d'une autre instance de wallabag v2. Allez dans tous vos articles, puis, sur la barre latérale, cliquez sur \"JSON\". Vous allez récupérer un fichier \"All articles.json\""
137"You can import your data from your Pocket account. You just have to click on the below button and authorize the application to connect to getpocket.com.": "Vous pouvez importer vos données depuis votre compte Pocket. Vous n'avez qu'à cliquer sur le bouton ci-dessous et à autoriser wallabag à se connecter à getpocket.com." 182"You can import your data from your Pocket account. You just have to click on the below button and authorize the application to connect to getpocket.com.": "Vous pouvez importer vos données depuis votre compte Pocket. Vous n'avez qu'à cliquer sur le bouton ci-dessous et à autoriser wallabag à se connecter à getpocket.com."
138Connect to Pocket and import data: "Se connecter à Pocket et importer les données." 183Import > Pocket: "Import > Pocket"
184Pocket import isn't configured.: "L'import à partir de Pocket n'est pas configuré."
185You need to define %keyurls% a pocket_consumer_key %keyurle%.: "Vous devez définir %keyurls% une clé pour l'API Pocket %keyurle%."
186Your server admin needs to define an API Key for Pocket.: L'administrateur de votre serveur doit définir une clé pour l'API Pocket."
187Connect to Pocket and import data: "Se connecter à Pocket et importer les données"
139Please select your wallabag export and click on the below button to upload and import it.: "Choisissez le fichier de votre export wallabag v1 et cliquez sur le bouton ci-dessous pour l'importer." 188Please select your wallabag export and click on the below button to upload and import it.: "Choisissez le fichier de votre export wallabag v1 et cliquez sur le bouton ci-dessous pour l'importer."
140File: "Fichier" 189File: "Fichier"
141Upload file: "Importer le fichier" 190Upload file: "Importer le fichier"
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig
index 1cae90a4..e388f2c8 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig
@@ -238,21 +238,14 @@
238 <h5>{% trans %}What does « tagging rules » mean?{% endtrans %}</h5> 238 <h5>{% trans %}What does « tagging rules » mean?{% endtrans %}</h5>
239 <p class="help"> 239 <p class="help">
240 {% trans %} 240 {% trans %}
241 They are rules used by Wallabag to automatically tag new entries.<br /> 241 They are rules used by Wallabag to automatically tag new entries.<br />Each time a new entry is added, all the tagging rules will be used to add the tags you configured, thus saving you the trouble to manually classify your entries.
242 Each time a new entry is added, all the tagging rules will be used to add
243 the tags you configured, thus saving you the trouble to manually classify
244 your entries.
245 {% endtrans %} 242 {% endtrans %}
246 </p> 243 </p>
247 244
248 <h5>{% trans %}How do I use them?{% endtrans %}</h5> 245 <h5>{% trans %}How do I use them?{% endtrans %}</h5>
249 <p class="help"> 246 <p class="help">
250 {% trans %} 247 {% trans %}
251 Let assume you want to tag new entries as « <i>short reading</i> » when the reading time is inferior to 3 minutes.<br /> 248 Let assume you want to tag new entries as « <i>short reading</i> » when the reading time is inferior to 3 minutes.<br />In that case, you should put « readingTime &lt;= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i> field.<br />Several tags can added simultaneously by separating them by a comma: « <i>short reading, must read</i> »<br />Complex rules can be written by using predefined operators: if « <i>readingTime &gt;= 5 AND domainName = "github.com"</i> » then tag as « <i>long reading, github </i> »
252 In that case, you should put « readingTime &lt;= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i>
253 field.<br />
254 Several tags can added simultaneously by separating them by a comma: « <i>short reading, must read</i> »<br />
255 Complex rules can be written by using predefined operators: if « <i>readingTime &gt;= 5 AND domainName = "github.com"</i> » then tag as « <i>long reading, github </i> »
256 {% endtrans %} 249 {% endtrans %}
257 </p> 250 </p>
258 251
@@ -290,7 +283,7 @@
290 <td>{% trans %}Greater than…{% endtrans %}</td> 283 <td>{% trans %}Greater than…{% endtrans %}</td>
291 </tr> 284 </tr>
292 <tr> 285 <tr>
293 <td>isStared</td> 286 <td>isStarred</td>
294 <td>{% trans %}Whether the entry is starred or not{% endtrans %}</td> 287 <td>{% trans %}Whether the entry is starred or not{% endtrans %}</td>
295 <td>&gt;</td> 288 <td>&gt;</td>
296 <td>{% trans %}Strictly greater than…{% endtrans %}</td> 289 <td>{% trans %}Strictly greater than…{% endtrans %}</td>
@@ -325,8 +318,7 @@
325 <td>matches</td> 318 <td>matches</td>
326 <td> 319 <td>
327 {% trans %} 320 {% trans %}
328 Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br /> 321 Tests that a <i>subject</i> is matches a <i>search</i> (case-insensitive).<br />Example: <code>title matches "football"</code>
329 Example: <code>title matches "football"</code>
330 {% endtrans %} 322 {% endtrans %}
331 </td> 323 </td>
332 </tr> 324 </tr>
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
index 3b7698f3..ac17ccee 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
@@ -162,7 +162,7 @@
162 </div> 162 </div>
163 163
164 <div class="input-field col s12"> 164 <div class="input-field col s12">
165 {{ form_widget(form.domainName, {'type': 'text', 'attr' : {'placeholder': 'website.com'} }) }} 165 {{ form_widget(form.domainName, {'type': 'text', 'attr' : {'placeholder': 'website.com' | trans} }) }}
166 <label for="entry_filter_domainName">{% trans %}Domain name{% endtrans %}</label> 166 <label for="entry_filter_domainName">{% trans %}Domain name{% endtrans %}</label>
167 </div> 167 </div>
168 168
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
index 2d3fd516..6f8c3674 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
@@ -159,7 +159,7 @@ main {
159 <div id="list"> 159 <div id="list">
160 {% for tag in entry.tags %} 160 {% for tag in entry.tags %}
161 <div class="chip"> 161 <div class="chip">
162 {{ tag.label }} 162 {{ tag.label }} <a href="{{ path('remove_tag', { 'entry': entry.id, 'tag': tag.id }) }}"><i class="mdi-navigation-close"></i></a>
163 </div> 163 </div>
164 {% endfor %} 164 {% endfor %}
165 </div> 165 </div>
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/new_form.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/new_form.html.twig
index 47e3bc78..2de53106 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/new_form.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/new_form.html.twig
@@ -8,7 +8,7 @@
8 <span class="black-text">{{ form_errors(form.url) }}</span> 8 <span class="black-text">{{ form_errors(form.url) }}</span>
9 {% endif %} 9 {% endif %}
10 10
11 {{ form_widget(form.url, { 'attr': {'autocomplete': 'off', 'placeholder': 'http://website'} }) }} 11 {{ form_widget(form.url, { 'attr': {'autocomplete': 'off', 'placeholder': 'http://website' | trans} }) }}
12 12
13 <div class="hidden">{{ form_rest(form) }}</div> 13 <div class="hidden">{{ form_rest(form) }}</div>
14</form> 14</form>
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig
index 9f92c178..19754d41 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig
@@ -9,7 +9,7 @@
9 <br /> 9 <br />
10 <ul class="row data"> 10 <ul class="row data">
11 {% for tag in tags %} 11 {% for tag in tags %}
12 <li id="tag-{{ tag.id|e }}" class="col l4 m6 s12">{{tag.label}}</li> 12 <li id="tag-{{ tag.id|e }}" class="col l4 m6 s12">{{tag.label}} ({{ tag.entries.getValues | length }})</li>
13 {% endfor %} 13 {% endfor %}
14 </ul> 14 </ul>
15{% endblock %} 15{% endblock %}
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
index dff9e612..d7bfa7ae 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
@@ -115,7 +115,7 @@
115 <div class="footer-copyright"> 115 <div class="footer-copyright">
116 <div class="container"> 116 <div class="container">
117 <p>{% trans %}powered by{% endtrans %} <a target="_blank" href="https://wallabag.org" class="grey-text text-lighten-4">wallabag</a></p> 117 <p>{% trans %}powered by{% endtrans %} <a target="_blank" href="https://wallabag.org" class="grey-text text-lighten-4">wallabag</a></p>
118 <a class="grey-text text-lighten-4 right" href="{{ path('about') }}">{% trans %}about{% endtrans %}</a> 118 <a class="grey-text text-lighten-4 right" href="{{ path('about') }}">{% trans %}About{% endtrans %}</a>
119 </div> 119 </div>
120 </div> 120 </div>
121 </footer> 121 </footer>
diff --git a/src/Wallabag/CoreBundle/Tests/Controller/TagControllerTest.php b/src/Wallabag/CoreBundle/Tests/Controller/TagControllerTest.php
index dc93dd6b..d6391282 100644
--- a/src/Wallabag/CoreBundle/Tests/Controller/TagControllerTest.php
+++ b/src/Wallabag/CoreBundle/Tests/Controller/TagControllerTest.php
@@ -6,6 +6,8 @@ use Wallabag\CoreBundle\Tests\WallabagCoreTestCase;
6 6
7class TagControllerTest extends WallabagCoreTestCase 7class TagControllerTest extends WallabagCoreTestCase
8{ 8{
9 public $tagName = 'opensource';
10
9 public function testList() 11 public function testList()
10 { 12 {
11 $this->logInAs('admin'); 13 $this->logInAs('admin');
@@ -31,7 +33,7 @@ class TagControllerTest extends WallabagCoreTestCase
31 $form = $crawler->filter('button[id=tag_save]')->form(); 33 $form = $crawler->filter('button[id=tag_save]')->form();
32 34
33 $data = array( 35 $data = array(
34 'tag[label]' => 'opensource', 36 'tag[label]' => $this->tagName,
35 ); 37 );
36 38
37 $client->submit($form, $data); 39 $client->submit($form, $data);
@@ -65,4 +67,30 @@ class TagControllerTest extends WallabagCoreTestCase
65 67
66 $this->assertEquals(2, count($newEntry->getTags())); 68 $this->assertEquals(2, count($newEntry->getTags()));
67 } 69 }
70
71 public function testRemoveTagFromEntry()
72 {
73 $this->logInAs('admin');
74 $client = $this->getClient();
75
76 $entry = $client->getContainer()
77 ->get('doctrine.orm.entity_manager')
78 ->getRepository('WallabagCoreBundle:Entry')
79 ->findOneByUsernameAndNotArchived('admin');
80
81 $tag = $client->getContainer()
82 ->get('doctrine.orm.entity_manager')
83 ->getRepository('WallabagCoreBundle:Tag')
84 ->findOneByEntryAndTagLabel($entry, $this->tagName);
85
86 $client->request('GET', '/remove-tag/'.$entry->getId().'/'.$tag->getId());
87
88 $this->assertEquals(302, $client->getResponse()->getStatusCode());
89
90 $this->assertNotContains($this->tagName, $entry->getTags());
91
92 $client->request('GET', '/remove-tag/'.$entry->getId().'/'.$tag->getId());
93
94 $this->assertEquals(404, $client->getResponse()->getStatusCode());
95 }
68} 96}
diff --git a/src/Wallabag/ImportBundle/Import/WallabagV1Import.php b/src/Wallabag/ImportBundle/Import/WallabagV1Import.php
index 0dac6203..c54e73b2 100644
--- a/src/Wallabag/ImportBundle/Import/WallabagV1Import.php
+++ b/src/Wallabag/ImportBundle/Import/WallabagV1Import.php
@@ -8,20 +8,23 @@ use Doctrine\ORM\EntityManager;
8use Wallabag\CoreBundle\Entity\Entry; 8use Wallabag\CoreBundle\Entity\Entry;
9use Wallabag\UserBundle\Entity\User; 9use Wallabag\UserBundle\Entity\User;
10use Wallabag\CoreBundle\Tools\Utils; 10use Wallabag\CoreBundle\Tools\Utils;
11use Wallabag\CoreBundle\Helper\ContentProxy;
11 12
12class WallabagV1Import implements ImportInterface 13class WallabagV1Import implements ImportInterface
13{ 14{
14 protected $user; 15 protected $user;
15 protected $em; 16 protected $em;
16 protected $logger; 17 protected $logger;
18 protected $contentProxy;
17 protected $skippedEntries = 0; 19 protected $skippedEntries = 0;
18 protected $importedEntries = 0; 20 protected $importedEntries = 0;
19 protected $filepath; 21 protected $filepath;
20 22
21 public function __construct(EntityManager $em) 23 public function __construct(EntityManager $em, ContentProxy $contentProxy)
22 { 24 {
23 $this->em = $em; 25 $this->em = $em;
24 $this->logger = new NullLogger(); 26 $this->logger = new NullLogger();
27 $this->contentProxy = $contentProxy;
25 } 28 }
26 29
27 public function setLogger(LoggerInterface $logger) 30 public function setLogger(LoggerInterface $logger)
@@ -124,6 +127,9 @@ class WallabagV1Import implements ImportInterface
124 { 127 {
125 $i = 1; 128 $i = 1;
126 129
130 //Untitled in all languages from v1. This should never have been translated
131 $untitled = array('Untitled', 'Sans titre', 'podle nadpisu', 'Sin título', 'با عنوان', 'per titolo', 'Sem título', 'Без названия', 'po naslovu', 'Без назви', 'No title found', '');
132
127 foreach ($entries as $importedEntry) { 133 foreach ($entries as $importedEntry) {
128 $existingEntry = $this->em 134 $existingEntry = $this->em
129 ->getRepository('WallabagCoreBundle:Entry') 135 ->getRepository('WallabagCoreBundle:Entry')
@@ -137,12 +143,16 @@ class WallabagV1Import implements ImportInterface
137 // @see ContentProxy->updateEntry 143 // @see ContentProxy->updateEntry
138 $entry = new Entry($this->user); 144 $entry = new Entry($this->user);
139 $entry->setUrl($importedEntry['url']); 145 $entry->setUrl($importedEntry['url']);
140 $entry->setTitle($importedEntry['title']); 146 if (in_array($importedEntry['title'], $untitled)) {
147 $entry = $this->contentProxy->updateEntry($entry, $importedEntry['url']);
148 } else {
149 $entry->setContent($importedEntry['content']);
150 $entry->setTitle($importedEntry['title']);
151 $entry->setReadingTime(Utils::getReadingTime($importedEntry['content']));
152 $entry->setDomainName(parse_url($importedEntry['url'], PHP_URL_HOST));
153 }
141 $entry->setArchived($importedEntry['is_read']); 154 $entry->setArchived($importedEntry['is_read']);
142 $entry->setStarred($importedEntry['is_fav']); 155 $entry->setStarred($importedEntry['is_fav']);
143 $entry->setContent($importedEntry['content']);
144 $entry->setReadingTime(Utils::getReadingTime($importedEntry['content']));
145 $entry->setDomainName(parse_url($importedEntry['url'], PHP_URL_HOST));
146 156
147 $this->em->persist($entry); 157 $this->em->persist($entry);
148 ++$this->importedEntries; 158 ++$this->importedEntries;
diff --git a/src/Wallabag/ImportBundle/Import/WallabagV2Import.php b/src/Wallabag/ImportBundle/Import/WallabagV2Import.php
index c5c0d5a7..7125eabc 100644
--- a/src/Wallabag/ImportBundle/Import/WallabagV2Import.php
+++ b/src/Wallabag/ImportBundle/Import/WallabagV2Import.php
@@ -27,7 +27,7 @@ class WallabagV2Import extends WallabagV1Import implements ImportInterface
27 */ 27 */
28 public function getDescription() 28 public function getDescription()
29 { 29 {
30 return 'This importer will import all your wallabag v2 articles. On the export sidebar, click on "JSON". You will have a "Unread articles.json" file.'; 30 return 'This importer will import all your wallabag v2 articles. Go to All articles, then, on the export sidebar, click on "JSON". You will have a "All articles.json" file.';
31 } 31 }
32 32
33 /** 33 /**
diff --git a/src/Wallabag/ImportBundle/Resources/config/services.yml b/src/Wallabag/ImportBundle/Resources/config/services.yml
index e0942b1a..86b44cb3 100644
--- a/src/Wallabag/ImportBundle/Resources/config/services.yml
+++ b/src/Wallabag/ImportBundle/Resources/config/services.yml
@@ -28,6 +28,7 @@ services:
28 class: Wallabag\ImportBundle\Import\WallabagV1Import 28 class: Wallabag\ImportBundle\Import\WallabagV1Import
29 arguments: 29 arguments:
30 - "@doctrine.orm.entity_manager" 30 - "@doctrine.orm.entity_manager"
31 - "@wallabag_core.content_proxy"
31 calls: 32 calls:
32 - [ setLogger, [ "@logger" ]] 33 - [ setLogger, [ "@logger" ]]
33 tags: 34 tags:
@@ -37,6 +38,7 @@ services:
37 class: Wallabag\ImportBundle\Import\WallabagV2Import 38 class: Wallabag\ImportBundle\Import\WallabagV2Import
38 arguments: 39 arguments:
39 - "@doctrine.orm.entity_manager" 40 - "@doctrine.orm.entity_manager"
41 - "@wallabag_core.content_proxy"
40 calls: 42 calls:
41 - [ setLogger, [ "@logger" ]] 43 - [ setLogger, [ "@logger" ]]
42 tags: 44 tags:
diff --git a/src/Wallabag/ImportBundle/Resources/views/Pocket/index.html.twig b/src/Wallabag/ImportBundle/Resources/views/Pocket/index.html.twig
index e0e36f38..8aa5da97 100644
--- a/src/Wallabag/ImportBundle/Resources/views/Pocket/index.html.twig
+++ b/src/Wallabag/ImportBundle/Resources/views/Pocket/index.html.twig
@@ -7,7 +7,12 @@
7 <div class="card-panel settings"> 7 <div class="card-panel settings">
8 {% if not has_consumer_key %} 8 {% if not has_consumer_key %}
9 <div class="card-panel red darken-1"> 9 <div class="card-panel red darken-1">
10 {% trans %}Pocket import isn't configured. You need to define pocket_consumer_key.{% endtrans %} 10 {% trans %}Pocket import isn't configured.{% endtrans %}
11 {% if is_granted('ROLE_SUPER_ADMIN') %}
12 {% trans with {'%keyurls%': '<a href="' ~ path('craue_config_settings_modify') ~ '#set-import">', '%keyurle%':'</a>'} %}You need to define %keyurls% a pocket_consumer_key %keyurle%.{% endtrans %}
13 {% else %}
14 {% trans %}Your server admin needs to define an API Key for Pocket.{% endtrans %}
15 {% endif %}
11 </div> 16 </div>
12 {% endif %} 17 {% endif %}
13 18
diff --git a/src/Wallabag/ImportBundle/Tests/Import/WallabagV1ImportTest.php b/src/Wallabag/ImportBundle/Tests/Import/WallabagV1ImportTest.php
index 1cb5a233..9a563a11 100644
--- a/src/Wallabag/ImportBundle/Tests/Import/WallabagV1ImportTest.php
+++ b/src/Wallabag/ImportBundle/Tests/Import/WallabagV1ImportTest.php
@@ -12,6 +12,7 @@ class WallabagV1ImportTest extends \PHPUnit_Framework_TestCase
12 protected $user; 12 protected $user;
13 protected $em; 13 protected $em;
14 protected $logHandler; 14 protected $logHandler;
15 protected $contentProxy;
15 16
16 private function getWallabagV1Import($unsetUser = false) 17 private function getWallabagV1Import($unsetUser = false)
17 { 18 {
@@ -21,7 +22,11 @@ class WallabagV1ImportTest extends \PHPUnit_Framework_TestCase
21 ->disableOriginalConstructor() 22 ->disableOriginalConstructor()
22 ->getMock(); 23 ->getMock();
23 24
24 $wallabag = new WallabagV1Import($this->em); 25 $this->contentProxy = $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy')
26 ->disableOriginalConstructor()
27 ->getMock();
28
29 $wallabag = new WallabagV1Import($this->em, $this->contentProxy);
25 30
26 $this->logHandler = new TestHandler(); 31 $this->logHandler = new TestHandler();
27 $logger = new Logger('test', array($this->logHandler)); 32 $logger = new Logger('test', array($this->logHandler));
@@ -52,19 +57,28 @@ class WallabagV1ImportTest extends \PHPUnit_Framework_TestCase
52 ->disableOriginalConstructor() 57 ->disableOriginalConstructor()
53 ->getMock(); 58 ->getMock();
54 59
55 $entryRepo->expects($this->exactly(3)) 60 $entryRepo->expects($this->exactly(4))
56 ->method('findByUrlAndUserId') 61 ->method('findByUrlAndUserId')
57 ->will($this->onConsecutiveCalls(false, true, false)); 62 ->will($this->onConsecutiveCalls(false, true, false, false));
58 63
59 $this->em 64 $this->em
60 ->expects($this->any()) 65 ->expects($this->any())
61 ->method('getRepository') 66 ->method('getRepository')
62 ->willReturn($entryRepo); 67 ->willReturn($entryRepo);
63 68
69 $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
70 ->disableOriginalConstructor()
71 ->getMock();
72
73 $this->contentProxy
74 ->expects($this->once())
75 ->method('updateEntry')
76 ->willReturn($entry);
77
64 $res = $wallabagV1Import->import(); 78 $res = $wallabagV1Import->import();
65 79
66 $this->assertTrue($res); 80 $this->assertTrue($res);
67 $this->assertEquals(['skipped' => 1, 'imported' => 2], $wallabagV1Import->getSummary()); 81 $this->assertEquals(['skipped' => 1, 'imported' => 3], $wallabagV1Import->getSummary());
68 } 82 }
69 83
70 public function testImportBadFile() 84 public function testImportBadFile()
diff --git a/src/Wallabag/ImportBundle/Tests/Import/WallabagV2ImportTest.php b/src/Wallabag/ImportBundle/Tests/Import/WallabagV2ImportTest.php
index 4ebe93bf..3268cd3e 100644
--- a/src/Wallabag/ImportBundle/Tests/Import/WallabagV2ImportTest.php
+++ b/src/Wallabag/ImportBundle/Tests/Import/WallabagV2ImportTest.php
@@ -12,6 +12,7 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
12 protected $user; 12 protected $user;
13 protected $em; 13 protected $em;
14 protected $logHandler; 14 protected $logHandler;
15 protected $contentProxy;
15 16
16 private function getWallabagV2Import($unsetUser = false) 17 private function getWallabagV2Import($unsetUser = false)
17 { 18 {
@@ -21,7 +22,11 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
21 ->disableOriginalConstructor() 22 ->disableOriginalConstructor()
22 ->getMock(); 23 ->getMock();
23 24
24 $wallabag = new WallabagV2Import($this->em); 25 $this->contentProxy = $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy')
26 ->disableOriginalConstructor()
27 ->getMock();
28
29 $wallabag = new WallabagV2Import($this->em, $this->contentProxy);
25 30
26 $this->logHandler = new TestHandler(); 31 $this->logHandler = new TestHandler();
27 $logger = new Logger('test', array($this->logHandler)); 32 $logger = new Logger('test', array($this->logHandler));
@@ -52,7 +57,7 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
52 ->disableOriginalConstructor() 57 ->disableOriginalConstructor()
53 ->getMock(); 58 ->getMock();
54 59
55 $entryRepo->expects($this->exactly(2)) 60 $entryRepo->expects($this->exactly(3))
56 ->method('findByUrlAndUserId') 61 ->method('findByUrlAndUserId')
57 ->will($this->onConsecutiveCalls(false, true, false)); 62 ->will($this->onConsecutiveCalls(false, true, false));
58 63
@@ -64,7 +69,7 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
64 $res = $wallabagV2Import->import(); 69 $res = $wallabagV2Import->import();
65 70
66 $this->assertTrue($res); 71 $this->assertTrue($res);
67 $this->assertEquals(['skipped' => 1, 'imported' => 1], $wallabagV2Import->getSummary()); 72 $this->assertEquals(['skipped' => 1, 'imported' => 2], $wallabagV2Import->getSummary());
68 } 73 }
69 74
70 public function testImportBadFile() 75 public function testImportBadFile()
diff --git a/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v1.json b/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v1.json
index 534343f8..4681298c 100644
--- a/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v1.json
+++ b/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v1.json
@@ -46,5 +46,21 @@
46 "is_fav": "0", 46 "is_fav": "0",
47 "content": "\n<div class=\"row\">\n<div class=\"col-lg-8 col-md-12 col-xs-12 col-sm-12\">\n<p>wallabag (formerly poche) is a <strong>self hostable application for saving web pages</strong>. Unlike other services, wallabag is free (as in freedom) and open source.</p>\n</div>\n\n</div>\n<div class=\"row\">\n<div class=\"col-lg-8 col-md-12 col-xs-12 col-sm-12\">\n<p>With this application you will not miss content anymore. <strong>Click, save, read it when you want</strong>. It saves the content you select so that you can read it when you have time.</p>\n</div>\n\n</div>\n<div class=\"row\">\n<div class=\"col-lg-6 col-md-12 col-xs-12 col-sm-12\">\n<h2>How it works</h2>\n<p>Thanks to the bookmarklet or <a title=\"Downloads\" href=\"http://www.wallabag.org/downloads/\">third-party applications</a>, you save an article in your wallabag to read it later. Then, when you open your wallabag, <strong>you can comfortably read your articles</strong>.</p>\n<h2>How to use wallabag</h2>\n<p>There are two ways to use wallabag: you can <a href=\"http://www.wallabag.org/frequently-asked-questions/#How_can_I_install_wallabag_and_what_are_the_requirements\">install it</a> on your web server or you can <a href=\"http://app.inthepoche.com\">create an account</a> at Framabag (we install and upgrade wallabag for you).</p>\n</div>\n\n</div>\n", 47 "content": "\n<div class=\"row\">\n<div class=\"col-lg-8 col-md-12 col-xs-12 col-sm-12\">\n<p>wallabag (formerly poche) is a <strong>self hostable application for saving web pages</strong>. Unlike other services, wallabag is free (as in freedom) and open source.</p>\n</div>\n\n</div>\n<div class=\"row\">\n<div class=\"col-lg-8 col-md-12 col-xs-12 col-sm-12\">\n<p>With this application you will not miss content anymore. <strong>Click, save, read it when you want</strong>. It saves the content you select so that you can read it when you have time.</p>\n</div>\n\n</div>\n<div class=\"row\">\n<div class=\"col-lg-6 col-md-12 col-xs-12 col-sm-12\">\n<h2>How it works</h2>\n<p>Thanks to the bookmarklet or <a title=\"Downloads\" href=\"http://www.wallabag.org/downloads/\">third-party applications</a>, you save an article in your wallabag to read it later. Then, when you open your wallabag, <strong>you can comfortably read your articles</strong>.</p>\n<h2>How to use wallabag</h2>\n<p>There are two ways to use wallabag: you can <a href=\"http://www.wallabag.org/frequently-asked-questions/#How_can_I_install_wallabag_and_what_are_the_requirements\">install it</a> on your web server or you can <a href=\"http://app.inthepoche.com\">create an account</a> at Framabag (we install and upgrade wallabag for you).</p>\n</div>\n\n</div>\n",
48 "user_id": "1" 48 "user_id": "1"
49 },
50 {
51 "0": "4",
52 "1": "Sans titre",
53 "2": "http:\/\/www.konradlischka.info\/2016\/01\/blog\/wie-ein-deutsches-start-up-mit-wagniskapital-die-marktluecke-fuer-lokalen-digitaljournalismus-schliessen-will\/",
54 "3": "0",
55 "4": "0",
56 "5": "[unable to retrieve full-text content]",
57 "6": "1",
58 "id": "4",
59 "title": "Sans titre",
60 "url": "http:\/\/www.konradlischka.info\/2016\/01\/blog\/wie-ein-deutsches-start-up-mit-wagniskapital-die-marktluecke-fuer-lokalen-digitaljournalismus-schliessen-will\/",
61 "is_read": "0",
62 "is_fav": "0",
63 "content": "[unable to retrieve full-text content]",
64 "user_id": "1"
49 } 65 }
50] 66]
diff --git a/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2.json b/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2.json
index 8097f4ba..37d2d0ae 100644
--- a/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2.json
+++ b/src/Wallabag/ImportBundle/Tests/fixtures/wallabag-v2.json
@@ -1 +1,40 @@
1[{"id":"23","title":"Site d'information fran\u00e7ais d'actualit\u00e9s ind\u00e9pendant et participatif en ligne | Mediapart","url":"https:\/\/www.mediapart.fr\/","is_archived":false,"is_starred":false,"content":"<div alt=\"li\">\u00c9dition <a href=\"https:\/\/blogs.mediapart.fr\/edition\/camedia-0\">CAM\u00e9dia<\/a>\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/edition\/camedia\/article\/180116\/deux-nouvelles-editions-pour-debattre-dans-le-club-sur-la-laicite-et-sur-la-democratie\">Deux nouvelles \u00e9ditions pour d\u00e9battre dans le club sur la la\u00efcit\u00e9 et sur la d\u00e9mocratie<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>CAM\u00e9dia apr\u00e8s un \u00e9change sur \u00ab\u00a0l'\u00e9thique du d\u00e9bat\u00a0\u00bb a lanc\u00e9 deux discussions , l'une sur le th\u00e8me de la la\u00efcit\u00e9, l'autre ( encore en cours) sur celui de la d\u00e9mocratie. Nous sommes heureux de pouvoir signaler la cr\u00e9ation de deux nouvelles \u00e9ditions participatives sur ces th\u00e8mes. Nous vous invitons \u00e0 les lire et \u00e0 participer \u00e0 leurs d\u00e9bats.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/lucile-longre\/blog\/170116\/de-limportance-de-rever-eloge-du-merveilleux\">De l'importance de r\u00eaver, \u00e9loge du merveilleux<\/a><\/h3>\n<p>17 janv. 2016 | Par <\/p>\n<p>Je parlerai ici des r\u00eaves comme moteur de vie, de ces r\u00eaves qui vous rattachent et vous font esp\u00e9rer \u00e0 ce qu\u2019il y a de plus humain dans l\u2019homme, m\u00eame au milieu de la plus noire des d\u00e9tresses.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/barbara-romagnan\/blog\/180116\/fins-dune-toute-puissance\">Fin(s) d'une toute-puissance<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>En ce d\u00e9but d\u2019ann\u00e9e, je recommande la lecture du dernier ouvrage de Guillaume Duval, La France ne sera jamais plus une grande puissance ? Tant mieux !<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/jean-pierre-thibaudat\/blog\/170116\/l-allier-departement-de-destruction-massive-du-tissu-culturel\">L\u2019Allier, d\u00e9partement de destruction massive du tissu culturel<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>Les temps sont durs pour les petites structures, les associations culturelles qui, de bourgades en villages, travaillent au c\u0153ur des r\u00e9gions. Leurs subventions sont souvent revues \u00e0 la baisse. Le d\u00e9partement de l\u2019Allier les a carr\u00e9ment supprim\u00e9es. Pour favoriser \u00ab l\u2019\u00e9v\u00e9nementiel \u00bb.<\/p>\n<\/div><div alt=\"li\">\u00c9dition <a href=\"https:\/\/blogs.mediapart.fr\/edition\/les-invites-de-mediapart\">Les invit\u00e9s de Mediapart<\/a>\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/edition\/les-invites-de-mediapart\/article\/180116\/la-democratie-deja-attaquee-par-la-cooperation-reglementaire-transatlantiqu\">La d\u00e9mocratie d\u00e9j\u00e0 attaqu\u00e9e par la coop\u00e9ration r\u00e9glementaire transatlantique<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>Lora Verheecke et David Lundy travaillent pour Corporate Europe Observatory, une ONG bas\u00e9e \u00e0 Bruxelles qui enqu\u00eate sur le pouvoir des lobbies des grandes entreprises sur la politique de l\u2019Union europ\u00e9enne. Ils r\u00e9v\u00e8lent que depuis 25 ans le projet de \u00ab coop\u00e9ration r\u00e9glementaire \u00bb men\u00e9 par l\u2019Union europ\u00e9enne et les \u00c9tats-Unis a \u00e9t\u00e9 domin\u00e9 par les grandes entreprises. ET que le TTIP cherche \u00e0 ent\u00e9riner ce projet.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/jacqueline-derens\/blog\/180116\/2016-une-annee-test-pour-jacob-zuma-et-son-gouvernement\">2016, une ann\u00e9e test pour Jacob Zuma et son gouvernement<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>Les turbulences de l\u2019an pass\u00e9 ont toutes les chances de continuer \u00e0 troubler le climat politique et social de l\u2019Afrique du Sud en 2016. La situation exige des changements profonds dans la conduite des affaires du pays. Jacob Zuma tout en admettant la n\u00e9cessit\u00e9 de ces changements, est-il l\u2019homme de la situation ? Son gouvernement r\u00e9pondra-t-il aux attentes des citoyens sud-africains ?<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/marie-cosnay\/blog\/140116\/un-mal-fou-janvier-2016\">Un mal fou (janvier 2016)<\/a><\/h3>\n<p>14 janv. 2016 | Par <\/p>\n<p>J\u2019ai une fringale d\u2019aventure, d\u2019aventures \u00e0 venir. J\u2019ai la fringale de la fringale des aventures et soudain, rupture. Je n\u2019y arrive plus, tout est bloqu\u00e9, tout emp\u00each\u00e9. Faut dire que depuis un an environ, tout est devenu plus compliqu\u00e9. Ecrire va de moins en moins de soi.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/jean-pierre-veran\/blog\/170116\/redoublement-le-changement-bas-bruit\">Redoublement : le changement \u00e0 bas bruit ?<\/a><\/h3>\n<p>17 janv. 2016 | Par <\/p>\n<p>S\u2019il est une caract\u00e9ristique de la forme scolaire fran\u00e7aise bien \u00e9tablie dans la culture des personnels, des \u00e9l\u00e8ves et des parents, c\u2019est bien le redoublement, cens\u00e9 sanctionner des r\u00e9sultats insuffisants pour envisager le passage dans la classe sup\u00e9rieure. Or, en ce domaine, l\u2019\u00e9volution est nette.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/michel-de-pracontal\/blog\/160116\/samedi-sciences-196-des-chasseurs-de-mammouths-en-arctique-il-y-45-000-ans\">Samedi-sciences (196): des chasseurs de mammouths en Arctique il y a 45 000 ans<\/a><\/h3>\n<p>16 janv. 2016 | Par <a href=\"https:\/\/blogs.mediapart.fr\/michel-de-pracontal\" class=\"journalist\">Michel de Pracontal<\/a><\/p>\n<p>Les restes d\u2019un mammouth retrouv\u00e9s en Arctique sib\u00e9rien, dat\u00e9s de 45 000 ans, portent les traces de blessures inflig\u00e9es par des chasseurs humains. Les scientifiques pensaient jusqu\u2019ici que notre esp\u00e8ce ne s\u2019\u00e9tait pas aventur\u00e9e dans cette r\u00e9gion glaciale il y a plus de 30 000 ou 35 0000 ans. En r\u00e9alit\u00e9, des hommes ont r\u00e9ussi \u00e0 survivre en Arctique au moins 10 000 ans plus t\u00f4t que l\u2019on croyait.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/alain-zolty\/blog\/140116\/de-la-democratie-du-citoyen-et-de-lethique\">De la d\u00e9mocratie, du citoyen et de l'\u00e9thique<\/a><\/h3>\n<p>14 janv. 2016 | Par <\/p>\n<p>Trois ouvrages sont parus au Seuil, qui font \u00e9tat de la n\u00e9cessit\u00e9 d\u2019int\u00e9grer le citoyen dans la gouvernance de la nation. Non pas \u00e0 titre consultatif mais dot\u00e9 d\u2019un pouvoir d\u00e9lib\u00e9ratif pour constituer une contre-force face aux clans politico-financiers qui dominent la vie publique.<\/p>\n<\/div>","mimetype":"text\/html","language":"fr","reading_time":3,"domain_name":"www.mediapart.fr","preview_picture":"https:\/\/www.mediapart.fr\/images\/social\/800\/mediapart.png","tags":[]},{"id":22,"title":"R\u00e9fugi\u00e9s: l'UE va cr\u00e9er 100\u00a0000\u00a0places d'accueil dans les Balkans","url":"http:\/\/www.liberation.fr\/planete\/2015\/10\/26\/refugies-l-ue-va-creer-100-000-places-d-accueil-dans-les-balkans_1408867","is_archived":false,"is_starred":false,"content":"<p>Pour un sommet sur les r\u00e9fugi\u00e9s qui devait se concentrer sur des <em>\u00abmesures op\u00e9rationnelles imm\u00e9diates\u00bb<\/em> dans les Balkans, la r\u00e9union, dimanche \u00e0 Bruxelles, de 11\u00a0chefs d\u2019Etat et de gouvernement, dont 8 Europ\u00e9ens, a \u00e9t\u00e9 agit\u00e9e. D\u00e8s leur arriv\u00e9e, Viktor\u00a0Orb\u00e1n (Hongrie) et\u00a0Al\u00e9xis Ts\u00edpras (Gr\u00e8ce) se sont jet\u00e9 des anath\u00e8mes. Le Premier ministre grec a d\u00e9nonc\u00e9 l\u2019attitude <em>\u00abnot in my backyard\u00bb<\/em> (pas de \u00e7a chez moi) de certains Etats europ\u00e9ens, alors que son pays est montr\u00e9 du doigt par d\u2019autres dirigeants, dont\u00a0Orb\u00e1n\u00a0: ils reprochent \u00e0 la Gr\u00e8ce de ne pas suffisamment contr\u00f4ler ses fronti\u00e8res avec la Turquie et ne pas montrer assez de z\u00e8le dans l\u2019enregistrement des demandeurs d\u2019asile.<\/p>\n<p>Le sommet, convoqu\u00e9 par la Commission europ\u00e9enne, sur suggestion de l\u2019Allemagne, aura au moins permis \u00e0 ces 11\u00a0Etats \u2013\u00a0Autriche, Bulgarie, Croatie, Allemagne, Gr\u00e8ce, Hongrie, Roumanie, Slov\u00e9nie c\u00f4t\u00e9 europ\u00e9en, et 3 pays \u00abnon UE\u00bb, Albanie, Mac\u00e9doine et Serbie\u00a0\u2013 de discuter ensemble.<\/p>\n<h3>400\u00a0policiers europ\u00e9ens en Slov\u00e9nie<\/h3>\n<p>L\u2019objectif, rappel\u00e9 par Angela Merkel, \u00e9tait de trouver une <em>\u00abr\u00e9ponse coordonn\u00e9e\u00bb<\/em> \u00e0 la crise des r\u00e9fugi\u00e9s. Quelques mesures ont \u00e9t\u00e9 annonc\u00e9es\u00a0: 100\u00a0000\u00a0places d\u2019accueil seront cr\u00e9\u00e9es, dont 50\u00a0000 en Gr\u00e8ce, et le reste le long de la route des Balkans.\u00a0400\u00a0officiers de police de pays europ\u00e9ens partiront en Slov\u00e9nie, actuellement submerg\u00e9e, pour aider au contr\u00f4le des fronti\u00e8res. Frontex, l\u2019agence europ\u00e9enne de surveillance des fronti\u00e8res, s\u2019impliquera aux fronti\u00e8res gr\u00e9co-mac\u00e9donienne et gr\u00e9co-albanaise pour des contr\u00f4les et identifications.<\/p>\n<p>Ce sommet est intervenu dans un contexte de fortes tensions, marqu\u00e9 par des fermetures de fronti\u00e8res bloquant les r\u00e9fugi\u00e9s dans des zones tampon. Ces obstacles ont \u00e9t\u00e9 partiellement lev\u00e9s ces derniers jours, les autorit\u00e9s tentant d\u2019organiser un \u00abcorridor\u00bb informel vers l\u2019Allemagne, qui pourtant durcit sa politique d\u2019accueil et souhaite d\u00e9sormais ralentir le flux. Mais la situation des r\u00e9fugi\u00e9s est catastrophique. L\u2019ONG Human Rights Watch craint que des r\u00e9fugi\u00e9s ne meurent dans les Balkans. Des groupes de centaines, voire de milliers de personnes, bloqu\u00e9s pr\u00e8s des postes-fronti\u00e8res, se retrouvent dans des conditions humanitaires intenables.<\/p>\n<p>Depuis mi-septembre, 250\u00a0000\u00a0personnes ont travers\u00e9 les Balkans. En une semaine, la Slov\u00e9nie a vu 60\u00a0000\u00a0r\u00e9fugi\u00e9s fouler le sol de son territoire. Dimanche, 15\u00a0000\u00a0personnes ont transit\u00e9 en Slov\u00e9nie.<\/p>\n<h3>Des zones tampon<\/h3>\n<p>L\u2019enjeu principal du sommet, aux yeux de nombreux Etats de l\u2019Union europ\u00e9enne, \u00e9tait aussi que les pays des Balkans <em>\u00abprennent leur part\u00bb<\/em> face \u00e0 la crise\u00a0: qu\u2019ils accueillent et enregistrent davantage de r\u00e9fugi\u00e9s. Ces Etats craignent que l\u2019Autriche ou l\u2019Allemagne ne ferment leurs fronti\u00e8res et fassent de leurs pays des <em>\u00abzones tampon\u00bb<\/em>, comme s\u2019en inqui\u00e9tait Boyko Borissov, Premier ministre bulgare.<\/p>\n<p><em>\u00ab\u00a0Aujourd\u2019hui, plusieurs Etats du nord de l\u2019Europe veulent que l\u2019on enregistre les migrants puis que l\u2019on d\u00e9termine leur \u00e9ligibilit\u00e9 au statut de r\u00e9fugi\u00e9,<\/em> explique Marc Pierini, du think tank Carnegie Europe. <em>La difficult\u00e9, c\u2019est que les gens sont en mouvement. Pour le faire, il faut se poser quelque part. La crainte des pays interm\u00e9diaires, donc ceux des Balkans, est qu\u2019on enregistre ces personnes sur leur territoire et qu\u2019ils soient contraints de rester sur leur sol. Donc les pays des Balkans ne sont pas d\u00e9sireux d\u2019accueillir ces r\u00e9fugi\u00e9s et ces derniers veulent avancer.\u00bb<\/em><\/p>\n<p>Le sommet a \u00e9labor\u00e9 quelques principes. L\u2019id\u00e9e g\u00e9n\u00e9rale est de rendre effective la \u00ablogique de hotspot\u00bb\u00a0: un enregistrement des demandeurs d\u2019asile \u00e0 leur point d\u2019entr\u00e9e dans l\u2019Union europ\u00e9enne, suivi de l\u2019expulsion de ceux qui ne correspondraient pas aux crit\u00e8res de la Convention de Gen\u00e8ve, et la r\u00e9partition des autres, via le m\u00e9canisme de relocalisation.<\/p>\n<p>Dans ce cadre, l\u2019enregistrement des demandeurs d\u2019asile est un \u00e9l\u00e9ment cl\u00e9. <em>\u00abPas d\u2019enregistrement, pas de droit\u00bb<\/em>, a pr\u00e9venu le pr\u00e9sident de la Commission europ\u00e9enne, Jean-Claude Juncker, dimanche soir. Les Etats ont tenu \u00e0 rappeler que les migrants qui refusent de demander l\u2019asile \u00e0 la fronti\u00e8re peuvent se voir refuser l\u2019entr\u00e9e dans un pays.<\/p>\n<p>Et les Etats <em>\u00abd\u00e9courageront les mouvements de r\u00e9fugi\u00e9s\u00bb<\/em> de fronti\u00e8re en fronti\u00e8re. La politique consistant \u00e0 laisser passer les migrants vers un autre pays est officiellement jug\u00e9e <em>\u00abinacceptable\u00bb<\/em>.<\/p>\n<h3>Se jeter dans la gueule du loup<\/h3>\n<p>Voil\u00e0 pour la th\u00e9orie. En pratique, la relocalisation ne devrait concerner que 160\u00a0000\u00a0r\u00e9fugi\u00e9s en deux\u00a0ans, alors que pr\u00e8s de 700\u00a0000\u00a0personnes sont arriv\u00e9es en Europe depuis le d\u00e9but de l\u2019ann\u00e9e. De plus, les Etats ne jouent pas le jeu. La semaine pass\u00e9e, seules 854\u00a0places de relocalisation avaient \u00e9t\u00e9 propos\u00e9es.<\/p>\n<p>Dans ce contexte, il est probable que les Etats des Balkans ne s\u2019impliqueront pas outre mesure dans les solutions propos\u00e9es, craignant de devoir \u00abgarder\u00bb les r\u00e9fugi\u00e9s alors que l\u2019Union europ\u00e9enne tarde \u00e0 mettre en \u0153uvre leur r\u00e9partition.<\/p>\n<p>Quant aux r\u00e9fugi\u00e9s, ils pr\u00e9f\u00e8rent traverser les fronti\u00e8res par eux-m\u00eames, plut\u00f4t que de se jeter dans ces \u00abhotspots\u00bb, consid\u00e9r\u00e9s comme la gueule du loup.<\/p>\n<a itemprop=\"name\" href=\"http:\/\/www.liberation.fr\/auteur\/15743-cedric-vallet\">C\u00e9dric Vallet<\/a>","reading_time":4,"domain_name":"www.liberation.fr","tags":[]}] 1[
2 {
3 "id": "23",
4 "title": "Site d'information fran\u00e7ais d'actualit\u00e9s ind\u00e9pendant et participatif en ligne | Mediapart",
5 "url": "https:\/\/www.mediapart.fr\/",
6 "is_archived": false,
7 "is_starred": false,
8 "content": "<div alt=\"li\">\u00c9dition <a href=\"https:\/\/blogs.mediapart.fr\/edition\/camedia-0\">CAM\u00e9dia<\/a>\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/edition\/camedia\/article\/180116\/deux-nouvelles-editions-pour-debattre-dans-le-club-sur-la-laicite-et-sur-la-democratie\">Deux nouvelles \u00e9ditions pour d\u00e9battre dans le club sur la la\u00efcit\u00e9 et sur la d\u00e9mocratie<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>CAM\u00e9dia apr\u00e8s un \u00e9change sur \u00ab\u00a0l'\u00e9thique du d\u00e9bat\u00a0\u00bb a lanc\u00e9 deux discussions , l'une sur le th\u00e8me de la la\u00efcit\u00e9, l'autre ( encore en cours) sur celui de la d\u00e9mocratie. Nous sommes heureux de pouvoir signaler la cr\u00e9ation de deux nouvelles \u00e9ditions participatives sur ces th\u00e8mes. Nous vous invitons \u00e0 les lire et \u00e0 participer \u00e0 leurs d\u00e9bats.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/lucile-longre\/blog\/170116\/de-limportance-de-rever-eloge-du-merveilleux\">De l'importance de r\u00eaver, \u00e9loge du merveilleux<\/a><\/h3>\n<p>17 janv. 2016 | Par <\/p>\n<p>Je parlerai ici des r\u00eaves comme moteur de vie, de ces r\u00eaves qui vous rattachent et vous font esp\u00e9rer \u00e0 ce qu\u2019il y a de plus humain dans l\u2019homme, m\u00eame au milieu de la plus noire des d\u00e9tresses.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/barbara-romagnan\/blog\/180116\/fins-dune-toute-puissance\">Fin(s) d'une toute-puissance<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>En ce d\u00e9but d\u2019ann\u00e9e, je recommande la lecture du dernier ouvrage de Guillaume Duval, La France ne sera jamais plus une grande puissance ? Tant mieux !<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/jean-pierre-thibaudat\/blog\/170116\/l-allier-departement-de-destruction-massive-du-tissu-culturel\">L\u2019Allier, d\u00e9partement de destruction massive du tissu culturel<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>Les temps sont durs pour les petites structures, les associations culturelles qui, de bourgades en villages, travaillent au c\u0153ur des r\u00e9gions. Leurs subventions sont souvent revues \u00e0 la baisse. Le d\u00e9partement de l\u2019Allier les a carr\u00e9ment supprim\u00e9es. Pour favoriser \u00ab l\u2019\u00e9v\u00e9nementiel \u00bb.<\/p>\n<\/div><div alt=\"li\">\u00c9dition <a href=\"https:\/\/blogs.mediapart.fr\/edition\/les-invites-de-mediapart\">Les invit\u00e9s de Mediapart<\/a>\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/edition\/les-invites-de-mediapart\/article\/180116\/la-democratie-deja-attaquee-par-la-cooperation-reglementaire-transatlantiqu\">La d\u00e9mocratie d\u00e9j\u00e0 attaqu\u00e9e par la coop\u00e9ration r\u00e9glementaire transatlantique<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>Lora Verheecke et David Lundy travaillent pour Corporate Europe Observatory, une ONG bas\u00e9e \u00e0 Bruxelles qui enqu\u00eate sur le pouvoir des lobbies des grandes entreprises sur la politique de l\u2019Union europ\u00e9enne. Ils r\u00e9v\u00e8lent que depuis 25 ans le projet de \u00ab coop\u00e9ration r\u00e9glementaire \u00bb men\u00e9 par l\u2019Union europ\u00e9enne et les \u00c9tats-Unis a \u00e9t\u00e9 domin\u00e9 par les grandes entreprises. ET que le TTIP cherche \u00e0 ent\u00e9riner ce projet.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/jacqueline-derens\/blog\/180116\/2016-une-annee-test-pour-jacob-zuma-et-son-gouvernement\">2016, une ann\u00e9e test pour Jacob Zuma et son gouvernement<\/a><\/h3>\n<p>18 janv. 2016 | Par <\/p>\n<p>Les turbulences de l\u2019an pass\u00e9 ont toutes les chances de continuer \u00e0 troubler le climat politique et social de l\u2019Afrique du Sud en 2016. La situation exige des changements profonds dans la conduite des affaires du pays. Jacob Zuma tout en admettant la n\u00e9cessit\u00e9 de ces changements, est-il l\u2019homme de la situation ? Son gouvernement r\u00e9pondra-t-il aux attentes des citoyens sud-africains ?<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/marie-cosnay\/blog\/140116\/un-mal-fou-janvier-2016\">Un mal fou (janvier 2016)<\/a><\/h3>\n<p>14 janv. 2016 | Par <\/p>\n<p>J\u2019ai une fringale d\u2019aventure, d\u2019aventures \u00e0 venir. J\u2019ai la fringale de la fringale des aventures et soudain, rupture. Je n\u2019y arrive plus, tout est bloqu\u00e9, tout emp\u00each\u00e9. Faut dire que depuis un an environ, tout est devenu plus compliqu\u00e9. Ecrire va de moins en moins de soi.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/jean-pierre-veran\/blog\/170116\/redoublement-le-changement-bas-bruit\">Redoublement : le changement \u00e0 bas bruit ?<\/a><\/h3>\n<p>17 janv. 2016 | Par <\/p>\n<p>S\u2019il est une caract\u00e9ristique de la forme scolaire fran\u00e7aise bien \u00e9tablie dans la culture des personnels, des \u00e9l\u00e8ves et des parents, c\u2019est bien le redoublement, cens\u00e9 sanctionner des r\u00e9sultats insuffisants pour envisager le passage dans la classe sup\u00e9rieure. Or, en ce domaine, l\u2019\u00e9volution est nette.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/michel-de-pracontal\/blog\/160116\/samedi-sciences-196-des-chasseurs-de-mammouths-en-arctique-il-y-45-000-ans\">Samedi-sciences (196): des chasseurs de mammouths en Arctique il y a 45 000 ans<\/a><\/h3>\n<p>16 janv. 2016 | Par <a href=\"https:\/\/blogs.mediapart.fr\/michel-de-pracontal\" class=\"journalist\">Michel de Pracontal<\/a><\/p>\n<p>Les restes d\u2019un mammouth retrouv\u00e9s en Arctique sib\u00e9rien, dat\u00e9s de 45 000 ans, portent les traces de blessures inflig\u00e9es par des chasseurs humains. Les scientifiques pensaient jusqu\u2019ici que notre esp\u00e8ce ne s\u2019\u00e9tait pas aventur\u00e9e dans cette r\u00e9gion glaciale il y a plus de 30 000 ou 35 0000 ans. En r\u00e9alit\u00e9, des hommes ont r\u00e9ussi \u00e0 survivre en Arctique au moins 10 000 ans plus t\u00f4t que l\u2019on croyait.<\/p>\n<\/div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https:\/\/blogs.mediapart.fr\/alain-zolty\/blog\/140116\/de-la-democratie-du-citoyen-et-de-lethique\">De la d\u00e9mocratie, du citoyen et de l'\u00e9thique<\/a><\/h3>\n<p>14 janv. 2016 | Par <\/p>\n<p>Trois ouvrages sont parus au Seuil, qui font \u00e9tat de la n\u00e9cessit\u00e9 d\u2019int\u00e9grer le citoyen dans la gouvernance de la nation. Non pas \u00e0 titre consultatif mais dot\u00e9 d\u2019un pouvoir d\u00e9lib\u00e9ratif pour constituer une contre-force face aux clans politico-financiers qui dominent la vie publique.<\/p>\n<\/div>",
9 "mimetype": "text\/html",
10 "language": "fr",
11 "reading_time": 3,
12 "domain_name": "www.mediapart.fr",
13 "preview_picture": "https:\/\/www.mediapart.fr\/images\/social\/800\/mediapart.png",
14 "tags": []
15 }
16 ,
17 {
18 "id": 22,
19 "title": "R\u00e9fugi\u00e9s: l'UE va cr\u00e9er 100\u00a0000\u00a0places d'accueil dans les Balkans",
20 "url": "http:\/\/www.liberation.fr\/planete\/2015\/10\/26\/refugies-l-ue-va-creer-100-000-places-d-accueil-dans-les-balkans_1408867",
21 "is_archived": false,
22 "is_starred": false,
23 "content": "<p>Pour un sommet sur les r\u00e9fugi\u00e9s qui devait se concentrer sur des <em>\u00abmesures op\u00e9rationnelles imm\u00e9diates\u00bb<\/em> dans les Balkans, la r\u00e9union, dimanche \u00e0 Bruxelles, de 11\u00a0chefs d\u2019Etat et de gouvernement, dont 8 Europ\u00e9ens, a \u00e9t\u00e9 agit\u00e9e. D\u00e8s leur arriv\u00e9e, Viktor\u00a0Orb\u00e1n (Hongrie) et\u00a0Al\u00e9xis Ts\u00edpras (Gr\u00e8ce) se sont jet\u00e9 des anath\u00e8mes. Le Premier ministre grec a d\u00e9nonc\u00e9 l\u2019attitude <em>\u00abnot in my backyard\u00bb<\/em> (pas de \u00e7a chez moi) de certains Etats europ\u00e9ens, alors que son pays est montr\u00e9 du doigt par d\u2019autres dirigeants, dont\u00a0Orb\u00e1n\u00a0: ils reprochent \u00e0 la Gr\u00e8ce de ne pas suffisamment contr\u00f4ler ses fronti\u00e8res avec la Turquie et ne pas montrer assez de z\u00e8le dans l\u2019enregistrement des demandeurs d\u2019asile.<\/p>\n<p>Le sommet, convoqu\u00e9 par la Commission europ\u00e9enne, sur suggestion de l\u2019Allemagne, aura au moins permis \u00e0 ces 11\u00a0Etats \u2013\u00a0Autriche, Bulgarie, Croatie, Allemagne, Gr\u00e8ce, Hongrie, Roumanie, Slov\u00e9nie c\u00f4t\u00e9 europ\u00e9en, et 3 pays \u00abnon UE\u00bb, Albanie, Mac\u00e9doine et Serbie\u00a0\u2013 de discuter ensemble.<\/p>\n<h3>400\u00a0policiers europ\u00e9ens en Slov\u00e9nie<\/h3>\n<p>L\u2019objectif, rappel\u00e9 par Angela Merkel, \u00e9tait de trouver une <em>\u00abr\u00e9ponse coordonn\u00e9e\u00bb<\/em> \u00e0 la crise des r\u00e9fugi\u00e9s. Quelques mesures ont \u00e9t\u00e9 annonc\u00e9es\u00a0: 100\u00a0000\u00a0places d\u2019accueil seront cr\u00e9\u00e9es, dont 50\u00a0000 en Gr\u00e8ce, et le reste le long de la route des Balkans.\u00a0400\u00a0officiers de police de pays europ\u00e9ens partiront en Slov\u00e9nie, actuellement submerg\u00e9e, pour aider au contr\u00f4le des fronti\u00e8res. Frontex, l\u2019agence europ\u00e9enne de surveillance des fronti\u00e8res, s\u2019impliquera aux fronti\u00e8res gr\u00e9co-mac\u00e9donienne et gr\u00e9co-albanaise pour des contr\u00f4les et identifications.<\/p>\n<p>Ce sommet est intervenu dans un contexte de fortes tensions, marqu\u00e9 par des fermetures de fronti\u00e8res bloquant les r\u00e9fugi\u00e9s dans des zones tampon. Ces obstacles ont \u00e9t\u00e9 partiellement lev\u00e9s ces derniers jours, les autorit\u00e9s tentant d\u2019organiser un \u00abcorridor\u00bb informel vers l\u2019Allemagne, qui pourtant durcit sa politique d\u2019accueil et souhaite d\u00e9sormais ralentir le flux. Mais la situation des r\u00e9fugi\u00e9s est catastrophique. L\u2019ONG Human Rights Watch craint que des r\u00e9fugi\u00e9s ne meurent dans les Balkans. Des groupes de centaines, voire de milliers de personnes, bloqu\u00e9s pr\u00e8s des postes-fronti\u00e8res, se retrouvent dans des conditions humanitaires intenables.<\/p>\n<p>Depuis mi-septembre, 250\u00a0000\u00a0personnes ont travers\u00e9 les Balkans. En une semaine, la Slov\u00e9nie a vu 60\u00a0000\u00a0r\u00e9fugi\u00e9s fouler le sol de son territoire. Dimanche, 15\u00a0000\u00a0personnes ont transit\u00e9 en Slov\u00e9nie.<\/p>\n<h3>Des zones tampon<\/h3>\n<p>L\u2019enjeu principal du sommet, aux yeux de nombreux Etats de l\u2019Union europ\u00e9enne, \u00e9tait aussi que les pays des Balkans <em>\u00abprennent leur part\u00bb<\/em> face \u00e0 la crise\u00a0: qu\u2019ils accueillent et enregistrent davantage de r\u00e9fugi\u00e9s. Ces Etats craignent que l\u2019Autriche ou l\u2019Allemagne ne ferment leurs fronti\u00e8res et fassent de leurs pays des <em>\u00abzones tampon\u00bb<\/em>, comme s\u2019en inqui\u00e9tait Boyko Borissov, Premier ministre bulgare.<\/p>\n<p><em>\u00ab\u00a0Aujourd\u2019hui, plusieurs Etats du nord de l\u2019Europe veulent que l\u2019on enregistre les migrants puis que l\u2019on d\u00e9termine leur \u00e9ligibilit\u00e9 au statut de r\u00e9fugi\u00e9,<\/em> explique Marc Pierini, du think tank Carnegie Europe. <em>La difficult\u00e9, c\u2019est que les gens sont en mouvement. Pour le faire, il faut se poser quelque part. La crainte des pays interm\u00e9diaires, donc ceux des Balkans, est qu\u2019on enregistre ces personnes sur leur territoire et qu\u2019ils soient contraints de rester sur leur sol. Donc les pays des Balkans ne sont pas d\u00e9sireux d\u2019accueillir ces r\u00e9fugi\u00e9s et ces derniers veulent avancer.\u00bb<\/em><\/p>\n<p>Le sommet a \u00e9labor\u00e9 quelques principes. L\u2019id\u00e9e g\u00e9n\u00e9rale est de rendre effective la \u00ablogique de hotspot\u00bb\u00a0: un enregistrement des demandeurs d\u2019asile \u00e0 leur point d\u2019entr\u00e9e dans l\u2019Union europ\u00e9enne, suivi de l\u2019expulsion de ceux qui ne correspondraient pas aux crit\u00e8res de la Convention de Gen\u00e8ve, et la r\u00e9partition des autres, via le m\u00e9canisme de relocalisation.<\/p>\n<p>Dans ce cadre, l\u2019enregistrement des demandeurs d\u2019asile est un \u00e9l\u00e9ment cl\u00e9. <em>\u00abPas d\u2019enregistrement, pas de droit\u00bb<\/em>, a pr\u00e9venu le pr\u00e9sident de la Commission europ\u00e9enne, Jean-Claude Juncker, dimanche soir. Les Etats ont tenu \u00e0 rappeler que les migrants qui refusent de demander l\u2019asile \u00e0 la fronti\u00e8re peuvent se voir refuser l\u2019entr\u00e9e dans un pays.<\/p>\n<p>Et les Etats <em>\u00abd\u00e9courageront les mouvements de r\u00e9fugi\u00e9s\u00bb<\/em> de fronti\u00e8re en fronti\u00e8re. La politique consistant \u00e0 laisser passer les migrants vers un autre pays est officiellement jug\u00e9e <em>\u00abinacceptable\u00bb<\/em>.<\/p>\n<h3>Se jeter dans la gueule du loup<\/h3>\n<p>Voil\u00e0 pour la th\u00e9orie. En pratique, la relocalisation ne devrait concerner que 160\u00a0000\u00a0r\u00e9fugi\u00e9s en deux\u00a0ans, alors que pr\u00e8s de 700\u00a0000\u00a0personnes sont arriv\u00e9es en Europe depuis le d\u00e9but de l\u2019ann\u00e9e. De plus, les Etats ne jouent pas le jeu. La semaine pass\u00e9e, seules 854\u00a0places de relocalisation avaient \u00e9t\u00e9 propos\u00e9es.<\/p>\n<p>Dans ce contexte, il est probable que les Etats des Balkans ne s\u2019impliqueront pas outre mesure dans les solutions propos\u00e9es, craignant de devoir \u00abgarder\u00bb les r\u00e9fugi\u00e9s alors que l\u2019Union europ\u00e9enne tarde \u00e0 mettre en \u0153uvre leur r\u00e9partition.<\/p>\n<p>Quant aux r\u00e9fugi\u00e9s, ils pr\u00e9f\u00e8rent traverser les fronti\u00e8res par eux-m\u00eames, plut\u00f4t que de se jeter dans ces \u00abhotspots\u00bb, consid\u00e9r\u00e9s comme la gueule du loup.<\/p>\n<a itemprop=\"name\" href=\"http:\/\/www.liberation.fr\/auteur\/15743-cedric-vallet\">C\u00e9dric Vallet<\/a>",
24 "reading_time": 4,
25 "domain_name": "www.liberation.fr",
26 "tags": []
27 }
28 ,
29 {
30 "id": "21",
31 "title": "No title found",
32 "url": "http://news.nationalgeographic.com/2016/02/160211-albatrosses-mothers-babies-animals-science/&sf20739758=1",
33 "is_archived": false,
34 "is_starred": true,
35 "content": "Oh, what a shame, no content",
36 "reading_time": 4,
37 "domain_name": "news.nationalgeographic.com",
38 "tags": []
39 }
40]