725 слов
4 минут
Шпаргалка по Markdown и Shirone

Полный обзор инструментов разметки в Shirone. От стандартного Markdown до эксклюзивных расширений темы — всё, что нужно для красивых и информативных постов.


1. Форматирование текста и акценты#

Базовые стили:

  • Полужирное начертание (**bold**)
  • Курсивное выделение (*italic*)
  • Полужирный курсив (***bold italic***)
  • Зачёркнутый текст (~~strikethrough~~)
  • Встроенный код (`inline code`)
  • Индексы: H2O, 210 = 1024
  • Скрытый ответ:

Маркеры выделения (==text==) — Shirone поддерживает семантические маркеры без лишнего HTML:

  • Основной акцент темы (primary)
  • Вторичный, ненавязчивый сигнал
  • Третичный редакторский акцент
  • Ошибка или критическая ситуация
  • Практический совет читателю

Аннотации к тексту ([+label]) — Astro строит большинство страниц заранее, гидратируя только интерактивные острова по требованию.

Сноски — блог работает на Astro1 с темой Shirone2.


2. Уведомления (Callouts)#


3. Структурированный контент#

Шаги (:::steps) — для пошаговых инструкций:

Запуск Shirone-блога

  1. Установить зависимости

    Запустите менеджер пакетов из корня репозитория.

    Terminal window
    pnpm.cmd install
  2. Запустить dev-сервер

    Сайт будет доступен на localhost:4321.

    Terminal window
    pnpm.cmd astro dev --port 4321
  3. Проверить типы и Astro

    Убедитесь, что диагностика чиста перед публикацией.

    Terminal window
    npx.cmd astro check
    pnpm.cmd type-check
  4. Собрать продакшн-сборку

    Генерирует статические страницы и поисковый индекс.

    Terminal window
    pnpm.cmd build

Раскрывающиеся панели (:::collapse) — для FAQ и дополнительных деталей:

Почему Astro, а не Next.js?

Astro генерирует чистый статический HTML без клиентского JavaScript по умолчанию. Это означает мгновенную загрузку и отличный SEO. Интерактивность добавляется точечно через острова.

Что такое M3E?

Material 3 Extended — дизайн-система Shirone, развивающая спецификацию Google Material 3. Использует динамические HCT-палитры, токены формы (--shape-corner-*) и токены движения (--m3e-duration-*).

Зачем нужен Pagefind?

Pagefind — это поиск на стороне клиента без серверной части. Он строит индекс во время сборки и весит меньше 50 КБ. Подходит для статических сайтов с нулевым backend.


4. Кодовая база (Expressive Code)#

TypeScript — асинхронный клиент с повторными попытками:

src/utils/fetchWithRetry.ts
interface FetchOptions {
retries?: number;
backoffMs?: number;
}
export async function fetchWithRetry<T>(
url: string,
options: FetchOptions = {},
): Promise<T> {
const { retries = 3, backoffMs = 500 } = options;
// const res = await fetch(url);
for (let attempt = 1; attempt <= retries; attempt++) {
try {
const response = await fetch(url);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return (await response.json()) as T;
} catch (err) {
if (attempt === retries) throw err;
await new Promise((r) => setTimeout(r, backoffMs * attempt));
}
}
throw new Error("Unexpected end of retries loop");
}

Многоязычные вкладки (:::code-group):

package main
import (
"fmt"
"sync"
)
func worker(id int, jobs <-chan int, results chan<- int, wg *sync.WaitGroup) {
defer wg.Done()
for j := range jobs {
results <- j * 2
fmt.Printf("worker %d processed job %d\n", id, j)
}
}
use tokio::net::TcpListener;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let listener = TcpListener::bind("127.0.0.1:8080").await?;
loop {
let (mut socket, _) = listener.accept().await?;
tokio::spawn(async move {
let mut buf = [0; 1024];
while let Ok(n) = socket.read(&mut buf).await {
if n == 0 { return; }
let _ = socket.write_all(&buf[..n]).await;
}
});
}
}
import torch
import torch.nn as nn
class ConvNet(nn.Module):
def __init__(self):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 32, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2, 2)
)
self.fc = nn.Linear(32 * 16 * 16, 10)
def forward(self, x):
x = self.features(x)
return self.fc(x.view(x.size(0), -1))

Интерактивное дерево кода (:::code-tree) — IDE-подобная навигация по файлам:

Shirone M3E — пример атома
src/Button.svelte
<script lang="ts">
let { label = "Нажмите", variant = "filled" } = $props();
</script>
<button class="m3-btn m3-btn--{variant}">{label}</button>

5. Файловые деревья#

Структура проекта (:::file-tree) — с диффами ++/-- и комментариями:

nullvert.uz — структура блога
  • shirones
    • config
      • siteConfig.tsглавная конфигурация сайта
      • profileConfig.ts
      • musicConfig.ts
    • content
      • posts
        • markdown-showcase
          • +index.mdэтот пост
          • keyboard.webp
      • spec
        • credits-and-licenses.md
  • src
    • components
      • organisms
        • Footer.astro
    • pages
      • credits-and-licenses.astro
  • public
    • assets
      • images
      • music
  • package.json

Из терминала (```file-tree):

dist/
  • dist
    • _astro
      • index.css
      • client.js
    • posts
      • markdown-showcase
        • index.html
    • sitemap-index.xml
    • pagefind
      • pagefind.js

6. Формулы и математика (KaTeX)#

Уравнение Шрёдингера: iℏ∂∂tΨ(r,t)=[−ℏ22m∇2+V(r,t)]Ψ(r,t)i\hbar \frac{\partial}{\partial t}\Psi(\mathbf{r},t) = \left [ -\frac{\hbar^2}{2m}\nabla^2 + V(\mathbf{r},t) \right ] \Psi(\mathbf{r},t)

Формула Байеса: P(A∣B)=P(B∣A)⋅P(A)P(B)P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)}

Реакция термоядерного синтеза: \ce12H+13H−>24He+01n+17.6MeV\ce{^2_1H + ^3_1H -> ^4_2He + ^1_0n + 17.6 MeV}


7. Диаграммы (Mermaid)#

sequenceDiagram
    autonumber
    actor User as Читатель
    participant Browser as Браузер
    participant CDN as Cloudflare Edge
    participant Pagefind as Pagefind

    User->>Browser: Переход на nullvert.uz
    Browser->>CDN: GET /posts/markdown-showcase/
    CDN-->>Browser: Статический HTML + CSS (кэш)
    User->>Browser: Поиск по сайту
    Browser->>Pagefind: Запрос к локальному индексу
    Pagefind-->>Browser: Результаты без сетевых запросов

8. Интеграция с GitHub#

Репозиторий фреймворка, на котором работает блог:

withastroastro

Компонентный движок интерфейса:

sveltejssvelte


9. Изображения#

Одиночное изображение с подписью:

Атмосферное игровое рабочее место с неоновой подсветкой
Игровой сетап (Unsplash License)

Сетка изображений ([grid]):

[grid] Футуристическая абстракция Исходный код на экране Геймпад и консоль [/grid]


10. Таблица возможностей#

КатегорияРасширениеСинтаксисГидратация JS
СтруктураFile Tree:::file-treeНет
СтруктураCode Tree:::code-treeНет
НавигацияSteps:::stepsНет
UXCollapse:::collapseНет
АкцентыMarker==text==Нет
UXSpoiler:spoiler[text]Минимальная
ПоясненияAnnotations[+label]Нет
ДиаграммыMermaid```mermaidНет
ФормулыKaTeX$$...$$Нет
ВиджетыGitHub Card::github{repo}Ленивая

Все расширения рендерятся в семантический HTML во время сборки и следуют токенам M3E.

Footnotes#

  1. Astro — статический генератор с Islands Architecture, написанный на TypeScript. ↩

  2. Shirone — M3E-совместимая тема для Astro с Svelte 5, Tailwind 4 и богатым набором Markdown-расширений. ↩

Шпаргалка по Markdown и Shirone
https://nullvert.uz/posts/markdown-showcase/
Автор
nullvert
Опубликовано
2026-08-08
Лицензия
CC BY-NC-SA 4.0

Поделиться записью

Создайте карточку для публикации или скопируйте прямую ссылку.