From 3a8d54a56978c72ee097d9e55af498de068b873c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sat, 28 Jul 2018 16:45:03 +0200 Subject: [PATCH] better handle urls --- app/View/CollapsibleTextBoxWidget.php | 13 +++++++++++-- app/View/WidgetFactory.php | 17 +++++++++++++++++ resources/assets/js/app.js | 25 ++++++++++++++++++++----- resources/assets/sass/_helpers.scss | 4 ++++ resources/assets/sass/app.scss | 4 ---- resources/views/profile/view.blade.php | 4 ++-- resources/views/table/view.blade.php | 13 +++++-------- 7 files changed, 59 insertions(+), 21 deletions(-) diff --git a/app/View/CollapsibleTextBoxWidget.php b/app/View/CollapsibleTextBoxWidget.php index 3b0e379..adca77b 100644 --- a/app/View/CollapsibleTextBoxWidget.php +++ b/app/View/CollapsibleTextBoxWidget.php @@ -50,7 +50,14 @@ class CollapsibleTextBoxWidget $out = nl2br($out); - $out = preg_replace('|(https?://[^\s]+)|i', '\1', $out); + $out = preg_replace_callback('#\b((https?://|ftp://|mailto:)[^\s]+)#i', function($m) { + $href = $m[1]; + $text = $href; + if (strpos($text, 'mailto:') === 0) { + $text = str_replace('mailto:', '', $text); + } + return "".e($text).""; + }, $out); return $out; } @@ -67,7 +74,9 @@ class CollapsibleTextBoxWidget } if ($this->collapsing) { - return '
' . $prefix . $content . '
'; + return '
' . $prefix . $content . '
'; } else { return $prefix.'
' . $prefix . $content . '
'; } diff --git a/app/View/WidgetFactory.php b/app/View/WidgetFactory.php index 0de0f5b..3dfcd92 100644 --- a/app/View/WidgetFactory.php +++ b/app/View/WidgetFactory.php @@ -31,6 +31,23 @@ class WidgetFactory ""; } + /** + * Convert the given string to a-href if it is a link. + * + * @param $href + * @return string + */ + public function tryLink($href) + { + $href = trim($href); + if (starts_with($href, ['http://', 'https://', 'mailto:', 'ftp://'])) { + $href_e = e($href); + return "".$href_e.""; + } else { + return $href; + } + } + public function collapsible($text, $thrSize, $maxHeight) { return new CollapsibleTextBoxWidget($text, $thrSize, $maxHeight); diff --git a/resources/assets/js/app.js b/resources/assets/js/app.js index f81373f..8115045 100644 --- a/resources/assets/js/app.js +++ b/resources/assets/js/app.js @@ -21,11 +21,26 @@ $(function () { }, 500) }, 2500) - $('.block-collapse').on('click', (e) => { - $(e.target).closest('.block-collapse').addClass('reveal') - }).on('dblclick', (e) => { - $(e.target).closest('.block-collapse').removeClass('reveal') - }); + // toggle collapse when clicked outside link, without drag + $('.block-collapse') + .on('mousedown', (e) => { + let $bc = $(e.target).closest('.block-collapse') + $bc.data('mx', e.screenX); + $bc.data('my', e.screenY); + }) + .on('mouseup', (e) => { + if (e.target.nodeName === 'A') return + let $bc = $(e.target).closest('.block-collapse') + if (typeof $bc.data('mx') !== 'undefined') { + let x0 = +$bc.data('mx'); + let y0 = +$bc.data('my'); + if (Math.abs(x0 - e.screenX) > 5 || Math.abs(y0 - e.screenY) > 5) { + // drag + } else { + $(e.target).closest('.block-collapse').toggleClass('reveal') + } + } + }) }) // auto-alias diff --git a/resources/assets/sass/_helpers.scss b/resources/assets/sass/_helpers.scss index f84a1af..bdf5c94 100644 --- a/resources/assets/sass/_helpers.scss +++ b/resources/assets/sass/_helpers.scss @@ -46,3 +46,7 @@ .small2 { font-size: 70%; } + +a.link-no-color { + color: unset; +} diff --git a/resources/assets/sass/app.scss b/resources/assets/sass/app.scss index a84f931..c4a051c 100644 --- a/resources/assets/sass/app.scss +++ b/resources/assets/sass/app.scss @@ -15,7 +15,3 @@ html { @import "bootstrap-customizations/navbar"; @import "bootstrap-customizations/footer"; @import "bootstrap-customizations/help"; - -a.link-no-color { - color: unset; -} diff --git a/resources/views/profile/view.blade.php b/resources/views/profile/view.blade.php index cbbbf90..ccafb77 100644 --- a/resources/views/profile/view.blade.php +++ b/resources/views/profile/view.blade.php @@ -40,7 +40,7 @@ @if($user->website) @icon(fa-link, User's Website:) - {{ $user->website }} + {!! Widget::tryLink($user->website) !!} @endif @@ -60,7 +60,7 @@ {{-- Table list card --}} -
+

diff --git a/resources/views/table/view.blade.php b/resources/views/table/view.blade.php index b7d914b..2ffd538 100644 --- a/resources/views/table/view.blade.php +++ b/resources/views/table/view.blade.php @@ -22,16 +22,14 @@
@if($table->description) -

- Description
- {!! Widget::collapsible($table->description, 400, '8em') !!} -

+ Description + {!! Widget::collapsible($table->description, 400, '8em') !!} @endif @if($table->origin)

Source
- {{ $table->origin }} + {!! Widget::tryLink($table->origin) !!}

@endif
@@ -42,9 +40,8 @@ Author - - {{ $table->owner->handle }} - + {{ $table->owner->title }} + ({{ $table->owner->handle }})