-class Pettanr.Router extends Backbone.Router\r
- routes: {\r
- 'folders/:id': 'folders_show'\r
- 'scrolls/': 'scrolls_index'\r
- 'aa': 'folders_show'\r
- }\r
- \r
- index: (r, a) ->\r
- \r
- show_html_format: (format) -> \r
- \r
- show: (id) ->\r
- \r
- count: () ->\r
- \r
- new: () ->\r
- \r
- edit: () ->\r
- \r
- create: () ->\r
- \r
- update: () ->\r
- \r
- destroy: () ->\r
+class Pettanr.History extends Backbone.History\r
+ @lock_url = null\r
+ checkUrl: (e) ->\r
+ if Pettanr.History.lock_url\r
+ if confirm('leave? edit data unsaved')\r
+ Pettanr.History.lock_url = null\r
+ else\r
+ @history.pushState({}, document.title, '/' + Pettanr.History.lock_url)\r
+ return false\r
+ super(e)\r
\r
- folders_index: () ->\r
- \r
- folders_root: () ->\r
- \r
- folders_show_html_format: (format) -> \r
+Backbone.history = new Pettanr.History\r
+class Pettanr.Router extends Backbone.Router\r
\r
- folders_show: (id) ->\r
- @item = new Pettanr.FolderWatch({id: id})\r
- _this = this\r
- @item.fetch({}).done () ->\r
- _this.render()\r
- \r
- render: () ->\r
- if @item.is_remote()\r
- window.router.navigate(@item.remote_name(), true)\r
+ initialize: (options) ->\r
+ super()\r
+ _.extend(this, Backbone.Events)\r
+ @operators = options.operators\r
+ \r
+ parse_query_string: (query_string) ->\r
+ params = {}\r
+ if query_string\r
+ ary = _.map decodeURI(query_string).split(/&/g), (el, i) ->\r
+ aux = el.split('=')\r
+ o = {}\r
+ if aux.length >= 1\r
+ val = undefined\r
+ if aux.length == 2\r
+ val = aux[1]\r
+ o[aux[0]] = val\r
+ o\r
+ _.each ary, (o) -> \r
+ _.extend(params, o)\r
+ params\r
+ \r
+ peta_routes: () ->\r
+ [\r
+ {route: '', callback: 'home'}, \r
+ {route: 'top/:action', callback: 'top_a'}, \r
+ {route: 'users/:action', callback: 'users_a'}, # no manifest route\r
+ {route: 'user_sessions/:action', callback: 'user_sessions_a'}, # no manifest route\r
+ {route: ':controller/:id/:action?*query_string', callback: 'c_i_a'}, \r
+ {route: ':controller/:id/:action', callback: 'c_i_a'}, \r
+ {route: ':controller/:id?*query_string', callback: 'c_i'}, \r
+ {route: ':controller/:id', callback: 'c_i'}, \r
+ {route: ':controller?*query_string', callback: 'c'}, \r
+ {route: ':controller', callback: 'c'}, \r
+ ]\r
+ \r
+ find_route: (url) ->\r
+ r = null\r
+ _.any @peta_routes(), (route) =>\r
+ route.regex = @_routeToRegExp(route.route)\r
+ if route.regex.test(url)\r
+ r = route\r
+ r\r
+ \r
+ url_to_params: (url) ->\r
+ if route = @find_route(url)\r
+ args = @_extractParameters(route.regex, url)\r
+ n = route.callback # callback function name by string\r
+ this[n + '_params'].apply(this, args) # call to c_i_a_params, c_i_params, c_params\r
else\r
- list_result = new Pettanr.Folder.Children({id: @item.id})\r
- new Pettanr.FilerRender('folder', list_result, 'default', window.operators)\r
- \r
- folders_count: () ->\r
- \r
- folders_new: () ->\r
- \r
- folders_edit: () ->\r
+ {}\r
\r
- scrolls_index: () ->\r
- list_result = new Pettanr.Scroll.Collection({})\r
- new Pettanr.FilerRender('scroll', list_result, 'default', window.operators)\r
+ filters: () ->\r
+ if Pettanr.is_sns()\r
+ Pettanr.ActionFilter.sns_filters()\r
+ else\r
+ Pettanr.ActionFilter.blog_filters()\r
+ \r
+ my_filters: (role, params) ->\r
+ f = @filters()\r
+ c = f[params['controller']] || {}\r
+ r = c[role]\r
+ r\r
+ \r
+ # return false if allow\r
+ # return true if deny\r
+ authenticate: (role, params) ->\r
+ n = 'is_' + role\r
+ if not @operators[n]() # ex: operators.is_user()\r
+ filter = @my_filters(role, params)\r
+ if Pettanr.before_filter(params['action'], filter)\r
+ return true\r
+ false\r
+ \r
+ # access block\r
+ # return sign in form if invalid url\r
+ # return null if url is valid\r
+ block: (params) ->\r
+ return @guest_url() if @authenticate('reader', params) or @authenticate('resource_reader', params) or @authenticate('user', params)\r
+ return @new_author_url() if @authenticate('author', params)\r
+ return @new_artist_url() if @authenticate('artist', params)\r
+ null\r
+ \r
+ guest_url: () ->\r
+ 'user_seeeions/new'\r
+ \r
+ new_author_url: () ->\r
+ 'authors/new'\r
+ \r
+ new_artist_url: () ->\r
+ 'artists/new'\r
+ \r
+ # render App(render:all)\r
+ home: () ->\r
+ params = @home_params()\r
+ @trigger('go', params)\r
+ \r
+ home_params: () ->\r
+ params = {}\r
+ params['controller'] = 'folders'\r
+ params['action'] = 'root'\r
+ params\r
+ \r
+ # controller/id/action case\r
+ # ex) scrolls/3/edit\r
+ c_i_a: (controller, id, action, query_string, form) ->\r
+ params = @c_i_a_params(controller, id, action, query_string)\r
+ if safe_url = @block(params)\r
+ @trigger('deny', params, form, safe_url)\r
+ else\r
+ @trigger('go', params, form)\r
+ \r
+ c_i_a_params: (controller, id, action, query_string) ->\r
+ params = @parse_query_string(query_string)\r
+ params['controller'] = controller\r
+ params['format'] = 'html'\r
+ t = id.split('.')\r
+ if t.length > 1\r
+ params['format'] = t[1]\r
+ id = t[0]\r
+ t = action.split('.')\r
+ if t.length > 1\r
+ params['format'] = t[1]\r
+ action = t[0]\r
+ if Pettanr.is_number(action)\r
+ params['action'] = id\r
+ params['id'] = action\r
+ else\r
+ params['action'] = action\r
+ params['id'] = id\r
+ params\r
+ \r
+ # controller and id case\r
+ # ex) scrolls/3\r
+ c_i: (controller, id, query_string, form) ->\r
+ params = @c_i_params(controller, id, query_string)\r
+ if safe_url = @block(params)\r
+ @trigger('deny', params, form, safe_url)\r
+ else\r
+ @trigger('go', params, form)\r
+ \r
+ c_i_params: (controller, id, query_string) ->\r
+ params = @parse_query_string(query_string)\r
+ params['controller'] = controller\r
+ params['format'] = 'html'\r
+ t = id.split('.')\r
+ if t.length > 1\r
+ params['format'] = t[1]\r
+ id = t[0]\r
+ if Pettanr.is_number(id)\r
+ params['action'] = 'show'\r
+ params['id'] = id\r
+ else\r
+ if id\r
+ params['action'] = id\r
+ else\r
+ params['action'] = 'index'\r
+ params\r
+ \r
+ # controller only case\r
+ # ex) scrolls\r
+ c: (controller, query_string, form) ->\r
+ params = @c_params(controller, query_string)\r
+ if safe_url = @block(params)\r
+ @trigger('deny', params, form, safe_url)\r
+ else\r
+ @trigger('go', params, form)\r
+ \r
+ c_params: (controller, query_string) ->\r
+ params = @parse_query_string(query_string)\r
+ params['controller'] = controller\r
+ params['format'] = 'html'\r
+ params['action'] = 'index'\r
+ params\r
+ \r
+ top_a: (action, query_string, form) ->\r
+ params = @users_a_params(action, query_string)\r
+ if safe_url = @block(params)\r
+ @trigger('deny', params, safe_url)\r
+ else\r
+ @trigger('go', params, form)\r
+ \r
+ top_a_params: (action, query_string) ->\r
+ params = @parse_query_string(query_string)\r
+ params['controller'] = 'top'\r
+ params['format'] = 'html'\r
+ params['action'] = action\r
+ params\r
+ \r
+ user_sessions_a: (action, query_string, form) ->\r
+ params = @user_sessions_a_params(action, query_string)\r
+ if safe_url = @block(params)\r
+ @trigger('deny', params, safe_url)\r
+ else\r
+ @trigger('go', params, form)\r
+ \r
+ user_sessions_a_params: (action, query_string) ->\r
+ params = @parse_query_string(query_string)\r
+ params['controller'] = 'user_sessions'\r
+ params['format'] = 'html'\r
+ params['action'] = action\r
+ params\r
+ \r
+ users_a: (action, query_string, form) ->\r
+ params = @users_a_params(action, query_string)\r
+ if safe_url = @block(params)\r
+ @trigger('deny', params, safe_url)\r
+ else\r
+ @trigger('go', params, form)\r
+ \r
+ users_a_params: (action, query_string) ->\r
+ params = @parse_query_string(query_string)\r
+ params['controller'] = 'users'\r
+ params['format'] = 'html'\r
+ params['action'] = action\r
+ params\r
+\r
+class Pettanr.GlobalRouter extends Pettanr.Router\r
+ \r
+ initialize: (options) ->\r
+ super(options)\r
+ _.each @peta_routes(), (r) =>\r
+ @route(r.route, r.callback)\r
+ \r
+class Pettanr.LocalRouter extends Pettanr.Router\r
+ \r
+ initialize: (options) ->\r
+ super(options)\r
+ \r
+ # selfish navigate\r
+ navigate: (url, form) ->\r
+ if route = @find_route(url)\r
+ args = @_extractParameters(route.regex, url)\r
+ args.push(form)\r
+ n = route.callback # callback function name by string\r
+ this[n].apply(this, args) # call to c_i_a, c_i, c\r
\r