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