aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore7
-rw-r--r--Gemfile12
-rw-r--r--Gemfile.lock40
-rw-r--r--assets/bookmarklet.js16
-rw-r--r--clip.rb63
-rw-r--r--config.ru11
-rw-r--r--views/clips.json.erb1
-rw-r--r--views/index.html.erb13
-rw-r--r--views/layout.html.erb23
9 files changed, 186 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..786b3f9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+# Bundle
+.bundle/
+vendor/
+
+# Database
+config/database.yml
+db/*.sqlite3 \ No newline at end of file
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..a113497
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,12 @@
+source 'https://rubygems.org'
+
+gem 'rack'
+gem 'camping'
+
+gem 'sqlite3'
+gem 'activerecord'
+gem 'tilt'
+
+group :development do
+ gem 'rerun'
+end \ No newline at end of file
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 0000000..9db3645
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,40 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ activemodel (3.2.13)
+ activesupport (= 3.2.13)
+ builder (~> 3.0.0)
+ activerecord (3.2.13)
+ activemodel (= 3.2.13)
+ activesupport (= 3.2.13)
+ arel (~> 3.0.2)
+ tzinfo (~> 0.3.29)
+ activesupport (3.2.13)
+ i18n (= 0.6.1)
+ multi_json (~> 1.0)
+ arel (3.0.2)
+ builder (3.0.4)
+ camping (2.1.532)
+ mab (>= 0.0.3)
+ rack (>= 1.0)
+ i18n (0.6.1)
+ listen (0.7.3)
+ mab (0.0.3)
+ multi_json (1.7.2)
+ rack (1.5.2)
+ rerun (0.8.0)
+ listen
+ sqlite3 (1.3.7)
+ tilt (1.3.6)
+ tzinfo (0.3.37)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ activerecord
+ camping
+ rack
+ rerun
+ sqlite3
+ tilt
diff --git a/assets/bookmarklet.js b/assets/bookmarklet.js
new file mode 100644
index 0000000..ebed77a
--- /dev/null
+++ b/assets/bookmarklet.js
@@ -0,0 +1,16 @@
+(function() {
+ var xhr = new XMLHttpRequest();
+ var params = 'url=' + window.location.href;
+ xhr.open('POST', 'http://localhost:9292/clips', true);
+ xhr.onreadystatechange = function() {
+ if (this.readyState == 4) {
+ if (xhr.status == 200) {
+ if (xhr.responseText.success) {
+ // window.alert('Clipped');
+ }
+ }
+ }
+ };
+ xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+ xhr.send(params);
+})() \ No newline at end of file
diff --git a/clip.rb b/clip.rb
new file mode 100644
index 0000000..ef3c1ce
--- /dev/null
+++ b/clip.rb
@@ -0,0 +1,63 @@
+# Clip app
+
+Camping.goes :Clip
+
+module Clip
+ set :views, File.dirname(__FILE__) + '/views'
+end
+
+module Clip::Controllers
+ class Index < R '/'
+ def get
+ @clips = Clip.all
+
+ render :index
+ end
+ end
+
+ class Clips < R '/clips'
+ def post
+ @headers['Access-Control-Allow-Origin'] = '*'
+
+ @url_regex = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/?)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s\`!()\[\]{};:\'\".,<>?]))/i
+
+ @result = {}
+
+ if @input.url and @url_regex.match(@input.url) and not Clip.find_by_url(@input.url)
+ Clip.create(:url => @input.url)
+
+ @result[:success] = true
+ else
+ @result[:success] = false
+ end
+
+ @result = @result.to_json
+
+ render :clips, :layout => false
+ end
+ end
+end
+
+
+module Clip::Models
+ class Clip < Base
+ end
+
+ class BasicFields < V 1.0
+ def self.up
+ create_table Clip.table_name do |t|
+ t.text :url
+ t.timestamps
+ end
+ end
+
+ def self.down
+ drop_table Clip.table_name
+ end
+ end
+end
+
+
+def Clip.create
+ Clip::Models.create_schema
+end
diff --git a/config.ru b/config.ru
new file mode 100644
index 0000000..9bd3e16
--- /dev/null
+++ b/config.ru
@@ -0,0 +1,11 @@
+%w(rack active_record camping camping/session camping/reloader).each { |r| require r }
+
+require './clip.rb'
+run Clip
+
+
+dbconfig = YAML.load(File.read('config/database.yml'))
+environment = ENV['DATABASE_URL'] ? 'production' : 'development'
+Camping::Models::Base.establish_connection dbconfig[environment]
+
+Clip.create if Clip.respond_to? :create
diff --git a/views/clips.json.erb b/views/clips.json.erb
new file mode 100644
index 0000000..6dc0abe
--- /dev/null
+++ b/views/clips.json.erb
@@ -0,0 +1 @@
+<%= @result %> \ No newline at end of file
diff --git a/views/index.html.erb b/views/index.html.erb
new file mode 100644
index 0000000..cb5b103
--- /dev/null
+++ b/views/index.html.erb
@@ -0,0 +1,13 @@
+<div>
+ <a href="javascript:(function(){var xhr=new XMLHttpRequest();var params='url='+window.location.href;xhr.open('POST','http://localhost:9292/clips',true);xhr.onreadystatechange=function(){if(this.readyState==4){if(xhr.status==200){if(xhr.responseText.success){}}}};xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');xhr.send(params);})()" onclick="alert('Drag this link onto your browser bookmarks bar.'); return false;">Clips</a>
+</div>
+
+<% unless @clips.empty? %>
+ <ul>
+ <% @clips.each do |c| %>
+ <li><%= c.url %></li>
+ <% end %>
+ </ul>
+<% else %>
+ No clips to display
+<% end %>
diff --git a/views/layout.html.erb b/views/layout.html.erb
new file mode 100644
index 0000000..845929f
--- /dev/null
+++ b/views/layout.html.erb
@@ -0,0 +1,23 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta http-equiv="content-type" content="text/html; charset=utf-8">
+ <meta charset="utf-8">
+ <title>Clips</title>
+ <meta name="description" content="">
+
+ <meta name="viewport" content="width=device-width">
+ <link rel="stylesheet" href="css/style.css">
+</head>
+<body>
+ <header>
+
+ </header>
+ <div role="main">
+ <%= yield %>
+ </div>
+ <footer>
+
+ </footer>
+</body>
+</html> \ No newline at end of file