OSDN Git Service

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