OSDN Git Service

a1600d592fef24e009559061d33483e311f6a8cb
[pettanr/pettanr.git] / app / assets / javascripts / routes.js.coffee
1 class Pettanr.Router extends Backbone.Router\r
2   \r
3   parse_query_string: (query_string) ->\r
4     params = {}\r
5     if query_string\r
6       ary = _.map decodeURI(query_string).split(/&/g), (el, i) ->\r
7         aux = el.split('=')\r
8         o = {}\r
9         if aux.length >= 1\r
10           val = undefined\r
11           if aux.length == 2\r
12             val = aux[1]\r
13           o[aux[0]] = val\r
14           o\r
15       _.each ary, (o) -> \r
16         _.extend(params, o)\r
17     params\r
18   \r
19   peta_routes: () ->\r
20     [\r
21       {route: '', callback: 'home'}, \r
22       {route: 'top/:action', callback: 'top_a'}, \r
23       {route: 'users/:action', callback: 'users_a'}, \r
24       {route: 'user_sessions/:action', callback: 'user_sessions_a'}, \r
25       {route: ':controller/:id/:action?*query_string', callback: 'c_i_a'}, \r
26       {route: ':controller/:id/:action', callback: 'c_i_a'}, \r
27       {route: ':controller/:id?*query_string', callback: 'c_i'}, \r
28       {route: ':controller/:id', callback: 'c_i'}, \r
29       {route: ':controller?*query_string', callback: 'c'}, \r
30       {route: ':controller', callback: 'c'}, \r
31     ]\r
32   \r
33   find_route: (url) ->\r
34     r = null\r
35     _.any @peta_routes(), (route) =>\r
36       route.regex = @_routeToRegExp(route.route)\r
37       if route.regex.test(url)\r
38         r = route\r
39     r\r
40   \r
41   url_to_params: (url) ->\r
42     if route = @find_route(url)\r
43       n = route.callback  # callback function name by string\r
44       this[n + '_params'].apply(this, args)  # call to c_i_a_params, c_i_params, c_params\r
45   \r
46   # render App(render:all)\r
47   home: () ->\r
48     params = @home_params()\r
49     @trigger('fire', params)\r
50   \r
51   home_params: () ->\r
52     params = {}\r
53     params['controller'] = 'folders'\r
54     params['action'] = 'root'\r
55     params\r
56   \r
57   # controller/id/action case\r
58   # ex) scrolls/3/edit\r
59   c_i_a: (controller, id, action, query_string) ->\r
60     params = @c_i_a_params(controller, id, action, query_string)\r
61     @trigger('fire', params)\r
62   \r
63   c_i_a_params: (controller, id, action, query_string) ->\r
64     params = @parse_query_string(query_string)\r
65     params['controller'] = controller\r
66     params['format'] = 'html'\r
67     t = id.split('.')\r
68     if t.length > 1\r
69       params['format'] = t[1]\r
70       id = t[0]\r
71     t = action.split('.')\r
72     if t.length > 1\r
73       params['format'] = t[1]\r
74       action = t[0]\r
75     if Pettanr.is_number(action)\r
76       params['action'] = id\r
77       params['id'] = action\r
78     else\r
79       params['action'] = action\r
80       params['id'] = id\r
81     params\r
82   \r
83   # controller and id case\r
84   # ex) scrolls/3\r
85   c_i: (controller, id, query_string) ->\r
86     params = @c_i_params(controller, id, query_string)\r
87     @trigger('fire', params)\r
88   \r
89   c_i_params: (controller, id, query_string) ->\r
90     params = @parse_query_string(query_string)\r
91     params['controller'] = controller\r
92     params['format'] = 'html'\r
93     t = id.split('.')\r
94     if t.length > 1\r
95       params['format'] = t[1]\r
96       id = t[0]\r
97     if Pettanr.is_number(id)\r
98       params['action'] = 'show'\r
99       params['id'] = id\r
100     else\r
101       if id\r
102         params['action'] = id\r
103       else\r
104         params['action'] = 'index'\r
105     params\r
106   \r
107   # controller only case\r
108   # ex) scrolls\r
109   c: (controller, query_string) ->\r
110     params = @c_params(controller, query_string)\r
111     @trigger('fire', params)\r
112   \r
113   c_params: (controller, query_string) ->\r
114     params = @parse_query_string(query_string)\r
115     params['controller'] = controller\r
116     params['format'] = 'html'\r
117     params['action'] = 'index'\r
118     params\r
119   \r
120   top_a: (action, query_string) ->\r
121     params = @users_a_params(action, query_string)\r
122     @trigger('fire', params)\r
123   \r
124   top_a_params: (action, query_string) ->\r
125     params = @parse_query_string(query_string)\r
126     params['controller'] = 'top'\r
127     params['format'] = 'html'\r
128     params['action'] = action\r
129     params\r
130   \r
131   user_sessions_a: (action, query_string) ->\r
132     params = @user_sessions_a_params(action, query_string)\r
133     @trigger('fire', params)\r
134   \r
135   user_sessions_a_params: (action, query_string) ->\r
136     params = @parse_query_string(query_string)\r
137     params['controller'] = 'user_sessions'\r
138     params['format'] = 'html'\r
139     params['action'] = action\r
140     params\r
141   \r
142   users_a: (action, query_string) ->\r
143     params = @users_a_params(action, query_string)\r
144     @trigger('fire', params)\r
145   \r
146   users_a_params: (action, query_string) ->\r
147     params = @parse_query_string(query_string)\r
148     params['controller'] = 'users'\r
149     params['format'] = 'html'\r
150     params['action'] = action\r
151     params\r
152   \r
153   \r
154 class Pettanr.GlobalRouter extends Pettanr.Router\r
155   \r
156   initialize: () ->\r
157     _.extend(this, Backbone.Events)\r
158     _.each @peta_routes(), (r) =>\r
159       @route(r.route, r.callback)\r
160   \r
161   navigate: (fragment, options) ->\r
162     if window.editor\r
163       if confirm('leave? edit data unsaved')\r
164         window.editor.quit()\r
165         super(fragment, options)\r
166       else\r
167         false\r
168     else\r
169       super(fragment, options)\r
170   \r
171 class Pettanr.LocalRouter extends Pettanr.Router\r
172   \r
173   initialize: () ->\r
174     _.extend(this, Backbone.Events)\r
175   \r
176   # selfish navigate\r
177   navigate: (url) ->\r
178     if route = @find_route(url)\r
179       args = @_extractParameters(route.regex, url)\r
180       n = route.callback  # callback function name by string\r
181       this[n].apply(this, args)  # call to c_i_a, c_i, c\r
182   \r
183 class Pettanr.RouterFilter\r
184   \r
185   filters: () ->\r
186     if Pettanr.is_sns()\r
187       Pettanr.ActionFilter.sns_filters()\r
188     else\r
189       Pettanr.ActionFilter.blog_filters()\r
190   \r
191   my_filters: (role, params) ->\r
192     f = @filters()\r
193     c = f[params['controller']] || {}\r
194     r = c[role]\r
195     r\r
196   \r
197   authenticate: (role, params, operators) ->\r
198     if not operators[('is_' + role)]()  # ex: operators.is_user()\r
199       filter = @my_filters(role, params)\r
200       if Pettanr.before_filter(params['action'], filter)\r
201         return true\r
202     false\r
203   \r
204 class Pettanr.HeaderRouter extends Pettanr.LocalRouter\r
205   \r
206   initialize: () ->\r
207     super()\r
208     _.extend(this, Pettanr.RouterFilter)\r
209   \r
210 class Pettanr.BodyRouter extends Pettanr.GlobalRouter\r
211   \r
212   initialize: () ->\r
213     super()\r
214     _.extend(this, Pettanr.RouterFilter)\r
215   \r
216   navigate: (url, operators) ->\r
217     safe_url = @block(url, operators) || url\r
218     super(safe_url)\r
219   \r
220   # access block\r
221   # return sign in form if invalid url\r
222   # return null if url is valid\r
223   block: (url, operators) ->\r
224     params = @url_to_params(url)\r
225     return @guest_url() if @authenticate('reader', params, operators) or @authenticate('resource_reader', params, operators) or @authenticate('user', params, operators)\r
226     return @new_author_url() if @authenticate('author', params, operators)\r
227     return @new_artist_url() if @authenticate('artist', params, operators)\r
228     null\r
229   \r
230   guest_url: () ->\r
231     'user_seeeions/new'\r
232   \r
233   new_author_url: () ->\r
234     'authors/new'\r
235   \r
236   new_artist_url: () ->\r
237     'artists/new'\r
238   \r