kilt-cms 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.rdoc +28 -0
- data/Rakefile +7 -0
- data/app/assets/images/kilt/animated-overlay.gif +0 -0
- data/app/assets/images/kilt/ui-bg_flat_0_000_40x100.png +0 -0
- data/app/assets/images/kilt/ui-bg_flat_0_fff_40x100.png +0 -0
- data/app/assets/images/kilt/ui-bg_flat_100_fff_40x100.png +0 -0
- data/app/assets/images/kilt/ui-bg_flat_100_ffffff_40x100.png +0 -0
- data/app/assets/images/kilt/ui-bg_glass_100_fff_1x400.png +0 -0
- data/app/assets/images/kilt/ui-bg_glass_100_ffffff_1x400.png +0 -0
- data/app/assets/images/kilt/ui-bg_highlight-soft_100_fff_1x100.png +0 -0
- data/app/assets/images/kilt/ui-icons_404040_256x240.png +0 -0
- data/app/assets/images/kilt/ui-icons_e74c3c_256x240.png +0 -0
- data/app/assets/javascripts/kilt/application.js +17 -0
- data/app/assets/javascripts/kilt/kilt.js +39 -0
- data/app/assets/stylesheets/kilt/application.scss +1 -0
- data/app/assets/stylesheets/kilt/config.rb +10 -0
- data/app/assets/stylesheets/kilt/sass/_base.scss +25 -0
- data/app/assets/stylesheets/kilt/sass/_buttons.scss +58 -0
- data/app/assets/stylesheets/kilt/sass/_form.scss +73 -0
- data/app/assets/stylesheets/kilt/sass/_layout.scss +85 -0
- data/app/assets/stylesheets/kilt/sass/_mixins.scss +6 -0
- data/app/assets/stylesheets/kilt/sass/_tables.scss +65 -0
- data/app/assets/stylesheets/kilt/sass/_typography.scss +79 -0
- data/app/assets/stylesheets/kilt/sass/modules/_codemirror.scss +262 -0
- data/app/assets/stylesheets/kilt/sass/modules/_jquery_ui.scss +659 -0
- data/app/assets/stylesheets/kilt/sass/screen.scss +1 -0
- data/app/assets/stylesheets/kilt/stylesheets/modules/codemirror.css +1 -0
- data/app/assets/stylesheets/kilt/stylesheets/modules/jquery-ui.css +5 -0
- data/app/assets/stylesheets/kilt/stylesheets/print.css +0 -0
- data/app/assets/stylesheets/kilt/stylesheets/screen.css +5 -0
- data/app/controllers/kilt/kilt_controller.rb +122 -0
- data/app/views/kilt/form/_default.html.erb +4 -0
- data/app/views/kilt/form/boolean.html.erb +4 -0
- data/app/views/kilt/form/datetime.html.erb +4 -0
- data/app/views/kilt/form/file.html.erb +59 -0
- data/app/views/kilt/form/html.html.erb +4 -0
- data/app/views/kilt/form/image.html.erb +72 -0
- data/app/views/kilt/form/longtext.html.erb +4 -0
- data/app/views/kilt/form/number.html.erb +23 -0
- data/app/views/kilt/form/text.html.erb +4 -0
- data/app/views/kilt/form/vimeo.html.erb +100 -0
- data/app/views/kilt/form/youtube.html.erb +98 -0
- data/app/views/kilt/kilt/_form.html.erb +30 -0
- data/app/views/kilt/kilt/edit.html.erb +2 -0
- data/app/views/kilt/kilt/index.html.erb +9 -0
- data/app/views/kilt/kilt/list.html.erb +67 -0
- data/app/views/kilt/kilt/new.html.erb +2 -0
- data/app/views/layouts/kilt/cms.html.erb +41 -0
- data/config/routes.rb +13 -0
- data/lib/generators/kilt/backend_generator.rb +19 -0
- data/lib/generators/kilt/frontend_generator.rb +33 -0
- data/lib/generators/kilt/install_generator.rb +13 -0
- data/lib/generators/kilt/object_generator.rb +23 -0
- data/lib/generators/kilt/templates/backend/config.yml.erb +16 -0
- data/lib/generators/kilt/templates/backend/creds.yml.example +8 -0
- data/lib/generators/kilt/templates/backend/kilt.rb +11 -0
- data/lib/generators/kilt/templates/frontend/application.html.erb +24 -0
- data/lib/generators/kilt/templates/frontend/assets/images/sprite/empty +0 -0
- data/lib/generators/kilt/templates/frontend/assets/images/sprite/retina/empty +0 -0
- data/lib/generators/kilt/templates/frontend/assets/javascripts/application.js +14 -0
- data/lib/generators/kilt/templates/frontend/assets/javascripts/html5shiv.js +2 -0
- data/lib/generators/kilt/templates/frontend/assets/javascripts/mediaqueries.js +1 -0
- data/lib/generators/kilt/templates/frontend/assets/stylesheets/config.rb +24 -0
- data/lib/generators/kilt/templates/frontend/assets/stylesheets/sass/modules/_mixins.scss +81 -0
- data/lib/generators/kilt/templates/frontend/assets/stylesheets/sass/modules/_reset_custom.scss +31 -0
- data/lib/generators/kilt/templates/frontend/assets/stylesheets/sass/modules/_typography.scss +35 -0
- data/lib/generators/kilt/templates/frontend/assets/stylesheets/sass/screen.scss +13 -0
- data/lib/generators/kilt/templates/frontend/assets/stylesheets/sass/views/_layout.scss +7 -0
- data/lib/generators/kilt/templates/frontend/assets/stylesheets/stylesheets/screen.css +160 -0
- data/lib/generators/kilt/templates/frontend/dummy.js.erb +11 -0
- data/lib/generators/kilt/templates/frontend/home_controller.rb.erb +4 -0
- data/lib/generators/kilt/templates/frontend/index.html.erb +5 -0
- data/lib/kilt/base.rb +12 -0
- data/lib/kilt/engine.rb +17 -0
- data/lib/kilt/exceptions.rb +10 -0
- data/lib/kilt/form.rb +28 -0
- data/lib/kilt/object.rb +66 -0
- data/lib/kilt/object_collection.rb +52 -0
- data/lib/kilt/upload.rb +54 -0
- data/lib/kilt/utils.rb +166 -0
- data/lib/kilt.rb +125 -0
- data/lib/tasks/kilt_tasks.rake +6 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/images/sprite/empty +0 -0
- data/test/dummy/app/assets/images/sprite/retina/empty +0 -0
- data/test/dummy/app/assets/javascripts/application.js +14 -0
- data/test/dummy/app/assets/javascripts/dummy.js +11 -0
- data/test/dummy/app/assets/javascripts/html5shiv.js +2 -0
- data/test/dummy/app/assets/javascripts/mediaqueries.js +1 -0
- data/test/dummy/app/assets/stylesheets/config.rb +24 -0
- data/test/dummy/app/assets/stylesheets/sass/modules/_mixins.scss +81 -0
- data/test/dummy/app/assets/stylesheets/sass/modules/_reset_custom.scss +31 -0
- data/test/dummy/app/assets/stylesheets/sass/modules/_typography.scss +35 -0
- data/test/dummy/app/assets/stylesheets/sass/screen.scss +13 -0
- data/test/dummy/app/assets/stylesheets/sass/views/_layout.scss +7 -0
- data/test/dummy/app/assets/stylesheets/stylesheets/screen.css +160 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/controllers/dummy_controller.rb +4 -0
- data/test/dummy/app/views/dummy/index.html.erb +5 -0
- data/test/dummy/app/views/layouts/application.html.erb +24 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/config/application.rb +27 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +23 -0
- data/test/dummy/config/environments/test.rb +23 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/kilt.rb +14 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +12 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/kilt/config.yml +40 -0
- data/test/dummy/config/kilt/creds.yml +8 -0
- data/test/dummy/config/routes.rb +7 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/log/development.log +68163 -0
- data/test/dummy/log/test.log +36 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/uploads/file/Gemfile +3 -0
- data/test/dummy/public/uploads/file/Gemfile.lock +139 -0
- data/test/dummy/public/uploads/file/README.rdoc +28 -0
- data/test/dummy/public/uploads/file/Rakefile +6 -0
- data/test/dummy/public/uploads/file/barcelona.jpg +0 -0
- data/test/dummy/public/uploads/file/dodgerstadiumpix.jpg +0 -0
- data/test/dummy/public/uploads/file/field.jpg +0 -0
- data/test/dummy/public/uploads/file/fob-elton-john-08.jpg +0 -0
- data/test/dummy/public/uploads/file/kilt.gemspec +32 -0
- data/test/dummy/public/uploads/file/kilt.rb +100 -0
- data/test/dummy/public/uploads/image/2960116125_1158ba3c59_o.jpg +0 -0
- data/test/dummy/public/uploads/image/JT.jpg +0 -0
- data/test/dummy/public/uploads/image/barcelona.jpg +0 -0
- data/test/dummy/public/uploads/image/dodgerstadiumpix.jpg +0 -0
- data/test/dummy/public/uploads/image/field.jpg +0 -0
- data/test/dummy/spec/kilt_spec.rb +31 -0
- data/test/dummy/spec/spec_helper.rb +12 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/03cdc43618f8bef3dfc725a1886c40ed +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/0d8e5c7178ebdb79e5b9cc4ef439eae8 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/13a3d23d13c1459a86283c4fe577a775 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/18837248cb3274df9b7c6b0a5dcd56a5 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/1c198a7e1d4ae808a6adf4c4809061eb +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/2e57def2c82ce30227eefea2360d5f50 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/36f9a7f6f43adb582ac6eec43b58eb30 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/36fff19076c588427464432f563a8d2d +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3878e0f19bbd21176b1bcc46160a3df3 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3cee919b5b764629fbb01de361ad1b99 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3d69f4783ceef2f5455635de03e6c62a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3d8ca1585ee95c5efb388645d66cf377 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3e0acde4cdc501f590a21ede6fac0b97 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/413be9c73d25c7febe933f4619da7cf8 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4b5c4a1edd3823a6a6c39e06b6eb230a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4c5736bf0bd429296d1a32930364897e +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/542fc810f9cd36e7bed9a3e5e9670995 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/56f1e7d57d31bf3315e1e33732d57faa +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5bea4c2d87ec725262213ed51575b485 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5eb5178b706a9b8bd0362b7ed487339a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5fa6492da1cba5232b9e9799b5e2bf8f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5fe3d26a30497da82978c9f7ee53068b +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/66f697b8e4167ad9ebefbd8b5fc65b23 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/6b6e86e81f5e8f80bb2b3d1e8f7ed7f3 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/6caab0d3b759107ab41492546763aaf0 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/6d83c6efd2bf1080ba1dead9fcfdd0db +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/70d4b3b9e59d0e01e90eebf94dbc2c47 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/8127282074e6ffd457b72c228a69f0c0 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/8ffacb4ba6e6ca3da12ac1100f664b30 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/9dd98bca318fb820a8451cafce020588 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/b259805c84c81064f20700498328f109 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/b7e1f059a53a1e79df01a336fb1f50f0 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/c0671678b70011547b80da0669d031cc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/c1006115f345f87cc152b851154e9e34 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/cf0d5ad037fbf541c6b982abf73b9938 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/da31523b2e8cf32dd8db9f304d5b7395 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/dc676330961fd22be77c48cb77ec065f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ddc29f2c13cd99d017fd526b61dcb951 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/de45247cb814cafe20e9e46c79e470fe +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/e22d705d0c889ec4837f183a9beec0f3 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/e7ba95a61b1b9381906a88610dceb6dd +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ef7c8ce46dfc9e9087ce84dbdfdd0011 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f3e1a8ba304f70dccefd77356c900ebc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/data/meta_request/2ff92b3b-2e2c-438e-a687-d2900c8722e3.json +1 -0
- data/test/dummy/tmp/data/meta_request/4a2f197b-3f28-4ade-962e-0337d56878b1.json +1 -0
- data/test/dummy/tmp/data/meta_request/7eb04de5-6edf-4ea2-a4cf-994e6173b529.json +1 -0
- data/test/dummy/tmp/data/meta_request/96ec6abc-1da4-45e1-a397-79e849741501.json +1 -0
- data/test/dummy/tmp/data/meta_request/a9566f73-bde1-4346-b254-011381243ddc.json +1 -0
- data/test/dummy/tmp/data/meta_request/a9eb2875-930e-49ed-ab2f-40aba11bb132.json +1 -0
- data/test/dummy/tmp/data/meta_request/bcd27bed-9cac-4c32-8030-2699415e91a1.json +1 -0
- data/test/dummy/tmp/data/meta_request/e6152727-3e54-4858-ad8f-6e57e247a8a5.json +1 -0
- data/test/dummy/tmp/data/meta_request/e7db6149-e316-4ad1-a3a8-c014d0e7092b.json +1 -0
- data/test/dummy/tmp/data/meta_request/fc793f84-b287-4459-b902-705b1d2b1141.json +1 -0
- metadata +536 -0
data/lib/kilt/upload.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
module Kilt
|
2
|
+
class Upload
|
3
|
+
|
4
|
+
def self.file(file_reference)
|
5
|
+
self.do('file', file_reference)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.image(file_reference)
|
9
|
+
self.do('image', file_reference)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.do(type, file_reference)
|
13
|
+
if Kilt.config.storage.strategy == 'local'
|
14
|
+
self.handle_local_upload(type, file_reference)
|
15
|
+
elsif Kilt.config.storage.strategy == 's3'
|
16
|
+
self.handle_s3_upload(type, file_reference)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def self.handle_local_upload(type, file_reference)
|
23
|
+
Kilt::Utils.ensure_local_storage_dir_exists
|
24
|
+
if file_reference
|
25
|
+
File.open(Rails.root.join('public', 'uploads', type, file_reference.original_filename), 'wb') do |file|
|
26
|
+
file.write(file_reference.read)
|
27
|
+
end
|
28
|
+
file_reference.original_filename
|
29
|
+
else
|
30
|
+
''
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.handle_s3_upload(type, file_reference)
|
35
|
+
Kilt::Utils.ensure_s3_bucket_exists
|
36
|
+
if file_reference
|
37
|
+
begin
|
38
|
+
s3 = AWS::S3.new(
|
39
|
+
:access_key_id => Kilt.config.s3.key,
|
40
|
+
:secret_access_key => Kilt.config.s3.secret)
|
41
|
+
bucket = s3.buckets[Kilt.config.s3.bucket]
|
42
|
+
new_file = bucket.objects["#{type}/#{file_reference.original_filename}"]
|
43
|
+
new_file.write(Pathname.new(file_reference.tempfile), :acl => :public_read)
|
44
|
+
file_reference.original_filename
|
45
|
+
rescue
|
46
|
+
''
|
47
|
+
end
|
48
|
+
else
|
49
|
+
''
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
data/lib/kilt/utils.rb
ADDED
@@ -0,0 +1,166 @@
|
|
1
|
+
module Kilt
|
2
|
+
class Utils
|
3
|
+
|
4
|
+
# Set up the database
|
5
|
+
def self.setup_db
|
6
|
+
if Kilt.config.db.host && Kilt.config.db.port
|
7
|
+
begin
|
8
|
+
db = r.connect(:host => Kilt.config.db.host, :port => Kilt.config.db.port).repl
|
9
|
+
rescue
|
10
|
+
raise Kilt::CantConnectToDatabaseError
|
11
|
+
end
|
12
|
+
|
13
|
+
begin
|
14
|
+
|
15
|
+
# See if the db exists and create it otherwise
|
16
|
+
dbs = r.db_list.run
|
17
|
+
if !dbs.to_a.include? Kilt.config.db.db
|
18
|
+
r.db_create(Kilt.config.db.db).run
|
19
|
+
end
|
20
|
+
|
21
|
+
# See if the table exists and create it otherwise
|
22
|
+
tables = r.db(Kilt.config.db.db).table_list.run
|
23
|
+
if !tables.to_a.include? "objects"
|
24
|
+
r.db(Kilt.config.db.db).table_create("objects", :primary_key => "unique_id").run
|
25
|
+
end
|
26
|
+
|
27
|
+
rescue
|
28
|
+
raise Kilt::CantSetupDatabaseError
|
29
|
+
ensure
|
30
|
+
db.close
|
31
|
+
end
|
32
|
+
|
33
|
+
else
|
34
|
+
raise Kilt::NoDatabaseConfigError
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Make a db call
|
39
|
+
def self.db(&block)
|
40
|
+
db = r.connect(:host => Kilt.config.db.host, :port => Kilt.config.db.port).repl
|
41
|
+
results = block.call()
|
42
|
+
db.close
|
43
|
+
results
|
44
|
+
end
|
45
|
+
|
46
|
+
# Ensure we have local storage dirs
|
47
|
+
def self.ensure_local_storage_dir_exists
|
48
|
+
Dir.mkdir(Rails.root.join('public', 'uploads')) unless File.exists?(Rails.root.join('public', 'uploads'))
|
49
|
+
Dir.mkdir(Rails.root.join('public', 'uploads', 'file')) unless File.exists?(Rails.root.join('public', 'uploads', 'file'))
|
50
|
+
Dir.mkdir(Rails.root.join('public', 'uploads', 'image')) unless File.exists?(Rails.root.join('public', 'uploads', 'image'))
|
51
|
+
end
|
52
|
+
|
53
|
+
# Ensure we have an s3 bucket
|
54
|
+
def self.ensure_s3_bucket_exists
|
55
|
+
s3 = AWS::S3.new(
|
56
|
+
:access_key_id => Kilt.config.s3.key,
|
57
|
+
:secret_access_key => Kilt.config.s3.secret)
|
58
|
+
puts s3
|
59
|
+
bucket = s3.buckets[Kilt.config.s3.bucket]
|
60
|
+
if !bucket.exists?
|
61
|
+
bucket = s3.buckets.create(Kilt.config.s3.bucket, :acl => :public_read)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Get a file download URL
|
66
|
+
def self.download_location(type, value)
|
67
|
+
if Kilt.config.storage.strategy == 'local'
|
68
|
+
"/uploads/#{type.to_s}/#{value.to_s}"
|
69
|
+
elsif Kilt.config.storage.strategy == 's3'
|
70
|
+
"http://#{Kilt.config.s3.bucket}.s3.amazonaws.com/#{type.to_s}/#{value.to_s}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Determine if the string passed in is singular or not
|
75
|
+
def self.is_singular?(str)
|
76
|
+
str.pluralize != str && str.singularize == str
|
77
|
+
end
|
78
|
+
|
79
|
+
# Create a slug
|
80
|
+
def self.slugify(str)
|
81
|
+
#strip the string
|
82
|
+
ret = str.strip
|
83
|
+
|
84
|
+
#blow away apostrophes
|
85
|
+
ret.gsub! /['`]/,""
|
86
|
+
|
87
|
+
# @ --> at, and & --> and
|
88
|
+
ret.gsub! /\s*@\s*/, " at "
|
89
|
+
ret.gsub! /\s*&\s*/, " and "
|
90
|
+
|
91
|
+
#replace all non alphanumeric, underscore or periods with dash
|
92
|
+
ret.gsub! /\s*[^A-Za-z0-9\.\_]\s*/, '-'
|
93
|
+
|
94
|
+
#convert double dash to single
|
95
|
+
ret.gsub! /-+/, "-"
|
96
|
+
|
97
|
+
#strip off leading/trailing dash
|
98
|
+
ret.gsub! /\A[-\.]+|[-\.]+\z/, ""
|
99
|
+
|
100
|
+
#return a downcase string
|
101
|
+
ret.downcase
|
102
|
+
end
|
103
|
+
|
104
|
+
# Break down a slug
|
105
|
+
def self.deslugify(str)
|
106
|
+
ret = str.to_s
|
107
|
+
ret.gsub! /_/, " "
|
108
|
+
ret.capitalize
|
109
|
+
end
|
110
|
+
|
111
|
+
# Print a list of objects, functions, etc.
|
112
|
+
def self.tips
|
113
|
+
lines = []
|
114
|
+
if !Kilt.config.empty? && Kilt.config.db
|
115
|
+
lines << ''
|
116
|
+
|
117
|
+
# Store the first type so we can use it down below
|
118
|
+
first_type = nil
|
119
|
+
Kilt.types.each do |type|
|
120
|
+
|
121
|
+
if !first_type
|
122
|
+
first_type = type
|
123
|
+
end
|
124
|
+
|
125
|
+
lines << "#{type.capitalize}: "
|
126
|
+
lines << " Kilt.#{type} -> Type definition"
|
127
|
+
lines << " Kilt.#{type}.fields -> List of fields"
|
128
|
+
lines << " Kilt.#{type.pluralize} -> Array of all #{type.capitalize} objects in natural order"
|
129
|
+
lines << " Kilt.#{type.pluralize}.order -> Array of all #{type.capitalize} objects ordered by 'name' field"
|
130
|
+
lines << " Kilt.#{type.pluralize}.order('age') -> Array of all #{type.capitalize} objects ordered by 'age' field"
|
131
|
+
lines << " Kilt.#{type.pluralize}.order('age').group('section') -> Array of all #{type.capitalize} objects ordered by 'age' field, then grouped by the 'section' field"
|
132
|
+
end
|
133
|
+
lines << ''
|
134
|
+
lines << 'Get object:'
|
135
|
+
lines << ' Kilt.get(\'some-slug\')'
|
136
|
+
lines << ''
|
137
|
+
lines << 'Loop through objects:'
|
138
|
+
lines << " Kilt.#{first_type.pluralize}.each do |#{first_type}|"
|
139
|
+
lines << " puts #{first_type}['name']"
|
140
|
+
lines << ' end'
|
141
|
+
lines << ''
|
142
|
+
lines << 'Loop through objects ordered by field \'age\':'
|
143
|
+
lines << " Kilt.#{first_type.pluralize}.order('age').each do |#{first_type}|"
|
144
|
+
lines << " puts #{first_type}['name']"
|
145
|
+
lines << ' end'
|
146
|
+
lines << ''
|
147
|
+
lines << 'Loop through objects ordered by field \'name\' (the default), then grouped by field \'section\':'
|
148
|
+
lines << " Kilt.#{first_type.pluralize}.order.group(\'section\').each do |section, #{first_type.downcase.pluralize}|"
|
149
|
+
lines << ' puts section'
|
150
|
+
lines << " #{first_type.downcase.pluralize}.each do |#{first_type.downcase}|"
|
151
|
+
lines << " puts #{first_type.downcase}['name']"
|
152
|
+
lines << " end"
|
153
|
+
lines << ' end'
|
154
|
+
else
|
155
|
+
lines << 'The Kilt gem has been installed, but you haven\'t configured it yet.'
|
156
|
+
lines << 'Start configuring Kilt by running the following command:'
|
157
|
+
lines << ''
|
158
|
+
lines << ' rails g kilt:backend'
|
159
|
+
lines << ''
|
160
|
+
lines << 'Then open config/kilt/config.yml and config/kilt/creds.yml, add your database information, define your data model, start Rails, and visit http://<your_app>/admin'
|
161
|
+
end
|
162
|
+
lines.join("\n")
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
end
|
data/lib/kilt.rb
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
require "kilt/base"
|
2
|
+
|
3
|
+
# Include the Rethink shortcut module, which will among other things instantiate a new
|
4
|
+
# Rethink object (as "r") if needed
|
5
|
+
include RethinkDB::Shortcuts
|
6
|
+
|
7
|
+
module Kilt
|
8
|
+
|
9
|
+
# Hold the config object
|
10
|
+
mattr_accessor :config
|
11
|
+
|
12
|
+
# Auto-generated endpoints
|
13
|
+
def self.method_missing(method, *args)
|
14
|
+
begin
|
15
|
+
|
16
|
+
if Utils.is_singular? method.to_s
|
17
|
+
# Get the configuration for a type
|
18
|
+
# Example: Kilt.event
|
19
|
+
Kilt.config.objects[method]
|
20
|
+
else
|
21
|
+
# Get a list of objects
|
22
|
+
# Example: Kilt.events
|
23
|
+
Kilt.get_collection method.to_s
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Get the list of types
|
29
|
+
# Returns: array of type names
|
30
|
+
# Example: Kilt.types
|
31
|
+
def self.types
|
32
|
+
Kilt.config.objects.map { |key, value| key.to_s }
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
# Create an object
|
37
|
+
# Returns: boolean
|
38
|
+
# Example: Kilt.create(object)
|
39
|
+
def self.create(object)
|
40
|
+
object['created_at'] = object['updated_at'] = Time.now
|
41
|
+
object['unique_id'] = "#{(Time.now.to_f * 1000).to_i}"
|
42
|
+
result = Utils.db do
|
43
|
+
|
44
|
+
# Check for slug uniqueness
|
45
|
+
results = r.db(Kilt.config.db.db).table('objects').filter({'slug' => "#{object['slug'].to_s}"}).run
|
46
|
+
if results.to_a.length > 0
|
47
|
+
object['slug'] = "#{object['slug']}-#{(Time.now.to_f * 1000).to_i}"
|
48
|
+
end
|
49
|
+
|
50
|
+
# Insert the record
|
51
|
+
r.db(Kilt.config.db.db).table('objects').insert(object.values).run
|
52
|
+
|
53
|
+
end
|
54
|
+
(result['errors'] == 0)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Update an object
|
58
|
+
# Returns: boolean
|
59
|
+
# Example: Kilt.update(object)
|
60
|
+
def self.update(slug, object)
|
61
|
+
object['updated_at'] = Time.now
|
62
|
+
result = Utils.db do
|
63
|
+
|
64
|
+
# Keep the original slug handy
|
65
|
+
results = r.db(Kilt.config.db.db).table('objects').filter({'slug' => "#{slug}"}).limit(1).run
|
66
|
+
original = results.to_a.first['unique_id']
|
67
|
+
|
68
|
+
# Check for slug uniqueness
|
69
|
+
results = r.db(Kilt.config.db.db).table('objects').filter({'slug' => "#{object['slug']}"}).run
|
70
|
+
if results
|
71
|
+
result = results.to_a.first
|
72
|
+
if result && result['unique_id'] != original
|
73
|
+
object['slug'] = "#{Kilt::Utils.slugify(object['name'])}-#{(Time.now.to_f * 1000).to_i}"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# Update the record
|
78
|
+
r.db(Kilt.config.db.db).table('objects').filter({'unique_id' => "#{original}"}).update(object.values).run
|
79
|
+
|
80
|
+
end
|
81
|
+
(result['errors'] == 0)
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
# Delete an object
|
86
|
+
# Returns: boolean
|
87
|
+
# Example: Kilt.delete('some-object')
|
88
|
+
def self.delete(slug)
|
89
|
+
result = Utils.db do
|
90
|
+
r.db(Kilt.config.db.db).table('objects').filter({'slug' => "#{slug.to_s}"}).delete().run
|
91
|
+
end
|
92
|
+
(result['errors'] == 0)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Get the content for a specific object
|
96
|
+
# Returns: Kilt::Object instance
|
97
|
+
# Example: Kilt.object('big-event')
|
98
|
+
def self.get(slug)
|
99
|
+
# connect to the db, get the object, close the connection, return the object
|
100
|
+
values = Utils.db do
|
101
|
+
r.db(Kilt.config.db.db).table('objects').filter({'slug' => "#{slug.to_s}"}).run
|
102
|
+
end
|
103
|
+
|
104
|
+
result = values.to_a.first
|
105
|
+
|
106
|
+
# create an object and return it
|
107
|
+
Kilt::Object.new(result['type'], result)
|
108
|
+
end
|
109
|
+
|
110
|
+
# Get a list of objects
|
111
|
+
# Returns: array of hashes
|
112
|
+
# Example: Kilt.objects('events')
|
113
|
+
# Used directly or via method_missing
|
114
|
+
def self.get_collection(object_type)
|
115
|
+
# connect to the db, get the date, close the connection, return the array
|
116
|
+
results = Utils.db do
|
117
|
+
r.db(Kilt.config.db.db).table('objects').filter({'type' => "#{object_type.singularize.to_s}"}).run
|
118
|
+
end
|
119
|
+
|
120
|
+
# create an object collection
|
121
|
+
Kilt::ObjectCollection.new(results.to_a)
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
|
data/test/dummy/Rakefile
ADDED
File without changes
|
File without changes
|
@@ -0,0 +1,14 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require jquery
|
14
|
+
//= require_tree .
|
@@ -0,0 +1,2 @@
|
|
1
|
+
// HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
|
2
|
+
(function(k,m){var g="3.7.0";var d=k.html5||{};var h=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;var c=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;var q;var i="_html5shiv";var a=0;var o={};var e;(function(){try{var t=m.createElement("a");t.innerHTML="<xyz></xyz>";q=("hidden" in t);e=t.childNodes.length==1||(function(){(m.createElement)("a");var v=m.createDocumentFragment();return(typeof v.cloneNode=="undefined"||typeof v.createDocumentFragment=="undefined"||typeof v.createElement=="undefined")}())}catch(u){q=true;e=true}}());function f(t,v){var w=t.createElement("p"),u=t.getElementsByTagName("head")[0]||t.documentElement;w.innerHTML="x<style>"+v+"</style>";return u.insertBefore(w.lastChild,u.firstChild)}function l(){var t=j.elements;return typeof t=="string"?t.split(" "):t}function p(t){var u=o[t[i]];if(!u){u={};a++;t[i]=a;o[a]=u}return u}function n(w,t,v){if(!t){t=m}if(e){return t.createElement(w)}if(!v){v=p(t)}var u;if(v.cache[w]){u=v.cache[w].cloneNode()}else{if(c.test(w)){u=(v.cache[w]=v.createElem(w)).cloneNode()}else{u=v.createElem(w)}}return u.canHaveChildren&&!h.test(w)?v.frag.appendChild(u):u}function r(v,x){if(!v){v=m}if(e){return v.createDocumentFragment()}x=x||p(v);var y=x.frag.cloneNode(),w=0,u=l(),t=u.length;for(;w<t;w++){y.createElement(u[w])}return y}function s(t,u){if(!u.cache){u.cache={};u.createElem=t.createElement;u.createFrag=t.createDocumentFragment;u.frag=u.createFrag()}t.createElement=function(v){if(!j.shivMethods){return u.createElem(v)}return n(v,t,u)};t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/[\w\-]+/g,function(v){u.createElem(v);u.frag.createElement(v);return'c("'+v+'")'})+");return n}")(j,u.frag)}function b(t){if(!t){t=m}var u=p(t);if(j.shivCSS&&!q&&!u.hasCSS){u.hasCSS=!!f(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")}if(!e){s(t,u)}return t}var j={elements:d.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:g,shivCSS:(d.shivCSS!==false),supportsUnknownElements:e,shivMethods:(d.shivMethods!==false),type:"default",shivDocument:b,createElement:n,createDocumentFragment:r};k.html5=j;b(m)}(this,document));
|
@@ -0,0 +1 @@
|
|
1
|
+
if(typeof Object.create!=="function"){Object.create=function(b){function a(){}a.prototype=b;return new a()}}var ua={toString:function(){return navigator.userAgent},test:function(a){return this.toString().toLowerCase().indexOf(a.toLowerCase())>-1}};ua.version=(ua.toString().toLowerCase().match(/[\s\S]+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1];ua.webkit=ua.test("webkit");ua.gecko=ua.test("gecko")&&!ua.webkit;ua.opera=ua.test("opera");ua.ie=ua.test("msie")&&!ua.opera;ua.ie6=ua.ie&&document.compatMode&&typeof document.documentElement.style.maxHeight==="undefined";ua.ie7=ua.ie&&document.documentElement&&typeof document.documentElement.style.maxHeight!=="undefined"&&typeof XDomainRequest==="undefined";ua.ie8=ua.ie&&typeof XDomainRequest!=="undefined";var domReady=function(){var b=[];var a=function(){if(!arguments.callee.done){arguments.callee.done=true;for(var c=0;c<b.length;c++){b[c]()}}};if(document.addEventListener){document.addEventListener("DOMContentLoaded",a,false)}if(ua.ie){(function(){try{document.documentElement.doScroll("left")}catch(c){setTimeout(arguments.callee,50);return}a()})();document.onreadystatechange=function(){if(document.readyState==="complete"){document.onreadystatechange=null;a()}}}if(ua.webkit&&document.readyState){(function(){if(document.readyState!=="loading"){a()}else{setTimeout(arguments.callee,10)}})()}window.onload=a;return function(c){if(typeof c==="function"){b[b.length]=c}return c}}();var cssHelper=function(){var n={BLOCKS:/[^\s{][^{]*\{(?:[^{}]*\{[^{}]*\}[^{}]*|[^{}]*)*\}/g,BLOCKS_INSIDE:/[^\s{][^{]*\{[^{}]*\}/g,DECLARATIONS:/[a-zA-Z\-]+[^;]*:[^;]+;/g,RELATIVE_URLS:/url\(['"]?([^\/\)'"][^:\)'"]+)['"]?\)/g,REDUNDANT_COMPONENTS:/(?:\/\*([^*\\\\]|\*(?!\/))+\*\/|@import[^;]+;)/g,REDUNDANT_WHITESPACE:/\s*(,|:|;|\{|\})\s*/g,MORE_WHITESPACE:/\s{2,}/g,FINAL_SEMICOLONS:/;\}/g,NOT_WHITESPACE:/\S+/g};var l,k=false;var i=[];var h=function(u){if(typeof u==="function"){i[i.length]=u}};var f=function(){for(var u=0;u<i.length;u++){i[u](l)}};var d={};var o=function(y,u){if(d[y]){var w=d[y].listeners;if(w){for(var x=0;x<w.length;x++){w[x](u)}}}};var m=function(v,u,z){if(ua.ie&&!window.XMLHttpRequest){window.XMLHttpRequest=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}if(!XMLHttpRequest){return""}var w=new XMLHttpRequest();try{w.open("get",v,true);w.setRequestHeader("X_REQUESTED_WITH","XMLHttpRequest")}catch(x){z();return}var y=false;setTimeout(function(){y=true},5000);document.documentElement.style.cursor="progress";w.onreadystatechange=function(){if(w.readyState===4&&!y){if(!w.status&&location.protocol==="file:"||(w.status>=200&&w.status<300)||w.status===304||navigator.userAgent.indexOf("Safari")>-1&&typeof w.status==="undefined"){u(w.responseText)}else{z()}document.documentElement.style.cursor="";w=null}};w.send("")};var j=function(u){u=u.replace(n.REDUNDANT_COMPONENTS,"");u=u.replace(n.REDUNDANT_WHITESPACE,"$1");u=u.replace(n.MORE_WHITESPACE," ");u=u.replace(n.FINAL_SEMICOLONS,"}");return u};var g={mediaQueryList:function(C){var u={};var B=C.indexOf("{");var y=C.substring(0,B);C=C.substring(B+1,C.length-1);var x=[],w=[];var v=y.toLowerCase().substring(7).split(",");for(var A=0;A<v.length;A++){x[x.length]=g.mediaQuery(v[A],u)}var z=C.match(n.BLOCKS_INSIDE);if(z!==null){for(A=0;A<z.length;A++){w[w.length]=g.rule(z[A],u)}}u.getMediaQueries=function(){return x};u.getRules=function(){return w};u.getListText=function(){return y};u.getCssText=function(){return C};return u},mediaQuery:function(D,C){D=D||"";var w=false,A;var z=[];var y=true;var x=D.match(n.NOT_WHITESPACE);for(var B=0;B<x.length;B++){var v=x[B];if(!A&&(v==="not"||v==="only")){if(v==="not"){w=true}}else{if(!A){A=v}else{if(v.charAt(0)==="("){var u=v.substring(1,v.length-1).split(":");z[z.length]={mediaFeature:u[0],value:u[1]||null}}}}}return{getList:function(){return C||null},getValid:function(){return y},getNot:function(){return w},getMediaType:function(){return A},getExpressions:function(){return z}}},rule:function(B,y){var u={};var z=B.indexOf("{");var A=B.substring(0,z);var C=A.split(",");var v=[];var w=B.substring(z+1,B.length-1).split(";");for(var x=0;x<w.length;x++){v[v.length]=g.declaration(w[x],u)}u.getMediaQueryList=function(){return y||null};u.getSelectors=function(){return C};u.getSelectorText=function(){return A};u.getDeclarations=function(){return v};u.getPropertyValue=function(E){for(var D=0;D<v.length;D++){if(v[D].getProperty()===E){return v[D].getValue()}}return null};return u},declaration:function(x,y){var u=x.indexOf(":");var z=x.substring(0,u);var w=x.substring(u+1);return{getRule:function(){return y||null},getProperty:function(){return z},getValue:function(){return w}}}};var a=function(x){if(typeof x.cssHelperText!=="string"){return}var w={mediaQueryLists:[],rules:[],selectors:{},declarations:[],properties:{}};var C=w.mediaQueryLists;var E=w.rules;var B=x.cssHelperText.match(n.BLOCKS);if(B!==null){for(var D=0;D<B.length;D++){if(B[D].substring(0,7)==="@media "){C[C.length]=g.mediaQueryList(B[D]);E=w.rules=E.concat(C[C.length-1].getRules())}else{E[E.length]=g.rule(B[D])}}}var u=w.selectors;var z=function(H){var G=H.getSelectors();for(var F=0;F<G.length;F++){var I=G[F];if(!u[I]){u[I]=[]}u[I][u[I].length]=H}};for(D=0;D<E.length;D++){z(E[D])}var A=w.declarations;for(D=0;D<E.length;D++){A=w.declarations=A.concat(E[D].getDeclarations())}var v=w.properties;for(D=0;D<A.length;D++){var y=A[D].getProperty();if(!v[y]){v[y]=[]}v[y][v[y].length]=A[D]}x.cssHelperParsed=w;l[l.length]=x;return w};var c=function(v,u){v.cssHelperText=j(u||v.innerHTML);return a(v)};var b=function(){k=true;l=[];var u=[];var v=function(){for(var D=0;D<u.length;D++){a(u[D])}var C=document.getElementsByTagName("style");for(D=0;D<C.length;D++){c(C[D])}k=false;f()};var B=document.getElementsByTagName("link");for(var w=0;w<B.length;w++){var z=B[w];if(z.getAttribute("rel").indexOf("style")>-1&&z.href&&z.href.length!==0&&!z.disabled){u[u.length]=z}}if(u.length>0){var A=0;var y=function(){A++;if(A===u.length){v()}};var x=function(D){var C=D.href;m(C,function(E){E=j(E).replace(n.RELATIVE_URLS,"url("+C.substring(0,C.lastIndexOf("/"))+"/$1)");D.cssHelperText=E;y()},y)};for(w=0;w<u.length;w++){x(u[w])}}else{v()}};var p={mediaQueryLists:"array",rules:"array",selectors:"object",declarations:"array",properties:"object"};var t={mediaQueryLists:null,rules:null,selectors:null,declarations:null,properties:null};var s=function(w,u){if(t[w]!==null){if(p[w]==="array"){return(t[w]=t[w].concat(u))}else{var y=t[w];for(var x in u){if(u.hasOwnProperty(x)){if(!y[x]){y[x]=u[x]}else{y[x]=y[x].concat(u[x])}}}return y}}};var r=function(u){t[u]=(p[u]==="array")?[]:{};for(var v=0;v<l.length;v++){s(u,l[v].cssHelperParsed[u])}return t[u]};domReady(function(){var v=document.body.getElementsByTagName("*");for(var u=0;u<v.length;u++){v[u].checkedByCssHelper=true}if(document.implementation.hasFeature("MutationEvents","2.0")||window.MutationEvent){document.body.addEventListener("DOMNodeInserted",function(x){var w=x.target;if(w.nodeType===1){o("DOMElementInserted",w);w.checkedByCssHelper=true}},false)}else{setInterval(function(){var x=document.body.getElementsByTagName("*");for(var w=0;w<x.length;w++){if(!x[w].checkedByCssHelper){o("DOMElementInserted",x[w]);x[w].checkedByCssHelper=true}}},1000)}});var q=function(u){if(typeof window.innerWidth!="undefined"){return window["inner"+u]}else{if(typeof document.documentElement!="undefined"&&typeof document.documentElement.clientWidth!="undefined"&&document.documentElement.clientWidth!=0){return document.documentElement["client"+u]}}};return{addStyle:function(w,u){var v=document.createElement("style");v.setAttribute("type","text/css");document.getElementsByTagName("head")[0].appendChild(v);if(v.styleSheet){v.styleSheet.cssText=w}else{v.appendChild(document.createTextNode(w))}v.addedWithCssHelper=true;if(typeof u==="undefined"||u===true){cssHelper.parsed(function(x){var y=c(v,w);for(var z in y){if(y.hasOwnProperty(z)){s(z,y[z])}}o("newStyleParsed",v)})}else{v.parsingDisallowed=true}return v},removeStyle:function(u){return u.parentNode.removeChild(u)},parsed:function(u){if(k){h(u)}else{if(typeof l!=="undefined"){if(typeof u==="function"){u(l)}}else{h(u);b()}}},mediaQueryLists:function(u){cssHelper.parsed(function(v){u(t.mediaQueryLists||r("mediaQueryLists"))})},rules:function(u){cssHelper.parsed(function(v){u(t.rules||r("rules"))})},selectors:function(u){cssHelper.parsed(function(v){u(t.selectors||r("selectors"))})},declarations:function(u){cssHelper.parsed(function(v){u(t.declarations||r("declarations"))})},properties:function(u){cssHelper.parsed(function(v){u(t.properties||r("properties"))})},broadcast:o,addListener:function(v,u){if(typeof u==="function"){if(!d[v]){d[v]={listeners:[]}}d[v].listeners[d[v].listeners.length]=u}},removeListener:function(x,w){if(typeof w==="function"&&d[x]){var u=d[x].listeners;for(var v=0;v<u.length;v++){if(u[v]===w){u.splice(v,1);v-=1}}}},getViewportWidth:function(){return q("Width")},getViewportHeight:function(){return q("Height")}}}();domReady(function enableCssMediaQueries(){var k;var i={LENGTH_UNIT:/[0-9]+(em|ex|px|in|cm|mm|pt|pc)$/,RESOLUTION_UNIT:/[0-9]+(dpi|dpcm)$/,ASPECT_RATIO:/^[0-9]+\/[0-9]+$/,ABSOLUTE_VALUE:/^[0-9]*(\.[0-9]+)*$/};var h=[];var n=function(){var s="css3-mediaqueries-test";var q=document.createElement("div");q.id=s;var r=cssHelper.addStyle("@media all and (width) { #"+s+" { width: 1px !important; } }",false);document.body.appendChild(q);var p=q.offsetWidth===1;r.parentNode.removeChild(r);q.parentNode.removeChild(q);n=function(){return p};return p};var m=function(){k=document.createElement("div");k.style.cssText="position:absolute;top:-9999em;left:-9999em;margin:0;border:none;padding:0;width:1em;font-size:1em;";document.body.appendChild(k);if(k.offsetWidth!==16){k.style.fontSize=16/k.offsetWidth+"em"}k.style.width=""};var l=function(q){k.style.width=q;var p=k.offsetWidth;k.style.width="";return p};var j=function(z,y){var u=z.length;var x=(z.substring(0,4)==="min-");var B=(!x&&z.substring(0,4)==="max-");if(y!==null){var w;var v;if(i.LENGTH_UNIT.exec(y)){w="length";v=l(y)}else{if(i.RESOLUTION_UNIT.exec(y)){w="resolution";v=parseInt(y,10);var t=y.substring((v+"").length)}else{if(i.ASPECT_RATIO.exec(y)){w="aspect-ratio";v=y.split("/")}else{if(i.ABSOLUTE_VALUE){w="absolute";v=y}else{w="unknown"}}}}}var s,r;if("device-width"===z.substring(u-12,u)){s=screen.width;if(y!==null){if(w==="length"){return((x&&s>=v)||(B&&s<v)||(!x&&!B&&s===v))}else{return false}}else{return s>0}}else{if("device-height"===z.substring(u-13,u)){r=screen.height;if(y!==null){if(w==="length"){return((x&&r>=v)||(B&&r<v)||(!x&&!B&&r===v))}else{return false}}else{return r>0}}else{if("width"===z.substring(u-5,u)){s=document.documentElement.clientWidth||document.body.clientWidth;if(y!==null){if(w==="length"){return((x&&s>=v)||(B&&s<v)||(!x&&!B&&s===v))}else{return false}}else{return s>0}}else{if("height"===z.substring(u-6,u)){r=document.documentElement.clientHeight||document.body.clientHeight;if(y!==null){if(w==="length"){return((x&&r>=v)||(B&&r<v)||(!x&&!B&&r===v))}else{return false}}else{return r>0}}else{if("device-aspect-ratio"===z.substring(u-19,u)){return w==="aspect-ratio"&&screen.width*v[1]===screen.height*v[0]}else{if("color-index"===z.substring(u-11,u)){var q=Math.pow(2,screen.colorDepth);if(y!==null){if(w==="absolute"){return((x&&q>=v)||(B&&q<v)||(!x&&!B&&q===v))}else{return false}}else{return q>0}}else{if("color"===z.substring(u-5,u)){var p=screen.colorDepth;if(y!==null){if(w==="absolute"){return((x&&p>=v)||(B&&p<v)||(!x&&!B&&p===v))}else{return false}}else{return p>0}}else{if("resolution"===z.substring(u-10,u)){var A;if(t==="dpcm"){A=l("1cm")}else{A=l("1in")}if(y!==null){if(w==="resolution"){return((x&&A>=v)||(B&&A<v)||(!x&&!B&&A===v))}else{return false}}else{return A>0}}else{return false}}}}}}}}};var g=function(r){var u=r.getValid();var t=r.getExpressions();var p=t.length;if(p>0){for(var q=0;q<p&&u;q++){u=j(t[q].mediaFeature,t[q].value)}var s=r.getNot();return(u&&!s||s&&!u)}};var f=function(p){var u=p.getMediaQueries();var r={};for(var q=0;q<u.length;q++){if(g(u[q])){r[u[q].getMediaType()]=true}}var v=[],x=0;for(var w in r){if(r.hasOwnProperty(w)){if(x>0){v[x++]=","}v[x++]=w}}if(v.length>0){h[h.length]=cssHelper.addStyle("@media "+v.join("")+"{"+p.getCssText()+"}",false)}};var d=function(q){for(var p=0;p<q.length;p++){f(q[p])}if(ua.ie){document.documentElement.style.display="block";setTimeout(function(){document.documentElement.style.display=""},0);setTimeout(function(){cssHelper.broadcast("cssMediaQueriesTested")},100)}else{cssHelper.broadcast("cssMediaQueriesTested")}};var c=function(){for(var p=0;p<h.length;p++){cssHelper.removeStyle(h[p])}h=[];cssHelper.mediaQueryLists(d)};var b=0;var a=function(){var s=cssHelper.getViewportWidth();var r=cssHelper.getViewportHeight();if(ua.ie){var t=document.createElement("div");t.style.position="absolute";t.style.top="-9999em";t.style.overflow="scroll";document.body.appendChild(t);b=t.offsetWidth-t.clientWidth;document.body.removeChild(t)}var q;var p=function(){var u=cssHelper.getViewportWidth();var v=cssHelper.getViewportHeight();if(Math.abs(u-s)>b||Math.abs(v-r)>b){s=u;r=v;clearTimeout(q);q=setTimeout(function(){if(!n()){c()}else{cssHelper.broadcast("cssMediaQueriesTested")}},500)}};window.onresize=function(){var u=window.onresize||function(){};return function(){u();p()}}()};var o=document.documentElement;o.style.marginLeft="-32767px";setTimeout(function(){o.style.marginTop=""},20000);return function(){if(!n()){cssHelper.addListener("newStyleParsed",function(p){d(p.cssHelperParsed.mediaQueryLists)});cssHelper.addListener("cssMediaQueriesTested",function(){if(ua.ie){o.style.width="1px"}setTimeout(function(){o.style.width="";o.style.marginLeft=""},0);cssHelper.removeListener("cssMediaQueriesTested",arguments.callee)});m();c()}else{o.style.marginLeft=""}a()}}());try{document.execCommand("BackgroundImageCache",false,true)}catch(e){};
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Require any additional compass plugins here.
|
2
|
+
|
3
|
+
# Set this to the root of your project when deployed:
|
4
|
+
http_path = "/"
|
5
|
+
css_dir = "stylesheets"
|
6
|
+
sass_dir = "sass"
|
7
|
+
images_dir = "images"
|
8
|
+
javascripts_dir = "javascripts"
|
9
|
+
|
10
|
+
# You can select your preferred output style here (can be overridden via the command line):
|
11
|
+
# output_style = :expanded or :nested or :compact or :compressed
|
12
|
+
|
13
|
+
# To enable relative paths to assets via compass helper functions. Uncomment:
|
14
|
+
# relative_assets = true
|
15
|
+
|
16
|
+
# To disable debugging comments that display the original location of your selectors. Uncomment:
|
17
|
+
# line_comments = false
|
18
|
+
|
19
|
+
|
20
|
+
# If you prefer the indented syntax, you might want to regenerate this
|
21
|
+
# project again passing --syntax sass, or you can uncomment this:
|
22
|
+
# preferred_syntax = :sass
|
23
|
+
# and then run:
|
24
|
+
# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass
|
@@ -0,0 +1,81 @@
|
|
1
|
+
@mixin sprite-background($name) {
|
2
|
+
background-image: sprite-url($sprites);
|
3
|
+
background-position: sprite-position($sprites, $name);
|
4
|
+
background-repeat: no-repeat;
|
5
|
+
display: block;
|
6
|
+
height: image-height(sprite-file($sprites, $name));
|
7
|
+
text-indent: -9999em;
|
8
|
+
width: image-width(sprite-file($sprites, $name));
|
9
|
+
}
|
10
|
+
|
11
|
+
@mixin retina-sprite-background($name) {
|
12
|
+
background-image: sprite-url($retina_sprites);
|
13
|
+
background-position: sprite-position($retina_sprites, $name);
|
14
|
+
background-repeat: no-repeat;
|
15
|
+
background-size: image-width(sprite-path($retina_sprites)) / 2;
|
16
|
+
display: block;
|
17
|
+
height: image-height(sprite-file($retina_sprites, $name)) / 2;
|
18
|
+
text-indent: -9999em;
|
19
|
+
width: image-width(sprite-file($retina_sprites, $name)) / 2;
|
20
|
+
}
|
21
|
+
|
22
|
+
@mixin transition($transitions...) {
|
23
|
+
-webkit-transition: $transitions;
|
24
|
+
-moz-transition: $transitions;
|
25
|
+
-o-transition: $transitions;
|
26
|
+
transition: $transitions;
|
27
|
+
}
|
28
|
+
|
29
|
+
@mixin box-shadow($shadows...) {
|
30
|
+
-webkit-box-shadow: $shadows;
|
31
|
+
-moz-box-shadow: $shadows;
|
32
|
+
-o-box-shadow: $shadows;
|
33
|
+
box-shadow: $shadows;
|
34
|
+
}
|
35
|
+
|
36
|
+
@mixin opacity ($opacity) {
|
37
|
+
opacity: $opacity;
|
38
|
+
-moz-opacity: $opacity;
|
39
|
+
filter:alpha(opacity=($opacity * 100));
|
40
|
+
}
|
41
|
+
|
42
|
+
@mixin css-triangle($direction: "down", $size: 20px, $color: #000) {
|
43
|
+
width: 0;
|
44
|
+
height: 0;
|
45
|
+
border-left: $size solid #{setTriangleColor($direction, "left", $color)};
|
46
|
+
border-right: $size solid #{setTriangleColor($direction, "right", $color)};
|
47
|
+
border-bottom: $size solid #{setTriangleColor($direction, "bottom", $color)};
|
48
|
+
border-top: $size solid #{setTriangleColor($direction, "top", $color)};
|
49
|
+
}
|
50
|
+
|
51
|
+
@function setTriangleColor($direction, $side, $color) {
|
52
|
+
@if $direction == "left" and $side == "right"
|
53
|
+
or $direction == "right" and $side == "left"
|
54
|
+
or $direction == "down" and $side == "top"
|
55
|
+
or $direction == "up" and $side == "bottom" {
|
56
|
+
@return $color
|
57
|
+
} @else {
|
58
|
+
@return "transparent";
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
@mixin font-face($family, $style, $weight, $filename) {
|
63
|
+
@font-face {
|
64
|
+
font-family: $family;
|
65
|
+
font-style: $style;
|
66
|
+
font-weight: $weight;
|
67
|
+
src: url('../../font/' + $filename + '.eot');
|
68
|
+
src: url('../../font/' + $filename + '.eot?#iefix') format('embedded-opentype'),
|
69
|
+
url('../../font/' + $filename + '.woff') format('woff'),
|
70
|
+
url('../../font/' + $filename + '.ttf') format('truetype'),
|
71
|
+
url('../../font/' + $filename + '.svg#' + $family +'') format('svg');
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
@mixin user-select($value) {
|
76
|
+
-webkit-user-select: $value;
|
77
|
+
-moz-user-select: $value;
|
78
|
+
-ms-user-select: $value;
|
79
|
+
-o-user-select: $value;
|
80
|
+
user-select: $value;
|
81
|
+
}
|