
Полный обзор инструментов разметки в 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-блога
Установить зависимости
Запустите менеджер пакетов из корня репозитория.
Terminal window pnpm.cmd installЗапустить dev-сервер
Сайт будет доступен на
localhost:4321.Terminal window pnpm.cmd astro dev --port 4321Проверить типы и Astro
Убедитесь, что диагностика чиста перед публикацией.
Terminal window npx.cmd astro checkpnpm.cmd type-checkСобрать продакшн-сборку
Генерирует статические страницы и поисковый индекс.
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 — асинхронный клиент с повторными попытками:
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 torchimport 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-подобная навигация по файлам:
<script lang="ts"> let { label = "Нажмите", variant = "filled" } = $props();</script>
<button class="m3-btn m3-btn--{variant}">{label}</button>5. Файловые деревья
Структура проекта (:::file-tree) — с диффами ++/-- и комментариями:
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
_astro
- index.css
- client.js
posts
markdown-showcase
- index.html
- sitemap-index.xml
pagefind
- pagefind.js
6. Формулы и математика (KaTeX)
Уравнение Шрёдингера:
Формула Байеса:
Реакция термоядерного синтеза:
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
Репозиторий фреймворка, на котором работает блог:
Компонентный движок интерфейса:
9. Изображения
Одиночное изображение с подписью:
Сетка изображений ([grid]):
[grid]
[/grid]
10. Таблица возможностей
| Категория | Расширение | Синтаксис | Гидратация JS |
|---|---|---|---|
| Структура | File Tree | :::file-tree | Нет |
| Структура | Code Tree | :::code-tree | Нет |
| Навигация | Steps | :::steps | Нет |
| UX | Collapse | :::collapse | Нет |
| Акценты | Marker | ==text== | Нет |
| UX | Spoiler | :spoiler[text] | Минимальная |
| Пояснения | Annotations | [+label] | Нет |
| Диаграммы | Mermaid | ```mermaid | Нет |
| Формулы | KaTeX | $$...$$ | Нет |
| Виджеты | GitHub Card | ::github{repo} | Ленивая |
Все расширения рендерятся в семантический HTML во время сборки и следуют токенам M3E.
Footnotes
Поделиться записью
Создайте карточку для публикации или скопируйте прямую ссылку.
Обновлено , 57 дн. назад
Часть информации в этой записи могла устареть