tiny_site 0.1.7 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/tiny_site/version.rb +1 -1
- data/lib/tiny_site.rb +58 -32
- metadata +2 -2
data/lib/tiny_site/version.rb
CHANGED
data/lib/tiny_site.rb
CHANGED
@@ -1,22 +1,28 @@
|
|
1
1
|
require 'open-uri'
|
2
|
+
require 'forwardable'
|
2
3
|
require 'RedCloth'
|
3
4
|
require 'yaml'
|
4
5
|
require 'haml'
|
5
6
|
|
6
7
|
class TextileParts
|
7
|
-
def self.parse(tp,
|
8
|
+
def self.parse(tp, app)
|
9
|
+
@app = app
|
10
|
+
|
8
11
|
return {:title => '404 not found'} unless tp
|
9
12
|
|
10
13
|
vars, *parts = tp.split(/^\+{4}([\w\d\-_]+)\+{4}$/)
|
11
14
|
vars = YAML.load(vars) || {}
|
12
15
|
|
13
16
|
parts = Hash[*parts]
|
14
|
-
parts.each{|k,v| parts[k] = textilize(v
|
17
|
+
parts.each{|k,v| parts[k] = textilize(v)}
|
15
18
|
|
16
19
|
vars.update(parts)
|
17
20
|
end
|
18
|
-
def self.
|
19
|
-
|
21
|
+
def self.image_url_for(img_name)
|
22
|
+
@app.image_url_for img_name
|
23
|
+
end
|
24
|
+
def self.textilize(string)
|
25
|
+
string.gsub!(%r{!([\w\d\-\._]+)!}){ |a| "!#{image_url_for $1}!" }
|
20
26
|
|
21
27
|
RedCloth.new(string).to_html
|
22
28
|
end
|
@@ -68,37 +74,56 @@ class CachedHttpFile
|
|
68
74
|
end
|
69
75
|
|
70
76
|
class TinySite
|
77
|
+
class View
|
78
|
+
extend Forwardable
|
79
|
+
def_delegators :@app, :request_path, :query_string, :global, :page, :file_url_for, :image_url_for
|
80
|
+
|
81
|
+
def initialize(app) ; @app = app ; end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
class TinySite
|
86
|
+
attr_reader :file_path, :file_path_postfix, :file_extension, :image_path, :request_path, :query_string,
|
87
|
+
:request_path, :query_string
|
88
|
+
|
71
89
|
def initialize(opts)
|
72
90
|
@file_path = opts[:file_path]
|
73
91
|
@file_path_postfix = opts[:file_path_postfix] || ''
|
74
|
-
@file_extension = opts[:file_extension]
|
75
|
-
@image_path = opts[:image_path]
|
76
|
-
@cache_buster = opts[:cache_buster]
|
92
|
+
@file_extension = opts[:file_extension] || 'textile'
|
93
|
+
@image_path = opts[:image_path] || File.join(@file_path, 'images')
|
94
|
+
@cache_buster = opts[:cache_buster] || 'bust'
|
77
95
|
end
|
78
96
|
|
79
|
-
def
|
80
|
-
|
97
|
+
def global
|
98
|
+
_, global_file = CachedHttpFile.get page_content_url_for('__global')
|
99
|
+
TextileParts.parse global_file, self
|
81
100
|
end
|
82
101
|
|
83
|
-
def
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
_, page_file = CachedHttpFile.get remote_file_url_for(@status) if @status != 200
|
88
|
-
global_file_fetch_tread.join
|
89
|
-
|
90
|
-
global = TextileParts.parse @global_file, @image_path, @file_path_postfix
|
91
|
-
page = TextileParts.parse page_file, @image_path, @file_path_postfix
|
92
|
-
|
93
|
-
render_layout :global => global, :page => page, :env => {:path => @path, :query_string => @query_string}
|
102
|
+
def page
|
103
|
+
@status, page_file = CachedHttpFile.get page_content_url_for(@request_path)
|
104
|
+
_, page_file = CachedHttpFile.get page_content_url_for(@status.to_s) if @status != 200
|
105
|
+
TextileParts.parse page_file, self
|
94
106
|
end
|
95
107
|
|
96
|
-
def
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
108
|
+
def status
|
109
|
+
@status or page && @status
|
110
|
+
end
|
111
|
+
|
112
|
+
def image_url_for(img_name)
|
113
|
+
file_url_for img_name, @image_path
|
114
|
+
end
|
115
|
+
def file_url_for(filename, path=file_path)
|
116
|
+
File.join path, "#{filename}#{file_path_postfix}"
|
117
|
+
end
|
118
|
+
def page_content_url_for(filename)
|
119
|
+
file_url_for "#{filename.gsub(%r{^/$},'/index')}.#{file_extension}"
|
120
|
+
end
|
121
|
+
|
122
|
+
def layout
|
123
|
+
page[:layout] || global[:layout] || 'layout'
|
124
|
+
end
|
125
|
+
def body
|
126
|
+
Haml::Engine.new(File.open("#{layout}.haml").read, :format => :html5).render view
|
102
127
|
end
|
103
128
|
|
104
129
|
def caching_header
|
@@ -107,14 +132,15 @@ class TinySite
|
|
107
132
|
CachedHttpFile.bust and return { 'Cache-Control' => 'no-cache' }
|
108
133
|
end
|
109
134
|
|
135
|
+
def view
|
136
|
+
@view ||= View.new self
|
137
|
+
end
|
138
|
+
|
110
139
|
def call(env)
|
111
|
-
@
|
112
|
-
@path = '/index' if @path == '/'
|
113
|
-
|
114
|
-
return [301, {'Location' => @path}, ''] if @path.gsub!(/\/$/,'')
|
140
|
+
@request_path, @query_string = env['PATH_INFO'], env['QUERY_STRING']
|
115
141
|
|
116
|
-
|
117
|
-
[
|
142
|
+
return [301, {'Location' => @request_path}, ''] if @request_path.gsub!(/(.)\/$/,'\\1')
|
143
|
+
[status, caching_header, body]
|
118
144
|
rescue => e
|
119
145
|
puts "#{e.class}: #{e.message} #{e.backtrace}"
|
120
146
|
[500, {}, 'Sorry, but something went wrong']
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: tiny_site
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1
|
5
|
+
version: 0.2.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Niko Dittmann
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-03-
|
13
|
+
date: 2011-03-08 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|