diff --git a/xtrn/go-for/go-for.js b/xtrn/go-for/go-for.js index 2ce583b65ab31bb61a1d9756bfd413633d2ab1b6..3326f56b55ff75d18216dfbf159e2d7f0f756c63 100644 --- a/xtrn/go-for/go-for.js +++ b/xtrn/go-for/go-for.js @@ -50,7 +50,8 @@ const state = { history_idx: -1, host: 'gopher.floodgap.com', port: 70, - selector: '' + selector: '', + fn: '' }; function is_link(str) { @@ -186,24 +187,34 @@ function go_for(host, port, selector, type, skip_cache) { state.host = host; state.port = port; state.selector = selector; + set_address(); set_status(format('%s %s:%s %s', type_map[type], host, port, selector)); return fn; } +function go_history() { + const loc = state.history[state.history_idx]; + state.fn = go_for(loc.host, loc.port, loc.selector, loc.type); + print_document(false); + if (loc.type == '1') { + lowlight(state.doc[state.item], state.item); + state.item = loc.item; + state.history[state.history_idx].item = loc.item; + highlight(state.doc[state.item], state.item); + scrollbox.scroll_into_view(state.item); + } +} + function go_back() { if (state.history_idx <= 0) return; state.history_idx--; - const loc = state.history[state.history_idx]; - const fn = go_for(loc.host, loc.port, loc.selector, loc.type); - print_document(fn); + go_history(); } function go_forward() { if (state.history_idx >= state.history.length - 1) return; state.history_idx++; - const loc = state.history[state.history_idx]; - const fn = go_for(loc.host, loc.port, loc.selector, loc.type); - print_document(fn); + go_history(); } function go_get(host, port, selector, type, skip_history, skip_cache) { @@ -214,31 +225,30 @@ function go_get(host, port, selector, type, skip_history, skip_cache) { host: host, port: port, selector: selector, - type: type + type: type, + item: -1 }; } - const fn = go_for(host, port, selector, type, skip_cache); - print_document(fn); + state.fn = go_for(host, port, selector, type, skip_cache); + print_document(true); } function next_link() { - var ret = state.item; for (var n = state.item + 1; n < state.doc.length; n++) { if (!is_link(state.doc[n].type)) continue; - ret = n; + state.item = n; + state.history[state.history_idx].item = n; break; } - return ret; } function previous_link() { - var ret = state.item; for (var n = state.item - 1; n >= 0; n--) { if (!is_link(state.doc[n].type)) continue; - ret = n; + state.item = n; + state.history[state.history_idx].item = n; break; } - return ret; } function lowlight(e, i) { @@ -263,7 +273,7 @@ function highlight(e, i) { function set_address() { const a = console.attributes; console.home(); - console.putmsg(format('\0014\001h\001w%s:%s%s', state.host, state.port, state.selector)); + console.putmsg(format('\0014\001h\001w%s:%s %s', state.host, state.port, state.selector)); console.cleartoeol(BG_BLUE|WHITE); console.attributes = a; } @@ -285,12 +295,12 @@ function reset_display() { set_status(''); } -function print_document(fn) { +function print_document(auto_highlight) { if (state.item_type == '1') { var item; var line; reset_display(); - const f = new File(fn); + const f = new File(state.fn); var arr = []; f.open('r'); while (!f.eof) { @@ -312,14 +322,17 @@ function print_document(fn) { } f.close(); scrollbox.load(arr); - state.item = next_link(); - highlight(state.doc[state.item], state.item); + if (auto_highlight) { + next_link(); + highlight(state.doc[state.item], state.item); + } } else if (state.item_type == '0' || state.item_type == '6') { - scrollbox.load(fn); + scrollbox.load(state.fn); } else if (['4', '5', '9', 'g', 'I'].indexOf(state.item_type) > -1) { + console.clear(BG_BLACK|LIGHTGRAY); + bbs.send_file(state.fn); reset_display(); - bbs.send_file(fn); - set_status(''); + go_back(); } } @@ -336,7 +349,7 @@ function main() { case '\t': if (state.item_type == '1') { lowlight(state.doc[state.item], state.item); - state.item = next_link(); + next_link(); highlight(state.doc[state.item], state.item); scrollbox.scroll_into_view(state.item); } @@ -345,7 +358,7 @@ function main() { case '`': if (state.item_type == '1') { lowlight(state.doc[state.item], state.item); - state.item = previous_link(); + previous_link(); highlight(state.doc[state.item], state.item); scrollbox.scroll_into_view(state.item); } @@ -396,6 +409,14 @@ function main() { case 'h': go_get('go-for', 0, 'help.txt', '0'); break; + case 'd': + if (state.item_type == '0' || state.item_type == '6') { + console.clear(BG_BLACK|LIGHTGRAY); + bbs.send_file(state.fn); + reset_display(); + go_get(state.host, state.port, state.selector, state.item_type, true, false); + } + break; default: actioned = false; break;