$mode]); return ( '?' . \implode( '&', \array_map( fn ($key) => \rosavox\helpers\string_\coin( '{{key}}={{value}}', [ 'key' => $key, 'value' => $a[$key], ] ), \array_keys($a) ) ) ); } /** */ function nav(string $mode, array $args) : void { \rosavox\helpers\misc\navigate(make_link($mode, $args)); } /** */ function render_list() : string { return \rosavox\helpers\misc\render( 'docs-list', [ 'label_make' => \rosavox\helpers\misc\translate('action.make'), 'link_make' => make_link('make', []), 'entries' => \implode( "\n", \array_map( fn ($entry) => \rosavox\helpers\misc\render( 'docs-list-entry', [ 'label_read' => \rosavox\helpers\misc\translate('action.read'), 'value_text' => $entry['value']['title'], 'value_link_open' => make_link('edit', ['id' => \sprintf('%u', $entry['id'])]), 'value_link_read' => \rosavox\services\doc\readable_path($entry['id']), 'area_download_readable' => ( (fn ($name, $path) => ( (! \file_exists($path)) ? \rosavox\helpers\misc\render( 'state-waiting', [ 'info' => \rosavox\helpers\misc\translate('state.generating'), ] ) : \rosavox\helpers\misc\render( 'download', [ 'text' => \rosavox\helpers\misc\translate('item.readable.short'), 'tooltip' => \rosavox\helpers\string_\coin( '{{item}} {{action}}', [ 'action' => \rosavox\helpers\misc\translate('action.download'), 'item' => \rosavox\helpers\misc\translate('item.readable.long'), ] ), 'link' => $path, 'name' => \rosavox\helpers\string_\coin( '{{name}}.md', [ 'name' => $name, ] ), 'type' => 'text/markdown', ] ) )) ( \rosavox\services\doc\name($entry['id']), \rosavox\services\doc\readable_path($entry['id']) ) ), 'area_download_audible' => ( (fn ($name, $path) => ( (! \file_exists($path)) ? \rosavox\helpers\misc\render( 'state-waiting', [ 'info' => \rosavox\helpers\misc\translate('state.generating'), ] ) : \rosavox\helpers\misc\render( 'download', [ 'text' => \rosavox\helpers\misc\translate('item.audible.short'), 'tooltip' => \rosavox\helpers\string_\coin( '{{item}} {{action}}', [ 'action' => \rosavox\helpers\misc\translate('action.download'), 'item' => \rosavox\helpers\misc\translate('item.audible.long'), ] ), 'link' => $path, 'name' => \rosavox\helpers\string_\coin( '{{name}}.oga', [ 'name' => $name, ] ), 'type' => 'audio/ogg', ] ) )) ( \rosavox\services\doc\name($entry['id']), \rosavox\services\doc\audible_path($entry['id']) ) ), 'area_hear' => ( (fn ($name, $path) => ( (! \file_exists($path)) ? \rosavox\helpers\misc\render( 'state-waiting', [ 'info' => \rosavox\helpers\misc\translate('state.generating'), ] ) : \rosavox\helpers\misc\render( 'player', [ 'source_path' => $path, ] ) )) ( \rosavox\services\doc\name($entry['id']), \rosavox\services\doc\audible_path($entry['id']) ) ), ] ), \rosavox\services\doc\list_() ) ), ] ); } /** */ function render_edit(?int $id) : string { $doc = ( ($id === null) ? \rosavox\services\doc\empty_() : \rosavox\services\doc\read($id) ); return \rosavox\helpers\misc\render( 'docs-edit', [ 'label_action_back' => \rosavox\helpers\misc\translate('action.back'), 'label_action_save' => \rosavox\helpers\misc\translate('action.save'), 'label_action_delete' => \rosavox\helpers\misc\translate('action.delete'), 'label_doc_title' => \rosavox\helpers\misc\translate('domain.doc.title'), 'label_doc_authors' => \rosavox\helpers\misc\translate('domain.doc.authors'), 'label_doc_content' => \rosavox\helpers\misc\translate('domain.doc.content'), 'label_doc_reasoning' => \rosavox\helpers\misc\translate('domain.doc.reasoning'), 'value_action_back' => make_link('list', []), 'value_action_save' => make_link('save', (($id === null) ? [] : ['id' => \strval($id)])), 'value_action_delete' => make_link('delete', (($id === null) ? [] : ['id' => \strval($id)])), 'value_doc_title' => $doc['title'], 'value_doc_authors' => \implode(', ', $doc['authors']), 'value_doc_content' => $doc['content'], 'value_doc_reasoning' => ($doc['reasoning'] ?? ''), ] ); } ?>