update Ox.URL
This commit is contained in:
parent
2cb6d89a0a
commit
738f734bde
1 changed files with 50 additions and 24 deletions
|
@ -91,9 +91,9 @@ k!=v:w k [v,w] != is not between (number), is not (string)
|
||||||
All parts of the URL can be omitted, as long as the order is preserved.
|
All parts of the URL can be omitted, as long as the order is preserved.
|
||||||
|
|
||||||
example.com/foo
|
example.com/foo
|
||||||
If "foo" is not a type, item (of the default type), view (of the default
|
If "foo" is not a type, item (of the default type), list view (of the
|
||||||
type), span id (of the default type's default view) or sort key (of the
|
default type), span id (of any list view of the default type) or sort key
|
||||||
default type's default view), then this means find *=foo
|
(of any list view of the default type), then this means find *=foo
|
||||||
example.com/title, or example.com/+title or example.com/-title
|
example.com/title, or example.com/+title or example.com/-title
|
||||||
If this neither matches a type or default type item, then this will be sort
|
If this neither matches a type or default type item, then this will be sort
|
||||||
example.com/clip/+duration/title=foo
|
example.com/clip/+duration/title=foo
|
||||||
|
@ -132,6 +132,9 @@ example.com/@renaissance/renaissance -> example.com/calendar/ABC/renaissance
|
||||||
example.com/@foo/foo -> example.com/map/@foo/foo
|
example.com/@foo/foo -> example.com/map/@foo/foo
|
||||||
foo doesn't match a place or event name, but getSpan() sets the map query to
|
foo doesn't match a place or event name, but getSpan() sets the map query to
|
||||||
foo and returns @foo, so we get map view, zoomed to Foo, with find *=foo
|
foo and returns @foo, so we get map view, zoomed to Foo, with find *=foo
|
||||||
|
example.com/clip:duration -> example.com/clip/clip:duration
|
||||||
|
clip:duration is not a sort key of the default view (grid), so the view is
|
||||||
|
set to the first list view that accepts this sort key
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -407,8 +410,6 @@ Ox.URL = function(options) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseURL(str, callback) {
|
function parseURL(str, callback) {
|
||||||
str = str || document.location.pathname
|
|
||||||
+ document.location.search + document.location.hash;
|
|
||||||
var parts = str.substr(1).split('/'),
|
var parts = str.substr(1).split('/'),
|
||||||
state = {};
|
state = {};
|
||||||
if (parts.length == 0) {
|
if (parts.length == 0) {
|
||||||
|
@ -448,6 +449,7 @@ Ox.URL = function(options) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function parseBeyondItem() {
|
function parseBeyondItem() {
|
||||||
|
Ox.print('pBI', state, parts.join('/'));
|
||||||
var span, spanType, spanTypes;
|
var span, spanType, spanTypes;
|
||||||
if (
|
if (
|
||||||
parts.length && state.item
|
parts.length && state.item
|
||||||
|
@ -457,7 +459,6 @@ Ox.URL = function(options) {
|
||||||
state.view = parts[0];
|
state.view = parts[0];
|
||||||
parts.shift();
|
parts.shift();
|
||||||
}
|
}
|
||||||
Ox.print('pBI', state, parts.join('/'));
|
|
||||||
if (parts.length) {
|
if (parts.length) {
|
||||||
if (isNumericalSpan(parts[0])) {
|
if (isNumericalSpan(parts[0])) {
|
||||||
// test for numerical span
|
// test for numerical span
|
||||||
|
@ -473,7 +474,10 @@ Ox.URL = function(options) {
|
||||||
if (spanType) {
|
if (spanType) {
|
||||||
span = parseSpan(parts[0], spanType);
|
span = parseSpan(parts[0], spanType);
|
||||||
if (span) {
|
if (span) {
|
||||||
if (!state.view) {
|
if (state.view) {
|
||||||
|
state.span = span;
|
||||||
|
parts.shift();
|
||||||
|
} else {
|
||||||
// if no view is given then switch to the first
|
// if no view is given then switch to the first
|
||||||
// view that supports a span of this type
|
// view that supports a span of this type
|
||||||
Ox.forEach(self.options.views[state.type][
|
Ox.forEach(self.options.views[state.type][
|
||||||
|
@ -486,9 +490,6 @@ Ox.URL = function(options) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
state.span = span;
|
|
||||||
parts.shift();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -514,25 +515,44 @@ Ox.URL = function(options) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function parseBeyondSpan() {
|
function parseBeyondSpan() {
|
||||||
|
Ox.print('pBS', state)
|
||||||
|
var sortKeyIds, sortParts;
|
||||||
|
if (parts.length) {
|
||||||
|
sortParts = parts[0].split(',');
|
||||||
|
sortKeyIds = Ox.map(self.options.sortKeys[state.type][
|
||||||
|
!state.item ? 'list' : 'item'
|
||||||
|
], function(sortKeys) {
|
||||||
|
return sortKeys.map(function(sortKey) {
|
||||||
|
return sortKey.id;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// test if sort keys match the given view,
|
||||||
|
// or any view if no view is given
|
||||||
|
Ox.forEach(
|
||||||
|
state.view ? [state.view]
|
||||||
|
: self.options.views[state.type][!state.item ? 'list' : 'item'],
|
||||||
|
function(view) {
|
||||||
|
if (sortKeyIds[view] && sortParts.every(function(part) {
|
||||||
|
return sortKeyIds[view].indexOf(part.replace(/^[\+-]/, '')) > -1;
|
||||||
|
})) {
|
||||||
|
if (!state.view) {
|
||||||
|
// set list or item view
|
||||||
|
state.view = view;
|
||||||
|
}
|
||||||
|
// sort
|
||||||
|
state.sort = parseSort(parts[0], state);
|
||||||
|
parts.shift();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
if (!state.view) {
|
if (!state.view) {
|
||||||
// set to default list or item view
|
// set to default list or item view
|
||||||
state.view = self.options.views[state.type][
|
state.view = self.options.views[state.type][
|
||||||
!state.item ? 'list' : 'item'
|
!state.item ? 'list' : 'item'
|
||||||
][0];
|
][0];
|
||||||
}
|
}
|
||||||
Ox.print('pBS', state)
|
|
||||||
var sortKeyIds = (self.options.sortKeys[state.type][
|
|
||||||
!state.item ? 'list' : 'item'
|
|
||||||
][state.view] || []).map(function(sortKey) {
|
|
||||||
return sortKey.id;
|
|
||||||
});
|
|
||||||
if (parts.length && parts[0].split(',').every(function(str) {
|
|
||||||
return sortKeyIds.indexOf(str.replace(/^[\+-]/, '')) > -1;
|
|
||||||
})) {
|
|
||||||
// sort
|
|
||||||
state.sort = parseSort(parts[0], state);
|
|
||||||
parts.shift();
|
|
||||||
}
|
|
||||||
if (parts.length) {
|
if (parts.length) {
|
||||||
// find
|
// find
|
||||||
state.find = parseFind(parts.join('/'));
|
state.find = parseFind(parts.join('/'));
|
||||||
|
@ -545,7 +565,13 @@ Ox.URL = function(options) {
|
||||||
return constructURL(state);
|
return constructURL(state);
|
||||||
};
|
};
|
||||||
|
|
||||||
that.parse = function(str, callback) {
|
that.parse = function() {
|
||||||
|
var str = arguments.length == 2 ? arguments[0]
|
||||||
|
: document.location.pathname
|
||||||
|
+ document.location.search
|
||||||
|
+ document.location.hash,
|
||||||
|
callback = arguments[arguments.length - 1];
|
||||||
|
Ox.print(str, callback)
|
||||||
parseURL(str, callback);
|
parseURL(str, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue