Приложение на winow
Этот сайт — живой пример приложения на ките. Мини-проект на winow 0.14.1 и ОСени 5: точка входа, три контроллера, четыре контракта инсталляции и движок, который печатает страницы из markdown.
Запуск#
cd документация
opm install -l // winow, ОСень, oscript-md — в ./oscript_modules
oscript main.os // http://localhost:3333
oscript main.os --порт 8080
Кит подключается из рабочего дерева репозитория (#Использовать ".."): правка компонента видна в документации после перезапуска, без сборки пакета. Страницы читаются с диска на каждый запрос — правка markdown видна после обновления страницы.
Устройство#
документация/
main.os // точка входа: настройки, поделка, сервер
packagedef // зависимости мини-проекта
проверка.os // проверка страниц без сервера
страницы/*.md // страницы документации
статика/ // лист, скрипт и знак сайта
src/Классы/движок/ // печать страниц: markdown, образцы, справка
src/Классы/сайт/ // контроллеры и контракты инсталляции
Точка входа#
Настройки winow передаются ОСени провайдером-соответствием: каталог классов, порт, отключённый автостарт. Кит подключается до создания поделки — желудём становится только класс, известный контейнеру к сборке.
#Использовать autumn
#Использовать winow
#Использовать oscript-md
#Использовать ".."
Детальки = Новый Соответствие();
Детальки.Вставить("winow.Порт", 3333);
Детальки.Вставить("winow.КаталогСПриложениями", ОбъединитьПути(КаталогПроекта, "src"));
Детальки.Вставить("winow.АвтоСтарт", Ложь);
Совет = Новый СоветДругогоМастера();
Совет.ПолучитьСтроительМенеджераПараметров().ДобавитьПровайдерСоответствие(Детальки, 3, "документация");
Поделка = Новый Поделка(Совет);
Поделка.ЗапуститьПриложение();
Поделка.НайтиЖелудь("ВебСервер").Старт();
Контроллеры#
Страницы. &Контроллер("/") отдаёт обзор и любую страницу оглавления. Содержимое собирает желудь Документация, страницу вокруг — каркас кита.
&ТочкаМаршрута("{страница}")
Процедура Страница(Ответ, страница, КукиЗапроса, ПутьЗапроса) Экспорт
Контекст = Каркас.КонтекстСтраницы(Неопределено, КукиЗапроса, Ложь, Ложь, ПутьЗапроса);
Готовая = Сайт.Страница(страница, ВыборВида.ПоКукам(КукиЗапроса));
Ответ.ТелоТекст = Каркас.Страница(Готовая.Заголовок, Готовая.Содержимое, Контекст,
Готовая.РазделыЭкрана);
КонецПроцедуры
Статика. &Контроллер("/static") отдаёт файлы по белому списку АктивыСтатики: имя не из списка — 404 до обращения к диску. Адрес несёт отпечаток содержимого, поэтому файл кэшируется навсегда, а повторный запрос с If-None-Match получает 304.
&ТочкаМаршрута("{файл}")
Процедура Отдать(Ответ, файл, ЗаголовкиЗапроса) Экспорт
ТипКонтента = Активы.ТипКонтента(файл);
Если ТипКонтента = Неопределено Тогда
Ответ.УстановитьСостояниеНеНайдено();
Возврат;
КонецЕсли;
Ответ.Заголовки["Cache-Control"] = "public, max-age=31536000, immutable";
Ответ.Заголовки["Content-Type"] = ТипКонтента;
Ответ.УстановитьТелоИзФайла(Активы.ПутьНаДиске(файл));
КонецПроцедуры
Оформление. &Контроллер("/вид") принимает POST переключателя темы из шапки и формы акцента, пишет cookie через ВыборОформления.ЗаписатьКуку и возвращает посетителя туда, откуда он пришёл. Префикс контроллера не должен совпадать с адресом страницы: контроллер с префиксом /оформление закрыл бы страницу «Своё оформление».
Контракты инсталляции#
Четыре желудя с пометкой &Верховный подменяют пустые реализации кита по прозвищу:
ОбрамлениеДокументации— знак, дороги «Начало, Основы, Компоненты, Холст, Приложение», подпись подвала, свой лист и скрипт, слот единого меню;СловарьДокументации— тексты шапки и меню;СтатикаДокументации— каталогстатика/с листом, скриптом и знаком сайта;ОформлениеДокументации— светлая тема и имя cookie сайта.
Подробно о контрактах — на странице Каркас страницы.
Как написать страницу#
Страница — файл страницы/<ключ>.md, а её место в навигации — строка в ОглавлениеДокументации.os. Первый заголовок становится заголовком страницы, первый абзац — пояснением, заголовки второго уровня — оглавлением «На этой странице».
Блоки кода с особой пометкой печатает сама документация:
| Пометка | Что получится |
|---|---|
живой Подпись |
код исполняется: сверху картинка, снизу код с копированием |
разметкой Подпись |
вместо картинки — напечатанная разметка |
делайте Правило, не-делайте Правило |
картинка с вердиктом; соседние правила встают сеткой |
справка Класс или справка Класс.Функция |
комментарий над функцией из исходника кита |
директива имя |
живой блок кита: роли цвета, шкала шрифта, иконки, роды холста… |
В коде образца доступны Набор, Кит, Формы и Настройки, а кончается он присваиванием HTML.
Так выглядит живой образец
HTML = Набор.Тост().Отрисовать(Новый Структура("Текст, Вид", "Страница сохранена", "ok"));Проверка страниц#
проверка.os печатает все страницы без сервера: у каждой должен быть заголовок и пояснение, каждый образец обязан собраться, каждая справка — найти описание в исходнике. Тот же движок проверяют тесты кита, поэтому правка компонента, ломающая пример в документации, ломает и сборку.
oscript проверка.os // все страницы
oscript проверка.os кнопка таблица // только эти