sinatra-triforce 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/sinatra-triforce.rb +164 -0
  3. metadata +43 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1eee5dd578ab67fdaf2ec942c90240a1dffefcba
4
+ data.tar.gz: 19a1df4e3c8bd1f0f228ecd7ff775658636de212
5
+ SHA512:
6
+ metadata.gz: 8ea8404e9bd6e0681c94ab6e862acbe213899fcf144f319dd4ae539003264d1f715a719e32393d305f710e0037a5c440d6c25569c547a07a71602ddfa281dcec
7
+ data.tar.gz: 5fc35e226ea547b9c83174cbde99d1ce8b6fc7b12c391f2ca577e633a1bc5e4f5a47887093158865dd478bde6f20b9fb661300a17a76f89e4e11841f9ec72cc3
@@ -0,0 +1,164 @@
1
+ require 'haml'
2
+ require 'sass'
3
+ require 'coffee-script'
4
+ require 'sinatra/base'
5
+ module Sinatra
6
+ module Hipster
7
+ @@assets = {:css => ['/styles/' , 'styles'],
8
+ :js => ['/scripts/', 'scripts'],
9
+ :png => ['/images/' , 'images'],
10
+ :jpg => ['/images/' , 'images'],
11
+ :gif => ['/images/' , 'images'],
12
+ :eot => ['/fonts/' , 'fonts'],
13
+ :woff => ['/fonts/' , 'fonts'],
14
+ :ttf => ['/fonts/' , 'fonts'],
15
+ :svg => ['/fonts/' , 'fonts'],
16
+ :otf => ['/fonts/' , 'fonts'],
17
+ :scss => [nil , 'styles'],
18
+ :sass => [nil , 'styles'],
19
+ :coffee => [nil , 'scripts']}
20
+
21
+ def self.ensure_slash(str)
22
+ return "#{str}/" unless str[-1] == '/'
23
+ str
24
+ end
25
+
26
+ def self.uri_for(ext, uri)
27
+ raise "#{ext} is unknown, use the set_for method first." unless @assets[ext]
28
+ @@assets[ext][0] = uri
29
+ end
30
+
31
+ def self.path_for(ext, path)
32
+ raise "#{ext} is unknown, use the set_for method first." unless @@assets[ext]
33
+ @@assets[ext][1] = self::ensure_slash path
34
+ end
35
+
36
+ def self.set_for(*args)
37
+ uri = args[1].class == Hash ? args[1][:uri] : args[1]
38
+ path = args[1].class == Hash ? args[1][:path] : args[2]
39
+ @@assets[args[0]] = [uri, path]
40
+ end
41
+
42
+ def self.get_assets; @@assets; end
43
+
44
+ def self.resource_link(r, type, ie = nil)
45
+ resource = r.class == String ? r : "#{@@assets[type][0]}#{r}.#{type}"
46
+ tag = case type
47
+ when :js then "<script src='#{resource}'></script>"
48
+ when :css then "<link rel='stylesheet' href='#{resource}'/>"
49
+ end
50
+ return "#{tag}\n" unless ie
51
+ <<-END.gsub(/^ {6}/, '')
52
+ <!--[if #{ie.upcase}]>
53
+ #{tag}
54
+ <![endif]-->
55
+ END
56
+ end
57
+
58
+ module Helpers
59
+ @@id = lambda do |id, css_class=nil|
60
+ " id='#{id}' name='#{id}'#{" class='#{css_class}'" if css_class} "
61
+ end
62
+ def js(src, ie = nil); Hipster::resource_link src, :js, ie; end
63
+ def css(href, ie = nil); Hipster::resource_link href, :css, ie; end
64
+ def txt_box(id, css_c = nil)
65
+ "<input#{@@id.call id, css_c}type='text'></input>\n"
66
+ end
67
+ def label(id, txt, label_for = nil)
68
+ "<label#{@@id.call "#{id}_label"}for='#{label_for ? label_for : id}'>#{txt}</label>\n"
69
+ end
70
+ def submit_form(id, txt, css_c = nil)
71
+ "<input#{@@id.call id, css_c}type='submit' value='#{txt}'></input>\n"
72
+ end
73
+ def pw_box(id, css_c = nil)
74
+ "<input#{@@id.call id, css_c}type='password'></input>\n"
75
+ end
76
+ def select_box(id, css_c = nil)
77
+ "<select#{@@id.call id, css_c}></select>\n"
78
+ end
79
+ def label_txt(id, label_txt); "#{label id, label_txt}#{txt_box id}"; end
80
+ def label_pw (id, label_txt); "#{label id, label_txt}#{pw_box id}"; end
81
+ def label_select(id, label_text)
82
+ "#{label id, label_text}#{select_box id}"
83
+ end
84
+ def asset_list(assets)
85
+ txt = ''
86
+ assets.each do |asset|
87
+ txt = "#{txt}#{send(*asset)}" if [:js,:css].include? asset[0]
88
+ end
89
+ txt
90
+ end
91
+ def font(name)
92
+ assets = Hipster::get_assets
93
+ file = name.downcase
94
+ <<-END.gsub(/^ {8}/, '')
95
+ <style>
96
+ @font-face {
97
+ font-family: '#{name}';
98
+ src: url('#{assets[:eot][0]}#{file}.eot?#iefix') format('embedded-opentype'),
99
+ url('#{assets[:woff][0]}#{file}.woff') format('woff'),
100
+ url('#{assets[:ttf][0]}#{file}.ttf') format('truetype'),
101
+ url('#{assets[:svg][0]}#{file}.svg#svgFontName') format('svg');
102
+ font-weight: normal
103
+ font-style: normal
104
+ }
105
+ </style>
106
+ END
107
+ end
108
+ end
109
+
110
+ def self.get_file(file, type, uri = nil)
111
+ return nil unless ensure_slash(uri) == @@assets[type.to_sym][0]
112
+ glob = lambda { |t = nil| Dir.glob("#{@@assets[type.to_sym][1]}**/#{file}.#{t || type}")[0] }
113
+ case type.to_sym
114
+ when :js
115
+ if f = glob.call then return [file, :js] end
116
+ if glob.call(:coffee) then return [file, :coffee] end
117
+ when :css
118
+ if f = glob.call then return [file, :css] end
119
+ if glob.call(:sass) then return [file, :sass] end
120
+ else
121
+ if f = glob.call(type.to_sym) then return [file,type.to_sym] end
122
+ end
123
+ nil
124
+ end
125
+
126
+ class << self
127
+ def file_types
128
+ @@assets.keys.join '|'
129
+ end
130
+ end
131
+
132
+ def self.get_content_type(file)
133
+ return 'text/javascript' if file.split('.').last == 'js'
134
+ return 'text/css' if file.split('.').last == 'css'
135
+ return 'application/font-woff' if file.split('.').last == 'woff'
136
+ return 'application/vnd.ms-fontobject' if file.split('.').last == 'eot'
137
+ return 'application/x-font-ttf' if file.split('.').last == 'ttf'
138
+ return 'application/x-font-opentype' if file.split('.').last == 'otf'
139
+ return 'application/svg+xml' if file.split('.').last == 'svg'
140
+ IO.popen(['file', '--brief', '--mime-type', file]).read.chomp
141
+ end
142
+
143
+ def self.registered(app)
144
+ app.helpers Hipster::Helpers
145
+ app.get %r!(.+)?/(.+)\.(#{file_types})$! do
146
+ #last_modified DateTime.new 2010, 10, 10
147
+ #cache_control :public, :max_age => 15
148
+ file = Hipster::get_file params[:captures][1], params[:captures][2], params[:captures][0] || ''
149
+ halt 404 unless file
150
+ path = lambda { Hipster::ensure_slash @@assets[file[1]][1] }
151
+ last_modified File.open("#{path.call}#{file[0]}.#{file[1]}").mtime
152
+ return coffee file[0].to_sym, :views => path.call if file[1] == :coffee
153
+ return sass file[0].to_sym, :views => path.call if file[1] == :sass
154
+ target = "#{path.call}#{file[0]}.#{file[1]}"
155
+ content_type Hipster::get_content_type(target)
156
+ resource = File.open target
157
+ last_modified resource.mtime
158
+ return resource.read
159
+ end
160
+ end
161
+ end
162
+
163
+ register Hipster
164
+ end
metadata ADDED
@@ -0,0 +1,43 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sinatra-triforce
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Leo Stanley
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-06-05 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: '0 Configuration HAML + SASS + CoffeeScript, '
14
+ email: leo@byteio.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/sinatra-triforce.rb
20
+ homepage:
21
+ licenses: []
22
+ metadata: {}
23
+ post_install_message:
24
+ rdoc_options: []
25
+ require_paths:
26
+ - lib
27
+ required_ruby_version: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - '>='
30
+ - !ruby/object:Gem::Version
31
+ version: '0'
32
+ required_rubygems_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - '>='
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ requirements: []
38
+ rubyforge_project:
39
+ rubygems_version: 2.0.3
40
+ signing_key:
41
+ specification_version: 4
42
+ summary: Instantly embrace the power of HAML, SASS & CoffeeScript.
43
+ test_files: []