Блоги #1

Merged
rndtrash merged 64 commits from feature-blogs into master 2025-10-22 08:44:56 +03:00
5 changed files with 95 additions and 83 deletions
Showing only changes of commit 0643f48189 - Show all commits

View file

@ -28,6 +28,13 @@ export async function fetchPostsSorted(postComparer?: PostComparer) {
return sortedPosts; return sortedPosts;
}; };
// rndtrash: пришлось заменить `path.parse`, так как на стороне клиента его больше не реализуют
function getFilenameFromPath(path: string) {
const file = path.split("/").pop();
const dot = file?.lastIndexOf('.') ?? -1;
return dot === -1 ? file : file?.substring(0, file.lastIndexOf('.'));
}
export async function fetchPosts() { export async function fetchPosts() {
const allPostFiles = import.meta.glob('/src/blogs/*.md'); const allPostFiles = import.meta.glob('/src/blogs/*.md');
const iterablePostFiles = Object.entries(allPostFiles); const iterablePostFiles = Object.entries(allPostFiles);
@ -35,7 +42,7 @@ export async function fetchPosts() {
const allPosts: App.BlogPost[] = await Promise.all( const allPosts: App.BlogPost[] = await Promise.all(
iterablePostFiles.map(async ([filePath, resolver]) => { iterablePostFiles.map(async ([filePath, resolver]) => {
const { metadata }: any = await resolver(); const { metadata }: any = await resolver();
const { name } = path.parse(filePath); const name = getFilenameFromPath(filePath);
return { return {
slug: name, slug: name,

39
src/pages/index.md Normal file
View file

@ -0,0 +1,39 @@
# Кто мы?
__Tea Sanctuary__ — это в первую очередь коллектив друзей, разрабатывающих
проекты для души, для всеобщего пользования и даже на заказ. С
__8 июля 2017 года__ мы ведём публичную деятельность в сфере разработки ПО и развлечений.
__Tea Sanctuary__ — это также и сообщество единомышленников. Любовь к добротным
видеоиграм и пассивная агрессия к вычислительной технике у нас в крови. Когда-то сообщество
было закрытым и насчитывало около 50 участников, но впоследствии мы решили его расширить.
Станьте частью коллектива!
# Что делаем?
Наша главная страсть — это, конечно, видеоигры. Мы часто участвуем в так
называемых "гейм джемах" — конкурсах на разработку игр. Наши игры вы можете
оценить здесь: [RandomTrash](https://randomtrash.itch.io)
[FriendlyWithMeat](https://friendlywithmeat.itch.io).
Также мы ведём работу над нашим первым полноценным игровым проектом.
Следите за новостями в нашем [сообществе](https://teasanctuary.ru/discord)!
Отдельные участники нашего коллектива занимаются модификацией существующих игр,
добавляя в них новый контент. Например, __MegaZerg__ создаёт оригинальные карты
для такой бессмертной классики, как __Counter-Strike 1.6__ и __Half-Life Deathmatch__,
и выкладывает их на ресурс GameBanana: [kemist](https://gamebanana.com/members/2971042)
Мы размещаем игровые сервера, как постоянные, так и временные для различных событий.
Например, у нас есть сервер [Tea Sanctuary HLDM](https://hl.teasanctuary.ru),
где вы можете ознакомиться с новыми картами от всего сообщества Half-Life.
Не одними играми едины, за нашими плечами есть несколько прикладных программ,
созданных под заказ. Про них ничего особо рассказать не можем, но если вам надо
что-нибудь сделать — пишите нам!
# Как с вами связаться?
Общие вопросы можно задавать в [сообществе Tea Sanctuary](https://teasanctuary.ru/discord).
Там же можете написать личное сообщение администраторам.
Наши соцсети и почту для более важных обращений можно найти на странице [Контакты](/contact).

View file

@ -1,7 +0,0 @@
import { fetchPostsSorted, sortPostsByPostAndUpdateDate } from "$src/lib/util/Blogs";
const LATEST_POSTS_COUNT = 3;
export async function load() {
return { posts: (await fetchPostsSorted(sortPostsByPostAndUpdateDate)).slice(0, LATEST_POSTS_COUNT) };
}

View file

@ -1,9 +1,11 @@
<script lang="ts"> <script lang="ts">
import SocialButton from '$lib/components/SocialButton.svelte'; import SocialButton from '$lib/components/SocialButton.svelte';
import SocialHyperlink from '$lib/components/SocialHyperlink.svelte';
import { PUBLIC_TS_DISCORD } from '$env/static/public'; import { PUBLIC_TS_DISCORD } from '$env/static/public';
import BlogCard, { BlogCardSize } from '$src/lib/components/BlogCard.svelte'; import BlogCard, { BlogCardSize } from '$src/lib/components/BlogCard.svelte';
import { page } from '$app/state'; import { page } from '$app/state';
import type { PageData } from './$types';
export let data: PageData;
</script> </script>
<svelte:head> <svelte:head>
@ -93,80 +95,34 @@
</div> </div>
</section> </section>
<section class="flex justify-center bg-slate-50 text-slate-950"> <article
<div class="prose
class="flex w-5xl max-w-screen flex-col flex-nowrap gap-12 p-2 px-2 pt-12 pb-12 text-base sm:text-xl" sm:prose-xl
> prose-slate
<section id="who-are-we"> prose-code:break-words
<h1>Кто мы?</h1> prose-pre:drop-shadow-md
<div class="text-justify"> prose-headings:font-disket
<b>Tea Sanctuary</b> &mdash; это в первую очередь коллектив друзей, разрабатывающих prose-headings:my-4
проекты для души, для всеобщего пользования и даже на заказ. С prose-headings:font-bold
<b>8 июля 2017 года</b> мы ведём публичную деятельность в сфере разработки ПО и развлечений. prose-headings:text-slate-950
</div> prose-h1:text-2xl
<br /> prose-h1:sm:text-4xl
<div class="text-justify"> prose-h2:text-xl
<b>Tea Sanctuary</b> &mdash; это также и сообщество единомышленников. Любовь к добротным prose-h2:sm:text-3xl
видеоиграм и пассивная агрессия к вычислительной технике у нас в крови. Когда-то сообщество prose-p:text-justify
было закрытым и насчитывало около 50 участников, но впоследствии мы решили его расширить. prose-p:mt-0
Станьте частью коллектива! prose-p:mb-8
</div> bg-slate-50
</section> pt-8
<section id="what-are-we-doing"> pb-4
<h1>Что делаем?</h1> text-base
<div class="text-justify"> text-slate-950
Наша главная страсть &mdash; это, конечно, видеоигры. Мы часто участвуем в так px-2 sm:px-4 sm:text-xl"
называемых "гейм джемах" &mdash; конкурсах на разработку игр. Наши игры вы можете >
оценить здесь: <section class="flex max-w-5xl flex-col flex-nowrap mx-auto">
<SocialHyperlink href="https://randomtrash.itch.io">RandomTrash</SocialHyperlink> <svelte:component this={data.content} />
<SocialHyperlink href="https://friendlywithmeat.itch.io/"> </section>
FriendlyWithMeat </article>
</SocialHyperlink>. Также мы ведём работу над нашим первым полноценным игровым
проектом. Следите за новостями в нашем
<SocialHyperlink href={PUBLIC_TS_DISCORD}>сообществе</SocialHyperlink>!
</div>
<br />
<div class="text-justify">
Отдельные участники нашего коллектива занимаются модификацией существующих игр,
добавляя в них новый контент. Например, <b>MegaZerg</b> создаёт оригинальные карты
для такой бессмертной классики, как Counter-Strike 1.6, и выкладывает их на ресурс
GameBanana:
<SocialHyperlink href="https://gamebanana.com/members/2971042">
kemist
</SocialHyperlink>
</div>
<br />
<div class="text-justify">
Мы размещаем игровые сервера, как постоянные, так и временные для различных событий.
Например, у нас есть сервер
<SocialHyperlink href="https://hl.teasanctuary.ru">
Tea Sanctuary HLDM
</SocialHyperlink>, где вы можете ознакомиться с новыми картами от всего сообщества
Half-Life.
</div>
<br />
<div class="text-justify">
Не одними играми едины, за нашими плечами есть несколько прикладных программ,
созданных под заказ. Про них ничего особо рассказать не можем, но если вам надо
что-нибудь сделать &mdash; пишите нам!
</div>
</section>
<section id="how-can-you-contact-us">
<h1>Как с вами связаться?</h1>
<div class="text-justify">
Общие вопросы можно задавать в
<SocialHyperlink href={PUBLIC_TS_DISCORD}>
сообществе Tea Sanctuary
</SocialHyperlink>. Там же можете написать личное сообщение администраторам.
</div>
<br />
<div class="text-justify">
Наши соцсети и почту для более важных обращений можно найти на странице
<SocialHyperlink href="/contact">Контакты</SocialHyperlink>.
</div>
</section>
</div>
</section>
<style> <style>
@import '$src/app.css'; @import '$src/app.css';

17
src/routes/+page.ts Normal file
View file

@ -0,0 +1,17 @@
import { fetchPostsSorted, sortPostsByPostAndUpdateDate } from "$src/lib/util/Blogs";
const LATEST_POSTS_COUNT = 3;
export async function load() {
let md: any
try {
md = await import("$src/pages/index.md");
} catch (ex) {
throw "Не удалось найти текст для главной страницы";
}
console.log("TEST", md.default);
return {
content: md.default,
posts: (await fetchPostsSorted(sortPostsByPostAndUpdateDate)).slice(0, LATEST_POSTS_COUNT)
};
}