X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/59cf25c47fbda22f3f4e14399f0436cc6ed2c56f..360af322bb3316c2c52401b28643793d3f9a609c:/cgi/macros-disorder.c diff --git a/cgi/macros-disorder.c b/cgi/macros-disorder.c index 6348f47..29835bb 100644 --- a/cgi/macros-disorder.c +++ b/cgi/macros-disorder.c @@ -486,7 +486,7 @@ static int exp_isqueue(int attribute((unused)) nargs, return mx_bool_result(output, !!dcgi_queue); } -/*$ @isrecent@ +/*$ @isrecent * * Expands to "true" if there the recently played list is nonempty, otherwise * "false". @@ -581,7 +581,7 @@ static int exp_transform(int nargs, return sink_writes(output, cgi_sgmlquote(t)) < 0 ? -1 : 0; } -/*$ @enabled@ +/*$ @enabled * * Expands to "true" if playing is enabled, otherwise "false". */ @@ -680,7 +680,7 @@ static int exp_paused(int attribute((unused)) nargs, && dcgi_playing->state == playing_paused)); } -/*$ @state{ID}@ +/*$ @state{ID} * * Expands to the current state of track ID. */ @@ -695,7 +695,22 @@ static int exp_state(int attribute((unused)) nargs, return 0; } -/*$ @right{RIGHT}{WITH-RIGHT}{WITHOUT-RIGHT}@ +/*$ @origin{ID} + * + * Expands to the current origin of track ID. + */ +static int exp_origin(int attribute((unused)) nargs, + char **args, + struct sink *output, + void attribute((unused)) *u) { + struct queue_entry *q = dcgi_findtrack(args[0]); + + if(q) + return sink_writes(output, track_origins[q->origin]) < 0 ? -1 : 0; + return 0; +} + +/*$ @right{RIGHT}{WITH-RIGHT}{WITHOUT-RIGHT} * * Expands to WITH-RIGHT if the current user has right RIGHT, otherwise to * WITHOUT-RIGHT. The WITHOUT-RIGHT argument may be left out. @@ -844,24 +859,36 @@ static int exp__files_dirs(int nargs, /* Get the list */ if(fn(dcgi_client, dir, re, &tracks, &ntracks)) return 0; - /* Sort it. NB trackname_transform() does not go to the server. */ - tsd = tracksort_init(ntracks, tracks, type); - /* Expand the subsiduary templates. We chuck in @sort and @display because - * it is particularly easy to do so. */ - for(n = 0; n < ntracks; ++n) - if((rc = mx_expand(mx_rewritel(m, - "index", make_index(n), - "parity", n % 2 ? "odd" : "even", - "track", tsd[n].track, - "first", n == 0 ? "true" : "false", - "last", n + 1 == ntracks ? "false" : "true", - "sort", tsd[n].sort, - "display", tsd[n].display, - (char *)0), - output, u))) - return rc; + if(type) { + /* Sort it. NB trackname_transform() does not go to the server. */ + tsd = tracksort_init(ntracks, tracks, type); + /* Expand the subsiduary templates. We chuck in @sort and @display because + * it is particularly easy to do so. */ + for(n = 0; n < ntracks; ++n) + if((rc = mx_expand(mx_rewritel(m, + "index", make_index(n), + "parity", n % 2 ? "odd" : "even", + "track", tsd[n].track, + "first", n == 0 ? "true" : "false", + "last", n + 1 == ntracks ? "false" : "true", + "sort", tsd[n].sort, + "display", tsd[n].display, + (char *)0), + output, u))) + return rc; + } else { + for(n = 0; n < ntracks; ++n) + if((rc = mx_expand(mx_rewritel(m, + "index", make_index(n), + "parity", n % 2 ? "odd" : "even", + "track", tracks[n], + "first", n == 0 ? "true" : "false", + "last", n + 1 == ntracks ? "false" : "true", + (char *)0), + output, u))) + return rc; + } return 0; - } /*$ @tracks{DIR}{RE}{TEMPLATE} @@ -921,14 +948,12 @@ static int exp__search_shim(disorder_client *c, const char *terms, * - @parity: "even" or "odd" alternately * - @first: "true" on the first directory and "false" otherwise * - @last: "true" on the last directory and "false" otherwise - * - @sort: the sort key for this track - * - @display: the UNQUOTED display string for this track */ static int exp_search(int nargs, const struct mx_node **args, struct sink *output, void *u) { - return exp__files_dirs(nargs, args, output, u, "track", exp__search_shim); + return exp__files_dirs(nargs, args, output, u, NULL, exp__search_shim); } /*$ @label{NAME} @@ -963,7 +988,7 @@ static int exp_breadcrumbs(int attribute((unused)) nargs, return rc; /* Reject relative paths */ if(dir[0] != '/') { - error(0, "breadcrumbs: '%s' is a relative path", dir); + disorder_error(0, "breadcrumbs: '%s' is a relative path", dir); return 0; } /* Skip the root */ @@ -999,6 +1024,7 @@ void dcgi_expansions(void) { mx_register("label", 1, 1, exp_label); mx_register("length", 1, 1, exp_length); mx_register("movable", 1, 2, exp_movable); + mx_register("origin", 1, 1, exp_origin); mx_register("part", 2, 3, exp_part); mx_register("paused", 0, 0, exp_paused); mx_register("pref", 2, 2, exp_pref);