diff options
-rw-r--r-- | doc/md/Community-&-Related-software.md | 4 | ||||
-rw-r--r-- | plugins/markdown/markdown.php | 8 | ||||
-rw-r--r-- | tests/plugins/PluginMarkdownTest.php | 55 | ||||
-rw-r--r-- | tpl/default/tools.html | 10 |
4 files changed, 74 insertions, 3 deletions
diff --git a/doc/md/Community-&-Related-software.md b/doc/md/Community-&-Related-software.md index 207153b6..7c570acf 100644 --- a/doc/md/Community-&-Related-software.md +++ b/doc/md/Community-&-Related-software.md | |||
@@ -38,9 +38,11 @@ See [Theming](Theming) for a list of community-contributed themes, and an instal | |||
38 | - [ShaarliOS](https://github.com/mro/ShaarliOS) - Apple iOS share extension. | 38 | - [ShaarliOS](https://github.com/mro/ShaarliOS) - Apple iOS share extension. |
39 | - [Shaarli for Android](http://sebsauvage.net/links/?ZAyDzg) - Android application that adds Shaarli as a sharing provider | 39 | - [Shaarli for Android](http://sebsauvage.net/links/?ZAyDzg) - Android application that adds Shaarli as a sharing provider |
40 | - [Shaarlier for Android](https://github.com/dimtion/Shaarlier) - Android application to simply add links directly into your Shaarli | 40 | - [Shaarlier for Android](https://github.com/dimtion/Shaarlier) - Android application to simply add links directly into your Shaarli |
41 | - [Stakali for Android](https://stakali.toneiv.eu) - Stakali is a personal bookmark manager which synchronizes with Shaarli | ||
41 | 42 | ||
42 | ### Browser addons | 43 | ### Browser addons |
43 | * [Shaarli Web Extension](https://github.com/ikipatang/shaarli-web-extension) - toolbar button to share your current tab with Shaarli. | 44 | - [Shaarli Firefox Extension](https://github.com/ikipatang/shaarli-web-extension) - toolbar button to share your current tab with Shaarli. |
45 | - [Shaarli Chrome Extension](https://github.com/octplane/Shiny-Shaarli) - toolbar button to share your current tab with Shaarli. | ||
44 | 46 | ||
45 | ### Server apps | 47 | ### Server apps |
46 | - [shaarchiver](https://github.com/nodiscc/shaarchiver) - Archive your Shaarli bookmarks and their content | 48 | - [shaarchiver](https://github.com/nodiscc/shaarchiver) - Archive your Shaarli bookmarks and their content |
diff --git a/plugins/markdown/markdown.php b/plugins/markdown/markdown.php index 2f24e417..821bb125 100644 --- a/plugins/markdown/markdown.php +++ b/plugins/markdown/markdown.php | |||
@@ -6,6 +6,8 @@ | |||
6 | * Shaare's descriptions are parsed with Markdown. | 6 | * Shaare's descriptions are parsed with Markdown. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | use Shaarli\Config\ConfigManager; | ||
10 | |||
9 | /* | 11 | /* |
10 | * If this tag is used on a shaare, the description won't be processed by Parsedown. | 12 | * If this tag is used on a shaare, the description won't be processed by Parsedown. |
11 | */ | 13 | */ |
@@ -50,6 +52,7 @@ function hook_markdown_render_feed($data, $conf) | |||
50 | $value = stripNoMarkdownTag($value); | 52 | $value = stripNoMarkdownTag($value); |
51 | continue; | 53 | continue; |
52 | } | 54 | } |
55 | $value['description'] = reverse_feed_permalink($value['description']); | ||
53 | $value['description'] = process_markdown( | 56 | $value['description'] = process_markdown( |
54 | $value['description'], | 57 | $value['description'], |
55 | $conf->get('security.markdown_escape', true), | 58 | $conf->get('security.markdown_escape', true), |
@@ -244,6 +247,11 @@ function reverse_space2nbsp($description) | |||
244 | return preg_replace('/(^| ) /m', '$1 ', $description); | 247 | return preg_replace('/(^| ) /m', '$1 ', $description); |
245 | } | 248 | } |
246 | 249 | ||
250 | function reverse_feed_permalink($description) | ||
251 | { | ||
252 | return preg_replace('@— <a href="([^"]+)" title="[^"]+">(\w+)</a>$@im', '— [$2]($1)', $description); | ||
253 | } | ||
254 | |||
247 | /** | 255 | /** |
248 | * Replace not whitelisted protocols with http:// in given description. | 256 | * Replace not whitelisted protocols with http:// in given description. |
249 | * | 257 | * |
diff --git a/tests/plugins/PluginMarkdownTest.php b/tests/plugins/PluginMarkdownTest.php index ddc2728d..b31e817f 100644 --- a/tests/plugins/PluginMarkdownTest.php +++ b/tests/plugins/PluginMarkdownTest.php | |||
@@ -50,6 +50,30 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase | |||
50 | } | 50 | } |
51 | 51 | ||
52 | /** | 52 | /** |
53 | * Test render_feed hook. | ||
54 | */ | ||
55 | public function testMarkdownFeed() | ||
56 | { | ||
57 | $markdown = '# My title' . PHP_EOL . 'Very interesting content.'; | ||
58 | $markdown .= '— <a href="http://domain.tld/?0oc_VQ" title="Permalien">Permalien</a>'; | ||
59 | $data = array( | ||
60 | 'links' => array( | ||
61 | 0 => array( | ||
62 | 'description' => $markdown, | ||
63 | ), | ||
64 | ), | ||
65 | ); | ||
66 | |||
67 | $data = hook_markdown_render_feed($data, $this->conf); | ||
68 | $this->assertNotFalse(strpos($data['links'][0]['description'], '<h1>')); | ||
69 | $this->assertNotFalse(strpos($data['links'][0]['description'], '<p>')); | ||
70 | $this->assertStringEndsWith( | ||
71 | '— <a href="http://domain.tld/?0oc_VQ">Permalien</a></p></div>', | ||
72 | $data['links'][0]['description'] | ||
73 | ); | ||
74 | } | ||
75 | |||
76 | /** | ||
53 | * Test render_daily hook. | 77 | * Test render_daily hook. |
54 | * Only check that there is basic markdown rendering. | 78 | * Only check that there is basic markdown rendering. |
55 | */ | 79 | */ |
@@ -104,6 +128,37 @@ class PluginMarkdownTest extends PHPUnit_Framework_TestCase | |||
104 | $this->assertEquals($text, $reversedText); | 128 | $this->assertEquals($text, $reversedText); |
105 | } | 129 | } |
106 | 130 | ||
131 | public function testReverseFeedPermalink() | ||
132 | { | ||
133 | $text = 'Description... '; | ||
134 | $text .= '— <a href="http://domain.tld/?0oc_VQ" title="Permalien">Permalien</a>'; | ||
135 | $expected = 'Description... — [Permalien](http://domain.tld/?0oc_VQ)'; | ||
136 | $processedText = reverse_feed_permalink($text); | ||
137 | |||
138 | $this->assertEquals($expected, $processedText); | ||
139 | } | ||
140 | |||
141 | public function testReverseLastFeedPermalink() | ||
142 | { | ||
143 | $text = 'Description... '; | ||
144 | $text .= '<br>— <a href="http://domain.tld/?0oc_VQ" title="Permalien">Permalien</a>'; | ||
145 | $expected = $text; | ||
146 | $text .= '<br>— <a href="http://domain.tld/?0oc_VQ" title="Permalien">Permalien</a>'; | ||
147 | $expected .= '<br>— [Permalien](http://domain.tld/?0oc_VQ)'; | ||
148 | $processedText = reverse_feed_permalink($text); | ||
149 | |||
150 | $this->assertEquals($expected, $processedText); | ||
151 | } | ||
152 | |||
153 | public function testReverseNoFeedPermalink() | ||
154 | { | ||
155 | $text = 'Hello! Where are you from?'; | ||
156 | $expected = $text; | ||
157 | $processedText = reverse_feed_permalink($text); | ||
158 | |||
159 | $this->assertEquals($expected, $processedText); | ||
160 | } | ||
161 | |||
107 | /** | 162 | /** |
108 | * Test sanitize_html(). | 163 | * Test sanitize_html(). |
109 | */ | 164 | */ |
diff --git a/tpl/default/tools.html b/tpl/default/tools.html index 72fd58af..ece66884 100644 --- a/tpl/default/tools.html +++ b/tpl/default/tools.html | |||
@@ -146,8 +146,14 @@ | |||
146 | </div> | 146 | </div> |
147 | <div class="tools-item"> | 147 | <div class="tools-item"> |
148 | <a href="https://play.google.com/store/apps/details?id=com.dimtion.shaarlier&hl=fr" | 148 | <a href="https://play.google.com/store/apps/details?id=com.dimtion.shaarlier&hl=fr" |
149 | title="Android"> | 149 | title="Android Shaarlier"> |
150 | <span class="pure-button pure-u-lg-2-3 pure-u-3-4">Android</span> | 150 | <span class="pure-button pure-u-lg-2-3 pure-u-3-4">Android Shaarlier</span> |
151 | </a> | ||
152 | </div> | ||
153 | <div class="tools-item"> | ||
154 | <a href="https://stakali.toneiv.eu/" | ||
155 | title="Android Stakali"> | ||
156 | <span class="pure-button pure-u-lg-2-3 pure-u-3-4">Android Stakali</span> | ||
151 | </a> | 157 | </a> |
152 | </div> | 158 | </div> |
153 | <div class="tools-item"> | 159 | <div class="tools-item"> |