oscript-ui
oscript-ui

Приложение на 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 кнопка таблица  // только эти