Download in English
PDF 379 pp. 22 MiB
Скачать на русском
PDF 453 стр. 26 MiB
Released by kiwi arXiv & kniganews in 2023
English translation by Eline Cat
HTML; } function articles($ctx, array $posts, PostLanguage $selected_lang): string { if (empty($posts)) return $ctx->articles_empty($selected_lang); $expl = $ctx->lang('blog_expl_'.$selected_lang->value); $expl = nl2br($expl); return <<{$expl}
{$ctx->articles_posts_table($posts, $selected_lang)}
HTML; } function articles_empty($ctx, PostLanguage $selected_lang) { return << {$ctx->lang('blog_no')} {$ctx->articles_right_links($selected_lang->value)} HTML; } function articles_posts_table($ctx, array $posts, PostLanguage $selected_lang): string { $ctx->year = 3000; return << {$ctx->for_each($posts, fn($post, $i) => $ctx->articles_post_row($i, $post, $selected_lang))} HTML; } function articles_post_row($ctx, int $index, Post $post, PostLanguage $selected_lang): string { $year = $post->getYear(); $date = $post->getDate(); $url = $post->getUrl($selected_lang); $pt = $post->getText($selected_lang); $title = $pt->title; return <<if_true($ctx->year > $year, fn() => $ctx->articles_index_year_line($year, $index === 0, $selected_lang->value))}
{$date}
{$title}
HTML; } function articles_index_year_line($ctx, $year, $show_right_links, string $selected_lang): string { $ctx->year = $year; return << {$year} {$ctx->if_true($show_right_links, fn() => $ctx->articles_right_links($selected_lang))} HTML; } function articles_right_links($ctx, string $selected_lang) { $links = [ ['url' => $selected_lang != 'en' ? '/articles/' : null, 'label' => lang('lang_en')], ['url' => $selected_lang != 'ru' ? '/articles/?lang=ru' : null, 'label' => lang('lang_ru')], ]; if (is_admin()) { $links[] = ['url' => '/articles/write/?lang='.$selected_lang, 'label' => 'write']; } return << {$ctx->for_each($links, fn($link, $index) => $ctx->articles_right_link($link['url'], $link['label'], $index))} HTML; } function articles_right_link($ctx, $url, string $label, int $index) { $buf = ''; if ($index > 0) $buf .= ' | '; $buf .= !$url ? $label : ''.$label.''; return $buf; } // any page // -------- function page($ctx, $page_url, $short_name, $unsafe_html) { $html = << {$ctx->if_admin($ctx->page_admin_links, $page_url, $short_name)}
{$unsafe_html}
HTML; return [$html, js_markdownThemeChangeListener()]; } function page_admin_links($ctx, $url, $short_name) { return << {$ctx->lang('edit')} {$ctx->lang('delete')} HTML; } // post page // --------- function post($ctx, $id, $title, $unsafe_html, $unsafe_toc_html, $date, $visible, $url, string $lang, $other_langs, string $source_url) { $html = <<
{$ctx->bc([ ['url' => '/articles/?lang='.$lang, 'text' => $ctx->lang('articles')] ])}

{$title}

{$unsafe_html}
{$ctx->if_true($unsafe_toc_html, $ctx->postToc, $unsafe_toc_html)}
HTML; return [$html, js_markdownThemeChangeListener()]; } function post_other_langs($ctx, $url, $other_langs) { $buf = ''; foreach ($other_langs as $lang) { $buf .= ' | '.$ctx->lang('blog_read_in_'.$lang).''; } return $buf; } function postToc($ctx, $unsafe_toc_html) { return <<
{$ctx->lang('toc')}
{$unsafe_toc_html}
HTML; } function post_admin_links($ctx, $url, $id, string $lang) { return <<{$ctx->lang('edit')} | {$ctx->lang('delete')} HTML; } function js_markdownThemeChangeListener() { return << div'); if (!div) { console.warn('could not found a>div on this node:', node); continue; } var style = div.getAttribute('style'); if (isDark) { style = style.replace(/(a[\d]+x[\d]+)\.jpg/, '$1_dark.jpg'); } else { style = style.replace(/(a[\d]+x[\d]+)_dark\.jpg/, '$1.jpg'); } div.setAttribute('style', style); } }); JS; }