diff --git a/app/controllers/hacks_controller.rb b/app/controllers/hacks_controller.rb
new file mode 100644
index 00000000..42bafd6f
--- /dev/null
+++ b/app/controllers/hacks_controller.rb
@@ -0,0 +1,35 @@
+# bad code that should be seriously checked over before entering one of the
+# other prim and proper files in the nice section of this repo
+class HacksController < ApplicationController
+ include ActionView::Helpers::TextHelper # string truncate method
+
+ def load_url_title
+ authorize :Hack
+ url = params[:url] # TODO verify!?!?!?!
+ response, url = get_with_redirects(url)
+ title = get_encoded_title(response)
+ render json: { success: true, title: title, url: url }
+ rescue StandardError => e
+ render json: { success: false, error_type: e.class.name, error_message: e.message }
+ end
+
+ private
+
+ def get_with_redirects(url)
+ uri = URI.parse(url)
+ response = Net::HTTP.get_response(uri)
+ while response.code == '301'
+ uri = URI.parse(response['location'])
+ response = Net::HTTP.get_response(uri)
+ end
+ [response, uri.to_s]
+ end
+
+ def get_encoded_title(http_response)
+ title = http_response.body.sub(/.*
(.*)<\/title>.*/m, '\1')
+ charset = http_response['content-type'].sub(/.*charset=(.*);?.*/, '\1')
+ charset = nil if charset == 'text/html'
+ title = title.force_encoding(charset) if charset
+ truncate(title, length: 140)
+ end
+end
diff --git a/app/policies/hack_policy.rb b/app/policies/hack_policy.rb
new file mode 100644
index 00000000..b6fbf6ce
--- /dev/null
+++ b/app/policies/hack_policy.rb
@@ -0,0 +1,5 @@
+class HackPolicy < ApplicationPolicy
+ def load_url_title?
+ true
+ end
+end
diff --git a/config/routes.rb b/config/routes.rb
index fe48b6ba..84112d23 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -80,4 +80,8 @@ Metamaps::Application.routes.draw do
get 'users/:id/details', to: 'users#details', as: :details
post 'user/updatemetacodes', to: 'users#updatemetacodes', as: :updatemetacodes
resources :users, except: [:index, :destroy]
+
+ namespace :hacks do
+ get 'load_url_title'
+ end
end
diff --git a/frontend/src/Metamaps/PasteInput.js b/frontend/src/Metamaps/PasteInput.js
index d14a0cf4..13258857 100644
--- a/frontend/src/Metamaps/PasteInput.js
+++ b/frontend/src/Metamaps/PasteInput.js
@@ -88,6 +88,18 @@ const PasteInput = {
import_id,
{
success: function(topic) {
+ $.get('/hacks/load_url_title', {
+ url: text
+ }, function success(data, textStatus) {
+ var selector = '#showcard #topic_' + topic.get('id') + ' .best_in_place'
+ if ($(selector).find('form').length > 0) {
+ $(selector).find('textarea, input').val(data.title)
+ } else {
+ $(selector).html(data.title)
+ }
+ topic.set('name', data.title)
+ topic.save()
+ })
TopicCard.showCard(topic.get('node'), function() {
$('#showcard #titleActivator').click()
.find('textarea, input').focus()